{"version":3,"file":"filex-core.umd.cjs","sources":["../src/types/FileNode.ts","../src/locales/en.ts","../src/locales/tr.ts","../src/lib/appBase.ts","../src/lib/uiLocales.ts","../src/locales/resolve.ts","../src/lib/internalPaths.ts","../src/lib/serverRules.ts","../src/lib/direction.ts","../src/lib/errorWords.ts","../src/lib/drafts.ts","../src/lib/plural.ts","../src/lib/timezone.ts","../src/composables/useLocale.ts","../src/lib/connection.ts","../src/composables/useFileApi.ts","../src/lib/uid.ts","../src/lib/uploadResume.ts","../src/composables/useUploadChunked.ts","../src/composables/useSelection.ts","../src/lib/typingTarget.ts","../src/composables/useKeyboardShortcuts.ts","../src/composables/useSystemDark.ts","../src/lib/pluginPage.ts","../src/lib/surfaceOpen.ts","../src/composables/usePendingOps.ts","../src/lib/pluginApplies.ts","../src/lib/pluginLabel.ts","../src/lib/pluginMenu.ts","../src/composables/usePluginActions.ts","../src/lib/realtime.ts","../src/lib/burstDebounce.ts","../src/lib/appUpdates.ts","../src/composables/useRealtime.ts","../src/composables/useThumbs.ts","../src/composables/useMonacoLoader.ts","../src/components/PresenceAvatar.vue","../src/components/PresenceBar.vue","../src/lib/actionIcons.ts","../src/lib/heldMenuRows.ts","../src/lib/popupLayer.ts","../src/components/ContextMenu.vue","../src/components/Toolbar.vue","../src/lib/tags.ts","../src/components/TagKindIcon.vue","../src/components/ChoiceButtons.vue","../src/components/TagPicker.vue","../src/locales/index.ts","../src/lib/fileIcons.ts","../src/lib/aessiv.ts","../src/lib/e2enames.ts","../src/lib/e2estream.ts","../src/lib/e2evault/consts.ts","../src/lib/e2ecrypto.ts","../src/lib/listing.ts","../src/lib/tableColumns.ts","../src/lib/viewPrefs.ts","../src/lib/sortOrder.ts","../src/lib/viewPrefsHttp.ts","../src/lib/tableEnv.ts","../src/lib/serviceGate.ts","../src/lib/sharingHeld.ts","../src/lib/appStoreRow.ts","../src/lib/e2eLinks.ts","../src/lib/jobOpen.ts","../src/lib/uiProfile.ts","../src/composables/useE2eNames.ts","../src/components/RecentlyOpened.vue","../src/lib/fileFilters.ts","../src/components/UploadProgress.vue","../src/lib/opProgress.ts","../src/components/PendingOpsTray.vue","../src/lib/appLock.ts","../src/lib/symlink.ts","../src/lib/unavailable.ts","../src/lib/personName.ts","../src/lib/pdfFieldsGeom.ts","../src/lib/signFonts.ts","../src/lib/pdfFieldRules.ts","../src/lib/pdfFields.ts","../src/lib/surfaceValues.ts","../src/lib/surfaceConditions.ts","../src/composables/usePluginSurface.ts","../src/lib/signaturePad.ts","../src/lib/listPlacement.ts","../src/components/ChoiceSelect.vue","../src/components/StorageFields.vue","../src/components/plugin/nodes/SurfaceForm.vue","../src/components/plugin/nodes/SurfaceSteps.vue","../src/lib/tablePrefs.ts","../src/components/ItemCheck.vue","../src/components/RowActions.vue","../src/components/DataTable.vue","../src/lib/surfaceCell.ts","../src/components/plugin/nodes/SurfaceList.vue","../src/components/plugin/nodes/SurfaceProgress.vue","../src/lib/listInput.ts","../src/components/plugin/nodes/SurfacePeoplePicker.vue","../src/components/plugin/nodes/SurfacePinInput.vue","../src/lib/destinationTree.ts","../src/lib/modalStack.ts","../src/modals/Modal.vue","../src/modals/DestinationPickerModal.vue","../src/components/plugin/nodes/SurfaceFileChooser.vue","../src/components/plugin/nodes/SurfacePreview.vue","../src/components/plugin/nodes/SurfaceSignaturePad.vue","../src/composables/useViewerFetch.ts","../src/composables/usePublicBranding.ts","../src/lib/pdfjsLoader.ts","../src/components/plugin/nodes/PdfFieldEditor.vue","../src/components/plugin/nodes/SurfacePdfFields.vue","../src/components/plugin/SurfaceRenderer.vue","../src/components/plugin/SurfaceConversation.vue","../src/lib/surfaceSteps.ts","../src/components/plugin/SurfaceFooterButtons.vue","../../app-ui/src/protocol.ts","../src/lib/appBridge.ts","../src/lib/prefs.ts","../src/lib/appState.ts","../src/components/plugin/PluginConfirmModal.vue","../src/components/plugin/AppFrame.vue","../src/components/plugin/PluginInspectorSection.vue","../src/components/InspectorPanel.vue","../src/composables/useRowTouch.ts","../src/composables/useReorderDrag.ts","../src/lib/storageOrder.ts","../src/components/StorageTags.vue","../src/components/SideNav.vue","../src/lib/nameFilter.ts","../src/lib/dragOut.ts","../src/lib/thumbNote.ts","../src/lib/filePreview.ts","../src/lib/dateGroups.ts","../src/lib/star.ts","../src/components/StarButton.vue","../src/lib/nearViewport.ts","../src/components/ThumbTile.vue","../src/components/FolderMosaic.vue","../src/lib/snippet.ts","../src/lib/dragGhost.ts","../src/components/GridView.vue","../src/components/HomeView.vue","../src/components/DraftsView.vue","../src/composables/useConnections.ts","../src/lib/webdavMount.ts","../src/lib/connectionGuides.ts","../src/components/ConnectionGuideView.vue","../src/composables/useS3Keys.ts","../src/components/S3KeysPanel.vue","../src/composables/useSSHKeys.ts","../src/components/SSHKeysPanel.vue","../src/composables/useNFSExports.ts","../src/components/NFSExportsPanel.vue","../src/composables/useTokens.ts","../src/components/TokensPanel.vue","../src/components/ConnectionsPanel.vue","../src/lib/advSearch.ts","../src/components/ShortcutsHelp.vue","../src/lib/catalogCoverage.ts","../src/lib/listingTickets.ts","../src/lib/pendingAnswers.ts","../src/lib/menuAnswers.ts","../src/lib/storageLine.ts","../src/lib/themes.ts","../src/components/ThemePalette.vue","../src/components/ThemeGallery.vue","../src/composables/useExplorerTimeZone.ts","../src/components/OperationsCenter.vue","../src/composables/useOperations.ts","../src/lib/tour.ts","../src/components/TabBar.vue","../src/composables/useE2eLock.ts","../src/components/E2eLockScreen.vue","../src/components/Breadcrumb.vue","../src/components/FilterBar.vue","../src/components/ViewSwitcher.vue","../src/lib/trashTimeLeft.ts","../src/components/ListView.vue","../src/components/GalleryView.vue","../src/components/FolderPeek.vue","../src/composables/useFolderPeek.ts","../src/components/FilePane.vue","../src/composables/useTabs.ts","../src/lib/e2enamepass.ts","../src/lib/e2econvert.ts","../src/lib/e2eNameRegistry.ts","../src/components/E2eTooBigModal.vue","../src/lib/e2efile.ts","../src/lib/e2emime.ts","../src/lib/e2esave.ts","../src/lib/zipstream.ts","../src/lib/uploadSource.ts","../src/composables/useE2eFiles.ts","../src/composables/useE2eVault.ts","../src/components/E2eRequestModal.vue","../src/lib/nodeRow.ts","../src/lib/rowLevel.ts","../src/lib/openSurface.ts","../src/lib/trashEmpty.ts","../src/lib/transfer.ts","../src/lib/downloadSelection.ts","../src/lib/searchHit.ts","../src/modals/NewFolderModal.vue","../src/modals/ArchiveExtractModal.vue","../src/modals/ArchivePasswordModal.vue","../src/modals/DraftConflictModal.vue","../src/composables/useDraftSave.ts","../src/modals/RenameModal.vue","../src/modals/DeleteConfirmModal.vue","../src/lib/undoWords.ts","../src/lib/toastSlot.ts","../src/composables/useDialogRequest.ts","../src/lib/storageWatch.ts","../src/components/plugin/SurfaceSections.vue","../src/components/plugin/PluginViewModal.vue","../src/components/plugin/AppFrameModal.vue","../src/lib/appViewer.ts","../src/lib/openWith.ts","../src/modals/OpenWithDialog.vue","../src/lib/anchoredPanel.ts","../src/lib/notificationText.ts","../src/composables/useNotificationText.ts","../src/lib/notificationTarget.ts","../src/components/NotificationRow.vue","../src/lib/unreadBadge.ts","../src/components/UnreadBadge.vue","../src/components/NotificationBell.vue","../src/components/NotificationsPanel.vue","../src/lib/productVersion.ts","../src/components/ProductVersion.vue","../src/components/AccountMenu.vue","../src/lib/userSettingsHost.ts","../src/composables/useNotificationFeed.ts","../src/lib/accountMenu.ts","../src/lib/lazySurface.ts","../src/FileExplorer.vue","../../../node_modules/.pnpm/dompurify@3.4.2/node_modules/dompurify/dist/purify.es.mjs","../src/lib/sanitizeHtml.ts","../src/lib/markdownHtml.ts","../src/lib/externalReach.ts","../src/lib/officeDiagnosis.ts","../src/lib/archivePreviewCache.ts","../src/modals/DraftCloseModal.vue","../src/modals/OutsideChangeModal.vue","../src/lib/outsideChange.ts","../src/composables/useDocumentWatch.ts","../src/lib/officeFrame.ts","../src/modals/PreviewModal.vue","../src/components/LogoMark.vue","../src/components/TimeZonePicker.vue","../src/lib/accountRules.ts","../src/lib/density.ts","../src/lib/imageDownscale.ts","../src/lib/webhookEvents.ts","../src/components/UserSettingsDialog.vue","../src/lib/webPush.ts","../src/lib/megaMenu.ts","../src/components/MegaMenu.vue","../src/lib/panelSearch.ts","../src/components/PanelSearch.vue","../src/lib/newDocName.ts","../src/modals/NewDocumentModal.vue","../src/lib/publicLayout.ts","../src/lib/dropLimits.ts","../src/composables/usePublicLink.ts","../src/composables/usePublicPage.ts","../src/composables/usePublicText.ts","../src/components/public/PublicPinGate.vue","../src/components/public/PublicLanguagePicker.vue","../src/components/public/PublicShell.vue","../src/components/public/PublicShareBody.vue","../src/components/public/PublicRequestBody.vue","../src/components/public/PublicLinkPage.vue","../src/components/public/PublicLinkPreview.vue","../src/components/plugin/PluginPageView.vue","../src/lib/archiveFormats.ts","../src/components/ConnectionNotice.vue","../src/components/ShortcutSettings.vue","../src/components/QuickLook.vue","../src/components/E2eLevelPicker.vue","../src/components/EncryptedFolderModal.vue","../src/components/RecoveryKeyModal.vue","../src/components/E2eRecoveryUnlockModal.vue","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/core.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/xml.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/bash.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/c.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/cpp.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/csharp.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/css.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/markdown.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/diff.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/ruby.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/go.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/graphql.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/ini.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/java.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/javascript.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/json.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/kotlin.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/less.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/lua.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/makefile.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/perl.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/objectivec.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/php.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/php-template.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/plaintext.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/python.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/python-repl.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/r.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/rust.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/scss.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/shell.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/sql.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/swift.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/yaml.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/typescript.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/vbnet.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/wasm.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/common.js","../src/lib/e2evault/layout.ts","../src/lib/e2evault/keys.ts","../src/lib/e2evault/pack.ts","../src/lib/e2evault/vindex.ts","../src/lib/e2evault/reader.ts","../src/lib/e2evault/writer.ts","../../../node_modules/.pnpm/pdfjs-dist@5.7.284/node_modules/pdfjs-dist/legacy/build/pdf.mjs","../src/lib/e2evault/gc.ts","../src/lib/e2evault/api.ts","../src/lib/e2evault/lock.ts","../src/composables/e2eVaultEngine.ts","../src/components/E2eVaultStrip.vue","../src/components/TimeZoneDialog.vue","../src/lib/shareTtl.ts","../src/modals/PermissionsModal.vue","../src/components/AdvancedSearch.vue","../src/components/CommandPalette.vue","../src/modals/ArchiveCreateModal.vue","../src/components/OnboardingTour.vue","../src/components/E2eSettingsModal.vue","../src/components/E2eChangePasswordModal.vue","../src/components/E2eFileEncryptModal.vue","../src/components/E2eFileUnlockModal.vue","../src/viewers/Viewer3D.vue","../src/viewers/EpubViewer.vue","../src/viewers/MermaidViewer.vue","../src/viewers/DrawioViewer.vue","../src/viewers/TiffViewer.vue","../src/viewers/PsdViewer.vue","../src/viewers/IpynbViewer.vue","../src/viewers/CsvViewer.vue","../src/viewers/ArchiveViewer.vue","../../../node_modules/.pnpm/katex@0.16.45/node_modules/katex/dist/katex.mjs","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/common.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/trees.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/adler32.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/crc32.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/messages.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/deflate.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/strings.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/zstream.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/deflate.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inffast.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inftrees.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inflate.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/constants.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/gzheader.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/inflate.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/index.js","../../../node_modules/.pnpm/utif@3.1.0/node_modules/utif/UTIF.js","../../../node_modules/.pnpm/pako@2.1.0/node_modules/pako/dist/pako.esm.mjs","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/jpeg.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/helpers.js","../../../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/utf8.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/descriptor.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/imageResources.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/psdReader.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/effectsHelpers.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/engineData.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/text.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/engineData2.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/additionalInfo.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/psdWriter.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/abr.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/csh.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/psd.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/index.js","../../../node_modules/.pnpm/papaparse@5.5.3/node_modules/papaparse/papaparse.min.js"],"sourcesContent":["/**\n * FileNode — node shape returned by the manager endpoint.\n *\n * Backend `?q=index` (or `GET /api/files/manager?action=index`) returns:\n *   { adapter, storages, dirname, files: FileNode[] }\n */\nimport type { EditKinds, EventOff, ServerLimits } from '../lib/serverRules';\nimport type { AppLock } from './Plugins';\n\n/** Why a file has no thumbnail, when the reason is the file's own (`thumb_note`). */\nexport type ThumbNote = 'corrupt' | 'encrypted' | 'too_large';\n\nexport interface FileNode {\n  /** DB node ID — needed by the per-user meta routes (starred, tags,\n   *  recently-opened). Backend's projectFileNodes() emits it for every\n   *  row; only client-synthesized rows (e.g. multi-storage virtual\n   *  folders) lack one. */\n  id?: number;\n  /** Full adapter-qualified path: `local://receipts/2024/invoice.pdf` */\n  path: string;\n  /** Relative basename: `invoice.pdf` */\n  basename: string;\n  /** Adapter-stripped relative path: `receipts/2024/invoice.pdf` */\n  relativePath?: string;\n  /** `file` or `dir` */\n  type: 'file' | 'dir';\n  /** Extension (lowercased, no dot). Empty string = no extension. */\n  extension?: string;\n  /** Bytes. 0 = directory. */\n  size?: number;\n  /**\n   * The folder's size leaves something out: the catalog does not cover all of\n   * it yet (a lazily cataloged folder, or any folder while its storage's first\n   * sync runs). `size` is then a lower bound, or unknown when 0. Draw it with\n   * useLocale `formatNodeSize`, never `formatSize` (docs/LAZY-CATALOGUE.md).\n   */\n  size_partial?: boolean;\n  /** Unix ms (backend \"last_modified\"). */\n  last_modified?: number;\n  /** MIME. */\n  mime_type?: string;\n  /** Optional thumbnail URL (backend may inline). */\n  thumb_url?: string | null;\n  /**\n   * Why the file has no thumbnail, when the reason is the file's own (0.50):\n   * damaged, encrypted (an office password, a zip's, or filex's end-to-end\n   * encryption) or over a size limit. The views mark the type icon with it\n   * (lib/thumbNote, ThumbTile). Absent when there is a picture, while one is\n   * being drawn, and for a failure that may pass (it is drawn again).\n   */\n  thumb_note?: ThumbNote | null;\n  /**\n   * A folder's newest files (0.50): up to three of the files directly in it,\n   * newest first by the later of when each came in and when it last changed,\n   * each with its stamped thumbnail URL when one is ready (else the views\n   * draw its type icon). Absent for a folder with no files of its own, and\n   * while folder previews are off (docs/thumbnails.md → Folder previews).\n   */\n  preview?: { name: string; thumb_url?: string }[] | null;\n  /** Visibility: private | public. */\n  visibility?: 'private' | 'public';\n  /** File count for directories. */\n  count?: number;\n  /** Client-side tag (localStorage or backend). */\n  starred?: boolean;\n  /** Hex color tag. */\n  color?: string | null;\n  /** Server-side trash marker. */\n  trashed?: boolean;\n  /** RBAC effective level for the current user on this entry (backend\n   *  projectFileNodes emits it when a storage has RBAC on). '' / undefined =\n   *  ACL not enforced. Used to gate edit/manage affordances client-side. */\n  perm?: 'none' | 'viewer' | 'editor' | 'owner';\n  /** The row sits on a read-only storage. Carried by the rows that come from\n   *  OUTSIDE a folder listing — Recent, Starred, a tag view, the Home cards,\n   *  the Recently-opened tray (`handlers/meta.go`) — because there the\n   *  listing-level `read_only` has no folder to describe. A folder listing's\n   *  rows leave it unset; `dirReadOnly` answers for the whole folder. Folded\n   *  into the write gate with `perm`, so the context menu is the same in\n   *  every view. */\n  read_only?: boolean;\n  /* wiring:e2 — dir rows: true when the folder is E2E-encrypted (carries a\n   * `.filex-e2e.json` marker). Drives the 🔒 badge in the listings. */\n  e2e?: boolean;\n  /* wiring:e2 vault — dir rows: true when the folder IS a vault (level 3,\n   * docs/E2E-VAULT-FORMAT.md); the server says so from its key file. */\n  e2e_vault?: boolean;\n  /* wiring:e2 names — set by the name view (composables/useE2eNames) on a\n   * row inside an encrypted folder whose NAMES are encrypted. `basename` is\n   * then the plaintext; `e2e_stored` is what the server stores and the only\n   * form that may be sent back to it. `e2e_root` also arrives from the server\n   * on rows outside a folder listing (Recent, Starred, tags, search, trash). */\n  e2e_root?: string;\n  e2e_stored?: string;\n  e2e_name_state?: 'enc' | 'plain' | 'unreadable' | 'locked';\n  e2e_display_dir?: string;\n  /* wiring:e2 vault — a row of a vault's tree (composables/useE2eVault): the\n   * vault folder's wire path. Such a row exists only in this tab; its path is\n   * never sent to the server. */\n  vault_root?: string;\n  /* wiring:e2 fxe — a single encrypted file (`.fxe`) opened in this tab: its\n   * ORIGINAL name, which the header carries sealed. Shown instead of the\n   * stored name (useLocale `nodeDisplayName`); `basename` stays the stored\n   * name, and it is the only one ever sent to the server. */\n  fxe_name?: string;\n  /** An app plugin holds this file read-only (docs/APP-PLUGINS-API.md →\n   *  \"File locks\"). `perm` already arrives capped at `viewer` for everyone,\n   *  administrators included — the flag is what the badge and the details\n   *  panel say out loud, and what turns the server's 423 into words. */\n  locked?: boolean;\n  lock?: AppLock;\n  /** The state keys apps keep on this file, `<plugin>:<key>`. Read by the\n   *  menu's state-aware rows (`applies.state` / `no_state`). */\n  app_state?: string[];\n  /** Issue #34 — this row is a symlink the SERVER WILL NOT FOLLOW. A link\n   *  whose target is inside the storage root IS followed and arrives as that\n   *  target (a linked directory is a `dir` and opens normally), so this flag\n   *  always means \"cannot be opened\", never merely \"is a link\".\n   *\n   *  ⚠ Additive, and `type` stays the closed `'file' | 'dir'` union it has\n   *  always been: widening it would be a breaking change for every embedder\n   *  of `@brftech/filex`, so the backend reports such a row as a file and\n   *  flags it here (`handlers/manager.go`). A client that does not know the\n   *  flag renders exactly the row it rendered before — which is precisely the\n   *  0-byte-file-that-will-not-open the issue was filed about, and why\n   *  `lib/symlink` exists. */\n  symlink?: boolean;\n  /** Why it will not open — `outside_root` | `broken` | `unresolved`.\n   *\n   *  Every listing carries it when the reason is known: one read from the\n   *  driver says what the driver says now, one answered by the catalogue says\n   *  what the sync recorded (migration 00098, filex 0.54). ⚠ It can still be\n   *  absent - a row catalogued before 0.54 until the next sync of its folder,\n   *  a driver that gives no reason - so read it through\n   *  `lib/symlink.linkStateOf`, which answers `'unknown'` for that case (and\n   *  for a state a newer server invents) instead of dropping the row back into\n   *  silence. */\n  link_state?: string;\n  /** Issue #104 - an entry the STORAGE COULD NOT ANSWER FOR: the sync asked\n   *  whether it still exists and got neither \"yes\" nor \"not found\". It is\n   *  listed so it does not just vanish, and nothing can be done with it, or\n   *  with anything inside it: the server refuses every operation with 409\n   *  `ENTRY_UNAVAILABLE`. Read through `lib/unavailable`. */\n  unavailable?: boolean;\n  /** What the storage answered (its own words, usually English). */\n  unavailable_reason?: string;\n  /** Generic — any additional fields the backend wants to inline. */\n  [k: string]: unknown;\n}\n\n/** The one line that fetches a download link's file from a terminal, as the\n *  SERVER writes it (handlers/share_command.go): it knows a folder's archive,\n *  the PIN and an S3 redirect. Shown as it is; never assembled here. */\nexport interface ShareDownloadCommand {\n  /** For a POSIX shell. */\n  curl: string;\n  /** For Windows PowerShell 5.1 and PowerShell 7. */\n  powershell: string;\n}\n\nexport interface ShareInfo {\n  uuid: string;\n  url: string;\n  password_pin?: string | null;\n  expires_at?: string | null;\n  /** True when the server shortened (or set) the expiry to honour its\n   *  max-TTL setting — the UI then shows the real date, not the request. */\n  expiry_clamped?: boolean;\n  max_downloads?: number | null;\n  downloads?: number;\n  created_at?: string;\n  /** On the creation answer of a DOWNLOAD link only (absent for a file\n   *  request, and never in a listing - it may carry the PIN). */\n  download_command?: ShareDownloadCommand | null;\n}\n\nexport interface UploadLimits {\n  max_upload_mb: number;\n}\n\nexport type ExternalServiceState = 'ok' | 'error' | 'disabled' | 'unknown';\n\nexport interface ExternalServiceStatus {\n  enabled: boolean;\n  state: ExternalServiceState;\n  url?: string;\n  last_check?: string;\n  detail?: string;\n}\n\n/**\n * One document type the SERVER can create, from `capabilities.newdoc_types`.\n *\n * ⚠ `requires` is the whole point of shipping this list instead of hardcoding\n * one in the client. The server knows it holds template bytes for `.docx`; it\n * does NOT know whether this deployment has a document server that can open\n * one. So it names the dependency and the client — which already resolves\n * OnlyOffice/drawio, config override included — answers it. A client that\n * re-derived \"docx needs OnlyOffice\" from a list of its own would be a second\n * source of truth, and the one that rots first.\n */\nexport interface NewDocType {\n  /** Extension without the dot, lowercase. The key the create call sends,\n   *  unless `key` says otherwise. */\n  ext: string;\n  /** What the create call names when it is not `ext`: an app's row\n   *  (`app:<plugin>:<ext>`), whose extension a built-in kind may share. */\n  key?: string;\n  /** Coarse family, used for the picker's section headings (`app`: a row an\n   *  installed app adds, `new_documents`). */\n  group: 'document' | 'text' | 'diagram' | 'app';\n  mime: string;\n  /** External service the editor for this type needs; absent = built-in;\n   *  `app` = an app's interface (listed only while it runs). */\n  requires?: 'onlyoffice' | 'drawio' | 'app';\n  /** An app's row: the app, the `viewer` view that opens the new file, and\n   *  the app's own words for it. */\n  app?: { plugin: string; view: string; label: Record<string, string> };\n  /**\n   * Must the file carry this extension? (#56) `true` for the containers — an\n   * office document or a diagram, which its editor finds by extension; `false`\n   * for text, which may be named anything (`LICENSE`, `test.conf`). ABSENT on\n   * a server from before #56, which appends the extension to every type —\n   * lib/newDocName `extLocked` reads that as `true`.\n   */\n  ext_required?: boolean;\n}\n\nexport type ArchiveCreateFormat = 'zip' | '7z' | 'tar' | 'tar.gz' | 'tar.bz2' | 'tar.xz';\n\nexport interface Capabilities {\n  /** Folder previews are on (Settings; default on): pictures on folder\n   *  cards and the list of what a folder holds when the pointer rests on it.\n   *  Absent (an older server): on. */\n  folder_previews?: boolean;\n  /** Which filex answered, in one line (`v0.47.0 (<commit>, <built>)`). */\n  version?: string;\n  /** 0.54 (#211, audit A11): the release alone (`v0.54.0`) — the line the\n   *  account menu ends with — and the commit and build time beside it. A\n   *  part the build did not stamp is absent; nothing parses `version`. */\n  release?: string;\n  commit?: string;\n  built?: string;\n  /** 0.54 (#211): how each kind of file is edited and the numbers an input is\n   *  held to — the server's rules, held by lib/serverRules. */\n  edit_kinds?: EditKinds;\n  limits?: ServerLimits;\n  /** 0.54 (#211, audit B16): the notification events that cannot happen\n   *  here, by event (lib/serverRules `EventOff`). */\n  event_off?: Record<string, EventOff>;\n  /** The public demo: nothing a visitor changes may be saved (the settings\n   *  dialog greys its saves). */\n  demo_mode?: boolean;\n  /** Virus scanning is on. (Whether the \"virus found\" notification can\n   *  happen is the server's own answer, `event_off`.) */\n  antivirus?: boolean;\n  /** Document types this build can create. Absent on a server older than the\n   *  \"New document\" feature — hosts must treat that as \"offer nothing\". */\n  newdoc_types?: NewDocType[];\n  /** Drafts (issue #71): present when the server keeps drafts for THIS caller\n   *  (a person acting for themselves — not an app token, not a caller\n   *  confined to one folder). New document then makes a draft; absent, it\n   *  creates the file directly. `limit` is how many one person may keep. */\n  drafts?: { limit: number };\n  ffmpeg?: boolean;\n  ghostscript?: boolean;\n  onlyoffice_url?: string | null;\n  drawio_url?: string | null;\n  max_chunk_mb?: number;\n  upload_limit_mb?: number;\n  /** Longest life a new share link may be given on this install, in days\n   *  (0 = no ceiling) - the administrator's setting. */\n  share_max_ttl_days?: number;\n  /** Longest life a new link made by THIS caller may be given, in days (0 =\n   *  no ceiling): the install's ceiling or the permission rules binding them\n   *  (ShareLinkMaxDays), whichever is shorter. Read by the share dialog so it\n   *  offers only expiries the server keeps for this person. */\n  share_link_max_days?: number;\n  /** Archive creation policy. Absent on servers older than archive providers.\n   *  `allowed_formats` is what this server can actually make (every format\n   *  but a plain ZIP needs 7-Zip there); empty means it can make none, and\n   *  `encryption` says whether a password can be set. */\n  archive?: {\n    enabled: boolean;\n    default_format: ArchiveCreateFormat | '';\n    allowed_formats: ArchiveCreateFormat[];\n    encryption?: boolean;\n  };\n  /** Is the caller a person (`'user'` — a session OR their own API token) or an\n   *  integration (`'app'` — a host proxy, a bot, an MCP client)? The explorer\n   *  reads it to decide whether to draw the identity-bearing surfaces; see\n   *  ExplorerConfig.callerKind. Absent on a server older than the app/user\n   *  token split, which is why every reader treats \"missing\" as a person. */\n  caller_kind?: 'user' | 'app';\n  /** Could this caller set up a missing optional service (ONLYOFFICE,\n   *  draw.io…)? An administrator who can reach the instance\n   *  settings — not a tenant admin, not an API token. Decides between \"greyed\n   *  with where to fix it\" and \"not offered\" (lib/serviceGate). Absent on an\n   *  older server, which reads as \"no\". */\n  caller_admin?: boolean;\n  /** App plugins (docs/APP-PLUGINS-API.md). Absent or `enabled: false` → the\n   *  explorer makes no plugin request at all. */\n  app_plugins?: { enabled: boolean };\n  /** The address this deployment is reached at — only when it is real (the\n   *  operator configured it, or the request came in on a tenant's host).\n   *  Read by the connection guides; see `connectionsOrigin`. */\n  public_url?: string;\n  external?: {\n    onlyoffice?: ExternalServiceStatus;\n    drawio?: ExternalServiceStatus;\n    mermaid?: ExternalServiceStatus;\n  };\n  /** Can outgoing mail be sent right now (SMTP configured AND verified)?\n   *  Absent on an older server or one with no mailer wired — read as \"yes\",\n   *  i.e. keep offering mail the way it always was. */\n  mail?: { ready: boolean };\n  /** The changes this server runs as jobs of its operations queue when asked\n   *  with `queued=1`: `rename` (POST /api/files/manager?action=rename) and\n   *  `restore` (POST /api/files/manager/restore, a `node_ids` batch). Absent on\n   *  an older server, which changes inside the request. */\n  queued?: Array<'rename' | 'restore' | (string & {})>;\n  /* wiring:e2 */\n  /** Whether this installation holds an escrow key for E2E-encrypted folders,\n   *  and the public half the browser wraps new folders' master keys to.\n   *\n   *  Published on purpose. Escrow means the operator can open the folders you\n   *  create here without your password, and someone about to create one is\n   *  entitled to know that BEFORE they create it. Fixed at install time\n   *  (FILEX_INSTALLATION_E2E_ESCROW_KEY), so this answer never changes for a\n   *  running installation. */\n  e2e_escrow?: {\n    enabled: boolean;\n    /** Short id of the escrow key (SHA-256(SPKI)[:8], hex). */\n    kid?: string;\n    alg?: string;\n    /** Base64 SPKI. Public material — it can only seal, never open. */\n    public_key?: string;\n  };\n  /** wiring:e2 policy — who may START encrypting here (backend\n   *  internal/e2epolicy): `available` is the platform operator's switch for\n   *  the caller's tenant, `policy` the tenant's choice — `off` | `admins` |\n   *  `permitted` | `approval`. Absent for an anonymous caller and on a server\n   *  older than the policy, which reads as before: the explorer offers\n   *  encryption and the server decides.\n   *\n   *  ⚠ The CALLER'S OWN tenant's row. The platform operator, looking at\n   *  another tenant's storage, is answered by THAT tenant's policy and ceiling\n   *  (`POST /api/files/e2e/allowed`), which can differ either way — so nothing\n   *  is hidden from this field; only the per-path answer hides a door. */\n  e2e_policy?: { available: boolean; policy: string };\n  /** wiring:e2 vault — the server has the vault API (`/api/files/e2e/vault/*`,\n   *  docs/E2E-VAULT-FORMAT.md): level 3 is offered for a new folder only\n   *  here. Absent or false: the level is not drawn at all. */\n  e2e_vault?: boolean;\n}\n\n/**\n * wiring:e2 policy — may this account start encrypting at a path\n * (`POST /api/files/e2e/allowed`): `allowed`; `request` — the tenant's policy\n * wants an administrator's approval first; `denied`.\n */\nexport type E2eAnswer = 'allowed' | 'request' | 'denied';\n\n/** An encryption request as the server answers it (backend E2ERequestWire). */\n/** wiring:e2 policy - what an encryption request (and the question\n *  `POST /api/files/e2e/allowed`) is about (backend internal/e2epolicy, operator\n *  decision 2026-10-03: separate kinds, an approval opens only what was asked):\n *  `folder` - encrypt this folder where it is; `new_folder` - make one new\n *  encrypted folder directly inside this folder; `file` - encrypt this file. */\nexport type E2eRequestKind = 'folder' | 'new_folder' | 'file';\n\nexport interface E2eRequestDto {\n  id: number;\n  /** `<storage>://<rel>` - the folder the approval is for: to encrypt where it\n   *  is (`folder`), or to make a new encrypted folder in (`new_folder`). A single\n   *  file's request is kept under the folder its `.fxe` lands in (a file\n   *  approval is that folder's). */\n  path: string;\n  storage: string;\n  kind: E2eRequestKind;\n  /** The requester's own words. */\n  reason: string;\n  status: 'pending' | 'approved' | 'rejected' | 'expired' | 'used';\n  /** Who asked, named as the account was when it asked. */\n  requester: string;\n  requester_id: number;\n  decider?: string;\n  decided_at?: string | null;\n  /** The approver's note, or why it was rejected. */\n  decision_note?: string;\n  expires_at: string;\n  used_at?: string | null;\n  created_at: string;\n  tenant_id?: number | null;\n}\n\n/** Single source of truth for \"is the IdP/editor/diagram service ready?\".\n *  A capability is usable only when both flags say so — `enabled=true` but\n *  `state='error'` means an operator turned it on but a probe just failed,\n *  and we'd rather hide the entry than offer a button that 500s on click.\n */\nexport function isExternalUsable(s: ExternalServiceStatus | undefined): boolean {\n  return !!s && s.enabled && s.state === 'ok';\n}\n\nexport interface UploadInitResponse {\n  uploadId: string;\n  parts: Array<{ partNumber: number; presignedUrl: string }>;\n  expiresAt: string;\n  s3Key?: string;\n}\n\nexport interface UploadFinalizeResponse {\n  s3Key: string;\n  url?: string;\n}\n\nexport interface ArchiveEntry {\n  name: string;\n  size: number;\n  isDir: boolean;\n  lastModified?: number;\n}\n\nexport type ViewMode = 'list' | 'grid' | 'gallery'; /* wiring:d2 — the third view: gallery */\n\nexport interface ClipboardState {\n  mode: 'cut' | 'copy' | null;\n  items: FileNode[];\n  sourcePath: string | null;\n}\n\n/** A soft-deleted node as returned by the filex trash listing endpoint. */\nexport interface TrashEntry {\n  id: number;\n  storage_id: number;\n  storage_name?: string;\n  path: string;\n  name: string;\n  size: number;\n  mime?: string;\n  deleted_at: string;\n  ttl_days?: number | null;\n  /** Who put it in the Trash; every key absent when nobody is named. */\n  deleted_by_id?: number;\n  deleted_by_name?: string;\n  /** The asker's own delete (\"You\"). */\n  deleted_by_self?: boolean;\n  /** One of the asker's own drafts (#71), discarded: it came from Drafts,\n   *  and Restore puts it back there. `path` is then just its name. */\n  draft?: boolean;\n}\n\n/** One storage's part of the caller's trash, as the server counts it: what\n *  that storage's virtual `.trash` row shows. */\nexport interface TrashStorageSummary {\n  storage_id: number;\n  storage_name?: string;\n  count: number;\n  bytes: number;\n  newest_deleted_at: string | null;\n}\n\n/** One page of the trash listing, and the server's totals for ALL of it.\n *  ⚠ `total`, `total_bytes` and `storages` count every entry the caller may\n *  see, not the page: the size and the count a screen shows come from here,\n *  never from summing the rows it has loaded (0.54, finding D1). */\nexport interface TrashPage {\n  entries: TrashEntry[];\n  total: number;\n  total_bytes?: number;\n  newest_deleted_at?: string | null;\n  storages?: TrashStorageSummary[];\n  /** How much the trash holds, said by the server in the screen's language. */\n  summary?: string;\n  limit?: number;\n  offset?: number;\n}\n","/** English UI strings. */\nexport const en: Record<string, string> = {\n  'toolbar.new_folder': 'New folder',\n  'toolbar.upload': 'Upload',\n  'toolbar.search': 'Search',\n  'toolbar.search.placeholder': 'Search by name or tag:…',\n  'toolbar.view.list': 'List',\n  'toolbar.view.grid': 'Grid',\n  'toolbar.refresh': 'Refresh',\n  'toolbar.go_up': 'Up one level',\n\n  'ctx.open': 'Open',\n  'ctx.preview': 'Preview',\n  'ctx.download': 'Download',\n  'ctx.archive_create': 'Create archive…',\n  'ctx.archive_extract': 'Extract archive…',\n  'ctx.rename': 'Rename',\n  'ctx.delete': 'Delete',\n  'ctx.delete_perm': 'Delete permanently',\n  'ctx.restore': 'Restore',\n  'ctx.share': 'Share',\n  'ctx.move': 'Move',\n  'ctx.copy': 'Copy',\n  'ctx.cut': 'Cut',\n  'ctx.show_hidden': 'Show hidden files',\n  'ctx.hide_hidden': 'Hide hidden files',\n  'ctx.keep_local': 'Keep on this computer',\n  'ctx.keep_online': 'Keep online only',\n  'ctx.keep_reveal': 'Open local folder',\n  'ctx.keep_inherited': 'Kept on this computer with its parent',\n  'keep.started': 'Will be kept on this computer - sync started',\n  'keep.failed': 'Could not keep on this computer',\n  'keep.badge_kept': 'On this computer',\n  'keep.badge_syncing': 'Syncing…',\n  'keep.badge_cloud': 'Online only',\n  'keep.badge_partial': 'Contains items kept on this computer',\n  'keep.strip_transfer': 'Syncing {name} - {done}/{total} ({pct}%)',\n  'keep.strip_inventory': 'Syncing {name} - scanning the server…',\n  'keep.strip_settling': 'Syncing {name} - settling…',\n  'ctx.paste': 'Paste',\n  'ctx.info': 'Info',\n  'ctx.duplicate': 'Duplicate',\n  'ctx.new_file': 'New file',\n\n  'modal.delete.title': 'Delete?',\n  'modal.delete.message': '{count} items will be moved to trash.',\n  'modal.delete.message_one': '{count} item will be moved to trash.',\n  'modal.delete.confirm': 'Move to Trash',\n  'modal.delete.working': 'Moving to Trash…',\n  'modal.delete.cancel': 'Cancel',\n  'modal.delete.permanent_title': 'Delete permanently?',\n  'modal.delete.permanent_message': '{count} items will be deleted for good. This cannot be undone.',\n  'modal.delete.permanent_message_one': '{count} item will be deleted for good. This cannot be undone.',\n  'modal.delete.permanent_confirm': 'Delete permanently',\n  'modal.delete.permanent_working': 'Deleting…',\n\n  'modal.rename.title': 'Rename',\n  'modal.rename.save': 'Save',\n  'modal.rename.saving': 'Renaming…',\n  'modal.rename.cancel': 'Cancel',\n\n  'modal.newfolder.title': 'New folder',\n  'modal.newfolder.placeholder': 'Folder name',\n  'modal.newfolder.create': 'Create',\n  'modal.newfolder.creating': 'Creating…',\n  'modal.newfolder.cancel': 'Cancel',\n\n  'modal.share.title': 'Share link',\n  'archive.create_title': 'Create archive',\n  'archive.extract_title': 'Extract archive',\n  'archive.create_count': '{count} selected items',\n  'archive.create_count_one': '{count} selected item',\n  'archive.filename': 'Archive name',\n  'archive.format': 'Format',\n  'archive.password_optional': 'Password (optional)',\n  'archive.password_confirm': 'Confirm password',\n  'archive.password_mismatch': 'Passwords do not match.',\n  'archive.encrypt_names': 'Encrypt file names',\n  'archive.compression': 'Compression',\n  'archive.solid': 'Create solid archive',\n  'archive.dictionary_size': 'Dictionary size',\n  'archive.dictionary_size_value': '{n} MiB',\n  'archive.dictionary_hint': 'Larger dictionaries can improve compression but use more memory while creating and extracting.',\n  'archive.destination_folder': 'Extract to folder',\n  'archive.create': 'Create',\n  'archive.creating': 'Creating…',\n  'archive.extract': 'Extract',\n  'archive.extract_here': 'Extract here',\n  'archive.extract_to_folder': 'Extract to folder',\n  'archive.extracting': 'Extracting…',\n  'archive.cancel': 'Cancel',\n  'archive.invalid_name': 'Enter a file name without slashes.',\n  'archive.invalid_extension': 'Archive name must use one of the available format extensions.',\n  'archive.invalid_folder': 'Enter a folder name without slashes.',\n  'archive.password_required': 'This archive requires a password.',\n  'archive.password_title': 'Archive password',\n  'archive.continue': 'Continue',\n  'archive.opening': 'Opening…',\n  'archive.bad_password': 'The archive password is incorrect.',\n  'archive.target_exists': 'An item with that name already exists. Choose another name or remove it first.',\n  'archive.password_charset': 'A ZIP password can use only ASCII characters: unaccented letters, digits and ordinary punctuation. Choose 7z to use any characters.',\n  'archive.error_unsupported': 'This archive cannot be extracted: this server cannot read its format, or it holds something filex does not extract (a link, a special file, or a file whose size it does not state).',\n  'archive.error_limit': 'This archive is larger than the server allows to extract.',\n  'archive.error_unavailable': 'This server cannot open this kind of archive right now.',\n  'archive.created': 'Archive created',\n  'archive.queued': 'Archive creation is running in the background',\n  'archive.extracted': 'Extracted {count} files',\n  'archive.extracted_one': 'Extracted {count} file',\n  'archive.extraction_queued': 'Archive extraction is running in the background',\n  'archive.preparing_extract': 'Reading {name}… the whole archive is read before it can be extracted.',\n  'archive.already_preparing': 'Still reading {name} - it is extracted once that is done',\n  'archive.extraction_completed': 'Extraction completed',\n  'archive.extraction_cancelled': 'Extraction cancelled after {count} files',\n  'archive.extraction_cancelled_one': 'Extraction cancelled after {count} file',\n\n  'modal.share.pin': 'PIN protected',\n  'modal.share.expires': 'Expires at',\n  'modal.share.max_downloads': 'Download limit',\n  'modal.share.create': 'Share',\n  'modal.share.cancel': 'Cancel',\n  'modal.share.close': 'Close',\n  'modal.share.limit_applied': '(server limit applied)',\n  'modal.share.copy': 'Copy',\n  'modal.share.url_copied': 'Link copied',\n  'modal.share.pin_copied': 'PIN copied',\n  'modal.share.cli_copied': 'CLI command copied',\n\n  'upload.progress': 'Uploading',\n  'upload.done': 'Done',\n  'upload.error': 'Error',\n  'upload.failed': 'Could not upload “{name}”',\n  'upload.aborted': 'Aborted',\n  'upload.cancel': 'Cancel',\n  'upload.resuming': 'Resuming “{name}” from {percent}%',\n  'upload.saving': 'Saving to the storage…',\n\n  'empty.folder': 'This folder is empty',\n  'empty.search': 'No results',\n  'loading': 'Loading…',\n\n  'notFound.title': 'Folder not found',\n  'notFound.desc': 'This folder does not exist, was moved, or you do not have access to it.',\n  'notFound.goRoot': 'Go to root folder',\n\n  'col.name': 'Name',\n  'col.size': 'Size',\n  'col.modified': 'Modified',\n  'col.type': 'Type',\n\n  'unit.bytes': 'B',\n  'unit.kb': 'KB',\n  'unit.mb': 'MB',\n  'unit.gb': 'GB',\n  'unit.tb': 'TB',\n  'unit.pb': 'PB',\n\n  'breadcrumb.root': 'Root',\n  'breadcrumb.copy_path': 'Copy path',\n  'breadcrumb.go_to_path': 'Go to path',\n  'breadcrumb.path_placeholder': 'fileman/foo/bar',\n\n  'ops.copy': 'Copying',\n  'ops.move': 'Moving',\n  'ops.delete': 'Deleting',\n  'ops.queued': 'queued',\n  'ops.done': 'done',\n  'ops.error': 'error',\n\n  'node.trash': 'Trash',\n  /* gorunum:v1 - the singular kind, printed under a folder's name on a card\n   * and beside it in the list. The plural section heading is a different\n   * string on purpose. */\n  'node.folder': 'Folder',\n\n  // --- Rich viewer chrome ---\n  'viewer.open_in_new_tab': 'Open in new tab',\n  'viewer.loading': 'Loading…',\n  'viewer.failed_to_load': 'Failed to load file',\n  /* ⚠ Said to a PERSON: it used to tell them to \"install the peer dependency\". */\n  'viewer.peer_not_installed': 'This kind of file cannot be shown here. Download it to open it on your device.',\n  'viewer.format_unsupported_3d': 'The preview shows 3D models in .glb, .gltf and .usdz only. Download the file to open it in a 3D program.',\n  'viewer.zoom_in': 'Zoom in',\n  'viewer.zoom_out': 'Zoom out',\n  'viewer.fit_width': 'Fit width',\n  'viewer.next_page': 'Next page',\n  'viewer.prev_page': 'Previous page',\n  'viewer.page_n_of_m': 'Page {n} of {m}',\n  'viewer.tags': 'Tags',\n  'viewer.layers': 'Layers',\n  'viewer.toc': 'Contents',\n  'viewer.font_smaller': 'Smaller text',\n  'viewer.font_larger': 'Larger text',\n  'viewer.search': 'Search',\n  'viewer.download': 'Download',\n  'viewer.saving': 'Saving…',\n  'viewer.save': 'Save (Ctrl+S)',\n  'viewer.saved': 'Saved',\n  'viewer.save_error': 'Error',\n  'viewer.editor_loading': 'Loading editor…',\n  'viewer.no_preview': 'No preview for this file type yet.',\n  'viewer.edit': 'Edit',\n  'viewer.close': 'Close',\n  'presence.expand': 'Show names',\n  'presence.collapse': 'Collapse',\n  'viewer.save_annotations': 'Save annotations',\n  'viewer.annotations_on': 'Annotations: on',\n  'viewer.annotations_off': 'Annotations: off',\n  'viewer.read_only': 'Read only',\n  'viewer.csv_first_row_header': 'First row as header',\n  'viewer.csv_filter': 'Filter rows…',\n  'viewer.epub_prev': 'Previous',\n  'viewer.epub_next': 'Next',\n  /* ⚠ The old sentence named an ENVIRONMENT VARIABLE to every reader\n     (\"operator must wire FILEX_DRAWIO_URL\"). A person who only wanted to look\n     at a diagram is told what they can do; `_admin` - someone who can fix it -\n     is told where. */\n  'viewer.drawio.disabled': 'Diagrams cannot be opened here: this server has no draw.io. Download the file to open it elsewhere.',\n  'viewer.drawio.disabled_admin': 'draw.io is not set up on this server. Set it up in the admin panel under External services.',\n  'viewer.drawio.load_failed': 'This diagram could not be read. Download it to open it elsewhere.',\n  'viewer.drawio.save_failed': 'The diagram could not be saved. Your changes are still in the editor - try again.',\n  'viewer.archive.entries': '{n} files',\n  'viewer.archive.entries_one': '{n} file',\n  'viewer.archive.empty': 'Archive is empty.',\n  'viewer.archive.error': 'Could not read archive contents.',\n  'viewer.archive.unsupported': 'This kind of archive cannot be listed here. Download it to see what is inside.',\n  'viewer.archive.too_large': 'This archive is too large to list here. Download it to see what is inside.',\n  'viewer.archive.open': 'Open archive',\n  'viewer.archive.root': 'Archive',\n  'viewer.archive.location': 'Archive location',\n  'viewer.archive.reading':\n    'Still reading… the whole archive is read before its contents can be listed, which takes a while for a large one.',\n  'viewer.name': 'Name',\n  'viewer.size': 'Size',\n\n  // --- cila:a - sorting / date groups / density ---\n  'col.sort': 'Sort',\n  'group.today': 'Today',\n  'group.yesterday': 'Yesterday',\n  'group.this_week': 'This week',\n  'group.this_month': 'This month',\n  'group.no_date': 'No date',\n  'toolbar.density.compact': 'Compact view',\n  'toolbar.density.comfortable': 'Comfortable view',\n\n  // --- cila:c - command palette + shortcuts help + breadcrumb ---\n  'palette.placeholder': 'Search files, folders or commands…',\n  'palette.files': 'Files',\n  'palette.commands': 'Commands',\n  'palette.goto': 'Go to path',\n  'palette.empty': 'No results',\n  'palette.hint': '↑↓ navigate · Enter select · Esc close',\n  'cmd.view_toggle': 'Toggle view (list ⇄ grid)',\n  'cmd.trash': 'Open trash',\n  'shortcuts.title': 'Keyboard shortcuts',\n  'shortcuts.group.nav': 'Navigation',\n  'shortcuts.group.selection': 'Selection',\n  'shortcuts.group.file': 'File operations',\n  'shortcuts.palette': 'Command palette',\n  'shortcuts.search': 'Focus search',\n  'shortcuts.go_up': 'Go up one level',\n  'shortcuts.open': 'Open selected item',\n  'shortcuts.close': 'Close / cancel',\n  'shortcuts.toggle_hidden': 'Show/hide hidden files',\n  'shortcuts.help': 'This help dialog',\n  'shortcuts.select_all': 'Select all',\n  'shortcuts.star': 'Star / unstar',\n  'shortcuts.rename': 'Rename',\n  'shortcuts.delete': 'Delete',\n  'shortcuts.cut': 'Cut',\n  'shortcuts.copy': 'Copy',\n  'shortcuts.paste': 'Paste',\n  'breadcrumb.more': 'Folders in between',\n\n  // --- State screens + undo snackbar + connection badge (cila:b) ---\n  'empty.hint': 'Drag and drop files here',\n  'empty.upload': 'Upload files',\n  'empty.search.title': 'No files match your search',\n  'empty.search.hint': 'Try a different search term',\n  'empty.trash.title': 'Trash is empty',\n  'error.title': 'Could not load this folder',\n  'error.retry': 'Try again',\n  'toast.undo': 'Undo',\n  'toast.undone': 'Undone',\n  'toast.undoing': 'Undoing…',\n  'toast.undo_queued': 'The undo is queued - the operations panel shows when it is done',\n  'toast.undo_failed': 'Could not undo',\n  'toast.renamed': 'Renamed',\n  'toast.rename_queued': 'Renaming to “{name}”…',\n  'toast.moved': 'Moved',\n  'toast.trashed': 'Moved to trash',\n  /* i18n:hardcoded - toast copy that used to be Turkish string literals in\n     FileExplorer.vue, unreachable by any locale. */\n  'toast.failed': 'Operation failed',\n  /* ── errorWords (lib/errorWords): how a failure is SAID. ⚠ No status code,\n     no JSON, no environment variable ever reaches these; an administrator\n     sees the raw words on a second line, nobody else does. ── */\n  'err.status.400': 'Bad request',\n  'err.status.401': 'Sign-in required',\n  'err.status.403': 'You are not allowed to do this',\n  'err.status.404': 'Not found',\n  'err.status.409': 'Already exists / conflict',\n  'err.status.413': 'File too large',\n  'err.status.415': 'Unsupported file type',\n  'err.status.422': 'Invalid data',\n  'err.status.429': 'Too many requests',\n  'err.status.500': 'Server error',\n  'err.status.501': 'Not supported',\n  'err.status.502': 'A connected service reported an error',\n  'err.status.503': 'Service unavailable',\n  'err.status.504': 'A connected service took too long to answer',\n  'err.status.other': 'The server refused this request.',\n  'err.upload_stalled': 'The upload stopped making progress. Try again - it continues where it stopped.',\n  'err.network': 'The server could not be reached. Check your connection and try again.',\n  /* 0.54 (audit A1/A2): a refusal the server names is said in the SERVER's\n     words (`message`, backend internal/apierr `server.error.*`); the copies\n     that stood here (err.read_only, err.quota, err.e2e_*, err.name_taken,\n     opc.err.*…) are gone with the tables of lib/errorWords that used them. */\n  'err.save_failed': 'Your changes could not be saved.',\n  'err.load_failed': 'This file could not be loaded.',\n  'err.viewer_failed': 'The viewer for this file could not be started. Download the file to open it.',\n  'err.detail': 'Details',\n  'toast.copied': 'Copied',\n  'toast.deleted': 'Deleted',\n  'toast.cut': 'Cut',\n  'toast.cut_ready': 'Cut - ready to paste',\n  'toast.copy_ready': 'Copied - ready to paste',\n  'toast.same_folder_cut': 'Cannot cut into the same folder',\n  'toast.restored': '{n} items restored',\n  'toast.restored_one': '{n} item restored',\n  'toast.delete_queued': 'Delete queued',\n  'toast.trash_retention': 'Items in the trash are removed automatically once the retention window ends. Permanent deletion is done from the admin panel.',\n  /* The Trash row a permanent delete is on its way for (the admin Trash\n     page's words: one sentence, both catalogues - lesson #447). */\n  'trash.purging': 'Deleting permanently…',\n  'trash.row_busy': 'Something is already being done to this item',\n  'dropzone.hint': 'Drop files here',\n  'modal.newfolder.invalid': 'Invalid character',\n  'names.reserved': '“{name}” is reserved for filex’s own use. Choose another name.',\n  /* ⚠ A missing or broken document server is said in words, never as the\n     HTTP layer (it used to read `Config fetch 503: {\"error\":\"onlyoffice not\n     configured\"}`). `_admin` is what someone who can fix it reads - where to\n     fix it; everybody else reads how to get the file anyway. */\n  'viewer.office_unconfigured':\n    'Office documents cannot be opened here: this server has no ONLYOFFICE document server. Download the file to open it on your computer.',\n  'viewer.office_unconfigured_admin':\n    'ONLYOFFICE is not set up on this server, so office documents cannot be opened here. Set it up in the admin panel under External services.',\n  'viewer.office_unreachable': 'The document server is not answering right now. Try again later, or download the file.',\n  'viewer.office_unreachable_admin':\n    'The ONLYOFFICE document server is not answering. Check it in the admin panel under External services.',\n  /* Task #92: the editor runs in a frame on another origin (the document\n     server's own, or the interface origin), and that page never answered -\n     the address does not reach this filex. */\n  'viewer.office_frame_unreachable_admin':\n    'The ONLYOFFICE editor frame did not load from {origin}. Check that the reverse proxy there sends the frame to filex ({env}).',\n  'viewer.office_failed': 'This document could not be opened in ONLYOFFICE. Download it to open it on your computer.',\n  'viewer.csv_office_note': 'Saved as CSV: only the values of the active sheet are kept. Formatting, formulas and other sheets are not saved.',\n  'viewer.office_forbidden': 'You do not have permission to open this document in ONLYOFFICE.',\n  /* After ONLYOFFICE's \"Download failed\": which of its two failures it was,\n     as filex saw it (lib/officeDiagnosis, issue #80). */\n  'viewer.office_download_served':\n    'The document server downloaded this file from filex, but your browser could not load the converted copy from the document server. Check the X-Forwarded-Proto and X-Forwarded-Host headers on the reverse proxy in front of the document server.',\n  'viewer.office_download_not_requested':\n    'The document server never asked filex for this file. If the file was opened before, the document server may be using its own copy of it.',\n  'viewer.office_download_refused': 'filex refused the document server’s request for this file: {reason}.',\n  'viewer.office_fetch_reason.bad_link': 'the address was malformed',\n  'viewer.office_fetch_reason.signature_expired': 'the address had expired',\n  'viewer.office_fetch_reason.signature_bad': 'its signature did not match (the JWT secret changed, or the address was altered)',\n  'viewer.office_fetch_reason.not_found': 'the file no longer exists',\n  'viewer.office_fetch_reason.storage_unavailable': 'the storage could not be opened',\n  'viewer.office_fetch_reason.body_unavailable': 'the file’s contents could not be found',\n  'viewer.office_fetch_reason.object_missing': 'the file is missing from the storage',\n  'viewer.office_fetch_reason.read_failed': 'reading the file from the storage failed',\n  /* The explorer's Open on a document the document server would open, when\n     there is none - shown to an administrator only (everyone else is not\n     offered the entry at all; lib/serviceGate). */\n  'ctx.needs_onlyoffice': 'ONLYOFFICE is not set up - set it up in the admin panel under External services.',\n  'ctx.needs_drawio': 'draw.io is not set up - set it up in the admin panel under External services.',\n  'viewer.pdf_inline_failed': 'Your browser could not display this PDF inline.',\n  'viewer.too_large': 'File is too large (>1 MB).',\n  'viewer.csv_rows': '{n} rows',\n  'viewer.csv_rows_one': '{n} row',\n  'presence.others': '{n} people',\n  'presence.others_one': '{n} person',\n  'conn.offline': 'No live connection - changes may be delayed',\n  'conn.tooltip': 'Live connection to the server is unavailable; the list refreshes periodically. This notice disappears once the connection is back.',\n\n  /* === bul:s3 === */\n  'palette.everywhere': 'Everywhere',\n  'palette.searching': 'Searching…',\n  'palette.everywhere_failed': 'The search could not be done. Try again.',\n  'palette.saved': 'Saved searches',\n  'palette.save': 'Save search',\n  'palette.saved.delete': 'Delete saved search',\n  /* #168 - the admin panel's search (components/PanelSearch.vue). */\n  'panelsearch.label': 'Search the admin panel',\n  'panelsearch.trigger': 'Search',\n  'panelsearch.placeholder': 'Search pages, settings, people, apps…',\n  'panelsearch.close': 'Close search',\n  'panelsearch.clear': 'Clear the search',\n  'panelsearch.results': 'Search results',\n  'panelsearch.group.page': 'Pages',\n  'panelsearch.group.setting': 'Settings',\n  'panelsearch.group.app': 'Apps',\n  'panelsearch.group.user': 'Users',\n  'panelsearch.group.group': 'Groups',\n  'panelsearch.group.key': 'API keys',\n  'panelsearch.group.storage': 'Storages',\n  'panelsearch.group.share': 'Shares',\n  'panelsearch.group.file': 'Files',\n  'panelsearch.group.recent': 'Recent searches',\n  'panelsearch.files_all': 'Search files: {q}',\n  'panelsearch.recent_remove': 'Remove from recent searches',\n  'panelsearch.recent_clear': 'Clear recent searches',\n  'panelsearch.empty': 'Nothing matches “{q}”.',\n  'panelsearch.searching': 'Searching…',\n  'panelsearch.failed': 'Some results could not be loaded. The rest are shown.',\n  'panelsearch.prefixes': 'Narrow to one kind:',\n  'panelsearch.count_one': '{n} result',\n  'panelsearch.count': '{n} results',\n  'search.in_content': 'In content',\n  'search.truncated': 'More results than shown - narrow your search',\n  'nav.more_shown': 'Showing {shown} of {total}',\n  'nav.load_more': 'Load more',\n\n  /* Catalog coverage (docs/LAZY-CATALOGUE.md, lib/catalogCoverage). One\n     sentence per reason; the banner sits over a listing and over search\n     results, and says what is left out and why. */\n  'coverage.first_scan': 'This storage’s first sync has not finished. Until it does, search, folder sizes and usage leave part of it out.',\n  'coverage.lazy_filling': 'filex is still cataloging this storage ({pct}% of the folders found so far). Until it finishes, search, folder sizes and usage leave part of it out.',\n  'coverage.lazy_on_open': 'Only the folders people open on this storage are cataloged. Search, folder sizes and usage cover those folders only.',\n  'coverage.search_some': 'Not everything on these storages is cataloged yet: {names}. This search may miss files there.',\n  'coverage.catalog_all': 'Catalog everything',\n  'coverage.catalog_started': 'Sync started - the whole storage is being cataloged.',\n  'coverage.catalog_running': 'Cataloging…',\n  'coverage.cataloging': 'Cataloging {storage}… this runs in the background, and this page says when it is done.',\n  'coverage.catalog_done': '{storage} is cataloged in full',\n  'coverage.catalog_failed': 'Cataloging {storage} failed. The admin panel shows why, under the storage’s sync runs.',\n  'coverage.catalog_stopped': 'Cataloging {storage} was stopped before it finished',\n  'coverage.catalog_joined': 'A scan of {storage} was already running - this page says when it is done.',\n  'coverage.catalog_gone': '{storage} was removed while it was being cataloged',\n  'coverage.catalog_unfollowed': 'Cataloging {storage} goes on in the background; the admin panel shows how it ends, under the storage’s sync runs',\n  'size.at_least': '≥ {size}',\n  'size.partial_hint': 'Part of this folder is not cataloged yet, so its size is at least this.',\n  'size.unknown_hint': 'This folder is not cataloged yet, so its size is not known.',\n\n  /* === bag:b4 === */\n  'toolbar.more': 'More actions',\n  'toolbar.search.close': 'Close search',\n  'sheet.menu': 'Actions',\n  'sheet.close': 'Close',\n\n  /* === koru:k1 === */\n  'toolbar.inspector': 'Details',\n  'ctx.details': 'Details',\n  /* yildiz:s1 - starring is an action, so it has a verb in the menu. */\n  'ctx.star': 'Star',\n  'ctx.unstar': 'Unstar',\n  'star.failed': 'Could not change the star',\n  'shortcuts.inspector': 'Toggle details panel',\n  'inspector.title': 'Details',\n  'inspector.copy_name': 'Copy name',\n  'inspector.items': '{n} items',\n  'inspector.items_one': '{n} item',\n  'inspector.type': 'Type',\n  'inspector.select_hint': 'Select an item to see its details.',\n  /* pane:p1 - the panel HOLDS the last selected thing (owner's ruling,\n     2026-09-13), so it can be describing an item in the half of a split\n     window nobody is looking at. This line says which one and where. */\n  'inspector.held': 'Last selected - in {where}',\n  'inspector.close': 'Close',\n  'inspector.section.general': 'General',\n  'inspector.section.tags': 'Tags',\n  /* etiket:t1 - TagPicker's own chrome. It printed these three in English\n     regardless of the catalogue until 2026-09-13; `tags.open` is the chip's new\n     \"show me everything with this tag\". */\n  'tags.open': 'Open tag: {tag}',\n  'tags.add': '+ Add tag',\n  'tags.name': 'Tag name',\n  'tags.remove': 'Remove tag',\n\n  /* etiket:k2 (v0.43.0) - the two KINDS of tag. Every place a tag is drawn\n     says which kind it is, in words as well as the icon, because until this\n     release a tag was silently shared with every account on the server. */\n  'tags.kind.label': 'Who sees this tag',\n  'tags.kind.personal': 'Personal',\n  'tags.kind.team': 'Team',\n  'tags.kind.personal_help': 'Only you see it',\n  'tags.kind.team_help': 'Everyone on your team who can see this file',\n  'tags.kind.team_locked': 'Adding or removing a team tag needs edit permission on this file.',\n  'tags.chip.personal': 'Personal tag “{tag}” - only you see it',\n  'tags.chip.team': 'Team tag “{tag}” - everyone on your team who can see this file sees it',\n  'tags.add_submit': 'Add',\n  'inspector.section.versions': 'Versions',\n  'inspector.section.permissions': 'Permissions',\n  'inspector.section.shares': 'Shares',\n  'inspector.path': 'Path',\n  'inspector.size': 'Size',\n  'inspector.modified': 'Modified',\n  'inspector.mime': 'MIME type',\n  'inspector.etag': 'ETag',\n  'inspector.nodeId': 'Node ID',\n  'inspector.copy': 'Copy',\n  'inspector.copied': 'Copied',\n  'inspector.error': 'Could not load',\n  'inspector.items_summary': '{n} items, {size} total',\n  'inspector.items_summary_one': '{n} item, {size} total',\n  'inspector.folder_items': '{n} items',\n  'inspector.folder_items_one': '{n} item',\n  'inspector.versions.empty': 'No version history',\n  'inspector.versions.v': 'Version {n}',\n  'inspector.versions.restore': 'Restore',\n  'inspector.versions.restore_confirm': 'Restore this version?',\n  'inspector.versions.snapshot_current': 'Snapshot the current state first',\n  'inspector.versions.confirm': 'Confirm',\n  'inspector.versions.restoring': 'Restoring…',\n  'inspector.versions.cancel': 'Cancel',\n  'inspector.versions.take_snapshot': 'Snapshot current state',\n  'inspector.versions.snapshotting': 'Taking a snapshot…',\n  'inspector.versions.restored': 'Version restored',\n  'inspector.versions.snapshotted': 'Snapshot taken',\n  'inspector.versions.unsupported': 'The server does not support this operation',\n  'inspector.perm.none': 'No access',\n  'inspector.perm.viewer': 'Viewer',\n  'inspector.perm.editor': 'Editor',\n  'inspector.perm.owner': 'Owner',\n  'inspector.perm.manage': 'Manage permissions',\n  'inspector.shares.empty': 'No share links',\n  'inspector.shares.copy': 'Copy link',\n\n  /* wiring:c1 - theme gallery */\n  'theme.menu': 'Theme',\n  'theme.title': 'Theme gallery',\n  'theme.hint': 'A theme only changes the color palette - day or night is the choice above.',\n  'theme.mode.label': 'Appearance',\n  'theme.mode.light': 'Day',\n  'theme.mode.dark': 'Night',\n  'theme.mode.auto': 'Automatic',\n  'theme.reset': 'Reset to default',\n  'theme.close': 'Close',\n  'theme.selected': 'Selected',\n  'theme.name.default': 'Default',\n  'theme.name.night': 'Night blue',\n  'theme.name.forest': 'Forest',\n  'theme.name.amber': 'Amber',\n  'theme.name.lilac': 'Lilac',\n  'theme.name.contrast': 'High contrast',\n  'theme.name.gray': 'Soft gray',\n  'theme.name.terminal': 'Terminal green',\n  /* === zaman:z3 - the time-zone picker (embed dialog + web settings) === */\n  'tz.menu': 'Time zone',\n  'tz.title': 'Time zone',\n  'tz.label': 'Show dates in',\n  'tz.search': 'Search a city, country or offset - try \"Istanbul\" or \"GMT+3\"',\n  'tz.default.device': \"Use this device's zone ({zone})\",\n  'tz.default.account': \"Use the account's zone ({zone})\",\n  'tz.default.host': \"Use this site's default ({zone})\",\n  'tz.no_match': 'No zone matches “{query}”. Try a city, a country, or an offset like GMT+3.',\n  'tz.more': '{n} more - keep typing to narrow the list.',\n  'tz.hint': 'Saved in this browser only. Every date is stored as one moment in time and shown on the clock you pick here.',\n  'tz.now': 'Right now in {zone}: {time}',\n  /* === wiring:c2 - customizable shortcuts + quick look === */\n  'shortcuts.quicklook': 'Quick look',\n  'shortcuts.customize': 'Customize',\n  'shortcuts.settings.menu': 'Shortcuts',\n  'shortcuts.settings.title': 'Shortcut settings',\n  'shortcuts.settings.hint': 'To remap a shortcut, press \"Change\" and then the new key combination. Changes are stored in this browser only.',\n  'shortcuts.settings.change': 'Change',\n  'shortcuts.settings.capture': 'Press keys… (Esc cancels)',\n  'shortcuts.settings.reset': 'Reset to default',\n  'shortcuts.settings.reset_all': 'Reset all',\n  'shortcuts.settings.unbound': 'Not set',\n  'shortcuts.settings.fixed': 'Fixed',\n  'shortcuts.settings.customized': 'Customized',\n  'shortcuts.settings.conflict': 'is already used by \"{name}\".',\n  'shortcuts.settings.conflict_fixed': 'is reserved by the fixed shortcut \"{name}\" - it cannot be used.',\n  'shortcuts.settings.conflict_take': 'Unassign old and use here',\n  'shortcuts.settings.conflict_cancel': 'Cancel',\n  'quicklook.hint_close': 'close',\n  'quicklook.hint_nav': 'previous/next',\n  'quicklook.hint_open': 'open',\n  /* === /wiring:c2 === */\n  /* === wiring:c3 - operations center === */\n  'opc.title': 'Operations',\n  'opc.aria_badge': '{n} operations - toggle operations center',\n  'opc.aria_badge_one': '{n} operation - toggle operations center',\n  'opc.close': 'Close',\n  'opc.active': 'In progress',\n  'opc.history': 'History',\n  'opc.clear': 'Clear',\n  'opc.empty': 'No operations',\n  'opc.cancel': 'Cancel',\n  'opc.retry': 'Retry',\n  'opc.dismiss': 'Dismiss',\n  'opc.queued': 'Queued',\n  'opc.cancelling': 'Cancel requested…',\n  'opc.percent': '{n}%',\n  'opc.items': '{done} of {total} items',\n  'opc.trash_items': '{n} items from the trash',\n  'opc.trash_items_one': '{n} item from the trash',\n  'opc.status.running': 'In progress',\n  'opc.status.done': 'Done',\n  'opc.status.error': 'Failed',\n  'opc.status.aborted': 'Cancelled',\n  'opc.kind.upload': 'Upload',\n  'opc.kind.copy': 'Copy',\n  'opc.kind.move': 'Move',\n  'opc.kind.delete': 'Delete',\n  'opc.kind.rename': 'Rename',\n  'opc.kind.restore': 'Restore',\n  'opc.kind.purge': 'Delete permanently',\n  'opc.kind.convert': 'Convert',\n  'opc.kind.archive': 'Archive',\n  'opc.kind.plugin': 'App',\n  'opc.kind.trash': 'Empty trash',\n  'opc.kind.thumbs': 'Thumbnail repair',\n\n  /* A folder's contents on hover (FolderPeek, useFolderPeek). */\n  'peek.items': '{n} items',\n  'peek.items_one': '{n} item',\n  'peek.more': '+{n} more',\n  'peek.empty': 'Empty',\n  'peek.loading': 'Looking inside…',\n  'opc.open': 'Open',\n\n  /* App plugins - rows a WebAssembly plugin adds to the file menu, and the\n     jobs they queue (docs/APP-PLUGINS-API.md). \"App\" is what the feature is\n     called on every surface; \"plugin\" is the wire word. */\n  'plugin.queued': '{label} queued',\n  'plugin.done': '{label} finished',\n  'plugin.failed': '{label} failed',\n  'plugin.cancel_failed': 'Could not cancel the job',\n  'plugin.not_applicable': 'This action does not apply to the selection',\n  'plugin.read_only': 'This storage is read-only',\n  'plugin.needs_engine': '{name} is not installed on this server - install it and restart filex.',\n  'plugin.needs_other': '{name} is not available on this server.',\n  'plugin.needs_office': 'Office documents need {name}, which is not connected to this server - connect it under External services.',\n  'plugin.confirm.title': 'Confirm',\n  'plugin.confirm.cancel': 'Cancel',\n  'plugin.confirm.run': 'Run',\n  'plugin.view.close': 'Close',\n  'appframe.confirm_title': 'Confirm',\n  'appframe.consent_clipboard': '{app} wants to copy text to your clipboard.',\n  'appframe.consent_download': '{app} wants to save “{name}” to your computer.',\n  'appframe.consent_job': '{app} wants to start “{action}”.',\n  'appframe.consent_allow': 'Allow',\n  'appframe.consent_deny': 'Don’t allow',\n  'appframe.unsaved_title': 'Unsaved changes',\n  'appframe.unsaved_text': '{app} has changes that are not saved. Close it anyway?',\n  'appframe.discard': 'Close without saving',\n  'appframe.keep_open': 'Keep editing',\n  'appframe.save_close': 'Save and close',\n  'appframe.updated': '{app} was updated to {version}.',\n  'appframe.updated_reload': 'An administrator approved a new version of {app}. Reload it to use the new version - save your work first.',\n  'appframe.reload': 'Reload',\n  'appframe.dismiss': 'Dismiss',\n  'appframe.not_connected': '{app} did not start. Close it and open it again; if it keeps happening, tell your administrator.',\n  'appframe.save_as_title': '{app}: save “{name}” to',\n  'plugin.view.busy': 'Working…',\n  'plugin.view.unsupported': 'This screen uses a component this version cannot draw ({type})',\n  'plugin.view.error': 'The app answered with an error',\n  'plugin.output_missing': 'The output is no longer where it was',\n  /* M2 - surface components (components/plugin/nodes/*) */\n  'plugin.view.loading': 'Loading…',\n  'plugin.view.preview_failed': 'The preview could not be loaded',\n  'plugin.steps.label': 'Steps',\n  'plugin.list.empty': 'Nothing here yet',\n  'plugin.list.actions': 'Actions',\n  /* The label on a table row's ONE action control (core RowActions.vue).\n     The explorer's handle is the ⋮ glyph; a panel row's says what it is.\n     Owner, 2026-09-20: \"adminde 'Aksiyon' diye yazmalı\". */\n  'row.actions': 'Actions',\n  'plugin.people.placeholder': 'Name or email',\n  'plugin.people.placeholder_email': 'Email address',\n  'plugin.people.add': 'Add',\n  'plugin.people.remove': 'Remove {name}',\n  'plugin.people.invalid_email': 'Enter a valid email address',\n  'plugin.people.external_off': 'Only people with an account can be added',\n  'plugin.pin.label': 'PIN',\n  'plugin.file.choose': 'Choose…',\n  'plugin.file.clear': 'Clear',\n  'plugin.file.none': 'Nothing chosen',\n  /* M3 - the sign track: signature-pad + pdf-fields nodes, and the outside\n     participant's public page (views/PublicSurface.vue via usePublicPage). */\n  'plugin.sig.mode_draw': 'Draw',\n  'plugin.sig.mode_type': 'Type',\n  'plugin.sig.mode_upload': 'Upload',\n  'plugin.sig.draw_hint': 'Sign here with your finger or mouse',\n  'plugin.sig.type_placeholder': 'Type your name',\n  'plugin.sig.upload_pick': 'Choose a picture…',\n  'plugin.sig.upload_hint': 'PNG or JPEG, at most {kb} KB',\n  'plugin.sig.upload_too_big': 'The picture is larger than {kb} KB',\n  'plugin.sig.upload_bad_type': 'Only PNG or JPEG pictures can be used',\n  'plugin.sig.upload_unreadable': 'The picture could not be read',\n  'plugin.sig.clear': 'Clear signature',\n  'plugin.sig.signed': 'Signature captured',\n  'plugin.pdf.load_failed': 'The document could not be loaded',\n  'plugin.pdf.palette': 'Field types',\n  'plugin.pdf.pending': 'Boxes waiting for a place',\n  'plugin.pdf.place_box_hint': 'Tap the page where “{name}” goes, or drag to size it',\n  'plugin.pdf.all_placed': 'Every box has a place',\n  'plugin.pdf.place_idle': 'Choose one of the boxes above, then tap the page where it goes.',\n  'plugin.pdf.place_idle_done': 'Tap a box on the page to take it off or copy it; drag it to move it.',\n  'plugin.pdf.no_boxes': 'No boxes yet. Add one below: give it a name, say whose it is, and place it on the document in the next step.',\n  'plugin.pdf.add_box': 'Add a box',\n  'plugin.pdf.unplace': 'Take off the page',\n  'plugin.pdf.place_hint': 'Tap the page where the {type} field goes, or drag to size it',\n  'plugin.pdf.type_signature': 'Signature',\n  'plugin.pdf.type_initials': 'Initials',\n  'plugin.pdf.type_date': 'Date',\n  'plugin.pdf.type_text': 'Text',\n  'plugin.pdf.type_checkbox': 'Checkbox',\n  'plugin.pdf.tap_signature': 'Tap to sign',\n  'plugin.pdf.tap_initials': 'Tap to initial',\n  'plugin.pdf.tap_date': 'Tap for today',\n  'plugin.pdf.tap_text': 'Text',\n  'plugin.pdf.tap_checkbox': 'Tap to tick',\n  'plugin.pdf.label': 'Name',\n  'plugin.pdf.assignee': 'Signer',\n  'plugin.pdf.unassigned': 'Anyone',\n  'plugin.pdf.filled_by': 'Filled by',\n  'plugin.pdf.style': 'How it is signed',\n  'plugin.pdf.style_drawn': 'Drawn',\n  'plugin.pdf.style_typed': 'Typed',\n  'plugin.pdf.lines': 'Printed under it',\n  'plugin.pdf.lines_preview': 'Under the signature:',\n  'plugin.pdf.lines_none': 'Nothing is printed under this signature.',\n  'plugin.pdf.required': 'Required',\n  'plugin.pdf.copy_to_page': 'Copy to page',\n  'plugin.pdf.copy': 'Copy',\n  'plugin.pdf.delete': 'Delete field',\n  'plugin.pdf.zoom_in': 'Zoom in',\n  'plugin.pdf.zoom_out': 'Zoom out',\n  'plugin.pdf.zoom_fit': 'Fit to width',\n  'plugin.pdf.zoom_fit_page': 'Fit the page to the screen',\n  'plugin.pdf.pad_for': 'Your {type}',\n  'plugin.pdf.pad_done': 'Done',\n  'plugin.page.loading': 'Loading…',\n  'plugin.page.pin_title': 'This page is protected',\n  'plugin.page.pin_hint': 'Enter the PIN you were given to continue',\n  'plugin.page.pin_submit': 'Continue',\n  'plugin.page.pin_wrong': 'That PIN is not right',\n  'plugin.page.pin_locked': 'Too many wrong PINs - wait a few minutes and try again',\n  'plugin.page.unavailable_title': 'This link is not available',\n  'plugin.page.unavailable_text': 'It may have expired, been used up or been withdrawn. Ask the person who sent it for a new one.',\n  'plugin.page.accepted_title': 'Received, thank you',\n  'plugin.page.accepted_text': 'Your answer has been recorded. You can close this page.',\n  'plugin.page.done_title': 'All done',\n  'plugin.page.done_text': 'There is nothing more to do here. You can close this page.',\n  'plugin.page.error_title': 'Something went wrong',\n  'plugin.page.retry': 'Try again',\n  'plugin.page.files': 'Documents',\n  'plugin.page.open_file': 'Open {name} in a new tab',\n  'plugin.page.footer': 'Served by filex',\n  /* The public pages' own sentences (share, file request) are the SERVER's\n     `server.public.*` (composables/usePublicText) - not keys of this file. */\n  /* === App plugins v2 - a `page` view, an app's lock on a file, the output\n     mode a job wrote in, and the faces + rules a signature field carries. === */\n  'plugin.page_view.back': 'Back to the files',\n  'plugin.page_view.queued_title': 'The job is queued',\n  'plugin.page_view.queued_text': 'filex is working on it. This page says when it is done, and its progress is in the operations tray too.',\n  'plugin.page_view.finished_title': 'The job is done',\n  'plugin.page_view.finished_text': 'There is nothing more to do here. You can go back to the files or close this tab.',\n  'plugin.page_view.failed_title': 'The job did not finish',\n  'plugin.page_view.opening_title': 'Opening the result',\n  'plugin.page_view.open_ops': 'Open the operations tray',\n  'plugin.page_view.done_title': 'All done',\n  'plugin.page_view.done_text': 'There is nothing more to do here. You can close this tab.',\n  'plugin.page_view.error_title': 'This screen could not be opened',\n  'plugin.page_view.retry': 'Try again',\n  'plugin.page_view.blocked': 'The new tab was blocked - allow pop-ups for this site, or the screen will open in a dialog',\n  'plugin.output.sibling': 'new file',\n  'plugin.output.version': 'new version',\n  'plugin.output.sibling_title': 'The result lands as a new file beside the original',\n  'plugin.output.version_title': 'The result replaces the file as a new version of it',\n  'plugin.sign.font_label': 'Handwriting',\n  'plugin.pdf.font': 'Font',\n  'plugin.pdf.rule_number': 'Numbers only',\n  'plugin.pdf.rule_email': 'Email address',\n  'plugin.pdf.rule_length': 'Between {min} and {max} characters',\n  'plugin.pdf.rule_min': 'At least {min} characters',\n  'plugin.pdf.rule_max': 'At most {max} characters',\n  'plugin.pdf.err_number': 'Enter a number',\n  'plugin.pdf.err_email': 'Enter a valid email address',\n  'plugin.pdf.err_min': 'Too short - at least {min} characters',\n  'plugin.pdf.err_max': 'Too long - at most {max} characters',\n  'applock.badge': 'Locked',\n  'applock.some_app': 'an app',\n  'applock.held': '{app} locked this file',\n  'applock.held_reason': '{app} locked this file: {reason}',\n  'applock.until': '- until {date}',\n  'applock.inspector': 'Held by an app',\n  /* issue #34 - a symlink the server will NOT follow (lib/symlink). The badge\n     is the short word on the row; `why` is the sentence behind it, shown on\n     hover, in the details panel and in the toast when somebody tries to open\n     one. ⚠ Broken and outside-of-root are DIFFERENT states and must read\n     differently: only one has an administrator remedy, and offering that\n     remedy for a target that has been deleted sends the person to a settings\n     screen that cannot help them. */\n  'symlink.badge.outside_root': 'Outside storage',\n  'symlink.badge.broken': 'Broken link',\n  'symlink.badge.unresolved': 'Remote link',\n  'symlink.badge.unknown': 'Link',\n  'symlink.why.outside_root':\n    'A link whose target lies outside this storage, which is why it cannot be opened. An administrator can allow it with \"Follow symlinks that leave this folder\" in the storage\\'s settings.',\n  'symlink.why.broken':\n    'A link whose target no longer exists, so there is nothing to open. It has to be repaired or removed on the server - no setting can bring the target back.',\n  'symlink.why.unresolved':\n    'A link on a remote server. filex cannot tell whether its target is inside this storage, so it does not follow it and cannot open it.',\n  'symlink.why.unknown':\n    'A link filex will not follow, so it cannot be opened. Its target is either outside this storage, missing, or on a remote server filex cannot resolve.',\n  'symlink.inspector': 'A link that cannot be opened',\n  /* Issue #104 - an entry the storage could not answer for (lib/unavailable).\n     The sentence says what it means and what happens next; the storage's own\n     answer follows it ({reason}), usually in English. */\n  'unavailable.why.file':\n    'The storage could not say whether this file still exists. It cannot be opened or changed until the storage answers for it again; the next scan checks.',\n  'unavailable.why.dir':\n    'The storage could not say whether this folder still exists. Neither the folder nor anything inside it can be opened or changed until the storage answers for it again; the next scan checks.',\n  'unavailable.withReason': '{why} The storage answered: {reason}',\n  'unavailable.inspector': 'Unavailable',\n  /* 0.50 - why a file has no thumbnail, on the file itself (lib/thumbNote):\n     the marker's name and the sentence a resting pointer or a tap shows. */\n  'thumbNote.corrupt': 'Damaged',\n  'thumbNote.corrupt_why': 'No thumbnail: the file could not be read. It may be damaged or incomplete.',\n  'thumbNote.encrypted': 'Encrypted',\n  'thumbNote.encrypted_why': 'No thumbnail: the file is encrypted or protected by a password.',\n  'thumbNote.too_large': 'Too large',\n  'thumbNote.too_large_why': 'No thumbnail: the file is larger than the thumbnail size limit.',\n  'thumbNote.full': '{label}. {why}',\n  'plugin.pdf.rule': 'Accepts',\n  'plugin.pdf.rule_kind_any': 'Any text',\n  'plugin.pdf.rule_kind_number': 'Numbers only',\n  'plugin.pdf.rule_kind_email': 'Email address',\n  'plugin.pdf.rule_min_label': 'Min length',\n  'plugin.pdf.rule_max_label': 'Max length',\n  'plugin.pdf.format': 'Date layout',\n  'plugin.pdf.date_order': 'Date order',\n  'plugin.pdf.date_separator': 'Separator',\n  'plugin.pdf.date_example': 'Example',\n  'opc.kind.archive-create': 'Creating archive',\n  'opc.kind.archive-extract': 'Extracting archive',\n  /* === wiring:c4 - onboarding tour + accessibility + error card === */\n  'tour.aria': 'Onboarding tour',\n  'tour.restart': 'Restart the tour',\n  'tour.skip': 'Skip tour',\n  'tour.back': 'Back',\n  'tour.next': 'Next',\n  'tour.done': 'Done',\n  'tour.progress': '{n} / {m}',\n  'tour.step.nav.title': 'Storages & views',\n  'tour.step.nav.desc':\n    'Home, Shared with me, Recent, Starred and Trash are always in this panel, with your storages and connections underneath. The button in the top-left corner collapses it to a rail and brings it back.',\n  'tour.step.nav.desc_closed':\n    'This button opens the navigation panel: Home, Shared with me, Recent, Starred and Trash, with your storages and connections underneath.',\n  'tour.step.new.title': 'Add something',\n  'tour.step.new.desc':\n    'Everything new starts here - upload from this device, create a folder, or ask somebody else for a file. Dropping files onto the window uploads them as well.',\n  'tour.step.new.desc_fab':\n    'This button uploads files from this device. Dropping files onto the window works as well.',\n  'tour.step.search.title': 'Search',\n  'tour.step.search.desc':\n    'This field searches the whole storage by name - separators and one typo are forgiven, so \"invoice 2026\" finds invoice_2026.pdf. Add tag:invoice to filter by tag. The sliders button opens advanced search, and {palette} opens the command palette, which runs commands too.',\n  'tour.step.crumb.title': 'Where you are',\n  'tour.step.crumb.desc':\n    'This trail is the address of the folder on screen. Click any step to go back up, and the chevron beside the last one lists the folders inside it.',\n  'tour.step.filters.title': 'Narrow the list',\n  'tour.step.filters.desc':\n    'Type, Owner, Modified and Size filter the folder you are in, the box beside them matches names as you type, and the control at the end of the row sorts.',\n  'tour.step.view.title': 'Switch views',\n  'tour.step.view.desc':\n    'Change how this folder is drawn; your choice is remembered.',\n  'tour.step.details.title': 'Details & sharing',\n  'tour.step.details.desc':\n    'Select a file and open this panel for its details, its activity and its share links. For the full menu, right-click the file or use the button at the end of its row - \"Share\" there creates a link with an optional PIN and expiry.',\n  'tour.step.help.title': 'Shortcuts',\n  'tour.step.help.desc':\n    'Press {help} for the shortcut cheat-sheet and {palette} for the command palette. Theme and \"Restart the tour\" are in the \"More actions\" menu at the top right; your account and sign-out are behind the avatar beside it.',\n  'error.hint': 'This may be a temporary network or server problem. Please try again.',\n  'error.details': 'Technical details',\n  'col.star': 'Star',\n  'toolbar.view_label': 'View',\n  'list.aria': 'File list',\n  'grid.aria': 'File grid',\n\n  /* === wiring:d1 - tabs + split pane === */\n  'tabs.strip': 'Tabs',\n  'tabs.new': 'New tab',\n  'tabs.close': 'Close tab',\n  'tabs.split': 'Split view',\n  'tabs.split_off': 'Close split',\n  'ctx.open_new_tab': 'Open in new tab',\n  'ctx.open_with': 'Open with {app}',\n  'ctx.open_with_builtin': \"Open with the built-in viewer\",\n  'ctx.open_with_choose': \"Choose an app…\",\n  'openWith.title': \"Open with\",\n  'openWith.lead': \"Which app should open {name}?\",\n  'openWith.builtin': \"filex viewer (built-in)\",\n  'openWith.onlyoffice': 'ONLYOFFICE (spreadsheet editor)',\n  'openWith.now': \"Opens it now\",\n  'openWith.always': \"Always use this app for {ext} files\",\n  'openWith.hint': \"Kept on your account. You can change it in Settings, Default apps.\",\n  'openWith.open': \"Open\",\n  'shortcuts.group.tabs': 'Tabs',\n  'shortcuts.tab_new': 'New tab',\n  'shortcuts.tab_close': 'Close tab',\n  'shortcuts.tab_next': 'Next tab',\n  'shortcuts.tab_prev': 'Previous tab',\n  /* tus:t1 - the menu verbs */\n  'shortcuts.new_folder': 'New folder',\n  'shortcuts.upload': 'Upload files',\n  'shortcuts.refresh': 'Refresh the listing',\n  'shortcuts.download': 'Download',\n  'shortcuts.preview': 'Preview',\n  'shortcuts.share': 'Share',\n  'shortcuts.tags': 'Tags',\n  'shortcuts.open_tab': 'Open in a new tab',\n  'shortcuts.copy_path': 'Copy path',\n  'shortcuts.copy_id': 'Copy id',\n  'shortcuts.restore': 'Restore from trash',\n  'shortcuts.settings.reserved':\n    'is taken by the browser before the page sees it, so it would do nothing here. Pick another key.',\n  'shortcuts.settings.reserved_badge': 'Desktop app only',\n  'shortcuts.settings.reserved_title':\n    'The browser handles this combination itself. It fires in the desktop app and in an installed PWA, not in a browser tab.',\n  'cmd.tab_new': 'Open a new tab',\n  'cmd.split_toggle': 'Toggle split view',\n  'split.pane': 'Secondary pane',\n  'split.close': 'Close the side pane',\n  'split.error': 'Could not load the listing',\n  'split.retry': 'Retry',\n  'split.copy_queued': 'Copy queued',\n  'split.move_queued': 'Move queued',\n  'toast.move_kept_both': 'Move queued. A name was already taken there, so that item will be kept beside the existing one with “-copy” added. This move cannot be undone.',\n  'split.cross_copy': 'Different storages - copy queued instead',\n  'dragout.downloading': 'Downloading into the folder you dropped on…',\n  'dragout.downloading_n': 'Downloading into the folder you dropped on - {n} files so far…',\n  'dragout.downloading_n_one': 'Downloading into the folder you dropped on - {n} file so far…',\n  'dragout.stop': 'Stop',\n  'dragout.stopping': 'Stopping…',\n  'dragout.stopped': 'Stopped - what had arrived stays in the folder',\n  'dragout.not_found': 'Could not find where it was dropped - a drop onto an application (rather than a folder) cannot be filled in',\n  'dragout.done': 'Download finished',\n  'dragout.ready': 'Files are ready - drag them to your desktop',\n  'dragout.preparing': 'Getting them ready to drag…',\n  'split.cross_move': 'Different storages - move queued (bytes travel, then the original is removed)',\n  /* === /wiring:d1 === */\n  /* wiring:d2 - gallery view */\n  'toolbar.view.gallery': 'Gallery',\n  'gallery.aria': 'File gallery',\n  /* /wiring:d2 */\n  /* wiring:d3 - inspector node comments */\n  'inspector.section.comments': 'Comments',\n  'inspector.comments.empty': 'No comments yet.',\n  'inspector.comments.placeholder': 'Write a comment…',\n  'inspector.comments.send': 'Send',\n  'inspector.comments.delete': 'Delete comment',\n  /* wiring:e2 - end-to-end encrypted folders */\n  'e2e.create.title': 'Create encrypted folder',\n  'e2e.create.option': 'Create encrypted folder…',\n  'e2e.create.pw_label': 'Folder password',\n  'e2e.create.pw_placeholder': 'At least 8 characters',\n  'e2e.create.pw2_label': 'Repeat the password',\n  'e2e.create.warn_title': 'NO WAY BACK',\n  'e2e.create.warn_body':\n    'Files in this folder can only be opened with this password or the recovery key shown once when the folder is created. The password is NEVER stored on the server, and filex keeps no copy of the recovery key either. Lose both and the contents are gone for good.',\n  'e2e.create.ack': 'I understand: if I lose both the password and the recovery key, my data cannot be recovered.',\n  'e2e.create.ack_required': 'Please confirm the warning to continue.',\n  'e2e.create.pw_short': 'Password must be at least 8 characters.',\n  'e2e.create.pw_mismatch': 'Passwords do not match.',\n  'e2e.create.bad_name': 'Invalid folder name.',\n  'e2e.create.create': 'Create encrypted folder',\n  'e2e.create.busy': 'Creating…',\n  'e2e.create.done': 'Encrypted folder created',\n  'e2e.create.failed': 'Could not create the encrypted folder',\n  'e2e.create.nested': 'You cannot create an encrypted folder inside another one.',\n  /* wiring:e2 policy - asking an administrator to allow one encryption\n     (E2eRequestModal), where the tenant's policy wants an approval first. */\n  'e2e.request.ctx': 'Request encryption…',\n  'e2e.request.option': 'Request an encrypted folder…',\n  'e2e.request.title': 'Request encryption for “{name}”',\n  'e2e.request.lead':\n    'Making an encrypted folder here needs an administrator’s approval. Say why you need it; you will be told the answer. An approval is for you and this folder: it can be used once, to make one new encrypted folder directly inside it.',\n  'e2e.request.lead_folder':\n    'Encrypting this folder needs an administrator’s approval. Say why you need it; you will be told the answer. An approval is for you and this folder: it can be used once, to encrypt this folder where it is, and not a folder inside it.',\n  'e2e.request.lead_file':\n    'Encrypting this file needs an administrator’s approval. Say why you need it; you will be told the answer. An approval is for you and the folder this file is in: it can be used once, for one new encrypted file there.',\n  'e2e.request.reason': 'Reason',\n  'e2e.request.reason_placeholder': 'What it holds, and why it must be encrypted',\n  'e2e.request.reason_required': 'Write a reason for the administrator.',\n  'e2e.request.send': 'Send request',\n  'e2e.request.sending': 'Sending…',\n  'e2e.request.sent': 'Request sent. You will be notified when an administrator answers.',\n  'e2e.request.already': 'You already asked for this; it is waiting for an administrator.',\n  'e2e.request.failed': 'The request could not be sent.',\n  'e2e.locked.title': 'This folder is end-to-end encrypted',\n  'e2e.locked.hint': 'Enter the folder password to see its contents. The password stays in this tab’s memory only.',\n  'e2e.locked.pw_placeholder': 'Folder password',\n  'e2e.locked.unlock': 'Unlock',\n  'e2e.locked.busy': 'Verifying…',\n  'e2e.unlock.wrong': 'Wrong password.',\n  'e2e.unlock.damaged':\n    'The password is right, but the folder key in the key file (.filex-e2e.json) does not open: the file is damaged. Try the recovery key.',\n  'e2e.unlock.marker_missing': 'Could not read the key file (.filex-e2e.json).',\n  /* ikon:emoji - the listing marker's accessible name. The row used to print\n     a 🔒 and nothing else; the padlock that replaced it is aria-hidden inside\n     the tile, so the span that carries it says this instead. */\n  'e2e.badge': 'Encrypted folder',\n  'e2e.strip.label': 'Encrypted folder - unlocked',\n  'e2e.strip.lock': 'Lock',\n  /* wiring:e2 password - changing a folder's password */\n  'e2e.password.strip_action': 'Change password…',\n  'e2e.password.title': 'Change the folder password',\n  'e2e.password.reset_title': 'Set a new password for this folder',\n  'e2e.password.reset_lead':\n    'You opened this folder with its recovery key, so its password was lost or may be known to someone. Set a new one now. Closing this dialog locks the folder again.',\n  'e2e.password.current': 'Current password',\n  'e2e.password.recovery': 'Recovery key',\n  'e2e.password.use_recovery': 'I do not remember it - use the recovery key',\n  'e2e.password.use_current': 'Use the current password instead',\n  'e2e.password.new': 'New password',\n  'e2e.password.current_required': 'Enter the current password, or use the recovery key.',\n  'e2e.password.bad_recovery': 'That is not a recovery key (32 characters, in groups of four).',\n  'e2e.password.same': 'The new password is the same as the current one.',\n  'e2e.password.cheap_note':\n    'Only the folder’s key file changes. No file is re-encrypted, and the recovery key and any escrow key keep working.',\n  'e2e.password.old_copies':\n    'Someone who knows the old password and has an old copy of the key file (a version, a backup) can still open the folder with it. If that is a risk, tick “Also replace the folder key”.',\n  'e2e.password.rotate_label': 'Also replace the folder key (re-wraps every file’s key; use this if the old password may be known)',\n  'e2e.password.rekey_title': 'This folder is from before v0.31: its key comes from its password',\n  'e2e.password.rekey_body':\n    'A new password therefore needs a new folder key, and the key of every file in the folder is re-wrapped under it. The contents are not re-encrypted. It can take a while, and if it is interrupted it continues where it stopped; the files open throughout.',\n  'e2e.password.rotate_title': 'The folder key is replaced too',\n  'e2e.password.rotate_body':\n    'Every file’s key is re-wrapped under a new folder key. The contents are not re-encrypted. If it is interrupted it continues where it stopped; the files open throughout.',\n  'e2e.password.rekey_rk_new': 'You get a new recovery key, shown once; the old one stops working.',\n  'e2e.password.rekey_rk_kept': 'The recovery key you used keeps working.',\n  'e2e.password.rekey_escrow': 'The operator’s escrow key keeps working: its slot is sealed to the new folder key.',\n  'e2e.password.rekey_ack': 'I understand: this re-wraps the key of every file in the folder.',\n  'e2e.password.submit': 'Change password',\n  'e2e.password.busy': 'Changing…',\n  'e2e.password.lock_instead': 'Lock the folder instead',\n  'e2e.password.wrong_current': 'Wrong password.',\n  'e2e.password.wrong_recovery': 'Wrong recovery key.',\n  'e2e.password.escrow_blocked':\n    'This folder has an escrow slot for a key this installation does not have, and replacing the folder key would lose it. Nothing was changed.',\n  'e2e.password.failed': 'Could not change the password. Nothing was changed.',\n  'e2e.password.done': 'Password changed. The old password no longer opens this folder.',\n  'e2e.password.resume_title': 'File keys are still being re-wrapped',\n  'e2e.password.resume_body':\n    'The password was changed and a new folder key issued. Some files still have their key under the previous one; they open either way. Continue to finish.',\n  'e2e.password.progress': '{n} files re-wrapped so far · {failed} failed',\n  'e2e.password.progress_one': '{n} file re-wrapped so far · {failed} failed',\n  'e2e.password.rekey_partial':\n    '{n} files could not be re-wrapped. They still open with the previous key; continue to try again.',\n  'e2e.password.rekey_partial_one':\n    '{n} file could not be re-wrapped. It still opens with the previous key; continue to try again.',\n  'e2e.password.rekey_done': 'New folder key in place ({n} files re-wrapped). The old password opens nothing here any more.',\n  'e2e.password.rekey_done_one': 'New folder key in place ({n} file re-wrapped). The old password opens nothing here any more.',\n  'e2e.recovery.lead_replaced':\n    'The folder has a new key, so it has a new recovery key too - the old one no longer opens it. Shown once; filex keeps no copy.',\n  /* wiring:e2 names - encrypted file and folder names */\n  'e2e.unlock.unsupported':\n    'This folder needs a newer filex: it uses {features}, which this version does not understand. Nothing was changed.',\n  'e2e.settings.open': 'Encryption settings…',\n  'e2e.settings.title': 'Encryption settings',\n  'e2e.settings.level': 'Encryption level',\n  'e2e.settings.password': 'Password',\n  'e2e.settings.escrow': 'Escrow key',\n  'e2e.settings.close': 'Close',\n  'e2e.level.content': 'Contents only',\n  'e2e.level.names': 'Contents and names',\n  'e2e.level.content_hint':\n    'File contents are encrypted. File and folder names stay readable to the server, so WebDAV, the command line and desktop sync keep working with them, and every filex since 0.31 opens the folder.',\n  'e2e.level.names_hint':\n    'Contents and file and folder names are encrypted: the server sees only scrambled names. WebDAV, the command line and desktop sync see them scrambled too, and filex 0.47 and older will not open the folder.',\n  'e2e.level.pending': 'the change of level has not finished',\n  'e2e.level.change': 'Change level…',\n  'e2e.level.raise_title': 'Move this folder to “Contents and names”?',\n  'e2e.level.raise_body':\n    'filex gives every file and folder in here an encrypted name, in this browser. The contents are not touched, and if it is interrupted it continues where it stopped. filex does not offer the way back to readable names.',\n  'e2e.level.raise_ack': 'I understand what changes',\n  'e2e.level.raise_go': 'Encrypt the names',\n  /* wiring:e2 vault - level 3, the vault (docs/E2E-VAULT-FORMAT.md) */\n  'e2e.level.vault': 'Vault',\n  'e2e.level.vault_hint': 'Contents, names and the whole tree are encrypted: the server keeps only packs of one size, and does not see how many files there are, their names, their sizes or their dates.',\n  'e2e.level.vault_cost': 'What it costs: one person writes at a time, and only filex opens it (the web app, the desktop app, filex decrypt and filex vault mount). WebDAV, folder sync, share links and previews on the server do not reach inside.',\n  'e2e.vault.pack_label': 'Pack size',\n  'e2e.vault.pack_4': '4 MiB',\n  'e2e.vault.pack_4_help': 'The default. The smallest change uploads 4 MiB.',\n  'e2e.vault.pack_16': '16 MiB',\n  'e2e.vault.pack_16_help': 'Fewer, larger files on the server. Every change uploads at least 16 MiB.',\n  'e2e.vault.pack_hint': 'Chosen now and never again. Every pack on the server is this size, and what it does not use is filled with random bytes.',\n  'e2e.vault.read_only': 'Read-only. An upload, a new folder or any other change takes the write lock, when nobody else holds it.',\n  'e2e.vault.writing': 'You are writing to this vault. If you do nothing for {left}, it goes back to read-only.',\n  'e2e.vault.lock_countdown': 'If nothing is done in it for {left}, the vault locks and asks for the password again.',\n  'e2e.vault.held_by': '{name} has been writing since {since}. The vault is read-only for you.',\n  'e2e.vault.someone': 'Someone',\n  'e2e.vault.take_over': 'Take over',\n  'e2e.vault.lost_idle': 'You did nothing for {n} minutes, so this vault went back to read-only. Nothing was lost.',\n  'e2e.vault.lost_idle_one': 'You did nothing for {n} minute, so this vault went back to read-only. Nothing was lost.',\n  'e2e.vault.lost_taken': 'Someone else took over writing. What you saved stays; the vault is read-only for you.',\n  'e2e.vault.lost_taken_by': '{name} took over writing. What you saved stays; the vault is read-only for you.',\n  'e2e.vault.lost_broken_by': '{name} ended your write lock. What you saved stays; the vault is read-only for you.',\n  'e2e.vault.lost_connection': 'The connection was lost, so this vault went back to read-only.',\n  'e2e.vault.lost_expired': 'The write lock ran out, so this vault went back to read-only.',\n  'e2e.vault.unsaved': 'Not saved: {names}. Do it again when the vault is free.',\n  'e2e.vault.saving': 'Saving…',\n  'e2e.vault.saving_progress': 'Saving: {done} of {total}',\n  'e2e.vault.dismiss': 'OK',\n  'e2e.vault.continue': 'Continue from this state',\n  'e2e.vault.ro_damaged': 'The newest state of this vault is damaged. You are looking at the one from {when}, read-only.',\n  'e2e.vault.ro_damaged_short': 'The newest state of this vault is damaged. You are looking at an older one, read-only.',\n  'e2e.vault.ro_rollback': 'The server offers an older state of this vault than this tab has already seen. It stays read-only here.',\n  'e2e.vault.ro_newer': 'A newer filex wrote this vault. This version reads it and does not change it.',\n  'e2e.vault.unreadable': 'No state of this vault can be read: nothing can be shown, and nothing is written.',\n  'e2e.vault.limit_warn': 'This vault holds {held} of at most {max} files and folders.',\n  'e2e.vault.cross': 'Nothing moves between a vault and the folders outside it on the server: download it from one, then upload it into the other.',\n  'e2e.vault.dl_too_big': 'This browser cannot save a file this large from memory. Use a browser that saves straight to disk (Chrome, Edge), or filex decrypt.',\n  'e2e.vault.damaged_file': 'This file is damaged in the vault and could not be read.',\n  'e2e.vault.level_fixed': 'A vault stays a vault: its level does not change and its key is not replaced. To start again with a new key, make a new vault and move the files into it.',\n  'e2e.vault.locked_idle_toast': 'Nothing was done in “{name}” for 15 minutes, so the vault locked itself. Enter the password to open it again.',\n  'e2e.vault.open_failed': 'The vault could not be opened.',\n  'e2e.vault.err.parent_missing': 'The folder it was going into is not there any more.',\n  'e2e.vault.err.parent_not_folder': '“{name}” is a file, not a folder.',\n  'e2e.vault.err.name_taken': '“{name}” is already taken there.',\n  'e2e.vault.err.bad_name': '“{name}” cannot be a name in a vault: 1 to 255 bytes, without slashes or control characters, and not . or ..',\n  'e2e.vault.err.too_deep': 'Folders in a vault go at most 256 deep.',\n  'e2e.vault.err.not_found': '“{name}” is not in the vault any more.',\n  'e2e.vault.err.is_folder': '“{name}” is a folder.',\n  'e2e.vault.err.into_itself': 'A folder cannot go into itself.',\n  'e2e.vault.err.too_many_entries': 'This vault is full: it holds at most 250 000 files and folders. Nothing was changed.',\n  'e2e.vault.err.index_too_large': 'This vault\\'s index has reached its limit. Nothing was changed.',\n  'e2e.vault.err.newer_format': 'A newer filex wrote this vault. This version reads it and does not change it.',\n  'e2e.vault.err.size_mismatch': 'A file changed while it was being uploaded. Upload it again.',\n  'e2e.vault.err.failed': 'The change could not be saved.',\n  'userSettings.vault.idle': 'Vault: back to read-only after',\n  'userSettings.vault.idle_help': 'How long a vault you write to stays yours while you do nothing in it. Then others may write; your vault goes back to read-only, and 15 minutes later it locks.',\n  'userSettings.vault.minutes': '{n} minutes',\n  'userSettings.vault.minutes_one': '{n} minute',\n  'userSettings.vault.saved': 'Saved',\n  'userSettings.vault.failed': 'Could not save the vault setting.',\n  'e2e.names.move_unreadable': 'Not moved: the name of one of the items cannot be read.',\n  'e2e.names.move_taken':\n    'Not moved: “{name}” is already taken in that folder. Rename one of the two first.',\n  'e2e.convert.ctx': 'Encrypt with E2EE…',\n  'e2e.convert.title': 'Encrypt “{name}”',\n  'e2e.convert.lead':\n    'Every file in this folder is encrypted where it is, in this browser, with the password below. Nothing moves; at level 1 the names stay as they are. If it is interrupted, opening the folder again continues it.',\n  'e2e.convert.past_title': 'What the server already has',\n  'e2e.convert.past_body':\n    'Encrypting protects these files from now on. Until now the server has had them in the clear, and some copies remain: filex drops its thumbnails and the text it extracted for search, and can delete older versions and trash entries from this folder.',\n  'e2e.convert.drop_versions': 'Delete the older versions of these files (they are plaintext)',\n  'e2e.convert.drop_trash': 'Delete the trash entries that came from this folder',\n  'e2e.convert.past_outside':\n    'Backups, replicas and copies anyone already made are outside filex and stay as they are.',\n  'e2e.convert.submit': 'Encrypt folder',\n  'e2e.convert.nested':\n    'This folder holds an encrypted folder. Encrypted folders cannot be nested, so nothing was changed.',\n  'e2e.convert.failed':\n    'The folder could not be encrypted. Files already encrypted stay so; open the folder to continue.',\n  'e2e.convert.stopped': 'Stopped after {n} files. Continue from the strip above the folder.',\n  'e2e.convert.stopped_one': 'Stopped after {n} file. Continue from the strip above the folder.',\n  'e2e.convert.partial':\n    '{n} files could not be encrypted (changed meanwhile, too large, or not writable). They are still plaintext; try again to continue.',\n  'e2e.convert.partial_one':\n    '{n} file could not be encrypted (changed meanwhile, too large, or not writable). It is still plaintext; try again to continue.',\n  'e2e.convert.too_large_here':\n    '{n} files are too large for this browser to send in one piece, and this server takes no upload in pieces, so they could not be encrypted where they are. They are still plaintext, and the folder stays unfinished until they are encrypted.',\n  'e2e.convert.too_large_here_one':\n    '{n} file is too large for this browser to send in one piece, and this server takes no upload in pieces, so it could not be encrypted where it is. It is still plaintext, and the folder stays unfinished until it is encrypted.',\n  'e2e.convert.large_progress': 'Encrypting “{name}”: {percent}%',\n  'e2e.convert.busy': 'Encrypting the folder…',\n  'e2e.convert.resume_title': 'Finish encrypting this folder',\n  'e2e.convert.resume_body':\n    'Encrypting this folder started and did not finish. Files it has not reached yet are still plaintext on the server. Continuing picks up where it stopped.',\n  'e2e.convert.progress': '{n} of {total} files encrypted · {failed} not done',\n  'e2e.convert.progress_one': '{n} of {total} files encrypted · {failed} not done',\n  'e2e.convert.done':\n    'Folder encrypted ({n} files). Old versions deleted: {versions}; trash entries deleted: {trash}.',\n  'e2e.convert.done_one':\n    'Folder encrypted ({n} file). Old versions deleted: {versions}; trash entries deleted: {trash}.',\n  'e2e.convert.cleanup_failed':\n    'The folder is encrypted, but its old versions and trash entries could not be deleted - only the folder’s owner or an administrator can.',\n  'e2e.names.locked_item': '🔒 Encrypted item',\n  'e2e.names.unreadable_item': '🔒 Unreadable name',\n  'e2e.names.key_failed':\n    'The key file says the names in this folder are encrypted, but their key does not open with this one. Nothing was changed.',\n  'e2e.names.write_failed': 'Could not write the name file of a long name, so nothing was uploaded.',\n  'e2e.names.bad_name':\n    '“{name}” cannot be used in an encrypted folder: a name must be 1-255 bytes, with no slash, backslash or control character.',\n  'e2e.names.offer_cost':\n    'What changes: WebDAV, the command line and desktop sync will see scrambled names, and filex 0.47 and older will refuse to open this folder. The server still sees how many items there are and how big they are.',\n  'e2e.names.resume_title': 'Finish encrypting the names',\n  'e2e.names.resume_body':\n    'Encrypting the names in this folder started and did not finish. Items it has not reached yet still have readable names. Continuing picks up where it stopped.',\n  'e2e.names.resume': 'Continue',\n  'e2e.names.stop': 'Stop',\n  'e2e.names.busy': 'Encrypting names…',\n  'e2e.names.progress': '{n} names encrypted so far · {failed} could not be renamed',\n  'e2e.names.progress_one': '{n} name encrypted so far · {failed} could not be renamed',\n  'e2e.names.done': 'Names encrypted ({n} items renamed). The server no longer sees them.',\n  'e2e.names.done_one': 'Names encrypted ({n} item renamed). The server no longer sees them.',\n  'e2e.names.stopped': 'Stopped after {n} names. The rest keep their readable names until you continue.',\n  'e2e.names.stopped_one': 'Stopped after {n} name. The rest keep their readable names until you continue.',\n  'e2e.names.partial':\n    '{n} items could not be renamed (no permission, or a name a disk cannot hold). Their names stay readable; try again to continue.',\n  'e2e.names.partial_one':\n    '{n} item could not be renamed (no permission, or a name a disk cannot hold). Its name stays readable; try again to continue.',\n  'e2e.names.failed': 'Could not encrypt the names. Nothing already renamed is lost; try again to continue.',\n  'e2e.names.strip_fix': 'Fix {n} names (readable, or moved in from outside filex)',\n  'e2e.names.strip_fix_one': 'Fix {n} name (readable, or moved in from outside filex)',\n  'e2e.create.names_root_hint':\n    'The folder’s own name stays readable either way - it sits in a folder that is not encrypted. Pick a name that gives nothing away.',\n  'e2e.locked_toast': 'Folder locked',\n  'e2e.upload.locked': 'Unlock the folder first',\n  'e2e.decrypting': 'Decrypting…',\n  'e2e.decrypt_failed': 'Could not decrypt the file (password changed or file corrupted).',\n  /* wiring:e2 recovery - recovery keys + operator escrow */\n  'e2e.create.escrow_title': 'This server holds a second key',\n  'e2e.create.escrow_body':\n    'Key escrow is enabled on this installation, so its operator can open this folder without your password. Using that key notifies you. Escrow is fixed when the server is installed and cannot be turned off for a folder.',\n  'e2e.locked.use_recovery': 'Lost the password? Use a recovery key',\n  'e2e.recovery.title': 'Save your recovery key',\n  'e2e.recovery.title_upgraded': 'Your recovery key',\n  'e2e.recovery.lead':\n    'This key opens the folder without its password. It is shown once - filex does not store it and cannot show it again.',\n  'e2e.recovery.lead_upgraded':\n    'This folder now has a recovery key. It opens the folder without its password, is shown once, and is not stored by filex.',\n  'e2e.recovery.copy': 'Copy',\n  'e2e.recovery.copied': 'Copied',\n  'e2e.recovery.download': 'Download as a file',\n  'e2e.recovery.warn_title': 'TREAT THIS LIKE A PASSWORD',\n  'e2e.recovery.warn_body':\n    'Anyone holding this key can read the folder. Keep it somewhere separate from the password - a key stored next to the password protects you from forgetting, not from anyone else.',\n  'e2e.recovery.escrow_title': 'This server also holds a key',\n  'e2e.recovery.escrow_body':\n    'Key escrow is enabled here, so the operator of this installation can open this folder without your password. You are notified when that key is used.',\n  'e2e.recovery.escrow_kid': 'Escrow key',\n  'e2e.recovery.ack': 'I have saved this key somewhere safe.',\n  'e2e.recovery.done': 'Done',\n  'e2e.recover.title': 'Unlock without the password',\n  'e2e.recover.none':\n    'This folder was created before recovery keys existed, so it has none. Its password is the only way in. Unlock it with the password once and filex will offer to add a recovery key.',\n  'e2e.recover.tab_recovery': 'Recovery key',\n  'e2e.recover.tab_escrow': 'Escrow key',\n  'e2e.recover.recovery_hint': 'The key shown once when this folder was created.',\n  'e2e.recover.recovery_placeholder': 'XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX',\n  'e2e.recover.escrow_warn_title': 'The owner will be told',\n  'e2e.recover.escrow_warn_body':\n    'Opening a folder with the escrow key notifies its owner. Use it only when you are entitled to.',\n  'e2e.recover.escrow_kid': 'Escrow key',\n  'e2e.recover.escrow_predates':\n    'This installation has an escrow key, but this folder does not. It was created before escrow was turned on here, so its master key was never wrapped to the escrow identity. The escrow key will not open it. Nothing the operator can do changes that - adding a slot needs this folder\\u2019s password, which the server has never had. The folder\\u2019s owner can grant it: unlock with the password, then choose to give the operator a key. Until they do, use the password or the recovery key.',\n  'e2e.recover.escrow_other_key':\n    'This folder carries an escrow key from a DIFFERENT installation. It was created elsewhere and restored here, so this installation\\u2019s escrow key does not open it. Only the private key belonging to the escrow key it was sealed to can.',\n  'e2e.recover.escrow_placeholder': 'Paste the escrow private key (PKCS#8, base64 or PEM)',\n  'e2e.recover.bad_format':\n    'That does not look like a recovery key. It is 32 characters in eight groups of four.',\n  'e2e.recover.escrow_required': 'Paste the escrow private key.',\n  'e2e.recover.wrong_recovery': 'That recovery key does not open this folder.',\n  'e2e.recover.wrong_escrow':\n    'That escrow key does not open this folder. A folder created before escrow was turned on has no escrow slot until its owner grants one - until then, use the password or the recovery key.',\n  'e2e.recover.bad_escrow_key': 'That is not a readable private key (expected PKCS#8, base64 or PEM).',\n  'e2e.recover.notify_failed':\n    'Could not notify the folder owner, so the folder was not unlocked. Escrow use is always announced.',\n  'e2e.recover.recovery_done': 'Unlocked with the recovery key',\n  'e2e.recover.escrow_done': 'Unlocked with the escrow key - the owner has been notified',\n  'e2e.recover.unlock': 'Unlock',\n  'e2e.recover.busy': 'Unlocking…',\n  'e2e.escrowoffer.title': 'Give the operator a key to this folder?',\n  'e2e.escrowoffer.body':\n    'This folder was created before key escrow was turned on here, so the operator of this installation cannot open it. Right now - while your password is in memory - filex can seal this folder to the escrow key. Your files are not re-encrypted or moved; only the key file changes.',\n  'e2e.escrowoffer.consequence':\n    'What this means: the operator gains a second, permanent way into this folder, without your password. You are notified when that key is used, but that notification is an announcement rather than a control.',\n  'e2e.escrowoffer.learn_more': 'What escrow can and cannot do',\n  'e2e.escrowoffer.password_label': 'Folder password',\n  'e2e.escrowoffer.password_required': 'Enter the folder password.',\n  'e2e.escrowoffer.wrong_password': 'That is not this folder\\u2019s password.',\n  'e2e.escrowoffer.accept': 'Give the operator a key',\n  'e2e.escrowoffer.decline': 'No, keep it to myself',\n  'e2e.escrowoffer.cancel': 'Cancel',\n  'e2e.escrowoffer.busy': 'Sealing…',\n  'e2e.escrowoffer.done': 'The operator can now open this folder with the escrow key',\n  'e2e.escrowoffer.declined_toast': 'Kept to yourself. filex will not ask again for this folder.',\n  'e2e.escrowoffer.decline_failed':\n    'Could not record your answer, so filex will ask again next time. Nothing about the folder changed.',\n  'e2e.escrowoffer.failed': 'Could not give the operator a key to this folder',\n  'e2e.escrowoffer.strip_action': 'Escrow key…',\n  'e2e.upgrade.title': 'This folder has no recovery key',\n  'e2e.upgrade.body':\n    'It was created before recovery keys existed, so its password is the only way in. Right now - and only right now, while the password is in memory - filex can add one. Your files are not re-encrypted or moved.',\n  'e2e.upgrade.escrow_note':\n    'Note: this installation has key escrow enabled, so adding a recovery key also lets its operator open this folder without your password.',\n  'e2e.upgrade.accept': 'Create a recovery key',\n  'e2e.upgrade.decline': 'Not now',\n  'e2e.upgrade.busy': 'Creating…',\n  'e2e.upgrade.failed': 'Could not add a recovery key to this folder',\n  'e2e.download.failed': 'Could not download the encrypted file.',\n  /* /wiring:e2 */\n\n  /* ── connections: storage config + \"how to connect\" ──────────────\n     `storages.*` keys are the ones the BACKEND's driver descriptors\n     name (each driver package declares one next to its Init). They are\n     kept identical to web/src/locales/*.json on purpose: the same\n     descriptor is rendered on both surfaces, so a field that reads\n     \"Base path\" in the admin panel and something else in the desktop\n     app would be the same drift this whole mechanism exists to stop. */\n  'conn.title': 'Storage connections',\n  'conn.subtitle': 'How to reach {host} from your own computer: mount it, or point a client at it.',\n  'conn.close': 'Close',\n  'conn.list.disabled': 'Disabled',\n  'conn.form.required': 'Required',\n  'conn.form.advanced': 'Advanced settings',\n  /* A two-button decision's own words, when the declaration did not name them. */\n  'conn.form.yes': 'Yes',\n  'conn.form.no': 'No',\n  'conn.form.noFields': 'This server did not describe any settings for this driver.',\n  'conn.form.reveal': 'Show',\n  'conn.form.hide': 'Hide',\n  'conn.guide.protocol': 'Protocol',\n  'conn.guide.storage': 'Storage',\n  'conn.guide.allStorages': 'All storages',\n  'conn.guide.copy': 'Copy',\n  'conn.guide.copied': 'Copied',\n  'conn.guide.goodToKnow': 'Good to know',\n  'conn.guide.userPlaceholder': 'your-email@example.com',\n  'conn.guide.secretPlaceholder': 'your-password-or-api-key',\n  'conn.guide.fact.url': 'Address',\n  'conn.guide.fact.urlRootHint': 'Every storage you can see appears as a folder under this address.',\n  'conn.guide.fact.urlStorageHint': 'Mounts “{storage}” directly. Drop the last segment to see every storage.',\n  'conn.guide.fact.user': 'Username',\n  'conn.guide.fact.password': 'Password',\n  'conn.guide.webdav.summary': 'WebDAV mounts filex as a drive: Windows Explorer, macOS Finder, Linux, rclone and Cyberduck all speak it, and every change is mirrored back into filex.',\n  'conn.guide.webdav.userHint': 'Your username or your email - not your display name.',\n  'conn.guide.webdav.passwordHint': 'Your account password, or an API key (API keys, in the navigation panel). An account with two-factor authentication MUST use an API key: Basic auth has no second-factor slot.',\n  'conn.guide.webdav.win.s1': 'Open File Explorer, right-click This PC and choose “Map network drive…”.',\n  'conn.guide.webdav.win.s2': 'Pick a drive letter and enter {url} as the folder.',\n  'conn.guide.webdav.win.s3': 'Tick “Connect using different credentials” and sign in with the username and password above.',\n  'conn.guide.webdav.win.cmdCaption': 'Command Prompt (same thing, without the wizard)',\n  'conn.guide.webdav.win.limits': 'Windows has three built-in limits that look exactly like filex bugs: transfers stop at ~47.7 MB, folders with about a thousand files refuse to open (“Disk is not formatted”), and the WebClient service must be restarted after changing either.',\n  'conn.guide.webdav.win.regCaption': 'Run as administrator, then reconnect the drive',\n  'conn.guide.webdav.win.https': 'HTTPS is mandatory. Windows sends Basic credentials over TLS only, and over plain http:// it silently refuses with no useful message. Do not set BasicAuthLevel to 2 - use TLS.',\n  'conn.guide.webdav.win.persist': 'The mapped drive does not survive a sign-out: since Windows 7 Basic credentials cannot be stored in Credential Manager, and /persistent:yes does not change that. Re-run the command from a logon script if you need it back automatically.',\n  'conn.guide.webdav.win.service': 'If nothing mounts at all, make sure the WebClient service is running: sc config WebClient start= auto && net start WebClient.',\n  'conn.guide.webdav.mac.s1': 'In Finder choose Go → Connect to Server… (⌘K).',\n  'conn.guide.webdav.mac.s2': 'Enter {url} and connect.',\n  'conn.guide.webdav.mac.s3': 'Authenticate with the username and password above.',\n  'conn.guide.webdav.mac.note': 'The drive appears under Locations; each storage is a top-level folder.',\n  'conn.guide.webdav.linux.mountCaption': 'davfs2, or the desktop file manager (GNOME Files, Dolphin)',\n  'conn.guide.webdav.linux.gvfsComment': 'or paste this address into GNOME Files / Dolphin',\n  'conn.guide.webdav.linux.locks': 'davfs2 needs locking turned off. filex keeps WebDAV locks in process memory, so they do not survive a restart and are not shared between replicas - davfs2 assumes otherwise and hangs.',\n  'conn.guide.webdav.rclone.obscureCaption': 'rclone stores an obscured password - run this first and paste the output below',\n  'conn.guide.webdav.rclone.passPlaceholder': '<output of rclone obscure>',\n  'conn.guide.webdav.rclone.useCaption': 'Using it',\n  'conn.guide.webdav.duck.s1': 'New Bookmark → WebDAV (HTTPS).',\n  'conn.guide.webdav.duck.s2': 'Server {host}, port 443.',\n  'conn.guide.webdav.duck.s3': 'Path {path}.',\n  'conn.guide.webdav.duck.s4': 'Username {user}, password as above.',\n  'conn.guide.webdav.note.delete': 'A WebDAV delete is permanent. The web UI moves files to the filex trash; a client delete removes the object from the backing storage directly.',\n  'conn.guide.webdav.note.locks': 'Locks live in server memory: they do not survive a restart and are not shared between replicas. They exist to satisfy Windows and Office, not to arbitrate concurrent edits.',\n  'conn.guide.webdav.note.permissions': 'You see exactly what you see in the web UI. The root lists only the storages you may open, and a path outside your grants answers 404 rather than 403, so the tree never leaks what exists.',\n  'conn.guide.webdav.note.http': 'This server is reachable over plain http://. Windows will refuse to send your credentials at all, and every other client sends your password in the clear. Put filex behind TLS before mounting it.',\n  // ── S3 endpoint: keys and the guide ──────────────────────────────\n  'conn.s3keys.title': 'S3 access keys',\n  'conn.s3keys.lead': 'An access key lets any S3 client - rclone, restic, the AWS CLI, mc, s3fs, Cyberduck - connect to filex. It carries your own permissions and nothing more.',\n  'conn.s3keys.disabled': 'The S3 endpoint is switched off on this server (FILEX_S3). A key minted here will not connect until an operator turns it back on.',\n  'conn.s3keys.cannotMint': 'You are not signed in with an account that can mint access keys. The instructions below still apply - ask for a key and paste it in.',\n  'conn.s3keys.label': 'What is it for? (laptop backup, CI, …)',\n  'conn.s3keys.defaultLabel': 'access key',\n  'conn.s3keys.everyBucket': 'Every bucket I can see',\n  'conn.s3keys.prefix': 'Folder inside the bucket (optional)',\n  'conn.s3keys.mint': 'Create key',\n  'conn.s3keys.inheritNote': 'A key can only ever narrow what you already have: your grants and your role. Confining it to one bucket or folder is the difference between a laptop backup and a credential that can read everything.',\n  'conn.s3keys.once': 'Copy the secret now - this is the only time it is shown.',\n  'conn.s3keys.accessKeyID': 'Access key ID',\n  'conn.s3keys.secret': 'Secret key',\n  'conn.s3keys.dismiss': 'I have copied it',\n  'conn.s3keys.col.label': 'Label',\n  'conn.s3keys.col.key': 'Access key ID',\n  'conn.s3keys.col.scope': 'Limited to',\n  'conn.s3keys.col.lastUsed': 'Last used',\n  'conn.s3keys.scopeAll': 'everything you can see',\n  'conn.s3keys.noLabel': '(no label)',\n  'conn.s3keys.neverUsed': 'never',\n  'conn.s3keys.enable': 'Enable',\n  'conn.s3keys.disable': 'Disable',\n  'conn.s3keys.revoke': 'Revoke',\n  'conn.s3keys.confirm': 'Sure?',\n  'conn.s3keys.empty': 'No access keys yet.',\n  'conn.guide.s3.summary': 'The S3 endpoint makes filex the destination for anything that speaks S3 - backups, sync tools, SDKs - using the storages you already have.',\n  'conn.guide.s3.keyPlaceholder': 'create a key above',\n  'conn.guide.s3.secretPlaceholder': 'shown once, when you create the key',\n  'conn.guide.s3.fact.endpoint': 'Endpoint',\n  'conn.guide.s3.fact.endpointHint': 'Point the client here, not at the web address of filex.',\n  'conn.guide.s3.fact.bucket': 'Bucket',\n  'conn.guide.s3.fact.bucketHint': 'A bucket is a filex storage. Buckets are created by an administrator, not by the client.',\n  'conn.guide.s3.fact.key': 'Access key ID',\n  'conn.guide.s3.fact.keyHint': 'The public half. It travels in every request.',\n  'conn.guide.s3.fact.secret': 'Secret key',\n  'conn.guide.s3.fact.secretHint': 'Shown once, when the key is created. filex cannot show it again - create a new key if it is lost.',\n  'conn.guide.s3.fact.region': 'Region',\n  'conn.guide.s3.fact.regionHint': 'filex has no regions; any value works and is echoed back. Clients still insist on one.',\n  'conn.guide.s3.fact.addressing': 'Addressing',\n  'conn.guide.s3.fact.pathStyle': 'path-style (required)',\n  'conn.guide.s3.fact.pathStyleHint': 'There is no dedicated S3 host on this install, so bucket.host does not resolve.',\n  'conn.guide.s3.fact.virtualHosted': 'virtual-hosted or path-style',\n  'conn.guide.s3.fact.virtualHostedHint': 'This install has its own S3 host, so both styles work.',\n  'conn.guide.s3.rclone.useCaption': 'Use it',\n  'conn.guide.s3.rclone.mtime': 'filex carries the file modification time (x-amz-meta-mtime), so rclone sync settles after the first run instead of re-uploading everything.',\n  'conn.guide.s3.aws.configureCaption': 'Configure once',\n  'conn.guide.s3.aws.useCaption': 'Use it',\n  'conn.guide.s3.aws.pathStyle': 'Add path addressing to your AWS config, or every command fails at DNS.',\n  'conn.guide.s3.restic.envCaption': 'Environment',\n  'conn.guide.s3.restic.useCaption': 'Back up, verify, prune',\n  'conn.guide.s3.restic.verified': 'Verified against this endpoint: restic check --read-data reads every pack byte for byte and reports no errors.',\n  'conn.guide.s3.mc.aliasCaption': 'Add the alias',\n  'conn.guide.s3.mc.useCaption': 'Use it',\n  'conn.guide.s3.s3fs.credsCaption': 'Credentials file',\n  'conn.guide.s3.s3fs.mountCaption': 'Mount it',\n  'conn.guide.s3.s3fs.note': 'Editing a file over s3fs rewrites the whole object, and a delete goes to the filex trash. Good for a shared folder, not for a database.',\n  'conn.guide.s3.duck.s1': 'New bookmark → Amazon S3.',\n  'conn.guide.s3.duck.s2': 'Server: {host}.',\n  'conn.guide.s3.duck.s3': 'Access key ID: {key}, secret as above.',\n  'conn.guide.s3.duck.s4': 'Open the bookmark; the buckets are your filex storages.',\n  'conn.guide.s3.duck.pathStyle': 'In Preferences → S3, turn OFF \"Use virtual host style\" - this install has no wildcard S3 host.',\n  'conn.guide.s3.sdk.note': 'Any SigV4 client works the same way: endpoint, key, secret, and path addressing when this install has no S3 host of its own.',\n  'conn.guide.s3.note.buckets': 'A bucket is a filex storage. A client can create folders and objects inside one, but not the bucket itself - that needs a driver and a path, which an S3 request cannot express.',\n  'conn.guide.s3.note.permissions': 'The key sees exactly what you see. A bucket you may not open answers \"no such bucket\" rather than \"forbidden\", so the endpoint never reveals what exists.',\n  'conn.guide.s3.note.trash': 'A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.',\n  'conn.guide.s3.note.mtime': 'Uploads carry their modification time, and the checksums clients send (Content-MD5, x-amz-checksum-*) are verified - a corrupted upload is refused rather than stored.',\n  'conn.guide.s3.note.pathStyle': 'This install has no dedicated S3 host, so clients must be told to use path-style addressing. Without it a current SDK fails at DNS with an error that names neither filex nor the cause.',\n  'conn.guide.s3.note.http': 'This endpoint is plain http://. Signatures still protect the request, but the objects travel in the clear. Put filex behind TLS before pointing a backup at it.',\n  // ── SFTP endpoint: keys and the guide ────────────────────────────\n  'conn.sshkeys.title': 'SSH keys',\n  'conn.sshkeys.lead': 'Register a public key and every SSH client - sftp, scp, WinSCP, FileZilla, rclone, sshfs - can connect without sending your password.',\n  'conn.sshkeys.disabled': 'The SFTP endpoint is switched off on this server (FILEX_SFTP). A key registered here will not connect until an operator turns it back on.',\n  'conn.sshkeys.cannotAdd': 'You are not signed in with an account that can register keys.',\n  'conn.sshkeys.paste': 'Paste the contents of ~/.ssh/id_ed25519.pub',\n  'conn.sshkeys.name': 'Name (optional - the key comment is used otherwise)',\n  'conn.sshkeys.add': 'Add key',\n  'conn.sshkeys.noCopyId': 'ssh-copy-id cannot work here: it appends to ~/.ssh/authorized_keys over a shell, and filex has none. This box is the way in.',\n  'conn.sshkeys.col.name': 'Name',\n  'conn.sshkeys.col.fingerprint': 'Fingerprint',\n  'conn.sshkeys.col.added': 'Added',\n  'conn.sshkeys.col.lastUsed': 'Last used',\n  'conn.sshkeys.noName': '(no name)',\n  'conn.sshkeys.neverUsed': 'never',\n  'conn.sshkeys.enable': 'Enable',\n  'conn.sshkeys.disable': 'Disable',\n  'conn.sshkeys.remove': 'Remove',\n  'conn.sshkeys.confirm': 'Sure?',\n  'conn.sshkeys.empty': 'No keys yet. Without one, clients sign in with your account password.',\n  'conn.guide.sftp.summary': 'SFTP makes filex reachable by anything that already speaks SSH - a backup job, a scanner, WinSCP, rclone, or a mounted folder.',\n  'conn.guide.sftp.fact.host': 'Host',\n  'conn.guide.sftp.fact.hostHint': 'The same machine as the web app, on a port of its own.',\n  'conn.guide.sftp.fact.port': 'Port',\n  'conn.guide.sftp.fact.portHint': 'Not 22 and not 443: SFTP is raw TCP and cannot go through the web proxy.',\n  'conn.guide.sftp.fact.userHint': 'Your username. An @ in it would have to be quoted in most client config files, which is what the username avoids.',\n  'conn.guide.sftp.fact.auth': 'Sign in with',\n  'conn.guide.sftp.fact.authKey': 'your registered SSH key (or your password)',\n  'conn.guide.sftp.fact.authPassword': 'your account password - or register a key above',\n  'conn.guide.sftp.fact.authHint': 'An API key works as a password too, and is revocable on its own. An account with two-factor sign-in must use an SSH key or an API key.',\n  'conn.guide.sftp.fact.path': 'Path',\n  'conn.guide.sftp.fact.pathHint': 'The first folder is a storage; the root lists the ones you may open.',\n  'conn.guide.sftp.openssh.connectCaption': 'Connect, put, get',\n  'conn.guide.sftp.openssh.noShell': 'There is no shell here - only the SFTP subsystem. `ssh host command` is refused on purpose, and scp works because OpenSSH 9 speaks SFTP for it.',\n  'conn.guide.sftp.key.tab': 'Set up a key',\n  'conn.guide.sftp.key.s1': 'Generate a key pair on the machine that will connect (skip if you already have one).',\n  'conn.guide.sftp.key.s2': 'Copy the PUBLIC half - the .pub file, never the other one.',\n  'conn.guide.sftp.key.s3': 'Paste it into the box above and connect; no password is sent from then on.',\n  'conn.guide.sftp.key.genCaption': 'On your own machine',\n  'conn.guide.sftp.key.noCopyId': 'ssh-copy-id will NOT work against filex: it needs a shell to append to ~/.ssh/authorized_keys, and there is none. Paste the key above instead.',\n  'conn.guide.sftp.winscp.s1': 'New site → File protocol: SFTP.',\n  'conn.guide.sftp.winscp.s2': 'Host name: {host}, port: {port}.',\n  'conn.guide.sftp.winscp.s3': 'User name: {user}. For a key: Advanced → SSH → Authentication → private key file.',\n  'conn.guide.sftp.winscp.s4': 'WinSCP needs a .ppk private key - use its own tool (Tools → PuTTYgen) to convert an OpenSSH key once.',\n  'conn.guide.sftp.filezilla.s1': 'File → Site Manager → New site, Protocol: SFTP.',\n  'conn.guide.sftp.filezilla.s2': 'Host: {host}, port: {port}.',\n  'conn.guide.sftp.filezilla.s3': 'User: {user}. Logon type: Normal for a password, or Key file for a key.',\n  'conn.guide.sftp.rclone.useCaption': 'Use it',\n  'conn.guide.sftp.sshfs.mountCaption': 'Mount and unmount',\n  'conn.guide.sftp.sshfs.note': 'A mounted folder rewrites the whole file on every save. Good for documents, not for a database or a video you are editing in place.',\n  'conn.guide.sftp.note.storages': 'The root is not a home directory: it lists the storages you may open, and the first path segment names one.',\n  'conn.guide.sftp.note.permissions': 'The permission bits your client draws come from your access level here, so a file shown as read-only really is one for you.',\n  'conn.guide.sftp.note.trash': 'A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.',\n  'conn.guide.sftp.note.totp': 'If your account has two-factor sign-in, the password will not work here - SSH has no way to ask for the code. Register an SSH key, or use an API key as the password.',\n  'conn.guide.sftp.note.disabled': 'The SFTP endpoint is switched off on this server. These instructions will work once an operator enables it.',\n  // ── FTPS ─────────────────────────────────────────────────────────\n  'conn.guide.ftps.summary': 'FTPS is here for the equipment that only ever learned FTP - scan-to-folder printers, EDI counterparties, older lab and industrial software. Always over TLS.',\n  'conn.guide.ftps.fact.host': 'Host',\n  'conn.guide.ftps.fact.hostHint': 'The same machine as the web app, on a port of its own.',\n  'conn.guide.ftps.fact.port': 'Port',\n  'conn.guide.ftps.fact.portHint': 'The control channel. Data moves on a separate port from the passive range below.',\n  'conn.guide.ftps.fact.mode': 'Encryption',\n  'conn.guide.ftps.fact.modeValue': 'FTPS - explicit TLS (AUTH TLS), required',\n  'conn.guide.ftps.fact.modeHint': 'Plain FTP is refused before the password is read. Choose \"Require explicit FTP over TLS\", never \"plain FTP\" and never \"implicit\".',\n  'conn.guide.ftps.fact.userHint': 'Your username, or your email. An API key works as the password too and can be revoked on its own.',\n  'conn.guide.ftps.fact.passwordHint': 'Your account password, or an API key. An account with two-factor sign-in must use an API key - FTP has no way to ask for the code.',\n  'conn.guide.ftps.fact.pasv': 'Passive ports',\n  'conn.guide.ftps.fact.pasvHint': 'Data connections land here. If your firewall blocks this range the transfer HANGS with no error on either side - that is the classic FTP failure.',\n  'conn.guide.ftps.filezilla.s1': 'File → Site Manager → New site, Protocol: FTP.',\n  'conn.guide.ftps.filezilla.s2': 'Host: {host}, port: {port}.',\n  'conn.guide.ftps.filezilla.s3': 'Encryption: \"Require explicit FTP over TLS\". Logon type: Normal, user: {user}.',\n  'conn.guide.ftps.filezilla.s4': 'Transfer settings → Passive. Active mode is refused by this server.',\n  'conn.guide.ftps.winscp.s1': 'New site → File protocol: FTP, Encryption: TLS/SSL Explicit encryption.',\n  'conn.guide.ftps.winscp.s2': 'Host name: {host}, port: {port}.',\n  'conn.guide.ftps.winscp.s3': 'User name: {user}, password as above.',\n  'conn.guide.ftps.curl.caption': 'Upload and download',\n  'conn.guide.ftps.curl.sslReqd': '--ssl-reqd is not optional: it makes curl REQUIRE TLS instead of falling back to plaintext. This server refuses plaintext anyway, but the habit protects you against the servers that do not.',\n  'conn.guide.ftps.lftp.caption': 'Connect',\n  'conn.guide.ftps.lftp.protectData': 'ssl-protect-data encrypts the FILE as well as the sign-in. Without it lftp signs in over TLS and then sends your file in the clear - which is the FTPS misconfiguration people actually ship.',\n  'conn.guide.ftps.rclone.useCaption': 'Use it',\n  'conn.guide.ftps.printer.tab': 'Scanner / printer',\n  'conn.guide.ftps.printer.s1': 'In the device\\'s scan-to-FTP settings: server {host}, port {port}.',\n  'conn.guide.ftps.printer.s2': 'User: {user}, password as above. Create an API key for the device rather than using your own password - it can be revoked without changing anything else.',\n  'conn.guide.ftps.printer.s3': 'Path: {path} - or a folder inside it that you created first. The device cannot create a storage.',\n  'conn.guide.ftps.printer.s4': 'Turn ON \"SSL/TLS\" or \"FTPS explicit\", and PASSIVE mode.',\n  'conn.guide.ftps.printer.noTLS': 'Plenty of scan-to-FTP firmware cannot do TLS at all. This server will not talk to such a device, and that is deliberate - the alternative is your documents and your password crossing the office network in the clear.',\n  'conn.guide.ftps.note.tls': 'TLS is mandatory and there is no switch to turn it off. Plain FTP sends your password in the clear and your file after it.',\n  'conn.guide.ftps.note.passive': 'Passive mode only. Active mode has the server dial back to the client, which does not survive NAT and is blocked by most firewalls.',\n  'conn.guide.ftps.note.storages': 'The root is not a home directory: it lists the storages you may open, and the first path segment names one.',\n  'conn.guide.ftps.note.trash': 'A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.',\n  'conn.guide.ftps.note.prefer': 'If the client can speak SFTP, prefer it: one connection, one port, no passive-mode surprises.',\n  'conn.guide.ftps.note.selfSigned': 'This server is using a self-signed certificate. It encrypts the channel but proves nothing about who is on the other end - most clients will ask you to accept it once. Supply a real certificate for anything that matters.',\n  'conn.guide.ftps.note.disabled': 'The FTPS endpoint is switched off on this server. These instructions will work once an operator enables it.',\n  // ── NFS ──────────────────────────────────────────────────────────\n  'conn.nfs.title': 'NFS exports',\n  'conn.nfs.lead': 'An export lets a machine on your network mount filex as a drive - a media player, a build server, a backup box.',\n  'conn.nfs.pathIsSecret': '⚠ The export path IS the password. NFS cannot ask a client who it is without Kerberos, so filex puts 32 random bytes in the path instead: whoever knows it can mount as you. Treat the mount line like a credential - /etc/fstab is world-readable on most systems.',\n  'conn.nfs.disabled': 'The NFS endpoint is switched off on this server (FILEX_NFS). An export created here will not mount until an operator turns it back on.',\n  'conn.nfs.cannotMint': 'You are not signed in with an account that can create exports.',\n  'conn.nfs.label': 'What is it for? (media player, backup box, …)',\n  'conn.nfs.defaultLabel': 'nfs export',\n  'conn.nfs.everyStorage': 'Every storage I can see',\n  'conn.nfs.prefix': 'Folder inside the storage (optional)',\n  'conn.nfs.allowCidrs': 'Allowed addresses, e.g. 192.168.1.0/24 (optional)',\n  'conn.nfs.readOnly': 'Read-only',\n  'conn.nfs.readOnlyHint': 'Read-only is the safer default for a machine: it refuses every write through this mount whatever your own permissions are. An address list narrows it further - outside it, the mount is refused.',\n  'conn.nfs.mint': 'Create export',\n  'conn.nfs.once': 'Copy this now - the path is shown only once and cannot be recovered.',\n  'conn.nfs.dismiss': 'I have copied it',\n  'conn.nfs.col.label': 'Label',\n  'conn.nfs.col.scope': 'Limited to',\n  'conn.nfs.col.mode': 'Mode',\n  'conn.nfs.col.lastUsed': 'Last mounted',\n  'conn.nfs.scopeAll': 'everything you can see',\n  'conn.nfs.modeRead': 'read-only',\n  'conn.nfs.modeWrite': 'read/write',\n  'conn.nfs.noLabel': '(no label)',\n  'conn.nfs.neverUsed': 'never',\n  'conn.nfs.enable': 'Enable',\n  'conn.nfs.disable': 'Disable',\n  'conn.nfs.revoke': 'Revoke',\n  'conn.nfs.confirm': 'Sure?',\n  'conn.nfs.empty': 'No exports yet.',\n  'conn.guide.nfs.summary': 'NFS mounts filex as a drive on a machine in your own network - the NAS protocol, for the devices that expect one.',\n  'conn.guide.nfs.pathPlaceholder': 'create an export above',\n  'conn.guide.nfs.fact.host': 'Host',\n  'conn.guide.nfs.fact.hostHint': 'The same machine as the web app, on a port of its own.',\n  'conn.guide.nfs.fact.port': 'Port',\n  'conn.guide.nfs.fact.portHint': 'Both port= and mountport= must be set to this; filex serves the mount and NFS services on one port.',\n  'conn.guide.nfs.fact.export': 'Export path',\n  'conn.guide.nfs.fact.exportHint': 'This is the credential. It is shown once, when you create the export, and is stored hashed - filex cannot show it again.',\n  'conn.guide.nfs.fact.options': 'Mount options',\n  'conn.guide.nfs.fact.optionsHint': 'nolock because filex does not run the NFS lock manager; nfsvers=3 because that is what this server speaks.',\n  'conn.guide.nfs.linux.mountCaption': 'Mount it',\n  'conn.guide.nfs.linux.fstabSecret': 'An /etc/fstab line containing this path is a password in a world-readable file. Use a credentials-protected automount, or keep the mount in a root-only unit, if that matters where you are.',\n  'conn.guide.nfs.mac.mountCaption': 'Mount it',\n  'conn.guide.nfs.mac.resvport': 'macOS needs resvport: its client insists on a privileged source port and refuses the mount without it.',\n  'conn.guide.nfs.win.s1': 'Turn on \"Services for NFS\" → \"Client for NFS\" in Windows Features (Pro and Enterprise only; Home does not have it).',\n  'conn.guide.nfs.win.s2': 'Open a Command Prompt as administrator.',\n  'conn.guide.nfs.win.s3': 'Map the export to a drive letter with the command below.',\n  'conn.guide.nfs.win.cmdCaption': 'Map it to Z:',\n  'conn.guide.nfs.win.port': 'Windows has no way to say which port the mount service is on, so it can only reach an NFS server on the standard port 2049. If this server is on another port, use SFTP or the filex desktop app instead.',\n  'conn.guide.nfs.nas.tab': 'NAS / media player',\n  'conn.guide.nfs.nas.s1': 'In the device\\'s NFS settings: server {host}, port {port} (set both the NFS and the mount port if it asks for them separately).',\n  'conn.guide.nfs.nas.s2': 'Remote path: the export path above, exactly as shown.',\n  'conn.guide.nfs.nas.s3': 'NFS version 3, no locking. Create the export read-only unless the device genuinely needs to write.',\n  'conn.guide.nfs.note.unencrypted': 'NFSv3 is not encrypted. Anyone who can read the traffic sees your files, and anyone who learns the path can mount them. Use it on a home or office network, or over a VPN - never across the internet.',\n  'conn.guide.nfs.note.pathIsSecret': 'The export path is the whole credential. Revoke it from the list above if it leaks; there is nothing else to change.',\n  'conn.guide.nfs.note.noPortmapper': 'There is no portmapper on port 111, so a client that is not told the port cannot find the server. That is why every command here carries port= and mountport=.',\n  'conn.guide.nfs.note.uid': 'The user and group ids your client sends are ignored: the mount already knows whose it is. The permissions you see come from your access in filex.',\n  'conn.guide.nfs.note.trash': 'A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.',\n  'conn.guide.nfs.note.revoke': 'Revoking takes effect on the next request, not instantly: NFS has no session to end, so a client with the mount open sees its next operation fail.',\n  'conn.guide.nfs.note.disabled': 'The NFS endpoint is switched off on this server. These instructions will work once an operator enables it.',\n  'conn.tokens.title': 'API keys',\n  'conn.tokens.lead': 'FTPS, WebDAV and filex mount all sign in with an API key instead of your account password. Create one here - it can be revoked on its own, and an account with two-factor sign-in cannot use its password on these at all.',\n  'conn.tokens.mint': 'Create API key',\n  'conn.tokens.once': 'Copy it now - this is the only time it is shown. Only a hash is stored, so it cannot be shown again.',\n  'conn.tokens.dismiss': 'I have copied it',\n  'conn.tokens.cannotMint': 'This session cannot create API keys. Sign in with your own account to create one.',\n  'conn.tokens.empty': 'No API keys yet.',\n  'conn.tokens.neverUsed': 'never',\n  'conn.tokens.revoke': 'Revoke',\n  'conn.tokens.confirm': 'Sure?',\n  'conn.tokens.col.label': 'Name',\n  'conn.tokens.col.scopes': 'Permissions',\n  'conn.tokens.col.comments': 'Comments',\n  'conn.tokens.col.used': 'Last used',\n  'conn.tokens.revokeHint': 'Revoking stops a connection that is already open, not just the next sign-in: an SFTP or FTPS session is cut and a mount stops working within about half a minute.',\n  'conn.guide.mount.summary': 'filex mount attaches a remote filex server to a folder on this machine, over the same HTTPS the browser uses. It is the only one of these that works from anywhere - no LAN, no extra server, no third-party client.',\n  'conn.guide.mount.fact.url': 'Server URL',\n  'conn.guide.mount.fact.urlHint': 'The same address you use in the browser. Nothing else has to be reachable.',\n  'conn.guide.mount.fact.token': 'API key',\n  'conn.guide.mount.fact.tokenPlaceholder': 'create one under API keys',\n  'conn.guide.mount.fact.tokenHint': 'An API key, not your password - it can be revoked on its own, and an account with 2FA cannot use its password here at all.',\n  'conn.guide.mount.fact.remote': 'What to mount',\n  'conn.guide.mount.fact.remoteHint': 'Leave --remote off to see every storage as a folder, or name one storage - or a folder inside it - to mount just that.',\n  'conn.guide.mount.linux.mountCaption': 'Mount it',\n  'conn.guide.mount.linux.umountCaption': 'Unmount it',\n  'conn.guide.mount.linux.umountWarn': 'Unmount with fusermount, not by killing the process. A mount whose process died without detaching leaves a folder where every ls hangs until somebody runs fusermount by hand.',\n  'conn.guide.mount.linux.systemdCaption': 'Mount it at sign-in (systemd user unit)',\n  'conn.guide.mount.win.winfsp': 'Windows needs WinFsp installed once - it is free and open source: https://winfsp.dev. Nothing else, and no administrator rights after that.',\n  'conn.guide.mount.win.mountCaption': 'Mount it as a drive',\n  'conn.guide.mount.win.freeLetter': 'Pick a drive letter that is FREE. The letter is created by the mount, not attached to something that already exists, and pointing it at one that is in use fails with a message that does not say so.',\n  'conn.guide.mount.win.stop': 'Stop it with Ctrl-C in that window. The drive disappears and nothing is left behind on this machine.',\n  'conn.guide.mount.mac.unsupported': 'filex mount does not work on macOS. It needs macFUSE, whose license does not allow a program like filex to install it for you, and whose Go binding needs a C compiler filex deliberately does not require. The command refuses here rather than appearing to work and doing nothing.',\n  'conn.guide.mount.mac.alternatives': 'On macOS, use the filex desktop app with folder sync (keeps the files on disk), or SFTP with a client that mounts drives.',\n  'conn.guide.mount.note.notASync': 'This is not a sync. Nothing is copied to this machine except a small read cache, so a mount opens one file out of a hundred thousand without downloading the rest. If you want the files when you are offline, use folder sync instead.',\n  'conn.guide.mount.note.reachable': 'It reaches the server through whatever proxy or tunnel the browser goes through, because underneath it is the same API. Your permissions and your storages come with it.',\n  'conn.guide.mount.note.wholeFileWrites': 'A file you write through the mount is uploaded when the program closes it, not while it is being written. Editing a very large file in place is slower here than a local disk; copying it in and out is not.',\n  'conn.guide.mount.note.trash': 'A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.',\n  'conn.guide.mount.note.revoke': 'Revoke the API key to stop a mount. It stops serving within half a minute, even if the mount is still attached.',\n  'storages.driver.ftp': 'FTP / FTPS',\n  'storages.driver.local': 'Local filesystem',\n  'storages.driver.s3': 'S3 / Hetzner / MinIO',\n  'storages.driver.sftp': 'SFTP',\n  'storages.driver.smb': 'SMB / CIFS (NAS)',\n  'storages.driver.webdav': 'WebDAV',\n  'storages.fieldHelp.smbShare': 'The share name alone, without the server: `media`, not `\\\\\\\\nas\\\\media`.',\n  'storages.fieldHelp.smbDomain': 'Only for a Windows domain account. Leave empty for a NAS.',\n  'storages.fieldHelp.smbRoot': 'Sub-folder inside the share. Leave empty for the whole share.',\n  'storages.fields.share': 'Share',\n  'storages.fields.domain': 'Domain / workgroup',\n  'storages.fieldHelp.disablePresign': 'On by default: uploads and the downloads behind public share links stream through filex, so the bucket endpoint never has to be reachable from a browser (a LAN-only MinIO just works). Turn it off only when the endpoint is reachable from your users\\' browsers (AWS, a public MinIO) and you want them to talk to the bucket directly - faster for very large files, and the store must accept SDK-signed URLs (Ceph RGW / some Hetzner setups answer SignatureDoesNotMatch).',\n  'storages.fieldHelp.endpoint': 'Leave empty for AWS S3. Any S3-compatible store needs its endpoint.',\n  'storages.fieldHelp.hostKey': 'A single public key in authorized_keys / known_hosts line form.',\n  'storages.fieldHelp.insecureSkipHostKey': 'Accepts any host key. Only for throwaway hosts.',\n  'storages.fieldHelp.keyPath': 'Path to a key file on the server, read when the storage starts. Used when the PEM field is empty.',\n  'storages.fieldHelp.knownHosts': 'OpenSSH known_hosts path for strict host-key checking. Default is trust-on-first-use in ~/.filex/known_hosts.',\n  'storages.fieldHelp.passive': 'Off switches to active mode, which needs the server to dial back into this host.',\n  'storages.fieldHelp.path': 'Directory on the server. It is created if missing; filex never mounts /.',\n  'storages.fieldHelp.pathStyle': 'On for every non-AWS store. It is turned on automatically when an endpoint is set and this was never touched.',\n  'storages.fieldHelp.prefix': 'Sub-folder inside the bucket. Required: filex never takes ownership of the bucket root.',\n  'storages.fieldHelp.region': 'Defaults to \"auto\" when left empty.',\n  'storages.fieldHelp.root': 'Sub-folder on the backend. Required: filex never mounts the account root.',\n  'storages.fieldHelp.sftpAuth': 'Either a password or a private key is required.',\n  'storages.fieldHelp.tls': 'Plain FTP sends credentials in the clear - turn this on whenever the server supports it.',\n  'storages.fields.accessKey': 'Access key',\n  'storages.fields.basePath': 'Base path',\n  'storages.fields.bucket': 'Bucket',\n  'storages.fields.disablePresign': 'Stream transfers through filex',\n  'storages.fields.endpoint': 'Endpoint',\n  'storages.fields.host': 'Host',\n  'storages.fields.hostKey': 'Pinned host key',\n  'storages.fields.insecureSkipHostKey': 'Skip host-key verification (insecure)',\n  'storages.fields.keyPath': 'Private key file',\n  'storages.fields.knownHosts': 'known_hosts file',\n  'storages.fields.name': 'Display name',\n  'storages.fields.namePlaceholder': 'Personal photos',\n  'storages.fields.passive': 'Passive mode (PASV)',\n  'storages.fields.password': 'Password',\n  'storages.fields.path': 'Filesystem path',\n  'storages.fields.pathStyle': 'Use path-style URLs (Hetzner, MinIO)',\n  'storages.fields.port': 'Port',\n  'storages.fields.prefix': 'Prefix',\n  'storages.fields.privateKey': 'Private key (PEM)',\n  'storages.fields.rbac': 'Per-item access control (RBAC)',\n  'storages.fields.rbacHint': 'When on, non-admins see only the files and folders granted to them (listed under Folder access). When off, everyone opens the storage according to their role.',\n  'storages.fields.readOnly': 'Read-only mount',\n  'storages.fields.region': 'Region',\n  'storages.fields.root': 'Base path',\n  'storages.fields.secretKey': 'Secret key',\n  'storages.fields.tls': 'FTPS (explicit AUTH TLS)',\n  'storages.fields.url': 'Base URL',\n  'storages.fields.user': 'User',\n  'storages.fields.s3AttemptTimeout': 'Attempt timeout (seconds)',\n  'storages.fields.s3MaxAttempts': 'Attempts per request',\n  'storages.fields.s3TotalTimeout': 'Give up after (seconds)',\n  'storages.fieldHelp.s3AttemptTimeout': 'How long one attempt may wait for a sign of life from the store: connecting, the TLS handshake, the answer after the request is sent, and each next piece of the answer. A transfer that keeps moving is never cut, however long it takes; an upload the store stops taking is cut after 60 seconds, or after this if it is longer. Copies and renames wait up to 10 minutes for the answer, because the store answers them only when the copy is done.',\n  'storages.fieldHelp.s3MaxAttempts': 'How many times a request is tried in all when the failure can pass: a network error, a timeout, a 5xx answer, throttling. 1 turns retrying off. A refusal (403, a missing bucket, a host name that does not resolve) is never retried.',\n  'storages.fieldHelp.s3TotalTimeout': 'No new attempt starts unless it could finish within this many seconds of the first, so an upload or a listing on a store that is down reports the outage within this time. A transfer that is under way is not cut. A request that timed out is tried again only when this is at least twice the attempt timeout.',\n  'storages.fields.attemptTimeout': 'Attempt timeout (seconds)',\n  'storages.fields.maxAttempts': 'Attempts per request',\n  'storages.fields.totalTimeout': 'Give up after (seconds)',\n  'storages.fieldHelp.attemptTimeout': 'How long one attempt may wait for a sign of life from the server: connecting, logging in, the answer to each request, and each next piece of a transfer. A transfer that keeps moving is never cut, however long it takes; an upload the server stops taking is cut after 60 seconds, or after this if it is longer.',\n  'storages.fieldHelp.webdavAttemptTimeout': 'How long one attempt may wait for a sign of life from the server: connecting, logging in, the answer to each request, and each next piece of a transfer. A transfer that keeps moving is never cut, however long it takes; an upload the server stops taking is cut after 60 seconds, or after this if it is longer. Copies, moves and deletes wait up to 10 minutes for the answer, because the server answers them only when the work is done.',\n  'storages.fieldHelp.maxAttempts': 'How many times a request is tried in all when the failure can pass: the connection is refused or drops, no answer comes in time, the server answers that it is unavailable (5xx). 1 turns retrying off. A refusal (a wrong password, a missing folder, a certificate that does not verify) is never retried, and neither is an upload that has started sending.',\n  'storages.fieldHelp.totalTimeout': 'No new attempt starts unless it could finish within this many seconds of the first, so a server that is down is reported within this time. A transfer that is under way is not cut. A request that timed out is tried again only when this is at least twice the attempt timeout.',\n\n\n  /* === gezinti:g1 - navigation panel (SideNav) === */\n  'sidenav.title': 'Navigation',\n  'sidenav.views': 'Views',\n  'sidenav.storages': 'Storages',\n  'sidenav.home': 'Home',\n  'sidenav.myfiles': 'My files',\n  'sidenav.recent': 'Recent',\n  'sidenav.starred': 'Starred',\n  'sidenav.shared': 'Shared with me',\n  // The mirror of the row above, and it sits right under it: what came in,\n  // and what went out. ⚠ \"My shares\", not \"Shared by me\" - the page lists\n  // LINKS the person minted, not files they granted somebody access to.\n  'sidenav.myshares': 'My shares',\n  'sidenav.trash': 'Trash',\n  'sidenav.collapse': 'Collapse navigation',\n  'sidenav.expand': 'Expand navigation',\n  'sidenav.close': 'Close navigation',\n  // ⚠ `open`/`close` are the DRAWER's pair, `expand`/`collapse` the docked\n  // panel's, and they are not interchangeable - see the note on\n  // `navToggleLabel` in Toolbar.vue. Below 560px the panel is a drawer over\n  // the listing: it is not narrowed to a rail, it is not on screen at all, so\n  // \"expand\" would promise a width change to something that has no width.\n  'sidenav.open': 'Open navigation',\n  'sidenav.storage.shared': 'Shared',\n  'sidenav.storage.readOnly': 'Read-only',\n  // #57 - a storage row's order menu (right click, a long press, Shift+F10).\n  // \"Sort by name\" writes an order the person can keep adjusting; it is not a\n  // mode. \"Use default order\" lets the person's own order go: the panel then\n  // follows the administrator's order (or, with none, the server's). The two\n  // `.done`/`.none` lines are the reason a greyed row gives.\n  'sidenav.storage.moveUp': 'Move up',\n  'sidenav.storage.moveDown': 'Move down',\n  'sidenav.storage.sortName': 'Sort by name',\n  'sidenav.storage.sortName.done': 'Already sorted by name',\n  'sidenav.storage.defaultOrder': 'Use default order',\n  'sidenav.storage.defaultOrder.none': 'Already in the default order',\n  // ⚠ `toolbar.nav` is GONE, and nothing replaced it. It was the one label on\n  // the panel's collapse control, first as the noun \"Navigation\" - which names\n  // the panel and never says the button does anything to it, so the owner\n  // could not find how to collapse the panel (2026-09-13: \"yan menüyü kısıp\n  // açabilir olalım ya bence\") - and then as the static stopgap \"Show or hide\n  // navigation\". The four `sidenav.*` verbs above are the real fix: the label\n  // is bound to `navOpen`, so it says *collapse* when it will collapse and\n  // *expand* when it will expand.\n  'node.home': 'Home',\n  'node.recent': 'Recent',\n  'node.starred': 'Starred',\n  'node.shared': 'Shared with me',\n  'empty.recent.title': 'Nothing opened yet',\n  'empty.recent.hint': 'Files you open show up here',\n  'empty.starred.title': 'Nothing starred yet',\n  'empty.starred.hint': 'Star a file to find it here',\n  'empty.shared.title': 'Nothing has been shared with you',\n  'empty.shared.hint': 'Folders and files other people share appear here',\n  /* etiket:t1 */\n  'sidenav.tags': 'Tags',\n  'sidenav.tags.empty': 'No tags yet - add one from a file’s right-click menu.',\n  'sidenav.tags.more': 'Show {count} more',\n  'sidenav.tags.less': 'Show fewer',\n  'sidenav.tags.personal': 'Personal',\n  'sidenav.tags.team': 'Team',\n  'empty.tag.title': 'Nothing is tagged “{tag}”',\n  'empty.tag.hint': 'Right-click a file and choose Tags to put it here',\n  'sidenav.connections': 'Connections',\n  'sidenav.apps': 'Apps',\n  // #162 - the store screen: the catalog of the stores an administrator turned\n  // on, where a person asks for an app.\n  'sidenav.appstore': 'App store',\n  'sidenav.connect': 'How to connect',\n  'sidenav.apikeys': 'API keys',\n  'overlay.close': 'Close',\n  'conn.tokens.scopes': 'Permissions',\n  'conn.tokens.root': 'Limit to one folder (optional)',\n  'conn.tokens.rootPlaceholder': 'storage://folder',\n  'conn.tokens.expiry': 'Expires in (days)',\n  'conn.tokens.expiryNever': 'never',\n  'conn.tokens.defaultName': 'API key {date}',\n  'conn.tokens.namePlaceholder': 'Name - e.g. backup script',\n  'conn.tokens.capNote': 'Your own access is the ceiling - a permission you do not have is refused, not granted.',\n  'conn.tokens.scopesRequired': 'Choose at least one permission - an API key is never issued with none.',\n  'conn.tokens.comments': 'Comments',\n  'conn.tokens.commentsRead': 'Read',\n  'conn.tokens.commentsRw': 'Read and write',\n  'conn.tokens.commentsHint': 'Adding and deleting comments is a permission of its own - “write” does not include it. Every API key reads them.',\n  'conn.tokens.commentsToRw': 'Comments: allow writing',\n  'conn.tokens.commentsToRead': 'Comments: read only',\n  /* === /gezinti:g1 === */\n\n  /* === surucu:d1 - the shell (GitHub #14); every profile, no longer a\n     `uiProfile: 'drive'` opt-in === */\n  'drive.new': 'New',\n  'drive.new.upload': 'Upload files',\n  'drive.new.folder': 'New folder',\n  'drive.new.request': 'Request files',\n  'drive.new.document': 'New document',\n\n  /* === belge:n1 - \"New document\": the picker under + New =================\n     Type names are NOT listed here. A tile reads its words from\n     lib/fileIcons `typeLabelFor`, the same table the listing's Type column\n     uses, so \".docx\" is called the same thing in both places and a new type\n     needs no string at all. Only this dialog's own chrome lives below. */\n  'newdoc.title': 'New document',\n  'newdoc.type.label': 'Document type',\n  'newdoc.group.document': 'Documents',\n  'newdoc.group.text': 'Text and code',\n  'newdoc.group.diagram': 'Diagrams',\n  'newdoc.group.app': 'Apps',\n  /* ⚠ One name per service, the name its own project uses: draw.io (not\n     \"drawio\", not \"diagrams.net\") and ONLYOFFICE - the QA sweep of\n     2026-09-21 found draw.io called three things on three screens. */\n  'newdoc.withheld.onlyoffice': 'Office documents need a document server (ONLYOFFICE), which is not set up here.',\n  'newdoc.withheld.drawio': 'Diagrams need draw.io, which is not set up here.',\n  'newdoc.withheld_admin': 'Set them up in the admin panel under External services.',\n  'newdoc.empty.title': 'No document types are available',\n  'newdoc.empty.body': 'This server did not offer any type this app can create.',\n  'newdoc.empty.blocked': 'Every type this server can create needs an editor service that is not configured here.',\n  'newdoc.name': 'Name',\n  'newdoc.name.placeholder': 'File name, e.g. notes.txt or LICENSE',\n  'newdoc.untitled': 'Untitled',\n  'newdoc.err.slash': 'A name cannot contain a slash.',\n  'newdoc.err.exists': '{name} is already here. Choose another name.',\n  'newdoc.err.bare_ext': 'Give the file a name, not only an extension.',\n  'newdoc.err.ext_needs_type': 'A .{ext} file has to be created as its own type - an empty one would not open. Choose that type, or another extension.',\n  'newdoc.hint.ext_added': 'This type keeps its extension, so the file will be created as {name}.',\n  // Drafts (issue #71): a new document is a draft until its first save.\n  'sidenav.drafts': 'Drafts',\n  'sidenav.drafts.count': '{n} drafts',\n  'sidenav.drafts.count_one': '{n} draft',\n  'node.drafts': 'Drafts',\n  'empty.drafts.title': 'No drafts',\n  'empty.drafts.hint': 'A new document waits here until you save it where it belongs.',\n  'drafts.lead': 'New documents that have not been saved yet. Only you can see them.',\n  'drafts.count_of': '{n} of {limit} drafts',\n  'drafts.col.target': 'Save to',\n  'drafts.col.storage': 'Storage',\n  'drafts.action.save': 'Save to disk',\n  'drafts.open_hint': 'Open {name}',\n  'drafts.no_match': 'No draft matches the filter.',\n  'draft.badge': 'Draft',\n  'draft.bar.target': 'will be saved to {folder}',\n  'draft.save': 'Save',\n  'draft.saved_to': '{name} was saved to {folder}.',\n  'draft.discarded': '{name} was moved to the trash.',\n  'draft.kept': 'Kept in Drafts',\n  'draft.editing': 'Editing…',\n  'draft.close.title': 'Close this draft?',\n  'draft.close.body': '{name} is a draft for {folder} and has not been saved there yet.',\n  'draft.close.hint': 'A kept draft waits in Drafts. Discard moves it to the trash.',\n  'draft.close.save': 'Save to disk',\n  'draft.close.keep': 'Keep in Drafts',\n  'draft.close.discard': 'Discard',\n  'outside.title': 'This file changed outside filex',\n  'outside.body': '{name} was changed somewhere else while it was open here, and this editor has changes of its own. Which version should stay?',\n  'outside.theirs': 'Keep the outside version',\n  'outside.theirs_hint': 'the changes made here are dropped and the outside version is loaded.',\n  'outside.mine': 'Write mine',\n  'outside.mine_hint': 'your version replaces the outside one when it is saved.',\n  'outside.both': 'Keep both',\n  'outside.both_hint': 'the outside version stays where it is, and yours is saved beside it as a separate copy (name.filex-conflict-time).',\n  'outside.hint': 'Until you choose, nothing is written over either version.',\n  'outside.pending': 'This file changed outside filex. Nothing is written over either version until you choose which one stays.',\n  'outside.choose': 'Choose…',\n  'outside.note.reloaded': 'The file was updated outside filex; the new version is loaded.',\n  'outside.note.theirs': 'The outside version is loaded; the changes made here were dropped.',\n  'outside.note.mine': 'Your version will replace the outside one when it is saved.',\n  'outside.note.both': 'The outside version stays; yours will be saved beside it as a separate copy.',\n  'draft.taken.title': 'A file with this name is already there',\n  'draft.taken.body': '{folder} already has a file called {name}. Save the draft as {suggested} instead?',\n  'draft.taken.confirm': 'Save as {name}',\n  'upload.taken.body': '{folder} already has something called {name}, and a vault keeps no earlier version. Upload it as {suggested} instead?',\n  'upload.taken.confirm': 'Upload as {name}',\n  'newdoc.hint.draft': 'It opens as a draft: nothing is created in the folder until you save it.',\n  'newdoc.err.draft_limit': 'You already keep as many drafts as this server allows ({limit}). Save or delete some in Drafts first.',\n  'newdoc.err.draft_limit_any': 'You already keep as many drafts as this server allows. Save or delete some in Drafts first.',\n  'newdoc.open_drafts': 'Open Drafts',\n  'newdoc.location': 'Location',\n  'newdoc.location.none': 'Choose a folder',\n  'newdoc.location.change': 'Change',\n  'newdoc.location.noaccess': 'You cannot save into this folder.',\n  'newdoc.create': 'Create',\n  'newdoc.creating': 'Creating…',\n  'newdoc.cancel': 'Cancel',\n  // ⚠ The top search field searches the WHOLE storage (and every storage at\n  // the root) - never only the open folder. The scope named here is therefore\n  // the storage, not the folder; \"Filter in this folder…\" (FilterBar) is the\n  // folder-scoped one. It used to say \"Search in Photos\" for a folder called\n  // Photos, which was a lie (2026-09-19).\n  'drive.search.placeholder': 'Search in {scope}',\n  'drive.search.placeholder_all': 'Search all storages',\n  'drive.search.hint_title': 'Search everywhere and run commands ({combo})',\n  'drive.storage.used': '{used} of {total} used',\n  'drive.storage.used_unlimited': '{used} used',\n  'drive.storage.used_partial': 'at least {used} used',\n  'drive.storage.label': 'Storage',\n  /* === gorunum:v3-shell - the Home view (the overview, inside the shell) ==\n   * The section headings are `sidenav.storages` / `sidenav.recent` /\n   * `sidenav.starred` and the two empty states are `empty.recent.*` /\n   * `empty.starred.*`, on purpose: the block headed \"Recent\" on Home and the\n   * panel row labelled \"Recent\" beside it are the same thing, and a second\n   * string for it is how the two drift apart one translation at a time. Only\n   * what exists nowhere else is below. */\n  'home.title': 'Home',\n  'home.storages.empty': 'No storages yet',\n  'home.storages.hint': 'A storage is a place filex reads and writes - an administrator adds them.',\n  'drive.section.folders': 'Folders',\n  'drive.section.files': 'Files',\n  'filter.aria': 'Filters',\n  'filter.type': 'Type',\n  'filter.type.any': 'Any type',\n  'filter.type.folder': 'Folders',\n  'filter.type.document': 'Documents',\n  'filter.type.spreadsheet': 'Spreadsheets',\n  'filter.type.presentation': 'Presentations',\n  'filter.type.pdf': 'PDFs',\n  'filter.type.image': 'Images',\n  'filter.type.video': 'Videos',\n  'filter.type.audio': 'Audio',\n  'filter.type.archive': 'Archives',\n  'filter.type.code': 'Code',\n  'filter.modified': 'Modified',\n  'filter.modified.any': 'Any time',\n  'filter.modified.today': 'Today',\n  'filter.modified.7d': 'Last 7 days',\n  'filter.modified.30d': 'Last 30 days',\n  'filter.modified.year': 'This year',\n  'filter.size': 'Size',\n  'filter.size.any': 'Any size',\n  'filter.size.lt1': 'Under 1 MB',\n  'filter.size.1to10': '1 - 10 MB',\n  'filter.size.10to100': '10 - 100 MB',\n  'filter.size.gt100': 'Over 100 MB',\n  /* surucu:d1-actions - the ⋮ menu at the end of the filter row. Only its own\n     NAME is new: every row inside it reuses the string that verb already has\n     (`toolbar.new_folder`, `toolbar.upload`, `ctx.paste`, `shortcuts.select_all`,\n     `selection.clear`), because a menu that renames a command is a menu the\n     reader has to learn twice. */\n  'filter.actions': 'Listing actions',\n  'filter.clear': 'Clear filters',\n  'filter.empty.title': 'Nothing here matches those filters',\n  'filter.empty.hint': 'Clear a filter, or search everywhere with the field above.',\n  'filter.count': '{shown} of {total}',\n  'inspector.tab.details': 'Details',\n  'inspector.tab.activity': 'Activity',\n  'inspector.people': 'People with access',\n  'inspector.people.you': 'You',\n  'inspector.people.inherited': 'from a parent folder',\n  'inspector.people.empty': 'Only you, and anyone with a link below.',\n  'inspector.people.manage': 'Manage access',\n  'inspector.link': 'Shared link',\n  'inspector.link.none': 'Not shared',\n  'inspector.link.create': 'Create link',\n  'inspector.link.copy': 'Copy link',\n  'inspector.activity.empty': 'No activity recorded for this item yet.',\n  'inspector.activity.hint': 'Versions are written when a file changes; comments are written by people.',\n  'inspector.activity.version': 'Version {n} saved',\n  'inspector.activity.comment': 'Comment by {who}',\n  'inspector.activity.select': 'Select a file or folder to see its activity.',\n  /* === /surucu:d1 === */\n  /* === gorunum:v1-chrome - the filter row's name box === */\n  'filter.find': 'Filter in this folder…',\n  /* surucu:d1-scope - the same box where the rows are not a folder's contents.\n     It has to say what it narrows: at the drive list \"this folder\" names\n     nothing, and on Home it would name three blocks at once. */\n  'filter.find.storages': 'Filter storages…',\n  'filter.find.home': 'Filter Home…',\n  /* === gorunum:v1-viewer - the full-bleed overlay's own chrome === */\n  'viewer.share': 'Share',\n  'viewer.nav_prev': 'Previous file',\n  'viewer.nav_next': 'Next file',\n  /* The counter in the top bar's meta line: \"246.3 KB • Sep 9, 2026 • 1 of 9\". */\n  'viewer.counter': '{i} of {n}',\n  'viewer.zoom_reset': 'Reset zoom',\n  'viewer.fullscreen': 'Full screen',\n  'viewer.exit_fullscreen': 'Exit full screen',\n  'viewer.md_placeholder': '# Markdown here…',\n  /* === gorunum:v1-selbar - the selection bar that replaces the filter row === */\n  'selection.count': '{n} selected',\n  'selection.clear': 'Clear selection',\n  /* === gorunum:v1-preview - the kind, said in words ======================\n     The Type column used to print the extension in caps. These are what it\n     prints instead; the table that picks one is in `lib/fileIcons.ts`\n     (`typeLabelKey`), so this list and that one are the only two places a\n     kind is named. Anything unmapped still falls back to the uppercased\n     extension - these names improve on that fallback, they do not replace\n     it. `Folder` is NOT here: it is `node.folder`, which the grid card's\n     caption already prints. */\n  'ftype.typescript': 'TypeScript',\n  'ftype.javascript': 'JavaScript',\n  'ftype.vue': 'Vue component',\n  'ftype.python': 'Python',\n  'ftype.go': 'Go',\n  'ftype.rust': 'Rust',\n  'ftype.php': 'PHP',\n  'ftype.ruby': 'Ruby',\n  'ftype.java': 'Java',\n  'ftype.kotlin': 'Kotlin',\n  'ftype.swift': 'Swift',\n  'ftype.c': 'C source',\n  'ftype.cpp': 'C++ source',\n  'ftype.csharp': 'C# source',\n  'ftype.stylesheet': 'Stylesheet',\n  'ftype.html': 'HTML document',\n  'ftype.json': 'JSON data',\n  'ftype.yaml': 'YAML',\n  'ftype.xml': 'XML',\n  'ftype.toml': 'TOML',\n  'ftype.sql': 'SQL',\n  'ftype.shell': 'Shell script',\n  'ftype.powershell': 'PowerShell script',\n  'ftype.markdown': 'Markdown',\n  'ftype.plaintext': 'Plain text',\n  'ftype.log': 'Log file',\n  'ftype.config': 'Configuration',\n  'ftype.sheet': 'Spreadsheet',\n  'ftype.figma': 'Figma design',\n  'ftype.drawio': 'draw.io diagram',\n  'ftype.design': 'Design file',\n  'ftype.image': 'Image',\n  'ftype.video': 'Video',\n  'ftype.audio': 'Audio',\n  'ftype.pdf': 'PDF document',\n  'ftype.document': 'Document',\n  'ftype.slides': 'Presentation',\n  'ftype.archive': 'Archive',\n  'ftype.code': 'Code',\n  /* === gorunum:v1-advsearch - the Advanced search dialog ==================\n   * Two `filter.*` keys are added here rather than beside their siblings\n   * because they are new members of shared unions the dialog introduced\n   * (`modified: 'around'`, `size: 'range'`); the filter row never selects\n   * them, but `chipLabel` would print the raw key if one ever reached it. */\n  'filter.modified.around': 'Around a date',\n  'filter.size.range': 'Custom range',\n\n  'advsearch.open': 'Advanced search',\n  'advsearch.title': 'Advanced search',\n  'advsearch.subtitle': 'Find files by name, content, path, or tags.',\n  'advsearch.close': 'Close',\n  'advsearch.content.heading': 'Content search',\n  'advsearch.viewall': 'View all results',\n  'advsearch.where.any_short': 'Anywhere',\n  'advsearch.where.here_short': 'Only here',\n  'advsearch.where.skip_short': 'Skip this',\n  'advsearch.server.legend': 'What the server searches',\n  'advsearch.client.legend': 'Narrow the results that come back',\n  'advsearch.query.label': 'Words',\n  'advsearch.query.placeholder': 'Part of a name, or words inside a file',\n  'advsearch.scope.label': 'Look in',\n  'advsearch.scope.name': 'Names and paths',\n  'advsearch.scope.content': 'File contents',\n  'advsearch.scope.all': 'Both',\n  'advsearch.scope.hint':\n    'Contents are searched from the index, which covers text-like files up to 200 KB.',\n  'advsearch.people.name_only':\n    'Owner is read off the rows that come back, and only a name search returns rows that carry one.',\n  'advsearch.scope.name_only':\n    'Only names and paths here: a content hit reaches the explorer without the storage it came from, so content search is offered on single-storage deployments only.',\n  'advsearch.tags.label': 'Tags',\n  'advsearch.tags.placeholder': 'invoice, quarterly report',\n  'advsearch.tags.exclude': 'Without tags',\n  'advsearch.tags.exclude_placeholder': 'archive',\n  'advsearch.tags.hint':\n    'Separate with commas. Tags narrow: several tags means files carrying all of them, and a tag nobody has applied returns nothing. A name matches your personal tag and your team’s tag of that name alike.',\n  'advsearch.where.label': 'Folder',\n  'advsearch.where.any': 'Anywhere in this storage',\n  'advsearch.where.here': 'Only in {folder}',\n  'advsearch.where.skip': 'Everywhere except {folder}',\n  'advsearch.around.label': 'Within',\n  'advsearch.around.date': 'Date and time',\n  'advsearch.around.h1': '1 hour',\n  'advsearch.around.d1': '1 day',\n  'advsearch.around.w1': '1 week',\n  'advsearch.size.range_label': 'Between',\n  'advsearch.size.from': 'From',\n  'advsearch.size.to': 'To',\n  'advsearch.count.idle': 'Type something, or pick a tag.',\n  'advsearch.count.counting': 'Counting…',\n  'advsearch.count.result': '{n} matching items',\n  'advsearch.count.capped': '{n} matching items in the first page of hits',\n  'advsearch.count.result_one': '{n} matching item',\n  'advsearch.count.capped_one': '{n} matching item in the first page of hits',\n  'advsearch.count.error': 'The count could not be run.',\n  'advsearch.count.cost':\n    'The count runs this search. Type, owner, date, size and folder narrow the results it finds.',\n  'advsearch.wire': 'Type this in the search box next time:',\n  'advsearch.reset': 'Reset',\n  'advsearch.cancel': 'Cancel',\n  'advsearch.submit': 'Search',\n\n  /* === gorunum:v2-topbar - the page bar is gone; the explorer's own header\n     and breadcrumb row carry what it used to. === */\n  'breadcrumb.subfolders': 'Subfolders',\n  'breadcrumb.subfolders.empty': 'No subfolders here',\n  'header.admin': 'Admin panel',\n  'header.settings': 'Settings',\n  'header.signout': 'Sign out',\n  'ai.assistant': 'AI assistant',\n  'ai.soon': 'Coming soon',\n  'ai.assistant.soon': 'AI assistant - coming soon',\n\n  /* gorunum:v2-share - the Share / Permissions dialog's own chrome. The\n     controls inside it keep the strings they already had; these are the new\n     shell: the title, the one switch, the sentence that says who can open the\n     item right now, and the three named sections it all folds into. */\n  'access.title': 'Share \"{name}\"',\n  'access.close': 'Close',\n  'access.done': 'Done',\n  'access.copy': 'Copy',\n  'access.copied': 'Copied',\n  'access.link.switch': 'Link sharing',\n  'access.who.private': 'Only people with access can open it.',\n  'access.who.link': 'Anyone with the link can open it.',\n  'access.who.pin': 'Anyone with the link and the PIN can open it.',\n  'access.who.existing': 'Link sharing is on - {n} links already exist.',\n  'access.who.existing_one': 'Link sharing is on - {n} link already exists.',\n  'access.section.link': 'Link options',\n  'access.section.people': 'People with access',\n  'access.section.drop': 'Request files',\n  'access.sum.pin_on': 'PIN on',\n  'access.sum.pin_off': 'No PIN',\n  'access.sum.people': '{n} people',\n  'access.sum.people_one': '{n} person',\n  'access.sum.people_none': 'No one yet',\n  'access.sum.groups': '{n} groups',\n  'access.sum.groups_one': '{n} group',\n  'access.sum.drop': '{n} upload links',\n  'access.sum.drop_one': '{n} upload link',\n  'access.sum.drop_none': 'No upload link',\n  /* Ownership - the Owner column and the People chip. \"System\" is the honest\n     word for a row nobody put here through filex (the scanner found it, or it\n     was written straight into the bucket); it is a real answer, not a blank. */\n  'col.owner': 'Owner',\n  'owner.you': 'You',\n  'owner.system': 'System',\n  'owner.unknown': 'Unknown',\n  'owner.external': 'Uploaded through an upload link',\n  'owner.last_actor': 'Last changed by {who}',\n  'filter.people': 'Owner',\n  'filter.people.any': 'Anyone',\n  'filter.people.me': 'You',\n  'filter.people.system': 'System',\n  'filter.people.someone': 'Someone else',\n  /* surucu:d1-sort - the listing sort control at the trailing edge of the\n     filter row. The four key names are `col.*`: the menu offers exactly the\n     words the list view's own column headers carry, so the two controls that\n     drive one sort cannot name it differently. */\n  'sort.by': 'Sort by',\n  'sort.asc': 'Ascending',\n  'sort.desc': 'Descending',\n  /* The order a SEARCH RESULT is in. It is not a fifth sort key - it is what\n     the control prints instead of a key while the rows on screen were ranked\n     by the server, so the button stops claiming a sort it is not performing.\n     `_why` is the reason the control is closed, and the owner asked for the\n     reason to be written rather than for the control to go quietly inert. */\n  'sort.relevance': 'Relevance',\n  'sort.relevance_why':\n    'Search results are listed by how well they match. Your sort comes back when you leave the search.',\n  /* === tablo:t1 - the table's own configuration ==========================\n     Since v0.43 everything about how a folder looks - view, sort AND columns -\n     belongs to the folder it was changed in; a folder nobody changed opens\n     with the person's default (their settings), else the instance's.\n     `folder_hint` is that rule in one sentence, written where the person who\n     is about to be surprised by it can read it. */\n  'col.location': 'Location',\n  'col.deleted': 'Deleted',\n  'col.deleted_from': 'Deleted from',\n  'col.deleted_by': 'Deleted by',\n  'col.remaining': 'Time left',\n  'cols.menu': 'Column options',\n  'cols.title': 'Columns',\n  'cols.resize': 'Resize {col}',\n  'cols.move_left': 'Move {col} left',\n  'cols.move_right': 'Move {col} right',\n  'cols.reset': 'Reset columns',\n  'cols.folder_title': 'Folder view',\n  'cols.folder_hint':\n    'A change you make here stays in this folder. Folders you have never changed open with your default view (Settings → Default folder view).',\n  'cols.forget_folder': \"Forget this folder's view\",\n  'cols.apply_all': 'Make this my default for all folders ({count} remembered)',\n  /* === tablo:t3 - THE ONE TABLE (components/DataTable.vue) ================\n     Every table in the product speaks these, so a column menu or a pager is\n     never the one English thing on a Turkish page. */\n  'table.empty': 'Nothing here yet',\n  'table.prev': 'Previous page',\n  'table.next': 'Next page',\n  'table.sort_paged':\n    'This list is split into pages. Sorting would only re-order the page on screen, so it is off here - narrow the list with the search or filters instead.',\n  /* === tablo:t1 - the trash banner ======================================\n     ⚠ `retention` is only used when the deployment has TOLD us the number\n     (GET /api/admin/protection). Everywhere else `retention_unknown` says the\n     same thing without naming a period we cannot verify: a banner that states\n     the wrong retention is worse than no banner, because people act on it. */\n  'trash.retention': 'Items in the trash are permanently deleted after {days} days.',\n  'trash.retention_one': 'Items in the trash are permanently deleted after {days} day.',\n  'trash.retention_unknown':\n    'Items in the trash are permanently deleted after a retention period set by your administrator.',\n  'trash.empty_action': 'Empty trash',\n  'trash.empty_confirm_title': 'Empty the trash?',\n  /* 0.54 (finding D1): the confirmation waits for the server's count of\n     what \"Empty trash\" deletes, and the Trash view is paged. Every\n     sentence about the trash itself is the server's (server.trash.*). */\n  'trash.empty_counting': 'Counting what is in the trash…',\n  'trash.show_more': 'Show more',\n  'trash.shown_of': '{shown} of {total} shown',\n  'trash.days_remaining': '{n} days',\n  'trash.days_remaining_one': '{n} day',\n  'trash.days_remaining_due': 'Due for deletion',\n  'trash.deleted_by_nobody': 'Not recorded: quarantined by the virus scan, or deleted before filex kept this',\n  'empty.trash.hint': 'Files you delete land here first, so you can put them back.',\n\n  /* tasi:m1 - the destination picker (modals/DestinationPickerModal.vue) and\n     the two selection verbs built on it. */\n  'destpicker.title.move': 'Move to',\n  'destpicker.title.copy': 'Copy to',\n  'destpicker.title.choose': 'Choose a folder',\n  'destpicker.confirm.move': 'Move here',\n  'destpicker.confirm.copy': 'Copy here',\n  'destpicker.confirm.choose': 'Choose this folder',\n  'destpicker.title.choose_file': 'Choose a file',\n  'destpicker.confirm.choose_file': 'Choose this file',\n  'destpicker.title.save': 'Save to',\n  'destpicker.confirm.save': 'Save here',\n  'destpicker.pick_a_file': 'Select a file from the list.',\n  'destpicker.empty_files': 'This folder is empty',\n  'destpicker.cancel': 'Cancel',\n  'destpicker.up': 'Up one level',\n  'destpicker.crumbs': 'Location',\n  'destpicker.drives': 'Storages',\n  'destpicker.loading': 'Loading…',\n  'destpicker.empty': 'No subfolders here',\n  'destpicker.unreadable': 'This folder cannot be opened.',\n  'destpicker.readonly': 'Read-only',\n  'destpicker.readonly_here': 'You cannot write into this folder.',\n  'destpicker.pick_a_drive': 'Open a storage to choose a folder inside it.',\n  'destpicker.target': 'Destination: {name}',\n  'destpicker.tag.blocked': 'Not allowed',\n  'destpicker.blocked.self': 'A folder cannot be moved into itself.',\n  'destpicker.blocked.descendant': 'A folder cannot be moved into one of its own subfolders.',\n  'destpicker.tag.vault': 'Vault',\n  'destpicker.blocked.vault_in': 'Nothing goes into a vault from here: upload into it from inside the vault.',\n  'destpicker.blocked.vault_out': 'What is in a vault moves only inside that vault. Download it to take it out.',\n\n  'ctx.move_to': 'Move to…',\n  'ctx.copy_to': 'Copy to…',\n  'ctx.access.one_only': 'Sharing works on one item at a time.',\n\n  'toast.archive.preparing': 'Preparing the archive…',\n  'toast.archive.started': 'Downloading {name} ({count} files)',\n  'toast.archive.started_one': 'Downloading {name} ({count} file)',\n  'toast.archive.empty': 'Nothing to download - the selection contains no readable file.',\n  'toast.moved_to': 'Move to {name} queued',\n  'toast.copied_to': 'Copy to {name} queued',\n  'toast.already_there': 'The selected items are already in {name} - nothing was sent',\n\n  /* ── dil:paket - strings that used to be inline `en ? … : …` pairs in\n     FileExplorer / RecentlyOpened, where no language pack could reach them\n     (and where a pack's language fell through to TURKISH). */\n  'ctx.tags_menu': 'Tags…',\n  'toast.node_id_copied': 'Node id {id} copied',\n  'toast.read_only_here': 'Read-only here',\n  'recents.title': 'Recently opened',\n  'recents.refresh': 'Refresh',\n  'recents.empty': 'Nothing here yet.',\n  'recents.loading': 'Loading…',\n  'recents.close': 'Close',\n  'tags.title': 'Tags',\n  'tags.close': 'Close',\n  'share.ttl.never': 'This link does not expire.',\n  'share.ttl.until': 'This link is valid until {when}.',\n  'share.ttl.ceiling': 'Links can be valid for at most {days} days (server setting).',\n  'share.ttl.ceiling_one': 'Links can be valid for at most {days} day (server setting).',\n  /* ── dil:paket - the share / access dialog (modals/PermissionsModal.vue). These were ~90 inline (tr, en) pairs: no language pack could reach them, and under any third language the dialog spoke TURKISH. access.ui.emails_comma_separated / access.ui.send / access.ui.mail_not_set_up are the mail-row lines another branch rewrote in the same release, converted at the v0.43.0 merge. */\n  'access.ui.level_viewer': 'Viewer',\n  'access.ui.level_viewer_desc': 'view + download',\n  'access.ui.level_editor': 'Editor',\n  'access.ui.level_editor_desc': 'read + write + delete',\n  'access.ui.level_owner': 'Owner',\n  'access.ui.level_owner_desc': 'edit + manage access',\n  'access.ui.never': 'Never',\n  'access.ui.days': '{days} days',\n  'access.ui.days_one': '{days} day',\n  'access.ui.unlimited': 'Unlimited',\n  'access.ui.downloads': '{count} downloads',\n  'access.ui.downloads_one': '{count} download',\n  'access.ui.inherited_from': 'Inherited from',\n  'access.ui.access_granted': 'Access granted.',\n  'access.ui.enter_a_valid_email': 'Enter a valid email.',\n  'access.ui.recipient_lang': 'Recipient\\'s language',\n  'access.ui.recipient_lang_server': 'The server\\'s language',\n  'access.ui.user_created_invite_emailed': 'User created, invite emailed.',\n  'access.ui.user_created_share_the_temp_password': 'User created. Share the temp password.',\n  'access.ui.server_limit_applied': '(server limit applied)',\n  'access.ui.protect_with_a_pin': 'Protect with a PIN',\n  'access.ui.expiry': 'Expiry',\n  'access.ui.download_limit': 'Download limit',\n  'access.ui.create_link': 'Create link',\n  'access.ui.replace_link': 'Replace the link with these settings',\n  'access.ui.replace_link_hint': 'The address changes: the current link stops working.',\n  'access.ui.create_then_send': 'Create a link, then it will be sent to {email}.',\n  'access.ui.command_line': 'Command line',\n  'access.ui.share': 'Share',\n  'access.ui.existing_links': 'Existing links',\n  'access.ui.rbac_off_here': 'Per-item access control is off on this storage - everyone opens it according to their role, so people added here would change nothing. Turn it on in the admin panel under Storages (this storage → Per-item access control).',\n  'access.ui.other_links': 'Other links',\n  'access.ui.revoke': 'Revoke',\n  'access.ui.loading': 'Loading…',\n  'access.ui.name_or_email': 'Name or email',\n  'access.ui.add': 'Add',\n  'access.ui.no_account_for_this_email_what_next': 'No account for this email - what next?',\n  'access.ui.user': 'User',\n  'access.ui.viewer': 'Viewer',\n  'access.ui.create_user_grant': 'Create user + grant',\n  'access.ui.just_send_a_share_link': 'Just send a share link →',\n  'access.ui.temp_password': 'Temp password:',\n  'access.ui.people_with_access': 'Who has access',\n  'access.ui.group': 'Group',\n  'access.ui.group_title': 'The group “{name}” - everyone in it',\n  'access.ui.group_owner_confirm': 'Owner lets everyone in “{name}” manage who has access here - including sharing it with other people and groups. Give the group Owner?',\n  'access.ui.group_owner_give': 'Give owner access',\n  'access.ui.not_shared_with_anyone_yet': 'Not shared with anyone yet.',\n  'access.ui.remove': 'Remove',\n  'access.ui.a_public_link_that_lets_anyone_upload_fi': 'A public link that lets anyone UPLOAD files into this folder. Uploaders never see the folder\\'s existing files.',\n  'access.ui.hide_upload_limits': 'Hide upload limits',\n  'access.ui.upload_limits': 'Upload limits',\n  'access.ui.max_files': 'Max files',\n  'access.ui.mb_file': 'MB / file',\n  'access.ui.allowed_types': 'Allowed types',\n  'access.ui.all_e_g_pdf_jpg': 'all (e.g. pdf, jpg)',\n  'access.ui.ask_uploader_name': 'Ask uploader name',\n  'access.ui.emails_comma_separated': 'email(s) - comma separated',\n  'access.ui.send': 'Send',\n  'access.ui.mail_not_set_up': 'Email is not set up - set it up in the admin panel under Settings (Email / SMTP).',\n  /* ── wiring:e2 fxe - single encrypted files (.fxe), streamed downloads ── */\n  'e2e.fxe.type': 'Encrypted file',\n  'e2e.fxe.ctx_encrypt': 'Encrypt with E2EE…',\n  'e2e.fxe.ctx_download_raw': 'Download encrypted file',\n  'e2e.fxe.ctx_password': 'Change password…',\n  'e2e.fxe.ctx_remove': 'Remove encryption…',\n  'e2e.fxe.encrypt_title': 'Encrypt this file',\n  'e2e.fxe.encrypt_lead':\n    '“{name}” is encrypted in this browser with a password of its own. The server keeps only ciphertext. The password or the recovery key opens it - here, or offline with filex decrypt.',\n  'e2e.fxe.pw_label': 'File password',\n  'e2e.fxe.hide_label': 'Hide the file name too',\n  'e2e.fxe.hide_on_hint':\n    'Stored as “{stored}”: the server sees neither the name nor the type. The real name is sealed inside the file and shown once you open it here.',\n  'e2e.fxe.hide_off_hint': 'Stored as “{stored}”: the name stays readable to the server; the content does not.',\n  'e2e.fxe.seen_title': 'What the server has already seen',\n  'e2e.fxe.seen_lead': 'Until now this file was stored in the clear, and encrypting it cannot take that back:',\n  'e2e.fxe.seen_trash':\n    'The original goes to the trash and stays there until the trash retention period ends or an administrator empties it. You cannot delete it for good yourself.',\n  'e2e.fxe.seen_versions': 'Its earlier versions stay in its version history; only an administrator can delete them.',\n  'e2e.fxe.seen_thumb':\n    'A thumbnail made from it stays on the server until the original is deleted for good. Its search-index entry is removed when it goes to the trash.',\n  'e2e.fxe.seen_backups': 'Backups, copies and downloads made before now still hold it.',\n  'e2e.fxe.warn_body':\n    'This file opens only with this password or the recovery key shown once after it is encrypted. filex keeps neither. Lose both and the contents are gone for good.',\n  'e2e.fxe.escrow_body':\n    'Key escrow is enabled on this installation: its operator holds a key that opens this file without your password.',\n  'e2e.fxe.encrypt_submit': 'Encrypt',\n  'e2e.fxe.encrypt_busy': 'Encrypting and uploading… {percent}%',\n  'e2e.fxe.size_unknown': 'The size of this file is not known yet. Refresh the folder and try again.',\n  'e2e.fxe.bad_name':\n    'This name cannot be sealed into an encrypted file (it is over 255 bytes, or holds a slash or a control character). Rename the file first.',\n  'e2e.fxe.name_too_long':\n    'The name is too long to add “.fxe” to it. Tick “Hide the file name too”, or rename the file first.',\n  'e2e.fxe.encrypted': '“{name}” is encrypted. The original is in the trash.',\n  'e2e.fxe.original_kept':\n    'The encrypted copy is saved, but “{name}” could not be moved to the trash. Delete the original yourself.',\n  'e2e.fxe.upload_too_big':\n    'This server has no chunked upload, and the file is too large to send in one piece from this browser.',\n  'e2e.fxe.unlock_title_open': 'Open an encrypted file',\n  'e2e.fxe.unlock_title_download': 'Download decrypted',\n  'e2e.fxe.unlock_title_remove': 'Remove encryption',\n  'e2e.fxe.unlock_lead':\n    '“{name}” is encrypted. Its password is checked here, in this browser, and is never sent to the server.',\n  'e2e.fxe.known_note': 'Already opened in this tab - no password needed.',\n  'e2e.fxe.use_password': 'Use the password instead',\n  'e2e.fxe.remove_warn_title': 'The plaintext goes back to the server',\n  'e2e.fxe.remove_warn_body':\n    'The file is decrypted here and uploaded as a plain file under its original name: the server, its administrators, thumbnails, search and backups can read it again. The encrypted file goes to the trash.',\n  'e2e.fxe.unlock_open': 'Open',\n  'e2e.fxe.unlock_download': 'Download',\n  'e2e.fxe.unlock_remove': 'Remove encryption',\n  'e2e.fxe.unlock_busy': 'Working…',\n  'e2e.fxe.save_again': 'Unlocked. Your browser wants one more click before it asks where to save the file.',\n  'e2e.fxe.save_button': 'Save…',\n  'e2e.fxe.progress': '{percent}% done',\n  'e2e.fxe.wrong_password': 'Wrong password.',\n  'e2e.fxe.wrong_recovery': 'That recovery key does not open this file.',\n  'e2e.fxe.damaged':\n    'This file is damaged or was tampered with (or it changed since it was opened). Nothing was saved.',\n  'e2e.fxe.not_readable': 'This is not a filex encrypted file, or its header is damaged.',\n  'e2e.fxe.unsupported': 'This file needs a newer filex (it requires: {features}).',\n  'e2e.fxe.downloaded': '“{name}” saved.',\n  'e2e.fxe.removed': 'Encryption removed: “{name}” is a plain file again. The encrypted file is in the trash.',\n  'e2e.fxe.password_title': 'Change the file password',\n  'e2e.fxe.password_cost':\n    'Only the file’s header changes: the content is sent back byte for byte, and the recovery key keeps working.',\n  'e2e.fxe.password_old_copies':\n    'An earlier version of this file - its version history, a backup, a copy someone downloaded - still opens with the OLD password.',\n  'e2e.fxe.password_done': 'Password changed. The old password no longer opens this file.',\n  'e2e.recovery.warn_body_file':\n    'Anyone holding this key can read the file. Keep it somewhere separate from the password - a key stored next to the password protects you from forgetting, not from anyone else.',\n  'e2e.recovery.lead_file':\n    'This key opens the file without its password. It is shown once - filex does not store it and cannot show it again.',\n  'e2e.dl.ctx_encrypted_copy': 'Download encrypted copy',\n  'e2e.dl.too_big':\n    'This browser can save at most {limit} of decrypted data at once, and this is {size}. Use Chrome or Edge (they save straight to disk), the filex desktop app, or download the encrypted file and run filex decrypt.',\n  'e2e.dl.click_again': 'Click Download again to choose where to save it.',\n  'e2e.dl.zip_started': 'Decrypting into “{name}”…',\n  'e2e.dl.zip_done': '“{name}” saved - decrypted, with the real names.',\n  'e2e.dl.zip_done_plain': '“{name}” saved. {n} files in it were never encrypted and are in it as they were.',\n  'e2e.dl.zip_done_plain_one': '“{name}” saved. {n} file in it was never encrypted and is in it as it was.',\n  'e2e.dl.zip_damaged':\n    'A file in the folder is damaged or was tampered with. The download stopped and nothing was saved.',\n  'e2e.upload.streaming_unsupported':\n    'This file is over 200 MB, and this server has no chunked upload to send it encrypted piece by piece.',\n  /* wiring:e2 fxe escrow - the escrow key opens a single file, and its owner is told */\n  'e2e.fxe.use_escrow': 'Use the escrow key',\n  'e2e.fxe.escrow_warn_title': 'The file’s owner will be told',\n  'e2e.fxe.escrow_warn_body':\n    'Opening a file with the escrow key notifies its owner, before the file is opened. Use it only when you are entitled to.',\n  'e2e.fxe.escrow_predates':\n    'This installation has an escrow key, but this file was encrypted without it (before escrow was turned on here), so the escrow key does not open it. Use the password or the recovery key.',\n  'e2e.fxe.escrow_other_key':\n    'This file is sealed to the escrow key of a DIFFERENT installation, so this installation’s escrow key does not open it.',\n  'e2e.fxe.wrong_escrow': 'That escrow key does not open this file.',\n  'e2e.fxe.escrow_notify_failed':\n    'Could not notify the file’s owner, so the file was not opened. Escrow use is always announced.',\n  'e2e.fxe.escrow_done': 'Opened with the escrow key - the owner has been notified',\n  /* wiring:e2 fxe purge - an administrator deletes the original for good */\n  'e2e.fxe.seen_trash_admin':\n    'The original goes to the trash and stays there until the trash retention period ends - unless you delete it for good below.',\n  'e2e.fxe.seen_versions_admin': 'Its earlier versions stay in its version history - unless you delete them for good below.',\n  'e2e.fxe.purge_label': 'Delete the original for good (administrator)',\n  'e2e.fxe.purge_hint':\n    'Its earlier versions and its trash entry are deleted as soon as the encrypted copy is saved, so no plaintext of it stays on this server. There is no undo. Backups and copies made before now are not reached.',\n  'e2e.fxe.purge_others': 'This file belongs to {owner}, not to you. Delete their original and its versions for good.',\n  'e2e.fxe.purge_others_unknown': 'This file has no recorded owner - it is not yours. Delete the original and its versions for good.',\n  'e2e.fxe.purge_others_required': 'Confirm that you are deleting someone else’s file for good.',\n  'e2e.fxe.purge_no_id': 'This file is not in the catalog yet, so it cannot be deleted for good. Refresh the folder and try again.',\n  'e2e.fxe.purged': '“{name}” is encrypted. The original, its versions and its trash entry are deleted for good.',\n  'e2e.fxe.purge_failed':\n    'The encrypted copy of “{name}” is saved, but the original could not be deleted for good ({reason}). Delete it from the trash and its version history.',\n  /* wiring:e2 fxe big - a decrypted download too large for this browser's memory */\n  'e2e.big.title': 'Too large to decrypt in this browser',\n  'e2e.big.lead':\n    '“{name}” is {size} once decrypted. This browser decrypts a download in its memory and can hold at most {limit} of it, so nothing was downloaded.',\n  'e2e.big.lead_grew':\n    '“{name}” grew past {limit} while it was being decrypted. This browser decrypts a download in its memory and cannot hold more, so nothing was saved.',\n  'e2e.big.instead': 'Decrypt it on your own computer instead:',\n  'e2e.big.step_file': 'Download the encrypted file, as it is (the button below).',\n  'e2e.big.step_folder': 'Download the encrypted folder as a zip (the button below) - it carries the folder’s key file.',\n  'e2e.big.step_run': 'In the folder you saved it to, run filex decrypt and give it the password:',\n  'e2e.big.copy': 'Copy',\n  'e2e.big.copied': 'Copied',\n  'e2e.big.other_ways': 'Chrome, Edge and the filex desktop app decrypt straight to disk, whatever the size.',\n  'e2e.big.close': 'Close',\n  'e2e.big.download_file': 'Download encrypted file',\n  'e2e.big.download_folder': 'Download encrypted folder (zip)',\n  /* /wiring:e2 fxe */\n  /* ── dil:paket - accessible names that were English literals */\n  'breadcrumb.aria': 'Breadcrumb',\n  'e2e.recovery_key_aria': 'Recovery key',\n  'modal.close': 'Close',\n  'modal.busy_close.keep': 'Keep going',\n  'modal.busy_close.confirm': 'Stop and close',\n  /* ── the bell and the account menu (2026-09-27: moved here from the admin\n     app so the desktop app's explorer draws the same ones). ⚠ SHARED keys:\n     the admin app's catalogue has every one of them under the same name, with\n     the same English and Turkish (web/tests/i18n/langPackCatalogue.test.ts),\n     so a language pack translates each once for both screens. */\n  'notifications.bell': 'Notifications',\n  'notifications.unreadCount': '{n} unread',\n  'notifications.title': 'Notifications',\n  'notifications.markAllRead': 'Mark all read',\n  'notifications.markRead': 'Mark read',\n  'notifications.empty': 'No notifications yet',\n  'notifications.viewAll': 'View all',\n  'notifications.manageAdmin': 'Manage notifications',\n  'notifications.openTarget': 'Open what this is about',\n  'notifications.unreadOnly': 'Unread only',\n  'notifications.pageOf': 'Page {page} of {pages} · {total} in total',\n  'notifications.severity.info': 'Info',\n  'notifications.severity.warning': 'Warning',\n  'notifications.severity.error': 'Error',\n  'notifications.severity.critical': 'Critical',\n  'common.prev': 'Previous',\n  'common.next': 'Next',\n  'explore.account': 'Account',\n  /* ── the user settings dialog (2026-09-27: moved here from the admin app\n     so the desktop app opens the same dialog inside its window). ⚠ SHARED\n     keys: the admin app's catalogue has each under the same name with the same\n     English and Turkish (web/tests/i18n/langPackCatalogue.test.ts). An\n     account field's refusal is the server's sentence (POST\n     /api/auth/account/check, lib/accountRules), not a key here. */\n  'common.cancel': \"Cancel\",\n  'common.close': \"Close\",\n  'common.confirm': \"Confirm\",\n  'common.currentPassword': \"Current password\",\n  'common.email': \"Email\",\n  'common.loading': \"Loading…\",\n  'common.newPassword': \"New password\",\n  'common.remove': \"Remove\",\n  'common.save': \"Save\",\n  'common.saving': \"Saving…\",\n  'errors.generic': \"Something went wrong\",\n  'errors.validationFailed': \"Please check the highlighted fields\",\n  'install.desktopAllDownloads': \"All downloads and release notes\",\n  'install.desktopSubtitle': \"Sync folders to this computer and keep them up to date in the background. Available for {platform}.\",\n  'install.install': \"Install\",\n  'install.menuInstructions': \"Open your browser's menu and choose “Install app” or “Add to Home screen”.\",\n  'install.iosInstructions': \"Tap Share (on iOS 26: ⋯, then Share), then “Add to Home Screen” and Add.\",\n  'nav.themeAuto': \"Auto\",\n  'nav.themeDark': \"Dark\",\n  'nav.themeLight': \"Light\",\n  'notifications.prefs.browser': \"Browser notifications\",\n  'notifications.prefs.browserHint': \"Raise a notification outside the tab when something new arrives. Clicking it opens the file, folder or share it is about.\",\n  'notifications.prefs.desktopHandled': \"The desktop app shows these itself\",\n  'notifications.prefs.enableBrowser': \"Allow notifications\",\n  'notifications.prefs.inApp': \"In-app bell\",\n  'notifications.prefs.inAppHint': \"Turning this off empties your bell. Nothing stops being recorded - an admin still sees every event.\",\n  'notifications.prefs.iosHomeScreen': \"On an iPhone or iPad, notifications work in filex added to the Home Screen (iOS 16.4 or later), not in a browser tab.\",\n  'notifications.prefs.movedToSettings': \"Your own notification settings - the bell, browser pop-ups, which events - are in your user settings.\",\n  'notifications.prefs.openSettings': \"Open my notification settings\",\n  'notifications.prefs.permDefault': \"Permission not asked yet\",\n  'notifications.prefs.permDenied': \"Blocked by this browser\",\n  'notifications.prefs.permDeniedHint': \"Re-allow notifications for this site in your browser settings.\",\n  'notifications.prefs.permGranted': \"Allowed by this browser\",\n  'notifications.prefs.permUnsupported': \"This browser cannot show notifications\",\n  'notifications.prefs.push': \"Push notifications on this device\",\n  'notifications.prefs.pushAdded': \"Added {date}\",\n  'notifications.prefs.pushDevices': \"Devices that receive push notifications\",\n  'notifications.prefs.pushDisabled': \"Turned off on the server (FILEX_PUSH_ENABLED).\",\n  'notifications.prefs.pushFailed': \"Push notifications could not be turned on for this device.\",\n  'notifications.prefs.pushHint': \"What your bell tells you reaches this phone or browser even while filex is closed - the same notifications, at the same moment.\",\n  'notifications.prefs.pushKeyUnreadable': \"The server's push key no longer opens (FILEX_SECRET_KEY changed). Rotate it under Admin → Notifications.\",\n  'notifications.prefs.pushNoSecretKey': \"Push notifications need FILEX_SECRET_KEY on the server: the key they are signed with is stored encrypted with it.\",\n  'notifications.prefs.pushOn': \"On for this device\",\n  'notifications.prefs.pushRemove': \"Remove\",\n  'notifications.prefs.pushRemoveLabel': \"Remove {device}\",\n  'notifications.prefs.pushTest': \"Send a test\",\n  'notifications.prefs.pushTestNone': \"No device took the test.\",\n  'notifications.prefs.pushTestSent': \"Test sent to {count} devices\",\n  'notifications.prefs.pushTestSent_one': \"Test sent to {count} device\",\n  'notifications.prefs.pushThisDevice': \"This device\",\n  'notifications.prefs.pushUnavailable': \"Not available on this server\",\n  'notifications.prefs.pushUnnamed': \"A device\",\n  'notifications.prefs.pushUnsupported': \"This browser cannot receive push notifications\",\n  'notifications.prefs.saved': \"Preference saved\",\n  'notifications.prefs.title': \"Your notifications\",\n  'profile.avatar.change': \"Change photo\",\n  'profile.avatar.failed': \"That image could not be processed - try another one.\",\n  'profile.avatar.help': \"Shown next to your name, and in the file explorer's collaboration bar - on every client signed in as you. Resized to 160px automatically.\",\n  'profile.avatar.label': \"Profile picture\",\n  'profile.avatar.notImage': \"Please choose an image file.\",\n  'profile.locale': \"Language\",\n  'profile.passwordChanged': \"Password changed\",\n  'profile.saved': \"Profile saved\",\n  'profile.totp.code': \"Verification code\",\n  'profile.totp.disable': \"Disable 2FA\",\n  'profile.totp.disabled': \"Disabled\",\n  'profile.totp.enable': \"Enable 2FA\",\n  'profile.totp.enabled': \"Enabled\",\n  'profile.totp.recoveryHint': \"Save these now - each one signs you in once if you lose your authenticator. They are shown only this time.\",\n  'profile.totp.recoveryTitle': \"Recovery codes\",\n  'profile.totp.scanHint': \"Scan this QR code with your authenticator app, then enter the 6-digit code.\",\n  'profile.totp.title': \"Two-factor authentication\",\n  'profile.username.label': \"Username\",\n  'quota.title': \"Storage quota\",\n  'quota.tooltip': \"{used} of {limit} used ({percent})\",\n  'quota.unlimitedTooltip': \"{used} used · unlimited\",\n  'userSettings.adminBadge': \"Admin\",\n  'userSettings.ai.body': \"This release has no per-user assistant settings. The AI features filex does ship are configured for the whole instance by an administrator, so there is nothing here for you to turn on or off yet.\",\n  'userSettings.ai.soon': \"Coming soon\",\n  'userSettings.demoReadOnly': \"This is a shared demo account, so its profile, password and second factor cannot be changed.\",\n  'userSettings.footNote.ai': \"There is nothing on this tab to save.\",\n  'userSettings.footNote.notifications': \"Saved as you change them.\",\n  'userSettings.footNote.preferences': \"Saved as you change them.\",\n  'userSettings.footNote.profile': \"Changes on this tab are saved when you press Save.\",\n  'userSettings.footNote.security': \"Each action here applies on its own.\",\n  'userSettings.heading': \"User settings\",\n  'userSettings.headingSub': \"Manage your profile, preferences, and security.\",\n  'userSettings.notifications.adminAlerts': \"Administrator alerts\",\n  'userSettings.notifications.adminAlertsHint': \"Updates, replicas, sign-in providers, tenant domains and the other alerts for administrators\",\n  'userSettings.notifications.digestHint': \"Kinds marked urgent reach you at once. The rest are held for {minutes} min and arrive as one summary, folder by folder.\",\n  'userSettings.notifications.digestOffHint': \"Every kind reaches you at once. Turn Urgent off for a kind to get it in one summary instead, folder by folder.\",\n  'userSettings.notifications.events.archive_created': \"An archive finishes being created\",\n  'userSettings.notifications.events.archive_extracted': \"An archive finishes extracting\",\n  'userSettings.notifications.events.comment_added': \"Someone comments on a file\",\n  'userSettings.notifications.events.drop_received': \"A file arrives through a request link\",\n  'userSettings.notifications.events.e2e_escrow_used': \"An encrypted folder is opened with the escrow key\",\n  'userSettings.notifications.events.e2e_password_changed': \"The password of your encrypted folder is changed\",\n  'userSettings.notifications.events.e2e_request_created': \"Someone asks to encrypt a folder or a file\",\n  'userSettings.notifications.events.e2e_request_decided': \"Your encryption request is answered\",\n  'userSettings.notifications.events.file_deleted': \"A file is deleted for good\",\n  'userSettings.notifications.events.file_infected': \"A virus is found in a file\",\n  'userSettings.notifications.events.file_moved': \"A file is moved or renamed\",\n  'userSettings.notifications.events.file_trashed': \"A file goes to the trash\",\n  'userSettings.notifications.events.file_updated': \"A file is changed\",\n  'userSettings.notifications.events.file_upload_failed': \"An upload does not finish\",\n  'userSettings.notifications.events.file_uploaded': \"A new file arrives\",\n  'userSettings.notifications.events.notification_digest': \"A summary of the notifications I did not mark urgent\",\n  'userSettings.notifications.events.plugin_notice': \"An installed app sends you a message\",\n  'userSettings.notifications.events.share_created': \"Someone creates a share link\",\n  'userSettings.notifications.eventsHint': \"Turning one off keeps it out of your bell. Nothing stops being recorded - an administrator still sees every event.\",\n  'userSettings.notifications.eventsTitle': \"What to tell me about\",\n  'userSettings.notifications.urgent': \"Urgent\",\n  'userSettings.notifications.urgentFor': \"Tell me at once: {event}\",\n  'userSettings.open': \"User settings\",\n  'userSettings.prefs.appearance': \"Appearance\",\n  'userSettings.prefs.compact': \"Use compact file list\",\n  'userSettings.prefs.compactHint': \"Tighter rows in the file explorer.\",\n  'userSettings.prefs.desktopApp': \"Desktop app\",\n  'userSettings.prefs.desktopAppHint': \"The reminder in the corner of the app can be closed for good - these downloads stay here.\",\n  'userSettings.prefs.folderView': \"Default folder view\",\n  'userSettings.prefs.folderViewHint': \"How a folder you have never changed opens. A folder you have changed keeps its own view - changing this does not touch it.\",\n  'userSettings.prefs.fvColumns': \"Your default columns are customized (set with “Make this my default for all folders”).\",\n  'userSettings.prefs.fvColumnsReset': \"Reset them\",\n  'userSettings.prefs.fvDir': \"Direction\",\n  'userSettings.prefs.fvDir_asc': \"Ascending\",\n  'userSettings.prefs.fvDir_desc': \"Descending\",\n  'userSettings.prefs.fvForget': \"Forget them all\",\n  'userSettings.prefs.fvInherit': \"Server default ({value})\",\n  'userSettings.prefs.fvMode': \"View\",\n  'userSettings.prefs.fvSort': \"Sort by\",\n  'userSettings.prefs.fvSort_modified': \"Modified\",\n  'userSettings.prefs.fvSort_name': \"Name\",\n  'userSettings.prefs.fvSort_size': \"Size\",\n  'userSettings.prefs.fvSort_type': \"Type\",\n  'userSettings.prefs.fvView_gallery': \"Gallery\",\n  'userSettings.prefs.fvView_grid': \"Grid\",\n  'userSettings.prefs.fvView_list': \"List\",\n  'userSettings.prefs.installApp': \"Install as a web app\",\n  'userSettings.prefs.installAppLead': \"Put filex on this device's home screen: it opens in a window of its own, like an app.\",\n  'userSettings.prefs.languageHint': \"Applies here right away, and is saved on your account for the next browser you sign in from.\",\n  'userSettings.prefs.mode': \"Light or dark\",\n  'userSettings.prefs.modeHint': \"Which variant is painted. Auto follows your operating system.\",\n  'userSettings.prefs.openTrigger': \"Open files with\",\n  'userSettings.prefs.openTriggerDouble': \"Double-click\",\n  'userSettings.prefs.openTriggerHint': \"How a mouse opens a file. On a touchscreen a tap always opens, and the checkbox always selects.\",\n  'userSettings.prefs.openTriggerSingle': \"Single-click\",\n  'userSettings.prefs.palette': \"Color palette\",\n  'userSettings.prefs.paletteHint': \"Which colors that variant is made of. Every palette has a light and a dark version, so this and the setting above work together.\",\n  'userSettings.prefs.startPage': \"Start page\",\n  'userSettings.prefs.startPageHint': \"Where filex opens when you sign in or go to the front door. Following a link straight to a page still takes you there.\",\n  'userSettings.prefs.startPage_admin': \"Admin panel\",\n  'userSettings.prefs.startPage_files': \"Files\",\n  'userSettings.prefs.startPage_home': \"Home\",\n  'userSettings.prefs.timezone': \"Time zone\",\n  'userSettings.prefs.timezoneHint': \"Dates are stored as a moment in time and shown on the clock you pick here, so everyone sees the same instant on their own clock. Saved to your account, so it follows you to another browser.\",\n  'userSettings.prefs.timezoneNow': \"Right now in {zone}: {time}\",\n  'userSettings.saveChanges': \"Save changes\",\n  'userSettings.security.passwordTitle': \"Change password\",\n  'userSettings.security.totpDisabled': \"Two-factor authentication is off\",\n  'userSettings.security.totpEnabled': \"Two-factor authentication is on\",\n  'userSettings.subtitle.ai': \"Nothing for you to set here yet.\",\n  'userSettings.subtitle.notifications': \"What reaches your bell, and what reaches your desktop.\",\n  'userSettings.subtitle.preferences': \"How this app looks and reads on your devices.\",\n  'userSettings.subtitle.profile': \"Your name, email and picture - what other people see.\",\n  'userSettings.subtitle.security': \"Your password and second factor.\",\n  'userSettings.tabs.ai': \"AI assistant\",\n  'userSettings.tabs.notifications': \"Notifications\",\n  'userSettings.tabs.preferences': \"Preferences\",\n  'userSettings.tabs.profile': \"Profile\",\n  'userSettings.tabs.security': \"Security\",\n  'userSettings.apps.title': \"Default apps\",\n  'userSettings.apps.lead': \"Choose one in a file's menu: Open with, Choose an app…, then tick \\\"Always use this app\\\". Only the apps your administrator left on for a kind are offered.\",\n  'userSettings.apps.empty': \"You have not chosen an app for any kind of file yet: every file opens with what your administrator put first.\",\n  'userSettings.apps.reset': \"Reset\",\n  'userSettings.apps.resetAll': \"Reset all\",\n  'userSettings.apps.unavailable': \"No longer available: it opens with {app} until you choose again.\",\n  'userSettings.apps.change': \"The app that opens {ext} files\",\n  'userSettings.title': \"Settings\",\n  'users.fields.displayName': \"Display name\",\n  'profile.username.helpText': \"Your username. You can sign in with it or with your email - and connection clients (SFTP, FTP) need it, because an @ in the name they sign in with has to be escaped in their config files.\",\n  'userSettings.prefs.fvKeptCount': \"{count} folders keep a view of their own.\",\n  'userSettings.prefs.fvKeptCount_one': \"{count} folder keeps a view of its own.\",\n};\n","/** Turkish UI strings. */\nexport const tr: Record<string, string> = {\n  'toolbar.new_folder': 'Yeni klasör',\n  'toolbar.upload': 'Yükle',\n  'toolbar.search': 'Ara',\n  'toolbar.search.placeholder': 'Ada ya da tag: ile ara…',\n  'toolbar.view.list': 'Liste',\n  'toolbar.view.grid': 'Izgara',\n  'toolbar.refresh': 'Yenile',\n  'toolbar.go_up': 'Üst klasör',\n\n  'ctx.open': 'Aç',\n  'ctx.preview': 'Önizle',\n  'ctx.download': 'İndir',\n  'ctx.archive_create': 'Arşiv oluştur…',\n  'ctx.archive_extract': 'Arşivi çıkar…',\n  'ctx.rename': 'Yeniden adlandır',\n  'ctx.delete': 'Sil',\n  'ctx.delete_perm': 'Kalıcı olarak sil',\n  'ctx.restore': 'Geri getir',\n  'ctx.share': 'Paylaş',\n  'ctx.move': 'Taşı',\n  'ctx.copy': 'Kopyala',\n  'ctx.cut': 'Kes',\n  'ctx.show_hidden': 'Gizli dosyaları göster',\n  'ctx.hide_hidden': 'Gizli dosyaları gizle',\n  'ctx.keep_local': 'Bilgisayarda tut',\n  'ctx.keep_online': 'Yalnızca çevrimiçi tut',\n  'ctx.keep_reveal': 'Yerel klasörü aç',\n  'ctx.keep_inherited': 'Üst klasörle bilgisayarda tutuluyor',\n  'keep.started': 'Bilgisayarda tutulacak - eşitleme başladı',\n  'keep.failed': 'Bilgisayarda tutulamadı',\n  'keep.badge_kept': 'Bilgisayarda',\n  'keep.badge_syncing': 'Eşitleniyor…',\n  'keep.badge_cloud': 'Yalnızca çevrimiçi',\n  'keep.badge_partial': 'İçinde bilgisayarda tutulanlar var',\n  'keep.strip_transfer': '{name} eşitleniyor - {done}/{total} (%{pct})',\n  'keep.strip_inventory': '{name} eşitleniyor - sunucu taranıyor…',\n  'keep.strip_settling': '{name} eşitleniyor - son durum kaydediliyor…',\n  'ctx.paste': 'Yapıştır',\n  'ctx.info': 'Bilgi',\n  'ctx.duplicate': 'Kopyasını oluştur',\n  'ctx.new_file': 'Yeni dosya',\n\n  'modal.delete.title': 'Silinsin mi?',\n  'modal.delete.message': '{count} öğe çöpe atılacak.',\n  'modal.delete.message_one': '{count} öğe çöpe atılacak.',\n  'modal.delete.confirm': 'Çöpe at',\n  'modal.delete.working': 'Çöpe taşınıyor…',\n  'modal.delete.cancel': 'Vazgeç',\n  'modal.delete.permanent_title': 'Kalıcı olarak silinsin mi?',\n  'modal.delete.permanent_message': '{count} öğe kalıcı olarak silinecek. Bu geri alınamaz.',\n  'modal.delete.permanent_message_one': '{count} öğe kalıcı olarak silinecek. Bu geri alınamaz.',\n  'modal.delete.permanent_confirm': 'Kalıcı olarak sil',\n  'modal.delete.permanent_working': 'Siliniyor…',\n\n  'modal.rename.title': 'Yeniden adlandır',\n  'modal.rename.save': 'Kaydet',\n  'modal.rename.saving': 'Yeniden adlandırılıyor…',\n  'modal.rename.cancel': 'Vazgeç',\n\n  'modal.newfolder.title': 'Yeni klasör',\n  'modal.newfolder.placeholder': 'Klasör adı',\n  'modal.newfolder.create': 'Oluştur',\n  'modal.newfolder.creating': 'Oluşturuluyor…',\n  'modal.newfolder.cancel': 'Vazgeç',\n\n  'modal.share.title': 'Paylaşım bağlantısı',\n  'archive.create_title': 'Arşiv oluştur',\n  'archive.extract_title': 'Arşivi çıkar',\n  'archive.create_count': '{count} öğe seçildi',\n  'archive.create_count_one': '{count} öğe seçildi',\n  'archive.filename': 'Arşiv adı',\n  'archive.format': 'Biçim',\n  'archive.password_optional': 'Parola (isteğe bağlı)',\n  'archive.password_confirm': 'Parolayı doğrula',\n  'archive.password_mismatch': 'Parolalar birbiriyle eşleşmiyor.',\n  'archive.encrypt_names': 'Dosya adlarını şifrele',\n  'archive.compression': 'Sıkıştırma',\n  'archive.solid': 'Katı arşiv oluştur',\n  'archive.dictionary_size': 'Sözlük boyutu',\n  'archive.dictionary_size_value': '{n} MiB',\n  'archive.dictionary_hint': 'Daha büyük sözlükler sıkıştırmayı iyileştirebilir ancak oluşturma ve çıkarma sırasında daha fazla bellek kullanır.',\n  'archive.destination_folder': 'Çıkarılacak klasör',\n  'archive.create': 'Oluştur',\n  'archive.creating': 'Oluşturuluyor…',\n  'archive.extract': 'Çıkar',\n  'archive.extract_here': 'Buraya çıkar',\n  'archive.extract_to_folder': 'Klasöre çıkar',\n  'archive.extracting': 'Çıkarılıyor…',\n  'archive.cancel': 'Vazgeç',\n  'archive.invalid_name': 'Eğik çizgi içermeyen bir dosya adı girin.',\n  'archive.invalid_extension': 'Arşiv adı kullanılabilir biçim uzantılarından biriyle bitmelidir.',\n  'archive.invalid_folder': 'Eğik çizgi içermeyen bir klasör adı girin.',\n  'archive.password_required': 'Bu arşiv için parola gerekiyor.',\n  'archive.password_title': 'Arşiv parolası',\n  'archive.continue': 'Devam et',\n  'archive.opening': 'Açılıyor…',\n  'archive.bad_password': 'Arşiv parolası yanlış.',\n  'archive.target_exists': 'Bu ada sahip bir öğe zaten var. Başka bir ad seçin veya önce mevcut öğeyi kaldırın.',\n  'archive.password_charset': 'ZIP parolasında yalnızca ASCII karakterler kullanılabilir; ç, ğ, ı, İ, ö, ş, ü gibi harfler kullanılamaz. Her karakteri kullanmak için 7z biçimini seçin.',\n  'archive.error_unsupported': 'Bu arşiv çıkarılamıyor: bu sunucu biçimini okuyamıyor ya da içinde filex’in çıkarmadığı bir şey var (bağlantı, özel dosya ya da boyutunu belirtmeyen bir dosya).',\n  'archive.error_limit': 'Bu arşiv, sunucunun çıkarmaya izin verdiği boyutu aşıyor.',\n  'archive.error_unavailable': 'Bu sunucu şu anda bu tür bir arşivi açamıyor.',\n  'archive.created': 'Arşiv oluşturuldu',\n  'archive.queued': 'Arşiv oluşturma arka planda çalışıyor',\n  'archive.extracted': '{count} dosya çıkarıldı',\n  'archive.extracted_one': '{count} dosya çıkarıldı',\n  'archive.extraction_queued': 'Arşiv çıkarma arka planda çalışıyor',\n  'archive.preparing_extract': '{name} okunuyor… çıkarılmadan önce arşivin tamamı okunur.',\n  'archive.already_preparing': '{name} hâlâ okunuyor - okuma bitince bir kez çıkarılacak',\n  'archive.extraction_completed': 'Çıkarma tamamlandı',\n  'archive.extraction_cancelled': 'Çıkarma {count} dosyadan sonra iptal edildi',\n  'archive.extraction_cancelled_one': 'Çıkarma {count} dosyadan sonra iptal edildi',\n\n  'modal.share.pin': 'PIN koruması',\n  'modal.share.expires': 'Son kullanma',\n  'modal.share.max_downloads': 'İndirme limiti',\n  'modal.share.create': 'Paylaş',\n  'modal.share.cancel': 'Vazgeç',\n  'modal.share.close': 'Kapat',\n  'modal.share.limit_applied': '(sunucu sınırı uygulandı)',\n  'modal.share.copy': 'Kopyala',\n  'modal.share.url_copied': 'Bağlantı kopyalandı',\n  'modal.share.pin_copied': 'PIN kopyalandı',\n  'modal.share.cli_copied': 'CLI komutu kopyalandı',\n\n  'upload.progress': 'Yükleniyor',\n  'upload.done': 'Tamamlandı',\n  'upload.error': 'Hata',\n  'upload.failed': '“{name}” yüklenemedi',\n  'upload.aborted': 'İptal edildi',\n  'upload.cancel': 'İptal',\n  'upload.resuming': '“{name}” %{percent} noktasından devam ediyor',\n  'upload.saving': 'Depoya kaydediliyor…',\n\n  'empty.folder': 'Bu klasör boş',\n  'empty.search': 'Sonuç bulunamadı',\n  'loading': 'Yükleniyor…',\n\n  'notFound.title': 'Klasör bulunamadı',\n  'notFound.desc': 'Bu klasör mevcut değil, taşınmış ya da erişim yetkiniz yok.',\n  'notFound.goRoot': 'Kök klasöre dön',\n\n  'col.name': 'Ad',\n  'col.size': 'Boyut',\n  'col.modified': 'Değiştirilme',\n  'col.type': 'Tür',\n\n  'unit.bytes': 'B',\n  'unit.kb': 'KB',\n  'unit.mb': 'MB',\n  'unit.gb': 'GB',\n  'unit.tb': 'TB',\n  'unit.pb': 'PB',\n\n  'breadcrumb.root': 'Kök',\n  'breadcrumb.copy_path': 'Yolu kopyala',\n  'breadcrumb.go_to_path': 'Yola git',\n  'breadcrumb.path_placeholder': 'fileman/foo/bar',\n\n  'ops.copy': 'Kopyalanıyor',\n  'ops.move': 'Taşınıyor',\n  'ops.delete': 'Siliniyor',\n  'ops.queued': 'sırada',\n  'ops.done': 'tamamlandı',\n  'ops.error': 'hata',\n\n  'node.trash': 'Çöp kutusu',\n  'node.folder': 'Klasör',\n\n  // --- Zengin önizleyici chrome ---\n  'viewer.open_in_new_tab': 'Yeni sekmede aç',\n  'viewer.loading': 'Yükleniyor…',\n  'viewer.failed_to_load': 'Dosya yüklenemedi',\n  'viewer.peer_not_installed': 'Bu tür bir dosya burada gösterilemiyor. Cihazınızda açmak için indirin.',\n  'viewer.format_unsupported_3d': 'Önizleme yalnızca .glb, .gltf ve .usdz biçimindeki 3B modelleri gösterir. Dosyayı indirip bir 3B programında açın.',\n  'viewer.zoom_in': 'Yakınlaştır',\n  'viewer.zoom_out': 'Uzaklaştır',\n  'viewer.fit_width': 'Sayfa genişliğine sığdır',\n  'viewer.next_page': 'Sonraki sayfa',\n  'viewer.prev_page': 'Önceki sayfa',\n  'viewer.page_n_of_m': 'Sayfa {n} / {m}',\n  'viewer.tags': 'Etiketler',\n  'viewer.layers': 'Katmanlar',\n  'viewer.toc': 'İçindekiler',\n  'viewer.font_smaller': 'Yazıyı küçült',\n  'viewer.font_larger': 'Yazıyı büyüt',\n  'viewer.search': 'Ara',\n  'viewer.download': 'İndir',\n  'viewer.saving': 'Kaydediliyor…',\n  'viewer.save': 'Kaydet (Ctrl+S)',\n  'viewer.saved': 'Kaydedildi',\n  'viewer.save_error': 'Hata',\n  'viewer.editor_loading': 'Editör yükleniyor…',\n  'viewer.no_preview': 'Bu dosya tipi için önizleme henüz yok.',\n  'viewer.edit': 'Düzenle',\n  'viewer.close': 'Kapat',\n  'presence.expand': 'Adları göster',\n  'presence.collapse': 'Küçült',\n  'viewer.save_annotations': 'Açıklamaları kaydet',\n  'viewer.annotations_on': 'Açıklamalar: açık',\n  'viewer.annotations_off': 'Açıklamalar: kapalı',\n  'viewer.read_only': 'Salt okunur',\n  'viewer.csv_first_row_header': 'İlk satır başlık olsun',\n  'viewer.csv_filter': 'Satır filtrele…',\n  'viewer.epub_prev': 'Önceki',\n  'viewer.epub_next': 'Sonraki',\n  /* ⚠ Eski cümle her okuyucuya bir ORTAM DEĞİŞKENİ söylüyordu (\"yönetici\n     FILEX_DRAWIO_URL'yi ayarlamalı\"). Yalnızca bir diyagrama bakmak isteyen\n     kişiye ne yapabileceği; `_admin` - düzeltebilecek kişiye - nereden\n     düzelteceği söylenir. */\n  'viewer.drawio.disabled': 'Diyagramlar burada açılamıyor: bu sunucuda draw.io yok. Başka bir yerde açmak için dosyayı indirin.',\n  'viewer.drawio.disabled_admin': 'Bu sunucuda draw.io kurulu değil. Yönetim panelinde Dış servisler altından kurabilirsiniz.',\n  'viewer.drawio.load_failed': 'Bu diyagram okunamadı. Başka bir yerde açmak için indirin.',\n  'viewer.drawio.save_failed': 'Diyagram kaydedilemedi. Değişiklikleriniz hâlâ düzenleyicide - yeniden deneyin.',\n  'viewer.archive.entries': '{n} dosya',\n  'viewer.archive.entries_one': '{n} dosya',\n  'viewer.archive.empty': 'Arşiv boş.',\n  'viewer.archive.error': 'Arşiv okunamadı.',\n  'viewer.archive.unsupported': 'Bu tür bir arşiv burada listelenemiyor. İçinde ne olduğunu görmek için indirin.',\n  'viewer.archive.too_large': 'Bu arşiv burada listelenemeyecek kadar büyük. İçinde ne olduğunu görmek için indirin.',\n  'viewer.archive.open': 'Arşivi aç',\n  'viewer.archive.root': 'Arşiv',\n  'viewer.archive.location': 'Arşiv konumu',\n  'viewer.archive.reading':\n    'Hâlâ okunuyor… İçeriği listelenmeden önce arşivin tamamı okunur; büyük bir arşivde bu biraz sürer.',\n  'viewer.name': 'Ad',\n  'viewer.size': 'Boyut',\n\n  // --- cila:a - sıralama / tarih grupları / yoğunluk ---\n  'col.sort': 'Sırala',\n  'group.today': 'Bugün',\n  'group.yesterday': 'Dün',\n  'group.this_week': 'Bu hafta',\n  'group.this_month': 'Bu ay',\n  'group.no_date': 'Tarihsiz',\n  'toolbar.density.compact': 'Sıkışık görünüm',\n  'toolbar.density.comfortable': 'Rahat görünüm',\n\n  // --- cila:c - komut paleti + kısayol yardımı + breadcrumb ---\n  'palette.placeholder': 'Dosya, klasör veya komut ara…',\n  'palette.files': 'Dosyalar',\n  'palette.commands': 'Komutlar',\n  'palette.goto': 'Yola git',\n  'palette.empty': 'Sonuç bulunamadı',\n  'palette.hint': '↑↓ gezin · Enter seç · Esc kapat',\n  'cmd.view_toggle': 'Görünümü değiştir (liste ⇄ ızgara)',\n  'cmd.trash': 'Çöp kutusunu aç',\n  'shortcuts.title': 'Klavye kısayolları',\n  'shortcuts.group.nav': 'Gezinme',\n  'shortcuts.group.selection': 'Seçim',\n  'shortcuts.group.file': 'Dosya işlemleri',\n  'shortcuts.palette': 'Komut paleti',\n  'shortcuts.search': 'Aramaya odaklan',\n  'shortcuts.go_up': 'Üst klasöre çık',\n  'shortcuts.open': 'Seçili öğeyi aç',\n  'shortcuts.close': 'Kapat / vazgeç',\n  'shortcuts.toggle_hidden': 'Gizli dosyaları göster/gizle',\n  'shortcuts.help': 'Bu yardım penceresi',\n  'shortcuts.select_all': 'Tümünü seç',\n  'shortcuts.star': 'Yıldızla / yıldızı kaldır',\n  'shortcuts.rename': 'Yeniden adlandır',\n  'shortcuts.delete': 'Sil',\n  'shortcuts.cut': 'Kes',\n  'shortcuts.copy': 'Kopyala',\n  'shortcuts.paste': 'Yapıştır',\n  'breadcrumb.more': 'Aradaki klasörler',\n\n  // --- State screens + undo snackbar + connection badge (cila:b) ---\n  'empty.hint': 'Dosyaları buraya sürükleyip bırakın',\n  'empty.upload': 'Dosya yükle',\n  'empty.search.title': 'Aramanızla eşleşen dosya yok',\n  'empty.search.hint': 'Farklı bir arama terimi deneyin',\n  'empty.trash.title': 'Çöp kutusu boş',\n  'error.title': 'Liste yüklenemedi',\n  'error.retry': 'Yeniden dene',\n  'toast.undo': 'Geri al',\n  'toast.undone': 'Geri alındı',\n  'toast.undoing': 'Geri alınıyor…',\n  'toast.undo_queued': 'Geri alma kuyruğa alındı - bittiğini işlemler paneli gösterecek',\n  'toast.undo_failed': 'Geri alınamadı',\n  'toast.renamed': 'Yeniden adlandırıldı',\n  'toast.rename_queued': '“{name}” olarak yeniden adlandırılıyor…',\n  'toast.moved': 'Taşındı',\n  'toast.trashed': 'Çöpe taşındı',\n  /* i18n:hardcoded - FileExplorer.vue'da düz string olarak duran, hiçbir dilin\n     değiştiremediği bildirim metinleri. */\n  'toast.failed': 'İşlem başarısız',\n  'err.status.400': 'Geçersiz istek',\n  'err.status.401': 'Oturum açmanız gerekiyor',\n  'err.status.403': 'Bu işlem için yetkiniz yok',\n  'err.status.404': 'Bulunamadı',\n  'err.status.409': 'Zaten var / çakışma',\n  'err.status.413': 'Dosya çok büyük',\n  'err.status.415': 'Bu dosya türü desteklenmiyor',\n  'err.status.422': 'Geçersiz veri',\n  'err.status.429': 'Çok fazla istek, biraz bekleyin',\n  'err.status.500': 'Sunucu hatası',\n  'err.status.501': 'Bu işlem desteklenmiyor',\n  'err.status.502': 'Bağlı bir servis hata verdi',\n  'err.status.503': 'Servis şu an kullanılamıyor',\n  'err.status.504': 'Bağlı bir servis zamanında yanıt vermedi',\n  'err.status.other': 'Sunucu bu isteği kabul etmedi.',\n  'err.upload_stalled': 'Yükleme ilerlemeyi bıraktı. Yeniden deneyin - kaldığı yerden devam eder.',\n  'err.network': 'Sunucuya ulaşılamadı. Bağlantınızı kontrol edip yeniden deneyin.',\n  /* 0.54: sunucunun adını verdiği ret, sunucunun cümlesiyle söylenir (`message`, server.error.*). */\n  'err.save_failed': 'Değişiklikleriniz kaydedilemedi.',\n  'err.load_failed': 'Bu dosya yüklenemedi.',\n  'err.viewer_failed': 'Bu dosyanın görüntüleyicisi başlatılamadı. Açmak için dosyayı indirin.',\n  'err.detail': 'Ayrıntı',\n  'toast.copied': 'Kopyalandı',\n  'toast.deleted': 'Silindi',\n  'toast.cut': 'Kesildi',\n  'toast.cut_ready': 'Kes → Yapıştır hazır',\n  'toast.copy_ready': 'Kopyala → Yapıştır hazır',\n  'toast.same_folder_cut': 'Aynı klasöre kesilemez',\n  'toast.restored': '{n} öğe geri getirildi',\n  'toast.restored_one': '{n} öğe geri getirildi',\n  'toast.delete_queued': 'Silme kuyruğa alındı',\n  'toast.trash_retention': 'Çöpteki öğeler saklama süresi sonunda otomatik silinir. Kalıcı silme yönetici panelinden yapılır.',\n  /* Kalıcı silinmesi yolda olan çöp satırı (yönetici Çöp sayfasının sözleri:\n     iki katalogda tek cümle - ders #447). */\n  'trash.purging': 'Kalıcı olarak siliniyor…',\n  'trash.row_busy': 'Bu öğe üzerinde zaten bir iş sürüyor',\n  'dropzone.hint': 'Dosyaları buraya bırak',\n  'modal.newfolder.invalid': 'Geçersiz karakter',\n  'names.reserved': '“{name}” adı filex’in kendi kullanımına ayrılmış. Başka bir ad seçin.',\n  /* ⚠ Eksik ya da bozuk belge sunucusu kelimelerle söylenir, asla HTTP\n     katmanıyla değil (eskiden `Config fetch 503: {\"error\":\"onlyoffice not\n     configured\"}` yazıyordu). `_admin`, düzeltebilecek kişinin okuduğu -\n     nereden düzelteceği; diğer herkes dosyayı yine de nasıl alacağını okur. */\n  'viewer.office_unconfigured':\n    'Ofis belgeleri burada açılamıyor: bu sunucuda ONLYOFFICE belge sunucusu yok. Dosyayı bilgisayarınızda açmak için indirin.',\n  'viewer.office_unconfigured_admin':\n    'Bu sunucuda ONLYOFFICE kurulu değil, bu yüzden ofis belgeleri burada açılamıyor. Yönetim panelinde Dış servisler altından kurabilirsiniz.',\n  'viewer.office_unreachable': 'Belge sunucusu şu anda yanıt vermiyor. Daha sonra yeniden deneyin ya da dosyayı indirin.',\n  'viewer.office_unreachable_admin':\n    'ONLYOFFICE belge sunucusu yanıt vermiyor. Yönetim panelinde Dış servisler altından kontrol edin.',\n  /* Görev #92: düzenleyici başka bir kökendeki (belge sunucusunun kendi\n     kökeni ya da arayüz kökeni) bir çerçevede çalışır ve o sayfa hiç yanıt\n     vermedi - adres bu filex'e ulaşmıyor. */\n  'viewer.office_frame_unreachable_admin':\n    \"ONLYOFFICE düzenleyici çerçevesi {origin} adresinden yüklenmedi. Oradaki vekil sunucunun çerçeveyi filex'e yönlendirdiğini kontrol edin ({env}).\",\n  'viewer.office_failed': 'Bu belge ONLYOFFICE ile açılamadı. Bilgisayarınızda açmak için indirin.',\n  'viewer.csv_office_note': 'CSV olarak kaydedilir: yalnızca etkin sayfanın değerleri kalır. Biçimlendirme, formüller ve diğer sayfalar kaydedilmez.',\n  'viewer.office_forbidden': 'Bu belgeyi ONLYOFFICE ile açma izniniz yok.',\n  /* ONLYOFFICE'in \"Download failed\" (İndirme başarısız) hatasından sonra:\n     iki durumdan hangisi olduğu, filex'in gördüğüyle (lib/officeDiagnosis,\n     #80). */\n  'viewer.office_download_served':\n    'Belge sunucusu bu dosyayı filex’ten indirdi, ancak tarayıcınız dönüştürülmüş kopyayı belge sunucusundan yükleyemedi. Belge sunucusunun önündeki vekil sunucunun X-Forwarded-Proto ve X-Forwarded-Host başlıklarına bakın.',\n  'viewer.office_download_not_requested':\n    'Belge sunucusu bu dosyayı filex’ten hiç istemedi. Dosya daha önce açıldıysa belge sunucusu kendi kopyasını kullanıyor olabilir.',\n  'viewer.office_download_refused': 'filex, belge sunucusunun bu dosya için yaptığı isteği şu nedenle reddetti: {reason}.',\n  'viewer.office_fetch_reason.bad_link': 'adres bozuktu',\n  'viewer.office_fetch_reason.signature_expired': 'adresin süresi dolmuştu',\n  'viewer.office_fetch_reason.signature_bad': 'imzası eşleşmedi (JWT sırrı değişti ya da adres değiştirildi)',\n  'viewer.office_fetch_reason.not_found': 'dosya artık yok',\n  'viewer.office_fetch_reason.storage_unavailable': 'depo açılamadı',\n  'viewer.office_fetch_reason.body_unavailable': 'dosyanın içeriği bulunamadı',\n  'viewer.office_fetch_reason.object_missing': 'dosya depoda yok',\n  'viewer.office_fetch_reason.read_failed': 'dosya depodan okunamadı',\n  /* Gezginin \"Aç\" girdisi, belge sunucusu yokken - yalnızca yöneticiye\n     gösterilir (diğer herkese girdi hiç sunulmaz; lib/serviceGate). */\n  'ctx.needs_onlyoffice': 'ONLYOFFICE kurulu değil - yönetim panelinde Dış servisler altından kurun.',\n  'ctx.needs_drawio': 'draw.io kurulu değil - yönetim panelinde Dış servisler altından kurun.',\n  'viewer.pdf_inline_failed': 'Tarayıcı PDF\\'i inline açamadı.',\n  'viewer.too_large': 'Dosya çok büyük (>1 MB).',\n  'viewer.csv_rows': '{n} satır',\n  'viewer.csv_rows_one': '{n} satır',\n  'presence.others': '{n} kişi',\n  'presence.others_one': '{n} kişi',\n  'conn.offline': 'Canlı bağlantı yok - değişiklikler gecikebilir',\n  'conn.tooltip': 'Sunucuyla canlı bağlantı kurulamadı; liste belirli aralıklarla otomatik yenilenir. Bağlantı geri gelince bu uyarı kaybolur.',\n\n  /* === bul:s3 === */\n  'palette.everywhere': 'Her yerde',\n  'palette.searching': 'Aranıyor…',\n  'palette.everywhere_failed': 'Arama yapılamadı. Yeniden deneyin.',\n  'palette.saved': 'Kayıtlı aramalar',\n  'palette.save': 'Aramayı kaydet',\n  'palette.saved.delete': 'Kayıtlı aramayı sil',\n  /* #168 - yönetim panelinin araması (components/PanelSearch.vue). */\n  'panelsearch.label': 'Yönetim panelinde ara',\n  'panelsearch.trigger': 'Ara',\n  'panelsearch.placeholder': 'Sayfa, ayar, kişi, uygulama ara…',\n  'panelsearch.close': 'Aramayı kapat',\n  'panelsearch.clear': 'Aramayı temizle',\n  'panelsearch.results': 'Arama sonuçları',\n  'panelsearch.group.page': 'Sayfalar',\n  'panelsearch.group.setting': 'Ayarlar',\n  'panelsearch.group.app': 'Uygulamalar',\n  'panelsearch.group.user': 'Kullanıcılar',\n  'panelsearch.group.group': 'Gruplar',\n  'panelsearch.group.key': 'API anahtarları',\n  'panelsearch.group.storage': 'Depolar',\n  'panelsearch.group.share': 'Paylaşımlar',\n  'panelsearch.group.file': 'Dosyalar',\n  'panelsearch.group.recent': 'Son aramalar',\n  'panelsearch.files_all': 'Dosyalarda ara: {q}',\n  'panelsearch.recent_remove': 'Son aramalardan kaldır',\n  'panelsearch.recent_clear': 'Son aramaları temizle',\n  'panelsearch.empty': '“{q}” ile eşleşen bir şey yok.',\n  'panelsearch.searching': 'Aranıyor…',\n  'panelsearch.failed': 'Sonuçların bir kısmı yüklenemedi. Gelenler gösteriliyor.',\n  'panelsearch.prefixes': 'Tek bir türe daraltın:',\n  'panelsearch.count_one': '{n} sonuç',\n  'panelsearch.count': '{n} sonuç',\n  'search.in_content': 'İçerikte',\n  'search.truncated': 'Gösterilenden daha fazla sonuç var - aramanızı daraltın',\n  'nav.more_shown': '{total} öğeden {shown} tanesi gösteriliyor',\n  'nav.load_more': 'Daha fazla yükle',\n\n  /* Katalog kapsamı (docs/LAZY-CATALOGUE.md, lib/catalogCoverage). */\n  'coverage.first_scan': 'Bu deponun ilk senkronu henüz bitmedi. Bitene kadar arama, klasör boyutları ve kullanım deponun bir kısmını kapsamaz.',\n  'coverage.lazy_filling': 'filex bu depoyu hâlâ kataloglıyor (şimdiye kadar bulunan klasörlerin %{pct} kadarı tamam). Bitene kadar arama, klasör boyutları ve kullanım deponun bir kısmını kapsamaz.',\n  'coverage.lazy_on_open': 'Bu depoda yalnız açılan klasörler kataloglanır. Arama, klasör boyutları ve kullanım yalnız bu klasörleri kapsar.',\n  'coverage.search_some': 'Şu depoların tamamı henüz kataloglanmadı: {names}. Bu arama oradaki bazı dosyaları bulamayabilir.',\n  'coverage.catalog_all': 'Tümünü katalogla',\n  'coverage.catalog_started': 'Senkron başladı - deponun tamamı kataloglanıyor.',\n  'coverage.catalog_running': 'Kataloglanıyor…',\n  'coverage.cataloging': '{storage} kataloglanıyor… arka planda sürüyor, bittiğinde bu sayfa söyleyecek.',\n  'coverage.catalog_done': '{storage} baştan sona kataloglandı',\n  'coverage.catalog_failed': '{storage} kataloglanamadı. Nedenini yönetim panelinde, deponun senkron geçmişinde görebilirsiniz.',\n  'coverage.catalog_stopped': '{storage} kataloglaması bitmeden durduruldu',\n  'coverage.catalog_joined': '{storage} zaten taranıyordu - bittiğinde bu sayfa haber verecek.',\n  'coverage.catalog_gone': '{storage} kataloglanırken kaldırıldı',\n  'coverage.catalog_unfollowed': '{storage} arka planda kataloglanmaya devam ediyor; nasıl bittiğini yönetim panelinde deponun senkron geçmişi gösterir',\n  'size.at_least': '≥ {size}',\n  'size.partial_hint': 'Bu klasörün bir kısmı henüz kataloglanmadı; boyutu en az bu kadar.',\n  'size.unknown_hint': 'Bu klasör henüz kataloglanmadı; boyutu bilinmiyor.',\n\n  /* === bag:b4 === */\n  'toolbar.more': 'Diğer işlemler',\n  'toolbar.search.close': 'Aramayı kapat',\n  'sheet.menu': 'İşlemler',\n  'sheet.close': 'Kapat',\n\n  /* === koru:k1 === */\n  'toolbar.inspector': 'Ayrıntılar',\n  'ctx.details': 'Ayrıntılar',\n  /* yildiz:s1 - yıldızlamak bir eylem, menüde de öyle görünür. */\n  'ctx.star': 'Yıldızla',\n  'ctx.unstar': 'Yıldızı kaldır',\n  'star.failed': 'Yıldız değiştirilemedi',\n  'shortcuts.inspector': 'Ayrıntılar panelini aç/kapat',\n  'inspector.title': 'Ayrıntılar',\n  'inspector.copy_name': 'Adı kopyala',\n  'inspector.items': '{n} öğe',\n  'inspector.items_one': '{n} öğe',\n  'inspector.type': 'Tür',\n  'inspector.select_hint': 'Ayrıntılarını görmek için bir öğe seçin.',\n  /* pane:p1 - panel SON seçilen şeyi tutar (bakımcının kararı, 2026-09-13);\n     dolayısıyla bölünmüş pencerenin bakılmayan yarısındaki bir öğeyi\n     anlatıyor olabilir. Bu satır hangisi olduğunu ve nerede durduğunu söyler. */\n  'inspector.held': 'Son seçilen - {where} içinde',\n  'inspector.close': 'Kapat',\n  'inspector.section.general': 'Genel',\n  'inspector.section.tags': 'Etiketler',\n  /* etiket:t1 - TagPicker'ın kendi çerçevesi. 2026-09-13'e kadar bu üçü\n     katalogdan bağımsız olarak İngilizce basılıyordu; `tags.open` ise çipin\n     yeni \"bu etiketi taşıyan her şeyi göster\" kapısı. */\n  'tags.open': 'Etiketi aç: {tag}',\n  'tags.add': '+ Etiket ekle',\n  'tags.name': 'Etiket adı',\n  'tags.remove': 'Etiketi kaldır',\n\n  /* etiket:k2 (v0.43.0) - etiketin iki TÜRÜ. Etiket nerede çiziliyorsa türünü\n     simgeyle birlikte sözcükle de söyler: bu sürüme kadar her etiket sessizce\n     sunucudaki herkesle paylaşılıyordu. */\n  'tags.kind.label': 'Bu etiketi kim görür',\n  'tags.kind.personal': 'Kişisel',\n  'tags.kind.team': 'Ekip',\n  'tags.kind.personal_help': 'Yalnızca siz görürsünüz',\n  'tags.kind.team_help': 'Bu dosyayı görebilen ekibindeki herkes görür',\n  'tags.kind.team_locked': 'Ekip etiketi eklemek ya da kaldırmak için bu dosyada düzenleme yetkiniz olmalı.',\n  'tags.chip.personal': 'Kişisel etiket “{tag}” - yalnızca siz görürsünüz',\n  'tags.chip.team': 'Ekip etiketi “{tag}” - bu dosyayı görebilen ekibindeki herkes görür',\n  'tags.add_submit': 'Ekle',\n  'inspector.section.versions': 'Sürümler',\n  'inspector.section.permissions': 'İzinler',\n  'inspector.section.shares': 'Paylaşımlar',\n  'inspector.path': 'Yol',\n  'inspector.size': 'Boyut',\n  'inspector.modified': 'Değiştirilme',\n  'inspector.mime': 'MIME türü',\n  'inspector.etag': 'ETag',\n  'inspector.nodeId': 'Düğüm kimliği',\n  'inspector.copy': 'Kopyala',\n  'inspector.copied': 'Kopyalandı',\n  'inspector.error': 'Yüklenemedi',\n  'inspector.items_summary': '{n} öğe, toplam {size}',\n  'inspector.items_summary_one': '{n} öğe, toplam {size}',\n  'inspector.folder_items': '{n} öğe',\n  'inspector.folder_items_one': '{n} öğe',\n  'inspector.versions.empty': 'Sürüm geçmişi yok',\n  'inspector.versions.v': 'Sürüm {n}',\n  'inspector.versions.restore': 'Geri yükle',\n  'inspector.versions.restore_confirm': 'Bu sürüm geri yüklensin mi?',\n  'inspector.versions.snapshot_current': 'Önce şimdiki halin sürümünü al',\n  'inspector.versions.confirm': 'Onayla',\n  'inspector.versions.restoring': 'Geri yükleniyor…',\n  'inspector.versions.cancel': 'Vazgeç',\n  'inspector.versions.take_snapshot': 'Şimdiki halin sürümünü al',\n  'inspector.versions.snapshotting': 'Sürüm alınıyor…',\n  'inspector.versions.restored': 'Sürüm geri yüklendi',\n  'inspector.versions.snapshotted': 'Sürüm alındı',\n  'inspector.versions.unsupported': 'Sunucu bu işlemi desteklemiyor',\n  'inspector.perm.none': 'Erişim yok',\n  'inspector.perm.viewer': 'Görüntüleyen',\n  'inspector.perm.editor': 'Düzenleyen',\n  'inspector.perm.owner': 'Sahip',\n  'inspector.perm.manage': 'İzinleri yönet',\n  'inspector.shares.empty': 'Paylaşım bağlantısı yok',\n  'inspector.shares.copy': 'Bağlantıyı kopyala',\n\n  /* wiring:c1 - tema galerisi */\n  'theme.menu': 'Tema',\n  'theme.title': 'Tema galerisi',\n  'theme.hint': 'Tema yalnız renk paletini değiştirir; gündüz mü gece mi olduğu yukarıdaki seçim.',\n  'theme.mode.label': 'Görünüm',\n  'theme.mode.light': 'Gündüz',\n  'theme.mode.dark': 'Gece',\n  'theme.mode.auto': 'Otomatik',\n  'theme.reset': 'Varsayılana dön',\n  'theme.close': 'Kapat',\n  'theme.selected': 'Seçili',\n  'theme.name.default': 'Varsayılan',\n  'theme.name.night': 'Gece mavisi',\n  'theme.name.forest': 'Orman',\n  'theme.name.amber': 'Kehribar',\n  'theme.name.lilac': 'Leylak',\n  'theme.name.contrast': 'Yüksek kontrast',\n  'theme.name.gray': 'Yumuşak gri',\n  'theme.name.terminal': 'Terminal yeşili',\n  /* === zaman:z3 - saat dilimi seçici (gömme penceresi + web ayarları) === */\n  'tz.menu': 'Saat dilimi',\n  'tz.title': 'Saat dilimi',\n  'tz.label': 'Tarihleri şu saatle göster',\n  'tz.search': 'Şehir, ülke ya da saat farkı arayın - “İstanbul” veya “GMT+3” deneyin',\n  'tz.default.device': 'Bu cihazın saat dilimini kullan ({zone})',\n  'tz.default.account': 'Hesabınızın saat dilimini kullan ({zone})',\n  'tz.default.host': 'Bu sitenin varsayılanını kullan ({zone})',\n  'tz.no_match': '“{query}” ile eşleşen saat dilimi yok. Bir şehir, bir ülke ya da GMT+3 gibi bir fark deneyin.',\n  'tz.more': '{n} kayıt daha var - listeyi daraltmak için yazmayı sürdürün.',\n  'tz.hint': 'Yalnızca bu tarayıcıda saklanır. Her tarih tek bir an olarak saklanır ve burada seçtiğiniz saatle gösterilir.',\n  'tz.now': '{zone} bölgesinde şu an: {time}',\n  /* === wiring:c2 - özelleştirilebilir kısayollar + hızlı bakış === */\n  'shortcuts.quicklook': 'Hızlı bakış',\n  'shortcuts.customize': 'Özelleştir',\n  'shortcuts.settings.menu': 'Kısayollar',\n  'shortcuts.settings.title': 'Kısayol ayarları',\n  'shortcuts.settings.hint': 'Bir kısayolu değiştirmek için \"Değiştir\"e basıp yeni tuş kombinasyonuna basın. Değişiklikler yalnızca bu tarayıcıda saklanır.',\n  'shortcuts.settings.change': 'Değiştir',\n  'shortcuts.settings.capture': 'Tuşlara basın… (Esc iptal)',\n  'shortcuts.settings.reset': 'Varsayılana dön',\n  'shortcuts.settings.reset_all': 'Tümünü sıfırla',\n  'shortcuts.settings.unbound': 'Atanmadı',\n  'shortcuts.settings.fixed': 'Sabit',\n  'shortcuts.settings.customized': 'Özelleştirildi',\n  'shortcuts.settings.conflict': 'kombinasyonu \"{name}\" kısayolunda kullanılıyor.',\n  'shortcuts.settings.conflict_fixed': 'kombinasyonu \"{name}\" sabit kısayoluna ayrılmış - kullanılamaz.',\n  'shortcuts.settings.conflict_take': 'Eskisini boşa çıkar ve ata',\n  'shortcuts.settings.conflict_cancel': 'Vazgeç',\n  'quicklook.hint_close': 'kapat',\n  'quicklook.hint_nav': 'önceki/sonraki',\n  'quicklook.hint_open': 'aç',\n  /* === /wiring:c2 === */\n  /* === wiring:c3 - işlem merkezi === */\n  'opc.title': 'İşlemler',\n  'opc.aria_badge': '{n} işlem - işlem merkezini aç/kapat',\n  'opc.aria_badge_one': '{n} işlem - işlem merkezini aç/kapat',\n  'opc.close': 'Kapat',\n  'opc.active': 'Sürüyor',\n  'opc.history': 'Geçmiş',\n  'opc.clear': 'Temizle',\n  'opc.empty': 'İşlem yok',\n  'opc.cancel': 'İptal',\n  'opc.retry': 'Yeniden dene',\n  'opc.dismiss': 'Kapat',\n  'opc.queued': 'Sırada',\n  'opc.cancelling': 'İptal isteniyor…',\n  'opc.percent': '%{n}',\n  'opc.items': '{total} öğeden {done}',\n  'opc.trash_items': 'Çöpten {n} öğe',\n  'opc.trash_items_one': 'Çöpten {n} öğe',\n  'opc.status.running': 'Sürüyor',\n  'opc.status.done': 'Bitti',\n  'opc.status.error': 'Hata',\n  'opc.status.aborted': 'İptal edildi',\n  'opc.kind.upload': 'Yükleme',\n  'opc.kind.copy': 'Kopyalama',\n  'opc.kind.move': 'Taşıma',\n  'opc.kind.delete': 'Silme',\n  'opc.kind.rename': 'Yeniden adlandırma',\n  'opc.kind.restore': 'Geri getirme',\n  'opc.kind.purge': 'Kalıcı silme',\n  'opc.kind.convert': 'Dönüştürme',\n  'opc.kind.archive': 'Arşiv',\n  'opc.kind.plugin': 'Uygulama',\n  'opc.kind.trash': 'Çöp kutusunu boşaltma',\n  'opc.kind.thumbs': 'Küçük resim onarımı',\n\n  /* A folder's contents on hover (FolderPeek, useFolderPeek). */\n  'peek.items': '{n} öğe',\n  'peek.items_one': '{n} öğe',\n  'peek.more': '+{n} tane daha',\n  'peek.empty': 'Boş',\n  'peek.loading': 'İçine bakılıyor…',\n  'opc.open': 'Aç',\n\n  /* Uygulama eklentileri - dosya menüsüne eklenen satırlar ve kuyruğa\n     aldıkları işler (docs/APP-PLUGINS-API.md). */\n  'plugin.queued': '{label} kuyruğa alındı',\n  'plugin.done': '{label} tamamlandı',\n  'plugin.failed': '{label} başarısız',\n  'plugin.cancel_failed': 'İş iptal edilemedi',\n  'plugin.not_applicable': 'Bu işlem seçime uygulanamaz',\n  'plugin.read_only': 'Bu depo salt okunur',\n  'plugin.needs_engine': '{name} bu sunucuda kurulu değil - sunucuya kurup filex\\'i yeniden başlatın.',\n  'plugin.needs_other': '{name} bu sunucuda kullanılamıyor.',\n  'plugin.needs_office': 'Ofis belgeleri için {name} gerekiyor ve bu sunucuya bağlı değil - Dış servisler sayfasından bağlayın.',\n  'plugin.confirm.title': 'Onayla',\n  'plugin.confirm.cancel': 'Vazgeç',\n  'plugin.confirm.run': 'Çalıştır',\n  'plugin.view.close': 'Kapat',\n  'appframe.confirm_title': 'Onay',\n  'appframe.consent_clipboard': '{app} panonuza metin kopyalamak istiyor.',\n  'appframe.consent_download': '{app}, “{name}” dosyasını bilgisayarınıza kaydetmek istiyor.',\n  'appframe.consent_job': '{app} “{action}” işini başlatmak istiyor.',\n  'appframe.consent_allow': 'İzin ver',\n  'appframe.consent_deny': 'İzin verme',\n  'appframe.unsaved_title': 'Kaydedilmemiş değişiklikler',\n  'appframe.unsaved_text': '{app} içinde kaydedilmemiş değişiklikler var. Yine de kapatılsın mı?',\n  'appframe.discard': 'Kaydetmeden kapat',\n  'appframe.keep_open': 'Düzenlemeye devam et',\n  'appframe.save_close': 'Kaydet ve kapat',\n  'appframe.updated': '{app}, {version} sürümüne güncellendi.',\n  'appframe.updated_reload': 'Bir yönetici {app} uygulamasının yeni sürümünü onayladı. Yeni sürümü kullanmak için yeniden yükleyin - önce çalışmanızı kaydedin.',\n  'appframe.reload': 'Yeniden yükle',\n  'appframe.dismiss': 'Kapat',\n  'appframe.not_connected': '{app} başlamadı. Kapatıp yeniden açın; tekrar ederse yöneticinize haber verin.',\n  'appframe.save_as_title': '{app}: “{name}” nereye kaydedilsin?',\n  'plugin.view.busy': 'Çalışıyor…',\n  'plugin.view.unsupported': 'Bu ekran, bu sürümün çizemediği bir bileşen kullanıyor ({type})',\n  'plugin.view.error': 'Uygulama hata döndürdü',\n  'plugin.output_missing': 'Çıktı artık eski yerinde değil',\n  /* M2 - surface components (components/plugin/nodes/*) */\n  'plugin.view.loading': 'Yükleniyor…',\n  'plugin.view.preview_failed': 'Önizleme yüklenemedi',\n  'plugin.steps.label': 'Adımlar',\n  'plugin.list.empty': 'Henüz bir şey yok',\n  'plugin.list.actions': 'İşlemler',\n  /* The label on a table row's ONE action control (core RowActions.vue).\n     The explorer's handle is the ⋮ glyph; a panel row's says what it is.\n     Owner, 2026-09-20: \"adminde 'Aksiyon' diye yazmalı\". */\n  'row.actions': 'Aksiyon',\n  'plugin.people.placeholder': 'Ad veya e-posta',\n  'plugin.people.placeholder_email': 'E-posta adresi',\n  'plugin.people.add': 'Ekle',\n  'plugin.people.remove': '{name} kişisini kaldır',\n  'plugin.people.invalid_email': 'Geçerli bir e-posta adresi girin',\n  'plugin.people.external_off': 'Yalnızca hesabı olan kişiler eklenebilir',\n  'plugin.pin.label': 'PIN',\n  'plugin.file.choose': 'Seç…',\n  'plugin.file.clear': 'Temizle',\n  'plugin.file.none': 'Seçim yok',\n  /* M3 - imza yolu: signature-pad + pdf-fields düğümleri ve dış katılımcının\n     herkese açık sayfası (views/PublicSurface.vue, usePublicPage). */\n  'plugin.sig.mode_draw': 'Çiz',\n  'plugin.sig.mode_type': 'Yaz',\n  'plugin.sig.mode_upload': 'Yükle',\n  'plugin.sig.draw_hint': 'Parmağınızla ya da fareyle buraya imzalayın',\n  'plugin.sig.type_placeholder': 'Adınızı yazın',\n  'plugin.sig.upload_pick': 'Görsel seç…',\n  'plugin.sig.upload_hint': 'PNG ya da JPEG, en çok {kb} KB',\n  'plugin.sig.upload_too_big': 'Görsel {kb} KB sınırından büyük',\n  'plugin.sig.upload_bad_type': 'Yalnızca PNG ya da JPEG görsel kullanılabilir',\n  'plugin.sig.upload_unreadable': 'Görsel okunamadı',\n  'plugin.sig.clear': 'İmzayı temizle',\n  'plugin.sig.signed': 'İmza alındı',\n  'plugin.pdf.load_failed': 'Belge yüklenemedi',\n  'plugin.pdf.palette': 'Alan türleri',\n  'plugin.pdf.pending': 'Yeri bekleyen kutular',\n  'plugin.pdf.place_box_hint': '“{name}” kutusunun gideceği yere dokunun ya da boyutlandırmak için sürükleyin',\n  'plugin.pdf.all_placed': 'Her kutunun bir yeri var',\n  'plugin.pdf.place_idle': 'Yukarıdaki kutulardan birini seçin, sonra sayfada gideceği yere dokunun.',\n  'plugin.pdf.place_idle_done': 'Kaldırmak ya da kopyalamak için sayfadaki bir kutuya dokunun; taşımak için sürükleyin.',\n  'plugin.pdf.no_boxes': 'Henüz kutu yok. Aşağıdan ekleyin: adını verin, kimin olduğunu söyleyin; yerini bir sonraki adımda belgede seçeceksiniz.',\n  'plugin.pdf.add_box': 'Kutu ekle',\n  'plugin.pdf.unplace': 'Sayfadan kaldır',\n  'plugin.pdf.place_hint': '{type} alanının gideceği yere dokunun ya da boyutlandırmak için sürükleyin',\n  'plugin.pdf.type_signature': 'İmza',\n  'plugin.pdf.type_initials': 'Paraf',\n  'plugin.pdf.type_date': 'Tarih',\n  'plugin.pdf.type_text': 'Metin',\n  'plugin.pdf.type_checkbox': 'Onay kutusu',\n  'plugin.pdf.tap_signature': 'İmzalamak için dokunun',\n  'plugin.pdf.tap_initials': 'Paraflamak için dokunun',\n  'plugin.pdf.tap_date': 'Bugünün tarihi için dokunun',\n  'plugin.pdf.tap_text': 'Metin',\n  'plugin.pdf.tap_checkbox': 'İşaretlemek için dokunun',\n  'plugin.pdf.label': 'Ad',\n  'plugin.pdf.assignee': 'İmzacı',\n  'plugin.pdf.unassigned': 'Herkes',\n  'plugin.pdf.filled_by': 'Dolduran',\n  'plugin.pdf.style': 'Nasıl imzalanır',\n  'plugin.pdf.style_drawn': 'Çizerek',\n  'plugin.pdf.style_typed': 'Yazarak',\n  'plugin.pdf.lines': 'Altına yazılanlar',\n  'plugin.pdf.lines_preview': 'İmzanın altında:',\n  'plugin.pdf.lines_none': 'Bu imzanın altına bir şey yazılmaz.',\n  'plugin.pdf.required': 'Zorunlu',\n  'plugin.pdf.copy_to_page': 'Sayfaya kopyala',\n  'plugin.pdf.copy': 'Kopyala',\n  'plugin.pdf.delete': 'Alanı sil',\n  'plugin.pdf.zoom_in': 'Yakınlaştır',\n  'plugin.pdf.zoom_out': 'Uzaklaştır',\n  'plugin.pdf.zoom_fit': 'Genişliğe sığdır',\n  'plugin.pdf.zoom_fit_page': 'Sayfayı ekrana sığdır',\n  'plugin.pdf.pad_for': '{type} alanınız',\n  'plugin.pdf.pad_done': 'Tamam',\n  'plugin.page.loading': 'Yükleniyor…',\n  'plugin.page.pin_title': 'Bu sayfa korumalı',\n  'plugin.page.pin_hint': 'Devam etmek için size verilen PIN\\'i girin',\n  'plugin.page.pin_submit': 'Devam et',\n  'plugin.page.pin_wrong': 'Bu PIN doğru değil',\n  'plugin.page.pin_locked': 'Çok fazla yanlış PIN girildi - birkaç dakika bekleyip yeniden deneyin',\n  'plugin.page.unavailable_title': 'Bu bağlantı kullanılamıyor',\n  'plugin.page.unavailable_text': 'Süresi dolmuş, hakkı tükenmiş ya da geri çekilmiş olabilir. Gönderen kişiden yeni bir bağlantı isteyin.',\n  'plugin.page.accepted_title': 'Alındı, teşekkürler',\n  'plugin.page.accepted_text': 'Yanıtınız kaydedildi. Bu sayfayı kapatabilirsiniz.',\n  'plugin.page.done_title': 'Tamamlandı',\n  'plugin.page.done_text': 'Burada yapılacak başka bir şey kalmadı. Bu sayfayı kapatabilirsiniz.',\n  'plugin.page.error_title': 'Bir sorun oluştu',\n  'plugin.page.retry': 'Yeniden dene',\n  'plugin.page.files': 'Belgeler',\n  'plugin.page.open_file': '{name} dosyasını yeni sekmede aç',\n  'plugin.page.footer': 'filex ile sunuldu',\n  /* Herkese açık sayfaların (paylaşım, dosya isteği) kendi cümleleri\n     sunucunundur: `server.public.*` (composables/usePublicText). */\n  /* === Uygulama eklentileri v2 - `page` görünümü, uygulamanın dosya kilidi,\n     işin yazdığı çıktı kipi, imza alanının yazı tipleri ve kuralları. === */\n  'plugin.page_view.back': 'Dosyalara dön',\n  'plugin.page_view.queued_title': 'İş kuyruğa alındı',\n  'plugin.page_view.queued_text': 'filex işi yürütüyor. Bittiğinde bu sayfa söyler; ilerleyişi işlemler tepsisinde de görünür.',\n  'plugin.page_view.finished_title': 'İş bitti',\n  'plugin.page_view.finished_text': 'Burada yapılacak başka bir şey kalmadı. Dosyalara dönebilir ya da bu sekmeyi kapatabilirsiniz.',\n  'plugin.page_view.failed_title': 'İş tamamlanamadı',\n  'plugin.page_view.opening_title': 'Sonuç açılıyor',\n  'plugin.page_view.open_ops': 'İşlemler tepsisini aç',\n  'plugin.page_view.done_title': 'Tamamlandı',\n  'plugin.page_view.done_text': 'Burada yapılacak başka bir şey kalmadı. Bu sekmeyi kapatabilirsiniz.',\n  'plugin.page_view.error_title': 'Bu ekran açılamadı',\n  'plugin.page_view.retry': 'Yeniden dene',\n  'plugin.page_view.blocked': 'Yeni sekme engellendi - bu site için açılır pencerelere izin verin, yoksa ekran pencere içinde açılır',\n  'plugin.output.sibling': 'yeni dosya',\n  'plugin.output.version': 'yeni sürüm',\n  'plugin.output.sibling_title': 'Sonuç, aslının yanına yeni bir dosya olarak iner',\n  'plugin.output.version_title': 'Sonuç, dosyanın yerine yeni bir sürümü olarak geçer',\n  'plugin.sign.font_label': 'El yazısı',\n  'plugin.pdf.font': 'Yazı tipi',\n  'plugin.pdf.rule_number': 'Yalnızca sayı',\n  'plugin.pdf.rule_email': 'E-posta adresi',\n  'plugin.pdf.rule_length': '{min} ile {max} karakter arasında',\n  'plugin.pdf.rule_min': 'En az {min} karakter',\n  'plugin.pdf.rule_max': 'En çok {max} karakter',\n  'plugin.pdf.err_number': 'Bir sayı girin',\n  'plugin.pdf.err_email': 'Geçerli bir e-posta adresi girin',\n  'plugin.pdf.err_min': 'Çok kısa - en az {min} karakter',\n  'plugin.pdf.err_max': 'Çok uzun - en çok {max} karakter',\n  'applock.badge': 'Kilitli',\n  'applock.some_app': 'bir uygulama',\n  'applock.held': '{app} bu dosyayı kilitledi',\n  'applock.held_reason': '{app} bu dosyayı kilitledi: {reason}',\n  'applock.until': '- {date} tarihine kadar',\n  'applock.inspector': 'Uygulama kilidi',\n  /* issue #34 - sunucunun İZLEMEDİĞİ sembolik bağ (lib/symlink). Rozet satırdaki\n     kısa söz; `why` ise arkasındaki cümle - üzerine gelince, ayrıntılar panelinde\n     ve biri açmaya kalkıştığında çıkan bildirimde. ⚠ Kırık bağ ile depo dışına\n     çıkan bağ AYRI durumlardır ve ayrı okunmalıdır: yalnızca birinin yönetici\n     çaresi vardır; silinmiş bir hedef için o çareyi önermek insanı işe yaramayacak\n     bir ayar ekranına yollar. */\n  'symlink.badge.outside_root': 'Depo dışında',\n  'symlink.badge.broken': 'Kırık bağ',\n  'symlink.badge.unresolved': 'Uzak bağ',\n  'symlink.badge.unknown': 'Bağlantı',\n  'symlink.why.outside_root':\n    'Hedefi bu deponun dışında kalan bir bağ; bu yüzden açılamıyor. Bir yönetici, deponun ayarlarındaki \"Bu klasörün dışına çıkan sembolik bağları izle\" seçeneğiyle buna izin verebilir.',\n  'symlink.why.broken':\n    'Hedefi artık var olmayan bir bağ; açılacak bir şey yok. Sunucuda onarılması ya da kaldırılması gerekir - hiçbir ayar silinmiş hedefi geri getirmez.',\n  'symlink.why.unresolved':\n    'Uzak sunucudaki bir bağ. filex hedefinin bu deponun içinde olup olmadığını bilemediği için bağı izlemez ve açamaz.',\n  'symlink.why.unknown':\n    'filex\\'in izlemediği bir bağ, bu yüzden açılamıyor. Hedefi ya bu deponun dışında, ya kayıp, ya da filex\\'in çözümleyemediği uzak bir sunucuda.',\n  'symlink.inspector': 'Açılamayan bir bağ',\n  'unavailable.why.file':\n    'Depo bu dosyanın hâlâ var olup olmadığını söyleyemedi. Depo yeniden yanıt verene kadar dosya açılamaz ve değiştirilemez; bir sonraki tarama yeniden denetler.',\n  'unavailable.why.dir':\n    'Depo bu klasörün hâlâ var olup olmadığını söyleyemedi. Depo yeniden yanıt verene kadar ne klasör ne de içindekiler açılabilir ya da değiştirilebilir; bir sonraki tarama yeniden denetler.',\n  'unavailable.withReason': '{why} Deponun yanıtı: {reason}',\n  'unavailable.inspector': 'Kullanılamıyor',\n  /* 0.50 - why a file has no thumbnail, on the file itself (lib/thumbNote). */\n  'thumbNote.corrupt': 'Bozuk',\n  'thumbNote.corrupt_why': 'Küçük resim yok: dosya okunamadı. Bozuk ya da eksik olabilir.',\n  'thumbNote.encrypted': 'Şifreli',\n  'thumbNote.encrypted_why': 'Küçük resim yok: dosya şifreli ya da parolayla korunuyor.',\n  'thumbNote.too_large': 'Çok büyük',\n  'thumbNote.too_large_why': 'Küçük resim yok: dosya, küçük resim boyut sınırından büyük.',\n  'thumbNote.full': '{label}. {why}',\n  'plugin.pdf.rule': 'Kabul ettiği',\n  'plugin.pdf.rule_kind_any': 'Serbest metin',\n  'plugin.pdf.rule_kind_number': 'Yalnızca sayı',\n  'plugin.pdf.rule_kind_email': 'E-posta adresi',\n  'plugin.pdf.rule_min_label': 'En az uzunluk',\n  'plugin.pdf.rule_max_label': 'En çok uzunluk',\n  'plugin.pdf.format': 'Tarih biçimi',\n  'plugin.pdf.date_order': 'Tarih sırası',\n  'plugin.pdf.date_separator': 'Ayraç',\n  'plugin.pdf.date_example': 'Örnek',\n  'opc.kind.archive-create': 'Arşiv oluşturuluyor',\n  'opc.kind.archive-extract': 'Arşiv çıkarılıyor',\n  /* === wiring:c4 - onboarding turu + erişilebilirlik + hata kartı === */\n  'tour.aria': 'Tanıtım turu',\n  'tour.restart': 'Turu tekrar başlat',\n  'tour.skip': 'Turu atla',\n  'tour.back': 'Geri',\n  'tour.next': 'İleri',\n  'tour.done': 'Bitti',\n  'tour.progress': '{n} / {m}',\n  'tour.step.nav.title': 'Depolar ve görünümler',\n  'tour.step.nav.desc':\n    'Ana sayfa, Benimle paylaşılanlar, Son kullanılanlar, Yıldızlılar ve Çöp kutusu hep bu panelde durur; altında da depolarınız ve bağlantılarınız. Sol üst köşedeki düğme paneli ince bir şeride indirir ve geri açar.',\n  'tour.step.nav.desc_closed':\n    'Bu düğme gezinti panelini açar: Ana sayfa, Benimle paylaşılanlar, Son kullanılanlar, Yıldızlılar ve Çöp kutusu; altında da depolarınız ve bağlantılarınız.',\n  'tour.step.new.title': 'Yeni bir şey ekle',\n  'tour.step.new.desc':\n    'Yeni olan her şey buradan başlar: bu cihazdan dosya yükleyebilir, klasör oluşturabilir ya da birinden dosya isteyebilirsiniz. Dosyaları pencereye sürükleyip bırakmak da yükler.',\n  'tour.step.new.desc_fab':\n    'Bu düğme bu cihazdan dosya yükler. Dosyaları pencereye sürükleyip bırakmak da çalışır.',\n  'tour.step.search.title': 'Arama',\n  'tour.step.search.desc':\n    'Bu alan deponun tamamında ada göre arar; ayraçları ve bir harflik yazım hatasını affeder, yani \"fatura 2026\" yazdığınızda fatura_2026.pdf gelir. tag:fatura yazarak etikete göre filtreleyebilirsiniz. Yanındaki sürgü düğmesi gelişmiş aramayı, {palette} ise komut paletini açar; palet komut da çalıştırır.',\n  'tour.step.crumb.title': 'Bulunduğunuz yer',\n  'tour.step.crumb.desc':\n    'Bu iz, ekrandaki klasörün adresidir. Adımlardan birine tıklayarak üste çıkabilir, sonuncusunun yanındaki oktan içindeki klasörleri görebilirsiniz.',\n  'tour.step.filters.title': 'Listeyi daralt',\n  'tour.step.filters.desc':\n    'Tür, Sahibi, Değiştirilme ve Boyut bulunduğunuz klasörü filtreler; yanındaki kutu siz yazdıkça adlara göre eşleşir, satırın sonundaki denetim ise sıralar.',\n  'tour.step.view.title': 'Görünümü değiştir',\n  'tour.step.view.desc':\n    'Bu klasörün nasıl çizildiğini değiştirir; seçiminiz hatırlanır.',\n  'tour.step.details.title': 'Ayrıntılar ve paylaşım',\n  'tour.step.details.desc':\n    'Bir dosyayı seçip bu paneli açtığınızda ayrıntılarını, hareketlerini ve paylaşım bağlantılarını görürsünüz. Tam menü için dosyaya sağ tıklayın ya da satırının sonundaki düğmeyi kullanın: oradaki \"Paylaş\" ile PIN ve son kullanma süresi verilebilen bir bağlantı oluşturulur.',\n  'tour.step.help.title': 'Kısayollar',\n  'tour.step.help.desc':\n    '{help} tuşu kısayol kartını, {palette} komut paletini açar. Tema ve \"Turu tekrar başlat\" sağ üstteki \"Diğer işlemler\" menüsünde; hesabınız ve oturumu kapatma ise yanındaki avatarın arkasında.',\n  'error.hint': 'Bağlantı ya da sunucu kaynaklı geçici bir sorun olabilir. Yeniden deneyin.',\n  'error.details': 'Teknik ayrıntılar',\n  'col.star': 'Yıldız',\n  'toolbar.view_label': 'Görünüm',\n  'list.aria': 'Dosya listesi',\n  'grid.aria': 'Dosya ızgarası',\n\n  /* === wiring:d1 - sekmeler + split panel === */\n  'tabs.strip': 'Sekmeler',\n  'tabs.new': 'Yeni sekme',\n  'tabs.close': 'Sekmeyi kapat',\n  'tabs.split': 'Görünümü böl',\n  'tabs.split_off': 'Bölmeyi kapat',\n  'ctx.open_new_tab': 'Yeni sekmede aç',\n  'ctx.open_with': '{app} ile aç',\n  'ctx.open_with_builtin': \"Yerleşik görüntüleyiciyle aç\",\n  'ctx.open_with_choose': \"Uygulama seç…\",\n  'openWith.title': \"Birlikte aç\",\n  'openWith.lead': \"{name} hangi uygulamayla açılsın?\",\n  'openWith.builtin': \"filex görüntüleyicisi (yerleşik)\",\n  'openWith.onlyoffice': 'ONLYOFFICE (tablo düzenleyici)',\n  'openWith.now': \"Şu an bununla açılıyor\",\n  'openWith.always': \"{ext} dosyalarını her zaman bu uygulamayla aç\",\n  'openWith.hint': \"Hesabınızda saklanır. Ayarlar, Varsayılan uygulamalar bölümünden değiştirebilirsiniz.\",\n  'openWith.open': \"Aç\",\n  'shortcuts.group.tabs': 'Sekmeler',\n  'shortcuts.tab_new': 'Yeni sekme',\n  'shortcuts.tab_close': 'Sekmeyi kapat',\n  'shortcuts.tab_next': 'Sonraki sekme',\n  'shortcuts.tab_prev': 'Önceki sekme',\n  /* tus:t1 - menü fiilleri */\n  'shortcuts.new_folder': 'Yeni klasör',\n  'shortcuts.upload': 'Dosya yükle',\n  'shortcuts.refresh': 'Listeyi yenile',\n  'shortcuts.download': 'İndir',\n  'shortcuts.preview': 'Önizle',\n  'shortcuts.share': 'Paylaş',\n  'shortcuts.tags': 'Etiketler',\n  'shortcuts.open_tab': 'Yeni sekmede aç',\n  'shortcuts.copy_path': 'Yolu kopyala',\n  'shortcuts.copy_id': 'Kimliği kopyala',\n  'shortcuts.restore': 'Çöp kutusundan geri al',\n  'shortcuts.settings.reserved':\n    'tarayıcı tarafından sayfaya ulaşmadan yakalanıyor, burada hiçbir şey yapmaz. Başka bir tuş seçin.',\n  'shortcuts.settings.reserved_badge': 'Yalnız masaüstü uygulamasında',\n  'shortcuts.settings.reserved_title':\n    'Bu kombinasyonu tarayıcının kendisi işliyor. Masaüstü uygulamasında ve kurulu PWA’da çalışır, tarayıcı sekmesinde çalışmaz.',\n  'cmd.tab_new': 'Yeni sekme aç',\n  'cmd.split_toggle': 'Görünümü böl / birleştir',\n  'split.pane': 'İkincil panel',\n  'split.close': 'Yan paneli kapat',\n  'split.error': 'Liste yüklenemedi',\n  'split.retry': 'Yeniden dene',\n  'split.copy_queued': 'Kopyalama kuyruğa alındı',\n  'split.move_queued': 'Taşıma kuyruğa alındı',\n  'toast.move_kept_both': 'Taşıma kuyruğa alındı. Hedefte aynı adla bir öğe vardı, taşınan öğe onun yanına “-copy” ekiyle konacak. Bu taşıma geri alınamaz.',\n  'split.cross_copy': 'Depolar farklı - kopyalama kuyruğa alındı',\n  'dragout.downloading': 'Bırakılan klasöre indiriliyor…',\n  'dragout.downloading_n': 'Bırakılan klasöre indiriliyor - şimdiye dek {n} dosya…',\n  'dragout.downloading_n_one': 'Bırakılan klasöre indiriliyor - şimdiye dek {n} dosya…',\n  'dragout.stop': 'Durdur',\n  'dragout.stopping': 'Durduruluyor…',\n  'dragout.stopped': 'Durduruldu - gelenler klasörde kalıyor',\n  'dragout.not_found': 'Bırakılan yer bulunamadı - dosya bir klasöre değil bir uygulamaya bırakıldıysa indirme yapılamaz',\n  'dragout.done': 'İndirme tamamlandı',\n  'dragout.ready': 'Dosyalar hazır - masaüstüne sürükleyebilirsiniz',\n  'dragout.preparing': 'Sürükleme için hazırlanıyor…',\n  'split.cross_move': 'Depolar farklı - taşıma kuyruğa alındı (baytlar aktarılıp kaynak silinir)',\n  /* === /wiring:d1 === */\n  /* wiring:d2 - galeri görünümü */\n  'toolbar.view.gallery': 'Galeri',\n  'gallery.aria': 'Dosya galerisi',\n  /* /wiring:d2 */\n  /* wiring:d3 - Yorumlar (inspector node comments) */\n  'inspector.section.comments': 'Yorumlar',\n  'inspector.comments.empty': 'Henüz yorum yok.',\n  'inspector.comments.placeholder': 'Yorum yaz…',\n  'inspector.comments.send': 'Gönder',\n  'inspector.comments.delete': 'Yorumu sil',\n  /* wiring:e2 - uçtan uca şifreli klasörler */\n  'e2e.create.title': 'Şifreli klasör oluştur',\n  'e2e.create.option': 'Şifreli klasör oluştur…',\n  'e2e.create.pw_label': 'Klasör parolası',\n  'e2e.create.pw_placeholder': 'En az 8 karakter',\n  'e2e.create.pw2_label': 'Parolayı tekrar girin',\n  'e2e.create.warn_title': 'GERİ DÖNÜŞÜ YOK',\n  'e2e.create.warn_body':\n    'Bu klasördeki dosyalar yalnız bu parolayla ya da klasör oluşturulurken bir kez gösterilen kurtarma anahtarıyla açılır. Parola sunucuda TUTULMAZ; kurtarma anahtarının da filex\\'te kopyası kalmaz. İkisini de kaybederseniz içerik sonsuza dek gider.',\n  'e2e.create.ack': 'Anladım: parolayı da kurtarma anahtarını da kaybedersem verilerim kurtarılamaz.',\n  'e2e.create.ack_required': 'Devam etmek için uyarıyı onaylayın.',\n  'e2e.create.pw_short': 'Parola en az 8 karakter olmalı.',\n  'e2e.create.pw_mismatch': 'Parolalar birbirini tutmuyor.',\n  'e2e.create.bad_name': 'Geçersiz klasör adı.',\n  'e2e.create.create': 'Şifreli klasörü oluştur',\n  'e2e.create.busy': 'Oluşturuluyor…',\n  'e2e.create.done': 'Şifreli klasör oluşturuldu',\n  'e2e.create.failed': 'Şifreli klasör oluşturulamadı',\n  'e2e.create.nested': 'Şifreli klasörün içine ikinci bir şifreli klasör açılamaz.',\n  /* wiring:e2 policy - bir yöneticiden şifreleme izni istemek. */\n  'e2e.request.ctx': 'Şifreleme iste…',\n  'e2e.request.option': 'Şifreli klasör iste…',\n  'e2e.request.title': '“{name}” için şifreleme iste',\n  'e2e.request.lead':\n    'Burada şifreli klasör oluşturmak için yönetici onayı gerekiyor. Neden gerektiğini yazın; yanıt size bildirilir. Onay sizin ve bu klasör içindir: hemen içinde yeni bir şifreli klasör oluşturmak için bir kez kullanılabilir.',\n  'e2e.request.lead_folder':\n    'Bu klasörü şifrelemek için yönetici onayı gerekiyor. Neden gerektiğini yazın; yanıt size bildirilir. Onay sizin ve bu klasör içindir: bu klasörü olduğu yerde şifrelemek için bir kez kullanılabilir, içindeki bir klasör için kullanılamaz.',\n  'e2e.request.lead_file':\n    'Bu dosyayı şifrelemek için yönetici onayı gerekiyor. Neden gerektiğini yazın; yanıt size bildirilir. Onay sizin ve bu dosyanın bulunduğu klasör içindir: orada yeni bir şifreli dosya için bir kez kullanılabilir.',\n  'e2e.request.reason': 'Gerekçe',\n  'e2e.request.reason_placeholder': 'İçinde ne var, neden şifrelenmesi gerekiyor',\n  'e2e.request.reason_required': 'Yönetici için bir gerekçe yazın.',\n  'e2e.request.send': 'İsteği gönder',\n  'e2e.request.sending': 'Gönderiliyor…',\n  'e2e.request.sent': 'İstek gönderildi. Bir yönetici yanıtladığında size bildirilecek.',\n  'e2e.request.already': 'Bunu zaten istediniz; bir yöneticinin yanıtını bekliyor.',\n  'e2e.request.failed': 'İstek gönderilemedi.',\n  'e2e.locked.title': 'Bu klasör uçtan uca şifreli',\n  'e2e.locked.hint': 'İçeriği görmek için klasör parolasını girin. Parola yalnız bu sekmede, bellekte tutulur.',\n  'e2e.locked.pw_placeholder': 'Klasör parolası',\n  'e2e.locked.unlock': 'Kilidi aç',\n  'e2e.locked.busy': 'Doğrulanıyor…',\n  'e2e.unlock.wrong': 'Parola yanlış.',\n  'e2e.unlock.damaged':\n    'Parola doğru ama anahtar dosyasındaki (.filex-e2e.json) klasör anahtarı açılmıyor: dosya bozulmuş. Kurtarma anahtarını deneyin.',\n  'e2e.unlock.marker_missing': 'Anahtar dosyası (.filex-e2e.json) okunamadı.',\n  /* ikon:emoji - listedeki işaretin erişilebilir adı. Satır eskiden yalnız\n     bir 🔒 basıyordu; onun yerini alan asma kilit kutunun içinde\n     aria-hidden, dolayısıyla adı taşıyan yer bu. */\n  'e2e.badge': 'Şifreli klasör',\n  'e2e.strip.label': 'Şifreli klasör - kilit açık',\n  'e2e.strip.lock': 'Kilitle',\n  /* wiring:e2 password - klasör parolasını değiştirme */\n  'e2e.password.strip_action': 'Parolayı değiştir…',\n  'e2e.password.title': 'Klasör parolasını değiştir',\n  'e2e.password.reset_title': 'Bu klasör için yeni bir parola belirleyin',\n  'e2e.password.reset_lead':\n    'Bu klasörü kurtarma anahtarıyla açtınız; parolası kaybolmuş ya da başkası tarafından biliniyor olabilir. Şimdi yeni bir parola belirleyin. Bu pencereyi kapatmak klasörü yeniden kilitler.',\n  'e2e.password.current': 'Mevcut parola',\n  'e2e.password.recovery': 'Kurtarma anahtarı',\n  'e2e.password.use_recovery': 'Hatırlamıyorum - kurtarma anahtarını kullan',\n  'e2e.password.use_current': 'Bunun yerine mevcut parolayı kullan',\n  'e2e.password.new': 'Yeni parola',\n  'e2e.password.current_required': 'Mevcut parolayı girin ya da kurtarma anahtarını kullanın.',\n  'e2e.password.bad_recovery': 'Bu bir kurtarma anahtarı değil (dörderli gruplar hâlinde 32 karakter).',\n  'e2e.password.same': 'Yeni parola mevcut parolayla aynı.',\n  'e2e.password.cheap_note':\n    'Yalnız klasörün anahtar dosyası değişir. Hiçbir dosya yeniden şifrelenmez; kurtarma anahtarı ve varsa emanet anahtarı çalışmaya devam eder.',\n  'e2e.password.old_copies':\n    'Eski parolayı bilen ve anahtar dosyasının eski bir kopyasına (bir sürüm, bir yedek) sahip olan biri klasörü onunla hâlâ açabilir. Bu bir risk ise “Klasör anahtarını da değiştir”i işaretleyin.',\n  'e2e.password.rotate_label': 'Klasör anahtarını da değiştir (her dosyanın anahtarı yeniden sarılır; eski parola başkasınca biliniyor olabilirse kullanın)',\n  'e2e.password.rekey_title': 'Bu klasör v0.31 öncesinden: anahtarı parolasından türetiliyor',\n  'e2e.password.rekey_body':\n    'Bu yüzden yeni bir parola yeni bir klasör anahtarı gerektirir ve klasördeki her dosyanın anahtarı onunla yeniden sarılır. İçerik yeniden şifrelenmez. Biraz sürebilir; yarıda kalırsa kaldığı yerden devam eder, dosyalar bu sırada da açılır.',\n  'e2e.password.rotate_title': 'Klasör anahtarı da değişir',\n  'e2e.password.rotate_body':\n    'Her dosyanın anahtarı yeni bir klasör anahtarıyla yeniden sarılır. İçerik yeniden şifrelenmez. Yarıda kalırsa kaldığı yerden devam eder; dosyalar bu sırada da açılır.',\n  'e2e.password.rekey_rk_new': 'Yeni bir kurtarma anahtarı alırsınız, bir kez gösterilir; eskisi artık çalışmaz.',\n  'e2e.password.rekey_rk_kept': 'Kullandığınız kurtarma anahtarı çalışmaya devam eder.',\n  'e2e.password.rekey_escrow': 'İşletmecinin emanet anahtarı çalışmaya devam eder: yuvası yeni klasör anahtarına mühürlenir.',\n  'e2e.password.rekey_ack': 'Anlıyorum: bu, klasördeki her dosyanın anahtarını yeniden sarar.',\n  'e2e.password.submit': 'Parolayı değiştir',\n  'e2e.password.busy': 'Değiştiriliyor…',\n  'e2e.password.lock_instead': 'Bunun yerine klasörü kilitle',\n  'e2e.password.wrong_current': 'Parola yanlış.',\n  'e2e.password.wrong_recovery': 'Kurtarma anahtarı yanlış.',\n  'e2e.password.escrow_blocked':\n    'Bu klasörün, bu kurulumda bulunmayan bir anahtar için emanet yuvası var; klasör anahtarını değiştirmek onu kaybettirir. Hiçbir şey değiştirilmedi.',\n  'e2e.password.failed': 'Parola değiştirilemedi. Hiçbir şey değiştirilmedi.',\n  'e2e.password.done': 'Parola değişti. Eski parola bu klasörü artık açmıyor.',\n  'e2e.password.resume_title': 'Dosya anahtarları hâlâ yeniden sarılıyor',\n  'e2e.password.resume_body':\n    'Parola değişti ve yeni bir klasör anahtarı verildi. Bazı dosyaların anahtarı hâlâ öncekinin altında; her iki durumda da açılırlar. Bitirmek için devam edin.',\n  'e2e.password.progress': 'Şu ana kadar {n} dosya yeniden sarıldı · {failed} başarısız',\n  'e2e.password.progress_one': 'Şu ana kadar {n} dosya yeniden sarıldı · {failed} başarısız',\n  'e2e.password.rekey_partial':\n    '{n} dosya yeniden sarılamadı. Önceki anahtarla hâlâ açılıyorlar; yeniden denemek için devam edin.',\n  'e2e.password.rekey_partial_one':\n    '{n} dosya yeniden sarılamadı. Önceki anahtarla hâlâ açılıyor; yeniden denemek için devam edin.',\n  'e2e.password.rekey_done': 'Yeni klasör anahtarı yerinde ({n} dosya yeniden sarıldı). Eski parola burada artık hiçbir şey açmıyor.',\n  'e2e.password.rekey_done_one': 'Yeni klasör anahtarı yerinde ({n} dosya yeniden sarıldı). Eski parola burada artık hiçbir şey açmıyor.',\n  'e2e.recovery.lead_replaced':\n    'Klasörün yeni bir anahtarı var, bu yüzden yeni bir kurtarma anahtarı da var - eskisi artık açmıyor. Bir kez gösterilir; filex kopyasını tutmaz.',\n  /* wiring:e2 names - şifreli dosya ve klasör adları */\n  'e2e.unlock.unsupported':\n    'Bu klasör daha yeni bir filex istiyor: bu sürümün tanımadığı bir özellik kullanıyor ({features}). Hiçbir şey değiştirilmedi.',\n  'e2e.settings.open': 'Şifreleme ayarları…',\n  'e2e.settings.title': 'Şifreleme ayarları',\n  'e2e.settings.level': 'Şifreleme seviyesi',\n  'e2e.settings.password': 'Parola',\n  'e2e.settings.escrow': 'Emanet anahtarı',\n  'e2e.settings.close': 'Kapat',\n  'e2e.level.content': 'Yalnız içerik',\n  'e2e.level.names': 'İçerik ve adlar',\n  'e2e.level.content_hint':\n    'Dosya içerikleri şifrelenir. Dosya ve klasör adları sunucuya açık kalır; böylece WebDAV, komut satırı ve masaüstü senkronu adlarla çalışmayı sürdürür ve 0.31\\'den beri her filex klasörü açar.',\n  'e2e.level.names_hint':\n    'İçerik de dosya ve klasör adları da şifrelenir: sunucu yalnız karıştırılmış adlar görür. WebDAV, komut satırı ve masaüstü senkronu da adları karıştırılmış görür; filex 0.47 ve öncesi klasörü açmaz.',\n  'e2e.level.pending': 'seviye değişikliği bitmedi',\n  'e2e.level.change': 'Seviyeyi değiştir…',\n  'e2e.level.raise_title': 'Bu klasör “İçerik ve adlar” seviyesine geçsin mi?',\n  'e2e.level.raise_body':\n    'filex buradaki her dosya ve klasöre bu tarayıcıda şifreli bir ad verir. İçeriğe dokunulmaz; yarıda kalırsa kaldığı yerden devam eder. filex açık adlara geri dönüş yolu sunmaz.',\n  'e2e.level.raise_ack': 'Neyin değiştiğini anladım',\n  'e2e.level.raise_go': 'Adları şifrele',\n  /* wiring:e2 vault - 3. seviye, kasa (docs/E2E-VAULT-FORMAT.md) */\n  'e2e.level.vault': 'Kasa',\n  'e2e.level.vault_hint': 'İçerik, adlar ve bütün ağaç şifrelenir: sunucu yalnız aynı boyda paketler tutar; kaç dosya olduğunu, adlarını, boyutlarını ve tarihlerini görmez.',\n  'e2e.level.vault_cost': 'Bedeli: aynı anda yalnız bir kişi yazar ve kasayı yalnız filex açar (web, masaüstü, filex decrypt ve filex vault mount). WebDAV, klasör eşitleme, paylaşım bağlantıları ve sunucudaki önizlemeler içine ulaşmaz.',\n  'e2e.vault.pack_label': 'Paket boyutu',\n  'e2e.vault.pack_4': '4 MiB',\n  'e2e.vault.pack_4_help': 'Varsayılan. En küçük değişiklik 4 MiB yükler.',\n  'e2e.vault.pack_16': '16 MiB',\n  'e2e.vault.pack_16_help': 'Sunucuda daha az ve daha büyük dosya. Her değişiklik en az 16 MiB yükler.',\n  'e2e.vault.pack_hint': 'Yalnız şimdi seçilir, sonra değişmez. Sunucudaki her paket bu boydadır; kullanılmayan yeri rastgele baytlarla doldurulur.',\n  'e2e.vault.read_only': 'Salt okunur. Bir yükleme, yeni bir klasör ya da başka bir değişiklik, kimse tutmuyorsa yazma kilidini alır.',\n  'e2e.vault.writing': 'Bu kasaya şu an siz yazıyorsunuz. {left} boyunca hiçbir şey yapmazsanız salt okunura döner.',\n  'e2e.vault.lock_countdown': '{left} boyunca içinde hiçbir şey yapılmazsa kasa kilitlenir ve parolayı yeniden sorar.',\n  'e2e.vault.held_by': '{name} {since} tarihinden beri yazıyor. Kasa sizin için salt okunur.',\n  'e2e.vault.someone': 'Biri',\n  'e2e.vault.take_over': 'Devral',\n  'e2e.vault.lost_idle': '{n} dakika boyunca hiçbir şey yapmadığınız için kasa salt okunura döndü. Hiçbir şey kaybolmadı.',\n  'e2e.vault.lost_idle_one': '{n} dakika boyunca hiçbir şey yapmadığınız için kasa salt okunura döndü. Hiçbir şey kaybolmadı.',\n  'e2e.vault.lost_taken': 'Yazmayı başka biri devraldı. Kaydettikleriniz yerinde duruyor; kasa sizin için salt okunur.',\n  'e2e.vault.lost_taken_by': '{name} yazmayı devraldı. Kaydettikleriniz yerinde duruyor; kasa sizin için salt okunur.',\n  'e2e.vault.lost_broken_by': '{name} yazma kilidinizi kaldırdı. Kaydettikleriniz yerinde duruyor; kasa sizin için salt okunur.',\n  'e2e.vault.lost_connection': 'Bağlantı koptuğu için kasa salt okunura döndü.',\n  'e2e.vault.lost_expired': 'Yazma kilidinin süresi dolduğu için kasa salt okunura döndü.',\n  'e2e.vault.unsaved': 'Kaydedilmedi: {names}. Kasa boşalınca yeniden yapın.',\n  'e2e.vault.saving': 'Kaydediliyor…',\n  'e2e.vault.saving_progress': 'Kaydediliyor: {total} içinden {done}',\n  'e2e.vault.dismiss': 'Tamam',\n  'e2e.vault.continue': 'Bu durumdan devam et',\n  'e2e.vault.ro_damaged': 'Bu kasanın en yeni durumu bozuk. {when} tarihli durumu görüyorsunuz, salt okunur.',\n  'e2e.vault.ro_damaged_short': 'Bu kasanın en yeni durumu bozuk. Daha eski bir durumu görüyorsunuz, salt okunur.',\n  'e2e.vault.ro_rollback': 'Sunucu bu kasanın, bu sekmenin daha önce gördüğünden eski bir durumunu sunuyor. Kasa burada salt okunur kalır.',\n  'e2e.vault.ro_newer': 'Bu kasayı daha yeni bir filex yazmış. Bu sürüm onu okur ama değiştirmez.',\n  'e2e.vault.unreadable': 'Bu kasanın hiçbir durumu okunamıyor: hiçbir şey gösterilemez ve hiçbir şey yazılmaz.',\n  'e2e.vault.limit_warn': 'Bu kasa en fazla {max} dosya ve klasör tutabilir; şu an {held} tane tutuyor.',\n  'e2e.vault.cross': 'Sunucuda kasa ile dışındaki klasörler arasında hiçbir şey taşınmaz: birinden indirin, sonra ötekine yükleyin.',\n  'e2e.vault.dl_too_big': 'Bu tarayıcı bu kadar büyük bir dosyayı bellekten kaydedemez. Doğrudan diske kaydeden bir tarayıcı (Chrome, Edge) ya da filex decrypt kullanın.',\n  'e2e.vault.damaged_file': 'Bu dosya kasada bozuk ve okunamadı.',\n  'e2e.vault.level_fixed': 'Kasa kasa olarak kalır: seviyesi değişmez, anahtarı yenilenmez. Yeni bir anahtarla baştan başlamak için yeni bir kasa oluşturup dosyaları içine taşıyın.',\n  'e2e.vault.locked_idle_toast': '“{name}” içinde 15 dakika hiçbir şey yapılmadığı için kasa kendini kilitledi. Yeniden açmak için parolayı girin.',\n  'e2e.vault.open_failed': 'Kasa açılamadı.',\n  'e2e.vault.err.parent_missing': 'İçine gideceği klasör artık yok.',\n  'e2e.vault.err.parent_not_folder': '“{name}” bir klasör değil, bir dosya.',\n  'e2e.vault.err.name_taken': 'Orada “{name}” adı zaten var.',\n  'e2e.vault.err.bad_name': '“{name}” kasada ad olamaz: 1 ile 255 bayt arası olmalı, eğik çizgi ya da denetim karakteri içermemeli, . ya da .. olmamalı.',\n  'e2e.vault.err.too_deep': 'Kasada klasörler en fazla 256 düzey iç içe olabilir.',\n  'e2e.vault.err.not_found': '“{name}” artık kasada yok.',\n  'e2e.vault.err.is_folder': '“{name}” bir klasör.',\n  'e2e.vault.err.into_itself': 'Bir klasör kendi içine taşınamaz.',\n  'e2e.vault.err.too_many_entries': 'Bu kasa dolu: en fazla 250 000 dosya ve klasör tutar. Hiçbir şey değiştirilmedi.',\n  'e2e.vault.err.index_too_large': 'Bu kasanın dizini sınırına ulaştı. Hiçbir şey değiştirilmedi.',\n  'e2e.vault.err.newer_format': 'Bu kasayı daha yeni bir filex yazmış. Bu sürüm onu okur ama değiştirmez.',\n  'e2e.vault.err.size_mismatch': 'Bir dosya yüklenirken değişti. Yeniden yükleyin.',\n  'e2e.vault.err.failed': 'Değişiklik kaydedilemedi.',\n  'userSettings.vault.idle': 'Kasa: salt okunura dönme süresi',\n  'userSettings.vault.idle_help': 'Yazdığınız bir kasada hiçbir şey yapmadığınızda kasanın ne kadar süre sizde kalacağı. Sonra başkaları yazabilir; kasanız salt okunura döner ve 15 dakika sonra kilitlenir.',\n  'userSettings.vault.minutes': '{n} dakika',\n  'userSettings.vault.minutes_one': '{n} dakika',\n  'userSettings.vault.saved': 'Kaydedildi',\n  'userSettings.vault.failed': 'Kasa ayarı kaydedilemedi.',\n  'e2e.names.move_unreadable': 'Taşınmadı: öğelerden birinin adı okunamıyor.',\n  'e2e.names.move_taken':\n    'Taşınmadı: o klasörde “{name}” adı zaten var. Önce ikisinden birinin adını değiştirin.',\n  'e2e.convert.ctx': 'E2EE ile şifrele…',\n  'e2e.convert.title': '“{name}” klasörünü şifrele',\n  'e2e.convert.lead':\n    'Bu klasördeki her dosya bulunduğu yerde, bu tarayıcıda, aşağıdaki parolayla şifrelenir. Hiçbir şey yer değiştirmez; 1. seviyede adlar olduğu gibi kalır. Yarıda kalırsa klasörü yeniden açınca devam eder.',\n  'e2e.convert.past_title': 'Sunucuda zaten olanlar',\n  'e2e.convert.past_body':\n    'Şifreleme bu dosyaları bundan sonrası için korur. Şimdiye kadar sunucu onları açık hâlde tuttu ve bazı kopyalar kalır: filex küçük resimlerini ve arama için çıkardığı metni siler; bu klasörün eski sürümlerini ve çöp kutusundaki kayıtlarını da silebilir.',\n  'e2e.convert.drop_versions': 'Bu dosyaların eski sürümlerini sil (şifresizdirler)',\n  'e2e.convert.drop_trash': 'Bu klasörden çöp kutusuna gidenleri sil',\n  'e2e.convert.past_outside':\n    'Yedekler, kopya sunucular ve birinin önceden aldığı kopyalar filex\\'in dışındadır ve olduğu gibi kalır.',\n  'e2e.convert.submit': 'Klasörü şifrele',\n  'e2e.convert.nested':\n    'Bu klasörün içinde şifreli bir klasör var. Şifreli klasörler iç içe olamaz; hiçbir şey değiştirilmedi.',\n  'e2e.convert.failed':\n    'Klasör şifrelenemedi. Şifrelenmiş dosyalar öyle kalır; devam etmek için klasörü açın.',\n  'e2e.convert.stopped': '{n} dosyadan sonra durduruldu. Klasörün üstündeki şeritten devam edebilirsiniz.',\n  'e2e.convert.stopped_one':\n    '{n} dosyadan sonra durduruldu. Klasörün üstündeki şeritten devam edebilirsiniz.',\n  'e2e.convert.partial':\n    '{n} dosya şifrelenemedi (bu arada değişti, çok büyük ya da yazılamıyor). Hâlâ şifresizler; devam etmek için yeniden deneyin.',\n  'e2e.convert.partial_one':\n    '{n} dosya şifrelenemedi (bu arada değişti, çok büyük ya da yazılamıyor). Hâlâ şifresiz; devam etmek için yeniden deneyin.',\n  'e2e.convert.too_large_here':\n    '{n} dosya bu tarayıcının tek parçada gönderebileceğinden büyük ve bu sunucu parça parça yükleme almıyor; bu yüzden yerlerinde şifrelenemediler. Hâlâ şifresizler ve onlar şifrelenene kadar klasörün şifrelenmesi tamamlanmış sayılmaz.',\n  'e2e.convert.too_large_here_one':\n    '{n} dosya bu tarayıcının tek parçada gönderebileceğinden büyük ve bu sunucu parça parça yükleme almıyor; bu yüzden yerinde şifrelenemedi. Hâlâ şifresiz ve o şifrelenene kadar klasörün şifrelenmesi tamamlanmış sayılmaz.',\n  'e2e.convert.large_progress': '“{name}” şifreleniyor: %{percent}',\n  'e2e.convert.busy': 'Klasör şifreleniyor…',\n  'e2e.convert.resume_title': 'Bu klasörü şifrelemeyi bitirin',\n  'e2e.convert.resume_body':\n    'Bu klasörü şifreleme işi başladı ama bitmedi. Henüz ulaşılmayan dosyalar sunucuda hâlâ şifresiz. Devam ederseniz kaldığı yerden sürer.',\n  'e2e.convert.progress': '{total} dosyanın {n} tanesi şifrelendi · {failed} dosya kaldı',\n  'e2e.convert.progress_one': '{total} dosyanın {n} tanesi şifrelendi · {failed} dosya kaldı',\n  'e2e.convert.done':\n    'Klasör şifrelendi ({n} dosya). Silinen eski sürüm: {versions}; silinen çöp kaydı: {trash}.',\n  'e2e.convert.done_one':\n    'Klasör şifrelendi ({n} dosya). Silinen eski sürüm: {versions}; silinen çöp kaydı: {trash}.',\n  'e2e.convert.cleanup_failed':\n    'Klasör şifrelendi ama eski sürümleri ve çöp kayıtları silinemedi - bunu yalnız klasörün sahibi ya da bir yönetici yapabilir.',\n  'e2e.names.locked_item': '🔒 Şifreli öğe',\n  'e2e.names.unreadable_item': '🔒 Adı okunamıyor',\n  'e2e.names.key_failed':\n    'Anahtar dosyası bu klasördeki adların şifreli olduğunu söylüyor ama ad anahtarı bu anahtarla açılmıyor. Hiçbir şey değiştirilmedi.',\n  'e2e.names.write_failed': 'Uzun bir adın ad dosyası yazılamadı, bu yüzden hiçbir şey yüklenmedi.',\n  'e2e.names.bad_name':\n    '“{name}” şifreli klasörde kullanılamaz: ad 1-255 bayt olmalı; bölü, ters bölü ya da kontrol karakteri içeremez.',\n  'e2e.names.offer_cost':\n    'Ne değişir: WebDAV, komut satırı ve masaüstü senkronu adları karıştırılmış görür; filex 0.47 ve öncesi bu klasörü açmayı reddeder. Sunucu kaç öğe olduğunu ve boyutlarını hâlâ görür.',\n  'e2e.names.resume_title': 'Adları şifrelemeyi bitirin',\n  'e2e.names.resume_body':\n    'Bu klasördeki adları şifreleme işi başladı ama bitmedi. Henüz ulaşılmayan öğelerin adları hâlâ açık. Devam ederseniz kaldığı yerden sürer.',\n  'e2e.names.resume': 'Devam et',\n  'e2e.names.stop': 'Durdur',\n  'e2e.names.busy': 'Adlar şifreleniyor…',\n  'e2e.names.progress': 'Şu ana kadar {n} ad şifrelendi · {failed} öğe yeniden adlandırılamadı',\n  'e2e.names.progress_one': 'Şu ana kadar {n} ad şifrelendi · {failed} öğe yeniden adlandırılamadı',\n  'e2e.names.done': 'Adlar şifrelendi ({n} öğe yeniden adlandırıldı). Sunucu artık adları göremiyor.',\n  'e2e.names.done_one': 'Adlar şifrelendi ({n} öğe yeniden adlandırıldı). Sunucu artık adları göremiyor.',\n  'e2e.names.stopped': '{n} addan sonra durduruldu. Kalanlar siz devam edene kadar açık adlarını korur.',\n  'e2e.names.stopped_one': '{n} addan sonra durduruldu. Kalanlar siz devam edene kadar açık adlarını korur.',\n  'e2e.names.partial':\n    '{n} öğe yeniden adlandırılamadı (izin yok ya da ad bir diskte tutulamıyor). Adları açık kalıyor; devam etmek için yeniden deneyin.',\n  'e2e.names.partial_one':\n    '{n} öğe yeniden adlandırılamadı (izin yok ya da ad bir diskte tutulamıyor). Adı açık kalıyor; devam etmek için yeniden deneyin.',\n  'e2e.names.failed': 'Adlar şifrelenemedi. Zaten yeniden adlandırılanlar kaybolmaz; devam etmek için yeniden deneyin.',\n  'e2e.names.strip_fix': '{n} adı düzelt (açık kalmış ya da filex dışından taşınmış)',\n  'e2e.names.strip_fix_one': '{n} adı düzelt (açık kalmış ya da filex dışından taşınmış)',\n  'e2e.create.names_root_hint':\n    'Klasörün kendi adı her durumda açık kalır - şifresiz bir klasörün içinde durur. Hiçbir şey ele vermeyen bir ad seçin.',\n  'e2e.locked_toast': 'Klasör kilitlendi',\n  'e2e.upload.locked': 'Önce klasörün kilidini açın',\n  'e2e.decrypting': 'Çözülüyor…',\n  'e2e.decrypt_failed': 'Dosya çözülemedi (parola değişmiş ya da dosya bozulmuş olabilir).',\n  /* wiring:e2 recovery - kurtarma anahtarı + yönetici escrow'u */\n  'e2e.create.escrow_title': 'Bu sunucunun da bir anahtarı var',\n  'e2e.create.escrow_body':\n    'Bu kurulumda anahtar emaneti (escrow) açık: sunucunun işletmecisi bu klasörü parolanız olmadan açabilir. O anahtar kullanıldığında size bildirim gelir. Escrow sunucu kurulurken sabitlenir; bir klasör için kapatılamaz.',\n  'e2e.locked.use_recovery': 'Parolayı mı kaybettiniz? Kurtarma anahtarı kullanın',\n  'e2e.recovery.title': 'Kurtarma anahtarınızı saklayın',\n  'e2e.recovery.title_upgraded': 'Kurtarma anahtarınız',\n  'e2e.recovery.lead':\n    'Bu anahtar klasörü parolasız açar. Yalnız bir kez gösterilir - filex bu anahtarı saklamaz ve bir daha gösteremez.',\n  'e2e.recovery.lead_upgraded':\n    'Bu klasörün artık bir kurtarma anahtarı var. Klasörü parolasız açar, yalnız bir kez gösterilir ve filex\\'te kopyası kalmaz.',\n  'e2e.recovery.copy': 'Kopyala',\n  'e2e.recovery.copied': 'Kopyalandı',\n  'e2e.recovery.download': 'Dosya olarak indir',\n  'e2e.recovery.warn_title': 'BUNU PAROLA GİBİ SAKLAYIN',\n  'e2e.recovery.warn_body':\n    'Bu anahtarı eline geçiren herkes klasörü okuyabilir. Parolanızdan ayrı bir yerde tutun - parolanın yanında duran bir anahtar sizi unutmaya karşı korur, başkasına karşı değil.',\n  'e2e.recovery.escrow_title': 'Bu sunucunun da bir anahtarı var',\n  'e2e.recovery.escrow_body':\n    'Bu kurulumda anahtar emaneti açık: sunucunun işletmecisi bu klasörü parolanız olmadan açabilir. O anahtar kullanıldığında size bildirim gelir.',\n  'e2e.recovery.escrow_kid': 'Emanet anahtarı',\n  'e2e.recovery.ack': 'Bu anahtarı güvenli bir yere kaydettim.',\n  'e2e.recovery.done': 'Tamam',\n  'e2e.recover.title': 'Parolasız kilit açma',\n  'e2e.recover.none':\n    'Bu klasör kurtarma anahtarları eklenmeden önce oluşturulmuş, bu yüzden anahtarı yok. Tek giriş yolu parolası. Bir kez parolayla açın, filex kurtarma anahtarı eklemeyi önerecek.',\n  'e2e.recover.tab_recovery': 'Kurtarma anahtarı',\n  'e2e.recover.tab_escrow': 'Emanet anahtarı',\n  'e2e.recover.recovery_hint': 'Klasör oluşturulurken bir kez gösterilen anahtar.',\n  'e2e.recover.recovery_placeholder': 'XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX',\n  'e2e.recover.escrow_warn_title': 'Klasörün sahibine haber gidecek',\n  'e2e.recover.escrow_warn_body':\n    'Emanet anahtarıyla açılan klasörün sahibine bildirim gönderilir. Yalnız yetkiniz olduğunda kullanın.',\n  'e2e.recover.escrow_kid': 'Emanet anahtarı',\n  'e2e.recover.escrow_predates':\n    'Bu kurulumun emanet anahtarı var ama bu klasörün yok. Klasör, emanet burada açılmadan önce oluşturulmuş; ana anahtarı emanet kimliğine hiç sarmalanmadı. Emanet anahtarı bu klasörü açmaz. İşletmecinin yapabileceği hiçbir şey bunu değiştirmez - sarmalama için klasörün parolası gerekir ve sunucu onu hiçbir zaman görmedi. Klasörün sahibi verebilir: parolayla kilidi açıp işletmeciye anahtar vermeyi seçebilir. O yapılana kadar parolayı ya da kurtarma anahtarını kullanın.',\n  'e2e.recover.escrow_other_key':\n    'Bu klasör BAŞKA bir kurulumun emanet anahtarını taşıyor. Başka yerde oluşturulup buraya geri yüklenmiş, bu yüzden bu kurulumun emanet anahtarı onu açmaz. Yalnızca sarmalandığı emanet anahtarının özel yarısı açabilir.',\n  'e2e.recover.escrow_placeholder': 'Emanet özel anahtarını yapıştırın (PKCS#8, base64 ya da PEM)',\n  'e2e.recover.bad_format':\n    'Bu bir kurtarma anahtarına benzemiyor. Dörtlü sekiz grup, toplam 32 karakter olmalı.',\n  'e2e.recover.escrow_required': 'Emanet özel anahtarını yapıştırın.',\n  'e2e.recover.wrong_recovery': 'Bu kurtarma anahtarı bu klasörü açmıyor.',\n  'e2e.recover.wrong_escrow':\n    'Bu emanet anahtarı bu klasörü açmıyor. Emanet açılmadan önce oluşturulmuş bir klasörün, sahibi izin verene kadar emanet anahtarı yoktur - o zamana kadar parolayı ya da kurtarma anahtarını kullanın.',\n  'e2e.recover.bad_escrow_key': 'Bu okunabilir bir özel anahtar değil (PKCS#8, base64 ya da PEM bekleniyor).',\n  'e2e.recover.notify_failed':\n    'Klasör sahibine bildirim gönderilemedi, bu yüzden kilit açılmadı. Emanet anahtarının kullanımı her zaman duyurulur.',\n  'e2e.recover.recovery_done': 'Kurtarma anahtarıyla açıldı',\n  'e2e.recover.escrow_done': 'Emanet anahtarıyla açıldı - klasör sahibine bildirildi',\n  'e2e.recover.unlock': 'Kilidi aç',\n  'e2e.recover.busy': 'Açılıyor…',\n  'e2e.escrowoffer.title': 'İşletmeciye bu klasörün anahtarı verilsin mi?',\n  'e2e.escrowoffer.body':\n    'Bu klasör, burada anahtar emaneti açılmadan önce oluşturulmuş; bu yüzden kurulumun işletmecisi onu açamıyor. Şu anda - parolanız bellekteyken - filex bu klasörü emanet anahtarına sarmalayabilir. Dosyalarınız yeniden şifrelenmez, hiçbir yere taşınmaz; yalnızca anahtar dosyası değişir.',\n  'e2e.escrowoffer.consequence':\n    'Bunun anlamı: işletmeci, parolanız olmadan bu klasöre giren ikinci ve kalıcı bir yol kazanır. O anahtar kullanıldığında size bildirim gelir, ama bu bildirim bir denetim değil yalnızca bir duyurudur.',\n  'e2e.escrowoffer.learn_more': 'Emanet anahtarı neyi yapar, neyi yapamaz',\n  'e2e.escrowoffer.password_label': 'Klasör parolası',\n  'e2e.escrowoffer.password_required': 'Klasör parolasını girin.',\n  'e2e.escrowoffer.wrong_password': 'Bu, bu klasörün parolası değil.',\n  'e2e.escrowoffer.accept': 'İşletmeciye anahtar ver',\n  'e2e.escrowoffer.decline': 'Hayır, bende kalsın',\n  'e2e.escrowoffer.cancel': 'Vazgeç',\n  'e2e.escrowoffer.busy': 'Sarmalanıyor…',\n  'e2e.escrowoffer.done': 'İşletmeci artık bu klasörü emanet anahtarıyla açabilir',\n  'e2e.escrowoffer.declined_toast': 'Sizde kaldı. filex bu klasör için bir daha sormayacak.',\n  'e2e.escrowoffer.decline_failed':\n    'Cevabınız kaydedilemedi, bu yüzden filex bir dahakine yine soracak. Klasörde hiçbir şey değişmedi.',\n  'e2e.escrowoffer.failed': 'İşletmeciye bu klasörün anahtarı verilemedi',\n  'e2e.escrowoffer.strip_action': 'Emanet anahtarı…',\n  'e2e.upgrade.title': 'Bu klasörün kurtarma anahtarı yok',\n  'e2e.upgrade.body':\n    'Kurtarma anahtarları eklenmeden önce oluşturulmuş, bu yüzden tek giriş yolu parolası. Şu anda - ve yalnız şu anda, parola bellekteyken - filex bir tane ekleyebilir. Dosyalarınız yeniden şifrelenmez, hiçbir yere taşınmaz.',\n  'e2e.upgrade.escrow_note':\n    'Not: bu kurulumda anahtar emaneti açık; kurtarma anahtarı eklemek aynı zamanda işletmecinin bu klasörü parolanız olmadan açabilmesi demektir.',\n  'e2e.upgrade.accept': 'Kurtarma anahtarı oluştur',\n  'e2e.upgrade.decline': 'Şimdi değil',\n  'e2e.upgrade.busy': 'Oluşturuluyor…',\n  'e2e.upgrade.failed': 'Bu klasöre kurtarma anahtarı eklenemedi',\n  'e2e.download.failed': 'Şifreli dosya indirilemedi.',\n  /* /wiring:e2 */\n\n  /* ── connections: storage config + \"how to connect\" ──────────────\n     `storages.*` keys are the ones the BACKEND's driver descriptors\n     name (each driver package declares one next to its Init). They are\n     kept identical to web/src/locales/*.json on purpose: the same\n     descriptor is rendered on both surfaces, so a field that reads\n     \"Base path\" in the admin panel and something else in the desktop\n     app would be the same drift this whole mechanism exists to stop. */\n  'conn.title': 'Depo bağlantıları',\n  'conn.subtitle': '{host} sunucusuna kendi bilgisayarınızdan nasıl erişilir: bağlayın ya da bir istemciyi buraya yönlendirin.',\n  'conn.close': 'Kapat',\n  'conn.list.disabled': 'Kapalı',\n  'conn.form.required': 'Zorunlu',\n  'conn.form.advanced': 'Gelişmiş ayarlar',\n  'conn.form.yes': 'Evet',\n  'conn.form.no': 'Hayır',\n  'conn.form.noFields': 'Bu sunucu bu sürücü için hiçbir ayar tanımlamadı.',\n  'conn.form.reveal': 'Göster',\n  'conn.form.hide': 'Gizle',\n  'conn.guide.protocol': 'Protokol',\n  'conn.guide.storage': 'Depo',\n  'conn.guide.allStorages': 'Tüm depolar',\n  'conn.guide.copy': 'Kopyala',\n  'conn.guide.copied': 'Kopyalandı',\n  'conn.guide.goodToKnow': 'Bilmekte fayda var',\n  'conn.guide.userPlaceholder': 'eposta@ornek.com',\n  'conn.guide.secretPlaceholder': 'parolanız-ya-da-api-anahtarınız',\n  'conn.guide.fact.url': 'Adres',\n  'conn.guide.fact.urlRootHint': 'Görebildiğiniz her depo bu adresin altında bir klasör olarak görünür.',\n  'conn.guide.fact.urlStorageHint': 'Doğrudan “{storage}” deposunu bağlar. Son parçayı silerseniz tüm depoları görürsünüz.',\n  'conn.guide.fact.user': 'Kullanıcı adı',\n  'conn.guide.fact.password': 'Parola',\n  'conn.guide.webdav.summary': 'WebDAV, filex’i bir sürücü gibi bağlar: Windows Gezgini, macOS Finder, Linux, rclone ve Cyberduck bu protokolü konuşur ve yapılan her değişiklik filex’e yansır.',\n  'conn.guide.webdav.userHint': 'Kullanıcı adınız ya da e-postanız - görünen adınız değil.',\n  'conn.guide.webdav.passwordHint': 'Hesap parolanız ya da bir API anahtarı (gezinti panelindeki API anahtarları bölümü). İki adımlı doğrulaması açık bir hesap ZORUNLU olarak API anahtarı kullanır: Basic kimlik doğrulamasında ikinci adım için yer yoktur.',\n  'conn.guide.webdav.win.s1': 'Dosya Gezgini’ni açın, Bu bilgisayar’a sağ tıklayın ve “Ağ sürücüsü bağla…” deyin.',\n  'conn.guide.webdav.win.s2': 'Bir sürücü harfi seçin ve klasör olarak {url} adresini girin.',\n  'conn.guide.webdav.win.s3': '“Farklı kimlik bilgileri kullanarak bağlan” kutusunu işaretleyin ve yukarıdaki kullanıcı adı/parola ile girin.',\n  'conn.guide.webdav.win.cmdCaption': 'Komut İstemi (sihirbaz olmadan aynı iş)',\n  'conn.guide.webdav.win.limits': 'Windows’un tam olarak filex hatası gibi görünen üç yerleşik sınırı vardır: aktarımlar ~47,7 MB’ta durur, yaklaşık bin dosyalı klasörler açılmaz (“Disk biçimlendirilmemiş”) ve her iki ayarı değiştirdikten sonra WebClient hizmeti yeniden başlatılmalıdır.',\n  'conn.guide.webdav.win.regCaption': 'Yönetici olarak çalıştırın, sonra sürücüyü yeniden bağlayın',\n  'conn.guide.webdav.win.https': 'HTTPS zorunludur. Windows Basic kimlik bilgilerini yalnızca TLS üzerinden gönderir; düz http:// üzerinde hiçbir açıklama vermeden reddeder. BasicAuthLevel değerini 2 yapmayın - TLS kullanın.',\n  'conn.guide.webdav.win.persist': 'Bağlanan sürücü oturum kapatmayı atlatamaz: Windows 7’den beri Basic kimlik bilgileri Kimlik Bilgisi Yöneticisi’nde saklanamaz ve /persistent:yes bunu değiştirmez. Kendiliğinden geri gelsin istiyorsanız komutu bir oturum açma betiğinden yeniden çalıştırın.',\n  'conn.guide.webdav.win.service': 'Hiç bağlanamıyorsa WebClient hizmetinin çalıştığından emin olun: sc config WebClient start= auto && net start WebClient.',\n  'conn.guide.webdav.mac.s1': 'Finder’da Git → Sunucuya Bağlan… (⌘K) yolunu izleyin.',\n  'conn.guide.webdav.mac.s2': '{url} adresini girip bağlanın.',\n  'conn.guide.webdav.mac.s3': 'Yukarıdaki kullanıcı adı ve parolayla kimliğinizi doğrulayın.',\n  'conn.guide.webdav.mac.note': 'Sürücü Konumlar altında görünür; her depo en üst düzeyde bir klasördür.',\n  'conn.guide.webdav.linux.mountCaption': 'davfs2 ya da masaüstü dosya yöneticisi (GNOME Dosyalar, Dolphin)',\n  'conn.guide.webdav.linux.gvfsComment': 'ya da bu adresi GNOME Dosyalar / Dolphin icine yapistirin',\n  'conn.guide.webdav.linux.locks': 'davfs2 için kilitler kapatılmalıdır. filex WebDAV kilitlerini süreç belleğinde tutar; yeniden başlatmayı atlatamazlar ve kopyalar arasında paylaşılmazlar - davfs2 tersini varsayar ve takılır.',\n  'conn.guide.webdav.rclone.obscureCaption': 'rclone parolayı gizlenmiş biçimde saklar - önce bunu çalıştırıp çıktısını aşağıya yapıştırın',\n  'conn.guide.webdav.rclone.passPlaceholder': '<rclone obscure çıktısı>',\n  'conn.guide.webdav.rclone.useCaption': 'Kullanımı',\n  'conn.guide.webdav.duck.s1': 'Yeni Yer İmi → WebDAV (HTTPS).',\n  'conn.guide.webdav.duck.s2': 'Sunucu {host}, port 443.',\n  'conn.guide.webdav.duck.s3': 'Yol {path}.',\n  'conn.guide.webdav.duck.s4': 'Kullanıcı adı {user}, parola yukarıdaki gibi.',\n  'conn.guide.webdav.note.delete': 'WebDAV üzerinden silme kalıcıdır. Web arayüzü dosyaları filex çöp kutusuna taşır; istemciden silme ise nesneyi doğrudan arka uçtan kaldırır.',\n  'conn.guide.webdav.note.locks': 'Kilitler sunucu belleğinde durur: yeniden başlatmayı atlatamazlar ve kopyalar arasında paylaşılmazlar. Windows ile Office’i memnun etmek için varlar, eşzamanlı düzenlemeyi hakemlemek için değil.',\n  'conn.guide.webdav.note.permissions': 'Web arayüzünde ne görüyorsanız burada da onu görürsünüz. Kök yalnızca açabildiğiniz depoları listeler; yetkiniz dışındaki bir yol 403 değil 404 döner, böylece ağaç neyin var olduğunu sızdırmaz.',\n  'conn.guide.webdav.note.http': 'Bu sunucuya düz http:// ile erişiliyor. Windows kimlik bilgilerinizi hiç göndermez, diğer tüm istemciler ise parolanızı açık metin olarak yollar. Bağlamadan önce filex’i TLS arkasına alın.',\n  // ── S3 ucu: anahtarlar ve rehber ─────────────────────────────────\n  'conn.s3keys.title': 'S3 erişim anahtarları',\n  'conn.s3keys.lead': 'Bir erişim anahtarı, S3 konuşan her istemcinin - rclone, restic, AWS CLI, mc, s3fs, Cyberduck - filex’e bağlanmasını sağlar. Anahtar sizin yetkinizi taşır, bir fazlasını değil.',\n  'conn.s3keys.disabled': 'Bu sunucuda S3 ucu kapalı (FILEX_S3). Burada üretilen anahtar, yönetici ucu tekrar açana kadar bağlanmaz.',\n  'conn.s3keys.cannotMint': 'Erişim anahtarı üretebilecek bir hesapla oturum açmış değilsiniz. Aşağıdaki talimatlar yine geçerli - bir anahtar isteyip yapıştırmanız yeter.',\n  'conn.s3keys.label': 'Ne için? (dizüstü yedeği, CI, …)',\n  'conn.s3keys.defaultLabel': 'erişim anahtarı',\n  'conn.s3keys.everyBucket': 'Görebildiğim tüm kovalar',\n  'conn.s3keys.prefix': 'Kova içindeki klasör (isteğe bağlı)',\n  'conn.s3keys.mint': 'Anahtar oluştur',\n  'conn.s3keys.inheritNote': 'Bir anahtar sahip olduğunuz yetkiyi yalnızca DARALTABİLİR: yetkileriniz ve rolünüz. Anahtarı tek bir kovaya ya da klasöre kısıtlamak, bir dizüstü yedeği ile her şeyi okuyabilen bir kimlik arasındaki farktır.',\n  'conn.s3keys.once': 'Gizli anahtarı şimdi kopyalayın - bir daha gösterilmeyecek.',\n  'conn.s3keys.accessKeyID': 'Erişim anahtarı kimliği',\n  'conn.s3keys.secret': 'Gizli anahtar',\n  'conn.s3keys.dismiss': 'Kopyaladım',\n  'conn.s3keys.col.label': 'Etiket',\n  'conn.s3keys.col.key': 'Erişim anahtarı kimliği',\n  'conn.s3keys.col.scope': 'Kapsam',\n  'conn.s3keys.col.lastUsed': 'Son kullanım',\n  'conn.s3keys.scopeAll': 'görebildiğiniz her şey',\n  'conn.s3keys.noLabel': '(etiketsiz)',\n  'conn.s3keys.neverUsed': 'hiç',\n  'conn.s3keys.enable': 'Aç',\n  'conn.s3keys.disable': 'Kapat',\n  'conn.s3keys.revoke': 'İptal et',\n  'conn.s3keys.confirm': 'Emin misiniz?',\n  'conn.s3keys.empty': 'Henüz erişim anahtarı yok.',\n  'conn.guide.s3.summary': 'S3 ucu, S3 konuşan her şeyin - yedekleme, eşitleme araçları, SDK’lar - hedefi olarak filex’i kullanmanızı sağlar; hem de zaten sahip olduğunuz depolarla.',\n  'conn.guide.s3.keyPlaceholder': 'yukarıdan bir anahtar oluşturun',\n  'conn.guide.s3.secretPlaceholder': 'anahtarı oluştururken bir kez gösterilir',\n  'conn.guide.s3.fact.endpoint': 'Uç adresi',\n  'conn.guide.s3.fact.endpointHint': 'İstemciyi buraya yöneltin, filex’in web adresine değil.',\n  'conn.guide.s3.fact.bucket': 'Kova',\n  'conn.guide.s3.fact.bucketHint': 'Kova = filex deposu. Kovaları istemci değil yönetici oluşturur.',\n  'conn.guide.s3.fact.key': 'Erişim anahtarı kimliği',\n  'conn.guide.s3.fact.keyHint': 'Genel yarısı; her istekte gider.',\n  'conn.guide.s3.fact.secret': 'Gizli anahtar',\n  'conn.guide.s3.fact.secretHint': 'Yalnızca anahtar oluşturulurken bir kez gösterilir. filex bir daha gösteremez - kaybolduysa yeni anahtar üretin.',\n  'conn.guide.s3.fact.region': 'Bölge',\n  'conn.guide.s3.fact.regionHint': 'filex’te bölge yok; hangi değeri verirseniz aynen geri döner. Yine de istemciler bir değer ister.',\n  'conn.guide.s3.fact.addressing': 'Adresleme',\n  'conn.guide.s3.fact.pathStyle': 'yol tabanlı (zorunlu)',\n  'conn.guide.s3.fact.pathStyleHint': 'Bu kurulumda S3’e ayrılmış bir alan adı yok, yani kova.host çözülmez.',\n  'conn.guide.s3.fact.virtualHosted': 'sanal-host ya da yol tabanlı',\n  'conn.guide.s3.fact.virtualHostedHint': 'Bu kurulumun kendi S3 alan adı var, iki adresleme de çalışır.',\n  'conn.guide.s3.rclone.useCaption': 'Kullanımı',\n  'conn.guide.s3.rclone.mtime': 'filex dosyanın değişiklik zamanını taşır (x-amz-meta-mtime); böylece rclone sync ilk turdan sonra oturur, her seferinde her şeyi yeniden yüklemez.',\n  'conn.guide.s3.aws.configureCaption': 'Bir kez ayarlayın',\n  'conn.guide.s3.aws.useCaption': 'Kullanımı',\n  'conn.guide.s3.aws.pathStyle': 'AWS yapılandırmanıza yol tabanlı adreslemeyi ekleyin; yoksa her komut DNS aşamasında düşer.',\n  'conn.guide.s3.restic.envCaption': 'Ortam değişkenleri',\n  'conn.guide.s3.restic.useCaption': 'Yedekle, doğrula, buda',\n  'conn.guide.s3.restic.verified': 'Bu uca karşı ölçüldü: restic check --read-data her pack’i bayt bayt okuyor ve hata bulmuyor.',\n  'conn.guide.s3.mc.aliasCaption': 'Takma adı ekleyin',\n  'conn.guide.s3.mc.useCaption': 'Kullanımı',\n  'conn.guide.s3.s3fs.credsCaption': 'Kimlik dosyası',\n  'conn.guide.s3.s3fs.mountCaption': 'Bağlayın',\n  'conn.guide.s3.s3fs.note': 's3fs üzerinden bir dosyayı düzenlemek nesnenin tamamını yeniden yazar; silme ise filex çöp kutusuna gider. Paylaşılan bir klasör için iyi, veritabanı için değil.',\n  'conn.guide.s3.duck.s1': 'Yeni yer imi → Amazon S3.',\n  'conn.guide.s3.duck.s2': 'Sunucu: {host}.',\n  'conn.guide.s3.duck.s3': 'Erişim anahtarı kimliği: {key}, gizli anahtar yukarıdaki.',\n  'conn.guide.s3.duck.s4': 'Yer imini açın; kovalar sizin filex depolarınızdır.',\n  'conn.guide.s3.duck.pathStyle': 'Tercihler → S3 altında \"Use virtual host style\" seçeneğini KAPATIN - bu kurulumda joker S3 alan adı yok.',\n  'conn.guide.s3.sdk.note': 'SigV4 konuşan her istemci aynı şekilde çalışır: uç adresi, anahtar, gizli anahtar ve bu kurulumun kendi S3 alan adı yoksa yol tabanlı adresleme.',\n  'conn.guide.s3.note.buckets': 'Kova = filex deposu. İstemci kovanın İÇİNDE klasör ve nesne oluşturabilir, ama kovanın kendisini oluşturamaz: kova bir sürücü ve bir yol ister, bunu bir S3 isteği ifade edemez.',\n  'conn.guide.s3.note.permissions': 'Anahtar tam olarak sizin gördüğünüzü görür. Açamayacağınız bir kova \"yasak\" değil \"böyle bir kova yok\" der; böylece uç, neyin var olduğunu sızdırmaz.',\n  'conn.guide.s3.note.trash': 'Silme her yerdeki gibi filex çöp kutusuna gider ve saklama politikası süpürene kadar geri alınabilir.',\n  'conn.guide.s3.note.mtime': 'Yüklemeler değişiklik zamanını taşır; istemcinin gönderdiği sağlama toplamları (Content-MD5, x-amz-checksum-*) doğrulanır - bozulmuş bir yükleme saklanmaz, reddedilir.',\n  'conn.guide.s3.note.pathStyle': 'Bu kurulumda S3’e ayrılmış alan adı yok; istemcilere yol tabanlı adresleme söylenmeli. Söylenmezse güncel bir SDK, ne filex’i ne de sebebi anan bir DNS hatasıyla düşer.',\n  'conn.guide.s3.note.http': 'Bu uç düz http://. İmzalar isteği yine korur ama nesneler açık metin gider. Bir yedeği buraya yöneltmeden önce filex’i TLS arkasına alın.',\n  // ── SFTP ucu: anahtarlar ve rehber ───────────────────────────────\n  'conn.sshkeys.title': 'SSH anahtarları',\n  'conn.sshkeys.lead': 'Bir açık anahtar kaydedin; SSH konuşan her istemci - sftp, scp, WinSCP, FileZilla, rclone, sshfs - parolanızı göndermeden bağlansın.',\n  'conn.sshkeys.disabled': 'Bu sunucuda SFTP ucu kapalı (FILEX_SFTP). Burada kaydedilen anahtar, yönetici ucu açana kadar bağlanmaz.',\n  'conn.sshkeys.cannotAdd': 'Anahtar kaydedebilecek bir hesapla oturum açmış değilsiniz.',\n  'conn.sshkeys.paste': '~/.ssh/id_ed25519.pub dosyasının içeriğini yapıştırın',\n  'conn.sshkeys.name': 'Ad (isteğe bağlı - boşsa anahtarın kendi yorumu kullanılır)',\n  'conn.sshkeys.add': 'Anahtar ekle',\n  'conn.sshkeys.noCopyId': 'ssh-copy-id burada çalışamaz: kabuk üzerinden ~/.ssh/authorized_keys dosyasına ekler, filex’in kabuğu yoktur. Anahtar eklemenin yolu bu kutudur.',\n  'conn.sshkeys.col.name': 'Ad',\n  'conn.sshkeys.col.fingerprint': 'Parmak izi',\n  'conn.sshkeys.col.added': 'Eklendi',\n  'conn.sshkeys.col.lastUsed': 'Son kullanım',\n  'conn.sshkeys.noName': '(adsız)',\n  'conn.sshkeys.neverUsed': 'hiç',\n  'conn.sshkeys.enable': 'Aç',\n  'conn.sshkeys.disable': 'Kapat',\n  'conn.sshkeys.remove': 'Sil',\n  'conn.sshkeys.confirm': 'Emin misiniz?',\n  'conn.sshkeys.empty': 'Henüz anahtar yok. Anahtarsız istemciler hesap parolanızla oturum açar.',\n  'conn.guide.sftp.summary': 'SFTP, filex’i SSH konuşan her şeyin erişebileceği hâle getirir: bir yedekleme işi, bir tarayıcı, WinSCP, rclone ya da bağlanmış bir klasör.',\n  'conn.guide.sftp.fact.host': 'Sunucu',\n  'conn.guide.sftp.fact.hostHint': 'Web uygulamasıyla aynı makine, kendine ait bir portta.',\n  'conn.guide.sftp.fact.port': 'Port',\n  'conn.guide.sftp.fact.portHint': 'Ne 22 ne 443: SFTP ham TCP’dir, web vekilinin içinden geçemez.',\n  'conn.guide.sftp.fact.userHint': 'Kullanıcı adınız. İçinde @ işareti olsaydı çoğu istemcinin ayar dosyasında tırnaklanması gerekirdi; kullanıcı adı tam da bunu ortadan kaldırır.',\n  'conn.guide.sftp.fact.auth': 'Oturum açma yöntemi',\n  'conn.guide.sftp.fact.authKey': 'kayıtlı SSH anahtarınız (ya da parolanız)',\n  'conn.guide.sftp.fact.authPassword': 'hesap parolanız - ya da yukarıdan bir anahtar kaydedin',\n  'conn.guide.sftp.fact.authHint': 'API anahtarı da parola yerine geçer ve tek başına iptal edilebilir. İki adımlı doğrulaması açık bir hesap SSH anahtarı ya da API anahtarı kullanmalıdır.',\n  'conn.guide.sftp.fact.path': 'Yol',\n  'conn.guide.sftp.fact.pathHint': 'İlk klasör bir depodur; kök, açabildiğiniz depoları listeler.',\n  'conn.guide.sftp.openssh.connectCaption': 'Bağlan, gönder, al',\n  'conn.guide.sftp.openssh.noShell': 'Burada kabuk yok, yalnız SFTP alt sistemi var. `ssh sunucu komut` bilerek reddedilir; scp çalışır çünkü OpenSSH 9 onun için de SFTP konuşur.',\n  'conn.guide.sftp.key.tab': 'Anahtar kurulumu',\n  'conn.guide.sftp.key.s1': 'Bağlanacak makinede bir anahtar çifti üretin (zaten varsa atlayın).',\n  'conn.guide.sftp.key.s2': 'AÇIK yarısını kopyalayın - .pub dosyası, asla diğeri değil.',\n  'conn.guide.sftp.key.s3': 'Yukarıdaki kutuya yapıştırıp bağlanın; o andan sonra parola gönderilmez.',\n  'conn.guide.sftp.key.genCaption': 'Kendi makinenizde',\n  'conn.guide.sftp.key.noCopyId': 'ssh-copy-id filex’e karşı ÇALIŞMAZ: ~/.ssh/authorized_keys dosyasına eklemek için kabuğa ihtiyacı var, filex’te kabuk yok. Anahtarı yukarıdan yapıştırın.',\n  'conn.guide.sftp.winscp.s1': 'Yeni site → Dosya protokolü: SFTP.',\n  'conn.guide.sftp.winscp.s2': 'Sunucu adı: {host}, port: {port}.',\n  'conn.guide.sftp.winscp.s3': 'Kullanıcı adı: {user}. Anahtar için: Gelişmiş → SSH → Kimlik Doğrulama → özel anahtar dosyası.',\n  'conn.guide.sftp.winscp.s4': 'WinSCP .ppk biçiminde özel anahtar ister - OpenSSH anahtarını kendi aracıyla (Araçlar → PuTTYgen) bir kez dönüştürün.',\n  'conn.guide.sftp.filezilla.s1': 'Dosya → Site Yöneticisi → Yeni site, Protokol: SFTP.',\n  'conn.guide.sftp.filezilla.s2': 'Sunucu: {host}, port: {port}.',\n  'conn.guide.sftp.filezilla.s3': 'Kullanıcı: {user}. Giriş türü: parola için Normal, anahtar için Anahtar dosyası.',\n  'conn.guide.sftp.rclone.useCaption': 'Kullanımı',\n  'conn.guide.sftp.sshfs.mountCaption': 'Bağla ve çöz',\n  'conn.guide.sftp.sshfs.note': 'Bağlanmış bir klasörde her kayıt dosyanın tamamını yeniden yazar. Belgeler için iyi; veritabanı ya da yerinde düzenlediğiniz bir video için değil.',\n  'conn.guide.sftp.note.storages': 'Kök bir ev dizini değildir: açabildiğiniz depoları listeler ve yolun ilk parçası bir depoyu adlandırır.',\n  'conn.guide.sftp.note.permissions': 'İstemcinizin çizdiği izin bitleri buradaki erişim seviyenizden gelir; yani salt-okunur görünen bir dosya sizin için gerçekten öyledir.',\n  'conn.guide.sftp.note.trash': 'Silme her yerdeki gibi filex çöp kutusuna gider ve saklama politikası süpürene kadar geri alınabilir.',\n  'conn.guide.sftp.note.totp': 'Hesabınızda iki adımlı doğrulama açıksa parola burada çalışmaz - SSH’ın kodu soracak bir kanalı yok. Bir SSH anahtarı kaydedin ya da parola yerine API anahtarı kullanın.',\n  'conn.guide.sftp.note.disabled': 'Bu sunucuda SFTP ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.',\n  // ── FTPS ─────────────────────────────────────────────────────────\n  'conn.guide.ftps.summary': 'FTPS, yalnızca FTP öğrenmiş ekipman için var: tarayıp-klasöre-atan yazıcılar, EDI muhatapları, eski laboratuvar ve endüstri yazılımları. Her zaman TLS üzerinden.',\n  'conn.guide.ftps.fact.host': 'Sunucu',\n  'conn.guide.ftps.fact.hostHint': 'Web uygulamasıyla aynı makine, kendine ait bir portta.',\n  'conn.guide.ftps.fact.port': 'Port',\n  'conn.guide.ftps.fact.portHint': 'Kontrol kanalı. Veri, aşağıdaki pasif aralıktan ayrı bir porttan akar.',\n  'conn.guide.ftps.fact.mode': 'Şifreleme',\n  'conn.guide.ftps.fact.modeValue': 'FTPS - açık (explicit) TLS, zorunlu',\n  'conn.guide.ftps.fact.modeHint': 'Düz FTP, parola okunmadan reddedilir. \"Require explicit FTP over TLS\" seçin; \"plain FTP\" ya da \"implicit\" asla.',\n  'conn.guide.ftps.fact.userHint': 'Kullanıcı adınız ya da e-postanız. Parola yerine bir API anahtarı da kullanılabilir ve tek başına iptal edilebilir.',\n  'conn.guide.ftps.fact.passwordHint': 'Hesap parolanız ya da bir API anahtarı. İki adımlı doğrulaması açık bir hesap API anahtarı kullanmalıdır - FTP\\'nin kodu soracak bir yolu yok.',\n  'conn.guide.ftps.fact.pasv': 'Pasif portlar',\n  'conn.guide.ftps.fact.pasvHint': 'Veri bağlantıları buraya düşer. Güvenlik duvarınız bu aralığı kapatıyorsa aktarım iki tarafta da hata vermeden ASILI KALIR - FTP\\'nin klasik arızası budur.',\n  'conn.guide.ftps.filezilla.s1': 'Dosya → Site Yöneticisi → Yeni site, Protokol: FTP.',\n  'conn.guide.ftps.filezilla.s2': 'Sunucu: {host}, port: {port}.',\n  'conn.guide.ftps.filezilla.s3': 'Şifreleme: \"Require explicit FTP over TLS\". Giriş türü: Normal, kullanıcı: {user}.',\n  'conn.guide.ftps.filezilla.s4': 'Aktarım ayarları → Pasif. Bu sunucu aktif modu reddeder.',\n  'conn.guide.ftps.winscp.s1': 'Yeni site → Dosya protokolü: FTP, Şifreleme: TLS/SSL Explicit encryption.',\n  'conn.guide.ftps.winscp.s2': 'Sunucu adı: {host}, port: {port}.',\n  'conn.guide.ftps.winscp.s3': 'Kullanıcı adı: {user}, parola yukarıdaki.',\n  'conn.guide.ftps.curl.caption': 'Gönder ve al',\n  'conn.guide.ftps.curl.sslReqd': '--ssl-reqd isteğe bağlı değil: curl\\'ün düz metne geri düşmek yerine TLS\\'i ZORUNLU kılmasını sağlar. Bu sunucu zaten düz metni reddediyor, ama alışkanlık sizi reddetmeyen sunuculara karşı korur.',\n  'conn.guide.ftps.lftp.caption': 'Bağlan',\n  'conn.guide.ftps.lftp.protectData': 'ssl-protect-data yalnız oturum açmayı değil DOSYAYI da şifreler. Olmazsa lftp TLS ile oturum açar ve dosyayı açık metin gönderir - sahada en sık yapılan FTPS yanlışı budur.',\n  'conn.guide.ftps.rclone.useCaption': 'Kullanımı',\n  'conn.guide.ftps.printer.tab': 'Tarayıcı / yazıcı',\n  'conn.guide.ftps.printer.s1': 'Cihazın tara-ve-FTP\\'ye-gönder ayarlarında: sunucu {host}, port {port}.',\n  'conn.guide.ftps.printer.s2': 'Kullanıcı: {user}, parola yukarıdaki. Cihaz için kendi parolanız yerine bir API anahtarı oluşturun - başka hiçbir şeyi değiştirmeden iptal edilebilir.',\n  'conn.guide.ftps.printer.s3': 'Yol: {path} - ya da önceden oluşturduğunuz bir alt klasör. Cihaz depo oluşturamaz.',\n  'conn.guide.ftps.printer.s4': '\"SSL/TLS\" ya da \"FTPS explicit\" seçeneğini AÇIN ve PASİF modu seçin.',\n  'conn.guide.ftps.printer.noTLS': 'Tara-ve-gönder yazılımlarının önemli bir kısmı TLS konuşamıyor. Bu sunucu öyle bir cihazla konuşmayacak ve bu bilinçli: alternatifi, belgelerinizin ve parolanızın ofis ağında açık metin dolaşması.',\n  'conn.guide.ftps.note.tls': 'TLS zorunludur ve kapatan bir düğme yoktur. Düz FTP parolanızı açık metin gönderir, ardından dosyanızı da.',\n  'conn.guide.ftps.note.passive': 'Yalnızca pasif mod. Aktif modda sunucu istemciyi geri arar; bu NAT arkasında çalışmaz ve çoğu güvenlik duvarı tarafından engellenir.',\n  'conn.guide.ftps.note.storages': 'Kök bir ev dizini değildir: açabildiğiniz depoları listeler ve yolun ilk parçası bir depoyu adlandırır.',\n  'conn.guide.ftps.note.trash': 'Silme her yerdeki gibi filex çöp kutusuna gider ve saklama politikası süpürene kadar geri alınabilir.',\n  'conn.guide.ftps.note.prefer': 'İstemci SFTP konuşabiliyorsa onu tercih edin: tek bağlantı, tek port, pasif mod sürprizi yok.',\n  'conn.guide.ftps.note.selfSigned': 'Bu sunucu kendinden imzalı bir sertifika kullanıyor. Kanalı şifreler ama karşı tarafın kim olduğunu kanıtlamaz; çoğu istemci bir kez onay ister. Önemli bir iş için gerçek sertifika koyun.',\n  'conn.guide.ftps.note.disabled': 'Bu sunucuda FTPS ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.',\n  // ── NFS ──────────────────────────────────────────────────────────\n  'conn.nfs.title': 'NFS export\\'ları',\n  'conn.nfs.lead': 'Bir export, ağınızdaki bir makinenin filex\\'i sürücü olarak bağlamasını sağlar - medya oynatıcı, derleme sunucusu, yedek kutusu.',\n  'conn.nfs.pathIsSecret': '⚠ Export yolu PAROLANIN TA KENDİSİDİR. NFS, Kerberos olmadan istemciye kim olduğunu soramaz; bu yüzden filex yola 32 rastgele bayt koyar: yolu bilen sizin adınıza bağlanır. Bağlama satırını bir kimlik bilgisi gibi saklayın - /etc/fstab çoğu sistemde herkes tarafından okunabilir.',\n  'conn.nfs.disabled': 'Bu sunucuda NFS ucu kapalı (FILEX_NFS). Burada oluşturulan export, yönetici ucu açana kadar bağlanmaz.',\n  'conn.nfs.cannotMint': 'Export oluşturabilecek bir hesapla oturum açmış değilsiniz.',\n  'conn.nfs.label': 'Ne için? (medya oynatıcı, yedek kutusu, …)',\n  'conn.nfs.defaultLabel': 'nfs export',\n  'conn.nfs.everyStorage': 'Görebildiğim tüm depolar',\n  'conn.nfs.prefix': 'Depo içindeki klasör (isteğe bağlı)',\n  'conn.nfs.allowCidrs': 'İzinli adresler, örn. 192.168.1.0/24 (isteğe bağlı)',\n  'conn.nfs.readOnly': 'Salt okunur',\n  'conn.nfs.readOnlyHint': 'Bir makine için güvenli varsayılan salt okunurdur: sizin yetkiniz ne olursa olsun bu bağlantı üzerinden her yazmayı reddeder. Adres listesi daha da daraltır - listenin dışından gelen bağlanamaz.',\n  'conn.nfs.mint': 'Export oluştur',\n  'conn.nfs.once': 'Şimdi kopyalayın - yol yalnızca bir kez gösterilir ve geri alınamaz.',\n  'conn.nfs.dismiss': 'Kopyaladım',\n  'conn.nfs.col.label': 'Etiket',\n  'conn.nfs.col.scope': 'Kapsam',\n  'conn.nfs.col.mode': 'Mod',\n  'conn.nfs.col.lastUsed': 'Son bağlanma',\n  'conn.nfs.scopeAll': 'görebildiğiniz her şey',\n  'conn.nfs.modeRead': 'salt okunur',\n  'conn.nfs.modeWrite': 'okuma/yazma',\n  'conn.nfs.noLabel': '(etiketsiz)',\n  'conn.nfs.neverUsed': 'hiç',\n  'conn.nfs.enable': 'Aç',\n  'conn.nfs.disable': 'Kapat',\n  'conn.nfs.revoke': 'İptal et',\n  'conn.nfs.confirm': 'Emin misiniz?',\n  'conn.nfs.empty': 'Henüz export yok.',\n  'conn.guide.nfs.summary': 'NFS, filex\\'i kendi ağınızdaki bir makinede sürücü olarak bağlar - NAS protokolü, onu bekleyen cihazlar için.',\n  'conn.guide.nfs.pathPlaceholder': 'yukarıdan bir export oluşturun',\n  'conn.guide.nfs.fact.host': 'Sunucu',\n  'conn.guide.nfs.fact.hostHint': 'Web uygulamasıyla aynı makine, kendine ait bir portta.',\n  'conn.guide.nfs.fact.port': 'Port',\n  'conn.guide.nfs.fact.portHint': 'Hem port= hem mountport= buna ayarlanmalı; filex mount ve NFS servislerini tek portta veriyor.',\n  'conn.guide.nfs.fact.export': 'Export yolu',\n  'conn.guide.nfs.fact.exportHint': 'Kimlik bilgisi budur. Export oluşturulurken bir kez gösterilir ve hash\\'li saklanır - filex bir daha gösteremez.',\n  'conn.guide.nfs.fact.options': 'Bağlama seçenekleri',\n  'conn.guide.nfs.fact.optionsHint': 'nolock, çünkü filex NFS kilit yöneticisini çalıştırmıyor; nfsvers=3, çünkü bu sunucunun konuştuğu sürüm bu.',\n  'conn.guide.nfs.linux.mountCaption': 'Bağla',\n  'conn.guide.nfs.linux.fstabSecret': 'Bu yolu içeren bir /etc/fstab satırı, herkesin okuyabildiği bir dosyadaki paroladır. Ortamınızda önemliyse kimlik korumalı automount kullanın ya da bağlamayı yalnız root\\'un okuyabildiği bir unit dosyasında tutun.',\n  'conn.guide.nfs.mac.mountCaption': 'Bağla',\n  'conn.guide.nfs.mac.resvport': 'macOS resvport ister: istemcisi ayrıcalıklı bir kaynak portta ısrar eder ve olmadan bağlantıyı reddeder.',\n  'conn.guide.nfs.win.s1': 'Windows Özellikleri\\'nden \"Services for NFS\" → \"Client for NFS\" bileşenini açın (yalnız Pro ve Enterprise; Home\\'da yok).',\n  'conn.guide.nfs.win.s2': 'Komut İstemi\\'ni yönetici olarak açın.',\n  'conn.guide.nfs.win.s3': 'Aşağıdaki komutla export\\'u bir sürücü harfine bağlayın.',\n  'conn.guide.nfs.win.cmdCaption': 'Z: sürücüsüne bağla',\n  'conn.guide.nfs.win.port': 'Windows\\'un mount servisinin portunu söyleme imkânı yok; yalnızca standart 2049 portundaki bir NFS sunucusuna erişebilir. Bu sunucu başka bir porttaysa SFTP\\'yi ya da filex masaüstü uygulamasını kullanın.',\n  'conn.guide.nfs.nas.tab': 'NAS / medya oynatıcı',\n  'conn.guide.nfs.nas.s1': 'Cihazın NFS ayarlarında: sunucu {host}, port {port} (ayrı ayrı soruyorsa hem NFS hem mount portunu ayarlayın).',\n  'conn.guide.nfs.nas.s2': 'Uzak yol: yukarıdaki export yolu, birebir.',\n  'conn.guide.nfs.nas.s3': 'NFS sürüm 3, kilitleme kapalı. Cihazın gerçekten yazması gerekmiyorsa export\\'u salt okunur oluşturun.',\n  'conn.guide.nfs.note.unencrypted': 'NFSv3 şifreli değildir. Trafiği okuyabilen dosyalarınızı görür, yolu öğrenen bağlanabilir. Ev/ofis ağında ya da VPN üzerinden kullanın - internet üzerinden asla.',\n  'conn.guide.nfs.note.pathIsSecret': 'Export yolu kimlik bilgisinin tamamıdır. Sızarsa yukarıdaki listeden iptal edin; değiştirilecek başka bir şey yok.',\n  'conn.guide.nfs.note.noPortmapper': '111 portunda portmapper yok; portu söylenmeyen istemci sunucuyu bulamaz. Buradaki her komutun port= ve mountport= taşımasının sebebi bu.',\n  'conn.guide.nfs.note.uid': 'İstemcinizin gönderdiği kullanıcı ve grup kimlikleri yok sayılır: bağlantı zaten kime ait olduğunu biliyor. Gördüğünüz izinler filex\\'teki erişiminizden gelir.',\n  'conn.guide.nfs.note.trash': 'Silme her yerdeki gibi filex çöp kutusuna gider ve saklama politikası süpürene kadar geri alınabilir.',\n  'conn.guide.nfs.note.revoke': 'İptal anında değil, bir sonraki istekte etkili olur: NFS\\'te sonlandırılacak bir oturum yok, bağlantısı açık olan istemci sıradaki işleminde hata alır.',\n  'conn.guide.nfs.note.disabled': 'Bu sunucuda NFS ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.',\n  'conn.tokens.title': 'API anahtarları',\n  'conn.tokens.lead': 'FTPS, WebDAV ve filex mount hesap parolanız yerine bir API anahtarıyla oturum açar. Buradan oluşturun - tek başına iptal edilebilir, ayrıca iki adımlı doğrulaması açık bir hesap bunlarda parolasını zaten kullanamaz.',\n  'conn.tokens.mint': 'API anahtarı oluştur',\n  'conn.tokens.once': 'Şimdi kopyalayın - yalnızca bir kez gösterilir. Sunucuda yalnız özeti saklandığı için bir daha gösterilemez.',\n  'conn.tokens.dismiss': 'Kopyaladım',\n  'conn.tokens.cannotMint': 'Bu oturum API anahtarı oluşturamıyor. Kendi hesabınızla oturum açıp oluşturun.',\n  'conn.tokens.empty': 'Henüz API anahtarı yok.',\n  'conn.tokens.neverUsed': 'hiç',\n  'conn.tokens.revoke': 'İptal et',\n  'conn.tokens.confirm': 'Emin misiniz?',\n  'conn.tokens.col.label': 'Ad',\n  'conn.tokens.col.scopes': 'İzinler',\n  'conn.tokens.col.comments': 'Yorumlar',\n  'conn.tokens.col.used': 'Son kullanım',\n  'conn.tokens.revokeHint': 'İptal, yalnız bir sonraki oturum açmayı değil AÇIK bağlantıyı da durdurur: SFTP ya da FTPS oturumu kesilir, bağlı bir sürücü yarım dakika içinde çalışmayı bırakır.',\n  'conn.guide.mount.summary': 'filex mount, uzaktaki bir filex sunucusunu bu makinede bir klasöre bağlar - tarayıcının kullandığı aynı HTTPS üzerinden. Buradakilerin her yerden çalışan tek yöntemi: yerel ağ da gerekmez, ek sunucu da, üçüncü parti bir istemci de.',\n  'conn.guide.mount.fact.url': 'Sunucu adresi',\n  'conn.guide.mount.fact.urlHint': 'Tarayıcıda kullandığınız adresin aynısı. Başka hiçbir şeye erişilebilir olması gerekmez.',\n  'conn.guide.mount.fact.token': 'API anahtarı',\n  'conn.guide.mount.fact.tokenPlaceholder': 'API anahtarları bölümünden oluşturun',\n  'conn.guide.mount.fact.tokenHint': 'Parolanız değil, bir API anahtarı - tek başına iptal edilebilir, ayrıca 2FA açık bir hesap burada parolasını zaten kullanamaz.',\n  'conn.guide.mount.fact.remote': 'Neyi bağlayacağınız',\n  'conn.guide.mount.fact.remoteHint': '--remote vermezseniz her depo bir klasör olarak görünür; tek bir depoyu - ya da onun içindeki bir klasörü - adlandırırsanız yalnızca o bağlanır.',\n  'conn.guide.mount.linux.mountCaption': 'Bağlayın',\n  'conn.guide.mount.linux.umountCaption': 'Ayırın',\n  'conn.guide.mount.linux.umountWarn': 'Süreci öldürerek değil, fusermount ile ayırın. Ayrılmadan ölen bir bağlantı, birileri elle fusermount çalıştırana kadar her ls komutunun asılı kaldığı bir klasör bırakır.',\n  'conn.guide.mount.linux.systemdCaption': 'Oturum açılınca otomatik bağlansın (systemd kullanıcı birimi)',\n  'conn.guide.mount.win.winfsp': \"Windows'ta bir kez WinFsp kurulması gerekiyor - ücretsiz ve açık kaynak: https://winfsp.dev. Başka bir şey gerekmiyor, sonrasında yönetici hakkı da istemiyor.\",\n  'conn.guide.mount.win.mountCaption': 'Sürücü olarak bağlayın',\n  'conn.guide.mount.win.freeLetter': 'BOŞ bir sürücü harfi seçin. Harf bağlama sırasında oluşturulur, var olan bir şeye eklenmez; kullanımdaki bir harfi verirseniz bunu söylemeyen bir hatayla başarısız olur.',\n  'conn.guide.mount.win.stop': 'O pencerede Ctrl-C ile durdurun. Sürücü kaybolur ve bu makinede hiçbir şey kalmaz.',\n  'conn.guide.mount.mac.unsupported': \"filex mount macOS'ta çalışmıyor. macFUSE gerekiyor; lisansı filex gibi bir programın onu sizin yerinize kurmasına izin vermiyor ve Go bağlaması filex'in bilinçli olarak kullanmadığı bir C derleyicisi istiyor. Komut burada çalışıyormuş gibi görünüp hiçbir şey yapmak yerine açıkça reddediyor.\",\n  'conn.guide.mount.mac.alternatives': \"macOS'ta filex masaüstü uygulamasını klasör eşitlemesiyle kullanın (dosyalar diskte durur) ya da sürücü bağlayabilen bir istemciyle SFTP.\",\n  'conn.guide.mount.note.notASync': 'Bu bir eşitleme değildir. Küçük bir okuma önbelleği dışında bu makineye hiçbir şey kopyalanmaz; yüz bin dosyanın içinden birini gerisini indirmeden açar. Dosyaları çevrimdışıyken istiyorsanız klasör eşitlemesini kullanın.',\n  'conn.guide.mount.note.reachable': 'Sunucuya, tarayıcının geçtiği hangi vekil ya da tünel varsa oradan ulaşır - çünkü altında aynı API vardır. İzinleriniz ve depolarınız da birlikte gelir.',\n  'conn.guide.mount.note.wholeFileWrites': 'Bağlantı üzerinden yazdığınız dosya, yazılırken değil, program onu kapattığında yüklenir. Çok büyük bir dosyayı yerinde düzenlemek burada yerel diskten yavaştır; içeri ve dışarı kopyalamak değildir.',\n  'conn.guide.mount.note.trash': 'Silme her yerdeki gibi filex çöp kutusuna gider ve saklama politikası süpürene kadar geri alınabilir.',\n  'conn.guide.mount.note.revoke': 'Bir bağlantıyı durdurmak için API anahtarını iptal edin. Bağlantı hâlâ takılı olsa bile yarım dakika içinde hizmet vermeyi bırakır.',\n  'storages.driver.ftp': 'FTP / FTPS',\n  'storages.driver.local': 'Yerel dosya sistemi',\n  'storages.driver.s3': 'S3 / Hetzner / MinIO',\n  'storages.driver.sftp': 'SFTP',\n  'storages.driver.smb': 'SMB / CIFS (NAS)',\n  'storages.driver.webdav': 'WebDAV',\n  'storages.fieldHelp.smbShare':\n    \"Sunucu adı olmadan yalnızca paylaşım adı: `\\\\\\\\nas\\\\media` değil, `media`.\",\n  'storages.fieldHelp.smbDomain':\n    'Yalnızca Windows etki alanı hesabı için. NAS kullanıyorsanız boş bırakın.',\n  'storages.fieldHelp.smbRoot':\n    'Paylaşımın içindeki alt klasör. Paylaşımın tamamı için boş bırakın.',\n  'storages.fields.share': 'Paylaşım',\n  'storages.fields.domain': 'Etki alanı / çalışma grubu',\n  'storages.fieldHelp.disablePresign': 'Varsayılan olarak açık: yüklemeler ve herkese açık paylaşım bağlantılarındaki indirmeler filex üzerinden akar; kova endpoint\\'inin tarayıcıdan erişilebilir olması gerekmez (yalnız yerel ağdaki MinIO doğrudan çalışır). Yalnızca endpoint kullanıcıların tarayıcısından erişilebiliyorsa (AWS, herkese açık MinIO) ve tarayıcının kovayla doğrudan konuşmasını istiyorsanız kapatın - çok büyük dosyalarda daha hızlıdır, ama depo SDK\\'nın imzaladığı URL\\'leri kabul etmelidir (Ceph RGW / bazı Hetzner kurulumları SignatureDoesNotMatch döner).',\n  'storages.fieldHelp.endpoint': 'AWS S3 için boş bırakın. S3 uyumlu diğer tüm depolar kendi endpoint\\'ini ister.',\n  'storages.fieldHelp.hostKey': 'authorized_keys / known_hosts satır biçiminde tek bir açık anahtar.',\n  'storages.fieldHelp.insecureSkipHostKey': 'Her sunucu anahtarını kabul eder. Yalnızca geçici sunucular için.',\n  'storages.fieldHelp.keyPath': 'Sunucudaki anahtar dosyasının yolu; depo başlarken okunur. PEM alanı boşken kullanılır.',\n  'storages.fieldHelp.knownHosts': 'Katı sunucu anahtarı denetimi için OpenSSH known_hosts yolu. Varsayılan, ~/.filex/known_hosts içinde ilk bağlantıda güven.',\n  'storages.fieldHelp.passive': 'Kapatmak aktif moda geçirir; bu, sunucunun bu makineye geri bağlanmasını gerektirir.',\n  'storages.fieldHelp.path': 'Sunucudaki dizin. Yoksa oluşturulur; filex asla / dizinini mount etmez.',\n  'storages.fieldHelp.pathStyle': 'AWS dışındaki tüm depolarda açık olmalı. Endpoint girildiyse ve bu alana hiç dokunulmadıysa kendiliğinden açılır.',\n  'storages.fieldHelp.prefix': 'Kova içindeki alt klasör. Zorunlu: filex kova kökünün sahipliğini asla almaz.',\n  'storages.fieldHelp.region': 'Boş bırakılırsa \"auto\" kullanılır.',\n  'storages.fieldHelp.root': 'Arka uçtaki alt klasör. Zorunlu: filex hesabın kökünü asla mount etmez.',\n  'storages.fieldHelp.sftpAuth': 'Parola ya da özel anahtardan biri zorunludur.',\n  'storages.fieldHelp.tls': 'Düz FTP kimlik bilgilerini açık metin gönderir - sunucu destekliyorsa açın.',\n  'storages.fields.accessKey': 'Access key',\n  'storages.fields.basePath': 'Temel yol',\n  'storages.fields.bucket': 'Kova',\n  'storages.fields.disablePresign': 'Aktarımları filex üzerinden geçir',\n  'storages.fields.endpoint': 'Endpoint',\n  'storages.fields.host': 'Sunucu',\n  'storages.fields.hostKey': 'Sabitlenmiş sunucu anahtarı',\n  'storages.fields.insecureSkipHostKey': 'Sunucu anahtarı doğrulamasını atla (güvensiz)',\n  'storages.fields.keyPath': 'Özel anahtar dosyası',\n  'storages.fields.knownHosts': 'known_hosts dosyası',\n  'storages.fields.name': 'Görünen ad',\n  'storages.fields.namePlaceholder': 'Kişisel fotoğraflar',\n  'storages.fields.passive': 'Pasif mod (PASV)',\n  'storages.fields.password': 'Parola',\n  'storages.fields.path': 'Dizin yolu',\n  'storages.fields.pathStyle': 'Path-style URL kullan (Hetzner, MinIO)',\n  'storages.fields.port': 'Port',\n  'storages.fields.prefix': 'Önek (prefix)',\n  'storages.fields.privateKey': 'Özel anahtar (PEM)',\n  'storages.fields.rbac': 'Öğe bazlı erişim denetimi (RBAC)',\n  'storages.fields.rbacHint': 'Açıkken yönetici olmayanlar yalnızca kendilerine yetki verilen dosya ve klasörleri görür (Klasör erişimi sayfasında listelenir). Kapalıyken herkes depoyu rolüne göre açar.',\n  'storages.fields.readOnly': 'Salt okunur mount',\n  'storages.fields.region': 'Bölge',\n  'storages.fields.root': 'Temel yol',\n  'storages.fields.secretKey': 'Secret key',\n  'storages.fields.tls': 'FTPS (açık AUTH TLS)',\n  'storages.fields.url': 'Temel URL',\n  'storages.fields.user': 'Kullanıcı',\n  'storages.fields.s3AttemptTimeout': 'Deneme zaman aşımı (saniye)',\n  'storages.fields.s3MaxAttempts': 'İstek başına deneme sayısı',\n  'storages.fields.s3TotalTimeout': 'Vazgeçme süresi (saniye)',\n  'storages.fieldHelp.s3AttemptTimeout': 'Tek bir denemenin depodan bir yaşam belirtisi için bekleyebileceği süre: bağlanma, TLS el sıkışması, istek gönderildikten sonraki cevap ve cevabın her yeni parçası. İlerleyen bir aktarım, süresi ne olursa olsun hiçbir zaman kesilmez; deponun almayı bıraktığı bir yükleme 60 saniye sonra, bu değer daha uzunsa bu kadar sonra kesilir. Kopyalama ve yeniden adlandırma cevap için 10 dakikaya kadar bekler, çünkü depo bunları ancak kopya bittiğinde cevaplar.',\n  'storages.fieldHelp.s3MaxAttempts': 'Hata geçebilecek türdeyse bir isteğin toplamda kaç kez deneneceği: ağ hatası, zaman aşımı, 5xx cevabı, hız sınırlaması. 1 yeniden denemeyi kapatır. Bir ret (403, bulunmayan bir kova, çözümlenmeyen bir sunucu adı) hiçbir zaman yeniden denenmez.',\n  'storages.fieldHelp.s3TotalTimeout': 'İlk denemeden itibaren bu kadar saniye içinde bitemeyecek yeni bir deneme başlatılmaz; böylece çalışmayan bir depoya yükleme ya da listeleme, kesintiyi bu süre içinde bildirir. Sürmekte olan bir aktarım kesilmez. Zaman aşımına uğrayan bir istek ancak bu değer deneme zaman aşımının en az iki katıysa yeniden denenir.',\n  'storages.fields.attemptTimeout': 'Deneme zaman aşımı (saniye)',\n  'storages.fields.maxAttempts': 'İstek başına deneme sayısı',\n  'storages.fields.totalTimeout': 'Vazgeçme süresi (saniye)',\n  'storages.fieldHelp.attemptTimeout': 'Tek bir denemenin sunucudan bir yaşam belirtisi için bekleyebileceği süre: bağlanma, oturum açma, her isteğin cevabı ve bir aktarımın her yeni parçası. İlerleyen bir aktarım, süresi ne olursa olsun hiçbir zaman kesilmez; sunucunun almayı bıraktığı bir yükleme 60 saniye sonra, bu değer daha uzunsa bu kadar sonra kesilir.',\n  'storages.fieldHelp.webdavAttemptTimeout': 'Tek bir denemenin sunucudan bir yaşam belirtisi için bekleyebileceği süre: bağlanma, oturum açma, her isteğin cevabı ve bir aktarımın her yeni parçası. İlerleyen bir aktarım, süresi ne olursa olsun hiçbir zaman kesilmez; sunucunun almayı bıraktığı bir yükleme 60 saniye sonra, bu değer daha uzunsa bu kadar sonra kesilir. Kopyalama, taşıma ve silme cevap için 10 dakikaya kadar bekler, çünkü sunucu bunları ancak iş bittiğinde cevaplar.',\n  'storages.fieldHelp.maxAttempts': 'Hata geçebilecek türdeyse bir isteğin toplamda kaç kez deneneceği: bağlantı reddedilir ya da kopar, cevap zamanında gelmez, sunucu şu an hizmet veremediğini söyler (5xx). 1 yeniden denemeyi kapatır. Bir ret (yanlış parola, bulunmayan bir klasör, doğrulanamayan bir sertifika) hiçbir zaman yeniden denenmez; gönderilmeye başlamış bir yükleme de yeniden denenmez.',\n  'storages.fieldHelp.totalTimeout': 'İlk denemeden itibaren bu kadar saniye içinde bitemeyecek yeni bir deneme başlatılmaz; böylece çalışmayan bir sunucu bu süre içinde bildirilir. Sürmekte olan bir aktarım kesilmez. Zaman aşımına uğrayan bir istek ancak bu değer deneme zaman aşımının en az iki katıysa yeniden denenir.',\n\n\n  /* === gezinti:g1 - gezinti paneli (SideNav) === */\n  'sidenav.title': 'Gezinti',\n  'sidenav.views': 'Görünümler',\n  'sidenav.storages': 'Depolar',\n  'sidenav.home': 'Ana sayfa',\n  'sidenav.myfiles': 'Dosyalarım',\n  'sidenav.recent': 'Son kullanılanlar',\n  'sidenav.starred': 'Yıldızlılar',\n  'sidenav.shared': 'Benimle paylaşılanlar',\n  // Üstteki satırın aynası ve tam altında durur: gelen ile giden.\n  'sidenav.myshares': 'Paylaştıklarım',\n  'sidenav.trash': 'Çöp kutusu',\n  'sidenav.collapse': 'Gezintiyi daralt',\n  'sidenav.expand': 'Gezintiyi genişlet',\n  'sidenav.close': 'Gezintiyi kapat',\n  // ⚠ aç/kapat çifti ÇEKMECENİN, daralt/genişlet çifti yerleşik PANELİN -\n  // ikisi birbirinin yerine kullanılamaz; bkz. en.ts'teki not ve Toolbar.vue\n  // içindeki `navToggleLabel`. 560px altında panel listenin üzerine gelen bir\n  // çekmecedir: raya inmez, hiç ekranda değildir; \"genişlet\" olmayan bir\n  // genişliği büyütmeyi vaat ederdi.\n  'sidenav.open': 'Gezintiyi aç',\n  'sidenav.storage.shared': 'Paylaşılan',\n  'sidenav.storage.readOnly': 'Salt okunur',\n  // #57 - depo satırının sıralama menüsü (sağ tık, uzun basış, Shift+F10).\n  // \"Ada göre sırala\" bir mod değildir; kişinin elle düzeltmeye devam\n  // edebileceği bir sıra yazar. \"Varsayılan sırayı kullan\" kişinin kendi\n  // sırasını bırakır: panel yöneticinin sırasına (yoksa sunucununkine) döner.\n  'sidenav.storage.moveUp': 'Yukarı taşı',\n  'sidenav.storage.moveDown': 'Aşağı taşı',\n  'sidenav.storage.sortName': 'Ada göre sırala',\n  'sidenav.storage.sortName.done': 'Zaten ada göre sıralı',\n  'sidenav.storage.defaultOrder': 'Varsayılan sırayı kullan',\n  'sidenav.storage.defaultOrder.none': 'Zaten varsayılan sırada',\n  // ⚠ `toolbar.nav` KALDIRILDI, yerine bir şey konmadı - bkz. en.ts'teki not.\n  // Paneli daraltan tek denetimin etiketiydi; önce \"Gezinti\" (panelin adı,\n  // düğmenin ne yaptığını söylemiyor), sonra \"Gezintiyi göster/gizle\" (sabit\n  // geçici çözüm). Gerçek düzeltme yukarıdaki dört `sidenav.*` fiili:\n  // etiket `navOpen`'a bağlı, daraltacaksa \"daralt\", genişletecekse\n  // \"genişlet\" yazıyor.\n  'node.home': 'Ana sayfa',\n  'node.recent': 'Son kullanılanlar',\n  'node.starred': 'Yıldızlılar',\n  'node.shared': 'Benimle paylaşılanlar',\n  'empty.recent.title': 'Henüz hiçbir şey açılmadı',\n  'empty.recent.hint': 'Açtığınız dosyalar burada görünür',\n  'empty.starred.title': 'Henüz yıldızlı dosya yok',\n  'empty.starred.hint': 'Bir dosyayı yıldızlayın; burada bulursunuz',\n  'empty.shared.title': 'Sizinle henüz bir şey paylaşılmadı',\n  'empty.shared.hint': 'Başkalarının paylaştığı klasör ve dosyalar burada görünür',\n  /* etiket:t1 */\n  'sidenav.tags': 'Etiketler',\n  'sidenav.tags.empty': 'Henüz etiket yok - bir dosyaya sağ tıklayıp Etiketler’den ekleyebilirsiniz.',\n  'sidenav.tags.more': '{count} tane daha göster',\n  'sidenav.tags.less': 'Daha az göster',\n  'sidenav.tags.personal': 'Kişisel',\n  'sidenav.tags.team': 'Ekip',\n  'empty.tag.title': '“{tag}” etiketli hiçbir şey yok',\n  'empty.tag.hint': 'Bir dosyaya sağ tıklayıp Etiketler’i seçin; dosya burada görünür',\n  'sidenav.connections': 'Bağlantılar',\n  'sidenav.apps': 'Uygulamalar',\n  // #162 - mağaza ekranı: yöneticinin açtığı mağazaların kataloğu.\n  'sidenav.appstore': 'Uygulama mağazası',\n  'sidenav.connect': 'Nasıl bağlanılır',\n  'sidenav.apikeys': 'API anahtarları',\n  'overlay.close': 'Kapat',\n  'conn.tokens.scopes': 'İzinler',\n  'conn.tokens.root': 'Tek bir klasörle sınırla (isteğe bağlı)',\n  'conn.tokens.rootPlaceholder': 'depo://klasör',\n  'conn.tokens.expiry': 'Geçerlilik (gün)',\n  'conn.tokens.expiryNever': 'süresiz',\n  'conn.tokens.defaultName': 'API anahtarı {date}',\n  'conn.tokens.namePlaceholder': 'Ad - ör. yedekleme betiği',\n  'conn.tokens.capNote': 'Tavan kendi erişiminizdir - sahip olmadığınız bir izin reddedilir, verilmez.',\n  'conn.tokens.scopesRequired': 'En az bir izin seçin - hiçbir izni olmayan bir API anahtarı verilmez.',\n  'conn.tokens.comments': 'Yorumlar',\n  'conn.tokens.commentsRead': 'Okuma',\n  'conn.tokens.commentsRw': 'Okuma ve yazma',\n  'conn.tokens.commentsHint': 'Yorum eklemek ve silmek ayrı bir izindir - “write” bunu kapsamaz. Her API anahtarı yorumları okur.',\n  'conn.tokens.commentsToRw': 'Yorumlar: yazmaya izin ver',\n  'conn.tokens.commentsToRead': 'Yorumlar: yalnız okuma',\n  /* === /gezinti:g1 === */\n\n  /* === surucu:d1 - kabuk (GitHub #14); artık `uiProfile: 'drive'` ile\n     gelen bir seçenek değil, her profilde çizilir === */\n  'drive.new': 'Yeni',\n  'drive.new.upload': 'Dosya yükle',\n  'drive.new.folder': 'Yeni klasör',\n  'drive.new.request': 'Dosya iste',\n  'drive.new.document': 'Yeni belge',\n\n  /* === belge:n1 - \"Yeni belge\": + Yeni altındaki seçici ==================\n     Tür adları BURADA durmuyor. Her kutucuk sözcüklerini lib/fileIcons\n     `typeLabelFor`den okur - listedeki Tür sütununun okuduğu tablonun\n     aynısı - böylece \".docx\" iki yerde de aynı adla anılır ve yeni bir tür\n     için hiç dizge gerekmez. Aşağıda yalnız bu pencerenin kendi metni var. */\n  'newdoc.title': 'Yeni belge',\n  'newdoc.type.label': 'Belge türü',\n  'newdoc.group.document': 'Belgeler',\n  'newdoc.group.text': 'Metin ve kod',\n  'newdoc.group.diagram': 'Çizimler',\n  'newdoc.group.app': 'Uygulamalar',\n  /* ⚠ Her servisin tek adı, kendi projesinin kullandığı ad: draw.io\n     (\"drawio\" ya da \"diagrams.net\" değil) ve ONLYOFFICE. */\n  'newdoc.withheld.onlyoffice': 'Ofis belgeleri için bir belge sunucusu (ONLYOFFICE) gerekir; burada kurulu değil.',\n  'newdoc.withheld.drawio': 'Çizimler için draw.io gerekir; burada kurulu değil.',\n  'newdoc.withheld_admin': 'Yönetim panelinde Dış servisler altından kurabilirsiniz.',\n  'newdoc.empty.title': 'Kullanılabilir belge türü yok',\n  'newdoc.empty.body': 'Bu sunucu, bu uygulamanın oluşturabileceği bir tür sunmadı.',\n  'newdoc.empty.blocked': 'Bu sunucunun oluşturabildiği her tür, burada tanımlı olmayan bir düzenleyici servisine bağlı.',\n  'newdoc.name': 'Ad',\n  'newdoc.name.placeholder': 'Dosya adı, ör. notlar.txt ya da LICENSE',\n  'newdoc.untitled': 'Adsız',\n  'newdoc.err.slash': 'Ad eğik çizgi içeremez.',\n  'newdoc.err.exists': '{name} burada zaten var. Başka bir ad seçin.',\n  'newdoc.err.bare_ext': 'Dosyaya yalnız bir uzantı değil, bir ad verin.',\n  'newdoc.err.ext_needs_type': '.{ext} dosyası kendi türüyle oluşturulmalı - boş bir dosya açılmaz. O türü ya da başka bir uzantıyı seçin.',\n  'newdoc.hint.ext_added': 'Bu tür uzantısını korur; dosya {name} adıyla oluşturulacak.',\n  // Drafts (issue #71): a new document is a draft until its first save.\n  'sidenav.drafts': 'Taslaklar',\n  'sidenav.drafts.count': '{n} taslak',\n  'sidenav.drafts.count_one': '{n} taslak',\n  'node.drafts': 'Taslaklar',\n  'empty.drafts.title': 'Taslak yok',\n  'empty.drafts.hint': 'Yeni bir belge, ait olduğu yere kaydedilene kadar burada bekler.',\n  'drafts.lead': 'Henüz kaydedilmemiş yeni belgeler. Bunları yalnızca siz görebilirsiniz.',\n  'drafts.count_of': '{n} / {limit} taslak',\n  'drafts.col.target': 'Kaydedileceği yer',\n  'drafts.col.storage': 'Depo',\n  'drafts.action.save': 'Diske kaydet',\n  'drafts.open_hint': '{name} dosyasını aç',\n  'drafts.no_match': 'Filtreye uyan taslak yok.',\n  'draft.badge': 'Taslak',\n  'draft.bar.target': '{folder} konumuna kaydedilecek',\n  'draft.save': 'Kaydet',\n  'draft.saved_to': '{name}, {folder} konumuna kaydedildi.',\n  'draft.discarded': '{name} çöp kutusuna taşındı.',\n  'draft.kept': 'Taslaklarda tutuluyor',\n  'draft.editing': 'Düzenleniyor…',\n  'draft.close.title': 'Bu taslak kapatılsın mı?',\n  'draft.close.body': '{name}, {folder} için bir taslak ve henüz oraya kaydedilmedi.',\n  'draft.close.hint': 'Tutulan taslak Taslaklar’da bekler. Çöpe at, taslağı çöp kutusuna taşır.',\n  'draft.close.save': 'Diske kaydet',\n  'draft.close.keep': 'Taslaklarda tut',\n  'draft.close.discard': 'Çöpe at',\n  'outside.title': 'Bu dosya dışarıda değişti',\n  'outside.body': '{name} burada açıkken başka bir yerde değiştirildi ve bu düzenleyicide de değişiklikler var. Hangi sürüm kalsın?',\n  'outside.theirs': 'Dışarıdakini koru',\n  'outside.theirs_hint': 'burada yapılan değişiklikler atılır, dışarıdaki sürüm yüklenir.',\n  'outside.mine': 'Benimkini yaz',\n  'outside.mine_hint': 'kaydedildiğinde sizin sürümünüz dışarıdakinin üstüne yazılır.',\n  'outside.both': 'İkisini de tut',\n  'outside.both_hint': 'dışarıdaki sürüm yerinde kalır, sizinki yanına ayrı bir kopya olarak kaydedilir (ad.filex-conflict-zaman).',\n  'outside.hint': 'Siz seçene kadar hiçbir sürümün üstüne yazılmaz.',\n  'outside.pending': 'Bu dosya dışarıda değişti. Hangi sürümün kalacağını seçene kadar hiçbir sürümün üstüne yazılmaz.',\n  'outside.choose': 'Seç…',\n  'outside.note.reloaded': 'Dosya dışarıda güncellendi, yeni sürüm yüklendi.',\n  'outside.note.theirs': 'Dışarıdaki sürüm yüklendi; burada yapılan değişiklikler atıldı.',\n  'outside.note.mine': 'Sizin sürümünüz kaydedildiğinde dışarıdakinin üstüne yazılacak.',\n  'outside.note.both': 'Dışarıdaki sürüm yerinde kalıyor; sizinki kaydedildiğinde yanına ayrı bir kopya olarak yazılacak.',\n  'draft.taken.title': 'Bu adda bir dosya zaten var',\n  'draft.taken.body': '{folder} konumunda {name} adında bir dosya zaten var. Taslak {suggested} olarak kaydedilsin mi?',\n  'draft.taken.confirm': '{name} olarak kaydet',\n  'upload.taken.body': '{folder} konumunda {name} adında bir öğe zaten var ve kasa eski sürümleri saklamaz. {suggested} olarak yüklensin mi?',\n  'upload.taken.confirm': '{name} olarak yükle',\n  'newdoc.hint.draft': 'Taslak olarak açılır: siz kaydedene kadar klasörde hiçbir şey oluşturulmaz.',\n  'newdoc.err.draft_limit': 'Bu sunucunun izin verdiği kadar taslağınız var ({limit}). Önce Taslaklar’da bazılarını kaydedin ya da silin.',\n  'newdoc.err.draft_limit_any': 'Bu sunucunun izin verdiği sayıda taslağınız var. Önce Taslaklar’da bazılarını kaydedin ya da silin.',\n  'newdoc.open_drafts': 'Taslakları aç',\n  'newdoc.location': 'Konum',\n  'newdoc.location.none': 'Bir klasör seçin',\n  'newdoc.location.change': 'Değiştir',\n  'newdoc.location.noaccess': 'Bu klasöre kaydedemezsiniz.',\n  'newdoc.create': 'Oluştur',\n  'newdoc.creating': 'Oluşturuluyor…',\n  'newdoc.cancel': 'Vazgeç',\n  'drive.search.placeholder': '{scope} deposunda ara',\n  'drive.search.placeholder_all': 'Tüm depolarda ara',\n  'drive.search.hint_title': 'Her yerde ara ve komut çalıştır ({combo})',\n  'drive.storage.used': '{total} alanın {used} kadarı dolu',\n  'drive.storage.used_unlimited': '{used} kullanılıyor',\n  'drive.storage.used_partial': 'en az {used} kullanılıyor',\n  'drive.storage.label': 'Depolama',\n  /* === gorunum:v3-shell - Ana sayfa görünümü (kabuğun içindeki genel bakış)\n   * Bölüm başlıkları `sidenav.storages` / `sidenav.recent` / `sidenav.starred`,\n   * boş durumlar da `empty.recent.*` / `empty.starred.*` - bilerek: Ana\n   * sayfadaki \"Son kullanılanlar\" başlığı ile yanındaki panel satırı aynı\n   * şeydir, ikisine ayrı metin yazmak onları çeviri çeviri birbirinden\n   * ayırmanın yoludur. Aşağıda yalnızca başka hiçbir yerde olmayanlar var. */\n  'home.title': 'Ana sayfa',\n  'home.storages.empty': 'Henüz depo yok',\n  'home.storages.hint': 'Depo, filex’in okuyup yazdığı yerdir - depoları yönetici ekler.',\n  'drive.section.folders': 'Klasörler',\n  'drive.section.files': 'Dosyalar',\n  'filter.aria': 'Filtreler',\n  'filter.type': 'Tür',\n  'filter.type.any': 'Her tür',\n  'filter.type.folder': 'Klasörler',\n  'filter.type.document': 'Belgeler',\n  'filter.type.spreadsheet': 'Hesap tabloları',\n  'filter.type.presentation': 'Sunumlar',\n  'filter.type.pdf': 'PDF’ler',\n  'filter.type.image': 'Görseller',\n  'filter.type.video': 'Videolar',\n  'filter.type.audio': 'Ses dosyaları',\n  'filter.type.archive': 'Arşivler',\n  'filter.type.code': 'Kod',\n  'filter.modified': 'Değiştirilme',\n  'filter.modified.any': 'Her zaman',\n  'filter.modified.today': 'Bugün',\n  'filter.modified.7d': 'Son 7 gün',\n  'filter.modified.30d': 'Son 30 gün',\n  'filter.modified.year': 'Bu yıl',\n  'filter.size': 'Boyut',\n  'filter.size.any': 'Her boyut',\n  'filter.size.lt1': '1 MB altı',\n  'filter.size.1to10': '1 - 10 MB',\n  'filter.size.10to100': '10 - 100 MB',\n  'filter.size.gt100': '100 MB üstü',\n  /* surucu:d1-actions - filtre satırının sonundaki ⋮ menüsü. Yalnızca menünün\n     KENDİ adı yeni: içindeki her satır o eylemin zaten sahip olduğu metni\n     kullanır (`toolbar.new_folder`, `toolbar.upload`, `ctx.paste`,\n     `shortcuts.select_all`, `selection.clear`) - bir komutu yeniden adlandıran\n     menü, okuyucuya aynı şeyi iki kez öğretir. */\n  'filter.actions': 'Liste işlemleri',\n  'filter.clear': 'Filtreleri temizle',\n  'filter.empty.title': 'Bu filtrelere uyan bir şey yok',\n  'filter.empty.hint': 'Bir filtreyi kaldırın ya da yukarıdaki alandan her yerde arayın.',\n  'filter.count': '{total} öğeden {shown} tanesi',\n  'inspector.tab.details': 'Ayrıntılar',\n  'inspector.tab.activity': 'Etkinlik',\n  'inspector.people': 'Erişimi olan kişiler',\n  'inspector.people.you': 'Siz',\n  'inspector.people.inherited': 'üst klasörden',\n  'inspector.people.empty': 'Yalnızca siz ve aşağıdaki bağlantıya sahip olanlar.',\n  'inspector.people.manage': 'Erişimi yönet',\n  'inspector.link': 'Paylaşım bağlantısı',\n  'inspector.link.none': 'Paylaşılmadı',\n  'inspector.link.create': 'Bağlantı oluştur',\n  'inspector.link.copy': 'Bağlantıyı kopyala',\n  'inspector.activity.empty': 'Bu öğe için henüz etkinlik kaydı yok.',\n  'inspector.activity.hint': 'Sürümler dosya değiştikçe, yorumlar ise insanlar yazdıkça birikir.',\n  'inspector.activity.version': '{n}. sürüm kaydedildi',\n  'inspector.activity.comment': '{who} yorum yaptı',\n  'inspector.activity.select': 'Etkinliğini görmek için bir dosya ya da klasör seçin.',\n  /* === /surucu:d1 === */\n  /* === gorunum:v1-chrome - filtre satırındaki ad kutusu === */\n  'filter.find': 'Bu klasörde filtrele…',\n  /* surucu:d1-scope - satırların bir klasörün içeriği olmadığı yerlerde aynı\n     kutu. Neyi daralttığını söylemek zorunda: depo listesinde \"bu klasör\" hiçbir\n     şeyi adlandırmaz, Ana sayfada ise üç bloğu birden adlandırırdı. */\n  'filter.find.storages': 'Depolarda filtrele…',\n  'filter.find.home': 'Ana sayfada filtrele…',\n  /* === gorunum:v1-viewer - tam ekran görüntüleyicinin kendi çerçevesi === */\n  'viewer.share': 'Paylaş',\n  'viewer.nav_prev': 'Önceki dosya',\n  'viewer.nav_next': 'Sonraki dosya',\n  /* Üst çubuğun künye satırındaki sayaç: \"246,3 KB • 9 Eyl 2026 • 1 / 9\". */\n  'viewer.counter': '{i} / {n}',\n  'viewer.zoom_reset': 'Yakınlaştırmayı sıfırla',\n  'viewer.fullscreen': 'Tam ekran',\n  'viewer.exit_fullscreen': 'Tam ekrandan çık',\n  'viewer.md_placeholder': '# Markdown buraya…',\n  /* === gorunum:v1-selbar - filtre satırının yerini alan seçim çubuğu === */\n  'selection.count': '{n} seçildi',\n  'selection.clear': 'Seçimi temizle',\n  /* === gorunum:v1-preview - türün adı, kelimeyle =======================\n     Tür sütunu eskiden uzantıyı büyük harfle yazıyordu; artık bunları\n     yazıyor. Hangisinin seçileceğine `lib/fileIcons.ts` karar verir\n     (`typeLabelKey`) - bir türü adlandıran yalnız iki yer var: o tablo ve bu\n     liste. Eşleşmeyen her şey yine büyük harfli uzantıya düşer. `Klasör`\n     burada DEĞİL: o `node.folder`, grid kartının alt yazısı zaten onu basar. */\n  'ftype.typescript': 'TypeScript',\n  'ftype.javascript': 'JavaScript',\n  'ftype.vue': 'Vue bileşeni',\n  'ftype.python': 'Python',\n  'ftype.go': 'Go',\n  'ftype.rust': 'Rust',\n  'ftype.php': 'PHP',\n  'ftype.ruby': 'Ruby',\n  'ftype.java': 'Java',\n  'ftype.kotlin': 'Kotlin',\n  'ftype.swift': 'Swift',\n  'ftype.c': 'C kaynağı',\n  'ftype.cpp': 'C++ kaynağı',\n  'ftype.csharp': 'C# kaynağı',\n  'ftype.stylesheet': 'Stil dosyası',\n  'ftype.html': 'HTML belgesi',\n  'ftype.json': 'JSON verisi',\n  'ftype.yaml': 'YAML',\n  'ftype.xml': 'XML',\n  'ftype.toml': 'TOML',\n  'ftype.sql': 'SQL',\n  'ftype.shell': 'Kabuk betiği',\n  'ftype.powershell': 'PowerShell betiği',\n  'ftype.markdown': 'Markdown',\n  'ftype.plaintext': 'Düz metin',\n  'ftype.log': 'Günlük dosyası',\n  'ftype.config': 'Ayar dosyası',\n  'ftype.sheet': 'Hesap tablosu',\n  'ftype.drawio': 'draw.io diyagramı',\n  'ftype.figma': 'Figma tasarımı',\n  'ftype.design': 'Tasarım dosyası',\n  'ftype.image': 'Görsel',\n  'ftype.video': 'Video',\n  'ftype.audio': 'Ses',\n  'ftype.pdf': 'PDF belgesi',\n  'ftype.document': 'Belge',\n  'ftype.slides': 'Sunum',\n  'ftype.archive': 'Arşiv',\n  'ftype.code': 'Kod',\n  /* === gorunum:v1-advsearch - Gelişmiş arama penceresi ===================\n   * İki `filter.*` anahtarı kardeşlerinin yanında değil burada: paylaşılan\n   * birleşimlere pencerenin eklediği yeni üyeler (`modified: 'around'`,\n   * `size: 'range'`). Filtre satırı bunları hiç seçmez ama biri oraya\n   * ulaşırsa `chipLabel` ham anahtarı yazardı. */\n  'filter.modified.around': 'Bir tarihin çevresinde',\n  'filter.size.range': 'Özel aralık',\n\n  'advsearch.open': 'Gelişmiş arama',\n  'advsearch.title': 'Gelişmiş arama',\n  'advsearch.subtitle': 'Dosyaları ada, içeriğe, yola ya da etikete göre bulun.',\n  'advsearch.close': 'Kapat',\n  'advsearch.content.heading': 'İçerik araması',\n  'advsearch.viewall': 'Tüm sonuçları gör',\n  'advsearch.where.any_short': 'Her yerde',\n  'advsearch.where.here_short': 'Yalnız burada',\n  'advsearch.where.skip_short': 'Burayı atla',\n  'advsearch.server.legend': 'Sunucunun aradığı',\n  'advsearch.client.legend': 'Gelen sonuçları daralt',\n  'advsearch.query.label': 'Kelimeler',\n  'advsearch.query.placeholder': 'Adın bir parçası ya da dosyanın içindeki kelimeler',\n  'advsearch.scope.label': 'Nerede arasın',\n  'advsearch.scope.name': 'Ad ve yol',\n  'advsearch.scope.content': 'Dosya içeriği',\n  'advsearch.scope.all': 'İkisi de',\n  'advsearch.scope.hint':\n    'İçerik, dizinden aranır; dizin metin türü dosyaların ilk 200 KB’ını kapsar.',\n  'advsearch.people.name_only':\n    'Sahip, gelen satırlardan okunur; sahip bilgisi taşıyan satırları da yalnız ad araması döndürür.',\n  'advsearch.scope.name_only':\n    'Burada yalnız ad ve yol: içerik sonucu gezgine hangi depodan geldiği bilgisi olmadan ulaşır, bu yüzden içerik araması yalnız tek depolu kurulumlarda sunulur.',\n  'advsearch.tags.label': 'Etiketler',\n  'advsearch.tags.placeholder': 'fatura, üç aylık rapor',\n  'advsearch.tags.exclude': 'Şu etiketler hariç',\n  'advsearch.tags.exclude_placeholder': 'arşiv',\n  'advsearch.tags.hint':\n    'Virgülle ayırın. Etiket daraltır: birden çok etiket hepsini birden taşıyan dosyalar demektir, hiç kullanılmamış bir etiket ise hiçbir şey döndürmez. Bir ad, o adı taşıyan kişisel etiketinizi de ekibinizin etiketini de bulur.',\n  'advsearch.where.label': 'Klasör',\n  'advsearch.where.any': 'Bu deponun her yerinde',\n  'advsearch.where.here': 'Yalnız {folder} içinde',\n  'advsearch.where.skip': '{folder} dışındaki her yerde',\n  'advsearch.around.label': 'Şu kadar içinde',\n  'advsearch.around.date': 'Tarih ve saat',\n  'advsearch.around.h1': '1 saat',\n  'advsearch.around.d1': '1 gün',\n  'advsearch.around.w1': '1 hafta',\n  'advsearch.size.range_label': 'Şunun arasında',\n  'advsearch.size.from': 'En az',\n  'advsearch.size.to': 'En çok',\n  'advsearch.count.idle': 'Bir şeyler yazın ya da etiket seçin.',\n  'advsearch.count.counting': 'Sayılıyor…',\n  'advsearch.count.result': '{n} eşleşen öğe',\n  'advsearch.count.capped': 'Sonuçların ilk sayfasında {n} eşleşen öğe',\n  'advsearch.count.result_one': '{n} eşleşen öğe',\n  'advsearch.count.capped_one': 'Sonuçların ilk sayfasında {n} eşleşen öğe',\n  'advsearch.count.error': 'Sayım çalıştırılamadı.',\n  'advsearch.count.cost':\n    'Sayım bu aramayı çalıştırır. Tür, sahip, tarih, boyut ve klasör bulduğu sonuçları daraltır.',\n  'advsearch.wire': 'Bir dahaki sefere arama kutusuna şunu yazabilirsiniz:',\n  'advsearch.reset': 'Sıfırla',\n  'advsearch.cancel': 'Vazgeç',\n  'advsearch.submit': 'Ara',\n\n  /* === gorunum:v2-topbar - sayfanın üst barı kalktı; onun taşıdıklarını\n     artık gezginin kendi başlığı ve kırıntı satırı taşıyor. === */\n  'breadcrumb.subfolders': 'Alt klasörler',\n  'breadcrumb.subfolders.empty': 'Burada alt klasör yok',\n  'header.admin': 'Yönetim paneli',\n  'header.settings': 'Ayarlar',\n  'header.signout': 'Oturumu kapat',\n  'ai.assistant': 'AI asistanı',\n  'ai.soon': 'Yakında',\n  'ai.assistant.soon': 'AI asistanı - yakında',\n\n  /* gorunum:v2-share - Paylaş / İzinler penceresinin kendi çerçevesi. İçindeki\n     denetimler eski metinlerini koruyor; buradakiler yeni kabuk: başlık, tek\n     anahtar, \"şu anda kim açabilir\" cümlesi ve her şeyin katlandığı üç adlı\n     bölüm. */\n  'access.title': '\"{name}\" paylaşımı',\n  'access.close': 'Kapat',\n  'access.done': 'Bitti',\n  'access.copy': 'Kopyala',\n  'access.copied': 'Kopyalandı',\n  'access.link.switch': 'Bağlantı paylaşımı',\n  'access.who.private': 'Yalnızca erişimi olan kişiler açabilir.',\n  'access.who.link': 'Bağlantıyı bilen herkes açabilir.',\n  'access.who.pin': \"Bağlantıyı ve PIN'i bilen herkes açabilir.\",\n  'access.who.existing': 'Bağlantı paylaşımı açık - {n} bağlantı var.',\n  'access.who.existing_one': 'Bağlantı paylaşımı açık - {n} bağlantı var.',\n  'access.section.link': 'Bağlantı seçenekleri',\n  'access.section.people': 'Erişimi olanlar',\n  'access.section.drop': 'Dosya iste',\n  'access.sum.pin_on': 'PIN var',\n  'access.sum.pin_off': 'PIN yok',\n  'access.sum.people': '{n} kişi',\n  'access.sum.people_one': '{n} kişi',\n  'access.sum.people_none': 'Henüz kimse yok',\n  'access.sum.groups': '{n} grup',\n  'access.sum.groups_one': '{n} grup',\n  'access.sum.drop': '{n} yükleme bağlantısı',\n  'access.sum.drop_one': '{n} yükleme bağlantısı',\n  'access.sum.drop_none': 'Yükleme bağlantısı yok',\n  /* Sahiplik - Sahibi sütunu ve Kişiler çipi. \"Sistem\", filex üzerinden kimsenin\n     koymadığı satırın dürüst karşılığıdır (tarayıcı buldu ya da doğrudan kovaya\n     yazıldı); boşluk değil, gerçek bir cevaptır. */\n  'col.owner': 'Sahibi',\n  'owner.you': 'Siz',\n  'owner.system': 'Sistem',\n  'owner.unknown': 'Bilinmiyor',\n  'owner.external': 'Yükleme bağlantısıyla geldi',\n  'owner.last_actor': 'Son değiştiren: {who}',\n  'filter.people': 'Sahibi',\n  'filter.people.any': 'Herkes',\n  'filter.people.me': 'Siz',\n  'filter.people.system': 'Sistem',\n  'filter.people.someone': 'Başka biri',\n  /* surucu:d1-sort - filtre satırının sağ ucundaki sıralama denetimi. Dört\n     ölçütün adı `col.*`: menü, liste görünümünün sütun başlıklarındaki\n     sözcüklerin aynısını sunar - tek bir sıralamayı süren iki denetim onu\n     farklı adlarla anamaz. */\n  'sort.by': 'Sıralama ölçütü',\n  'sort.asc': 'Artan',\n  'sort.desc': 'Azalan',\n  /* Bir ARAMA SONUCUNUN sırası. Beşinci bir sıralama ölçütü değildir -\n     ekrandaki satırları sunucu sıraladığında denetim, ölçüt adı yerine bunu\n     yazar; böylece yapmadığı bir sıralamayı üstlenmez. `_why` denetimin neden\n     kapalı olduğudur: bakımcı, denetimin sessizce işlevsizleşmesini değil\n     nedeninin yazılmasını istedi. */\n  'sort.relevance': 'Alaka',\n  'sort.relevance_why':\n    'Arama sonuçları eşleşme yakınlığına göre listelenir. Seçtiğiniz sıralama, aramadan çıkınca geri gelir.',\n  /* === tablo:t1 - tablonun kendi yapılandırması ==========================\n     v0.43'ten beri bir klasörün görünüşüne dair her şey - görünüm, sıralama VE\n     sütunlar - değiştirildiği klasöre aittir; kimsenin değiştirmediği klasör\n     kişinin varsayılanıyla (ayarlarından), o yoksa kurulumunkiyle açılır.\n     `folder_hint` bu kuralı tek cümlede, tam da ona şaşıracak kişinin\n     okuyabileceği yerde söyler. */\n  'col.location': 'Konum',\n  'col.deleted': 'Silinme',\n  'col.deleted_from': 'Silindiği yer',\n  'col.deleted_by': 'Silen',\n  'col.remaining': 'Kalan süre',\n  'cols.menu': 'Sütun seçenekleri',\n  'cols.title': 'Sütunlar',\n  'cols.resize': '{col} sütununu yeniden boyutlandır',\n  'cols.move_left': '{col} sütununu sola taşı',\n  'cols.move_right': '{col} sütununu sağa taşı',\n  'cols.reset': 'Sütunları sıfırla',\n  'cols.folder_title': 'Klasör görünümü',\n  'cols.folder_hint':\n    'Burada yaptığınız değişiklik bu klasörde kalır. Hiç değiştirmediğiniz klasörler varsayılan görünümünüzle açılır (Ayarlar → Varsayılan klasör görünümü).',\n  'cols.forget_folder': 'Bu klasörün görünümünü unut',\n  'cols.apply_all': 'Bunu tüm klasörler için varsayılanım yap ({count} klasör hatırlanıyor)',\n  /* === tablo:t3 - TEK TABLO (components/DataTable.vue) ====================\n     Üründeki her tablo bunları konuşur; Türkçe bir sayfada sütun menüsü ya da\n     sayfalayıcı İngilizce kalmasın. */\n  'table.empty': 'Henüz burada bir şey yok',\n  'table.prev': 'Önceki sayfa',\n  'table.next': 'Sonraki sayfa',\n  'table.sort_paged':\n    'Bu liste sayfalara bölünmüş. Sıralama yalnızca ekrandaki sayfayı yeniden dizerdi, bu yüzden burada kapalı - listeyi arama ya da filtrelerle daraltın.',\n  /* === tablo:t1 - çöp kutusu bilgi şeridi ================================\n     ⚠ `retention` yalnızca kurulum bize sayıyı SÖYLEDİĞİNDE kullanılır\n     (GET /api/admin/protection). Diğer her durumda `retention_unknown` aynı\n     şeyi, doğrulayamadığımız bir süreyi taahhüt etmeden söyler: yanlış saklama\n     süresi yazan bir şerit, hiç şerit olmamasından kötüdür - insanlar ona\n     bakıp karar verir. */\n  'trash.retention': 'Çöp kutusundaki öğeler {days} gün sonra kalıcı olarak silinir.',\n  'trash.retention_one': 'Çöp kutusundaki öğeler {days} gün sonra kalıcı olarak silinir.',\n  'trash.retention_unknown':\n    'Çöp kutusundaki öğeler, yöneticinizin belirlediği saklama süresi dolunca kalıcı olarak silinir.',\n  'trash.empty_action': 'Çöp kutusunu boşalt',\n  'trash.empty_confirm_title': 'Çöp kutusu boşaltılsın mı?',\n  'trash.empty_counting': 'Çöp kutusundakiler sayılıyor…',\n  'trash.show_more': 'Daha fazla göster',\n  'trash.shown_of': '{total} öğenin {shown} tanesi gösteriliyor',\n  'trash.days_remaining': '{n} gün',\n  'trash.days_remaining_one': '{n} gün',\n  'trash.days_remaining_due': 'Silinmek üzere',\n  'trash.deleted_by_nobody': 'Kayıt yok: virüs taraması karantinaya almış ya da filex bunu tutmaya başlamadan önce silinmiş',\n  'empty.trash.hint': 'Sildiğiniz dosyalar önce buraya düşer, böylece geri alabilirsiniz.',\n\n  /* tasi:m1 - hedef klasör seçici (modals/DestinationPickerModal.vue) ve\n     üzerine kurulan iki seçim eylemi. */\n  'destpicker.title.move': 'Şuraya taşı',\n  'destpicker.title.copy': 'Şuraya kopyala',\n  'destpicker.title.choose': 'Klasör seç',\n  'destpicker.confirm.move': 'Buraya taşı',\n  'destpicker.confirm.copy': 'Buraya kopyala',\n  'destpicker.confirm.choose': 'Bu klasörü seç',\n  'destpicker.title.choose_file': 'Dosya seç',\n  'destpicker.confirm.choose_file': 'Bu dosyayı seç',\n  'destpicker.title.save': 'Şuraya kaydet',\n  'destpicker.confirm.save': 'Buraya kaydet',\n  'destpicker.pick_a_file': 'Listeden bir dosya seçin.',\n  'destpicker.empty_files': 'Bu klasör boş',\n  'destpicker.cancel': 'Vazgeç',\n  'destpicker.up': 'Bir üst klasör',\n  'destpicker.crumbs': 'Konum',\n  'destpicker.drives': 'Depolar',\n  'destpicker.loading': 'Yükleniyor…',\n  'destpicker.empty': 'Burada alt klasör yok',\n  'destpicker.unreadable': 'Bu klasör açılamıyor.',\n  'destpicker.readonly': 'Salt okunur',\n  'destpicker.readonly_here': 'Bu klasöre yazamazsınız.',\n  'destpicker.pick_a_drive': 'Bir klasör seçmek için önce bir depo açın.',\n  'destpicker.target': 'Hedef: {name}',\n  'destpicker.tag.blocked': 'Uygun değil',\n  'destpicker.blocked.self': 'Bir klasör kendi içine taşınamaz.',\n  'destpicker.blocked.descendant': 'Bir klasör kendi alt klasörlerinden birine taşınamaz.',\n  'destpicker.tag.vault': 'Kasa',\n  'destpicker.blocked.vault_in': 'Buradan kasaya bir şey konmaz: kasanın içinden yükleyin.',\n  'destpicker.blocked.vault_out': 'Kasadakiler yalnız o kasanın içinde taşınır. Dışarı almak için indirin.',\n\n  'ctx.move_to': 'Şuraya taşı…',\n  'ctx.copy_to': 'Şuraya kopyala…',\n  'ctx.access.one_only': 'Paylaşım aynı anda tek öğe için çalışır.',\n\n  'toast.archive.preparing': 'Arşiv hazırlanıyor…',\n  'toast.archive.started': '{name} indiriliyor ({count} dosya)',\n  'toast.archive.started_one': '{name} indiriliyor ({count} dosya)',\n  'toast.archive.empty': 'İndirilecek bir şey yok - seçimde okunabilir dosya bulunmuyor.',\n  'toast.moved_to': '{name} klasörüne taşıma kuyruğa alındı',\n  'toast.copied_to': '{name} klasörüne kopyalama kuyruğa alındı',\n  'toast.already_there': 'Seçilen öğeler zaten {name} içinde - hiçbir şey gönderilmedi',\n\n  /* ── dil:paket - bkz. en.ts */\n  'ctx.tags_menu': 'Etiketler…',\n  'toast.node_id_copied': 'Node id {id} kopyalandı',\n  'toast.read_only_here': 'Burada yazma yetkiniz yok',\n  'recents.title': 'Son açılanlar',\n  'recents.refresh': 'Yenile',\n  'recents.empty': 'Henüz bir şey yok.',\n  'recents.loading': 'Yükleniyor…',\n  'recents.close': 'Kapat',\n  'tags.title': 'Etiketler',\n  'tags.close': 'Kapat',\n  'share.ttl.never': 'Bu bağlantının süresi yoktur.',\n  'share.ttl.until': 'Bu bağlantı {when} tarihine kadar geçerli.',\n  'share.ttl.ceiling': 'Bağlantılar en fazla {days} gün geçerli olabilir (sunucu ayarı).',\n  'share.ttl.ceiling_one': 'Bağlantılar en fazla {days} gün geçerli olabilir (sunucu ayarı).',\n  /* ── dil:paket - paylaşım / erişim penceresi (bkz. en.ts) */\n  'access.ui.level_viewer': 'Görüntüleyen',\n  'access.ui.level_viewer_desc': 'görüntüle + indir',\n  'access.ui.level_editor': 'Düzenleyen',\n  'access.ui.level_editor_desc': 'oku + yaz + sil',\n  'access.ui.level_owner': 'Sahip',\n  'access.ui.level_owner_desc': 'düzenle + izin yönet',\n  'access.ui.never': 'Süresiz',\n  'access.ui.days': '{days} gün',\n  'access.ui.days_one': '{days} gün',\n  'access.ui.unlimited': 'Sınırsız',\n  'access.ui.downloads': '{count} indirme',\n  'access.ui.downloads_one': '{count} indirme',\n  'access.ui.inherited_from': 'Üst klasörden gelir',\n  'access.ui.access_granted': 'Yetki verildi.',\n  'access.ui.enter_a_valid_email': 'Geçerli bir e-posta girin.',\n  'access.ui.recipient_lang': 'Alıcının dili',\n  'access.ui.recipient_lang_server': 'Sunucunun dili',\n  'access.ui.user_created_invite_emailed': 'Kullanıcı açıldı, davet e-postası gönderildi.',\n  'access.ui.user_created_share_the_temp_password': 'Kullanıcı açıldı. Geçici parolayı iletin.',\n  'access.ui.server_limit_applied': '(sunucu sınırı uygulandı)',\n  'access.ui.protect_with_a_pin': 'PIN ile koru',\n  'access.ui.expiry': 'Süre',\n  'access.ui.download_limit': 'İndirme limiti',\n  'access.ui.create_link': 'Bağlantı oluştur',\n  'access.ui.replace_link': 'Bağlantıyı bu ayarlarla yenile',\n  'access.ui.replace_link_hint': 'Adres değişir: şu anki bağlantı çalışmayı bırakır.',\n  'access.ui.create_then_send': 'Bir bağlantı oluşturun, ardından {email} adresine gönderin.',\n  'access.ui.command_line': 'Komut satırı',\n  'access.ui.share': 'Paylaş',\n  'access.ui.existing_links': 'Mevcut bağlantılar',\n  'access.ui.rbac_off_here': 'Bu depoda öğe bazlı erişim denetimi kapalı - herkes depoyu rolüne göre açar, burada eklenen kişiler bir şey değiştirmez. Yönetim panelinde Depolar altından (bu depo → Öğe bazlı erişim denetimi) açın.',\n  'access.ui.other_links': 'Diğer bağlantılar',\n  'access.ui.revoke': 'İptal',\n  'access.ui.loading': 'Yükleniyor…',\n  'access.ui.name_or_email': 'Ad ya da e-posta',\n  'access.ui.add': 'Ekle',\n  'access.ui.no_account_for_this_email_what_next': 'Bu e-postada hesap yok. Ne yapmak istersiniz?',\n  'access.ui.user': 'Kullanıcı',\n  'access.ui.viewer': 'Görüntüleyen',\n  'access.ui.create_user_grant': 'Kullanıcı oluştur + yetki ver',\n  'access.ui.just_send_a_share_link': 'Yalnızca paylaşım bağlantısı gönder →',\n  'access.ui.temp_password': 'Geçici parola:',\n  'access.ui.people_with_access': 'Erişimi olanlar',\n  'access.ui.group': 'Grup',\n  'access.ui.group_title': '“{name}” grubu - içindeki herkes',\n  'access.ui.group_owner_confirm': 'Sahip düzeyi, “{name}” grubundaki herkesin buraya kimin erişebileceğini yönetmesine izin verir - başka kişi ve gruplarla paylaşmak dâhil. Gruba Sahip verilsin mi?',\n  'access.ui.group_owner_give': 'Sahip yap',\n  'access.ui.not_shared_with_anyone_yet': 'Henüz kimseyle paylaşılmadı.',\n  'access.ui.remove': 'Kaldır',\n  'access.ui.a_public_link_that_lets_anyone_upload_fi': 'Bu klasöre herkesin dosya YÜKLEYEBİLECEĞİ herkese açık bir bağlantı. Yükleyenler klasördeki mevcut dosyaları göremez.',\n  'access.ui.hide_upload_limits': 'Yükleme sınırlarını gizle',\n  'access.ui.upload_limits': 'Yükleme sınırları',\n  'access.ui.max_files': 'En fazla dosya',\n  'access.ui.mb_file': 'Dosya başı MB',\n  'access.ui.allowed_types': 'İzinli türler',\n  'access.ui.all_e_g_pdf_jpg': 'hepsi (örn. pdf, jpg)',\n  'access.ui.ask_uploader_name': 'Yükleyenin adını sor',\n  'access.ui.emails_comma_separated': 'e-posta(lar) - virgülle ayırın',\n  'access.ui.send': 'Gönder',\n  'access.ui.mail_not_set_up': 'E-posta kurulu değil - yönetim panelinde Ayarlar altından (E-posta / SMTP) kurun.',\n  /* ── wiring:e2 fxe - tek şifreli dosyalar (.fxe), akışlı indirmeler ── */\n  'e2e.fxe.type': 'Şifreli dosya',\n  'e2e.fxe.ctx_encrypt': 'E2EE ile şifrele…',\n  'e2e.fxe.ctx_download_raw': 'Şifreli dosyayı indir',\n  'e2e.fxe.ctx_password': 'Parolayı değiştir…',\n  'e2e.fxe.ctx_remove': 'Şifrelemeyi kaldır…',\n  'e2e.fxe.encrypt_title': 'Bu dosyayı şifrele',\n  'e2e.fxe.encrypt_lead':\n    '“{name}” bu tarayıcıda, kendine ait bir parolayla şifrelenir. Sunucu yalnızca şifreli veriyi saklar. Dosyayı parola ya da kurtarma anahtarı açar - burada ya da çevrimdışı olarak filex decrypt ile.',\n  'e2e.fxe.pw_label': 'Dosya parolası',\n  'e2e.fxe.hide_label': 'Dosya adını da gizle',\n  'e2e.fxe.hide_on_hint':\n    '“{stored}” olarak saklanır: sunucu ne adı ne de türü görür. Gerçek ad dosyanın içinde mühürlüdür; dosyayı burada açınca görünür.',\n  'e2e.fxe.hide_off_hint': '“{stored}” olarak saklanır: ad sunucu tarafından okunabilir kalır, içerik kalmaz.',\n  'e2e.fxe.seen_title': 'Sunucunun zaten gördükleri',\n  'e2e.fxe.seen_lead': 'Bu dosya şimdiye kadar şifresiz saklandı ve şifrelemek bunu geri almaz:',\n  'e2e.fxe.seen_trash':\n    'Asıl dosya çöp kutusuna gider ve çöp kutusunun saklama süresi dolana ya da bir yönetici boşaltana kadar orada kalır. Kalıcı olarak kendiniz silemezsiniz.',\n  'e2e.fxe.seen_versions': 'Önceki sürümleri sürüm geçmişinde kalır; onları yalnızca bir yönetici silebilir.',\n  'e2e.fxe.seen_thumb':\n    'Ondan üretilmiş bir küçük resim, asıl dosya kalıcı olarak silinene kadar sunucuda kalır. Arama dizinindeki kaydı, dosya çöp kutusuna gidince kaldırılır.',\n  'e2e.fxe.seen_backups': 'Bundan önce alınmış yedekler, kopyalar ve indirmeler onu hâlâ içerir.',\n  'e2e.fxe.warn_body':\n    'Bu dosya yalnızca bu parolayla ya da şifrelemeden sonra bir kez gösterilen kurtarma anahtarıyla açılır. filex ikisini de saklamaz. İkisini de kaybederseniz içerik kalıcı olarak kaybolur.',\n  'e2e.fxe.escrow_body':\n    'Bu kurulumda anahtar emaneti açık: işletmecisi, bu dosyayı parolanız olmadan açan bir anahtara sahip.',\n  'e2e.fxe.encrypt_submit': 'Şifrele',\n  'e2e.fxe.encrypt_busy': 'Şifreleniyor ve yükleniyor… %{percent}',\n  'e2e.fxe.size_unknown': 'Bu dosyanın boyutu henüz bilinmiyor. Klasörü yenileyip tekrar deneyin.',\n  'e2e.fxe.bad_name':\n    'Bu ad şifreli bir dosyanın içine mühürlenemez (255 baytı aşıyor ya da eğik çizgi veya denetim karakteri içeriyor). Önce dosyayı yeniden adlandırın.',\n  'e2e.fxe.name_too_long':\n    'Ad, sonuna “.fxe” eklenemeyecek kadar uzun. “Dosya adını da gizle” kutusunu işaretleyin ya da önce dosyayı yeniden adlandırın.',\n  'e2e.fxe.encrypted': '“{name}” şifrelendi. Asıl dosya çöp kutusunda.',\n  'e2e.fxe.original_kept':\n    'Şifreli kopya kaydedildi, ancak “{name}” çöp kutusuna taşınamadı. Asıl dosyayı kendiniz silin.',\n  'e2e.fxe.upload_too_big':\n    'Bu sunucuda parçalı yükleme yok ve dosya bu tarayıcıdan tek parça gönderilemeyecek kadar büyük.',\n  'e2e.fxe.unlock_title_open': 'Şifreli dosyayı aç',\n  'e2e.fxe.unlock_title_download': 'Çözerek indir',\n  'e2e.fxe.unlock_title_remove': 'Şifrelemeyi kaldır',\n  'e2e.fxe.unlock_lead':\n    '“{name}” şifreli. Parolası burada, bu tarayıcıda denetlenir ve asla sunucuya gönderilmez.',\n  'e2e.fxe.known_note': 'Bu sekmede zaten açıldı - parola gerekmiyor.',\n  'e2e.fxe.use_password': 'Onun yerine parolayı kullan',\n  'e2e.fxe.remove_warn_title': 'Şifresiz içerik sunucuya geri döner',\n  'e2e.fxe.remove_warn_body':\n    'Dosya burada çözülür ve özgün adıyla şifresiz bir dosya olarak yüklenir: sunucu, yöneticileri, küçük resimler, arama ve yedekler onu yeniden okuyabilir. Şifreli dosya çöp kutusuna gider.',\n  'e2e.fxe.unlock_open': 'Aç',\n  'e2e.fxe.unlock_download': 'İndir',\n  'e2e.fxe.unlock_remove': 'Şifrelemeyi kaldır',\n  'e2e.fxe.unlock_busy': 'İşleniyor…',\n  'e2e.fxe.save_again':\n    'Kilit açıldı. Tarayıcınız, dosyanın nereye kaydedileceğini sormadan önce bir tıklama daha istiyor.',\n  'e2e.fxe.save_button': 'Kaydet…',\n  'e2e.fxe.progress': '%{percent} tamamlandı',\n  'e2e.fxe.wrong_password': 'Parola yanlış.',\n  'e2e.fxe.wrong_recovery': 'Bu kurtarma anahtarı bu dosyayı açmıyor.',\n  'e2e.fxe.damaged':\n    'Bu dosya bozuk ya da kurcalanmış (veya açıldığından beri değişmiş). Hiçbir şey kaydedilmedi.',\n  'e2e.fxe.not_readable': 'Bu bir filex şifreli dosyası değil ya da başlığı bozuk.',\n  'e2e.fxe.unsupported': 'Bu dosya daha yeni bir filex gerektiriyor (gereken: {features}).',\n  'e2e.fxe.downloaded': '“{name}” kaydedildi.',\n  'e2e.fxe.removed': 'Şifreleme kaldırıldı: “{name}” yeniden şifresiz bir dosya. Şifreli dosya çöp kutusunda.',\n  'e2e.fxe.password_title': 'Dosya parolasını değiştir',\n  'e2e.fxe.password_cost':\n    'Yalnızca dosyanın başlığı değişir: içerik bayt bayt aynen geri gönderilir ve kurtarma anahtarı çalışmaya devam eder.',\n  'e2e.fxe.password_old_copies':\n    'Bu dosyanın önceki bir sürümü - sürüm geçmişi, bir yedek, birinin indirdiği bir kopya - ESKİ parolayla açılmaya devam eder.',\n  'e2e.fxe.password_done': 'Parola değişti. Eski parola bu dosyayı artık açmıyor.',\n  'e2e.recovery.warn_body_file':\n    'Bu anahtara sahip olan herkes dosyayı okuyabilir. Onu paroladan ayrı bir yerde saklayın - parolanın yanında duran bir anahtar sizi unutmaktan korur, başkalarından değil.',\n  'e2e.recovery.lead_file':\n    'Bu anahtar dosyayı parolası olmadan açar. Yalnızca bir kez gösterilir - filex onu saklamaz ve bir daha gösteremez.',\n  'e2e.dl.ctx_encrypted_copy': 'Şifreli kopyayı indir',\n  'e2e.dl.too_big':\n    'Bu tarayıcı tek seferde en çok {limit} çözülmüş veri kaydedebilir, bu ise {size}. Chrome ya da Edge (doğrudan diske kaydeder), filex masaüstü uygulamasını kullanın ya da şifreli dosyayı indirip filex decrypt çalıştırın.',\n  'e2e.dl.click_again': 'Nereye kaydedileceğini seçmek için İndir’e bir kez daha tıklayın.',\n  'e2e.dl.zip_started': '“{name}” içine çözülerek yazılıyor…',\n  'e2e.dl.zip_done': '“{name}” kaydedildi - çözülmüş, gerçek adlarla.',\n  'e2e.dl.zip_done_plain': '“{name}” kaydedildi. İçindeki {n} dosya hiç şifrelenmemişti ve olduğu gibi eklendi.',\n  'e2e.dl.zip_done_plain_one': '“{name}” kaydedildi. İçindeki {n} dosya hiç şifrelenmemişti ve olduğu gibi eklendi.',\n  'e2e.dl.zip_damaged':\n    'Klasördeki bir dosya bozuk ya da kurcalanmış. İndirme durduruldu ve hiçbir şey kaydedilmedi.',\n  'e2e.upload.streaming_unsupported':\n    'Bu dosya 200 MB’tan büyük ve bu sunucuda onu parça parça şifreli göndermek için parçalı yükleme yok.',\n  /* wiring:e2 fxe escrow - emanet anahtarı tek bir dosyayı açar, sahibine haber gider */\n  'e2e.fxe.use_escrow': 'Emanet anahtarını kullan',\n  'e2e.fxe.escrow_warn_title': 'Dosyanın sahibine haber gidecek',\n  'e2e.fxe.escrow_warn_body':\n    'Emanet anahtarıyla açılan dosyanın sahibine, dosya açılmadan önce bildirim gönderilir. Yalnız yetkiniz olduğunda kullanın.',\n  'e2e.fxe.escrow_predates':\n    'Bu kurulumun emanet anahtarı var, ama bu dosya onsuz şifrelenmiş (emanet burada açılmadan önce), bu yüzden emanet anahtarı onu açmaz. Parolayı ya da kurtarma anahtarını kullanın.',\n  'e2e.fxe.escrow_other_key':\n    'Bu dosya BAŞKA bir kurulumun emanet anahtarına mühürlenmiş, bu yüzden bu kurulumun emanet anahtarı onu açmaz.',\n  'e2e.fxe.wrong_escrow': 'Bu emanet anahtarı bu dosyayı açmıyor.',\n  'e2e.fxe.escrow_notify_failed':\n    'Dosyanın sahibine bildirim gönderilemedi, bu yüzden dosya açılmadı. Emanet anahtarının kullanımı her zaman duyurulur.',\n  'e2e.fxe.escrow_done': 'Emanet anahtarıyla açıldı - dosya sahibine bildirildi',\n  /* wiring:e2 fxe purge - yönetici aslını kalıcı olarak siler */\n  'e2e.fxe.seen_trash_admin':\n    'Asıl dosya çöp kutusuna gider ve çöp kutusunun saklama süresi dolana kadar orada kalır - aşağıda kalıcı olarak silmediğiniz sürece.',\n  'e2e.fxe.seen_versions_admin': 'Önceki sürümleri sürüm geçmişinde kalır - aşağıda kalıcı olarak silmediğiniz sürece.',\n  'e2e.fxe.purge_label': 'Aslını kalıcı olarak sil (yönetici)',\n  'e2e.fxe.purge_hint':\n    'Şifreli kopya kaydedilir kaydedilmez önceki sürümleri ve çöp kutusundaki kaydı silinir; açık hâlinden bu sunucuda hiçbir şey kalmaz. Geri alınamaz. Daha önce alınmış yedeklere ve kopyalara ulaşılmaz.',\n  'e2e.fxe.purge_others': 'Bu dosya sizin değil, {owner} adlı kullanıcının. Onun aslını ve sürümlerini kalıcı olarak sil.',\n  'e2e.fxe.purge_others_unknown': 'Bu dosyanın kayıtlı bir sahibi yok - sizin değil. Aslını ve sürümlerini kalıcı olarak sil.',\n  'e2e.fxe.purge_others_required': 'Başkasının dosyasını kalıcı olarak sildiğinizi onaylayın.',\n  'e2e.fxe.purge_no_id': 'Bu dosya henüz katalogda değil, bu yüzden kalıcı olarak silinemez. Klasörü yenileyip tekrar deneyin.',\n  'e2e.fxe.purged': '“{name}” şifrelendi. Aslı, sürümleri ve çöp kutusundaki kaydı kalıcı olarak silindi.',\n  'e2e.fxe.purge_failed':\n    '“{name}” dosyasının şifreli kopyası kaydedildi, ama aslı kalıcı olarak silinemedi ({reason}). Çöp kutusundan ve sürüm geçmişinden silin.',\n  /* wiring:e2 fxe big - bu tarayıcının belleğine sığmayan çözülmüş indirme */\n  'e2e.big.title': 'Bu tarayıcıda çözülemeyecek kadar büyük',\n  'e2e.big.lead':\n    '“{name}” çözüldüğünde {size}. Bu tarayıcı indirmeyi belleğinde çözer ve en çok {limit} tutabilir, bu yüzden hiçbir şey indirilmedi.',\n  'e2e.big.lead_grew':\n    '“{name}” çözülürken {limit} sınırını aştı. Bu tarayıcı indirmeyi belleğinde çözer ve daha fazlasını tutamaz, bu yüzden hiçbir şey kaydedilmedi.',\n  'e2e.big.instead': 'Bunun yerine kendi bilgisayarınızda çözün:',\n  'e2e.big.step_file': 'Şifreli dosyayı olduğu gibi indirin (aşağıdaki düğme).',\n  'e2e.big.step_folder': 'Şifreli klasörü zip olarak indirin (aşağıdaki düğme) - klasörün anahtar dosyası da içindedir.',\n  'e2e.big.step_run': 'Kaydettiğiniz klasörde filex decrypt komutunu çalıştırıp parolayı girin:',\n  'e2e.big.copy': 'Kopyala',\n  'e2e.big.copied': 'Kopyalandı',\n  'e2e.big.other_ways': 'Chrome, Edge ve filex masaüstü uygulaması, boyutu ne olursa olsun doğrudan diske çözer.',\n  'e2e.big.close': 'Kapat',\n  'e2e.big.download_file': 'Şifreli dosyayı indir',\n  'e2e.big.download_folder': 'Şifreli klasörü indir (zip)',\n  /* /wiring:e2 fxe */\n  /* ── dil:paket - İngilizce sabit yazılmış erişilebilir adlar */\n  'breadcrumb.aria': 'Konum yolu',\n  'e2e.recovery_key_aria': 'Kurtarma anahtarı',\n  'modal.close': 'Kapat',\n  'modal.busy_close.keep': 'Devam etsin',\n  'modal.busy_close.confirm': 'Durdur ve kapat',\n  /* ── zil ve hesap menüsü (2026-09-27: masaüstü uygulamasının gezgini de\n     aynılarını çizsin diye yönetim uygulamasından buraya taşındı). ⚠ ORTAK\n     anahtarlar: yönetim uygulamasının kataloğunda her biri aynı adla, aynı\n     İngilizce ve Türkçeyle durur (web/tests/i18n/langPackCatalogue.test.ts),\n     bir dil paketi her birini iki ekran için bir kez çevirir. */\n  'notifications.bell': 'Bildirim çanı',\n  'notifications.unreadCount': '{n} okunmamış',\n  'notifications.title': 'Bildirimler',\n  'notifications.markAllRead': 'Tümünü okundu işaretle',\n  'notifications.markRead': 'Okundu işaretle',\n  'notifications.empty': 'Henüz bildirim yok',\n  'notifications.viewAll': 'Tüm bildirimleri gör',\n  'notifications.manageAdmin': 'Bildirim yönetimi',\n  'notifications.openTarget': 'Bildirimin konusunu aç',\n  'notifications.unreadOnly': 'Sadece okunmamış',\n  'notifications.pageOf': 'Sayfa {page} / {pages} · toplam {total}',\n  'notifications.severity.info': 'Bilgi',\n  'notifications.severity.warning': 'Uyarı',\n  'notifications.severity.error': 'Hata',\n  'notifications.severity.critical': 'Kritik',\n  'common.prev': 'Önceki',\n  'common.next': 'İleri',\n  'explore.account': 'Hesap',\n  /* ── kullanıcı ayarları penceresi (2026-09-27: masaüstü uygulaması aynı\n     pencereyi kendi içinde açsın diye yönetim uygulamasından buraya taşındı).\n     ⚠ ORTAK anahtarlar; ardından gelenler bu tablonun kendisinin (yönetim\n     kataloğu onları yalnız vue-i18n'in anladığı sözdizimiyle yazar). */\n  'common.cancel': \"İptal\",\n  'common.close': \"Kapat\",\n  'common.confirm': \"Onayla\",\n  'common.currentPassword': \"Mevcut parola\",\n  'common.email': \"E-posta\",\n  'common.loading': \"Yükleniyor…\",\n  'common.newPassword': \"Yeni parola\",\n  'common.remove': \"Kaldır\",\n  'common.save': \"Kaydet\",\n  'common.saving': \"Kaydediliyor…\",\n  'errors.generic': \"Bir şeyler ters gitti\",\n  'errors.validationFailed': \"Lütfen işaretli alanları kontrol edin\",\n  'install.desktopAllDownloads': \"Tüm indirmeler ve sürüm notları\",\n  'install.desktopSubtitle': \"Klasörleri bu bilgisayara eşitleyin, arka planda güncel kalsınlar. {platform} için mevcut.\",\n  'install.install': \"Kur\",\n  'install.menuInstructions': \"Tarayıcınızın menüsünü açıp “Uygulamayı yükle” ya da “Ana ekrana ekle”yi seçin.\",\n  'install.iosInstructions': \"Paylaş'a dokunun (iOS 26'da önce ⋯, sonra Paylaş), ardından “Ana Ekrana Ekle” ve Ekle'ye dokunun.\",\n  'nav.themeAuto': \"Otomatik\",\n  'nav.themeDark': \"Karanlık\",\n  'nav.themeLight': \"Aydınlık\",\n  'notifications.prefs.browser': \"Tarayıcı bildirimleri\",\n  'notifications.prefs.browserHint': \"Yeni bir şey geldiğinde sekmenin dışında bildirim göster. Bildirime tıklayınca konusu olan dosya, klasör ya da paylaşım açılır.\",\n  'notifications.prefs.desktopHandled': \"Masaüstü uygulaması bunları kendisi gösteriyor\",\n  'notifications.prefs.enableBrowser': \"Bildirimlere izin ver\",\n  'notifications.prefs.inApp': \"Uygulama içi çan\",\n  'notifications.prefs.inAppHint': \"Kapatırsanız çanınız boşalır. Hiçbir kayıt silinmez - yönetici tüm olayları görmeye devam eder.\",\n  'notifications.prefs.iosHomeScreen': \"iPhone ve iPad'de bildirimler tarayıcı sekmesinde değil, ana ekrana eklenmiş filex'te çalışır (iOS 16.4 ve sonrası).\",\n  'notifications.prefs.movedToSettings': \"Kendi bildirim ayarlarınız - zil, tarayıcı bildirimleri, hangi olaylar - kullanıcı ayarlarınızda.\",\n  'notifications.prefs.openSettings': \"Bildirim ayarlarımı aç\",\n  'notifications.prefs.permDefault': \"İzin henüz istenmedi\",\n  'notifications.prefs.permDenied': \"Bu tarayıcıda engellendi\",\n  'notifications.prefs.permDeniedHint': \"Tarayıcı ayarlarından bu siteye bildirim iznini yeniden verin.\",\n  'notifications.prefs.permGranted': \"Bu tarayıcıda izin verildi\",\n  'notifications.prefs.permUnsupported': \"Bu tarayıcı bildirim gösteremiyor\",\n  'notifications.prefs.push': \"Bu cihazda anlık bildirim\",\n  'notifications.prefs.pushAdded': \"Eklendi: {date}\",\n  'notifications.prefs.pushDevices': \"Anlık bildirim alan cihazlar\",\n  'notifications.prefs.pushDisabled': \"Sunucuda kapatılmış (FILEX_PUSH_ENABLED).\",\n  'notifications.prefs.pushFailed': \"Bu cihazda anlık bildirimler açılamadı.\",\n  'notifications.prefs.pushHint': \"Zilinizin size söyledikleri, filex kapalıyken de bu telefona ya da tarayıcıya ulaşır: aynı bildirimler, aynı anda.\",\n  'notifications.prefs.pushKeyUnreadable': \"Sunucunun anlık bildirim anahtarı artık açılamıyor (FILEX_SECRET_KEY değişmiş). Yönetim → Bildirimler sayfasında anahtarı yenileyin.\",\n  'notifications.prefs.pushNoSecretKey': \"Anlık bildirimler için sunucuda FILEX_SECRET_KEY tanımlı olmalı: bildirimleri imzalayan anahtar onunla şifrelenerek saklanır.\",\n  'notifications.prefs.pushOn': \"Bu cihazda açık\",\n  'notifications.prefs.pushRemove': \"Kaldır\",\n  'notifications.prefs.pushRemoveLabel': \"Kaldır: {device}\",\n  'notifications.prefs.pushTest': \"Deneme gönder\",\n  'notifications.prefs.pushTestNone': \"Deneme hiçbir cihaza ulaşmadı.\",\n  'notifications.prefs.pushTestSent': \"Deneme {count} cihaza gönderildi\",\n  'notifications.prefs.pushTestSent_one': \"Deneme {count} cihaza gönderildi\",\n  'notifications.prefs.pushThisDevice': \"Bu cihaz\",\n  'notifications.prefs.pushUnavailable': \"Bu sunucuda kullanılamıyor\",\n  'notifications.prefs.pushUnnamed': \"Bir cihaz\",\n  'notifications.prefs.pushUnsupported': \"Bu tarayıcı anlık bildirim alamıyor\",\n  'notifications.prefs.saved': \"Tercih kaydedildi\",\n  'notifications.prefs.title': \"Bildirimleriniz\",\n  'profile.avatar.change': \"Fotoğrafı değiştir\",\n  'profile.avatar.failed': \"Bu görsel işlenemedi - başka bir tane deneyin.\",\n  'profile.avatar.help': \"Adınızın yanında ve dosya yöneticisinin işbirliği çubuğunda görünür - hesabınızla açılan her istemcide. Otomatik olarak 160 piksele küçültülür.\",\n  'profile.avatar.label': \"Profil fotoğrafı\",\n  'profile.avatar.notImage': \"Lütfen bir görsel dosyası seçin.\",\n  'profile.locale': \"Dil\",\n  'profile.passwordChanged': \"Parola değiştirildi\",\n  'profile.saved': \"Profil kaydedildi\",\n  'profile.totp.code': \"Doğrulama kodu\",\n  'profile.totp.disable': \"2FA'yı kapat\",\n  'profile.totp.disabled': \"Pasif\",\n  'profile.totp.enable': \"2FA'yı aç\",\n  'profile.totp.enabled': \"Aktif\",\n  'profile.totp.recoveryHint': \"Bunları şimdi kaydedin - doğrulayıcınızı kaybederseniz her biri bir kez oturum açmanızı sağlar. Yalnızca bu sefer gösterilir.\",\n  'profile.totp.recoveryTitle': \"Kurtarma kodları\",\n  'profile.totp.scanHint': \"Bu QR kodu doğrulayıcı uygulamanızla tarayın, sonra 6 haneli kodu girin.\",\n  'profile.totp.title': \"İki adımlı doğrulama\",\n  'profile.username.label': \"Kullanıcı adı\",\n  'quota.title': \"Depolama kotası\",\n  'quota.tooltip': \"{used} / {limit} kullanıldı ({percent})\",\n  'quota.unlimitedTooltip': \"{used} kullanıldı · sınırsız\",\n  'userSettings.adminBadge': \"Yönetici\",\n  'userSettings.ai.body': \"Bu sürümde kullanıcıya özel asistan ayarı yok. filex'in sunduğu AI özellikleri tüm kurulum için yönetici tarafından yapılandırılır; bu yüzden burada sizin açıp kapatacağınız bir şey henüz bulunmuyor.\",\n  'userSettings.ai.soon': \"Yakında\",\n  'userSettings.demoReadOnly': \"Bu ortak bir demo hesabı; profili, parolası ve ikinci faktörü değiştirilemez.\",\n  'userSettings.footNote.ai': \"Bu sekmede kaydedilecek bir şey yok.\",\n  'userSettings.footNote.notifications': \"Değiştirdiğiniz anda kaydedilir.\",\n  'userSettings.footNote.preferences': \"Değiştirdiğiniz anda kaydedilir.\",\n  'userSettings.footNote.profile': \"Bu sekmedeki değişiklikler Kaydet'e bastığınızda kaydedilir.\",\n  'userSettings.footNote.security': \"Buradaki her işlem kendi başına uygulanır.\",\n  'userSettings.heading': \"Kullanıcı ayarları\",\n  'userSettings.headingSub': \"Profilinizi, tercihlerinizi ve güvenliğinizi yönetin.\",\n  'userSettings.notifications.adminAlerts': \"Yönetici uyarıları\",\n  'userSettings.notifications.adminAlertsHint': \"Güncellemeler, kopyalar, oturum açma sağlayıcıları, kiracı alan adları ve yöneticilere yönelik diğer uyarılar\",\n  'userSettings.notifications.digestHint': \"Acil olarak işaretlenen türler size hemen ulaşır. Diğerleri {minutes} dakika bekletilir ve klasör klasör tek bir özet olarak gelir.\",\n  'userSettings.notifications.digestOffHint': \"Her tür size hemen ulaşır. Bir türün Acil anahtarını kapatırsanız o tür, klasör klasör tek bir özet olarak gelir.\",\n  'userSettings.notifications.events.archive_created': \"Bir arşiv oluşturulduğunda\",\n  'userSettings.notifications.events.archive_extracted': \"Bir arşiv çıkarıldığında\",\n  'userSettings.notifications.events.comment_added': \"Biri bir dosyaya yorum yaptığında\",\n  'userSettings.notifications.events.drop_received': \"İstek bağlantısıyla bir dosya geldiğinde\",\n  'userSettings.notifications.events.e2e_escrow_used': \"Şifreli bir klasör emanet anahtarıyla açıldığında\",\n  'userSettings.notifications.events.e2e_password_changed': \"Şifreli klasörünüzün parolası değiştiğinde\",\n  'userSettings.notifications.events.e2e_request_created': \"Biri bir klasörü ya da dosyayı şifrelemek istediğinde\",\n  'userSettings.notifications.events.e2e_request_decided': \"Şifreleme isteğiniz yanıtlandığında\",\n  'userSettings.notifications.events.file_deleted': \"Bir dosya kalıcı olarak silindiğinde\",\n  'userSettings.notifications.events.file_infected': \"Bir dosyada virüs bulunduğunda\",\n  'userSettings.notifications.events.file_moved': \"Bir dosya taşındığında ya da adı değiştiğinde\",\n  'userSettings.notifications.events.file_trashed': \"Bir dosya çöp kutusuna taşındığında\",\n  'userSettings.notifications.events.file_updated': \"Bir dosya değiştiğinde\",\n  'userSettings.notifications.events.file_upload_failed': \"Bir yükleme tamamlanmadığında\",\n  'userSettings.notifications.events.file_uploaded': \"Yeni bir dosya geldiğinde\",\n  'userSettings.notifications.events.notification_digest': \"Acil olarak işaretlemediğim bildirimlerin özeti\",\n  'userSettings.notifications.events.plugin_notice': \"Kurulu bir uygulama size mesaj gönderdiğinde\",\n  'userSettings.notifications.events.share_created': \"Biri paylaşım bağlantısı oluşturduğunda\",\n  'userSettings.notifications.eventsHint': \"Birini kapatmak onu zilinizin dışında tutar. Hiçbir şey kaydedilmekten çıkmaz - yönetici her olayı görmeye devam eder.\",\n  'userSettings.notifications.eventsTitle': \"Nelerden haberdar olayım\",\n  'userSettings.notifications.urgent': \"Acil\",\n  'userSettings.notifications.urgentFor': \"Hemen bildir: {event}\",\n  'userSettings.open': \"Kullanıcı ayarları\",\n  'userSettings.prefs.appearance': \"Görünüm\",\n  'userSettings.prefs.compact': \"Sıkışık dosya listesi kullan\",\n  'userSettings.prefs.compactHint': \"Dosya gezgininde daha dar satırlar.\",\n  'userSettings.prefs.desktopApp': \"Masaüstü uygulaması\",\n  'userSettings.prefs.desktopAppHint': \"Uygulamanın köşesindeki hatırlatmayı kapattığınızda bir daha çıkmaz - indirmeler burada kalır.\",\n  'userSettings.prefs.folderView': \"Varsayılan klasör görünümü\",\n  'userSettings.prefs.folderViewHint': \"Hiç değiştirmediğiniz bir klasörün nasıl açılacağı. Değiştirdiğiniz klasörler kendi görünümünü korur - bu ayar onlara dokunmaz.\",\n  'userSettings.prefs.fvColumns': \"Varsayılan sütunlarınız özelleştirilmiş (“Bunu tüm klasörler için varsayılanım yap” ile ayarlandı).\",\n  'userSettings.prefs.fvColumnsReset': \"Sıfırla\",\n  'userSettings.prefs.fvDir': \"Yön\",\n  'userSettings.prefs.fvDir_asc': \"Artan\",\n  'userSettings.prefs.fvDir_desc': \"Azalan\",\n  'userSettings.prefs.fvForget': \"Hepsini unut\",\n  'userSettings.prefs.fvInherit': \"Sunucu varsayılanı ({value})\",\n  'userSettings.prefs.fvMode': \"Görünüm\",\n  'userSettings.prefs.fvSort': \"Sıralama\",\n  'userSettings.prefs.fvSort_modified': \"Değiştirilme\",\n  'userSettings.prefs.fvSort_name': \"Ad\",\n  'userSettings.prefs.fvSort_size': \"Boyut\",\n  'userSettings.prefs.fvSort_type': \"Tür\",\n  'userSettings.prefs.fvView_gallery': \"Galeri\",\n  'userSettings.prefs.fvView_grid': \"Izgara\",\n  'userSettings.prefs.fvView_list': \"Liste\",\n  'userSettings.prefs.installApp': \"Web uygulaması olarak kur\",\n  'userSettings.prefs.installAppLead': \"filex'i bu cihazın ana ekranına ekleyin: bir uygulama gibi kendi penceresinde açılır.\",\n  'userSettings.prefs.languageHint': \"Burada hemen uygulanır; bir sonraki tarayıcıda da açılsın diye hesabınıza kaydedilir.\",\n  'userSettings.prefs.mode': \"Aydınlık ya da karanlık\",\n  'userSettings.prefs.modeHint': \"Hangi sürümün çizileceği. Otomatik, işletim sisteminizi izler.\",\n  'userSettings.prefs.openTrigger': \"Dosyaları açma\",\n  'userSettings.prefs.openTriggerDouble': \"Çift tık\",\n  'userSettings.prefs.openTriggerHint': \"Farenin dosyayı nasıl açtığı. Dokunmatik ekranda tek dokunuş her zaman açar, kutucuk her zaman seçer.\",\n  'userSettings.prefs.openTriggerSingle': \"Tek tık\",\n  'userSettings.prefs.palette': \"Renk paleti\",\n  'userSettings.prefs.paletteHint': \"O sürümün hangi renklerden oluştuğu. Her paletin aydınlık ve karanlık bir sürümü vardır; bu ayarla üstteki ayar birlikte çalışır.\",\n  'userSettings.prefs.startPage': \"Açılış sayfası\",\n  'userSettings.prefs.startPageHint': \"Oturum açtığınızda ya da ana adrese geldiğinizde filex burayı açar. Doğrudan bir sayfanın bağlantısına tıkladığınızda yine o sayfaya gidersiniz.\",\n  'userSettings.prefs.startPage_admin': \"Yönetim paneli\",\n  'userSettings.prefs.startPage_files': \"Dosyalar\",\n  'userSettings.prefs.startPage_home': \"Ana sayfa\",\n  'userSettings.prefs.timezone': \"Saat dilimi\",\n  'userSettings.prefs.timezoneHint': \"Tarihler bir an olarak saklanır ve burada seçtiğiniz saatle gösterilir; böylece herkes aynı anı kendi saatiyle görür. Hesabınıza kaydedilir, başka bir tarayıcıda da geçerli olur.\",\n  'userSettings.prefs.timezoneNow': \"{zone} bölgesinde şu an: {time}\",\n  'userSettings.saveChanges': \"Değişiklikleri kaydet\",\n  'userSettings.security.passwordTitle': \"Parolayı değiştir\",\n  'userSettings.security.totpDisabled': \"İki adımlı doğrulama kapalı\",\n  'userSettings.security.totpEnabled': \"İki adımlı doğrulama açık\",\n  'userSettings.subtitle.ai': \"Burada henüz ayarlayabileceğiniz bir şey yok.\",\n  'userSettings.subtitle.notifications': \"Zilinize ve masaüstünüze neyin ulaşacağı.\",\n  'userSettings.subtitle.preferences': \"Uygulamanın cihazlarınızda nasıl göründüğü ve okunduğu.\",\n  'userSettings.subtitle.profile': \"Adınız, e-postanız ve fotoğrafınız - başkalarının gördüğü bilgiler.\",\n  'userSettings.subtitle.security': \"Parolanız ve ikinci faktörünüz.\",\n  'userSettings.tabs.ai': \"AI asistanı\",\n  'userSettings.tabs.notifications': \"Bildirimler\",\n  'userSettings.tabs.preferences': \"Tercihler\",\n  'userSettings.tabs.profile': \"Profil\",\n  'userSettings.tabs.security': \"Güvenlik\",\n  'userSettings.apps.title': \"Varsayılan uygulamalar\",\n  'userSettings.apps.lead': \"Bir dosyanın menüsünden seçin: Birlikte aç, Uygulama seç…, sonra \\\"Her zaman bu uygulamayla aç\\\" kutusunu işaretleyin. Yalnız yöneticinizin o tür için açık bıraktığı uygulamalar sunulur.\",\n  'userSettings.apps.empty': \"Henüz hiçbir dosya türü için uygulama seçmediniz: her dosya, yöneticinizin ilk sıraya koyduğu uygulamayla açılır.\",\n  'userSettings.apps.reset': \"Sıfırla\",\n  'userSettings.apps.resetAll': \"Tümünü sıfırla\",\n  'userSettings.apps.unavailable': \"Artık kullanılamıyor: siz yeniden seçene kadar {app} ile açılıyor.\",\n  'userSettings.apps.change': \"{ext} dosyalarını açan uygulama\",\n  'userSettings.title': \"Ayarlar\",\n  'users.fields.displayName': \"Görünen ad\",\n  'profile.username.helpText': \"Kullanıcı adınız. Oturum açarken bunu da e-postanızı da kullanabilirsiniz - bağlantı istemcileri (SFTP, FTP) için ise bu ad gerekir, çünkü oturum açtıkları addaki @ işareti onların ayar dosyalarında kaçış gerektirir.\",\n  'userSettings.prefs.fvKeptCount': \"{count} klasör kendi görünümünü koruyor.\",\n  'userSettings.prefs.fvKeptCount_one': \"{count} klasör kendi görünümünü koruyor.\",\n};\n","/**\n * appBase — the path prefix the filex web app is served under.\n *\n * filex can run under a sub-path behind a reverse proxy\n * (`https://example.com/filex/`, FILEX_BASE_PATH on the server). The web app\n * is built once and runs at the root and under any prefix: the server tells\n * the document which one it is in by adding\n *\n *     <meta name=\"filex-base\" content=\"/filex\">\n *\n * to the index.html it serves (backend/internal/api/spa_shell.go). At the\n * root there is no tag, and everything here answers `''` — the address the\n * app always used.\n *\n * ⚠⚠ The ONE reader of that tag. The admin/drive app, the explorer and every\n * default below ask here; a second reader is how one of them ends up still\n * talking to the host's root.\n *\n * ⚠ It is the base of the DOCUMENT, not of the API. An explorer embedded in\n * another application has no such tag (the host page is not filex), so its\n * defaults stay what they were and it keeps using the `apiBase` its host\n * configured. The desktop app loads its own pages and has none either.\n */\n\n/** The meta tag's name. Mirrors spa_shell.go. */\nexport const APP_BASE_META = 'filex-base';\n\n/**\n * What a base may look like: `/seg[/seg…]` with the URL's unreserved\n * characters, and no `.`/`..` segment. The same rule the server validates\n * FILEX_BASE_PATH with (backend/internal/basepath.Normalize), repeated here so\n * a tag that did not come from filex cannot aim the app somewhere else.\n */\nconst BASE_RE = /^(\\/[A-Za-z0-9_~.-]+)+$/;\n\n/** Reads the base from a document; `''` when it has none, or a bad one. */\nexport function readAppBase(doc?: Pick<Document, 'querySelector'> | null): string {\n  const d = doc ?? (typeof document !== 'undefined' ? document : null);\n  if (!d) return '';\n  let raw = '';\n  try {\n    raw = d.querySelector(`meta[name=\"${APP_BASE_META}\"]`)?.getAttribute('content')?.trim() ?? '';\n  } catch {\n    return '';\n  }\n  if (!raw || !BASE_RE.test(raw)) return '';\n  if (raw.split('/').some((seg) => seg === '.' || seg === '..')) return '';\n  return raw;\n}\n\n/** The base this document was served under: `''` at the root, else `/filex`. */\nexport function appBase(): string {\n  return readAppBase();\n}\n\n/**\n * An application path (`/files/edit`, `/api/files/archive/list`) as the\n * browser has to ask for it from this document: with the base in front.\n */\nexport function withAppBase(path: string): string {\n  return appBase() + path;\n}\n\n/**\n * A path relative to the SERVER ROOT, joined onto an API base, keeping the\n * base's own path.\n *\n * The server hands out some addresses relative to its root — a thumbnail's\n * `thumb_url`, a selection archive's `/z/<ticket>` — because it cannot know\n * where its reader sees it: the admin app at `/filex`, the desktop app at\n * `https://example.com/filex`, an embed through its host's proxy at\n * `https://host.example/files-proxy`. The reader knows, and its API base\n * (`apiBase`, the server root WITHOUT `/api`) is that answer.\n *\n * ⚠ Not `new URL(path, apiBase)`: a root-relative path resolved that way drops\n * the base's path, which is precisely the prefix a sub-path deployment or a\n * proxying host lives under.\n *\n * An absolute `path` is returned unchanged; an empty base leaves the path\n * relative to the page's own origin (same-origin at the root, as before).\n */\nexport function underApiBase(apiBase: string | null | undefined, path: string): string {\n  if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(path)) return path;\n  const base = String(apiBase ?? '').replace(/\\/+$/, '');\n  if (!base || !path.startsWith('/')) return path;\n  return base + path;\n}\n\n/**\n * The API root a module-level default talks to: the one its caller gave, else\n * this document's base path — `''` at the root, so an unconfigured caller\n * behaves exactly as before, and `/filex` for the admin app under a sub-path.\n *\n * ⚠ For the modules that fetch on their own at boot (account preferences,\n * the language list, the public branding) and are configured with no base by\n * the admin app: an unset base used to mean \"the host's root\".\n */\nexport function apiRootOr(base: string | null | undefined): string {\n  return String(base ?? appBase()).replace(/\\/+$/, '');\n}\n","/**\n * uiLocales — the language list is not a constant any more.\n *\n * filex ships English and Turkish. A third source is an app — a LANGUAGE\n * PACK — that carries a language for FILEX ITSELF (`manifest.ui_locales`):\n * the server lists it, the interface offers it (public shell included),\n * marks it with the app it came from, and drops it when the app is removed.\n *\n * ⚠⚠ TWO requests, not one. `GET /api/public/branding` LISTS the languages\n * apps add — code, app, right-to-left or not — and carries no strings;\n * `GET /api/public/ui-locales/{code}` is one language's strings, fetched the\n * first time something asks for that language's table (`localeTable`,\n * `ensureLocaleStrings`). A complete language is ~150 KB, and the branding\n * answer is read by every public page and every panel start.\n *\n * ⚠⚠ The branding field used to be a MAP (`{\"es\": {key: text}}`) while this\n * file read it as a LIST (`b.ui_locales?.length`): a map has no length, so an\n * installed language joined the picker and then spoke English, and every test\n * stayed green because its fixture was typed this file's way (measured\n * 2026-09-21 with the Spanish pack). The web tests now read the SERVER's own\n * bytes (backend/internal/api/handlers/testdata/wire/public-*.json).\n *\n * ⚠ A language that arrives this way may be a PARTIAL table. Every lookup\n * falls back to English rather than printing a raw key — the rule the\n * built-in catalogues already follow, applied to a table we did not write.\n *\n * ⚠ The strings come from outside. They are rendered as TEXT, never markup,\n * and a key that could walk into an object's machinery (`__proto__`,\n * `constructor`, `prototype`) is dropped here as well as refused by the host.\n *\n * ⚠⚠ Reactive on purpose. A pack can be installed or removed while the window\n * is open, and its strings arrive after the page has painted; `localesVersion`\n * is what every consumer watches, and `hasLocale` reads it so a computed that\n * asked \"is `es` offered?\" asks again when the answer changes.\n */\nimport { ref } from 'vue';\nimport type { PublicBranding, PublicLocaleOption } from '../types/Public';\n// ⚠ The two tables directly, not `../locales` (its index re-exports\n// `locales/resolve`, which reads THIS module — an import cycle).\nimport { en } from '../locales/en';\nimport { tr } from '../locales/tr';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { apiRootOr } from './appBase';\n\n/** Bumped whenever the list or a table changes; `useLocale` and the pickers watch it. */\nexport const localesVersion = ref(0);\n\n/**\n * Has the server's list arrived? Until it has, a stored choice that LOOKS like\n * a language (`plausibleLocale`) is held rather than thrown away — the same\n * rule the palette follows for a custom theme whose list is still in flight\n * (`lib/themes` plausibleThemeId). Without it a person who picked a pack's\n * language opened every page in English: the stored `es` was judged against\n * a list that had not been fetched yet, refused, and never looked at again.\n */\nexport const localesKnown = ref(false);\n\n/** The languages this package ships a full catalogue for. */\nexport const BUILTIN_LOCALES: readonly LocaleCode[] = ['en', 'tr'];\n\n/**\n * A language's name IN that language — never translated into the viewer's,\n * because somebody looking for their own language is looking for their own\n * word for it. The table covers the common cases without asking `Intl`;\n * anything else asks `Intl.DisplayNames` in its own language, and only a code\n * even that cannot name is shown upper-cased.\n */\nconst BUILTIN_LABELS: Record<string, string> = {\n  en: 'English',\n  tr: 'Türkçe',\n  de: 'Deutsch',\n  fr: 'Français',\n  es: 'Español',\n  it: 'Italiano',\n  nl: 'Nederlands',\n  pt: 'Português',\n  pl: 'Polski',\n  ru: 'Русский',\n  uk: 'Українська',\n  ar: 'العربية',\n  fa: 'فارسی',\n  az: 'Azərbaycanca',\n  ja: '日本語',\n  ko: '한국어',\n  zh: '中文',\n};\n\n/** A language's own name for itself. */\nexport function localeLabel(code: string): string {\n  if (BUILTIN_LABELS[code]) return BUILTIN_LABELS[code];\n  try {\n    const name = new Intl.DisplayNames([code], { type: 'language' }).of(code);\n    if (name && name.toLowerCase() !== code) {\n      // Upper-cased in the language's own rules (\"español\" → \"Español\").\n      return name.charAt(0).toLocaleUpperCase(code) + name.slice(1);\n    }\n  } catch {\n    /* an old runtime or a tag Intl does not know */\n  }\n  return code.toUpperCase();\n}\n\n/** Everything a language added from outside carries. */\ninterface ExtraLocale extends Omit<PublicLocaleOption, 'strings'> {\n  /** `null` = listed, strings not fetched yet. */\n  strings: Record<string, string> | null;\n}\n\nconst messages: Record<string, Record<string, string>> = { en, tr };\n\nconst extras = new Map<string, ExtraLocale>();\nconst inflight = new Map<string, Promise<boolean>>();\n\n/* ── codes ────────────────────────────────────────────────────────────── */\n\nconst TAG = /^[a-z]{2,3}(-[a-z0-9]{2,8})*$/;\n\n/**\n * Could this be a language tag at all? `es`, `pt-br`, `zh-hant` — yes;\n * `../etc`, `` — no. What a HELD choice has to be.\n */\nexport function plausibleLocale(raw: string | undefined | null): boolean {\n  return TAG.test(String(raw ?? '').trim().toLowerCase().replace(/_/g, '-'));\n}\n\n/**\n * The code the interface uses for a tag.\n *\n * `tr-TR` and `TR` mean `tr`; `es-MX` means `es` when a pack offers `es`;\n * `pt` means `pt-br` when that is the only Portuguese on offer; a regional\n * pack (`pt-br`, `zh-hant`) keeps its region, because Brazilian and European\n * Portuguese — or the two Chinese scripts — are different tables. A tag\n * nothing offers yet is KEPT whole, so a choice held before the list arrives\n * still means what the person picked.\n */\nexport function normalizeLocaleCode(raw: string | undefined | null): string {\n  const v = String(raw ?? '').trim().toLowerCase().replace(/_/g, '-');\n  if (!TAG.test(v)) return '';\n  if (extras.has(v)) return v;\n  const primary = v.split('-')[0];\n  if (isBuiltinLocale(primary)) return primary;\n  if (extras.has(primary)) return primary;\n  for (const k of extras.keys()) if (k.startsWith(`${primary}-`)) return k;\n  return v;\n}\n\nexport function isBuiltinLocale(code: string): code is LocaleCode {\n  return (BUILTIN_LOCALES as readonly string[]).includes(code);\n}\n\n/* ── the registry ─────────────────────────────────────────────────────── */\n\n/**\n * The strings a pack sent, minus anything that must not reach an object:\n * non-strings, empty values (untranslated — English shows instead) and keys\n * whose segments name JavaScript's machinery. The host refuses those keys at\n * install already (wire.UILocaleKeyOK); this is the second lock, because the\n * web SPA turns dotted keys into nested objects and `__proto__` would walk\n * that loop into Object.prototype.\n */\nfunction cleanStrings(raw: Record<string, unknown> | null | undefined): Record<string, string> {\n  const out: Record<string, string> = {};\n  for (const [k, v] of Object.entries(raw ?? {})) {\n    if (typeof v !== 'string' || !v.trim() || !k) continue;\n    if (k.split('.').some((s) => s === '__proto__' || s === 'constructor' || s === 'prototype')) continue;\n    out[k] = v;\n  }\n  return out;\n}\n\n/**\n * Add (or replace) a language the server offers. `strings` absent = listed\n * only; the table is fetched when first asked for.\n *\n * ⚠ A built-in language is never replaced wholesale — a pack that ships\n * `tr` is OVERLAYING keys onto the catalogue, not taking it over, or one\n * badly-packed app could blank the interface for everybody who reads Turkish.\n */\nexport function registerLocale(opt: PublicLocaleOption): void {\n  const raw = String(opt?.code ?? '').trim().toLowerCase().replace(/_/g, '-');\n  const code = TAG.test(raw) ? raw : '';\n  if (!code) return;\n  extras.set(code, {\n    code,\n    label: String(opt.label ?? '').trim() || localeLabel(code),\n    source: opt.source === 'plugin' ? 'plugin' : opt.source || 'builtin',\n    plugin: opt.plugin,\n    rtl: opt.rtl === true,\n    strings: opt.strings ? cleanStrings(opt.strings) : null,\n  });\n  localesVersion.value += 1;\n}\n\n/** Replace the whole extra set (what one branding answer says). */\nexport function setLocales(list: PublicLocaleOption[] | undefined): void {\n  extras.clear();\n  inflight.clear();\n  for (const o of list ?? []) registerLocale(o);\n  localesVersion.value += 1;\n}\n\n/** An app was removed: its languages go with it. */\nexport function unregisterPluginLocales(plugin: string): void {\n  let changed = false;\n  for (const [code, v] of extras) {\n    if (v.source === 'plugin' && v.plugin === plugin) {\n      extras.delete(code);\n      changed = true;\n    }\n  }\n  if (changed) localesVersion.value += 1;\n}\n\n/** Testing seam / sign-out: back to the two we ship, list not yet known. */\nexport function resetLocales(): void {\n  extras.clear();\n  inflight.clear();\n  source = {};\n  localesKnown.value = false;\n  localesVersion.value += 1;\n}\n\n/**\n * Every language on offer, built-ins first and the rest in the order the\n * server listed them — so the two the product ships do not move around when\n * an app is installed. ⚠ THE one list every picker reads (the admin\n * header's switcher, the settings dialog, the public shell).\n */\nexport function availableLocales(): PublicLocaleOption[] {\n  void localesVersion.value;\n  const out: PublicLocaleOption[] = BUILTIN_LOCALES.map((code) => ({\n    code,\n    label: localeLabel(code),\n    source: 'builtin',\n  }));\n  for (const [code, v] of extras) {\n    if (isBuiltinLocale(code)) continue;\n    out.push({ code, label: v.label, source: v.source, plugin: v.plugin, rtl: v.rtl });\n  }\n  return out;\n}\n\n/** Is this a language the interface can actually be set to? (Reactive.) */\nexport function hasLocale(code: string | undefined | null): boolean {\n  void localesVersion.value;\n  const c = normalizeLocaleCode(code);\n  return !!c && (isBuiltinLocale(c) || extras.has(c));\n}\n\n/**\n * May a STORED choice stand? Offered, or — while the list has not arrived —\n * merely plausible. After the list arrives only an offered language stands;\n * the stored value itself is kept, so reinstalling the pack brings it back.\n */\nexport function acceptableLocale(code: string | undefined | null): boolean {\n  if (hasLocale(code)) return true;\n  return !localesKnown.value && plausibleLocale(code);\n}\n\n/* ── tables ───────────────────────────────────────────────────────────── */\n\n/**\n * One language's table with English merged underneath.\n *\n * Order, and why: English underneath as the last resort, then the built-in\n * catalogue when the language has one, then the pack's table on top. So a\n * pack that translates three strings gets three strings and an otherwise\n * English screen — never a page of raw keys — and a pack that overlays two\n * Turkish strings changes exactly two.\n *\n * ⚠ Not what `t()` reads any more — see `localeOwnTable`. In this merge a\n * key the pack never wrote and a key it did are indistinguishable, and the\n * plural rule needs to tell them apart.\n *\n * ⚠ Asking for a language whose strings have not been fetched STARTS the\n * fetch and answers English meanwhile; `localesVersion` moves when they land,\n * and every computed that read this re-reads it.\n */\nexport function localeTable(code: string | undefined): Record<string, string> {\n  const c = normalizeLocaleCode(code);\n  const builtin = isBuiltinLocale(c) ? messages[c] : undefined;\n  const extra = extras.get(c);\n  if (extra && extra.strings === null) void ensureLocaleStrings(c);\n  if (!extra?.strings || !Object.keys(extra.strings).length) return builtin ?? messages.en;\n  return { ...messages.en, ...(builtin ?? {}), ...extra.strings };\n}\n\n/** What a language wrote ITSELF, and whose plural rules read it. */\nexport interface OwnLocaleTable {\n  /** The language whose CLDR plural rules pick a form out of `strings`. */\n  lang: string;\n  /** Its own words only — English is NOT merged underneath. */\n  strings: Readonly<Record<string, string>>;\n}\n\n/**\n * The words a language has of its OWN — what `t()` reads first.\n *\n *   - a built-in (`en`, `tr`): its catalogue, with a pack that overlays it on\n *     top (the overlay IS that language's words);\n *   - a pack's language: the pack's strings and nothing else;\n *   - a language with no strings yet (not fetched, fetch failed, empty pack,\n *     or a code nothing offers): English, AS English — `lang` is `en`.\n *\n * ⚠⚠ Why not `localeTable`. That one merges English under the pack, so \"the\n * table has `toast.restored_one`\" is true for a Spanish pack that wrote only\n * `toast.restored` — the English singular was sitting underneath — and the\n * count of one printed \"1 item restored\" in the middle of a Spanish screen.\n * The plural rule has to know which forms the language itself wrote, and\n * fall back to English as a WHOLE (English's form, by English's rule) only\n * when the language wrote none.\n *\n * ⚠ The last case answers `lang: 'en'` on purpose: French puts 0 in `one`,\n * so reading English strings by French rules would print \"0 item\".\n *\n * Starts the fetch for a listed language whose strings are not in hand, the\n * same as `localeTable`.\n */\nexport function localeOwnTable(code: string | undefined): OwnLocaleTable {\n  const c = normalizeLocaleCode(code);\n  const builtin = isBuiltinLocale(c) ? messages[c] : undefined;\n  const extra = extras.get(c);\n  if (extra && extra.strings === null) void ensureLocaleStrings(c);\n  const pack = extra?.strings && Object.keys(extra.strings).length ? extra.strings : null;\n  if (builtin) return { lang: c, strings: pack ? { ...builtin, ...pack } : builtin };\n  if (pack) return { lang: c, strings: pack };\n  return { lang: 'en', strings: messages.en };\n}\n\n/**\n * Just the strings a pack added for this language — no catalogue under them.\n *\n * ⚠ For a host with a catalogue of its own (the admin SPA's `web/src/locales`)\n * that merges the same table into ITS `t()`. Handing it `localeTable` would\n * fold this package's keys into the host's, which is two catalogues becoming\n * one by accident.\n */\nexport function localeStrings(code: string | undefined): Record<string, string> {\n  return { ...(extras.get(normalizeLocaleCode(code))?.strings ?? {}) };\n}\n\n/* ── fetching ─────────────────────────────────────────────────────────── */\n\nexport interface LoadLocalesOptions {\n  /** API origin; empty = same origin. */\n  base?: string;\n  fetchImpl?: typeof fetch;\n  /** Per-call auth for a host that does not ride on cookies. */\n  headers?: () => Promise<Record<string, string>> | Record<string, string>;\n}\n\n/** Where the list came from — the strings are fetched from the same place. */\nlet source: LoadLocalesOptions = {};\n\n/**\n * Fetch one added language's strings (`GET /api/public/ui-locales/{code}`).\n * Resolves true when a table is in hand. Idempotent: concurrent askers share\n * one request, and a language already loaded costs nothing.\n *\n * ⚠ A failure leaves the language listed with an EMPTY table (English shows)\n * rather than retrying on every repaint — a pack removed between the list and\n * this request answers 404, and hammering the server over it helps nobody.\n */\nexport function ensureLocaleStrings(code: string | undefined): Promise<boolean> {\n  const c = normalizeLocaleCode(code);\n  const e = extras.get(c);\n  if (!e) return Promise.resolve(false);\n  if (e.strings !== null) return Promise.resolve(Object.keys(e.strings).length > 0);\n  const pending = inflight.get(c);\n  if (pending) return pending;\n  const doFetch = source.fetchImpl ?? (typeof fetch === 'function' ? fetch : null);\n  if (!doFetch) return Promise.resolve(false);\n  const base = apiRootOr(source.base);\n  const p = (async () => {\n    let strings: Record<string, string> = {};\n    try {\n      const extra = source.headers ? await source.headers() : {};\n      const res = await doFetch(`${base}/api/public/ui-locales/${encodeURIComponent(c)}`, {\n        method: 'GET',\n        headers: { Accept: 'application/json', ...extra },\n        credentials: 'same-origin',\n      });\n      if (res.ok) {\n        const body = (await res.json()) as { strings?: Record<string, unknown> };\n        strings = cleanStrings(body?.strings);\n      }\n    } catch {\n      /* English is a perfectly good answer */\n    }\n    const still = extras.get(c);\n    if (still === e) {\n      still.strings = strings;\n      localesVersion.value += 1;\n    }\n    inflight.delete(c);\n    return Object.keys(strings).length > 0;\n  })();\n  inflight.set(c, p);\n  return p;\n}\n\n/**\n * Fold a branding answer's language list into the registry.\n *\n * `locales` is a list of CODES — the built-ins and whatever apps add — and\n * `ui_locales` the added ones as rows (code, app, rtl) WITHOUT strings.\n * ⚠ Registering again drops tables already fetched, so a pack that was\n * upgraded while the page was open is re-read the next time it is used\n * instead of serving yesterday's words until a reload.\n */\nexport function setLocalesFromBranding(\n  b: PublicBranding | null | undefined,\n  opts?: LoadLocalesOptions,\n): PublicLocaleOption[] {\n  if (opts) source = opts;\n  if (!b) return availableLocales();\n  const rows = Array.isArray(b.ui_locales) ? b.ui_locales : [];\n  const listed = new Set(rows.map((r) => String(r?.code ?? '').toLowerCase()));\n  // A code on `locales` with no row (an older server) still gets a name.\n  const bare = (b.locales ?? [])\n    .map((c) => String(c ?? '').trim().toLowerCase())\n    .filter((c) => TAG.test(c) && !isBuiltinLocale(c) && !listed.has(c))\n    .map((code) => ({ code, source: 'plugin' as const }));\n  setLocales([...rows, ...bare]);\n  localesKnown.value = true;\n  return availableLocales();\n}\n\n/**\n * Ask the server which languages this instance offers.\n *\n * ⚠ It asks the BRANDING route, which is the one public answer about how\n * this instance presents itself — and the one the public shell already\n * fetches. ⚠ A failure is not an error: the two built-in languages are\n * already on the picker, and the list is then treated as KNOWN (a held\n * choice falls back) — waiting forever for an answer that will not come\n * would keep somebody's interface in a language nothing can serve.\n */\nexport async function loadLocales(opts: LoadLocalesOptions = {}): Promise<PublicLocaleOption[]> {\n  source = opts;\n  const doFetch = opts.fetchImpl ?? (typeof fetch === 'function' ? fetch : null);\n  if (!doFetch) return availableLocales();\n  const base = apiRootOr(opts.base);\n  try {\n    const extra = opts.headers ? await opts.headers() : {};\n    const res = await doFetch(`${base}/api/public/branding`, {\n      method: 'GET',\n      headers: { Accept: 'application/json', ...extra },\n      credentials: 'same-origin',\n    });\n    if (res.ok) {\n      setLocalesFromBranding((await res.json()) as PublicBranding);\n      return availableLocales();\n    }\n  } catch {\n    /* the two built-in languages are a perfectly good answer */\n  }\n  localesKnown.value = true;\n  localesVersion.value += 1;\n  return availableLocales();\n}\n","import type { LocaleCode } from '../types/ExplorerConfig';\nimport { acceptableLocale, hasLocale, normalizeLocaleCode } from '../lib/uiLocales';\n\n/**\n * The language filex falls back to when the host does not say.\n *\n * ⚠ It used to be `tr`, in eleven places. filex is an English-first\n * open-source product, so `<filex-explorer api-base=\"…\">` with no `locale`\n * rendered a Turkish UI to whoever installed it — and the web component\n * defaults `locale` to `''`, so \"no locale\" is the normal case for an embed.\n * The admin SPA never showed it because it always passes one.\n */\nconst FALLBACK: LocaleCode = 'en';\n\n/**\n * Resolve the locale to render in.\n *\n * Order, and the reasoning for it:\n *\n *   1. **What the host asked for.** An explicit `locale` always wins. A host\n *      that names a language has made a decision, and guessing over it would\n *      make the prop advisory.\n *   2. **What the browser asks for**, via `navigator.languages` /\n *      `navigator.language` — the same signal `Accept-Language` carries, and\n *      the reason a Turkish reader gets Turkish without the embedder doing\n *      anything.\n *   3. **`en`.**\n *\n * ⚠ Step 2 makes the same embed render differently for two people. That is\n * deliberate — it is what \"follow the browser\" means — but it also means a\n * screenshot, a test or a bug report about this component must state its\n * locale, because the component alone no longer determines it. Pass an\n * explicit `locale` anywhere the answer has to be stable.\n *\n * Matching is on the primary subtag, so `tr-TR` and `en-GB` resolve, and a\n * language pack's own tag (`es`, `pt-br`) resolves while the pack is offered;\n * anything nothing offers falls through rather than half-rendering.\n */\nexport function resolveLocale(explicit?: LocaleCode | '' | null): LocaleCode {\n  // ⚠⚠ Not \"en or tr\". It was, and every explorer surface — the listing, the\n  // details panel, the dialogs, some twelve call sites — turned a language\n  // pack's `es` into the browser's guess: the admin panel around the explorer\n  // spoke Spanish and the explorer inside it did not (measured 2026-09-21).\n  // An offered language stands; while the server's list is still in flight a\n  // plausible one is HELD (`acceptableLocale`), so the explorer does not\n  // flash the browser's language on its way to the one the host asked for.\n  if (explicit && acceptableLocale(explicit)) return normalizeLocaleCode(explicit);\n  return detectLocale();\n}\n\n/**\n * The browser's preference, or `en`.\n *\n * ⚠ Guarded for a non-browser runtime: this package is imported by SSR and by\n * unit tests under Node, where `navigator` is absent — and an exception here\n * would take down the whole explorer over a language choice.\n */\nexport function detectLocale(): LocaleCode {\n  try {\n    const nav = typeof navigator === 'undefined' ? undefined : navigator;\n    if (!nav) return FALLBACK;\n    const wanted = nav.languages && nav.languages.length ? nav.languages : [nav.language];\n    for (const tag of wanted) {\n      if (!tag) continue;\n      // An offered language, built-in or added by a pack: a visitor whose\n      // browser asks for Spanish on an instance with a Spanish pack reads\n      // Spanish. (`hasLocale` is reactive, so a caller inside a computed\n      // re-decides when the pack list arrives.)\n      if (hasLocale(tag)) return normalizeLocaleCode(tag);\n    }\n  } catch {\n    /* a hostile or exotic runtime is not a reason to fail to render */\n  }\n  return FALLBACK;\n}\n","/**\n * internalPaths.ts — the client's ONE definition of the directories filex keeps\n * for itself inside a storage: the trash bin, version history, the legacy\n * thumbnail cache, and the desktop app's \"open with filex\" working area, plus\n * the empty-folder marker file.\n *\n * ⚠⚠ The server is the real gate. Since this release it never lists, searches\n * or serves these to a person (backend/internal/syspath — the list the whole\n * backend shares), and a notification never names or targets one. This copy\n * exists for what only the client can do: refuse to NAVIGATE into one (a URL\n * hash typed by hand, a tab or persisted path left over from before — the\n * owner's report of 2026-09-21 began with a notification click that landed in\n * `.filex-open`), and keep an embed that talks to an older server from\n * listing them.\n *\n * ⚠ web/tests/lib/internalPaths.test.ts parses backend/internal/syspath/\n * syspath.go and fails when this list and that one differ. Add a name there;\n * the test tells you it belongs here too. This file used to be three\n * hand-written checks in lib/listing.ts, one of them `path.includes('.thumbs')`\n * — which also hid a person's own `my.thumbs.txt`.\n */\n\n/** The internal directory names, in syspath.go's order. */\nexport const INTERNAL_DIR_NAMES = ['.filex-trash', '.versions', '.thumbs', '.filex-open', '.filex-drafts'] as const;\n\n/** The drafts area (issue #71, syspath.Drafts): where a new document lives\n *  until its first save, `.filex-drafts/<user id>/<key>/<name>`. */\nexport const DRAFTS_DIR_NAME = '.filex-drafts';\n\n/** The zero-byte file that keeps an empty folder alive on a blob store. */\nexport const KEEP_MARKER_NAME = '.keepdir';\n\nconst DIRS: ReadonlySet<string> = new Set<string>(INTERNAL_DIR_NAMES);\n\n/** The storage-relative segments of a path in any of the shapes the explorer\n *  carries: `docs://a/b`, `docs/a/b` (the hash form — its first segment is the\n *  storage, which is never an internal name), `/a/b/`, `a\\b`. */\nfunction segments(path: string): string[] {\n  let p = String(path ?? '').trim().replace(/\\\\/g, '/');\n  const at = p.indexOf('://');\n  if (at >= 0) p = p.slice(at + 3);\n  return p.split('/').filter((s) => s && s !== '.');\n}\n\n/** True for one entry name that is filex's own — a directory or the marker. */\nexport function isInternalName(name: string): boolean {\n  const n = String(name ?? '').trim();\n  return DIRS.has(n) || n === KEEP_MARKER_NAME;\n}\n\n/**\n * True when a person must never be shown `path`: it is one of filex's\n * directories or lies inside one (at any depth, which is the server's rule\n * too), or it is a keep marker.\n */\nexport function isInternalPath(path: string): boolean {\n  const segs = segments(path);\n  if (segs.some((s) => DIRS.has(s))) return true;\n  return segs.length > 0 && segs[segs.length - 1] === KEEP_MARKER_NAME;\n}\n\n/**\n * The address a listing request should go to: `wire` itself, or — when it\n * points into one of filex's directories — that storage's root.\n *\n * \"Resolved rather than refused\": a person who arrives at `docs://.filex-open`\n * (by a stale notification link, an old tab, a typed hash) is standing in a\n * folder that is not theirs to see, and the useful place to put them is the\n * storage it belongs to — not a \"folder not found\" page that prints the very\n * path it is refusing to show.\n *\n * ⚠ Only the explorer's listing calls go through here. The desktop app's\n * open-with flow lists its working area by exact path over its own HTTP\n * client (desktop/src/openwith-io.ts), and the server keeps answering that.\n */\nexport function listingAddress(wire: string): string {\n  const w = String(wire ?? '');\n  if (!isInternalPath(w)) return w;\n  const at = w.indexOf('://');\n  return at >= 0 ? w.slice(0, at + 3) : '';\n}\n\n/**\n * The key of the draft `path` is — `<storage>://.filex-drafts/<user id>/<key>/\n * <name>` — or '' when it is not one (issue #71).\n *\n * ⚠ This is how an EDITOR knows it is on a draft, whoever opened it: the\n * explorer's New document, the Drafts view, a reload of the standalone\n * editor tab, a desktop document window. Each of them hands the viewer a path\n * and nothing else, so the path is the one thing all of them agree on; the\n * draft itself (where it is meant to go) is then asked of the server by this\n * key. The shape is the server's (syspath.IsDraftOf): exactly four segments,\n * a key of lowercase hex.\n */\nexport function draftKeyOf(path: string): string {\n  const segs = segments(path);\n  if (segs.length !== 4 || segs[0] !== DRAFTS_DIR_NAME) return '';\n  if (!/^[1-9][0-9]*$/.test(segs[1])) return '';\n  if (!/^[0-9a-f]{8,32}$/.test(segs[2])) return '';\n  return isInternalName(segs[3]) ? '' : segs[2];\n}\n","/**\n * serverRules — the rules the server publishes for the clients to look things\n * up in (`/api/files/capabilities` → `edit_kinds`, `limits`), held once for\n * every surface on the page (filex #211).\n *\n * ⚠⚠ The server's work is done on the server. Whether a file is an office\n * document or text a person edits, how long a tag or a comment may be, how\n * much an app may keep: each of these was a list or a number written out a\n * second time here, and each copy had drifted or could drift the first time\n * one side changed. The preview offered Edit on `.graphql`, which save-text\n * refused; `.properties` and `Makefile`, which save-text saves, had no Edit;\n * `.docm` was not an office document to the explorer; a tag's 64 counted\n * UTF-16 units where the server counts characters. Now the server decides\n * (backend internal/editkind, capabilities_rules.go) and this module only\n * holds its answer.\n *\n * Fed by whoever fetches the capabilities (core `useFileApi.capabilities`,\n * the admin app's store), so a component reads it without being handed it.\n * Until an answer has arrived nothing is office and nothing is text — the\n * same as a server that says nothing, which offers no Edit rather than a\n * guess.\n */\nimport { shallowRef } from 'vue';\n\n/** `capabilities.edit_kinds` (backend editkind.Kinds). */\nexport interface EditKinds {\n  /** Extensions the document server opens and edits. */\n  office: string[];\n  /** Extensions the built-in editor opens and save-text saves. */\n  text: string[];\n  /** Whole file names (lower case) that are text by name — `makefile`, `.gitignore`. */\n  text_names: string[];\n  /** Media types that make a file whose name says nothing text: `text/`… */\n  text_mime_prefixes: string[];\n  /** …and these exactly. */\n  text_mimes: string[];\n}\n\n/** `capabilities.limits`: the numbers an input is held to before it is sent.\n *  The server enforces each again. */\nexport interface ServerLimits {\n  /** A tag name, in characters. */\n  tag_max_runes?: number;\n  /** A comment, in characters. */\n  comment_max_runes?: number;\n  /** An encryption request's reason, in characters (the rest is cut). */\n  e2e_request_reason_max_runes?: number;\n  /** What one app's interface keeps for a person, as JSON bytes. */\n  app_state_max_bytes?: number;\n  /** One chunk of an app interface's save, in bytes. */\n  app_ui_save_chunk_bytes?: number;\n}\n\n/**\n * `capabilities.event_off[event]` (backend capabilities_rules.go, #211 audit\n * B16): a notification event that cannot happen on this instance - what it\n * waits for, whether THIS caller could switch that on, and the sentence that\n * says so, in the reader's language. An event absent from the map can happen.\n */\nexport interface EventOff {\n  /** `antivirus` | `escrow` | `app_plugins` | `e2e_approval`. */\n  reason: string;\n  /** The caller could switch it on: greyed with `text` for them, not offered\n   *  to anybody else (lib/serviceGate `gateOnService`). */\n  fixable: boolean;\n  text: string;\n}\n\ninterface Lookup {\n  office: ReadonlySet<string>;\n  text: ReadonlySet<string>;\n  names: ReadonlySet<string>;\n  prefixes: readonly string[];\n  mimes: ReadonlySet<string>;\n}\n\nconst lower = (xs: unknown): string[] =>\n  Array.isArray(xs) ? xs.filter((x): x is string => typeof x === 'string').map((x) => x.toLowerCase()) : [];\n\nconst kinds = shallowRef<Lookup | null>(null);\nconst limits = shallowRef<ServerLimits>({});\n\n/**\n * Take what a capabilities answer says. A field the answer leaves out keeps\n * what is held (an answer from an older server, or a partial host stub, does\n * not wipe a real one).\n */\nexport function takeServerRules(caps: { edit_kinds?: Partial<EditKinds> | null; limits?: ServerLimits | null } | null | undefined): void {\n  if (!caps) return;\n  const k = caps.edit_kinds;\n  if (k && typeof k === 'object') {\n    kinds.value = {\n      office: new Set(lower(k.office)),\n      text: new Set(lower(k.text)),\n      names: new Set(lower(k.text_names)),\n      prefixes: lower(k.text_mime_prefixes),\n      mimes: new Set(lower(k.text_mimes)),\n    };\n  }\n  const l = caps.limits;\n  if (l && typeof l === 'object') limits.value = { ...l };\n}\n\n/** Has the server said how files are edited yet? */\nexport function editKindsKnown(): boolean {\n  return kinds.value !== null;\n}\n\n/** Does a file of this extension open in the document server? */\nexport function isOfficeExt(ext: string | null | undefined): boolean {\n  return kinds.value?.office.has(String(ext ?? '').toLowerCase()) ?? false;\n}\n\n/** Is this media type text a person edits as text (a name that says nothing,\n *  `LICENSE`, #56)? */\nexport function isTextualMime(mime: string | null | undefined): boolean {\n  const k = kinds.value;\n  if (!k) return false;\n  const m = String(mime ?? '').split(';')[0].trim().toLowerCase();\n  if (!m) return false;\n  return k.mimes.has(m) || k.prefixes.some((p) => m.startsWith(p));\n}\n\n/** The last path segment, lower case. */\nfunction baseOf(name: string): string {\n  const parts = name.replace(/[\\\\/]+$/, '').split(/[\\\\/]/);\n  return (parts[parts.length - 1] ?? '').toLowerCase();\n}\n\n/** The extension after the last dot, the way the server reads it (Go's\n *  `path.Ext`): `.gitignore` has the extension `gitignore`. */\nfunction extOfName(base: string): string {\n  const dot = base.lastIndexOf('.');\n  return dot >= 0 ? base.slice(dot + 1) : '';\n}\n\n/**\n * Is this file one the built-in editor opens and save-text saves? By its\n * name (extension, or a name that is text on its own), else by the server's\n * mime for its bytes — the two halves of save-text's own check.\n */\nexport function isTextEditable(file: { basename?: string | null; extension?: string | null; mime_type?: string | null } | null | undefined): boolean {\n  const k = kinds.value;\n  if (!k || !file) return false;\n  const base = baseOf(String(file.basename ?? ''));\n  const ext = String(file.extension ?? extOfName(base)).toLowerCase();\n  if (ext && k.text.has(ext)) return true;\n  if (base && k.names.has(base)) return true;\n  return isTextualMime(file.mime_type);\n}\n\n/** A number the server holds an input to; undefined when it has not said. */\nexport function serverLimit(name: keyof ServerLimits): number | undefined {\n  const v = limits.value[name];\n  return typeof v === 'number' && v > 0 ? v : undefined;\n}\n\n/** How many characters (Unicode code points, as the server counts them). */\nexport function runeCount(s: string): number {\n  return Array.from(s).length;\n}\n\n/** `s` cut to `max` characters, never inside a surrogate pair. */\nexport function clipRunes(s: string, max: number | undefined): string {\n  if (!max) return s;\n  const chars = Array.from(s);\n  return chars.length > max ? chars.slice(0, max).join('') : s;\n}\n\n/** Tests only: forget what the server said. */\nexport function resetServerRules(): void {\n  kinds.value = null;\n  limits.value = {};\n}\n","/**\n * direction — which way a language is written, and where that answer goes.\n *\n * ⚠⚠ ONE LIST. Whether a language is written right to left is decided on the\n * SERVER, by `wire.IsRTL` (backend/pkg/pluginkit/wire/langpack.go — the\n * primary-language list plus the script subtags), and it reaches the browser\n * as the `rtl` flag on each row of the offered-language list\n * (`/api/public/branding` → `ui_locales`, folded in by `lib/uiLocales`).\n * This file only READS that flag. It must never grow a table of its own:\n * `Intl.Locale#getTextInfo()` looks like a shortcut and is one — to a second\n * list (the browser's CLDR copy) that Firefox does not ship at all and that\n * would disagree with the install review about the same pack.\n *\n * The two catalogues the product ships (English, Turkish) are left to right,\n * and a code nobody offers is left to right: a language whose words are not\n * on screen does not get to turn the screen around.\n *\n * ⚠⚠ THE RULE, for every surface: `dir` follows the language whose words the\n * surface is showing.\n *\n *   - A whole page (the admin panel, the drive, the public share/PIN/drop\n *     pages, the signing wizard) carries it on `<html>`, DERIVED from\n *     `<html lang>` by `syncDocumentDir` — every place that already sets the\n *     page's language (web/src/i18n, PublicLinkPage) sets its direction with\n *     it, without having to know that direction exists.\n *   - An embedded explorer carries it on its own root, from ITS locale — not\n *     from the host page. An Arabic explorer inside an English page reads\n *     right to left; an English explorer inside an Arabic page reads left to\n *     right. Laying English out mirrored because the page around it is Arabic\n *     (or the reverse) scrambles exactly the words the component exists to\n *     show, and the host already chose the component's language by setting\n *     `locale`.\n *   - Anything Teleported out of that root (menus, popovers, the tour, the\n *     quick-look hint) carries `dir` again, because `<body>` is not inside the\n *     explorer and would hand it the HOST's direction. `useLocale().dir` is the\n *     value to bind.\n *\n * ⚠⚠ Direction is about the INTERFACE. Document space — a PDF page, an image,\n * a drawing, a crop box — has its own coordinates and never mirrors (see\n * lib/pdfFieldsGeom). Nothing here may be applied to those.\n */\nimport { computed, watch } from 'vue';\nimport { availableLocales, localesVersion, normalizeLocaleCode } from './uiLocales';\n\nexport type TextDirection = 'ltr' | 'rtl';\n\n/**\n * The offered codes the server flagged right to left.\n *\n * ⚠ Read through a widened row type: the flag is added to\n * `PublicLocaleOption` by the language-pack platform, and a row that does not\n * carry it (an older server, the two built-ins) is simply left to right.\n * `localesVersion` is read so the set is re-derived the moment the list — and\n * with it a pack's flag — arrives or changes.\n */\nconst rtlCodes = computed(() => {\n  void localesVersion.value;\n  const out = new Set<string>();\n  for (const row of availableLocales() as Array<{ code: string; rtl?: boolean }>) {\n    if (row.rtl === true) out.add(row.code);\n  }\n  return out;\n});\n\n/** `'rtl'` when the server says this language is written right to left. */\nexport function localeDir(code: string | null | undefined): TextDirection {\n  const c = normalizeLocaleCode(code ?? '');\n  return c && rtlCodes.value.has(c) ? 'rtl' : 'ltr';\n}\n\n/**\n * Keep `root`'s `dir` derived from its `lang`, for as long as the page lives.\n *\n * ⚠ An observer on `lang`, not a call from each place that sets the language:\n * there are several (the admin panel's language decision, the public link\n * page, and whatever sets it next), and a direction that each of them had to\n * remember to set is a direction one of them forgets. The observer's callback\n * runs as a microtask — before the next paint — so the words and the layout\n * turn together.\n *\n * ⚠ Also re-applied when the language LIST changes: a pack's language can be\n * on `<html lang>` before the list saying it is right to left has arrived\n * (the admin panel holds a stored choice while the list is in flight).\n *\n * Only for a host that owns the whole page. An embed never calls this — the\n * host page's direction is the host's business (see the rule above).\n *\n * @returns a stop function (tests, hot reload).\n */\nexport function syncDocumentDir(\n  root: HTMLElement | null = typeof document !== 'undefined' ? document.documentElement : null,\n): () => void {\n  if (!root) return () => {};\n  const apply = () => {\n    const want = localeDir(root.getAttribute('lang'));\n    if (root.getAttribute('dir') !== want) root.setAttribute('dir', want);\n  };\n  apply();\n  const mo = typeof MutationObserver !== 'undefined' ? new MutationObserver(apply) : null;\n  mo?.observe(root, { attributes: true, attributeFilter: ['lang'] });\n  const stop = watch(localesVersion, apply);\n  return () => {\n    mo?.disconnect();\n    stop();\n  };\n}\n\n/* ── interaction geometry ─────────────────────────────────────────────── */\n/*\n * ⚠⚠ Pointer events and `getBoundingClientRect()` are PHYSICAL: x grows to the\n * right whatever the page's direction. Every gesture that means \"toward the\n * end of the line\" — widening a column by its trailing edge, moving a column\n * later, opening a menu beside its anchor — has to translate between the two.\n * These helpers are that translation, in one place; a component that does its\n * own `dir === 'rtl' ? … : …` arithmetic is a component that will get one of\n * the four cases wrong.\n *\n * ⚠⚠ Never for DOCUMENT space (a PDF page, an image, a crop): a page's x is\n * the page's own and is not mirrored (lib/pdfFieldsGeom).\n */\n\n/**\n * The direction an element is actually laid out in: its nearest explicit\n * `dir=\"ltr|rtl\"`. `dir=\"auto\"` (user text isolated with `<bdi>`-like\n * behaviour) is skipped — it says nothing about the layout around it.\n */\nexport function dirOfElement(el: Element | null | undefined): TextDirection {\n  const host = el?.closest?.('[dir=\"rtl\"], [dir=\"ltr\"]');\n  return host?.getAttribute('dir') === 'rtl' ? 'rtl' : 'ltr';\n}\n\n/** +1 for the physical x axis in LTR, -1 in RTL: \"toward the inline end\". */\nexport function inlineSign(dir: TextDirection): 1 | -1 {\n  return dir === 'rtl' ? -1 : 1;\n}\n\n/**\n * A horizontal arrow key as a step along the line: +1 = toward the inline END\n * (→ in LTR, ← in RTL), -1 = toward the start, 0 = not a horizontal arrow.\n * The key a person presses moves things the way the arrow on it points.\n */\nexport function inlineKeyStep(key: string, dir: TextDirection): -1 | 0 | 1 {\n  const physical = key === 'ArrowRight' ? 1 : key === 'ArrowLeft' ? -1 : 0;\n  if (physical === 0) return 0;\n  return (physical * inlineSign(dir)) as -1 | 1;\n}\n\n/** The x of a box's inline START edge — its left in LTR, its right in RTL. */\nexport function inlineStartX(r: { left: number; right: number }, dir: TextDirection): number {\n  return dir === 'rtl' ? r.right : r.left;\n}\n\n/** The x of a box's inline END edge — its right in LTR, its left in RTL. */\nexport function inlineEndX(r: { left: number; right: number }, dir: TextDirection): number {\n  return dir === 'rtl' ? r.left : r.right;\n}\n\n/**\n * The physical `left` of a floating box opened at `anchor` (a viewport x):\n * it opens toward the inline END — down-right of the pointer in LTR,\n * down-LEFT in RTL — flips to the other side of the anchor when that would\n * overflow the viewport, and clamps when neither side fits.\n *\n * ⚠ Written ONCE, as the LTR rule, and mirrored by mapping x → viewport − x:\n * the RTL behaviour is the LTR behaviour seen in a mirror by construction,\n * and the LTR answer is byte-for-byte what the menus did before RTL existed.\n */\nexport function openAlongInline(\n  anchor: number,\n  size: number,\n  viewport: number,\n  dir: TextDirection,\n  margin = 8,\n): number {\n  const a = dir === 'rtl' ? viewport - anchor : anchor;\n  let left = a;\n  if (a + size > viewport - margin) {\n    const flipped = a - size;\n    left = flipped >= margin ? flipped : Math.max(margin, viewport - size - margin);\n  }\n  return dir === 'rtl' ? viewport - left - size : left;\n}\n\n/**\n * Like `openAlongInline`, without the flip: the box starts at `anchor` and is\n * only pushed back inside the viewport (popovers that hang from a chip and\n * must stay beside it). Same mirror construction.\n */\nexport function clampAlongInline(\n  anchor: number,\n  size: number,\n  viewport: number,\n  dir: TextDirection,\n  margin = 8,\n): number {\n  const a = dir === 'rtl' ? viewport - anchor : anchor;\n  const left = a + size > viewport - margin ? Math.max(margin, viewport - margin - size) : a;\n  return dir === 'rtl' ? viewport - left - size : left;\n}\n\n/* ── text that must read left to right inside right-to-left text ───────── */\n\nconst LRI = '\\u2066';\nconst RLI = '\\u2067';\nconst FSI = '\\u2068';\nconst PDI = '\\u2069';\n\n/**\n * The runs of a right-to-left sentence that are MACHINE text and read left to\n * right whatever surrounds them:\n *\n *   - a number pair — `3 / 10`, `1.2 MB / 5 GB`. Spaced out, the slash is a\n *     neutral between two numbers and the bidi algorithm resolves it to the\n *     paragraph's direction, so an RTL line draws `10 / 3`;\n *   - a `word:value` token — the search syntax `tag:…`, a URL\n *     (`https://…`), a Windows path (`C:\\Users\\…`), the token syntax a\n *     refusal names (`root:<storage>://<folder>`). Its colon sits between\n *     Latin and Arabic letters and lands on the wrong side: `tag:وسم` draws\n *     as `وسم:tag`, and `root:<storage>://<folder>` loses its closing `>` to\n *     the far left of the run, mirrored into `<`;\n *   - an absolute PATH — `/var/lib/filex/report.pdf`. Its LEADING slash is a\n *     neutral between the Arabic before it and the Latin after it, so it\n *     takes the paragraph's direction and is drawn at the RIGHT-hand END of\n *     the run: the line reads `var/lib/filex/report.pdf/`. Measured in\n *     Chromium at `dir=\"rtl\"` (v0.43.0): two rectangles, the second of them\n *     the six pixels of that slash, against one when the run is isolated.\n *     ⚠ ONE segment is a path too — `/informe.pdf`, a file at the root of\n *     a storage, which a notification body names that way. It was left out\n *     (the rule wanted two), and the admin Notifications page drew it as\n *     `informe.pdf/` in Arabic (v0.43.0 pack agent). A single segment is\n *     isolated only when its slash STARTS something: not after a Latin\n *     letter or digit (`and/or`, `km/h`, `24/09`, `TCP/IP`), not after\n *     another slash, dot or colon, and only when the segment holds a Latin\n *     letter or digit — so a lone `/` between two Arabic words, `و/أو`,\n *     and a spaced `3 / 10` (the rule above answers that one) stay as\n *     they are. A trailing full stop is the sentence's, not the path's.\n *     ⚠ And the segment has to END there — no colon after it. In\n *     `/المستندات/tag:2026/…` the slash before `tag` is preceded by an\n *     Arabic letter and so starts a one-segment path; left unchecked it\n *     took `/tag`, and the `word:value` token after it — the run that\n *     actually needs isolating — was cut in two.\n *\n * Each is wrapped in LEFT-TO-RIGHT ISOLATE … POP DIRECTIONAL ISOLATE\n * (U+2066 … U+2069), which works where markup cannot go — an input's\n * placeholder, a `title`, an `aria-label` — and is invisible everywhere.\n * A number that `isolateValue` already wrapped still counts: the pattern\n * steps over an isolate mark on either side of it.\n *\n * ⚠ Called ONLY for a right-to-left language — never on its own. `foreignText`\n * below is the one entry point that knows which languages those are; in LTR\n * the text comes back untouched, so the English and Turkish strings are\n * byte-for-byte what they were.\n *\n * ⚠⚠ IDEMPOTENT. Text now reaches a screen through more than one of these\n * gates (a catalogue sentence through `useLocale().t`, a server's sentence\n * through `foreignText`, a failure said by lib/errorWords, a notification\n * composed by the reader), and a run that is already isolated must not\n * collect a second pair of marks — nested isolates draw the same but make a\n * string that no longer equals the one a test wrote.\n */\nconst LTR_RUNS =\n  /[\\u2066-\\u2069]?\\d[\\d.,]*(?:\\s?[A-Za-z%]{1,3})?[\\u2066-\\u2069]?\\s*\\/\\s*[\\u2066-\\u2069]?\\d[\\d.,]*(?:\\s?[A-Za-z%]{1,3})?[\\u2066-\\u2069]?|[A-Za-z][\\w+.-]*:[^\\s,\\u060C)\\u2066-\\u2069]+|\\/(?:[A-Za-z0-9_.~%+-]+\\/)+[A-Za-z0-9_.~%+-]*|(?<![A-Za-z0-9_.~%+:\\/-])\\/(?=[A-Za-z0-9_.~%+-]*[A-Za-z0-9])[A-Za-z0-9_.~%+-]*[A-Za-z0-9_~%+-](?!\\.?[A-Za-z0-9_~%+:-])/g;\n\n/**\n * Is `s` already ONE isolate, opened at its first character and closed at its\n * last?\n *\n * ⚠ Not \"starts with an initiator and ends with a terminator\": the number-pair\n * rule above matches a mark on either side of each number, so\n * `FSI 3 PDI / FSI 10 PDI` — two values isolated separately by `isolateValue` — looks like\n * that and is NOT wrapped as a pair. The depth has to stay inside until the\n * end, or the two halves would never be held together and the slash would\n * still resolve to the paragraph.\n */\nfunction wrapped(s: string): boolean {\n  if (!(s[0] === LRI || s[0] === FSI || s[0] === RLI) || s[s.length - 1] !== PDI) return false;\n  let depth = 0;\n  for (let i = 0; i < s.length; i++) {\n    const c = s[i];\n    if (c === LRI || c === FSI || c === RLI) depth += 1;\n    else if (c === PDI) depth -= 1;\n    if (depth === 0 && i < s.length - 1) return false;\n  }\n  return depth === 0;\n}\n\nexport function isolateLtrRuns(text: string): string {\n  return text.replace(LTR_RUNS, (m: string, offset: number, whole: string) => {\n    if (wrapped(m)) return m;\n    const before = whole[offset - 1];\n    const after = whole[offset + m.length];\n    if ((before === LRI || before === FSI) && after === PDI) return m;\n    return LRI + m + PDI;\n  });\n}\n\n/**\n * ⚠⚠ TEXT FILEX DID NOT WRITE, made readable in `code`'s direction.\n *\n * A sentence the SERVER composed (`server.*`, reaching the browser as the\n * `message` of a refusal), an installed app's own words, a notification built\n * from what happened — none of it passes through `useLocale().t` or the admin\n * panel's post-translation hook, so none of it was isolated. It is exactly\n * the text that carries machine runs: a path, a URL, a command, a token\n * syntax.\n *\n * Measured in the Arabic admin panel (v0.43.0 pack round, the local Arabic\n * test pack): `server.token.scope_unknown` names the syntax\n * `root:<storage>://<folder>`, and the closing `>` — a neutral between the Latin run and the Arabic after\n * it — resolved to the paragraph's direction, jumped to the FAR LEFT of the\n * run and mirrored into `<`, so the line read `…<root:<storage>://<folder`.\n * The same sentence drawn from the catalogue was correct, which is what makes\n * this read as a broken pack rather than as a missing call.\n *\n * ⚠ A pack cannot fix it: bidi control characters are forbidden in a\n * translation and the pack's own validator refuses them (`BIDI`). It is the\n * render site's job, and this is the render site's one function.\n */\nexport function foreignText(code: string | null | undefined, text: string): string {\n  return localeDir(code) === 'rtl' ? isolateLtrRuns(text) : text;\n}\n\n/**\n * A value interpolated into a sentence — a file or folder name, a person —\n * wrapped in FIRST-STRONG ISOLATE … POP DIRECTIONAL ISOLATE, so its own\n * letters decide its direction and it cannot drag the sentence around it:\n * `2026 report.pdf` inside an Arabic sentence keeps its number in front, and\n * an Arabic name inside a sentence keeps its own order.\n *\n * ⚠ RTL only (`useLocale().t`), and for DISPLAY: the marks are invisible but\n * real characters, so a string that becomes data — a file name, a command to\n * copy — must never come from a right-to-left `t()` with a value in it.\n */\nexport function isolateValue(v: string): string {\n  return FSI + v + PDI;\n}\n\n/**\n * The `dir` for a piece of the person's CONTENT drawn inside the interface —\n * a file's first lines on its card. ⚠ Content is not interface: an English\n * README previewed in an Arabic explorer still reads left to right, and an\n * Arabic note in an English one right to left.\n *\n *   code  → `ltr`: machine text, whatever the language around it;\n *   text  → `auto`: the first letter of the text decides (a heading's `#`\n *           stays in front instead of trailing an RTL line);\n *   table → none: a table follows the interface, like every other table.\n */\nexport function contentDir(kind: string): 'ltr' | 'auto' | undefined {\n  if (kind === 'code') return 'ltr';\n  if (kind === 'text') return 'auto';\n  return undefined;\n}\n","/**\n * errorWords — what a FAILURE says to a person. One place, every screen.\n *\n * ⚠⚠ The rule (owner, 2026-09-21, after the QA sweep): a failure is said as a\n * translated sentence that says what happened and, where it applies, what to\n * do. An administrator may see the technical detail as a SECOND line. A\n * regular user never sees an environment variable, a status code or a JSON\n * body. The sweep found all three on screen: \"Config fetch 503: {…}\", \"set\n * FILEX_SECRET_KEY to issue S3 access keys\" in a regular user's panel,\n * \"save failed: 500 {…}\" under an editor, \"engine libreoffice is not\n * installed on this host\" in the operations centre.\n *\n * ⚠⚠ And the sentence is the SERVER's (0.54 audit A1/A2, backend\n * internal/apierr, docs/API-ERRORS.md): a refusal carries `message`, written\n * by the server in the reader's language, and this file shows it. It keeps\n * no table of the server's codes or of its English any more - those tables\n * (CODE_WORDS, JOB_WORDS, CODE_FIELD_WORDS, REASON_WORDS) were copies of the\n * server's words that drifted from it, and the explorer threw the server's\n * own reason away for them. Its own words are only for what never reached\n * the server (the network) and for an answer that carries no sentence (the\n * status's words).\n *\n * So:\n *   - `requestFailure` turns an HTTP refusal into an Error whose `message` is\n *     already the sentence (the server's `message`, else the status's words),\n *     with `status`, the refusal's `code` and the raw body (`detail`) riding\n *     along for whoever may see them. useFileApi's `jsonFetch` / `fetchBlob` /\n *     uploads and every component that calls `fetch` itself go through it.\n *   - `sayFailure` turns ANY caught failure into `{ text, detail? }`: the\n *     sentence for everybody, the raw words only when the caller may\n *     administer the instance (`caller_admin`).\n *   - `jobFailure` is the operations centre's case: the server says a failed\n *     queue row (`error_text`, from its `error_code`), and an app's own words\n *     are shown as they are unless they look like plumbing (`looksTechnical`).\n */\nimport { foreignText } from './direction';\nimport { localeTable } from './uiLocales';\n\ntype Vars = Record<string, string | number>;\n\n/**\n * A translator.\n *\n * ⚠⚠ `foreign` is how a failure carries its reader's DIRECTION. Half of what\n * this file puts on a screen is text filex did not write — the server's own\n * sentence, an app's own words — and none of it passes through\n * `useLocale().t` or the admin panel's post-translation hook, so in Arabic\n * none of it was isolated: a path, a URL or a token syntax inside the\n * sentence lost its neutral characters to the paragraph's direction\n * (lib/direction `foreignText`, measured on `server.token.scope_unknown`).\n * Threading a locale code through five signatures would have been five\n * chances to forget it; the translator already travels with every call, so it\n * carries the answer. A `t` that does not know (a test stub, a literal\n * fallback) simply passes the text through.\n */\nexport interface T {\n  (key: string, vars?: Vars): string;\n  /** Machine runs inside this language's sentences, isolated (RTL only). */\n  foreign?: (text: string) => string;\n}\n\n/** Say `text` — which filex did not write — the way `t`'s language needs. */\nfunction foreignWith(t: T | undefined, text: string): string {\n  return typeof t?.foreign === 'function' ? t.foreign(text) : text;\n}\n\n/** A translator for a bare locale code — for callers with no `useLocale`. */\nexport function wordsIn(locale: string | undefined): T {\n  const t: T = (key, vars = {}) => {\n    const raw = localeTable(locale)[key] ?? key;\n    const said = Object.entries(vars).reduce((acc, [k, v]) => acc.replaceAll(`{${k}}`, String(v)), raw);\n    // ⚠ Isolated like `useLocale().t`'s output: this path never reached\n    // `render()`, so an engine name or a size pair in a failure's sentence was\n    // drawn raw in an Arabic panel while the same words elsewhere were right.\n    return foreignText(locale, said);\n  };\n  t.foreign = (text: string) => foreignText(locale, text);\n  return t;\n}\n\n/** An HTTP refusal, said. `message` is the sentence; the rest is for code\n *  that branches on it and for an administrator's second line. */\nexport interface RequestFailure extends Error {\n  status?: number;\n  /** The refusal's own code (`{\"error\":\"read_only\"}` → `read_only`), or ''. */\n  code?: string;\n  /** The raw body, clipped — NEVER shown to a regular user. */\n  detail?: string;\n  /** Marks an Error whose `message` is already the sentence. */\n  said?: true;\n  /** `admin_hint` — the fix, which the SERVER sends only to a caller who can\n   *  act on it (handlers/tenantown.go `callerMayConfigureInstance`). */\n  hint?: string;\n  /** The server's own sentence (`message`), whole: `detail` is clipped. */\n  server?: string;\n  /** The refusal's `reason` (`{\"error\":\"e2e_not_allowed\",\"reason\":\"policy_off\"}`),\n   *  kept whole. ⚠ `detail` is clipped to 300 characters, and a Go map writes\n   *  its keys in order — error, message, reason — so a long `message` pushes\n   *  the reason past the clip; saying the refusal again from `detail` alone\n   *  (sayFailure with a `t`) would lose it. */\n  reason?: string;\n}\n\nconst STATUS_KEYS: Record<number, string> = {\n  400: 'err.status.400',\n  401: 'err.status.401',\n  403: 'err.status.403',\n  404: 'err.status.404',\n  409: 'err.status.409',\n  413: 'err.status.413',\n  415: 'err.status.415',\n  422: 'err.status.422',\n  429: 'err.status.429',\n  500: 'err.status.500',\n  501: 'err.status.501',\n  /* ⚠ 502 and 504 are what an APP answers with (handlers/app_plugins.go\n     callFail: any plugin error, and a plugin that ran out of time). */\n  502: 'err.status.502',\n  503: 'err.status.503',\n  504: 'err.status.504',\n};\n\n/** A status's words. ⚠ An unlisted status is NOT printed as \"Error (418)\":\n *  a number is not a sentence, and it is the one thing this file exists to\n *  keep off the screen. */\nexport function statusWords(status: number, locale: string | undefined): string {\n  return statusWordsWith(status, wordsIn(locale));\n}\n\nfunction statusWordsWith(status: number, t: T): string {\n  return t(STATUS_KEYS[status] ?? (status >= 500 ? 'err.status.500' : 'err.status.other'));\n}\n\n/**\n * Whether a status's own words tell a person something the caller's words\n * would not: a refusal they can act on (401 sign in, 403 not allowed, 404\n * gone, 409 conflict, 413 too large, 429 slow down…). A 5xx, or a status with\n * no words of its own, says only \"it failed\" — the caller's sentence for what\n * it was doing (\"Your changes could not be saved\") says more.\n */\nexport function statusIsTelling(status: number): boolean {\n  return status >= 400 && status < 500 && status in STATUS_KEYS;\n}\n\n/** The server's own sentence in a refusal body (`message`), or ''. */\nfunction messageOf(fields: Record<string, unknown>): string {\n  const m = fields.message;\n  return typeof m === 'string' ? m.trim() : '';\n}\n\n/**\n * The server's sentence in a refusal's data, isolated for the reader's\n * direction, or '' when it sent none - for a client that holds the answer's\n * data rather than its text (the admin panel's axios errors, web api/client\n * `extractError`). The explorer reads the same field through\n * `requestFailure`, so the two say one sentence about one refusal (0.54\n * audit A1: the admin panel showed the server's reason, the explorer its own\n * \"You are not allowed to do this\").\n */\nexport function serverSaid(data: unknown, locale: string | undefined): string {\n  if (!data || typeof data !== 'object' || Array.isArray(data)) return '';\n  const said = messageOf(data as Record<string, unknown>);\n  return said ? foreignText(locale, said) : '';\n}\n\nfunction fieldsOf(body: string): Record<string, unknown> {\n  try {\n    const parsed = JSON.parse(body) as unknown;\n    return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? (parsed as Record<string, unknown>) : {};\n  } catch {\n    return {};\n  }\n}\n\n/** The `error` field of a JSON refusal body, or ''. */\nexport function refusalCode(body: string): string {\n  const v = fieldsOf(body).error;\n  return typeof v === 'string' ? v : '';\n}\n\n/** The words for a refusal: what the server SAID (`message`), the status's\n *  words when it said nothing. */\nexport function refusalWords(status: number, body: string, locale: string | undefined): string {\n  return refusalWordsWith(status, body, wordsIn(locale));\n}\n\n/**\n * `whole` is the refusal as `requestFailure` read it, for a caller that says it\n * again from the clipped `detail` (sayFailure): the server's whole sentence\n * stands in for what the clip cut off.\n *\n * ⚠ The server's sentence is isolated for the reader's direction (`T.foreign`):\n * it never passed through a translator, and a path or a name in it would lose\n * its neutral characters in an Arabic line.\n */\nfunction refusalWordsWith(status: number, body: string, t: T, whole: Pick<RequestFailure, 'server'> = {}): string {\n  const said = whole.server || messageOf(fieldsOf(body));\n  if (said) return foreignWith(t, said);\n  return statusWordsWith(status, t);\n}\n\n/** An HTTP refusal as an Error carrying its own sentence. */\nexport function requestFailure(status: number, body: string, locale: string | undefined): RequestFailure {\n  const fields = fieldsOf(body);\n  const server = messageOf(fields);\n  const err = new Error(refusalWordsWith(status, body, wordsIn(locale), { server })) as RequestFailure;\n  err.status = status;\n  err.code = refusalCode(body);\n  err.detail = body.slice(0, 300);\n  err.said = true;\n  if (server) err.server = server;\n  const hint = fields.admin_hint;\n  if (typeof hint === 'string' && hint) err.hint = hint;\n  if (typeof fields.reason === 'string' && fields.reason) err.reason = fields.reason;\n  return err;\n}\n\n/**\n * What to print for a refusal on a screen that used to print the server's\n * `error` field as it came (the connection panels: keys, tokens, exports).\n *\n * The server's sentence (`message`) is said as it came; an older refusal\n * that put a sentence written for a person in `error` (\"public key is not a\n * valid OpenSSH key\") is kept too, because the status's words would lose what\n * went wrong; plumbing and bare codes fall back to the status's words.\n *\n * ⚠ This replaced five copies of one helper that printed the field whatever\n * it held - including an environment variable to a regular user.\n */\nexport function serverWords(err: unknown, locale?: string): string {\n  // ⚠ `locale` is the reader's: what comes back may be the SERVER's sentence,\n  // which never passed through a translator, and an Arabic panel needs its\n  // machine runs isolated (lib/direction `foreignText`).\n  const say = (text: string): string => foreignText(locale, text);\n  const e = err as Partial<RequestFailure> | null | undefined;\n  if (!e || e.said !== true) return say(e instanceof Error ? e.message : err ? String(err) : '');\n  if (e.server) return say(e.server);\n  const own = e.code ?? '';\n  if (own && !looksTechnical(own) && !/^[a-z0-9_]+$/.test(own)) return say(own);\n  return say(e.message ?? '');\n}\n\n/** The request never got an answer (offline, DNS, CORS, a dropped socket). */\nexport function networkFailure(locale: string | undefined, cause?: unknown): RequestFailure {\n  const err = new Error(wordsIn(locale)('err.network')) as RequestFailure;\n  err.detail = cause instanceof Error ? cause.message : cause ? String(cause) : '';\n  err.said = true;\n  return err;\n}\n\n/**\n * True for text a person should not be shown as the sentence: a JSON body, a\n * status line, an environment variable, a Go error chain, a stack trace, a\n * file path on the server.\n *\n * ⚠ It guards words that came from somewhere we do not control — an app's\n * own error text above all. A real sentence (\"Bu belge zaten imzalanmış\")\n * passes; plumbing does not. It is deliberately greedy: a human sentence\n * mistaken for plumbing costs the person the app's wording (they still read\n * a sentence), plumbing mistaken for a sentence is the defect.\n */\nexport function looksTechnical(s: string): boolean {\n  const v = s.trim();\n  if (!v) return false;\n  return (\n    /^[[{]/.test(v) || // a JSON body\n    /\\b[1-5]\\d\\d\\b\\s+[A-Z][a-z]+/.test(v) || // \"500 Internal Server Error\"\n    /\\b[A-Z][A-Z0-9]+_[A-Z0-9_]+\\b/.test(v) || // FILEX_SECRET_KEY\n    /\\b(panic|goroutine|stack trace|Traceback|at [\\w$.]+ \\()/i.test(v) ||\n    /^[\\w.-]+: [\\w.-]+(: |$)/.test(v) || // \"protocolauth: no secret key…\"\n    /(^|\\s)\\/(?:[\\w.-]+\\/){2,}/.test(v) || // /var/lib/filex/…\n    /\\b[a-z][\\w.-]*: [^:()]{1,60}: [a-z][\\w.-]*: /i.test(v) || // a Go error chain \"a: b: c: d\"\n    /\\b(ECONNREFUSED|ETIMEDOUT|EOF|nil pointer|dial tcp|x509|context deadline exceeded)\\b/i.test(v)\n  );\n}\n\n/** `\"<sentence> (<plumbing>)\"` → `[sentence, plumbing]`; anything else → `[raw, '']`. */\nexport function splitTechnicalTail(raw: string): [string, string] {\n  const m = /^(.*\\S)\\s*\\(([^()]*)\\)\\s*$/.exec(raw);\n  if (m && looksTechnical(m[2])) return [m[1], m[2]];\n  return [raw, ''];\n}\n\n/** A failure, said: the sentence for everybody, the raw words for an admin. */\nexport interface SaidFailure {\n  text: string;\n  /** Present only when the caller may administer the instance. */\n  detail?: string;\n}\n\n/**\n * Say a caught failure.\n *\n * A `RequestFailure` already carries its sentence (`message`); anything else —\n * a thrown JS error, a library's message — is said as `fallback`, because its\n * text was written for a developer. The raw words go to the console as well,\n * where the person debugging looks for them.\n */\nexport function sayFailure(\n  err: unknown,\n  fallback: string,\n  opts: {\n    callerAdmin?: boolean;\n    /** The caller's own translator. A viewer knows `t` but not the locale\n     *  code a refusal was built with, so the refusal is said again in its\n     *  words rather than in whatever language the request was made in. */\n    t?: T;\n  } = {},\n): SaidFailure {\n  const e = err as Partial<RequestFailure> | null | undefined;\n  const said = e?.said === true;\n  const raw = said ? (e?.detail ?? '') : e instanceof Error ? e.message : err ? String(err) : '';\n  const text = !said\n    ? fallback\n    : opts.t && typeof e?.status === 'number'\n      ? refusalWordsWith(e.status, e.detail ?? '', opts.t, { server: e.server })\n      : e?.message || fallback;\n  if (!said && raw && typeof console !== 'undefined') console.warn('[filex]', raw);\n  // ⚠ Both lines are isolated for the reader's direction: `text` may be the\n  // fallback the caller wrote (already said by ITS `t`, and isolation is\n  // idempotent) and `detail` is the raw server words — a JSON body, a path,\n  // an error chain, all of it machine text an Arabic line would scramble.\n  const shown = foreignWith(opts.t, text);\n  const detail = foreignWith(opts.t, raw);\n  return opts.callerAdmin && raw && raw !== text ? { text: shown, detail } : { text: shown };\n}\n\n/** What the server says about a failed app job (ops row `error_code`). */\nexport type JobErrorCode =\n  | 'timeout'\n  | 'out_of_memory'\n  | 'crashed'\n  | 'app_removed'\n  | 'action_removed'\n  | 'engine_missing'\n  | 'office_unconfigured'\n  | 'cancelled'\n  | 'app';\n\n/**\n * A failed operation, said - the operations centre and its toast.\n *\n * The server says a failed row (`error_text`, made from the row's\n * `error_code` in the reader's language, backend ops/errcode.go); the raw\n * `error` stays the admin's second line. With no sentence, an app's own words\n * are shown when they are words (`app`), and anything else is `fallback`.\n */\n/** A queue row, as usePendingOps normalises it. */\nexport interface FailedOpLike {\n  op_type?: string;\n  label?: string;\n  action?: string;\n  error_message?: string | null;\n  error_code?: string | null;\n  error_engine?: string | null;\n  /** The server's sentence for the failure, in the reader's language. */\n  error_text?: string | null;\n}\n\n/**\n * A failed QUEUE row, said — the one call the tray and the explorer's toast\n * share, so the two can never say different things about one failure.\n * ⚠ Before it, the toast passed the row itself and read `op.error` — a field\n * a queue row does not have (it is `error_message`) — and always said the\n * fallback while the tray beside it said the app's words.\n */\nexport function opFailure(op: FailedOpLike, t: T, opts: { callerAdmin?: boolean } = {}): SaidFailure {\n  const isApp = op.op_type === 'plugin' || op.op_type === 'plugin-action';\n  const fallback = isApp\n    ? t('plugin.failed', { label: op.label || op.action || t('opc.kind.plugin') })\n    : t('toast.failed');\n  return jobFailure(\n    { error: op.error_message, error_code: op.error_code, error_engine: op.error_engine, error_text: op.error_text },\n    fallback,\n    t,\n    opts,\n  );\n}\n\nexport function jobFailure(\n  op: { error?: string | null; error_code?: string | null; error_engine?: string | null; error_text?: string | null },\n  fallback: string,\n  t: T,\n  opts: { callerAdmin?: boolean } = {},\n): SaidFailure {\n  const raw = (op.error ?? '').trim();\n  const admin = opts.callerAdmin === true;\n  /** ⚠ The APP's own words and the raw failure both come from outside the\n   *  catalogue, so both are isolated for the reader's direction (`T.foreign`,\n   *  lib/direction `foreignText`): an app's sentence ends in a library error\n   *  in brackets, and an engine's name, a path or a `a: b: c` chain drawn in\n   *  an Arabic line loses its neutral characters to the paragraph. */\n  const say = (text: string): string => foreignWith(t, text);\n  const withDetail = (text: string): SaidFailure =>\n    admin && raw && raw !== text ? { text: say(text), detail: say(raw) } : { text: say(text) };\n  // The server's sentence: a timeout, a missing engine (the administrator's\n  // form for an administrator), a taken name, an entry gone from the trash…\n  const said = (op.error_text ?? '').trim();\n  if (said) return withDetail(said);\n  switch (op.error_code) {\n    case 'cancelled':\n      return { text: t('opc.status.aborted') };\n    case 'app': {\n      // The app's own words, meant for the person (wasmplugin CallError:\n      // \"safe for a user; the guest's own words\") — unless they are plumbing.\n      // ⚠ An app often ends its sentence with the library's error in\n      // brackets: \"hiçbir dosya dönüştürülemedi — broken.docx: dönüşüm\n      // başarısız oldu (office: not a zip package: zip: not a valid zip\n      // file)\" was on a regular user's screen (2026-09-21). The sentence is\n      // kept, the bracket goes to the admin's second line.\n      const [sentence, tail] = splitTechnicalTail(raw);\n      if (sentence && !looksTechnical(sentence)) {\n        return tail && admin ? { text: say(sentence), detail: say(raw) } : { text: say(sentence) };\n      }\n      return withDetail(fallback);\n    }\n    default:\n      break;\n  }\n  return withDetail(fallback);\n}\n","/**\n * drafts — a new document is a DRAFT until its first save (issue #71).\n *\n * \"New document\" writes a draft: a real file in the storage the person chose,\n * in their own drafts area (`<storage>://.filex-drafts/<user id>/<key>/<name>`,\n * the server's syspath.Drafts), which every editor opens as the file it is.\n * The server remembers where it is meant to go. \"Save\" moves it there — or,\n * when something already has its name, says so and offers `name (2).ext`;\n * \"Discard\" sends it to the trash; closing its editor keeps it in Drafts.\n *\n * ⚠ ONE client for every caller: the explorer (its Drafts view, the New\n * document dialog), the viewer/editor (PreviewModal — its Save button and its\n * close question) and so every host that mounts them: fm, the desktop app,\n * the embeds. Each hands over how it talks to the server (a `DraftsTransport`)\n * and nothing else, so no caller owns a second spelling of an endpoint.\n *\n * The endpoints are docs/API.md → Drafts.\n */\nimport { requestFailure, type RequestFailure } from './errorWords';\n\n/** One draft, as the server answers it. */\nexport interface DraftDto {\n  key: string;\n  /** The file's name — the name it is meant to have. */\n  name: string;\n  /** Where the draft's bytes are (adapter-qualified): what an editor opens. */\n  path: string;\n  storage: string;\n  /** Where it is meant to go, adapter-qualified: the folder, and the file. */\n  target_dir: string;\n  target: string;\n  /** The New-document type it was made as (`txt`, `docx`, …). */\n  type: string;\n  size: number;\n  mime?: string;\n  created_at: string;\n  modified_at?: string;\n}\n\nexport interface DraftList {\n  drafts: DraftDto[];\n  count: number;\n  limit: number;\n}\n\n/** What `save` came to. */\nexport type DraftSaveOutcome =\n  | { saved: true; path: string; name: string; targetDir: string }\n  /** Something already has the draft's name there. Nothing moved; the person\n   *  is asked, and `save(key, suggested)` saves under the free name. */\n  | { saved: false; taken: true; name: string; suggested: string; targetDir: string };\n\n/**\n * How a caller reaches the server: a fetch that already carries the caller's\n * credentials (headers, cookies) — the explorer's `useFileApi`, the viewer's\n * `authHeaders` — plus the locale refusals are said in.\n */\nexport interface DraftsTransport {\n  request(url: string, init?: RequestInit): Promise<Response>;\n  locale?: string;\n}\n\n/** Refusal codes the server answers a draft request with (handlers/drafts.go). */\nexport const DRAFT_LIMIT = 'DRAFT_LIMIT';\nexport const DRAFT_TARGET_TAKEN = 'TARGET_TAKEN';\nexport const DRAFT_FOLDER_GONE = 'FOLDER_GONE';\n\n/**\n * A field of a refusal's JSON body. ⚠ Not `err.code`: that is the body's\n * `error` field (lib/errorWords `refusalCode`), and the draft doors name their\n * refusal in a `code` field beside an English `error`.\n */\nfunction refusalField(err: unknown, key: string): unknown {\n  const detail = (err as RequestFailure | null)?.detail;\n  if (!detail) return undefined;\n  try {\n    const body = JSON.parse(detail) as Record<string, unknown>;\n    return body && typeof body === 'object' ? body[key] : undefined;\n  } catch {\n    return undefined;\n  }\n}\n\n/** Is this failure \"you already keep as many drafts as this server allows\"? */\nexport function isDraftLimit(err: unknown): boolean {\n  return refusalField(err, 'code') === DRAFT_LIMIT;\n}\n\n/** Is this failure \"the folder this draft is meant for is not there any more\"? */\nexport function isDraftFolderGone(err: unknown): boolean {\n  return refusalField(err, 'code') === DRAFT_FOLDER_GONE;\n}\n\n/** The limit a DRAFT_LIMIT refusal names, when it names one. */\nexport function draftLimitOf(err: unknown): number | null {\n  const n = refusalField(err, 'limit');\n  return typeof n === 'number' && n > 0 ? n : null;\n}\n\n/**\n * The drafts API at `base` (`<api>/api/files/drafts`), over `transport`.\n *\n * Every refusal is thrown as the one RequestFailure every screen already says\n * in words (lib/errorWords) — except the answer `save` is FOR: a taken name is\n * not a failure but a question, and comes back as `{saved: false, taken}`.\n */\nexport function draftsClient(base: string, transport: DraftsTransport) {\n  const root = base.replace(/\\/+$/, '');\n  const one = (key: string) => `${root}/${encodeURIComponent(key)}`;\n\n  async function call<T>(url: string, init: RequestInit = {}): Promise<{ status: number; body: T | null; text: string }> {\n    const res = await transport.request(url, {\n      ...init,\n      headers: { 'Content-Type': 'application/json', ...((init.headers as Record<string, string>) ?? {}) },\n    });\n    const text = await res.text().catch(() => '');\n    let body: T | null = null;\n    if (text) {\n      try {\n        body = JSON.parse(text) as T;\n      } catch {\n        body = null;\n      }\n    }\n    return { status: res.status, body, text };\n  }\n\n  function fail(status: number, text: string): never {\n    throw requestFailure(status, text, transport.locale);\n  }\n\n  return {\n    /**\n     * New document, as a draft (the New document dialog's request): the same\n     * body as `action=newfile`, answered with the same fields — `path` is the\n     * draft's — plus the draft itself. A refusal throws; DRAFT_LIMIT is the\n     * one the dialog says in its own words (isDraftLimit).\n     */\n    async create(\n      path: string,\n      name: string,\n      type: string,\n      opts: { exactName?: boolean } = {},\n    ): Promise<{ path: string; name: string; ext: string; size: number; mime: string; draft: DraftDto }> {\n      const r = await call<{ path: string; name: string; ext: string; size: number; mime: string; draft: DraftDto }>(root, {\n        method: 'POST',\n        body: JSON.stringify(opts.exactName ? { path, name, type, exact_name: true } : { path, name, type }),\n      });\n      if (r.status !== 201 || !r.body?.draft) fail(r.status, r.text);\n      return r.body;\n    },\n    /** Every draft of the caller's, across every storage they can see. */\n    async list(): Promise<DraftList> {\n      const r = await call<DraftList>(root);\n      if (r.status !== 200 || !r.body) fail(r.status, r.text);\n      return { drafts: r.body.drafts ?? [], count: r.body.count ?? 0, limit: r.body.limit ?? 0 };\n    },\n    /** How many — the navigation panel's badge. */\n    async count(): Promise<{ count: number; limit: number }> {\n      const r = await call<{ count: number; limit: number }>(`${root}/count`);\n      if (r.status !== 200 || !r.body) fail(r.status, r.text);\n      return { count: r.body.count ?? 0, limit: r.body.limit ?? 0 };\n    },\n    /** One draft — what an editor on a draft's path asks. */\n    async get(key: string): Promise<DraftDto> {\n      const r = await call<DraftDto>(one(key));\n      if (r.status !== 200 || !r.body) fail(r.status, r.text);\n      return r.body;\n    },\n    /**\n     * Save the draft where it is meant to go — under `as` when given (only\n     * ever the `suggested` name a taken answer offered).\n     */\n    async save(key: string, as?: string): Promise<DraftSaveOutcome> {\n      const r = await call<{\n        path?: string;\n        name?: string;\n        target_dir?: string;\n        code?: string;\n        suggested?: string;\n      }>(`${one(key)}/save`, { method: 'POST', body: JSON.stringify(as ? { as } : {}) });\n      if (r.status === 200 && r.body?.path) {\n        return { saved: true, path: r.body.path, name: r.body.name ?? '', targetDir: r.body.target_dir ?? '' };\n      }\n      if (r.status === 409 && r.body?.code === DRAFT_TARGET_TAKEN && r.body.suggested) {\n        return {\n          saved: false,\n          taken: true,\n          name: r.body.name ?? '',\n          suggested: r.body.suggested,\n          targetDir: r.body.target_dir ?? '',\n        };\n      }\n      fail(r.status, r.text);\n    },\n    /** Discard it: the draft goes to the trash (restorable until it ages out). */\n    async discard(key: string): Promise<void> {\n      const r = await call<unknown>(one(key), { method: 'DELETE' });\n      if (r.status !== 200) fail(r.status, r.text);\n    },\n  };\n}\n\nexport type DraftsClient = ReturnType<typeof draftsClient>;\n\n/**\n * The folder a draft is meant for, as a person reads it: `docs / Reports`,\n * the storage first. `target_dir` is adapter-qualified (`docs://Reports`).\n */\nexport function draftFolderLabel(targetDir: string): string {\n  const at = targetDir.indexOf('://');\n  const storage = at >= 0 ? targetDir.slice(0, at) : '';\n  const rel = (at >= 0 ? targetDir.slice(at + 3) : targetDir).replace(/^\\/+|\\/+$/g, '');\n  return [storage, ...rel.split('/').filter(Boolean)].filter(Boolean).join(' / ');\n}\n","/**\n * plural — which form of a counted message a language reads for a number.\n *\n * ⚠⚠ Why this exists. Both catalogues used to have ONE plural rule, English's:\n * the explorer chose `<key>_one` when the count was exactly 1 and `<key>`\n * otherwise, and the admin panel left vue-i18n on its default (two forms:\n * 1 → first, else second; three forms: 0 / 1 / else). That is enough for\n * English and Turkish and for nothing much else. The Arabic pack's translator\n * could not write the language at all — Arabic has SIX cardinal categories\n * (zero, one, two, few, many, other) — and Russian, Polish, Czech and\n * Ukrainian need few/many beside one (found by the Arabic pack, v0.43.0).\n *\n * The categories are the Unicode CLDR's, and they come from the runtime's own\n * `Intl.PluralRules`: every browser and Node ship the CLDR tables, so the\n * product does not carry (and cannot get out of date with) a copy of them.\n *\n * The grammar a pack writes, which `docs/` and the pack validator describe:\n *\n *   explorer (packages/core/src/locales, flat keys)\n *     `<key>_zero` `<key>_one` `<key>_two` `<key>_few` `<key>_many`, and the\n *     plain `<key>` IS the `other` form (there is no `_other` key). A language\n *     writes only the categories it has; see `useLocale → countedKey`.\n *\n *   admin (web/src/locales, vue-i18n `a | b | …`)\n *     as many forms as the language has categories (those whole numbers\n *     0 … 999 reach, plus `other` — see `pluralCategories`), in CLDR order —\n *     Arabic `zero | one | two | few | many | other`, Russian `one | few |\n *     many | other` — or the old 1 / 2 / 3-form shapes; see\n *     `pluralChoiceIndex`.\n */\n\n/** The CLDR cardinal categories in the order a message lists its forms. */\nexport const CLDR_ORDER = ['zero', 'one', 'two', 'few', 'many', 'other'] as const;\nexport type PluralCategory = (typeof CLDR_ORDER)[number];\n\n/** What a runtime with no usable `Intl.PluralRules` is treated as: English. */\nconst ENGLISH_CATEGORIES: readonly string[] = ['one', 'other'];\n\n/**\n * One `Intl.PluralRules` per language. `null` = the runtime has none at all.\n *\n * ⚠ Cached because `t()` asks once per counted string per repaint, and\n * constructing a `PluralRules` is the expensive part (`select` is cheap). A\n * session has two or three distinct tags.\n */\nconst rulesCache = new Map<string, Intl.PluralRules | null>();\n\nfunction rulesFor(lang: string | undefined | null): Intl.PluralRules | null {\n  const key = String(lang ?? '');\n  const hit = rulesCache.get(key);\n  if (hit !== undefined) return hit;\n  let rules: Intl.PluralRules | null = null;\n  if (typeof Intl !== 'undefined' && typeof Intl.PluralRules === 'function') {\n    try {\n      rules = new Intl.PluralRules(key || 'en');\n    } catch {\n      // ⚠ A tag `Intl` refuses (`RangeError: Incorrect locale information`)\n      // must not take the page down with it — a pack names its language\n      // itself, and the host only checks that it LOOKS like a tag. English\n      // rules are what the rest of the interface falls back to as well.\n      try {\n        rules = new Intl.PluralRules('en');\n      } catch {\n        rules = null;\n      }\n    }\n  }\n  rulesCache.set(key, rules);\n  return rules;\n}\n\nconst categoriesCache = new Map<string, readonly string[]>();\n\n/** The whole numbers sampled to find a language's categories: 0 … 999. */\nconst SAMPLE_MAX = 999;\n\n/**\n * The categories `lang` HAS, in CLDR order: every category some whole number\n * from 0 to 999 falls in, plus `other` always.\n *\n * ⚠⚠ NOT `resolvedOptions().pluralCategories`. Current ICU lists `many` for\n * Spanish, French, Italian, Portuguese and Catalan — a category only exact\n * millions and compact numbers reach (`select(1000000)` is 'many') — so\n * Spanish would have three categories, and a Spanish admin string written in\n * the classic three forms `zero | one | other` would be read in CLDR order\n * (`one | many | other`): 1 would pick the \"zero\" form. Counting what whole\n * numbers people actually see select gives es/fr/it/pt `one | other`, Russian\n * `one | few | many | other`, Arabic all six, Japanese `other`, Latvian\n * `zero | one | other`, Romanian `one | few | other`.\n *\n * ⚠ The SAME definition as the pack validator (scripts/i18n-validate.mjs) and\n * the server (Go, golang.org/x/text CLDR tables, sampled 0 … 999 + other). A\n * third definition here would pass a pack there that renders wrong here.\n *\n * ⚠ In CLDR order, whatever order the runtime answers in: the admin panel\n * maps a message's forms to categories BY POSITION — an unsorted list would\n * hand Arabic's \"few\" form to the number 0.\n *\n * Cached: a thousand `select` calls, once per language per page.\n */\nexport function pluralCategories(lang: string | undefined | null): readonly string[] {\n  const key = String(lang ?? '');\n  const hit = categoriesCache.get(key);\n  if (hit) return hit;\n  let out: readonly string[] = ENGLISH_CATEGORIES;\n  const rules = rulesFor(key);\n  if (rules) {\n    try {\n      const seen = new Set<string>(['other']);\n      for (let n = 0; n <= SAMPLE_MAX; n++) seen.add(rules.select(n));\n      out = CLDR_ORDER.filter((c) => seen.has(c));\n    } catch {\n      out = ENGLISH_CATEGORIES;\n    }\n  }\n  categoriesCache.set(key, out);\n  return out;\n}\n\n/**\n * The category `lang` puts the number `n` in — `'one'`, `'few'`, `'other'`…\n *\n * ⚠ The absolute value: \"−1 day\" agrees like \"1 day\", and `select` has no\n * opinion about a sign. A count that is not a finite number (a formatted\n * \"1,234\" that `Number()` could not read) is `other`, the plain form, which\n * is what the single `_one` rule this replaced did with it too.\n */\nexport function pluralCategory(lang: string | undefined | null, n: number): string {\n  if (!Number.isFinite(n)) return 'other';\n  const abs = Math.abs(n);\n  const rules = rulesFor(lang);\n  if (!rules) return abs === 1 ? 'one' : 'other';\n  try {\n    return rules.select(abs);\n  } catch {\n    return abs === 1 ? 'one' : 'other';\n  }\n}\n\n/**\n * Which of a vue-i18n message's `|`-separated forms `lang` reads for `choice`\n * — a vue-i18n `pluralRules` entry, `(choice, choicesLength) => index`.\n *\n *   - as many forms as the language has categories (more than one, and\n *     \"has\" as `pluralCategories` counts them): those categories, in CLDR\n *     order — Arabic `zero | one | two | few | many | other`, Russian\n *     `one | few | many | other`, Romanian `one | few | other`;\n *   - one form: that form (a language that does not inflect);\n *   - two: `one | other`;\n *   - three: the classic `zero | one | other`;\n *   - anything else: the last form, which is the `other` one.\n *\n * ⚠ The first rule outranks the next three, so a language with exactly three\n * categories (Latvian, Romanian) writes three forms in CLDR order, not as\n * `zero | one | other`. Spanish, French, Italian and Portuguese are NOT among\n * them — see `pluralCategories` on the `many` ICU lists for round millions —\n * so their three-form strings stay classic.\n *\n * ⚠ English and Turkish are not routed here — they keep vue-i18n's own rule,\n * which the shipped catalogues were written against (web/src/i18n).\n */\nexport function pluralChoiceIndex(\n  lang: string | undefined | null,\n  choice: number,\n  choicesLength: number,\n): number {\n  const n = Math.abs(choice);\n  const cats = pluralCategories(lang);\n  const c = pluralCategory(lang, n);\n  if (choicesLength === cats.length && choicesLength > 1) {\n    // ⚠ A category outside the sampled list is real: Spanish `select(1000000)`\n    // is 'many', and Spanish's list is `one | other`. It reads the last form\n    // (`other`) — -1 would make vue-i18n print nothing at all.\n    const i = cats.indexOf(c);\n    return i >= 0 ? i : choicesLength - 1;\n  }\n  if (choicesLength === 1) return 0;\n  if (choicesLength === 2) return c === 'one' ? 0 : 1;\n  if (choicesLength === 3) return n === 0 ? 0 : c === 'one' ? 1 : 2;\n  return choicesLength - 1;\n}\n","/**\n * timezone.ts — whose clock an instant is read on.\n *\n * A timestamp is an instant. `last_modified` is the same number for everybody\n * on the planet; what differs is the clock it is read against. The owner's\n * rule, verbatim: *\"ben 03'te video yükledim, GMT 0 eleman o videonun yüklenme\n * saatini kendi zaman diliminde görecek.\"* So the instant stays untouched on\n * the wire and the READER picks the clock.\n *\n * ⚠⚠ WHICH reader is a question with several answers, and this module is the\n * ONE place they are ranked. Before it, the admin web app followed the account\n * and an embedded `<filex-explorer>` on another origin followed the browser —\n * a person who chose Tokyo saw Tokyo in one and their laptop's zone in the\n * other, for the same file. That disagreement is the bug this exists to end,\n * so every surface resolves through `resolveTimeZone()` and nothing else\n * decides.\n *\n * The owner's ruling (2026-09-14): three tiers — the embedder, then the\n * account behind the key when it IS a person's key, then the browser — plus a\n * setting inside the embed, kept in the browser, because an embed has no\n * user-settings dialog. Where that setting ranks is `TIME_ZONE_TIERS` below,\n * and the reasoning is on it.\n *\n * Scope: page-level, deliberately. The clock belongs to the person looking at\n * the page, and there is one of them. Host and account zones are REGISTERED by\n * whoever knows them (an explorer instance, the web app's auth store) under an\n * owner key, so an explorer that unmounts takes its zones with it instead of\n * leaving them behind for the next one. Two explorers on one page that\n * disagree about a host zone, or hold different people's tokens, resolve to\n * the most recently written value for both — one viewer, one clock.\n *\n * The same-tab `filex:timezone` event survives from the previous design and for\n * the same reason: the admin app and a `<filex-explorer>` web component on one\n * page can be two different BUNDLES, i.e. two copies of this module, and a ref\n * in one says nothing to the other. The event crosses that gap for the one tier\n * that is shared state by nature — the browser's.\n */\n\nimport { computed, ref, type InjectionKey, type Ref } from 'vue';\n\n/* ── the order ────────────────────────────────────────────────────────── */\n\n/**\n * The places a zone can come from.\n *\n *   viewer  — the person looking at this page picked one in THIS browser\n *             (the explorer's \"⋯\" → Time zone). localStorage, per origin.\n *   host    — the embedder set `config.timeZone` on the explorer.\n *   account — the account behind the credential, from `GET /api/auth/me`, and\n *             ONLY when that credential is a person's (a cookie session or\n *             their own API key). An `app` token is shared by every visitor of\n *             the embed that holds it, so its owner's zone is nobody's clock\n *             and the tier is skipped.\n *   device  — the browser's own zone, resolved live by `Intl`.\n */\nexport type TimeZoneTier = 'viewer' | 'host' | 'account' | 'device';\n\n/**\n * ⚠⚠ THE order. First tier holding a valid zone wins; `device` always holds\n * one. Flipping a ranking is a change to this array and to nothing else — the\n * resolver, the explorer, the web app and the embed's own dialog all read it\n * (pinned by web/tests/lib/timeZoneTiers.test.ts).\n *\n * `viewer` is on top, above the embedder the owner numbered \"1\", and that is a\n * judgement rather than a transcription:\n *\n *   - A host's `config.timeZone` is a DEFAULT it chooses for everybody who\n *     visits, written before any of them arrived. A viewer's pick is a\n *     decision one person made on purpose, afterwards, in a control that\n *     exists for nothing else. If the host outranked it, every host that sets\n *     a zone would ship an embed whose Time zone control visibly does nothing\n *     — and a control that saves, reads back and changes nothing is worse than\n *     no control.\n *   - The explorer already ranks the same two things this way for the theme\n *     mode: `config.theme` is what `'host'` (never chosen) resolves to, and\n *     the first click in the gallery pins the viewer's own choice above it\n *     (FileExplorer.vue, `themeMode`). One product, one answer to \"does the\n *     host or the person decide how this looks\".\n *   - The pick is cheap to undo: the picker's first row is \"use the default\",\n *     and that row names the zone and the tier it falls back to.\n *\n * Below the viewer, the owner's own numbering stands as given.\n */\nexport const TIME_ZONE_TIERS: readonly TimeZoneTier[] = Object.freeze([\n  'viewer',\n  'host',\n  'account',\n  'device',\n] as TimeZoneTier[]);\n\n/** A value per tier. Empty, missing or engine-rejected means \"no opinion\". */\nexport type TimeZoneSources = Partial<Record<Exclude<TimeZoneTier, 'device'>, string | null>>;\n\nexport interface ResolvedTimeZone {\n  /** The zone to hand `Intl`; `undefined` = the device, resolved live. */\n  zone: string | undefined;\n  /** Which tier it came from. */\n  tier: TimeZoneTier;\n}\n\n/**\n * Walk `TIME_ZONE_TIERS` and return the first tier with a usable zone.\n *\n * Pure — the reactive state below feeds it, and so can a test, or a surface\n * that needs to say what a default WOULD be (the embed's dialog asks it with\n * the viewer tier blanked, to label its \"use the default\" row).\n */\nexport function resolveTimeZone(sources: TimeZoneSources): ResolvedTimeZone {\n  for (const tier of TIME_ZONE_TIERS) {\n    if (tier === 'device') break;\n    const v = sources[tier];\n    if (typeof v === 'string' && v && isValidTimeZone(v)) return { zone: v, tier };\n  }\n  return { zone: undefined, tier: 'device' };\n}\n\n/* ── storage keys ─────────────────────────────────────────────────────── */\n\n/**\n * localStorage key of the VIEWER tier — the embed's own setting.\n *\n * ⚠ Not `filex.timezone`. That key already holds the web app's copy of the\n * ACCOUNT's zone in every browser that has opened the admin app, and reading\n * it as a viewer choice would rank a stale cache above the account forever: a\n * zone changed in another browser would never arrive in this one.\n */\nexport const TIMEZONE_VIEWER_LS_KEY = 'filex.timezone.viewer';\n\n/**\n * localStorage key of the web app's copy of the ACCOUNT tier, so the first\n * paint after a reload is already right instead of flashing the device's zone\n * until `/api/auth/me` lands. Written only by a host that opts in\n * (`setAccountTimeZone(…, { remember: true })`) — an embed on a shared origin\n * must not inherit the zone of whoever last signed in to something else there.\n */\nexport const TIMEZONE_ACCOUNT_LS_KEY = 'filex.timezone';\n\n/* ── the engine ───────────────────────────────────────────────────────── */\n\n/**\n * A short, boring fallback list for engines without\n * `Intl.supportedValuesOf` (Safari < 15.4, older embedded WebViews). Not a\n * world atlas: enough to cover the zones this product's users are actually\n * in, plus UTC as the neutral reference every ops conversation falls back to.\n */\nconst FALLBACK_ZONES = [\n  'UTC',\n  'Europe/Istanbul',\n  'Europe/London',\n  'Europe/Berlin',\n  'Europe/Paris',\n  'Europe/Madrid',\n  'Europe/Moscow',\n  'America/New_York',\n  'America/Chicago',\n  'America/Denver',\n  'America/Los_Angeles',\n  'America/Sao_Paulo',\n  'Africa/Cairo',\n  'Africa/Lagos',\n  'Asia/Dubai',\n  'Asia/Karachi',\n  'Asia/Kolkata',\n  'Asia/Shanghai',\n  'Asia/Tokyo',\n  'Asia/Seoul',\n  'Asia/Singapore',\n  'Australia/Sydney',\n  'Pacific/Auckland',\n];\n\n/** The zone this browser is in right now, asked fresh every time. */\nexport function deviceTimeZone(): string {\n  try {\n    return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';\n  } catch {\n    return 'UTC';\n  }\n}\n\n/**\n * True when the engine accepts `tz` as an IANA zone.\n *\n * ⚠ The check is a real formatter construction, not a lookup in the list\n * below: `supportedValuesOf` is the engine's *canonical* set and does not\n * contain the aliases it nonetheless accepts (`Asia/Istanbul`,\n * `US/Pacific`, …). The value may have come from another device, another\n * browser, a host page or a hand-edited account row.\n */\nexport function isValidTimeZone(tz: string): boolean {\n  if (!tz) return false;\n  try {\n    new Intl.DateTimeFormat('en-US', { timeZone: tz });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/** Every zone the engine knows, sorted; the fallback list when it knows none. */\nexport function supportedTimeZones(): string[] {\n  try {\n    const fn = (Intl as unknown as { supportedValuesOf?: (k: string) => string[] })\n      .supportedValuesOf;\n    if (typeof fn === 'function') {\n      const list = fn('timeZone');\n      if (Array.isArray(list) && list.length) {\n        // UTC is missing from the canonical list on some engines (it is\n        // spelled Etc/UTC there) and it is the one zone an operator asks for\n        // by name, so it is guaranteed a row rather than left to chance.\n        return list.includes('UTC') ? [...list] : ['UTC', ...list];\n      }\n    }\n  } catch {\n    /* fall through */\n  }\n  return [...FALLBACK_ZONES];\n}\n\n/**\n * Which calendar day an instant falls on, in `zone`, as a day count since the\n * epoch. Comparable and subtractable — `a - b === 1` means \"the day before\".\n *\n * Why not `new Date(ms).getDate()`: that is the DEVICE's calendar, and the\n * date a listing groups by has to be the same date it prints in the cell four\n * pixels away. A file touched at 01:00 in Istanbul belongs under \"Yesterday\"\n * for a viewer reading UTC and under \"Today\" for one reading Istanbul.\n *\n * `en-CA` is not a locale choice, it is the shortest route to ISO `Y-M-D` out\n * of `Intl`; the parts are re-assembled through `Date.UTC` so the arithmetic\n * happens on a calendar with no offsets in it at all.\n */\nexport function zonedDayNumber(d: Date, zone?: string): number {\n  const tz = zone ?? activeTimeZone();\n  try {\n    const parts = new Intl.DateTimeFormat('en-CA', {\n      timeZone: tz,\n      year: 'numeric',\n      month: '2-digit',\n      day: '2-digit',\n    }).formatToParts(d);\n    const get = (type: string) => Number(parts.find((p) => p.type === type)?.value);\n    const y = get('year');\n    const m = get('month');\n    const day = get('day');\n    if (!Number.isFinite(y) || !Number.isFinite(m) || !Number.isFinite(day)) {\n      throw new Error('unparsable');\n    }\n    return Math.floor(Date.UTC(y, m - 1, day) / 86_400_000);\n  } catch {\n    // Engine refused the zone (or formatToParts) — the device's calendar is a\n    // worse answer than the right one but a much better answer than none.\n    return Math.floor(\n      Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()) / 86_400_000,\n    );\n  }\n}\n\n/* ── the state ────────────────────────────────────────────────────────── */\n\nfunction readValid(key: string): string {\n  try {\n    const v = localStorage.getItem(key);\n    return v && isValidTimeZone(v) ? v : '';\n  } catch {\n    return '';\n  }\n}\n\nfunction writeOrClear(key: string, value: string): void {\n  try {\n    if (value) localStorage.setItem(key, value);\n    else localStorage.removeItem(key);\n  } catch {\n    /* private mode / blocked site data — the in-memory state still moved, so\n       this page is correct; only the next reload forgets. */\n  }\n}\n\nconst hasWindow = typeof window !== 'undefined';\n\n/** Tier `viewer`. `''` = no choice made in this browser. Read at module load\n *  so the value is right on the FIRST paint after a reload. */\nconst viewerZone: Ref<string> = ref(hasWindow ? readValid(TIMEZONE_VIEWER_LS_KEY) : '');\n\ninterface OwnedZone {\n  owner: symbol;\n  zone: string;\n}\n\n/**\n * A tier fed by several owners. The newest WRITE wins; re-stating an unchanged\n * value keeps its place, so a watcher that fires again cannot jump the queue\n * over a genuinely newer answer.\n */\nfunction ownedTier() {\n  const entries = ref<OwnedZone[]>([]);\n  return {\n    set(owner: symbol, zone: string | null): void {\n      const cur = entries.value.find((e) => e.owner === owner);\n      if (zone === null) {\n        if (cur) entries.value = entries.value.filter((e) => e !== cur);\n        return;\n      }\n      if (cur && cur.zone === zone) return;\n      entries.value = [...entries.value.filter((e) => e.owner !== owner), { owner, zone }];\n    },\n    of(owner: symbol): string | null {\n      return entries.value.find((e) => e.owner === owner)?.zone ?? null;\n    },\n    current(): string {\n      const list = entries.value;\n      return list.length ? list[list.length - 1].zone : '';\n    },\n    /** The newest answer among the owners `pick` accepts. */\n    currentWhere(pick: (owner: symbol) => boolean): string {\n      const list = entries.value.filter((e) => pick(e.owner));\n      return list.length ? list[list.length - 1].zone : '';\n    },\n  };\n}\n\nconst hostTier = ownedTier();\nconst accountTier = ownedTier();\n/** Owners whose account entry is the localStorage copy, and follows it. */\nconst rememberingOwners = new Set<symbol>();\n\nconst resolved = computed<ResolvedTimeZone>(() =>\n  resolveTimeZone({\n    viewer: viewerZone.value,\n    host: hostTier.current(),\n    account: accountTier.current(),\n  }),\n);\n\n/**\n * The zone to hand `Intl` — the resolved one. Reactive: reading it inside a\n * render or a computed subscribes that surface to every tier.\n *\n * `undefined` is returned for the device rather than the resolved name, so the\n * formatter takes `Intl`'s own live answer (a laptop carried across an ocean\n * keeps telling the truth without anybody re-saving anything).\n */\nexport function activeTimeZone(): string | undefined {\n  return resolved.value.zone;\n}\n\n/** The resolved zone AND the tier it came from. Reactive. */\nexport function resolvedTimeZone(): ResolvedTimeZone {\n  return resolved.value;\n}\n\n/**\n * The owner key an explorer PROVIDES to its components, so the dates they\n * print resolve against that explorer's own tiers (useLocale injects it).\n */\nexport const EXPLORER_CLOCK: InjectionKey<symbol> = Symbol('filex-explorer-clock');\n\n/**\n * What the tiers hold for ONE explorer.\n *\n * ⚠⚠ The page-wide tiers answer with the NEWEST write, which is right for a\n * surface outside every explorer and wrong inside one: two explorers on one\n * page with different `config.timeZone` both printed the zone of whichever\n * mounted last. The host tier is by definition one explorer's setting, so an\n * explorer reads only its own. Its account tier is its own too; the only other\n * account it may inherit is the one a HOST APP remembered for the person\n * signed in (the admin app's session, `remember: true`) — never a sibling\n * explorer's, which may belong to a different key altogether. The viewer tier\n * is this browser's, shared by everything on the page.\n *\n * `owner` undefined is the page-wide answer, unchanged.\n */\nexport function timeZoneSourcesFor(owner: symbol | undefined): Required<TimeZoneSources> {\n  if (!owner) return timeZoneSources();\n  return {\n    viewer: viewerZone.value,\n    host: hostTier.of(owner) ?? '',\n    account: accountTier.of(owner) ?? accountTier.currentWhere((o) => rememberingOwners.has(o)),\n  };\n}\n\n/** resolvedTimeZone for ONE explorer (see timeZoneSourcesFor). Reactive. */\nexport function resolvedTimeZoneFor(owner: symbol | undefined): ResolvedTimeZone {\n  return owner ? resolveTimeZone(timeZoneSourcesFor(owner)) : resolved.value;\n}\n\n/** activeTimeZone for ONE explorer (see timeZoneSourcesFor). Reactive. */\nexport function activeTimeZoneFor(owner: symbol | undefined): string | undefined {\n  return resolvedTimeZoneFor(owner).zone;\n}\n\n/** What each tier currently holds (`''` = nothing). Reactive. */\nexport function timeZoneSources(): Required<TimeZoneSources> {\n  return {\n    viewer: viewerZone.value,\n    host: hostTier.current(),\n    account: accountTier.current(),\n  };\n}\n\n/** Tier `viewer`, as stored in this browser. `''` = no choice. Reactive. */\nexport function viewerTimeZone(): string {\n  return viewerZone.value;\n}\n\n/** Set (or, with `''`, clear) the viewer's own choice in this browser. */\nexport function setViewerTimeZone(tz: string): void {\n  const valid = tz && isValidTimeZone(tz) ? tz : '';\n  viewerZone.value = valid;\n  writeOrClear(TIMEZONE_VIEWER_LS_KEY, valid);\n  // A window never receives its own `storage` event, and a second bundle on\n  // this page holds a different copy of this module. Say it out loud.\n  try {\n    window.dispatchEvent(new CustomEvent('filex:timezone', { detail: valid }));\n  } catch {\n    /* non-DOM environment, or an engine without the CustomEvent constructor */\n  }\n}\n\n/**\n * Tier `host`: the zone `owner` (an explorer instance) was configured with.\n * `''`/`null`/an engine-rejected id withdraws it — an explorer with no\n * `config.timeZone` has no opinion, and must not hide another one's.\n */\nexport function setHostTimeZone(owner: symbol, tz: string | null | undefined): void {\n  hostTier.set(owner, tz && isValidTimeZone(tz) ? tz : null);\n}\n\n/**\n * Tier `account`: what `owner` learned about the account behind its\n * credential.\n *\n * `''` is an answer — \"this person has not chosen a zone\" — and is recorded,\n * so it overrides an older answer from the same page. `null`/`undefined` means\n * \"I have no account to speak for\" (an `app` token, a failed lookup) and\n * withdraws the entry. A zone the engine rejects is recorded as `''`: the\n * account did say something, and it was not usable.\n *\n * `remember` mirrors the value into `TIMEZONE_ACCOUNT_LS_KEY` for the next\n * first paint, and makes this owner follow that key when another tab changes\n * it. For the admin web app, whose session is always a person.\n */\nexport function setAccountTimeZone(\n  owner: symbol,\n  tz: string | null | undefined,\n  opts: { remember?: boolean } = {},\n): void {\n  if (tz === null || tz === undefined) {\n    accountTier.set(owner, null);\n    return;\n  }\n  const valid = tz && isValidTimeZone(tz) ? tz : '';\n  accountTier.set(owner, valid);\n  if (opts.remember) {\n    rememberingOwners.add(owner);\n    writeOrClear(TIMEZONE_ACCOUNT_LS_KEY, valid);\n  }\n}\n\n/** The account zone `owner` last recorded (`null` = none recorded). Reactive. */\nexport function accountTimeZoneOf(owner: symbol): string | null {\n  return accountTier.of(owner);\n}\n\n/** The account zone remembered in this browser by the last session. */\n/**\n * The settings dialog's handle on ONE owner's account zone: read it, and set it\n * the way a person's own pick is set — remembered for the next first paint,\n * and clearing this browser's VIEWER pick, which outranks the account and\n * would otherwise make the control visibly do nothing (the viewer tier is what\n * an embed's \"⋯ → Time zone\" writes). `''` = this device's zone.\n *\n * ⚠ One function for both hosts of the dialog: the admin app passes its own\n * owner (web/src/lib/timezone.ts), the explorer passes the owner it registered\n * the account's zone under (useExplorerTimeZone) — the desktop app's dialog.\n */\nexport function accountZoneControl(owner: symbol): { get: () => string; set: (tz: string) => void } {\n  return {\n    get: () => accountTimeZoneOf(owner) ?? '',\n    set: (tz: string) => {\n      setAccountTimeZone(owner, tz && isValidTimeZone(tz) ? tz : '', { remember: true });\n      setViewerTimeZone('');\n    },\n  };\n}\n\nexport function rememberedAccountTimeZone(): string {\n  return hasWindow ? readValid(TIMEZONE_ACCOUNT_LS_KEY) : '';\n}\n\n/** Withdraw everything `owner` registered — call it on unmount. */\nexport function releaseTimeZoneOwner(owner: symbol): void {\n  hostTier.set(owner, null);\n  accountTier.set(owner, null);\n  rememberingOwners.delete(owner);\n}\n\nif (hasWindow) {\n  try {\n    window.addEventListener('storage', (e) => {\n      // `key === null` is a whole-storage clear, which is also news.\n      if (e.key === null || e.key === TIMEZONE_VIEWER_LS_KEY) {\n        viewerZone.value = readValid(TIMEZONE_VIEWER_LS_KEY);\n      }\n      if (e.key === null || e.key === TIMEZONE_ACCOUNT_LS_KEY) {\n        const v = readValid(TIMEZONE_ACCOUNT_LS_KEY);\n        for (const owner of rememberingOwners) accountTier.set(owner, v);\n      }\n    });\n    window.addEventListener('filex:timezone', (e) => {\n      // ⚠ From the event's own detail, not re-read from storage: in a private\n      // window storage refuses the write, and re-reading would undo — in this\n      // very bundle — the choice that was just made.\n      const d = (e as CustomEvent).detail;\n      viewerZone.value =\n        typeof d === 'string' ? (d && isValidTimeZone(d) ? d : '') : readValid(TIMEZONE_VIEWER_LS_KEY);\n    });\n  } catch {\n    /* non-DOM environment */\n  }\n}\n","/**\n * useLocale — tr/en string table with a tiny `t()` helper, and the three\n * things every surface in this product has to agree about: which BCP-47 tag\n * the viewer's language means, what a byte count reads as, and what an\n * instant reads as.\n *\n * No i18n library — the catalogue is small enough to ship inline (see\n * src/locales).\n *\n * ⚠ The four exports ABOVE the composable are module-level on purpose. A\n * plain module (`lib/shareTtl`), the admin app's own helpers\n * (`web/src/lib/format`) and a share message that has to read like the one\n * the server sends all need these same rules, and none of them can call a\n * composable. Before this they each wrote their own, and the copies did not\n * agree:\n *\n *   - three locale → tag mappings. This file said `en-US`, `InspectorPanel`\n *     said `en-GB`, `lib/shareTtl` said `en-GB`. `en-GB` renders a medium\n *     date as \"12 Sep 2026, 15:25\" and `en-US` as \"Sep 12, 2026, 3:25 PM\", so\n *     one file's timestamp read two ways depending on which panel you were\n *     looking at.\n *   - four byte formatters, two of them disagreeing about the base.\n *   - and an `InspectorPanel.formatDate()` that passed NO time zone at all,\n *     so the details panel printed the BROWSER's clock beside a listing row\n *     printing the viewer's chosen one.\n */\n\nimport { computed, getCurrentInstance, inject, type InjectionKey, type Ref } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { localeOwnTable, localesVersion, type OwnLocaleTable } from '../lib/uiLocales';\nimport { pluralCategory } from '../lib/plural';\n// ⚠ The table itself, not `../locales` (its index re-exports `locales/resolve`,\n// which reads `lib/uiLocales` — the cycle uiLocales avoids the same way).\nimport { en as EN } from '../locales/en';\nimport { foreignText, isolateLtrRuns, isolateValue, localeDir } from '../lib/direction';\nimport { EXPLORER_CLOCK, activeTimeZoneFor, deviceTimeZone } from '../lib/timezone';\n\n/* ── the tag ──────────────────────────────────────────────────────────── */\n\n/**\n * The BCP-47 tag a catalogue code means. ONE mapping, for every surface.\n *\n * ⚠ `tr` → `tr-TR` and `en` (or nothing) → `en-US` are pinned — the two\n * catalogues the product ships, and what every date and size on screen has\n * been measured against. Every OTHER code is a language pack's, and it is\n * its own tag: it used to fall through to `en-US`, so a Spanish interface\n * printed \"Sep 12, 2026, 3:25 PM\" beside Spanish words (measured 2026-09-21).\n * A pack that needs a region's conventions names itself with the region\n * (`es-mx`, `pt-br`) and gets them; `Intl` canonicalises the case.\n */\nconst tagCache = new Map<string, string>();\nexport function localeTag(code: LocaleCode | string | undefined): string {\n  if (!code || code === 'en') return 'en-US';\n  if (code === 'tr') return 'tr-TR';\n  let tag = tagCache.get(code);\n  if (!tag) {\n    try {\n      tag = Intl.getCanonicalLocales(code)[0] || 'en-US';\n    } catch {\n      tag = 'en-US';\n    }\n    tagCache.set(code, tag);\n  }\n  return tag;\n}\n\n/* ── bytes ────────────────────────────────────────────────────────────── */\n\nexport type ByteUnitKey =\n  | 'unit.bytes'\n  | 'unit.kb'\n  | 'unit.mb'\n  | 'unit.gb'\n  | 'unit.tb'\n  | 'unit.pb';\n\nconst BYTE_UNIT_KEYS: ByteUnitKey[] = [\n  'unit.bytes',\n  'unit.kb',\n  'unit.mb',\n  'unit.gb',\n  'unit.tb',\n  'unit.pb',\n];\n\n/** The catalogue's own English values, for callers with no `t()` to hand. */\nconst BYTE_UNIT_EN: Record<ByteUnitKey, string> = {\n  'unit.bytes': 'B',\n  'unit.kb': 'KB',\n  'unit.mb': 'MB',\n  'unit.gb': 'GB',\n  'unit.tb': 'TB',\n  'unit.pb': 'PB',\n};\n\nexport interface ByteSizeOptions {\n  /** Resolve a unit key to its label. Default: the English short forms. */\n  unit?: (key: ByteUnitKey) => string;\n  /**\n   * Tag for the NUMBER itself — decimal separator and grouping. `null` (the\n   * default) is the C locale: a dot, no grouping, deterministic. Pass the\n   * viewer's tag on any surface a person reads, so Turkish gets \"1,43 MB\".\n   */\n  numberLocale?: string | null;\n  /**\n   * 1000 (the default) or 1024. See the note on `formatByteSize` — 1024 is\n   * for mirroring some OTHER system's arithmetic, never a style choice.\n   */\n  base?: 1000 | 1024;\n  /** `fixed1` always shows one decimal above B, like the server's humanSize(). */\n  digits?: 'auto' | 'fixed1';\n  /** What \"no size at all\" renders as. */\n  empty?: string;\n}\n\n/**\n * A byte count as a string — the ONE implementation.\n *\n * There were four: this file (1024, i18n units), `web/src/lib/format`\n * (1000, English units), `SideNav` (1024, hardcoded English units, next to a\n * quota line that `HomeView` rendered through the shared one), and\n * `Trash.vue` (1024, in a file already importing the admin helpers). A quota\n * of 10 GB read \"10 GB\" in the admin panel, \"9.3 GB\" in the side nav and\n * \"9.31 GB\" on the home screen — three spellings of one number.\n *\n * ⚠⚠ THE BASE IS 1000, and that is a decision, not an accident:\n *\n *   - \"KB\" / \"MB\" / \"GB\" are SI prefixes and mean powers of 1000. Rendering\n *     1024-arithmetic under those letters is simply mislabelled; being right\n *     at 1024 would mean printing KiB/MiB/GiB everywhere instead.\n *   - Both places in this product that CONVERT between a unit and bytes are\n *     already decimal, and both say so in a comment: the per-user quota input\n *     (`web/src/views/UserEdit.vue`, `GB = 1_000_000_000`) and the usage/cost\n *     path (`backend/internal/usage/b2.go`: \"B2 bills in decimal GB, not GiB\n *     — using 1024³ here would quietly overstate every upload by 7%\").\n *   - So decimal is the only base under which a quota typed as \"10 GB\" reads\n *     back as \"10 GB\" and a stored volume matches the invoice beside it.\n *\n * `base: 1024` exists for exactly one reason: mirroring a number some other\n * program already printed. Nothing in the product needs it today — the share\n * message used it to copy the server's e-mail (`humanSize()`, base 1024), and\n * the server writes sizes by THESE rules now (backend/internal/srvtext\n * `Bytes`), so the message, the mail and the listing say one thing. If a\n * mirror is ever needed again it is an argument here, not a fifth copy.\n */\nexport function formatByteSize(\n  bytes: number | null | undefined,\n  opts: ByteSizeOptions = {},\n): string {\n  const empty = opts.empty ?? '-';\n  if (bytes == null || !Number.isFinite(bytes) || bytes < 0) return empty;\n\n  const base = opts.base ?? 1000;\n  const label = opts.unit ?? ((k: ByteUnitKey) => BYTE_UNIT_EN[k]);\n\n  let idx = 0;\n  let value = bytes;\n  while (value >= base && idx < BYTE_UNIT_KEYS.length - 1) {\n    value /= base;\n    idx += 1;\n  }\n\n  // Whole bytes are never fractional; above that, two digits while the\n  // number is small enough for them to mean something, one after that.\n  const digits = idx === 0 ? 0 : opts.digits === 'fixed1' ? 1 : value < 10 ? 2 : 1;\n\n  let num: string;\n  if (opts.numberLocale == null) {\n    num = value.toFixed(digits);\n  } else {\n    const fmt = numberFormatter(opts.numberLocale, digits, opts.digits === 'fixed1' ? digits : 0);\n    num = fmt ? fmt.format(value) : value.toFixed(digits);\n  }\n  return `${num} ${label(BYTE_UNIT_KEYS[idx])}`;\n}\n\n/**\n * ⚠ Cached. This runs once per row per repaint in a listing, and constructing\n * an `Intl.NumberFormat` is the expensive part of it — the old copy in this\n * file used `toFixed` and paid nothing, so switching to a locale-aware number\n * without a cache would be a visible cost on a folder with a few thousand\n * files. There are three or four distinct keys in a session.\n */\nconst nfCache = new Map<string, Intl.NumberFormat | null>();\nfunction numberFormatter(tag: string, max: number, min: number): Intl.NumberFormat | null {\n  const key = `${tag}|${max}|${min}`;\n  if (!nfCache.has(key)) {\n    try {\n      nfCache.set(key, new Intl.NumberFormat(tag, {\n        maximumFractionDigits: max,\n        minimumFractionDigits: min,\n      }));\n    } catch {\n      nfCache.set(key, null);\n    }\n  }\n  return nfCache.get(key) ?? null;\n}\n\n/* ── instants ─────────────────────────────────────────────────────────── */\n\nconst dtfCache = new Map<string, Intl.DateTimeFormat>();\n\n/**\n * A formatter for `tag` in the VIEWER's zone.\n *\n * ⚠ The cache key names the device zone when the viewer follows the device:\n * `Intl` resolves `timeZone: undefined` at CONSTRUCTION and freezes it, so a\n * cache keyed only on \"device\" would keep answering in whatever zone the tab\n * was opened in. Reading `activeTimeZone()` on every call is also what keeps\n * a template that formats a date reactive to the preference changing.\n */\nfunction zonedFormatter(\n  tag: string,\n  opts: Intl.DateTimeFormatOptions,\n  owner?: symbol,\n): Intl.DateTimeFormat {\n  const zone = activeTimeZoneFor(owner);\n  const key = `${tag}|${zone ?? `device:${deviceTimeZone()}`}|${JSON.stringify(opts)}`;\n  let fmt = dtfCache.get(key);\n  if (!fmt) {\n    fmt = new Intl.DateTimeFormat(tag, { ...opts, timeZone: zone });\n    dtfCache.set(key, fmt);\n  }\n  return fmt;\n}\n\n/**\n * Render an instant for a human: the viewer's language AND the viewer's\n * chosen clock, together, in one call. Every date on every surface goes\n * through here — that is the whole point of it being here.\n */\nexport function formatInstant(\n  d: Date,\n  code: LocaleCode | string | undefined,\n  opts: Intl.DateTimeFormatOptions,\n  /** The explorer whose clock applies (EXPLORER_CLOCK); omitted = page-wide. */\n  owner?: symbol,\n): string {\n  try {\n    return zonedFormatter(localeTag(code), opts, owner).format(d);\n  } catch {\n    return d.toISOString();\n  }\n}\n\nconst DAY = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst dayFormatters = new Map<string, Intl.DateTimeFormat>();\n\n/**\n * A calendar DAY (`YYYY-MM-DD`) for a human: the same words formatDate's date\n * part prints (\"29 Eyl 2026\"), but read as that day, not as an instant — it is\n * formatted in UTC, so no viewer's time zone can move a due date to the day\n * before. '' for anything that is not such a day.\n *\n * ⚠ Here, beside formatInstant, because this file is the home of \"a date for\n * a human\" (web/tests/quality/duplication.test.ts, `datetime-format`): an\n * app's date column (lib/surfaceCell) must not grow a formatter of its own.\n */\nexport function formatCalendarDay(day: string, code: LocaleCode | string | undefined): string {\n  const m = DAY.exec(day.trim());\n  if (!m) return '';\n  const d = new Date(Date.UTC(Number(m[1]), Number(m[2]) - 1, Number(m[3])));\n  if (Number.isNaN(d.getTime())) return '';\n  const tag = localeTag(code);\n  let fmt = dayFormatters.get(tag);\n  try {\n    if (!fmt) {\n      fmt = new Intl.DateTimeFormat(tag, { month: 'short', day: 'numeric', year: 'numeric', timeZone: 'UTC' });\n      dayFormatters.set(tag, fmt);\n    }\n    return fmt.format(d);\n  } catch {\n    return '';\n  }\n}\n\n/** Seconds or milliseconds — the backend has sent both. Normalised once. */\nfunction toDate(ms: number | undefined | null): Date | null {\n  if (!ms) return null;\n  const d = new Date(ms * (ms < 1e12 ? 1000 : 1));\n  return Number.isNaN(d.getTime()) ? null : d;\n}\n\n/** Anything a date arrives as: epoch seconds or milliseconds, an ISO string,\n *  a Date. Null for nothing or for something that is not an instant. */\nexport type WhenInput = number | string | Date | null | undefined;\n\nfunction instantOf(value: WhenInput): Date | null {\n  if (value == null || value === '') return null;\n  if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value;\n  if (typeof value === 'number') return toDate(value);\n  const d = new Date(value);\n  return Number.isNaN(d.getTime()) ? null : d;\n}\n\nconst DATE_PART: Intl.DateTimeFormatOptions = { month: 'short', day: 'numeric', year: 'numeric' };\n// ⚠ The clock is the LANGUAGE's short time, not a field list: `hour: 'numeric'`\n//   printed Turkish \"8:05\" where Turkish writes \"08:05\", and `'2-digit'` would\n//   print English \"08:05 AM\". Only noticed on CI: its zone is UTC, so the\n//   test's 08:05Z stayed before ten there and became 11:05 at +3 (2026-09-24).\nconst TIME_PART: Intl.DateTimeFormatOptions = { timeStyle: 'short' };\n\n/**\n * An instant as a person reads it — THE date format of the product: the\n * explorer's, \"Sep 21, 2026, 2:50 PM\" / \"21 Eyl 2026, 14:50\", in the viewer's\n * language and on the viewer's chosen clock. `time: true` adds the clock.\n *\n * ⚠⚠ One definition for every surface (QA, 2026-09-21): the explorer printed\n * \"21 Eyl 2026, 14:50\", the admin tables and the share dialog \"21 Eyl 2026\n * 15:02\" (a `dateStyle: 'medium'` pair and a `day: '2-digit', hour: '2-digit'`\n * set of their own), and English times read \"2:50 PM\" on one screen and\n * \"02:51 PM\" on the next. The admin panel's `formatDate`, `useLocale`'s\n * `formatDate` and the share lines all call this now; nothing else builds a\n * date formatter for a person to read (scripts/dup-scan.mjs, `datetime-format`).\n */\nexport function formatWhen(\n  value: WhenInput,\n  code: LocaleCode | string | undefined,\n  opts: { time?: boolean } = {},\n  /** The explorer whose clock applies (EXPLORER_CLOCK); omitted = page-wide. */\n  owner?: symbol,\n): string {\n  const d = instantOf(value);\n  if (!d) return '';\n  const date = formatInstant(d, code, DATE_PART, owner);\n  return opts.time ? `${date}, ${formatInstant(d, code, TIME_PART, owner)}` : date;\n}\n\n/**\n * The whole truth, for a tooltip behind a short date: full date, seconds, the\n * zone's name AND its IANA id — \"whose 14:05 is this?\" answered. The IANA id\n * rides along because half the world's zones display as \"GMT+3\".\n */\nexport function formatWhenFull(\n  value: WhenInput,\n  code: LocaleCode | string | undefined,\n  owner?: symbol,\n): string {\n  const d = instantOf(value);\n  if (!d) return '';\n  const zone = activeTimeZoneFor(owner) ?? deviceTimeZone();\n  return `${formatInstant(d, code, { dateStyle: 'full', timeStyle: 'long' }, owner)} (${zone})`;\n}\n\n/* ── counted messages ─────────────────────────────────────────────────── */\n\n/**\n * The variables that COUNT something, in the order they are asked. The first\n * one a call passes decides the form of the sentence.\n */\n/**\n * The language of the explorer a component sits in, for a component that is\n * not handed one — a dialog (modals/Modal.vue) most of all.\n *\n * ⚠ Modal took its language from its own `locale` prop and said \"Close\" when\n * none came, and not one of the twenty core dialogs passed it: every × in a\n * Turkish explorer — an embed's app popup included — was named in English\n * (2026-09-26). FileExplorer provides its language here once, so every dialog\n * under it inherits it; an explicit `locale` still wins.\n */\nexport const EXPLORER_LOCALE: InjectionKey<() => string> = Symbol('filex-explorer-locale');\n\nexport const COUNT_VARS = ['count', 'n', 'days'] as const;\n\n/**\n * Which key of ONE table a counted message reads: `key_<category>` when the\n * count falls in a category other than `other` in `lang` (CLDR, via\n * `lib/plural`) and the table has that form, otherwise the plain `key` — which\n * IS the `other` form (there is no `_other` key).\n *\n * The forms: `_zero`, `_one`, `_two`, `_few`, `_many`. A language writes the\n * ones it has — English and Turkish `_one`, Russian `_one` `_few` `_many`,\n * Arabic all five — and never `_other`.\n *\n * ⚠⚠ ONE rule, here, for every counted string in the package. The catalogue\n * is a flat table with no plural machinery, so a `{n} items` message printed\n * \"1 items\" — measured in the details panel's header on a folder with one\n * file (v0.41.0 screenshot pass, 2026-09-14). Two call sites had already\n * worked around it by choosing a `_one` key by hand (the advanced-search count\n * and the empty-trash confirmation); every other counted message had not, and\n * a few hedged with \"item(s)\". A rule each caller has to remember is a rule\n * the next caller forgets, so `t()` applies it and the catalogue only has to\n * SAY the forms.\n *\n * ⚠ Until v0.43.0 the rule was English's alone (\"`_one` for exactly 1\"),\n * which no language with few/many can be written in — the Arabic pack could\n * not say \"2 files\" at all.\n *\n * ⚠ Turkish does not inflect a noun after a number (\"1 öğe\", \"5 öğe\"), so its\n * `_one` entries read exactly like the plain ones. They exist for key parity,\n * not because the language needs them. `web/tests/i18n/plurals.test.ts`\n * fails an English counted message that has no singular.\n *\n * `lang` defaults to English — the rule this function had before it had the\n * argument. `t()` does not call this on a merged table; see `pickMessage`.\n */\nexport function countedKey(\n  key: string,\n  vars: Record<string, string | number>,\n  has: (key: string) => boolean,\n  lang = 'en',\n): string {\n  const counter = COUNT_VARS.find((v) => v in vars);\n  if (counter === undefined) return key;\n  const cat = pluralCategory(lang, Number(vars[counter]));\n  if (cat === 'other') return key;\n  const form = `${key}_${cat}`;\n  return has(form) ? form : key;\n}\n\n/** A catalogue value, or undefined — never an `Object.prototype` member. */\nfunction entry(table: Readonly<Record<string, string>>, key: string): string | undefined {\n  const v = table[key];\n  return typeof v === 'string' && v ? v : undefined;\n}\n\n/**\n * The raw (uninterpolated) message a key reads in a language.\n *\n *   1. the form the count's category calls for, if the language WROTE it;\n *   2. else the language's own plain `key` (its `other` form);\n *   3. else English as a whole — English's form by English's rule\n *      (`key_one` for 1), then English's plain `key`;\n *   4. else the key itself.\n *\n * ⚠⚠ Step 2 before step 3, and `own` must be the language's OWN words\n * (`localeOwnTable`), not the English-under-pack merge (`localeTable`). With\n * the merge, a Spanish pack that wrote only `toast.restored` still \"had\"\n * `toast.restored_one` — the English one underneath — and a count of one\n * printed \"1 item restored\" in the middle of a Spanish screen. A language's\n * own plain form, even if it reads as a plural for 1, is its translator's\n * choice; an English word in its place is nobody's.\n */\nexport function pickMessage(\n  own: OwnLocaleTable,\n  key: string,\n  vars: Record<string, string | number> = {},\n): string {\n  const mine = own.strings;\n  const form = countedKey(key, vars, (k) => entry(mine, k) !== undefined, own.lang);\n  const said = entry(mine, form) ?? entry(mine, key);\n  if (said !== undefined) return said;\n  if (mine === EN) return key;\n  const enForm = countedKey(key, vars, (k) => entry(EN, k) !== undefined, 'en');\n  return entry(EN, enForm) ?? entry(EN, key) ?? key;\n}\n\n/** `{name}` placeholders, replaced verbatim. */\nfunction interpolate(raw: string, vars: Record<string, string | number>): string {\n  return Object.entries(vars).reduce(\n    (acc, [k, v]) => acc.replaceAll(`{${k}}`, String(v)),\n    raw,\n  );\n}\n\n/**\n * One message, rendered: the plural form picked on the ORIGINAL vars (a count\n * wrapped in isolation marks is no longer a number to pick on), the values\n * put in, and — RTL only — a name interpolated into the sentence isolated so\n * its own letters decide its direction (`isolateValue`, strings only), and a\n * `3 / 10` or a `tag:…` kept reading left to right (`isolateLtrRuns`). A\n * left-to-right string comes back exactly as it always did.\n *\n * ⚠ The one path for `t()` and `translate()`, so a sentence built outside a\n * component (lib/shareTtl) reads the same way under Arabic as one inside.\n */\nfunction render(\n  table: OwnLocaleTable,\n  key: string,\n  vars: Record<string, string | number>,\n  rtl: boolean,\n): string {\n  const raw = pickMessage(table, key, vars);\n  if (!rtl) return interpolate(raw, vars);\n  const isolated: Record<string, string | number> = {};\n  for (const [k, v] of Object.entries(vars)) isolated[k] = typeof v === 'string' ? isolateValue(v) : v;\n  return isolateLtrRuns(interpolate(raw, isolated));\n}\n\n/**\n * `t()` for code that is not a component (`lib/shareTtl`): the same lookup,\n * the same plural rule, the same placeholders. ⚠ Not reactive — a caller that\n * renders the result in a template must read `localesVersion` itself.\n */\nexport function translate(\n  code: LocaleCode | string | undefined,\n  key: string,\n  vars: Record<string, string | number> = {},\n): string {\n  return render(localeOwnTable(code), key, vars, localeDir(code) === 'rtl');\n}\n\nexport function useLocale(\n  /**\n   * ⚠ Widened past `LocaleCode` on purpose (v3 §5). The list of languages\n   * the interface offers is no longer the two this package ships: an app\n   * plugin may add one (`lib/uiLocales`), so the active code can be a tag\n   * this file has never heard of. It resolves through `localeOwnTable`, and\n   * every key the language does not have reads English.\n   */\n  localeRef: Ref<LocaleCode | string> | (() => LocaleCode | string),\n) {\n  const code = (): string =>\n    typeof localeRef === 'function' ? localeRef() : localeRef.value;\n\n  /**\n   * ⚠ `localesVersion` is READ here so the table is re-derived when an app\n   * installs or removes a language. Without it a screen already on the page\n   * would keep the table it was mounted with — an app's own words would\n   * arrive one navigation late, which is the kind of miss nobody reports as\n   * a bug and everybody works around.\n   */\n  const lookup = computed(() => {\n    void localesVersion.value;\n    return localeOwnTable(code());\n  });\n\n  // The explorer this component sits in, whose clock its dates are read on\n  // (lib/timezone, timeZoneSourcesFor). Outside a component, or outside any\n  // explorer, the page-wide answer.\n  const clock = getCurrentInstance() ? inject(EXPLORER_CLOCK, undefined) : undefined;\n\n  /** ⚠ RTL — which way this surface's language is written (lib/direction). */\n  const dir = computed(() => localeDir(code()));\n\n  function t(key: string, vars: Record<string, string | number> = {}): string {\n    return render(lookup.value, key, vars, dir.value === 'rtl');\n  }\n  /**\n   * ⚠⚠ Text filex did NOT write, said the way this surface's language needs:\n   * the server's own sentence, an installed app's words, a notification built\n   * from what happened. None of it passes through `t()`, so none of it was\n   * isolated — see lib/direction `foreignText`. It rides ON `t` so that the\n   * helpers a component hands its translator to (lib/errorWords `sayFailure`,\n   * `jobFailure`, `opFailure`) get the reader's direction without five more\n   * signatures to thread a locale code through.\n   */\n  t.foreign = (text: string): string => foreignText(code(), text);\n\n  /** A byte count in the viewer's language and number format. */\n  function formatSize(bytes: number | undefined | null): string {\n    // A real zero (empty file / empty folder) is information, not absence —\n    // `formatByteSize` renders it \"0 B\" rather than the em dash.\n    return formatByteSize(bytes, {\n      unit: (key) => t(key),\n      numberLocale: localeTag(code()),\n    });\n  }\n\n  /**\n   * A listed item's size, the way every view draws it (list, inspector,\n   * multi-selection total).\n   *\n   * ⚠ `size_partial` is the server saying the catalog does not cover all of a\n   * folder yet (docs/LAZY-CATALOGUE.md): a lazily cataloged folder that is not\n   * cataloged below, or any folder while its storage's first sync runs. Its\n   * size is then a lower bound — \"≥ 1.2 GB\" — or, when nothing below it is\n   * known, not a number at all (\"—\"): printing \"0 B\" for a folder full of\n   * files nobody has cataloged yet would be a fact that is false. One helper,\n   * so the list and the inspector cannot disagree about it.\n   */\n  function formatNodeSize(n: { size?: number | null; size_partial?: boolean } | null | undefined): string {\n    if (!n) return formatSize(null);\n    if (!n.size_partial) return formatSize(n.size);\n    return typeof n.size === 'number' && n.size > 0 ? t('size.at_least', { size: formatSize(n.size) }) : '-';\n  }\n\n  /** The hover text of a size `formatNodeSize` drew as partial, or undefined. */\n  function nodeSizeHint(n: { size?: number | null; size_partial?: boolean } | null | undefined): string | undefined {\n    if (!n?.size_partial) return undefined;\n    return typeof n.size === 'number' && n.size > 0 ? t('size.partial_hint') : t('size.unknown_hint');\n  }\n\n  /**\n   * Render a FileNode's basename with locale-aware overrides:\n   *   - `.trash` directory → \"Çöp Kutusu\" / \"Trash\"\n   *   - Trash entries are stored as `<Ymd-His>-<rand>__<original>` so\n   *     listings inside .trash/ would otherwise show timestamps. Strip\n   *     that prefix so the user sees the original basename.\n   */\n  function nodeDisplayName(node: { basename: string; fxe_name?: string }): string {\n    if (node.basename === '.trash') return t('node.trash');\n    /* wiring:e2 fxe — a single encrypted file opened in this tab. */\n    if (typeof node.fxe_name === 'string' && node.fxe_name) return node.fxe_name;\n    const m = node.basename.match(/^\\d{8}-\\d{6}-[A-Za-z0-9]+__(.+)$/);\n    if (m) return m[1];\n    return node.basename;\n  }\n\n  /**\n   * gorunum:v1 — one date format for the whole explorer.\n   *\n   * There were two: the grid drew \"Sep 12, 2026\" from the explorer's own\n   * locale tag and the list drew \"12.09.2026 15:25:04\" from\n   * `toLocaleString()`, i.e. from the BROWSER's locale. Two views of the same\n   * folder, side by side in the same product, disagreeing about what day a\n   * file was touched and in whose language. The epoch normalisation is the\n   * same in both (the backend has sent seconds and milliseconds) and is kept\n   * here so a third caller cannot get it wrong.\n   *\n   * `time: true` is the listing's variant — a column wide enough to carry the\n   * clock, which is the one place the hour actually helps. It is also what\n   * the details panel shows, so the panel and the row it describes print the\n   * same characters.\n   *\n   * zaman:z1 — and the clock is the VIEWER's, from `lib/timezone`. The instant\n   * on the wire is not touched; only which zone it is read against. Before\n   * this, every date here was drawn in the browser's own zone, so a file\n   * uploaded at 03:00 Istanbul read \"03:00\" to a colleague on GMT as well —\n   * same digits, different instant. `undefined` (the default) still means the\n   * device's zone, resolved live by Intl rather than frozen at first run.\n   */\n  function formatDate(ms: number | undefined | null, opts: { time?: boolean } = {}): string {\n    return formatWhen(ms, code(), opts, clock);\n  }\n\n  /**\n   * The whole truth, for a tooltip: full date, seconds, the zone's name AND\n   * its IANA id.\n   *\n   * The listing's cell is short by necessity (\"Sep 12, 2026, 3:14 AM\") and a\n   * short date is exactly where the zone question bites — it looks like a\n   * fact and it is a fact *about a clock nobody named*. Hovering says which.\n   * The id is appended to the zone's display name because the display name\n   * alone is ambiguous in the direction that matters here: half the world's\n   * zones render as \"GMT+3\".\n   */\n  function formatDateFull(ms: number | undefined | null): string {\n    return formatWhenFull(ms, code(), clock);\n  }\n\n  /**\n   * \"September 2026\" — the header over a listing's date group.\n   *\n   * Here rather than in the view that draws it: the header answers \"what\n   * month is this row from\", and it has to answer it on the same clock the\n   * cell four pixels away prints. `ListView` built its own `Intl` formatter\n   * for this, which is how the two came to be able to disagree.\n   */\n  function formatMonthYear(value: number | Date | undefined | null): string {\n    const d = value instanceof Date ? value : toDate(value);\n    if (!d) return '';\n    return formatInstant(d, code(), { month: 'long', year: 'numeric' }, clock);\n  }\n\n  /**\n   * `YYYY-MM` in the viewer's zone — a bucket id, not a label.\n   *\n   * `en-CA` is not a locale choice, it is the shortest route to ISO order out\n   * of `Intl`; same trick as `lib/timezone.zonedDayNumber`, and for the same\n   * reason: the month a row is grouped under must be the month its own cell\n   * prints, which the DEVICE's calendar cannot tell you.\n   */\n  function zonedYearMonth(value: number | Date | undefined | null): string {\n    const d = value instanceof Date ? value : toDate(value);\n    if (!d) return '';\n    try {\n      return zonedFormatter('en-CA', { year: 'numeric', month: '2-digit' }, clock).format(d);\n    } catch {\n      return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`;\n    }\n  }\n\n  return {\n    t,\n    formatSize,\n    formatNodeSize,\n    nodeSizeHint,\n    formatDate,\n    formatDateFull,\n    formatMonthYear,\n    zonedYearMonth,\n    /**\n     * zaman:z1 — the wire's `last_modified` as a `Date`, or null.\n     *\n     * Handed out because \"seconds or milliseconds\" is a fact about the WIRE,\n     * not about formatting, and every caller that needs the instant itself\n     * (rather than a string) was otherwise re-typing `v * (v < 1e12 ? 1000 :\n     * 1)`. ListView had the third copy and used it to group rows by day — so\n     * the grouping and the cell four pixels away were reading the same number\n     * through two different converters.\n     */\n    toDate,\n    nodeDisplayName,\n    /**\n     * ⚠ RTL — which way this surface's language is written (`lib/direction`,\n     * the server's one list). Bind it as `dir` on anything Teleported out of\n     * the explorer's root: under `<body>` a menu inherits the HOST page's\n     * direction, not the language its own words are in.\n     */\n    dir,\n  };\n}\n","/**\n * connection — ONE notice for a connection that is down, however many\n * requests fall over while it is.\n *\n * ⚠⚠ THE STORM THIS EXISTS TO STOP. A page that has lost the server is right\n * to say so, and it used to say so once per failing request: the web app's\n * axios interceptor raised `errors.network` as a toast from every refusal\n * with no response. The explorer alone fires several calls a second — the\n * listing, a thumbnail per row, the bell's 15 s poll, the pending-operations\n * poll — so the corner filled with copies of one sentence and the person was\n * left dismissing a stack of them (owner, 2026-09-24: \"attığı tüm istekler\n * için ayrı ayrı atıyor o yüzden çok fazla popover çıkıyor\").\n *\n * A connection that is down is ONE FACT ABOUT THE PAGE, not one fact per\n * request. So:\n *\n *   - a BACKGROUND request — anything the person did not start: a listing, a\n *     thumbnail, a poll — is folded. It raises the shared notice and says\n *     nothing of its own, however many of them fail;\n *   - an ACTION the person is waiting on — an upload, a rename, a save, any\n *     write — still reports individually. ⚠ Folding those into a generic\n *     \"offline\" would be worse than the storm: the person is waiting to be\n *     told whether the thing they did happened;\n *   - the notice CLEARS ITSELF the moment any request gets an answer. Nobody\n *     should have to dismiss a stale one.\n *\n * ⚠ No new polling, and no change to any existing cadence. This module never\n * makes a request of its own: it is told what happened by whoever was already\n * talking to the server (the web app's axios interceptor, core's `jsonFetch`\n * and its upload XHR), so recovery is noticed by the next call the page was\n * going to make anyway.\n *\n * ⚠⚠ Shared on purpose — one rule for the web app, the desktop shell and an\n * embedded explorer. A per-surface copy is how two of them come to disagree\n * about what \"offline\" looks like.\n *\n * ⚠ `navigator.onLine` is deliberately NOT consulted. It answers \"this\n * machine has a network\", not \"filex answers\", and it is true for every way\n * this actually happens — the server stopped, the tunnel dropped, the laptop\n * woke on a captive-portal Wi-Fi. Observed failures are the only evidence.\n */\nimport { computed, ref, type ComputedRef } from 'vue';\n\n/** Did the person start this request, or did the page? */\nexport type RequestKind = 'background' | 'action';\n\n/** What the caller should do about a failure it just had. */\nexport type FailureVerdict = 'folded' | 'say';\n\nconst downSince = ref(0);\nconst folded = ref(0);\n\n/** Is the server unreachable right now, as far as this page has seen? */\nexport const connectionDown: ComputedRef<boolean> = computed(() => downSince.value !== 0);\n\n/** When it first went (epoch ms), or 0. For a caller that wants to wait. */\nexport const connectionDownSince: ComputedRef<number> = computed(() => downSince.value);\n\n/**\n * How many background failures the shared notice is standing in for. The\n * notice does not print it — a number that climbs is the storm again, in one\n * line — but a test can assert that many failures made one notice.\n */\nexport const connectionFolded: ComputedRef<number> = computed(() => folded.value);\n\n/**\n * A request got no answer at all. Raises the shared notice and says whether\n * this particular failure is the caller's to report.\n *\n * ⚠ An ACTION raises the notice too. The connection is down either way, and\n * the person's own message (\"could not be renamed\") does not explain why.\n */\nexport function noteRequestFailed(kind: RequestKind, now: number = Date.now()): FailureVerdict {\n  if (downSince.value === 0) downSince.value = now || 1;\n  if (kind === 'background') {\n    folded.value += 1;\n    return 'folded';\n  }\n  return 'say';\n}\n\n/**\n * A request got an answer — any answer. ⚠ Including a 4xx or a 5xx: the\n * server spoke, so the connection is not what is wrong, and a notice that\n * said otherwise would be lying while the person reads a real refusal.\n */\nexport function noteRequestSucceeded(): void {\n  if (downSince.value === 0 && folded.value === 0) return;\n  downSince.value = 0;\n  folded.value = 0;\n}\n\n/** Forget everything. For tests, and for a surface being torn down. */\nexport function resetConnectionNotice(): void {\n  downSince.value = 0;\n  folded.value = 0;\n}\n\n/**\n * The kind a request of this HTTP method counts as.\n *\n * ⚠ The method, not the URL. A read is the page keeping itself up to date and\n * can be folded; a write is something the person pressed and is waiting on.\n * The one rule both request layers apply, so the web app and an embedded\n * explorer cannot classify the same call differently.\n */\nexport function kindOfMethod(method: string | undefined): RequestKind {\n  const m = String(method ?? 'get').toLowerCase();\n  return m === 'get' || m === 'head' || m === 'options' ? 'background' : 'action';\n}\n","/**\n * useFileApi — backend wrapper for the manager + ancillary endpoints.\n *\n * Two URL strategies, picked at construction time:\n *\n *   1. NEW (RESTful): caller passes `apiBase: 'https://files.example.com'`.\n *      The manager endpoint becomes `${apiBase}/api/files/manager` and\n *      every action uses `?action=…&path=…` as a query parameter (still\n *      Vuefinder-compatible — the same `?q=…` convention is accepted by\n *      the new Go backend, but `action` is the canonical name in v0.1+).\n *\n *   2. LEGACY (Vuefinder-compat): caller passes `endpoint:\n *      '/api/files/manager'` (and the rest of the per-route fields).\n *      Used by `@brftech/file-explorer` 0.1.0 embedders that have a\n *      Laravel/Filament backend already.\n *\n * Per-route fields (`uploadBegin`, `shareCreate`, …) ALWAYS win over\n * the auto-derived `apiBase` URL — lets the caller mix and match.\n *\n * Auth normalisation is centralised here. The component code never\n * thinks about CSRF vs Bearer vs Basic — it just calls `index(path)`.\n */\n\nimport type { StorageInfo } from '../lib/catalogCoverage';\nimport type { MeasuredDrive } from '../lib/storageLine';\nimport type { ExplorerConfig, AuthConfig, EndpointMap, SearchAccount } from '../types/ExplorerConfig';\nimport type { LicenseInfo } from '@brftech/filex-app-ui/protocol';\nimport { resolveLocale } from '../locales/resolve';\nimport { listingAddress } from '../lib/internalPaths';\nimport { serverLimit, takeServerRules } from '../lib/serverRules';\nimport { draftsClient, type DraftDto } from '../lib/drafts';\nimport { localeTag } from './useLocale';\nimport { networkFailure, requestFailure } from '../lib/errorWords';\n// ⚠ The same folding rule the web app's axios layer applies, applied by the\n// request layer an EMBED uses — one notice for a connection that is down, and\n// no surface-specific copy of the decision (lib/connection).\nimport { kindOfMethod, noteRequestFailed, noteRequestSucceeded } from '../lib/connection';\nimport type {\n  FileNode,\n  ShareInfo,\n  UploadLimits,\n  Capabilities,\n  ArchiveEntry,\n  ArchiveCreateFormat,\n  TrashPage,\n  E2eAnswer,\n  E2eRequestKind,\n  E2eRequestDto,\n} from '../types/FileNode';\nimport type {\n  PluginActionsResponse,\n  PluginRunResult,\n  PluginSurface,\n  PluginUsersResponse,\n  PluginViewEventBody,\n} from '../types/Plugins';\n\n/** Server-side PendingOp DTO (mirror of Modules\\FishApp\\Models\\PendingOp::toApiArray). */\nexport interface PendingOpDto {\n  id: number;\n  op_type: 'copy' | 'move' | 'delete' | 'rename' | 'restore' | 'archive-create' | 'archive-extract';\n  status: 'pending' | 'running' | 'cancelling' | 'done' | 'error' | 'cancelled';\n  progress_total: number;\n  progress_done: number;\n  target_path: string | null;\n  source_dir: string | null;\n  source_count: number;\n  error_message: string | null;\n  cancellable: boolean;\n  started_at: string | null;\n  finished_at: string | null;\n  created_at: string | null;\n}\n\n/**\n * A batch restore or permanent delete of trash entries, as the server answers\n * it: how many went (or, `queued`, are on their way as `ops`), how many did\n * not, why the first of those did not, and `summary`, the server's sentence\n * for all of it in the screen's language — what the explorer shows.\n */\nexport interface TrashBatchAnswer {\n  done: number;\n  failed: number;\n  reason_code?: 'exists' | 'not_found' | 'forbidden' | 'failed';\n  /** The entries a restore found their place taken for. */\n  taken?: string[];\n  queued?: boolean;\n  ops?: PendingOpDto[];\n  summary: string;\n}\n\n/** \"Empty trash\" asked as a dry run: what it would delete, and the\n *  confirmation's sentence. */\nexport interface TrashEmptyPreview {\n  dry_run: true;\n  count: number;\n  bytes: number;\n  summary: string;\n}\n\n/** Answer to `?action=newfile` — where the new document actually landed. */\n/**\n * A New document name, checked by the server without anything being written\n * (`?action=newfile` with `dry_run`, #211 audit B18): the name the create\n * would write, whether something already holds it, and the first free\n * `name (n).ext` beside it - the server's own existence check and numbering,\n * not a lower-cased copy in the browser.\n */\nexport interface NewFileCheck {\n  dry_run: boolean;\n  path: string;\n  name: string;\n  taken: boolean;\n  /** `NAME_TAKEN` when taken. */\n  code?: string;\n  /** The first free name beside a taken one; absent when there is none. */\n  suggested?: string;\n}\n\nexport interface NewFileResponse {\n  /** Adapter-qualified path, ready to hand to the viewer. */\n  path: string;\n  /** Made from an app's row (`new_documents`): the view that opens it. Set\n   *  by the New document dialog, not by the server. */\n  app?: { plugin: string; view: string };\n  /** Final basename, which may have gained the extension server-side. */\n  name: string;\n  /** The TYPE the bytes were made from (a `newdoc_types` key) — not the\n   *  extension of `name`, which since #56 may have none (`LICENSE`). The\n   *  explorer opens the new file as this type. */\n  ext: string;\n  size: number;\n  mime: string;\n  /** Drafts (issue #71): set when the document was made as a DRAFT — then\n   *  `path` is the draft's, in the person's drafts area, and nothing is at\n   *  the destination yet (lib/drafts). */\n  draft?: DraftDto;\n}\n\nexport interface ManagerResponse {\n  adapter: string;\n  storages: string[];\n  dirname: string;\n  read_only: boolean;\n  /** RBAC effective level for the current user on this directory ('' when ACL\n   *  is not enforced on the storage). Gates the folder-level write actions. */\n  perm?: 'none' | 'viewer' | 'editor' | 'owner';\n  /* wiring:e2 — E2E-encrypted folder awareness: `e2e` is true when the listed\n   * dir IS an encrypted root; `e2e_root` is the adapter-qualified path of the\n   * nearest encrypted root covering this dir (set for the root itself AND for\n   * every subfolder inside the subtree). Absent on plain folders / old\n   * backends — consumers must stay undefined-safe. */\n  e2e?: boolean;\n  e2e_root?: string;\n  /* wiring:e2 vault — the vault folder the listed dir is in or is\n   * (docs/E2E-VAULT-FORMAT.md). Its listing on the server is the vault's\n   * layout (`v/`, packs, index files), never rows to show. */\n  e2e_vault_root?: string;\n  files: FileNode[];\n  /** `action=search` only: more rows matched than came back — the index\n   *  filled its page, or the index-less fallback filled its window — so the\n   *  list is not the whole answer. Absent on other actions and on servers\n   *  older than the flag. */\n  truncated?: boolean;\n  /** Every storage the caller can open, with how much of it the catalog\n   *  covers (`coverage`, absent when all of it — lib/catalogCoverage). Absent\n   *  on servers older than the lazy catalog. */\n  storage_info?: StorageInfo[];\n}\n\n/** A single ACL grant row (RBAC permissions panel): to one person, or — with\n *  `kind: 'group'` — to a group, every member of which holds it. A group's\n *  grant has its own id space (change it with the *GroupPermission calls). */\nexport interface Grant {\n  id: number;\n  storage_id: number;\n  path_prefix: string;\n  /** \"user\" or \"group\"; absent from servers older than groups (a person). */\n  kind?: 'user' | 'group';\n  user_id?: number;\n  group_id?: number;\n  group_name?: string;\n  level: 'viewer' | 'editor' | 'owner';\n  user_email?: string;\n  user_display_name?: string;\n  /** The person as every screen names them (server model.PersonLabel). */\n  user_name?: string;\n  inherited?: boolean;\n}\n\n/** surucu:d1 — `GET /api/files/quota/me` (quota.Snapshot). */\nexport interface QuotaSnapshot {\n  used_bytes: number;\n  quota_bytes: number;\n  percent_used: number;\n  unlimited: boolean;\n}\n\nexport interface PermissionsResponse {\n  path: string;\n  storage_rbac: boolean;\n  direct: Grant[];\n  inherited: Grant[];\n  effective: string;\n}\n\nexport interface ResolveEmailResponse {\n  found: boolean;\n  user?: { id: number; email: string; display_name: string; username?: string; role: string };\n}\n\nexport interface UserSuggestion {\n  id: number;\n  email: string;\n  display_name: string;\n  username?: string;\n  role: string;\n}\n\n/* === koru:k1 — version history (inspector panel) === */\n\n/** Mirrors backend `model.NodeVersion` (GET /api/files/versions?node_id=…). */\nexport interface NodeVersion {\n  id: number;\n  node_id: number;\n  version_n: number;\n  storage_key?: string;\n  size: number;\n  etag?: string;\n  created_at: string;\n}\nexport interface UserSearchResponse {\n  users: UserSuggestion[];\n}\n\n/** A group the caller could share with (GET /api/files/permissions/groups). */\nexport interface GroupSuggestion {\n  id: number;\n  name: string;\n  description?: string;\n}\n\n/* === calisma:d3 — node comments (inspector panel) === */\n\n/** Mirrors backend `model.NodeComment` (GET /api/files/comments?node_id=…). */\nexport interface NodeComment {\n  id: number;\n  node_id: number;\n  user_id: number;\n  body: string;\n  created_at: string;\n  updated_at?: string;\n  /** Joined author display name (email fallback), filled by the backend. */\n  author_name?: string;\n  /** Whether the CURRENT caller may delete this row (author or admin). */\n  can_delete?: boolean;\n}\n/* === /calisma:d3 === */\n\nexport interface InviteResponse {\n  mode: 'granted' | 'user_created' | 'shared';\n  user_id?: number;\n  url?: string;\n  temp_password?: string;\n  emailed: boolean;\n}\n\n/** POST /api/files/permissions/share-mail's answer. */\nexport interface ShareMailResult {\n  emailed: boolean;\n  sent?: string[];\n  failed?: string[];\n  /** The link has a PIN the mail leaves out: the sender gives it separately. */\n  pin_withheld?: boolean;\n  /** The server's sentence for the composer, in their language. */\n  message?: string;\n}\n\n/* === bul:s3 — global search (GET /api/files/search) === */\n\nexport type GlobalSearchScope = 'name' | 'content' | 'all';\n\n/**\n * One hit from the dedicated files-search endpoint. The backend returns raw\n * node rows (`{results: [...]}`), so `path` is the IN-STORAGE relative path\n * (no `adapter://` prefix) and the storage comes back as a numeric\n * `storage_id`. `snippet`/`matched` are the v0.2 \"Bul\" contract additions —\n * older backends simply omit them, so every consumer must stay\n * undefined-safe.\n */\nexport interface GlobalSearchHit {\n  id?: number;\n  storage_id?: number;\n  name?: string;\n  path?: string;\n  /** `file` | `dir` (backend NodeType). */\n  type?: string;\n  size?: number;\n  mime?: string;\n  /** Plain-text content snippet; matches wrapped in «» (never HTML). */\n  snippet?: string;\n  /** Where the hit matched: name | content | both. */\n  matched?: 'name' | 'content' | 'both';\n  /** Drive NAME the hit lives on (the server fills it; older ones did not). */\n  storage?: string;\n  /**\n   * #47 — which signed-in account the hit came from. Never on the wire: the\n   * explorer stamps it when the host searches several accounts\n   * (`ExplorerConfig.accountSearch`). Absent = this mount's own account, with\n   * no other account in play.\n   */\n  account?: SearchAccount;\n  [k: string]: unknown;\n}\n\n/**\n * Resolve a Vuefinder-compatible endpoint map from the user's config.\n * Either `apiBase` is set (auto-derive everything) or each route is\n * supplied explicitly (legacy). Mixed mode works too — explicit fields\n * trump the derived URL.\n */\nexport function resolveEndpoints(config: ExplorerConfig): EndpointMap {\n  // `apiBase: ''` (empty string) is a *valid* relative-root prefix —\n  // it produces URLs like `/api/files/copy`. Treat only `undefined`\n  // as \"no apiBase, legacy explicit-only mode\". Falsy boolean checks\n  // would silently drop relative-root callers and leave every derived\n  // endpoint null → \"endpoint not configured\" UI dead-ends.\n  const base =\n    config.apiBase != null ? config.apiBase.replace(/\\/+$/, '') : null;\n\n  function derive(path: string | undefined, autoSegment: string): string | null {\n    if (path) return path;\n    if (base === null) return null;\n    return `${base}${autoSegment}`;\n  }\n\n  // Manager URL is mandatory — pick the explicit `endpoint` first, then\n  // fall back to `${apiBase}/api/files/manager`.\n  const manager =\n    config.endpoint ??\n    (base !== null ? `${base}/api/files/manager` : null);\n\n  if (!manager) {\n    throw new Error(\n      \"[@brftech/filex-core] config requires either `apiBase` or `endpoint`\",\n    );\n  }\n\n  return {\n    manager,\n    // Staged (chunked + resumable) uploads — what useUploadChunked speaks on\n    // every driver. The {id} routes are derived from this one.\n    uploadBegin: derive(config.uploadBegin, '/api/files/upload/begin'),\n    shareCreate: derive(config.shareCreate, '/api/files/share'),\n    shareList: derive(config.shareList, '/api/files/share'),\n    shareDelete: derive(config.shareDelete, '/api/files/share/{uuid}'),\n    limits: derive(config.limits, '/api/files/limits'),\n    capabilities: derive(config.capabilities, '/api/files/capabilities'),\n    me: derive(config.me, '/api/auth/me'),\n    archiveList: derive(config.archiveList, '/api/files/archive/list'),\n    archiveExtract: derive(config.archiveExtract, '/api/files/archive/extract'),\n    archiveCreate: derive(config.archiveCreate, '/api/files/archive/create'),\n    archiveAdd: derive(config.archiveAdd, '/api/files/archive/add'),\n    copy: derive(config.copy, '/api/files/copy'),\n    moveAsync: derive(config.moveAsync, '/api/files/move'),\n    deleteAsync: derive(config.deleteAsync, '/api/files/delete'),\n    opsList: derive(config.opsList, '/api/files/ops'),\n    opsShow: derive(config.opsShow, '/api/files/ops/{id}'),\n    onlyOfficeConfig: derive(config.onlyOfficeConfig, '/api/files/onlyoffice/config'),\n    saveText: derive(config.saveText, '/api/files/save-text'),\n    restore: derive(config.restore, '/api/files/restore'),\n    // filex trash: list soft-deleted nodes + restore one by node id.\n    trashList: derive(config.trashList, '/api/files/manager/trash'),\n    trashRestore: derive(config.trashRestore, '/api/files/manager/restore'),\n    /* An operator's \"Delete permanently\" of one trash entry (`{id}`). */\n    trashPurge: derive(config.trashPurge, '/api/admin/trash/{id}'),\n    /* An operator's permanent delete of a selection, in one request. */\n    trashPurgeBatch: derive(config.trashPurgeBatch, '/api/admin/trash/purge'),\n    /* An operator's \"Empty trash\": POST starts it, GET follows it,\n       `/preview` counts what it would delete. */\n    trashEmpty: derive(config.trashEmpty, '/api/admin/trash/empty'),\n    /* An operator's hard delete of one version (`{id}`). */\n    versionPurge: derive(config.versionPurge, '/api/admin/versions/{id}'),\n    /* wiring:e2 — escrow proof-of-possession, then the owner is told. */\n    e2eEscrowChallenge: derive(config.e2eEscrowChallenge, '/api/files/e2e/escrow/challenge'),\n    e2eEscrowUsed: derive(config.e2eEscrowUsed, '/api/files/e2e/escrow/used'),\n    /* wiring:e2 convert — after a folder is encrypted in place. */\n    e2eCleanup: derive(config.e2eCleanup, '/api/files/e2e/cleanup'),\n    /* wiring:e2 policy — may this account encrypt here, and asking for it. */\n    e2eAllowed: derive(config.e2eAllowed, '/api/files/e2e/allowed'),\n    e2eRequests: derive(config.e2eRequests, '/api/files/e2e/requests'),\n    /* App plugins — docs/APP-PLUGINS-API.md. */\n    pluginActions: derive(config.pluginActions, '/api/files/plugins/actions'),\n    pluginActionRun: derive(config.pluginActionRun, '/api/files/plugins/actions/{plugin}/{action}/run'),\n    pluginView: derive(config.pluginView, '/api/files/plugins/views/{plugin}/{view}'),\n    pluginViewEvent: derive(config.pluginViewEvent, '/api/files/plugins/views/{plugin}/{view}/event'),\n    pluginUsers: derive(config.pluginUsers, '/api/files/plugins/users'),\n    opsCancel: derive(config.opsCancel, '/api/files/ops/{id}/cancel'),\n    /* v4 — an app's own interface (AppFrame): its module, and its saves. */\n    pluginUICall: derive(config.pluginUICall, '/api/files/plugins/ui/{plugin}/{view}/call'),\n    pluginUISave: derive(config.pluginUISave, '/api/files/plugins/ui/{plugin}/{view}/save'),\n    /* 0.54 - what an interface reads of its file, checked by the server (#211). */\n    pluginUIRead: derive(config.pluginUIRead, '/api/files/plugins/ui/{plugin}/{view}/read'),\n    /* 0.52.0 - a paid app's license, as the app itself reads it (fx.license.get()). */\n    pluginLicense: derive(config.pluginLicense, '/api/files/plugins/license/{plugin}'),\n  };\n}\n\n/** wiring:e2 policy — the answers the server gives; any other word (a newer\n *  server's) reads as `allowed`, and the server still decides. */\nconst E2E_ANSWERS: readonly E2eAnswer[] = ['allowed', 'request', 'denied'];\n\nfunction asE2eAnswer(v: unknown): E2eAnswer {\n  return typeof v === 'string' && (E2E_ANSWERS as readonly string[]).includes(v) ? (v as E2eAnswer) : 'allowed';\n}\n\n/**\n * Resolve a possibly-async bearer token to a string. Caller passes\n * `auth.token` here so the auth header is fresh on every request.\n */\nasync function resolveToken(t: string | (() => string | Promise<string>)): Promise<string> {\n  if (typeof t === 'function') {\n    const out = t();\n    return out instanceof Promise ? await out : out;\n  }\n  return t;\n}\n\n/**\n * Normalise the legacy `{type: 'bearer'}` shape to the modern\n * `{kind: 'bearer'}` discriminator. Lets us write a single auth-header\n * builder downstream.\n */\nfunction normalizeAuth(auth: AuthConfig | undefined): { kind: 'bearer'; token: string | (() => string | Promise<string>) }\n  | { kind: 'csrf'; csrf: string }\n  | { kind: 'basic'; user: string; pass: string }\n  | { kind: 'none' } {\n  if (!auth) return { kind: 'none' };\n  if ('kind' in auth) return auth;\n  // Legacy shape — translate.\n  if (auth.type === 'bearer') return { kind: 'bearer', token: auth.token };\n  if (auth.type === 'csrf') return { kind: 'csrf', csrf: auth.csrf };\n  return { kind: 'none' };\n}\n\n/** One chunk of an app interface's save, for a server that publishes no\n *  `limits.app_ui_save_chunk_bytes` (older than 0.54). The server's own number\n *  wins when it says one (handlers/app_ui_chunks.go `uiChunkMax`); this one is\n *  held to it by a drift test (web/tests/lib/serverRuleVectors.test.ts). */\nexport const UI_SAVE_CHUNK = 8 << 20;\n\nexport function useFileApi(config: ExplorerConfig) {\n  const endpoints = resolveEndpoints(config);\n  const authConf = normalizeAuth(config.auth);\n\n  /**\n   * Last bearer value a function-token actually produced.\n   *\n   * ⚠ Exists for `authHeadersSync` only. A function token is resolved\n   * asynchronously (the desktop app fetches it from the main process per\n   * call), and a synchronous caller cannot wait for that — before this cache\n   * it simply emitted NO Authorization header, so the request went out\n   * anonymous and came back 401. Remembering the last value turns \"no\n   * credential at all\" into \"the credential we last held\", which is the\n   * difference between a dead feature and a stale-token retry.\n   */\n  let lastBearer: string | null = null;\n\n  async function authHeaders(extra: Record<string, string> = {}): Promise<Record<string, string>> {\n    const h: Record<string, string> = { Accept: 'application/json', ...extra };\n    if (authConf.kind === 'bearer') {\n      const token = await resolveToken(authConf.token);\n      if (token) {\n        h.Authorization = `Bearer ${token}`;\n        lastBearer = token;\n      }\n    } else if (authConf.kind === 'csrf') {\n      h['X-CSRF-TOKEN'] = authConf.csrf;\n      h['X-Requested-With'] = 'XMLHttpRequest';\n    } else if (authConf.kind === 'basic') {\n      const creds = btoa(`${authConf.user}:${authConf.pass}`);\n      h.Authorization = `Basic ${creds}`;\n    }\n    return h;\n  }\n\n  /**\n   * Sync auth-header builder for the few callers that genuinely cannot await\n   * (XMLHttpRequest's `setRequestHeader` loop).\n   *\n   * ⚠ Prefer `authHeaders()`. A function token can only be *resolved*\n   * asynchronously, so this returns the last value one produced — which is\n   * nothing at all until the first async call has run. Measured on 2026-08-10\n   * in the desktop app: the OnlyOffice config POST, the starred list and the\n   * recently-opened POST all went out with no Authorization header and came\n   * back 401, because every one of them reached the API through this function.\n   */\n  function authHeadersSync(extra: Record<string, string> = {}): Record<string, string> {\n    const h: Record<string, string> = { Accept: 'application/json', ...extra };\n    if (authConf.kind === 'bearer') {\n      const token = typeof authConf.token === 'string' ? authConf.token : lastBearer;\n      if (token) h.Authorization = `Bearer ${token}`;\n    } else if (authConf.kind === 'csrf') {\n      h['X-CSRF-TOKEN'] = authConf.csrf;\n      h['X-Requested-With'] = 'XMLHttpRequest';\n    } else if (authConf.kind === 'basic') {\n      const creds = btoa(`${authConf.user}:${authConf.pass}`);\n      h.Authorization = `Basic ${creds}`;\n    }\n    return h;\n  }\n\n  function credentialsMode(): RequestCredentials {\n    return authConf.kind === 'csrf' ? 'include' : 'same-origin';\n  }\n\n  /* ⚠⚠ Every refusal this client meets is said by lib/errorWords — ONE table\n     of status words and refusal codes for every screen (a read-only drive,\n     a missing encryption key, a quota, the statuses). It used to live here\n     as an inline table and was copied, differently, into each component that\n     called `fetch` itself; those printed \"save failed: 500 {…}\" and\n     \"Config fetch 503: {…}\". The raw body rides along as `.detail`, for an\n     administrator's second line and for `lockedRefusal`, never the sentence. */\n  const lang = () => resolveLocale(config.locale);\n\n  async function jsonFetch<T>(url: string, init: RequestInit = {}): Promise<T> {\n    const res = await rawRequest(url, init);\n    if (!res.ok) {\n      const text = await res.text().catch(() => '');\n      throw requestFailure(res.status, text, lang());\n    }\n    // ⚠⚠ A 204 carries NO BODY, and several endpoints answer with one (every\n    // delete does). Parsing it throws \"Unexpected end of JSON input\" AFTER the\n    // server has already done the work, so the caller reports a failure for an\n    // operation that succeeded — measured 2026-08-16 in a browser: revoking an\n    // S3 access key deleted it on the server and left it on screen with an\n    // error under it, which invites the user to trust a credential that is\n    // gone. An empty success is a success.\n    if (res.status === 204 || res.status === 205) return undefined as T;\n    const body = await res.text();\n    if (!body) return undefined as T;\n    return JSON.parse(body) as T;\n  }\n\n  /**\n   * One request with this client's credentials and language, answered as the\n   * Response itself — for a caller that reads a refusal's body as an ANSWER\n   * (a draft saved beside a taken name is a question, not a failure:\n   * lib/drafts). Every other caller wants jsonFetch.\n   */\n  async function rawRequest(url: string, init: RequestInit = {}): Promise<Response> {\n    const headers = {\n      // ⚠⚠ The language on SCREEN, not the one the browser was installed in.\n      // Everything the server writes for a person — a plugin's surface, the\n      // labels inside it, the message on a queued job — is rendered with the\n      // request's `Accept-Language`. Chrome sends `en-US` whatever filex is\n      // set to, so a Turkish window asked a signing wizard for its screens\n      // and got \"Identity\" and an English help line in the middle of Turkish\n      // ones. The window's own language is the only right answer here.\n      'Accept-Language': localeTag(resolveLocale(config.locale)),\n      ...(await authHeaders()),\n      ...((init.headers as Record<string, string> | undefined) ?? {}),\n    };\n    let res: Response;\n    try {\n      res = await fetch(url, {\n        ...init,\n        headers,\n        credentials: credentialsMode(),\n      });\n    } catch (e) {\n      // An abort is the caller's own decision — handed back untouched, callers\n      // branch on `name === 'AbortError'`.\n      if ((e as Error)?.name === 'AbortError') throw e;\n      // No answer at all: said as a network failure, not as the browser's\n      // \"TypeError: Failed to fetch\".\n      // ⚠ Told to the shared notice as well, so an embedded explorer folds a\n      // storm of failed listings and thumbnails the same way the panel does.\n      noteRequestFailed(kindOfMethod(init.method));\n      throw networkFailure(lang(), e);\n    }\n    // Any answer — a 404 and a 500 included — means the connection is not\n    // what is wrong, and the shared notice must not keep saying it is.\n    noteRequestSucceeded();\n    return res;\n  }\n\n  // --------------------------------------------------------------------\n  // Drafts (issue #71) — a new document until its first save. Derived from\n  // the manager endpoint like permissions/versions, so an embed's proxy that\n  // forwards /api/files/* reaches it. The calls are lib/drafts', which the\n  // viewer uses too; this only hands it this client's credentials.\n  // --------------------------------------------------------------------\n  const draftsBase = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/drafts');\n  const drafts = draftsClient(draftsBase, {\n    request: rawRequest,\n    get locale() {\n      return lang();\n    },\n  });\n\n  // --------------------------------------------------------------------\n  // Permissions (RBAC) — derived from the manager endpoint by swapping the\n  // trailing `/manager` for `/permissions`. Owner/admin only (backend gated).\n  // --------------------------------------------------------------------\n  function permissionsUrl(sub = ''): string {\n    const base = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/permissions');\n    return base + sub;\n  }\n  async function listPermissions(path: string): Promise<PermissionsResponse> {\n    return jsonFetch<PermissionsResponse>(permissionsUrl() + '?path=' + encodeURIComponent(path));\n  }\n  async function resolveEmail(email: string): Promise<ResolveEmailResponse> {\n    return jsonFetch<ResolveEmailResponse>(permissionsUrl('/resolve') + '?email=' + encodeURIComponent(email));\n  }\n  async function searchUsers(q: string): Promise<UserSearchResponse> {\n    return jsonFetch<UserSearchResponse>(permissionsUrl('/users') + '?q=' + encodeURIComponent(q));\n  }\n  /** Groups matching q; an empty list from a server without groups. */\n  async function searchGroups(q: string): Promise<{ groups: GroupSuggestion[] }> {\n    try {\n      return await jsonFetch<{ groups: GroupSuggestion[] }>(permissionsUrl('/groups') + '?q=' + encodeURIComponent(q));\n    } catch {\n      return { groups: [] };\n    }\n  }\n  async function updateGroupPermission(id: number, level: string): Promise<unknown> {\n    return jsonFetch(permissionsUrl('/groups/' + id), { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ level }) });\n  }\n  async function deleteGroupPermission(id: number): Promise<unknown> {\n    return jsonFetch(permissionsUrl('/groups/' + id), { method: 'DELETE' });\n  }\n  // ⚠ No `is_dir`: whether a grant is a folder's is the item's fact, and the\n  // server reads it from its catalogue (C11a, 0.54).\n  async function addPermission(body: { path: string; user_id?: number; group_id?: number; level: string }): Promise<unknown> {\n    return jsonFetch(permissionsUrl(), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });\n  }\n  async function updatePermission(id: number, level: string): Promise<unknown> {\n    return jsonFetch(permissionsUrl('/' + id), { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ level }) });\n  }\n  async function deletePermission(id: number): Promise<unknown> {\n    return jsonFetch(permissionsUrl('/' + id), { method: 'DELETE' });\n  }\n  async function invitePermission(body: { path: string; email: string; level: string; create_user?: boolean; role?: string; locale?: string }): Promise<InviteResponse> {\n    return jsonFetch<InviteResponse>(permissionsUrl('/invite'), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });\n  }\n  /**\n   * E-mail a link this person made. ⚠ Only the link's TOKEN, the addresses\n   * and the language travel: the server writes the whole message from the\n   * link itself (its address, expiry, the item's name, kind and size, a file\n   * request's limits) and never mails a PIN (C2, 0.54). `message` is the\n   * server's sentence for the composer, in their language.\n   */\n  async function shareMail(body: { share: string; emails: string[]; locale?: string }): Promise<ShareMailResult> {\n    return jsonFetch<ShareMailResult>(permissionsUrl('/share-mail'), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });\n  }\n  /** The share mail's subject and body for a link, without sending it — what\n   *  the OS share sheet is handed, so both say the same thing. */\n  async function shareMessage(share: string, locale?: string): Promise<{ subject: string; body: string; pin_withheld?: boolean }> {\n    const q = new URLSearchParams({ share });\n    if (locale) q.set('lang', locale);\n    return jsonFetch(permissionsUrl('/share-message') + '?' + q.toString());\n  }\n\n  // --------------------------------------------------------------------\n  // Manager contract — supports both `?q=action` (legacy) and\n  // `?action=action` (new) by emitting BOTH. Backends recognising one\n  // ignore the other; new backends prefer `action`.\n  // --------------------------------------------------------------------\n\n  function qs(params: Record<string, string | number | boolean | undefined>): string {\n    const sp = new URLSearchParams();\n    for (const [k, v] of Object.entries(params)) {\n      if (v === undefined || v === null) continue;\n      sp.set(k, String(v));\n    }\n    return sp.toString();\n  }\n\n  function managerUrl(action: string, params: Record<string, string | number | boolean | undefined> = {}): string {\n    const sep = endpoints.manager.includes('?') ? '&' : '?';\n    return `${endpoints.manager}${sep}${qs({ q: action, action, ...params })}`;\n  }\n\n  // ⚠⚠ A listing of one of filex's own directories is answered with the\n  // storage's root instead (lib/internalPaths → listingAddress). The server\n  // refuses the trash/versions/thumbs trees outright, but it has to keep\n  // serving `.filex-open` by exact path — every desktop release since 0.29.0\n  // reads its working copies that way — so the explorer is the only place\n  // that can tell \"a person navigated here\" from \"the desktop is checking\n  // its copy\". The explorer arrives wherever the response's `dirname` says,\n  // so a stale hash, an old tab or a notification from before this release\n  // lands in the storage instead of in the machinery (measured 2026-09-21:\n  // `#docs/.filex-open` opened a folder of working copies).\n  async function index(path: string): Promise<ManagerResponse> {\n    return jsonFetch<ManagerResponse>(managerUrl('index', { path: listingAddress(path) }));\n  }\n\n  /**\n   * The manager's name search. `narrow` is the search's narrowing as the\n   * server reads it (`type`, `modified_after`, `min_size`, `under`, `owner`,\n   * `hidden`... - lib/advSearch `advFilterParams`), applied on the server\n   * BEFORE its page is cut (task #207). Absent: the plain search.\n   */\n  async function search(path: string, filter: string, narrow?: Record<string, string>): Promise<ManagerResponse> {\n    return jsonFetch<ManagerResponse>(managerUrl('search', { ...(narrow ?? {}), path: listingAddress(path), filter }));\n  }\n\n  /* === bul:s3 — global \"search everywhere\" ===\n   * Derived from the manager endpoint by swapping `/manager` for `/search`\n   * (same trick permissionsUrl uses), so embedded proxies that forward the\n   * whole /api/files/* subtree keep working. Errors and legacy backends\n   * degrade to an empty result list — the palette just shows nothing. */\n  async function globalSearch(\n    query: string,\n    opts: { limit?: number; scope?: GlobalSearchScope; narrow?: Record<string, string> } = {},\n  ): Promise<GlobalSearchHit[]> {\n    return (await globalSearchPage(query, opts)).hits;\n  }\n\n  /**\n   * `globalSearch` with what the server says about the answer: `truncated`\n   * (more matched than came back) and `total` (how many matched - exact unless\n   * truncated). The advanced dialog's count and the results strip read these\n   * rather than guessing from the page length (task #207).\n   */\n  async function globalSearchPage(\n    query: string,\n    opts: { limit?: number; scope?: GlobalSearchScope; narrow?: Record<string, string> } = {},\n  ): Promise<{ hits: GlobalSearchHit[]; truncated?: boolean; total?: number }> {\n    const base = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/search');\n    const sep = base.includes('?') ? '&' : '?';\n    const url = `${base}${sep}${qs({ ...(opts.narrow ?? {}), q: query, limit: opts.limit, scope: opts.scope })}`;\n    const data = await jsonFetch<{ results?: GlobalSearchHit[] | null; truncated?: boolean; total?: number }>(url);\n    return {\n      hits: Array.isArray(data?.results) ? data.results : [],\n      truncated: typeof data?.truncated === 'boolean' ? data.truncated : undefined,\n      total: typeof data?.total === 'number' ? data.total : undefined,\n    };\n  }\n\n  /**\n   * Which of `names` answer `q` by the SEARCH's own name rule - asked of the\n   * server (`POST /api/files/search/match`), so \"Filter in this folder\" and\n   * the search can never disagree about a name (task #207, audit D5). Answers\n   * the matching indexes. `signal` lets the caller drop a question the person\n   * has already typed past. Throws on failure (an abort included).\n   */\n  async function matchNames(q: string, names: string[], signal?: AbortSignal): Promise<number[]> {\n    const url = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/search/match');\n    const data = await jsonFetch<{ matches?: number[] | null }>(url, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ q, names }),\n      signal,\n    });\n    return Array.isArray(data?.matches) ? data.matches : [];\n  }\n\n  /* === surucu:d1 — the signed-in person's storage line ==================\n   * `GET /api/files/quota/me` → `{used_bytes, quota_bytes, percent_used,\n   * unlimited}` (internal/quota/service.go `Snapshot`). Derived from the\n   * manager endpoint the same way permissions and search are, so a proxy that\n   * forwards /api/files/* keeps working.\n   *\n   * ⚠ PER-USER, never per-storage: usage is `SUM(nodes.size) WHERE owner_id=me`\n   * and there is no per-provider quota. Anything labelling this figure with a\n   * drive's name is describing a number the server did not send.\n   *\n   * ⚠ Returns null rather than throwing on ANY failure — a server without the\n   * route (404), an app token with no person behind it (403) or an older build\n   * must leave the panel exactly as it was, not put an error where a status\n   * line goes.\n   */\n  async function quotaMe(): Promise<QuotaSnapshot | null> {\n    const base = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/quota/me');\n    try {\n      const q = await jsonFetch<QuotaSnapshot>(base);\n      return q && typeof q.used_bytes === 'number' ? q : null;\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * `GET /api/files/quota/storages` → `{storages: [{name, used_bytes,\n   * file_count, coverage?}]}` — how full each drive the caller can open is\n   * (handlers/quota_storages.go, RBAC-filtered server-side). The storage line\n   * asks for it when the host handed over no size for some drive — the\n   * desktop app hands over names only (lib/storageLine).\n   *\n   * ⚠ Null on ANY failure, for the reason `quotaMe()` is: a server without the\n   * route must leave the panel as it was.\n   */\n  async function storageUsage(): Promise<MeasuredDrive[] | null> {\n    const base = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/quota/storages');\n    try {\n      const body = await jsonFetch<{ storages?: unknown }>(base);\n      return Array.isArray(body?.storages) ? (body.storages as MeasuredDrive[]) : null;\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * #162 - `GET /api/app-store` → `{visible, stores}`: whether the server shows\n   * this person the store screen (handlers/app_store_view.go: the tenant's\n   * setting, the person's role and groups; a browser session or the desktop\n   * app's pairing, never another API key). The navigation panel's \"App store\"\n   * row asks it (lib/appStoreRow).\n   *\n   * ⚠ Null on ANY failure, for the reason `quotaMe()` is: a server without the\n   * route (older than 0.53) or a refusal leaves the panel as it was - no row.\n   */\n  async function appStoreStatus(): Promise<{ visible: boolean; stores: string[] } | null> {\n    const root = endpoints.manager.replace(/\\/api\\/files\\/manager(\\?.*)?$/, '').replace(/\\/$/, '');\n    try {\n      const body = await jsonFetch<{ visible?: unknown; stores?: unknown }>(`${root}/api/app-store`);\n      return {\n        visible: body?.visible === true,\n        stores: Array.isArray(body?.stores) ? (body.stores as unknown[]).filter((x): x is string => typeof x === 'string') : [],\n      };\n    } catch {\n      return null;\n    }\n  }\n\n  async function subfolders(path: string): Promise<{ folders: FileNode[] }> {\n    return jsonFetch<{ folders: FileNode[] }>(managerUrl('subfolders', { path }));\n  }\n\n  async function newFolder(path: string, name: string): Promise<ManagerResponse> {\n    return jsonFetch<ManagerResponse>(managerUrl('newfolder'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ path, name }),\n    });\n  }\n\n  /**\n   * Create an empty document of a known type in `path`.\n   *\n   * `type` is an extension from `capabilities.newdoc_types` — the registry the\n   * SERVER compiled in, not a list the client keeps. That matters for the\n   * office formats: a .docx is a ZIP of XML parts, so \"create an empty file\"\n   * has to be answered by whoever holds the template bytes, and the client\n   * cannot manufacture one.\n   *\n   * `name` may or may not already carry the extension; the server appends it\n   * when it is missing. Throws on a name collision (409 NAME_TAKEN) — the\n   * dialog warns first, but this is the check.\n   *\n   * `exactName` (#56): `name` is the WHOLE file name. A text type is then\n   * created under exactly it — `LICENSE`, `Makefile`, `test.conf` — and only\n   * a type whose editor needs its extension (`ext_required`: office,\n   * diagrams) still gains it. A text type may not borrow such a type's\n   * extension (`x.docx` as Plain text): 400 `EXT_NEEDS_TYPE`.\n   */\n  async function newFile(\n    path: string,\n    name: string,\n    type: string,\n    opts: { exactName?: boolean } = {},\n  ): Promise<NewFileResponse> {\n    return jsonFetch<NewFileResponse>(managerUrl('newfile'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(opts.exactName ? { path, name, type, exact_name: true } : { path, name, type }),\n    });\n  }\n\n  /** Ask whether `name` is free in `path` for a new document of `type`,\n   *  writing nothing (NewFileCheck). The name is the whole name, as the dialog\n   *  sends it to `newFile` (`exactName`). */\n  async function newFileCheck(path: string, name: string, type: string): Promise<NewFileCheck> {\n    return jsonFetch<NewFileCheck>(managerUrl('newfile'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ path, name, type, exact_name: true, dry_run: true }),\n    });\n  }\n\n  async function rename(path: string, item: string, name: string): Promise<ManagerResponse> {\n    return jsonFetch<ManagerResponse>(managerUrl('rename'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ path, item, name }),\n    });\n  }\n\n  /**\n   * Rename as a job of the operations queue (`queued=1`), for a folder: on an\n   * object store that is one request per object, longer than any proxy waits.\n   * `op` is the job when the server queued it. An older server ignores\n   * `queued` and renames inside the request, and answers the listing instead.\n   * A refusal throws, as `rename` does.\n   */\n  async function renameQueued(path: string, item: string, name: string): Promise<{ op?: PendingOpDto }> {\n    return jsonFetch<{ op?: PendingOpDto }>(managerUrl('rename', { queued: 1 }), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ path, item, name }),\n    });\n  }\n\n  async function move(path: string, items: string[], target: string): Promise<ManagerResponse> {\n    return jsonFetch<ManagerResponse>(managerUrl('move'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ path, item: target, items: items.map((p) => ({ path: p })) }),\n    });\n  }\n\n  async function deleteItems(path: string, items: string[]): Promise<ManagerResponse> {\n    return jsonFetch<ManagerResponse>(managerUrl('delete'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ path, items: items.map((p) => ({ path: p })) }),\n    });\n  }\n\n  /**\n   * Which of `permissions` the account holds on each of `items` — the\n   * server's per-path answer for actions a role allows or denies only in some\n   * folders. One list per item, in the order asked. Changes nothing.\n   */\n  async function allowedAt(items: string[], permissions: string[]): Promise<string[][]> {\n    const out: string[][] = [];\n    // The server takes at most 1000 paths per question.\n    for (let i = 0; i < items.length; i += 1000) {\n      const part = items.slice(i, i + 1000);\n      const data = await jsonFetch<{ allowed?: string[][] }>(managerUrl('allowed'), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ permissions, items: part.map((p) => ({ path: p })) }),\n      });\n      part.forEach((_, j) => out.push(data.allowed?.[j] ?? []));\n    }\n    return out;\n  }\n\n  /** Server-side recursive copy (async — returns a PendingOp). */\n  async function copy(source: string[], target: string): Promise<{ op: PendingOpDto }> {\n    if (!endpoints.copy) throw new Error('copy endpoint not configured');\n    return jsonFetch(endpoints.copy, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ source, target }),\n    });\n  }\n\n  /**\n   * wiring:e2 names — copy or move ONE item into `target` under `name`, as one\n   * step of the queue (the server makes the literal destination; a taken name\n   * is refused, never suffixed). An encrypted-names folder needs it: a name is\n   * sealed for the folder it is in, so an item crossing folders arrives under\n   * a name sealed for its new folder, and nothing can stop between the move\n   * and the rename.\n   */\n  async function transferNamed(\n    kind: 'copy' | 'move',\n    source: string,\n    target: string,\n    name: string,\n    sourceDir?: string,\n  ): Promise<{ op: PendingOpDto }> {\n    const url = kind === 'copy' ? endpoints.copy : endpoints.moveAsync;\n    if (!url) throw new Error(`${kind} endpoint not configured`);\n    return jsonFetch(url, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ source: [source], target, name, ...(sourceDir ? { sourceDir } : {}) }),\n    });\n  }\n  async function moveAsync(source: string[], target: string, sourceDir?: string): Promise<{ op: PendingOpDto }> {\n    if (!endpoints.moveAsync) throw new Error('moveAsync endpoint not configured');\n    return jsonFetch(endpoints.moveAsync, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ source, target, sourceDir }),\n    });\n  }\n\n  async function deleteAsync(source: string[], sourceDir?: string): Promise<{ op: PendingOpDto }> {\n    if (!endpoints.deleteAsync) throw new Error('deleteAsync endpoint not configured');\n    return jsonFetch(endpoints.deleteAsync, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ source, sourceDir }),\n    });\n  }\n\n  async function restore(source: string[]): Promise<{ ok: boolean; restored: number }> {\n    if (!endpoints.restore) throw new Error('restore endpoint not configured');\n    return jsonFetch(endpoints.restore, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ source }),\n    });\n  }\n\n  /**\n   * Restore trash entries by node id as jobs of the operations queue\n   * (`queued=1`): one request for the whole selection, one job per storage.\n   * Only for a server whose capabilities list `restore` under `queued`;\n   * anything else restores the batch inside the request (restoreBatch).\n   * `summary` is the server's sentence for what is on its way.\n   */\n  async function restoreQueued(ids: number[]): Promise<{ ops: PendingOpDto[]; summary: string }> {\n    if (!endpoints.trashRestore) throw new Error('trashRestore endpoint not configured');\n    const sep = endpoints.trashRestore.includes('?') ? '&' : '?';\n    const res = await jsonFetch<{ ops?: PendingOpDto[]; summary?: string }>(\n      withScreenLang(`${endpoints.trashRestore}${sep}queued=1`),\n      {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ node_ids: ids }),\n      },\n    );\n    return { ops: res.ops ?? [], summary: res.summary ?? '' };\n  }\n\n  /**\n   * One page of the filex trash listing — soft-deleted nodes across (or, with\n   * `storageName`, within) storages — and the server's totals for all of it\n   * (`total`, `total_bytes`, `storages`, `summary`; see TrashPage).\n   *\n   * ⚠ The storage is named `storage=<adapter name>`, which the server reads\n   * since 0.54: it read only `storage_id`, so a storage's `.trash` row summed\n   * the newest 50 entries of every storage (finding D2).\n   */\n  async function listTrash(\n    storageName?: string,\n    page: { limit?: number; offset?: number } = {},\n  ): Promise<TrashPage> {\n    if (!endpoints.trashList) throw new Error('trashList endpoint not configured');\n    const q: string[] = [];\n    if (storageName) q.push(`storage=${encodeURIComponent(storageName)}`);\n    if (page.limit) q.push(`limit=${page.limit}`);\n    if (page.offset) q.push(`offset=${page.offset}`);\n    const base = endpoints.trashList;\n    const url = q.length ? `${base}${base.includes('?') ? '&' : '?'}${q.join('&')}` : base;\n    return jsonFetch<TrashPage>(withScreenLang(url));\n  }\n\n  /**\n   * Restores trash entries by node id in ONE request (`POST {node_ids}`): the\n   * server restores each, inside the request, and answers how many came back,\n   * how many did not and why — `{done, failed, reason_code, taken, summary}`,\n   * `summary` being its sentence for all of it in the screen's language.\n   *\n   * ⚠ This was one request per entry, tallied and worded here (finding A15):\n   * the server knows what happened and says it.\n   */\n  async function restoreBatch(ids: number[]): Promise<TrashBatchAnswer> {\n    const url = endpoints.trashRestore;\n    if (!url) throw new Error('trashRestore endpoint not configured');\n    return jsonFetch<TrashBatchAnswer>(withScreenLang(url), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ node_ids: ids }),\n    });\n  }\n\n  /**\n   * Deletes several trash entries for good in ONE request (`POST\n   * /api/admin/trash/purge {node_ids}`) — an operator's \"Delete permanently\"\n   * of a selection. With `queued` (a server whose capabilities list `purge`\n   * under `queued`) the server queues one job per storage and hands them back\n   * as `ops`. The answer's `summary` says what was deleted (or is on its way)\n   * and what was not and why; a refusal of the whole request throws, said in\n   * the server's words (requestFailure).\n   */\n  async function purgeBatch(ids: number[], opts: { queued?: boolean } = {}): Promise<TrashBatchAnswer> {\n    const base = endpoints.trashPurgeBatch;\n    if (!base) throw new Error('trashPurgeBatch endpoint not configured');\n    const url = opts.queued ? `${base}${base.includes('?') ? '&' : '?'}queued=1` : base;\n    return jsonFetch<TrashBatchAnswer>(withScreenLang(url), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ node_ids: ids }),\n    });\n  }\n\n  /**\n   * What \"Empty trash\" would delete, nothing deleted (`GET <trashEmpty>/preview`):\n   * the server's count over everything the purge reaches — other people's\n   * deletes included — and its sentence for the confirmation.\n   *\n   * ⚠⚠ The confirmation counted the rows this explorer had loaded (the first\n   * 50) while the purge took the whole trash (finding D1). It names this.\n   */\n  async function trashEmptyPreview(): Promise<TrashEmptyPreview> {\n    const base = endpoints.trashEmpty;\n    if (!base) throw new Error('trashEmpty endpoint not configured');\n    return jsonFetch<TrashEmptyPreview>(withScreenLang(`${base.replace(/\\/+$/, '')}/preview`));\n  }\n\n  /**\n   * Deletes one trash entry for good (`DELETE /api/admin/trash/{id}`) — an\n   * operator's \"Delete permanently\". With `queued` (a server whose\n   * capabilities list `purge` under `queued`) it is a job of the operations\n   * queue, handed back as `op`: a folder is purged one object and one row at a\n   * time, which outlasts a request. A refusal throws, said in the server's\n   * words (requestFailure).\n   *\n   * ⚠ Through jsonFetch like every other request: it was a raw `fetch` in the\n   * explorer, and a refusal lost the server's reason there.\n   */\n  async function purgeTrash(id: number, opts: { queued?: boolean } = {}): Promise<{ op?: PendingOpDto }> {\n    const tpl = endpoints.trashPurge;\n    if (!tpl) throw new Error('trashPurge endpoint not configured');\n    let url = tpl.replace('{id}', encodeURIComponent(String(id)));\n    if (opts.queued) url += `${url.includes('?') ? '&' : '?'}queued=1`;\n    const res = await jsonFetch<{ op?: PendingOpDto } | undefined>(url, { method: 'DELETE' });\n    return res?.op ? { op: res.op } : {};\n  }\n\n  /**\n   * Deletes one version for good (`DELETE /api/admin/versions/{id}`): the\n   * row and the bytes it kept. An operator's action, like purgeTrash; used by\n   * \"Delete the original for good\" when a file is encrypted (useE2eFiles).\n   */\n  async function purgeVersion(id: number): Promise<void> {\n    const tpl = endpoints.versionPurge;\n    if (!tpl) throw new Error('versionPurge endpoint not configured');\n    await jsonFetch(tpl.replace('{id}', encodeURIComponent(String(id))), { method: 'DELETE' });\n  }\n\n  /**\n   * Legacy in-band multipart upload (small files / chunked endpoint\n   * absent). XMLHttpRequest because fetch doesn't expose upload\n   * progress on most browsers.\n   */\n  async function uploadMultipart(\n    path: string,\n    files: File[],\n    onProgress?: (p: number) => void,\n    /** Extra form fields: `expect` (the precondition \"<size>:<ms>\" or\n     *  \"none\"), `e2e_convert` (an in-place E2E conversion write). */\n    fields?: Record<string, string>,\n  ): Promise<ManagerResponse> {\n    const fd = new FormData();\n    fd.append('path', path);\n    for (const [k, v] of Object.entries(fields ?? {})) fd.append(k, v);\n    for (const f of files) {\n      fd.append('file[]', f, f.name);\n    }\n    const headers = await authHeaders();\n    return new Promise<ManagerResponse>((resolve, reject) => {\n      const xhr = new XMLHttpRequest();\n      xhr.open('POST', managerUrl('upload'));\n      for (const [k, v] of Object.entries(headers)) {\n        if (k === 'Content-Type') continue;\n        xhr.setRequestHeader(k, v);\n      }\n      xhr.withCredentials = credentialsMode() === 'include';\n      xhr.upload.onprogress = (ev) => {\n        if (onProgress && ev.lengthComputable) {\n          onProgress(Math.round((ev.loaded / ev.total) * 100));\n        }\n      };\n      xhr.onload = () => {\n        noteRequestSucceeded();\n        if (xhr.status >= 200 && xhr.status < 300) {\n          try {\n            resolve(JSON.parse(xhr.responseText));\n          } catch (e) {\n            reject(e);\n          }\n        } else {\n          reject(requestFailure(xhr.status, xhr.responseText || '', lang()));\n        }\n      };\n      // ⚠ `action`, not `background`: an upload is something the person\n      // started and is waiting on, so it is NEVER folded into the shared\n      // notice — it says for itself that it did not go.\n      xhr.onerror = () => {\n        noteRequestFailed('action');\n        reject(networkFailure(lang()));\n      };\n      xhr.send(fd);\n    });\n  }\n\n  function downloadUrl(path: string): string {\n    return managerUrl('download', { path });\n  }\n\n  function previewUrl(path: string): string {\n    return managerUrl('preview', { path });\n  }\n\n  /**\n   * Fetch a file body with the configured auth headers + credentials,\n   * returning the raw blob plus a normalized object URL viewers can mount\n   * directly. Used by the rich viewers (3D, EPUB, PDF, PSD, TIFF, …) which\n   * need an `ArrayBuffer` or a `Blob`-backed `objectURL` rather than the\n   * relative preview URL.\n   *\n   * Caller is responsible for revoking `url` (`URL.revokeObjectURL(url)`)\n   * once the viewer unmounts to avoid leaking the blob.\n   */\n  async function fetchBlob(\n    path: string,\n    opts: { fresh?: boolean } = {},\n  ): Promise<{ url: string; blob: Blob; mime: string }> {\n    const headers = await authHeaders();\n    const res = await fetch(previewUrl(path), {\n      headers,\n      credentials: credentialsMode(),\n      // ⚠ The preview endpoint answers `Cache-Control: private, max-age=60`,\n      // which is right for the thing it was built for — a viewer re-opening\n      // an image — and wrong for anything the client treats as CONTROL data.\n      // `.filex-e2e.json` is control data: after the client rewrites it\n      // (recovery upgrade, escrow slot, escrow refusal) the next read inside\n      // that minute came back PRE-write, so the folder looked un-upgraded\n      // and the question filex had just been answered was asked again.\n      // Measured 2026-09-05 in a real browser: decline the escrow offer,\n      // reopen the folder, and the offer was back.\n      cache: opts.fresh ? 'no-store' : 'default',\n    });\n    if (!res.ok) {\n      const text = await res.text().catch(() => '');\n      throw requestFailure(res.status, text, lang());\n    }\n    const blob = await res.blob();\n    const mime = blob.type || res.headers.get('content-type') || '';\n    const url = URL.createObjectURL(blob);\n    return { url, blob, mime };\n  }\n\n  /**\n   * Like `fetchBlob` but returns the raw bytes — viewers that need\n   * binary parsing (utif, ag-psd, pdfjs-dist) get the buffer directly\n   * without the extra `Blob → arrayBuffer` round trip.\n   */\n  async function fetchArrayBuffer(path: string): Promise<ArrayBuffer> {\n    const headers = await authHeaders();\n    const res = await fetch(previewUrl(path), {\n      headers,\n      credentials: credentialsMode(),\n    });\n    if (!res.ok) {\n      const text = await res.text().catch(() => '');\n      throw requestFailure(res.status, text, lang());\n    }\n    return res.arrayBuffer();\n  }\n\n  // --------------------------------------------------------------------\n  // Peripheral endpoints\n  // --------------------------------------------------------------------\n\n  async function limits(): Promise<UploadLimits> {\n    if (!endpoints.limits) return { max_upload_mb: 1024 };\n    return jsonFetch<UploadLimits>(endpoints.limits);\n  }\n\n  async function capabilities(): Promise<Capabilities> {\n    if (!endpoints.capabilities) {\n      return {\n        ffmpeg: false,\n        ghostscript: false,\n        max_chunk_mb: 5,\n        upload_limit_mb: 1024,\n        onlyoffice_url: config.onlyOfficeBase ?? null,\n        drawio_url: config.drawioBase ?? null,\n      };\n    }\n    const caps = await jsonFetch<Capabilities>(endpoints.capabilities);\n    // The server's rules (edit kinds, input limits) for every component on\n    // the page - lib/serverRules (#211).\n    takeServerRules(caps);\n    return caps;\n  }\n\n  /** What the signed-in account may do (`/api/auth/me`, filex internal/perm):\n   *  null when the endpoint is off or the answer carries no permissions. */\n  async function myPermissions(): Promise<{\n    admin: boolean;\n    permissions: string[];\n    byFolder: string[];\n  } | null> {\n    if (!endpoints.me) return null;\n    const me = await jsonFetch<{\n      user?: { role?: string };\n      permissions?: string[];\n      permissions_in_folders?: string[];\n      permissions_by_folder?: string[];\n    }>(endpoints.me);\n    if (!me || !Array.isArray(me.permissions)) return null;\n    return {\n      admin: me.user?.role === 'admin',\n      permissions: [...me.permissions, ...(me.permissions_in_folders ?? [])],\n      byFolder: me.permissions_by_folder ?? [],\n    };\n  }\n\n  /* ── App plugins (docs/APP-PLUGINS-API.md) ─────────────────────────── */\n\n  /** Fill `{name}` placeholders of an endpoint template. */\n  function fillTemplate(tpl: string, vars: Record<string, string | number>): string {\n    return Object.entries(vars).reduce(\n      (acc, [k, v]) => acc.replaceAll(`{${k}}`, encodeURIComponent(String(v))),\n      tpl,\n    );\n  }\n\n  /**\n   * An app call's URL with the language on SCREEN named (`lang=`).\n   *\n   * ⚠⚠ Accept-Language already carries it (jsonFetch), but the server ranks\n   * that header below the ACCOUNT's language on purpose — for any other\n   * client it is only the language the browser was installed in. An embed\n   * draws the language its host chose (`config.locale`), whatever the\n   * account says, and an app picks its plain strings (a field's label and\n   * help, a select's options) by the language it is told: a Turkish popup\n   * over an English account asked \"Identity\" with an English help line\n   * (the signing app, 2026-09-26). Named here, it is an explicit choice the\n   * server puts first (backend pluginLang). A host's own endpoint template\n   * may already carry a query, so the separator is chosen, not assumed.\n   */\n  function withScreenLang(url: string): string {\n    return `${url}${url.includes('?') ? '&' : '?'}lang=${encodeURIComponent(lang())}`;\n  }\n\n  /**\n   * The address an app's interface is loaded from (docs/APP-PLUGINS-API.md →\n   * An app's own interface): the row's `ui.url` joined with this server's\n   * root, like every other relative address filex answers — unless the server\n   * named an absolute one (interfaces on an origin of their own).\n   */\n  function appUIUrl(url: string): string {\n    if (/^https?:\\/\\//i.test(url)) return url;\n    const root = endpoints.manager.replace(/\\/api\\/files\\/manager(\\?.*)?$/, '');\n    return root.replace(/\\/$/, '') + (url.startsWith('/') ? url : `/${url}`);\n  }\n\n  /**\n   * `GET …/plugins/license/{plugin}` - what an app reads about its own license\n   * (fx.license.get()): `{status, valid_until?, updates_until?}`,\n   * `{status: \"free\"}` for a free app. Never the key, the licensee or the store.\n   */\n  async function pluginLicense(plugin: string): Promise<LicenseInfo> {\n    if (!endpoints.pluginLicense) throw new Error('pluginLicense endpoint not configured');\n    return jsonFetch<LicenseInfo>(fillTemplate(endpoints.pluginLicense, { plugin }));\n  }\n\n  /** `POST …/plugins/ui/{plugin}/{view}/call` — the app's module (`ui_call`). */\n  async function pluginUICall(\n    plugin: string,\n    view: string,\n    body: { method: string; params?: unknown; paths: string[] },\n  ): Promise<{ result: unknown }> {\n    if (!endpoints.pluginUICall) throw new Error('pluginUICall endpoint not configured');\n    return jsonFetch<{ result: unknown }>(withScreenLang(fillTemplate(endpoints.pluginUICall, { plugin, view })), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(body),\n    });\n  }\n\n  /**\n   * `PUT …/plugins/ui/{plugin}/{view}/save?path=` — an interface's save: the\n   * new content of a file it was opened with (a new version, or the draft it\n   * is), or with `dir` + `name` a NEW file there.\n   *\n   * ⚠ Anything over one chunk (8 MiB) goes as a CHUNKED save — `chunk=start`,\n   * then `session=&offset=`, the last with `final=1` — so every request stays\n   * under a reverse proxy's body limit, and a stream the interface hands over\n   * is sent as it is read, never held whole in this page. The server writes\n   * the file once, when the last chunk arrives (handlers/app_ui_chunks.go).\n   */\n  async function pluginUISave(\n    plugin: string,\n    view: string,\n    target: { path: string } | { dir: string; name: string },\n    body: Blob | ReadableStream<Uint8Array>,\n  ): Promise<{ saved: boolean; path: string; name: string; size: number }> {\n    if (!endpoints.pluginUISave) throw new Error('pluginUISave endpoint not configured');\n    const q = 'path' in target\n      ? `path=${encodeURIComponent(target.path)}`\n      : `dir=${encodeURIComponent(target.dir)}&name=${encodeURIComponent(target.name)}`;\n    const url = fillTemplate(endpoints.pluginUISave, { plugin, view });\n    const base = `${url}${url.includes('?') ? '&' : '?'}${q}`;\n    // The server's chunk size when it says one (`limits`, #211).\n    const CHUNK = serverLimit('app_ui_save_chunk_bytes') ?? UI_SAVE_CHUNK;\n    const put = <T>(u: string, part: Blob) =>\n      jsonFetch<T>(u, { method: 'PUT', headers: { 'Content-Type': 'application/octet-stream' }, body: part });\n    if (body instanceof Blob && body.size <= CHUNK) {\n      return jsonFetch(base, {\n        method: 'PUT',\n        headers: { 'Content-Type': body.type || 'application/octet-stream' },\n        body,\n      });\n    }\n    let session = '';\n    let offset = 0;\n    const next = async (part: Blob, final: boolean) => {\n      const u = session\n        ? `${base}&session=${encodeURIComponent(session)}&offset=${offset}${final ? '&final=1' : ''}`\n        : `${base}&chunk=start${final ? '&final=1' : ''}`;\n      const r = await put<{ session?: string; received?: number; saved?: boolean; path: string; name: string; size: number }>(u, part);\n      if (!final) {\n        session = r.session ?? session;\n        offset = r.received ?? offset + part.size;\n      }\n      return r;\n    };\n    if (body instanceof Blob) {\n      for (let at = 0; ; at += CHUNK) {\n        const end = Math.min(at + CHUNK, body.size);\n        const part = body.slice(at, end);\n        if (end >= body.size) return (await next(part, true)) as { saved: boolean; path: string; name: string; size: number };\n        await next(part, false);\n      }\n    }\n    const reader = body.getReader();\n    let held: Uint8Array[] = [];\n    let heldBytes = 0;\n    for (;;) {\n      const { done, value } = await reader.read();\n      if (value && value.byteLength) {\n        held.push(value);\n        heldBytes += value.byteLength;\n      }\n      while (heldBytes >= CHUNK && !done) {\n        const all = new Blob(held as BlobPart[]);\n        await next(all.slice(0, CHUNK), false);\n        const rest = new Uint8Array(await all.slice(CHUNK).arrayBuffer());\n        held = rest.byteLength ? [rest] : [];\n        heldBytes = rest.byteLength;\n      }\n      if (done) {\n        const last = new Blob(held as BlobPart[]);\n        if (!session && last.size <= CHUNK) {\n          return jsonFetch(base, { method: 'PUT', headers: { 'Content-Type': 'application/octet-stream' }, body: last });\n        }\n        return (await next(last, true)) as { saved: boolean; path: string; name: string; size: number };\n      }\n    }\n  }\n\n  /**\n   * The file's bytes as a response to stream from — `file.read` of an app's\n   * interface. The same preview address the viewers read, with this viewer's\n   * credentials, never cached (a save a moment ago must be what is read).\n   */\n  async function fetchResponse(path: string): Promise<Response> {\n    const headers = await authHeaders();\n    const res = await fetch(previewUrl(path), { headers, credentials: credentialsMode(), cache: 'no-store' });\n    if (!res.ok) {\n      const text = await res.text().catch(() => '');\n      throw requestFailure(res.status, text, lang());\n    }\n    return res;\n  }\n\n  /**\n   * `file.read` of an app's interface, through the server (#211, audit B19):\n   * `GET /api/files/plugins/ui/{plugin}/{view}/read?path=` checks that the app\n   * runs, was granted files:read and is not switched off for this kind, then\n   * answers the same bytes the preview does. The frame's own check of the\n   * grant is no longer the only one.\n   */\n  async function pluginUIRead(plugin: string, view: string, path: string): Promise<Response> {\n    if (!endpoints.pluginUIRead) return fetchResponse(path);\n    const url = fillTemplate(endpoints.pluginUIRead, { plugin, view });\n    const headers = await authHeaders();\n    const res = await fetch(`${url}${url.includes('?') ? '&' : '?'}path=${encodeURIComponent(path)}`, {\n      headers,\n      credentials: credentialsMode(),\n      cache: 'no-store',\n    });\n    if (!res.ok) {\n      const text = await res.text().catch(() => '');\n      throw requestFailure(res.status, text, lang());\n    }\n    return res;\n  }\n\n  /** `GET /api/files/plugins/actions` — what applies to the caller, and the\n   *  administrator's open rules by kind (Default apps, 0.50).\n   *\n   *  ⚠ Every field the answer carries is passed on: this used to rebuild the\n   *  answer from `actions` and `views` only, so `open_rules` never reached the\n   *  explorer - a handler switched off for a kind was still offered in \"Open\n   *  with\" and the administrator's order was not followed (e2e 185). */\n  async function pluginActions(): Promise<PluginActionsResponse> {\n    if (!endpoints.pluginActions) return { actions: [], views: [] };\n    const res = await jsonFetch<Partial<PluginActionsResponse>>(endpoints.pluginActions);\n    return {\n      actions: res?.actions ?? [],\n      views: res?.views ?? [],\n      ...(res?.open_rules ? { open_rules: res.open_rules } : {}),\n    };\n  }\n\n  /**\n   * `POST …/actions/{plugin}/{action}/run`. `paths` are adapter-qualified\n   * wire paths (`docs://reports/nda.pdf`) — the same form copy/move send.\n   * Answers `{op}` (queued) or `{surface}` (the action opens a view first).\n   */\n  async function pluginActionRun(\n    plugin: string,\n    action: string,\n    body: { paths: string[]; params?: Record<string, unknown> },\n  ): Promise<PluginRunResult> {\n    if (!endpoints.pluginActionRun) throw new Error('pluginActionRun endpoint not configured');\n    return jsonFetch<PluginRunResult>(withScreenLang(fillTemplate(endpoints.pluginActionRun, { plugin, action })), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(body),\n    });\n  }\n\n  /** `GET …/views/{plugin}/{view}?path=` — the initial surface (event `open`). */\n  /**\n   * `GET …/views/{plugin}/{view}` — a view's opening surface. `section` opens\n   * a home page at one of its sections (`surface.sections`): the frame keeps\n   * it in its own address, so Back and a link land where they were.\n   */\n  async function pluginView(\n    plugin: string,\n    view: string,\n    path?: string,\n    section?: string,\n  ): Promise<{ surface: PluginSurface }> {\n    if (!endpoints.pluginView) throw new Error('pluginView endpoint not configured');\n    const url = fillTemplate(endpoints.pluginView, { plugin, view });\n    const q = [\n      path ? `path=${encodeURIComponent(path)}` : '',\n      section ? `section=${encodeURIComponent(section)}` : '',\n    ].filter(Boolean);\n    return jsonFetch<{ surface: PluginSurface }>(withScreenLang(url + (q.length ? `?${q.join('&')}` : '')));\n  }\n\n  /** `POST …/views/{plugin}/{view}/event` — answers a surface, or `{op}` when it enqueued a job. */\n  async function pluginViewEvent(plugin: string, view: string, body: PluginViewEventBody): Promise<PluginRunResult> {\n    if (!endpoints.pluginViewEvent) throw new Error('pluginViewEvent endpoint not configured');\n    return jsonFetch<PluginRunResult>(withScreenLang(fillTemplate(endpoints.pluginViewEvent, { plugin, view })), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(body),\n    });\n  }\n\n  /**\n   * `GET …/plugins/users?plugin=<name>&q=` — the people-picker's lookup of\n   * internal users. Answers only for a plugin that holds `users:lookup`;\n   * 403 (and 404 on an older server) mean \"free e-mail entry only\" and the\n   * caller reads the status off the thrown error.\n   */\n  async function pluginUsers(plugin: string, q: string): Promise<PluginUsersResponse> {\n    if (!endpoints.pluginUsers) throw Object.assign(new Error('pluginUsers endpoint not configured'), { status: 404 });\n    const url = `${endpoints.pluginUsers}?plugin=${encodeURIComponent(plugin)}&q=${encodeURIComponent(q)}`;\n    const res = await jsonFetch<Partial<PluginUsersResponse>>(url);\n    return { users: res?.users ?? [] };\n  }\n\n  /** `POST /api/files/ops/{id}/cancel`. */\n  async function opsCancel(id: number): Promise<void> {\n    if (!endpoints.opsCancel) throw new Error('opsCancel endpoint not configured');\n    await jsonFetch<unknown>(fillTemplate(endpoints.opsCancel, { id }), { method: 'POST' });\n  }\n\n  /* wiring:e2 — escrow use is announced, not merely performed.\n   *\n   * Ask the server for a nonce sealed to the escrow public key; only the\n   * holder of the private half can read it back. Returning it is what earns\n   * the notification to the folder's owner — a bare \"I used escrow\" POST\n   * would be a string anyone could send.\n   *\n   * ⚠ This is an announcement, not a gate. An operator holding the private\n   * key can decrypt the folder offline with a script and never come here.\n   * docs/E2E-ENCRYPTION.md says so plainly and must keep saying so. */\n  async function e2eEscrowChallenge(\n    path: string,\n  ): Promise<{ id: string; challenge: string; kid: string }> {\n    if (!endpoints.e2eEscrowChallenge) throw new Error('e2e escrow endpoint not configured');\n    return jsonFetch(endpoints.e2eEscrowChallenge, {\n      method: 'POST',\n      body: JSON.stringify({ path }),\n    });\n  }\n\n  async function e2eEscrowUsed(payload: {\n    path: string;\n    id: string;\n    nonce: string;\n  }): Promise<{ ok: boolean; notified: boolean }> {\n    if (!endpoints.e2eEscrowUsed) throw new Error('e2e escrow endpoint not configured');\n    return jsonFetch(endpoints.e2eEscrowUsed, {\n      method: 'POST',\n      body: JSON.stringify(payload),\n    });\n  }\n\n  /**\n   * wiring:e2 password — announce that an encrypted folder's password was\n   * changed (or reset with its recovery key), AFTER the new key file is\n   * written. The server records it in the audit log and tells the folder's\n   * owner (`e2e.password_changed`). It carries no key material: the change\n   * itself happened in this browser.\n   */\n  /**\n   * wiring:e2 convert — the first `n` bytes of a file, without downloading\n   * the rest: a range request, and the body cancelled after the first chunk\n   * even where the range is not honoured. For the conversion's \"is this one\n   * already encrypted?\" (the magic), on files that may be gigabytes.\n   */\n  async function fetchHead(path: string, n = 16): Promise<Uint8Array> {\n    const headers = { ...(await authHeaders()), Range: `bytes=0-${n - 1}` };\n    const res = await fetch(previewUrl(path), { headers, credentials: credentialsMode(), cache: 'no-store' });\n    if (!res.ok) {\n      const text = await res.text().catch(() => '');\n      throw requestFailure(res.status, text, lang());\n    }\n    if (!res.body) return new Uint8Array(await res.arrayBuffer()).slice(0, n);\n    const reader = res.body.getReader();\n    const out = new Uint8Array(n);\n    let got = 0;\n    try {\n      while (got < n) {\n        const { done, value } = await reader.read();\n        if (done || !value) break;\n        const take = Math.min(value.length, n - got);\n        out.set(value.subarray(0, take), got);\n        got += take;\n      }\n    } finally {\n      void reader.cancel().catch(() => undefined);\n    }\n    return out.slice(0, got);\n  }\n\n  /**\n   * wiring:e2 convert — after a folder was encrypted in place: the server\n   * drops the thumbnails and extracted search content it holds for it and,\n   * when asked (owner or administrator), every version and every trash entry\n   * that came from it.\n   */\n  async function e2eCleanup(payload: { path: string; versions: boolean; trash: boolean }): Promise<{\n    versions_deleted: number;\n    trash_purged: number;\n    thumbnails_dropped: number;\n    index_cleared: number;\n  }> {\n    if (!endpoints.e2eCleanup) throw new Error('e2e cleanup endpoint not configured');\n    return jsonFetch(endpoints.e2eCleanup, { method: 'POST', body: JSON.stringify(payload) });\n  }\n\n  /**\n   * wiring:e2 policy - may this account START encrypting at each of `asks`:\n   * a folder a new encrypted folder would be created in (`new_folder`), a\n   * folder to encrypt where it is (`folder`), a file to encrypt (`file`); a\n   * bare path asks for the kind the server's catalogue says (backend\n   * internal/e2epolicy AnswerForKind - the approvals a create door would\n   * spend, so the menu offers what the server accepts). One answer per\n   * question, in the order asked. Changes nothing.\n   *\n   * ⚠ Never throws. A question that fails — or a server older than the\n   * policy, which has no such endpoint — answers `allowed` for every path: the\n   * menu then offers what it always did, and the server decides, as it does\n   * for every write that creates a key file or a `.fxe`. A failure is said in\n   * the console; it is never shown to the person. `onFailed` hears that the\n   * answers are that fallback (#196: the explorer then does not remember them).\n   */\n  async function e2eAllowedAt(\n    asks: Array<string | { path: string; kind?: E2eRequestKind }>,\n    opts: { onFailed?: () => void } = {},\n  ): Promise<E2eAnswer[]> {\n    const url = endpoints.e2eAllowed;\n    if (!url || !asks.length) return asks.map((): E2eAnswer => 'allowed');\n    const out: E2eAnswer[] = [];\n    try {\n      // The server takes at most 1000 paths per question, as for `allowed`.\n      for (let i = 0; i < asks.length; i += 1000) {\n        const part = asks.slice(i, i + 1000);\n        const data = await jsonFetch<{ encrypt?: unknown[] }>(url, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({\n            items: part.map((a) => (typeof a === 'string' ? { path: a } : a.kind ? { path: a.path, kind: a.kind } : { path: a.path })),\n          }),\n        });\n        part.forEach((_, j) => out.push(asE2eAnswer(data?.encrypt?.[j])));\n      }\n    } catch (err) {\n      // Fail-open on purpose, but not silent: a question that keeps failing is\n      // how a menu goes on offering what the server then refuses, and the\n      // console is where somebody looks (the `[filex]` prefix of the other warnings).\n      console.warn('[filex] could not ask who may encrypt here; offering encryption as before', err);\n      opts.onFailed?.();\n      return asks.map((): E2eAnswer => 'allowed');\n    }\n    return out;\n  }\n\n  /**\n   * wiring:e2 policy — ask an administrator to allow one encryption (the\n   * tenant's policy is `approval` and the answer here was `request`). The\n   * server keeps one waiting request per person and folder or file: asking\n   * again answers the one already there, `created: false`.\n   */\n  async function e2eRequest(body: {\n    path: string;\n    kind: E2eRequestKind;\n    reason: string;\n  }): Promise<{ request: E2eRequestDto; created: boolean }> {\n    if (!endpoints.e2eRequests) throw new Error('e2e requests endpoint not configured');\n    return jsonFetch(endpoints.e2eRequests, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(body),\n    });\n  }\n\n  async function createShare(payload: {\n    path: string;\n    password?: boolean;\n    /** The link's life in SECONDS, counted on the server's clock (preferred:\n     *  a moment worked out on this device's clock drifts with it). */\n    expires_in?: number | null;\n    /** RFC 3339; wins over `expires_in` when both are sent. */\n    expires_at?: string | null;\n    max_downloads?: number | null;\n    // File-drop (public upload link) — kind:'drop' mints an upload link into a\n    // folder instead of a download link; drop_settings carries the caps.\n    kind?: string;\n    max_uploads?: number | null;\n    drop_settings?: Record<string, unknown> | null;\n  }): Promise<{ share: ShareInfo & { url: string; path: string; filename: string; kind?: string; token?: string } }> {\n    if (!endpoints.shareCreate) throw new Error('shareCreate endpoint not configured');\n    return jsonFetch(endpoints.shareCreate, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(payload),\n    });\n  }\n\n  async function listShares(path: string): Promise<{ shares: ShareInfo[] }> {\n    if (!endpoints.shareList) return { shares: [] };\n    const sep = endpoints.shareList.includes('?') ? '&' : '?';\n    return jsonFetch(`${endpoints.shareList}${sep}path=${encodeURIComponent(path)}`);\n  }\n\n  async function revokeShare(uuid: string): Promise<{ success: boolean }> {\n    if (!endpoints.shareDelete) throw new Error('shareDelete endpoint not configured');\n    const url = endpoints.shareDelete.replace('{uuid}', encodeURIComponent(uuid));\n    return jsonFetch(url, { method: 'DELETE' });\n  }\n\n  async function archiveList(path: string, password?: string): Promise<{ entries: ArchiveEntry[] }> {\n    if (!endpoints.archiveList) throw new Error('archiveList endpoint not configured');\n    const raw = await jsonFetch<{ entries: Array<{ name: string; size: number; is_dir: boolean; mtime?: number }> }>(\n      endpoints.archiveList,\n      {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ path, password }),\n      },\n    );\n    return {\n      entries: raw.entries.map((e) => ({\n        name: e.name,\n        size: e.size,\n        isDir: e.is_dir,\n        lastModified: e.mtime,\n      })),\n    };\n  }\n\n  async function archiveExtract(\n    path: string,\n    options: { members?: string[]; password?: string; dest?: string } = {},\n  ): Promise<{ op?: PendingOpDto; keys?: string[]; count?: number }> {\n    if (!endpoints.archiveExtract) throw new Error('archiveExtract endpoint not configured');\n    return jsonFetch(endpoints.archiveExtract, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ path, ...options }),\n    });\n  }\n\n  async function archiveCreate(payload: {\n    dest: string;\n    sources: string[];\n    format: ArchiveCreateFormat;\n    password?: string;\n    encrypt_filenames?: boolean;\n    compression?: number;\n    solid?: boolean;\n    dictionary_size_mb?: number;\n  }): Promise<{ op: PendingOpDto }> {\n    if (!endpoints.archiveCreate) throw new Error('archiveCreate endpoint not configured');\n    return jsonFetch(endpoints.archiveCreate, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(payload),\n    });\n  }\n\n  async function archiveAdd(path: string, files: Array<{ name: string; source: string }>): Promise<{ path: string }> {\n    if (!endpoints.archiveAdd) throw new Error('archiveAdd endpoint not configured');\n    return jsonFetch(endpoints.archiveAdd, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ path, files }),\n    });\n  }\n\n  /* === koru:k1 — version history (inspector panel) ===\n   * Derived from the manager endpoint by swapping `/manager` for `/versions`\n   * (same trick permissionsUrl/globalSearch use) so embedded proxies that\n   * forward the whole /api/files/* subtree keep working.\n   *   GET  /api/files/versions?node_id=N       → {versions, node_id}\n   *   POST /api/files/versions/restore         → {node_id, version_id, snapshot_current}\n   *   POST /api/files/versions/snapshot        → {node_id}   (may not exist on older backends)\n   */\n  function versionsUrl(sub = ''): string {\n    const base = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/versions');\n    return base + sub;\n  }\n  async function listVersions(nodeId: number): Promise<NodeVersion[]> {\n    const data = await jsonFetch<{ versions?: NodeVersion[] | null }>(\n      versionsUrl() + '?node_id=' + encodeURIComponent(String(nodeId)),\n    );\n    return Array.isArray(data?.versions) ? data.versions : [];\n  }\n  async function restoreVersion(\n    nodeId: number,\n    versionId: number,\n    snapshotCurrent = true,\n  ): Promise<void> {\n    await jsonFetch(versionsUrl('/restore'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({\n        node_id: nodeId,\n        version_id: versionId,\n        snapshot_current: snapshotCurrent,\n      }),\n    });\n  }\n  async function snapshotVersion(nodeId: number): Promise<void> {\n    await jsonFetch(versionsUrl('/snapshot'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ node_id: nodeId }),\n    });\n  }\n  /* === /koru:k1 === */\n\n  /* === calisma:d3 — node comments (inspector panel) ===\n   * Same manager-URL derivation trick as versions/permissions so embedded\n   * proxies forwarding the whole /api/files/* subtree keep working.\n   *   GET    /api/files/comments?node_id=N → {comments, node_id}\n   *   POST   /api/files/comments           → {node_id, body}\n   *   DELETE /api/files/comments/{id}      → {ok}\n   */\n  function commentsUrl(sub = ''): string {\n    const base = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/comments');\n    return base + sub;\n  }\n  async function listComments(nodeId: number): Promise<NodeComment[]> {\n    const data = await jsonFetch<{ comments?: NodeComment[] | null }>(\n      commentsUrl() + '?node_id=' + encodeURIComponent(String(nodeId)),\n    );\n    return Array.isArray(data?.comments) ? data.comments : [];\n  }\n  async function addComment(nodeId: number, body: string): Promise<NodeComment> {\n    const data = await jsonFetch<{ comment: NodeComment }>(commentsUrl(), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ node_id: nodeId, body }),\n    });\n    return data.comment;\n  }\n  async function deleteComment(id: number): Promise<void> {\n    await jsonFetch(commentsUrl('/' + encodeURIComponent(String(id))), {\n      method: 'DELETE',\n    });\n  }\n  /* === /calisma:d3 === */\n\n  // Mint a short-lived WebSocket auth ticket for the realtime layer. Derived\n  // from the manager URL (so it flows through the same host proxy) and uses the\n  // same auth/creds as every other call. Returns null on any failure (a backend\n  // without the endpoint, a network error) so the caller falls back to polling.\n  async function wsTicket(): Promise<{ ticket: string; ws_url: string } | null> {\n    const url = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/ws-ticket');\n    try {\n      return await jsonFetch<{ ticket: string; ws_url: string }>(url, { method: 'POST' });\n    } catch {\n      return null;\n    }\n  }\n\n  return {\n    // Realtime\n    wsTicket,\n    // Manager\n    index,\n    search,\n    globalSearch /* bul:s3 */,\n    globalSearchPage /* #207 */,\n    matchNames /* #207 */,\n    quotaMe /* surucu:d1 */,\n    storageUsage /* surucu:d1 */,\n    appStoreStatus /* #162 */,\n    subfolders,\n    newFolder,\n    newFile,\n    newFileCheck,\n    drafts,\n    draftsBase,\n    rename,\n    renameQueued,\n    move,\n    copy,\n    moveAsync,\n    deleteAsync,\n    deleteItems,\n    allowedAt,\n    myPermissions,\n    restore,\n    listTrash,\n    restoreBatch,\n    restoreQueued,\n    purgeTrash,\n    purgeBatch,\n    trashEmptyPreview,\n    purgeVersion,\n    uploadMultipart,\n    downloadUrl,\n    previewUrl,\n    fetchBlob,\n    fetchArrayBuffer,\n    // Peripheral\n    limits,\n    capabilities,\n    /* wiring:e2 */\n    e2eEscrowChallenge,\n    e2eEscrowUsed,\n    e2eCleanup,\n    /* wiring:e2 policy */\n    e2eAllowedAt,\n    e2eRequest,\n    fetchHead,\n    transferNamed,\n    /* App plugins */\n    pluginActions,\n    pluginActionRun,\n    pluginView,\n    pluginViewEvent,\n    pluginUsers,\n    opsCancel,\n    appUIUrl,\n    pluginUICall,\n    pluginUISave,\n    pluginUIRead,\n    pluginLicense,\n    fetchResponse,\n    createShare,\n    listShares,\n    revokeShare,\n    archiveList,\n    archiveExtract,\n    archiveCreate,\n    archiveAdd,\n    // Version history (koru:k1 inspector)\n    listVersions,\n    restoreVersion,\n    snapshotVersion,\n    // Node comments (calisma:d3 inspector)\n    listComments,\n    addComment,\n    deleteComment,\n    // Permissions (RBAC panel)\n    listPermissions,\n    resolveEmail,\n    searchUsers,\n    searchGroups,\n    addPermission,\n    updatePermission,\n    deletePermission,\n    updateGroupPermission,\n    deleteGroupPermission,\n    invitePermission,\n    shareMail,\n    shareMessage,\n    // Internals (exposed for useUploadChunked + PreviewModal)\n    endpoints,\n    authHeaders,\n    authHeadersSync,\n    credentialsMode,\n    jsonFetch,\n    withScreenLang,\n  };\n}\n\nexport type FileApi = ReturnType<typeof useFileApi>;\n","/**\n * A random id for the explorer's own bookkeeping: an upload's progress row,\n * a tab. Never a secret, never sent as one.\n *\n * ⚠ Not `crypto.randomUUID()` directly: browsers define it only in a secure\n * context (https, or http on localhost). Opened over plain http at any other\n * address — a LAN IP, a VM, a test box — it is undefined, and every upload\n * threw \"crypto.randomUUID is not a function\" before a byte was sent: picking\n * a file did nothing at all (found by the sub-path e2e, 2026-09-26).\n * `getRandomValues` exists in every context, so the fallback is still a\n * random v4 UUID.\n */\nexport function newId(): string {\n  const c = globalThis.crypto as Crypto | undefined;\n  if (typeof c?.randomUUID === 'function') return c.randomUUID();\n  const b = new Uint8Array(16);\n  if (typeof c?.getRandomValues === 'function') c.getRandomValues(b);\n  else for (let i = 0; i < b.length; i++) b[i] = Math.floor(Math.random() * 256);\n  b[6] = (b[6] & 0x0f) | 0x40;\n  b[8] = (b[8] & 0x3f) | 0x80;\n  const h = Array.from(b, (x) => x.toString(16).padStart(2, '0')).join('');\n  return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20)}`;\n}\n","/**\n * uploadResume — where a browser upload writes down that it is not finished.\n *\n * A staged upload survives a dropped connection because the SERVER holds the\n * bytes and can be asked for its offset. What the browser has to survive is\n * itself: a reloaded tab, a closed laptop, a crashed renderer. None of those\n * reach the server, and without a note on disk the next visit has no idea an\n * upload id ever existed — so the same 4 GB starts again at zero, which is the\n * exact complaint this work exists to answer.\n *\n * The note is deliberately small and deliberately a hint:\n *\n *   - it stores the upload id, not the bytes. localStorage cannot hold a File,\n *     and the browser will not hand a File back without a fresh user gesture.\n *     Recovery is therefore \"pick the same file again and it continues\", not\n *     \"it silently continues\" — the honest shape, and the one the platform\n *     allows.\n *   - `offset` here is never used as a resume point. It is shown to the user\n *     (\"resuming at 62%\") and used to decide a session is worth asking about;\n *     the byte to continue from always comes from GET /api/files/upload/{id}.\n *\n * The fingerprint pins a record to one file: name, size and lastModified. A\n * different file with the same name must not inherit the session, because\n * appending its tail to the previous head is the one way a resumable upload\n * corrupts data.\n *\n * This lives in `packages/core` because it is not browser-chrome: the web\n * explorer, the desktop app's explorer and the work.example.com / fishapp embeds all\n * mount the same component, and an upload that resumes in one of them and not\n * the others would be two products again.\n */\n\nconst STORE_KEY = 'filex:uploads:v1';\n\n/* How long a record is worth keeping is the SERVER's answer, not a number of\n   this file's: `begin` says when it sweeps this upload's staging\n   (`expires_at`, FILEX_UPLOAD_STAGING_TTL - 24 h by default, but the\n   operator's to change), and the record keeps that moment (`expiresAt`). A\n   note that outlives the bytes it describes only produces a confusing\n   \"resuming…\" that immediately restarts; one that is dropped while the bytes\n   are still there makes the person send them again. It used to be a fixed 24\n   hours here, wrong both ways the day an administrator changed the TTL. */\n\nexport interface ResumeRecord {\n  /** Server-side staged upload id. */\n  uploadId: string;\n  /** Destination directory, qualified (`adapter://sub/dir`). */\n  path: string;\n  name: string;\n  size: number;\n  /** File.lastModified — part of the identity, not metadata. */\n  lastModified: number;\n  chunkSize: number;\n  /** Last offset the server acknowledged. Display + triage only. */\n  offset: number;\n  /**\n   * When the server sweeps this upload's staging (epoch ms) - the `expires_at`\n   * its `begin` answered. Past it the record is dropped. ⚠ A record without\n   * one (written before 0.54, or after a `begin` that did not say) is dropped\n   * too: there is no honest guess at the server's TTL.\n   */\n  expiresAt?: number;\n  updatedAt: number;\n}\n\n/** The server's `expires_at` (RFC 3339) as epoch ms; undefined when absent or unreadable. */\nexport function resumeExpiry(expiresAt: string | null | undefined): number | undefined {\n  if (!expiresAt) return undefined;\n  const ms = Date.parse(expiresAt);\n  return Number.isFinite(ms) ? ms : undefined;\n}\n\n/** Identity of one (destination, file) pair. */\nexport function uploadFingerprint(\n  path: string,\n  file: { name: string; size: number; lastModified?: number },\n): string {\n  return [path, file.name, file.size, file.lastModified ?? 0].join('\\u0000');\n}\n\ntype Store = Record<string, ResumeRecord>;\n\n/** A Storage-shaped thing. Injected so tests (and any surface without\n *  localStorage — SSR, a locked-down embed) do not have to fake globals. */\nexport interface ResumeStorage {\n  getItem(key: string): string | null;\n  setItem(key: string, value: string): void;\n  removeItem(key: string): void;\n}\n\n/** The default backing store, or null where the platform has none. Reading\n *  localStorage throws in a partitioned/blocked context, so the probe is a real\n *  try, not a typeof check. */\nexport function defaultResumeStorage(): ResumeStorage | null {\n  try {\n    if (typeof localStorage === 'undefined') return null;\n    localStorage.getItem(STORE_KEY);\n    return localStorage;\n  } catch {\n    return null;\n  }\n}\n\nfunction read(store: ResumeStorage | null): Store {\n  if (!store) return {};\n  try {\n    const raw = store.getItem(STORE_KEY);\n    if (!raw) return {};\n    const parsed = JSON.parse(raw) as Store;\n    return parsed && typeof parsed === 'object' ? parsed : {};\n  } catch {\n    // Corrupt payload: an upload that starts over is a far smaller problem\n    // than one that throws on every page load.\n    return {};\n  }\n}\n\nfunction write(store: ResumeStorage | null, data: Store): void {\n  if (!store) return;\n  try {\n    store.setItem(STORE_KEY, JSON.stringify(data));\n  } catch {\n    /* quota / private mode — resume degrades, uploads still work */\n  }\n}\n\n/** Drop records the server has swept (past their `expiresAt`), and records\n *  that do not say when that is. Returns what survived. */\nexport function pruneResume(store: ResumeStorage | null, now = Date.now()): Store {\n  const data = read(store);\n  let changed = false;\n  for (const [key, rec] of Object.entries(data)) {\n    const until = rec?.expiresAt;\n    if (!rec?.uploadId || typeof until !== 'number' || !Number.isFinite(until) || now >= until) {\n      delete data[key];\n      changed = true;\n    }\n  }\n  if (changed) write(store, data);\n  return data;\n}\n\n/** The record for this exact (destination, file), or null. */\nexport function loadResume(\n  store: ResumeStorage | null,\n  key: string,\n  now = Date.now(),\n): ResumeRecord | null {\n  const rec = pruneResume(store, now)[key];\n  return rec ?? null;\n}\n\nexport function saveResume(\n  store: ResumeStorage | null,\n  key: string,\n  rec: Omit<ResumeRecord, 'updatedAt'>,\n  now = Date.now(),\n): void {\n  const data = read(store);\n  data[key] = { ...rec, updatedAt: now };\n  write(store, data);\n}\n\nexport function clearResume(store: ResumeStorage | null, key: string): void {\n  const data = read(store);\n  if (key in data) {\n    delete data[key];\n    write(store, data);\n  }\n}\n\n/** Every unfinished upload this browser knows about, newest first. Surfaces\n *  use it to say \"you have an unfinished upload\" instead of forgetting. */\nexport function listResume(store: ResumeStorage | null, now = Date.now()): ResumeRecord[] {\n  return Object.values(pruneResume(store, now)).sort((a, b) => b.updatedAt - a.updatedAt);\n}\n","/**\n * useUploadChunked — chunked, resumable uploads for every browser surface.\n *\n * It speaks the STAGED protocol (docs/UPLOADS.md), which works on every storage\n * driver:\n *\n *   POST   /api/files/upload/begin      {path,name,size,mime?,hash?,chunk_size?}\n *                                       → {id, chunk_size, offset, total_size}\n *   PUT    /api/files/upload/{id}       Content-Range: bytes A-B/total + body\n *                                       → {offset, received, total_size, state}\n *   GET    /api/files/upload/{id}       → {offset, state, complete, …}\n *   POST   /api/files/upload/{id}/commit→ 202 {op_id, node_id}\n *   DELETE /api/files/upload/{id}       → abort + delete staging\n *\n * It used to speak the S3-presigned one (`/upload/{init,finalize,abort}`), which\n * needed the S3 driver — every other backend answered 501 — and on which filex\n * never saw the bytes at all. That path still exists on the server and is\n * untouched; nothing in the client calls it any more.\n *\n * Three properties are the point of the rewrite, and each is a test:\n *\n *  - **The offset comes from the server.** After any failure the client asks\n *    GET /upload/{id} rather than trusting its own counter. A chunk can fail\n *    after its bytes landed (the response was lost); re-sending is merely slow,\n *    assuming success is wrong.\n *  - **Progress is filex's ingest.** `uploadedBytes` counts bytes filex has\n *    acknowledged plus the in-flight chunk — not bytes handed to a socket, and\n *    not the backend's own write, which happens afterwards in the ops worker\n *    and shows as the `transferring` phase.\n *  - **A reload is resumable, not a restart.** The upload id is bookmarked in\n *    localStorage (lib/uploadResume). The browser will not hand a File back\n *    without a fresh gesture, so recovery is \"pick the same file and it\n *    continues from where filex stopped\", with `job.resumedFrom` set so the UI\n *    can say so rather than silently starting over.\n */\n\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { FileApi } from './useFileApi';\nimport { networkFailure, requestFailure, wordsIn } from '../lib/errorWords';\n// ⚠ An upload is an ACTION: it is never folded into the shared \"no\n// connection\" notice, because the person is waiting to be told whether their\n// file went (lib/connection).\nimport { noteRequestFailed, noteRequestSucceeded } from '../lib/connection';\nimport { resolveLocale } from '../locales/resolve';\nimport { newId } from '../lib/uid';\n/* wiring:e2 stream — bytes made as they are sent (lib/uploadSource). */\nimport type { UploadSource } from '../lib/uploadSource';\nimport {\n  clearResume,\n  defaultResumeStorage,\n  listResume,\n  loadResume,\n  resumeExpiry,\n  saveResume,\n  uploadFingerprint,\n  type ResumeRecord,\n  type ResumeStorage,\n} from '../lib/uploadResume';\n\nexport interface UploadJob {\n  id: string; // local uuid\n  file: File;\n  /** What to call the file on screen when it is not `file.name` — an upload\n   *  into an encrypted-names folder carries its ciphertext name in `file`. */\n  displayName?: string;\n  path: string;\n  /** Server-side staged upload id, once `begin` has answered. */\n  uploadId?: string;\n  totalBytes: number;\n  /** Bytes filex has acknowledged (plus the chunk currently in flight). */\n  uploadedBytes: number;\n  percent: number;\n  status:\n    | 'pending'\n    | 'initializing'\n    | 'uploading'\n    /** Every byte is in filex; the commit is being accepted. */\n    | 'committing'\n    /** Committed and listed; the ops worker is writing it to the backend. */\n    | 'transferring'\n    | 'done'\n    | 'error'\n    | 'aborted';\n  /** Byte offset an interrupted session was picked up from, when it was. */\n  resumedFrom?: number;\n  /** Background transfer op, once the commit is accepted. */\n  opId?: number;\n  nodeId?: number;\n  error?: string;\n  cancel(): void;\n}\n\nexport interface UploadOptions {\n  path: string;\n  /** The file — or, with `source`, only its identity (name, type). */\n  file: File;\n  /**\n   * wiring:e2 stream — where the bytes come from when they are MADE as they\n   * are sent (a file encrypted in the browser): `source.size` is the upload's\n   * size and `file` only names it. Such an upload is not bookmarked for a\n   * resume after a reload — its bytes are gone with the tab.\n   */\n  source?: UploadSource;\n  /**\n   * wiring:e2 convert - query parameters for the COMMIT, the moment the file\n   * is replaced: `expect` (the overwrite precondition \"<size>:<ms>\") and\n   * `e2e_convert` (an in-place E2E conversion write, which keeps no version\n   * of the plaintext it replaces). The server checks both there\n   * (upload_staged.go → Commit).\n   */\n  commitQuery?: Record<string, string>;\n  chunkSize?: number;\n  onProgress?: (job: UploadJob) => void;\n  onDone?: (job: UploadJob, result: UploadResult) => void;\n  onError?: (job: UploadJob, err: Error) => void;\n  /**\n   * Wait for the backend transfer before resolving. Defaults to TRUE, because\n   * \"the server has the bytes\" and \"the storage has the bytes\" are different\n   * claims and only the second one is an upload.\n   *\n   * ⚠ It used to default to false and no caller ever set it, so the job went\n   * straight to `done` on the 202 — a transfer that failed afterwards in the\n   * ops worker left the user looking at a finished upload for a file that was\n   * never stored (issue #16: every file over the chunk threshold, on every S3\n   * backend). The `transferring` phase is short for a healthy storage and is\n   * the only place a failure can still be shown, so it is the default; pass\n   * false to opt out where the wait is genuinely unwanted.\n   */\n  waitForTransfer?: boolean;\n}\n\n/** What `commit` answers, plus the fields a caller wants afterwards. */\nexport interface UploadResult {\n  id: string;\n  op_id?: number;\n  node_id?: number;\n  path?: string;\n  transfer_state?: string;\n}\n\ninterface BeginResponse {\n  id: string;\n  chunk_size?: number;\n  chunkSize?: number;\n  offset?: number;\n  total_size?: number;\n  /** When the server sweeps this upload's staging (RFC 3339) - the life of\n   *  the resume bookmark (lib/uploadResume `expiresAt`). */\n  expires_at?: string | null;\n}\n\ninterface StatusResponse {\n  id?: string;\n  offset?: number;\n  received?: number;\n  total_size?: number;\n  chunk_size?: number;\n  chunkSize?: number;\n  state?: string;\n  complete?: boolean;\n  error?: string;\n  op_id?: number;\n  node_id?: number;\n  /** When the server sweeps this staging if nothing more arrives (RFC 3339):\n   *  the last write + FILEX_UPLOAD_STAGING_TTL. On a chunk's answer too. */\n  expires_at?: string | null;\n}\n\n/** Only a session still taking chunks can be continued. */\nfunction resumableState(state: string | undefined): boolean {\n  return !state || state === 'staging';\n}\n\n/** Error carrying \"this server has no staged path\" — the ONLY condition under\n *  which a caller may retry the file on the single-POST path. Any other\n *  failure has either sent bytes or been refused on the merits. */\nexport interface UnsupportedUploadError extends Error {\n  stagedUnsupported?: true;\n}\n\nfunction markUnsupported(err: Error): UnsupportedUploadError {\n  (err as UnsupportedUploadError).stagedUnsupported = true;\n  return err;\n}\n\n/** True when the staged protocol is simply not there. */\nexport function isStagedUnsupported(err: unknown): boolean {\n  return !!(err as UnsupportedUploadError)?.stagedUnsupported;\n}\n\nexport function useUploadChunked(\n  config: ExplorerConfig,\n  api: FileApi,\n  storage: ResumeStorage | null = defaultResumeStorage(),\n) {\n  /** Client-side default. The server's answer at `begin` is binding — this only\n   *  decides what to ask for and what counts as \"large enough to chunk\". */\n  const DEFAULT_CHUNK = config.chunkSize ?? 8 * 1024 * 1024;\n\n  /** Base of the staged routes, derived from the manager endpoint the same way\n   *  every other derived route is, so an embedder that passes only `endpoint`\n   *  still reaches them. */\n  function stagedBase(): string {\n    const explicit = api.endpoints.uploadBegin;\n    if (explicit) return explicit.replace(/\\/begin$/, '');\n    return api.endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/upload');\n  }\n\n  /** Is the staged protocol reachable at all? */\n  function available(): boolean {\n    return !!stagedBase();\n  }\n\n  /** Files at or above this go chunked; smaller ones use the single-POST fast\n   *  path, which is fine for a 20 KB text file. */\n  function threshold(): number {\n    return DEFAULT_CHUNK;\n  }\n\n  function shouldChunk(file: { size: number }): boolean {\n    return available() && file.size > threshold();\n  }\n\n  /** The bookmark for this (destination, file), if there is one. Exposed so a\n   *  host can tell the user an upload is resumable BEFORE starting it. */\n  function resumableFor(path: string, file: File): ResumeRecord | null {\n    return loadResume(storage, uploadFingerprint(path, file));\n  }\n\n  /** Every unfinished upload this browser remembers. */\n  function listResumable(): ResumeRecord[] {\n    return listResume(storage);\n  }\n\n  /** Forget a bookmark and, best effort, drop the server-side staging with it. */\n  async function discardResumable(rec: ResumeRecord): Promise<void> {\n    clearResume(storage, uploadFingerprint(rec.path, { name: rec.name, size: rec.size, lastModified: rec.lastModified }));\n    try {\n      await api.jsonFetch(`${stagedBase()}/${encodeURIComponent(rec.uploadId)}`, { method: 'DELETE' });\n    } catch {\n      /* already gone, or being transferred — the sweeper handles the rest */\n    }\n  }\n\n  async function status(uploadId: string): Promise<StatusResponse> {\n    return api.jsonFetch<StatusResponse>(`${stagedBase()}/${encodeURIComponent(uploadId)}`);\n  }\n\n  async function uploadFile(opts: UploadOptions): Promise<UploadResult> {\n    const key = uploadFingerprint(opts.path, opts.file);\n    /* wiring:e2 stream */\n    const src = opts.source ?? null;\n    const total = src ? src.size : opts.file.size;\n    const bookmarks = src ? null : storage;\n\n    const job: UploadJob = {\n      id: newId(),\n      file: opts.file,\n      path: opts.path,\n      totalBytes: total,\n      uploadedBytes: 0,\n      percent: 0,\n      status: 'initializing',\n      cancel: () => {},\n    };\n\n    let cancelled = false;\n    let inFlight: XMLHttpRequest | null = null;\n    // The sweep time the server said with its last chunk answer (epoch ms):\n    // its staging lives FILEX_UPLOAD_STAGING_TTL past the LAST write, so each\n    // acknowledged chunk moves it (lib/uploadResume `expiresAt`).\n    let chunkExpiry: number | undefined;\n    job.cancel = () => {\n      cancelled = true;\n      inFlight?.abort();\n      src?.cancel?.();\n    };\n\n    /** Acknowledged bytes; the in-flight chunk is added on top for display. */\n    let acked = 0;\n    function report(inflight = 0) {\n      job.uploadedBytes = Math.min(job.totalBytes, acked + inflight);\n      job.percent =\n        job.totalBytes > 0\n          ? Math.min(100, Math.round((job.uploadedBytes / job.totalBytes) * 100))\n          : job.status === 'done'\n            ? 100\n            : 0;\n      opts.onProgress?.(job);\n    }\n\n    try {\n      if (!available()) {\n        throw markUnsupported(new Error('staged upload endpoint not configured'));\n      }\n\n      const base = stagedBase();\n      let uploadId = '';\n      let chunkSize = opts.chunkSize ?? DEFAULT_CHUNK;\n      // The server's sweep time for this upload's staging, carried into\n      // every bookmark write (lib/uploadResume): fixed at `begin`, so a\n      // resumed upload keeps the moment its bookmark already holds.\n      let expiresAt: number | undefined;\n      chunkExpiry = undefined;\n\n      // ── resume, or begin ────────────────────────────────────────────────\n      const bookmark = loadResume(bookmarks, key);\n      if (bookmark) {\n        try {\n          const st = await status(bookmark.uploadId);\n          if (resumableState(st.state) && (st.total_size ?? 0) === total) {\n            uploadId = bookmark.uploadId;\n            expiresAt = resumeExpiry(st.expires_at) ?? bookmark.expiresAt;\n            chunkSize = st.chunk_size ?? st.chunkSize ?? bookmark.chunkSize;\n            acked = st.offset ?? 0;\n            job.resumedFrom = acked;\n          } else {\n            clearResume(bookmarks, key);\n          }\n        } catch {\n          // Swept, aborted, or belongs to someone else now. Not a failure —\n          // `begin` below decides what happens next.\n          clearResume(bookmarks, key);\n        }\n      }\n\n      if (!uploadId) {\n        let begun: BeginResponse;\n        try {\n          begun = await api.jsonFetch<BeginResponse>(`${base}/begin`, {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify({\n              path: opts.path,\n              name: opts.file.name,\n              size: total,\n              mime: opts.file.type || 'application/octet-stream',\n              // Asked for, not imposed: the server clamps this to its own\n              // limits and its answer is what the loop below uses.\n              chunk_size: opts.chunkSize ?? DEFAULT_CHUNK,\n            }),\n          });\n        } catch (err) {\n          // 404 = an older server with no staged routes; 501 = staging not\n          // configured on this instance. Both mean \"use the other path\", and\n          // both happen before a byte is sent, so the caller can safely fall\n          // back. Everything else is a real refusal (quota, permission, disk)\n          // and must be reported, NOT retried as a whole-file POST.\n          const st = (err as Error & { status?: number }).status;\n          if (st === 404 || st === 501) markUnsupported(err as Error);\n          throw err;\n        }\n        if (!begun?.id) throw new Error('begin returned no upload id');\n        uploadId = begun.id;\n        expiresAt = resumeExpiry(begun.expires_at);\n        chunkSize = begun.chunk_size ?? begun.chunkSize ?? chunkSize;\n        acked = begun.offset ?? 0;\n      }\n\n      job.uploadId = uploadId;\n      job.status = 'uploading';\n      // Bookmarked BEFORE the first chunk: a tab closed between `begin` and the\n      // first PUT would otherwise leave a staging directory nobody can name.\n      saveResume(bookmarks, key, {\n        uploadId,\n        path: opts.path,\n        name: opts.file.name,\n        size: total,\n        lastModified: opts.file.lastModified,\n        chunkSize,\n        offset: acked,\n        expiresAt,\n      });\n      report();\n\n      // ── chunks ──────────────────────────────────────────────────────────\n      const MAX_ATTEMPTS = 4;\n      while (acked < total) {\n        if (cancelled) throw new DOMException('Aborted by user', 'AbortError');\n        const end = Math.min(acked + chunkSize, total);\n        const blob = src ? await src.read(acked, end) : opts.file.slice(acked, end);\n\n        let next = -1;\n        let lastErr: Error | null = null;\n        for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n          if (attempt > 0) {\n            await sleep(300 * attempt + Math.floor(Math.random() * 150));\n            if (cancelled) throw new DOMException('Aborted by user', 'AbortError');\n            // Re-ask before re-sending: the previous attempt may have landed\n            // and lost only its response.\n            try {\n              const st = await status(uploadId);\n              if ((st.offset ?? 0) >= end) {\n                next = st.offset ?? end;\n                break;\n              }\n              if ((st.offset ?? 0) !== acked) {\n                acked = st.offset ?? acked;\n                report();\n                next = -2; // grid moved — recompute the slice\n                break;\n              }\n            } catch {\n              /* keep retrying the chunk itself */\n            }\n          }\n          try {\n            next = await putChunk(uploadId, blob, acked, end, total);\n            break;\n          } catch (err) {\n            const e = err instanceof Error ? err : new Error(String(err));\n            if (cancelled || e.name === 'AbortError') throw e;\n            const st = (e as Error & { status?: number }).status;\n            // 403/404/413 will not become true by repeating them; a dropped\n            // body (400 SHORT_CHUNK) or a transient 5xx will.\n            if (st && st !== 400 && st !== 409 && st < 500) throw e;\n            lastErr = e;\n          }\n        }\n        if (next === -2) continue; // offset moved under us; re-slice\n        if (next < 0) throw lastErr ?? new Error('chunk upload failed');\n        // Said, not \"upload stalled at byte 8388608\": the row is read by a\n        // person, and the byte count is only for whoever is debugging.\n        if (next <= acked) {\n          console.warn('[filex] upload stalled at byte', acked);\n          throw new Error(wordsIn(resolveLocale(config.locale))('err.upload_stalled'));\n        }\n        acked = next;\n        if (chunkExpiry !== undefined) expiresAt = chunkExpiry;\n        report();\n        saveResume(bookmarks, key, {\n          uploadId,\n          path: opts.path,\n          name: opts.file.name,\n          size: total,\n          lastModified: opts.file.lastModified,\n          chunkSize,\n          offset: acked,\n          expiresAt,\n        });\n      }\n\n      if (cancelled) throw new DOMException('Aborted by user', 'AbortError');\n\n      // ── commit ──────────────────────────────────────────────────────────\n      job.status = 'committing';\n      report();\n      const commitQs = new URLSearchParams(opts.commitQuery ?? {}).toString();\n      const result = await api.jsonFetch<UploadResult>(\n        `${base}/${encodeURIComponent(uploadId)}/commit${commitQs ? `?${commitQs}` : ''}`,\n        { method: 'POST' },\n      );\n      // Committed: the node is listed and the bytes are filex's problem now,\n      // so the bookmark has nothing left to recover.\n      clearResume(bookmarks, key);\n      job.opId = result?.op_id;\n      job.nodeId = result?.node_id;\n\n      if (opts.waitForTransfer !== false && result?.op_id && api.endpoints.opsShow) {\n        job.status = 'transferring';\n        report();\n        await waitForOp(result.op_id);\n      }\n\n      job.status = 'done';\n      acked = job.totalBytes;\n      report();\n      opts.onDone?.(job, result);\n      return result;\n    } catch (err) {\n      const asError = err instanceof Error ? err : new Error(String(err));\n      job.status = asError.name === 'AbortError' ? 'aborted' : 'error';\n      job.error = asError.message;\n      report();\n      // A sourced upload stops producing — except when the server simply has\n      // no staged path: nothing was read yet, and the caller may send the\n      // same bytes the other way.\n      if (!isStagedUnsupported(asError)) src?.cancel?.();\n\n      // A user-cancelled upload is meant to be gone; a failed one is meant to\n      // be resumable. So only the abort releases the server's staging — an\n      // error keeps both the staging directory and the bookmark, which is what\n      // makes the retry cost nothing.\n      // wiring:e2 stream — a sourced upload cannot be resumed (its bytes are\n      // gone), so its staging is released whatever ended it.\n      if (job.uploadId && (job.status === 'aborted' || src)) {\n        clearResume(bookmarks, key);\n        try {\n          await api.jsonFetch(`${stagedBase()}/${encodeURIComponent(job.uploadId)}`, {\n            method: 'DELETE',\n          });\n        } catch {\n          /* swallow — the staging sweeper collects it either way */\n        }\n      }\n\n      opts.onError?.(job, asError);\n      throw asError;\n    }\n\n    /** One chunk, over XHR because fetch cannot report upload progress. */\n    function putChunk(\n      uploadId: string,\n      blob: Blob,\n      start: number,\n      end: number,\n      total: number,\n    ): Promise<number> {\n      return new Promise<number>((resolve, reject) => {\n        const xhr = new XMLHttpRequest();\n        inFlight = xhr;\n        xhr.open('PUT', `${stagedBase()}/${encodeURIComponent(uploadId)}`);\n        const headers = api.authHeadersSync({\n          'Content-Type': 'application/octet-stream',\n          'Content-Range': `bytes ${start}-${end - 1}/${total}`,\n        });\n        for (const [k, v] of Object.entries(headers)) xhr.setRequestHeader(k, v);\n        xhr.withCredentials = api.credentialsMode() === 'include';\n        xhr.upload.onprogress = (ev) => {\n          if (ev.lengthComputable) report(ev.loaded);\n        };\n        xhr.onload = () => {\n          inFlight = null;\n          noteRequestSucceeded();\n          if (xhr.status >= 200 && xhr.status < 300) {\n            try {\n              const body = JSON.parse(xhr.responseText) as StatusResponse;\n              chunkExpiry = resumeExpiry(body.expires_at) ?? chunkExpiry;\n              resolve(body.offset ?? end);\n            } catch {\n              // A 2xx we cannot parse still means the bytes landed; the offset\n              // is re-read from the server rather than guessed.\n              resolve(end);\n            }\n            return;\n          }\n          // Said (lib/errorWords): the upload row used to read\n          // \"chunk 0-8388607 → 500\". Status and body still ride along.\n          reject(requestFailure(xhr.status, xhr.responseText || '', resolveLocale(config.locale)));\n        };\n        xhr.onerror = () => {\n          inFlight = null;\n          noteRequestFailed('action');\n          reject(networkFailure(resolveLocale(config.locale)));\n        };\n        xhr.onabort = () => {\n          inFlight = null;\n          reject(new DOMException('Aborted', 'AbortError'));\n        };\n        xhr.send(blob);\n      });\n    }\n\n    /** Poll the shared ops tray until the transfer leaves the queue. */\n    async function waitForOp(opId: number): Promise<void> {\n      const tmpl = api.endpoints.opsShow;\n      if (!tmpl) return;\n      const url = tmpl.replace('{id}', String(opId));\n      let delay = 200;\n      // ⚠ A tray read that keeps failing must not park the upload in\n      // `transferring` for ever. One hiccup is not a verdict, but a row we\n      // cannot read at all (purged, or the endpoint is gone) is unknowable, so\n      // after a bounded run of failures the wait ends and the job settles the\n      // way it did before the wait existed — optimistic, but not hung.\n      let misses = 0;\n      for (;;) {\n        if (cancelled) throw new DOMException('Aborted by user', 'AbortError');\n        try {\n          const op = await api.jsonFetch<{ status?: string; error?: string }>(url);\n          if (op?.status === 'ok') return;\n          if (op?.status === 'failed' || op?.status === 'partial') {\n            throw new TransferFailedError(op.error || 'transfer failed');\n          }\n          misses = 0;\n        } catch (err) {\n          // ⚠ The verdict is told apart from the hiccup by TYPE, not by\n          // message. It used to be `message === 'transfer failed'`, which only\n          // matched when the server sent NO error text: the moment it sent a\n          // real one — which is every interesting failure — the throw above was\n          // swallowed here and the poll span for ever. Harmless while nothing\n          // set waitForTransfer; a hang the moment anything did.\n          if (err instanceof TransferFailedError || (err as Error).name === 'AbortError') throw err;\n          /* a hiccup reading the tray is not a failed transfer */\n          if (++misses >= MAX_OP_POLL_MISSES) return;\n        }\n        await sleep(delay);\n        delay = Math.min(delay * 2, 2000);\n      }\n    }\n  }\n\n  return {\n    uploadFile,\n    /** True when this file is big enough (and the endpoints exist) to chunk. */\n    shouldChunk,\n    /** The size at which chunking kicks in. */\n    threshold,\n    resumableFor,\n    listResumable,\n    discardResumable,\n  };\n}\n\n/** How many consecutive unreadable op polls end the transfer wait (~7s). */\nconst MAX_OP_POLL_MISSES = 6;\n\n/** The backend said the transfer failed — as opposed to \"I could not ask\". */\nclass TransferFailedError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'TransferFailedError';\n  }\n}\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((r) => setTimeout(r, ms));\n}\n","/**\n * useSelection — multi-select state with Ctrl/Shift semantics.\n *\n * click(path, {ctrl, shift})\n *   no-mod  → replace selection with [path]\n *   ctrl    → toggle path in selection\n *   shift   → range select from anchor to path\n */\n\nimport { ref, computed } from 'vue';\nimport type { FileNode } from '../types/FileNode';\n\nexport function useSelection(items: () => FileNode[]) {\n  const selected = ref<Set<string>>(new Set());\n  const anchor = ref<string | null>(null);\n\n  function click(path: string, mod: { ctrl?: boolean; shift?: boolean } = {}) {\n    if (mod.shift && anchor.value) {\n      const list = items();\n      const aIdx = list.findIndex((n) => n.path === anchor.value);\n      const bIdx = list.findIndex((n) => n.path === path);\n      if (aIdx === -1 || bIdx === -1) {\n        selected.value = new Set([path]);\n        anchor.value = path;\n        return;\n      }\n      const [lo, hi] = aIdx < bIdx ? [aIdx, bIdx] : [bIdx, aIdx];\n      const next = new Set<string>();\n      for (let i = lo; i <= hi; i++) next.add(list[i].path);\n      selected.value = next;\n      return;\n    }\n\n    if (mod.ctrl) {\n      const next = new Set(selected.value);\n      if (next.has(path)) next.delete(path);\n      else next.add(path);\n      selected.value = next;\n      anchor.value = path;\n      return;\n    }\n\n    selected.value = new Set([path]);\n    anchor.value = path;\n  }\n\n  function clear() {\n    selected.value = new Set();\n    anchor.value = null;\n  }\n\n  function selectAll() {\n    selected.value = new Set(items().map((n) => n.path));\n  }\n\n  function has(path: string): boolean {\n    return selected.value.has(path);\n  }\n\n  function add(path: string) {\n    const next = new Set(selected.value);\n    next.add(path);\n    selected.value = next;\n  }\n\n  function remove(path: string) {\n    const next = new Set(selected.value);\n    next.delete(path);\n    selected.value = next;\n  }\n\n  const size = computed(() => selected.value.size);\n  const isEmpty = computed(() => selected.value.size === 0);\n\n  const nodes = computed(() => {\n    const list = items();\n    return list.filter((n) => selected.value.has(n.path));\n  });\n\n  return { selected, anchor, click, clear, selectAll, has, add, remove, size, isEmpty, nodes };\n}\n","/**\n * Is this key event aimed at a place a person is TYPING? Then it is text, not\n * a shortcut: `I` is a letter, not \"toggle the info panel\".\n *\n * ⚠ Not only form controls. Monaco 0.55 types through the browser's\n * EditContext API in Chromium, so the focused element of the code editor is a\n * `<div class=\"native-edit-context\" role=\"textbox\">` — no <textarea>, not\n * contenteditable. A guard that knew only INPUT/TEXTAREA/SELECT/contenteditable\n * let the explorer's single-letter shortcuts eat keystrokes out of the\n * document: \"MIT License\" typed into a new LICENSE arrived as \"MLcene\"\n * (I = info panel, S = star, Space = quick look; measured while building #56).\n * `role=\"textbox\"` is the ARIA contract every custom text surface carries, and\n * anything inside a Monaco editor is the editor's.\n *\n * One helper for every keyboard guard (the explorer's shortcuts, quick look's\n * arrows), because the two copies it replaces had the same hole.\n */\nexport function isTypingTarget(target: EventTarget | null): boolean {\n  const el = target as HTMLElement | null;\n  if (!el || typeof el.tagName !== 'string') return false;\n  if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.tagName === 'SELECT' || el.isContentEditable) {\n    return true;\n  }\n  if (el.getAttribute?.('role') === 'textbox') return true;\n  return typeof el.closest === 'function' && !!el.closest('.monaco-editor');\n}\n","/**\n * useKeyboardShortcuts — binds FileExplorer's keyboard affordances.\n *\n * wiring:c2 — rewritten as a REGISTRY: every action is declared once\n * (id + default combo + i18n label + category) and the user may remap\n * the customizable ones. Overrides persist in localStorage under\n * `filex.shortcuts` as `{ \"<actionId>\": \"<combo>\" }` — only deviations\n * from the defaults are stored; an empty string means \"unbound\".\n *\n * Canonical combo format (also the display format): modifiers in\n * `Ctrl+Alt+Shift` order followed by a single key token, joined with\n * `+`. Key tokens: uppercase letters/digits, symbols as typed (`/`,\n * `?`), `F1`–`F12`, `Space`, `Enter`, `Esc`, `Del`, `Backspace`, `Tab`,\n * `Home`, `End`, `PgUp`, `PgDn` and arrows as `↑ ↓ ← →`. Meta (Cmd) is\n * folded into `Ctrl` so one saved combo works on macOS too. For\n * printable symbols Shift is omitted (`?` already encodes it).\n *\n * Activated whenever the explorer is mounted (only one instance per\n * page is expected). Skips events that originate inside form controls\n * so the user can type filenames in the search box, modals, etc.\n */\n\nimport { computed, onMounted, onBeforeUnmount, ref, type ComputedRef, type Ref } from 'vue';\nimport { isTypingTarget } from '../lib/typingTarget';\n\nexport interface ShortcutHandlers {\n  onDelete?: () => void;\n  onRename?: () => void; // F2\n  onSelectAll?: () => void; // Ctrl+A\n  onCut?: () => void; // Ctrl+X\n  onCopy?: () => void; // Ctrl+C\n  onPaste?: () => void; // Ctrl+V\n  onOpen?: () => void; // Enter\n  onClose?: () => void; // Escape\n  onFocusSearch?: () => void; // /\n  onDuplicate?: () => void; // (unwired — kept for API compat)\n  onPathJump?: () => void; // Cmd+K / Ctrl+K\n  onGoUp?: () => void; // Alt+Up / Backspace (when nothing selected)\n  onShowHelp?: () => void; // ? (Shift+/ on most layouts)\n  onToggleInspector?: () => void; // i (koru:k1 details panel)\n  onToggleHidden?: () => void; // Ctrl+Shift+. — dot-file visibility\n  /* yildiz:s1 */\n  onStar?: () => void; // S — star / unstar the selection\n  onQuickLook?: () => void; // Space (wiring:c2 quick-look overlay)\n  /* wiring:d1 — tab strip actions */\n  onTabNew?: () => void; // Ctrl+T\n  onTabClose?: () => void; // Ctrl+W\n  onTabNext?: () => void; // Ctrl+Tab\n  onTabPrev?: () => void; // Ctrl+Shift+Tab\n  /* /wiring:d1 */\n  /* tus:t1 — the verbs that were only ever reachable from the menus. Every\n   * one of them is remappable like the rest; the ones that ship unbound are\n   * there so the user can give them a key, not because they do less. */\n  onNewFolder?: () => void; // Shift+N\n  onUpload?: () => void; // U\n  onRefresh?: () => void; // R\n  onDownload?: () => void; // D\n  onPreview?: () => void; // P\n  onShare?: () => void; // Shift+S\n  onTags?: () => void; // T\n  onOpenTab?: () => void; // (unbound)\n  onCopyPath?: () => void; // (unbound)\n  onCopyId?: () => void; // (unbound)\n  onRestore?: () => void; // (unbound)\n  /* /tus:t1 */\n  hasSelection?: () => boolean; // disambiguates Backspace\n}\n\n// --------------------------------------------------------------------\n// Registry\n// --------------------------------------------------------------------\n\n/** One remappable action in the shortcut registry. */\nexport interface ShortcutActionDef {\n  /** Stable id — also the localStorage override key. */\n  id: string;\n  /** Default combo in canonical form. */\n  defaultCombo: string;\n  /**\n   * Extra built-in combos that also trigger the action but are NOT\n   * remappable (e.g. Backspace on go-up, which carries the\n   * selection-dependent dual behaviour). Shown in the help sheet and\n   * reserved in conflict detection.\n   */\n  fixedCombos?: string[];\n  labelKey: string;\n  groupKey: string;\n  /** false → the combo can't be remapped (Esc). Default true. */\n  customizable?: boolean;\n  /** false → don't preventDefault on match (Enter / Esc). Default true. */\n  prevent?: boolean;\n  /** true → fires even when focus sits in a form control (Esc). */\n  inForms?: boolean;\n}\n\n/**\n * Combos the BROWSER takes before the page sees them. `preventDefault()`\n * cannot stop these in an ordinary tab — Chrome and Firefox handle them at\n * the window level — so an action bound to one of them only ever fires in\n * the desktop app, an installed PWA or a kiosk window.\n *\n * They are not forbidden as DEFAULTS (the tab actions have shipped on\n * Ctrl+T/W/Tab since wiring:d1 and work in the desktop app), but the\n * settings modal refuses to let a user assign one: choosing a key that\n * silently does nothing where you are standing is not a choice, it is a\n * trap. `isReservedCombo` is the one place that list lives.\n */\nconst RESERVED_COMBOS = new Set([\n  'Ctrl+N', 'Ctrl+Shift+N',\n  'Ctrl+T', 'Ctrl+Shift+T',\n  'Ctrl+W', 'Ctrl+Shift+W',\n  'Ctrl+Tab', 'Ctrl+Shift+Tab',\n  'Ctrl+Q',\n  'Ctrl+Shift+I', 'Ctrl+Shift+J', 'Ctrl+Shift+C',\n  'F11', 'F12',\n]);\n\n/** Does the browser eat this combo before the page can see it? */\nexport function isReservedCombo(combo: string): boolean {\n  return RESERVED_COMBOS.has(combo);\n}\n\n/** Registry order = help/settings display order. */\nexport const SHORTCUT_ACTIONS: ShortcutActionDef[] = [\n  // Navigation\n  { id: 'palette', defaultCombo: 'Ctrl+K', labelKey: 'shortcuts.palette', groupKey: 'shortcuts.group.nav' },\n  { id: 'search', defaultCombo: '/', labelKey: 'shortcuts.search', groupKey: 'shortcuts.group.nav' },\n  { id: 'go-up', defaultCombo: 'Alt+↑', fixedCombos: ['Backspace'], labelKey: 'shortcuts.go_up', groupKey: 'shortcuts.group.nav' },\n  { id: 'open', defaultCombo: 'Enter', prevent: false, labelKey: 'shortcuts.open', groupKey: 'shortcuts.group.nav' },\n  { id: 'quicklook', defaultCombo: 'Space', labelKey: 'shortcuts.quicklook', groupKey: 'shortcuts.group.nav' },\n  { id: 'close', defaultCombo: 'Esc', customizable: false, prevent: false, inForms: true, labelKey: 'shortcuts.close', groupKey: 'shortcuts.group.nav' },\n  { id: 'inspector', defaultCombo: 'I', labelKey: 'shortcuts.inspector', groupKey: 'shortcuts.group.nav' } /* koru:k1 */,\n  { id: 'help', defaultCombo: '?', labelKey: 'shortcuts.help', groupKey: 'shortcuts.group.nav' },\n  { id: 'toggle-hidden', defaultCombo: 'Ctrl+Shift+.', labelKey: 'shortcuts.toggle_hidden', groupKey: 'shortcuts.group.nav' },\n  /* yildiz:s1 — starring is an action, so it belongs where the other verbs\n   * are. A bare letter like the inspector's `I`; the handler ignores events\n   * from form controls, so it never eats a keystroke meant for a filename. */\n  { id: 'star', defaultCombo: 'S', labelKey: 'shortcuts.star', groupKey: 'shortcuts.group.file' },\n  // Selection\n  { id: 'select-all', defaultCombo: 'Ctrl+A', labelKey: 'shortcuts.select_all', groupKey: 'shortcuts.group.selection' },\n  // File operations\n  { id: 'rename', defaultCombo: 'F2', labelKey: 'shortcuts.rename', groupKey: 'shortcuts.group.file' },\n  { id: 'delete', defaultCombo: 'Del', labelKey: 'shortcuts.delete', groupKey: 'shortcuts.group.file' },\n  { id: 'cut', defaultCombo: 'Ctrl+X', labelKey: 'shortcuts.cut', groupKey: 'shortcuts.group.file' },\n  { id: 'copy', defaultCombo: 'Ctrl+C', labelKey: 'shortcuts.copy', groupKey: 'shortcuts.group.file' },\n  { id: 'paste', defaultCombo: 'Ctrl+V', labelKey: 'shortcuts.paste', groupKey: 'shortcuts.group.file' },\n  /* wiring:d1 — tabs. Note: browsers reserve Ctrl+T/W/Tab in normal pages\n   * (preventDefault can't stop them there); they work in webcomponent/PWA/\n   * kiosk contexts and stay remappable through the settings modal. */\n  { id: 'tab-new', defaultCombo: 'Ctrl+T', labelKey: 'shortcuts.tab_new', groupKey: 'shortcuts.group.tabs' },\n  { id: 'tab-close', defaultCombo: 'Ctrl+W', labelKey: 'shortcuts.tab_close', groupKey: 'shortcuts.group.tabs' },\n  { id: 'tab-next', defaultCombo: 'Ctrl+Tab', labelKey: 'shortcuts.tab_next', groupKey: 'shortcuts.group.tabs' },\n  { id: 'tab-prev', defaultCombo: 'Ctrl+Shift+Tab', labelKey: 'shortcuts.tab_prev', groupKey: 'shortcuts.group.tabs' },\n  /* /wiring:d1 */\n  /* tus:t1 — the rest of the menu verbs. Until now these were reachable only\n   * by right-clicking, and the right-click menu named no keys at all, so 16 of\n   * the registry's actions were invisible unless somebody opened the `?` sheet\n   * on their own. The ones with no default are deliberate: they are rare\n   * enough that taking a key from the user by default is the wrong trade, and\n   * they are in the registry so the user can take one. */\n  { id: 'new-folder', defaultCombo: 'Shift+N', labelKey: 'shortcuts.new_folder', groupKey: 'shortcuts.group.file' },\n  { id: 'upload', defaultCombo: 'U', labelKey: 'shortcuts.upload', groupKey: 'shortcuts.group.file' },\n  { id: 'refresh', defaultCombo: 'R', labelKey: 'shortcuts.refresh', groupKey: 'shortcuts.group.nav' },\n  { id: 'download', defaultCombo: 'D', labelKey: 'shortcuts.download', groupKey: 'shortcuts.group.file' },\n  { id: 'preview', defaultCombo: 'P', labelKey: 'shortcuts.preview', groupKey: 'shortcuts.group.nav' },\n  { id: 'share', defaultCombo: 'Shift+S', labelKey: 'shortcuts.share', groupKey: 'shortcuts.group.file' },\n  { id: 'tags', defaultCombo: 'T', labelKey: 'shortcuts.tags', groupKey: 'shortcuts.group.file' },\n  { id: 'open-tab', defaultCombo: '', labelKey: 'shortcuts.open_tab', groupKey: 'shortcuts.group.tabs' },\n  { id: 'copy-path', defaultCombo: '', labelKey: 'shortcuts.copy_path', groupKey: 'shortcuts.group.file' },\n  { id: 'copy-id', defaultCombo: '', labelKey: 'shortcuts.copy_id', groupKey: 'shortcuts.group.file' },\n  { id: 'restore', defaultCombo: '', labelKey: 'shortcuts.restore', groupKey: 'shortcuts.group.file' },\n  /* /tus:t1 */\n];\n\n/** action id → ShortcutHandlers callback name. */\nconst HANDLER_KEY: Record<string, keyof ShortcutHandlers> = {\n  palette: 'onPathJump',\n  search: 'onFocusSearch',\n  'go-up': 'onGoUp',\n  open: 'onOpen',\n  quicklook: 'onQuickLook',\n  close: 'onClose',\n  inspector: 'onToggleInspector',\n  'toggle-hidden': 'onToggleHidden',\n  star: 'onStar' /* yildiz:s1 */,\n  help: 'onShowHelp',\n  'select-all': 'onSelectAll',\n  rename: 'onRename',\n  delete: 'onDelete',\n  cut: 'onCut',\n  copy: 'onCopy',\n  paste: 'onPaste',\n  /* wiring:d1 */\n  'tab-new': 'onTabNew',\n  'tab-close': 'onTabClose',\n  'tab-next': 'onTabNext',\n  'tab-prev': 'onTabPrev',\n  /* tus:t1 */\n  'new-folder': 'onNewFolder',\n  upload: 'onUpload',\n  refresh: 'onRefresh',\n  download: 'onDownload',\n  preview: 'onPreview',\n  share: 'onShare',\n  tags: 'onTags',\n  'open-tab': 'onOpenTab',\n  'copy-path': 'onCopyPath',\n  'copy-id': 'onCopyId',\n  restore: 'onRestore',\n};\n\n// --------------------------------------------------------------------\n// Overrides (localStorage `filex.shortcuts`)\n// --------------------------------------------------------------------\n\nconst SHORTCUTS_LS_KEY = 'filex.shortcuts';\n\nfunction readOverrides(): Record<string, string> {\n  try {\n    const raw = localStorage.getItem(SHORTCUTS_LS_KEY);\n    if (!raw) return {};\n    const parsed = JSON.parse(raw) as unknown;\n    if (!parsed || typeof parsed !== 'object') return {};\n    const out: Record<string, string> = {};\n    for (const [k, v] of Object.entries(parsed as Record<string, unknown>)) {\n      if (typeof v === 'string' && SHORTCUT_ACTIONS.some((a) => a.id === k)) out[k] = v;\n    }\n    return out;\n  } catch {\n    return {};\n  }\n}\n\n// Module-level so the key handler, the \"?\" help sheet and the settings\n// modal all observe the same reactive mapping.\nconst overrides = ref<Record<string, string>>(readOverrides());\n\nfunction writeOverrides(): void {\n  try {\n    if (Object.keys(overrides.value).length === 0) localStorage.removeItem(SHORTCUTS_LS_KEY);\n    else localStorage.setItem(SHORTCUTS_LS_KEY, JSON.stringify(overrides.value));\n  } catch {\n    /* private mode / quota */\n  }\n}\n\nfunction defOf(id: string): ShortcutActionDef | undefined {\n  return SHORTCUT_ACTIONS.find((a) => a.id === id);\n}\n\n/** Current combo for an action ('' = unbound). */\nexport function effectiveCombo(id: string): string {\n  const o = overrides.value[id];\n  if (o !== undefined) return o;\n  return defOf(id)?.defaultCombo ?? '';\n}\n\n/** Set (or clear back to default) a user override. '' unbinds. */\nexport function setShortcutOverride(id: string, combo: string): void {\n  const def = defOf(id);\n  if (!def || def.customizable === false) return;\n  const next = { ...overrides.value };\n  if (combo === def.defaultCombo) delete next[id];\n  else next[id] = combo;\n  overrides.value = next;\n  writeOverrides();\n}\n\nexport function resetShortcut(id: string): void {\n  if (!(id in overrides.value)) return;\n  const next = { ...overrides.value };\n  delete next[id];\n  overrides.value = next;\n  writeOverrides();\n}\n\nexport function resetAllShortcuts(): void {\n  overrides.value = {};\n  writeOverrides();\n}\n\nexport interface ShortcutConflict {\n  id: string;\n  /** true → the clash is with a fixed (non-remappable) combo. */\n  fixed: boolean;\n}\n\n/**\n * Does `combo` already trigger another action? Checks both effective\n * combos and the reserved fixed combos (Backspace, Esc). Returns null\n * when free.\n */\nexport function findShortcutConflict(combo: string, excludeId: string): ShortcutConflict | null {\n  if (!combo) return null;\n  for (const def of SHORTCUT_ACTIONS) {\n    if (def.id === excludeId) continue;\n    if (def.fixedCombos?.includes(combo)) return { id: def.id, fixed: true };\n    if (effectiveCombo(def.id) === combo) return { id: def.id, fixed: def.customizable === false };\n  }\n  return null;\n}\n\n// --------------------------------------------------------------------\n// Event → canonical combo\n// --------------------------------------------------------------------\n\nconst KEY_TOKEN_MAP: Record<string, string> = {\n  ' ': 'Space',\n  Spacebar: 'Space',\n  Escape: 'Esc',\n  Delete: 'Del',\n  ArrowUp: '↑',\n  ArrowDown: '↓',\n  ArrowLeft: '←',\n  ArrowRight: '→',\n  PageUp: 'PgUp',\n  PageDown: 'PgDn',\n};\n\nconst MODIFIER_KEYS = new Set(['Control', 'Alt', 'Shift', 'Meta', 'AltGraph', 'CapsLock', 'NumLock', 'ScrollLock', 'Fn', 'Dead']);\n\nfunction keyToken(e: KeyboardEvent): string | null {\n  const k = e.key;\n  if (!k || MODIFIER_KEYS.has(k)) return null;\n  const mapped = KEY_TOKEN_MAP[k];\n  if (mapped) return mapped;\n  if (k.length === 1) {\n    const upper = k.toUpperCase();\n    // Letters normalize to uppercase; symbols pass through as typed.\n    return upper;\n  }\n  return k; // 'Enter', 'F2', 'Tab', 'Home', 'End', 'Backspace', …\n}\n\n/**\n * Canonical combo for a keyboard event, or null for a bare modifier\n * press. Meta folds into Ctrl; Shift is dropped for printable symbols\n * because the produced character already encodes it (`?` not `Shift+?`).\n */\nexport function comboFromEvent(e: KeyboardEvent): string | null {\n  const key = keyToken(e);\n  if (!key) return null;\n  const parts: string[] = [];\n  if (e.ctrlKey || e.metaKey) parts.push('Ctrl');\n  if (e.altKey) parts.push('Alt');\n  const printableSymbol = key.length === 1 && key.toUpperCase() === key.toLowerCase();\n  if (e.shiftKey && !printableSymbol) parts.push('Shift');\n  parts.push(key);\n  return parts.join('+');\n}\n\n// --------------------------------------------------------------------\n// Reactive views (help sheet + settings modal)\n// --------------------------------------------------------------------\n\nexport interface ShortcutView {\n  id: string;\n  /** Current (possibly remapped) combo, '' = unbound. */\n  combo: string;\n  /** Non-remappable extra combos (display + reservation only). */\n  fixedCombos: string[];\n  /** Display combos: [combo, ...fixedCombos] minus empties. */\n  keys: string[];\n  labelKey: string;\n  groupKey: string;\n  customizable: boolean;\n  overridden: boolean;\n}\n\n/** Reactive, override-aware view of the registry (registry order). */\nexport function useShortcutList(): ComputedRef<ShortcutView[]> {\n  return computed(() =>\n    SHORTCUT_ACTIONS.map((def) => {\n      const combo = effectiveCombo(def.id);\n      const fixed = def.fixedCombos ?? [];\n      return {\n        id: def.id,\n        combo,\n        fixedCombos: fixed,\n        keys: [combo, ...fixed].filter((c) => !!c),\n        labelKey: def.labelKey,\n        groupKey: def.groupKey,\n        customizable: def.customizable !== false,\n        overridden: overrides.value[def.id] !== undefined,\n      };\n    }),\n  );\n}\n\n// --------------------------------------------------------------------\n// Hint surfaces\n// --------------------------------------------------------------------\n\n/**\n * Is this a Mac-style keyboard? Only affects how a combo is PRINTED —\n * the canonical form folds Meta into Ctrl, so one saved combo works on\n * every platform and only the label differs.\n */\nexport function isMacLike(): boolean {\n  return (\n    typeof navigator !== 'undefined' &&\n    /mac|iphone|ipad|ipod/i.test(navigator.platform || navigator.userAgent || '')\n  );\n}\n\n/** Canonical combo → what a human should see. '' stays ''. */\nexport function comboLabel(combo: string): string {\n  if (!combo) return '';\n  return isMacLike() ? combo.replace(/\\bCtrl\\b/g, '⌘') : combo;\n}\n\n/**\n * Menu action key → registry action id.\n *\n * The right-click menu, the toolbar and the keyboard all name the same verbs,\n * but the menu's `key` and the registry's `id` are separate vocabularies and\n * two of them genuinely differ (`access` is the share dialog, `details` is the\n * inspector). One map, in one place: a second copy is a second chance to\n * forget, and the symptom would be a menu row that silently stops naming its\n * key while every other row keeps working.\n */\nexport const MENU_ACTION_SHORTCUTS: Record<string, string> = {\n  open: 'open',\n  'open-tab': 'open-tab',\n  preview: 'preview',\n  download: 'download',\n  access: 'share',\n  details: 'inspector',\n  'copy-id': 'copy-id',\n  'copy-path': 'copy-path',\n  rename: 'rename',\n  cut: 'cut',\n  copy: 'copy',\n  paste: 'paste',\n  star: 'star',\n  tags: 'tags',\n  delete: 'delete',\n  restore: 'restore',\n  'new-folder': 'new-folder',\n  'toggle-hidden': 'toggle-hidden',\n  upload: 'upload',\n  refresh: 'refresh',\n};\n\n/**\n * What a menu row or a toolbar button should print beside its label: the\n * current combo for the verb it triggers, or '' when it has none (unbound, or\n * not a registry action at all — `keep-local`, the E2E entries and so on).\n */\nexport function menuShortcutHint(menuKey: string): string {\n  /* Fall back to the key itself: the toolbar's own buttons (go-up, upload,\n   * refresh…) pass a registry id directly, and an id nothing knows returns ''\n   * rather than throwing. */\n  const id = MENU_ACTION_SHORTCUTS[menuKey] ?? menuKey;\n  return SHORTCUT_ACTIONS.some((a) => a.id === id) ? shortcutHint(id) : '';\n}\n\n/**\n * The one way a hint may name a key.\n *\n * ⚠ Never write a key into a hint by hand — not in a template, not in a\n * locale string. Every combo in this registry is remappable, so a\n * hardcoded \"Ctrl+K\" is true only until someone opens the shortcut\n * settings, and then it is a label that tells the user to press a key\n * that does nothing. Call this instead and interpolate the result;\n * `web/tests/ui/shortcutHints.test.ts` fails the build on a literal.\n *\n * Returns '' when the action is unbound, so a caller can drop the whole\n * segment rather than print an empty key cap.\n */\nexport function shortcutHint(id: string): string {\n  return comboLabel(effectiveCombo(id));\n}\n\n/**\n * Does this event fire the given registry action? For overlays that\n * handle their own keys (the quick-look peek) rather than going through\n * the global binder — without this they keep answering to the DEFAULT\n * key after the user has remapped the action.\n */\nexport function eventMatchesShortcut(e: KeyboardEvent, id: string): boolean {\n  const combo = effectiveCombo(id);\n  if (!combo) return false;\n  const fired = comboFromEvent(e);\n  if (fired === combo) return true;\n  return defOf(id)?.fixedCombos?.includes(fired ?? '') ?? false;\n}\n\n/**\n * @deprecated Legacy static cheat-sheet shape (pre-registry). Kept for\n * API compatibility; use `useShortcutList()` for the live, remap-aware\n * list.\n */\nexport interface ShortcutDef {\n  keys: string[];\n  labelKey: string;\n  groupKey: string;\n}\n\n/** @deprecated See {@link useShortcutList}. Defaults only. */\nexport const SHORTCUTS: ShortcutDef[] = SHORTCUT_ACTIONS.map((def) => ({\n  keys: [def.defaultCombo, ...(def.fixedCombos ?? [])].filter((c) => !!c),\n  labelKey: def.labelKey,\n  groupKey: def.groupKey,\n}));\n\n// --------------------------------------------------------------------\n// Binding\n// --------------------------------------------------------------------\n\nexport function useKeyboardShortcuts(rootEl: Ref<HTMLElement | null>, handlers: ShortcutHandlers) {\n  // combo → action def, rebuilt when overrides change.\n  const comboMap = computed(() => {\n    const m = new Map<string, ShortcutActionDef>();\n    for (const def of SHORTCUT_ACTIONS) {\n      const c = effectiveCombo(def.id);\n      if (c) m.set(c, def);\n    }\n    return m;\n  });\n\n  function onKey(e: KeyboardEvent) {\n    const root = rootEl.value;\n    if (!root) return;\n\n    /* ui-fix — while a context menu is open, global shortcuts stay quiet\n     * (except Esc, which the menu scopes itself). Otherwise e.g. Delete\n     * opens a modal UNDER the menu backdrop and the UI wedges: the\n     * backdrop intercepts every click on the new dialog. */\n    if (e.key !== 'Escape' && document.querySelector('.fe-ctx-backdrop')) return;\n\n    // Skip when the event originates inside a form control — don't\n    // want `Delete` while editing a filename, `/` while typing in the\n    // search box, etc. Escape always goes through so modals can close.\n    // ⚠ Not only form controls: the code editor's focused element is a\n    // `role=\"textbox\"` div in Chromium (lib/typingTarget).\n    const target = e.target as HTMLElement | null;\n    const inForm = isTypingTarget(target);\n\n    const combo = comboFromEvent(e);\n    if (!combo) return;\n\n    // Backspace keeps its FIXED dual behaviour: delete when something is\n    // selected (file-manager convention), parent-dir navigation otherwise.\n    // Not remappable — the selection-dependent branch doesn't fit the\n    // one-combo-one-action registry model.\n    if (combo === 'Backspace') {\n      if (inForm) return;\n      if (handlers.hasSelection?.() && handlers.onDelete) {\n        e.preventDefault();\n        handlers.onDelete();\n      } else if (handlers.onGoUp) {\n        e.preventDefault();\n        handlers.onGoUp();\n      }\n      return;\n    }\n\n    const def = comboMap.value.get(combo);\n    if (!def) return;\n    if (inForm && !def.inForms) return;\n    // Space on a focused button/link must keep its native activation\n    // (quick-look would otherwise fire alongside the click).\n    if (\n      combo === 'Space' &&\n      target &&\n      typeof target.closest === 'function' &&\n      target.closest('button, a, select, summary, [role=\"button\"], [role=\"menuitem\"]')\n    ) {\n      return;\n    }\n    const fn = handlers[HANDLER_KEY[def.id]] as (() => void) | undefined;\n    if (!fn) return;\n    if (def.prevent !== false) e.preventDefault();\n    fn();\n  }\n\n  onMounted(() => window.addEventListener('keydown', onKey));\n  onBeforeUnmount(() => window.removeEventListener('keydown', onKey));\n}\n","/**\n * useSystemDark — is the operating system in dark mode, as a ref that turns\n * with it while the component is mounted.\n *\n * ⚠⚠ `window.matchMedia('(prefers-color-scheme: dark)').matches` read inside\n * a `computed` is read ONCE: Vue cannot track a media query, so a page that\n * resolves \"auto\" that way keeps the mode it was opened in. The public page\n * (a share, a file request, an app's signing page) did exactly that — opened\n * dark, the OS turned light, and the page stayed dark with `fe--theme-dark`\n * pinned on its root (#57, measured in a browser). Every screen that resolves\n * `auto` in script takes it from here, so the listener and its cleanup exist\n * once.\n */\nimport { onBeforeUnmount, onMounted, ref, type Ref } from 'vue';\n\nexport function useSystemDark(): Readonly<Ref<boolean>> {\n  let mq: MediaQueryList | undefined;\n  try {\n    mq = typeof window !== 'undefined' && typeof window.matchMedia === 'function'\n      ? window.matchMedia('(prefers-color-scheme: dark)')\n      : undefined;\n  } catch {\n    mq = undefined;\n  }\n  const dark = ref(!!mq?.matches);\n  const onChange = (e: { matches: boolean }) => {\n    dark.value = e.matches;\n  };\n  onMounted(() => mq?.addEventListener?.('change', onChange));\n  onBeforeUnmount(() => mq?.removeEventListener?.('change', onChange));\n  return dark;\n}\n","/**\n * pluginPage — where an app plugin's `page` view lives, and how it is opened.\n *\n * A `modal` view is a dialog over the listing. A `page` view is the SAME\n * conversation (same `GET …/views/{p}/{v}?path=`, same `POST …/event`) drawn\n * as a whole page in a NEW TAB — for a wizard that needs the document beside\n * it, where a dialog's inner scroll would cramp both. The action row says\n * which (`view_placement`), so nothing about the plugin changes between the\n * two; only the frame does.\n *\n * ⚠⚠ This lives in the package, not in the admin SPA, because the rule is the\n * same everywhere the explorer runs — fm.example.com, the desktop shell, the\n * work.example.com and fishapp embeds. What differs per host is only WHERE the\n * page is served and HOW a new surface is opened, and those are the two\n * things `ExplorerConfig` asks the host for (`pluginPageBase`,\n * `openPluginPage`). A host that wires neither keeps the modal: a `page`\n * action still works, it just opens in a dialog rather than a tab. That is a\n * degraded frame, never a missing feature.\n *\n * ⚠ The address in the contract (`/apps/{plugin}/{view}?path=…`) is relative\n * to the SPA's MOUNT BASE, not to the site root: the same bundle is served\n * from `/admin/` and `/drive/` (backend routes.go → wireStatic), and\n * only those prefixes fall back to index.html. A bare `/apps/…` is a 404 on\n * the server, so the host passes the base it was served from.\n */\n\n/** The path segment under a mount base that a plugin page lives at. */\nexport const PLUGIN_PAGE_SEGMENT = 'apps';\n\nexport interface PluginPageTarget {\n  plugin: string;\n  view: string;\n  /** Adapter-qualified path of the row the action was invoked on. */\n  path?: string;\n}\n\n/** `apps/sign/wizard?path=docs%3A%2F%2Fnda.pdf` — no leading slash. */\nexport function pluginPagePath(target: PluginPageTarget): string {\n  const p = `${PLUGIN_PAGE_SEGMENT}/${encodeURIComponent(target.plugin)}/${encodeURIComponent(target.view)}`;\n  return target.path ? `${p}?path=${encodeURIComponent(target.path)}` : p;\n}\n\n/**\n * The full address, given the base the SPA is mounted at (`/admin/`,\n * `/drive/`, `https://fm.example.com/admin/` — with or without its trailing\n * slash). An empty base yields a root-relative `/apps/…`, which is right for\n * a host that serves the SPA at the root and wrong for one that does not —\n * hence the config field rather than a guess.\n */\nexport function pluginPageUrl(base: string | undefined | null, target: PluginPageTarget): string {\n  const b = String(base ?? '').replace(/\\/+$/, '');\n  return `${b}/${pluginPagePath(target)}`;\n}\n\n/** Does this action open its view as a full page rather than a dialog? */\nexport function isPagePlacement(placement: string | undefined | null): boolean {\n  return placement === 'page';\n}\n","/**\n * surfaceOpen — \"go to this file, and start that screen on it\".\n *\n * ⚠⚠ v3 §3.0. A surface runs on the file it was opened on, which meant an\n * app's HOME screen could list documents and then do nothing when a row was\n * clicked: there was nowhere for a screen to send anybody. `Surface.open`\n * is that missing edge — the answer names a path and, optionally, one of the\n * plugin's own screens, and the client goes there.\n *\n * ⚠ It is NOT a second navigation design. The address is the one a\n * notification deep link already uses (`?select=<path>&app=<plugin>` plus\n * `appAction=` or `appView=`, with the folder in the hash), because the two\n * are the same request — \"open this file with that screen on it\" — and a\n * second spelling of it would be a second thing to keep working.\n *\n * ⚠⚠ Trusted on arrival, and that is the SERVER's promise, not an omission\n * here: the host checks the screen belongs to the plugin that answered, and\n * the handler re-checks the path against the ASKING person's permissions,\n * dropping the `open` rather than refusing the screen. So a client that\n * re-derived its own permission check would be writing a second, weaker\n * copy of a rule that has already been applied.\n *\n * ⚠ A public page never gets one — there is no explorer behind it — so a\n * frame with no navigator simply ignores it (see `openHrefFor` returning '').\n */\nimport type { SurfaceOpenRequest } from '../types/Plugins';\nimport { isPagePlacement, pluginPageUrl } from './pluginPage';\n\n/* ⚠ The shape itself lives in `types/Plugins`, with every other wire\n * mirror. Declaring it here as well would be a second copy of a struct that\n * only has one definition in `wire.go`. */\nexport type { SurfaceOpenRequest };\n\n/** What the answer amounts to, once the frame knows where it is mounted. */\nexport interface SurfaceOpenTarget {\n  href: string;\n  /**\n   * A `page` view is a whole screen with the document beside it and opens in\n   * its own tab — the same rule a `page` ACTION follows when it is clicked\n   * in the menu, so a plugin's screen behaves the same however it was\n   * reached.\n   */\n  newTab: boolean;\n}\n\n/** Is this a request the client can act on at all? */\nexport function isOpenRequest(v: unknown): v is SurfaceOpenRequest {\n  if (!v || typeof v !== 'object') return false;\n  const o = v as Record<string, unknown>;\n  return typeof o.path === 'string' && o.path.trim() !== '';\n}\n\n/**\n * The folder part of an adapter-qualified path, as the explorer's hash wants\n * it (`storage/dir/sub`), and the file itself for `?select=`.\n */\nexport function openHashFor(qualified: string): string {\n  const at = String(qualified ?? '').indexOf('://');\n  if (at <= 0) return '';\n  const storage = qualified.slice(0, at);\n  const rel = qualified.slice(at + 3).replace(/^\\/+/, '');\n  const cut = rel.lastIndexOf('/');\n  const dir = cut > 0 ? rel.slice(0, cut) : '';\n  return dir ? `${storage}/${dir}` : storage;\n}\n\nexport interface SurfaceOpenOptions {\n  /** The plugin that answered — the screen named is one of ITS own. */\n  plugin: string;\n  /** The prefix the SPA is served from (`/admin/`, `/drive/`). */\n  base?: string | null;\n  /**\n   * What placement the named view has, when the frame knows. `page` opens in\n   * a tab on the view's own address; anything else (and an unknown one) goes\n   * through the explorer, which is the frame that can open a dialog.\n   */\n  placementOf?: (id: string) => string | undefined;\n}\n\n/**\n * Where this answer sends the person.\n *\n * `''` when there is nowhere to go: no path, or a frame with no explorer\n * behind it. The caller draws its screen and does nothing, which is what a\n * public page must do.\n */\nexport function openTargetFor(\n  req: SurfaceOpenRequest | null | undefined,\n  opts: SurfaceOpenOptions,\n): SurfaceOpenTarget {\n  if (!isOpenRequest(req) || !opts.plugin) return { href: '', newTab: false };\n  const base = String(opts.base ?? '').replace(/\\/+$/, '');\n\n  // A `page` view is its own address, with the document beside it.\n  if (req.view && isPagePlacement(opts.placementOf?.(req.view))) {\n    return { href: pluginPageUrl(base, { plugin: opts.plugin, view: req.view, path: req.path }), newTab: true };\n  }\n\n  const q: string[] = [`select=${encodeURIComponent(req.path)}`, `app=${encodeURIComponent(opts.plugin)}`];\n  // ⚠ `action` OR `view`, never both — the contract says naming both is not\n  // a request, and sending both would leave the explorer to pick one.\n  if (req.action) q.push(`appAction=${encodeURIComponent(req.action)}`);\n  else if (req.view) q.push(`appView=${encodeURIComponent(req.view)}`);\n  const hash = openHashFor(req.path);\n  return { href: `${base}/explore?${q.join('&')}${hash ? `#${hash}` : ''}`, newTab: false };\n}\n","/**\n * usePendingOps — track async copy/move/delete operations.\n *\n * Backend POST /files/{copy,move,delete} returns `{op}` immediately\n * (status='pending') and the actual S3 work runs in a worker. The\n * client polls `/files/ops` every 2s while there's anything still\n * pending or running so the user gets live feedback (\"3/5 copied\").\n *\n * Polling is reference-counted: callers `register(op)` after starting a\n * new op; an interval ticks while the registered set has any non-\n * terminal entries. Terminal ops (done/error) stay in the local cache\n * for `RETAIN_MS` so the UI can flash a final state before they fade\n * out, then a sweep removes them.\n */\n\nimport { computed, ref, onBeforeUnmount } from 'vue';\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { SurfaceOpenRequest } from '../types/Plugins';\nimport type { FileApi } from './useFileApi';\nimport { isOpenRequest } from '../lib/surfaceOpen';\n\n/**\n * The queue kinds this package knows by name. A server may emit others (an\n * app-plugin job is `plugin-action` on the wire and `plugin` here); anything\n * unknown is carried through verbatim rather than being read as a delete.\n */\nexport type PendingOpType = 'copy' | 'move' | 'delete' | 'plugin' | 'trash-empty' | (string & {});\n\n/** One produced file of a finished plugin job, as an adapter-qualified path. */\nexport interface PendingOpOutput {\n  path: string;\n}\n\nexport interface PendingOp {\n  id: number;\n  op_type: PendingOpType;\n  /** `cancelled` — somebody stopped it (POST /ops/{id}/cancel). */\n  status: 'pending' | 'running' | 'cancelling' | 'done' | 'error' | 'cancelled';\n  progress_total: number;\n  progress_done: number;\n  /** Running cross-storage transfer's bytes (issue #27); absent otherwise. */\n  bytes_total?: number;\n  bytes_done?: number;\n  /** Objects a running same-storage copy/move/delete has found and finished\n   *  inside its sources (the storage driver's count); absent otherwise. */\n  objects_total?: number;\n  objects_done?: number;\n  target_path: string | null;\n  source_dir: string | null;\n  source_count: number;\n  error_message: string | null;\n  /** A failed APP job, classified by the server (lib/errorWords `jobFailure`\n   *  says it); absent on copy/move/delete rows and on an older server. */\n  error_code?: string;\n  /** The engine a job needed and the server lacks (`error_code: engine_missing`). */\n  error_engine?: string;\n  /** The server's sentence for the failure, in the reader's language\n   *  (backend ops/errcode.go): what lib/errorWords `opFailure` shows. */\n  error_text?: string;\n  cancellable: boolean;\n  started_at: string | null;\n  finished_at: string | null;\n  created_at: string | null;\n  /* App-plugin jobs (`op_type: \"plugin-action\"` on the wire) — absent on\n   * copy/move/delete rows. See docs/APP-PLUGINS-API.md → Ops rows. */\n  plugin?: string;\n  action?: string;\n  /** The action's label in the caller's locale — the tray's row title. */\n  label?: string;\n  /** The last `job_progress` message. */\n  message?: string;\n  /** Where a trash job (restore, permanent delete, \"empty the trash\") stands,\n   *  said by the server in the reader's language (0.54, findings A4/A15):\n   *  what the explorer says when the job ends. Absent on other rows. */\n  summary?: string;\n  /** Files the job committed, once finished. */\n  outputs?: PendingOpOutput[];\n  /**\n   * Where the FINISHED job sends the person who queued it: one of its outputs\n   * and the app's own screen to start there (the job result's `surface.open`,\n   * docs/APP-PLUGINS-API.md → Ops rows). Absent while it runs, after it\n   * failed, and on every row whose app asked for nothing.\n   *\n   * ⚠ Followed only by the screen that queued the job (PluginPageView, the\n   * explorer's own registered jobs): an administrator's list carries other\n   * people's rows too, and their jobs must not move this person's screen.\n   */\n  open?: SurfaceOpenRequest;\n}\n\nconst POLL_MS = 2000;\nconst RETAIN_MS = 8000;\n\n/**\n * normalizeOp maps the backend ops row (`{kind,total,done,failed,error,dest,\n * status:'ok'|'failed'|'partial'|…}`) onto the PendingOp contract the tray\n * renders (`{op_type,progress_total,progress_done,error_message,status:'done'|\n * 'error'|…}`). Without this the tray showed \"undefined/undefined\" for a\n * running op (progress_* were undefined) and never treated an 'ok'/'failed'\n * row as terminal. Tolerant of an already-normalized shape (idempotent).\n */\nexport function normalizeOp(raw: Record<string, unknown>): PendingOp {\n  const num = (...vals: unknown[]): number => {\n    for (const v of vals) if (typeof v === 'number') return v;\n    return 0;\n  };\n  const str = (...vals: unknown[]): string | null => {\n    for (const v of vals) if (typeof v === 'string' && v !== '') return v;\n    return null;\n  };\n  const rawStatus = String(raw.status ?? 'pending');\n  // ⚠ `cancelled` is an ending of its own. It used to fall through to\n  // 'pending', so a job somebody cancelled sat in the operations centre as\n  // \"Queued\" for as long as the list still carried the row.\n  const status: PendingOp['status'] =\n    rawStatus === 'ok' || rawStatus === 'done'\n      ? 'done'\n      : rawStatus === 'failed' || rawStatus === 'partial' || rawStatus === 'error'\n        ? 'error'\n        : rawStatus === 'cancelled'\n          ? 'cancelled'\n          : rawStatus === 'cancelling'\n            ? 'cancelling'\n            : rawStatus === 'running'\n              ? 'running'\n              : 'pending';\n  const sources = Array.isArray(raw.sources) ? raw.sources : [];\n  // ⚠ Unknown kinds pass through. This used to fold everything that was not\n  // copy/move into `delete`, which drew a bin beside a plugin job and read\n  // \"Deleted (1)\" when it finished. `plugin-action` (the wire name) becomes\n  // `plugin`; a row with no kind at all is the one case still read as delete\n  // (the legacy delete endpoint's rows carried none).\n  const opType = str(raw.op_type, raw.kind) ?? 'delete';\n  const outputs = Array.isArray(raw.outputs)\n    ? (raw.outputs as unknown[])\n        .map((o) => (o && typeof o === 'object' ? str((o as { path?: unknown }).path) : null))\n        .filter((p): p is string => p !== null)\n        .map((path) => ({ path }))\n    : undefined;\n  // Only a request the client can act on, and only the fields the contract\n  // has (path, action, view - lib/surfaceOpen), never whatever else rode along.\n  let open: SurfaceOpenRequest | undefined;\n  if (isOpenRequest(raw.open)) {\n    const action = str(raw.open.action);\n    const view = str(raw.open.view);\n    open = { path: raw.open.path, ...(action ? { action } : {}), ...(view ? { view } : {}) };\n  }\n  return {\n    id: num(raw.id),\n    op_type: opType === 'plugin-action' ? 'plugin' : opType,\n    status,\n    progress_total: num(raw.progress_total, raw.total, sources.length),\n    progress_done: num(raw.progress_done, raw.done),\n    bytes_total: num(raw.bytes_total),\n    bytes_done: num(raw.bytes_done),\n    objects_total: num(raw.objects_total),\n    objects_done: num(raw.objects_done),\n    target_path: str(raw.target_path, raw.dest),\n    source_dir: str(raw.source_dir),\n    source_count: num(raw.source_count, sources.length),\n    error_message: str(raw.error_message, raw.error),\n    error_code: str(raw.error_code) ?? undefined,\n    error_engine: str(raw.error_engine) ?? undefined,\n    error_text: str(raw.error_text) ?? undefined,\n    cancellable: raw.cancellable === true,\n    started_at: str(raw.started_at),\n    finished_at: str(raw.finished_at),\n    created_at: str(raw.created_at),\n    plugin: str(raw.plugin) ?? undefined,\n    action: str(raw.action) ?? undefined,\n    label: str(raw.label) ?? undefined,\n    message: str(raw.message) ?? undefined,\n    summary: str(raw.summary) ?? undefined,\n    outputs,\n    ...(open ? { open } : {}),\n  };\n}\n\nexport interface UsePendingOpsOptions {\n  /**\n   * Called once a job THIS instance registered (`register`) flips into a\n   * terminal state (done|error|cancelled).\n   *\n   * ⚠ Only those. The list also carries other people's running jobs (an\n   * administrator sees every account's, #58), and they end too: an admin's\n   * explorer said \"Renamed\" and \"3 items restored\", and read its listing\n   * again, for every colleague's rename and restore (#61).\n   */\n  onSettled?: (op: PendingOp) => void;\n}\n\nexport function usePendingOps(\n  config: ExplorerConfig,\n  api: FileApi,\n  opts: UsePendingOpsOptions = {},\n) {\n  void config; // kept for future per-instance config knobs\n  const ops = ref<PendingOp[]>([]);\n  const announced = new Set<number>();\n  /** The jobs registered here, still to be announced when they end. */\n  const mine = new Set<number>();\n  const settledAt = new Map<number, number>();\n  // First poll after mount returns the server's recent-history window\n  // (last 5 min of done/error rows). They are marked announced silently —\n  // none was registered here (`mine`), so no toast fires twice on F5 — and\n  // kept out of the tray.\n  let firstPollDone = false;\n\n  const hasActive = computed(() =>\n    ops.value.some((o) => o.status === 'pending' || o.status === 'running' || o.status === 'cancelling'),\n  );\n\n  let timer: ReturnType<typeof setInterval> | undefined;\n\n  function startPolling() {\n    if (timer) return;\n    if (!api.endpoints.opsList) return;\n    timer = setInterval(() => {\n      void poll();\n    }, POLL_MS);\n    // Kick a poll right away.\n    void poll();\n  }\n\n  function stopPolling() {\n    if (timer) {\n      clearInterval(timer);\n      timer = undefined;\n    }\n  }\n\n  async function poll(): Promise<void> {\n    if (!api.endpoints.opsList) return;\n    try {\n      // ⚠ `lang=`: an app job's label and result are said in the reader's\n      // language when the list is READ (backend wasmplugin/jobtext.go) — the\n      // language on this screen, not the account's (an embed's config.locale).\n      const res = await api.jsonFetch<{ ops: Record<string, unknown>[] }>(api.withScreenLang(api.endpoints.opsList));\n      const incoming = (res.ops || []).map(normalizeOp);\n\n      for (const op of incoming) {\n        if ((op.status === 'done' || op.status === 'error' || op.status === 'cancelled') && !announced.has(op.id)) {\n          announced.add(op.id);\n          settledAt.set(op.id, Date.now());\n          // Only a job this tab queued is announced — on the first look too:\n          // one that ended before it would otherwise go unsaid. (What the\n          // first look finds from before a reload was never registered here.)\n          if (mine.delete(op.id)) opts.onSettled?.(op);\n        }\n      }\n\n      // Filter incoming: pending/running always; settled only if user\n      // is currently seeing them in the local tray.\n      const localIds = new Set(ops.value.map((o) => o.id));\n      const visibleIncoming = incoming.filter((op) => {\n        if (op.status === 'pending' || op.status === 'running' || op.status === 'cancelling') return true;\n        if (!firstPollDone) return false;\n        return localIds.has(op.id);\n      });\n\n      const visibleIds = new Set(visibleIncoming.map((o) => o.id));\n      const local = ops.value.filter((o) => !visibleIds.has(o.id));\n      const merged = [...visibleIncoming, ...local];\n\n      firstPollDone = true;\n\n      // Sweep: drop terminal ops past RETAIN_MS.\n      const now = Date.now();\n      const after = merged.filter((o) => {\n        if (o.status === 'pending' || o.status === 'running' || o.status === 'cancelling') return true;\n        const at = settledAt.get(o.id);\n        return at !== undefined && now - at < RETAIN_MS;\n      });\n      ops.value = after;\n\n      if (!hasActive.value && after.length === 0) {\n        stopPolling();\n      }\n    } catch (err) {\n      // eslint-disable-next-line no-console\n      console.warn('[usePendingOps] poll failed:', err);\n    }\n  }\n\n  function register(raw: PendingOp | Record<string, unknown>): void {\n    const op = normalizeOp(raw as Record<string, unknown>);\n    if (!announced.has(op.id)) mine.add(op.id);\n    const exists = ops.value.some((o) => o.id === op.id);\n    if (!exists) {\n      ops.value = [op, ...ops.value];\n    }\n    startPolling();\n  }\n\n  function dismiss(id: number): void {\n    ops.value = ops.value.filter((o) => o.id !== id);\n    settledAt.delete(id);\n  }\n\n  onBeforeUnmount(() => {\n    stopPolling();\n  });\n\n  return {\n    ops,\n    hasActive,\n    register,\n    dismiss,\n    poll,\n    startPolling,\n    stopPolling,\n  };\n}\n","/**\n * pluginApplies — does an action's `applies` rule accept this selection?\n *\n * The client-side mirror of `wasmplugin.Matches` (backend/internal/wasmplugin/\n * manifest.go). The server re-checks on every run; this copy only decides\n * which rows the menu shows, so the two must agree or a row appears that the\n * server then refuses with 422. Keep the rules in the same order as the Go:\n *\n *   1. an empty selection never matches;\n *   2. more than one item needs `multi`;\n *   3. `min` / `max` bound the count when > 0;\n *   4. every item's kind must equal the rule's (`any` accepts both; an absent\n *      kind means `file`);\n *   5. `state` / `no_state` (v2): every item must carry at least one of the\n *      rule's `state` keys and none of its `no_state` keys;\n *   6. when the rule names extensions or mime types, every item must match\n *      at least one of EITHER list — an ext hit is enough, a mime hit is\n *      enough; with both lists empty anything of the right kind passes.\n *\n * ⚠⚠ The state keys a ROW carries are namespaced (`app_state: [\"sign:pending\"]`)\n * while the keys a RULE names are bare (`state: [\"pending\"]`) — an action can\n * only ever ask about its OWN plugin's keys. So the mirror needs to be told\n * which plugin is asking (`appliesToNodes(rule, nodes, plugin)`), strips\n * `\"<plugin>:\"` off the row's keys and compares what is left. Compare the two\n * without stripping and every state rule silently never matches: the menu row\n * simply is not there, which reads as \"the app is broken\", not as a bug here.\n */\nimport type { PluginApplies } from '../types/Plugins';\n\n/** What the rule sees of a selected row. */\nexport interface AppliesItem {\n  kind: 'file' | 'dir' | string;\n  /** Lower-case, no dot. */\n  ext?: string | null;\n  mime?: string | null;\n  /** BARE state keys the asking plugin keeps on this item (prefix stripped). */\n  state?: string[];\n}\n\n/** A listing row, as the explorer holds it — only the three fields matter. */\nexport interface AppliesNodeLike {\n  type?: string;\n  extension?: string | null;\n  mime_type?: string | null;\n  basename?: string;\n  /** `<plugin>:<key>` as the listing carries it. */\n  app_state?: string[];\n}\n\n/** The rule's own keys out of a row's namespaced ones. `''` asks about nobody. */\nexport function stateKeysOf(node: AppliesNodeLike, plugin: string | undefined): string[] {\n  if (!plugin || !Array.isArray(node.app_state)) return [];\n  const prefix = `${plugin}:`;\n  return node.app_state\n    .filter((k): k is string => typeof k === 'string' && k.startsWith(prefix))\n    .map((k) => k.slice(prefix.length));\n}\n\n/** Reduce a listing row to what the rule reads. */\nexport function appliesItemOf(node: AppliesNodeLike, plugin?: string): AppliesItem {\n  let ext = String(node.extension ?? '').toLowerCase();\n  if (!ext && node.basename) {\n    const dot = node.basename.lastIndexOf('.');\n    if (dot > 0) ext = node.basename.slice(dot + 1).toLowerCase();\n  }\n  return {\n    kind: node.type === 'dir' ? 'dir' : 'file',\n    ext,\n    mime: node.mime_type ?? '',\n    state: stateKeysOf(node, plugin),\n  };\n}\n\nfunction mimeMatches(pattern: string, mime: string): boolean {\n  if (pattern === mime) return true;\n  if (pattern.endsWith('/*')) return mime.startsWith(pattern.slice(0, -1));\n  return false;\n}\n\n/** The rule against a selection already reduced to items. */\nexport function appliesMatches(rule: PluginApplies | null | undefined, items: AppliesItem[]): boolean {\n  const a = rule ?? {};\n  const n = items.length;\n  if (n === 0) return false;\n  if (n > 1 && !a.multi) return false;\n  const min = a.min ?? 0;\n  const max = a.max ?? 0;\n  if (min > 0 && n < min) return false;\n  if (max > 0 && n > max) return false;\n  const kind = a.kind || 'file';\n  const exts = (a.ext ?? []).map((e) => e.toLowerCase());\n  const mimes = (a.mime ?? []).map((m) => m.toLowerCase());\n  const wantState = a.state ?? [];\n  const banState = a.no_state ?? [];\n  for (const it of items) {\n    if (kind !== 'any' && kind !== it.kind) return false;\n    const has = it.state ?? [];\n    if (wantState.length > 0 && !wantState.some((k) => has.includes(k))) return false;\n    if (banState.some((k) => has.includes(k))) return false;\n    if (exts.length === 0 && mimes.length === 0) continue;\n    const ext = String(it.ext ?? '').toLowerCase();\n    let ok = exts.includes(ext);\n    if (!ok) {\n      const mime = String(it.mime ?? '').toLowerCase();\n      ok = mimes.some((m) => mimeMatches(m, mime));\n    }\n    if (!ok) return false;\n  }\n  return true;\n}\n\n/**\n * The rule against listing rows. `plugin` is the ASKING action's plugin —\n * without it a `state` / `no_state` rule can never be satisfied, so pass it\n * wherever the action is known.\n */\nexport function appliesToNodes(\n  rule: PluginApplies | null | undefined,\n  nodes: AppliesNodeLike[],\n  plugin?: string,\n): boolean {\n  return appliesMatches(rule, nodes.map((n) => appliesItemOf(n, plugin)));\n}\n","/**\n * pluginLabel — a plugin's multilingual text, read in the viewer's language.\n *\n * Mirrors `wire.Text.Get` in backend/pkg/pluginkit/wire/wire.go: the\n * requested language, then English, then whatever is there. One place, so an\n * action row, a surface title and a footer button cannot fall back\n * differently.\n */\nimport type { PluginText } from '../types/Plugins';\n\n/** The text for `locale`, falling back to `en`, then to any non-empty value. */\nexport function labelOf(text: PluginText | string | null | undefined, locale: string): string {\n  if (!text) return '';\n  if (typeof text === 'string') return text;\n  const lang = String(locale || 'en').toLowerCase().split('-')[0];\n  const direct = text[lang];\n  if (typeof direct === 'string' && direct !== '') return direct;\n  const en = text.en;\n  if (typeof en === 'string' && en !== '') return en;\n  for (const v of Object.values(text)) {\n    if (typeof v === 'string' && v !== '') return v;\n  }\n  return '';\n}\n\n/**\n * The app's own words for THIS reader and nobody else: the requested\n * language, or its base language (`pt` answers `pt-br`), and otherwise ''.\n *\n * Unlike `labelOf` it does NOT fall back to English — which is the whole\n * point of `appTextOr` below.\n */\nexport function labelIn(text: PluginText | string | null | undefined, locale: string): string {\n  if (!text) return '';\n  if (typeof text === 'string') return text;\n  const lang = String(locale || 'en').toLowerCase().split('-')[0];\n  const direct = text[lang];\n  return typeof direct === 'string' && direct !== '' ? direct : '';\n}\n\n/**\n * An app's text where FILEX HAS WORDS OF ITS OWN for the same thing — a\n * caption an app may override, an empty state, a progress line.\n *\n * ⚠⚠ THE ORDER IS THE WHOLE POINT. The obvious spelling,\n * `labelOf(appText, locale) || t(key)`, reads as \"the app first, filex if the\n * app said nothing\" — but `labelOf` falls back to ENGLISH, and English is\n * truthy, so the host string is unreachable for every reader whose language\n * the app does not speak. Measured in v0.43.0 on the signing app's date box:\n * an app shipping en/tr/es/de/fr, a reader in Arabic, a language pack holding\n * filex's own Arabic for those very captions — and three English words in the\n * middle of an Arabic screen, because the app's English won.\n *\n * So: the app's words for this reader, then FILEX's words, and only then\n * whatever other language the app has — the last resort, and labelled as one.\n *\n * ⚠ This is for a host string that TRANSLATES THE SAME THING. Where the host\n * string is a generic stand-in for something the app NAMES (an action's\n * label falling back to \"Confirm\"), the app's own name in another language\n * says more than filex's placeholder, and `labelOf(…) || t(…)` is right.\n */\nexport function appTextOr(\n  text: PluginText | string | null | undefined,\n  locale: string,\n  host: () => string,\n): string {\n  const mine = labelIn(text, locale);\n  if (mine) return mine;\n  const ours = host();\n  if (ours) return ours;\n  return labelOf(text, locale);\n}\n","/**\n * pluginMenu — the file menu's plugin rows, as pure data.\n *\n * `FileExplorer.selectionActionList` splices these between the tags row and\n * the desktop-sync rows. Kept out of the component so the gating can be\n * tested without mounting the explorer: a row is offered only when the\n * feature is on, the selection is a plain listing selection (not the trash,\n * not inside an encrypted folder, not a storage mount row) and the action's\n * `applies` rule accepts it.\n *\n * ⚠ v2: the rule reads the row's `app_state` too, so one app contributes\n * DIFFERENT rows to the same menu depending on the file — \"Sign / Fill\"\n * where a signature is pending, \"Request signatures\" where none is. They\n * are ordinary rows beside the built-in verbs; nothing about them is a\n * separate menu or a separate surface.\n */\nimport type { PluginActionRow, PluginGatedRule } from '../types/Plugins';\nimport { appliesToNodes, type AppliesNodeLike } from './pluginApplies';\nimport { labelOf } from './pluginLabel';\n\n/** The `ContextAction` fields a plugin row fills (the menu's own type owns the rest). */\nexport interface PluginMenuRow {\n  key: string;\n  label: string;\n  icon?: string;\n  danger?: boolean;\n  divider?: boolean;\n  /** Greyed: offered once something the server lacks is there (`title` says what). */\n  disabled?: boolean;\n  title?: string;\n}\n\nexport interface PluginMenuContext {\n  locale: string;\n  /** The trash view is open — plugins never run on trashed rows. */\n  trash?: boolean;\n  /** Inside an E2E-encrypted folder — the server would only see ciphertext. */\n  e2e?: boolean;\n  /**\n   * The selection sits on a read-only storage. An action the server says it\n   * would refuse there (`read_only_ok: false` on its row) is then not\n   * offered.\n   */\n  readOnly?: boolean;\n  /**\n   * The caller's level on one selected row (`none` | `viewer` | `editor` |\n   * `owner`), as the explorer's own write gate reads it (`rowPerm`). An\n   * action the level cannot run is not offered — see `pluginActionNeed`.\n   * Omitted, or any other answer (`''`, undefined: no ACL on that storage),\n   * leaves the row ungated; the server enforces either way.\n   */\n  permOf?: (node: PluginMenuNode) => string | undefined;\n  /** Which manifest icon names have a glyph; others fall back to `plugin`. */\n  hasIcon?: (name: string) => boolean;\n  /**\n   * The sentence for a greyed row (an action's `gated` rule): what the server\n   * lacks, in the reader's language. Absent, gated rows are not drawn.\n   */\n  needWords?: (need: PluginGatedRule['needs']) => string;\n}\n\n/** What the menu reads of a selected row. */\nexport type PluginMenuNode = AppliesNodeLike & {\n  e2e?: boolean;\n  mime_type?: string | null;\n  /** The app holding the file read-only, if one does (listing `lock`). */\n  lock?: { plugin?: string } | null;\n};\n\n/**\n * The sentence for a greyed row: what the server lacks and what an\n * administrator does about it. A binary engine is installed (and filex\n * restarted); the office engine (`kind: \"office\"`, since 0.50) is a document\n * server CONNECTED under External services - \"install it and restart\" sent an\n * administrator looking for a LibreOffice package filex no longer runs.\n */\nexport function gatedNeedWords(\n  need: PluginGatedRule['needs'],\n  t: (key: string, vars?: Record<string, string | number>) => string,\n): string {\n  switch (need.kind) {\n    case 'engine':\n      return t('plugin.needs_engine', { name: need.name });\n    case 'office':\n      return t('plugin.needs_office', { name: need.name });\n  }\n  return t('plugin.needs_other', { name: need.name });\n}\n\n/** The menu key for an action row: the server's, or `plugin:<plugin>/<id>`. */\nexport function pluginActionKey(a: Pick<PluginActionRow, 'plugin' | 'id' | 'key'>): string {\n  return a.key || `plugin:${a.plugin}/${a.id}`;\n}\n\n/** Whether a menu key names a plugin action. */\nexport function isPluginActionKey(key: string): boolean {\n  return key.startsWith('plugin:');\n}\n\n/**\n * Whether running the action writes next to or over its file: its manifest\n * output is `sibling` (a new file beside it) or `version` (a new version of\n * it), or its rule says the flow ends in a write (`applies.writable`). Read\n * by `pluginActionNeed` (writing needs `editor`).\n */\nexport function pluginActionWrites(a: Pick<PluginActionRow, 'output_mode'> & { applies?: Pick<PluginActionRow['applies'], 'writable'> }): boolean {\n  return a.output_mode === 'sibling' || a.output_mode === 'version' || a.applies?.writable === true;\n}\n\n/**\n * Not offered on a read-only storage: the SERVER's answer, sent on every\n * action row as `read_only_ok` (wasmplugin.OffersOnReadOnly — the rule the\n * run itself applies in handlers/app_plugins.go `authorise`).\n *\n * ⚠⚠ Why the menu asks at all (QA, 2026-09-21): on a read-only drive\n * \"Dönüştür…\", \"İmzala…\" and \"İmza iste…\" were all offered, and the first\n * one answered the click with a 409 and a toast that was gone in 2.5 s — for\n * the person it did nothing. An action that can only be refused is not\n * offered, the same rule the built-in verbs follow.\n *\n * ⚠⚠ Why it is the server's answer and not worked out here (0.54, #212): the\n * menu used to rebuild the rule from `output_mode` and `output_elsewhere`, and\n * offered every \"elsewhere\" action — the run lets one through only when it\n * opens a screen that asks where the result goes, so an elsewhere action with\n * no screen was offered and refused. A row from a server that does not send\n * the answer is offered; the run decides either way.\n */\nfunction refusedReadOnly(a: PluginActionRow): boolean {\n  return a.read_only_ok === false;\n}\n\nconst LEVEL_RANK: Record<string, number> = { none: 0, viewer: 1, editor: 2, owner: 3 };\n\n/**\n * The level a caller needs on every input to run the action — the server's\n * `pluginACLNeed` (handlers/app_plugins.go), mirrored: `viewer` to read,\n * `editor` once the job writes its result back, and whatever higher floor the\n * manifest's `min_role` declares.\n *\n * ⚠⚠ Why the menu asks (v0.43.0 wave 2, 2026-09-22): the menu never read\n * `min_role` at all. A person granted `viewer` on an RBAC storage was offered\n * \"Dönüştür…\", \"İmzala…\" and \"İmza iste…\" on every file there, and each one\n * answered the click with `403 insufficient permission` — the same \"offered,\n * then refused\" the read-only rule above already removed. The built-in verbs\n * follow the level (Rename / Delete are not in a viewer's menu); the app's\n * rows now do too.\n */\nexport function pluginActionNeed(a: Pick<PluginActionRow, 'output_mode' | 'min_role'>): 'viewer' | 'editor' | 'owner' {\n  if (a.min_role === 'owner') return 'owner';\n  if (a.min_role === 'editor' || pluginActionWrites(a)) return 'editor';\n  return 'viewer';\n}\n\n/**\n * Whether the caller's level on `node` lets them run `a`.\n *\n * ⚠ A row the SAME app has locked is not judged by its listed level: the\n * listing caps a locked file at `viewer` for everyone (app_plugins_badges.go),\n * which is the lock speaking, not the person's grant — and the app holding it\n * is exactly the one that must still reach it (\"Sign / Fill\" on a document\n * frozen while signatures are collected). The server decides that row.\n */\nfunction levelAllows(a: PluginActionRow, node: PluginMenuNode, permOf: (n: PluginMenuNode) => string | undefined): boolean {\n  if (node.lock?.plugin && node.lock.plugin === a.plugin) return true;\n  const level = permOf(node);\n  if (level === undefined || !(level in LEVEL_RANK)) return true;\n  return LEVEL_RANK[level] >= LEVEL_RANK[pluginActionNeed(a)];\n}\n\n/** The action rows whose rule accepts this selection. */\nexport function pluginActionsFor(\n  actions: readonly PluginActionRow[],\n  selection: readonly AppliesNodeLike[],\n): PluginActionRow[] {\n  if (selection.length === 0) return [];\n  // ⚠ `a.plugin` is not decoration: `applies.state` names the plugin's OWN\n  // keys while the rows carry them namespaced, so the matcher has to know\n  // whose keys to look for (lib/pluginApplies → stateKeysOf).\n  return actions.filter((a) => appliesToNodes(a.applies, selection as AppliesNodeLike[], a.plugin));\n}\n\n/**\n * Menu rows for a selection, or `[]`.\n *\n * ONE GROUP PER APP, each behind its own divider. The first divider keeps its\n * old key, `sep-plugins`, so the block still reads as its own group under\n * Tags; every further app opens with `sep-plugin:<plugin>`.\n *\n * ⚠⚠ Why per app and not one block. The owner, 2026-09-21, looking at a PDF's\n * right-click menu with the converter and the signing app both installed:\n * \"dönüştür ve imzalama pluginlerinin menüleri — yani her plugin'in menüleri —\n * arasına çizgi çekelim\". Eight rows from two apps in one undivided run read\n * as one app's vocabulary, and \"Convert to DOCX\" sitting directly above\n * \"Request signatures\" invited the question of which app would do what. The\n * divider is the menu's own mechanism (`ContextAction.divider`), so the right\n * click, the selection bar's \"⋯\" and the ⋮ all draw the same lines, and\n * `ContextMenu` still collapses a divider that ends up leading, trailing or\n * doubled.\n *\n * ⚠ Grouped by `plugin`, in the order each app's FIRST row arrived — not\n * alphabetically and not by re-sorting the rows. The server lists an app's\n * actions in manifest order and the app author chose that order; a stable\n * grouping keeps it inside each app and only pulls apart rows that were\n * interleaved (which the server does not do today, but a grouping that\n * depended on it would break silently the day it did).\n */\nexport function pluginMenuRows(\n  actions: readonly PluginActionRow[],\n  selection: readonly PluginMenuNode[],\n  ctx: PluginMenuContext,\n): PluginMenuRow[] {\n  if (ctx.trash || ctx.e2e) return [];\n  if (selection.some((n) => n.e2e === true || n.mime_type === 'inode/storage')) return [];\n  const permOf = ctx.permOf;\n  const allowed = (a: PluginActionRow) =>\n    !(ctx.readOnly && refusedReadOnly(a)) && (!permOf || selection.every((n) => levelAllows(a, n, permOf)));\n  const offered = pluginActionsFor(actions, selection).filter(allowed);\n  // ⚠ Greyed WITH the reason — the owner's rule for anything that depends on\n  // how the server is set up (\"not configured → disabled with the reason for\n  // administrators, hidden for everybody else\"). The server sends `gated`\n  // to administrators only; here a row the selection would take once the\n  // missing piece is installed is drawn disabled, saying what is missing\n  // (\"FFmpeg is not installed on this server\", \"Office documents need\n  // ONLYOFFICE, which is not connected to this server\").\n  const greyed = new Map<PluginActionRow, string>();\n  if (ctx.needWords) {\n    for (const a of actions) {\n      if (offered.includes(a) || !a.gated?.length || !allowed(a)) continue;\n      const gate = a.gated.find((g) =>\n        appliesToNodes({ ...a.applies, ext: g.ext ?? [], mime: [] }, selection as AppliesNodeLike[], a.plugin),\n      );\n      if (gate) greyed.set(a, ctx.needWords(gate.needs));\n    }\n  }\n  const rows = actions.filter((a) => offered.includes(a) || greyed.has(a));\n  if (rows.length === 0) return [];\n  const hasIcon = ctx.hasIcon ?? (() => false);\n  const byApp = new Map<string, PluginActionRow[]>();\n  for (const a of rows) {\n    const list = byApp.get(a.plugin);\n    if (list) list.push(a);\n    else byApp.set(a.plugin, [a]);\n  }\n  const out: PluginMenuRow[] = [];\n  let first = true;\n  for (const [plugin, list] of byApp) {\n    out.push({ divider: true, key: first ? 'sep-plugins' : `sep-plugin:${plugin}`, label: '' });\n    first = false;\n    for (const a of list) {\n      const why = greyed.get(a);\n      out.push({\n        key: pluginActionKey(a),\n        label: labelOf(a.label, ctx.locale),\n        icon: a.icon && hasIcon(a.icon) ? a.icon : 'plugin',\n        danger: a.danger === true,\n        ...(why ? { disabled: true, title: why } : {}),\n      });\n    }\n  }\n  return out;\n}\n","/**\n * usePluginActions — the file-menu rows app plugins add, and how to run one.\n *\n * `GET /api/files/plugins/actions` is fetched once per endpoint URL and\n * shared by every explorer instance on the page (the admin explorer, a split\n * pane, an embedded web component all ask the same server), and re-asked\n * after five minutes — the contract's client cache. Nothing is requested\n * until `enabled()` says so: with `capabilities.app_plugins.enabled` false the\n * explorer makes zero plugin calls.\n *\n * The composable holds no menu logic of its own: which rows a selection gets\n * is `lib/pluginMenu`, the rule is `lib/pluginApplies`, both pure.\n */\nimport { computed, ref, watch, type Ref } from 'vue';\nimport type { FileApi } from './useFileApi';\nimport type { FileNode } from '../types/FileNode';\nimport type { OpenRule, PluginActionRow, PluginActionsResponse, PluginRunResult, PluginViewRow } from '../types/Plugins';\nimport { pluginActionsFor, pluginActionKey } from '../lib/pluginMenu';\n\nexport const PLUGIN_ACTIONS_TTL_MS = 5 * 60 * 1000;\n\ninterface CacheEntry {\n  at: number;\n  data: Ref<PluginActionsResponse>;\n  inflight: Promise<PluginActionsResponse> | null;\n}\n\n/** One entry per actions URL, shared across every instance on the page. */\nconst cache = new Map<string, CacheEntry>();\n\n/** Forget every cached answer — tests, and a host that just installed a plugin. */\nexport function invalidatePluginActions(): void {\n  cache.clear();\n}\n\nfunction entryFor(url: string): CacheEntry {\n  let e = cache.get(url);\n  if (!e) {\n    e = { at: 0, data: ref<PluginActionsResponse>({ actions: [], views: [] }), inflight: null };\n    cache.set(url, e);\n  }\n  return e;\n}\n\nexport function usePluginActions(api: FileApi, enabled: () => boolean) {\n  const url = api.endpoints.pluginActions ?? '';\n  const entry = entryFor(url || '(none)');\n  const loaded = ref(false);\n  const error = ref<string | null>(null);\n\n  const isEnabled = computed(() => enabled() && url !== '');\n\n  const actions = computed<PluginActionRow[]>(() => (isEnabled.value ? entry.data.value.actions : []));\n  const views = computed<PluginViewRow[]>(() => (isEnabled.value ? entry.data.value.views : []));\n  /** 0.50 - the administrator's open rules, by kind (lib/appViewer applies them). */\n  const openRules = computed<Record<string, OpenRule>>(() => (isEnabled.value ? (entry.data.value.open_rules ?? {}) : {}));\n\n  /** Fetch (or reuse the shared answer) — a no-op while the feature is off. */\n  async function refresh(force = false): Promise<PluginActionsResponse> {\n    if (!isEnabled.value) return { actions: [], views: [] };\n    const fresh = entry.at > 0 && Date.now() - entry.at < PLUGIN_ACTIONS_TTL_MS;\n    if (fresh && !force) {\n      loaded.value = true;\n      return entry.data.value;\n    }\n    if (entry.inflight) return entry.inflight;\n    entry.inflight = api\n      .pluginActions()\n      .then((res) => {\n        entry.data.value = { actions: res.actions ?? [], views: res.views ?? [], open_rules: res.open_rules ?? {} };\n        entry.at = Date.now();\n        error.value = null;\n        return entry.data.value;\n      })\n      .catch((e: unknown) => {\n        error.value = String((e as Error)?.message ?? e);\n        return entry.data.value;\n      })\n      .finally(() => {\n        entry.inflight = null;\n        loaded.value = true;\n      });\n    return entry.inflight;\n  }\n\n  // The first time the feature turns on (capabilities answered), ask once.\n  watch(\n    isEnabled,\n    (on) => {\n      if (on) void refresh();\n    },\n    { immediate: true },\n  );\n\n  /** Action rows whose rule accepts this selection. */\n  function actionsFor(selection: FileNode[]): PluginActionRow[] {\n    return pluginActionsFor(actions.value, selection);\n  }\n\n  /** The action row behind a menu key, if any. */\n  function byKey(key: string): PluginActionRow | undefined {\n    return actions.value.find((a) => pluginActionKey(a) === key);\n  }\n\n  /**\n   * Run an action on wire paths. `{op}` when the server queued a job, or\n   * `{surface}` when the action opens a view first.\n   */\n  function run(\n    action: PluginActionRow,\n    targets: FileNode[],\n    params?: Record<string, unknown>,\n  ): Promise<PluginRunResult> {\n    return api.pluginActionRun(action.plugin, action.id, {\n      paths: targets.map((n) => n.path),\n      params,\n    });\n  }\n\n  return { enabled: isEnabled, actions, views, openRules, loaded, error, refresh, actionsFor, byKey, run };\n}\n\nexport type PluginActionsStore = ReturnType<typeof usePluginActions>;\n","// Realtime (WebSocket) client for filex live collaboration, bundled into the\n// core explorer so EVERY consumer — the native panel AND the vendored\n// webcomponent embedded in host apps — gets live folder updates + presence.\n//\n// Auth: the browser's native WebSocket can't set an Authorization header and,\n// when embedded, connects cross-origin to fm.example.com. So instead of a header we\n// fetch a short-lived, single-use TICKET through the host's normal API (which\n// injects the real token server-side) and open `wss://…/api/ws?ticket=<t>`.\n// The durable token never reaches the browser.\n//\n// Degradation: if the ticket or the socket is unavailable (old backend, blocked\n// upgrade, unsupported env), `onFallback(true)` fires so the consumer can fall\n// back to plain API polling. The page always keeps working — every send is\n// guarded, connect() is wrapped, reconnects are capped.\n\nexport interface PresenceUser {\n  id: number;\n  /** Stable identity key from the server (user id + optional per-end-user\n   *  presence key). Distinguishes end users sharing one proxy token — use it\n   *  for list keys and colours instead of `id`. */\n  uid?: string;\n  name: string;\n  file?: string;\n  /** Profile picture (a small data: URI, or a URL) for this person, when their\n   *  filex account has one. Absent → the strip draws initials, as it always\n   *  did. Set from the ACCOUNT, so a session, the desktop app and any API key\n   *  minted under the same user all show the same face. */\n  avatar?: string;\n}\n\nexport interface ChangeMessage {\n  type: 'change';\n  path: string;\n  action: string; // create | delete | rename | move | upload | modify\n  name?: string;\n  new_name?: string;\n}\n\nexport interface PresenceMessage {\n  type: 'presence';\n  path: string;\n  users: PresenceUser[];\n}\n\n/**\n * wiring:e2 vault - a vault committed a generation, or its write lock changed\n * hands (docs/E2E-VAULT-FORMAT.md → \"Audit and events\"). `path` is the vault\n * folder's wire path; nothing below it is ever named.\n */\nexport interface VaultMessage {\n  type: 'vault.generation' | 'vault.lock';\n  path: string;\n  generation?: number;\n  held?: boolean;\n  holder?: { name?: string; client?: string; label?: string } | null;\n}\n\n/** An app's approved version changed (instance-wide, not about any folder). */\nexport interface AppUpdatedMessage {\n  type: 'app.updated';\n  app: string;\n  version: string;\n}\n\n/**\n * #196 - what this person may do may have changed: a grant, a role, a group, a\n * permission rule, the tenant's encryption policy or an approval. The explorer\n * asks the answers its menus depend on again (lib/menuAnswers). It names no\n * path, no person and no reason; `scope: 'all'` says everybody connected was\n * told (a change whose people the server did not look up), so the explorers\n * spread their questions over a moment.\n */\nexport interface AccessChangedMessage {\n  type: 'access.changed';\n  scope?: 'all';\n}\n\nexport interface WsTicket {\n  ticket: string;\n  ws_url: string;\n}\n\nexport interface RealtimeHandlers {\n  onChange?: (msg: ChangeMessage) => void;\n  onPresence?: (msg: PresenceMessage) => void;\n  onAppUpdated?: (msg: AppUpdatedMessage) => void;\n  /** wiring:e2 vault */\n  onVault?: (msg: VaultMessage) => void;\n  /** #196 - `all`: everybody connected heard it, not only this person. */\n  onAccessChanged?: (ev: { all: boolean }) => void;\n  onStatus?: (connected: boolean) => void;\n  /** Fires true when the live socket is unavailable (consumer should poll),\n   *  false when a live socket is (re)established. */\n  onFallback?: (active: boolean) => void;\n}\n\nexport interface RealtimeOptions {\n  /** Fetch a fresh ticket (single-use) via the host API. null → no live socket. */\n  getTicket: () => Promise<WsTicket | null>;\n  handlers: RealtimeHandlers;\n}\n\nconst PING_INTERVAL_MS = 25_000;\nconst MAX_BACKOFF_MS = 15_000;\nconst MAX_RETRIES = 6;\n\nexport class RealtimeClient {\n  private ws: WebSocket | null = null;\n  private opts: RealtimeOptions;\n  private closed = false;\n  private connecting = false;\n  private retries = 0;\n  private fallback = false;\n  private pingTimer: ReturnType<typeof setInterval> | null = null;\n  private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n  // Last-known intent, replayed on (re)connect.\n  private currentPath: string | null = null;\n  private currentFocus: string | null = null;\n\n  constructor(opts: RealtimeOptions) {\n    this.opts = opts;\n    void this.connect();\n  }\n\n  /** Subscribe to a folder (\"<adapter>://<dir>\"). Swaps the active room and\n   *  resets focus. Passing null unsubscribes (drive list / trash have no room). */\n  subscribe(path: string | null): void {\n    this.currentPath = path;\n    this.currentFocus = null;\n    if (path) this.send({ type: 'subscribe', path });\n  }\n\n  /** Report the file the user is focused on (or null to clear). */\n  setFocus(file: string | null): void {\n    this.currentFocus = file;\n    this.send({ type: 'focus', file });\n  }\n\n  /** Tear down permanently — call on unmount. */\n  close(): void {\n    this.closed = true;\n    this.clearTimers();\n    this.dropSocket();\n  }\n\n  private async connect(): Promise<void> {\n    if (this.closed || this.connecting || this.ws) return;\n    this.connecting = true;\n    let ticket: WsTicket | null = null;\n    try {\n      ticket = await this.opts.getTicket();\n    } catch {\n      ticket = null;\n    }\n    this.connecting = false;\n    if (this.closed) return;\n    if (!ticket || !ticket.ticket || !ticket.ws_url) {\n      this.fail();\n      return;\n    }\n\n    const sep = ticket.ws_url.includes('?') ? '&' : '?';\n    let ws: WebSocket;\n    try {\n      ws = new WebSocket(`${ticket.ws_url}${sep}ticket=${encodeURIComponent(ticket.ticket)}`);\n    } catch {\n      this.fail();\n      return;\n    }\n    this.ws = ws;\n\n    ws.onopen = () => {\n      this.retries = 0;\n      this.setFallback(false);\n      this.opts.handlers.onStatus?.(true);\n      if (this.currentPath) this.send({ type: 'subscribe', path: this.currentPath });\n      if (this.currentFocus !== null) this.send({ type: 'focus', file: this.currentFocus });\n      this.startPing();\n    };\n\n    ws.onmessage = (ev: MessageEvent) => {\n      let msg: unknown;\n      try {\n        msg = JSON.parse(typeof ev.data === 'string' ? ev.data : '');\n      } catch {\n        return;\n      }\n      const m = msg as { type?: string };\n      if (m?.type === 'change') this.opts.handlers.onChange?.(msg as ChangeMessage);\n      else if (m?.type === 'presence') this.opts.handlers.onPresence?.(msg as PresenceMessage);\n      else if (m?.type === 'app.updated') {\n        const a = msg as Partial<AppUpdatedMessage>;\n        if (typeof a.app === 'string' && typeof a.version === 'string') this.opts.handlers.onAppUpdated?.(a as AppUpdatedMessage);\n      } else if (m?.type === 'vault.generation' || m?.type === 'vault.lock') {\n        const v = msg as Partial<VaultMessage>;\n        if (typeof v.path === 'string') this.opts.handlers.onVault?.(v as VaultMessage);\n      } else if (m?.type === 'access.changed') {\n        this.opts.handlers.onAccessChanged?.({ all: (msg as Partial<AccessChangedMessage>).scope === 'all' });\n      }\n      // pong / error frames are intentionally ignored by the UI.\n    };\n\n    ws.onerror = () => {\n      // onclose fires next; reconnect is handled there.\n    };\n\n    ws.onclose = () => {\n      this.stopPing();\n      this.ws = null;\n      this.opts.handlers.onStatus?.(false);\n      this.fail();\n    };\n  }\n\n  // fail schedules a capped reconnect; after MAX_RETRIES it gives up on the live\n  // socket and flips to fallback (polling) mode.\n  private fail(): void {\n    if (this.closed || this.reconnectTimer) return;\n    if (this.retries >= MAX_RETRIES) {\n      this.setFallback(true);\n      return;\n    }\n    const delay = Math.min(1000 * 2 ** this.retries, MAX_BACKOFF_MS);\n    this.retries += 1;\n    this.reconnectTimer = setTimeout(() => {\n      this.reconnectTimer = null;\n      void this.connect();\n    }, delay);\n  }\n\n  private setFallback(active: boolean): void {\n    if (this.fallback === active) return;\n    this.fallback = active;\n    this.opts.handlers.onFallback?.(active);\n  }\n\n  private send(obj: unknown): void {\n    const ws = this.ws;\n    if (!ws || ws.readyState !== WebSocket.OPEN) return;\n    try {\n      ws.send(JSON.stringify(obj));\n    } catch {\n      /* a failed send just means a missed live update */\n    }\n  }\n\n  private startPing(): void {\n    this.stopPing();\n    this.pingTimer = setInterval(() => this.send({ type: 'ping' }), PING_INTERVAL_MS);\n  }\n\n  private stopPing(): void {\n    if (this.pingTimer) {\n      clearInterval(this.pingTimer);\n      this.pingTimer = null;\n    }\n  }\n\n  private dropSocket(): void {\n    if (this.ws) {\n      try {\n        this.ws.onclose = null; // suppress reconnect\n        this.ws.close();\n      } catch {\n        /* ignore */\n      }\n      this.ws = null;\n    }\n  }\n\n  private clearTimers(): void {\n    this.stopPing();\n    if (this.reconnectTimer) {\n      clearTimeout(this.reconnectTimer);\n      this.reconnectTimer = null;\n    }\n  }\n}\n","// burstDebounce: a trailing debounce that cannot be starved.\n//\n// The explorer re-lists a folder when a change frame says it changed, debounced\n// so a burst of frames costs one listing instead of N. A PLAIN trailing\n// debounce has a failure mode that only shows up under a sustained stream:\n// every frame clears the pending timer, so while frames keep arriving closer\n// together than `wait`, the reload never happens at all. That is not \"one\n// reload instead of many\" — it is zero, and the person watching the folder sees\n// nothing change until the job that is writing the files finishes.\n//\n// Measured in a real browser on 2026-09-06 against a 5 000-file zip extraction\n// (frames roughly every 40 ms for 195 s): the folder's first re-listing came\n// 114 s in, with a 40 s gap after it.\n//\n// `maxWait` is the ceiling: however long the stream goes on, the call happens\n// at most `maxWait` after the FIRST frame of the run, and the run then starts\n// again. A quiet folder is untouched — one frame still calls `wait` later.\nexport interface BurstDebounceOptions {\n  /** Quiet period after the last call before firing. */\n  wait: number;\n  /** Ceiling from the first call of a run. Must be >= wait to mean anything. */\n  maxWait: number;\n  /** Clock, injectable for tests. */\n  now?: () => number;\n}\n\nexport interface BurstDebounced {\n  (): void;\n  /** Drop any pending call (unmount). */\n  cancel(): void;\n}\n\nexport function burstDebounce(fn: () => void, opts: BurstDebounceOptions): BurstDebounced {\n  const now = opts.now ?? (() => Date.now());\n  let timer: ReturnType<typeof setTimeout> | null = null;\n  let runStartedAt: number | null = null;\n\n  const call = () => {\n    const t = now();\n    if (runStartedAt === null) runStartedAt = t;\n    // Never later than the ceiling, never sooner than 0.\n    const untilCeiling = runStartedAt + opts.maxWait - t;\n    const delay = Math.max(0, Math.min(opts.wait, untilCeiling));\n    if (timer) clearTimeout(timer);\n    timer = setTimeout(() => {\n      timer = null;\n      runStartedAt = null;\n      fn();\n    }, delay);\n  };\n  call.cancel = () => {\n    if (timer) clearTimeout(timer);\n    timer = null;\n    runStartedAt = null;\n  };\n  return call;\n}\n","/**\n * An app's approved version changed — an administrator approved a newer one,\n * or went back to the one before (realtime `app.updated`, backend\n * realtime/apps.go). Every open AppFrame on that app hears it here and offers\n * to reload; the explorer's cached menu rows are dropped so the next opening\n * gets the new interface's address.\n *\n * ⚠ One place for every surface (explorer, app page, embeds): the frame\n * decides what to do with the notice, not the page that happens to host it.\n */\ntype Listener = (app: string, version: string) => void;\n\nconst listeners = new Set<Listener>();\n\n/** Tell every open frame that `app` now runs at `version`. */\nexport function announceAppUpdated(app: string, version: string): void {\n  for (const l of [...listeners]) {\n    try {\n      l(app, version);\n    } catch {\n      /* one frame's trouble is not the others' */\n    }\n  }\n}\n\n/** Hear it; the returned function stops hearing it. */\nexport function onAppUpdated(l: Listener): () => void {\n  listeners.add(l);\n  return () => {\n    listeners.delete(l);\n  };\n}\n","// useRealtime wires the folder-scoped live-collaboration layer (RealtimeClient)\n// into the explorer: it turns change events into a debounced soft reload, tracks\n// per-folder presence, and — when no live socket is available — falls back to\n// plain API polling so embedded/offline consumers still get near-live updates.\n//\n// The explorer calls start()/stop() on mount/unmount, subscribe() on folder\n// navigation, and setFocus() on selection; it binds presenceUsers into the UI.\n\nimport { ref, type Ref } from 'vue';\nimport { RealtimeClient, type PresenceUser, type PresenceMessage, type AppUpdatedMessage, type VaultMessage } from '../lib/realtime';\nimport { burstDebounce } from '../lib/burstDebounce';\nimport { announceAppUpdated } from '../lib/appUpdates';\nimport { invalidatePluginActions } from './usePluginActions';\n\nconst RELOAD_DEBOUNCE_MS = 200;\n// Ceiling on how long a run of change frames may postpone the reload it is\n// waiting for — see burstDebounce for the starvation this exists to stop.\n// Measured in a real browser on 2026-09-06, watching a folder while a\n// 5 000-file zip was extracted into it: the first re-listing came 114 s into\n// the job, and there was a 40 s gap in the middle.\nconst RELOAD_MAX_WAIT_MS = 2_000;\nconst POLL_INTERVAL_MS = 12_000;\n\nexport interface RealtimeApi {\n  wsTicket: () => Promise<{ ticket: string; ws_url: string } | null>;\n}\n\n/**\n * #196 - the answers a right-click menu depends on may be stale: the server\n * said so (`access.changed`; `all` when everybody connected heard it), or the\n * socket was down for a while and could have missed it (`resync`).\n */\nexport interface AccessNews {\n  all: boolean;\n  resync: boolean;\n}\n\nexport function useRealtime(\n  api: RealtimeApi,\n  opts: { reload: () => void; onVault?: (msg: VaultMessage) => void; onAccess?: (news: AccessNews) => void },\n) {\n  const presenceUsers: Ref<PresenceUser[]> = ref([]);\n  const connected = ref(false);\n  // True while the live socket is unavailable and the polling fallback is\n  // active — the explorer surfaces a small \"no live connection\" badge from it.\n  // Stays false during ordinary reconnect attempts, so brief blips don't flash\n  // the badge; only a genuinely given-up socket (RealtimeClient onFallback)\n  // flips it.\n  const degraded = ref(false);\n\n  let client: RealtimeClient | null = null;\n  let pendingSubscribe: string | null = null;\n  // #196 - a socket that comes back after a drop may have missed an\n  // access.changed frame: the explorer is told to ask again.\n  let everConnected = false;\n  const debouncedReload = burstDebounce(() => opts.reload(), {\n    wait: RELOAD_DEBOUNCE_MS,\n    maxWait: RELOAD_MAX_WAIT_MS,\n  });\n  let pollTimer: ReturnType<typeof setInterval> | null = null;\n\n  function onPresence(msg: PresenceMessage): void {\n    // Ignore late frames for a folder we've already navigated away from.\n    if (pendingSubscribe && msg.path && msg.path !== pendingSubscribe) return;\n    presenceUsers.value = Array.isArray(msg.users) ? msg.users : [];\n  }\n\n  /** An app's approved version changed: the cached menu rows carry the old\n   *  interface's address, and an open frame on it offers to reload. */\n  function onAppUpdated(msg: AppUpdatedMessage): void {\n    invalidatePluginActions();\n    announceAppUpdated(msg.app, msg.version);\n  }\n\n  function onFallback(active: boolean): void {\n    degraded.value = active;\n    if (active) {\n      // No live socket → poll the listing; presence isn't available here.\n      presenceUsers.value = [];\n      if (!pollTimer) pollTimer = setInterval(() => opts.reload(), POLL_INTERVAL_MS);\n    } else if (pollTimer) {\n      clearInterval(pollTimer);\n      pollTimer = null;\n    }\n  }\n\n  function start(): void {\n    if (client) return;\n    client = new RealtimeClient({\n      getTicket: () => api.wsTicket(),\n      handlers: {\n        onChange: debouncedReload,\n        onPresence,\n        onAppUpdated,\n        onVault: (msg) => opts.onVault?.(msg) /* wiring:e2 vault */,\n        onAccessChanged: (ev) => opts.onAccess?.({ all: ev.all, resync: false }) /* #196 */,\n        onFallback,\n        onStatus: (c) => {\n          connected.value = c;\n          if (c && everConnected) opts.onAccess?.({ all: false, resync: true });\n          if (c) everConnected = true;\n        },\n      },\n    });\n  }\n\n  function subscribe(wire: string | null): void {\n    presenceUsers.value = []; // drop the previous folder's roster immediately\n    pendingSubscribe = wire;\n    client?.subscribe(wire);\n  }\n\n  function setFocus(file: string | null): void {\n    client?.setFocus(file);\n  }\n\n  function stop(): void {\n    debouncedReload.cancel();\n    if (pollTimer) {\n      clearInterval(pollTimer);\n      pollTimer = null;\n    }\n    client?.close();\n    client = null;\n    everConnected = false;\n    degraded.value = false;\n  }\n\n  return { presenceUsers, connected, degraded, start, subscribe, setFocus, stop };\n}\n","// useThumbs — authenticated thumbnail loader for the folder views.\n//\n// The backend emits `thumb_url` as a ROOT-RELATIVE path (\"/api/files/thumb/{id}\").\n// A plain `<img src>` only works for the native same-origin SPA: an embedded\n// webcomponent resolves it against the HOST page's origin (work.example.com → 404)\n// and, even with the URL fixed, `<img>` cannot carry the bearer header a\n// proxied host (fishapp PWA) requires. So thumbs are fetched through the same\n// auth machinery as every API call (headers + credentials), cached as object\n// URLs, and handed to the views; a failed fetch falls back to the file icon.\n//\n// ⚠⚠ An arrival wakes ONE tile. The object URLs used to live in one reactive\n// record that was REPLACED as each thumbnail arrived, so every arrival woke\n// everything that had read any thumbnail — the whole folder view, which read\n// them all. Field report: a folder of 344 files (~240 thumbnails) re-rendered\n// itself ~240 times in a few seconds; a fast Mac lost ~4 s, a slower Windows PC\n// froze Edge for ~30 s and ran a Chrome tab out of memory. The cache is now a\n// reactive Map read per key, and the views read it through ThumbTile (one\n// component per tile), so an arrival re-renders the tile that shows it.\n//\n// ⚠ Keyed by picture, not by URL. `thumb_url` carries a signature whose expiry\n// moves every hour; keyed by URL, the first listing after the hour turned\n// fetched every thumbnail of the folder again. The key is the URL's path, its\n// `v` (the render's time, 0.50) and the file's `last_modified`: a rotated\n// signature is the same picture; an edited file, or the same file drawn again\n// because its old picture was stale, is not.\n\nimport { shallowReactive, toRaw } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport { underApiBase } from '../lib/appBase';\n\ninterface ThumbApiSlice {\n  authHeaders: (extra?: Record<string, string>) => Promise<Record<string, string>>;\n  credentialsMode: () => RequestCredentials;\n}\n\n/** Cap the object-URL cache; beyond it oldest entries are revoked. Thumbs are\n *  small (~KBs) so this is generous while still bounding a long session. */\nconst MAX_CACHED = 500;\n\n/** The cache key for a node's thumbnail — null when it has none. */\nfunction thumbKey(n: FileNode): string | null {\n  const raw = n.thumb_url;\n  if (!raw) return null;\n  const q = raw.indexOf('?');\n  if (q === -1) return `${raw}||${n.last_modified ?? ''}`;\n  const v = new URLSearchParams(raw.slice(q + 1)).get('v') ?? '';\n  return `${raw.slice(0, q)}|${v}|${n.last_modified ?? ''}`;\n}\n\nexport function useThumbs(apiBase: string | undefined, api: ThumbApiSlice) {\n  const cache = shallowReactive(new Map<string, string>());\n  const order: string[] = [];\n  /** Signed URLs that failed. Per URL, not per key: 404 (thumb evicted\n   *  server-side) or an auth hiccup is not retried within the session, but a\n   *  freshly signed URL for the same picture may be tried once. */\n  const failed = new Set<string>();\n  /** Keys being fetched — one request per picture however many URLs name it. */\n  const pending = new Set<string>();\n\n  // `thumb_url` is relative to the SERVER ROOT, which is the API base (lib/appBase).\n  const resolveUrl = (raw: string): string => underApiBase(apiBase, raw);\n\n  /** Reactive, per node: returns the loaded object URL for the node's thumb,\n   *  kicking off the fetch on first sight. null = not (yet) available → show\n   *  the icon. Only what read THIS node's key is woken when it arrives. */\n  function src(n: FileNode): string | null {\n    const raw = n.thumb_url;\n    const key = thumbKey(n);\n    if (!raw || !key) return null;\n    const got = cache.get(key);\n    if (got) return got;\n    if (!failed.has(raw) && !pending.has(key)) void load(raw, key);\n    return null;\n  }\n\n  async function load(raw: string, key: string): Promise<void> {\n    pending.add(key);\n    try {\n      const res = await fetch(resolveUrl(raw), {\n        headers: await api.authHeaders({ Accept: '*/*' }),\n        credentials: api.credentialsMode(),\n      });\n      if (!res.ok) throw new Error(String(res.status));\n      const blob = await res.blob();\n      if (order.length >= MAX_CACHED) {\n        // ⚠ Dropped without a word to the tile still showing it: woken, the\n        // tile would fetch it again, and that arrival would drop the next\n        // oldest — past MAX_CACHED thumbnails on screen, a loop that never\n        // ends. Its <img> has long loaded, and a loaded image outlives its\n        // revoked URL; a tile drawn later asks again, once.\n        const evict = order.shift();\n        const store = toRaw(cache);\n        const old = evict ? store.get(evict) : undefined;\n        if (evict && old) {\n          URL.revokeObjectURL(old);\n          store.delete(evict);\n        }\n      }\n      order.push(key);\n      cache.set(key, URL.createObjectURL(blob));\n    } catch {\n      failed.add(raw);\n    } finally {\n      pending.delete(key);\n    }\n  }\n\n  return { src };\n}\n","/**\n * useMonacoLoader — fire-and-forget Monaco preloader.\n *\n * The preview/edit flow wants Monaco when available (best-in-class\n * editor) and highlight.js for read-only syntax colour as a graceful\n * fallback. Monaco is heavy (~5 MB), so we kick off the dynamic import\n * at module-init time — by the time the user clicks \"edit\" on a code\n * file (typically several seconds in), the chunk is already cached.\n *\n *   - `monacoPromise`     resolves to the Monaco namespace, or `null`\n *                         if the package is not installed (peer\n *                         missing) / load fails.\n *   - `highlightPromise`  resolves to the highlight.js export, or\n *                         `null` similarly.\n *   - `getMonaco()`       returns the cached module synchronously\n *                         (after `await monacoPromise`) so a click\n *                         handler doesn't re-trigger the import.\n *\n * Both modules are externalized in the bundler config — the consumer\n * either declares them as direct deps (Monaco UX) or doesn't (the\n * highlight.js read-only path takes over). No build-time hard dep here.\n */\n\nlet monacoPromise: Promise<unknown | null> | null = null;\nlet highlightPromise: Promise<unknown | null> | null = null;\nlet monacoCached: unknown | null = null;\nlet highlightCached: unknown | null = null;\n\n/**\n * Kick off the Monaco import the first time someone calls\n * `preloadEditor()` (typically the FileExplorer onMounted hook). Cheap\n * to call repeatedly — only the first call actually triggers the\n * dynamic import.\n */\nexport function preloadEditor(): void {\n  if (!monacoPromise) {\n    monacoPromise = import(/* @vite-ignore */ 'monaco-editor')\n      .then((mod) => {\n        monacoCached = (mod as { default?: unknown }).default ?? mod;\n        return monacoCached;\n      })\n      .catch(() => {\n        monacoCached = null;\n        return null;\n      });\n  }\n  if (!highlightPromise) {\n    highlightPromise = import(/* @vite-ignore */ 'highlight.js/lib/common')\n      .then((mod) => {\n        highlightCached = (mod as { default?: unknown }).default ?? mod;\n        return highlightCached;\n      })\n      .catch(() => {\n        highlightCached = null;\n        return null;\n      });\n  }\n}\n\n/**\n * Resolve Monaco. If preload hasn't been kicked off yet, this triggers\n * it (and pays the load cost on the spot). Returns `null` when the\n * package isn't installed.\n */\nexport async function ensureMonaco(): Promise<unknown | null> {\n  if (!monacoPromise) preloadEditor();\n  return monacoPromise!;\n}\n\nexport async function ensureHighlight(): Promise<unknown | null> {\n  if (!highlightPromise) preloadEditor();\n  return highlightPromise!;\n}\n\n/** Synchronous cached lookup — null if Monaco not yet ready or absent. */\nexport function getMonaco(): unknown | null {\n  return monacoCached;\n}\n\nexport function getHighlight(): unknown | null {\n  return highlightCached;\n}\n\n/**\n * Composable wrapper — components that want reactive \"is Monaco ready\n * yet?\" semantics can read the resolved promise. The implementation is\n * intentionally tiny: components don't need anything fancier than\n * `await ensureMonaco()` inside the click handler.\n */\nexport function useMonacoLoader() {\n  preloadEditor();\n  return {\n    ensureMonaco,\n    ensureHighlight,\n    getMonaco,\n    getHighlight,\n  };\n}\n","<script setup lang=\"ts\">\n// One person's circle in the presence strip: their profile picture when the\n// account has one, their initials when it does not.\n//\n// It is its own component because the strip draws the same circle twice (the\n// compact overlapping row and the expanded name chips). Written inline in both\n// places, the photo would sooner or later appear in one and not the other —\n// which is exactly the kind of split this codebase keeps paying for.\n\nimport { computed, ref } from 'vue';\nimport type { PresenceUser } from '../lib/realtime';\n\nconst props = defineProps<{\n  user: PresenceUser;\n  /** Tooltip; omitted in contexts where the surrounding chip already names the\n   *  person. */\n  title?: string;\n}>();\n\n// Only sources a browser will actually render. The value comes off the socket\n// (an account's stored avatar, or one a trusted host proxy stamped for its own\n// end user), so anything unexpected stays initials instead of a broken frame.\nconst src = computed(() => {\n  const v = (props.user.avatar ?? '').trim();\n  return /^(data:image\\/|https?:\\/\\/|\\/)/.test(v) ? v : '';\n});\n\n// A picture that fails to load falls back to initials rather than an empty hole.\nconst failed = ref(false);\nconst showPhoto = computed(() => !!src.value && !failed.value);\n\nconst initials = computed(() => {\n  const parts = props.user.name.trim().split(/\\s+/).filter(Boolean);\n  if (parts.length === 0) return '?';\n  if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n  return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n});\n\n// Deterministic hue per identity so the same person keeps the same colour.\n// Behind a photo it is only the ring/backdrop, so it stays either way.\nconst hue = computed(() => {\n  const s = props.user.uid ?? String(props.user.id);\n  let h = 0;\n  for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) >>> 0;\n  return h % 360;\n});\n</script>\n\n<template>\n  <span\n    class=\"fx-presence-avatar\"\n    :class=\"{ 'fx-presence-avatar--photo': showPhoto }\"\n    :style=\"{ backgroundColor: `hsl(${hue} 60% 45%)` }\"\n    :title=\"title\"\n  >\n    <img v-if=\"showPhoto\" class=\"fx-presence-photo\" :src=\"src\" :alt=\"user.name\" @error=\"failed = true\" />\n    <template v-else>{{ initials }}</template>\n    <span v-if=\"user.file\" class=\"fx-presence-dot\" aria-hidden=\"true\"></span>\n  </span>\n</template>\n","<script setup lang=\"ts\">\n// PresenceBar — compact avatar strip showing who else is viewing the current\n// folder, and (as a small badge) which file each person is focused on. The\n// server already excludes the recipient from the roster (presence answers\n// \"who ELSE is here\"); the optional selfId filter remains as a belt-and-braces\n// for older backends. Purely presentational; the live data comes from the\n// realtime presence stream.\n\nimport { computed, ref } from 'vue';\nimport type { PresenceUser } from '../lib/realtime';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport PresenceAvatar from './PresenceAvatar.vue';\nimport { resolveLocale } from '../locales/resolve';\n\nconst props = defineProps<{\n  users: PresenceUser[];\n  selfId?: number | null;\n  locale?: LocaleCode;\n}>();\n\nconst { t } = useLocale(() => resolveLocale(props.locale));\n\nconst others = computed(() =>\n  (props.users ?? []).filter((u) => props.selfId == null || u.id !== props.selfId),\n);\n\n// Compact (avatar strip) ⇄ expanded (scrollable name chips). With many users\n// the strip collapses to \"+N\", so the expanded mode is how you actually READ\n// who is here; the choice sticks for the session via localStorage.\nconst EXPAND_KEY = 'filex.presence.expanded';\nconst expanded = ref<boolean>((() => {\n  try {\n    return localStorage.getItem(EXPAND_KEY) === '1';\n  } catch {\n    return false;\n  }\n})());\nfunction toggleExpanded(): void {\n  expanded.value = !expanded.value;\n  try {\n    localStorage.setItem(EXPAND_KEY, expanded.value ? '1' : '0');\n  } catch {\n    /* private mode — session-only */\n  }\n}\n\n// Stable key per identity: end users behind one shared proxy token have the\n// same numeric id but distinct server-issued uids.\nfunction keyOf(u: PresenceUser): string {\n  return u.uid ?? String(u.id);\n}\n\n// The circle itself (photo or initials, colour, focus dot) lives in\n// PresenceAvatar so the compact strip and the expanded chips cannot drift.\n\nfunction label(u: PresenceUser): string {\n  return u.file ? `${u.name} · ${u.file}` : u.name;\n}\n</script>\n\n<template>\n  <div v-if=\"others.length\" class=\"fx-presence\" :class=\"{ 'fx-presence--wide': expanded }\">\n    <!-- Expanded: every user as an avatar+name chip in a horizontally\n         scrollable row — names stay fully readable however many join. -->\n    <div v-if=\"expanded\" class=\"fx-presence-chips\">\n      <span\n        v-for=\"u in others\"\n        :key=\"keyOf(u)\"\n        class=\"fx-presence-chip\"\n        :title=\"label(u)\"\n      >\n        <PresenceAvatar :user=\"u\" />\n        <span class=\"fx-presence-chip-name\"><bdi>{{ u.name }}</bdi></span>\n        <span v-if=\"u.file\" class=\"fx-presence-chip-file\">· {{ u.file }}</span>\n      </span>\n    </div>\n\n    <!-- Compact: the classic overlapping avatar strip. -->\n    <template v-else>\n      <div class=\"fx-presence-avatars\" :title=\"others.map(label).join(', ')\">\n        <PresenceAvatar\n          v-for=\"u in others.slice(0, 5)\"\n          :key=\"keyOf(u)\"\n          :user=\"u\"\n          :title=\"label(u)\"\n        />\n        <span v-if=\"others.length > 5\" class=\"fx-presence-more\">+{{ others.length - 5 }}</span>\n      </div>\n      <span class=\"fx-presence-text\" :title=\"others.map(label).join(', ')\">\n        {{ others.length === 1 ? others[0].name : t('presence.others', { n: others.length }) }}\n        <template v-if=\"others.length === 1 && others[0].file\">\n          · <span class=\"fx-presence-file\">{{ others[0].file }}</span>\n        </template>\n      </span>\n    </template>\n\n    <button\n      type=\"button\"\n      class=\"fx-presence-toggle\"\n      :title=\"expanded ? t('presence.collapse') : t('presence.expand')\"\n      :aria-expanded=\"expanded\"\n      @click=\"toggleExpanded\"\n    >{{ expanded ? '‹' : '›' }}</button>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.fx-presence {\n  display: inline-flex;\n  align-items: center;\n  gap: 0.5rem;\n  max-width: 100%;\n}\n.fx-presence-avatars {\n  display: inline-flex;\n  align-items: center;\n}\n.fx-presence-avatar {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: 1.5rem;\n  height: 1.5rem;\n  margin-inline-start: -0.4rem;\n  border-radius: 9999px;\n  border: 2px solid var(--fx-presence-ring, #ffffff);\n  color: #fff;\n  font-size: 0.6rem;\n  font-weight: 600;\n  line-height: 1;\n  user-select: none;\n}\n.fx-presence-avatar:first-child {\n  margin-inline-start: 0;\n}\n/* A photo fills the circle; the identity colour stays as the ring backdrop so\n   a picture with transparency still reads as that person. */\n.fx-presence-avatar--photo {\n  overflow: visible;\n}\n.fx-presence-photo {\n  width: 100%;\n  height: 100%;\n  border-radius: 9999px;\n  object-fit: cover;\n  display: block;\n}\n.fx-presence-dot {\n  position: absolute;\n  inset-inline-end: -1px;\n  bottom: -1px;\n  width: 0.5rem;\n  height: 0.5rem;\n  border-radius: 9999px;\n  background: #22c55e; /* green — actively focused on a file */\n  border: 1.5px solid var(--fx-presence-ring, #ffffff);\n}\n.fx-presence-more {\n  margin-inline-start: 0.15rem;\n  font-size: 0.7rem;\n  color: rgb(113 113 122); /* zinc-500 */\n}\n.fx-presence--wide {\n  flex: 1 1 auto;\n  min-width: 0;\n}\n.fx-presence-chips {\n  display: flex;\n  align-items: center;\n  gap: 0.4rem;\n  overflow-x: auto;\n  min-width: 0;\n  padding-bottom: 2px; /* keep the scrollbar off the chips */\n  scrollbar-width: thin;\n}\n.fx-presence-chip {\n  display: inline-flex;\n  align-items: center;\n  gap: 0.35rem;\n  flex: 0 0 auto;\n  padding-block: 0.15rem; padding-inline: 0.2rem 0.5rem;\n  border-radius: 9999px;\n  background: rgb(244 244 245); /* zinc-100 */\n  font-size: 0.75rem;\n  color: rgb(63 63 70); /* zinc-700 */\n  white-space: nowrap;\n}\n.fx-presence-chip .fx-presence-avatar {\n  margin-inline-start: 0;\n}\n.fx-presence-chip-name {\n  font-weight: 500;\n}\n.fx-presence-chip-file {\n  color: rgb(113 113 122); /* zinc-500 */\n  max-width: 12rem;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.fx-presence-toggle {\n  flex: 0 0 auto;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: 1.25rem;\n  height: 1.25rem;\n  border: none;\n  border-radius: 9999px;\n  background: transparent;\n  color: rgb(113 113 122); /* zinc-500 */\n  font-size: 0.9rem;\n  line-height: 1;\n  cursor: pointer;\n}\n.fx-presence-toggle:hover {\n  background: rgb(228 228 231); /* zinc-200 */\n  color: rgb(63 63 70);\n}\n.dark .fx-presence-chip {\n  background: rgb(39 39 42); /* zinc-800 */\n  color: rgb(212 212 216); /* zinc-300 */\n}\n.dark .fx-presence-toggle:hover {\n  background: rgb(39 39 42);\n  color: rgb(212 212 216);\n}\n.fx-presence-text {\n  font-size: 0.75rem;\n  color: rgb(113 113 122); /* zinc-500 */\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  max-width: 14rem;\n}\n.fx-presence-file {\n  color: rgb(82 82 91); /* zinc-600 */\n  font-weight: 500;\n}\n.dark .fx-presence-avatar,\n.dark .fx-presence-dot {\n  --fx-presence-ring: #18181b; /* zinc-900 */\n}\n</style>\n","/**\n * actionIcons — menu/toolbar ACTION key → inline SVG icon mapping.\n *\n * The sibling of `lib/fileIcons.ts`, for the other half of the problem: that\n * module draws what a row IS (a folder, a sheet, an archive), this one draws\n * what a row DOES (open, rename, move to trash).\n *\n * Why it exists: the action rows used to carry emoji (`↗ 👁 ⬇ 🗑 …`). Emoji are\n * not one icon set — they are a dozen sets, rendered by whatever font the OS\n * happens to ship, at whatever weight and colour that font's designer chose.\n * Two rows of the same menu could come out flat-grey and full-colour, one\n * hairline and one bold, and none of them matched the file glyphs drawn four\n * pixels to the left. A stroked set on `currentColor` gives the menu one voice\n * and lets the row's own colour reach the icon — which is how the destructive\n * entry, and only the destructive entry, comes out red.\n *\n * Conventions are `fileIcons.ts`'s, deliberately: static strings (so `v-html`\n * is injecting markup this file wrote, never user input), one cache, 24×24\n * viewBox, 1.6 stroke, round caps/joins, `currentColor`.\n *\n * Adding a key: draw it here. Nothing else has to change — the renderers ask\n * for the icon by the action's own key, so a new action gets its icon the\n * moment its glyph lands in GLYPHS, and an action with no glyph renders\n * nothing (the caller falls back to whatever `icon` string it was handed, so\n * an embedder's custom emoji still shows).\n */\n\n/* Shared fragments — the arrow/tray pair reads as one family when download and\n * upload sit two rows apart. */\nconst TRAY = '<path d=\"M4.5 15.5v3A2 2 0 0 0 6.5 20.5h11a2 2 0 0 0 2-2v-3\"/>';\nconst EYE =\n  '<path d=\"M2.5 12S6 5.5 12 5.5 21.5 12 21.5 12 18 18.5 12 18.5 2.5 12 2.5 12z\"/>' +\n  '<circle cx=\"12\" cy=\"12\" r=\"3\"/>';\nconst STAR_PATH =\n  'M12 3.6l2.6 5.3 5.85.85-4.23 4.12 1 5.83L12 16.97l-5.22 2.73 1-5.83L3.55 9.75l5.85-.85z';\n/* The push-pin, shared by the two \"keep on this device\" states. */\nconst PIN =\n  '<path d=\"M8 3.5h8\"/>' +\n  '<path d=\"M9.6 3.5v6.1L7.2 12.3v1.7h9.6v-1.7L14.4 9.6V3.5\"/>' +\n  '<path d=\"M12 14v6.5\"/>';\n/* A window/panel with one edge split off — nav and inspector are the same\n * shape mirrored, which is exactly what the two panels are. */\nconst PANEL = '<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/>';\n/* The bin. `delete` moves a thing INTO it and `open-trash` opens it; those are\n * two actions on one object, so they are one drawing (Drive and Finder draw\n * them the same way too). */\nconst BIN =\n  '<path d=\"M4 6.5h16\"/>' +\n  '<path d=\"M9.5 6.5V4.9a1.4 1.4 0 0 1 1.4-1.4h2.2a1.4 1.4 0 0 1 1.4 1.4v1.6\"/>' +\n  '<path d=\"M6.6 6.5l.85 12.1a2 2 0 0 0 2 1.9h5.1a2 2 0 0 0 2-1.9l.85-12.1\"/>' +\n  '<path d=\"M10.3 10.3v6.4\"/><path d=\"M13.7 10.3v6.4\"/>';\n/* The ribbon a saved search hangs on — `bookmark` is the saved thing,\n * `save-search` is the same ribbon with the \"add\" plus in it. */\nconst BOOKMARK =\n  '<path d=\"M6.8 3.5h10.4a1.6 1.6 0 0 1 1.6 1.6v15.4l-6.8-3.9-6.8 3.9V5.1A1.6 1.6 0 0 1 6.8 3.5z\"/>';\n\nconst GLYPHS: Record<string, string> = {\n  /* ── opening ─────────────────────────────────────────────────────────── */\n  open:\n    '<path d=\"M14 3.5h6.5V10\"/>' +\n    '<path d=\"M20.5 3.5L12 12\"/>' +\n    '<path d=\"M18 13.5v5a2 2 0 0 1-2 2H5.5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h5\"/>',\n  'open-tab':\n    '<rect x=\"3\" y=\"4.5\" width=\"18\" height=\"15\" rx=\"2\"/>' +\n    '<path d=\"M3 9.5h18\"/>' +\n    '<path d=\"M9.5 4.5v5\"/>',\n  preview: EYE,\n  download: TRAY + '<path d=\"M12 4v11.5\"/><path d=\"M7.5 11L12 15.5 16.5 11\"/>',\n  'archive-create':\n    '<path d=\"M5 8.5h14v11H5z\"/><path d=\"M4 4h16v4.5H4z\"/>' +\n    '<path d=\"M12 11v5\"/><path d=\"M9.5 13.5h5\"/>',\n  'archive-extract':\n    '<path d=\"M5 8.5h14v11H5z\"/><path d=\"M4 4h16v4.5H4z\"/>' +\n    '<path d=\"M12 10.5v6\"/><path d=\"M9.5 14l2.5 2.5 2.5-2.5\"/>',\n  upload:\n    '<path d=\"M4.5 15.5v3A2 2 0 0 0 6.5 20.5h11a2 2 0 0 0 2-2v-3\"/>' +\n    '<path d=\"M12 15.5V4\"/><path d=\"M7.5 8.5L12 4l4.5 4.5\"/>',\n  convert:\n    '<path d=\"M4 8.5h13\"/><path d=\"M13.5 5L17 8.5 13.5 12\"/>' +\n    '<path d=\"M20 15.5H7\"/><path d=\"M10.5 12L7 15.5 10.5 19\"/>',\n  /* \"Paylaş / İzinler\" — the three-node share, not a chain link: this row\n     opens permissions as well as a link, and people are the subject. */\n  access:\n    '<circle cx=\"17.5\" cy=\"6\" r=\"2.5\"/>' +\n    '<circle cx=\"6.5\" cy=\"12\" r=\"2.5\"/>' +\n    '<circle cx=\"17.5\" cy=\"18\" r=\"2.5\"/>' +\n    '<path d=\"M8.75 10.8l6.5-3.6\"/><path d=\"M8.75 13.2l6.5 3.6\"/>',\n  details:\n    '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/>' +\n    '<path d=\"M12 11.2v5.6\"/>' +\n    '<circle cx=\"12\" cy=\"7.7\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\"/>',\n  /* ── identity / clipboard ────────────────────────────────────────────── */\n  'copy-id':\n    '<rect x=\"2.5\" y=\"5\" width=\"19\" height=\"14\" rx=\"2.5\"/>' +\n    '<circle cx=\"8.5\" cy=\"10.8\" r=\"2\"/>' +\n    '<path d=\"M5.3 16.2c.5-1.5 1.75-2.4 3.2-2.4s2.7.9 3.2 2.4\"/>' +\n    '<path d=\"M14.8 10h4.2\"/><path d=\"M14.8 13.6h4.2\"/>',\n  /* A clipboard carrying a path separator — this copies the location, not the\n     thing that lives at it. */\n  'copy-path':\n    '<path d=\"M9 4.5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-12a2 2 0 0 0-2-2h-2\"/>' +\n    '<rect x=\"9\" y=\"2.8\" width=\"6\" height=\"3.6\" rx=\"1.2\"/>' +\n    '<path d=\"M10 11.2l2.4 2.4-2.4 2.4\"/>',\n  rename: '<path d=\"M4 20l.9-4.1 11-11a2.05 2.05 0 0 1 2.9 2.9l-11 11z\"/><path d=\"M14 7l3 3\"/>',\n  cut:\n    '<circle cx=\"6.5\" cy=\"17.5\" r=\"2.5\"/>' +\n    '<circle cx=\"6.5\" cy=\"6.5\" r=\"2.5\"/>' +\n    '<path d=\"M8.6 8.3L19 19\"/><path d=\"M8.6 15.7L19 5\"/>',\n  copy:\n    '<rect x=\"9\" y=\"9\" width=\"11.5\" height=\"11.5\" rx=\"2\"/>' +\n    '<path d=\"M15 6v-.5a2 2 0 0 0-2-2H5.5a2 2 0 0 0-2 2V13a2 2 0 0 0 2 2H6\"/>',\n  paste:\n    '<path d=\"M9 4.5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-12a2 2 0 0 0-2-2h-2\"/>' +\n    '<rect x=\"9\" y=\"2.8\" width=\"6\" height=\"3.6\" rx=\"1.2\"/>',\n  /* ── metadata ────────────────────────────────────────────────────────── */\n  /* star = \"not starred yet, do it\" (outline); unstar = the state you are in\n     (filled). The renderer picks between them by name, see FileExplorer. */\n  star: `<path d=\"${STAR_PATH}\"/>`,\n  unstar: `<path d=\"${STAR_PATH}\" fill=\"currentColor\"/>`,\n  tags:\n    '<path d=\"M3.5 11.4V5.2a1.7 1.7 0 0 1 1.7-1.7h6.2a1.7 1.7 0 0 1 1.2.5l7.2 7.2a1.7 1.7 0 0 1 0 2.4l-6.2 6.2a1.7 1.7 0 0 1-2.4 0L4 12.6a1.7 1.7 0 0 1-.5-1.2z\"/>' +\n    '<circle cx=\"8\" cy=\"8\" r=\"1.3\"/>',\n  /* ── destructive / recovery ──────────────────────────────────────────── */\n  delete: BIN,\n  'open-trash': BIN,\n  /* The undo arrow, not a rotating one: \"Geri Yükle\" puts a thing back where\n     it was, and that is the gesture people already read as undo. */\n  restore: '<path d=\"M9 6L5 10l4 4\"/><path d=\"M5 10h9a5 5 0 0 1 0 10h-3.5\"/>',\n  /* ── folder-level ────────────────────────────────────────────────────── */\n  'new-folder':\n    '<path d=\"M3 7.5a2 2 0 0 1 2-2h4.2a2 2 0 0 1 1.4.6l1.4 1.4H19a2 2 0 0 1 2 2V17a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"/>' +\n    '<path d=\"M12 11.3v5\"/><path d=\"M9.5 13.8h5\"/>',\n  /* belge:n1 — a page with a plus: \"make me a new document of some type\".\n     Keyed by the action's own key, so the menu row carries no icon of its\n     own and no emoji enters the markup. */\n  'new-document':\n    '<path d=\"M13.5 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h5\"/><path d=\"M13.5 3l5 5\"/>' +\n    '<path d=\"M13.5 3v5h5\"/><path d=\"M17.5 14.5v6\"/><path d=\"M14.5 17.5h6\"/>',\n  refresh: '<path d=\"M20.5 12a8.5 8.5 0 1 1-2.49-6.01\"/><path d=\"M18 1.5V6h-4.5\"/>',\n  /* ── desktop sync (\"keep on this device\") ────────────────────────────── */\n  'keep-local': PIN,\n  'keep-online':\n    '<path d=\"M7 18.5h10a3.5 3.5 0 0 0 0-7 5 5 0 0 0-9.6-1.2A4.2 4.2 0 0 0 7 18.5z\"/>',\n  /* Kept because a parent folder is kept — the pin, with the branch it came\n     down. The row is disabled; the glyph says why. */\n  'keep-inherited': PIN + '<path d=\"M2.5 20.5h3.6a1.6 1.6 0 0 0 1.6-1.6V17\"/>',\n  'keep-reveal':\n    '<path d=\"M2.5 17.5V6.5a2 2 0 0 1 2-2h3.8a2 2 0 0 1 1.4.6l1.4 1.4h4.4a2 2 0 0 1 2 2v1.8\"/>' +\n    '<path d=\"M4 19.5h13.4a2 2 0 0 0 1.9-1.37l2-6A1.4 1.4 0 0 0 20 10.3H9.4a2 2 0 0 0-1.9 1.37L5.5 18\"/>',\n  /* ── view preferences ────────────────────────────────────────────────── */\n  'toggle-hidden':\n    '<path d=\"M3.5 3.5l17 17\"/>' +\n    '<path d=\"M9.9 6A9.6 9.6 0 0 1 12 5.5c6 0 9.5 6.5 9.5 6.5a17.3 17.3 0 0 1-3.35 4.15\"/>' +\n    '<path d=\"M6.55 7.7A17.4 17.4 0 0 0 2.5 12S6 18.5 12 18.5a9.7 9.7 0 0 0 3.95-.85\"/>' +\n    '<path d=\"M10.2 10.3a2.9 2.9 0 0 0 3.9 4.1\"/>',\n  density: '<path d=\"M8.5 8L12 4.5 15.5 8\"/><path d=\"M8.5 16L12 19.5 15.5 16\"/><path d=\"M12 4.5v15\"/>',\n  'view-list':\n    '<path d=\"M8.5 6.5h12\"/><path d=\"M8.5 12h12\"/><path d=\"M8.5 17.5h12\"/>' +\n    '<path d=\"M4 6.5h.01\"/><path d=\"M4 12h.01\"/><path d=\"M4 17.5h.01\"/>',\n  'view-grid':\n    '<rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\"/>' +\n    '<rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\"/>' +\n    '<rect x=\"3.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\"/>' +\n    '<rect x=\"13.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\"/>',\n  'view-gallery':\n    '<rect x=\"3\" y=\"4.5\" width=\"18\" height=\"15\" rx=\"2\"/>' +\n    '<circle cx=\"8.3\" cy=\"9.6\" r=\"1.5\"/>' +\n    '<path d=\"M4.3 17l4.7-4.7 3 3 3-3 5 4.7\"/>',\n  nav: PANEL + '<path d=\"M9.5 4.5v15\"/>',\n  inspector: PANEL + '<path d=\"M14.5 4.5v15\"/>',\n  /* ── explorer settings ───────────────────────────────────────────────── */\n  'shortcut-settings':\n    '<rect x=\"2.5\" y=\"6\" width=\"19\" height=\"12\" rx=\"2.5\"/>' +\n    '<path d=\"M6.5 9.8h.01\"/><path d=\"M10 9.8h.01\"/><path d=\"M13.5 9.8h.01\"/><path d=\"M17 9.8h.01\"/>' +\n    '<path d=\"M6.5 12.9h.01\"/><path d=\"M10 12.9h.01\"/><path d=\"M13.5 12.9h.01\"/><path d=\"M17 12.9h.01\"/>' +\n    '<path d=\"M8.6 15.6h6.8\"/>',\n  /* Light/dark as the thing it actually switches: one disc, half of it inked. */\n  theme:\n    '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/>' +\n    '<path d=\"M12 3.5a8.5 8.5 0 0 1 0 17z\" fill=\"currentColor\" stroke=\"none\"/>',\n  /* zaman:z3 — a clock face, for the Time zone row. */\n  timezone: '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 7.2V12l3.2 2\"/>',\n  tour:\n    '<path d=\"M2.5 9L12 4.5 21.5 9 12 13.5z\"/>' +\n    '<path d=\"M6.6 11.1v4.4c0 1.6 2.4 2.9 5.4 2.9s5.4-1.3 5.4-2.9v-4.4\"/>',\n  /* \"Dosya İste\" — the public drop link. A chain, because what this makes is\n     a URL to hand somebody. */\n  'request-files':\n    '<path d=\"M10.2 13.8a4.2 4.2 0 0 0 6.1 0l2.3-2.3a4.3 4.3 0 0 0-6.1-6.1l-1.35 1.35\"/>' +\n    '<path d=\"M13.8 10.2a4.2 4.2 0 0 0-6.1 0l-2.3 2.3a4.3 4.3 0 0 0 6.1 6.1l1.35-1.35\"/>',\n  /* ── toolbar chrome that is not a ContextAction ──────────────────────── */\n  'go-up': '<path d=\"M12 20V5\"/><path d=\"M5.5 11.5L12 5l6.5 6.5\"/>',\n  /* #57 — the storage row's order menu (SideNav). One step up or down is a\n     SHORT arrow, so it does not read as `go-up`'s \"to the parent folder\";\n     \"Sort by name\" is the A→Z mark every file manager uses; \"Use default order\" is\n     the refresh circle turning back. All vertical or rotational, so none of\n     them is mirrored in a right-to-left interface. */\n  'move-up': '<path d=\"M12 18V7\"/><path d=\"M7.5 11.5L12 7l4.5 4.5\"/>',\n  'move-down': '<path d=\"M12 6v11\"/><path d=\"M7.5 12.5L12 17l4.5-4.5\"/>',\n  'sort-name':\n    '<path d=\"M3.5 10.5L6.5 3.5l3 7\"/><path d=\"M4.7 8h3.6\"/>' +\n    '<path d=\"M4 13.5h5l-5 7h5\"/><path d=\"M17 4v16\"/><path d=\"M13.5 16.5L17 20l3.5-3.5\"/>',\n  'reset-order': '<path d=\"M3.5 12a8.5 8.5 0 1 0 2.49-6.01\"/><path d=\"M6 1.5V6h4.5\"/>',\n  /* === gorunum:v2-topbar — the breadcrumb row's own controls ============\n     The crumb trail gained the reference shell's three affordances: a home\n     crumb in place of the bare \"/\" root, a chevron on the last crumb that\n     lists what is inside it, and the path editor we already had (its glyph\n     moves here from Breadcrumb.vue so every mark in the row comes from one\n     file). */\n  home:\n    '<path d=\"M3.5 10.6L12 3.5l8.5 7.1\"/>' +\n    '<path d=\"M5.6 9.4V19a1.5 1.5 0 0 0 1.5 1.5h9.8a1.5 1.5 0 0 0 1.5-1.5V9.4\"/>' +\n    '<path d=\"M9.9 20.5v-5.2h4.2v5.2\"/>',\n  subfolders: '<path d=\"M6.8 9.8L12 15l5.2-5.2\"/>',\n  'edit-path': '<path d=\"M4 20h4l10-10a2.1 2.1 0 0 0-3-3L5 17z\"/><path d=\"M14.5 6.5l3 3\"/>',\n  /* === gorunum:v2-topbar — the header's trailing cluster ================\n     The page chrome around the explorer is gone, so the account-level doors\n     are drawn by the header itself (the host fills them through the\n     `header-actions` slot). The glyphs live here so an embedder's cluster\n     comes out the same weight and colour as everything beside it. */\n  admin:\n    '<rect x=\"3\" y=\"3.5\" width=\"7.4\" height=\"7.4\" rx=\"1.6\"/>' +\n    '<rect x=\"13.6\" y=\"3.5\" width=\"7.4\" height=\"4.6\" rx=\"1.6\"/>' +\n    '<rect x=\"13.6\" y=\"10.7\" width=\"7.4\" height=\"9.8\" rx=\"1.6\"/>' +\n    '<rect x=\"3\" y=\"13.6\" width=\"7.4\" height=\"6.9\" rx=\"1.6\"/>',\n  /* ⚠ A PERSON, not a cog. The first draft drew the gear as a ringed disc with\n     eight spokes and at 16px it came out as a SUN — sitting in the very row\n     the light/dark toggle had just been removed from, which is the one thing\n     the mark must not be mistaken for (measured at 1440 and 390: it read as a\n     theme switch in both). The account bust is what the reference hangs this\n     menu on, and the tooltip says which settings. */\n  account: '<circle cx=\"12\" cy=\"8.2\" r=\"3.6\"/><path d=\"M4.9 20.3a7.35 7.35 0 0 1 14.2 0\"/>',\n  'sign-out':\n    '<path d=\"M9.5 20.5H6a2 2 0 0 1-2-2v-13a2 2 0 0 1 2-2h3.5\"/>' +\n    '<path d=\"M15.5 16.5L20 12l-4.5-4.5\"/>' +\n    '<path d=\"M20 12H9\"/>',\n  /* The AI assistant, drawn but not yet wired — a spark, the mark every\n     assistant in this class of product wears, so the day it does something\n     the icon does not have to change under people's fingers. */\n  ai:\n    '<path d=\"M12 3.2l1.75 4.3 4.3 1.75-4.3 1.75L12 15.3l-1.75-4.3L5.95 9.25l4.3-1.75z\"/>' +\n    '<path d=\"M18.2 15.1l.8 1.95 1.95.8-1.95.8-.8 1.95-.8-1.95-1.95-.8 1.95-.8z\"/>',\n  /* The notification bell, for the host's header cluster (web/src\n     NotificationBell.vue). ⚠ Drawn HERE, not taken from the app's icon\n     library: it sits in the same row as refresh, the spark and the avatar,\n     and a glyph at a foreign stroke weight in that row is the exact mismatch\n     this set exists to prevent. A dome on a flared rim, the clapper below. */\n  bell:\n    '<path d=\"M6.2 16.6V11a5.8 5.8 0 0 1 11.6 0v5.6l1.7 1.9H4.5z\"/>' +\n    '<path d=\"M10.1 21a2.1 2.1 0 0 0 3.8 0\"/>',\n  /* === /gorunum:v2-topbar === */\n  search: '<circle cx=\"10.8\" cy=\"10.8\" r=\"6.3\"/><path d=\"M15.4 15.4l5.1 5.1\"/>',\n  /* gorunum:v1-advsearch — sliders, not a funnel. A funnel says \"throw rows\n     away\"; this control opens a dialog where you SET things, and two of its\n     three rows are exactly a slider's job (a size range, a time window). */\n  filter:\n    '<path d=\"M4 7.5h4\"/><path d=\"M13 7.5h7\"/><circle cx=\"10.5\" cy=\"7.5\" r=\"2.4\"/>' +\n    '<path d=\"M4 16.5h7\"/><path d=\"M16 16.5h4\"/><circle cx=\"13.5\" cy=\"16.5\" r=\"2.4\"/>',\n  more:\n    '<circle cx=\"5.5\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\"/>' +\n    '<circle cx=\"12\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\"/>' +\n    '<circle cx=\"18.5\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\"/>',\n  close: '<path d=\"M5.5 5.5l13 13\"/><path d=\"M18.5 5.5l-13 13\"/>',\n  /* A share link. Two half-chains, which is what a link IS. The details\n     panel's \"Not shared / Create link\" row used to draw a chain EMOJI\n     there, i.e. whatever glyph the OS happened to ship, full-colour,\n     beside a column of stroked grey ones. */\n  link:\n    '<path d=\"M10 13.5a4.5 4.5 0 0 0 6.8.5l2.7-2.7a4.5 4.5 0 0 0-6.36-6.36L11.6 6.5\"/>' +\n    '<path d=\"M14 10.5a4.5 4.5 0 0 0-6.8-.5l-2.7 2.7a4.5 4.5 0 0 0 6.36 6.36l1.53-1.53\"/>',\n  /* baglan:b1 — \"How to connect\". A PLUG, deliberately not the chain above:\n     the empty screen's account menu draws both rows one under the other\n     (\"Paylaştıklarım\", then \"Bağlantılar\"), and one mark on two adjacent rows\n     is the misreading this set exists to stop. It is also the mark the admin\n     panel's own Connections entry already wears (web lib/adminNav.ts, lucide `Cable`),\n     so the two ways into the same screen agree on what it looks like. */\n  connect:\n    '<path d=\"M9 8.5V3\"/><path d=\"M15 8.5V3\"/>' +\n    '<path d=\"M6 8.5h12v4.5a4.5 4.5 0 0 1-4.5 4.5h-3A4.5 4.5 0 0 1 6 13z\"/>' +\n    '<path d=\"M12 17.5V21\"/>',\n\n  /* === ikon:emoji — the command palette's own rows =======================\n   * The palette printed `{{ it.icon }}` as TEXT: `➜ 📁 ⬆ ▦ 🗑 ⟳ ↑ 🎨 ⌨ 🎓 ⧉ ◫\n   * 💾 🔖`. Thirteen marks from four different type families, in a list whose\n   * neighbours — the context menu it duplicates and the toolbar it launches —\n   * had already moved here. Most of the keys it needed were drawn already\n   * (`tour` is the mortarboard, `shortcut-settings` the keyboard, the three\n   * `view-*` the mode chips); these six are what was genuinely missing. */\n\n  /* \"Go to path\" — the arrow goes INTO the box, the mirror of `sign-out`.\n     A bare arrow would have said \"next\", which this row is not. */\n  goto:\n    '<path d=\"M13.5 4.5h4a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2h-4\"/>' +\n    '<path d=\"M10 8.2L13.8 12 10 15.8\"/>' +\n    '<path d=\"M4.5 12h9.3\"/>',\n  /* A second pane opened beside the first — `nav`/`inspector`'s panel with the\n     divider down the middle, because that is literally what split view is. */\n  split: PANEL + '<path d=\"M12 4.5v15\"/>',\n  /* A new tab: `open-tab`'s window, with the plus in the body rather than on\n     the tab strip (at 16px a plus up there merges into the tab). */\n  'tab-new':\n    '<rect x=\"3\" y=\"4.5\" width=\"18\" height=\"15\" rx=\"2\"/>' +\n    '<path d=\"M3 9.5h18\"/>' +\n    '<path d=\"M9.5 4.5v5\"/>' +\n    '<path d=\"M12 12.1v5\"/><path d=\"M9.5 14.6h5\"/>',\n  bookmark: BOOKMARK,\n  'save-search': BOOKMARK + '<path d=\"M12 7.2v5.2\"/><path d=\"M9.4 9.8h5.2\"/>',\n  /* The padlock, for the rows and strips that talk ABOUT encryption (\"create\n     an encrypted folder\", \"this one is unlocked\"). The listing marker is a\n     different drawing on purpose — there the lock is cut out of the folder,\n     because the row still has to read as a folder. */\n  lock:\n    '<rect x=\"4.5\" y=\"10.3\" width=\"15\" height=\"10.2\" rx=\"2.2\"/>' +\n    '<path d=\"M7.9 10.3V7.6a4.1 4.1 0 0 1 8.2 0v2.7\"/>' +\n    '<circle cx=\"12\" cy=\"15.4\" r=\"1.5\"/>',\n\n  /* === ikon:emoji — states the viewers and modals report ================\n   * `✓ ✗ ⚠️ ⏳` in the viewer chrome. The first two are typographic and came\n   * out at whatever weight the UI font had; the last two are colour emoji, so\n   * a fallback screen's 48px mark was the only full-colour thing on a grey\n   * page. `progress` is drawn as an open ring because it is SPUN by CSS\n   * (`@keyframes fe-spin`) — an hourglass cannot say \"still going\". */\n  /* An app plugin's row when its manifest names no glyph this set draws: a\n     puzzle piece, the mark every extension surface already wears. Rows whose\n     manifest icon IS a key here (`convert`, `lock`, …) get that glyph instead\n     — lib/pluginMenu decides, this only draws. */\n  plugin:\n    '<path d=\"M9.5 4.5a2 2 0 1 1 4 0h3a1.5 1.5 0 0 1 1.5 1.5v3a2 2 0 1 1 0 4v3a1.5 1.5 0 0 1-1.5 1.5h-3a2 2 0 1 1-4 0h-3A1.5 1.5 0 0 1 5 16v-3a2 2 0 1 1 0-4V6a1.5 1.5 0 0 1 1.5-1.5z\"/>',\n  /* A pen signing on a line — the e-signature app's own icon (manifest\n     `icon: \"sign\"`). ⚠ Drawn here because a key the catalogue does not know\n     falls back to the generic plugin piece: the sidebar and every menu showed\n     the Signatures app as \"some app\" until it was (2026-09-21, a tester). */\n  sign:\n    '<path d=\"M12.5 20.5h8\"/>' +\n    '<path d=\"M16.2 3.9a2.05 2.05 0 0 1 2.9 2.9L8 17.9l-3.9 1 1-3.9z\"/>' +\n    '<path d=\"M14.6 5.5l2.9 2.9\"/>',\n  check: '<path d=\"M4.8 12.6l4.7 4.7L19.2 6.9\"/>',\n  alert:\n    '<path d=\"M10.7 4.6L2.9 18.2a1.5 1.5 0 0 0 1.3 2.25h15.6a1.5 1.5 0 0 0 1.3-2.25L13.3 4.6a1.5 1.5 0 0 0-2.6 0z\"/>' +\n    '<path d=\"M12 9.9v4.3\"/>' +\n    '<circle cx=\"12\" cy=\"17.4\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\"/>',\n  progress: '<path d=\"M20.5 12a8.5 8.5 0 1 1-8.5-8.5\"/>',\n};\n\n/**\n * ⚠ RTL — the glyphs that MEAN a direction along the line, and so are drawn\n * mirrored in a right-to-left interface (`fe-aicon--dir`, one rule in\n * base.css; `:dir(rtl)` on the icon itself, so an English explorer inside an\n * Arabic page keeps its arrows):\n *\n *   restore    — the undo arrow (\"put it back\") points toward the start;\n *   goto       — the arrow goes INTO the box, reading forward;\n *   sign-out   — the arrow leaves through the door on the END side;\n *   copy-path  — its `›` is a path separator, which points the way a path\n *                reads (the breadcrumb's does the same);\n *   nav, inspector — a panel on the start / end side of the window, and in RTL\n *                the navigation panel IS on the right.\n *\n * Deliberately NOT here: `open` (↗ \"open in a new tab\" points up and out, not\n * along the line), `refresh` (a clock turns the same way in every script),\n * `convert` (two opposed arrows, already symmetric), and everything vertical\n * (upload, download, go-up, subfolders, density).\n */\nconst DIRECTIONAL = new Set(['restore', 'goto', 'sign-out', 'copy-path', 'nav', 'inspector']);\n\nconst SVG_CACHE = new Map<string, string>();\n\n/**\n * Inline SVG markup for an action key, or `''` when nothing is drawn for it.\n *\n * The empty string is a contract, not a failure: the caller renders nothing\n * (or falls back to the `icon` string an embedder supplied) rather than a\n * placeholder box, so an unknown key costs a gap and never a broken glyph.\n */\nexport function actionIconSvg(key: string): string {\n  if (!key) return '';\n  const cached = SVG_CACHE.get(key);\n  if (cached !== undefined) return cached;\n  const glyph = GLYPHS[key];\n  const svg = glyph\n    ? `<svg class=\"${DIRECTIONAL.has(key) ? 'fe-aicon fe-aicon--dir' : 'fe-aicon'}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" ` +\n      'stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" ' +\n      `aria-hidden=\"true\" focusable=\"false\">${glyph}</svg>`\n    : '';\n  SVG_CACHE.set(key, svg);\n  return svg;\n}\n\n/** Every key this module draws — handy for tests and for a gallery page. */\nexport function actionIconKeys(): string[] {\n  return Object.keys(GLYPHS);\n}\n","// heldMenuRows: the rows an open menu draws, held in their places (#196).\n//\n// A menu's rows can change while it is open: an answer from the server lands\n// and shows a row that was waiting on it (\"Encrypt with E2EE…\", a folder's\n// permissions), the listing is read again and the same answer is asked anew,\n// the desktop shell reports a different keep state. Drawn as they are, each of\n// those moves every row below the change while the person is aiming at one:\n// a click pressed on \"Tags\" was released on \"Star\" in the 0.53 release run, and\n// the row under the pointer can as well be \"Delete\".\n//\n// So once a menu is open (ContextMenu `show()`), the rows it opened with keep\n// their places until it closes:\n//   - a row that is still offered is drawn as it is now (a label or a grey that\n//     changes, changes in place);\n//   - a row that is no longer offered keeps its place, greyed - never picked,\n//     never pulled from under the pointer;\n//   - a row that appears late is added at the END, after a divider of its own,\n//     where it moves nothing.\n// The next opening draws the menu in its own order again.\nexport interface MenuRowLike {\n  key: string;\n  label: string;\n  hidden?: boolean;\n  disabled?: boolean;\n  divider?: boolean;\n}\n\n/** The divider in front of the rows that appeared after the menu opened. */\nexport const LATE_ROWS_DIVIDER_KEY = '__fe-ctx-late';\n\n/** The rows on screen: hidden rows dropped, and the dividers that would be\n *  left leading, trailing or doubled by them collapsed, so every divider drawn\n *  separates two groups. */\nexport function visibleMenuRows<T extends MenuRowLike>(actions: readonly T[]): T[] {\n  const out: T[] = [];\n  for (const a of actions) {\n    if (a.hidden) continue;\n    if (a.divider && (out.length === 0 || out[out.length - 1].divider)) continue;\n    out.push(a);\n  }\n  while (out.length > 0 && out[out.length - 1].divider) out.pop();\n  return out;\n}\n\n/**\n * The rows of a menu that is open: `opened` (what `visibleMenuRows` drew when\n * it opened) in its own places, each row as `actions` has it now, and what\n * `actions` offers beyond it at the end.\n */\nexport function heldMenuRows<T extends MenuRowLike>(opened: readonly T[], actions: readonly T[]): T[] {\n  const now = new Map<string, T>();\n  for (const a of visibleMenuRows(actions)) {\n    if (!a.divider && !now.has(a.key)) now.set(a.key, a);\n  }\n  const placed = new Set<string>();\n  const rows: T[] = opened.map((a) => {\n    if (a.divider) return a;\n    placed.add(a.key);\n    return now.get(a.key) ?? { ...a, disabled: true };\n  });\n  const late = [...now.values()].filter((a) => !placed.has(a.key));\n  if (!late.length) return rows;\n  const divider = { key: LATE_ROWS_DIVIDER_KEY, label: '', divider: true } as unknown as T;\n  return [...rows, divider, ...late];\n}\n","/**\n * Which layer a teleported popup has to sit on to be above whatever opened it.\n *\n * ⚠⚠ THE BUG THIS EXISTS FOR. A menu that teleports to `<body>` leaves its\n * container's stacking context behind — that is the point, it is how a menu\n * escapes `overflow: hidden` and a transformed ancestor. But it also leaves\n * behind that container's PLACE in the stack. The explorer's Connections /\n * API-keys overlay is `.fe-overlay`, `position: fixed; z-index: 130`; the\n * context menu's backdrop is `z-index: 80`. So a row's \"Actions\" menu opened\n * inside that overlay was painted UNDER it — the owner, testing v0.43.0:\n * \"explore kısmında api anahtarlarında ya da nasıl bağlanılar (yani popup\n * ekranlar) içindeki aksiyon tuşlarının menüsü popup'ın altında kalıyor ve\n * açılmıyor gibi gözüküyor\". It opened every time; nobody could see it.\n *\n * ⚠ Why not simply raise `.fe-ctx-backdrop` to a big constant. Because the\n * stack has deliberate orderings in it that a constant would flatten — the\n * onboarding tour sits at 96 ABOVE the filter popovers at 90 on purpose, so a\n * tour step is never hidden behind one. And in an EMBED the number we would\n * have to beat is not ours at all: the host page decides what its own\n * containers are worth, and no constant we pick is guaranteed to clear it.\n *\n * So the layer is MEASURED from the thing that opened the popup: walk the\n * opener's ancestors, take the highest z-index any positioned one carries, and\n * sit one above it — or stay on the base layer when nothing in the chain is\n * raised at all, which is the ordinary case and leaves every existing ordering\n * exactly as it was.\n */\n\n/** The layer transient popups live on when nothing pushes them higher. */\nexport const POPUP_BASE_Z = 80;\n\n/**\n * The z-index for a popup opened from `openers`.\n *\n * Several openers may be passed because the caller usually has more than one\n * imperfect clue about what was clicked (the focused element, the element under\n * the pointer); the highest answer wins, and a null is simply ignored.\n */\nexport function popupLayer(\n  openers: Array<Element | null | undefined> | Element | null | undefined,\n  base: number = POPUP_BASE_Z,\n): number {\n  if (typeof window === 'undefined' || typeof document === 'undefined') return base;\n  const list = Array.isArray(openers) ? openers : [openers];\n  let top = base;\n  for (const opener of list) {\n    let el: Element | null = opener ?? null;\n    /* A cycle is impossible through parentElement, but a shadow host hop is a\n     * jump the loop cannot prove terminates; 200 is far past any real tree. */\n    for (let guard = 0; el && guard < 200; guard++) {\n      if (el === document.body || el === document.documentElement) break;\n      let z = Number.NaN;\n      let positioned = false;\n      try {\n        const cs = window.getComputedStyle(el);\n        /* ⚠ `|| 'static'`: a DOM that has not resolved the cascade answers\n         * with the empty string rather than the initial value (happy-dom does,\n         * and so does a detached node in some engines). Reading that as \"not\n         * static\" would honour every inert `z-index` in the tree — the pinned\n         * Actions cell carries one — and shove the menu onto a layer nothing\n         * asked for. */\n        positioned = (cs.position || 'static') !== 'static';\n        z = Number.parseInt(cs.zIndex, 10);\n      } catch {\n        /* A detached or cross-document node: nothing to learn, keep climbing. */\n      }\n      /* ⚠ `position !== static` as well as a number: `z-index` on a static\n       * element is inert — honouring it would push the menu above a dialog\n       * because some unrelated cell in the row carried a leftover number. */\n      if (positioned && Number.isFinite(z) && z + 1 > top) top = z + 1;\n      el =\n        el.parentElement ??\n        /* Out the top of a shadow tree, if the host put us in one. */\n        ((el.getRootNode() as ShadowRoot | null)?.host ?? null);\n    }\n  }\n  return top;\n}\n\n/**\n * The best guesses at what opened a popup, at the moment it opens.\n *\n * `document.activeElement` is the control a click just focused, and the element\n * under the pointer is what a right-click or a synthetic open landed on. Either\n * can be wrong on its own — a button that does not take focus, a coordinate on\n * a border — and both are in the same subtree as the real opener whenever they\n * are right, which is all `popupLayer` needs.\n *\n * ⚠ Call this BEFORE the popup renders. Once the backdrop is in the document it\n * covers the viewport, and `elementFromPoint` answers with the backdrop.\n */\nexport function openerCandidates(x?: number, y?: number): Array<Element | null> {\n  if (typeof document === 'undefined') return [];\n  const out: Array<Element | null> = [document.activeElement];\n  if (typeof x === 'number' && typeof y === 'number' && document.elementFromPoint) {\n    try {\n      out.push(document.elementFromPoint(x, y));\n    } catch {\n      /* Out-of-viewport coordinates throw in some engines; the focus clue stands. */\n    }\n  }\n  return out;\n}\n","<script setup lang=\"ts\">\n/**\n * ContextMenu — Teleport-based menu.\n *\n * Teleported under <body> so no parent (Ionic <ion-page>, Filament's\n * transformed flex containers, panel sidebars, …) can shift the\n * `position: fixed` backdrop off-window.\n */\nimport { ref, computed, nextTick, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport type { FileNode } from '../types/FileNode';\nimport { useLocale } from '../composables/useLocale';\nimport { useSystemDark } from '../composables/useSystemDark';\nimport { menuShortcutHint } from '../composables/useKeyboardShortcuts';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport { openAlongInline } from '../lib/direction';\nimport { heldMenuRows, visibleMenuRows } from '../lib/heldMenuRows'; /* #196 */\nimport { POPUP_BASE_Z, openerCandidates, popupLayer } from '../lib/popupLayer'; /* katman:z1 */\n\nexport interface ContextAction {\n  key: string;\n  label: string;\n  /**\n   * gorunum:v1-icons — OPTIONAL icon override. Rows normally need nothing\n   * here: the glyph is looked up by `key` in lib/actionIcons. Set this to\n   *   • another icon key, when one action has two faces (`star` / `unstar`);\n   *   • any literal string (an emoji), when an embedder wants its own mark —\n   *     an unknown name draws no SVG and the string is printed as-is.\n   */\n  icon?: string;\n  danger?: boolean;\n  disabled?: boolean;\n  /**\n   * tasi:m1 — WHY, in one sentence, for a row that is greyed out.\n   *\n   * ⚠ A disabled control has to explain itself or it is indistinguishable from\n   * a broken one. Sharing works on one item at a time, so \"Paylaş / İzinler\"\n   * greys out above a multi-selection — grey with a reason reads as a rule,\n   * grey without one reads as a bug, and HIDING it (which is what this row did\n   * until 2026-09-13) reads as the feature not existing.\n   *\n   * Rendered as the native `title` on both surfaces. Absent leaves the\n   * tooltip each surface already builds — the label plus its shortcut in the\n   * selection bar, nothing in the menu.\n   */\n  title?: string;\n  hidden?: boolean;\n  divider?: boolean;\n  /**\n   * A test hook on the menu ITEM. The menu teleports to <body>, so an\n   * entry cannot be addressed through the component that opened it; a spec\n   * (or a plugin's own e2e) that used to click a loose row button needs a\n   * name for the verb now that the verb lives in here. Absent for every\n   * explorer action, which are addressed by label.\n   */\n  testid?: string;\n  /**\n   * tus:t1 — registry action id whose key this row should print. Optional:\n   * rows whose `key` already matches the registry (rename, delete, copy…)\n   * are resolved from the shared map and need nothing here.\n   */\n  shortcutId?: string;\n}\n\nconst props = defineProps<{\n  locale: LocaleCode;\n  actions: ContextAction[];\n  /**\n   * Resolved theme. Teleported into <body> we lose the `.fe` parent\n   * that scopes CSS vars, so we tag the backdrop with the current\n   * theme so variables.css can re-apply dark overrides outside the\n   * explorer tree.\n   */\n  theme?: ThemeMode;\n  /**\n   * bag:b4 — bottom-sheet presentation for coarse-pointer (touch)\n   * contexts. When true the menu renders as a full-width sheet sliding\n   * up from the bottom edge (grab handle, ≥44px touch targets; closed\n   * by overlay tap, dragging the handle down, or Esc). The position\n   * passed to show() is ignored. When absent/false the classic anchored\n   * menu renders — desktop right-click behavior is untouched.\n   */\n  sheet?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'select', action: ContextAction, target: FileNode[]): void;\n}>();\n\n// bag:b4 — sheet aria labels need t(). ⚠ RTL: `dir` goes on the teleported\n// backdrop — under <body> the menu would otherwise take the HOST page's\n// direction, not the language its own rows are written in.\nconst { t, dir } = useLocale(() => props.locale);\n\n/* tus:t1 — a row's key label. `shortcutId` wins when an embedder sets one;\n * otherwise the row's own key is looked up in the shared menu map. */\nfunction hintFor(a: ContextAction): string {\n  return menuShortcutHint(a.shortcutId ?? a.key);\n}\n\n/* gorunum:v1-icons — the row's glyph. `icon` is consulted FIRST because that\n * is where a two-faced action names its variant (`star` vs `unstar`) and where\n * an embedder puts its own mark; the action's own key is the default. An\n * unrecognised name returns '' and the template falls back to printing the\n * string, so a host that still passes an emoji keeps it. */\nfunction iconFor(a: ContextAction): string {\n  return actionIconSvg(a.icon || a.key);\n}\n\nconst open = ref(false);\nconst x = ref(0);\nconst y = ref(0);\n/* katman:z1 — the layer this menu is painted on, measured from whatever opened\n * it. See lib/popupLayer.ts: a menu opened inside the explorer's Connections /\n * API-keys overlay (`.fe-overlay`, z-index 130) used to be drawn at 80 and was\n * invisible. The stylesheet's 80 stays as the value for every ordinary open. */\nconst layerZ = ref(POPUP_BASE_Z);\nconst targetNodes = ref<FileNode[]>([]);\nconst menuEl = ref<HTMLElement | null>(null);\n\n/* wiring:c4 — where the pointer opened the menu; kept separate from x/y so\n * the edge-flip can re-anchor ABOVE/LEFT of the cursor instead of merely\n * clamping (a clamp near the bottom edge used to leave the menu covering\n * the clicked row). */\nlet anchorX = 0;\nlet anchorY = 0;\n/* wiring:c4 — focus restore: whatever had focus before the menu opened gets\n * it back on hide, so keyboard users don't fall back to <body>. */\nlet prevFocus: HTMLElement | null = null;\n\nasync function show(ev: { clientX: number; clientY: number }, nodes: FileNode[]) {\n  prevFocus = (document.activeElement as HTMLElement | null) ?? null; /* wiring:c4 */\n  /* katman:z1 — BEFORE the backdrop exists: once it does it covers the\n   * viewport and `elementFromPoint` answers with the backdrop itself. */\n  layerZ.value = popupLayer(openerCandidates(ev.clientX, ev.clientY));\n  /* #196 — a new opening draws what is offered now, in its own order. */\n  openedRows.value = null;\n  sheetHeight.value = null;\n  open.value = true;\n  x.value = ev.clientX;\n  y.value = ev.clientY;\n  anchorX = ev.clientX; /* wiring:c4 */\n  anchorY = ev.clientY; /* wiring:c4 */\n  targetNodes.value = nodes;\n  // After the menu renders, clamp it inside the viewport so a click near the\n  // bottom/right edge doesn't push the menu off-screen (it opens down-right\n  // from the cursor by default).\n  await nextTick();\n  /* #196 — from the first frame on, the rows hold their places until the\n   * menu closes (lib/heldMenuRows). Taken after the render, so it is the list\n   * the opener's props hold for THIS opening. */\n  if (open.value) openedRows.value = visibleMenuRows(props.actions);\n  if (props.sheet) {\n    /* #196 — the sheet hangs from the bottom edge and grows upward: a row\n     * added at its end would lift every row above it. Held at the height it\n     * opened with, a late row scrolls into its list instead. */\n    const h = sheetEl.value?.getBoundingClientRect().height;\n    if (h) sheetHeight.value = h;\n    // bag:b4 — sheet mode: no anchoring; focus the panel so Esc closes it\n    // without requiring a prior click inside.\n    sheetEl.value?.focus();\n    return;\n  }\n  clampToViewport();\n  focusItem(0); /* wiring:c4 — keyboard nav starts on the first item */\n}\n\nfunction clampToViewport() {\n  const el = menuEl.value;\n  if (!el || typeof window === 'undefined') return;\n  /* Measure the natural height: drop a cap an earlier opening left behind. */\n  el.style.maxHeight = '';\n  el.style.overflowY = '';\n  const rect = el.getBoundingClientRect();\n  const margin = 8;\n  const vw = window.innerWidth;\n  const vh = window.innerHeight;\n  /* ⚠⚠ A menu taller than the window scrolls inside itself. Neither a flip nor\n   * a clamp can fit it, and without a height cap the items past the bottom edge\n   * are simply unreachable: installing a few apps (each adds its actions) put\n   * \"Lock probe\" below a 720px window and nothing could click it (0.44.0's gate\n   * run, spec 95, 2026-09-25). Set on the element here rather than in the\n   * template's :style, whose line the RTL audit allow-lists word for word. */\n  const room = vh - 2 * margin;\n  if (rect.height > room) {\n    el.style.maxHeight = room + 'px';\n    el.style.overflowY = 'auto';\n    y.value = margin;\n    x.value = openAlongInline(anchorX, rect.width, vw, dir.value, margin);\n    return;\n  }\n  /* wiring:c4 — edge flip: overflowing the bottom/right edge re-anchors the\n   * menu above/left of the cursor when there's room; clamping stays as the\n   * fallback for tiny viewports. */\n  if (anchorY + rect.height > vh - margin) {\n    const flipped = anchorY - rect.height;\n    y.value = flipped >= margin ? flipped : Math.max(margin, vh - rect.height - margin);\n  }\n  /* ⚠ RTL: the menu opens toward the inline END of the pointer — down-LEFT in\n   * a right-to-left interface — and flips to the other side the same way.\n   * `openAlongInline` is the flip-then-clamp this block used to spell out,\n   * mirrored for RTL; in LTR it is the same arithmetic, number for number. */\n  x.value = openAlongInline(anchorX, rect.width, vw, dir.value, margin);\n}\n\nfunction hide() {\n  open.value = false;\n  openedRows.value = null; /* #196 */\n  sheetHeight.value = null;\n  /* bag:b4 — reset any in-flight sheet drag so reopening starts clean. */\n  sheetDragging.value = false;\n  sheetDragY.value = 0;\n  /* wiring:c4 — give focus back to the opener (row/card/⋯ button). */\n  prevFocus?.focus?.();\n  prevFocus = null;\n}\n\n/* === wiring:c4 — keyboard navigation (menu + sheet) ===\n * Arrow keys cycle through enabled items, Home/End jump, Enter/Space\n * activate the focused <button> natively, Esc closes (see onKey). Disabled\n * buttons are unfocusable, so the query skips them by construction. */\nfunction menuItems(): HTMLElement[] {\n  const host = props.sheet ? sheetEl.value : menuEl.value;\n  if (!host) return [];\n  return Array.from(\n    host.querySelectorAll<HTMLElement>('.fe-ctx__item:not(:disabled)'),\n  );\n}\n\nfunction focusItem(idx: number) {\n  const items = menuItems();\n  if (items.length === 0) return;\n  const i = ((idx % items.length) + items.length) % items.length;\n  items[i]?.focus();\n}\n\nfunction moveFocus(delta: number) {\n  const items = menuItems();\n  if (items.length === 0) return;\n  const active = document.activeElement as HTMLElement | null;\n  const cur = active ? items.indexOf(active) : -1;\n  if (cur === -1) {\n    focusItem(delta > 0 ? 0 : items.length - 1);\n    return;\n  }\n  focusItem(cur + delta);\n}\n/* === /wiring:c4 === */\n\n/* bag:b4 — sheet drag-to-dismiss. Bound to the grab handle only, so the\n * scrollable item list keeps its native touch scrolling. Dragging past the\n * threshold closes; anything less snaps back. */\nconst sheetEl = ref<HTMLElement | null>(null);\nconst sheetDragging = ref(false);\nconst sheetDragY = ref(0);\nlet sheetDragStart = 0;\n\nfunction onSheetDragStart(e: TouchEvent) {\n  const t0 = e.touches[0];\n  if (!t0) return;\n  sheetDragging.value = true;\n  sheetDragStart = t0.clientY;\n  sheetDragY.value = 0;\n}\nfunction onSheetDragMove(e: TouchEvent) {\n  if (!sheetDragging.value) return;\n  const t0 = e.touches[0];\n  if (!t0) return;\n  sheetDragY.value = Math.max(0, t0.clientY - sheetDragStart);\n}\nfunction onSheetDragEnd() {\n  if (!sheetDragging.value) return;\n  const shouldClose = sheetDragY.value > 72;\n  sheetDragging.value = false;\n  if (shouldClose) {\n    hide();\n  } else {\n    sheetDragY.value = 0;\n  }\n}\n/* #196 — the height the sheet opened with, held while it is open (`show`). */\nconst sheetHeight = ref<number | null>(null);\nconst sheetStyle = computed(() => {\n  const style: Record<string, string> = {};\n  if (sheetHeight.value !== null) style.height = `${sheetHeight.value}px`;\n  if (sheetDragY.value > 0) {\n    style.transform = `translateY(${sheetDragY.value}px)`;\n    style.transition = 'none';\n  }\n  return Object.keys(style).length ? style : undefined;\n});\n/* /bag:b4 */\n\nfunction pick(a: ContextAction) {\n  if (a.disabled) return;\n  emit('select', a, targetNodes.value);\n  hide();\n}\n\nfunction onKey(e: KeyboardEvent) {\n  if (e.key === 'Escape') {\n    // Scoped close: Esc with the menu open closes ONLY the menu — the\n    // explorer's global onClose (which also dismisses modals/toasts)\n    // shouldn't fire underneath.\n    e.stopPropagation();\n    hide();\n    return;\n  }\n  if (e.key === 'Enter' || e.key === ' ') {\n    // Native button activation handles the pick; stop the bubble so the\n    // explorer's global Enter=open shortcut doesn't double-fire and pop\n    // the preview modal on top of the chosen action.\n    e.stopPropagation();\n    return;\n  }\n  /* wiring:c4 — arrow-key navigation; stopPropagation keeps the explorer's\n   * global shortcut handler (Enter=open, Backspace=up…) out of the loop\n   * while the menu is up. */\n  if (e.key === 'ArrowDown') {\n    e.preventDefault();\n    e.stopPropagation();\n    moveFocus(1);\n  } else if (e.key === 'ArrowUp') {\n    e.preventDefault();\n    e.stopPropagation();\n    moveFocus(-1);\n  } else if (e.key === 'Home') {\n    e.preventDefault();\n    focusItem(0);\n  } else if (e.key === 'End') {\n    e.preventDefault();\n    focusItem(-1);\n  } else if (e.key === 'Tab') {\n    // A menu is not a tab-stop container — Tab closes it (WAI-ARIA menu\n    // pattern) instead of tabbing behind the backdrop.\n    e.preventDefault();\n    hide();\n  }\n}\n\n/* wiring:c4 — hidden-entry filtering used to leave orphaned separators\n * (leading/trailing/doubled) when the entries around a divider were hidden\n * by RBAC or selection shape. Collapse them here so every visible divider\n * actually separates two groups (lib/heldMenuRows `visibleMenuRows`).\n *\n * ⚠⚠ #196 — and once the menu is open its rows HOLD STILL. A row that waits on\n * a server answer (\"Encrypt with E2EE…\" asks POST /api/files/e2e/allowed) used\n * to be drawn when the answer landed, pushing every row below it down while the\n * person was aiming: in the 0.53 release run a click pressed on \"Tags\" was\n * released on \"Star\". `openedRows` is the list as it was on the first frame;\n * while it is set, a row that goes away keeps its place greyed and a row that\n * comes late is added at the end (lib/heldMenuRows `heldMenuRows`). */\nconst openedRows = ref<ContextAction[] | null>(null);\nconst visibleActions = computed(() =>\n  openedRows.value ? heldMenuRows(openedRows.value, props.actions) : visibleMenuRows(props.actions),\n);\n\n/* #196 — a late row grows the menu downward, never moving what is drawn. Near\n * the bottom edge that would push the new row out of the window: the menu then\n * stops at the edge and scrolls inside itself, still without moving. */\nwatch(\n  () => visibleActions.value.length,\n  async () => {\n    if (!open.value || !openedRows.value || props.sheet) return;\n    await nextTick();\n    const el = menuEl.value;\n    if (!el || typeof window === 'undefined') return;\n    const rect = el.getBoundingClientRect();\n    const room = window.innerHeight - 8 - rect.top;\n    if (room > 0 && rect.height > room) {\n      el.style.maxHeight = room + 'px';\n      el.style.overflowY = 'auto';\n    }\n  },\n);\n\n/* The OS mode for `auto` (`data-prefers-dark`): composables/useSystemDark,\n   the one listener every core surface shares (#74). */\nconst prefersDark = useSystemDark();\n\nconst themeClass = computed(() => {\n  const t = props.theme || 'auto';\n  return `fe-ctx-backdrop--theme-${t}`;\n});\n\ndefineExpose({ show, hide });\n</script>\n\n<template>\n  <Teleport to=\"body\">\n    <transition :name=\"sheet ? 'fe-sheet' : 'fe-ctx'\">\n      <div\n        v-if=\"open\"\n        class=\"fe-ctx-backdrop\"\n        :dir=\"dir\"\n        :class=\"[themeClass, { 'fe-ctx-backdrop--sheet': sheet }]\"\n        :style=\"{ zIndex: layerZ /* katman:z1 */ }\"\n        :data-prefers-dark=\"prefersDark ? '1' : '0'\"\n        @click=\"hide\"\n        @contextmenu.prevent=\"hide\"\n        @keydown=\"onKey\"\n      >\n        <!-- bag:b4 — bottom-sheet variant (coarse pointer / touch) -->\n        <div\n          v-if=\"sheet\"\n          ref=\"sheetEl\"\n          class=\"fe-sheet\"\n          role=\"menu\"\n          :aria-label=\"t('sheet.menu')\"\n          tabindex=\"-1\"\n          :style=\"sheetStyle\"\n          @click.stop\n        >\n          <div\n            class=\"fe-sheet__handle\"\n            role=\"button\"\n            tabindex=\"0\"\n            :aria-label=\"t('sheet.close')\"\n            @click=\"hide\"\n            @keydown.enter.prevent=\"hide\"\n            @touchstart.passive=\"onSheetDragStart\"\n            @touchmove.passive=\"onSheetDragMove\"\n            @touchend=\"onSheetDragEnd\"\n            @touchcancel=\"onSheetDragEnd\"\n          />\n          <div class=\"fe-sheet__items\">\n            <template v-for=\"(a, i) in visibleActions\" :key=\"a.key || i\">\n              <div v-if=\"a.divider\" class=\"fe-ctx__sep\" role=\"separator\" />\n              <button\n                v-else\n                type=\"button\"\n                class=\"fe-ctx__item fe-sheet__item\"\n                :class=\"{ 'is-danger': a.danger, 'is-disabled': a.disabled }\"\n                :disabled=\"a.disabled\"\n                :title=\"a.title\"\n                :data-testid=\"a.testid\"\n                role=\"menuitem\"\n                @click=\"pick(a)\"\n              >\n                <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n                <span v-if=\"iconFor(a)\" class=\"fe-ctx__icon\" aria-hidden=\"true\" v-html=\"iconFor(a)\"></span>\n                <span v-else-if=\"a.icon\" class=\"fe-ctx__icon\" aria-hidden=\"true\">{{ a.icon }}</span>\n                <span class=\"fe-ctx__label\">{{ a.label }}</span>\n                <span v-if=\"hintFor(a)\" class=\"fe-ctx__key\" aria-hidden=\"true\">{{ hintFor(a) }}</span>\n              </button>\n            </template>\n          </div>\n        </div>\n        <div\n          v-else\n          ref=\"menuEl\"\n          class=\"fe-ctx\"\n          role=\"menu\"\n          aria-orientation=\"vertical\"\n          :aria-label=\"t('sheet.menu') /* wiring:c4 */\"\n          :style=\"{ top: y + 'px', left: x + 'px' }\"\n          @click.stop\n        >\n          <template v-for=\"(a, i) in visibleActions\" :key=\"a.key || i\">\n            <div v-if=\"a.divider\" class=\"fe-ctx__sep\" role=\"separator\" />\n            <button\n              v-else\n              type=\"button\"\n              class=\"fe-ctx__item\"\n              :class=\"{ 'is-danger': a.danger, 'is-disabled': a.disabled }\"\n              :disabled=\"a.disabled\"\n              :title=\"a.title\"\n              :data-testid=\"a.testid\"\n              role=\"menuitem\"\n              @click=\"pick(a)\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n              <span v-if=\"iconFor(a)\" class=\"fe-ctx__icon\" aria-hidden=\"true\" v-html=\"iconFor(a)\"></span>\n              <span v-else-if=\"a.icon\" class=\"fe-ctx__icon\" aria-hidden=\"true\">{{ a.icon }}</span>\n              <span class=\"fe-ctx__label\">{{ a.label }}</span>\n              <!-- tus:t1 — the key that does this from the keyboard, read from\n                   the registry so a remap reaches it. Empty for a verb with no\n                   binding, and the span then does not render at all. -->\n              <span v-if=\"hintFor(a)\" class=\"fe-ctx__key\" aria-hidden=\"true\">{{ hintFor(a) }}</span>\n            </button>\n          </template>\n        </div>\n      </div>\n    </transition>\n  </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Toolbar — selection-aware action row.\n *\n * Layout:\n *   - No selection            → [📁 New Folder]    [search | ⬆ ↻]   [☰ ▦]\n *   - Anything selected       → the SELECTION BAR (gorunum:v1-selbar, below):\n *                               a tinted row under the breadcrumb, in the\n *                               filter row's place.\n *\n * Presentational only — all logic (rename, share, …) lives in\n * FileExplorer.vue, which listens for `action` emits.\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue';\nimport type { ViewMode } from '../types/FileNode';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport ContextMenu, { type ContextAction } from './ContextMenu.vue';\n/* gorunum:v2-topbar — ViewSwitcher is no longer mounted here. It lives on the\n * breadcrumb row in EVERY profile now (FileExplorer renders it inside\n * `.fe-subhead__actions`), so the header and the crumb row can no longer end\n * up offering different view modes — which is what two mount points cost. */\nimport { useLocale } from '../composables/useLocale';\nimport { inlineEndX } from '../lib/direction';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport { eventMatchesShortcut, menuShortcutHint, shortcutHint } from '../composables/useKeyboardShortcuts';\n\nexport type SelectionMode = 'none' | 'single-file' | 'single-dir' | 'multi';\n\n/* gorunum:v1-icons — the glyph for a toolbar row. Identical resolution to the\n * context menu's (lib/actionIcons by key, `icon` overriding when a row names a\n * variant or an embedder supplies its own mark), because the toolbar and the\n * menu render the SAME ContextAction[] and must not drift apart visually any\n * more than they may drift apart in content. */\nfunction iconFor(a: ContextAction): string {\n  return actionIconSvg(a.icon || a.key);\n}\n\nconst props = defineProps<{\n  viewMode: ViewMode;\n  searchQuery: string;\n  /**\n   * Tells the toolbar which action set to render (a `.trash/` listing\n   * gets a restore-only menu instead of cut/copy/etc).\n   */\n  trashActive: boolean;\n  /**\n   * The action list to render, supplied by FileExplorer. This is the SAME\n   * list the right-click context menu renders for the current selection, so\n   * the two menus can never drift apart. Dividers/hidden entries are filtered\n   * out here (the toolbar is a flat row).\n   */\n  actions: ContextAction[];\n  /** Current selection metadata — toolbar uses this to pick its mode. */\n  selectionMode?: SelectionMode;\n  /**\n   * gorunum:v1-selbar — how many rows are ticked, for the bar's \"16 selected\".\n   *\n   * Optional, and the bar does not depend on it: when the parent does not pass\n   * one the count is read off the listing itself (`[data-fe-path]` rows carry\n   * `aria-selected`, in all three views). A number handed down here always\n   * wins — it is the selection the parent actually holds, and the DOM is only\n   * a mirror of it.\n   */\n  selectionCount?: number;\n  /**\n   * pane:p1 — WHICH pane the selection belongs to, as its `data-pane` value.\n   *\n   * ⚠⚠ This is not cosmetic and it is not optional once there are two panes.\n   * The bar is teleported into a slot inside the pane it acts on, and both\n   * halves of a split render `.fe__primary > .fe-selbar-slot` — so a\n   * `querySelector` answers in DOCUMENT order and always hands back the LEFT\n   * one. Measured 2026-09-13 before this prop existed: ticking rows in the\n   * right-hand pane raised no bar at all, and the bar standing over the left\n   * pane still described the left pane's older selection.\n   *\n   * Absent (a bare `<Toolbar>` in a test, an embedder with one listing) keeps\n   * the old behaviour: the first `.fe__primary` in the root.\n   */\n  selectionPane?: string;\n  /** True when clipboard has cut/copy items, so we can enable Paste. */\n  pasteEnabled?: boolean;\n  /**\n   * True when the current dir has a parent the user can step up to.\n   *\n   * ⚠ gorunum:v2-topbar — NOT DRAWN any more, in either layout. \"Up one\n   * level\" and the parent crumb walk to the same folder, and the crumb is\n   * always on screen (the trail collapses to `root › … › parent › current`\n   * and never past it), so the button was the same verb twice. The keyboard\n   * binding and the `go-up` emit are untouched; the prop stays because\n   * embedders pass it and because a header that wants the button back has\n   * everything it needs here.\n   */\n  canGoUp?: boolean;\n  /**\n   * Multi-storage virtual root marker — when true, mutation buttons\n   * (New Folder / Upload / Paste) are hidden because there's no real\n   * backend folder to write to.\n   */\n  atVirtualRoot?: boolean;\n  /**\n   * RBAC: false hides the write affordances (New Folder / Upload / Paste) when\n   * the current user lacks edit on this directory. Undefined = no RBAC gating\n   * (backward-compatible for embedders that don't pass it).\n   */\n  canWrite?: boolean;\n  locale: LocaleCode;\n  /**\n   * bag:b4 — narrow/embed mini mode. When true the toolbar collapses to\n   * [↑?] [🔍] [⬆] [⋯]: secondary actions (New Folder, Refresh, density,\n   * view switcher, selection actions, Paste) move into the \"⋯\" overflow\n   * menu and search expands from an icon to a full-width input. When\n   * absent/false the classic wide layout renders unchanged.\n   */\n  narrow?: boolean;\n  /**\n   * bag:b4 — resolved theme, forwarded to the teleported overflow menu\n   * (which loses the `.fe` variable scope under <body>).\n   */\n  theme?: ThemeMode;\n  /* koru:k1 — inspector (details panel) toggle state, for the pressed style. */\n  inspectorOpen?: boolean;\n  /**\n   * gezinti:g1 — navigation panel state, for the pressed style on the toggle.\n   * The panel has its own collapse control, but a narrow explorer renders it\n   * as a drawer that is off screen when closed, so the only way back to it is\n   * from here.\n   */\n  navOpen?: boolean;\n  /** gezinti:g1 — false when the deployment has no navigation panel; the\n   *  toggle then has nothing to toggle and is not rendered. */\n  navEnabled?: boolean;\n  /**\n   * gezinti:g1 — view modes to offer. Absent = all three (the historical\n   * behaviour). `ExplorerConfig.uiProfile: 'simple'` narrows it to list+grid:\n   * a four-way switcher is one of the things the reporter in #14 named as\n   * \"power user tool\", and gallery is the one nobody outside photos asks for.\n   */\n  viewModes?: ViewMode[];\n  /* === surucu:d1 — the shell ========================================== */\n  /**\n   * ⚠ There is no `shell` prop any more. There used to be one ('classic' vs\n   * 'drive') and it decided which header a surface got; the header below is\n   * now the only one there is, at every width and in every embed. Density,\n   * theme, the shortcut editor, the tour and the other view modes live in the\n   * \"⋯\" menu it renders — nothing was dropped from the build, and a control\n   * that is on screen in one profile and unreachable in another was the\n   * capability split this removed.\n   */\n  /** Folder name for the search field's placeholder (\"Search in Photos\"). */\n  scopeLabel?: string;\n  /* gorunum:v3-shell — the product mark, for a host that cannot fill the\n     `#brand` slot. See ExplorerConfig.brand: a `<filex-explorer>` host cannot,\n     measured, so these are the only door it has. The slot still wins — they are\n     rendered as its FALLBACK content, which is the mechanism for \"use mine if\n     you gave me one\", with no condition to keep in step. */\n  brandName?: string;\n  brandMarkUrl?: string;\n  /**\n   * gorunum:v3-shell — this surface has no listing for the field to narrow, so\n   * Enter hands the query to the command palette instead.\n   *\n   * ⚠ It exists because putting Home inside this header gave Home a search box,\n   * and a box that swallows what you type is worse than no box: measured on the\n   * landing page, typing filtered nothing, showed nothing and re-fetched the two\n   * per-user lists on every keystroke. The palette IS \"search everywhere\" — it\n   * is what the ⌘K chip on this very field already promises — so on a surface\n   * with nothing to filter, that is where the words go.\n   *\n   * ⚠ Gated rather than universal: in a folder, Enter must keep meaning\n   * \"nothing new\", because the debounced input has already run the search.\n   */\n  searchEscalates?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'update:viewMode', v: ViewMode): void;\n  (e: 'update:searchQuery', v: string): void;\n  /* gorunum:v1-advsearch — the filter affordance inside the search field.\n     Carries the text already typed so the dialog continues this search\n     instead of opening an empty second one, exactly as the ⌘K chip does. */\n  (e: 'open-advanced-search', v: string): void;\n  (e: 'new-folder'): void;\n  (e: 'upload'): void;\n  (e: 'refresh'): void;\n  (e: 'go-up'): void;\n  (e: 'action', key: string): void;\n  (e: 'open-recents'): void;\n  (e: 'update:density', v: Density): void;\n  (e: 'toggle-inspector'): void /* koru:k1 */;\n  (e: 'toggle-nav'): void /* gezinti:g1 */;\n  (e: 'open-theme'): void /* wiring:c1 — tema galerisi */;\n  (e: 'open-shortcut-settings'): void /* wiring:c2 */;\n  (e: 'open-timezone'): void /* zaman:z3 */;\n  /* surucu:d1 — escalate this query into the command palette (⌘K/Ctrl+K). */\n  (e: 'open-palette', query: string): void;\n}>();\n\n// Density toggle — the toolbar owns the persisted preference; the parent\n// only mirrors the value into a root class so both views pick it up.\nexport type Density = 'comfortable' | 'compact';\nconst DENSITY_LS_KEY = 'filex.density';\nconst density = ref<Density>(\n  (() => {\n    try {\n      return localStorage.getItem(DENSITY_LS_KEY) === 'compact' ? 'compact' : 'comfortable';\n    } catch {\n      return 'comfortable';\n    }\n  })(),\n);\n/**\n * gorunum:v1 — someone else may own this preference too.\n *\n * The web app's user-settings modal writes the same `filex.density` key, and\n * this component read it exactly once at setup — so flipping \"compact file\n * list\" there did nothing until the explorer was mounted again. A `storage`\n * event covers another tab; a same-tab write needs the writer to say so, which\n * is what the custom event is for.\n */\nfunction adoptStoredDensity() {\n  try {\n    const v = localStorage.getItem(DENSITY_LS_KEY) === 'compact' ? 'compact' : 'comfortable';\n    if (v !== density.value) {\n      density.value = v;\n      emit('update:density', v);\n    }\n  } catch {\n    /* storage blocked */\n  }\n}\nfunction onDensityStorage(e: StorageEvent) {\n  if (e.key === null || e.key === DENSITY_LS_KEY) adoptStoredDensity();\n}\n\nonMounted(() => {\n  emit('update:density', density.value);\n  window.addEventListener('storage', onDensityStorage);\n  window.addEventListener('filex:density', adoptStoredDensity);\n});\nonBeforeUnmount(() => {\n  window.removeEventListener('storage', onDensityStorage);\n  window.removeEventListener('filex:density', adoptStoredDensity);\n});\n\nfunction toggleDensity() {\n  density.value = density.value === 'compact' ? 'comfortable' : 'compact';\n  try {\n    localStorage.setItem(DENSITY_LS_KEY, density.value);\n  } catch {\n    /* quota */\n  }\n  emit('update:density', density.value);\n}\n\nconst { t, dir } = useLocale(() => props.locale);\n\nconst searchEl = ref<HTMLInputElement | null>(null);\nconst localSearch = ref(props.searchQuery);\n\nwatch(() => props.searchQuery, (v) => {\n  localSearch.value = v;\n});\n\nlet debounce: ReturnType<typeof setTimeout> | undefined;\nfunction onSearchInput(ev: Event) {\n  const v = (ev.target as HTMLInputElement).value;\n  localSearch.value = v;\n  if (debounce) clearTimeout(debounce);\n  debounce = setTimeout(() => emit('update:searchQuery', v), 200);\n}\n\nasync function focusSearch() {\n  /* bag:b4 — the field used to be collapsed behind a magnifier at this width\n     and this had to expand it first. It is on screen in both layouts now, so\n     there is nothing to open; the tick stays because a caller may have just\n     mounted the row. */\n  await nextTick();\n  searchEl.value?.focus();\n  searchEl.value?.select();\n}\n\ndefineExpose({ focusSearch });\n\nconst mode = computed<SelectionMode>(() => props.selectionMode ?? 'none');\n\n// The visible action buttons = the shared list from FileExplorer, minus\n// dividers and hidden entries (the toolbar is a flat row, not a dropdown).\n// Disabled entries render greyed-out. Because this is the SAME list the\n// context menu uses, the two menus are guaranteed to match.\nconst toolbarItems = computed(() => props.actions.filter((a) => !a.divider && !a.hidden));\n\n/* === gorunum:v1-selbar — the selection bar ===========================\n * Measured on the reference shell: the moment anything is ticked the FILTER\n * ROW is replaced by a tinted bar — \"16 selected\", then icon-only actions\n * (download · share · move · copy to · star · delete), then an × that clears\n * the selection. What filex did instead was fill the toolbar's primary row\n * with labelled buttons, one of them a loud red Delete.\n *\n * It is not a second menu. The icons are the SAME `ContextAction[]` the\n * right-click menu renders (`selectionActionList` in FileExplorer, handed here\n * as `actions`), in the order FileExplorer built them; the bar only chooses\n * which of them it can say with a glyph, and everything else — open, preview,\n * rename, tags, paste, the keep-on-device rows — is one click away in the\n * bar's own \"⋯\". Nothing is removed from the build.\n *\n * ⚠ Why the bar is TELEPORTED out of this component: the row it replaces lives\n * under the breadcrumb, inside `.fe__primary`, two boxes below the toolbar.\n * The toolbar is the only component handed the selection, so the bar is\n * RENDERED here and MOUNTED there, into a slot this component inserts right\n * after the breadcrumb wrapper. DOM order then still matches reading order\n * (the bar comes before the listing it acts on), which a `order:` trick on the\n * flex column would have broken for anyone tabbing through the page.\n * ⚠ With no `.fe__primary` to mount into (a bare `<Toolbar>` in a test, an\n * embedder using this component on its own) the Teleport is DISABLED and the\n * bar renders in place, so the actions never disappear.\n */\n\n/** Keys the bar is willing to say with a glyph alone. The reference draws six\n *  — download, share, move, copy to, star, delete — which are filex's\n *  download / access / cut / copy / star / delete; `restore` joins them for a\n *  `.trash/` listing, whose whole vocabulary is restore + delete.\n *  ⚠ A SET, never an order: the bar walks `actions` in the parent's order, so\n *  it cannot end up disagreeing with the right-click menu about what comes\n *  first (filex lesson #67 — one list, two renderers). */\nconst BAR_ICON_KEYS = new Set(['download', 'access', 'cut', 'copy', 'star', 'restore', 'delete']);\n\nconst hasSelection = computed(() => mode.value !== 'none');\n\n/** The row's two halves, in ONE pass over the parent's list so the order is\n *  the parent's. A key is promoted only if it also HAS a glyph — an icon-only\n *  button with no icon is an empty 28px box. */\nconst barSplit = computed(() => {\n  const icons: ContextAction[] = [];\n  const rest: ContextAction[] = [];\n  /* ⚠ Walks the parent's list WITH its dividers, not `toolbarItems`. The \"⋯\"\n   * is a dropdown drawn by the same ContextMenu as the right click, and the\n   * dividers are what group it: the owner asked for a line between every\n   * app's actions (lib/pluginMenu → one `sep-plugin:*` per app), and a \"⋯\"\n   * built from the divider-free list ran Open, Rename, Tags and two apps'\n   * verbs together as one undivided column while the right click beside it\n   * drew the lines. An icon never takes a divider; ContextMenu collapses the\n   * ones that end up leading, trailing or doubled once the icons are pulled\n   * out. `restCount` is the number of REAL entries — a \"⋯\" whose menu is\n   * nothing but dividers would open an empty box. */\n  let restCount = 0;\n  for (const a of props.actions) {\n    if (a.hidden) continue;\n    if (a.divider) {\n      rest.push(a);\n      continue;\n    }\n    if (BAR_ICON_KEYS.has(a.key) && iconFor(a)) icons.push(a);\n    else {\n      rest.push(a);\n      restCount++;\n    }\n  }\n  return { icons, rest: restCount ? rest : [], restCount };\n});\n\n/* ── folding (kept from ui-fix, moved onto the bar) ───────────────────\n * Actions that do not fit fold into the \"⋯\" instead of wrapping the row onto\n * a second line. Widths come from a hidden measurement strip that renders the\n * SAME buttons as the visible row — measure a node nobody sees and the\n * arithmetic is about a width nothing has. */\nconst selBarEl = ref<HTMLElement | null>(null);\nconst measureEl = ref<HTMLElement | null>(null);\nconst selMoreBtnEl = ref<HTMLElement | null>(null);\nconst selMoreRef = ref<InstanceType<typeof ContextMenu> | null>(null);\nconst visibleActionCount = ref(Number.MAX_SAFE_INTEGER);\nconst visibleBarItems = computed(() => barSplit.value.icons.slice(0, visibleActionCount.value));\nconst foldedBarItems = computed(() => barSplit.value.icons.slice(visibleActionCount.value));\n/** The bar's \"⋯\": what did not fit, then everything that was never an icon. */\nconst barMenuItems = computed<ContextAction[]>(() => {\n  const folded = foldedBarItems.value;\n  const rest = barSplit.value.rest;\n  if (folded.length && rest.length) {\n    return [...folded, { divider: true, key: 'selbar-sep', label: '' }, ...rest];\n  }\n  return [...folded, ...rest];\n});\nconst SELBAR_MORE_BTN_W = 32;\n\nfunction recalcFold() {\n  const cont = selBarEl.value;\n  const meas = measureEl.value;\n  const all = barSplit.value.icons.length;\n  if (!cont || !meas) {\n    visibleActionCount.value = all;\n    return;\n  }\n  const gap = parseFloat(getComputedStyle(cont).gap) || 4;\n  const widths = (Array.from(meas.children) as HTMLElement[]).map((c) => c.offsetWidth + gap);\n  const total = widths.reduce((s, w) => s + w, 0);\n  const avail = cont.clientWidth;\n  // The \"⋯\" is already on screen whenever something never was an icon, so its\n  // width is not free room; when nothing is folded away yet it still has to be\n  // paid for the moment the first icon folds.\n  const moreW = (selMoreBtnEl.value?.offsetWidth || SELBAR_MORE_BTN_W) + gap;\n  if (total <= avail - (barSplit.value.rest.length ? moreW : 0)) {\n    visibleActionCount.value = widths.length;\n    return;\n  }\n  let used = moreW;\n  let count = 0;\n  for (const w of widths) {\n    if (used + w > avail) break;\n    used += w;\n    count += 1;\n  }\n  visibleActionCount.value = count;\n}\n\nlet foldRo: ResizeObserver | undefined;\nwatch(selBarEl, (el) => {\n  foldRo?.disconnect();\n  foldRo = undefined;\n  if (el && typeof ResizeObserver !== 'undefined') {\n    foldRo = new ResizeObserver(() => recalcFold());\n    foldRo.observe(el);\n  }\n  void nextTick(recalcFold);\n});\nonBeforeUnmount(() => foldRo?.disconnect());\nwatch(\n  () => [toolbarItems.value, props.narrow, props.trashActive, mode.value] as const,\n  () => void nextTick(recalcFold),\n  { deep: false },\n);\n\nfunction openBarMore() {\n  const r = selMoreBtnEl.value?.getBoundingClientRect();\n  // ⚠ RTL: from the button's END edge (its left in RTL) — ContextMenu flips it\n  // back under the button from there, in either direction.\n  selMoreRef.value?.show({ clientX: r ? inlineEndX(r, dir.value) : 0, clientY: r ? r.bottom + 4 : 0 } as MouseEvent, []);\n}\n\n/* ── where the bar lands ──────────────────────────────────────────────── */\nconst rootEl = ref<HTMLElement | null>(null);\n/** The slot this component mounts the bar into, inside `.fe__primary` — one\n *  row above the filter row, and below both the crumbs and the tab strip.\n *  `shallowRef` on purpose: a DOM node is not state to make reactive. */\nconst selSlot = shallowRef<HTMLElement | null>(null);\n/** True when WE created the slot, so teardown only removes our own node. */\nconst selSlotOwned = ref(false);\n/** The listing's own ground, for the × (see clearSelection). */\nconst selBodyEl = shallowRef<HTMLElement | null>(null);\nconst selPrimaryEl = shallowRef<HTMLElement | null>(null);\n\n/**\n * Which `.fe__primary` this bar belongs to right now.\n *\n * ⚠ `selectionPane` is our own prop and only ever 'main' / 'split', but it is\n * interpolated into a selector, so anything that is not a bare identifier is\n * refused rather than escaped — a selector built from unvetted text is a\n * selector that can be made to match something else.\n */\nfunction findPrimary(): HTMLElement | null {\n  const root = rootEl.value?.closest('.fe');\n  if (!root) return null;\n  const pane = props.selectionPane;\n  if (pane && /^[A-Za-z][\\w-]*$/.test(pane)) {\n    const owned = root.querySelector<HTMLElement>(`.fe__primary[data-pane=\"${pane}\"]`);\n    if (owned) return owned;\n  }\n  return root.querySelector<HTMLElement>('.fe__primary');\n}\n\n/** Let go of the slot we are pointing at, removing it only if we made it. */\nfunction releaseSelSlot() {\n  const prev = selSlot.value;\n  if (prev) {\n    prev.classList.remove('is-active');\n    if (selSlotOwned.value) prev.remove();\n  }\n  selSlot.value = null;\n  selSlotOwned.value = false;\n}\n\n/**\n * Point the teleport at the pane that owns the selection.\n *\n * ⚠⚠ Called on mount AND whenever `selectionPane` changes — the original was a\n * one-shot `onMounted`, and a cached node is the whole bug: with two panes it\n * cached the left one forever, so the right pane could never raise a bar and\n * the left pane's bar described a selection nobody was touching.\n *\n * ⚠ `isConnected` is checked too, not just identity: the split pane is keyed\n * on the active tab, so switching tabs REPLACES its DOM and would otherwise\n * leave the teleport aimed at a detached node — a bar that renders into\n * nothing looks exactly like a bar that was never built.\n */\nfunction resolveSelSlot() {\n  const primary = findPrimary();\n  if (!primary) {\n    releaseSelSlot();\n    selPrimaryEl.value = null;\n    selBodyEl.value = null;\n    return;\n  }\n  if (selPrimaryEl.value === primary && selSlot.value?.isConnected) return;\n  releaseSelSlot();\n  selPrimaryEl.value = primary;\n  selBodyEl.value = primary.querySelector<HTMLElement>(':scope > .fe__body');\n  /* gorunum:v2-topbar — prefer the slot the PARENT rendered.\n   * ⚠ The row the bar has to sit under is now the tab strip, and the strip is\n   * `v-if`'d on there being a tab — which is seeded in FileExplorer's own\n   * onMounted, i.e. after this one. A node inserted here \"after the crumbs\"\n   * would therefore land ABOVE a strip that appears a tick later, and the\n   * selection bar would sit between the crumbs and the tabs for the rest of\n   * the session. So FileExplorer renders `.fe-selbar-slot` itself, in the\n   * right place, declaratively; this fallback is for a bare <Toolbar> in a\n   * test and for an embedder mounting the component on its own. */\n  const existing = primary.querySelector<HTMLElement>(':scope > .fe-selbar-slot');\n  if (existing) {\n    selSlot.value = existing;\n    selSlotOwned.value = false;\n  } else {\n    const slot = document.createElement('div');\n    slot.className = 'fe-selbar-slot';\n    /* ⚠ Two queries, not one comma list: `querySelector` answers in DOCUMENT\n     * order, so a list would hand back the crumb row (which comes first) even\n     * when a tab strip is standing below it. */\n    const head =\n      primary.querySelector<HTMLElement>(':scope > .fe-tabs') ??\n      primary.querySelector<HTMLElement>(':scope > .fe-subhead, :scope > .fe-subhead--plain');\n    if (head) head.insertAdjacentElement('afterend', slot);\n    else primary.prepend(slot);\n    selSlot.value = slot;\n    selSlotOwned.value = true;\n  }\n  syncSlotActive();\n  reobserveSelection();\n}\n\nonMounted(resolveSelSlot);\nonBeforeUnmount(releaseSelSlot);\n\n/** The filter row hides behind `.fe-selbar-slot.is-active ~ .fe-filterbar`\n *  (styles/base.css). A class toggled here rather than `:has()` on the slot:\n *  the state is known in JS, and a rule that depends on a teleport having\n *  landed is a rule that is right only after a repaint.\n *  ⚠ `releaseSelSlot` clears the class off the slot we are leaving, so the\n *  pane we walked away from does not keep its filter row hidden. */\nfunction syncSlotActive() {\n  selSlot.value?.classList.toggle('is-active', hasSelection.value);\n}\nwatch(hasSelection, syncSlotActive, { immediate: true });\n\n/* The bar follows the focus. Re-resolving on `hasSelection` too is what covers\n * a pane that was remounted (a tab switch) while nothing was selected. */\nwatch([() => props.selectionPane, hasSelection], () => resolveSelSlot());\n\n/* ── how many ─────────────────────────────────────────────────────────── */\nconst domSelCount = ref(0);\nlet selMo: MutationObserver | undefined;\nlet selTick = false;\nfunction recountSelection() {\n  const primary = selPrimaryEl.value;\n  if (!primary) return;\n  // `[data-fe-path]` is the row/card in all three views, and `aria-selected`\n  // is the contract they already publish for a screen reader. No view-private\n  // class, and nothing that is not a listing row can match.\n  domSelCount.value = primary.querySelectorAll('[data-fe-path][aria-selected=\"true\"]').length;\n}\nfunction scheduleRecount() {\n  if (selTick) return;\n  selTick = true;\n  const later = (cb: () => void) =>\n    typeof requestAnimationFrame === 'function' ? requestAnimationFrame(cb) : setTimeout(cb, 16);\n  later(() => {\n    selTick = false;\n    recountSelection();\n  });\n}\n/**\n * (Re)attach the row counter to the pane the bar is standing in.\n *\n * ⚠ The observer is torn down and rebuilt rather than left where it was: it\n * watches ONE `.fe__primary`, and after a focus change that is the wrong one —\n * the fallback count would then be the other pane's ticked rows.\n */\nfunction reobserveSelection() {\n  selMo?.disconnect();\n  selMo = undefined;\n  if (!hasSelection.value) {\n    domSelCount.value = 0;\n    return;\n  }\n  recountSelection();\n  if (typeof MutationObserver === 'undefined' || !selPrimaryEl.value) return;\n  selMo = new MutationObserver(scheduleRecount);\n  selMo.observe(selPrimaryEl.value, {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeFilter: ['aria-selected'],\n  });\n}\nwatch(hasSelection, reobserveSelection);\nonBeforeUnmount(() => selMo?.disconnect());\n\n/** Never smaller than what the mode already proves: 'multi' is at least two\n *  rows even in the frame before the listing has been counted. */\nconst selectedCount = computed(() => {\n  if (typeof props.selectionCount === 'number') return props.selectionCount;\n  if (mode.value === 'none') return 0;\n  return Math.max(domSelCount.value, mode.value === 'multi' ? 2 : 1);\n});\nconst selectionLabel = computed(() => t('selection.count', { n: String(selectedCount.value) }));\n\nfunction clearSelection() {\n  /* The gesture the explorer already owns: a click on the listing's empty\n   * ground (`@click.self=\"selection.clear()\"` on `.fe__body`). Dispatched ON\n   * that element, so `event.target === event.currentTarget` and Vue's `.self`\n   * lets it through — the × therefore goes through the SAME clear a user's own\n   * click does instead of a second path that can drift from it.\n   * The emit is for a parent that would rather own the verb: an unhandled key\n   * falls through `dispatchItemAction` without doing anything. */\n  emit('action', 'clear-selection');\n  selBodyEl.value?.dispatchEvent(new MouseEvent('click', { bubbles: true }));\n}\n/* === /gorunum:v1-selbar ============================================== */\n\nfunction fire(key: string) {\n  emit('action', key);\n}\n\n/* === bag:b4 — narrow-mode state: the \"⋯\" overflow menu ===================\n * ⚠ `searchOpen` / `openSearch` / `closeSearch` went with the layout that\n * needed them: at 390px the field is in the row itself now, so there is no\n * collapsed state to expand and no magnifier to press. `.fe-toolbar--searching`\n * in styles/base.css is that state's leftover and matches nothing.\n */\n\n// Coarse-pointer detection — the overflow menu renders as a bottom sheet on\n// touch devices, matching the file context menu.\nconst coarse = ref(false);\nlet coarseMq: MediaQueryList | undefined;\nfunction syncCoarse(e?: MediaQueryListEvent | MediaQueryList) {\n  coarse.value = !!(e && 'matches' in e && e.matches);\n}\nonMounted(() => {\n  if (typeof window === 'undefined' || !window.matchMedia) return;\n  coarseMq = window.matchMedia('(pointer: coarse)');\n  syncCoarse(coarseMq);\n  coarseMq.addEventListener?.('change', syncCoarse);\n});\nonBeforeUnmount(() => {\n  coarseMq?.removeEventListener?.('change', syncCoarse);\n});\n\nconst moreBtnEl = ref<HTMLElement | null>(null);\nconst moreRef = ref<InstanceType<typeof ContextMenu> | null>(null);\n\n// Everything the wide toolbar renders as standalone buttons, folded into one\n// action list: folder-level writes (New Folder / Paste), the shared\n// selection actions, then the view utilities (Refresh / density / view mode).\n/* gezinti:g1 — is this view mode on offer? No prop = all of them, so every\n   embedder that predates uiProfile keeps the switcher it had. */\nfunction offersView(v: ViewMode): boolean {\n  return !props.viewModes || props.viewModes.includes(v);\n}\n\n/* surucu:d1 — the tail of the \"⋯\" menu on its own: everything that is a\n * SETTING of the explorer rather than an action on a file. The narrow layout\n * shows it after the write/selection actions (unchanged); the drive header\n * shows only this half, because in that layout the selection actions are\n * already on screen as buttons and a menu that repeats them is a second door\n * to the same room. */\nconst utilityActions = computed<ContextAction[]>(() => {\n  const list: ContextAction[] = [];\n  /* ⚠ Only in the narrow layout, and that is a duplicate being REMOVED rather\n     than a layout rule. The wide header draws a Refresh button in its own\n     trailing cluster, three glyphs to the left of this menu — so listing it\n     here as well was the same verb twice on one row. The narrow header has no\n     Refresh button (the cluster there is AI · \"⋯\" · the host's doors), so at\n     that width the menu is the only door and it stays. Provable from inside\n     this component: the button and this row are drawn by the same file, under\n     the same `narrow` flag. */\n  if (props.narrow) list.push({ key: 'refresh', label: t('toolbar.refresh') });\n  list.push({\n    key: 'density',\n    label:\n      density.value === 'compact'\n        ? t('toolbar.density.comfortable')\n        : t('toolbar.density.compact'),\n  });\n  /* wiring:d2 — narrow-mode ⋯ menu: BOTH inactive views are listed\n     (list/grid/gallery); the old single toggle fell short with three modes. */\n  if (props.viewMode !== 'list' && offersView('list')) list.push({ key: 'view-list', label: t('toolbar.view.list') });\n  if (props.viewMode !== 'grid' && offersView('grid')) list.push({ key: 'view-grid', label: t('toolbar.view.grid') });\n  if (props.viewMode !== 'gallery' && offersView('gallery')) list.push({ key: 'view-gallery', label: t('toolbar.view.gallery') });\n  /* /wiring:d2 */\n  /* ⚠ No navigation row here any more, and nothing replaced it.\n     gezinti:g1 added one because the toolbar's own toggle was hidden while the\n     narrow search field was expanded — and that expanded-search layout no\n     longer exists (see the bag:b4 note at the top of this file). The hamburger\n     in `.fe-toolbar__brand` is drawn at EVERY width and in every embed under\n     exactly the condition this row was pushed under (`navEnabled !== false`),\n     so the row could only ever be a second copy of a button that is always on\n     screen. */\n  /* koru:k1 — inspector toggle also reachable from the narrow overflow menu */\n  list.push({ key: 'inspector', label: t('toolbar.inspector') });\n  /* wiring:c1 — the theme gallery is opened from the ⋯ menu in narrow mode too */\n  list.push({ key: 'theme', label: t('theme.menu') });\n  /* zaman:z3 — the embed's time-zone setting. An embed has no settings dialog,\n     so this menu is its only door; a host with its own settings surface (the\n     filex web app) claims the settings half and drops this row, because its\n     dialog already carries the same picker. */\n  list.push({ key: 'timezone', label: t('tz.menu') });\n  list.push({ key: 'shortcut-settings', label: t('shortcuts.settings.menu') }) /* wiring:c2 */;\n  list.push({ key: 'tour', label: t('tour.restart') }); /* wiring:c4 */\n  return list;\n});\n\n/** The narrow layout's whole menu: the folder/selection verbs first, then\n *  whatever is left of the settings half (which a host may have claimed —\n *  see `publishHeaderMenu`, hence the parameter rather than a closure). */\nfunction narrowActions(util: ContextAction[]): ContextAction[] {\n  const list: ContextAction[] = [];\n  const writable =\n    !props.trashActive && !props.atVirtualRoot && props.canWrite !== false;\n  if (mode.value === 'none' && writable) {\n    list.push({ key: 'new-folder', label: t('toolbar.new_folder') });\n    if (props.pasteEnabled) list.push({ key: 'paste', label: t('ctx.paste') });\n  }\n  /* gorunum:v1-selbar — the selection's verbs are on screen in the selection\n     bar now, and the ones it could not draw are in the bar's own \"⋯\". Listing\n     them here as well would be a second door into the same room — the reason\n     the drive header already carries only the settings half. */\n  if (!hasSelection.value) list.push(...toolbarItems.value);\n  if (!util.length) return list;\n  if (list.length) list.push({ divider: true, key: 'bag-sep', label: '' });\n  list.push(...util);\n  return list;\n}\n\n/* === surucu:d1 — the drive header's search field ======================\n * ONE field, and it is the one the toolbar already had: typing here sets\n * `searchQuery`, which the explorer answers with\n * `?action=search&filter=…` — a real search of the folder you are standing in,\n * exactly as before.\n *\n * The ⌘K chip beside it is the ESCALATION, not a second box: it opens the\n * command palette carrying whatever has been typed, and the palette is where\n * \"everywhere\" lives (the global endpoint, saved searches, and the commands).\n * That is why the hint can sit on this field honestly — Ctrl+K from here does\n * what the hint says, and Ctrl+K from anywhere else still opens the palette\n * as it has since cila:c.\n */\n/* ⚠ Read from the registry, not written here. This chip used to print a\n * hardcoded `⌘ K` / `Ctrl K`, which stopped being true the moment anyone\n * remapped the palette in the shortcut settings — the chip then named a\n * key that did nothing, on the one control whose whole job is to teach\n * that key. */\nconst paletteCombo = computed(() => shortcutHint('palette'));\n\n/* tus:t1 — a button's tooltip names its key. Same source as the right-click\n * menu's key column, so the two can only ever say the same thing, and a verb\n * with no binding gets its plain label back rather than an empty bracket. */\nfunction withKey(label: string, key: string): string {\n  const combo = menuShortcutHint(key);\n  return combo ? `${label} (${combo})` : label;\n}\n\n/* === gezinti:g2 — the collapse control says what it DOES ==================\n *\n * The button's label was `toolbar.nav` — \"Navigation\" / \"Gezinti\", a NOUN\n * naming the panel, which never says the button does anything to it. Measured\n * by the agent that narrowed the panel: the control works at every width; the\n * owner still could not find how to collapse the panel, because nothing on\n * screen said it could be collapsed. A static \"Show or hide navigation\" was\n * the stopgap; this is the fix, and it brings `sidenav.collapse` /\n * `sidenav.expand` back from being orphaned when the in-panel toggle went.\n *\n * ⚠⚠ TWO pairs, because `navOpen` means two different things.\n * `FileExplorer` hands down `isNarrow ? navDrawerOpen : sideNavExpanded`:\n *   · wide  — the panel is always on screen; the toggle moves it between a\n *             full column and a 56px icon rail. It is a WIDTH change, so:\n *             collapse / expand.\n *   · ≤560  — the panel is a DRAWER over the listing behind a scrim, and\n *             \"closed\" means it is not on screen at all. Nothing narrows, so\n *             \"expand\" would promise a width change to something that has no\n *             width; the pair there is open / close (`sidenav.close` is the\n *             string the drawer's own dismiss and its scrim already use, so\n *             the two doors out of the drawer say the same words).\n * Forcing one pair onto both widths would make the label wrong at one of them,\n * which is the failure this whole change is undoing.\n *\n * ⚠ ONE computed, bound to BOTH `title` and `aria-label`, so the tooltip and\n * the screen reader cannot be told two different things (the same rule the AI\n * affordance above is built on).\n *\n * ⚠ `aria-pressed` is left as it was, deliberately. With a state-bound label\n * it is arguably redundant, but the split toggle in TabBar.vue is built the\n * same way (changing label + `aria-pressed`) and changing one without the\n * other is the drift this wave exists to remove — that call belongs to one\n * pass over both, not to this line.\n */\nconst navToggleLabel = computed(() => {\n  if (props.narrow) return props.navOpen ? t('sidenav.close') : t('sidenav.open');\n  return props.navOpen ? t('sidenav.collapse') : t('sidenav.expand');\n});\n\nconst drivePlaceholder = computed(() =>\n  props.scopeLabel\n    ? t('drive.search.placeholder', { scope: props.scopeLabel })\n    : t('drive.search.placeholder_all'),\n);\n\n/** ⌘/Ctrl+K typed INSIDE the field. The global shortcut handler ignores\n *  keystrokes aimed at an input — which is correct, and it would otherwise\n *  make the hint on this very field a lie. */\nfunction onSearchKeydown(ev: KeyboardEvent) {\n  // The registry decides, so the chip beside this field and the key that\n  // actually escalates stay the same key after a remap.\n  if (eventMatchesShortcut(ev, 'palette')) {\n    ev.preventDefault();\n    ev.stopPropagation();\n    emit('open-palette', localSearch.value);\n    return;\n  }\n  /* gorunum:v3-shell — nothing on screen to narrow (Home): Enter means the\n     same thing the chip does. Empty text is left alone — Enter on an empty box\n     opening a palette nobody asked for is a keystroke doing something. */\n  if (props.searchEscalates && ev.key === 'Enter' && localSearch.value) {\n    ev.preventDefault();\n    ev.stopPropagation();\n    emit('open-palette', localSearch.value);\n  }\n}\n\n/* === gorunum:v4-hostmenu — a host may take the settings half over ==========\n *\n * The header can end up with TWO dropdowns side by side: this component's \"⋯\"\n * and whatever the embedder put in `header-actions` (in the filex web app that\n * is the account avatar). Owner's decision, 2026-09-13, verbatim: *\"`...`\n * bölgesini admin dropdown'ının içine alacağız.\"* — one menu in that corner,\n * not two.\n *\n * ⚠ It is a CLAIM, not a prop, and that is the whole design. This component\n * cannot ask \"did my host fill the slot with a menu?\": `$slots['header-actions']`\n * is truthy on every mount, because FileExplorer declares the pass-through\n * template unconditionally (the same trap its own `#brand` comment documents),\n * and a config flag would have to be threaded through a component this file\n * may not edit. So the toolbar ANNOUNCES the rows on a bubbling DOM event and\n * a host that intends to render them says so by setting `claimed` — the\n * `preventDefault()` shape, synchronous, with no registration order to get\n * right. Nobody listening (every embed today) → nothing changes and the \"⋯\"\n * keeps everything it had.\n *\n * ⚠ `composed: true`: the web-component build puts this DOM inside a shadow\n * root, and an uncomposed event stops at its boundary — i.e. the one build\n * where a host is most likely to be listening would never hear it.\n *\n * ⚠ Re-announced on every change, not once on mount: the labels are locale\n * strings and two of them are STATEFUL (\"Compact view\" ⇄ \"Comfortable view\",\n * and which view modes are inactive). A host holding the first list would\n * print yesterday's label for the rest of the session. Re-announcing is also\n * what lets a late listener claim, so the host does not have to win a race\n * with the explorer's mount.\n */\nexport interface HeaderMenuClaim {\n  /** The rows, already localised, in the order this menu would draw them. */\n  items: ContextAction[];\n  /** Run one of them by key — the SAME handler the \"⋯\" uses, so a claimed row\n   *  and an unclaimed one cannot drift apart in what they do. */\n  run: (key: string) => void;\n  /** Set to true by a host that will render `items` itself. */\n  claimed: boolean;\n}\nconst HEADER_MENU_EVENT = 'fe:header-menu';\nconst hostOwnsUtilities = ref(false);\n\nfunction publishHeaderMenu() {\n  const el = rootEl.value;\n  if (!el) return;\n  const detail: HeaderMenuClaim = {\n    items: utilityActions.value.map((a) => ({ ...a })),\n    run: (key: string) => onMoreSelect({ key, label: '' }),\n    claimed: false,\n  };\n  el.dispatchEvent(\n    new CustomEvent(HEADER_MENU_EVENT, { detail, bubbles: true, composed: true }),\n  );\n  hostOwnsUtilities.value = !!detail.claimed;\n}\n\nonMounted(() => void nextTick(publishHeaderMenu));\nwatch(utilityActions, () => void nextTick(publishHeaderMenu), { deep: false });\nonBeforeUnmount(() => {\n  /* ⚠ On `document`, not on our own root: by this point the element may\n     already be detached and a bubbling event from it would reach nobody,\n     leaving the host drawing rows for an explorer that is gone. */\n  if (typeof document === 'undefined') return;\n  document.dispatchEvent(\n    new CustomEvent(HEADER_MENU_EVENT, {\n      detail: { items: [], run: () => {}, claimed: false } as HeaderMenuClaim,\n    }),\n  );\n});\n\n/* surucu:d1 — the wide header renders the selection's actions as buttons (the\n * selection bar), so its \"⋯\" carries only the settings half; the narrow layout\n * renders no action buttons at all and still needs the whole list.\n * gorunum:v4-hostmenu — minus whatever the host took over. At 1440 that empties\n * the list and the \"⋯\" is not drawn at all; at 390 the folder verbs are still\n * this menu's, so it stays and simply loses its settings tail. */\nconst menuActions = computed<ContextAction[]>(() => {\n  const util = hostOwnsUtilities.value ? [] : utilityActions.value;\n  return props.narrow ? narrowActions(util) : util;\n});\n\nfunction openMore() {\n  const r = moreBtnEl.value?.getBoundingClientRect();\n  moreRef.value?.show({ clientX: r ? inlineEndX(r, dir.value) : 0, clientY: r ? r.bottom + 4 : 0 }, []); // ⚠ RTL: END edge, see openBarMore\n}\n\nfunction onMoreSelect(a: ContextAction) {\n  switch (a.key) {\n    case 'new-folder':\n      emit('new-folder');\n      break;\n    case 'refresh':\n      emit('refresh');\n      break;\n    case 'density':\n      toggleDensity();\n      break;\n    case 'view-list':\n      emit('update:viewMode', 'list');\n      break;\n    case 'view-grid':\n      emit('update:viewMode', 'grid');\n      break;\n    case 'view-gallery' /* wiring:d2 */:\n      emit('update:viewMode', 'gallery');\n      break;\n    case 'inspector' /* koru:k1 */:\n      emit('toggle-inspector');\n      break;\n    case 'nav' /* gezinti:g1 */:\n      emit('toggle-nav');\n      break;\n    case 'theme' /* wiring:c1 */:\n      emit('open-theme');\n      break;\n    case 'shortcut-settings' /* wiring:c2 */:\n      emit('open-shortcut-settings');\n      break;\n    case 'timezone' /* zaman:z3 */:\n      emit('open-timezone');\n      break;\n    case 'tour' /* wiring:c4 — bubbles to the FileExplorer root listener */:\n      /* ⚠ From the TOOLBAR's root, not from the \"⋯\" button. That button is no\n         longer always on screen — a host that claimed the settings half\n         (gorunum:v4-hostmenu) leaves it unrendered, `moreBtnEl` null, and the\n         optional chain then swallowed the whole restart in silence: the row\n         was clicked, nothing happened, and nothing errored. Measured in a real\n         browser — the row opened the shortcut editor fine and the tour row did\n         nothing at all. The toolbar root is inside `.fe`, which is where the\n         listener lives, so the event still arrives. */\n      rootEl.value?.dispatchEvent(new CustomEvent('fe:tour-restart', { bubbles: true }));\n      break;\n    default:\n      fire(a.key);\n  }\n}\n\n/* === /bag:b4 === */\n</script>\n\n<template>\n  <div\n    ref=\"rootEl\"\n    class=\"fe-toolbar\"\n    :class=\"{\n      'fe-toolbar--narrow': narrow /* bag:b4 */,\n      /* surucu:d1 — ALWAYS on. It is no longer a variant: this is the only\n         header filex has, and the modifier survives as the hook the one\n         visual definition in styles/base.css was written against. Dropping it\n         would mean moving those rules, not deleting a state. */\n      'fe-toolbar--drive': true,\n    }\"\n  >\n    <!-- gorunum:v3-shell — the far-left corner, and it belongs to this row.\n         The collapse control and the product mark used to be somewhere else\n         each: the toggle inside the navigation panel's own header, one row\n         down, and the mark up in a page bar that no longer exists — which left\n         the top-left of every screen empty while the button that opens the\n         panel sat below the line it is supposed to open.\n\n         ⚠ Rendered for EVERY width and every embed, outside the two layout\n         branches, so there is one definition of \"the way back to the panel\"\n         instead of a wide copy and a narrow copy that drift.\n\n         ⚠ The mark itself is a SLOT. This package has no product branding of\n         its own and must not grow any: `<filex-explorer>` inside somebody\n         else's app has no \"filex\" wordmark to show, and an embed that passes\n         nothing renders nothing here — the toggle simply sits at the edge.\n         Hidden at 390px even when a host fills it, where the row is three\n         items wide already. -->\n    <!-- ⚠ Not rendered at all when there is neither a panel to collapse nor a\n         mark to show — a confined embed (`rootPath`, so `sideNav` defaults\n         off) would otherwise reserve the gutter below for an empty box.\n         ⚠ The mark counts in BOTH of its forms: the slot an SFC host fills and\n         the `config.brand` a web-component host has to use instead. Asking only\n         about the slot would have hidden the desktop app's own logo the moment\n         it confined an explorer — the same silent blank corner this whole\n         branch exists to stop. -->\n    <div\n      v-if=\"navEnabled !== false || !!$slots.brand || !!brandName || !!brandMarkUrl\"\n      class=\"fe-toolbar__brand\"\n      :class=\"{\n        'fe-toolbar__brand--gutter': navEnabled !== false,\n        /* gezinti:g3 — the panel collapsed to its rail, so this gutter has to\n           collapse with it. `navOpen === false`, never `!navOpen`: the prop is\n           optional, and an embedder that does not pass it must keep the\n           expanded layout rather than lose its wordmark to a `undefined`. */\n        'fe-toolbar__brand--rail': !narrow && navEnabled !== false && navOpen === false,\n      }\"\n    >\n      <!-- ⚠ `aria-pressed` without the `is-active` styling, and the two are\n           not the same claim. A screen reader has to be told the panel is\n           open; a sighted person can see it, and a permanently highlighted\n           button in the top-left corner reads as \"something is selected here\"\n           on a control nobody selected. The panel's presence IS its state. -->\n      <button\n        v-if=\"navEnabled !== false\"\n        type=\"button\"\n        class=\"fe-btn fe-btn--icon-only fe-toolbar__nav\"\n        :aria-pressed=\"!!navOpen\"\n        :title=\"navToggleLabel /* gezinti:g2 — a verb, and the state's verb */\"\n        :aria-label=\"navToggleLabel\"\n        data-testid=\"toolbar-nav\"\n        @click=\"emit('toggle-nav')\"\n      >\n        <svg\n          class=\"fe-ficon\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"1.8\"\n          stroke-linecap=\"round\"\n          aria-hidden=\"true\"\n          focusable=\"false\"\n        >\n          <path d=\"M4 7h16M4 12h16M4 17h16\" />\n        </svg>\n      </button>\n      <!-- gezinti:g3 — the mark goes with the gutter. The rail is 56px and the\n           brand's content measures 113px, so it cannot be shown in the\n           collapsed state at any size; the reference does the same thing\n           (measured signed-in: logo and wordmark both gone the moment the\n           panel collapses, `☰` re-centred in the rail, search field slid\n           left). ⚠ `navOpen !== false` — an embedder that passes no state at\n           all keeps its mark. -->\n      <div v-if=\"!narrow && navOpen !== false\" class=\"fe-toolbar__mark\">\n        <slot name=\"brand\">\n          <img v-if=\"brandMarkUrl\" class=\"fe-toolbar__markimg\" :src=\"brandMarkUrl\" alt=\"\" />\n          <span v-if=\"brandName\">{{ brandName }}</span>\n        </slot>\n      </div>\n    </div>\n\n    <!-- === gorunum:v2-topbar — the wide header ==========================\n         ONE header, in the reference shell's shape, for every profile: the\n         search field takes the row and the trailing cluster carries what\n         belongs to the APP rather than to a listing. The page chrome that\n         used to sit above the explorer (wordmark, admin link, sign out,\n         language) is gone, so this row is the only header on the screen.\n\n         ⚠ What LEFT this row, and the single door each one kept — no control\n         was dropped from the build:\n           · navigation collapse → CAME BACK, to `.fe-toolbar__brand` above,\n             at every width. It had gone to the panel's own edge control, which\n             put the button that opens the panel one row BELOW the line it\n             opens and left this corner empty; the panel no longer draws its\n             own (except as the drawer's close button at 390px).\n           · Up one level        → the parent crumb, always drawn (the trail\n             collapses to `root › … › parent › current`, never past it).\n             The keyboard binding is untouched.\n           · New Folder / Upload → the panel's primary block\n             (`sidenav-upload` / `sidenav-new-folder`, or its \"+ New\" menu in\n             the drive profile). They come BACK here when a deployment has no\n             panel at all (`sideNav: false`, or a confined root), because then\n             there is nowhere else for them to live.\n           · density, theme      → user settings, and the \"⋯\" menu below.\n           · Details ⓘ, views    → the breadcrumb row, beside the crumbs.\n         -->\n    <template v-if=\"!narrow\">\n    <div class=\"fe-toolbar__primary\">\n      <!-- No navigation panel in this deployment → no primary block to hold\n           these, so they are the one door and they render here. -->\n      <button\n        v-if=\"navEnabled === false && mode === 'none' && !trashActive && !atVirtualRoot && canWrite !== false\"\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :title=\"withKey(t('toolbar.new_folder'), 'new-folder')\"\n        @click=\"emit('new-folder')\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('new-folder')\"></span>\n        <span class=\"fe-btn__label\">{{ t('toolbar.new_folder') }}</span>\n      </button>\n      <button\n        v-if=\"navEnabled === false && !atVirtualRoot && canWrite !== false\"\n        type=\"button\"\n        class=\"fe-btn fe-btn--icon-only\"\n        :title=\"withKey(t('toolbar.upload'), 'upload')\"\n        :aria-label=\"t('toolbar.upload')\"\n        @click=\"emit('upload')\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('upload')\"></span>\n      </button>\n\n      <!-- gorunum:v1-selbar — the selection's actions used to be a row of\n           labelled buttons here (Details / Cut / Copy / Paste / Star / a red\n           filled Delete). They are now the selection bar, under the tab strip,\n           where the reference puts them. -->\n\n      <button\n        v-if=\"pasteEnabled && mode === 'none' && !trashActive && !atVirtualRoot && canWrite !== false\"\n        type=\"button\"\n        class=\"fe-btn\"\n        :title=\"withKey(t('ctx.paste'), 'paste')\"\n        @click=\"fire('paste')\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('paste')\"></span>\n        <span class=\"fe-btn__label\">{{ t('ctx.paste') }}</span>\n      </button>\n    </div>\n\n    <div class=\"fe-toolbar__search-group fe-toolbar__search-group--drive\">\n      <!-- gorunum:v1 — ONE search field, in every shell. This used to be two\n           blocks — a bare input in a bordered group for the classic profile\n           and a wide field with the ⌘K chip for the drive one; the same box\n           in two shapes is two products. It carries both class names on\n           purpose: the `fe-drivesearch*` half is the one visual definition\n           (styles/base.css), the `fe-search*` half is the hook the onboarding\n           tour has always looked for.\n           ⚠ The chip prints `shortcutHint('palette')` and the field escalates\n           through `eventMatchesShortcut(ev, 'palette')` — never a literal key\n           (web/tests/ui/shortcutHints.test.ts). -->\n      <div class=\"fe-search fe-drivesearch\" data-testid=\"drive-search\">\n        <svg\n          class=\"fe-ficon fe-drivesearch__glass\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"1.9\"\n          stroke-linecap=\"round\"\n          aria-hidden=\"true\"\n          focusable=\"false\"\n        >\n          <circle cx=\"11\" cy=\"11\" r=\"6.5\" />\n          <path d=\"M16 16l4.5 4.5\" />\n        </svg>\n        <input\n          ref=\"searchEl\"\n          type=\"search\"\n          class=\"fe-search__input fe-drivesearch__input\"\n          :placeholder=\"drivePlaceholder\"\n          :value=\"localSearch\"\n          :aria-label=\"t('toolbar.search')\"\n          @input=\"onSearchInput\"\n          @keydown=\"onSearchKeydown\"\n        />\n        <!-- gorunum:v1-advsearch — the filter affordance the header field has\n             always been specced with, beside the palette chip. It opens the\n             advanced dialog carrying whatever is already typed. -->\n        <button\n          type=\"button\"\n          class=\"fe-drivesearch__tune\"\n          :title=\"t('advsearch.open')\"\n          :aria-label=\"t('advsearch.open')\"\n          data-testid=\"drive-search-advanced\"\n          @click=\"emit('open-advanced-search', localSearch)\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('filter')\"></span>\n        </button>\n        <button\n          type=\"button\"\n          class=\"fe-drivesearch__kbd\"\n          :title=\"t('drive.search.hint_title', { combo: paletteCombo })\"\n          :aria-label=\"t('drive.search.hint_title', { combo: paletteCombo })\"\n          data-testid=\"drive-search-palette\"\n          @click=\"emit('open-palette', localSearch)\"\n        >\n          {{ paletteCombo }}\n        </button>\n      </div>\n    </div>\n\n    <!-- gorunum:v2-topbar — the trailing cluster. Refresh and the \"⋯\" are the\n         explorer's own; the AI mark is drawn but not yet wired; the host's\n         account-level doors arrive through the slot. -->\n    <div class=\"fe-toolbar__tail\">\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--icon-only\"\n        :title=\"withKey(t('toolbar.refresh'), 'refresh')\"\n        :aria-label=\"t('toolbar.refresh')\"\n        @click=\"emit('refresh')\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('refresh')\"></span>\n      </button>\n      <!-- gorunum:v2-topbar — the AI assistant, announced and not pretending.\n           ⚠ `disabled`, not \"opens an empty panel\": a control that answers a\n           click with nothing is read as broken, and the next thing that\n           happens is a bug report about a feature that was never claimed. It\n           says what it is and that it is not here yet, in both languages, and\n           it will become live in place — the glyph does not move under\n           anybody's finger the day it starts working. -->\n      <span class=\"fe-toolbar__soon-wrap\">\n        <button\n          type=\"button\"\n          class=\"fe-btn fe-btn--icon-only fe-toolbar__soon\"\n          disabled\n          :aria-label=\"t('ai.assistant.soon')\"\n          aria-disabled=\"true\"\n          data-testid=\"header-ai\"\n          @click.prevent\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('ai')\"></span>\n        </button>\n        <!-- gorunum:v4-hostmenu — the words, on hover, and nowhere else at\n             rest. Owner's decision, 2026-09-13, verbatim: *\"Coming soon\n             yazısını kaldıralım, üstüne gelince gözüksün.\"*\n             ⚠ `aria-hidden`, and the button keeps `aria-label` with the SAME\n             sentence: hover is a mouse gesture that a touch screen and a\n             keyboard do not have, so the words have to be in the accessible\n             name — and if they were in both, a screen reader would read the\n             sentence twice.\n             ⚠ The native `title` went with the pill. It is not an accessible\n             name (the label above is), it never appears on touch, and leaving\n             it would stack the OS tooltip on top of this one. -->\n        <span\n          class=\"fe-toolbar__soon-tip\"\n          aria-hidden=\"true\"\n          data-testid=\"header-ai-tip\"\n        >{{ t('ai.assistant.soon') }}</span>\n      </span>\n      <!-- Density, theme, the shortcut editor, the tour and the other view\n           modes. Everything the header does not draw is one click away here;\n           nothing is removed from the build. A menu is the one place a\n           duplicate is allowed to live.\n           gorunum:v4-hostmenu — ⚠ not drawn when there is nothing left in it:\n           a host that claimed the settings half (the web app's avatar menu)\n           empties this list at 1440, and a button that opens an empty menu is\n           the \"second control doing the same job\" this pass removes. -->\n      <button\n        v-if=\"menuActions.length > 0\"\n        ref=\"moreBtnEl\"\n        type=\"button\"\n        class=\"fe-btn fe-btn--icon-only\"\n        :title=\"t('toolbar.more')\"\n        :aria-label=\"t('toolbar.more')\"\n        aria-haspopup=\"menu\"\n        data-testid=\"drive-more\"\n        @click=\"openMore\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('more')\"></span>\n      </button>\n      <!-- The host's own doors (admin panel, settings, sign out). Empty in an\n           embed, which is why the cluster is a slot and not a prop: an\n           embedder that has no account chrome renders nothing at all here. -->\n      <slot name=\"header-actions\"></slot>\n    </div>\n    </template>\n\n    <!-- surucu:d1 — narrow layout: [☰] [ search ] [⋯] + the host cluster.\n         ⚠ The ONLY narrow layout now. There used to be a second one that hid\n         search behind a magnifier and expanded it over the row; it was the\n         right trade when the row also carried Up / Upload / actions, and this\n         one does not — \"+ New\" lives in the drawer, upload has the floating\n         button this width already draws (`.fe-fab`), and Up went to the parent\n         crumb. So the field keeps the row, and only the ⌘K chip goes (CSS): a\n         phone cannot press it, and the palette stays in the \"⋯\" menu.\n         gorunum:v2-topbar — the trailing cluster is the wide header's, to the\n         glyph: a control on screen at 1440 and unreachable at 390 is a\n         capability split, not a layout. -->\n    <template v-else>\n      <div class=\"fe-drivesearch\" data-testid=\"drive-search\">\n        <svg\n          class=\"fe-ficon fe-drivesearch__glass\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"1.9\"\n          stroke-linecap=\"round\"\n          aria-hidden=\"true\"\n          focusable=\"false\"\n        >\n          <circle cx=\"11\" cy=\"11\" r=\"6.5\" />\n          <path d=\"M16 16l4.5 4.5\" />\n        </svg>\n        <input\n          ref=\"searchEl\"\n          type=\"search\"\n          class=\"fe-drivesearch__input\"\n          :placeholder=\"drivePlaceholder\"\n          :value=\"localSearch\"\n          :aria-label=\"t('toolbar.search')\"\n          @input=\"onSearchInput\"\n          @keydown=\"onSearchKeydown\"\n        />\n        <!-- gorunum:v1-advsearch — the filter affordance the header field has\n             always been specced with, beside the palette chip. It opens the\n             advanced dialog carrying whatever is already typed.\n             ⚠ Added to ALL THREE field blocks on purpose: this file's own note\n             says the same box in two shapes is two products, so a control that\n             existed only in the drive shell would re-open exactly that split. -->\n        <button\n          type=\"button\"\n          class=\"fe-drivesearch__tune\"\n          :title=\"t('advsearch.open')\"\n          :aria-label=\"t('advsearch.open')\"\n          data-testid=\"drive-search-advanced\"\n          @click=\"emit('open-advanced-search', localSearch)\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('filter')\"></span>\n        </button>\n        <button\n          type=\"button\"\n          class=\"fe-drivesearch__kbd\"\n          :title=\"t('drive.search.hint_title', { combo: paletteCombo })\"\n          :aria-label=\"t('drive.search.hint_title', { combo: paletteCombo })\"\n          data-testid=\"drive-search-palette\"\n          @click=\"emit('open-palette', localSearch)\"\n        >\n          {{ paletteCombo }}\n        </button>\n      </div>\n      <div class=\"fe-toolbar__tail\">\n        <!-- gorunum:v2-topbar — the same cluster as the wide header. A control\n             that is on screen at 1440 and unreachable at 390 is a capability\n             split, not a layout, so the AI mark and the host's doors come\n             along; only Refresh stays behind (it is in the \"⋯\"). -->\n        <span class=\"fe-toolbar__soon-wrap\">\n          <button\n            type=\"button\"\n            class=\"fe-btn fe-btn--icon-only fe-toolbar__soon\"\n            disabled\n            :aria-label=\"t('ai.assistant.soon')\"\n            aria-disabled=\"true\"\n            data-testid=\"header-ai\"\n            @click.prevent\n          >\n            <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n            <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('ai')\"></span>\n          </button>\n          <!-- gorunum:v4-hostmenu — the same affordance as the wide header, to\n               the glyph. ⚠ A phone has no hover at all, so here the accessible\n               name is the ONLY door to these words — which is exactly why it\n               carries the whole sentence and not a `title`. -->\n          <span\n            class=\"fe-toolbar__soon-tip\"\n            aria-hidden=\"true\"\n            data-testid=\"header-ai-tip\"\n          >{{ t('ai.assistant.soon') }}</span>\n        </span>\n        <button\n          v-if=\"menuActions.length > 0\"\n          ref=\"moreBtnEl\"\n          type=\"button\"\n          class=\"fe-btn fe-btn--icon-only\"\n          :title=\"t('toolbar.more')\"\n          :aria-label=\"t('toolbar.more')\"\n          aria-haspopup=\"menu\"\n          data-testid=\"drive-more\"\n          @click=\"openMore\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('more')\"></span>\n        </button>\n        <slot name=\"header-actions\"></slot>\n      </div>\n    </template>\n\n\n    <!-- The \"⋯\" menu of whichever layout is on screen.\n         ⚠ Rendered unconditionally, outside the three layout branches. It used\n         to live inside the narrow non-drive branch alone, which left both drive\n         layouts (`data-testid=\"drive-more\"`, wide and narrow) with a button\n         whose `moreRef` was null — the click resolved to nothing and the whole\n         settings half of the menu was unreachable in that profile. -->\n    <ContextMenu\n      ref=\"moreRef\"\n      :locale=\"locale\"\n      :theme=\"theme || 'auto'\"\n      :sheet=\"coarse\"\n      :actions=\"menuActions\"\n      @select=\"onMoreSelect\"\n    />\n\n    <!-- === gorunum:v1-selbar — the selection bar ======================\n         Teleported into the slot this component put right after the breadcrumb\n         (see the script block). With no slot to mount into the Teleport is\n         disabled and the bar renders here instead, so a bare <Toolbar> still\n         offers the selection's actions. -->\n    <Teleport :to=\"selSlot || 'body'\" :disabled=\"!selSlot\">\n      <div\n        v-if=\"hasSelection\"\n        class=\"fe-selbar\"\n        :class=\"{ 'fe-selbar--inline': !selSlot }\"\n        role=\"toolbar\"\n        :aria-label=\"selectionLabel\"\n        data-testid=\"selection-bar\"\n      >\n        <span class=\"fe-selbar__count\" role=\"status\" data-testid=\"selection-count\">{{\n          selectionLabel\n        }}</span>\n\n        <div ref=\"selBarEl\" class=\"fe-selbar__actions\">\n          <button\n            v-for=\"a in visibleBarItems\"\n            :key=\"a.key\"\n            type=\"button\"\n            class=\"fe-selbar__btn\"\n            :class=\"{ 'fe-selbar__btn--danger': a.danger, 'is-disabled': a.disabled }\"\n            :disabled=\"a.disabled\"\n            :title=\"a.title || withKey(a.label, a.key) /* tasi:m1 — a greyed\n                   row says WHY it is grey; everything else says what it does\n                   and which key does it */\"\n            :aria-label=\"a.label\"\n            :data-key=\"a.key\"\n            :data-testid=\"`selbar-${a.key}`\"\n            @click=\"fire(a.key)\"\n          >\n            <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n            <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"iconFor(a)\"></span>\n          </button>\n\n          <button\n            v-if=\"barMenuItems.length > 0\"\n            ref=\"selMoreBtnEl\"\n            type=\"button\"\n            class=\"fe-selbar__btn\"\n            :title=\"t('toolbar.more')\"\n            :aria-label=\"t('toolbar.more')\"\n            aria-haspopup=\"menu\"\n            data-testid=\"selbar-more\"\n            @click=\"openBarMore\"\n          >\n            <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n            <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('more')\"></span>\n          </button>\n\n          <!-- Invisible measuring strip: every icon action is always rendered\n               here, as the SAME button the visible row renders, so the fold\n               arithmetic runs off widths something really has.\n               ⚠ `data-key` is on BOTH copies: which icons are on screen is a\n               function of the viewport (that is what folding means), so a test\n               that wants the list this selection OFFERS has to read it from a\n               strip the fold does not touch. -->\n          <div ref=\"measureEl\" class=\"fe-selbar__measure\" aria-hidden=\"true\">\n            <button\n              v-for=\"a in barSplit.icons\"\n              :key=\"'m-' + a.key\"\n              type=\"button\"\n              class=\"fe-selbar__btn\"\n              :data-key=\"a.key\"\n              tabindex=\"-1\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n              <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"iconFor(a)\"></span>\n            </button>\n          </div>\n        </div>\n\n        <button\n          type=\"button\"\n          class=\"fe-selbar__close\"\n          :title=\"t('selection.clear')\"\n          :aria-label=\"t('selection.clear')\"\n          data-testid=\"selection-clear\"\n          @click=\"clearSelection\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n        </button>\n      </div>\n    </Teleport>\n\n    <ContextMenu\n      ref=\"selMoreRef\"\n      :locale=\"locale\"\n      :theme=\"theme || 'auto'\"\n      :sheet=\"coarse\"\n      :actions=\"barMenuItems\"\n      @select=\"(a) => fire(a.key)\"\n    />\n    <!-- === /gorunum:v1-selbar === -->\n  </div>\n</template>\n","/**\n * tags.ts — the list of tags that exist, for the navigation panel.\n *\n * `GET /api/files/manager/tags/all` is one query per call, and the panel is\n * rendered by every mounted explorer: the web app, the desktop app and every\n * embed on a page (work.example.com renders two side by side). Asking on each mount\n * would multiply a database scan by however many explorers a host happens to\n * put on screen, for a list that changes when somebody edits a tag — i.e.\n * rarely.\n *\n * So: a MODULE-level cache, shared by every instance in the page.\n *   - in-flight requests are deduped, so N explorers mounting in the same tick\n *     produce ONE request;\n *   - the answer is reused for TTL_MS;\n *   - `invalidateTagCache()` drops it the moment tags are written, so the\n *     panel is never stale after the user's own edit — which is the only\n *     staleness a user can actually notice.\n *\n * Keyed by apiBase: the desktop app can point at a different server between\n * mounts and must not be handed the previous server's tags.\n */\n\nconst TTL_MS = 60_000;\n\n/**\n * The two kinds of tag (v0.43.0, the owner's decision \"tagler personal ve team\n * olarak ikiye ayrılır\"):\n *\n *   personal — the person's own label, like a star. Nobody else sees it.\n *   team     — shared with everyone in the tenant who can see the file;\n *              adding or removing one needs edit permission on the file.\n *\n * ⚠ Before v0.43.0 there was one kind and it was shared with EVERY account on\n * the server while the code called it per-user — a tester's \"müşteri teklifi\"\n * showed in other people's panels and they could remove it. A tag on screen\n * therefore always says which kind it is (`TagKindIcon` + the words), so\n * nobody has to guess who can see it.\n */\nexport type TagKind = 'personal' | 'team';\n\n/** A tag as the server hands it out: its name as typed and its kind. */\nexport interface TagItem {\n  name: string;\n  kind: TagKind;\n  /** The tag's identity, the server's (`internal/tagname.Key`): two names\n   *  with one key are one tag. A 0.54+ server sends it with every item; it is\n   *  never sent back. */\n  key?: string;\n}\n\nexport function isTagKind(v: unknown): v is TagKind {\n  return v === 'personal' || v === 'team';\n}\n\n/*\n * Whether two names are one tag is the SERVER's answer (`internal/tagname.Key`:\n * whitespace, NFC, the four Latin i's, full case folding - \"STRASSE\" and\n * \"straße\" are one tag). It arrives as each item's `key` (#211, audit B12); the\n * copy of the rule that stood here knew only part of it and is gone. A name\n * typed into a box has no key until the server has seen it, so the box sends\n * it and the server keeps one tag.\n */\n\n/** The key of the item spelled exactly `name`, when the server sent one. */\nexport function keyOfName(items: readonly TagItem[], name: string): string | undefined {\n  return items.find((i) => i.name === name)?.key;\n}\n\n/**\n * The items in a tag answer. A v0.43+ server sends `items: [{name, kind}]`; an\n * older one sends only `tags: string[]` — and on an older server every tag was\n * shared with everybody, so those are TEAM tags. Anything malformed is dropped.\n */\nexport function tagItemsOf(body: unknown): TagItem[] {\n  const b = (body ?? {}) as { items?: unknown; tags?: unknown };\n  if (Array.isArray(b.items)) {\n    return b.items.filter(\n      (x: unknown): x is TagItem =>\n        !!x &&\n        typeof (x as TagItem).name === 'string' &&\n        (x as TagItem).name !== '' &&\n        isTagKind((x as TagItem).kind),\n    );\n  }\n  if (Array.isArray(b.tags)) {\n    return b.tags\n      .filter((x: unknown): x is string => typeof x === 'string' && x !== '')\n      .map((name) => ({ name, kind: 'team' as const }));\n  }\n  return [];\n}\n\ninterface CacheEntry {\n  at: number;\n  tags: TagItem[];\n}\n\nconst cache = new Map<string, CacheEntry>();\nconst inflight = new Map<string, Promise<TagItem[]>>();\n\nexport interface TagListOptions {\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  /** Skip the cache (after a tag edit). */\n  force?: boolean;\n}\n\n/** Drop every cached tag list. Called after a successful tag write. */\nexport function invalidateTagCache(): void {\n  cache.clear();\n  inflight.clear();\n}\n\n/**\n * etiket:k2 — \"the tags changed\", told to every explorer on the page.\n *\n * ⚠⚠ This used to travel as a component EVENT (TagPicker `change` → the\n * explorer's `onNodeTagsChanged`), and Vue drops an event emitted by a\n * component that has already been unmounted. The save is asynchronous, so a\n * person who added a tag and closed the dialog before the server answered —\n * a fraction of a second on a busy server — saved the tag and kept the panel\n * that said \"No tags yet\". Measured: the full Playwright run (a loaded\n * server) showed exactly that, while the spec alone (an idle one) passed.\n * A module-level announcement does not depend on the component still being\n * there, and it reaches EVERY explorer on the page, not only the one that\n * hosted the picker.\n */\nconst changeListeners = new Set<() => void>();\n\n/** Listen for tag writes; returns the function that stops listening. */\nexport function onTagsChanged(fn: () => void): () => void {\n  changeListeners.add(fn);\n  return () => {\n    changeListeners.delete(fn);\n  };\n}\n\n/** A tag write succeeded: drop the cache, then tell every listener. The\n *  listeners re-ask WITHOUT forcing, so N explorers still cost one request\n *  (the first creates it, the rest join it in flight). */\nexport function announceTagsChanged(): void {\n  invalidateTagCache();\n  for (const fn of [...changeListeners]) {\n    try {\n      fn();\n    } catch {\n      /* one listener's failure must not silence the others */\n    }\n  }\n}\n\n/**\n * Every tag the person can see — both kinds — alphabetical, as the backend\n * returns them. Never throws: an older backend with no such route, or a\n * caller with no permission, gets an empty list and the panel simply shows\n * no tag section.\n */\nexport async function fetchAllTags(opts: TagListOptions = {}): Promise<TagItem[]> {\n  const base = opts.apiBase ?? '';\n  const key = base || '(same-origin)';\n  if (!opts.force) {\n    const hit = cache.get(key);\n    if (hit && Date.now() - hit.at < TTL_MS) return hit.tags;\n    const pending = inflight.get(key);\n    if (pending) return pending;\n  }\n  const run = (async () => {\n    try {\n      const res = await fetch(`${base}/api/files/manager/tags/all`, {\n        headers: await (opts.authHeaders ?? (() => ({})))(),\n        credentials: opts.authCredentials ?? 'same-origin',\n      });\n      if (!res.ok) return [];\n      const tags = tagItemsOf(await res.json());\n      cache.set(key, { at: Date.now(), tags });\n      return tags;\n    } catch {\n      return [];\n    } finally {\n      inflight.delete(key);\n    }\n  })();\n  inflight.set(key, run);\n  return run;\n}\n\n/**\n * One PAGE of the nodes carrying `tag` (task #207, audit D3): `limit` rows\n * from `offset`, in the server's order (`sort`: '' = most recently modified\n * first), with the server's `total` and whether more are left (`truncated`).\n * The tag view used to ask for 200 and could not say there were more.\n */\nexport async function fetchTaggedPage(\n  tag: string,\n  opts: TagListOptions = {},\n  page: { limit?: number; offset?: number; kind?: TagKind | ''; sort?: string } = {},\n): Promise<{ rows: Record<string, unknown>[]; total: number; truncated: boolean }> {\n  const base = opts.apiBase ?? '';\n  const params = new URLSearchParams({ tag, limit: String(page.limit ?? 100), offset: String(page.offset ?? 0) });\n  if (page.kind) params.set('kind', page.kind);\n  if (page.sort) params.set('sort', page.sort);\n  const res = await fetch(`${base}/api/files/manager/tagged?${params}`, {\n    headers: await (opts.authHeaders ?? (() => ({})))(),\n    credentials: opts.authCredentials ?? 'same-origin',\n  });\n  if (!res.ok) throw new Error(String(res.status));\n  const body = await res.json();\n  const rows: Record<string, unknown>[] = Array.isArray(body?.nodes) ? body.nodes : [];\n  return {\n    rows,\n    total: typeof body?.total === 'number' ? body.total : (page.offset ?? 0) + rows.length,\n    truncated: body?.truncated === true,\n  };\n}\n\n/**\n * Nodes carrying `tag`, as raw node rows (`{id, path, name, type, …}`) — the\n * same shape `star/list` and `recent` answer with, so the caller maps them\n * through its own `nodeRowToFileNode`. `kind` narrows to one kind; '' = both\n * (what a `#.tag~x` link from before v0.43 means).\n */\nexport async function fetchTaggedRows(\n  tag: string,\n  opts: TagListOptions = {},\n  limit = 200,\n  kind: TagKind | '' = '',\n): Promise<Record<string, unknown>[]> {\n  const base = opts.apiBase ?? '';\n  const k = kind ? `&kind=${kind}` : '';\n  const res = await fetch(\n    `${base}/api/files/manager/tagged?tag=${encodeURIComponent(tag)}&limit=${limit}${k}`,\n    {\n      headers: await (opts.authHeaders ?? (() => ({})))(),\n      credentials: opts.authCredentials ?? 'same-origin',\n    },\n  );\n  if (!res.ok) throw new Error(String(res.status));\n  const body = await res.json();\n  return Array.isArray(body?.nodes) ? body.nodes : [];\n}\n","<script setup lang=\"ts\">\n/**\n * TagKindIcon — the one glyph that says which KIND a tag is.\n *\n * ⚠⚠ Why this exists (v0.43.0): tags used to be one kind, silently shared with\n * every account on the server while the code called them per-user; a tester's\n * \"müşteri teklifi\" showed up in other people's panels and they could remove\n * it, and nothing on screen had ever said a tag was shared. With two kinds the\n * screen has to say it EVERYWHERE a tag appears — the picker, the chips on a\n * file, the navigation panel, the tag view's heading, the search filter — and\n * one component is the only way those five cannot draw it five ways.\n *\n *   personal — one figure: yours, like a star.\n *   team     — two figures: everyone in your team who can see the file.\n *\n * Decorative (`aria-hidden`): every caller also puts the kind into words\n * (`tags.kind.*` in the title / accessible name), because an icon alone is\n * not an explanation.\n */\nimport type { TagKind } from '../lib/tags';\n\ndefineProps<{\n  kind: TagKind;\n  /** Edge length in px. */\n  size?: number;\n}>();\n</script>\n\n<template>\n  <svg\n    class=\"fe-tagkind\"\n    :class=\"`fe-tagkind--${kind}`\"\n    :width=\"size ?? 12\"\n    :height=\"size ?? 12\"\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    stroke-width=\"2\"\n    stroke-linecap=\"round\"\n    stroke-linejoin=\"round\"\n    aria-hidden=\"true\"\n    focusable=\"false\"\n    :data-tag-kind=\"kind\"\n  >\n    <template v-if=\"kind === 'team'\">\n      <circle cx=\"9\" cy=\"8\" r=\"3.2\" />\n      <path d=\"M3 20c0-3.3 2.7-6 6-6s6 2.7 6 6\" />\n      <circle cx=\"17\" cy=\"9\" r=\"2.6\" />\n      <path d=\"M16.5 14.2c2.6.3 4.5 2.6 4.5 5.3\" />\n    </template>\n    <template v-else>\n      <circle cx=\"12\" cy=\"8\" r=\"3.6\" />\n      <path d=\"M5 20c0-3.9 3.1-7 7-7s7 3.1 7 7\" />\n    </template>\n  </svg>\n</template>\n","<script setup lang=\"ts\">\n/**\n * ChoiceButtons — a choice the person can READ without clicking.\n *\n * ⚠⚠ This is the replacement for a dropdown in every plugin surface (v3\n * §2): \"no dropdowns anywhere in a surface\". A dropdown hides its options\n * until it is opened, so a wizard step asking \"where does the signed\n * document go?\" showed one answer and concealed the other two — and the one\n * it showed could contradict a field sitting right above it. Buttons put\n * every option on the step, which is also why the renderer enforces this\n * rather than each plugin choosing.\n *\n * One control, two behaviours, because they are the same question asked\n * once or several times:\n *   - single (`multi: false`) — radio semantics: `role=\"radiogroup\"`,\n *     arrow keys move the choice (Home / End jump to the first / last), the\n *     chosen one is the group's only tab stop, exactly one is `aria-checked`;\n *   - several (`multi: true`) — toggle semantics: `role=\"group\"`, each\n *     button its own `aria-pressed`, the value is a list.\n *\n * Two looks for the same control:\n *   - the default: a row of separate buttons, each with an optional second\n *     line (`help`) — a question a surface asks;\n *   - `segmented`: one strip with the chosen cell filled, the shape for two\n *     to four short answers sitting INLINE beside other fields (a unit after\n *     a number, a filter in a toolbar, \"user\" or \"viewer\", an access level).\n *     With `iconOnly` the cells show only their option's `icon`, the label\n *     being the accessible name (the light / dark / system switch). The\n *     segmented look came from the Apps store's `FaSegmented` (2026-10-04)\n *     and lives HERE rather than as a second radio group beside this one.\n *\n * A segmented cell's `help` (what choosing it means) is not a second line —\n * a strip has no room for one. It is (the owner, 2026-10-06, on the sharing\n * dialog's access levels: \"yan yana düğmeler, üzerine gelince açıklaması\n * yazar\"):\n *   - the cell's hover tip, shown on a resting pointer AND on keyboard focus\n *     — the header's hover-tip look (`.fe-toolbar__soon-tip` in base.css),\n *     one rule for both, not a tooltip of its own;\n *   - the cell's `aria-describedby`, so a screen reader hears it with the\n *     cell (the tip itself is `aria-hidden`, or it would be read twice);\n *   - on a screen that cannot hover (`hover: none`: a phone, a tablet), the\n *     CHOSEN cell's meaning as one small line under the strip, since a tip\n *     that needs a hover never shows there.\n *\n * ⚠ Not \"a nicer dropdown\". A long list (storages, people, a time zone) is\n * `ChoiceSelect`, and this one is deliberately bad at that — it draws every\n * option. Neither is ever a native select element: filex draws none\n * (web/tests/ui/noNativeSelect.test.ts).\n */\nimport { computed, type Component } from 'vue';\nimport { dirOfElement, inlineKeyStep } from '../lib/direction';\n\nexport interface ChoiceOption {\n  value: string;\n  label: string;\n  /** A second line under the label — what choosing this one means. */\n  help?: string;\n  /** This one answer is not available (the others are). The button stays on\n   *  screen — a choice that vanishes cannot tell the person it exists — and\n   *  `help` is where to say why. The tag picker's \"Team\" for a viewer is the\n   *  first user. */\n  disabled?: boolean;\n  /** An icon drawn before the label (and instead of it with `iconOnly`). */\n  icon?: Component;\n}\n\nconst props = defineProps<{\n  options: ChoiceOption[];\n  /** A string (single) or a list of strings (several). */\n  modelValue: string | string[] | null | undefined;\n  multi?: boolean;\n  disabled?: boolean;\n  invalid?: boolean;\n  /** One strip with the chosen cell filled: two to four short answers inline. */\n  segmented?: boolean;\n  /** Segmented, and each cell shows only its icon (the label names it). */\n  iconOnly?: boolean;\n  /** Ties the group to its own label for a screen reader. */\n  ariaLabelledby?: string;\n  ariaLabel?: string;\n  /** `surface-choice` → `data-testid=\"surface-choice-<value>\"`. */\n  testidPrefix?: string;\n  /** The group's own `data-testid` (`choice-buttons` when not given). */\n  testid?: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'update:modelValue', v: string | string[]): void;\n}>();\n\nconst strip = computed(() => !!props.segmented || !!props.iconOnly);\n\n/* Ids that tie a cell to its tip. Random, not a counter (the MegaMenu reason:\n   two groups on one page must not share them). */\nconst uid = `fe-choice-${Math.random().toString(36).slice(2, 10)}`;\nconst tipId = (i: number) => `${uid}-tip-${i}`;\n\n/** The words a segmented cell's tip shows: its meaning, or (icon-only) its name. */\nfunction tipOf(o: ChoiceOption): string {\n  if (!strip.value) return '';\n  return o.help || (props.iconOnly ? o.label : '');\n}\n\n/** The chosen cell's meaning, for the line under the strip on a touch screen. */\nconst chosenHelp = computed(() => {\n  if (!strip.value || props.multi) return '';\n  return props.options.find((o) => isOn(o.value))?.help ?? '';\n});\n\nconst picked = computed<string[]>(() => {\n  const v = props.modelValue;\n  if (Array.isArray(v)) return v.map((x) => String(x));\n  if (v === undefined || v === null || v === '') return [];\n  return [String(v)];\n});\n\nfunction isOn(value: string): boolean {\n  return picked.value.includes(value);\n}\n\nfunction optionOff(value: string): boolean {\n  return !!props.disabled || !!props.options.find((o) => o.value === value)?.disabled;\n}\n\nfunction choose(value: string): void {\n  if (optionOff(value)) return;\n  if (props.multi) {\n    const next = isOn(value) ? picked.value.filter((v) => v !== value) : [...picked.value, value];\n    // ⚠ The order the OPTIONS are declared in, not the order they were\n    // clicked in: a plugin that renders the answer back reads a stable list,\n    // and two people who picked the same two options send the same value.\n    const order = props.options.map((o) => o.value);\n    emit('update:modelValue', order.filter((v) => next.includes(v)));\n    return;\n  }\n  emit('update:modelValue', value);\n}\n\n/** The first (step 1) or last (step -1) option that can be chosen; -1 if none. */\nfunction edgeEnabled(step: 1 | -1): number {\n  const n = props.options.length;\n  for (let k = 0; k < n; k++) {\n    const i = step === 1 ? k : n - 1 - k;\n    if (!props.options[i].disabled) return i;\n  }\n  return -1;\n}\n\n/**\n * Arrow keys (and Home / End), for the single case only.\n *\n * A radio group is ONE tab stop: Tab reaches it, the arrows move inside it.\n * With `multi` each button is its own control and the browser's own Tab\n * order is already right, so nothing is intercepted there.\n */\nfunction onKey(e: KeyboardEvent, index: number): void {\n  if (props.multi || props.disabled) return;\n  const n = props.options.length;\n  let to: number;\n  if (e.key === 'Home' || e.key === 'End') {\n    e.preventDefault();\n    to = edgeEnabled(e.key === 'Home' ? 1 : -1);\n    if (to < 0) return;\n  } else {\n    const keys = ['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp'];\n    if (!keys.includes(e.key)) return;\n    e.preventDefault();\n    // ⚠ RTL: ← / → move the way they point — in a right-to-left row the NEXT\n    // option is to the left (lib/direction, read from where the group is drawn).\n    const step =\n      e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : inlineKeyStep(e.key, dirOfElement(e.currentTarget as Element));\n    if (!n) return;\n    to = (index + step + n) % n;\n    if (props.options[to].disabled) return;\n  }\n  choose(props.options[to].value);\n  // ⚠ The group, not the parent: a cell wraps each button (its tip beside it).\n  const group = (e.currentTarget as HTMLElement).closest('.fe-choice');\n  const buttons = group?.querySelectorAll<HTMLElement>('[data-choice]');\n  buttons?.[to]?.focus();\n}\n\n/** The tab stop of a radio group: the chosen one, or the first. */\nfunction tabIndexOf(value: string, index: number): number {\n  if (props.multi) return 0;\n  if (picked.value.length) return isOn(value) ? 0 : -1;\n  return index === 0 ? 0 : -1;\n}\n</script>\n\n<template>\n  <div\n    class=\"fe-choice\"\n    :class=\"{\n      'is-invalid': invalid,\n      'is-disabled': disabled,\n      'fe-choice--segmented': strip,\n      'fe-choice--icons': iconOnly,\n    }\"\n    :role=\"multi ? 'group' : 'radiogroup'\"\n    :aria-labelledby=\"ariaLabelledby\"\n    :aria-label=\"ariaLabel\"\n    :data-testid=\"testid ?? 'choice-buttons'\"\n  >\n    <!-- The strip and its cells are `display: contents` in the default look,\n         so the buttons lay out exactly as direct children of the group. -->\n    <div class=\"fe-choice__strip\">\n      <span v-for=\"(o, i) in options\" :key=\"o.value\" class=\"fe-choice__cell\">\n        <button\n          type=\"button\"\n          data-choice\n          class=\"fe-choice__btn\"\n          :class=\"{ 'is-on': isOn(o.value) }\"\n          :role=\"multi ? undefined : 'radio'\"\n          :aria-checked=\"multi ? undefined : isOn(o.value) ? 'true' : 'false'\"\n          :aria-pressed=\"multi ? (isOn(o.value) ? 'true' : 'false') : undefined\"\n          :aria-label=\"iconOnly ? o.label : undefined\"\n          :aria-describedby=\"strip && o.help ? tipId(i) : undefined\"\n          :tabindex=\"tabIndexOf(o.value, i)\"\n          :disabled=\"disabled || o.disabled\"\n          :data-testid=\"testidPrefix ? `${testidPrefix}-${o.value}` : undefined\"\n          @click=\"choose(o.value)\"\n          @keydown=\"onKey($event, i)\"\n        >\n          <component :is=\"o.icon\" v-if=\"o.icon\" class=\"fe-choice__icon\" aria-hidden=\"true\" />\n          <span v-if=\"!iconOnly\" class=\"fe-choice__label\">{{ o.label }}</span>\n          <span v-if=\"o.help && !strip\" class=\"fe-choice__help\">{{ o.help }}</span>\n        </button>\n        <span\n          v-if=\"tipOf(o)\"\n          :id=\"tipId(i)\"\n          class=\"fe-choice__tip\"\n          aria-hidden=\"true\"\n          :data-testid=\"testidPrefix ? `${testidPrefix}-${o.value}-tip` : undefined\"\n        >{{ tipOf(o) }}</span>\n      </span>\n    </div>\n    <p\n      v-if=\"chosenHelp\"\n      class=\"fe-choice__note\"\n      aria-hidden=\"true\"\n      :data-testid=\"testidPrefix ? `${testidPrefix}-note` : undefined\"\n    >{{ chosenHelp }}</p>\n  </div>\n</template>\n","<script setup lang=\"ts\">\nimport { requestFailure } from '../lib/errorWords';\n/**\n * TagPicker — small chip list with add/remove for a node.\n *\n * Reads `GET /api/files/manager/tags?node_id=…` on mount, writes the\n * full new set via `POST /api/files/manager/tags`.\n *\n * Tag colors are deterministic: hash(name) → palette index. Consumers\n * can override with the `palette` prop.\n *\n * === etiket:k2 — TWO KINDS, AND THE CHIP SAYS WHICH (v0.43.0) ===========\n * ⚠⚠ Tester, 2026-09-22: a non-admin's tag \"müşteri teklifi\" appeared in\n * another user's and the admin's panel and on the file, and the other user\n * could remove it. Tags were one shared label per file while the code called\n * them per-user, and this component never said a word about who could see\n * one. The owner's decision: personal and team tags.\n *\n *   - Every chip carries its kind — `TagKindIcon` plus the words in its title\n *     and accessible name — so nobody has to guess who sees it.\n *   - Adding asks WHO SEES IT, with the answer written under each choice.\n *     Personal is the default: a label nobody chose to share is not shared.\n *   - \"Team\" is offered only where saving it would succeed: the server says\n *     `can_edit_team` (edit permission on the file). For a viewer it stays on\n *     screen, disabled, with the reason — a choice that vanishes cannot tell\n *     the person it exists. A team chip's × is likewise absent for them.\n *   - The name keeps its capitals (\"Müşteri Teklifi\"); the server decides\n *     sameness and says it as each item's `key` (#211). A typed name has no\n *     key yet, so only an exact repeat is held back here; the server keeps\n *     one tag for the rest. Its length is the server's too (`limits.\n *     tag_max_runes`), counted in characters as the server counts them.\n *   - An OLDER server (no `items` in its answer) has one shared kind: the\n *     chips read as team and the kind choice is not offered, because the old\n *     server would ignore it and the person would believe a label was private\n *     when it is not.\n *\n * === etiket:t1 — THE CHIP IS A DOOR ==================================\n * ⚠⚠ Owner, 2026-09-13: \"taglediğim dosya klasör tag'ine gitmiyor.\" The tag\n * VIEW existed and the panel listed every tag, but from a file there was no way\n * into the one it carries: the chip was a `<span>`, so the only route from\n * \"this file is tagged invoices\" to \"what else is tagged invoices\" was to read\n * the word, find it again in the panel and click it there.\n *\n * ⚠ The name is the button and the × stays its own. Two targets in one chip,\n * neither of which may fire the other's action — a mis-hit here either loses a\n * tag or navigates away from the file you were reading about.\n *\n * ⚠ It navigates from BOTH mounts, the details panel's and the modal the\n * right-click menu opens. One component, one behaviour: a chip that led\n * somewhere in one place and was inert three inches away in another would be\n * the surface-specific split this package exists to avoid. The host closes the\n * modal on the way (it opened it).\n */\nimport { ref, watch, onMounted, computed } from 'vue';\nimport { useLocale } from '../composables/useLocale';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { announceTagsChanged, tagItemsOf, type TagItem, type TagKind } from '../lib/tags';\nimport { clipRunes, serverLimit } from '../lib/serverRules';\nimport TagKindIcon from './TagKindIcon.vue';\nimport ChoiceButtons, { type ChoiceOption } from './ChoiceButtons.vue';\n\nconst props = defineProps<{\n  nodeId: number;\n  /**\n   * ⚠ Added 2026-09-13 with the chip's new \"open this tag\" affordance, and it\n   * pulls three OLDER strings out of English with it: this component printed\n   * \"+ Add tag\", \"tag name\" and \"Remove tag\" literally, so a Turkish user\n   * reading \"Etiketler\" as the section heading got three English controls under\n   * it. Optional, defaulting to the catalogue's own default, so an embedder\n   * that never passed one is unaffected.\n   */\n  locale?: LocaleCode;\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  /** Credentials mode, from the explorer's auth kind. ⚠ Defaults to\n   *  'same-origin': a credentialed cross-origin request cannot be answered\n   *  with ACAO:* , so hardcoding 'include' broke this call in every embed\n   *  served from a different origin to the API. */\n  authCredentials?: RequestCredentials;\n  /** Optional list of palette swatches; one is picked per tag deterministically. */\n  palette?: string[];\n}>();\n\nconst emit = defineEmits<{\n  /** The names (the pre-v0.43 payload, kept for embedders), then the items. */\n  (e: 'change', tags: string[], items: TagItem[]): void;\n  (e: 'error', message: string): void;\n  /** etiket:t1 — \"show me everything tagged this\". The host owns navigation.\n   *  `kind` (v0.43) says WHICH of two same-named tags was clicked. */\n  (e: 'open', tag: string, kind: TagKind): void;\n}>();\n\nconst { t } = useLocale(() => props.locale ?? 'en');\n\n/** \"Open tag: invoices · Personal tag …\" — the chip's title and its accessible\n *  name, one value so the two cannot say different things. The kind sentence\n *  rides along, so a screen reader hears WHO sees the tag, not only its name. */\nfunction openTitle(item: TagItem): string {\n  return `${t('tags.open', { tag: item.name })} · ${t(`tags.chip.${item.kind}`, { tag: item.name })}`;\n}\n\nconst items = ref<TagItem[]>([]);\n/** Whether TEAM tags may be added or removed here (server: `can_edit_team`). */\nconst canEditTeam = ref(true);\n/** The server predates kinds: one shared kind, no choice to offer. */\nconst legacy = ref(false);\nconst loading = ref(false);\nconst adding = ref(false);\nconst newTag = ref('');\nconst newKind = ref<TagKind>('personal');\nconst addForm = ref<HTMLFormElement | null>(null);\n\n/** Personal chips first, then team — the grouping the navigation panel uses,\n *  so the same file reads the same in every place. */\nconst shown = computed(() => [\n  ...items.value.filter((i) => i.kind === 'personal'),\n  ...items.value.filter((i) => i.kind === 'team'),\n]);\n\nconst kindOptions = computed<ChoiceOption[]>(() => [\n  { value: 'personal', label: t('tags.kind.personal'), help: t('tags.kind.personal_help') },\n  {\n    value: 'team',\n    label: t('tags.kind.team'),\n    help: canEditTeam.value ? t('tags.kind.team_help') : t('tags.kind.team_locked'),\n    disabled: !canEditTeam.value,\n  },\n]);\n\nconst palette = computed(() => props.palette ?? [\n  '#ef4444', '#f59e0b', '#10b981', '#3b82f6',\n  '#8b5cf6', '#ec4899', '#14b8a6', '#f97316',\n]);\n\nfunction colorFor(tag: string): string {\n  let h = 0;\n  for (let i = 0; i < tag.length; i++) h = (h * 31 + tag.charCodeAt(i)) | 0;\n  const arr = palette.value;\n  return arr[Math.abs(h) % arr.length];\n}\n\n/** A team chip a viewer cannot take off draws no ×. */\nfunction canRemove(item: TagItem): boolean {\n  return item.kind === 'personal' || canEditTeam.value;\n}\n\nasync function buildHeaders(extra: Record<string, string> = {}): Promise<Record<string, string>> {\n  return { ...(await (props.authHeaders ?? (() => ({})))()), ...extra };\n}\n\nfunction absorb(body: unknown) {\n  const b = (body ?? {}) as { items?: unknown; can_edit_team?: unknown };\n  legacy.value = !Array.isArray(b.items);\n  items.value = tagItemsOf(body);\n  if (typeof b.can_edit_team === 'boolean') canEditTeam.value = b.can_edit_team;\n}\n\nasync function load() {\n  loading.value = true;\n  try {\n    const base = props.apiBase ?? '';\n    const res = await fetch(`${base}/api/files/manager/tags?node_id=${props.nodeId}`, {\n      headers: await buildHeaders(),\n      credentials: props.authCredentials ?? 'same-origin',\n    });\n    if (res.ok) absorb(await res.json());\n  } catch (err) {\n    emit('error', err instanceof Error ? err.message : String(err));\n  } finally {\n    loading.value = false;\n  }\n}\n\nasync function persist(next: TagItem[]) {\n  const previous = [...items.value];\n  items.value = next;\n  try {\n    const base = props.apiBase ?? '';\n    // ⚠ An older server gets the old shape: it would ignore `items` and read\n    // the missing `tags` as \"clear every tag\".\n    const body = legacy.value\n      ? { node_id: props.nodeId, tags: next.map((i) => i.name) }\n      : { node_id: props.nodeId, items: next };\n    const res = await fetch(`${base}/api/files/manager/tags`, {\n      method: 'POST',\n      headers: await buildHeaders({ 'Content-Type': 'application/json' }),\n      credentials: props.authCredentials ?? 'same-origin',\n      body: JSON.stringify(body),\n    });\n    if (!res.ok) throw requestFailure(res.status, await res.text().catch(() => ''), props.locale);\n    // The server's answer is the truth: it keeps the FIRST spelling of a name\n    // (\"müşteri teklifi\" typed on a second file lands as \"Müşteri Teklifi\").\n    const answer: unknown = await res.json().catch(() => null);\n    if (!legacy.value && answer && Array.isArray((answer as { items?: unknown }).items)) {\n      items.value = tagItemsOf(answer);\n    }\n    // ⚠ Announced, not only emitted: if the dialog was closed while the\n    // request was in flight this component is gone and Vue drops its emit —\n    // the panel would keep the list from before the save (lib/tags).\n    announceTagsChanged();\n    emit('change', items.value.map((i) => i.name), items.value);\n  } catch (err) {\n    items.value = previous;\n    emit('error', err instanceof Error ? err.message : String(err));\n  }\n}\n\nfunction closeAdd() {\n  newTag.value = '';\n  newKind.value = 'personal';\n  adding.value = false;\n}\n\n/* The longest name the server keeps, in characters (`maxlength` counts\n   UTF-16 units: an emoji counted twice, #211 audit B12). */\nconst tagMax = computed(() => serverLimit('tag_max_runes'));\nwatch(newTag, (v) => {\n  const clipped = clipRunes(v, tagMax.value);\n  if (clipped !== v) newTag.value = clipped;\n});\n\nfunction add() {\n  const v = newTag.value.trim();\n  const kind: TagKind = legacy.value ? 'team' : newKind.value;\n  if (!v || items.value.some((i) => i.kind === kind && i.name === v)) {\n    closeAdd();\n    return;\n  }\n  void persist([...items.value, { name: v, kind }]);\n  closeAdd();\n}\n\n/**\n * What leaving the name field does.\n *\n * ⚠⚠ Before kinds, leaving the field SAVED what was typed. With a kind choice\n * beside the field that is a trap: the pointer's way to \"Team\" is a blur of\n * the field, so the tag would be saved as PERSONAL on the way to the button —\n * and Safari does not focus a clicked button at all, so there is no\n * `relatedTarget` to recognise the move by. So with kinds, only Enter or the\n * Add button saves; the choice and the button swallow `mousedown` (below) so\n * a pointer never takes focus off the field; and leaving an EMPTY field closes\n * the form, which is the tidy-up the old blur gave. An older server has no\n * choice to lose, so it keeps the old save-on-leave.\n */\nfunction onFieldBlur(e: FocusEvent) {\n  if (legacy.value) {\n    add();\n    return;\n  }\n  const to = e.relatedTarget as Node | null;\n  if (to && addForm.value?.contains(to)) return;\n  if (!newTag.value.trim()) closeAdd();\n}\n\nfunction remove(item: TagItem) {\n  void persist(items.value.filter((i) => i !== item));\n}\n\nonMounted(load);\nwatch(() => props.nodeId, load);\n</script>\n\n<template>\n  <div class=\"filex-tag-picker\" :class=\"{ 'is-loading': loading }\">\n    <span\n      v-for=\"item in shown\"\n      :key=\"`${item.kind}:${item.name}`\"\n      class=\"filex-tag\"\n      :class=\"`filex-tag--${item.kind}`\"\n      :data-tag-kind=\"item.kind\"\n      :style=\"{ '--filex-tag-color': colorFor(item.name) }\"\n    >\n      <TagKindIcon :kind=\"item.kind\" />\n      <button\n        class=\"filex-tag-open\"\n        type=\"button\"\n        :title=\"openTitle(item)\"\n        :aria-label=\"openTitle(item)\"\n        :data-testid=\"`tag-open-${item.name}`\"\n        @click=\"emit('open', item.name, item.kind)\"\n      >{{ item.name }}</button>\n      <button\n        v-if=\"canRemove(item)\"\n        class=\"filex-tag-x\"\n        type=\"button\"\n        :aria-label=\"`${t('tags.remove')}: ${item.name}`\"\n        @click=\"remove(item)\"\n      >×</button>\n    </span>\n\n    <form v-if=\"adding\" ref=\"addForm\" class=\"filex-tag-add\" @submit.prevent=\"add\">\n      <input\n        v-model=\"newTag\"\n        autofocus\n        :placeholder=\"t('tags.name')\"\n        :aria-label=\"t('tags.name')\"\n        @blur=\"onFieldBlur\"\n        @keydown.escape=\"closeAdd\"\n      />\n      <!-- `mousedown.prevent`: a pointer on the choice or the button must not\n           take focus off the field (see onFieldBlur). -->\n      <div v-if=\"!legacy\" class=\"filex-tag-kindwrap\" @mousedown.prevent>\n        <ChoiceButtons\n          :model-value=\"newKind\"\n          :options=\"kindOptions\"\n          :aria-label=\"t('tags.kind.label')\"\n          testid-prefix=\"tag-kind\"\n          @update:model-value=\"(v: string | string[]) => (newKind = v === 'team' ? 'team' : 'personal')\"\n        />\n      </div>\n      <button class=\"filex-tag-add-submit\" type=\"submit\" @mousedown.prevent>{{ t('tags.add_submit') }}</button>\n    </form>\n    <button v-else class=\"filex-tag-add-btn\" type=\"button\" @click=\"adding = true\">\n      {{ t('tags.add') }}\n    </button>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-tag-picker {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 6px;\n  align-items: center;\n}\n.filex-tag-picker.is-loading {\n  opacity: 0.6;\n  pointer-events: none;\n}\n.filex-tag {\n  display: inline-flex;\n  align-items: center;\n  gap: 4px;\n  border-radius: 999px;\n  padding: 2px 10px;\n  font-size: 12px;\n  font-weight: 500;\n  color: #fff;\n  background: var(--filex-tag-color);\n}\n/* etiket:t1 — the tag's NAME is the door to its view. A bare button: it\n   inherits the chip's own colour and type so the chip still reads as one\n   object, and the underline appears only under the pointer, where the chip has\n   already said it is interactive by changing the cursor. */\n.filex-tag-open {\n  background: transparent;\n  border: 0;\n  padding: 0;\n  margin: 0;\n  color: inherit;\n  font: inherit;\n  line-height: inherit;\n  cursor: pointer;\n}\n.filex-tag-open:hover,\n.filex-tag-open:focus-visible {\n  text-decoration: underline;\n}\n.filex-tag-x {\n  background: transparent;\n  border: none;\n  color: rgba(255, 255, 255, 0.85);\n  cursor: pointer;\n  padding: 0 2px;\n  font-size: 14px;\n  line-height: 1;\n}\n.filex-tag-x:hover {\n  color: #fff;\n}\n.filex-tag-add input {\n  border: 1px solid var(--filex-border, #d1d5db);\n  border-radius: 12px;\n  padding: 2px 10px;\n  font-size: 12px;\n  width: 110px;\n}\n.filex-tag-add > input {\n  width: auto;\n  min-width: 0;\n  grid-column: 1;\n  grid-row: 1;\n}\n.filex-tag-add-btn {\n  border: 1px dashed var(--filex-border, #d1d5db);\n  background: transparent;\n  border-radius: 999px;\n  padding: 2px 10px;\n  font-size: 12px;\n  color: var(--filex-text-muted, #6b7280);\n  cursor: pointer;\n}\n/* gorunum:v1 — a host override still wins, but the fallback chain now ends at\n   the product blue instead of the old indigo, and it asks the palette first:\n   in a themed context this hover follows --fe-primary (and so goes light blue\n   in dark mode), and only a context with no stylesheet at all — the very case\n   where a fallback is the only thing painting — lands on the literal. */\n.filex-tag-add-btn:hover {\n  border-color: var(--filex-accent, var(--fe-primary, #2f6ceb));\n  color: var(--filex-accent, var(--fe-primary, #2f6ceb));\n}\n/* etiket:k2 — the kind rides inside the chip, before the name, in the chip's\n   own colour: the icon is the at-a-glance half, the title the spelled-out one.\n   A personal chip is OUTLINED and a team chip FILLED, so the two read apart\n   even for someone who cannot tell two 12px glyphs apart. */\n.filex-tag .fe-tagkind {\n  flex: none;\n  opacity: 0.9;\n}\n.filex-tag--personal {\n  background: transparent;\n  /* The page's own text colour, not the tag colour: an amber outline is\n     legible, amber letters on white are not. */\n  color: var(--fe-text, inherit);\n  box-shadow: inset 0 0 0 1.5px var(--filex-tag-color);\n}\n.filex-tag--personal .fe-tagkind {\n  color: var(--filex-tag-color);\n  opacity: 1;\n}\n.filex-tag--personal .filex-tag-x {\n  color: inherit;\n  opacity: 0.7;\n}\n/* The add form: the name and Add on one line, the kind choice under them at\n   full width with its two answers side by side, so \"who sees this\" reads as\n   one question with two answers rather than two stray boxes. */\n.filex-tag-add {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) auto;\n  align-items: start;\n  gap: 6px;\n  flex-basis: 100%;\n}\n.filex-tag-add .filex-tag-add-submit {\n  grid-column: 2;\n  grid-row: 1;\n}\n.filex-tag-kindwrap {\n  grid-column: 1 / -1;\n  grid-row: 2;\n}\n.filex-tag-kindwrap .fe-choice {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.filex-tag-add-submit {\n  border: 1px solid var(--filex-border, #d1d5db);\n  background: transparent;\n  border-radius: 12px;\n  padding: 2px 12px;\n  font-size: 12px;\n  color: inherit;\n  cursor: pointer;\n}\n</style>\n","/**\n * Locale message catalogue. The string-table is intentionally tiny — no\n * external i18n library, just a `t(key, vars?)` helper exposed via\n * `useLocale`.\n */\nimport { tr } from './tr';\nimport { en } from './en';\nimport type { LocaleCode } from '../types/ExplorerConfig';\n\nexport const messages: Record<LocaleCode, Record<string, string>> = { tr, en };\n\nexport { tr, en };\nexport { resolveLocale, detectLocale } from './resolve';\n","/**\n * fileIcons — extension/type → inline SVG icon mapping.\n *\n * Replaces the old emoji maps in GridView/ListView with a minimalist\n * line-icon set. Icons are hand-drawn 24×24 strokes on `currentColor`;\n * each family gets an accent via `--fe-icon-<family>` (variables.css),\n * applied through the `fe-ficon--<family>` class in base.css.\n *\n * Scope: what a listing row IS — its file type, plus the one STATE that\n * changes the picture rather than the caption (an encrypted folder, bottom of\n * this file). What a row DOES is `lib/actionIcons.ts`.\n *\n * ⚠ `.trash` and STORAGE rows used to be the documented exception here, and\n * they were drawn as 💾 and 🗑 by three separate copies of the same line in\n * GridView, GalleryView and ListView. On the multi-storage \"My files\" root —\n * the screen the sidebar now lands everybody on — that made a pixelated\n * floppy disk the first thing on the page, in a shape that changes between\n * Windows, macOS and Linux because it is a system font's idea of the glyph\n * rather than ours. They are families like any other now, so the card, the\n * tile and the row all get one definition (filex lesson #67).\n */\n\nimport { isTextualMime } from './serverRules';\n\nexport type IconFamily =\n  | 'folder'\n  | 'image'\n  | 'video'\n  | 'audio'\n  | 'pdf'\n  | 'doc'\n  | 'sheet'\n  | 'slides'\n  | 'archive'\n  | 'code'\n  | 'text'\n  // Not file types: the two rows a listing can hold that are PLACES rather\n  // than things. They carry no extension, so `iconFamilyFor` recognises them\n  // from the node instead.\n  | 'storage'\n  | 'trash'\n  | 'unknown';\n\nconst EXT_FAMILIES: Record<string, IconFamily> = {};\n\nfunction reg(family: IconFamily, exts: string[]) {\n  for (const e of exts) EXT_FAMILIES[e] = family;\n}\n\nreg('image', ['jpg', 'jpeg', 'png', 'webp', 'gif', 'bmp', 'avif', 'heic', 'svg', 'ico', 'tiff', 'tif']);\nreg('video', ['mp4', 'webm', 'mov', 'mkv', 'avi', 'ogv', 'm4v']);\nreg('audio', ['mp3', 'wav', 'flac', 'ogg', 'm4a', 'aac', 'opus']);\nreg('pdf', ['pdf']);\nreg('doc', ['doc', 'docx', 'odt', 'rtf']);\n/* gorunum:v1-preview — `tsv` joins its twin. It was the one tabular extension\n * with no family at all (so: the \"unknown\" glyph, and invisible to the\n * Spreadsheet filter), while the text viewer has read it as a table since\n * v0.5 (`viewers/CsvViewer.vue` branches on `ext === 'tsv'`). */\nreg('sheet', ['xls', 'xlsx', 'ods', 'csv', 'tsv']);\nreg('slides', ['ppt', 'pptx', 'odp']);\nreg('archive', ['zip', 'tar', 'gz', 'bz2', '7z', 'rar', 'xz', 'zst']);\n/**\n * Packages: archives with a purpose (a Java archive, an Android or Python\n * package, an editor or browser extension, an installer). They take the\n * archive family - its icon, its colour, its filter - but keep their own name\n * in the Type column (`JAR`, `APK`), which says more than \"Archive\" would\n * (`typeLabelKey`).\n *\n * ⚠ 0.50: an app that lists what a package holds (pkglist) draws these as a\n * page, and with no family of their own they were the white square on a\n * white row the list's type badge is there to prevent, badge-less.\n */\nconst PACKAGE_EXTS: ReadonlySet<string> = new Set([\n  'jar', 'war', 'ear', 'aar', 'apk', 'aab', 'apks', 'xapk', 'ipa', 'whl', 'egg', 'vsix',\n  'nupkg', 'snupkg', 'xpi', 'crx', 'appx', 'appxbundle', 'msix', 'msixbundle', 'deb', 'rpm',\n  'snap', 'gem', 'crate',\n]);\nreg('archive', [...PACKAGE_EXTS]);\nreg('code', [\n  'js', 'ts', 'jsx', 'tsx', 'mjs', 'cjs', 'vue', 'py', 'go', 'rs', 'php', 'rb',\n  'java', 'kt', 'swift', 'c', 'cpp', 'h', 'hpp', 'cs', 'css', 'scss', 'less',\n  'html', 'htm', 'json', 'yml', 'yaml', 'xml', 'sh', 'bash', 'ps1', 'sql', 'toml',\n]);\nreg('text', ['txt', 'md', 'markdown', 'log', 'ini', 'conf', 'cfg', 'env']);\n\n/**\n * The synthetic \"a storage\" row a listing can carry.\n *\n * The backend never sends `inode/storage`; FileExplorer mints these rows for\n * the multi-storage overview, and they are `type: 'dir'` with no folder behind\n * them — every mutation would 4xx. The test was written out longhand in three\n * view components, which is how a fourth surface came to be written without\n * it, so it is a function now and this file is its one home.\n */\nexport function isStorageRow(node: { mime_type?: string | null }): boolean {\n  return node.mime_type === 'inode/storage';\n}\n\n/** Pick the icon family for a listing node. */\nexport function iconFamilyFor(node: {\n  type?: string;\n  extension?: string | null;\n  mime_type?: string | null;\n  basename?: string | null;\n}): IconFamily {\n  // ⚠ Both of these are also `type: 'dir'`, so they have to be answered\n  // BEFORE the folder branch or they fall through to a plain folder — which\n  // is what `HomeView` still does by asking for `{ type: 'dir' }` by hand.\n  if (isStorageRow(node)) return 'storage';\n  if (node.basename === '.trash') return 'trash';\n  if (node.type === 'dir') return 'folder';\n  const ext = (node.extension || '').toLowerCase();\n  // #56: `LICENSE`, `Makefile` — no extension to go on, so the server's mime is\n  // the fact that is left. Only then: an unmapped extension keeps its tier-3\n  // name (\"ZIG\") rather than being relabelled by a guessed mime.\n  if (!ext) return isTextualMime(node.mime_type) ? 'text' : 'unknown';\n  return EXT_FAMILIES[ext] ?? 'unknown';\n}\n\n// Shared fragments. The document families reuse one sheet-with-fold base so\n// the set reads as one system; media families get standalone shapes.\nconst FILE_BASE =\n  '<path d=\"M6.5 3h7L18.5 8v11.5a1.5 1.5 0 0 1-1.5 1.5H6.5A1.5 1.5 0 0 1 5 19.5v-15A1.5 1.5 0 0 1 6.5 3z\"/>' +\n  '<path d=\"M13.5 3v5h5\"/>';\n\nconst GLYPHS: Record<IconFamily, string> = {\n  // Folder is the one \"filled\" member — a soft currentColor wash keeps it\n  // visually anchored without breaking the line style.\n  /**\n   * gorunum:v1 — the folder is SOLID, and it is the one glyph that never\n   * gets a tile. A folder is the most common thing in a listing; drawn as an\n   * outline in the same weight as the file glyphs it disappears into them,\n   * and the eye has to read the label to tell a folder from a document. Filled\n   * and in its own colour it is recognisable before the name is read.\n   */\n  folder:\n    '<path d=\"M2.5 6.5A2.5 2.5 0 0 1 5 4h4.6a2.5 2.5 0 0 1 1.77.73L13 6.4h6a2.5 2.5 0 0 1 2.5 2.5v8.6A2.5 2.5 0 0 1 19 20H5a2.5 2.5 0 0 1-2.5-2.5z\" fill=\"currentColor\" stroke=\"none\"/>',\n  image:\n    '<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"/>' +\n    '<circle cx=\"8.6\" cy=\"10\" r=\"1.6\"/>' +\n    '<path d=\"M5.2 16.6l4.3-4.3 3 3 2.4-2.4 3.9 3.7\"/>',\n  video:\n    '<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"/>' +\n    '<path d=\"M10.2 9.3v5.4l4.8-2.7z\" fill=\"currentColor\" stroke=\"none\"/>',\n  audio:\n    '<path d=\"M9 17.5V7.2l9-2.2v10.4\"/>' +\n    '<circle cx=\"6.8\" cy=\"17.6\" r=\"2.2\"/>' +\n    '<circle cx=\"15.8\" cy=\"15.5\" r=\"2.2\"/>',\n  pdf:\n    FILE_BASE +\n    '<rect x=\"7.5\" y=\"12\" width=\"9\" height=\"5\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.14\"/>',\n  doc:\n    FILE_BASE +\n    '<path d=\"M8.5 13h7M8.5 16h7\"/>',\n  sheet:\n    FILE_BASE +\n    '<path d=\"M8 12.5h8M8 15.5h8M8 18h8M12 12.5V18\"/>',\n  slides:\n    FILE_BASE +\n    '<rect x=\"8\" y=\"12.5\" width=\"8\" height=\"5\" rx=\"0.8\"/>',\n  archive:\n    FILE_BASE +\n    '<path d=\"M10 3v1.6M10 6.6v1.6M10 10.2v1.6\"/>' +\n    '<rect x=\"8.6\" y=\"14\" width=\"2.8\" height=\"3.4\" rx=\"0.8\"/>',\n  code:\n    FILE_BASE +\n    '<path d=\"M10.4 12.5L8.3 15l2.1 2.5M13.6 12.5l2.1 2.5-2.1 2.5\"/>',\n  text:\n    FILE_BASE +\n    '<path d=\"M8.5 12h7M8.5 15h7M8.5 18h4.5\"/>',\n  // The two-bay drive the sidebar already draws for the same storages, so a\n  // drive is one shape across the panel rather than one per surface.\n  storage:\n    '<rect x=\"3\" y=\"5\" width=\"18\" height=\"6\" rx=\"1.6\"/>' +\n    '<rect x=\"3\" y=\"13\" width=\"18\" height=\"6\" rx=\"1.6\"/>' +\n    '<path d=\"M6.5 8h.01M6.5 16h.01\"/>',\n  trash:\n    '<path d=\"M4 7h16\"/>' +\n    '<path d=\"M9.5 7V5.6A1.6 1.6 0 0 1 11.1 4h1.8a1.6 1.6 0 0 1 1.6 1.6V7\"/>' +\n    '<path d=\"M6.2 7l.85 11.6A1.6 1.6 0 0 0 8.65 20h6.7a1.6 1.6 0 0 0 1.6-1.4L17.8 7\"/>' +\n    '<path d=\"M10.2 10.8v5.6M13.8 10.8v5.6\"/>',\n  unknown:\n    FILE_BASE +\n    '<path d=\"M10.3 13.1a1.8 1.8 0 1 1 2.5 1.9c-.6.3-.8.7-.8 1.4\"/>' +\n    '<circle cx=\"12\" cy=\"18.4\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\"/>',\n};\n\nconst SVG_CACHE = new Map<IconFamily, string>();\n\n/** Inline SVG markup for a family (safe static strings — v-html friendly). */\nexport function iconSvg(family: IconFamily): string {\n  let svg = SVG_CACHE.get(family);\n  if (!svg) {\n    svg =\n      `<svg class=\"fe-ficon fe-ficon--${family}\" viewBox=\"0 0 24 24\" fill=\"none\" ` +\n      'stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" ' +\n      'stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">' +\n      `${GLYPHS[family]}</svg>`;\n    SVG_CACHE.set(family, svg);\n  }\n  return svg;\n}\n\n/** Convenience: node → SVG markup in one call. */\nexport function fileIconSvg(node: Parameters<typeof iconFamilyFor>[0]): string {\n  return iconSvg(iconFamilyFor(node));\n}\n\nconst TILE_CACHE = new Map<IconFamily, string>();\n\n/**\n * gorunum:v1 — the listing badge: a filled, rounded square in the family's\n * colour with the glyph knocked out in white.\n *\n * Why not the bare coloured glyph it replaces: at 16px a line drawing in a\n * pale accent is a smudge, and twelve of them down a column read as noise\n * rather than as twelve kinds of file. A solid chip of colour is legible at a\n * glance, holds its shape at any density, and gives the row a consistent left\n * edge whether the file has a thumbnail or not.\n *\n * The folder is the exception and returns its solid glyph untiled — a folder\n * is not a file type, and boxing it makes a listing look like a colour chart.\n */\nexport function iconTile(family: IconFamily): string {\n  if (family === 'folder') {\n    return `<span class=\"fe-ftile fe-ftile--folder\">${iconSvg(family)}</span>`;\n  }\n  let tile = TILE_CACHE.get(family);\n  if (!tile) {\n    tile = `<span class=\"fe-ftile fe-ftile--${family}\">${iconSvg(family)}</span>`;\n    TILE_CACHE.set(family, tile);\n  }\n  return tile;\n}\n\n/** Convenience: node → tile markup in one call. */\nexport function fileIconTile(node: Parameters<typeof iconFamilyFor>[0]): string {\n  /* wiring:e2 fxe — a single encrypted file: the padlock is its tile. */\n  if (isEncryptedFile(node)) return encryptedFileTile();\n  return iconTile(iconFamilyFor(node));\n}\n\n/* wiring:e2 fxe ---------------------------------------------------------\n * A single encrypted file (`.fxe`, docs/E2E-ENCRYPTION.md → \"Single encrypted\n * files\") is a state of a file, like the encrypted folder is a state of a\n * folder: it keeps the sheet-with-fold of every document and carries the\n * padlock cut out of it. Not an IconFamily, for the same reason as the folder\n * (lib/fileFilters filters by family).\n */\n\n/** True for a row that is a single encrypted file. */\nexport function isEncryptedFile(node: { type?: string; extension?: string | null; basename?: string | null }): boolean {\n  if (node.type === 'dir') return false;\n  if ((node.extension || '').toLowerCase() === 'fxe') return true;\n  return typeof node.basename === 'string' && node.basename.toLowerCase().endsWith('.fxe') && node.basename.length > 4;\n}\n\nconst LOCKED_FILE =\n  '<path fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\" d=\"' +\n  /* the sheet, with its fold */\n  'M6.5 3h7L18.5 8v11.5a1.5 1.5 0 0 1-1.5 1.5H6.5A1.5 1.5 0 0 1 5 19.5v-15A1.5 1.5 0 0 1 6.5 3z' +\n  /* the shackle */\n  'M9.7 12.2a2.3 2.3 0 0 1 4.6 0h-1.05a1.25 1.25 0 0 0-2.5 0z' +\n  /* the body */\n  'M9.2 12.2h5.6a1 1 0 0 1 1 1v3.6a1 1 0 0 1-1 1H9.2a1 1 0 0 1-1-1v-3.6a1 1 0 0 1 1-1z' +\n  '\"/>';\n\nlet LOCKED_FILE_TILE = '';\n\n/** Tile markup for a single encrypted file. */\nexport function encryptedFileTile(): string {\n  if (!LOCKED_FILE_TILE) {\n    LOCKED_FILE_TILE =\n      '<span class=\"fe-ftile fe-ftile--unknown fe-ftile--file-locked\">' +\n      '<svg class=\"fe-ficon fe-ficon--file-locked\" viewBox=\"0 0 24 24\" fill=\"none\" ' +\n      'stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" ' +\n      'stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">' +\n      `${LOCKED_FILE}</svg></span>`;\n  }\n  return LOCKED_FILE_TILE;\n}\n\n/* ======================================================================\n * ikon:emoji — the one listing marker that is a STATE, not a type.\n *\n * An end-to-end encrypted folder (wiring:e2) is a folder like any other; what\n * is special about it is a fact, not a kind, so it cannot be an `IconFamily`\n * — `iconFamilyFor` is the taxonomy `lib/fileFilters` filters by, and moving\n * these rows out of `folder` would quietly drop them from the Folders filter.\n * It lives beside the families instead, as one definition.\n *\n * ⚠ It was three. `specialEmojiFor(n) { if (n.type === 'dir' && n.e2e) return\n * '🔒' }` was copy-pasted verbatim into ListView, GridView and GalleryView —\n * the exact shape of the thing the duplicate-code gate exists to stop, and\n * the second time this file has had to absorb it (the first was `.trash` and\n * the storage row, drawn as 🗑 and 💾 by the same three copies).\n * ====================================================================== */\n\n/** True for a folder that is end-to-end encrypted. */\nexport function isEncryptedFolder(node: { type?: string; e2e?: boolean }): boolean {\n  return node.type === 'dir' && node.e2e === true;\n}\n\n/**\n * The solid folder with a padlock cut OUT of it.\n *\n * One path, `fill-rule=\"evenodd\"`: the shackle and the body are subpaths\n * inside the folder outline, so they become holes and show whatever the tile\n * sits on. That is deliberate — the alternative (drawing the lock in a\n * background colour) picks one background and is wrong on the other two\n * surfaces this tile appears on.\n *\n * ⚠ It replaces a 🔒 that replaced the folder entirely, so the row lost the\n * one thing it had always said: that it is a folder. Both facts are here now,\n * and the callers give the span an `aria-label` for the half a shape cannot\n * carry.\n */\nconst LOCKED_FOLDER =\n  '<path fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\" d=\"' +\n  /* the folder — the same outline as GLYPHS.folder */\n  'M2.5 6.5A2.5 2.5 0 0 1 5 4h4.6a2.5 2.5 0 0 1 1.77.73L13 6.4h6a2.5 2.5 0 0 1 2.5 2.5v8.6A2.5 2.5 0 0 1 19 20H5a2.5 2.5 0 0 1-2.5-2.5z' +\n  /* the shackle: outer arc over, step in, inner arc back, close down the leg */\n  'M9.7 12a2.3 2.3 0 0 1 4.6 0h-1.05a1.25 1.25 0 0 0-2.5 0z' +\n  /* the body */\n  'M9.2 12h5.6a1 1 0 0 1 1 1v3.6a1 1 0 0 1-1 1H9.2a1 1 0 0 1-1-1V13a1 1 0 0 1 1-1z' +\n  '\"/>';\n\nlet LOCKED_FOLDER_TILE = '';\n\n/**\n * Tile markup for an encrypted folder — `fe-ftile--folder`'s own box, so it\n * is the same size, colour and (lack of) chip as every other folder in the\n * column; only the shape differs.\n */\nexport function encryptedFolderTile(): string {\n  if (!LOCKED_FOLDER_TILE) {\n    LOCKED_FOLDER_TILE =\n      '<span class=\"fe-ftile fe-ftile--folder fe-ftile--folder-locked\">' +\n      '<svg class=\"fe-ficon fe-ficon--folder\" viewBox=\"0 0 24 24\" fill=\"none\" ' +\n      'stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" ' +\n      'stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">' +\n      `${LOCKED_FOLDER}</svg></span>`;\n  }\n  return LOCKED_FOLDER_TILE;\n}\n\n/* ======================================================================\n * gorunum:v1-preview — what the thing IS, said in words.\n *\n * The Type column used to print the raw extension in caps: `TS`, `CSV`,\n * `JPG`. That is not a kind, it is a suffix — it answers \"what did the file\n * get called\" when the question the column asks is \"what is this\". The\n * reference shell prints `TypeScript`, `Spreadsheet`, `Image`.\n *\n * ⚠ ONE table, here, beside the extension → family map it is built on top of\n * (filex lesson #67). Every surface that names a kind — the Type column\n * today, an info panel tomorrow — calls `typeLabelFor` and gets the same\n * answer; a second table beside it would disagree the first week somebody\n * added an extension to only one of them.\n *\n * Three tiers, in order:\n *   1. the extension has a name of its own      →  `ftype.typescript`\n *   2. otherwise its FAMILY has one            →  `ftype.code`, `ftype.image`\n *   3. neither (family `unknown`)              →  the uppercased extension\n *\n * Tier 3 is the deliberate fallback the brief asks for: an unmapped `.zig`\n * reads \"ZIG\", which is at least the truth, rather than an empty cell or a\n * confident lie like \"File\".\n * ====================================================================== */\n\n/** Extension → its own i18n key. Only extensions whose NAME differs from\n *  what the family would say need an entry here. */\nconst EXT_TYPE_KEYS: Record<string, string> = {\n  // Languages the person reading the column thinks of by name.\n  ts: 'ftype.typescript',\n  tsx: 'ftype.typescript',\n  mts: 'ftype.typescript',\n  cts: 'ftype.typescript',\n  js: 'ftype.javascript',\n  jsx: 'ftype.javascript',\n  mjs: 'ftype.javascript',\n  cjs: 'ftype.javascript',\n  vue: 'ftype.vue',\n  py: 'ftype.python',\n  go: 'ftype.go',\n  rs: 'ftype.rust',\n  php: 'ftype.php',\n  rb: 'ftype.ruby',\n  java: 'ftype.java',\n  kt: 'ftype.kotlin',\n  swift: 'ftype.swift',\n  c: 'ftype.c',\n  h: 'ftype.c',\n  cpp: 'ftype.cpp',\n  hpp: 'ftype.cpp',\n  cs: 'ftype.csharp',\n  // Structured text that is code by family but not a language.\n  css: 'ftype.stylesheet',\n  scss: 'ftype.stylesheet',\n  less: 'ftype.stylesheet',\n  html: 'ftype.html',\n  htm: 'ftype.html',\n  json: 'ftype.json',\n  yml: 'ftype.yaml',\n  yaml: 'ftype.yaml',\n  xml: 'ftype.xml',\n  toml: 'ftype.toml',\n  sql: 'ftype.sql',\n  sh: 'ftype.shell',\n  bash: 'ftype.shell',\n  zsh: 'ftype.shell',\n  ps1: 'ftype.powershell',\n  // Plain-text family members that are each their own thing.\n  md: 'ftype.markdown',\n  markdown: 'ftype.markdown',\n  txt: 'ftype.plaintext',\n  log: 'ftype.log',\n  ini: 'ftype.config',\n  conf: 'ftype.config',\n  cfg: 'ftype.config',\n  env: 'ftype.config',\n  // Tabular: a `.csv` IS a spreadsheet to the person looking at the column,\n  // whatever the program that wrote it was.\n  csv: 'ftype.sheet',\n  tsv: 'ftype.sheet',\n  // Design files. No icon family of their own (they fall to `unknown`, which\n  // is a decision for the GLYPH, not for the word) — naming them still beats\n  // printing \"FIG\".\n  fig: 'ftype.figma',\n  // ⚠ Named, not \"DRAWIO\": the uppercased extension was a fourth spelling of\n  // draw.io beside \"Drawio\", \"drawio\" and \"diagrams.net\" (QA, 2026-09-21).\n  drawio: 'ftype.drawio',\n  dio: 'ftype.drawio',\n  sketch: 'ftype.design',\n  xd: 'ftype.design',\n  psd: 'ftype.design',\n  ai: 'ftype.design',\n};\n\n/** Family → i18n key, the second tier. `unknown` is absent on purpose: it is\n *  what sends a node to the uppercased-extension fallback. */\nconst FAMILY_TYPE_KEYS: Partial<Record<IconFamily, string>> = {\n  folder: 'node.folder',\n  image: 'ftype.image',\n  video: 'ftype.video',\n  audio: 'ftype.audio',\n  pdf: 'ftype.pdf',\n  doc: 'ftype.document',\n  sheet: 'ftype.sheet',\n  slides: 'ftype.slides',\n  archive: 'ftype.archive',\n  code: 'ftype.code',\n  text: 'ftype.plaintext',\n};\n\n/**\n * The i18n key naming this node's kind, or null when nothing maps it and the\n * caller should fall back to the extension. Directories answer\n * `node.folder` — the key the grid card's caption already prints, not a\n * second string saying the same word.\n */\nexport function typeLabelKey(node: {\n  type?: string;\n  extension?: string | null;\n  mime_type?: string | null;\n}): string | null {\n  if (node.type === 'dir') return 'node.folder';\n  const ext = (node.extension || '').trim().toLowerCase();\n  if (ext === 'fxe') return 'e2e.fxe.type'; /* wiring:e2 fxe */\n  const own = EXT_TYPE_KEYS[ext];\n  if (own) return own;\n  // A package is an archive by family, but its own name says more (PACKAGE_EXTS).\n  if (PACKAGE_EXTS.has(ext)) return null;\n  return FAMILY_TYPE_KEYS[iconFamilyFor(node)] ?? null;\n}\n\n/**\n * The finished words for the Type column and anything else that names a\n * kind: the mapped name, else the uppercased extension, else an em dash.\n *\n * ⚠ The fallback lives HERE rather than at each call site. Two callers each\n * writing `key ? t(key) : ext.toUpperCase()` is two chances to render an\n * empty cell, and the first one to forget the `|| '—'` prints nothing at all\n * for a file with no extension.\n */\nexport function typeLabelFor(\n  node: { type?: string; extension?: string | null; mime_type?: string | null },\n  t: (key: string) => string,\n): string {\n  const key = typeLabelKey(node);\n  if (key) return t(key);\n  return extensionLabel(node) || '-';\n}\n\n/**\n * The extension in capitals (`DOCX`, `PDF`), or '' when there is none: the\n * Type column's third-tier fallback above and the list view's type badge on a\n * page thumbnail (lib/filePreview `thumbTypeBadge`) both read it here, so the\n * two never spell a kind differently.\n */\nexport function extensionLabel(node: { extension?: string | null }): string {\n  return (node.extension || '').trim().toUpperCase();\n}\n","/**\n * aessiv — AES-SIV (RFC 5297) on top of WebCrypto.\n *\n * WebCrypto has no SIV mode, so it is assembled here from the two primitives\n * it does have, exactly as the RFC defines it:\n *\n *   - AES-CMAC (RFC 4493) — computed with AES-CBC under a zero IV. CBC-MAC of\n *     the prepared message IS the CMAC; WebCrypto's CBC always appends a\n *     PKCS#7 padding block, which we simply ignore.\n *   - S2V (RFC 5297 §2.4) — CMAC over the associated-data strings and the\n *     plaintext, chained with doubling in GF(2^128).\n *   - CTR (RFC 5297 §2.5) — AES-CTR with the synthetic IV as the counter,\n *     bits 31 and 63 cleared. With those bits cleared a 32-bit counter can\n *     never carry for any message shorter than 2^31 blocks, so WebCrypto's\n *     `length: 32` counter is bit-for-bit the RFC's 128-bit addition.\n *\n * Output layout: V (16 bytes, the synthetic IV / tag) || C (same length as P).\n *\n * Key: 32 bytes = AES-128-SIV, 64 bytes = AES-256-SIV. The left half keys\n * S2V (CMAC), the right half keys CTR (RFC 5297 §2.6).\n *\n * Why SIV at all: it is DETERMINISTIC authenticated encryption. The same key\n * and the same plaintext always give the same ciphertext, and any change to\n * the ciphertext fails the tag. For file names that is the property we want:\n * the server can keep enforcing \"one name per folder\" on the ciphertext, and\n * a name that does not decrypt is recognisably not one of ours. See\n * docs/E2E-ENCRYPTION.md → \"Encrypted names\".\n *\n * Measured against RFC 5297 appendix A and against an independent\n * implementation (Python `cryptography`'s AESSIV) in\n * web/tests/lib/e2enames.test.ts; the Go twin is backend/internal/e2edecrypt.\n */\n\nconst BLOCK = 16;\nconst ZERO_BLOCK = new Uint8Array(BLOCK);\n\n/** A prepared AES-SIV key: the two halves imported for their one job each. */\nexport interface SivKey {\n  /** S2V half, as AES-CBC (the CMAC engine). */\n  mac: CryptoKey;\n  /** CTR half. */\n  ctr: CryptoKey;\n  /** CMAC subkeys K1/K2 of the S2V half (RFC 4493 §2.3). */\n  k1: Uint8Array;\n  k2: Uint8Array;\n}\n\n/** Thrown when a ciphertext fails the SIV check — tampered, or another key. */\nexport class SivAuthError extends Error {\n  constructor(msg = 'aes-siv: authentication failed') {\n    super(msg);\n    this.name = 'SivAuthError';\n  }\n}\n\nfunction ab(b: Uint8Array): ArrayBuffer {\n  return new Uint8Array(b).buffer as ArrayBuffer;\n}\n\n/** Doubling in GF(2^128) with the CMAC polynomial x^128 + x^7 + x^2 + x + 1. */\nexport function dbl(b: Uint8Array): Uint8Array {\n  const out = new Uint8Array(BLOCK);\n  let carry = 0;\n  for (let i = BLOCK - 1; i >= 0; i--) {\n    const v = b[i];\n    out[i] = ((v << 1) | carry) & 0xff;\n    carry = v >>> 7;\n  }\n  if (b[0] & 0x80) out[BLOCK - 1] ^= 0x87;\n  return out;\n}\n\nfunction xorInto(dst: Uint8Array, off: number, src: Uint8Array): void {\n  for (let i = 0; i < src.length; i++) dst[off + i] ^= src[i];\n}\n\nfunction xor16(a: Uint8Array, b: Uint8Array): Uint8Array {\n  const out = new Uint8Array(BLOCK);\n  for (let i = 0; i < BLOCK; i++) out[i] = a[i] ^ b[i];\n  return out;\n}\n\n/** One raw AES block encryption, via CBC with a zero IV. */\nasync function aesBlock(k: CryptoKey, block: Uint8Array): Promise<Uint8Array> {\n  const out = await crypto.subtle.encrypt({ name: 'AES-CBC', iv: ab(ZERO_BLOCK) }, k, ab(block));\n  return new Uint8Array(out).slice(0, BLOCK);\n}\n\n/** AES-CMAC (RFC 4493). */\nasync function cmac(key: SivKey, msg: Uint8Array): Promise<Uint8Array> {\n  const n = Math.max(1, Math.ceil(msg.length / BLOCK));\n  const complete = msg.length > 0 && msg.length % BLOCK === 0;\n  const m = new Uint8Array(n * BLOCK);\n  m.set(msg);\n  const last = (n - 1) * BLOCK;\n  if (complete) {\n    xorInto(m, last, key.k1);\n  } else {\n    m[msg.length] = 0x80;\n    xorInto(m, last, key.k2);\n  }\n  const ct = new Uint8Array(\n    await crypto.subtle.encrypt({ name: 'AES-CBC', iv: ab(ZERO_BLOCK) }, key.mac, ab(m)),\n  );\n  return ct.slice(last, last + BLOCK);\n}\n\n/** S2V (RFC 5297 §2.4) over the associated data strings and the plaintext. */\nasync function s2v(key: SivKey, ad: Uint8Array[], p: Uint8Array): Promise<Uint8Array> {\n  let d = await cmac(key, ZERO_BLOCK);\n  for (const a of ad) d = xor16(dbl(d), await cmac(key, a));\n  let t: Uint8Array;\n  if (p.length >= BLOCK) {\n    // xorend: XOR D into the last 16 bytes of P.\n    t = p.slice();\n    xorInto(t, p.length - BLOCK, d);\n  } else {\n    const padded = new Uint8Array(BLOCK);\n    padded.set(p);\n    padded[p.length] = 0x80;\n    t = xor16(dbl(d), padded);\n  }\n  return cmac(key, t);\n}\n\nfunction counterFrom(v: Uint8Array): Uint8Array {\n  const q = v.slice();\n  q[8] &= 0x7f;\n  q[12] &= 0x7f;\n  return q;\n}\n\nasync function ctr(key: SivKey, v: Uint8Array, data: Uint8Array): Promise<Uint8Array> {\n  if (data.length === 0) return new Uint8Array(0);\n  const out = await crypto.subtle.encrypt(\n    { name: 'AES-CTR', counter: ab(counterFrom(v)), length: 32 },\n    key.ctr,\n    ab(data),\n  );\n  return new Uint8Array(out);\n}\n\n/**\n * Import a raw AES-SIV key (32 or 64 bytes). The raw bytes are not kept:\n * both halves are imported non-extractable.\n */\nexport async function importSivKey(raw: Uint8Array): Promise<SivKey> {\n  if (raw.length !== 32 && raw.length !== 64) {\n    throw new Error('aes-siv: key must be 32 or 64 bytes');\n  }\n  const half = raw.length / 2;\n  const mac = await crypto.subtle.importKey('raw', ab(raw.slice(0, half)), { name: 'AES-CBC' }, false, [\n    'encrypt',\n  ]);\n  const ctrKey = await crypto.subtle.importKey('raw', ab(raw.slice(half)), { name: 'AES-CTR' }, false, [\n    'encrypt',\n    'decrypt',\n  ]);\n  const l = await aesBlock(mac, ZERO_BLOCK);\n  const k1 = dbl(l);\n  const k2 = dbl(k1);\n  return { mac, ctr: ctrKey, k1, k2 };\n}\n\n/** SIV-ENCRYPT: returns V || C. Deterministic by design. */\nexport async function sivEncrypt(\n  key: SivKey,\n  plaintext: Uint8Array,\n  ad: Uint8Array[] = [],\n): Promise<Uint8Array> {\n  const v = await s2v(key, ad, plaintext);\n  const c = await ctr(key, v, plaintext);\n  const out = new Uint8Array(BLOCK + c.length);\n  out.set(v, 0);\n  out.set(c, BLOCK);\n  return out;\n}\n\n/** SIV-DECRYPT: throws SivAuthError when the tag does not match. */\nexport async function sivDecrypt(\n  key: SivKey,\n  sealed: Uint8Array,\n  ad: Uint8Array[] = [],\n): Promise<Uint8Array> {\n  if (sealed.length < BLOCK) throw new SivAuthError('aes-siv: ciphertext too short');\n  const v = sealed.slice(0, BLOCK);\n  const p = await ctr(key, v, sealed.slice(BLOCK));\n  const t = await s2v(key, ad, p);\n  let diff = 0;\n  for (let i = 0; i < BLOCK; i++) diff |= t[i] ^ v[i];\n  if (diff !== 0) {\n    p.fill(0);\n    throw new SivAuthError();\n  }\n  return p;\n}\n","/**\n * e2enames — encrypted file and folder names inside an E2E folder.\n *\n * Design and rationale: docs/E2E-ENCRYPTION.md → \"Encrypted names\".\n *\n * ── The scheme in one screen ──────────────────────────────────────────\n *\n *   name key   64 random bytes, minted when names are turned on, stored in\n *              the marker wrapped by the folder master key (FMK). Reaching\n *              the FMK — by password, recovery key or escrow — reaches it.\n *   folder id  16 bytes per folder. The encrypted root's is random and sits\n *              in the marker (`names.root_id`); every other folder's is fixed\n *              when it first gets an encrypted name and then travels IN ITS\n *              STORED NAME (`S.D`), so it never changes: a rename or a move\n *              re-encrypts the folder's own name and keeps `D`.\n *   cipher     AES-SIV (RFC 5297) with AES-256; associated data = the id of\n *              the folder the name is in. The same name in two folders gives\n *              two different ciphertexts.\n *   input      the name normalised to Unicode NFC, UTF-8, 1..255 bytes.\n *   encoding   base64url without padding — [A-Za-z0-9_-]. A file is `S`, a\n *              folder `S.D` (D = base64url of its 16-byte id, 22 chars).\n *   long names S longer than 220 characters (a folder counts its `.D`) is\n *              stored as `H.fxl` (file) or `H.fxl.D` (folder), H =\n *              base64url(SHA-256(S)); S goes in a sibling sidecar `H.fxl.name`.\n *\n * ── Why a path still decrypts one segment at a time ───────────────────\n *\n * Each segment's associated data is the id of the folder above it, and that\n * id is in the folder's own stored name — the segment just before it in the\n * same path (the root's comes from the marker). So a breadcrumb, a Recent or\n * Starred row, a search hit or a trash entry is named from its path alone,\n * with no server state and no walk of the tree. Cryptomator keeps the id in\n * a `dir.c9r` file and gocryptfs in `gocryptfs.diriv`; putting it in the name\n * means a move carries it atomically and nothing extra is stored or fetched.\n *\n * ── How a folder id is made ───────────────────────────────────────────\n *\n * A folder made in the browser gets 16 random bytes. A folder whose name was\n * never encrypted (made over WebDAV, or not yet reached by a level change)\n * has id = SIV-V(name, AD = [parent id, \"filex-e2e-dir-id\"]) — the 16-byte\n * synthetic IV, a keyed PRF of the parent id and the name — so it has an id\n * BEFORE it is renamed: its children are encrypted under it first, and an\n * interrupted level change computes the same id again. Either way, from then\n * on the id is whatever the stored name says; renaming or moving the folder\n * never recomputes it. (Random for new folders so that a folder renamed away\n * and a new one made under the old name do not share an id.)\n *\n * ── How a stored name is read ─────────────────────────────────────────\n *\n *   'file' / 'dir'   base64url (`S` / `S.D`) that passes the SIV check\n *   'long' / 'longdir' `H.fxl` / `H.fxl.D`, resolved through the sidecar\n *   'sidecar'        `H.fxl.name` — bookkeeping, hidden from every view\n *   'plain'          anything else: a name that was never encrypted.\n * SIV authenticates, so a plaintext name passes with probability 2^-128 —\n * the classification is exact, which is what makes a level change resumable.\n */\n\nimport { importSivKey, sivDecrypt, sivEncrypt, type SivKey } from './aessiv';\n\n/** Algorithm id written into the marker's `names.alg`. */\nexport const E2E_NAMES_ALG = 'AES-SIV-512';\n/** Encoding id written into the marker's `names.enc`. */\nexport const E2E_NAMES_ENC = 'b64url';\n/** Encoded names longer than this are shortened (Cryptomator uses 220 too). */\nexport const E2E_NAMES_LONG_DEFAULT = 220;\n/** Plaintext name ceiling in UTF-8 bytes — what a local file system allows. */\nexport const E2E_NAME_MAX_BYTES = 255;\n/** Raw name-key length: AES-256-SIV takes two 256-bit keys. */\nexport const E2E_NAME_KEY_BYTES = 64;\n/** A folder id: 16 bytes, 22 base64url characters. */\nexport const E2E_DIR_ID_BYTES = 16;\nexport const E2E_LONG_SUFFIX = '.fxl';\nexport const E2E_SIDECAR_SUFFIX = '.fxl.name';\n/** Associated-data label that turns SIV into the folder-id PRF. */\nconst DIR_ID_LABEL = new TextEncoder().encode('filex-e2e-dir-id');\n\nconst SIV_TAG = 16;\nconst B64URL = /^[A-Za-z0-9_-]+$/;\nconst H = '[A-Za-z0-9_-]{43}';\nconst D = '[A-Za-z0-9_-]{22}';\nconst SIDECAR_RE = new RegExp(`^(${H})\\\\.fxl\\\\.name$`);\nconst LONG_RE = new RegExp(`^(${H})\\\\.fxl$`);\nconst LONGDIR_RE = new RegExp(`^(${H})\\\\.fxl\\\\.(${D})$`);\nconst DIR_RE = new RegExp(`^([A-Za-z0-9_-]{23,})\\\\.(${D})$`);\n/** Shortest possible encoded name: tag + one byte = 17 bytes = 23 chars. */\nconst MIN_ENC_LEN = 23;\n\n/** A folder's name key, ready to use. */\nexport interface E2eNameKey {\n  siv: SivKey;\n  /** Shortening threshold this folder was created with. */\n  long: number;\n  /** The encrypted root's own folder id (from the marker). */\n  rootId: Uint8Array;\n}\n\nexport type StoredNameKind = 'file' | 'dir' | 'long' | 'longdir' | 'sidecar' | 'plain';\n\nexport interface StoredName {\n  kind: StoredNameKind;\n  /** For 'long', 'longdir' and 'sidecar': the 43-char hash they share. */\n  hash?: string;\n  /** For 'file'/'dir': the encoded ciphertext. */\n  encoded?: string;\n  /** For 'dir'/'longdir': the folder's id. */\n  dirId?: Uint8Array;\n}\n\n/** Why a plaintext name cannot be encrypted, or null when it can. */\nexport type NameProblem = 'empty' | 'dot' | 'slash' | 'control' | 'too_long';\n\n/** Result of reading one stored name. */\nexport interface DecodedName {\n  /** The plaintext, when there is one. */\n  name: string | null;\n  /**\n   * 'enc'        decrypted.\n   * 'plain'      never encrypted — `name` is the stored name itself.\n   * 'unreadable' looked like ours and did not decrypt: a long name whose\n   *              sidecar is missing or does not match, a name moved into this\n   *              folder without being re-encrypted for it, or damage.\n   * 'sidecar'    bookkeeping; hide it.\n   */\n  state: 'enc' | 'plain' | 'unreadable' | 'sidecar';\n}\n\n// ---------------------------------------------------------------------\n// base64url (no padding)\n// ---------------------------------------------------------------------\n\nexport function b64urlEncode(b: Uint8Array): string {\n  let s = '';\n  for (let i = 0; i < b.length; i++) s += String.fromCharCode(b[i]);\n  return btoa(s).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\n/** Strict decode: null for anything outside the alphabet or a bad length. */\nexport function b64urlDecode(s: string): Uint8Array | null {\n  if (!s || !B64URL.test(s) || s.length % 4 === 1) return null;\n  const std = s.replace(/-/g, '+').replace(/_/g, '/');\n  const padded = std + '==='.slice((std.length + 3) % 4);\n  let raw: string;\n  try {\n    raw = atob(padded);\n  } catch {\n    return null;\n  }\n  const out = new Uint8Array(raw.length);\n  for (let i = 0; i < raw.length; i++) out[i] = raw.charCodeAt(i);\n  // Reject a non-canonical tail (unused bits set): two spellings of the same\n  // bytes would be two stored names for one plaintext.\n  if (b64urlEncode(out) !== s) return null;\n  return out;\n}\n\n// ---------------------------------------------------------------------\n// Plaintext names\n// ---------------------------------------------------------------------\n\n/** NFC — so a name typed on macOS (NFD) and on Windows (NFC) is one name. */\nexport function normalizeName(name: string): string {\n  return (name ?? '').normalize('NFC');\n}\n\n/**\n * The rules a plaintext name must meet before it is encrypted. They are the\n * rules a name must meet on a local disk, because `filex decrypt` writes\n * these names to one: nothing that is a path separator, a control\n * character, `.`/`..`, or longer than 255 UTF-8 bytes.\n */\nexport function namePlainProblem(name: string): NameProblem | null {\n  const n = normalizeName(name);\n  if (!n) return 'empty';\n  if (n === '.' || n === '..') return 'dot';\n  if (n.includes('/') || n.includes('\\\\')) return 'slash';\n  // eslint-disable-next-line no-control-regex\n  if (/[\\u0000-\\u001f\\u007f]/.test(n)) return 'control';\n  if (new TextEncoder().encode(n).length > E2E_NAME_MAX_BYTES) return 'too_long';\n  return null;\n}\n\n// ---------------------------------------------------------------------\n// Keys and folder ids\n// ---------------------------------------------------------------------\n\n/** A fresh raw name key. The caller wraps it and zeroes it. */\nexport function generateNameKeyBytes(): Uint8Array {\n  return crypto.getRandomValues(new Uint8Array(E2E_NAME_KEY_BYTES));\n}\n\n/** A fresh random folder id: the encrypted root's, and a new folder's. */\nexport function generateDirId(): Uint8Array {\n  return crypto.getRandomValues(new Uint8Array(E2E_DIR_ID_BYTES));\n}\n/** The encrypted root's id (random, kept in the marker). */\nexport const generateRootId = generateDirId;\n\nexport async function importNameKey(\n  raw: Uint8Array,\n  long: number,\n  rootId: Uint8Array,\n): Promise<E2eNameKey> {\n  if (raw.length !== E2E_NAME_KEY_BYTES) throw new Error('e2e: name key must be 64 bytes');\n  if (rootId.length !== E2E_DIR_ID_BYTES) throw new Error('e2e: a folder id is 16 bytes');\n  return { siv: await importSivKey(raw), long, rootId: rootId.slice() };\n}\n\nasync function sha256b64url(s: string): Promise<string> {\n  const d = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(s));\n  return b64urlEncode(new Uint8Array(d));\n}\n\n/**\n * The id of a folder whose name was never encrypted: a keyed PRF of its\n * parent's id and its name (the SIV synthetic IV under a label). Only ever\n * computed for a folder whose stored name does not carry an id yet.\n */\nexport async function deriveDirId(key: E2eNameKey, parentId: Uint8Array, plain: string): Promise<Uint8Array> {\n  const sealed = await sivEncrypt(key.siv, new TextEncoder().encode(normalizeName(plain)), [\n    parentId,\n    DIR_ID_LABEL,\n  ]);\n  return sealed.slice(0, E2E_DIR_ID_BYTES);\n}\n\n// ---------------------------------------------------------------------\n// Classify / encrypt / decrypt\n// ---------------------------------------------------------------------\n\n/** What a stored name is, from its spelling alone (no key needed). */\nexport function classifyStoredName(stored: string): StoredName {\n  let m = SIDECAR_RE.exec(stored);\n  if (m) return { kind: 'sidecar', hash: m[1] };\n  m = LONGDIR_RE.exec(stored);\n  if (m) {\n    const id = b64urlDecode(m[2]);\n    if (id && id.length === E2E_DIR_ID_BYTES) return { kind: 'longdir', hash: m[1], dirId: id };\n  }\n  m = LONG_RE.exec(stored);\n  if (m) return { kind: 'long', hash: m[1] };\n  m = DIR_RE.exec(stored);\n  if (m) {\n    const id = b64urlDecode(m[2]);\n    if (id && id.length === E2E_DIR_ID_BYTES) return { kind: 'dir', encoded: m[1], dirId: id };\n  }\n  if (stored.length >= MIN_ENC_LEN && B64URL.test(stored)) return { kind: 'file', encoded: stored };\n  return { kind: 'plain' };\n}\n\n/** The folder id a folder's stored name carries, or null (a plaintext name). */\nexport function dirIdOf(stored: string): Uint8Array | null {\n  return classifyStoredName(stored).dirId ?? null;\n}\n\n/**\n * The id the CHILDREN of a folder are encrypted under: the one its stored\n * name carries, or — for a folder whose name was never encrypted — the id it\n * WILL carry (deriveDirId over its plaintext name), so its contents can be\n * encrypted before it is renamed and read in the meantime.\n */\nexport async function effectiveDirId(\n  key: E2eNameKey,\n  parentId: Uint8Array,\n  stored: string,\n): Promise<Uint8Array> {\n  return dirIdOf(stored) ?? deriveDirId(key, parentId, stored);\n}\n\n/** The sidecar that belongs to a long stored name (file or folder). */\nexport function sidecarNameFor(stored: string): string | null {\n  const c = classifyStoredName(stored);\n  return c.kind === 'long' || c.kind === 'longdir' ? `${c.hash}${E2E_SIDECAR_SUFFIX}` : null;\n}\n\nexport interface EncryptedName {\n  /** What the server stores as the entry's name. */\n  stored: string;\n  /** The encoded ciphertext S (without a folder's `.D`). */\n  encoded: string;\n  /** For a folder: its id (kept, or derived). */\n  dirId?: Uint8Array;\n  /** Present only for a long name: the sidecar to write next to it. */\n  sidecar?: { name: string; content: string };\n}\n\n/**\n * Encrypt a plaintext name for the folder with id `parentId`. For a folder\n * pass `dirId` — its existing id when it is renamed or moved, or the derived\n * one when a plaintext-named folder gets its first encrypted name (never a\n * new one: its children are sealed under it) — or `isDir` alone for a NEW\n * folder, which gets a random id. Throws on a name `namePlainProblem` rejects.\n */\nexport async function encryptName(\n  key: E2eNameKey,\n  plain: string,\n  parentId: Uint8Array,\n  opts: { isDir?: boolean; dirId?: Uint8Array } = {},\n): Promise<EncryptedName> {\n  const problem = namePlainProblem(plain);\n  if (problem) throw new Error(`e2e: invalid name (${problem})`);\n  const bytes = new TextEncoder().encode(normalizeName(plain));\n  const encoded = b64urlEncode(await sivEncrypt(key.siv, bytes, [parentId]));\n  const isDir = opts.isDir || !!opts.dirId;\n  const dirId = isDir ? (opts.dirId ?? generateDirId()) : undefined;\n  const suffix = dirId ? `.${b64urlEncode(dirId)}` : '';\n  if (encoded.length + suffix.length <= key.long) {\n    return { stored: encoded + suffix, encoded, ...(dirId ? { dirId } : {}) };\n  }\n  const hash = await sha256b64url(encoded);\n  return {\n    stored: `${hash}${E2E_LONG_SUFFIX}${suffix}`,\n    encoded,\n    ...(dirId ? { dirId } : {}),\n    sidecar: { name: `${hash}${E2E_SIDECAR_SUFFIX}`, content: encoded },\n  };\n}\n\n/** Decrypt an encoded ciphertext name sealed for `parentId`. Null if not ours. */\nexport async function decryptEncoded(\n  key: E2eNameKey,\n  encoded: string,\n  parentId: Uint8Array,\n): Promise<string | null> {\n  const raw = b64urlDecode(encoded);\n  if (!raw || raw.length <= SIV_TAG) return null;\n  try {\n    const p = await sivDecrypt(key.siv, raw, [parentId]);\n    return new TextDecoder('utf-8', { fatal: true }).decode(p);\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Decrypt, and hold the plaintext to the same rules a name had to meet to be\n * encrypted. The browser never seals `../x` or `a/b`, but whoever holds the\n * folder key can: such a \"name\" would become a download filename or a path\n * segment, so it is reported as unreadable instead (`filex decrypt` refuses it\n * the same way).\n */\nasync function decryptName(\n  key: E2eNameKey,\n  encoded: string,\n  parentId: Uint8Array,\n): Promise<'unsafe' | string | null> {\n  const plain = await decryptEncoded(key, encoded, parentId);\n  if (plain === null) return null;\n  return namePlainProblem(plain) ? 'unsafe' : plain;\n}\n\n/**\n * Read one stored name found in the folder with id `parentId`.\n *\n * `readSidecar` fetches a sibling sidecar's content by its stored name; it is\n * only called for a long name. Returning null means \"no such file\".\n */\nexport async function decryptStoredName(\n  key: E2eNameKey,\n  stored: string,\n  parentId: Uint8Array,\n  readSidecar?: (sidecarName: string) => Promise<string | null>,\n): Promise<DecodedName> {\n  const c = classifyStoredName(stored);\n  if (c.kind === 'sidecar') return { name: null, state: 'sidecar' };\n  if (c.kind === 'plain') return { name: stored, state: 'plain' };\n  if (c.kind === 'long' || c.kind === 'longdir') {\n    const content = readSidecar ? await readSidecar(`${c.hash}${E2E_SIDECAR_SUFFIX}`) : null;\n    const encoded = (content ?? '').trim();\n    // The sidecar has to be the one this name was made from. A sidecar that\n    // was swapped, truncated or belongs to another item fails here rather\n    // than naming the file after something else.\n    if (!encoded || (await sha256b64url(encoded)) !== c.hash) {\n      return { name: null, state: 'unreadable' };\n    }\n    const plain = await decryptName(key, encoded, parentId);\n    return plain === null || plain === 'unsafe'\n      ? { name: null, state: 'unreadable' }\n      : { name: plain, state: 'enc' };\n  }\n  const plain = await decryptName(key, c.encoded!, parentId);\n  if (plain === 'unsafe') return { name: null, state: 'unreadable' };\n  if (plain !== null) return { name: plain, state: 'enc' };\n  // A folder-shaped name (`S.D`) is ours by construction; not opening under\n  // this folder's id means it was moved here without being re-encrypted (or\n  // is damaged). A file-shaped base64url name that does not open is simply a\n  // plaintext name that happens to look like one (`ReadMe_2024-final`).\n  return c.kind === 'dir' ? { name: null, state: 'unreadable' } : { name: stored, state: 'plain' };\n}\n\n/** Lower-cased extension of a plaintext name, without the dot ('' if none). */\nexport function extensionOf(name: string): string {\n  const i = name.lastIndexOf('.');\n  if (i <= 0 || i === name.length - 1) return '';\n  return name.slice(i + 1).toLowerCase();\n}\n","/**\n * e2estream — chunked authenticated encryption for content that does not fit\n * in memory (docs/E2E-ENCRYPTION.md → \"Streaming content (STREAM)\").\n *\n * WebCrypto ONLY, no dependencies. Two users:\n *\n *   - a single encrypted file (`.fxe`, lib/e2efile.ts), whose body is always\n *     a STREAM;\n *   - a file inside an encrypted folder that is larger than the one-shot\n *     limit (E2E_MAX_FILE_BYTES): header version 0x02, below.\n *\n * ── The construction ──────────────────────────────────────────────────\n *\n * STREAM (Hoang, Reyhanitabar, Rogaway, Vizár — \"Online Authenticated-\n * Encryption and its Nonce-Reuse Misuse-Resistance\", CRYPTO 2015) over\n * AES-256-GCM with a random 32-byte key per file:\n *\n *   plaintext  = P0 ‖ P1 ‖ … ‖ Pn-1        every Pi is 2^log2 bytes except\n *                                          Pn-1, which is 1 … 2^log2 bytes\n *                                          (0 bytes only when the whole\n *                                          plaintext is empty, then n = 1)\n *   nonce(i)   = prefix(7) ‖ uint32 BE i ‖ last(1)     last = 1 only for i = n-1\n *   chunk(i)   = AES-GCM(key, nonce(i), Pi)            ciphertext ‖ 16-byte tag\n *   body       = chunk(0) ‖ chunk(1) ‖ … ‖ chunk(n-1)\n *\n * The counter binds each chunk to its position (a reordered chunk fails its\n * tag), and the last-flag binds the END: a body cut at a chunk boundary ends\n * on a chunk that was sealed as \"not last\" and fails, and a chunk appended\n * after the real last one makes that one \"not last\" and it fails. No\n * associated data, like every other AES-GCM use in filex.\n *\n * ⚠ A streaming decryptor hands out the plaintext of chunk i before it has\n * seen chunk i+1, so a consumer MUST NOT treat what it received as the file\n * until the stream finished without an error: an error is \"truncated,\n * reordered, extended or damaged\", and whatever was already written is to be\n * thrown away (the browser's File System Access writable discards on abort;\n * `filex decrypt` writes into a partial directory it renames at the end).\n *\n * ── Folder file, version 0x02 ─────────────────────────────────────────\n *\n * Same 97-byte header as 0x01 up to offset 69, so a re-key re-wraps the DEK\n * of both versions the same way (only [9..69) changes):\n *\n *   [0..8)    magic \"filexe2e\"\n *   [8]       version 0x02\n *   [9..21)   wrapIV (12B) — GCM IV of the DEK wrap\n *   [21..69)  wrappedDEK (48B) = AES-GCM(FMK, wrapIV, DEK) — exactly as 0x01\n *   [69..76)  STREAM nonce prefix (7B)\n *   [76]      chunk size, log2 (writers: 20 = 1 MiB)\n *   [77..97)  zeros (readers ignore them)\n *   [97..)    STREAM body under the DEK\n *\n * Files up to E2E_MAX_FILE_BYTES keep 0x01, so every older filex reads them;\n * filex ≤ 0.47 refuses a 0x02 file (\"unsupported version 2\").\n */\n\nimport { E2eDecryptError, decryptFile } from './e2ecrypto';\n\n/** Chunk size writers use: 2^20 = 1 MiB of plaintext per chunk. */\nexport const E2E_STREAM_CHUNK_LOG2 = 20;\n/** The smallest chunk size a reader accepts (1 KiB). Writers never go below 20. */\nexport const E2E_STREAM_MIN_CHUNK_LOG2 = 10;\n/** The largest chunk size a reader accepts (16 MiB) — a hostile header must not\n *  make a reader allocate gigabytes for one chunk. */\nexport const E2E_STREAM_MAX_CHUNK_LOG2 = 24;\n/** Random nonce prefix per file. */\nexport const E2E_STREAM_PREFIX_LEN = 7;\n/** AES-GCM tag, appended to every chunk. */\nexport const E2E_STREAM_TAG_LEN = 16;\n/** Folder file header version of a STREAM body. */\nexport const E2E_FILE_VERSION_STREAM = 2;\n\nconst MAX_CHUNK_INDEX = 0xffffffff;\nconst IV_LEN = 12;\nconst HEADER_LEN = 97;\nconst WRAP_IV_OFF = 9;\nconst WRAPPED_DEK_OFF = 21;\nconst WRAPPED_DEK_LEN = 48;\nconst PREFIX_OFF = 69;\nconst LOG2_OFF = 76;\nconst DEK_LEN = 32;\nconst FOLDER_MAGIC = new TextEncoder().encode('filexe2e');\n\n/** An integer chunk size a reader accepts. */\nexport function validChunkLog2(n: unknown): n is number {\n  return (\n    typeof n === 'number' &&\n    Number.isInteger(n) &&\n    n >= E2E_STREAM_MIN_CHUNK_LOG2 &&\n    n <= E2E_STREAM_MAX_CHUNK_LOG2\n  );\n}\n\nfunction chunkBytes(log2: number): number {\n  if (!validChunkLog2(log2)) throw new Error(`e2e: unsupported chunk size 2^${log2}`);\n  return 2 ** log2;\n}\n\n/** The 12-byte nonce of chunk `index`. */\nexport function streamNonce(prefix: Uint8Array, index: number, last: boolean): Uint8Array<ArrayBuffer> {\n  if (prefix.length !== E2E_STREAM_PREFIX_LEN) throw new Error('e2e: the nonce prefix must be 7 bytes');\n  if (!Number.isInteger(index) || index < 0 || index > MAX_CHUNK_INDEX) {\n    throw new Error('e2e: too many chunks for one stream');\n  }\n  const n = new Uint8Array(IV_LEN);\n  n.set(prefix, 0);\n  new DataView(n.buffer).setUint32(E2E_STREAM_PREFIX_LEN, index, false);\n  n[IV_LEN - 1] = last ? 1 : 0;\n  return n;\n}\n\n/** How many chunks a plaintext of `plainSize` bytes is cut into. */\nexport function streamChunkCount(plainSize: number, log2: number = E2E_STREAM_CHUNK_LOG2): number {\n  if (!Number.isSafeInteger(plainSize) || plainSize < 0) throw new Error('e2e: bad plaintext size');\n  return plainSize === 0 ? 1 : Math.ceil(plainSize / chunkBytes(log2));\n}\n\n/** Bytes of STREAM body for a plaintext of `plainSize` bytes. */\nexport function streamCiphertextSize(plainSize: number, log2: number = E2E_STREAM_CHUNK_LOG2): number {\n  return plainSize + E2E_STREAM_TAG_LEN * streamChunkCount(plainSize, log2);\n}\n\n/**\n * The plaintext size a STREAM body of `cipherSize` bytes carries, or null when\n * no writer could have produced that length (a partial tag, or an empty final\n * chunk after a full one).\n */\nexport function streamPlaintextSize(cipherSize: number, log2: number = E2E_STREAM_CHUNK_LOG2): number | null {\n  if (!validChunkLog2(log2) || !Number.isSafeInteger(cipherSize) || cipherSize < E2E_STREAM_TAG_LEN) return null;\n  const full = 2 ** log2 + E2E_STREAM_TAG_LEN;\n  const n = Math.ceil(cipherSize / full);\n  const last = cipherSize - (n - 1) * full;\n  if (last < E2E_STREAM_TAG_LEN) return null;\n  if (n > 1 && last === E2E_STREAM_TAG_LEN) return null;\n  return cipherSize - E2E_STREAM_TAG_LEN * n;\n}\n\n/** A random 7-byte nonce prefix. */\nexport function randomStreamPrefix(): Uint8Array<ArrayBuffer> {\n  return crypto.getRandomValues(new Uint8Array(E2E_STREAM_PREFIX_LEN));\n}\n\n// ---------------------------------------------------------------------\n// Byte plumbing\n// ---------------------------------------------------------------------\n\n/** A FIFO of byte slices that hands out exactly-sized pieces. */\nexport class ByteQueue {\n  private parts: Uint8Array[] = [];\n  private head = 0;\n  length = 0;\n\n  push(b: Uint8Array): void {\n    if (b.length === 0) return;\n    this.parts.push(b);\n    this.length += b.length;\n  }\n\n  /** The next `n` bytes (n ≤ length), as a fresh buffer. */\n  take(n: number): Uint8Array<ArrayBuffer> {\n    if (n > this.length) throw new Error('ByteQueue: not enough bytes');\n    const out = new Uint8Array(n);\n    let o = 0;\n    while (o < n) {\n      const p = this.parts[0];\n      const k = Math.min(p.length - this.head, n - o);\n      out.set(p.subarray(this.head, this.head + k), o);\n      o += k;\n      this.head += k;\n      if (this.head === p.length) {\n        this.parts.shift();\n        this.head = 0;\n      }\n    }\n    this.length -= n;\n    return out;\n  }\n}\n\nfunction asBytes(chunk: unknown): Uint8Array {\n  if (chunk instanceof Uint8Array) return chunk;\n  if (chunk instanceof ArrayBuffer) return new Uint8Array(chunk);\n  if (ArrayBuffer.isView(chunk)) return new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength);\n  throw new TypeError('e2e: a stream carried something that is not bytes');\n}\n\n/**\n * Reads a byte stream in exact pieces, and hands back what is left of it as\n * a stream of its own. Used to take a header off the front of a download.\n */\nexport class ByteStreamReader {\n  private reader: ReadableStreamDefaultReader<Uint8Array>;\n  private q = new ByteQueue();\n  private done = false;\n\n  constructor(stream: ReadableStream<Uint8Array>) {\n    this.reader = stream.getReader();\n  }\n\n  /** Up to `n` bytes; fewer only when the stream ended. */\n  async read(n: number): Promise<Uint8Array<ArrayBuffer>> {\n    while (this.q.length < n && !this.done) {\n      const { done, value } = await this.reader.read();\n      if (done) this.done = true;\n      else this.q.push(asBytes(value));\n    }\n    return this.q.take(Math.min(n, this.q.length));\n  }\n\n  /** Everything not read yet, as a stream. The reader is spent afterwards. */\n  rest(): ReadableStream<Uint8Array> {\n    const left = this.q.take(this.q.length);\n    const reader = this.reader;\n    let first = left.length > 0 ? left : null;\n    const ended = this.done;\n    return new ReadableStream<Uint8Array>({\n      async pull(ctl) {\n        if (first) {\n          ctl.enqueue(first);\n          first = null;\n          return;\n        }\n        if (ended) {\n          ctl.close();\n          return;\n        }\n        const { done, value } = await reader.read();\n        if (done) ctl.close();\n        else ctl.enqueue(asBytes(value));\n      },\n      cancel(reason) {\n        return reader.cancel(reason);\n      },\n    });\n  }\n\n  cancel(reason?: unknown): Promise<void> {\n    return this.reader.cancel(reason);\n  }\n}\n\n/** A stream that yields `head` first, then everything `rest` yields. */\nexport function prependBytes(head: Uint8Array, rest: ReadableStream<Uint8Array>): ReadableStream<Uint8Array> {\n  const reader = rest.getReader();\n  let sent = false;\n  return new ReadableStream<Uint8Array>({\n    async pull(ctl) {\n      if (!sent) {\n        sent = true;\n        if (head.length > 0) {\n          ctl.enqueue(head);\n          return;\n        }\n      }\n      const { done, value } = await reader.read();\n      if (done) ctl.close();\n      else ctl.enqueue(asBytes(value));\n    },\n    cancel(reason) {\n      return reader.cancel(reason);\n    },\n  });\n}\n\n/** A stream of the given bytes, in pieces of at most `piece` bytes. */\nexport function bytesStream(b: Uint8Array, piece = 64 * 1024): ReadableStream<Uint8Array> {\n  let off = 0;\n  return new ReadableStream<Uint8Array>({\n    pull(ctl) {\n      if (off >= b.length) {\n        ctl.close();\n        return;\n      }\n      const end = Math.min(off + piece, b.length);\n      ctl.enqueue(b.slice(off, end));\n      off = end;\n    },\n  });\n}\n\n/** Everything a stream yields, joined. Only for data known to be small. */\nexport async function collectBytes(stream: ReadableStream<Uint8Array>, limit = Number.MAX_SAFE_INTEGER): Promise<Uint8Array<ArrayBuffer>> {\n  const q = new ByteQueue();\n  const reader = stream.getReader();\n  for (;;) {\n    const { done, value } = await reader.read();\n    if (done) break;\n    q.push(asBytes(value));\n    if (q.length > limit) {\n      await reader.cancel();\n      throw new Error('e2e: more data than expected');\n    }\n  }\n  return q.take(q.length);\n}\n\n// ---------------------------------------------------------------------\n// Chunks\n// ---------------------------------------------------------------------\n\nasync function sealChunk(\n  key: CryptoKey,\n  prefix: Uint8Array,\n  index: number,\n  last: boolean,\n  plain: Uint8Array<ArrayBuffer>,\n): Promise<Uint8Array<ArrayBuffer>> {\n  return new Uint8Array(\n    await crypto.subtle.encrypt({ name: 'AES-GCM', iv: streamNonce(prefix, index, last) }, key, plain),\n  );\n}\n\nasync function openChunk(\n  key: CryptoKey,\n  prefix: Uint8Array,\n  index: number,\n  last: boolean,\n  ct: Uint8Array<ArrayBuffer>,\n): Promise<Uint8Array<ArrayBuffer>> {\n  try {\n    return new Uint8Array(\n      await crypto.subtle.decrypt({ name: 'AES-GCM', iv: streamNonce(prefix, index, last) }, key, ct),\n    );\n  } catch {\n    throw new E2eDecryptError(\n      last\n        ? 'e2e: the last chunk failed authentication (the file is truncated, extended or damaged)'\n        : `e2e: chunk ${index} failed authentication (the file is damaged, reordered or truncated)`,\n    );\n  }\n}\n\nexport interface StreamEncryptOptions {\n  /** Refuse a plaintext that is not exactly this long (the header promised it). */\n  expectSize?: number;\n  /** Called with the plaintext bytes consumed so far. */\n  onProgress?: (bytes: number) => void;\n}\n\n/** Plaintext in, STREAM body out. */\nexport function createStreamEncryptor(\n  key: CryptoKey,\n  prefix: Uint8Array,\n  log2: number = E2E_STREAM_CHUNK_LOG2,\n  opts: StreamEncryptOptions = {},\n): TransformStream<Uint8Array, Uint8Array> {\n  const size = chunkBytes(log2);\n  if (prefix.length !== E2E_STREAM_PREFIX_LEN) throw new Error('e2e: the nonce prefix must be 7 bytes');\n  const q = new ByteQueue();\n  let index = 0;\n  let seen = 0;\n  return new TransformStream<Uint8Array, Uint8Array>({\n    async transform(chunk, ctl) {\n      const b = asBytes(chunk);\n      seen += b.length;\n      if (opts.expectSize !== undefined && seen > opts.expectSize) {\n        throw new Error('e2e: the file is longer than it said it was');\n      }\n      q.push(b);\n      // Strictly more than a chunk: the last chunk has to be known to be the\n      // last one, so a full chunk is held back until more data (or the end)\n      // arrives.\n      while (q.length > size) {\n        ctl.enqueue(await sealChunk(key, prefix, index++, false, q.take(size)));\n        opts.onProgress?.(index * size);\n      }\n    },\n    async flush(ctl) {\n      if (opts.expectSize !== undefined && seen !== opts.expectSize) {\n        throw new Error('e2e: the file is shorter than it said it was');\n      }\n      ctl.enqueue(await sealChunk(key, prefix, index++, true, q.take(q.length)));\n      opts.onProgress?.(seen);\n    },\n  });\n}\n\nexport interface StreamDecryptOptions {\n  /** Fail when the plaintext is not exactly this long (the header said so). */\n  expectSize?: number;\n}\n\n/** STREAM body in, plaintext out. Errors with E2eDecryptError on any tampering. */\nexport function createStreamDecryptor(\n  key: CryptoKey,\n  prefix: Uint8Array,\n  log2: number = E2E_STREAM_CHUNK_LOG2,\n  opts: StreamDecryptOptions = {},\n): TransformStream<Uint8Array, Uint8Array> {\n  const full = chunkBytes(log2) + E2E_STREAM_TAG_LEN;\n  if (prefix.length !== E2E_STREAM_PREFIX_LEN) throw new Error('e2e: the nonce prefix must be 7 bytes');\n  const q = new ByteQueue();\n  let index = 0;\n  let out = 0;\n  const count = (b: Uint8Array) => {\n    out += b.length;\n    if (opts.expectSize !== undefined && out > opts.expectSize) {\n      throw new E2eDecryptError('e2e: the file holds more than its header says');\n    }\n    return b;\n  };\n  return new TransformStream<Uint8Array, Uint8Array>({\n    async transform(chunk, ctl) {\n      q.push(asBytes(chunk));\n      while (q.length > full) ctl.enqueue(count(await openChunk(key, prefix, index++, false, q.take(full))));\n    },\n    async flush(ctl) {\n      if (q.length < E2E_STREAM_TAG_LEN) throw new E2eDecryptError('e2e: the encrypted content is truncated');\n      if (index > 0 && q.length === E2E_STREAM_TAG_LEN) {\n        throw new E2eDecryptError('e2e: the encrypted content ends in an empty chunk no writer produces');\n      }\n      ctl.enqueue(count(await openChunk(key, prefix, index++, true, q.take(q.length))));\n      if (opts.expectSize !== undefined && out !== opts.expectSize) {\n        throw new E2eDecryptError('e2e: the file holds less than its header says');\n      }\n    },\n  });\n}\n\n/** One-shot STREAM encryption of bytes in memory (small content and tests). */\nexport async function encryptStreamBytes(\n  key: CryptoKey,\n  prefix: Uint8Array,\n  plain: Uint8Array,\n  log2: number = E2E_STREAM_CHUNK_LOG2,\n): Promise<Uint8Array<ArrayBuffer>> {\n  return collectBytes(bytesStream(plain).pipeThrough(createStreamEncryptor(key, prefix, log2)));\n}\n\n/** One-shot STREAM decryption of bytes in memory. */\nexport async function decryptStreamBytes(\n  key: CryptoKey,\n  prefix: Uint8Array,\n  ct: Uint8Array,\n  log2: number = E2E_STREAM_CHUNK_LOG2,\n): Promise<Uint8Array<ArrayBuffer>> {\n  const size = chunkBytes(log2);\n  const full = size + E2E_STREAM_TAG_LEN;\n  const plain = streamPlaintextSize(ct.length, log2);\n  if (plain === null) throw new E2eDecryptError('e2e: the encrypted content has an impossible length');\n  const out = new Uint8Array(plain);\n  const n = streamChunkCount(plain, log2);\n  for (let i = 0; i < n; i++) {\n    const last = i === n - 1;\n    const piece = ct.slice(i * full, last ? ct.length : (i + 1) * full);\n    out.set(await openChunk(key, prefix, i, last, piece), i * size);\n  }\n  return out;\n}\n\n// ---------------------------------------------------------------------\n// The DEK\n// ---------------------------------------------------------------------\n\n/** A fresh random 32-byte data key, raw. The caller zeroes it. */\nexport function randomDek(): Uint8Array<ArrayBuffer> {\n  return crypto.getRandomValues(new Uint8Array(DEK_LEN));\n}\n\n/** Import raw DEK bytes as the AES-256-GCM key STREAM runs under. */\nexport async function importDek(raw: Uint8Array<ArrayBuffer>): Promise<CryptoKey> {\n  if (raw.length !== DEK_LEN) throw new E2eDecryptError('e2e: a file key must be 32 bytes');\n  return crypto.subtle.importKey('raw', raw, { name: 'AES-GCM' }, false, ['encrypt', 'decrypt']);\n}\n\n// ---------------------------------------------------------------------\n// Folder files, header version 0x02\n// ---------------------------------------------------------------------\n\nexport interface StreamFolderHeader {\n  wrapIV: Uint8Array<ArrayBuffer>;\n  wrappedDek: Uint8Array<ArrayBuffer>;\n  prefix: Uint8Array<ArrayBuffer>;\n  log2: number;\n}\n\n/** The 97-byte header of a 0x02 folder file. */\nexport function buildStreamFolderHeader(h: StreamFolderHeader): Uint8Array<ArrayBuffer> {\n  if (h.wrapIV.length !== IV_LEN || h.wrappedDek.length !== WRAPPED_DEK_LEN) {\n    throw new Error('e2e: bad wrapped key');\n  }\n  chunkBytes(h.log2);\n  const out = new Uint8Array(HEADER_LEN);\n  out.set(FOLDER_MAGIC, 0);\n  out[8] = E2E_FILE_VERSION_STREAM;\n  out.set(h.wrapIV, WRAP_IV_OFF);\n  out.set(h.wrappedDek, WRAPPED_DEK_OFF);\n  out.set(h.prefix, PREFIX_OFF);\n  out[LOG2_OFF] = h.log2;\n  return out;\n}\n\n/** Parse a 0x02 header. Throws a plain Error for anything that is not one. */\nexport function parseStreamFolderHeader(b: Uint8Array): StreamFolderHeader {\n  if (b.length < HEADER_LEN) throw new Error('e2e: not an encrypted file');\n  for (let i = 0; i < FOLDER_MAGIC.length; i++) {\n    if (b[i] !== FOLDER_MAGIC[i]) throw new Error('e2e: not an encrypted file');\n  }\n  if (b[8] !== E2E_FILE_VERSION_STREAM) throw new Error(`e2e: unsupported version ${b[8]}`);\n  const log2 = b[LOG2_OFF];\n  if (!validChunkLog2(log2)) throw new Error(`e2e: unsupported chunk size 2^${log2}`);\n  return {\n    wrapIV: b.slice(WRAP_IV_OFF, WRAP_IV_OFF + IV_LEN),\n    wrappedDek: b.slice(WRAPPED_DEK_OFF, WRAPPED_DEK_OFF + WRAPPED_DEK_LEN),\n    prefix: b.slice(PREFIX_OFF, PREFIX_OFF + E2E_STREAM_PREFIX_LEN),\n    log2,\n  };\n}\n\n/** Bytes of a 0x02 folder file carrying `plainSize` bytes. */\nexport function streamFolderFileSize(plainSize: number, log2: number = E2E_STREAM_CHUNK_LOG2): number {\n  return HEADER_LEN + streamCiphertextSize(plainSize, log2);\n}\n\n/**\n * Unwrap a file's DEK with the folder key, or — for a folder mid re-key —\n * the previous folder key. Throws E2eDecryptError when neither opens it.\n */\nexport async function unwrapFolderDek(\n  fmk: CryptoKey,\n  previous: CryptoKey | null | undefined,\n  wrapIV: Uint8Array<ArrayBuffer>,\n  wrapped: Uint8Array<ArrayBuffer>,\n): Promise<CryptoKey> {\n  for (const k of previous ? [fmk, previous] : [fmk]) {\n    let raw: Uint8Array<ArrayBuffer>;\n    try {\n      raw = new Uint8Array(await crypto.subtle.decrypt({ name: 'AES-GCM', iv: wrapIV }, k, wrapped));\n    } catch {\n      continue;\n    }\n    try {\n      return await importDek(raw);\n    } finally {\n      raw.fill(0);\n    }\n  }\n  throw new E2eDecryptError('e2e: DEK unwrap failed (wrong key?)');\n}\n\nexport interface FolderFileEncryptOptions {\n  /** Chunk size, log2. Tests only — writers use E2E_STREAM_CHUNK_LOG2. */\n  chunkLog2?: number;\n  onProgress?: (bytes: number) => void;\n}\n\n/**\n * Encrypt a file for an encrypted folder as a 0x02 STREAM file: a fresh DEK\n * wrapped under the folder key exactly as 0x01 wraps it, then the body.\n * `plainSize` must be exact — the stream errors when the source disagrees.\n */\nexport async function encryptFolderFileStream(\n  fmk: CryptoKey,\n  plainSize: number,\n  src: ReadableStream<Uint8Array>,\n  opts: FolderFileEncryptOptions = {},\n): Promise<{ stream: ReadableStream<Uint8Array>; size: number }> {\n  const log2 = opts.chunkLog2 ?? E2E_STREAM_CHUNK_LOG2;\n  const rawDek = randomDek();\n  const wrapIV = crypto.getRandomValues(new Uint8Array(IV_LEN));\n  let dek: CryptoKey;\n  let wrappedDek: Uint8Array<ArrayBuffer>;\n  try {\n    wrappedDek = new Uint8Array(await crypto.subtle.encrypt({ name: 'AES-GCM', iv: wrapIV }, fmk, rawDek));\n    dek = await importDek(rawDek);\n  } finally {\n    rawDek.fill(0);\n  }\n  const prefix = randomStreamPrefix();\n  const header = buildStreamFolderHeader({ wrapIV, wrappedDek, prefix, log2 });\n  const body = src.pipeThrough(\n    createStreamEncryptor(dek, prefix, log2, { expectSize: plainSize, onProgress: opts.onProgress }),\n  );\n  return { stream: prependBytes(header, body), size: streamFolderFileSize(plainSize, log2) };\n}\n\n/** Decrypt a whole 0x02 file held in memory (what `decryptFile` delegates to). */\nexport async function decryptStreamFolderFileBytes(\n  fmk: CryptoKey,\n  data: Uint8Array,\n  previous?: CryptoKey | null,\n): Promise<ArrayBuffer> {\n  const h = parseStreamFolderHeader(data);\n  const dek = await unwrapFolderDek(fmk, previous, h.wrapIV, h.wrappedDek);\n  const plain = await decryptStreamBytes(dek, h.prefix, data.subarray(HEADER_LEN), h.log2);\n  return plain.buffer;\n}\n\n/** The most a 0x01 file can be (one-shot content up to the limit + header + tag). */\nconst V1_MAX_TOTAL = 200 * 1024 * 1024 + HEADER_LEN + 16;\n\n/**\n * Decrypt a folder file as a stream, whichever version it is. A 0x01 file is\n * one AES-GCM message, so it is gathered (it is at most 200 MB) and opened in\n * one piece; a 0x02 file streams. A stream without the magic is passed\n * through as it is when `passPlain` (a file written in the clear over DAV),\n * and refused otherwise.\n */\nexport function decryptFolderFileStream(\n  fmk: CryptoKey,\n  previous: CryptoKey | null | undefined,\n  ct: ReadableStream<Uint8Array>,\n  opts: { passPlain?: boolean; onPlain?: () => void } = {},\n): ReadableStream<Uint8Array> {\n  const r = new ByteStreamReader(ct);\n  let inner: ReadableStreamDefaultReader<Uint8Array> | null = null;\n  return new ReadableStream<Uint8Array>({\n    async start(ctl) {\n      const head = await r.read(HEADER_LEN);\n      const magic = head.length >= 8 && FOLDER_MAGIC.every((c, i) => head[i] === c);\n      if (!magic) {\n        if (!opts.passPlain) throw new Error('e2e: not an encrypted file');\n        opts.onPlain?.();\n        inner = prependBytes(head, r.rest()).getReader();\n        return;\n      }\n      if (head.length < HEADER_LEN) throw new E2eDecryptError('e2e: the encrypted file is truncated');\n      if (head[8] === E2E_FILE_VERSION_STREAM) {\n        const h = parseStreamFolderHeader(head);\n        const dek = await unwrapFolderDek(fmk, previous, h.wrapIV, h.wrappedDek);\n        inner = r.rest().pipeThrough(createStreamDecryptor(dek, h.prefix, h.log2)).getReader();\n        return;\n      }\n      if (head[8] !== 1) throw new Error(`e2e: unsupported version ${head[8]}`);\n      const body = await collectBytes(r.rest(), V1_MAX_TOTAL - HEADER_LEN);\n      const whole = new Uint8Array(HEADER_LEN + body.length);\n      whole.set(head, 0);\n      whole.set(body, HEADER_LEN);\n      let plain: ArrayBuffer;\n      try {\n        plain = await decryptFile(fmk, whole.buffer);\n      } catch (err) {\n        if (!previous || !(err instanceof E2eDecryptError)) throw err;\n        plain = await decryptFile(previous, whole.buffer);\n      }\n      ctl.enqueue(new Uint8Array(plain));\n      ctl.close();\n    },\n    async pull(ctl) {\n      if (!inner) return;\n      const { done, value } = await inner.read();\n      if (done) ctl.close();\n      else ctl.enqueue(value);\n    },\n    cancel(reason) {\n      return inner ? inner.cancel(reason) : r.cancel(reason);\n    },\n  });\n}\n\n/** The size of the header a folder file starts with, for either version. */\nexport const E2E_FOLDER_HEADER_LEN = HEADER_LEN;\n","/**\n * e2evault/consts — the few numbers of the vault format that code outside the\n * vault needs while no vault is open: the key file's rules (lib/e2ecrypto\n * reads every key file), the pack sizes the new-folder dialog offers and the\n * entry limit the strip says.\n *\n * ⚠ A module of its own so the explorer's main chunk carries only these. The\n * rest of lib/e2evault and the vault's composable are loaded when a vault is\n * opened or made (composables/useE2eVault.ts → e2eVaultEngine.ts): everything\n * that imports this file is in the main chunk, and a module there takes every\n * export the lazy code uses with it. layout.ts re-exports all of them, and the\n * Go side keeps the same numbers (backend/internal/e2e/vault.go).\n *\n * No imports: nothing here may pull more into the main chunk.\n */\n\n/** The `req` entry of a vault's key file. */\nexport const VAULT_FEATURE = 'vault';\n/** `vault.v` in the key file, header byte 8, and the body's version. */\nexport const VAULT_FORMAT = 1;\n/** Pack sizes a reader accepts, as log2. */\nexport const VAULT_MIN_PACK_LOG2 = 16;\nexport const VAULT_MAX_PACK_LOG2 = 24;\n/** Pack sizes a writer creates: 4 MiB (the default) or 16 MiB. */\nexport const VAULT_DEFAULT_PACK_LOG2 = 22;\nexport const VAULT_LARGE_PACK_LOG2 = 24;\nexport const VAULT_WRITER_PACK_LOG2: readonly number[] = [VAULT_DEFAULT_PACK_LOG2, VAULT_LARGE_PACK_LOG2];\nexport const VAULT_ID_LEN = 16;\n/** A writer refuses a change beyond this many entries. */\nexport const VAULT_ENTRIES_WRITE_MAX = 250_000;\n\n/** A pack size a reader accepts. */\nexport function validReaderPackLog2(n: unknown): n is number {\n  return typeof n === 'number' && Number.isInteger(n) && n >= VAULT_MIN_PACK_LOG2 && n <= VAULT_MAX_PACK_LOG2;\n}\n","/**\n * e2ecrypto — client-side crypto for E2E-encrypted folders (wiring:e2).\n *\n * WebCrypto ONLY — zero dependencies. Design doc: docs/E2E-ENCRYPTION.md.\n *\n * ── Scheme ────────────────────────────────────────────────────────────\n *\n * Every encrypted file wraps its own random DEK under ONE key, the folder\n * master key (FMK), and stores the wrapped copy in its own 97-byte header.\n * The FMK is what a \"key slot\" in the folder marker hands back:\n *\n *   password ─PBKDF2-SHA256(600k, 16B salt)─▶ KEK ─┐\n *   recovery key ─HKDF-SHA256(16B salt)─▶ RKEK ────┼─▶ unwraps the FMK\n *   escrow private key ─RSA-OAEP-256───────────────┘\n *                                                   │\n *   per-file random 32B DEK ◀── AES-GCM-wrapped by the FMK, in the header\n *\n * Adding a recovery path therefore costs one more wrapped copy of a single\n * 32-byte key in the marker — not a re-encrypt of anything. The file format\n * below is UNCHANGED from v1 and stays that way; only the marker grew.\n *\n * ── Marker versions ───────────────────────────────────────────────────\n *\n * v1 (shipped up to 0.30.1) has no slots: the DEK is wrapped directly by\n * the password KEK. Read that as \"the FMK *is* the KEK\". Such folders keep\n * opening with nothing but their password, forever — the v1 read path is a\n * first-class path here, not a migration shim.\n *\n * v2 adds the slots. It comes in two flavours, told apart by `fmk`:\n *   - `fmk: 'wrapped'` — a fresh random FMK, held in `fmk_pw` wrapped under\n *     the password KEK. Every folder created from 0.31 on.\n *   - `fmk: 'kek'`     — a v1 folder that was given recovery keys in place.\n *     Its files were already wrapped under the KEK and are not rewritten, so\n *     the FMK stays defined as \"the password-derived KEK\" and the recovery\n *     slots wrap those raw 32 bytes. The password path is byte-identical to\n *     v1; only the extra slots are new.\n *\n * ── Invariants ────────────────────────────────────────────────────────\n *\n *   - No key, password or recovery key is ever stored, logged or sent to a\n *     server. The FMK lives in an in-memory key ring and dies with the tab.\n *   - `deriveKek` imports non-extractable. Raw KEK bytes are produced ONLY\n *     by `deriveKekBits`, only for a marker whose FMK *is* the KEK\n *     (`upgradeMarkerV1`, and `addEscrowSlot` on a folder it produced), and\n *     only long enough to wrap them into a slot.\n *   - A folder created while escrow was off carries no escrow slot, so the\n *     escrow key cannot open it, and nothing the OPERATOR does changes\n *     that — not enabling escrow, not adopting it, not any admin action or\n *     future version. That is arithmetic, not policy: adding a slot needs\n *     the folder master key, and the server has never held a credential\n *     that produces one.\n *   - The folder's OWNER can, from inside, with the password:\n *     `addEscrowSlot`. That is the only door, it opens from one side only,\n *     and it is the reason `escrowAvailability` says \"not as things stand\"\n *     rather than \"never\".\n *\n * v3 is v2 plus REQUIRED FEATURES (`req`). A client must understand every\n * entry of `req` or refuse the folder — the ext4 \"incompat flag\" rule. The\n * only feature today is `names` (encrypted file and folder names, see\n * lib/e2enames.ts): the marker then carries a `names` slot, a random name\n * key wrapped by the FMK. A folder without encrypted names stays v2 on\n * purpose, so every filex since 0.31 keeps opening it. A folder WITH them\n * must not open in an older filex at all: that build would show ciphertext\n * as names and write plaintext names next to them. filex ≤ 0.47 rejects\n * `v: 3` outright, which is the refusal we want.\n *\n * File layout ('filexe2e' magic, fixed 97-byte header) — UNCHANGED in v2/v3:\n *   [0..8)   magic  \"filexe2e\"\n *   [8]      version 0x01\n *   [9..21)  wrapIV  (12B)  — GCM IV of the DEK wrap\n *   [21..69) wrappedDEK (48B = 32B DEK + 16B GCM tag), wrapped by the FMK\n *   [69..81) dataIV  (12B)  — GCM IV of the content\n *   [81..97) reserved (zeros; v2 chunking/metadata)\n *   [97..)   ciphertext (content + 16B GCM tag)\n */\n\nimport {\n  E2E_NAMES_ALG,\n  E2E_NAMES_ENC,\n  E2E_NAMES_LONG_DEFAULT,\n  b64urlDecode,\n  b64urlEncode,\n  E2E_DIR_ID_BYTES,\n  generateNameKeyBytes,\n  generateRootId,\n  importNameKey,\n  type E2eNameKey,\n} from './e2enames';\n/* wiring:e2 stream — a folder file over E2E_MAX_FILE_BYTES is a STREAM file,\n * header version 0x02 (lib/e2estream.ts). `decryptFile` and `rewrapFileKey`\n * below read both versions; the header up to offset 69 is the same. */\nimport { E2E_FILE_VERSION_STREAM, decryptStreamFolderFileBytes } from './e2estream';\n/* wiring:e2 vault - level 3 (docs/E2E-VAULT-FORMAT.md). A vault's key file is\n * the marker below with one required feature, `vault`; its FMK is imported as\n * an HKDF key and never encrypts anything itself (lib/e2evault).\n *\n * ⚠ Only the format's few numbers are imported here (e2evault/consts): this\n * file is in the explorer's main chunk, and the rest of lib/e2evault is\n * loaded when a vault is unlocked or made (`loadVaultKeys`, `createVault`). */\nimport {\n  VAULT_DEFAULT_PACK_LOG2,\n  VAULT_FEATURE,\n  VAULT_FORMAT,\n  VAULT_ID_LEN,\n  VAULT_WRITER_PACK_LOG2,\n  validReaderPackLog2,\n} from './e2evault/consts';\n\n/** wiring:e2 vault - the vault's key schedule, loaded on first use. */\nfunction loadVaultKeys(): Promise<typeof import('./e2evault/keys')> {\n  return import('./e2evault/keys');\n}\n\nexport const E2E_MARKER_NAME = '.filex-e2e.json';\nexport const E2E_MAGIC = 'filexe2e';\n/** File-header version byte. Unchanged by the recovery work. */\nexport const E2E_VERSION = 1;\n/** Marker schema version written for a folder WITHOUT encrypted names. v1 still reads. */\nexport const E2E_MARKER_VERSION = 2;\n/** Marker schema version of a folder that carries required features (`req`). */\nexport const E2E_MARKER_VERSION_FEATURES = 3;\n/** Required features this build understands. Anything else in `req` → refuse. */\nexport const E2E_KNOWN_FEATURES: readonly string[] = ['names', 'rekey', 'conv', VAULT_FEATURE];\nexport const E2E_DEFAULT_ITERATIONS = 600_000;\nexport const E2E_MIN_ITERATIONS = 600_000;\n/** The most a marker may ask for (a hostile `iter` would hang the tab). */\nexport const E2E_MAX_ITERATIONS = 100_000_000;\n/** MVP single-shot in-memory ceiling — larger uploads are refused with a warning. */\nexport const E2E_MAX_FILE_BYTES = 200 * 1024 * 1024;\nexport const E2E_MIN_PASSWORD_LEN = 8;\n/** Entropy of a user recovery key: 20 bytes = 160 bits = exactly 32 base32 chars. */\nexport const E2E_RECOVERY_KEY_BYTES = 20;\n/** The only escrow algorithm this version understands. */\nexport const E2E_ESCROW_ALG = 'RSA-OAEP-256';\n\nconst VERIFY_PLAINTEXT = 'filex-e2e-verify-v1';\nconst MAGIC_BYTES = new TextEncoder().encode(E2E_MAGIC); // 8 bytes\nconst HEADER_LEN = 97;\nconst WRAP_IV_OFF = 9;\nconst WRAPPED_DEK_OFF = 21;\nconst WRAPPED_DEK_LEN = 48;\nconst DATA_IV_OFF = 69;\nconst IV_LEN = 12;\nconst FMK_LEN = 32;\n/** HKDF domain separation for the user recovery key. */\nconst RK_INFO = 'filex-e2e-recovery-v1';\nconst RK_SALT_LEN = 16;\n\n/** How the folder master key is obtained from the password slot. */\nexport type E2eFmkMode = 'kek' | 'wrapped';\n\n/** User-recovery-key slot: HKDF salt + the FMK wrapped under the derived key. */\nexport interface E2eRecoverySlot {\n  salt: string; // base64, 16B HKDF salt\n  blob: string; // base64: 12B IV || AES-GCM(RKEK, FMK)\n}\n\n/** Escrow slot: the FMK encrypted to the installation's escrow public key. */\nexport interface E2eEscrowSlot {\n  /** First 8 bytes of SHA-256(SPKI), hex — names WHICH escrow key this is. */\n  kid: string;\n  alg: string; // E2E_ESCROW_ALG\n  blob: string; // base64: RSA-OAEP-256(escrow public key, FMK)\n}\n\n/**\n * Encrypted-names slot (marker v3, feature `names`). Nothing in it is secret:\n * the key is sealed under the FMK, and the rest is the recipe.\n */\nexport interface E2eNamesSlot {\n  /** E2E_NAMES_ALG — AES-SIV (RFC 5297) with AES-256. */\n  alg: string;\n  /** E2E_NAMES_ENC — base64url, no padding. */\n  enc: string;\n  /** Encoded names longer than this are shortened to `<hash>.fxl` + sidecar. */\n  long: number;\n  /** base64: 12B IV || AES-GCM(FMK, 64-byte name key). */\n  key: string;\n  /**\n   * base64url of the encrypted root's own 16-byte folder id: the associated\n   * data of every name directly inside the root (lib/e2enames → \"Folder\n   * ids\"). Not secret; random, minted with the name key.\n   */\n  root_id: string;\n  /**\n   * A switch from plaintext names to encrypted names started and has not\n   * finished: some entries may still carry their plaintext name. The client\n   * offers to resume; the rename pass is idempotent, so resuming is simply\n   * running it again. Absent on a folder created with encrypted names.\n   */\n  pending?: boolean;\n}\n\n/**\n * A re-key in progress (marker v3, feature `rekey`): the folder has a NEW\n * folder master key, and some files still have their DEK wrapped under the\n * previous one. `from` is that previous key, sealed under the new one, so any\n * way into the folder also reaches the files not re-wrapped yet — and resuming\n * the re-wrap needs nothing but an unlock. Removed when the last file is done.\n */\nexport interface E2eRekeySlot {\n  /** base64: 12B IV || AES-GCM(new FMK, previous FMK raw 32B). */\n  from: string;\n  pending: true;\n}\n\n/**\n * An existing folder being encrypted in place (marker v3, feature `conv`):\n * some of its files may still be plaintext. The folder is an encrypted folder\n * to the server from the moment this key file lands (the transfer guard, the\n * thumbnailer and the indexer treat it so), and while `pending` the server\n * lets a write replace a plaintext file with its ciphertext without keeping\n * the plaintext as a version. Removed when every file carries the magic.\n */\nexport interface E2eConvSlot {\n  pending: true;\n  /** ISO time the conversion started. */\n  started?: string;\n  /** What to remove when it finishes (the owner's choice in the dialog,\n   *  kept here so a resumed run honours it): versions, trash entries. */\n  cleanup?: { versions: boolean; trash: boolean };\n}\n\n/**\n * The vault block of a level-3 key file (docs/E2E-VAULT-FORMAT.md → \"The key\n * file\"). Fixed when the vault is made; nothing rewrites it.\n */\nexport interface E2eVaultSlot {\n  /** Format version of packs and index: 1. */\n  v: number;\n  /** 16 random bytes, base64url without padding (22 characters). */\n  id: string;\n  /** The pack size as a power of two: writers make 22 (4 MiB) or 24 (16 MiB). */\n  pack: number;\n}\n\nexport interface E2eMarker {\n  v: number;\n  /** v3 + req ['vault']: the vault (level 3). */\n  vault?: E2eVaultSlot;\n  /** v3 only: features a client must understand to open this folder. */\n  req?: string[];\n  /** v3 + req 'rekey': a re-key in progress. */\n  rekey?: E2eRekeySlot;\n  /** v3 + req 'conv': an in-place conversion in progress. */\n  conv?: E2eConvSlot;\n  /** v3 + req 'names': the encrypted-names slot. */\n  names?: E2eNamesSlot;\n  salt: string; // base64, PBKDF2 salt for the password slot\n  iter: number;\n  verify: string; // base64: 12B IV || AES-GCM ciphertext of VERIFY_PLAINTEXT\n  /** v2 only. Absent on a v1 marker, where the FMK is implicitly the KEK. */\n  fmk?: E2eFmkMode;\n  /** v2 + fmk==='wrapped' only: base64 12B IV || AES-GCM(KEK, FMK). */\n  fmk_pw?: string;\n  /** v2 only, optional: the user recovery key slot. */\n  rk?: E2eRecoverySlot;\n  /** v2 only, optional: the operator escrow slot. */\n  esc?: E2eEscrowSlot;\n  /**\n   * v2 only, optional: an ISO timestamp recording that this folder's owner\n   * was OFFERED an escrow slot and said no.\n   *\n   * It lives in the marker rather than in browser storage because the unit\n   * of the decision is the FOLDER, not the device: the same person opening\n   * the folder from their phone must not be asked again, and a decision\n   * that vanished when someone cleared their site data would be no decision\n   * at all. It travels with the folder through a move, a backup and a\n   * restore, for the same reason the key slots do.\n   *\n   * It holds no key material and hides nothing from the operator — it is a\n   * record of an answer, and its only effect is that filex stops asking.\n   * `addEscrowSlot` clears it, so a decline is reversible by the one person\n   * who can reverse it.\n   */\n  esc_declined?: string;\n}\n\n/** Thrown on wrong password / corrupted ciphertext (GCM tag mismatch). */\nexport class E2eDecryptError extends Error {\n  constructor(msg = 'e2e: decrypt failed') {\n    super(msg);\n    this.name = 'E2eDecryptError';\n  }\n}\n\n// ---------------------------------------------------------------------\n// base64 helpers (no deps)\n// ---------------------------------------------------------------------\n\nexport function bytesToB64(b: Uint8Array): string {\n  let s = '';\n  for (let i = 0; i < b.length; i++) s += String.fromCharCode(b[i]);\n  return btoa(s);\n}\n\nexport function b64ToBytes(s: string): Uint8Array {\n  const raw = atob(s);\n  const out = new Uint8Array(raw.length);\n  for (let i = 0; i < raw.length; i++) out[i] = raw.charCodeAt(i);\n  return out;\n}\n\n/**\n * Copy into a fresh ArrayBuffer — TS 5.9 BufferSource typing rejects views\n * that may wrap a SharedArrayBuffer, and WebCrypto wants a plain buffer.\n */\nfunction buf(b: Uint8Array): ArrayBuffer {\n  return new Uint8Array(b).buffer as ArrayBuffer;\n}\n\n/** IV || ciphertext, the shape every AES-GCM blob in the marker uses. */\nfunction joinIvCt(iv: Uint8Array, ct: Uint8Array): string {\n  const out = new Uint8Array(iv.length + ct.length);\n  out.set(iv, 0);\n  out.set(ct, iv.length);\n  return bytesToB64(out);\n}\n\nasync function gcmSeal(key: CryptoKey, plain: Uint8Array): Promise<string> {\n  const iv = crypto.getRandomValues(new Uint8Array(IV_LEN));\n  const ct = new Uint8Array(\n    await crypto.subtle.encrypt({ name: 'AES-GCM', iv: buf(iv) }, key, buf(plain)),\n  );\n  return joinIvCt(iv, ct);\n}\n\n/* wiring:e2 fxe — the sealed-blob shape, for a container that reuses the\n * marker's slots (lib/e2efile.ts seals a file's DEK and its name with these).\n * Same bytes as every blob in a marker: base64(12B IV ‖ ciphertext ‖ tag). */\n/** Seal `plain` under `key` as a marker-style blob. */\nexport function sealBlob(key: CryptoKey, plain: Uint8Array): Promise<string> {\n  return gcmSeal(key, plain);\n}\n/** Open a marker-style blob; null for a wrong key or a damaged blob. */\nexport function openBlob(key: CryptoKey, b64: string): Promise<Uint8Array | null> {\n  return gcmOpen(key, b64);\n}\n/* /wiring:e2 fxe */\n\n/** Returns null (never throws) on a tag mismatch — i.e. \"wrong key\". */\nasync function gcmOpen(key: CryptoKey, b64: string): Promise<Uint8Array | null> {\n  let raw: Uint8Array;\n  try {\n    raw = b64ToBytes(b64);\n  } catch {\n    return null;\n  }\n  if (raw.length <= IV_LEN) return null;\n  try {\n    const pt = await crypto.subtle.decrypt(\n      { name: 'AES-GCM', iv: buf(raw.slice(0, IV_LEN)) },\n      key,\n      buf(raw.slice(IV_LEN)),\n    );\n    return new Uint8Array(pt);\n  } catch {\n    return null;\n  }\n}\n\n// ---------------------------------------------------------------------\n// Key derivation\n// ---------------------------------------------------------------------\n\n/**\n * Derive the folder KEK from a password. Returns a NON-extractable\n * AES-256-GCM CryptoKey — it can encrypt/decrypt but never be exported,\n * so even a same-origin script can't read the raw key material back.\n */\nexport async function deriveKek(\n  password: string,\n  salt: Uint8Array,\n  iterations: number,\n): Promise<CryptoKey> {\n  const material = await crypto.subtle.importKey(\n    'raw',\n    new TextEncoder().encode(password),\n    'PBKDF2',\n    false,\n    ['deriveKey'],\n  );\n  return crypto.subtle.deriveKey(\n    { name: 'PBKDF2', salt: buf(salt), iterations, hash: 'SHA-256' },\n    material,\n    { name: 'AES-GCM', length: 256 },\n    false, // non-extractable\n    ['encrypt', 'decrypt'],\n  );\n}\n\n/**\n * The same 32 bytes as `deriveKek`, but as raw material.\n *\n * ⚠ Used in exactly one place: upgrading a v1 marker, where the files are\n * already wrapped under the KEK and the recovery slots must therefore hold\n * those very bytes. Nothing else may call this — the steady-state password\n * path uses `deriveKek`, whose key cannot be exported.\n */\nasync function deriveKekBits(\n  password: string,\n  salt: Uint8Array,\n  iterations: number,\n): Promise<Uint8Array> {\n  const material = await crypto.subtle.importKey(\n    'raw',\n    new TextEncoder().encode(password),\n    'PBKDF2',\n    false,\n    ['deriveBits'],\n  );\n  const bits = await crypto.subtle.deriveBits(\n    { name: 'PBKDF2', salt: buf(salt), iterations, hash: 'SHA-256' },\n    material,\n    FMK_LEN * 8,\n  );\n  return new Uint8Array(bits);\n}\n\n/** Import raw 32 bytes as the AES-256-GCM folder master key. */\nasync function importFmk(raw: Uint8Array): Promise<CryptoKey> {\n  return crypto.subtle.importKey('raw', buf(raw), { name: 'AES-GCM' }, false, [\n    'encrypt',\n    'decrypt',\n  ]);\n}\n\n/**\n * wiring:e2 vault - the FMK as the marker's level needs it: for a vault, a\n * non-extractable HKDF key every vault key is derived from (it never\n * encrypts anything itself); for levels 1 and 2, the AES-GCM key that wraps\n * the file keys. The caller zeroes `raw`.\n */\nasync function importFmkFor(marker: E2eMarker, raw: Uint8Array): Promise<CryptoKey> {\n  return markerIsVault(marker) ? (await loadVaultKeys()).importVaultFmk(raw) : importFmk(raw);\n}\n\n// ---------------------------------------------------------------------\n// User recovery key — 160 bits, Crockford base32, 8 groups of 4\n// ---------------------------------------------------------------------\n\n/** Crockford base32: no I, L, O or U, so it survives being read aloud. */\nconst B32_ALPHABET = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\n\n/**\n * Format 20 raw bytes as the string the user writes down:\n * `XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX` (160 bits, no padding waste).\n */\nexport function formatRecoveryKey(raw: Uint8Array): string {\n  let bits = 0;\n  let acc = 0;\n  let out = '';\n  for (let i = 0; i < raw.length; i++) {\n    acc = (acc << 8) | raw[i];\n    bits += 8;\n    while (bits >= 5) {\n      out += B32_ALPHABET[(acc >>> (bits - 5)) & 31];\n      bits -= 5;\n    }\n  }\n  if (bits > 0) out += B32_ALPHABET[(acc << (5 - bits)) & 31];\n  return (out.match(/.{1,4}/g) || []).join('-');\n}\n\n/** Mint a fresh user recovery key. Shown once, never stored by filex. */\nexport function generateRecoveryKey(): string {\n  return formatRecoveryKey(crypto.getRandomValues(new Uint8Array(E2E_RECOVERY_KEY_BYTES)));\n}\n\n/**\n * Parse a typed-in recovery key back to its 20 bytes, or null when it is not\n * one. Forgiving about how a human retypes it: case, dashes, spaces and the\n * Crockford look-alikes (O to 0, I/L to 1) are all normalised away.\n */\nexport function parseRecoveryKey(s: string): Uint8Array | null {\n  const clean = (s || '')\n    .toUpperCase()\n    .replace(/[\\s-]/g, '')\n    .replace(/O/g, '0')\n    .replace(/[IL]/g, '1');\n  const need = Math.ceil((E2E_RECOVERY_KEY_BYTES * 8) / 5); // 32 chars\n  if (clean.length !== need) return null;\n  const out = new Uint8Array(E2E_RECOVERY_KEY_BYTES);\n  let acc = 0;\n  let bits = 0;\n  let n = 0;\n  for (const ch of clean) {\n    const v = B32_ALPHABET.indexOf(ch);\n    if (v < 0) return null;\n    acc = (acc << 5) | v;\n    bits += 5;\n    if (bits >= 8) {\n      out[n++] = (acc >>> (bits - 8)) & 0xff;\n      bits -= 8;\n    }\n  }\n  return n === E2E_RECOVERY_KEY_BYTES ? out : null;\n}\n\n/** HKDF-SHA256 the recovery key into the AES key that wraps the FMK. */\nasync function deriveRecoveryKek(raw: Uint8Array, salt: Uint8Array): Promise<CryptoKey> {\n  const base = await crypto.subtle.importKey('raw', buf(raw), 'HKDF', false, ['deriveKey']);\n  return crypto.subtle.deriveKey(\n    {\n      name: 'HKDF',\n      hash: 'SHA-256',\n      salt: buf(salt),\n      info: buf(new TextEncoder().encode(RK_INFO)),\n    },\n    base,\n    { name: 'AES-GCM', length: 256 },\n    false,\n    ['encrypt', 'decrypt'],\n  );\n}\n\nasync function sealRecoverySlot(fmk: Uint8Array, recoveryKey: string): Promise<E2eRecoverySlot> {\n  const raw = parseRecoveryKey(recoveryKey);\n  if (!raw) throw new Error('e2e: malformed recovery key');\n  const salt = crypto.getRandomValues(new Uint8Array(RK_SALT_LEN));\n  const rkek = await deriveRecoveryKek(raw, salt);\n  const slot = { salt: bytesToB64(salt), blob: await gcmSeal(rkek, fmk) };\n  raw.fill(0);\n  return slot;\n}\n\n// ---------------------------------------------------------------------\n// Escrow (operator recovery) — RSA-OAEP-256\n// ---------------------------------------------------------------------\n//\n// The server holds the PUBLIC half only, so it can wrap new folders' FMKs to\n// the escrow identity. The private half was handed to the admin at install\n// and is supplied back by hand when it is used. A stolen filex database\n// therefore decrypts nothing.\n\n/** Import the installation escrow public key (base64 SPKI, as the server serves it). */\nexport async function importEscrowPublicKey(spkiB64: string): Promise<CryptoKey> {\n  return crypto.subtle.importKey(\n    'spki',\n    buf(b64ToBytes(spkiB64)),\n    { name: 'RSA-OAEP', hash: 'SHA-256' },\n    true,\n    ['encrypt'],\n  );\n}\n\n/** Import the escrow private key the admin pastes in (base64 PKCS#8, PEM tolerated). */\nexport async function importEscrowPrivateKey(pkcs8B64: string): Promise<CryptoKey> {\n  const clean = (pkcs8B64 || '').replace(/-----[A-Z ]+-----/g, '').replace(/\\s+/g, '');\n  return crypto.subtle.importKey(\n    'pkcs8',\n    buf(b64ToBytes(clean)),\n    { name: 'RSA-OAEP', hash: 'SHA-256' },\n    false,\n    ['decrypt'],\n  );\n}\n\n/**\n * Stable short name for an escrow key: first 8 bytes of SHA-256(SPKI), hex.\n * Written into every escrow slot so a marker says WHICH key opens it, and so\n * the UI can tell \"this server's escrow key\" from \"some other one\".\n */\nexport async function escrowKeyId(spkiB64: string): Promise<string> {\n  const d = new Uint8Array(await crypto.subtle.digest('SHA-256', buf(b64ToBytes(spkiB64))));\n  return Array.from(d.slice(0, 8))\n    .map((x) => x.toString(16).padStart(2, '0'))\n    .join('');\n}\n\nasync function sealEscrowSlot(fmk: Uint8Array, escrowSpkiB64: string): Promise<E2eEscrowSlot> {\n  const pub = await importEscrowPublicKey(escrowSpkiB64);\n  const ct = new Uint8Array(await crypto.subtle.encrypt({ name: 'RSA-OAEP' }, pub, buf(fmk)));\n  return { kid: await escrowKeyId(escrowSpkiB64), alg: E2E_ESCROW_ALG, blob: bytesToB64(ct) };\n}\n\n// ---------------------------------------------------------------------\n// Marker create / parse / verify\n// ---------------------------------------------------------------------\n\n/**\n * Create a v1 folder marker — the pre-0.31 format, with NO recovery of any\n * kind.\n *\n * @deprecated Use `createEncryptedFolder`. Kept exported, and kept producing\n * a genuine v1 marker, so an embedder pinned to the old API keeps creating\n * folders this build can still open rather than half-formed v2 ones.\n */\nexport async function createMarker(\n  password: string,\n  iterations: number = E2E_DEFAULT_ITERATIONS,\n): Promise<{ marker: E2eMarker; kek: CryptoKey }> {\n  const iter = Math.max(E2E_MIN_ITERATIONS, iterations);\n  const salt = crypto.getRandomValues(new Uint8Array(16));\n  const kek = await deriveKek(password, salt, iter);\n  const verify = await gcmSeal(kek, new TextEncoder().encode(VERIFY_PLAINTEXT));\n  return { marker: { v: 1, salt: bytesToB64(salt), iter, verify }, kek };\n}\n\nexport interface CreateFolderOptions {\n  iterations?: number;\n  /** Base64 SPKI of the installation escrow key, when escrow is enabled. */\n  escrowPublicKey?: string | null;\n  /**\n   * Encrypt file and folder names too (marker v3, feature `names`). The\n   * default for a new folder in the UI; false keeps the v2 content-only\n   * folder that every filex since 0.31 can open.\n   */\n  encryptNames?: boolean;\n}\n\nexport interface CreatedFolder {\n  marker: E2eMarker;\n  /** The folder master key, ready for encryptFile/decryptFile. */\n  fmk: CryptoKey;\n  /** Show this ONCE. filex never stores it and can never show it again. */\n  recoveryKey: string;\n  /** The name key, when the folder was created with encrypted names. */\n  names?: E2eNameKey;\n}\n\n/** Mint a name key and seal it under the FMK. The raw bytes are zeroed. */\nasync function sealNamesSlot(\n  fmk: CryptoKey,\n  pending: boolean,\n): Promise<{ slot: E2eNamesSlot; key: E2eNameKey }> {\n  const raw = generateNameKeyBytes();\n  const rootId = generateRootId();\n  const slot: E2eNamesSlot = {\n    alg: E2E_NAMES_ALG,\n    enc: E2E_NAMES_ENC,\n    long: E2E_NAMES_LONG_DEFAULT,\n    key: await gcmSeal(fmk, raw),\n    root_id: b64urlEncode(rootId),\n  };\n  if (pending) slot.pending = true;\n  const key = await importNameKey(raw, slot.long, rootId);\n  raw.fill(0);\n  return { slot, key };\n}\n\n/**\n * Create a v2 encrypted folder: random FMK, wrapped under the password KEK,\n * under a freshly minted user recovery key, and — when the installation has\n * escrow enabled — to the escrow public key.\n */\nexport async function createEncryptedFolder(\n  password: string,\n  opts: CreateFolderOptions = {},\n): Promise<CreatedFolder> {\n  const iter = Math.max(E2E_MIN_ITERATIONS, opts.iterations ?? E2E_DEFAULT_ITERATIONS);\n  const salt = crypto.getRandomValues(new Uint8Array(16));\n  const kek = await deriveKek(password, salt, iter);\n  const rawFmk = crypto.getRandomValues(new Uint8Array(FMK_LEN));\n  const recoveryKey = generateRecoveryKey();\n\n  const marker: E2eMarker = {\n    v: E2E_MARKER_VERSION,\n    salt: bytesToB64(salt),\n    iter,\n    verify: await gcmSeal(kek, new TextEncoder().encode(VERIFY_PLAINTEXT)),\n    fmk: 'wrapped',\n    fmk_pw: await gcmSeal(kek, rawFmk),\n    rk: await sealRecoverySlot(rawFmk, recoveryKey),\n  };\n  if (opts.escrowPublicKey) marker.esc = await sealEscrowSlot(rawFmk, opts.escrowPublicKey);\n\n  const fmk = await importFmk(rawFmk);\n  rawFmk.fill(0);\n  if (!opts.encryptNames) return { marker, fmk, recoveryKey };\n  const sealed = await sealNamesSlot(fmk, false);\n  marker.v = E2E_MARKER_VERSION_FEATURES;\n  marker.req = ['names'];\n  marker.names = sealed.slot;\n  return { marker, fmk, recoveryKey, names: sealed.key };\n}\n\n/* wiring:e2 vault ------------------------------------------------------ */\n\nexport interface CreateVaultOptions {\n  iterations?: number;\n  /** Base64 SPKI of the installation escrow key, when escrow is enabled. */\n  escrowPublicKey?: string | null;\n  /** The pack size, log2: 22 (4 MiB, the default) or 24 (16 MiB). */\n  packLog2?: number;\n}\n\nexport interface CreatedVault {\n  /** The key file: v3, req [\"vault\"], the same slots as levels 1 and 2. */\n  marker: E2eMarker;\n  /** The FMK as a non-extractable HKDF key (lib/e2evault/keys). */\n  fmk: CryptoKey;\n  /** Show this ONCE. filex never stores it and can never show it again. */\n  recoveryKey: string;\n  /** The 16 raw bytes of `vault.id`. */\n  vaultId: Uint8Array;\n  /** Generation 1: the empty tree in a 64 KiB index file. */\n  index: Uint8Array<ArrayBuffer>;\n}\n\n/**\n * Make a new, empty vault (docs/E2E-VAULT-FORMAT.md → \"The key file\",\n * \"Generations\"): a random FMK wrapped under the password, a recovery key\n * and - when the installation has one - an escrow slot, exactly as levels 1\n * and 2; a random vault id; and generation 1, sealed. Nothing is sent: the\n * caller hands both to `POST /api/files/e2e/vault/create`.\n */\nexport async function createVault(password: string, opts: CreateVaultOptions = {}): Promise<CreatedVault> {\n  const packLog2 = opts.packLog2 ?? VAULT_DEFAULT_PACK_LOG2;\n  if (!VAULT_WRITER_PACK_LOG2.includes(packLog2)) throw new Error(`e2e: a vault's packs are 2^22 or 2^24 bytes, not 2^${packLog2}`);\n  // The vault's code first (loaded on first use, see the imports): no key\n  // material waits on a download.\n  const [{ importVaultFmk }, { cryptoRandom, sealIndexFile }, { encodeIndexBody }] = await Promise.all([\n    loadVaultKeys(),\n    import('./e2evault/writer'),\n    import('./e2evault/vindex'),\n  ]);\n  const iter = Math.max(E2E_MIN_ITERATIONS, opts.iterations ?? E2E_DEFAULT_ITERATIONS);\n  const salt = crypto.getRandomValues(new Uint8Array(16));\n  const kek = await deriveKek(password, salt, iter);\n  const rawFmk = crypto.getRandomValues(new Uint8Array(FMK_LEN));\n  const recoveryKey = generateRecoveryKey();\n  const vaultId = crypto.getRandomValues(new Uint8Array(VAULT_ID_LEN));\n  const marker: E2eMarker = {\n    v: E2E_MARKER_VERSION_FEATURES,\n    req: [VAULT_FEATURE],\n    salt: bytesToB64(salt),\n    iter,\n    verify: await gcmSeal(kek, new TextEncoder().encode(VERIFY_PLAINTEXT)),\n    fmk: 'wrapped',\n    fmk_pw: await gcmSeal(kek, rawFmk),\n    rk: await sealRecoverySlot(rawFmk, recoveryKey),\n  };\n  if (opts.escrowPublicKey) marker.esc = await sealEscrowSlot(rawFmk, opts.escrowPublicKey);\n  marker.vault = { v: VAULT_FORMAT, id: b64urlEncode(vaultId), pack: packLog2 };\n  const fmk = await importVaultFmk(rawFmk);\n  rawFmk.fill(0);\n  const index = await sealIndexFile(fmk, vaultId, 1, encodeIndexBody(new Map(), []).body, cryptoRandom);\n  return { marker, fmk, recoveryKey, vaultId, index };\n}\n\n/* /wiring:e2 vault ----------------------------------------------------- */\n\n/**\n * Give an existing v1 folder recovery keys, in place and without rewriting a\n * single file.\n *\n * The v1 files are wrapped under the password KEK, so the FMK stays defined\n * as \"the KEK\" (`fmk: 'kek'`) and the new slots wrap those raw bytes. The\n * password path afterwards is byte-identical to what it was.\n *\n * ⚠ Requires the password — this is only callable at the one moment filex\n * ever has it. There is no way to give a v1 folder recovery without it.\n * ⚠ When the installation has escrow on, this ALSO hands the operator a key\n * to a folder that did not have one. The caller must say so before asking.\n */\nexport async function upgradeMarkerV1(\n  marker: E2eMarker,\n  password: string,\n  opts: CreateFolderOptions = {},\n): Promise<CreatedFolder> {\n  if (marker.v !== 1) throw new Error('e2e: not a v1 marker');\n  const salt = b64ToBytes(marker.salt);\n  const kek = await deriveKek(password, salt, marker.iter);\n  // Prove the password before touching anything.\n  const ok = await gcmOpen(kek, marker.verify);\n  if (!ok || new TextDecoder().decode(ok) !== VERIFY_PLAINTEXT) {\n    throw new E2eDecryptError('e2e: wrong password');\n  }\n  const rawKek = await deriveKekBits(password, salt, marker.iter);\n  const recoveryKey = generateRecoveryKey();\n  const next: E2eMarker = {\n    v: E2E_MARKER_VERSION,\n    salt: marker.salt,\n    iter: marker.iter,\n    verify: marker.verify,\n    fmk: 'kek',\n    rk: await sealRecoverySlot(rawKek, recoveryKey),\n  };\n  if (opts.escrowPublicKey) next.esc = await sealEscrowSlot(rawKek, opts.escrowPublicKey);\n  rawKek.fill(0);\n  return { marker: next, fmk: kek, recoveryKey };\n}\n\n/**\n * Give an EXISTING v2 folder an escrow slot, in place, using the folder\n * password its owner has just typed.\n *\n * ── Why this exists ─────────────────────────────────────────────────\n *\n * Escrow used to be all-or-nothing at install time, and then adoptable but\n * never retroactive: on any installation that had been running for a while,\n * escrow covered only folders nobody had created yet. On a real deployment\n * the folders that matter already exist, so \"new folders only\" means escrow\n * covers nothing anyone cares about.\n *\n * The server still cannot do this, and that has not changed: adding a slot\n * needs the folder master key, which needs a credential the server has never\n * held. What CAN do it is the browser, at the one moment the password is in\n * memory — exactly where `upgradeMarkerV1` already lives. Same moment, same\n * shape, different slot.\n *\n * ⚠⚠ Accepting hands the operator of this installation a second, permanent\n * way into this folder. It is the folder's owner who decides, from inside,\n * with the password; no configuration change and no admin action can do it\n * for them. The caller MUST say that in those words before calling this —\n * see `e2e.escrowoffer.*` in the locales.\n *\n * ⚠ v2 only. A v1 marker has no slots at all; the path for those is\n * `upgradeMarkerV1`, which already seals an escrow slot when the\n * installation has a key and already discloses it. Two doors into the same\n * room would be two chances to get the disclosure wrong.\n *\n * ⚠ No file is re-encrypted, moved or rewritten. Only `.filex-e2e.json`\n * changes, and only by gaining `esc` (and losing `esc_declined`).\n */\nexport async function addEscrowSlot(\n  marker: E2eMarker,\n  password: string,\n  escrowPublicKey: string,\n): Promise<E2eMarker> {\n  if (!hasSlots(marker)) throw new Error('e2e: not a v2 marker');\n  if (marker.esc) throw new Error('e2e: this folder already has an escrow slot');\n  if (!escrowPublicKey) throw new Error('e2e: no escrow public key');\n\n  const salt = b64ToBytes(marker.salt);\n  const kek = await deriveKek(password, salt, marker.iter);\n  // Prove the password before touching anything, exactly as the v1 upgrade\n  // does. A wrong password here must not produce a marker at all — half a\n  // marker is a folder nobody can open.\n  const proof = await gcmOpen(kek, marker.verify);\n  if (!proof || new TextDecoder().decode(proof) !== VERIFY_PLAINTEXT) {\n    throw new E2eDecryptError('e2e: wrong password');\n  }\n\n  // The raw FMK, by mode. `wrapped` keeps a random FMK in `fmk_pw`, so the\n  // bytes come back from a GCM open and no extractable KEK is ever derived.\n  // `kek` (a v1 folder upgraded in place) defines the FMK AS the password\n  // key, so those very bytes are what the slot has to wrap — the one case\n  // that needs `deriveKekBits`, for the same reason `upgradeMarkerV1` does.\n  let rawFmk: Uint8Array;\n  if (marker.fmk === 'wrapped') {\n    const opened = marker.fmk_pw ? await gcmOpen(kek, marker.fmk_pw) : null;\n    if (!opened || opened.length !== FMK_LEN) {\n      throw new E2eDecryptError('e2e: could not unwrap the folder master key');\n    }\n    rawFmk = opened;\n  } else {\n    rawFmk = await deriveKekBits(password, salt, marker.iter);\n  }\n\n  const esc = await sealEscrowSlot(rawFmk, escrowPublicKey);\n  rawFmk.fill(0);\n\n  const next: E2eMarker = { ...marker, esc };\n  // A decline that is now moot. Leaving it would make the record say two\n  // contradictory things about the same folder.\n  delete next.esc_declined;\n  return next;\n}\n\n/**\n * Record that this folder's owner was offered an escrow slot and declined.\n *\n * A refusal is a decision, not a delay: without this the offer would come\n * back on every single unlock, which is how people learn to click past\n * security dialogs without reading them. Nothing about the folder's keys\n * changes — the only effect is that filex stops asking.\n *\n * Reversible by `addEscrowSlot`, which is the way back for somebody who\n * says no today and changes their mind next month.\n */\nexport function declineEscrowSlot(marker: E2eMarker, when: string): E2eMarker {\n  return { ...marker, esc_declined: when };\n}\n\n/**\n * Whether this folder's owner should be offered an escrow slot, and whether\n * they have already answered.\n *\n *   'n/a'       nothing to offer: the installation has no escrow key, the\n *               folder already has a slot, or the marker is v1 (whose path\n *               is `upgradeMarkerV1`).\n *   'offer'     the offer applies and no answer has been recorded.\n *   'declined'  the offer applies and the owner said no. Do not ask again;\n *               leave a way back.\n *\n * ⚠ This deliberately does NOT look at whether the folder is unlocked. That\n * is the caller's business, and it matters: the offer may only be shown\n * after an unlock actually succeeded, because accepting needs the password\n * and because asking someone who cannot open the folder to give away a key\n * to it is asking the wrong person.\n */\nexport type EscrowOfferState = 'n/a' | 'offer' | 'declined';\n\nexport function escrowOfferState(\n  m: E2eMarker | null,\n  installationKid: string | null | undefined,\n): EscrowOfferState {\n  if (!installationKid) return 'n/a';\n  if (!m || !hasSlots(m) || m.esc) return 'n/a';\n  return m.esc_declined ? 'declined' : 'offer';\n}\n\n/** True for a marker that carries key slots: v2, and v3 (v2 + features). */\nfunction hasSlots(m: E2eMarker): boolean {\n  return m.v === 2 || m.v === E2E_MARKER_VERSION_FEATURES;\n}\n\n/** A parsed marker, plus the required features this build does not know. */\nexport interface ParsedMarker {\n  marker: E2eMarker;\n  /**\n   * Entries of `req` this build cannot honour. Non-empty means: do NOT open\n   * the folder — say which feature is missing and that a newer filex is\n   * needed. Opening it anyway is how an old client writes plaintext into a\n   * folder that promised otherwise.\n   */\n  unsupported: string[];\n}\n\n/**\n * Parse marker JSON text, keeping what the caller needs to REFUSE a folder\n * honestly. Null when the text is not a marker at all (or a malformed one);\n * a well-formed v3 marker with a feature this build does not know comes back\n * with that feature in `unsupported`.\n */\nexport function parseMarkerDetailed(text: string): ParsedMarker | null {\n  let m: E2eMarker;\n  try {\n    m = JSON.parse(text) as E2eMarker;\n  } catch {\n    return null;\n  }\n  if (!m || typeof m !== 'object') return null;\n  if (m.v !== 1 && !hasSlots(m)) return null;\n  if (typeof m.salt !== 'string' || typeof m.verify !== 'string') return null;\n  // An integer, and bounded: the unlock derives with whatever the marker says,\n  // and `iter: 1e12` in a hostile key file would hang the tab (filex writes\n  // 600 000; `filex decrypt` accepts the same range).\n  if (typeof m.iter !== 'number' || !Number.isInteger(m.iter) || m.iter < 1 || m.iter > E2E_MAX_ITERATIONS) {\n    return null;\n  }\n  if (hasSlots(m)) {\n    if (m.fmk !== 'kek' && m.fmk !== 'wrapped') return null;\n    if (m.fmk === 'wrapped' && typeof m.fmk_pw !== 'string') return null;\n  }\n  const unsupported: string[] = [];\n  if (m.v === E2E_MARKER_VERSION_FEATURES) {\n    if (!Array.isArray(m.req) || m.req.some((f) => typeof f !== 'string')) return null;\n    for (const f of m.req) if (!E2E_KNOWN_FEATURES.includes(f)) unsupported.push(f);\n    /* wiring:e2 vault - docs/E2E-VAULT-FORMAT.md → \"The key file\": req is\n     * exactly [\"vault\"], the FMK is wrapped, no slot of another feature, and\n     * a vault block this build reads. A higher `vault.v` is a vault a newer\n     * filex made: refused by name, never read. */\n    if (m.req.includes(VAULT_FEATURE)) {\n      if (m.req.length !== 1) return null;\n      if (m.fmk !== 'wrapped' || typeof m.fmk_pw !== 'string') return null;\n      if (m.names !== undefined || m.rekey !== undefined || m.conv !== undefined) return null;\n      const vs = vaultSlotProblem(m.vault);\n      if (vs === 'malformed') return null;\n      if (vs === 'newer') unsupported.push(`${VAULT_FEATURE} v${(m.vault as E2eVaultSlot).v}`);\n    } else if (m.vault !== undefined) {\n      return null;\n    }\n    if (m.req.includes('names') && !validNamesSlot(m.names)) return null;\n    if (m.req.includes('rekey')) {\n      if (m.fmk !== 'wrapped' || !m.rekey || typeof m.rekey.from !== 'string') return null;\n    } else if (m.rekey !== undefined) {\n      return null;\n    }\n    if (m.req.includes('conv')) {\n      if (!m.conv || typeof m.conv !== 'object' || m.conv.pending !== true) return null;\n    } else if (m.conv !== undefined) {\n      return null;\n    }\n  } else if (m.req !== undefined || m.names !== undefined || m.rekey !== undefined || m.conv !== undefined || m.vault !== undefined) {\n    // A v1/v2 marker carrying v3 fields is not something any filex wrote.\n    return null;\n  }\n  return { marker: m, unsupported };\n}\n\n/**\n * wiring:e2 vault - what is wrong with a key file's `vault` block, if\n * anything: 'malformed' (refuse the key file), 'newer' (a `vault.v` above\n * this build's: a newer filex is needed), or null.\n */\nfunction vaultSlotProblem(v: unknown): 'malformed' | 'newer' | null {\n  if (!v || typeof v !== 'object' || Array.isArray(v)) return 'malformed';\n  const s = v as Partial<E2eVaultSlot>;\n  if (typeof s.v !== 'number' || !Number.isInteger(s.v) || s.v < 1) return 'malformed';\n  if (typeof s.id !== 'string' || b64urlDecode(s.id)?.length !== VAULT_ID_LEN) return 'malformed';\n  if (!validReaderPackLog2(s.pack)) return 'malformed';\n  if (s.v > VAULT_FORMAT) return 'newer';\n  return null;\n}\n\n/** wiring:e2 vault - true for a vault's key file (level 3). */\nexport function markerIsVault(m: E2eMarker | null | undefined): boolean {\n  return (\n    !!m &&\n    m.v === E2E_MARKER_VERSION_FEATURES &&\n    Array.isArray(m.req) &&\n    m.req.length === 1 &&\n    m.req[0] === VAULT_FEATURE &&\n    !!m.vault\n  );\n}\n\n/** wiring:e2 vault - the 16 raw bytes of a vault's id, or null. */\nexport function vaultIdOf(m: E2eMarker | null | undefined): Uint8Array | null {\n  if (!markerIsVault(m)) return null;\n  const id = b64urlDecode(m!.vault!.id);\n  return id && id.length === VAULT_ID_LEN ? id : null;\n}\n\nfunction validNamesSlot(n: E2eNamesSlot | undefined): boolean {\n  return (\n    !!n &&\n    typeof n === 'object' &&\n    n.alg === E2E_NAMES_ALG &&\n    n.enc === E2E_NAMES_ENC &&\n    typeof n.key === 'string' &&\n    typeof n.long === 'number' &&\n    Number.isInteger(n.long) &&\n    n.long >= 64 &&\n    n.long <= 255 &&\n    typeof n.root_id === 'string' &&\n    b64urlDecode(n.root_id)?.length === E2E_DIR_ID_BYTES\n  );\n}\n\n/**\n * Parse marker JSON text; returns null when the shape is not a marker this\n * build can OPEN — including a v3 marker that requires a feature it does not\n * know. Callers that want to explain a refusal use `parseMarkerDetailed`.\n */\nexport function parseMarker(text: string): E2eMarker | null {\n  const p = parseMarkerDetailed(text);\n  if (!p || p.unsupported.length > 0) return null;\n  return p.marker;\n}\n\n/** True when the folder's file and folder names are encrypted (feature `names`). */\nexport function markerHasNames(m: E2eMarker | null): boolean {\n  return (\n    !!m &&\n    m.v === E2E_MARKER_VERSION_FEATURES &&\n    Array.isArray(m.req) &&\n    m.req.includes('names') &&\n    !!m.names\n  );\n}\n\n/**\n * Unwrap the folder's name key with the FMK an unlock returned. Null when the\n * folder has no encrypted names, or the slot does not open under this FMK\n * (a marker from another folder, or a damaged one).\n */\nexport async function unlockNameKey(marker: E2eMarker, fmk: CryptoKey): Promise<E2eNameKey | null> {\n  if (!markerHasNames(marker)) return null;\n  const raw = await gcmOpen(fmk, marker.names!.key);\n  if (!raw || raw.length !== 64) return null;\n  const key = await importNameKey(raw, marker.names!.long, b64urlDecode(marker.names!.root_id)!);\n  raw.fill(0);\n  return key;\n}\n\n/**\n * Start encrypting the names of an EXISTING content-only folder (v2 → v3).\n *\n * Only the marker changes here, and it changes FIRST: the returned marker\n * carries a fresh name key and `names.pending`, and must be written before a\n * single entry is renamed. That order is what makes the switch resumable —\n * an interrupted pass leaves a folder whose marker already says \"names are\n * encrypted, some may not be yet\", every renamed entry decrypts, and every\n * entry not yet renamed is recognisably plaintext. Running the pass again\n * finishes it.\n *\n * Needs the FMK, not the password: the folder has to be unlocked, which is\n * the only state in which the offer is shown, and the ring's FMK came from\n * unlocking this very marker.\n *\n * ⚠ After this the folder is v3, which filex ≤ 0.47 refuses to open. That\n * is deliberate (an old client would write plaintext names into it) and the\n * UI says so before asking.\n */\nexport async function enableNames(\n  marker: E2eMarker,\n  fmk: CryptoKey,\n): Promise<{ marker: E2eMarker; names: E2eNameKey }> {\n  if (marker.v !== 2) throw new Error('e2e: only a v2 folder can switch to encrypted names');\n  const sealed = await sealNamesSlot(fmk, true);\n  const next: E2eMarker = {\n    ...marker,\n    v: E2E_MARKER_VERSION_FEATURES,\n    req: ['names'],\n    names: sealed.slot,\n  };\n  return { marker: next, names: sealed.key };\n}\n\n/** A switch to encrypted names finished: drop `pending`. */\nexport function finishNames(marker: E2eMarker): E2eMarker {\n  if (!markerHasNames(marker)) throw new Error('e2e: this folder has no encrypted names');\n  const names = { ...marker.names! };\n  delete names.pending;\n  return { ...marker, names };\n}\n\n/**\n * A folder's encryption LEVEL — a property of the folder, chosen when it is\n * encrypted and changed only by a deliberate act in its settings, never by an\n * offer that pops up (docs/E2E-ENCRYPTION.md → \"Encryption levels\").\n *\n *   'content'   level 1: contents encrypted, names readable (marker v1/v2).\n *               Can move up to 'names' (v2; a v1 folder first gets its\n *               recovery upgrade, which makes it v2).\n *   'names'     level 2: contents and names encrypted (v3, req 'names').\n *   'pending'   a move from 1 to 2 started and did not finish.\n *   'vault'     level 3: the vault (v3, req exactly ['vault'];\n *               docs/E2E-VAULT-FORMAT.md). Only ever a new, empty folder,\n *               offered where the server has vaults (FILEX_E2E_VAULT,\n *               `capabilities.e2e_vault`); never converted to or from.\n */\nexport type EncryptionLevel = 'content' | 'names' | 'pending' | 'vault';\n\n/** The levels a folder can be GIVEN, in order (level 1 first — the default).\n *  wiring:e2 vault - the vault (level 3) is offered only where the server\n *  has its API (`capabilities.e2e_vault`), and only to a NEW folder: an\n *  existing one is never converted (`choosableLevels`). */\nexport type ChoosableLevel = 'content' | 'names' | 'vault';\nexport const E2E_CHOOSABLE_LEVELS: readonly ChoosableLevel[] = ['content', 'names', 'vault'];\nexport const E2E_DEFAULT_LEVEL: ChoosableLevel = 'content';\n\n/** The levels to offer: the vault only for a new folder on a server that has it. */\nexport function choosableLevels(opts: { vault?: boolean } = {}): ChoosableLevel[] {\n  return E2E_CHOOSABLE_LEVELS.filter((l) => l !== 'vault' || opts.vault === true);\n}\n\nexport function encryptionLevel(m: E2eMarker | null): EncryptionLevel {\n  if (markerIsVault(m)) return 'vault';\n  if (m && markerHasNames(m)) return m.names!.pending ? 'pending' : 'names';\n  return 'content';\n}\n\n/** May this folder move from level 1 to level 2 now? (v2 only.) */\nexport function canRaiseToNames(m: E2eMarker | null): boolean {\n  return !!m && m.v === 2 && !markerHasNames(m);\n}\n\n/** True when the folder has a user recovery key slot. */\nexport function markerHasRecovery(m: E2eMarker | null): boolean {\n  return !!m && hasSlots(m) && !!m.rk;\n}\n\n/** True when the folder has an operator escrow slot. */\nexport function markerHasEscrow(m: E2eMarker | null): boolean {\n  return !!m && hasSlots(m) && !!m.esc;\n}\n\n/**\n * Why the escrow door is, or is not, on offer for this folder.\n *\n *   'off'        this installation has no escrow key at all.\n *   'available'  the folder is sealed to THIS installation's escrow key.\n *   'predates'   the installation has an escrow key, and this folder has no\n *                escrow slot: it was created before escrow existed here.\n *   'other-key'  the folder carries an escrow slot sealed to a DIFFERENT\n *                key id — it came from another installation, via a restore\n *                or a copied data directory.\n *\n * ⚠ 'predates' exists because escrow can be ADOPTED by an installation\n * that already has folders (FILEX_INSTALLATION_E2E_ESCROW_ADOPT), and\n * adoption is not retroactive: the folder's master key was wrapped to its\n * recovery paths when the folder was created. Before this distinction\n * existed the dialog simply showed no Escrow tab, which is true but says\n * nothing — an admin who knows escrow is on reads a missing tab as a bug,\n * tries the key anyway, and learns the real answer from a failure. The UI\n * has to say it instead.\n *\n * ⚠⚠ 'predates' means \"not as things stand\", NOT \"never\". The folder's\n * owner can add a slot from inside with the password (`addEscrowSlot`,\n * offered at unlock). Any wording built on this state has to leave that\n * door visible, or it tells an operator their escrow key can never reach a\n * folder whose owner could hand it over this afternoon.\n *\n * ⚠ 'other-key' was a quieter lie: the dialog labelled the escrow field\n * with the INSTALLATION's key id whatever the folder's slot said, so a\n * folder restored from another install looked openable by the key the\n * operator has, and was not.\n */\nexport type EscrowAvailability = 'off' | 'available' | 'predates' | 'other-key';\n\nexport function escrowAvailability(\n  m: E2eMarker | null,\n  installationKid: string | null | undefined,\n): EscrowAvailability {\n  if (!installationKid) return 'off';\n  if (!markerHasEscrow(m)) return 'predates';\n  return m!.esc!.kid === installationKid ? 'available' : 'other-key';\n}\n\n/**\n * Check `password` against a folder marker. Resolves to the derived KEK on\n * success, or `null` on a wrong password (GCM tag mismatch on the verify\n * blob). Never talks to any server.\n *\n * ⚠ This returns the KEK, not the FMK. On a v1 folder they are the same key;\n * on a v2 `fmk: 'wrapped'` folder they are not. Use `unlockWithPassword` to\n * get the key that actually decrypts files.\n */\nexport async function verifyPassword(\n  marker: E2eMarker,\n  password: string,\n): Promise<CryptoKey | null> {\n  const kek = await deriveKek(password, b64ToBytes(marker.salt), marker.iter);\n  const pt = await gcmOpen(kek, marker.verify);\n  if (!pt || new TextDecoder().decode(pt) !== VERIFY_PLAINTEXT) return null;\n  return kek;\n}\n\n// ---------------------------------------------------------------------\n// Unlock — the three ways to reach the FMK\n// ---------------------------------------------------------------------\n\n/** Turn a password KEK into the FMK for this marker. */\nasync function fmkFromKek(marker: E2eMarker, kek: CryptoKey): Promise<CryptoKey | null> {\n  // v1, and v2 folders upgraded from v1: the files are wrapped by the KEK.\n  if (marker.v === 1 || marker.fmk === 'kek') return kek;\n  if (!marker.fmk_pw) return null;\n  const raw = await gcmOpen(kek, marker.fmk_pw);\n  if (!raw || raw.length !== FMK_LEN) return null;\n  const fmk = await importFmkFor(marker, raw);\n  raw.fill(0);\n  return fmk;\n}\n\n/**\n * Unlock with the folder password. Returns the FMK (the key `decryptFile`\n * wants) or null when the password is wrong.\n */\nexport async function unlockWithPassword(\n  marker: E2eMarker,\n  password: string,\n): Promise<CryptoKey | null> {\n  const kek = await verifyPassword(marker, password);\n  if (!kek) return null;\n  return fmkFromKek(marker, kek);\n}\n\n/**\n * `unlockWithPassword`, telling a wrong password from a damaged key file: the\n * password proved right (the verify blob opened) and the folder key still did\n * not unwrap. \"Wrong password\" for that case sends a person hunting for a\n * password they already have.\n */\nexport async function unlockWithPasswordDetailed(\n  marker: E2eMarker,\n  password: string,\n): Promise<{ fmk: CryptoKey } | { error: 'wrong' | 'damaged' }> {\n  const kek = await verifyPassword(marker, password);\n  if (!kek) return { error: 'wrong' };\n  const fmk = await fmkFromKek(marker, kek);\n  return fmk ? { fmk } : { error: 'damaged' };\n}\n\n/**\n * Unlock with the user recovery key shown when the folder was created.\n * Returns null for a malformed key, a wrong key, or a folder that has no\n * recovery slot at all — the caller cannot tell those apart, and neither can\n * an attacker.\n */\nexport async function unlockWithRecoveryKey(\n  marker: E2eMarker,\n  recoveryKey: string,\n): Promise<CryptoKey | null> {\n  if (!hasSlots(marker) || !marker.rk) return null;\n  const raw = parseRecoveryKey(recoveryKey);\n  if (!raw) return null;\n  let salt: Uint8Array;\n  try {\n    salt = b64ToBytes(marker.rk.salt);\n  } catch {\n    return null;\n  }\n  const rkek = await deriveRecoveryKek(raw, salt);\n  raw.fill(0);\n  const fmkRaw = await gcmOpen(rkek, marker.rk.blob);\n  if (!fmkRaw || fmkRaw.length !== FMK_LEN) return null;\n  const fmk = await importFmkFor(marker, fmkRaw);\n  fmkRaw.fill(0);\n  return fmk;\n}\n\n/**\n * Unlock with the installation escrow private key.\n *\n * Returns null when the folder has no escrow slot — which is the case for\n * every folder created while escrow was off, and is why escrow cannot be\n * turned on retroactively.\n */\nexport async function unlockWithEscrowKey(\n  marker: E2eMarker,\n  privateKey: CryptoKey,\n): Promise<CryptoKey | null> {\n  if (!hasSlots(marker) || !marker.esc || marker.esc.alg !== E2E_ESCROW_ALG) return null;\n  let raw: Uint8Array;\n  try {\n    raw = new Uint8Array(\n      await crypto.subtle.decrypt(\n        { name: 'RSA-OAEP' },\n        privateKey,\n        buf(b64ToBytes(marker.esc.blob)),\n      ),\n    );\n  } catch {\n    return null; // wrong escrow key, or a slot sealed to another installation\n  }\n  if (raw.length !== FMK_LEN) return null;\n  const fmk = await importFmkFor(marker, raw);\n  raw.fill(0);\n  return fmk;\n}\n\n// ---------------------------------------------------------------------\n// Magic sniff\n// ---------------------------------------------------------------------\n\n/** True when the buffer starts with the 'filexe2e' magic. */\nexport function hasMagic(data: ArrayBuffer | Uint8Array): boolean {\n  const b = data instanceof Uint8Array ? data : new Uint8Array(data);\n  if (b.length < MAGIC_BYTES.length) return false;\n  for (let i = 0; i < MAGIC_BYTES.length; i++) {\n    if (b[i] !== MAGIC_BYTES[i]) return false;\n  }\n  return true;\n}\n\n// ---------------------------------------------------------------------\n// File encrypt / decrypt (one-shot MVP)\n// ---------------------------------------------------------------------\n\n/**\n * Encrypt `content` under the folder master key: mints a fresh DEK, encrypts\n * the content one-shot, wraps the DEK with the FMK and prepends the fixed\n * 'filexe2e' header. Throws when content exceeds E2E_MAX_FILE_BYTES.\n *\n * `fmk` is the key an unlock returned. On a v1 folder that is the password\n * KEK, which is why v1 files keep working untouched.\n */\nexport async function encryptFile(fmk: CryptoKey, content: ArrayBuffer): Promise<ArrayBuffer> {\n  if (content.byteLength > E2E_MAX_FILE_BYTES) {\n    throw new Error('e2e: file exceeds the 200MB single-shot limit');\n  }\n  const rawDek = crypto.getRandomValues(new Uint8Array(32));\n  const dek = await crypto.subtle.importKey('raw', buf(rawDek), { name: 'AES-GCM' }, false, [\n    'encrypt',\n  ]);\n  const wrapIV = crypto.getRandomValues(new Uint8Array(IV_LEN));\n  const dataIV = crypto.getRandomValues(new Uint8Array(IV_LEN));\n  const wrappedDek = new Uint8Array(\n    await crypto.subtle.encrypt({ name: 'AES-GCM', iv: buf(wrapIV) }, fmk, buf(rawDek)),\n  );\n  const ct = new Uint8Array(\n    await crypto.subtle.encrypt({ name: 'AES-GCM', iv: buf(dataIV) }, dek, content),\n  );\n  // Zero the raw DEK copy as a hygiene measure (best-effort — GC may have\n  // other copies, but don't leave the obvious one around).\n  rawDek.fill(0);\n\n  const out = new Uint8Array(HEADER_LEN + ct.length);\n  out.set(MAGIC_BYTES, 0);\n  out[8] = E2E_VERSION;\n  out.set(wrapIV, WRAP_IV_OFF);\n  out.set(wrappedDek, WRAPPED_DEK_OFF); // 48 bytes\n  out.set(dataIV, DATA_IV_OFF);\n  // [81..97) reserved zeros\n  out.set(ct, HEADER_LEN);\n  return out.buffer;\n}\n\n/**\n * Decrypt a 'filexe2e' blob with the folder master key. Throws\n * E2eDecryptError on a wrong key / tampered data, and a plain Error when the\n * header is not an e2e file at all.\n */\nexport async function decryptFile(fmk: CryptoKey, data: ArrayBuffer): Promise<ArrayBuffer> {\n  const b = new Uint8Array(data);\n  if (!hasMagic(b) || b.length < HEADER_LEN) {\n    throw new Error('e2e: not an encrypted file');\n  }\n  /* wiring:e2 stream — a 0x02 file, whole in memory. */\n  if (b[8] === E2E_FILE_VERSION_STREAM) return decryptStreamFolderFileBytes(fmk, b);\n  if (b[8] !== E2E_VERSION) {\n    throw new Error(`e2e: unsupported version ${b[8]}`);\n  }\n  const wrapIV = b.slice(WRAP_IV_OFF, WRAP_IV_OFF + IV_LEN);\n  const wrappedDek = b.slice(WRAPPED_DEK_OFF, WRAPPED_DEK_OFF + WRAPPED_DEK_LEN);\n  const dataIV = b.slice(DATA_IV_OFF, DATA_IV_OFF + IV_LEN);\n  let rawDek: ArrayBuffer;\n  try {\n    rawDek = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: buf(wrapIV) }, fmk, buf(wrappedDek));\n  } catch {\n    throw new E2eDecryptError('e2e: DEK unwrap failed (wrong key?)');\n  }\n  const dek = await crypto.subtle.importKey('raw', rawDek, { name: 'AES-GCM' }, false, ['decrypt']);\n  try {\n    return await crypto.subtle.decrypt(\n      { name: 'AES-GCM', iv: buf(dataIV) },\n      dek,\n      buf(b.slice(HEADER_LEN)),\n    );\n  } catch {\n    throw new E2eDecryptError('e2e: content decrypt failed');\n  }\n}\n\n// ---------------------------------------------------------------------\n// Changing the password, and re-keying\n// ---------------------------------------------------------------------\n//\n// A folder whose FMK is random (`fmk: 'wrapped'`, every folder since 0.31)\n// changes its password by re-wrapping that one key: a new salt, a new verify\n// blob and a new `fmk_pw`, and nothing else — no file, and no other slot,\n// because the recovery key, the escrow key and the name key all reach the\n// same FMK.\n//\n// A folder whose FMK IS the password-derived key (v1, and v2 `fmk: 'kek'`)\n// cannot: a new password is a new FMK, and every file's DEK is wrapped under\n// the old one. That is a RE-KEY: a fresh random FMK, every DEK re-wrapped\n// under it (the 48 bytes at [21..69) of each header, plus its IV — the\n// content ciphertext is never touched), and the marker moved to\n// `fmk: 'wrapped'`. It is resumable: the marker is written FIRST, with the\n// previous FMK sealed under the new one (`rekey.from`, feature `rekey`), so a\n// later session reaches every file whichever key its DEK is under, and\n// running the re-wrap again finishes it. The same machinery re-keys a wrapped\n// folder on purpose, when the old password may be known to someone.\n\n/** How the person proves they may change the password. */\nexport type E2eCredential = { password: string } | { recoveryKey: string };\n\n/**\n * The raw FMK, from the password or the recovery key. Throws E2eDecryptError\n * for a wrong one. The caller zeroes the result.\n *\n * ⚠ The second place raw FMK bytes exist (after unlockWithRecoveryKey's\n * import): re-wrapping a key needs its bytes, and a non-extractable CryptoKey\n * has none to give.\n */\nasync function fmkRawFrom(marker: E2eMarker, cred: E2eCredential): Promise<Uint8Array> {\n  if ('recoveryKey' in cred) {\n    if (!hasSlots(marker) || !marker.rk) throw new E2eDecryptError('e2e: this folder has no recovery key');\n    const raw = parseRecoveryKey(cred.recoveryKey);\n    if (!raw) throw new E2eDecryptError('e2e: wrong recovery key');\n    let salt: Uint8Array;\n    try {\n      salt = b64ToBytes(marker.rk.salt);\n    } catch {\n      throw new E2eDecryptError('e2e: damaged recovery slot');\n    }\n    const rkek = await deriveRecoveryKek(raw, salt);\n    raw.fill(0);\n    const fmk = await gcmOpen(rkek, marker.rk.blob);\n    if (!fmk || fmk.length !== FMK_LEN) throw new E2eDecryptError('e2e: wrong recovery key');\n    return fmk;\n  }\n  const salt = b64ToBytes(marker.salt);\n  const kek = await deriveKek(cred.password, salt, marker.iter);\n  const proof = await gcmOpen(kek, marker.verify);\n  if (!proof || new TextDecoder().decode(proof) !== VERIFY_PLAINTEXT) {\n    throw new E2eDecryptError('e2e: wrong password');\n  }\n  if (marker.v === 1 || marker.fmk === 'kek') return deriveKekBits(cred.password, salt, marker.iter);\n  const fmk = marker.fmk_pw ? await gcmOpen(kek, marker.fmk_pw) : null;\n  if (!fmk || fmk.length !== FMK_LEN) throw new E2eDecryptError('e2e: could not unwrap the folder master key');\n  return fmk;\n}\n\n/** A fresh password slot (salt, iterations, verify blob, `fmk_pw`) for `rawFmk`. */\nasync function passwordSlot(\n  newPassword: string,\n  rawFmk: Uint8Array,\n  iterations?: number,\n): Promise<Pick<E2eMarker, 'salt' | 'iter' | 'verify' | 'fmk' | 'fmk_pw'>> {\n  if ((newPassword ?? '').length < E2E_MIN_PASSWORD_LEN) {\n    throw new Error(`e2e: the new password must be at least ${E2E_MIN_PASSWORD_LEN} characters`);\n  }\n  const iter = Math.max(E2E_MIN_ITERATIONS, iterations ?? E2E_DEFAULT_ITERATIONS);\n  const salt = crypto.getRandomValues(new Uint8Array(16));\n  const kek = await deriveKek(newPassword, salt, iter);\n  return {\n    salt: bytesToB64(salt),\n    iter,\n    verify: await gcmSeal(kek, new TextEncoder().encode(VERIFY_PLAINTEXT)),\n    fmk: 'wrapped',\n    fmk_pw: await gcmSeal(kek, rawFmk),\n  };\n}\n\n/**\n * True when a new password needs a re-key: the folder key IS the old\n * password's key (v1, or v2 `fmk: 'kek'`).\n */\nexport function passwordChangeNeedsRekey(m: E2eMarker): boolean {\n  return m.v === 1 || m.fmk === 'kek';\n}\n\n/** A re-key has started and not finished. */\nexport function rekeyPending(m: E2eMarker | null): boolean {\n  return !!m && Array.isArray(m.req) && m.req.includes('rekey') && !!m.rekey;\n}\n\n/**\n * Change the password of a folder whose FMK is wrapped. Only the password slot\n * changes: every file, the recovery key, the escrow slot and the name key are\n * untouched and keep working. Proof is the current password OR the recovery\n * key (a reset).\n *\n * ⚠ The previous password stops opening THIS marker. It still opens any copy\n * of the old marker — a version of `.filex-e2e.json`, a backup — and through\n * it the same FMK. When that matters, re-key instead (`startRekey`).\n */\nexport async function changePassword(\n  marker: E2eMarker,\n  cred: E2eCredential,\n  newPassword: string,\n  opts: { iterations?: number } = {},\n): Promise<E2eMarker> {\n  if (passwordChangeNeedsRekey(marker)) {\n    throw new Error('e2e: this folder needs its file keys re-wrapped to change its password (startRekey)');\n  }\n  if (rekeyPending(marker)) throw new Error('e2e: finish the re-key first');\n  const raw = await fmkRawFrom(marker, cred);\n  try {\n    return { ...marker, ...(await passwordSlot(newPassword, raw, opts.iterations)) };\n  } finally {\n    raw.fill(0);\n  }\n}\n\nexport interface RekeyStart {\n  /** Write this FIRST, before any file is re-wrapped. */\n  marker: E2eMarker;\n  /** The new folder master key. */\n  fmk: CryptoKey;\n  /** The previous one — what the files not re-wrapped yet are under. */\n  previous: CryptoKey;\n  /** The recovery key that opens the new FMK. Show it when `recoveryKeyIsNew`. */\n  recoveryKey: string;\n  recoveryKeyIsNew: boolean;\n  /** The folder's name key, re-sealed under the new FMK, when it has one. */\n  names?: E2eNameKey;\n}\n\n/** Thrown when a re-key would lose the folder's escrow slot. */\nexport class E2eRekeyEscrowError extends Error {\n  constructor(msg = 'e2e: the escrow slot cannot be carried over to the new folder key') {\n    super(msg);\n    this.name = 'E2eRekeyEscrowError';\n  }\n}\n\n/**\n * Start a re-key: a fresh random FMK, the new password, and every other slot\n * carried over to it.\n *\n *   - recovery: a reset made WITH the recovery key keeps that key (it is in\n *     hand, so it is re-sealed to the new FMK). Otherwise a new recovery key is\n *     minted — the old slot wraps the old FMK and nothing can re-seal it\n *     without the key itself — and the caller shows it once.\n *   - escrow: re-sealed to the new FMK when the installation's key is the one\n *     the slot names. Otherwise REFUSED (E2eRekeyEscrowError): a re-key never\n *     quietly drops an escrow slot. It never adds one either.\n *   - names: the same name key (no entry is renamed), re-sealed under the new\n *     FMK.\n *   - `rekey.from`: the previous FMK sealed under the new one, until\n *     `finishRekey`.\n */\nexport async function startRekey(\n  marker: E2eMarker,\n  cred: E2eCredential,\n  newPassword: string,\n  opts: { escrowPublicKey?: string | null; iterations?: number } = {},\n): Promise<RekeyStart> {\n  if (rekeyPending(marker)) throw new Error('e2e: a re-key is already in progress; resume it');\n  /* wiring:e2 vault - the FMK derives every key of a vault: a new FMK is a\n   * new vault, so a re-key is not offered (docs/E2E-VAULT-FORMAT.md). */\n  if (markerIsVault(marker)) throw new Error('e2e: a vault is not re-keyed; make a new vault instead');\n  const oldRaw = await fmkRawFrom(marker, cred);\n  const newRaw = crypto.getRandomValues(new Uint8Array(FMK_LEN));\n  try {\n    const oldFmk = await importFmk(oldRaw);\n    const newFmk = await importFmk(newRaw);\n\n    let esc: E2eEscrowSlot | undefined;\n    if (hasSlots(marker) && marker.esc) {\n      const pub = opts.escrowPublicKey || null;\n      if (!pub || (await escrowKeyId(pub)) !== marker.esc.kid) throw new E2eRekeyEscrowError();\n      esc = await sealEscrowSlot(newRaw, pub);\n    }\n\n    const reuse = 'recoveryKey' in cred;\n    const recoveryKey = reuse ? cred.recoveryKey : generateRecoveryKey();\n\n    let names: E2eNameKey | undefined;\n    let namesSlot: E2eNamesSlot | undefined;\n    if (markerHasNames(marker)) {\n      const nkRaw = await gcmOpen(oldFmk, marker.names!.key);\n      if (!nkRaw || nkRaw.length !== 64) throw new E2eDecryptError('e2e: could not open the name key');\n      namesSlot = { ...marker.names!, key: await gcmSeal(newFmk, nkRaw) };\n      names = await importNameKey(nkRaw, marker.names!.long, b64urlDecode(marker.names!.root_id)!);\n      nkRaw.fill(0);\n    }\n\n    const req = Array.from(new Set([...(marker.req ?? []), 'rekey']));\n    const next: E2eMarker = {\n      ...marker,\n      v: E2E_MARKER_VERSION_FEATURES,\n      req,\n      ...(await passwordSlot(newPassword, newRaw, opts.iterations)),\n      rk: await sealRecoverySlot(newRaw, recoveryKey),\n      rekey: { from: await gcmSeal(newFmk, oldRaw), pending: true },\n    };\n    if (esc) next.esc = esc;\n    if (namesSlot) next.names = namesSlot;\n    return {\n      marker: next,\n      fmk: newFmk,\n      previous: oldFmk,\n      recoveryKey,\n      recoveryKeyIsNew: !reuse,\n      ...(names ? { names } : {}),\n    };\n  } finally {\n    oldRaw.fill(0);\n    newRaw.fill(0);\n  }\n}\n\n/**\n * The previous FMK of a folder mid re-key, reached through the new one.\n * Null when no re-key is in progress (or the slot does not open under `fmk`).\n */\nexport async function unlockPrevious(marker: E2eMarker, fmk: CryptoKey): Promise<CryptoKey | null> {\n  if (!rekeyPending(marker)) return null;\n  const raw = await gcmOpen(fmk, marker.rekey!.from);\n  if (!raw || raw.length !== FMK_LEN) return null;\n  const key = await importFmk(raw);\n  raw.fill(0);\n  return key;\n}\n\n/**\n * Re-wrap one encrypted file's DEK from `previous` to `fmk`. Returns the new\n * bytes — the same length, the same content ciphertext, a new wrap IV and\n * wrapped DEK — or null when the file is already under `fmk` (so resuming is\n * running this again). Throws E2eDecryptError when neither key opens it, and\n * a plain Error when it is not an encrypted file.\n */\nexport async function rewrapFileKey(\n  data: ArrayBuffer,\n  previous: CryptoKey,\n  fmk: CryptoKey,\n): Promise<ArrayBuffer | null> {\n  const b = new Uint8Array(data);\n  if (!hasMagic(b) || b.length < HEADER_LEN) throw new Error('e2e: not an encrypted file');\n  /* wiring:e2 stream — 0x02 wraps its DEK at the same offsets; `data` may be\n   * just the 97-byte header of a large file (the body is re-sent unread). */\n  if (b[8] !== E2E_VERSION && b[8] !== E2E_FILE_VERSION_STREAM) throw new Error(`e2e: unsupported version ${b[8]}`);\n  const wrapIV = b.slice(WRAP_IV_OFF, WRAP_IV_OFF + IV_LEN);\n  const wrapped = b.slice(WRAPPED_DEK_OFF, WRAPPED_DEK_OFF + WRAPPED_DEK_LEN);\n  try {\n    await crypto.subtle.decrypt({ name: 'AES-GCM', iv: buf(wrapIV) }, fmk, buf(wrapped));\n    return null; // already re-wrapped\n  } catch {\n    /* not under the new key: try the previous one */\n  }\n  let rawDek: Uint8Array;\n  try {\n    rawDek = new Uint8Array(\n      await crypto.subtle.decrypt({ name: 'AES-GCM', iv: buf(wrapIV) }, previous, buf(wrapped)),\n    );\n  } catch {\n    throw new E2eDecryptError('e2e: this file opens under neither the new nor the previous folder key');\n  }\n  const iv = crypto.getRandomValues(new Uint8Array(IV_LEN));\n  const rewrapped = new Uint8Array(\n    await crypto.subtle.encrypt({ name: 'AES-GCM', iv: buf(iv) }, fmk, buf(rawDek)),\n  );\n  rawDek.fill(0);\n  const out = b.slice();\n  out.set(iv, WRAP_IV_OFF);\n  out.set(rewrapped, WRAPPED_DEK_OFF);\n  return out.buffer;\n}\n\n/**\n * The re-key is done: every file is under the new FMK. Drop `rekey` (and the\n * previous FMK with it); a marker left with no required feature goes back to\n * v2, which every filex since 0.31 opens.\n */\n/** Is an in-place conversion of this folder under way? */\nexport function conversionPending(m: E2eMarker | null): boolean {\n  return !!m && Array.isArray(m.req) && m.req.includes('conv') && m.conv?.pending === true;\n}\n\n/**\n * The key file of a folder about to be encrypted in place: v3, `conv`\n * required (an older filex refuses a folder whose files are half plaintext),\n * the conversion marked pending.\n */\nexport function startConversion(\n  marker: E2eMarker,\n  when: string = new Date().toISOString(),\n  cleanup?: { versions: boolean; trash: boolean },\n): E2eMarker {\n  if (markerIsVault(marker)) throw new Error('e2e: a vault is never converted');\n  const req = Array.from(new Set([...(marker.req ?? []), 'conv']));\n  const conv: E2eConvSlot = { pending: true, started: when, ...(cleanup ? { cleanup } : {}) };\n  return { ...marker, v: E2E_MARKER_VERSION_FEATURES, req, conv };\n}\n\n/** Every file carries the magic: the conversion is over. Back to v2 when\n *  nothing else is required. */\nexport function finishConversion(marker: E2eMarker): E2eMarker {\n  const next: E2eMarker = { ...marker };\n  delete next.conv;\n  const req = (marker.req ?? []).filter((f) => f !== 'conv');\n  if (req.length > 0) {\n    next.req = req;\n  } else {\n    delete next.req;\n    next.v = E2E_MARKER_VERSION;\n  }\n  return next;\n}\n\nexport function finishRekey(marker: E2eMarker): E2eMarker {\n  const next: E2eMarker = { ...marker };\n  delete next.rekey;\n  const req = (marker.req ?? []).filter((f) => f !== 'rekey');\n  if (req.length > 0) {\n    next.req = req;\n  } else {\n    delete next.req;\n    next.v = E2E_MARKER_VERSION;\n  }\n  return next;\n}\n\n/**\n * Decrypt with the FMK, falling back to the previous FMK of a folder mid\n * re-key. Throws exactly what decryptFile throws when neither opens it.\n */\nexport async function decryptFileAny(\n  fmk: CryptoKey,\n  previous: CryptoKey | null | undefined,\n  data: ArrayBuffer,\n): Promise<ArrayBuffer> {\n  try {\n    return await decryptFile(fmk, data);\n  } catch (err) {\n    if (!previous || !(err instanceof E2eDecryptError)) throw err;\n    return decryptFile(previous, data);\n  }\n}\n\n// ---------------------------------------------------------------------\n// In-memory session key ring\n// ---------------------------------------------------------------------\n\n/**\n * Tiny per-explorer key ring: encrypted-folder root (wire path) → FMK, and\n * the folder's name key when its names are encrypted.\n * Lives ONLY in memory — \"Lock\" drops the entry, a reload drops all.\n */\nexport function createKeyRing() {\n  const keys = new Map<string, CryptoKey>();\n  const nameKeys = new Map<string, E2eNameKey>();\n  const previousKeys = new Map<string, CryptoKey>();\n  return {\n    get(root: string): CryptoKey | undefined {\n      return keys.get(root);\n    },\n    set(root: string, fmk: CryptoKey, names?: E2eNameKey | null, previous?: CryptoKey | null): void {\n      keys.set(root, fmk);\n      if (names) nameKeys.set(root, names);\n      else nameKeys.delete(root);\n      if (previous) previousKeys.set(root, previous);\n      else previousKeys.delete(root);\n    },\n    /** The previous FMK of a folder mid re-key (files not re-wrapped yet). */\n    previous(root: string): CryptoKey | undefined {\n      return previousKeys.get(root);\n    },\n    /** A re-key finished: the previous FMK is no longer needed. */\n    dropPrevious(root: string): void {\n      previousKeys.delete(root);\n    },\n    /** The folder's name key; undefined for a content-only folder or a locked one. */\n    names(root: string): E2eNameKey | undefined {\n      return nameKeys.get(root);\n    },\n    setNames(root: string, names: E2eNameKey): void {\n      if (keys.has(root)) nameKeys.set(root, names);\n    },\n    /** Every unlocked root, for resolving a path from any view. */\n    roots(): string[] {\n      return [...keys.keys()];\n    },\n    /** Drop one folder's keys (\"Lock\"). */\n    lock(root: string): void {\n      keys.delete(root);\n      nameKeys.delete(root);\n      previousKeys.delete(root);\n    },\n    has(root: string): boolean {\n      return keys.has(root);\n    },\n    clear(): void {\n      keys.clear();\n      nameKeys.clear();\n      previousKeys.clear();\n    },\n  };\n}\n\nexport type E2eKeyRing = ReturnType<typeof createKeyRing>;\n","/**\n * listing.ts — shared listing helpers used by BOTH the main panel\n * (FileExplorer.load) and the split-view secondary panel\n * (SecondaryPane.loadPane). SINGLE SOURCE so the two panes can never\n * drift apart: the internal-entry filter and the virtual `.trash` row\n * must be identical in both, otherwise split view shows mismatched rows\n * (the trash row missing on one side → visible row-offset).\n */\nimport type { TagKind } from './tags';\nimport { ref } from 'vue';\n\nimport type { FileNode } from '../types/FileNode';\nimport { E2E_MARKER_NAME } from './e2ecrypto';\nimport { isInternalName, isInternalPath } from './internalPaths';\n\n/** Adapter-strip: `s3-test://fileman/x` → `fileman/x`. */\nexport function stripAdapter(p: string): string {\n  const idx = p.indexOf('://');\n  return idx === -1 ? p : p.slice(idx + 3);\n}\n\n/**\n * The folder a row sits in, without its storage: `My files://Photos/a.jpg` →\n * `Photos`, and `''` for a row at a storage's root.\n *\n * ⚠⚠ Split on the FIRST `://` (`stripAdapter`), never with a URL-scheme\n * pattern. The list, the grid and the gallery each carried their own copy that\n * stripped `[a-z][a-z0-9+.-]*` followed by `://` — the RFC 3986 shape of a SCHEME, which a\n * storage name is not. A name with a space in it (`My files`, the one the\n * screenshot fixtures use, and a perfectly ordinary thing to call a drive)\n * does not match it, so nothing was stripped, the \"folder\" became\n * `My files://Photos`, and the Location column printed\n * `My files/My files://Photos` — the storage twice and the scheme on show.\n * Measured on Starred, 2026-09-14. An underscore or a leading digit broke it\n * the same way.\n */\nexport function parentDirOf(path: string): string {\n  const rel = stripAdapter(String(path ?? ''));\n  const idx = rel.lastIndexOf('/');\n  return idx === -1 ? '' : rel.slice(0, idx);\n}\n\n/**\n * The folder a row sits in, AS SHOWN: the plaintext path for a row inside an\n * encrypted-names folder (set by the explorer's name view,\n * composables/useE2eNames), `parentDirOf(path)` for everything else. Every\n * view's Location line reads this, so none of them prints ciphertext.\n */\nexport function displayParentDirOf(n: FileNode): string {\n  return typeof n.e2e_display_dir === 'string' ? n.e2e_display_dir : parentDirOf(n.path);\n}\n\n/**\n * Hide system/internal entries the user must never see as files: filex's own\n * directories and the keep marker (lib/internalPaths — the one client list,\n * held equal to the server's by a test), the virtual `.trash` row, and the E2E\n * marker. Shared by both panes' listing filters.\n *\n * ⚠ Absolute, not a \"hidden files\" preference: a user who has switched hidden\n * files on is asking to see their OWN dotfiles, not ours. The server already\n * leaves these out of every listing; this is the seatbelt for an embed talking\n * to an older server — which is also why it judges the whole PATH, so a search\n * hit such a server returns from inside `.filex-open` is dropped too.\n */\nexport function filterInternalEntries(files: FileNode[]): FileNode[] {\n  return (files || []).filter((f) => {\n    if (isInternalName(f.basename) || isInternalPath(f.path)) return false;\n    if (f.basename === '.trash') return false;\n    if (f.basename === E2E_MARKER_NAME) return false;\n    return true;\n  });\n}\n\nconst SHOW_HIDDEN_LS_KEY = 'filex.showHidden';\n\nfunction readShowHidden(): boolean {\n  try {\n    return localStorage.getItem(SHOW_HIDDEN_LS_KEY) === '1';\n  } catch {\n    return false; // private mode / no storage → hidden, the safe default\n  }\n}\n\n/**\n * Whether dot-prefixed entries are listed. Off by default, like every other\n * file manager. Shared by both panes so split view can't disagree with itself.\n */\nexport const showHiddenFiles = ref(readShowHidden());\n\nexport function setShowHiddenFiles(v: boolean): void {\n  showHiddenFiles.value = v;\n  try {\n    localStorage.setItem(SHOW_HIDDEN_LS_KEY, v ? '1' : '0');\n  } catch {\n    /* preference just won't persist */\n  }\n}\n\n/**\n * Hide dot-prefixed entries unless the user asked to see them.\n *\n * These are mostly not the user's files at all: a Mac writing over WebDAV\n * leaves a `.DS_Store` in every folder it opens and an AppleDouble `._name`\n * beside every file carrying extended attributes. Finder hides its own litter\n * locally, so seeing it reappear in the web UI reads as corruption.\n *\n * A toggle rather than a blocklist, because they ARE real files: hiding them\n * outright would leave the ones already uploaded unreachable and undeletable.\n */\nexport function filterHiddenEntries(files: FileNode[], showHidden: boolean): FileNode[] {\n  if (showHidden) return files || [];\n  return (files || []).filter((f) => !(f.basename || '').startsWith('.'));\n}\n\n/** filterInternalEntries + filterHiddenEntries — what both panes render. */\nexport function filterListing(files: FileNode[]): FileNode[] {\n  return filterHiddenEntries(filterInternalEntries(files), showHiddenFiles.value);\n}\n\n/** True when `dirname` (adapter-qualified) is the storage root, where the\n *  virtual trash row belongs. */\nexport function isStorageRootDir(dirname: string): boolean {\n  const rel = stripAdapter(dirname);\n  return rel === 'fileman' || rel === '';\n}\n\n/** True when the listing IS the trash view (don't inject the row into itself). */\nexport function isTrashListing(dirname: string): boolean {\n  return stripAdapter(dirname).startsWith('fileman/.trash');\n}\n\n/** The synthetic `.trash` row shown at storage root — rendered as\n *  \"Çöp Kutusu\" / \"Trash\" via the `.trash` basename → locale mapping. */\nexport function makeTrashRow(adapter: string): FileNode {\n  return {\n    type: 'dir',\n    path: `${adapter}://fileman/.trash`,\n    basename: '.trash',\n    extension: '',\n    storage: adapter,\n    visibility: 'private',\n    size: 0,\n    file_size: 0,\n    mime_type: 'inode/directory',\n    extra_metadata: {},\n  } as unknown as FileNode;\n}\n\n/**\n * Inject the virtual `.trash` row at the front of a root listing when\n * enabled. Returns true if a row was added (so the caller can hydrate\n * it). Mutates `files` in place. Single source for both panes.\n *\n * ⚠ `isSearchResult` is not optional politeness — it is the one thing\n * `dirname` cannot tell you. A search answers with the SCOPE it searched, so\n * `?action=search&path=main://&filter=brief` comes back with\n * `dirname: \"main://\"`, identical to the folder listing of the same path\n * (measured). Without this flag the sentinel is unshifted into the search\n * results, and a search for \"brief\" answers with `brief.md` and a folder\n * called Trash that is not a folder, is not a hit, and cannot be searched for.\n * Same family as the `.trash` / `.shared` sentinel bugs fixed in v0.31.0: a\n * virtual row rendered somewhere it has no meaning.\n *\n * Both flags default to `false`, i.e. to the historical behaviour: a caller\n * that never searches and has no panel — which is what an embed with\n * `sideNav: false` is — keeps the row it has always had by saying nothing.\n */\nexport interface TrashRowContext {\n  /**\n   * This listing is the answer to a SEARCH, not the contents of a folder.\n   *\n   * ⚠ The one thing `dirname` cannot tell you: a search answers with the scope\n   * it searched, so `?action=search&path=main://&filter=notes` comes back\n   * carrying `dirname: \"main://\"`, byte-identical to that folder's listing\n   * (measured). Without this the sentinel lands among the hits.\n   */\n  isSearchResult?: boolean;\n  /**\n   * The navigation panel is already offering Trash as a destination.\n   *\n   * ⚠ This row only ever existed because a listing had no other way into the\n   * bin. Once the panel carries a Trash entry that reason is gone and the row\n   * is a second door to the same place — drawn as a 0-byte folder that is not\n   * a folder, sitting among real ones, while the panel's own Trash entry is\n   * three inches to its left. Owner's decision, this release: do not offer the\n   * same door twice.\n   *\n   * ⚠ It is a question about the PANEL, not about the profile. The duplication\n   * is exactly as wrong in `standard` with the panel on as it is in `drive`;\n   * keying it to `uiProfile` would be a rule about the wrong thing.\n   */\n  navOffersTrash?: boolean;\n}\n\nexport function injectTrashRow(\n  files: FileNode[],\n  adapter: string,\n  dirname: string,\n  trashVisible: boolean,\n  ctx: TrashRowContext = {},\n): boolean {\n  // The host's own switch, and still the outer gate: `trashVisible: false`\n  // means no Trash anywhere — no row here, and no entry in the panel either,\n  // so this must be answered before anything about the panel is considered.\n  if (!trashVisible) return false;\n  if (ctx.navOffersTrash) return false;\n  if (ctx.isSearchResult) return false;\n  if (isTrashListing(dirname)) return false;\n  if (!isStorageRootDir(dirname)) return false;\n  files.unshift(makeTrashRow(adapter));\n  return true;\n}\n\n/** Best-effort fill of the trash row's size (total bytes) + date (newest\n *  deletion), so it reads like a real folder instead of \"— / —\".\n *  Non-blocking; mutates the row in place.\n *\n *  ⚠ The numbers are the SERVER's, for this storage (finding D2, 0.54): the\n *  row used to sum the entries of one listing page, asked with a `storage=`\n *  the server did not read - the newest 50 deletions of EVERY storage, shown\n *  as this one's size and date. The listing now answers `storages`, one\n *  summary per storage over every entry the caller may see; one row of it\n *  (`limit=1`) is all this needs. */\nexport async function hydrateTrashRow(\n  files: FileNode[],\n  storage: string,\n  api: {\n    listTrash: (\n      s?: string,\n      page?: { limit?: number; offset?: number },\n    ) => Promise<{ storages?: Array<{ storage_name?: string; bytes: number; newest_deleted_at: string | null }> }>;\n  },\n): Promise<void> {\n  try {\n    const { storages } = await api.listTrash(storage, { limit: 1 });\n    const row = files.find((f) => f.basename === '.trash');\n    if (!row) return;\n    const mine = (storages ?? []).find((s) => s.storage_name === storage);\n    row.size = mine?.bytes ?? 0;\n    const newest = mine?.newest_deleted_at ? Date.parse(mine.newest_deleted_at) : NaN;\n    if (!Number.isNaN(newest)) row.last_modified = newest;\n  } catch {\n    /* keep the bare row */\n  }\n}\n\n/**\n * Sentinel path segment → locale key, for the virtual views the explorer parks\n * in `dirname` (trash, recent, starred, shared). None has a real folder behind\n * it, so anything that renders a path segment has to translate them or it\n * prints the sentinel.\n *\n * ⚠ ONE map, deliberately. `.trash` predates the other three and its\n * translation was written twice — once in the breadcrumb, once in the tab\n * label. When recent/starred/shared arrived, only the breadcrumb copy was\n * extended, so the tab strip read \".shared\" in front of users (reported\n * 2026-09-04). A second copy of a mapping is a second chance to forget it.\n */\nexport const VIRTUAL_SEGMENTS: Record<string, string> = {\n  /* gorunum:v3-shell — Home is a destination like the rest, so it gets a\n     sentinel like the rest: a restored tab, a reload and a pasted `#.home`\n     all have to reopen the overview instead of asking the backend for a\n     folder called `.home` and landing on \"not found\". */\n  '.home': 'node.home',\n  '.trash': 'node.trash',\n  '.recent': 'node.recent',\n  '.starred': 'node.starred',\n  '.shared': 'node.shared',\n  /* Drafts (issue #71): a view like the rest — a reload on `#.drafts` opens\n     it, instead of asking the backend for a folder called `.drafts`. */\n  '.drafts': 'node.drafts',\n};\n\n/**\n * The tag view's sentinel: `.tag~<name>`, ONE segment, e.g. `.tag~invoices`.\n *\n * Every other virtual view has a fixed label, so a segment→locale-key map is\n * enough for them. A tag's label is the tag itself, so it cannot live in that\n * map — but it must not become a SECOND place that knows about sentinels\n * either, which is exactly how the tab strip came to print `.shared`. Hence\n * `virtualSegmentLabel()` below: the map keeps the static views, this prefix\n * keeps the dynamic one, and every surface that renders a path segment calls\n * the one function that knows both.\n *\n * ⚠ `~` rather than `:` or `/`. `writePersistedPath` runs each segment through\n * `encodeURIComponent`, which leaves `~ - _ . ! * ' ( )` alone and escapes `:`\n * — so `#.tag~invoices` stays readable in the address bar while `.tag:` would\n * show as `#.tag%3Ainvoices`. And one segment rather than two (`.tag/name`)\n * because a two-segment path gives the breadcrumb a clickable `.tag` parent\n * crumb that leads nowhere.\n */\nexport const TAG_SEGMENT_PREFIX = '.tag~';\n\n/**\n * etiket:k2 (v0.43.0) — the KIND of a tag view. A person can have a personal\n * \"rapor\" and their team a \"rapor\"; the navigation panel lists them apart, so\n * each opens its own view: `.mytag~rapor` (personal), `.teamtag~rapor` (team).\n * The plain `.tag~rapor` stays and means BOTH — every link and restored tab\n * from before kinds existed keeps opening what it opened then.\n *\n * ⚠ Listed longest-first is not needed (no prefix is a prefix of another),\n * but every reader goes through `tagViewOfSegment`, never a `startsWith` of\n * its own, so a fourth kind would be one line here.\n */\nconst TAG_KIND_PREFIXES: ReadonlyArray<readonly [string, TagKind | '']> = [\n  ['.mytag~', 'personal'],\n  ['.teamtag~', 'team'],\n  [TAG_SEGMENT_PREFIX, ''],\n];\n\n/** `invoices` → `.tag~invoices`; with a kind, `.mytag~` / `.teamtag~`. */\nexport function makeTagSegment(tag: string, kind: TagKind | '' = ''): string {\n  const prefix = TAG_KIND_PREFIXES.find(([, k]) => k === kind)?.[0] ?? TAG_SEGMENT_PREFIX;\n  return `${prefix}${tag}`;\n}\n\n/** A tag-view segment's name and kind ('' = both), or null for anything else\n *  (a bare `.tag~` included). */\nexport function tagViewOfSegment(segment: string): { tag: string; kind: TagKind | '' } | null {\n  for (const [prefix, kind] of TAG_KIND_PREFIXES) {\n    if (segment.startsWith(prefix)) {\n      const tag = segment.slice(prefix.length);\n      return tag ? { tag, kind } : null;\n    }\n  }\n  return null;\n}\n\n/** `.tag~invoices` (or `.mytag~` / `.teamtag~`) → `invoices`; '' otherwise. */\nexport function tagOfSegment(segment: string): string {\n  return tagViewOfSegment(segment)?.tag ?? '';\n}\n\n/** The kind of a tag-view path: 'personal', 'team', or '' (both / not a tag view). */\nexport function tagKindOfPath(path: string): TagKind | '' {\n  const clean = (path || '').replace(/^\\/+|\\/+$/g, '');\n  return tagViewOfSegment(clean.split('/').pop() || clean)?.kind ?? '';\n}\n\n/** True when `path` (user-facing form) IS a tag listing. */\nexport function tagOfPath(path: string): string {\n  const clean = (path || '').replace(/^\\/+|\\/+$/g, '');\n  return tagOfSegment(clean.split('/').pop() || clean);\n}\n\n/** The locale key for a STATIC sentinel segment, or '' otherwise. Prefer\n *  `virtualSegmentLabel` — a tag segment has no locale key to return. */\nexport function virtualSegmentKey(segment: string): string {\n  return VIRTUAL_SEGMENTS[segment] ?? '';\n}\n\n/**\n * What a path segment READS AS: the translated view name for a static\n * sentinel, `#<tag>` for a tag view, '' when it is an ordinary folder (the\n * caller then shows the segment itself).\n *\n * `#` and not the bare name: a lone `invoices` crumb between `/` and nothing\n * is indistinguishable from a folder called invoices. The glyph needs no\n * translation and carries the tag's own name verbatim, which is the point.\n */\nexport function virtualSegmentLabel(segment: string, t: (key: string) => string): string {\n  const key = VIRTUAL_SEGMENTS[segment];\n  if (key) return t(key);\n  const view = tagViewOfSegment(segment);\n  if (!view) return '';\n  // etiket:k2 — the crumb says whose tag this is: \"#rapor · Kişisel\".\n  return view.kind ? `#${view.tag} · ${t(`tags.kind.${view.kind}`)}` : `#${view.tag}`;\n}\n\n/**\n * True when a USER PATH is one of the virtual views rather than a folder that\n * lives in a storage — `.trash`, `.recent`, `.starred`, `.shared`, `.home`,\n * `.tag~<name>`.\n *\n * ⚠⚠ Why a predicate and not just \"call `virtualSegmentLabel` and see\". The\n * caller that needs this is deciding whether to QUALIFY the path, and\n * qualifying a sentinel destroys it: in multi-storage mode `qualify('.starred')`\n * splits the first segment off as the adapter and answers `.starred://`, so\n * from there on the sentinel is a STORAGE NAME. A storage name is not a path\n * segment, `virtualSegmentLabel` is never asked about it, and the breadcrumb\n * prints `.starred` — which is exactly what the owner saw on 2026-09-13, in\n * every virtual view at once, the night the pane was extracted into\n * `FilePane.vue` and each pane began deriving its own crumb inputs. The\n * resolver was being called the whole time, with an argument that could not\n * match.\n *\n * ⚠ One definition, here beside the map and the tag prefix it asks about, so\n * \"is this a view or a folder?\" cannot be answered two ways: `FileExplorer`'s\n * `virtualViewOf()` (which also names the KIND) is built on this one.\n */\nexport function isVirtualViewPath(path: string): boolean {\n  const clean = String(path ?? '').replace(/^\\/+|\\/+$/g, '');\n  if (!clean) return false;\n  return !!VIRTUAL_SEGMENTS[clean] || !!tagOfSegment(clean);\n}\n\n/**\n * gorunum:v1 — folders before files, whatever the sort column is.\n *\n * Every file manager a person has used puts directories first, and the reason\n * is not taste: a directory is a place and a file is a thing, and a listing\n * that interleaves them makes the reader check the icon of every row to find\n * out where they can go next. Sorting by size or date interleaves them worst\n * of all, because a folder has neither.\n *\n * Applied as the PRIMARY comparator by both views, so it cannot mean one\n * thing in the list and another in the grid — the two sorts are separate code\n * and this is the rule they have to share (filex lesson #67).\n */\nexport function byFoldersFirst(a: { type?: string }, b: { type?: string }): number {\n  const ad = a.type === 'dir' ? 0 : 1;\n  const bd = b.type === 'dir' ? 0 : 1;\n  return ad - bd;\n}\n","/**\n * tableColumns — THE column model of the one table this product has.\n *\n * ⚠⚠ Read this before writing anything tabular. filex has exactly ONE table:\n * the explorer's list view, extracted into `components/DataTable.vue`. Every\n * table in the product — the explorer's own listing, every admin page, the\n * connection panels, My shares, the notifications list and an app's `list`\n * node — renders through that component, and every one of them therefore gets\n * what the explorer's list can do: resize a column, sort by it, hide it, move\n * it, and have all of that remembered.\n *\n * The owner, 2026-09-21, after a round that had built a SECOND table which\n * imitated the explorer (the same pinned edges, the same Actions menu) and left\n * everything else behind: \"Admin tabloları hâlâ explore tablolarıyla AYNI\n * KODDA DEĞİL. LÜTFEN AYNI KODA ALALIM. Örnek veriyorum: tablo sütunları\n * düzenlenebilir değil, büyütme küçültme yok, sıralama yok.\" An imitation gets\n * the parts somebody remembered to copy. The same code gets all of it, and\n * keeps getting whatever is added next.\n *\n * This file is the half of that table that has no DOM: which columns exist,\n * how wide each one is, which ones are hidden, in what order they stand, and\n * how wide the whole row therefore is. It used to live inside `lib/viewPrefs`\n * as the explorer's private column state, typed to the explorer's seven\n * columns; it is written here once, generic over the column ids, and the\n * explorer is one caller of it among many.\n *\n * ⚠ It holds NO state of its own. A store is handed a BACKING — get the\n * state, replace the state — and the backing decides where that lives: the\n * explorer's lives in the per-folder view document (`lib/viewPrefs`), every\n * other table's in the same per-person document under its own table id\n * (`lib/tablePrefs`). That split is the reason the arithmetic can be shared\n * without the storage being shared.\n */\nimport { computed, shallowRef } from 'vue';\n\n/** One column the table knows how to draw. */\nexport interface TableColumnSpec<Id extends string = string> {\n  id: Id;\n  /** Shipped width in px. */\n  width: number;\n  min: number;\n  max: number;\n  /** May the person hide it from the column menu? Also what makes it MOVABLE:\n   *  a column the person cannot hide is pinned where the table put it (the\n   *  explorer's Name first, its star last). */\n  hideable: boolean;\n  /** May the person drag its edge? */\n  resizable: boolean;\n}\n\n/**\n * What is remembered about one table's columns. Short keys on purpose — the\n * explorer keeps one of these per folder and the whole document is\n * re-serialised on every save.\n */\nexport interface ColsState<Id extends string = string> {\n  /** Widths the person set, px. A column absent here is at its shipped width. */\n  w: Partial<Record<Id, number>>;\n  /** Columns the person switched off. */\n  hidden: Id[];\n  /** The person's order. Absent = the order the columns were declared in. */\n  o?: Id[];\n}\n\nexport function emptyCols<Id extends string = string>(): ColsState<Id> {\n  return { w: {}, hidden: [] };\n}\n\n/**\n * Read a stored column state against the columns that exist TODAY.\n *\n * ⚠ Clamped and filtered on the way IN, not only on the way out: a width\n * stored by an older build (or hand-edited) outside today's bounds would draw\n * a column nobody can reach the edge of, and a hidden id that no longer names\n * a column would sit in the document forever. Nothing in the UI could explain\n * either, so neither is allowed through.\n */\nexport function readCols<Id extends string>(\n  raw: unknown,\n  specs: readonly TableColumnSpec<Id>[],\n): ColsState<Id> {\n  const fallback = emptyCols<Id>();\n  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return fallback;\n  const specOf = (id: unknown) => specs.find((c) => c.id === id);\n  const p = raw as { w?: unknown; hidden?: unknown; o?: unknown };\n  const w: Partial<Record<Id, number>> = {};\n  if (p.w && typeof p.w === 'object') {\n    for (const [k, v] of Object.entries(p.w as Record<string, unknown>)) {\n      const spec = specOf(k);\n      if (!spec || typeof v !== 'number' || !Number.isFinite(v)) continue;\n      w[spec.id] = Math.min(spec.max, Math.max(spec.min, Math.round(v)));\n    }\n  }\n  const hidden = Array.isArray(p.hidden)\n    ? [...new Set(p.hidden.filter((x) => specOf(x)?.hideable) as Id[])]\n    : [];\n  const o = Array.isArray(p.o) ? ([...new Set(p.o.filter((x) => !!specOf(x)))] as Id[]) : undefined;\n  return o && o.length ? { w, hidden, o } : { w, hidden };\n}\n\n/**\n * THE REORDER ARITHMETIC, on its own and with no state attached.\n *\n * ⚠⚠ `to` is the index the item ENDS UP AT — equivalently, the insertion index\n * in the list with the item already taken out. The two readings coincide for\n * every `to`, and that equivalence is the whole point of writing it down:\n * every reorder bug this function exists to close was a caller mixing the two\n * index spaces. A caller that computes its target against the list WITH the\n * column still in it hands over an index one too large whenever the column\n * moves right — which is exactly how \"drag one column to the right\" became\n * \"two columns to the right\". (Owner, 2026-09-20: \"bir adım ileri çekince iki\n * adım ilerliyor\".)\n *\n * `from === to` is a no-op and returns a copy, so a drop on the column's own\n * place writes nothing.\n */\nexport function reorderColumns<T>(list: readonly T[], from: number, to: number): T[] {\n  const next = [...list];\n  if (from < 0 || from >= next.length) return next;\n  const target = Math.max(0, Math.min(next.length - 1, to));\n  if (target === from) return next;\n  const [item] = next.splice(from, 1);\n  next.splice(target, 0, item);\n  return next;\n}\n\n/**\n * The stretch of the order a movable column may occupy — `[lo, hi]`, both\n * inclusive indices into `order`.\n *\n * ⚠ The pinned columns are not just un-draggable, they are also un-passable:\n * the lead is the row's handle and stays first, the explorer's star is a\n * control that lives beside the row menu and stays last. Measured 2026-09-20:\n * dropping Type at the end of the drawn columns put it PAST the star, so the\n * header read `… Size ★ Type ⋮` and the Type label stood over a 24px control\n * column. The band is derived rather than hard-coded so a pinned column at\n * either end of ANY table is honoured without another rule remembering to.\n */\nexport function columnDropBand<Id extends string>(\n  order: readonly Id[],\n  specs: readonly TableColumnSpec<Id>[],\n): { lo: number; hi: number } {\n  const movable = (id: Id) => specs.find((c) => c.id === id)?.hideable === true;\n  let lo = 0;\n  while (lo < order.length && !movable(order[lo])) lo++;\n  let hi = order.length - 1;\n  while (hi >= 0 && !movable(order[hi])) hi--;\n  return { lo, hi: Math.max(lo, hi) };\n}\n\n/** Where a store reads and writes its state. */\nexport interface ColumnBacking<Id extends string = string> {\n  /** The stored state, or anything that does not parse as one (read as empty). */\n  get(): unknown;\n  /** Replace it. The store always hands over a complete, normalised state. */\n  set(next: ColsState<Id>): void;\n  /**\n   * Is there anything here the person could RESET? Optional — by default,\n   * \"the state says something\". The explorer's folder backing answers \"does\n   * THIS folder have columns of its own\", because a folder that shows the\n   * person's default columns has nothing of its own to reset, and a \"Reset\n   * columns\" row that does nothing when clicked reads as broken.\n   */\n  customised?(): boolean;\n}\n\n/** What one table looks like right now. */\nexport interface TableLayout<Id extends string = string> {\n  /** The columns drawn after the lead, in the person's order. Never shortened\n   *  for width — a table wider than its pane scrolls. */\n  visible: Id[];\n  /** Every drawn track's width in px, the lead's included. */\n  widths: Record<Id, number>;\n  /** The table's own width: every track, every gap, both paddings. */\n  total: number;\n  /** True while the widths are derived from the pane rather than stored. */\n  auto: boolean;\n}\n\nexport interface LayoutMetrics {\n  /** Space between cells (`--fe-gap-sm`). */\n  gap?: number;\n  /** Row padding, both sides together (`--fe-gap` × 2). */\n  padding?: number;\n  /** The tick column's track, or 0 for a table with no tick. */\n  check?: number;\n  /** The trailing actions column's track (the explorer's ⋮ is 28). */\n  menu?: number;\n  /** What the lead opens at when nobody has sized anything. */\n  leadAuto?: number;\n}\n\nexport interface ColumnStore<Id extends string = string> {\n  readonly lead: Id;\n  specs(): readonly TableColumnSpec<Id>[];\n  spec(id: Id): TableColumnSpec<Id> | undefined;\n  /** The full order, lead first, reconciled with the columns that exist. */\n  order(): Id[];\n  width(id: Id): number;\n  setWidth(id: Id, px: number): void;\n  hidden(id: Id): boolean;\n  setHidden(id: Id, hidden: boolean): void;\n  /** Put `id` at `index` in the order — `index` is where it ENDS UP. */\n  move(id: Id, index: number): void;\n  /** Has anybody ever sized this table? (the lead's width is the bit) */\n  widthsAreAuto(): boolean;\n  /** Commit the widths on screen for every column that has none stored. */\n  freeze(widths: Partial<Record<Id, number>>): void;\n  /** Back to the shipped widths, order and visibility. */\n  reset(): void;\n  /** Has anything about the columns been changed by hand? */\n  customised(): boolean;\n  /** The state as it resolves right now — what \"Apply to all folders\" copies. */\n  state(): ColsState<Id>;\n  layout(available: number, candidates: readonly Id[], metrics?: LayoutMetrics): TableLayout<Id>;\n}\n\n/**\n * A column store over `specs`, reading and writing through `backing`.\n *\n * `lead` is the column pinned first: never hidden, never moved, always\n * resizable. It is the one that says WHICH ROW this is — the explorer's Name,\n * an admin table's email or path — and the table freezes it on the left edge\n * while the others scroll.\n *\n * ⚠ The state is read through a `computed`, so a store created inside a\n * component re-renders it when the backing changes (the explorer's backing\n * changes every time the folder does) and parses the stored document once per\n * change rather than once per cell.\n */\nexport function createColumnStore<Id extends string>(\n  specsOf: () => readonly TableColumnSpec<Id>[],\n  backing: ColumnBacking<Id>,\n  opts: { lead?: Id } = {},\n): ColumnStore<Id> {\n  const lead = (opts.lead ?? specsOf()[0]?.id) as Id;\n  const state = computed<ColsState<Id>>(() => readCols(backing.get(), specsOf()));\n  const specOf = (id: Id) => specsOf().find((c) => c.id === id);\n\n  function write(next: ColsState<Id>): void {\n    backing.set(next);\n  }\n\n  /**\n   * THE COLUMN ORDER — the person's, reconciled with the columns that exist.\n   *\n   * ⚠⚠ Reconciled, not trusted. A stored order was written by an older build,\n   * so it can be missing a column added since and can name one removed since.\n   * Returning it as-is would make a new column INVISIBLE to everyone who had\n   * ever touched the order — a feature that ships and then does not appear for\n   * exactly the users engaged enough to have customised something.\n   *\n   * ⚠ The lead first, whatever the document says: it is pinned in the table,\n   * so an order that claimed otherwise would be a sequence nothing on screen\n   * obeys.\n   *\n   * ⚠ A column the stored list never heard of goes to the END, not to its own\n   * shipped index. Measured: inserting at the shipped index walked newcomers in\n   * FRONT of the columns the person had deliberately moved — somebody who had\n   * put Size first would open a later release to find two new columns ahead of\n   * it and their arrangement silently rewritten.\n   */\n  function order(): Id[] {\n    const known = specsOf().map((c) => c.id);\n    const stored = state.value.o;\n    if (!stored || stored.length === 0) {\n      return [lead, ...known.filter((id) => id !== lead)];\n    }\n    const out = stored.filter((id) => known.includes(id) && id !== lead);\n    out.unshift(lead);\n    for (const id of known) if (!out.includes(id)) out.push(id);\n    return out;\n  }\n\n  function width(id: Id): number {\n    const spec = specOf(id);\n    if (!spec) return 0;\n    return state.value.w[id] ?? spec.width;\n  }\n\n  function setWidth(id: Id, px: number): void {\n    const spec = specOf(id);\n    if (!spec || !spec.resizable) return;\n    const next = Math.min(spec.max, Math.max(spec.min, Math.round(px)));\n    if (state.value.w[id] === next) return;\n    write({ ...state.value, w: { ...state.value.w, [id]: next } });\n  }\n\n  /**\n   * HAS ANYBODY EVER SIZED THIS TABLE — the one bit that separates \"I have\n   * never touched this\" from \"I deliberately made the lead narrow\".\n   *\n   * ⚠⚠ Without it the two are indistinguishable and the first resize is undone\n   * by the next pane resize: an untouched table is sized to the pane it is in,\n   * so a person who drags the lead to 140 and then opens a side panel would get\n   * it recomputed back to whatever the narrower pane suggests. The bit is the\n   * LEAD's width rather than \"the map is empty\": documents written before the\n   * explorer's Name became a sized column carry widths but have never been\n   * asked about Name, and reading those as \"configured\" would open the table\n   * at a width nobody chose. The first drag writes every width at once\n   * (`freeze`), so a table somebody has actually sized can never fall back.\n   */\n  function widthsAreAuto(): boolean {\n    return state.value.w[lead] === undefined;\n  }\n\n  /**\n   * ⚠⚠ Called at the START of a resize gesture, and it has to write EVERY\n   * drawn column, not the one being dragged. Writing only the dragged column\n   * would leave the lead auto — and the auto lead takes the slack, so\n   * narrowing Size would widen Name, which is the exact behaviour the owner\n   * called wrong (\"küçültme yapınca name kısmı büyüyormuş gibi davranıyor\").\n   */\n  function freeze(widths: Partial<Record<Id, number>>): void {\n    const w: Partial<Record<Id, number>> = { ...state.value.w };\n    let changed = false;\n    for (const [k, v] of Object.entries(widths) as [Id, number | undefined][]) {\n      if (typeof v !== 'number' || !Number.isFinite(v)) continue;\n      if (w[k] !== undefined) continue;\n      const spec = specOf(k);\n      if (!spec || !spec.resizable) continue;\n      w[k] = Math.min(spec.max, Math.max(spec.min, Math.round(v)));\n      changed = true;\n    }\n    if (changed) write({ ...state.value, w });\n  }\n\n  function hidden(id: Id): boolean {\n    return state.value.hidden.includes(id);\n  }\n\n  function setHidden(id: Id, hide: boolean): void {\n    const spec = specOf(id);\n    if (!spec || !spec.hideable || id === lead) return;\n    if (hidden(id) === hide) return;\n    const set = new Set(state.value.hidden);\n    if (hide) set.add(id);\n    else set.delete(id);\n    write({ ...state.value, hidden: [...set] });\n  }\n\n  function move(id: Id, index: number): void {\n    const spec = specOf(id);\n    /* A column the person cannot hide is not theirs to move either: it is\n       pinned where the table put it (the lead first, a control column last). */\n    if (!spec || !spec.hideable || id === lead) return;\n    const cur = order();\n    const from = cur.indexOf(id);\n    if (from === -1) return;\n    const band = columnDropBand(cur, specsOf());\n    const to = Math.max(band.lo, Math.min(band.hi, index));\n    const next = reorderColumns(cur, from, to);\n    if (next.join() === cur.join()) return;\n    write({ ...state.value, o: next });\n  }\n\n  function reset(): void {\n    write(emptyCols<Id>());\n  }\n\n  function customised(): boolean {\n    if (backing.customised) return backing.customised();\n    return (\n      Object.keys(state.value.w).length > 0 ||\n      state.value.hidden.length > 0 ||\n      (state.value.o?.length ?? 0) > 0\n    );\n  }\n\n  /**\n   * THE TABLE'S WIDTHS — one answer, used by the header and by every row.\n   *\n   *   · nothing is ever dropped for want of room — `visible` is the person's\n   *     choice and the caller's candidates, and width has no vote. The owner\n   *     rejected the table that shed columns and said \"no room\": \"no room\n   *     demesin, kenara devam eden bir scroll getirsin\";\n   *   · the table's width is the SUM of its columns, so when that exceeds the\n   *     pane the table scrolls sideways instead of shrinking;\n   *   · with nothing stored the widths are derived from the pane, so a table\n   *     nobody has configured opens sensibly at 1440 and at 390 alike: the lead\n   *     asks for `leadAuto`, the others give up room toward their minimums to\n   *     pay for it, and the lead takes any slack that is left. The instant one\n   *     width is stored the pane stops having an opinion.\n   *\n   * ⚠ `candidates` is what the CALLER is willing to draw at all — the\n   * explorer's Location only where rows come from more than one folder, its\n   * star only where starring is offered. Passing them keeps those facts with\n   * the component that knows them.\n   */\n  function layout(\n    available: number,\n    candidates: readonly Id[],\n    metrics: LayoutMetrics = {},\n  ): TableLayout<Id> {\n    const gap = metrics.gap ?? 8;\n    const padding = metrics.padding ?? 24;\n    const check = metrics.check ?? 0;\n    const menu = metrics.menu ?? 28;\n    const leadSpec = specOf(lead);\n\n    const visible = order().filter((id) => id !== lead && candidates.includes(id) && !hidden(id));\n\n    const widths = {} as Record<Id, number>;\n    for (const id of visible) widths[id] = width(id);\n    widths[lead] = width(lead);\n\n    /* Cells: [tick] + lead + the others + the actions column, so one gap\n       fewer than that. */\n    const cells = (check > 0 ? 1 : 0) + 1 + visible.length + 1;\n    const chrome = check + menu + padding + gap * (cells - 1);\n    const auto = widthsAreAuto();\n\n    /* A container we cannot measure yet (0 on the first tick, or a test with\n       no layout) keeps the shipped widths — the observer corrects it one frame\n       later, and a table that guessed would flash. */\n    if (auto && available > 0 && leadSpec) {\n      const leadAuto = metrics.leadAuto ?? leadSpec.width;\n      const room = available - chrome;\n      let rest = visible.reduce((s, id) => s + widths[id], 0);\n      const target = room - leadAuto;\n      if (rest > target) {\n        const give = visible.reduce((s, id) => s + (widths[id] - (specOf(id)?.min ?? widths[id])), 0);\n        if (give > 0) {\n          const f = Math.min(1, (rest - target) / give);\n          for (const id of visible) {\n            const min = specOf(id)?.min ?? widths[id];\n            /* ⚠ `ceil` on the reduction, not `floor`: rounding the other way\n               leaves the row a pixel or two over the pane and hands an\n               otherwise fitting table a horizontal scrollbar on first sight —\n               measured at 960, 712 in a 711px pane. */\n            widths[id] = Math.max(min, widths[id] - Math.ceil((widths[id] - min) * f));\n          }\n          rest = visible.reduce((s, id) => s + widths[id], 0);\n        }\n      }\n      /* Slack goes to the lead, and only to the lead — and where there is\n         none to give, the lead gives way too, down to its own minimum.\n\n         ⚠⚠ It used to stop at `leadAuto`, and `leadAuto` is a DESKTOP\n         default (240px for a table that names nothing else). In a 265px side\n         panel that IS the pane: an app's list drew its Identity column and\n         nothing else, and the State and When columns it was sent sat under\n         the pinned Actions cell, so a signer table read as names, buttons,\n         and a blank gap between them (v0.43.0). Standing at 240 does not\n         make anything fit — the table is wider than the pane either way and\n         scrolls, which is the owner's rule — it only decides what the person\n         is shown FIRST, and one wide column plus nothing is the worse\n         answer. Nothing is ever dropped here; the lead simply stops taking\n         the whole pane. */\n      const leadFloor = Math.min(leadAuto, leadSpec.min);\n      widths[lead] = Math.round(Math.max(leadFloor, Math.min(leadSpec.max, room - rest)));\n    }\n\n    const total = chrome + widths[lead] + visible.reduce((s, id) => s + widths[id], 0);\n    return { visible, widths, total, auto };\n  }\n\n  return {\n    lead,\n    specs: specsOf,\n    spec: specOf,\n    order,\n    width,\n    setWidth,\n    hidden,\n    setHidden,\n    move,\n    widthsAreAuto,\n    freeze,\n    reset,\n    customised,\n    state: () => state.value,\n    layout,\n  };\n}\n\n/**\n * A backing that lives in this component's memory only — for a table on a\n * surface with no account behind it (a public page), and for tests.\n */\nexport function memoryBacking<Id extends string = string>(\n  initial: ColsState<Id> = emptyCols<Id>(),\n): ColumnBacking<Id> {\n  /* A ref, or the store's `computed` would never see a write and the table\n     would not move when a column is dragged. */\n  const box = shallowRef<ColsState<Id>>(initial);\n  return {\n    get: () => box.value,\n    set: (next) => {\n      box.value = next;\n    },\n  };\n}\n","/**\n * viewPrefs — HOW A FOLDER LOOKS, remembered per folder.\n *\n * ⚠⚠ THE RULE, in one sentence, because a rule that cannot be said in one\n * sentence cannot be explained to the person it surprises:\n *\n *     A change you make in a folder belongs to THAT folder; a folder you have\n *     never changed opens with your default view, or the instance's default\n *     when you have not set one, or filex's own.\n *\n * Resolution, field by field (view mode · sort · columns):\n *\n *     the folder's own memory  →  your default  →  the instance default\n *                                              →  filex's built-in default\n *\n * ⚠⚠ WHY IT CHANGED, 2026-09-21. The owner, verbatim: \"Explore içindeki\n * değişikliklerimiz o klasör özelinde olmalı; tüm klasörlerde görünüm\n * değişikliği geçerli oluyor.\" Reproduced the same day against the v0.43.0\n * branch: switch folder A to grid, open folder B — B is grid too. Two things\n * made it so, and both were design rather than accident:\n *\n *   1. the per-folder memory shipped in v0.41.0 as an OPT-IN, off by default,\n *      so for nearly everyone nothing was ever remembered per folder at all;\n *   2. every change — with the memory on or off — ALSO wrote a \"global\n *      default\" (`g`), defined as \"your last choice becomes the default for\n *      every folder you have never set up\". The last click anywhere was\n *      therefore what every untouched folder showed, which is exactly the leak.\n *      Measured with the memory ON: grid in FolderB wrote `f[\"Repro/FolderB\"]`\n *      AND `g.v = \"grid\"`, and FolderA — never touched — opened as grid.\n *   This release made it worse by moving `g` onto the account: a click in one\n *   folder in one browser re-arranged every untouched folder in every browser.\n *\n * So: the memory is always on, a change writes ONLY the folder it was made in,\n * and \"what an untouched folder opens as\" is a DEFAULT the person sets on\n * purpose (their settings) or the operator sets for the instance (admin\n * settings) — never a side effect of a click. Changing a default never touches\n * a folder that remembers its own view; it only changes what untouched folders\n * open as.\n *\n * ⚠ The columns are per folder too now, and that reverses a decision written\n * here before (\"widths are a fact about your SCREEN, so they are global\"). The\n * owner's sentence is about \"görünüm değişikliği\" — every change to how a\n * folder looks — and a column dragged wider in Downloads showing up wider in\n * Photos is the same leak with a different control. A person who does want\n * one arrangement everywhere has \"Apply to all folders\" in the column menu,\n * which makes this folder's setup their default and forgets the others.\n *\n * ⚠⚠ WHERE IT IS STORED: the DATABASE, against the user, as one JSON document\n * (migration 00039) — not `localStorage`. The owner's decision, 2026-09-13:\n * \"tarayıcıya değil db'ye kaydedeceğiz, basit bir json olarak.\" Browser\n * storage is per BROWSER, so on a shared machine the second person would\n * silently inherit the first one's folder arrangements.\n *\n * ⚠ This file holds NO transport. The explorer (and the admin app) inject one\n * (`attachViewPrefsStore`, usually `lib/viewPrefsHttp`), so the module stays\n * testable without a server and an embed with no account degrades to\n * \"remember nothing across sessions\" rather than to an error.\n *\n * ⚠ Grouping is NOT a separate axis. `ListView` draws date headings exactly\n * when the sort key is `modified`, so \"a time-grouped view in this folder\" is\n * already what remembering the sort key delivers.\n */\nimport { ref } from 'vue';\n\nimport type { SortDir, SortKey } from './sortOrder';\nimport {\n  columnDropBand as genericDropBand,\n  createColumnStore,\n  emptyCols,\n  readCols,\n  reorderColumns as genericReorder,\n  type ColsState,\n  type ColumnStore,\n  type TableColumnSpec,\n} from './tableColumns';\n\nexport type ViewMode = 'list' | 'grid' | 'gallery';\n\n/**\n * The explorer's columns, in the order the list draws them.\n *\n * `name` is the table's LEAD: pinned first, never hidden, never moved, but\n * sized by the person like every other column (the owner: \"istersem name'i de\n * kısabilir olmalıyım\"). The star is a control, not a value: not hideable, not\n * resizable, pinned last beside the row menu.\n */\nexport type ColumnId = 'name' | 'type' | 'location' | 'owner' | 'modified' | 'remaining' | 'size' | 'star';\n\n// ── per-folder memory ─────────────────────────────────────────────────\n\n/** One folder's remembered setup. Short keys: the whole map is re-serialised\n *  on every write. */\nexport interface FolderPrefs {\n  /** view mode */\n  v?: ViewMode;\n  /** sort key */\n  k?: SortKey;\n  /** sort direction */\n  d?: SortDir;\n  /** this folder's own columns — absent = the default's */\n  c?: ColsState<ColumnId>;\n  /** last used, epoch SECONDS — the LRU clock. */\n  t: number;\n}\n\n/**\n * THE TRANSPORT — injected, so this module knows nothing about fetch, auth or\n * URLs and a test can drive it with two functions.\n *\n * `load` resolves the stored document, or null when there is nobody to store\n * one for (an embed on a shared app token, a public share link). `save` is\n * FIRE AND FORGET on purpose: a view preference is never worth blocking an\n * interface for, and a failed write must leave the change on screen — the next\n * write sends the whole document anyway, so a dropped one heals itself.\n */\nexport interface ViewPrefsTransport {\n  load: () => Promise<unknown>;\n  save: (doc: unknown) => void;\n}\n\nlet transport: ViewPrefsTransport | null = null;\n\n/**\n * Has the document resolved yet?\n *\n * ⚠⚠ Nothing is applied to a folder until it has: a folder whose document has\n * not arrived follows the first-paint cache and is corrected once, exactly\n * when the answer is known. A caller with NO user degrades cleanly: `load`\n * resolves null, `ready` still becomes true, and nothing is ever written.\n */\nconst ready = ref(false);\n/** True when there is somebody to save for. False = session-only. */\nconst persistable = ref(false);\n\nexport function viewPrefsReady(): boolean {\n  return ready.value;\n}\n\n/**\n * ⚠ DEPRECATED — always true. The per-folder memory used to be an opt-in,\n * off by default, and that default was half of the leak the owner reported\n * (see the header). Kept exported so an embedder that read it keeps\n * compiling; a host that genuinely wants no per-folder memory passes\n * `config.rememberFolderView: false` to the explorer, which is the host's\n * decision rather than a hidden switch in a person's settings.\n */\nexport function folderMemoryEnabled(): boolean {\n  return true;\n}\n\n/** ⚠ DEPRECATED — a no-op. See `folderMemoryEnabled`. */\nexport function setFolderMemoryEnabled(_on: boolean): void {\n  void _on;\n}\n\ntype FolderMap = Record<string, FolderPrefs>;\n\nfunction nowSec(): number {\n  return Math.floor(Date.now() / 1000);\n}\n\nfunction isViewMode(v: unknown): v is ViewMode {\n  return v === 'list' || v === 'grid' || v === 'gallery';\n}\n\nfunction isSortKey(v: unknown): v is SortKey {\n  return v === 'name' || v === 'type' || v === 'modified' || v === 'size';\n}\n\nfunction isSortDir(v: unknown): v is SortDir {\n  return v === 'asc' || v === 'desc';\n}\n\n/** A column state is worth storing only if it says something. */\nfunction colsSaySomething(c: ColsState<ColumnId> | undefined): c is ColsState<ColumnId> {\n  return !!c && (Object.keys(c.w).length > 0 || c.hidden.length > 0 || (c.o?.length ?? 0) > 0);\n}\n\n/** The map, in memory. A ref so the column menu's per-folder rows re-render\n *  when one is written or dropped. */\nconst folderMap = ref<FolderMap>({});\n\nfunction readFolderMap(raw: unknown): FolderMap {\n  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return {};\n  const out: FolderMap = {};\n  for (const [k, v] of Object.entries(raw as Record<string, unknown>)) {\n    if (!v || typeof v !== 'object') continue;\n    const e = v as Record<string, unknown>;\n    const t = typeof e.t === 'number' && Number.isFinite(e.t) ? e.t : 0;\n    const entry: FolderPrefs = { t };\n    if (isViewMode(e.v)) entry.v = e.v;\n    if (isSortKey(e.k)) entry.k = e.k;\n    if (isSortDir(e.d)) entry.d = e.d;\n    if (e.c !== undefined) {\n      const c = readCols(e.c, COLUMNS);\n      if (colsSaySomething(c)) entry.c = c;\n    }\n    // An entry that remembers nothing is noise from a half-written document.\n    if (entry.v || entry.k || entry.c) out[k] = entry;\n  }\n  return out;\n}\n\n/**\n * HOW MANY FOLDERS WE REMEMBER, and how the number was chosen.\n *\n * ⚠⚠ Without a cap this is one entry per folder ever changed, forever, in a\n * database row replicated into every backup; the endpoint refuses a document\n * over 128 KB, so left uncapped saving would eventually stop working,\n * silently, for the people who use the product most.\n *\n * 300 is derived: a view-only entry serialises to ~110 bytes and one that also\n * carries its own columns to ~260, so even 300 of the heavier kind is ~78 KB —\n * inside the endpoint's limit with room for longer paths. And the map only\n * gains an entry when somebody CHANGES a folder (walking through one writes\n * nothing), so in real use the cap is a ceiling on the pathological case.\n */\nexport const FOLDER_CAP = 300;\n\n/** Drop the least-recently-USED entries until the map fits the cap. ⚠ Used,\n *  not written: `touchFolder` bumps `t` on open too, so a folder you keep\n *  visiting does not age out merely because you have not re-sorted it. */\nfunction evict(): void {\n  const entries = Object.entries(folderMap.value);\n  if (entries.length <= FOLDER_CAP) return;\n  entries.sort((a, b) => b[1].t - a[1].t); // newest first\n  const kept: FolderMap = {};\n  for (const [k, v] of entries.slice(0, FOLDER_CAP)) kept[k] = v;\n  folderMap.value = kept;\n}\n\n/**\n * THE KEY a folder is remembered under.\n *\n * ⚠⚠ Read filex issue #21 before changing this. A storage's NAME is editable,\n * so it is not a stable address; every protocol accepts a storage's immutable\n * `uid` as the first path segment for exactly that reason. This takes the\n * storage REF the host gave us — name or uid — and the moment\n * `config.storages[].uid` is populated, keys become rename-proof. Until then\n * renaming a storage loses its folders' memory (they fall back to the\n * default — a mild, self-healing loss).\n *\n * The relative path is normalised so `a/b`, `/a/b/` and `a//b` are one folder.\n */\nexport function folderKey(storageRef: string, relPath: string): string {\n  const ref = String(storageRef ?? '').trim();\n  const rel = String(relPath ?? '')\n    .replace(/^[a-z][a-z0-9+.-]*:\\/\\//i, '')\n    .replace(/\\/{2,}/g, '/')\n    .replace(/^\\/+|\\/+$/g, '');\n  if (!ref) return rel;\n  /* ⚠ No trailing slash on a storage ROOT: `thumbfix/` and `thumbfix` would\n   * be two keys for one folder — measured, the seeded default for `.recent`\n   * never fired because the explorer asked for `.recent/`. */\n  return rel ? `${ref}/${rel}` : ref;\n}\n\n/**\n * The key for the listing of every storage at once (the multi-storage root).\n * It is a place like any other — a person who sorts their drives by name\n * expects them to stay sorted — so it gets a key of its own rather than\n * falling through to \"no folder\", which would write the person's DEFAULT.\n */\nexport const ROOT_FOLDER_KEY = '.root';\n\n/**\n * What a folder with NO memory of its own opens as, when the answer is not\n * simply the default. EMPTY since 0.54 (task #207, audit D3).\n *\n * ⚠ Recent used to be seeded `modified ↓` here, on the reasoning that \"the\n * things you were just in\" should not open alphabetically. But `modified` is\n * when the FILE changed, not when the person opened it: the list was drawn in\n * a different order from the one the server sent and the Home page showed.\n * The per-person views (Recent, Starred, Shared with me, a tag) now keep the\n * SERVER's order - the person's own time on each row, newest first - and a\n * sort the person chooses there is sent to the server as `sort` (FileExplorer\n * navSortParam), so nothing needs seeding.\n */\nconst SEEDED: Record<string, Omit<FolderPrefs, 't'>> = {};\n\n/** This folder's OWN memory (or its seed), or null — never a default. */\nexport function folderPrefs(key: string): Omit<FolderPrefs, 't'> | null {\n  if (!key) return null;\n  const hit = folderMap.value[key];\n  if (hit) {\n    const { t: _t, ...rest } = hit;\n    void _t;\n    const seed = SEEDED[key];\n    /* A folder that remembers only its view mode keeps its seeded sort. */\n    return seed && !rest.k ? { ...seed, ...rest } : rest;\n  }\n  return SEEDED[key] ? { ...SEEDED[key] } : null;\n}\n\n/** True when this folder has a memory the PERSON made (not a seed). */\nexport function folderIsRemembered(key: string): boolean {\n  return !!key && !!folderMap.value[key];\n}\n\n/** How many folders are remembered — \"Apply to all folders\" says so, because\n *  an escape hatch that does not say what it throws away is a trap. */\nexport function rememberedCount(): number {\n  return Object.keys(folderMap.value).length;\n}\n\n/**\n * Remember a change against this folder — ONLY the fields that changed.\n *\n * ⚠ The ONLY thing that creates an entry. Navigation does not (see\n * `touchFolder`), so the map is the set of folders somebody deliberately set\n * up rather than a log of everywhere they have been.\n *\n * ⚠ A patch, merged. Switching a folder to grid records `v` and nothing else,\n * so the folder's SORT still follows the default: a person who later changes\n * their default sort sees it in every folder whose sort they never touched,\n * including the ones whose view mode they did.\n */\nexport function rememberFolder(key: string, patch: Omit<FolderPrefs, 't'>): void {\n  if (!key) return;\n  const prev = folderMap.value[key];\n  const next: FolderPrefs = { ...(prev ?? {}), ...patch, t: nowSec() };\n  if (patch.c !== undefined && !colsSaySomething(patch.c)) delete next.c;\n  if (!next.v && !next.k && !next.c) {\n    // Nothing left to remember (a reset of the only thing this folder kept).\n    if (prev) forgetFolder(key);\n    return;\n  }\n  folderMap.value = { ...folderMap.value, [key]: next };\n  evict();\n  scheduleSave();\n}\n\n/**\n * Mark a remembered folder as used, for the LRU clock — and ONLY if it is\n * already remembered. ⚠ The guard is the point: bumping an absent key would\n * create an entry for every folder anyone opens.\n */\nexport function touchFolder(key: string): void {\n  if (!key) return;\n  const prev = folderMap.value[key];\n  if (!prev) return;\n  const t = nowSec();\n  if (prev.t === t) return;\n  folderMap.value = { ...folderMap.value, [key]: { ...prev, t } };\n  scheduleSave();\n}\n\n/** Forget one folder: it goes back to following the default. */\nexport function forgetFolder(key: string): void {\n  if (!key || !folderMap.value[key]) return;\n  const next = { ...folderMap.value };\n  delete next[key];\n  folderMap.value = next;\n  scheduleSave();\n}\n\n/** Forget every folder's own view. */\nexport function forgetAllFolders(): void {\n  folderMap.value = {};\n  scheduleSave();\n}\n\n// ── the defaults: the person's, then the instance's ───────────────────\n\n/** A person's default folder view. */\nexport interface FolderViewDefault {\n  v?: ViewMode;\n  k?: SortKey;\n  d?: SortDir;\n  /** default columns (widths, hidden, order) */\n  c?: ColsState<ColumnId>;\n}\n\n/**\n * The instance's default folder view — the OPERATOR's answer, set in the admin\n * settings (`ui.default_folder_view`) and handed to the client beside the\n * person's document. It carries no widths: a width is about a screen and the\n * operator does not know anybody's; which columns show is a fair instance-wide\n * call, so that part is here.\n */\nexport interface InstanceFolderDefault {\n  v?: ViewMode;\n  k?: SortKey;\n  d?: SortDir;\n  hidden?: ColumnId[];\n}\n\nconst personDefault = ref<FolderViewDefault>({});\n\n/**\n * ⚠⚠ NOT IN THE DOCUMENT, and that is the lesson the palette taught this same\n * release (web/src/lib/instanceThemes.ts `applyInstanceDefault`): the instance\n * default is the operator's answer, not the person's choice, so APPLYING it\n * must never RECORD it as the person's preference. Kept in its own ref, fed by\n * the server on every load, never saved. A person who has not chosen keeps\n * following the operator — including when the operator changes their mind.\n */\nconst instanceDefault = ref<InstanceFolderDefault>({});\n\nfunction normalisePersonDefault(raw: unknown): FolderViewDefault {\n  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return {};\n  const p = raw as Record<string, unknown>;\n  const out: FolderViewDefault = {};\n  if (isViewMode(p.v)) out.v = p.v;\n  if (isSortKey(p.k)) {\n    out.k = p.k;\n    if (isSortDir(p.d)) out.d = p.d;\n  }\n  if (p.c !== undefined) {\n    const c = readCols(p.c, COLUMNS);\n    if (colsSaySomething(c)) out.c = c;\n  }\n  return out;\n}\n\n/** Parse the operator's default — an object, or the JSON string the settings\n *  table stores. Anything unreadable is \"no instance default\". */\nexport function readInstanceFolderDefault(raw: unknown): InstanceFolderDefault {\n  let obj = raw;\n  if (typeof raw === 'string') {\n    try {\n      obj = JSON.parse(raw);\n    } catch {\n      return {};\n    }\n  }\n  if (!obj || typeof obj !== 'object' || Array.isArray(obj)) return {};\n  const p = obj as Record<string, unknown>;\n  const out: InstanceFolderDefault = {};\n  if (isViewMode(p.v)) out.v = p.v;\n  if (isSortKey(p.k)) {\n    out.k = p.k;\n    if (isSortDir(p.d)) out.d = p.d;\n  }\n  if (Array.isArray(p.hidden)) {\n    const hid = p.hidden.filter(\n      (x) => typeof x === 'string' && COLUMNS.some((c) => c.id === x && c.hideable),\n    ) as ColumnId[];\n    if (hid.length) out.hidden = [...new Set(hid)];\n  }\n  return out;\n}\n\n/** The person's own default, as stored. Reactive. */\nexport function personFolderDefault(): FolderViewDefault {\n  return personDefault.value;\n}\n\n/**\n * Set parts of the person's default; an `undefined` or `null` field CLEARS\n * that part, so it follows the instance default again.\n *\n * ⚠ Never called by a click in a folder — only by the settings control and by\n * \"Apply to all folders\". That is the whole fix.\n */\nexport function setPersonFolderDefault(\n  patch: Partial<Record<keyof FolderViewDefault, unknown>>,\n): void {\n  const next: Record<string, unknown> = { ...personDefault.value };\n  for (const [k, v] of Object.entries(patch)) {\n    if (v === undefined || v === null) delete next[k];\n    else next[k] = v;\n  }\n  personDefault.value = normalisePersonDefault(next);\n  mirrorDefault();\n  scheduleSave();\n}\n\n/**\n * THE ESCAPE HATCH — \"Apply to all folders\".\n *\n * Makes the setup on screen the person's DEFAULT and forgets every folder's\n * own memory, so every folder now opens the way this one does — which is what\n * the words promise. ⚠ It has to WRITE the default now: the old model got this\n * for free because every click already wrote a global default, and that free\n * write is the leak this file exists to close.\n */\nexport function applyToAllFolders(view: FolderViewDefault): void {\n  personDefault.value = normalisePersonDefault({ ...personDefault.value, ...view });\n  folderMap.value = {};\n  mirrorDefault();\n  scheduleSave();\n}\n\n/** The operator's default. Reactive. */\nexport function instanceFolderDefault(): InstanceFolderDefault {\n  return instanceDefault.value;\n}\n\n/** Hand the module the operator's default (the transport does, on load). */\nexport function setInstanceFolderDefault(raw: unknown): void {\n  instanceDefault.value = readInstanceFolderDefault(raw);\n  mirrorDefault();\n}\n\n/**\n * What an UNTOUCHED folder opens as — the person's default, else the\n * instance's, field by field. `undefined` fields mean \"filex's built-in\n * default\", which the caller owns (the explorer's host may pass its own\n * `config.viewMode`).\n *\n * ⚠ Sort is resolved as a PAIR: a person who chose \"Size\" and an operator\n * who chose \"Modified ↓\" must not produce \"Size ↓\".\n */\nexport function defaultFolderView(): { v?: ViewMode; k?: SortKey; d?: SortDir } {\n  const p = personDefault.value;\n  const i = instanceDefault.value;\n  const out: { v?: ViewMode; k?: SortKey; d?: SortDir } = {};\n  const v = p.v ?? i.v;\n  if (v) out.v = v;\n  if (p.k) {\n    out.k = p.k;\n    if (p.d) out.d = p.d;\n  } else if (i.k) {\n    out.k = i.k;\n    if (i.d) out.d = i.d;\n  }\n  return out;\n}\n\n/**\n * The folder's view, resolved: its own memory (or seed), then the defaults.\n * View mode and sort resolve independently — a folder that only remembers\n * \"grid\" still follows the default sort.\n */\nexport function resolveFolderView(key: string): { v?: ViewMode; k?: SortKey; d?: SortDir } {\n  const own = folderPrefs(key);\n  const def = defaultFolderView();\n  const out: { v?: ViewMode; k?: SortKey; d?: SortDir } = {};\n  const v = own?.v ?? def.v;\n  if (v) out.v = v;\n  if (own?.k) {\n    out.k = own.k;\n    if (own.d) out.d = own.d;\n  } else if (def.k) {\n    out.k = def.k;\n    if (def.d) out.d = def.d;\n  }\n  return out;\n}\n\n// ── the columns ───────────────────────────────────────────────────────\n\nexport type ColumnSpec = TableColumnSpec<ColumnId>;\n\n/**\n * The row's tracks, in shipped order.\n *\n * ⚠⚠ There is no `priority` field and nothing is shed for width: the owner\n * rejected a table that dropped columns and said \"no room\" — \"kenara devam\n * eden bir scroll getirsin\". A table wider than its pane scrolls sideways.\n */\nexport const COLUMNS: readonly ColumnSpec[] = [\n  { id: 'name', width: 260, min: 120, max: 900, hideable: false, resizable: true },\n  { id: 'type', width: 88, min: 64, max: 220, hideable: true, resizable: true },\n  { id: 'location', width: 160, min: 80, max: 420, hideable: true, resizable: true },\n  { id: 'owner', width: 104, min: 72, max: 260, hideable: true, resizable: true },\n  { id: 'modified', width: 160, min: 96, max: 300, hideable: true, resizable: true },\n  /* The Trash only: how long an item has left before it is purged. */\n  { id: 'remaining', width: 112, min: 80, max: 220, hideable: true, resizable: true },\n  { id: 'size', width: 88, min: 64, max: 200, hideable: true, resizable: true },\n  { id: 'star', width: 24, min: 24, max: 24, hideable: false, resizable: false },\n] as const;\n\n/** The two fixed tracks, in px, so the table arithmetic can be exact. */\nexport const FIXED_TRACKS = { check: 28, menu: 28 } as const;\n\n/** How narrow a person may drag Name: the tile, its gap and ~11 characters. */\nexport const NAME_MIN = 120;\n\n/** What Name opens at when nobody has sized anything — ~26 characters at\n *  13px/500, enough for `Quarterly Report Q2.pdf` to read whole. */\nexport const NAME_AUTO = 220;\n\n/** The explorer's table metrics — a tick column, the 28px ⋮, Name opening at\n *  `NAME_AUTO` — handed to `ColumnStore.layout` by the list view. */\nexport const EXPLORER_METRICS = {\n  gap: 8,\n  padding: 24,\n  check: FIXED_TRACKS.check,\n  menu: FIXED_TRACKS.menu,\n  leadAuto: NAME_AUTO,\n} as const;\n\n/**\n * The column state a folder with no columns of its own shows: the person's\n * default columns, else the instance's hidden set, else the shipped layout.\n */\nfunction defaultCols(): ColsState<ColumnId> {\n  if (personDefault.value.c) return personDefault.value.c;\n  const hid = instanceDefault.value.hidden;\n  return hid && hid.length ? { w: {}, hidden: [...hid] } : emptyCols<ColumnId>();\n}\n\n/**\n * THE EXPLORER'S COLUMN STORE for one folder — the generic store\n * (`lib/tableColumns`) over the explorer's columns, backed by this folder's\n * memory with the default beneath it.\n *\n * ⚠ `''` is not a folder: it is the person's DEFAULT layout. A listing reaches\n * it only when its host switched the per-folder memory off\n * (`config.rememberFolderView: false`), and for such a host \"one arrangement\n * everywhere\" is exactly what it asked for.\n *\n * ⚠ \"Reset columns\" in a folder means \"follow my default here again\": the\n * store writes an empty state and `rememberFolder` turns that into dropping\n * the folder's `c`, not into pinning the SHIPPED layout on this folder.\n */\nexport function folderColumnStore(keyOf: () => string): ColumnStore<ColumnId> {\n  return createColumnStore<ColumnId>(\n    () => COLUMNS,\n    {\n      get: () => {\n        const key = keyOf();\n        if (!key) return defaultCols();\n        return folderMap.value[key]?.c ?? defaultCols();\n      },\n      set: (next) => {\n        const key = keyOf();\n        if (!key) {\n          setPersonFolderDefault({ c: colsSaySomething(next) ? next : undefined });\n          return;\n        }\n        rememberFolder(key, { c: next });\n      },\n      customised: () => {\n        const key = keyOf();\n        if (!key) return colsSaySomething(personDefault.value.c);\n        return !!folderMap.value[key]?.c;\n      },\n    },\n    { lead: 'name' },\n  );\n}\n\n/**\n * The person's DEFAULT layout as a store — what the module-level column\n * functions below operate on (a host with the per-folder memory off, and the\n * tests that drive the arithmetic). Created once, for the life of the module.\n */\nconst defaultColumns = folderColumnStore(() => '');\n\nexport function columnOrder(): ColumnId[] {\n  return defaultColumns.order();\n}\n\n/** THE REORDER ARITHMETIC — `lib/tableColumns.reorderColumns`, re-exported. */\nexport const reorderColumns = genericReorder;\n\n/** The stretch of an order a movable explorer column may occupy. */\nexport function columnDropBand(order: readonly ColumnId[]): { lo: number; hi: number } {\n  return genericDropBand(order, COLUMNS);\n}\n\nexport function moveColumn(id: ColumnId, index: number): void {\n  defaultColumns.move(id, index);\n}\n\n/** One step left or right among the movable columns of the default layout. */\nexport function moveColumnBy(id: ColumnId, delta: -1 | 1): void {\n  const cur = columnOrder().filter((c) => COLUMNS.find((s) => s.id === c)?.hideable);\n  const at = cur.indexOf(id);\n  if (at === -1) return;\n  const to = at + delta;\n  if (to < 0 || to >= cur.length) return;\n  const neighbour = cur[to];\n  defaultColumns.move(id, columnOrder().indexOf(neighbour));\n}\n\nexport function canMoveColumn(id: ColumnId, delta: -1 | 1): boolean {\n  const cur = columnOrder().filter((c) => COLUMNS.find((s) => s.id === c)?.hideable);\n  const at = cur.indexOf(id);\n  if (at === -1) return false;\n  return at + delta >= 0 && at + delta < cur.length;\n}\n\nexport function columnWidth(id: ColumnId): number {\n  return defaultColumns.width(id);\n}\n\nexport function setColumnWidth(id: ColumnId, px: number): void {\n  defaultColumns.setWidth(id, px);\n}\n\nexport function widthsAreAuto(): boolean {\n  return defaultColumns.widthsAreAuto();\n}\n\nexport function freezeWidths(widths: Partial<Record<ColumnId, number>>): void {\n  defaultColumns.freeze(widths);\n}\n\nexport function columnHidden(id: ColumnId): boolean {\n  return defaultColumns.hidden(id);\n}\n\nexport function setColumnHidden(id: ColumnId, hidden: boolean): void {\n  defaultColumns.setHidden(id, hidden);\n}\n\nexport function resetColumns(): void {\n  defaultColumns.reset();\n}\n\nexport function columnsCustomised(): boolean {\n  return defaultColumns.customised();\n}\n\n/** What one explorer table looks like right now. */\nexport interface TableLayout {\n  visible: ColumnId[];\n  widths: Record<ColumnId, number>;\n  total: number;\n  auto: boolean;\n}\n\n/** The explorer's table arithmetic over the DEFAULT layout. A folder's own\n *  layout is `folderColumnStore(key).layout(…, EXPLORER_METRICS)`. */\nexport function tableLayout(\n  available: number,\n  candidates: readonly ColumnId[],\n  opts: { gap?: number; padding?: number } = {},\n): TableLayout {\n  return defaultColumns.layout(available, candidates, { ...EXPLORER_METRICS, ...opts });\n}\n\n// ── the first-paint cache ─────────────────────────────────────────────\n\n/**\n * The localStorage names the FIRST PAINT reads (FileExplorer's view mode,\n * lib/sortOrder's sort). ⚠ Caches of the resolved DEFAULT, never the answer:\n * the document cannot arrive before the first frame, and a listing that paints\n * name-ascending and then jumps would flash. ⚠⚠ Written from the DEFAULT only,\n * never from a click — a click in folder A written here would paint folder B\n * in A's view on the next load before the document corrected it, which is the\n * leak again for half a second.\n */\nconst MIRRORS = {\n  sort: 'filex.list-sort',\n  view: 'brf-file-explorer:view-mode',\n} as const;\n\nfunction mirrorDefault(): void {\n  const d = defaultFolderView();\n  try {\n    if (d.k) {\n      const dir = d.d ?? (d.k === 'modified' ? 'desc' : 'asc');\n      localStorage.setItem(MIRRORS.sort, JSON.stringify({ key: d.k, dir }));\n    } else localStorage.removeItem(MIRRORS.sort);\n    if (d.v) localStorage.setItem(MIRRORS.view, d.v);\n    else localStorage.removeItem(MIRRORS.view);\n  } catch {\n    /* private mode / quota — the first paint falls back to the product's\n       default until the document lands */\n  }\n}\n\n// ── the document ─────────────────────────────────────────────────────\n//\n//   { \"f\": { \"<storage>/<rel>\": {v,k,d,c,t}, … },   per folder, LRU-capped\n//     \"p\": { v, k, d, c },                          the person's default\n//     \"u\": <epoch ms>,                              last write\n//     \"on\": true }                                  for older clients (below)\n//\n// ⚠ RETIRED KEYS, read once and never written again:\n//   · `g` — the old \"global default\", written by every click. It is NOT\n//     carried into `p`: it was never a choice anybody made on purpose, it was\n//     their last click anywhere, and promoting it to \"your default\" would ship\n//     the leak frozen into the settings screen. Untouched folders open with\n//     the instance's or filex's default until the person sets their own.\n//   · `c` — the old global columns. These ARE carried into `p.c` once: a\n//     column width was only ever changed by a deliberate drag, and dropping\n//     them would throw away work the person did on purpose.\n//   · `on` — the opt-in switch. Always written `true` so an older client (a\n//     desktop app not yet updated) still honours the per-folder memory it\n//     finds in the same document.\n\ninterface ViewPrefsDoc {\n  on?: boolean;\n  f?: unknown;\n  p?: unknown;\n  c?: unknown;\n  g?: unknown;\n  u?: unknown;\n  [ns: string]: unknown;\n}\n\n/** The top-level names this module owns — retired ones included, so a slot\n *  can never claim them and they are not carried through as somebody else's. */\nconst OWNED_KEYS = ['on', 'f', 'p', 'c', 'g', 'u'] as const;\n\n/**\n * When this session last WROTE the document, epoch milliseconds — what \"the\n * last thing I did wins\" across browsers is made of. A refresh that finds a\n * NEWER stamp applies the server's document; an older or equal one keeps what\n * is on screen.\n */\nconst stamp = ref(0);\n\n/**\n * ⚠⚠ EVERYTHING IN THE DOCUMENT THAT IS NOT OURS, kept verbatim. The endpoint\n * stores an opaque object; a save that rebuilt only our keys once erased the\n * desktop-app reminder's \"never show me again\" on the next column drag.\n */\nconst foreign = ref<Record<string, unknown>>({});\n\nfunction takeForeign(doc: Record<string, unknown>): Record<string, unknown> {\n  const rest: Record<string, unknown> = {};\n  for (const [k, v] of Object.entries(doc)) {\n    if ((OWNED_KEYS as readonly string[]).includes(k)) continue;\n    rest[k] = v;\n  }\n  return rest;\n}\n\nfunction currentDoc(): ViewPrefsDoc {\n  /* ⚠ Spread FIRST, so the keys this module owns always win. */\n  const doc: ViewPrefsDoc = {\n    ...foreign.value,\n    on: true,\n    f: folderMap.value,\n    u: stamp.value,\n  };\n  if (Object.keys(personDefault.value).length) doc.p = personDefault.value;\n  return doc;\n}\n\n/* ── namespaced slots: room in the document for somebody else ──────────── */\n\n/** One feature's corner of the document. */\nexport interface ViewPrefsSlot<T> {\n  /** What is stored, or undefined — including before the document lands. */\n  get(): T | undefined;\n  /** Replace it. Session-only when there is nobody to save for. */\n  set(value: T): void;\n  /** Remove the key entirely. */\n  clear(): void;\n  /** Has the document been read yet? Reactive. */\n  ready(): boolean;\n  /** Is there an account behind this session at all? Reactive. */\n  persistable(): boolean;\n}\n\n/**\n * Claim `namespace` as a top-level key in the per-user document. ⚠ The names\n * this module owns are refused outright rather than quietly renamed: a slot\n * called `c` that silently became `c2` would be a value the caller could never\n * read back.\n */\nexport function viewPrefsSlot<T>(namespace: string): ViewPrefsSlot<T> {\n  if (!namespace || (OWNED_KEYS as readonly string[]).includes(namespace)) {\n    throw new Error(`viewPrefsSlot: \"${namespace}\" is reserved by lib/viewPrefs`);\n  }\n  return {\n    get: () => foreign.value[namespace] as T | undefined,\n    set(value: T) {\n      foreign.value = { ...foreign.value, [namespace]: value };\n      scheduleSave();\n    },\n    clear() {\n      if (!(namespace in foreign.value)) return;\n      const next = { ...foreign.value };\n      delete next[namespace];\n      foreign.value = next;\n      scheduleSave();\n    },\n    ready: () => ready.value,\n    persistable: () => persistable.value,\n  };\n}\n\n/**\n * SAVING — debounced, coalesced, fire and forget. A resize is dozens of writes\n * per second; waiting for the gesture to settle and then sending the WHOLE\n * document makes the last write the true one by construction, and a dropped\n * write self-healing.\n */\nconst SAVE_DEBOUNCE_MS = 800;\nlet saveTimer: ReturnType<typeof setTimeout> | undefined;\nlet saveDirty = false;\n\nfunction scheduleSave(): void {\n  /* ⚠ Not before the document has loaded: a save fired while the fetch is in\n   * flight would write this session's empty defaults over everything the\n   * person had arranged — the classic \"my settings reset themselves\". */\n  if (!ready.value || !persistable.value || !transport) return;\n  saveDirty = true;\n  if (saveTimer) clearTimeout(saveTimer);\n  saveTimer = setTimeout(flushSave, SAVE_DEBOUNCE_MS);\n}\n\nfunction flushSave(): void {\n  if (saveTimer) clearTimeout(saveTimer);\n  saveTimer = undefined;\n  if (!saveDirty || !transport || !persistable.value) return;\n  saveDirty = false;\n  // ⚠ Stamped at SEND time: the stamp answers \"whose copy is newer\".\n  stamp.value = Date.now();\n  transport.save(currentDoc());\n}\n\n/* ⚠ A change in the last moment before a tab closes is inside the debounce\n * window; `pagehide` is the last event a browser reliably delivers, and the\n * transport sends it with `keepalive`. */\nif (typeof window !== 'undefined') {\n  window.addEventListener('pagehide', flushSave);\n  window.addEventListener('visibilitychange', () => {\n    if (typeof document !== 'undefined' && document.visibilityState === 'hidden') flushSave();\n  });\n}\n\n/**\n * Hand this module its transport and read the document. Calling it again is a\n * no-op: two explorers on one page share this module's state, and the admin\n * app attaches before the explorer it hosts does.\n */\nexport function attachViewPrefsStore(t: ViewPrefsTransport): void {\n  if (transport) return;\n  transport = t;\n  void (async () => {\n    await readDoc(true);\n    ready.value = true;\n    watchForFreshDocuments();\n  })();\n}\n\n/**\n * Forget the account this module was reading for — sign-out. The next\n * `attachViewPrefsStore` reads the next person's document from scratch, and\n * nothing of the previous person's arrangement is left on screen for them.\n */\nexport function detachViewPrefsStore(): void {\n  flushSave();\n  resetState();\n}\n\n/** Is a transport attached? */\nexport function viewPrefsAttached(): boolean {\n  return transport !== null;\n}\n\nconst applied = new Set<() => void>();\n\n/** Be told when the stored preferences have been applied (the first load and\n *  every refresh that wins). */\nexport function onViewPrefsApplied(fn: () => void): () => void {\n  applied.add(fn);\n  return () => applied.delete(fn);\n}\n\nfunction announceApplied(): void {\n  for (const fn of applied) {\n    try {\n      fn();\n    } catch {\n      /* one surface's mistake is not another's */\n    }\n  }\n}\n\n/**\n * Read the document and apply it — unless what is on screen is newer.\n *\n * ⚠⚠ `first` is the mount. Afterwards this is the FRESHNESS half: a tab that\n * read the document once at boot never sees what the other browser did, so\n * the refresh runs when the tab comes back to the front.\n */\nasync function readDoc(first: boolean): Promise<void> {\n  if (!transport) return;\n  let doc: unknown = null;\n  try {\n    doc = await transport.load();\n  } catch {\n    /* No account, offline, a 500 — all one answer: remember nothing this\n       session and never write, so a transient failure cannot erase what is\n       already stored. */\n    doc = null;\n  }\n  if (!doc || typeof doc !== 'object' || Array.isArray(doc)) {\n    // Still tell the surfaces: the instance default may have arrived with it.\n    mirrorDefault();\n    announceApplied();\n    return;\n  }\n  const d = doc as ViewPrefsDoc;\n  const theirs = typeof d.u === 'number' && Number.isFinite(d.u) ? d.u : 0;\n\n  if (!first) {\n    // ⚠ A change this session has not sent yet OUTRANKS the server's copy:\n    // the person is mid-gesture and their own tab must not be overwritten by\n    // what they did five minutes ago somewhere else.\n    if (saveDirty) {\n      flushSave();\n      return;\n    }\n    // ⚠ Strictly newer. Equal stamps mean \"our own document coming back\".\n    if (theirs <= stamp.value) return;\n  }\n\n  folderMap.value = readFolderMap(d.f);\n  let migrated = false;\n  if (d.p !== undefined) {\n    personDefault.value = normalisePersonDefault(d.p);\n  } else {\n    /* ONE-TIME MIGRATION of the retired global columns (see the note above\n       the document shape): a deliberate drag is kept as the person's default\n       columns. The retired `g` is deliberately NOT migrated. */\n    const c = readCols(d.c, COLUMNS);\n    personDefault.value = colsSaySomething(c) ? { c } : {};\n    migrated = colsSaySomething(c) || d.g !== undefined || d.c !== undefined;\n  }\n  stamp.value = theirs;\n  /* ⚠ Whatever else was in there travels on untouched. */\n  foreign.value = takeForeign(d as Record<string, unknown>);\n  persistable.value = true;\n  mirrorDefault();\n  if (migrated) {\n    /* Rewrite the document in the new shape once, so the retired `g` stops\n       travelling. ⚠ `ready` before `scheduleSave`, whose guard exists to stop\n       a write landing while the fetch is out — and the fetch just finished. */\n    ready.value = true;\n    scheduleSave();\n  }\n  announceApplied();\n}\n\nconst REFRESH_THROTTLE_MS = 3_000;\nlet lastRefresh = 0;\nlet watching = false;\n\n/** Re-read the document (throttled) — when a tab comes back to the front. */\nexport function refreshViewPrefs(force = false): void {\n  if (!transport || !ready.value) return;\n  const now = Date.now();\n  if (!force && now - lastRefresh < REFRESH_THROTTLE_MS) return;\n  lastRefresh = now;\n  void readDoc(false);\n}\n\nfunction watchForFreshDocuments(): void {\n  if (watching || typeof window === 'undefined') return;\n  watching = true;\n  window.addEventListener('focus', () => refreshViewPrefs());\n  if (typeof document !== 'undefined') {\n    document.addEventListener('visibilitychange', () => {\n      if (document.visibilityState === 'visible') refreshViewPrefs();\n    });\n  }\n}\n\nfunction resetState(): void {\n  transport = null;\n  ready.value = false;\n  persistable.value = false;\n  folderMap.value = {};\n  personDefault.value = {};\n  instanceDefault.value = {};\n  stamp.value = 0;\n  lastRefresh = 0;\n  foreign.value = {};\n  saveDirty = false;\n  if (saveTimer) clearTimeout(saveTimer);\n  saveTimer = undefined;\n}\n\n/** Test seam: drop the transport and the state, so one suite cannot leak a\n *  document into the next. Not used by the app. */\nexport function __resetViewPrefs(): void {\n  resetState();\n  applied.clear();\n}\n\n/** Test seam: send whatever is pending now, without waiting out the debounce. */\nexport function __flushViewPrefs(): void {\n  flushSave();\n}\n","/**\n * sortOrder — THE listing sort: one key, one direction, one comparator, for\n * every surface that draws a folder's contents.\n *\n * ⚠⚠ Why this file exists at all. Before it, the sort lived as two private\n * refs inside `ListView.vue` and the grid had none, so \"sorted by size\" was a\n * fact about one component rather than about the listing: switching grid ⇄\n * list re-ordered the rows under the user, and any second control that wanted\n * to sort would have had to keep its own copy of the answer. That is the exact\n * shape of filex lesson #67 — the grid and the list each holding a private\n * copy of \"folders first\" and drifting apart — one level up.\n *\n * ⚠⚠ …and why it is no longer a module-level SINGLETON. A singleton answers\n * \"what is the sort\" for the whole bundle, which is the right answer only\n * while the bundle draws one listing. The split view draws two, side by side,\n * and the owner's ruling (2026-09-13) is that the second pane is the first\n * pane: it gets the same crumbs, the same filter row, the same view switcher\n * and the same sort control. Two sort CONTROLS over one piece of state is a\n * control that moves the listing the person is not looking at — measured the\n * same day: with the singleton in place, choosing \"Size ↓\" in the right pane\n * re-ordered the left one too.\n *\n * So the state is a STORE (`createSortStore`) and there is one per pane, while\n * everything that is genuinely one answer stays module-level:\n *\n *   · the RULES (`byActiveKey`, `compareNodes`, folders-first, the two click\n *     vocabularies) — written once, closed over each store;\n *   · the LOCALE the `type` key sorts in — one alphabet for the whole bundle;\n *   · the DEFAULT a folder nobody configured opens with — the person's, else\n *     the instance's (`lib/viewPrefs`). ⚠ Since v0.43 it is NOT \"the last sort\n *     a person chose\": a choice belongs to the folder it was made in, and\n *     nothing in this file writes the default (see the note where `persist`\n *     used to be).\n *\n * ⚠ Panes find their store by INJECTION (`provideSortStore` / `useSortStore`),\n * not by a prop threaded through every view: `ListView` and `FilterBar` are\n * two levels down and an embedder may mount either on its own. With no\n * provider — a bare `<ListView>` in a test, a host that renders one listing —\n * `useSortStore()` hands back the default store, which IS the old singleton,\n * so nothing that worked before changes.\n *\n * ⚠ Two RULES this file owns, so no caller has to remember them:\n *\n *   1. Folders before files, in every key and BOTH directions. `compareNodes`\n *      applies `byFoldersFirst` as the primary comparator and never multiplies\n *      it by the direction — multiplying would make \"Name ↓\" mean \"files\n *      first\", i.e. the arrow would silently regroup the listing instead of\n *      reversing it. The key only decides the order WITHIN each group.\n *   2. One vocabulary. A column header cycles (`chooseSortKey`: a new key\n *      arrives in its default direction, the active one flips) and a menu item\n *      jumps (`setSort`: a named destination never reverses under you). Both\n *      live here, so the two surfaces reach for the same words instead of each\n *      re-deriving what a click means.\n *\n * ⚠ The persisted shape is the one `ListView` already wrote (`filex.list-sort`,\n * `{key, dir}`), so a user who had sorted a column keeps that sort. The old\n * `key: null` — \"leave the backend's order alone\" — is NOT a key here; see\n * `ListingOrder` below for where that state went and why it could not be one.\n */\nimport { inject, provide, ref, type InjectionKey, type Ref } from 'vue';\n\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { messages } from '../locales';\nimport { typeLabelKey } from './fileIcons';\nimport { byFoldersFirst } from './listing';\n/* ⚠ The DEFAULT a folder nobody configured opens with (the person's, else the\n * instance's). `viewPrefs` imports only TYPES from this file, so there is no\n * runtime cycle between the two. */\nimport { defaultFolderView, onViewPrefsApplied, viewPrefsReady } from './viewPrefs';\n\nexport type SortKey = 'name' | 'type' | 'modified' | 'size';\nexport type SortDir = 'asc' | 'desc';\n\n/**\n * WHERE A LISTING'S ORDER CAME FROM — the third state the old `key: null`\n * used to express, back as a mode rather than as a fourth key.\n *\n *   `sort`      — a folder's contents. The key and the direction below decide\n *                 the order, which is what every control in the UI drives.\n *   `relevance` — a RANKED answer. The server decided the order and it is the\n *                 whole value of the reply; re-applying a key here buries the\n *                 row the person came for.\n *\n * ⚠⚠ Why a mode and not a key. A key is a preference: it is persisted, it is\n * named by a button, and the user picks it. \"Relevance\" is none of those — it\n * is a FACT about the rows in hand, it must not outlive them, and there is no\n * meaningful \"relevance descending\". Making it a fifth member of `SortKey`\n * would have persisted it into the next folder (where nothing is ranked) and\n * put a word in the Sort-by menu that does nothing in nine listings out of\n * ten.\n *\n * ⚠⚠ …and why it is an ARGUMENT and not a field on the store. The store is a\n * pane's preference; this is a property of the ROWS a pane happens to be\n * holding, and one pane can be showing a search while the other shows a\n * folder. Same pane, two navigations, two answers — the caller holding the\n * rows is the only one that knows which it has.\n *\n * Measured, 2026-09-13 (qldemo, query `s`, Name ↑): the server ranked\n * `Documents/server.ts` first and the list drew it fifteenth of seventeen,\n * behind every alphabetically earlier row. The owner's ruling that day:\n * ordinary search and ⌘K stay in relevance order.\n */\nexport type ListingOrder = 'sort' | 'relevance';\n\n/** The four, in the order the menu draws them. One array, so the menu and\n *  `isSortKey` cannot disagree about how many there are. */\nexport const SORT_KEYS: readonly SortKey[] = ['name', 'type', 'modified', 'size'] as const;\n\nconst SORT_LS_KEY = 'filex.list-sort';\n\n/**\n * The order the listing arrives in when nobody has chosen one.\n *\n * ⚠ `name` / ascending, and NOT the reference build's `modified` / descending,\n * deliberately: it is the order the server answers a folder in (since 0.54,\n * task #207: internal/listorder - folders first, then by name, numbers as\n * numbers - on every path; before, the catalogue path answered files first\n * and this comment claimed otherwise), so this default moves nothing on\n * screen for an existing user — and our list view\n * draws date group headings whenever the key is `modified`, which the\n * reference has no equivalent of. Making `modified` the default would put a\n * heading on the first paint of every folder that nobody asked for. Changing\n * it is this one constant; the consequence is that heading.\n */\nconst DEFAULT_KEY: SortKey = 'name';\n\n/** Dates read newest-first; everything else reads A→Z / smallest-first. */\nexport function defaultSortDir(key: SortKey): SortDir {\n  return key === 'modified' ? 'desc' : 'asc';\n}\n\nfunction isSortKey(v: unknown): v is SortKey {\n  return typeof v === 'string' && (SORT_KEYS as readonly string[]).includes(v);\n}\n\nfunction readStored(): { key: SortKey; dir: SortDir } {\n  const fallback = { key: DEFAULT_KEY, dir: defaultSortDir(DEFAULT_KEY) };\n  if (typeof localStorage === 'undefined') return fallback;\n  try {\n    const raw = localStorage.getItem(SORT_LS_KEY);\n    if (!raw) return fallback;\n    const p = JSON.parse(raw) as { key?: unknown; dir?: unknown };\n    const key = isSortKey(p.key) ? p.key : DEFAULT_KEY;\n    const dir = p.dir === 'asc' || p.dir === 'desc' ? p.dir : defaultSortDir(key);\n    return { key, dir };\n  } catch {\n    return fallback; // private mode / bad JSON\n  }\n}\n\n/**\n * The active locale, for the one comparison that needs words: `type` sorts by\n * the label the Type column PRINTS, so \"Image\" and \"Görsel\" have to fall in\n * their own alphabet's order.\n *\n * ⚠ Module-level and NOT per store, and that is deliberate even now that the\n * key and the direction are per pane: two panes of one window are read by one\n * person in one language. If each store carried its own resolver, the pane\n * whose host forgot to set it would sort by a different alphabet than the pane\n * beside it — the drift this file exists to prevent, in the one field where it\n * would be hardest to see.\n */\nconst localeRef = ref<LocaleCode>('en');\n\nexport function setSortLocale(code: LocaleCode): void {\n  localeRef.value = code;\n}\n\n// ── the comparator ────────────────────────────────────────────────────\n\nfunction modifiedMs(n: FileNode): number | null {\n  const v = n.last_modified;\n  if (!v) return null;\n  return v * (v < 1e12 ? 1000 : 1);\n}\n\n/**\n * Two names, in the order the Name column puts them: numbers as numbers\n * (\"Disk 2\" before \"Disk 10\"), case and accents ignored.\n *\n * ⚠ Exported because it is not only the listing's rule: the navigation panel's\n * \"Sort by name\" (lib/storageOrder) orders the storages by it too, so the\n * panel and the drives listing sorted by name agree on which drive comes first.\n */\nexport function compareNames(a: string, b: string): number {\n  return (a || '').localeCompare(b || '', undefined, {\n    numeric: true,\n    sensitivity: 'base',\n  });\n}\n\nfunction nameCompare(a: FileNode, b: FileNode): number {\n  return compareNames(a.basename, b.basename);\n}\n\n/** The word the Type column prints for this row — the thing a user sorting by\n *  \"Type\" is looking at. Unmapped kinds fall back to the uppercased extension,\n *  exactly as `typeLabelFor` does, so no row sorts as an empty string. */\nfunction typeLabel(n: FileNode): string {\n  const key = typeLabelKey(n);\n  if (key) {\n    const cat = messages[localeRef.value] ?? messages.en;\n    return cat[key] ?? key;\n  }\n  const ext = (n.extension || '').trim();\n  return ext ? ext.toUpperCase() : '';\n}\n\n/** The active key's own order, direction applied. Folders-first is NOT here —\n *  it is the primary comparator in `compareNodes` and must not be reversed.\n *\n *  ⚠ Written ONCE and closed over each store's refs, rather than copied into\n *  a store factory: the rule is the same in every pane and a per-pane copy of\n *  it is how the grid and the list drifted in the first place. */\nfunction byActiveKey(key: SortKey, dirWord: SortDir, a: FileNode, b: FileNode): number {\n  const dir = dirWord === 'asc' ? 1 : -1;\n  switch (key) {\n    case 'name':\n      return dir * nameCompare(a, b);\n    case 'size':\n      return dir * ((a.size ?? -1) - (b.size ?? -1));\n    case 'type': {\n      const c = typeLabel(a).localeCompare(typeLabel(b), undefined, { sensitivity: 'base' });\n      // ⚠ The tiebreak is name-ASCENDING in both directions, on purpose: every\n      // image in a folder shares one label, so without it a Type sort leaves\n      // whole runs in whatever order the backend happened to answer, and\n      // \"Type ↓\" would scramble them again rather than reverse the groups.\n      return c !== 0 ? dir * c : nameCompare(a, b);\n    }\n    default: {\n      const am = modifiedMs(a);\n      const bm = modifiedMs(b);\n      // Undated rows go last in BOTH directions, so date groups stay clean.\n      if (am == null && bm == null) return 0;\n      if (am == null) return 1;\n      if (bm == null) return -1;\n      return dir * (am - bm);\n    }\n  }\n}\n\n// ── the store ─────────────────────────────────────────────────────────\n\n/**\n * One pane's sort. Everything a surface needs to READ the order, to CHANGE it\n * from either of the two control vocabularies, and to sort rows by it.\n *\n * ⚠ `key` and `dir` are exposed as refs so a `computed` that reads them\n * subscribes to the next change — the property the module-level singleton had\n * and the reason every listing re-sorted itself for free.\n */\nexport interface SortStore {\n  readonly key: Ref<SortKey>;\n  readonly dir: Ref<SortDir>;\n  /** Set both halves outright. `dir` omitted → the key's own default. */\n  setSort(key: SortKey, dir?: SortDir): void;\n  /** Restore a remembered sort WITHOUT recording it as a fresh choice. */\n  applySort(key: SortKey, dir: SortDir): void;\n  /** Same order, other way round. The direction button's whole job. */\n  toggleSortDir(): void;\n  /** A column header click — see `chooseSortKey` below. */\n  chooseSortKey(key: SortKey): void;\n  /** Folders first, then the active key. Subscribes the reader. */\n  compareNodes(a: FileNode, b: FileNode): number;\n  /** THE comparator for a listing, given where its order came from. */\n  compareInOrder(order: ListingOrder): (a: FileNode, b: FileNode) => number;\n  /** The listing, in its order. A COPY. */\n  sortListing(files: FileNode[], order?: ListingOrder): FileNode[];\n}\n\n/*\n * A person CHOSE a sort — and that is ALL it is. There is no `persist` here\n * any more.\n *\n * ⚠⚠ This used to write the choice as the GLOBAL DEFAULT (on the account and\n * into `filex.list-sort`), under the rule \"your last choice becomes the\n * default for every folder you have never set up\". That rule was the leak the\n * owner reported on 2026-09-21 — \"Explore içindeki değişikliklerimiz o klasör\n * özelinde olmalı; tüm klasörlerde görünüm değişikliği geçerli oluyor\": sort\n * folder A by size and every untouched folder came up sorted by size. A\n * choice now belongs to the folder it was made in, and the explorer records\n * it there (FileExplorer → `rememberFolder`); the default is set on purpose,\n * in the person's settings, and nothing in this file writes it.\n *\n * ⚠ `filex.list-sort` is still READ (`readStored`) — for the first paint only,\n * as the cache of the resolved default that `lib/viewPrefs` keeps. Writing a\n * click into it would paint the next page load in the last folder's sort\n * before the document corrected it: the same leak, for half a second.\n */\n\n/**\n * Every store this module has handed out.\n *\n * ⚠ Needed so a document arriving from the SERVER can reach the panes that\n * are already on screen — the main one, the split one, an embed's. Without\n * it the account's answer would only apply to panes created after it landed,\n * which is \"it works if you navigate first\".\n */\nconst liveStores = new Set<SortStore>();\n\n/**\n * The default each store was last put on — its creation seed, then whatever\n * the account's answer moved it to. \"Still following the default\" means the\n * store holds exactly this.\n *\n * ⚠ Per store, and NOT a fresh read of the first-paint cache: by the time the\n * document is announced, `lib/viewPrefs` has already rewritten that cache with\n * the NEW default, so a comparison against it would see every store as\n * \"somebody chose something\" and move none of them.\n */\nconst followed = new WeakMap<SortStore, { key: SortKey; dir: SortDir }>();\n\n/**\n * A fresh sort store, seeded from the DEFAULT (the first-paint cache of it\n * until the account's answer lands).\n *\n * ⚠ A choice made in one store moves only that store's refs: the split pane\n * sorting by Size leaves the main pane on Name ↑ (measured 2026-09-13), and\n * since v0.43 it no longer changes what any other folder opens with either.\n */\nexport function createSortStore(): SortStore {\n  const stored = defaultSort();\n  const key = ref<SortKey>(stored.key);\n  const dir = ref<SortDir>(stored.dir);\n\n  function setSort(k: SortKey, d?: SortDir): void {\n    key.value = k;\n    dir.value = d ?? defaultSortDir(k);\n  }\n\n  /**\n   * tablo:t1 — RESTORE a sort (a folder's memory, or the default) without\n   * recording it as a fresh choice. The explorer's recorder tells the two\n   * apart by comparing against what it last applied, so a restore can never\n   * write itself into the folder it was restored into.\n   */\n  function applySort(k: SortKey, d: SortDir): void {\n    key.value = k;\n    dir.value = d;\n  }\n\n  function toggleSortDir(): void {\n    dir.value = dir.value === 'asc' ? 'desc' : 'asc';\n  }\n\n  /**\n   * A COLUMN HEADER click: a new key arrives in its own default direction, the\n   * key already active flips.\n   *\n   * ⚠ Not what the Sort-by menu calls — see `setSort`. A header is a toggle\n   * (click Name twice and you expect Z→A); a menu item is a destination (pick\n   * Name twice and you expect Name, still). Both meanings are written here so\n   * neither surface has to invent one.\n   */\n  function chooseSortKey(k: SortKey): void {\n    if (key.value === k) toggleSortDir();\n    else setSort(k);\n  }\n\n  function compareNodesFn(a: FileNode, b: FileNode): number {\n    return byFoldersFirst(a, b) || byActiveKey(key.value, dir.value, a, b);\n  }\n\n  function compareInOrderFn(order: ListingOrder): (a: FileNode, b: FileNode) => number {\n    return order === 'relevance' ? byFoldersFirst : compareNodesFn;\n  }\n\n  const store: SortStore = {\n    key,\n    dir,\n    setSort,\n    applySort,\n    toggleSortDir,\n    chooseSortKey,\n    compareNodes: compareNodesFn,\n    compareInOrder: compareInOrderFn,\n    sortListing: (files: FileNode[], order: ListingOrder = 'sort') =>\n      [...(files || [])].sort(compareInOrderFn(order)),\n  };\n  liveStores.add(store);\n  followed.set(store, { ...stored });\n  return store;\n}\n\n/**\n * The store a surface gets when nobody provided one: a bare `<ListView>` in a\n * test, an embedder mounting one listing, and the explorer's own MAIN pane —\n * which keeps using it so that everything already reading the module-level\n * functions below (per-folder view memory, `displayFiles`) is talking about\n * the same state the main pane's controls drive.\n */\nconst defaultStore = createSortStore();\n\nexport const SORT_STORE_KEY: InjectionKey<SortStore> = Symbol('fe-sort-store');\n\n/** Hand this subtree its own sort. Called by the pane component, once. */\nexport function provideSortStore(store: SortStore): void {\n  provide(SORT_STORE_KEY, store);\n}\n\n/**\n * THE store for the surface calling it.\n *\n * ⚠ Must be called during `setup()` (it injects). Surfaces hold the result and\n * read `.key` / `.dir` inside their computeds, which is what subscribes them.\n */\nexport function useSortStore(): SortStore {\n  return inject(SORT_STORE_KEY, defaultStore);\n}\n\n// ── the default store's API, as free functions ────────────────────────\n//\n// Everything below is the module-level API this file shipped with, now a thin\n// pass-through to the default store. Kept — not deprecated — because the sort\n// is genuinely one answer for a host that draws ONE listing, which is every\n// embed except the split view, and because the explorer's per-folder view\n// memory reads and writes exactly this state for its main pane.\n\nexport function activeSortKey(): SortKey {\n  return defaultStore.key.value;\n}\n\nexport function activeSortDir(): SortDir {\n  return defaultStore.dir.value;\n}\n\nexport function setSort(key: SortKey, dir?: SortDir): void {\n  defaultStore.setSort(key, dir);\n}\n\nexport function applySort(key: SortKey, dir: SortDir): void {\n  defaultStore.applySort(key, dir);\n}\n\n/**\n * THE DEFAULT SORT — what a folder nobody has configured opens in: the\n * person's default, else the instance's, else this browser's cached copy of\n * it (until the document lands), else filex's own (Name ↑).\n *\n * ⚠ Once the document has landed the cache is NOT consulted: an account with\n * no default of its own must get filex's default, not whatever the cache held\n * from the last person or the last release.\n */\nexport function defaultSort(): { key: SortKey; dir: SortDir } {\n  const d = defaultFolderView();\n  if (d.k) return { key: d.k, dir: d.d ?? defaultSortDir(d.k) };\n  if (viewPrefsReady()) return { key: DEFAULT_KEY, dir: defaultSortDir(DEFAULT_KEY) };\n  return readStored();\n}\n\n/** ⚠ DEPRECATED name for `defaultSort` — kept so an embedder importing it\n *  keeps compiling. It is no longer \"the last sort a person chose\". */\nexport const globalSort = defaultSort;\n\n/**\n * The account's document landed (or another browser's newer one did): move\n * every store that is still following the DEFAULT onto the resolved one.\n *\n * ⚠⚠ \"Still following\" is the whole subtlety. A store whose sort was restored\n * from a folder's own memory, or chosen in this tab a second ago, must not be\n * yanked — so the move happens only where the store still holds what this\n * browser's cache said, i.e. where nobody has chosen anything since the page\n * opened. (The explorer's main pane is re-applied by the explorer itself,\n * folder memory included; this reaches the other stores.)\n */\nonViewPrefsApplied(() => {\n  const want = defaultSort();\n  for (const store of liveStores) {\n    const was = followed.get(store);\n    if (!was || store.key.value !== was.key || store.dir.value !== was.dir) continue;\n    store.applySort(want.key, want.dir);\n    followed.set(store, { ...want });\n  }\n});\n\nexport function toggleSortDir(): void {\n  defaultStore.toggleSortDir();\n}\n\nexport function chooseSortKey(key: SortKey): void {\n  defaultStore.chooseSortKey(key);\n}\n\n/**\n * The whole rule, in order: folders before files, then the active key.\n *\n * Reading this subscribes the caller to the sort state, so a `computed` built\n * on it re-runs when the key or the direction changes.\n */\nexport function compareNodes(a: FileNode, b: FileNode): number {\n  return defaultStore.compareNodes(a, b);\n}\n\n/**\n * THE comparator for a listing, given where its order came from. Every\n * surface that draws rows asks this one question; none of them re-derives the\n * answer, which is the whole reason this module exists.\n *\n * ⚠⚠ `relevance` is `byFoldersFirst` and NOTHING ELSE — deliberately the\n * exact function `GridView` already sorts by, so the grid needs no knowledge\n * of relevance at all and cannot drift from the list. `web/tests/lib/\n * searchRelevanceOrder.test.ts` asserts that identity; if this ever returns\n * something else, that test goes red and names GridView as the file that has\n * to change in the same commit. Teaching one view about relevance and leaving\n * the other sorting is filex lesson #67 one level up.\n *\n * ⚠ Folders still come FIRST in a ranked set, and that is a decision, not an\n * oversight. Folders-first is not a sort here, it is a GROUPING: the grid\n * draws it as two labelled sections (\"Folders\" / \"Files\"), so a result set\n * that interleaved them would make the grid's own headings false. The ranking\n * is kept in full INSIDE each group — `Array#sort` is stable and this\n * comparator returns 0 for any two rows of the same kind — which is as much\n * relevance as a surface that groups folders can honestly offer. The cost is\n * visible and bounded: a folder that ranked seventh is drawn above the file\n * that ranked first. The alternative costs the grid its sections.\n */\nexport function compareInOrder(order: ListingOrder): (a: FileNode, b: FileNode) => number {\n  return defaultStore.compareInOrder(order);\n}\n\n/**\n * The listing, in its order. A COPY — the caller's array is usually a prop or\n * a computed's source and sorting it in place mutates somebody else's state.\n *\n * `Array#sort` is stable, so rows the comparator calls equal keep the order\n * they arrived in — which is precisely what carries the server's ranking\n * through `relevance` mode.\n *\n * ⚠ `order` defaults to `'sort'`: an omitted argument is how every caller\n * holding an ordinary folder listing asks for the active key, and that is the\n * overwhelming majority of them.\n */\nexport function sortListing(files: FileNode[], order: ListingOrder = 'sort'): FileNode[] {\n  return defaultStore.sortListing(files, order);\n}\n","/**\n * viewPrefsHttp — THE transport `lib/viewPrefs` reads and writes through, in\n * one place for every host.\n *\n * ⚠ Written once because there are two callers now and a copy each would\n * drift (filex lesson #119): the explorer attaches it when it mounts, and the\n * admin app attaches it the moment a person has signed in — the admin panel's\n * tables keep their columns in the same per-person document\n * (`lib/tablePrefs`), and a person can open their settings and change their\n * default folder view without ever having opened the explorer. Whichever\n * attaches first wins; the second call is a no-op (`attachViewPrefsStore`).\n *\n * ⚠ The answer carries TWO things: the person's document (`prefs`) and the\n * operator's default folder view (`instance_default`). The second is handed to\n * `setInstanceFolderDefault` and deliberately NOT returned as part of the\n * document — it is the operator's answer, and folding it into the person's\n * document would save it back as their choice (the palette made exactly that\n * mistake this release; see `setInstanceFolderDefault`).\n */\nimport { attachViewPrefsStore, setInstanceFolderDefault } from './viewPrefs';\n\nexport interface ViewPrefsHttpOptions {\n  /** The server's base URL, '' for same-origin. */\n  apiBase?: string;\n  /** Authorization and friends. May be async (the desktop app fetches its\n   *  credential from the main process per call). ⚠ Awaited — a Promise spread\n   *  into a headers object sends the request with no Authorization at all\n   *  (filex lesson #10). */\n  headers?: () => Record<string, string> | Promise<Record<string, string>>;\n  credentials?: RequestCredentials;\n}\n\nexport function viewPrefsHttpTransport(opts: ViewPrefsHttpOptions) {\n  const url = `${(opts.apiBase ?? '').replace(/\\/+$/, '')}/api/files/manager/view-prefs`;\n  const credentials = opts.credentials ?? 'same-origin';\n  return {\n    async load(): Promise<unknown> {\n      const res = await fetch(url, {\n        headers: { ...((await opts.headers?.()) ?? {}) },\n        credentials,\n      });\n      /* ⚠ A 401 is not an error here, it is an ANSWER: an app token or a\n       * public share link has no person to remember anything for. Null\n       * degrades to \"remember nothing, write nothing\". */\n      if (!res.ok) return null;\n      const body = (await res.json()) as { prefs?: unknown; instance_default?: unknown };\n      setInstanceFolderDefault(body?.instance_default ?? null);\n      return body?.prefs ?? null;\n    },\n    save(doc: unknown): void {\n      void (async () => {\n        try {\n          const payload = JSON.stringify({ prefs: doc });\n          await fetch(url, {\n            method: 'PUT',\n            headers: {\n              ...((await opts.headers?.()) ?? {}),\n              'Content-Type': 'application/json',\n            },\n            credentials,\n            body: payload,\n            /* ⚠ `keepalive` is what lets the save fired on `pagehide` outlive\n             * the page — but browsers reject a keepalive body over 64 KB\n             * outright, so the flag goes only on documents that fit. */\n            keepalive: payload.length < 60000,\n          });\n        } catch {\n          /* Fire and forget: the next save carries the whole document. */\n        }\n      })();\n    },\n  };\n}\n\n/** Attach the HTTP transport (a no-op when one is already attached). */\nexport function attachViewPrefsHttp(opts: ViewPrefsHttpOptions): void {\n  attachViewPrefsStore(viewPrefsHttpTransport(opts));\n}\n","/**\n * tableEnv — the two things every table needs from its HOST and no view\n * should have to pass by hand: the interface language and the light/dark\n * mode.\n *\n * ⚠ Why an injection and not two props on every table. The admin app draws\n * some thirty tables; each one needs the language (the column menu, \"Resize\n * {col}\", the pager, the Actions label) and the light/dark mode (the column\n * menu and the Actions menu teleport to <body>, outside the chrome that paints\n * with `.dark`, so they have to be told). Threading two props through thirty\n * call sites is thirty places for one of them to be forgotten — which is how\n * one table ends up with an English column menu inside a Turkish page. The\n * host provides it ONCE (web/src/App.vue); a prop on a table still wins, and\n * with neither the table falls back to English and the browser's own mode.\n */\nimport { inject, provide, type InjectionKey, type Ref } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\n\nexport interface TableEnv {\n  locale: Ref<LocaleCode>;\n  theme?: Ref<ThemeMode | undefined>;\n}\n\nexport const TABLE_ENV: InjectionKey<TableEnv> = Symbol('fe-table-env');\n\n/** Called once by a host, in its root component's setup. */\nexport function provideTableEnv(env: TableEnv): void {\n  provide(TABLE_ENV, env);\n}\n\n/** The host's answer, or null. Must be called during `setup()`. */\nexport function useTableEnv(): TableEnv | null {\n  return inject(TABLE_ENV, null);\n}\n","/**\n * serviceGate — what an action that needs an OPTIONAL external service\n * (ONLYOFFICE, draw.io…) becomes when that service is missing.\n *\n * ⚠⚠ The owner's rule, 2026-09-21, after `Config fetch 503: {\"error\":\n * \"onlyoffice not configured\"}` was shown to a person who had clicked \"Open\" on\n * a .docx on an install with no document server:\n *\n *     \"disabled with a reason for administrators, hidden for everybody else\"\n *\n * An administrator CAN fix it, so a greyed entry that says what is missing and\n * where to set it up is useful to them. For everybody else it is a button that\n * can never work and only invites a click, so it is not offered at all. And\n * nobody, ever, is shown a raw status or a JSON body.\n *\n * ⚠ One function, so every entry that depends on a service answers the same\n * way (filex lesson #67: a rule written twice drifts the first time one copy is\n * touched). \"Is this caller an administrator\" is the server's answer\n * (`capabilities.caller_admin` — the same checks the admin routes apply,\n * supertenant included), never a guess made in the browser.\n */\n\nimport { isExternalUsable, type ExternalServiceStatus } from '../types/FileNode';\n\n/** The fields a `ContextAction` takes from the gate. */\nexport interface ServiceGate {\n  hidden?: boolean;\n  disabled?: boolean;\n  title?: string;\n}\n\n/**\n * `available` — the service is configured and healthy.\n * `callerAdmin` — this caller could go and configure it.\n * `reason` — the sentence an administrator reads (what is missing, where to\n * fix it), already translated.\n */\nexport function gateOnService(available: boolean, callerAdmin: boolean, reason: string): ServiceGate {\n  if (available) return {};\n  if (callerAdmin) return { disabled: true, title: reason };\n  return { hidden: true };\n}\n\n/*\n * \"Is this an office document\" is not answered here any more: the list that\n * stood here (ten extensions) disagreed with the explorer's own (nine) and\n * with the server's (`.docm`, `.xlsm`, `.pptm`, `.ppsx`, `.xlsb` were not\n * office documents to the menu). The server publishes the rule\n * (`capabilities.edit_kinds`) and lib/serverRules `isOfficeExt` reads it\n * (filex #211, audit B2).\n */\n\n/** What the capabilities answer says about the document server. */\nexport interface OnlyOfficeCaps {\n  onlyoffice_url?: string | null;\n  external?: { onlyoffice?: ExternalServiceStatus };\n}\n\n/**\n * ONLYOFFICE is configured and answering, by the capabilities answer: the\n * probe did not fail (`external.onlyoffice`) and there is an address. The\n * explorer reads the same two fields (FileExplorer effectiveOnlyOfficeBase),\n * so \"Open with ONLYOFFICE\" means the same thing in Settings.\n */\nexport function onlyOfficeUsable(caps: OnlyOfficeCaps | null | undefined): boolean {\n  if (!caps) return false;\n  const st = caps.external?.onlyoffice;\n  if (st && !isExternalUsable(st)) return false;\n  return !!caps.onlyoffice_url;\n}\n","/**\n * Which kinds of sharing the account may use on one item — the three sharing\n * permissions of filex `internal/perm`, each answered where it applies.\n *\n * ⚠ One answer for every door that makes a link or a grant. \"+ New → Request\n * files\", the share dialog's link and file-request sections, the details\n * panel's \"Create link\" and the Share action itself all read it, so a role\n * without `share.upload_links` is not offered a file request in one place and\n * refused it by the server in another (0.49.0: the New menu still offered it).\n *\n *   - `links`       — `share.links`: a public download link;\n *   - `uploadLinks` — `share.upload_links`: a file request (a drop link, folders only);\n *   - `users`       — `share.users`: giving people with accounts access.\n *\n * `held` is the explorer's own question (`permHeldAt`), so a permission that\n * differs from folder to folder is answered for THIS item's folder. When the\n * account's permissions are not known the explorer answers yes to all three,\n * and the server decides, as it always did.\n */\nexport interface SharingHeld {\n  links: boolean;\n  uploadLinks: boolean;\n  users: boolean;\n}\n\n/** The permission key behind each kind (filex internal/perm). */\nexport const SHARING_PERMS = {\n  links: 'share.links',\n  uploadLinks: 'share.upload_links',\n  users: 'share.users',\n} as const;\n\n/** Nothing narrowed: what a caller that passes no answer gets. */\nexport const ALL_SHARING: SharingHeld = Object.freeze({ links: true, uploadLinks: true, users: true });\n\n/** The three answers, from the explorer's permission question. */\nexport function sharingHeld(held: (perm: string) => boolean): SharingHeld {\n  return {\n    links: held(SHARING_PERMS.links),\n    uploadLinks: held(SHARING_PERMS.uploadLinks),\n    users: held(SHARING_PERMS.users),\n  };\n}\n\n/**\n * Is there anything to share on this item — is the Share action worth\n * offering? A file cannot take a file request, so `share.upload_links` alone\n * opens nothing on a file.\n */\nexport function canShareAny(s: SharingHeld, isDir: boolean): boolean {\n  return s.links || s.users || (isDir && s.uploadLinks);\n}\n","/**\n * #162 - whether the navigation panel draws its \"Apps → App store\" row: ONE\n * rule, for every host that mounts the explorer (the web SPA's Explore page,\n * the desktop app's window, any embed), so no host writes a second one.\n *\n * The row is drawn when all three hold:\n *   - the HOST has the store screen as a page of its own and handles\n *     `@open-app-store` (`config.appStorePage`) - the explorer cannot give a\n *     host a page, only announce that one was asked for;\n *   - the caller is a PERSON: an app token (an embed's integration) asks for\n *     no app;\n *   - the SERVER shows this person the screen (`GET /api/app-store` →\n *     `visible`): the administrator's setting for their tenant, their role and\n *     groups - decided there, never guessed here. No answer (an older server,\n *     a refusal, the network) is no.\n */\n\nexport interface AppStoreStatus {\n  visible: boolean;\n}\n\n/** Whether the server is worth asking at all (host has the page, a person). */\nexport function appStoreAsks(hostHasPage: boolean, callerIsApp: boolean): boolean {\n  return hostHasPage && !callerIsApp;\n}\n\n/** Whether the row is drawn, given the server's answer (null: none). */\nexport function appStoreRowShown(hostHasPage: boolean, callerIsApp: boolean, status: AppStoreStatus | null | undefined): boolean {\n  return appStoreAsks(hostHasPage, callerIsApp) && status?.visible === true;\n}\n","/**\n * e2eLinks - may the explorer offer Share (a public link or a file request)\n * for these rows? wiring:e2\n *\n * Never for an end-to-end encrypted folder or anything inside one: a link\n * hands a visitor ciphertext they cannot open (and the folder's key file with\n * it), and a file request stores their uploads in the folder unencrypted. The\n * server refuses both with 409 E2E_ENCRYPTED on every door\n * (backend publicLinkRefusal); this is the same rule on the client, so the\n * menu does not offer what the server will refuse.\n *\n * \"Inside one\" is told three ways, all of which the server already sends: the\n * listing the rows came from is an encrypted folder (`insideEncrypted`, the\n * explorer's e2eActive), a row IS one (`e2e: true`, the folder badge in its\n * parent's listing), or a row from Recent, Starred, a tag view or a search\n * names the folder it sits in (`e2e_root`).\n *\n * A single encrypted file (`.fxe`) outside any folder is NOT refused: it\n * carries its own key slots, and its recipient opens it with its password\n * (docs/E2E-ENCRYPTION.md, \"Single encrypted files\").\n */\nexport interface E2eLinkRow {\n  e2e?: boolean;\n  e2e_root?: string;\n}\n\nexport function publicLinksOff(rows: readonly E2eLinkRow[], insideEncrypted: boolean): boolean {\n  if (insideEncrypted) return true;\n  return rows.some((r) => r.e2e === true || (typeof r.e2e_root === 'string' && r.e2e_root !== ''));\n}\n","/**\n * jobOpen - where a finished app job sends the person who queued it.\n *\n * ⚠⚠ filex #78. A job's result may name a screen on one of the files the job\n * produced (`surface.open` on `ActionRunOutput`; the server resolves it to\n * the output's real, adapter-qualified path and puts it on the ops row as\n * `open`). The case that found it was the signing app's \"Convert to PDF\"\n * (filex-sign 0.2; the app signs PDFs only since 0.3): the conversion landed\n * a PDF, and the wizard had to go on ON THE PDF. Before it, the page said\n * \"the job is queued\" for good and the person had to find the PDF and ask\n * for signatures a second time - a wizard that \"does not work\".\n *\n * ONE answer for every frame that follows a job: the full page that queued\n * it (PluginPageView) and the explorer whose dialog queued it (FileExplorer's\n * own registered jobs). Two copies of \"is this row telling me to go\n * somewhere?\" is how one frame comes to follow a failed job's mark and the\n * other not.\n *\n * ⚠ Only a FINISHED app job, only with a request the client can act on, and\n * never over a screen the person opened since (`busy`): a job that ends while\n * somebody is in another dialog does not get to take that dialog away.\n */\nimport type { PendingOp } from '../composables/usePendingOps';\nimport type { SurfaceOpenRequest } from '../types/Plugins';\nimport { isOpenRequest } from './surfaceOpen';\n\nexport interface JobOpen {\n  /** The app that ran the job - the screen named is one of ITS own. */\n  plugin: string;\n  open: SurfaceOpenRequest;\n}\n\nexport function jobOpenOf(\n  op: Pick<PendingOp, 'op_type' | 'status' | 'plugin' | 'open'>,\n  opts: { busy?: boolean } = {},\n): JobOpen | null {\n  if (opts.busy) return null;\n  if (op.op_type !== 'plugin' || op.status !== 'done') return null;\n  if (!op.plugin || !isOpenRequest(op.open)) return null;\n  return { plugin: op.plugin, open: op.open };\n}\n","/**\n * uiProfile — how much of the explorer to draw. Two names, and one rule for\n * everything that is not one of them.\n *\n * ⚠⚠ The profile is a REDUCTION switch, never a LOOK switch. The shell — the\n * header with its one search field, the filter row, \"+ New\", the Folders /\n * Files sections, the info panel's tabs, the storage line — is what filex IS;\n * nothing reads a profile to decide whether to draw it. `'simple'` turns OFF\n * the tab strip, the split pane, the gallery view mode and the panel's\n * \"How to connect\" / \"API keys\" entries, and removes nothing from the build.\n *\n * ⚠⚠ WHY THERE IS A RESOLVER AND NOT A UNION CHECK AT EACH CALL SITE. This\n * value comes from OUTSIDE: a `config` object typed by an embedder who may not\n * use TypeScript at all, or a `ui-profile=\"…\"` attribute on a custom element,\n * which is a string the DOM will hand over unexamined. So \"what does an\n * unrecognised value mean\" is a real question with real users behind it, and\n * it is answered here, once, instead of by whatever each reader's `===` chain\n * happened to fall through to.\n *\n * THE ANSWER: `'simple'` and nothing else turns the reduction on. Every other\n * value — `'standard'`, `undefined`, a typo, a name a later version knows and\n * this one does not — is `'standard'`, the documented default, and a string we\n * did not recognise is said out loud once in the console.\n *\n * ⚠ WHICH RETIRES `'drive'`, deliberately and with its cost stated. It shipped\n * as a third profile in v0.32.0 and became an alias of `'simple'` in v0.40.0;\n * the owner's ruling on 2026-09-13 was to take it out (\"kaldıralım direk\").\n * filex is open source, so an embed somewhere may still be passing it, and\n * what that embed gets is now the FULL explorer rather than the reduced one —\n * it gains the tab strip, the split pane, the gallery mode and the connection\n * guides. That is a visible change in one direction and a one-word fix\n * (`uiProfile: 'simple'`), and it is the honest one: mapping the retired name\n * onto `'simple'` here would be the alias again, wearing a resolver's coat,\n * and it would also mean a plain typo silently REDUCED somebody's UI — a\n * failure that looks like features going missing and points at nothing. The\n * console line names the value so the fix takes a search rather than a bisect.\n */\n\n/** The two profiles. There is no third, and no alias of either. */\nexport type UiProfile = 'standard' | 'simple';\n\n/** Both of them, as data — so a doc, a test and a resolver cannot disagree\n *  about how many there are. */\nexport const UI_PROFILES: readonly UiProfile[] = ['standard', 'simple'] as const;\n\n/** The one this package draws when nobody says otherwise. */\nexport const DEFAULT_UI_PROFILE: UiProfile = 'standard';\n\n/* One line per distinct offending value, not one per render: this is read\n * inside a `computed` that re-runs whenever the config object changes. */\nconst warned = new Set<string>();\n\n/**\n * The profile to draw for whatever the host passed.\n *\n * `undefined` / `null` / `''` are \"nothing was passed\" and resolve to the\n * default in silence. Any OTHER unrecognised value is a mistake worth a line\n * in the console, because it means somebody asked for something by name and\n * got something else.\n */\nexport function resolveUiProfile(value: unknown): UiProfile {\n  if (value === 'simple') return 'simple';\n  if (value === 'standard' || value === undefined || value === null || value === '') {\n    return DEFAULT_UI_PROFILE;\n  }\n  const seen = typeof value === 'string' ? value : String(value);\n  if (!warned.has(seen) && typeof console !== 'undefined') {\n    warned.add(seen);\n    console.warn(\n      `[filex] unknown uiProfile ${JSON.stringify(seen)} - using \"${DEFAULT_UI_PROFILE}\". ` +\n        `Valid values: ${UI_PROFILES.map((p) => `\"${p}\"`).join(', ')}. ` +\n        `(The former \"drive\" profile was removed; pass \"simple\" for the reduced explorer.)`,\n    );\n  }\n  return DEFAULT_UI_PROFILE;\n}\n\n/** Test seam — the console line is once per value per page, so a suite that\n *  asserts on it has to be able to start over. Not used by the app. */\nexport function __resetUiProfileWarnings(): void {\n  warned.clear();\n}\n","/**\n * useE2eNames — the \"name view\" of encrypted folders: turns the ciphertext\n * names the server stores into the plaintext names people see, for EVERY\n * surface that draws a row or a path (folder listing, split pane, breadcrumb,\n * Recent, Starred, tags, Home, trash, search, the destination picker, the\n * recently-opened tray). One instance per explorer, provided to its children,\n * so the web app, the desktop app and every embed decrypt names the same way\n * (docs/E2E-ENCRYPTION.md → \"Encrypted names\").\n *\n * ── The contract a decorated row keeps ────────────────────────────────\n *\n *   path            UNCHANGED — the wire path the server knows. Every API\n *                   call keeps using it.\n *   basename        the PLAINTEXT name (or an honest placeholder when the\n *                   folder is locked). Everything that draws, sorts, filters\n *                   or picks an icon reads this.\n *   extension       recomputed from the plaintext name.\n *   e2e_stored      the name the server stores. Anything that SENDS a name\n *                   to the server (rename undo, presence, realtime) must use\n *                   this — `storedName(n)` — never `basename`.\n *   e2e_name_state  'enc' | 'plain' | 'unreadable' | 'locked'.\n *   e2e_root        the encrypted root the row sits in.\n *   e2e_display_dir the plaintext parent folder (adapter-stripped), for the\n *                   Location column and search hits.\n *\n * Decorating is idempotent (a decorated row is recognised by `e2e_stored`)\n * and a content-only folder (marker v1/v2) comes back untouched.\n *\n * ⚠ Nothing here sends a plaintext name anywhere. The only requests are\n * reads of the marker and of long-name sidecars, by their stored paths.\n */\n\nimport { ref, type InjectionKey, type Ref } from 'vue';\n\nimport type { FileNode } from '../types/FileNode';\nimport {\n  E2E_MARKER_NAME,\n  markerHasNames,\n  parseMarkerDetailed,\n  type E2eKeyRing,\n  type E2eMarker,\n} from '../lib/e2ecrypto';\nimport {\n  classifyStoredName,\n  decryptStoredName,\n  effectiveDirId,\n  encryptName,\n  extensionOf,\n  type DecodedName,\n  type E2eNameKey,\n  type EncryptedName,\n} from '../lib/e2enames';\n\nexport type E2eNameState = 'enc' | 'plain' | 'unreadable' | 'locked';\n\nexport interface E2eNameViewApi {\n  fetchBlob(path: string, opts?: { fresh?: boolean }): Promise<{ blob: Blob; url: string }>;\n  fetchArrayBuffer(path: string): Promise<ArrayBuffer>;\n}\n\nexport interface E2eNameViewOptions {\n  api: E2eNameViewApi;\n  ring: E2eKeyRing;\n  /** Label for an item whose folder is locked (\"🔒 Encrypted item\"). */\n  lockedLabel: () => string;\n  /** Label for an item whose name could not be read. */\n  unreadableLabel: () => string;\n  /** wiring:e2 fxe — the original name of a single encrypted file opened in\n   *  this tab (useE2eFiles), keyed by its path; undefined when not known. */\n  fileName?: (path: string) => string | undefined;\n}\n\n/** Wire-path helpers — `<adapter>://<rel>`. */\nexport function wireJoinPath(dir: string, name: string): string {\n  if (!dir) return name;\n  return dir.endsWith('://') || dir.endsWith('/') ? dir + name : `${dir}/${name}`;\n}\n\nexport function wireParentPath(p: string): string {\n  const idx = p.indexOf('://');\n  const prefix = idx === -1 ? '' : p.slice(0, idx + 3);\n  const rel = (idx === -1 ? p : p.slice(idx + 3)).replace(/\\/+$/, '');\n  const slash = rel.lastIndexOf('/');\n  return slash === -1 ? prefix : prefix + rel.slice(0, slash);\n}\n\nexport function wireBaseName(p: string): string {\n  const idx = p.indexOf('://');\n  const rel = (idx === -1 ? p : p.slice(idx + 3)).replace(/\\/+$/, '');\n  const slash = rel.lastIndexOf('/');\n  return slash === -1 ? rel : rel.slice(slash + 1);\n}\n\nfunction trimWire(p: string): string {\n  const idx = p.indexOf('://');\n  if (idx === -1) return p.replace(/^\\/+|\\/+$/g, '');\n  return p.slice(0, idx + 3) + p.slice(idx + 3).replace(/^\\/+|\\/+$/g, '');\n}\n\nfunction stripAdapter(p: string): string {\n  const idx = p.indexOf('://');\n  return idx === -1 ? p : p.slice(idx + 3);\n}\n\n/** Is `path` strictly below `root` (both wire form)? */\nexport function isBelowRoot(path: string, root: string): boolean {\n  const p = trimWire(path);\n  const r = trimWire(root);\n  if (!r) return false;\n  const base = r.endsWith('://') ? r : `${r}/`;\n  return p.length > base.length && p.startsWith(base);\n}\n\n/** The stored segments of `path` below `root`. */\nfunction segmentsBelow(path: string, root: string): string[] {\n  const p = trimWire(path);\n  const r = trimWire(root);\n  const base = r.endsWith('://') ? r : `${r}/`;\n  return p.slice(base.length).split('/').filter(Boolean);\n}\n\n/** The name the server stores for a row — use this for anything SENT to the server. */\nexport function storedName(n: { basename: string; e2e_stored?: unknown }): string {\n  return typeof n.e2e_stored === 'string' ? n.e2e_stored : n.basename;\n}\n\n/** Display form of a row's parent folder (plaintext below an encrypted root). */\nexport function displayParentDir(n: FileNode, fallback: (path: string) => string): string {\n  return typeof n.e2e_display_dir === 'string' ? n.e2e_display_dir : fallback(n.path);\n}\n\nexport function createE2eNameView(opts: E2eNameViewOptions) {\n  const { api, ring } = opts;\n  /** Bumped whenever something a label depends on changes. */\n  const version: Ref<number> = ref(0);\n  const markers = new Map<string, Promise<{ marker: E2eMarker | null; unsupported: string[] }>>();\n  const markerValues = new Map<string, E2eMarker | null>();\n  /** root → stored-name (with parent context for long names) → decoded. */\n  const plain = new Map<string, Map<string, DecodedName>>();\n  const pendingSegments = new Set<string>();\n\n  function bump() {\n    version.value++;\n  }\n\n  // ── markers ──────────────────────────────────────────────────────────\n\n  async function loadMarker(root: string) {\n    try {\n      const { blob, url } = await api.fetchBlob(wireJoinPath(root, E2E_MARKER_NAME), { fresh: true });\n      URL.revokeObjectURL(url);\n      const parsed = parseMarkerDetailed(await blob.text());\n      const value = parsed ? { marker: parsed.marker, unsupported: parsed.unsupported } : { marker: null, unsupported: [] };\n      markerValues.set(root, value.marker);\n      return value;\n    } catch {\n      markerValues.set(root, null);\n      return { marker: null, unsupported: [] as string[] };\n    }\n  }\n\n  /** The folder's marker, fetched once per root (see `setMarker`/`forget`). */\n  async function markerFor(root: string): Promise<E2eMarker | null> {\n    const key = trimWire(root);\n    let p = markers.get(key);\n    if (!p) {\n      p = loadMarker(key);\n      markers.set(key, p);\n    }\n    return (await p).marker;\n  }\n\n  /** Known synchronously? `undefined` = not fetched yet. */\n  function markerCached(root: string): E2eMarker | null | undefined {\n    const key = trimWire(root);\n    return markerValues.has(key) ? markerValues.get(key)! : undefined;\n  }\n\n  /** Adopt a marker the client just wrote (or just read to unlock). */\n  function setMarker(root: string, marker: E2eMarker | null) {\n    const key = trimWire(root);\n    markerValues.set(key, marker);\n    markers.set(key, Promise.resolve({ marker, unsupported: [] }));\n    bump();\n  }\n\n  /** Forget everything about a root: its marker and every plaintext name. */\n  function forget(root: string) {\n    const key = trimWire(root);\n    markers.delete(key);\n    markerValues.delete(key);\n    plain.delete(key);\n    for (const k of [...dirIds.keys()]) if (k.startsWith(`${key}|`)) dirIds.delete(k);\n    bump();\n  }\n\n  function namesOn(root: string): boolean {\n    return markerHasNames(markerCached(root) ?? null);\n  }\n\n  // ── roots ────────────────────────────────────────────────────────────\n\n  /** The unlocked (or otherwise known) encrypted root a wire path sits under. */\n  function rootOf(path: string, hint?: string | null): string | null {\n    if (hint && isBelowRoot(path, hint)) return trimWire(hint);\n    let best: string | null = null;\n    const candidates = new Set<string>([...ring.roots(), ...markerValues.keys()]);\n    for (const r of candidates) {\n      if (isBelowRoot(path, r) && (!best || r.length > best.length)) best = trimWire(r);\n    }\n    return best;\n  }\n\n  // ── names ────────────────────────────────────────────────────────────\n\n  function cacheFor(root: string): Map<string, DecodedName> {\n    const key = trimWire(root);\n    let m = plain.get(key);\n    if (!m) {\n      m = new Map();\n      plain.set(key, m);\n    }\n    return m;\n  }\n\n  /** Folder ids by wire path (the root's comes from the key). */\n  const dirIds = new Map<string, Promise<Uint8Array>>();\n\n  /**\n   * The id names directly inside `dirWire` are sealed under: the root's own\n   * id, the id a folder's stored name carries, or — for a folder whose name\n   * was never encrypted — the one it will carry (lib/e2enames\n   * `effectiveDirId`). Walks up the path, once per folder.\n   */\n  function parentIdOf(nk: E2eNameKey, root: string, dirWire: string): Promise<Uint8Array> {\n    const d = trimWire(dirWire);\n    const r = trimWire(root);\n    if (d === r || !isBelowRoot(d, r)) return Promise.resolve(nk.rootId);\n    const key = `${r}|${d}`;\n    let p = dirIds.get(key);\n    if (!p) {\n      p = parentIdOf(nk, root, wireParentPath(d)).then((up) => effectiveDirId(nk, up, wireBaseName(d)));\n      dirIds.set(key, p);\n    }\n    return p;\n  }\n\n  /**\n   * Decode one stored name. Cached by its full path: the same stored name\n   * means different things in different folders.\n   */\n  const inflight = new Map<string, Promise<DecodedName>>();\n\n  function decode(nk: E2eNameKey, root: string, parentWire: string, stored: string): Promise<DecodedName> {\n    const cache = cacheFor(root);\n    const key = `${trimWire(parentWire)}/${stored}`;\n    const hit = cache.get(key);\n    if (hit) return Promise.resolve(hit);\n    // One decryption per name even when a whole listing asks at once.\n    const fk = `${trimWire(root)}|${key}`;\n    const running = inflight.get(fk);\n    if (running) return running;\n    const p = parentIdOf(nk, root, parentWire).then((parentId) => decryptStoredName(nk, stored, parentId, async (sidecar) => {\n      try {\n        const buf = await api.fetchArrayBuffer(wireJoinPath(parentWire, sidecar));\n        return new TextDecoder().decode(buf);\n      } catch {\n        return null;\n      }\n    }))\n      .then((out) => {\n        // A long name whose sidecar is not there YET (an upload in flight)\n        // must not be remembered as unreadable forever.\n        if (out.state !== 'unreadable') cache.set(key, out);\n        return out;\n      })\n      .finally(() => inflight.delete(fk));\n    inflight.set(fk, p);\n    return p;\n  }\n\n  /** Remember a name we just produced, so it shows without a round trip. */\n  function remember(root: string, parentWire: string, enc: EncryptedName, name: string) {\n    cacheFor(root).set(`${trimWire(parentWire)}/${enc.stored}`, { name, state: 'enc' });\n    bump();\n  }\n\n  /**\n   * The plaintext of every segment of `path` below `root`, or null for one\n   * that is locked / unreadable. Fetches long-name sidecars as needed.\n   */\n  async function decodePath(root: string, path: string): Promise<(string | null)[]> {\n    const nk = ring.names(root);\n    const segs = segmentsBelow(path, root);\n    if (!nk) return segs.map(() => null);\n    const out: (string | null)[] = [];\n    let parent = trimWire(root);\n    for (const s of segs) {\n      const d = await decode(nk, root, parent, s);\n      out.push(d.name);\n      parent = wireJoinPath(parent, s);\n    }\n    return out;\n  }\n\n  /** The decoded last segment of `wire` (null: not inside a names root, or locked). */\n  async function plainNameOf(wire: string): Promise<DecodedName | null> {\n    const root = rootOf(wire);\n    if (!root) return null;\n    const nk = ring.names(root);\n    if (!nk) return null;\n    return decode(nk, root, wireParentPath(wire), wireBaseName(wire));\n  }\n\n  /** Plaintext relative path of `path`'s parent folder (adapter stripped). */\n  async function displayDirOf(root: string, path: string): Promise<string> {\n    const rootRel = stripAdapter(trimWire(root));\n    const segs = await decodePath(root, wireParentPath(path));\n    const below = segs.map((s) => (s === null ? opts.lockedLabel() : s));\n    return [rootRel, ...below].filter(Boolean).join('/');\n  }\n\n  /**\n   * Decorate rows for display. `root` is the listing-level encrypted root\n   * (a folder listing's `e2e_root`); rows from other views carry their own\n   * `e2e_root`, or are matched against the roots this tab has unlocked.\n   */\n  async function decorate(rows: FileNode[], ctx: { root?: string | null } = {}): Promise<FileNode[]> {\n    // ⚠ The listing's own root is learned even when the listing is EMPTY:\n    // `writesEncrypted` answers from what is known, and a new folder or an\n    // upload into an empty encrypted-names folder must be encrypted too.\n    if (ctx.root) await markerFor(ctx.root);\n    const done = await Promise.all(rows.map((r) => decorateOne(r, ctx.root ?? null)));\n    return done.filter((r): r is FileNode => r !== null);\n  }\n\n  async function decorateOne(r: FileNode, listingRoot: string | null): Promise<FileNode | null> {\n    /* wiring:e2 fxe — a `.fxe` opened in this tab shows its real name. */\n    const fxe = r.type === 'file' ? opts.fileName?.(r.path) : undefined;\n    if (fxe) r = { ...r, fxe_name: fxe };\n    const hint = (typeof r.e2e_root === 'string' && r.e2e_root) || listingRoot;\n    const root = rootOf(r.path, hint);\n    if (!root) return r;\n    const marker = await markerFor(root);\n    if (!markerHasNames(marker)) return r;\n    const stored = storedName(r);\n    if (stored === E2E_MARKER_NAME) return null;\n    const cls = classifyStoredName(stored);\n    if (cls.kind === 'sidecar') return null;\n    const nk = ring.names(root);\n    const displayDir = await displayDirOf(root, r.path);\n    const base = { ...r, e2e_stored: stored, e2e_root: root, e2e_display_dir: displayDir };\n    if (!nk) {\n      return { ...base, basename: opts.lockedLabel(), extension: '', e2e_name_state: 'locked' as E2eNameState };\n    }\n    const d = await decode(nk, root, wireParentPath(r.path), stored);\n    if (d.state === 'enc' && d.name !== null) {\n      return {\n        ...base,\n        basename: d.name,\n        extension: r.type === 'dir' ? '' : extensionOf(d.name),\n        e2e_name_state: 'enc' as E2eNameState,\n      };\n    }\n    if (d.state === 'plain') {\n      return { ...base, basename: stored, e2e_name_state: 'plain' as E2eNameState };\n    }\n    return { ...base, basename: opts.unreadableLabel(), extension: '', e2e_name_state: 'unreadable' as E2eNameState };\n  }\n\n  /**\n   * Synchronous label for one breadcrumb / tab segment: the plaintext when\n   * it is known, a locked placeholder when the folder is locked, and null\n   * when `wire` is not below an encrypted-names root (use the raw segment).\n   * An unknown segment is resolved in the background and `version` bumps.\n   */\n  function segmentLabel(wire: string): string | null {\n    void version.value;\n    const root = rootOf(wire);\n    if (!root) return null;\n    const m = markerCached(root);\n    if (m === undefined) {\n      void markerFor(root).then(bump);\n      return null;\n    }\n    if (!markerHasNames(m)) return null;\n    const nk = ring.names(root);\n    if (!nk) return opts.lockedLabel();\n    const stored = wireBaseName(wire);\n    const parent = wireParentPath(wire);\n    const key = `${trimWire(parent)}/${stored}`;\n    const hit = cacheFor(root).get(key);\n    if (hit) return hit.name ?? opts.unreadableLabel();\n    const pk = `${root}|${key}`;\n    if (!pendingSegments.has(pk)) {\n      pendingSegments.add(pk);\n      void decode(nk, root, parent, stored).finally(() => {\n        pendingSegments.delete(pk);\n        bump();\n      });\n    }\n    return '…';\n  }\n\n  /** Plaintext form of a whole wire path (adapter stripped) — best effort, sync. */\n  function displayPath(wire: string): string {\n    void version.value;\n    const root = rootOf(wire);\n    if (!root || !namesOn(root)) return stripAdapter(trimWire(wire));\n    const rootRel = stripAdapter(trimWire(root));\n    const segs = segmentsBelow(wire, root);\n    const out: string[] = [];\n    let acc = trimWire(root);\n    for (const s of segs) {\n      acc = wireJoinPath(acc, s);\n      out.push(segmentLabel(acc) ?? s);\n    }\n    return [rootRel, ...out].filter(Boolean).join('/');\n  }\n\n  // ── writing names ────────────────────────────────────────────────────\n\n  /**\n   * Is a NEW name written into `dirWire` to be encrypted? True when the\n   * folder is (inside) an encrypted root whose names are encrypted. The\n   * encrypted root's own folder is `dirWire === root`, which counts.\n   */\n  function writesEncrypted(dirWire: string): string | null {\n    const d = trimWire(dirWire);\n    for (const r of new Set<string>([...ring.roots(), ...markerValues.keys()])) {\n      const rr = trimWire(r);\n      if ((d === rr || isBelowRoot(d, rr)) && namesOn(rr)) return rr;\n    }\n    return null;\n  }\n\n  /**\n   * The stored name for a plaintext name written into `dirWire`. Throws when\n   * the folder's names are encrypted but it is locked — a caller must never\n   * fall back to sending the plaintext.\n   *\n   * A folder needs its id: a NEW folder (`isDir`) gets the derived one; a\n   * folder being renamed or moved passes `keepIdOf` — its current wire path —\n   * and keeps the id its contents are sealed under (`dirIdFor`).\n   */\n  async function nameForWrite(\n    dirWire: string,\n    plainName: string,\n    opts: { isDir?: boolean; keepIdOf?: string } = {},\n  ): Promise<EncryptedName | null> {\n    const root = writesEncrypted(dirWire);\n    if (!root) return null;\n    const nk = ring.names(root);\n    if (!nk) throw new Error('e2e: the folder is locked');\n    const parentId = await parentIdOf(nk, root, dirWire);\n    const dirId = opts.keepIdOf ? await parentIdOf(nk, root, opts.keepIdOf) : undefined;\n    const enc = await encryptName(nk, plainName, parentId, { isDir: opts.isDir, dirId });\n    remember(root, dirWire, enc, plainName.normalize('NFC'));\n    return enc;\n  }\n\n  /** The id a folder's contents are sealed under (see parentIdOf). */\n  async function dirIdFor(dirWire: string): Promise<Uint8Array | null> {\n    const root = rootOf(dirWire) ?? writesEncrypted(dirWire);\n    if (!root) return null;\n    const nk = ring.names(root);\n    if (!nk) return null;\n    return parentIdOf(nk, root, dirWire);\n  }\n\n  return {\n    version,\n    markerFor,\n    markerCached,\n    setMarker,\n    forget,\n    namesOn,\n    rootOf,\n    decorate,\n    decodePath,\n    plainNameOf,\n    segmentLabel,\n    displayPath,\n    writesEncrypted,\n    nameForWrite,\n    dirIdFor,\n    remember,\n    bump,\n  };\n}\n\nexport type E2eNameView = ReturnType<typeof createE2eNameView>;\n\n/** Provided by FileExplorer; injected by the panes, pickers and trays it hosts. */\nexport const E2E_NAME_VIEW: InjectionKey<E2eNameView> = Symbol('filex.e2eNameView');\n","<script setup lang=\"ts\">\n/**\n * RecentlyOpened — drop-down/sidebar tray of the user's recently-opened\n * files. Backed by `GET /api/files/manager/recent?limit=20`.\n */\nimport { inject, ref, onMounted, watch } from 'vue';\nimport { E2E_NAME_VIEW } from '../composables/useE2eNames';\nimport type { FileNode } from '../types/FileNode';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { localeTag, useLocale } from '../composables/useLocale';\n\ninterface RecentNode {\n  id: number;\n  storage_id: number;\n  path: string;\n  name: string;\n  mime?: string;\n  last_opened?: string;\n  /** The raw row carries more (`storage`, `perm`, `read_only`, `type`,\n   *  the mtimes…) — the explorer turns it into a FileNode for the context\n   *  menu with the same converter Recent / Starred / a tag view use. */\n  [k: string]: unknown;\n}\n\nconst props = defineProps<{\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  /** Credentials mode, from the explorer's auth kind. ⚠ Defaults to\n   *  'same-origin': a credentialed cross-origin request cannot be answered\n   *  with ACAO:* , so hardcoding 'include' broke this call in every embed\n   *  served from a different origin to the API. */\n  authCredentials?: RequestCredentials;\n  limit?: number;\n  /** Optional refresh trigger — incrementing this re-fetches. */\n  refreshKey?: number | string;\n  /**\n   * The explorer's language. ⚠ This tray printed English whatever the\n   * explorer spoke (\"Recently opened\", \"5m ago\") — strings no language pack\n   * could reach. Absent = English.\n   */\n  locale?: string;\n}>();\n\nconst { t } = useLocale(() => props.locale ?? 'en');\n\nconst emit = defineEmits<{\n  (e: 'open', node: RecentNode): void;\n  /** Right-click on a row. The tray does not build a menu of its own — the\n   *  explorer opens the ONE menu every listing row gets (owner: \"CONTEXT\n   *  MENÜ HER YERDE AYNI OLMALI\"), so a file here offers exactly what the\n   *  same file offers in its folder. */\n  (e: 'context', node: RecentNode, ev: MouseEvent): void;\n  (e: 'error', message: string): void;\n}>();\n\nconst items = ref<RecentNode[]>([]);\nconst loading = ref(false);\n/* wiring:e2 names — a file opened inside an encrypted folder is named by the\n * explorer's name view: plaintext while its folder is unlocked, \"🔒 Encrypted\n * item\" while it is not. The row itself (and what is emitted) is untouched. */\nconst e2eNameView = inject(E2E_NAME_VIEW, null);\nconst shownNames = ref<Record<number, string>>({});\nasync function nameRows(rows: RecentNode[]) {\n  if (!e2eNameView) return;\n  const nodes = rows.map((r) => ({\n    id: r.id,\n    type: r.type === 'dir' ? 'dir' : 'file',\n    path:\n      typeof r.storage === 'string' && r.storage\n        ? `${r.storage}://${String(r.path).replace(/^\\/+/, '')}`\n        : String(r.path),\n    basename: r.name,\n    ...(typeof r.e2e_root === 'string' && r.e2e_root ? { e2e_root: r.e2e_root } : {}),\n  })) as unknown as FileNode[];\n  const named = await e2eNameView.decorate(nodes);\n  const keep = new Set(named.map((n) => n.id));\n  const map: Record<number, string> = {};\n  for (const n of named) if (typeof n.id === 'number' && n.e2e_stored) map[n.id] = n.basename;\n  shownNames.value = map;\n  // The key file and long-name sidecars are bookkeeping, never \"recent\".\n  if (keep.size !== rows.length) items.value = rows.filter((r) => keep.has(r.id));\n}\nif (e2eNameView) watch(e2eNameView.version, () => void nameRows(items.value));\n\nasync function load() {\n  loading.value = true;\n  try {\n    const headers = await (props.authHeaders ?? (() => ({})))();\n    const base = props.apiBase ?? '';\n    const limit = props.limit ?? 20;\n    const res = await fetch(`${base}/api/files/manager/recent?limit=${limit}`, {\n      headers,\n      credentials: props.authCredentials ?? 'same-origin',\n    });\n    if (res.ok) {\n      const body = await res.json();\n      // ⚠ `nodes` is what the endpoint actually answers with; this read `entries`\n      // only, so the tray was empty on every server that ever served it.\n      items.value = Array.isArray(body.nodes)\n        ? body.nodes\n        : Array.isArray(body.entries)\n          ? body.entries\n          : Array.isArray(body)\n            ? body\n            : [];\n      await nameRows(items.value);\n    }\n  } catch (err) {\n    emit('error', err instanceof Error ? err.message : String(err));\n  } finally {\n    loading.value = false;\n  }\n}\n\nfunction fmtTime(s?: string): string {\n  if (!s) return '';\n  const ms = new Date(s).getTime();\n  if (Number.isNaN(ms)) return '';\n  const diff = Date.now() - ms;\n  // `Intl` says \"5 minutes ago\" in the viewer's language — every language,\n  // a pack's included — with no string in any catalogue.\n  try {\n    const rtf = new Intl.RelativeTimeFormat(localeTag(props.locale), { numeric: 'auto', style: 'short' });\n    if (diff < 60_000) return rtf.format(0, 'second');\n    if (diff < 3_600_000) return rtf.format(-Math.floor(diff / 60_000), 'minute');\n    if (diff < 86_400_000) return rtf.format(-Math.floor(diff / 3_600_000), 'hour');\n    return rtf.format(-Math.floor(diff / 86_400_000), 'day');\n  } catch {\n    return new Date(ms).toISOString().slice(0, 16).replace('T', ' ');\n  }\n}\n\nonMounted(load);\nwatch(() => props.refreshKey, load);\n</script>\n\n<template>\n  <div class=\"filex-recent\">\n    <header>\n      <h3>{{ t('recents.title') }}</h3>\n      <button\n        class=\"filex-recent-refresh\"\n        type=\"button\"\n        :title=\"t('recents.refresh')\"\n        :aria-label=\"t('recents.refresh')\"\n        @click=\"load\"\n        :disabled=\"loading\"\n      >\n        <!-- ikon:emoji — ↻ was a bare arrow glyph with no label at all, so\n             the only thing naming this button was its shape. Same mark as the\n             toolbar's Refresh now, and it says what it is. -->\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span aria-hidden=\"true\" v-html=\"actionIconSvg('refresh')\"></span>\n      </button>\n    </header>\n\n    <ul v-if=\"items.length\">\n      <li v-for=\"n in items\" :key=\"n.id\" data-testid=\"recent-tray-item\" :data-fe-path=\"n.path\">\n        <button\n          type=\"button\"\n          class=\"filex-recent-item\"\n          @click=\"emit('open', n)\"\n          @contextmenu.prevent=\"emit('context', n, $event)\"\n        >\n          <span class=\"filex-recent-name\"><bdi>{{ shownNames[n.id] ?? n.name }}</bdi></span>\n          <span class=\"filex-recent-meta\">{{ fmtTime(n.last_opened) }}</span>\n        </button>\n      </li>\n    </ul>\n    <p v-else-if=\"!loading\" class=\"filex-recent-empty\">{{ t('recents.empty') }}</p>\n    <p v-else class=\"filex-recent-empty\">{{ t('recents.loading') }}</p>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-recent {\n  background: var(--fe-bg-elev, var(--filex-bg-card, #ffffff));\n  border: 1px solid var(--fe-border, var(--filex-border, #e5e7eb));\n  border-radius: 8px;\n  padding: 12px;\n  font-size: 13px;\n}\n.filex-recent header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom: 8px;\n}\n.filex-recent h3 {\n  margin: 0;\n  font-size: 13px;\n  font-weight: 600;\n  color: var(--fe-text, var(--filex-text, #111827));\n}\n.filex-recent-refresh {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  background: transparent;\n  border: none;\n  color: var(--fe-text-muted, var(--filex-text-muted, #9ca3af));\n  cursor: pointer;\n  font-size: 14px;\n  padding: 2px 6px;\n}\n.filex-recent ul {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n.filex-recent-item {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  width: 100%;\n  background: transparent;\n  border: none;\n  padding: 6px 8px;\n  cursor: pointer;\n  border-radius: 4px;\n  text-align: start;\n}\n.filex-recent-item:hover {\n  background: var(--fe-bg-hover, var(--filex-bg-soft, #f3f4f6));\n}\n.filex-recent-name {\n  color: var(--fe-text, var(--filex-text, #111827));\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.filex-recent-meta {\n  color: var(--fe-text-muted, var(--filex-text-muted, #9ca3af));\n  font-size: 11px;\n  margin-inline-start: 8px;\n  flex-shrink: 0;\n}\n.filex-recent-empty {\n  color: var(--fe-text-muted, var(--filex-text-muted, #9ca3af));\n  margin: 4px 0 0;\n}\n</style>\n","/**\n * surucu:d1 — the filter row's model, kept out of the components so the\n * predicate has one definition and can be tested without a DOM.\n *\n * ⚠⚠ 0.54 (task #207): what is the SERVER's here and what is not.\n *   - A row's KIND (the Type chip) is the server's `kind` field\n *     (internal/nodefilter KindOf): this file used to keep its own extension\n *     and mime tables, a second rule beside the server's.\n *   - The NAME box is answered by the server's name rule (`lib/nameFilter`,\n *     `POST /api/files/search/match`); `applyFilters` does not match names.\n *   - Over a SEARCH, every choice here travels to the server as a parameter\n *     (`lib/advSearch` advFilterParams) and is applied before the server cuts\n *     its page; the browser does not narrow search hits any more.\n *   What stays here is the narrowing of a FOLDER listing the browser already\n *   holds in full, by numbers the rows carry (date, size, owner) and the\n *   server's `kind`.\n *\n * ⚠ EVERY filter here answers from a field the listing row ALREADY carries\n * (`type`, `extension`, `mime_type`, `size`, `last_modified`). That is not a\n * shortcut, it is the constraint: `GET /api/files/manager?action=index` reads\n * no `mime` / `min_size` / `modified_after` / `owner` parameter — it returns\n * the whole directory and ignores anything else you send it (handlers/manager.go\n * `List`, the complete parameter list is `action`, `path`, `filter`, `storage`,\n * `parent`, `cache`). A control wired to a parameter the server does not read\n * looks like it works and quietly changes nothing, which is worse than not\n * shipping it.\n *\n * Because the endpoint has no `limit`/`offset` either, the listing in hand IS\n * the folder — so filtering it client-side is complete for the folder, not a\n * filter over \"the first page\".\n *\n * ⚠ This file used to end \"…and a People/owner filter is not, because\n * `nodes.owner_id` exists for quota accounting and is serialized by nothing\".\n * That was true and is no longer: migration 00038 made ownership a real fact\n * on the row (who put it here, who touched it last, whether it arrived through\n * an anonymous drop link), and the listing projection now carries `owner_id`,\n * `owner_name` and `owner_self` on every row that has an owner. The People\n * filter therefore answers from a field the row ALREADY carries, exactly like\n * the other four — the rule did not bend, the data arrived.\n *\n * ⚠ A row with NO owner key is SYSTEM: nobody put it there through filex. That\n * is the honest word for ownerless and it is a real choice in the pill, not a\n * blank.\n */\nimport type { FileNode } from '../types/FileNode';\nimport { iconFamilyFor, type IconFamily } from './fileIcons';\n\nexport type TypeFilter =\n  | 'any'\n  | 'folder'\n  | 'document'\n  | 'spreadsheet'\n  | 'presentation'\n  | 'pdf'\n  | 'image'\n  | 'video'\n  | 'audio'\n  | 'archive'\n  | 'code';\n\nexport type ModifiedFilter = 'any' | 'today' | '7d' | '30d' | 'year' | 'around';\n\nexport type SizeFilter = 'any' | 'lt1' | '1to10' | '10to100' | 'gt100' | 'range';\n\n/** gorunum:v1-advsearch — how wide \"around\" reaches on each side of the anchor. */\nexport type AroundSpan = 'h1' | 'd1' | 'w1';\n\n/** gorunum:v1-advsearch — what the path choice does to a row outside `pathBase`. */\nexport type PathMode = 'any' | 'here' | 'skip';\n\n/**\n * Who a row belongs to. `any` is the neutral member every pill group needs;\n * `me` is the signed-in account, `system` is an ownerless row, and `u:<id>`\n * names one of the other accounts that actually appear in this listing.\n *\n * ⚠ The account members are NOT a fixed list. Offering every account on the\n * install would put names in the menu that cannot narrow anything here and\n * would leak the user directory into a folder view; `peopleOptions` derives\n * the choices from the rows in hand.\n */\nexport type PeopleFilter = 'any' | 'me' | 'system' | `u:${number}`;\n\nexport interface DriveFilters {\n  type: TypeFilter;\n  modified: ModifiedFilter;\n  size: SizeFilter;\n  /**\n   * gorunum:v1 — \"Filter in this folder…\", the input the filter row carries\n   * beside the chips. A substring of the NAME, matched over the rows in hand.\n   *\n   * ⚠ Not a second search box. The header field runs `action=search` on the\n   * server and REPLACES the listing with hits (`isSearchResult`, results carry\n   * their parent path and can come from subfolders); this one never leaves the\n   * folder you are looking at and never issues a request — it narrows what is\n   * already on screen, the same rows the chips narrow, which is why it belongs\n   * to the same model and not to `searchQuery`.\n   *\n   * Optional so every existing `{ type, modified, size }` literal — embedders\n   * included — still type-checks and behaves exactly as before.\n   */\n  name?: string;\n\n  /* ── gorunum:v1-advsearch — the three the advanced-search dialog adds ─────\n   *\n   * All optional, so every existing `{ type, modified, size }` literal still\n   * type-checks and behaves exactly as it did — the same contract `name` was\n   * added under. They live HERE and not in a second model because the filter\n   * row and the dialog narrow the same rows with the same predicate: two\n   * definitions of \"modified in the last 7 days\" is two products.\n   *\n   * ⚠ They are client-side for the same reason the three above are, and the\n   * reason is stated at the top of this file: the listing and search endpoints\n   * read no date, size or path parameter. What makes them honest is that the\n   * rows in hand are the complete answer for a FOLDER listing; over a SEARCH\n   * result they narrow the hits the server returned, which is capped\n   * (`/api/files/search` limit, the manager search's 250) — so a size range\n   * over a truncated hit list is a filter over what came back, not over the\n   * storage. The dialog says so rather than implying a full scan. */\n\n  /** Anchor for `modified: 'around'`. `YYYY-MM-DD` or `YYYY-MM-DDTHH:mm`,\n   *  read as LOCAL time (a date alone means that day's 00:00 local). */\n  aroundDate?: string;\n  /** Half-width of the `around` window. */\n  aroundSpan?: AroundSpan;\n  /** Inclusive floor for `size: 'range'`, in BYTES. null = open-ended. */\n  sizeMin?: number | null;\n  /** Inclusive ceiling for `size: 'range'`, in BYTES. null = open-ended. */\n  sizeMax?: number | null;\n  /** `here` keeps only rows under `pathBase`; `skip` keeps only rows outside it. */\n  pathMode?: PathMode;\n  /**\n   * Who the row belongs to. Optional, under the same contract as `name` and\n   * the advanced-search three: every existing `{ type, modified, size }`\n   * literal still type-checks and behaves exactly as before.\n   */\n  people?: PeopleFilter;\n\n  /** Adapter-qualified folder the path choice is measured against, e.g.\n   *  `qldemo://Documents`. Captured when the dialog opens, because a search\n   *  rebases the explorer to the storage root and the folder the user meant\n   *  would otherwise be gone by the time the filter runs. */\n  pathBase?: string;\n}\n\nexport const EMPTY_FILTERS: DriveFilters = {\n  type: 'any',\n  modified: 'any',\n  size: 'any',\n  name: '',\n  aroundDate: '',\n  aroundSpan: 'd1',\n  sizeMin: null,\n  sizeMax: null,\n  pathMode: 'any',\n  pathBase: '',\n  people: 'any',\n};\n\n/** Case- and accent-folded, so \"İstanbul\" answers to \"ist\" and \"Ödev\" to \"od\".\n *  ⚠ `toLowerCase()` alone maps `İ` to `i` + a combining dot, which then\n *  matches nothing the user typed; stripping the marks is what makes the two\n *  sides comparable.\n *  ⚠ And the four Latin i's are one letter (internal/namefold): `ı` has no\n *  mark to strip, so without the last step \"ışık\" did not answer to \"IŞIK\".\n *\n *  ⚠ This is NOT how a file name is searched - the search keeps accents\n *  (\"musteri\" does not find \"müşteri\"). It is the LABEL rule: the admin\n *  panel's search (lib/panelSearch) folds its own page and setting labels\n *  with it, the same rule the server's panel search applies (namefold.Loose).\n *  A file name the person types into \"Filter in this folder\" is matched by the\n *  server (`lib/nameFilter`); this rule answers only a name the server must\n *  not see (decrypted in this tab) - see `nameMatches`. */\nexport function foldText(s: string): string {\n  return s\n    .normalize('NFD')\n    .replace(/\\p{M}+/gu, '')\n    .toLowerCase()\n    .replace(/ı/g, 'i');\n}\n\n/** The trimmed needle, or '' when the input is empty/whitespace. */\nexport function nameNeedle(f: DriveFilters): string {\n  return (f.name ?? '').trim();\n}\n\n/** gorunum:v1-advsearch — `here`/`skip` only mean something with a base to\n *  measure against; without one the choice is inert and must not count as an\n *  active filter, or the empty state would blame a filter that filters nothing. */\nfunction pathActive(f: DriveFilters): boolean {\n  return (f.pathMode ?? 'any') !== 'any' && !!(f.pathBase ?? '');\n}\n\n/** The People choice, defaulted. Kept in one place so the four call sites\n *  below cannot disagree about what \"no choice\" means. */\nfunction peopleOf(f: DriveFilters): PeopleFilter {\n  return f.people ?? 'any';\n}\n\nexport function filtersActive(f: DriveFilters): boolean {\n  return (\n    f.type !== 'any' ||\n    f.modified !== 'any' ||\n    f.size !== 'any' ||\n    nameNeedle(f) !== '' ||\n    pathActive(f) ||\n    peopleOf(f) !== 'any'\n  );\n}\n\nexport function activeFilterCount(f: DriveFilters): number {\n  return (\n    (f.type !== 'any' ? 1 : 0) +\n    (f.modified !== 'any' ? 1 : 0) +\n    (f.size !== 'any' ? 1 : 0) +\n    (nameNeedle(f) !== '' ? 1 : 0) +\n    (pathActive(f) ? 1 : 0) +\n    (peopleOf(f) !== 'any' ? 1 : 0)\n  );\n}\n\n/** Families a type choice accepts. `iconFamilyFor` is the taxonomy the icons\n *  already use, so a row's filter group and its glyph can never disagree. */\nconst TYPE_FAMILIES: Record<Exclude<TypeFilter, 'any'>, IconFamily[]> = {\n  folder: ['folder'],\n  document: ['doc', 'text'],\n  spreadsheet: ['sheet'],\n  presentation: ['slides'],\n  pdf: ['pdf'],\n  image: ['image'],\n  video: ['video'],\n  audio: ['audio'],\n  archive: ['archive'],\n  code: ['code'],\n};\n\n/**\n * The Type chip, answered by the server's `kind` on the row (internal/nodefilter\n * KindOf: extension, then sniffed mime). \"Document\" takes plain text too, as\n * the server's `type=document` does.\n *\n * ⚠ A row WITHOUT `kind` is one the server could not name: decrypted in this\n * tab (its real name is not on the server), or from a server before 0.54. Only\n * then the icon family answers - the glyph's own taxonomy, the e2e exception.\n */\nfunction matchesType(n: FileNode, t: TypeFilter): boolean {\n  if (t === 'any') return true;\n  if (t === 'folder') return n.type === 'dir';\n  if (n.type === 'dir') return false;\n  const kind = (n as Record<string, unknown>).kind;\n  if (typeof kind === 'string' && kind !== '') {\n    return kind === t || (t === 'document' && kind === 'text');\n  }\n  return TYPE_FAMILIES[t].includes(iconFamilyFor(n));\n}\n\n/** `now` is a parameter so a test can pin the clock instead of sleeping. */\n/** gorunum:v1-advsearch — half-width of each \"around\" window, in ms. */\nconst AROUND_MS: Record<AroundSpan, number> = {\n  h1: 3_600_000,\n  d1: 86_400_000,\n  w1: 7 * 86_400_000,\n};\n\n/**\n * gorunum:v1-advsearch — read the anchor as LOCAL time.\n *\n * ⚠ `Date.parse('2026-09-12')` is UTC by spec while\n * `Date.parse('2026-09-12T00:00')` is local, so a bare date would slide the\n * whole window by the viewer's offset — in Istanbul (UTC+3) a ±1 hour search\n * \"around the 12th\" would have covered 03:00, not midnight. Appending the time\n * makes both forms mean the same clock the user is reading.\n */\nfunction parseAnchor(raw: string | undefined): number | null {\n  const s = (raw ?? '').trim();\n  if (!s) return null;\n  const ms = Date.parse(s.includes('T') ? s : `${s}T00:00`);\n  return Number.isNaN(ms) ? null : ms;\n}\n\n/**\n * The modified choice as a window of epoch milliseconds, in the viewer's own\n * clock and calendar (\"today\" is their midnight). Null = no window (any, or\n * \"around\" with no anchor yet). ONE definition: the folder chips compare a\n * row's date with it, and a search sends it to the server as\n * `modified_after` / `modified_before` (lib/advSearch advFilterParams).\n */\nexport function modifiedWindow(g: DriveFilters, now: number = Date.now()): { after?: number; before?: number } | null {\n  const f = g.modified;\n  if (f === 'any') return null;\n  if (f === 'around') {\n    const anchor = parseAnchor(g.aroundDate);\n    // No anchor typed yet: \"around nothing\" is not a window, so the choice is\n    // inert rather than empty. Narrowing to zero rows the moment the user\n    // picks the mode — before they have picked a date — reads as a broken\n    // search, not as an unfinished one.\n    if (anchor === null) return null;\n    const span = AROUND_MS[g.aroundSpan ?? 'd1'];\n    return { after: anchor - span, before: anchor + span };\n  }\n  if (f === 'year') {\n    const y = new Date(now).getFullYear();\n    return { after: new Date(y, 0, 1).getTime(), before: new Date(y + 1, 0, 1).getTime() - 1 };\n  }\n  if (f === 'today') {\n    const start = new Date(now);\n    start.setHours(0, 0, 0, 0);\n    return { after: start.getTime() };\n  }\n  const days = f === '7d' ? 7 : 30;\n  return { after: now - days * 86_400_000 };\n}\n\nfunction matchesModified(n: FileNode, g: DriveFilters, now: number): boolean {\n  const w = modifiedWindow(g, now);\n  if (!w) return true;\n  const ms = typeof n.last_modified === 'number' ? n.last_modified : 0;\n  // No timestamp = no answer. Dropping the row would hide files whose driver\n  // gave us nothing; keeping it would put them in \"Today\". Hiding is the\n  // honest one: the row does not satisfy \"modified today\", it is unknown.\n  if (!ms) return false;\n  if (w.after !== undefined && ms < w.after) return false;\n  if (w.before !== undefined && ms > w.before) return false;\n  return true;\n}\n\nconst MB = 1024 * 1024;\n\n/**\n * The size choice as inclusive byte bounds; null = any size. ONE definition:\n * the folder chips compare a row with it, a search sends it as `min_size` /\n * `max_size`. A custom range with both ends open is \"any size\" by another\n * name and narrows nothing.\n */\nexport function sizeBounds(g: DriveFilters): { min?: number; max?: number } | null {\n  switch (g.size) {\n    case 'any':\n      return null;\n    case 'lt1':\n      return { max: MB - 1 };\n    case '1to10':\n      return { min: MB, max: 10 * MB - 1 };\n    case '10to100':\n      return { min: 10 * MB, max: 100 * MB - 1 };\n    case 'gt100':\n      return { min: 100 * MB };\n    case 'range': {\n      const lo = typeof g.sizeMin === 'number' ? g.sizeMin : undefined;\n      const hi = typeof g.sizeMax === 'number' ? g.sizeMax : undefined;\n      return { min: lo, max: hi };\n    }\n  }\n  return null;\n}\n\nfunction matchesSize(n: FileNode, g: DriveFilters): boolean {\n  const b = sizeBounds(g);\n  if (!b) return true;\n  // ⚠ Folders drop out of every size choice rather than passing through. A\n  // directory row's `size` is 0 from the projector, so \"under 1 MB\" would\n  // otherwise list every folder in the drive — an answer that looks like a\n  // measurement and is not one. (The server's size bounds say the same.)\n  if (n.type === 'dir') return false;\n  const s = typeof n.size === 'number' ? n.size : 0;\n  if (b.min !== undefined && s < b.min) return false;\n  if (b.max !== undefined && s > b.max) return false;\n  return true;\n}\n\n/**\n * gorunum:v1 — the name input's predicate, over a bare STRING.\n *\n * ⚠⚠ 0.54: the box asks the server (`lib/nameFilter`); this local rule\n * answers only the names the server must not be sent - decrypted in this tab\n * (an encrypted-names folder, a vault) - and stands in while a server older\n * than 0.54 has no answer. It is not the search's rule (accents, separators).\n *\n * ⚠ Exported over a string rather than over a `FileNode`, because the name box\n * now narrows things that are not nodes: `surucu:d1-scope` puts the same box on\n * the multi-storage root (rows ARE nodes there, synthesized ones) and on Home,\n * whose storage cards are `HomeStorage` records with a `label`. Case- and\n * accent-folding is the part that must not be re-typed — a second `toLowerCase`\n * somewhere else is how \"Ödev\" stops answering to \"od\" on one surface and keeps\n * answering on another.\n */\nexport function nameMatches(name: string, needle: string): boolean {\n  if (!needle) return true;\n  return foldText(name || '').includes(foldText(needle));\n}\n\n/**\n * gorunum:v1-advsearch — \"only in this folder\" / \"skip this folder\".\n *\n * Both sides are answered from `path`, which every search hit already carries\n * adapter-qualified (`qldemo://Documents/report.sql`). The base is compared\n * with a trailing slash so `Documents` cannot claim `Documents-old`, and the\n * folder row itself counts as inside it.\n */\nfunction matchesPath(n: FileNode, g: DriveFilters): boolean {\n  const mode = g.pathMode ?? 'any';\n  const base = (g.pathBase ?? '').replace(/\\/+$/, '');\n  if (mode === 'any' || !base) return true;\n  const p = n.path || '';\n  const inside = p === base || p.startsWith(`${base}/`);\n  return mode === 'here' ? inside : !inside;\n}\n\n/* ── Ownership, read off the row ──────────────────────────────────────────\n *\n * The backend omits every owner key it has nothing to say about, so a SYSTEM\n * row simply has no `owner_id` — which is why these read through the FileNode\n * index signature rather than named fields, the same way `snippet` and\n * `matched` are read in ListView. */\n\n/** The row's owner id, or null for a SYSTEM row (nobody put it here). */\nexport function ownerIdOf(n: FileNode): number | null {\n  const raw = (n as Record<string, unknown>).owner_id;\n  return typeof raw === 'number' && raw > 0 ? raw : null;\n}\n\n/** True when the signed-in account owns this row. Answered by the SERVER\n *  (`owner_self`), because the embeddable core has no idea which filex account\n *  the host's session belongs to. */\nexport function ownedByViewer(n: FileNode): boolean {\n  return (n as Record<string, unknown>).owner_self === true;\n}\n\n/** The owner's display name, or '' for a system row / a name the server could\n *  not resolve. The caller decides what to show instead. */\nexport function ownerNameOf(n: FileNode): string {\n  const raw = (n as Record<string, unknown>).owner_name;\n  return typeof raw === 'string' ? raw : '';\n}\n\n/* ── Who put it in the Trash ──────────────────────────────────────────────\n *\n * A trash row's `deleted_by_*`, in the owner's shape: the id, the name the\n * server resolved, and `deleted_by_self` for the asker's own deletes. Every\n * key is absent when nobody in filex is named on the row. */\n\n/** The deleter's account id, or null when nobody is named. */\nexport function deleterIdOf(n: FileNode): number | null {\n  const raw = (n as Record<string, unknown>).deleted_by_id;\n  return typeof raw === 'number' && raw > 0 ? raw : null;\n}\n\n/** True when the signed-in account put this row in the Trash (answered by the\n *  server, like `owner_self`). */\nexport function deletedByViewer(n: FileNode): boolean {\n  return (n as Record<string, unknown>).deleted_by_self === true;\n}\n\n/** The deleter's display name, or '' when there is none to show. */\nexport function deleterNameOf(n: FileNode): string {\n  const raw = (n as Record<string, unknown>).deleted_by_name;\n  return typeof raw === 'string' ? raw : '';\n}\n\n/** True when the row arrived through an anonymous drop link. The OWNER is\n *  still the person who created the link — this only says they did not put it\n *  there themselves. */\nexport function arrivedFromOutside(n: FileNode): boolean {\n  return (n as Record<string, unknown>).external_upload === true;\n}\n\n/** One entry of the People pill. `name` is present only for the `u:<id>`\n *  members — the three fixed ones are named by the locale, not by data. */\nexport interface PeopleOption {\n  value: PeopleFilter;\n  name?: string;\n}\n\n/**\n * The People pill's menu for a given listing: `any`, `me`, `system`, and then\n * every OTHER account that actually owns something on screen, by name.\n *\n * ⚠ `me` and `system` are offered unconditionally, and that is deliberate:\n * a menu whose entries appear and disappear as you navigate is a menu you\n * cannot learn. The per-account entries are the ones that would be inert\n * elsewhere, so they are the ones derived from the rows.\n */\nexport function peopleOptions(files: FileNode[]): PeopleOption[] {\n  const out: PeopleOption[] = [{ value: 'any' }, { value: 'me' }, { value: 'system' }];\n  const seen = new Set<number>();\n  for (const n of files) {\n    const id = ownerIdOf(n);\n    if (id === null || ownedByViewer(n) || seen.has(id)) continue;\n    seen.add(id);\n    out.push({ value: `u:${id}`, name: ownerNameOf(n) });\n  }\n  // Stable, readable order for the derived half; the fixed three stay put.\n  const fixed = out.slice(0, 3);\n  const rest = out\n    .slice(3)\n    .sort((a, b) => (a.name ?? '').localeCompare(b.name ?? '', undefined, { sensitivity: 'base' }));\n  return [...fixed, ...rest];\n}\n\n/** Rows belonging to the chosen person. A folder takes part like any other\n *  row: somebody made it, and \"show me what Ada put here\" that silently keeps\n *  everyone's folders would be answering a different question. */\nfunction matchesPeople(n: FileNode, f: DriveFilters): boolean {\n  const want = peopleOf(f);\n  if (want === 'any') return true;\n  if (want === 'me') return ownedByViewer(n);\n  if (want === 'system') return ownerIdOf(n) === null;\n  const id = Number(want.slice(2));\n  return Number.isFinite(id) && ownerIdOf(n) === id;\n}\n\n/**\n * The chips' narrowing of rows the browser holds in full (a folder listing).\n *\n * ⚠ The NAME box is not applied here (0.54): it is the server's rule, asked by\n * `lib/nameFilter` over the rows this returns. `filtersActive` still counts it,\n * so the empty state and the \"clear filters\" escape still know it is on.\n */\nexport function applyFilters(\n  files: FileNode[],\n  f: DriveFilters,\n  now: number = Date.now(),\n): FileNode[] {\n  // No active filter other than the name → the SAME array reference, so an\n  // unfiltered explorer renders exactly what it rendered before this file\n  // existed.\n  if (!filtersActive({ ...f, name: '' })) return files;\n  return files.filter(\n    (n) =>\n      matchesType(n, f.type) &&\n      matchesModified(n, f, now) &&\n      matchesSize(n, f) &&\n      matchesPath(n, f) &&\n      matchesPeople(n, f),\n  );\n}\n","<script setup lang=\"ts\">\n/**\n * UploadProgress — renderless upload publisher (wiring:c3).\n *\n * Historically this drew its own floating bottom-right footer. Since the\n * unified operations center it renders NOTHING: it reconciles the host's\n * `jobs` list into the shared useOperations store, and the visible UI is\n * OperationsCenter's badge + panel. The original emit contract is kept —\n * cancel/dismiss (and the new retry) still bubble to the host, which owns\n * the actual upload machinery. Mount it exactly as before; just pass the\n * store via `center`.\n */\nimport { watch } from 'vue';\nimport type { UploadJob } from '../composables/useUploadChunked';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { OperationsStore, OperationStatus } from '../composables/useOperations';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = defineProps<{\n  jobs: UploadJob[];\n  /** The row's words while the server writes a file (`upload.saving`); the\n   *  rest of an upload's strings render in OperationsCenter. */\n  locale: LocaleCode;\n  center: OperationsStore;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/**\n * Every byte is in filex and the server is writing the file to its storage:\n * the commit, then the queue's transfer. ⚠ That is not \"100%\": on a slow\n * uplink it is minutes, and the row read \"X MB / X MB\" over a full bar, the\n * badge \"100%\", for all of it.\n */\nfunction saving(status: UploadJob['status']): boolean {\n  return status === 'committing' || status === 'transferring';\n}\n\nconst emit = defineEmits<{\n  (e: 'cancel', job: UploadJob): void;\n  (e: 'dismiss', job: UploadJob): void;\n  (e: 'retry', job: UploadJob): void;\n}>();\n\nfunction mapStatus(s: UploadJob['status']): OperationStatus {\n  if (s === 'done') return 'done';\n  if (s === 'error') return 'error';\n  if (s === 'aborted') return 'aborted';\n  // pending | initializing | uploading | committing | transferring — all of\n  // them are still in flight as far as the tray is concerned.\n  return 'running';\n}\n\nwatch(\n  () => props.jobs,\n  (jobs) => {\n    props.center.sync(\n      'upload',\n      jobs.map((j) => ({\n        input: {\n          id: j.id,\n          kind: 'upload' as const,\n          name: j.displayName ?? j.file.name,\n          percent: saving(j.status) ? null : j.totalBytes > 0 || j.status === 'done' ? j.percent : null,\n          message: saving(j.status) ? t('upload.saving') : null,\n          status: mapStatus(j.status),\n          error: j.error ?? null,\n          uploadedBytes: j.uploadedBytes,\n          totalBytes: j.totalBytes,\n          // Cancellable only while chunks are still moving: once the commit is\n          // accepted the bytes are filex's and the ops worker owns the rest.\n          cancellable: j.status === 'uploading' || j.status === 'initializing',\n          retryable: j.status === 'error',\n        },\n        actions: {\n          cancel: () => emit('cancel', j),\n          dismiss: () => emit('dismiss', j),\n          retry: () => emit('retry', j),\n        },\n      })),\n    );\n  },\n  { immediate: true },\n);\n</script>\n\n<template>\n  <i v-if=\"false\" />\n</template>\n","/**\n * opProgress — the one rule for \"how far along is this queued operation\".\n *\n * Both progress surfaces read it: the explorer's operations center\n * (PendingOpsTray → OperationsCenter) and the admin app's bottom-right tray.\n * Two copies of this rule are how one tray starts saying something the other\n * does not (filex lesson #119).\n *\n * Issue #27: a queued op counts SOURCES, so moving one large file — or one\n * folder of a thousand files — is \"0 of 1\" until the very end. Drawn as a\n * percentage that is a bar frozen at 0% that then vanishes, which the reporter\n * read as stuck. So:\n *\n *   - a running cross-storage transfer reports bytes (`bytes_done` /\n *     `bytes_total`); when the total is known that is the percentage;\n *   - bytes moving with no total yet, or a single source with nothing but a\n *     source count, has NO honest percentage: `null`, and the surface shows\n *     an indeterminate indicator instead of a fake 0%;\n *   - a single source whose storage driver counts the objects it works\n *     through (`objects_done` / `objects_total`: one folder on an object store\n *     is minutes of objects) draws those;\n *   - several sources still report per source, as before.\n */\n\nexport interface OpProgressLike {\n  status: string;\n  progress_total: number;\n  progress_done: number;\n  bytes_total?: number;\n  bytes_done?: number;\n  objects_total?: number;\n  objects_done?: number;\n}\n\nfunction clampPercent(n: number): number {\n  return Math.max(0, Math.min(100, Math.round(n)));\n}\n\n/**\n * The objects ONE source is made of, when its storage driver counts them (a\n * folder job on one storage): \"25 of 100 items\" rather than a source count of\n * 0/1 — or null. ⚠ The one copy of this rule: #67 wrote it here, in the\n * explorer's PendingOpsTray and in the admin app's.\n */\nexport function opObjects(op: OpProgressLike): { done: number; total: number } | null {\n  if (op.progress_total > 1) return null;\n  const total = op.objects_total ?? 0;\n  return total > 0 ? { done: op.objects_done ?? 0, total } : null;\n}\n\n/** 0–100, or `null` when there is no honest number to draw. */\nexport function opPercent(op: OpProgressLike): number | null {\n  if (op.status === 'done') return 100;\n  const bytesTotal = op.bytes_total ?? 0;\n  const bytesDone = op.bytes_done ?? 0;\n  if (bytesTotal > 0) return clampPercent((bytesDone / bytesTotal) * 100);\n  if (bytesDone > 0) return null;\n  if (op.progress_total <= 1) {\n    const objects = opObjects(op);\n    return objects ? clampPercent((objects.done / objects.total) * 100) : null;\n  }\n  return clampPercent((op.progress_done / op.progress_total) * 100);\n}\n","<script setup lang=\"ts\">\n/**\n * PendingOpsTray — renderless ops-queue publisher (wiring:c3).\n *\n * Historically a bottom-left toast list for queued copy/move/delete. Since\n * the unified operations center it renders NOTHING: it reconciles the\n * usePendingOps rows into the shared useOperations store; OperationsCenter\n * draws them. Terminal-state lingering (\"done\" flash → history) and sticky\n * errors are handled by the store — note usePendingOps sweeps terminal rows\n * after its RETAIN window, which the store treats as \"move to history\"\n * (errors stay pinned until the user dismisses them).\n *\n * Queue ops are not client-retryable: the normalized PendingOp no longer\n * carries the source list, so a failed op only offers dismiss.\n */\nimport { watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { PendingOp } from '../composables/usePendingOps';\nimport type { OperationKind, OperationsStore, OperationStatus } from '../composables/useOperations';\nimport { opObjects, opPercent } from '../lib/opProgress';\nimport { opFailure } from '../lib/errorWords';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = defineProps<{\n  ops: PendingOp[];\n  /** Kept for mount compatibility — strings now render in OperationsCenter. */\n  locale: LocaleCode;\n  center: OperationsStore;\n  /**\n   * An app-plugin job's output mode, as the host resolves it (the explorer\n   * reads the cached actions list). ⚠ A resolver rather than a field on the\n   * row: the ops endpoint does not carry it, so only a caller that holds the\n   * actions list can answer — and one that does not simply draws no chip.\n   */\n  outputModeOf?: (op: PendingOp) => string | undefined;\n  /** May the viewer administer this instance? Then a failure's raw words are\n   *  shown as a second line (lib/errorWords); nobody else ever sees them. */\n  callerAdmin?: boolean;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/** A failed op, said — lib/errorWords `opFailure`, the same call the\n *  explorer's toast makes. */\nfunction failureOf(op: PendingOp) {\n  return opFailure(op, t, { callerAdmin: props.callerAdmin === true });\n}\n\nconst emit = defineEmits<{\n  (e: 'dismiss', id: number): void;\n  /** A plugin job's Cancel — the explorer posts `opsCancel`. */\n  (e: 'cancel', id: number): void;\n  /** \"Open\" on a finished job: reveal this output path in the listing. */\n  (e: 'open', id: number, path: string): void;\n}>();\n\nfunction mapStatus(op: PendingOp): OperationStatus {\n  if (op.status === 'done') return 'done';\n  if (op.status === 'cancelled') return 'aborted';\n  if (op.status === 'error') return 'error';\n  return 'running'; // pending | running\n}\n\nconst DRAWN_KINDS: ReadonlySet<string> = new Set([\n  'copy', 'move', 'delete', 'rename', 'restore', 'purge', 'plugin', 'archive-create', 'archive-extract',\n]);\n\n/** A queue kind the center can draw. Anything it has no glyph for is shown as\n *  a generic job (`plugin`), never folded into delete. */\nfunction mapKind(op: PendingOp): OperationKind {\n  if (op.op_type === 'trash-empty') return 'trash';\n  if (op.op_type === 'thumb-repair') return 'thumbs';\n  return (DRAWN_KINDS.has(op.op_type) ? op.op_type : 'plugin') as OperationKind;\n}\n\nfunction isPluginJob(op: PendingOp): boolean {\n  return op.op_type === 'plugin';\n}\n\n/** Who may stop a row: a plugin job's starter (the server answers anyone\n *  else 403), and an \"empty the trash\" — which only an administrator\n *  starts — for an administrator. */\nfunction mayCancel(op: PendingOp): boolean {\n  if (op.status !== 'pending' && op.status !== 'running') return false;\n  if (op.op_type === 'archive-create' || op.op_type === 'archive-extract') return op.cancellable;\n  if (isPluginJob(op)) return true;\n  return (op.op_type === 'trash-empty' || op.op_type === 'thumb-repair') && props.callerAdmin === true;\n}\n\n/* issue #27 — bytes when a cross-storage transfer reports them, no fake 0%\n * otherwise; the rule is shared with the admin tray (lib/opProgress). */\nconst percentOf = (op: PendingOp): number | null => opPercent(op);\n/**\n * The row's title. A trash empty names no file: its kind is its title. A\n * restore or a permanent delete names trash entries by id — no destination,\n * no source folder — so it says how many it works on; it read its bare kind\n * (\"Restore\") before.\n */\nfunction nameOf(op: PendingOp): string {\n  if (op.op_type === 'trash-empty' || op.op_type === 'thumb-repair') return '';\n  const named = op.label || op.target_path || op.source_dir || '';\n  if (named) return named;\n  if (op.op_type === 'restore' || op.op_type === 'purge') {\n    return t('opc.trash_items', { n: op.progress_total || op.source_count });\n  }\n  return '';\n}\n\n/** \"25 of 100 items\" for one source whose objects the server counts. */\nfunction itemsOf(op: PendingOp): { itemsDone?: number; itemsTotal?: number } {\n  const objects = opObjects(op);\n  return objects ? { itemsDone: objects.done, itemsTotal: objects.total } : {};\n}\n\nwatch(\n  () => props.ops,\n  (ops) => {\n    props.center.sync(\n      'ops',\n      ops.map((op) => ({\n        input: {\n          id: op.id,\n          kind: mapKind(op),\n          name: nameOf(op),\n          percent: percentOf(op),\n          status: mapStatus(op),\n          error: op.status === 'error' ? failureOf(op).text : null,\n          errorDetail: op.status === 'error' ? (failureOf(op).detail ?? null) : null,\n          queued: op.status === 'pending',\n          cancelling: op.status === 'cancelling',\n          doneCount: op.progress_done,\n          totalCount: op.progress_total,\n          ...itemsOf(op),\n          cancellable: mayCancel(op),\n          retryable: false,\n          message: op.message ?? null,\n          outputs: (op.outputs ?? []).map((o) => o.path),\n          outputMode: (isPluginJob(op) ? props.outputModeOf?.(op) : undefined) ?? null,\n        },\n        actions: {\n          cancel: () => emit('cancel', op.id),\n          dismiss: () => emit('dismiss', op.id),\n          open: (path: string) => emit('open', op.id, path),\n        },\n      })),\n    );\n  },\n  { immediate: true },\n);\n</script>\n\n<template>\n  <i v-if=\"false\" />\n</template>\n","/**\n * appLock — an app plugin's hold on a file, as words and as a refusal.\n *\n * A signing app freezes the document while its signers work on it\n * (`files:lock`, docs/APP-PLUGINS-API.md → \"File locks\"). Two things reach\n * the browser from that:\n *\n *   • the LISTING says so — `locked: true` + `lock: {plugin, reason, until}`\n *     on the row, with `perm` already capped at `viewer` for everyone, so\n *     the menu hides the write verbs without knowing anything about locks;\n *   • the SERVER says so — rename / move / delete of the file, or of any\n *     folder above it, answer `423 {\"error\":\"locked\", plugin, path, reason,\n *     until}`.\n *\n * ⚠⚠ The 423 is the whole reason this file exists. Without it the refusal\n * falls into the generic status map as \"Error (423)\" — or, worse, gets read\n * as a permission problem and told to the person as \"you are not allowed to\n * do this\". They ARE allowed; a named app is holding the file until a named\n * date, and that sentence is the only one they can act on. So: one parser,\n * one phrasing, read by every surface that can hit the refusal.\n *\n * ⚠ ONE reader for both facts. The badge on the row, the line in the details\n * panel and the toast after a refusal all take their words from `lockWords`\n * — a second phrasing is how the badge says \"locked by sign\" while the toast\n * says \"permission denied\" about the same file.\n *\n * ⚠⚠ A REFUSAL is said in the SERVER's words (0.54 audit A3): the 423 carries\n * `message` - the app's name, its reason and the end of the lock, composed by\n * the server in the reader's language (handlers.lockedAnswer) - and that is\n * what the toast shows, the same sentence the admin panel, the CLI and an\n * agent read. Only a row's lock (no refusal behind it) is phrased here.\n */\nimport { foreignText } from './direction';\nimport type { FileNode } from '../types/FileNode';\nimport type { AppLock } from '../types/Plugins';\nimport { labelOf } from './pluginLabel';\n\nexport type { AppLock };\n\n/** The lock a listing row carries, or `null`. */\nexport function lockOf(node: Pick<FileNode, 'locked' | 'lock'> | null | undefined): AppLock | null {\n  if (!node || node.locked !== true) return null;\n  const l = node.lock;\n  if (!l || typeof l !== 'object' || typeof l.plugin !== 'string' || !l.plugin) return null;\n  return l;\n}\n\n/** Is any row of this selection frozen by an app? */\nexport function anyLocked(nodes: readonly Pick<FileNode, 'locked' | 'lock'>[]): boolean {\n  return nodes.some((n) => lockOf(n) !== null);\n}\n\n/** The body of a `423 {\"error\": \"locked\", …}`. */\nexport interface LockedRefusal extends AppLock {\n  /** The path the server refused — the file, or the folder above it. */\n  path?: string;\n  /** The server's sentence for the refusal, in the reader's language. */\n  message?: string;\n}\n\n/**\n * A rejected request that was a LOCK, not a permission problem — `null` for\n * anything else, so a caller can keep its existing error path untouched.\n *\n * ⚠ The status alone is the test that matters (`useFileApi` puts the raw body\n * in `.detail` and never parses it). A body that is missing or unparseable\n * still produces a refusal, with an empty plugin name: \"an app is holding\n * this file\" beats \"Error (423)\" even when the server said no more than that.\n */\nexport function lockedRefusal(err: unknown): LockedRefusal | null {\n  const e = err as { status?: number; detail?: string; server?: string } | null;\n  if (!e || e.status !== 423) return null;\n  const out: LockedRefusal = { plugin: '' };\n  // The whole sentence (lib/errorWords keeps it beside the clipped body).\n  if (typeof e.server === 'string' && e.server) out.message = e.server;\n  try {\n    const body = JSON.parse(String(e.detail ?? '')) as Record<string, unknown>;\n    if (typeof body.plugin === 'string') out.plugin = body.plugin;\n    if (body.plugin_label && typeof body.plugin_label === 'object') {\n      out.plugin_label = body.plugin_label as AppLock['plugin_label'];\n    }\n    if (typeof body.path === 'string') out.path = body.path;\n    if (typeof body.reason === 'string' && body.reason) out.reason = body.reason;\n    if (body.reason_text && typeof body.reason_text === 'object') out.reason_text = body.reason_text as AppLock['reason_text'];\n    if (typeof body.until === 'string' && body.until) out.until = body.until;\n    if (!out.message && typeof body.message === 'string' && body.message) out.message = body.message;\n  } catch {\n    /* an unreadable body is still a lock — see the note above */\n  }\n  return out;\n}\n\n/** What `lockWords` needs from the caller's locale. */\nexport interface LockWordsHost {\n  t: (key: string, vars?: Record<string, string | number>) => string;\n  /** The explorer's own date renderer, so a lock reads on the user's clock. */\n  formatDate?: (ms: number | undefined | null, opts?: { time?: boolean }) => string;\n  /** The reader's language: which of the reason's languages to show. */\n  locale?: string;\n}\n\n/**\n * A lock's reason in the reader's language: the app's own words for it\n * (`reason_text`, a manifest message the server kept in every language the\n * app wrote), else the plain `reason`.\n *\n * ⚠ The reason used to be ONE string in the language of whoever took the\n * lock, so a German administrator read the Turkish requester's \"imzalar\n * toplanıyor\" (v0.43.0 wave 2).\n */\nexport function lockReasonText(lock: AppLock | null | undefined, locale: string | undefined): string {\n  if (!lock) return '';\n  return labelOf(lock.reason_text, locale || 'en') || lock.reason || '';\n}\n\n/**\n * One sentence for a lock: who holds it, why, until when — with every part\n * that is missing simply left out rather than printed as \"undefined\".\n */\nexport function lockWords(lock: AppLock | LockedRefusal | null, host: LockWordsHost): string {\n  if (!lock) return '';\n  // A refusal: the server said it (isolated for the reader's direction - it\n  // never passed through a translator).\n  const said = (lock as LockedRefusal).message;\n  if (said) return foreignText(host.locale, said);\n  /* The app's own label first, its manifest name only where the server could\n     not resolve one. ⚠ The name is an ADDRESS (`sign`); every other screen\n     shows the label (\"e-Signature\"), and a banner that says \"sign locked this\n     file\" hands the person an identifier they have never seen (v0.43.0). */\n  const who = labelOf(lock.plugin_label, host.locale || 'en') || lock.plugin || host.t('applock.some_app');\n  const reason = lockReasonText(lock, host.locale);\n  const base = reason\n    ? host.t('applock.held_reason', { app: who, reason })\n    : host.t('applock.held', { app: who });\n  const until = lockUntilText(lock.until, host);\n  return until ? `${base} ${until}` : base;\n}\n\n/** \" — until 3 Oct 2026\", or `''` when the lock has no end. */\nexport function lockUntilText(until: string | null | undefined, host: LockWordsHost): string {\n  if (!until) return '';\n  const ms = Date.parse(until);\n  if (!Number.isFinite(ms)) return '';\n  const when = host.formatDate ? host.formatDate(ms, { time: true }) : new Date(ms).toISOString();\n  return host.t('applock.until', { date: when });\n}\n","/**\n * symlink — a link the server will NOT follow, said in words.\n *\n * Issue #34: a symlink to a directory inside a `local` storage root listed as\n * a 0-byte file that would not open. The backend half of the answer landed\n * first: a link whose target is INSIDE the root is now followed, so it comes\n * back as the directory it is and opens normally — nothing here is involved in\n * that case, and nothing here should be. What is left is the other half, which\n * is the half the reporter actually complained about: a link the server\n * refuses to follow still arrives looking like an ordinary file, and clicking\n * it does nothing anybody can explain.\n *\n * ⚠⚠ THE WIRE, AS MEASURED — read this before changing anything below.\n * The driver decides a link's fate in `local.describeLink` and records it as\n * `storage.MetaLinkState` (`followed` / `outside_root` / `broken` /\n * `unresolved`). What reaches the browser:\n *\n *   1. `followed` never arrives. `handlers/manager.go` attaches the keys only\n *      when `o.Kind == storage.KindSymlink`, and a followed link has already\n *      become `KindDirectory`/`KindFile` by then. That is correct — a followed\n *      link IS its target and needs no explaining — so `symlink: true` on the\n *      wire always means \"this one will not open\".\n *   2. `link_state` comes from two places, and since 0.54 both carry it:\n *        • `projectDriverObjects` — the cold-cache / pre-sync listing, read\n *          from the driver itself;\n *        • `projectFileNodes` — the DB cache, i.e. the normal, steady-state\n *          listing (and search, Recent / Starred / tags through `nodeRow`,\n *          \"shared with me\"). The sync records the driver's reason with the\n *          row (migration 00098) and the listing sends it. Before 0.54 the\n *          catalogue had no column for it and this listing sent\n *          `symlink: true` ALONE, so every warm folder said \"Link\".\n *      `symlink: true` with no `link_state` still happens: a row catalogued\n *      before 0.54 until the next sync of its folder, a driver that gives no\n *      reason, and a state a newer server names that this client has never\n *      heard of. That is `'unknown'` below — a first-class state with wording\n *      of its own, never a fall back into silence.\n *\n * `link_target` (the resolved path a followed directory link carries for the\n * walk's cycle guard) is never serialised at all. It is a server-side identity\n * and no surface should grow a dependency on it.\n *\n * ⚠ The wire `type` stays inside the closed `'file' | 'dir'` union: widening\n * it would be a breaking change for every embedder of `@brftech/filex`, so an\n * unfollowable link is reported as a file and FLAGGED. Everything here reads\n * the flag; nothing here looks at `type`.\n *\n * ⚠ ONE reader, for the same reason `lib/appLock` is one reader: the badge on\n * the row, the line in the details panel and the toast after a refused open\n * all take their words from here. A second phrasing is how a badge saying\n * \"Outside\" ends up beside a toast saying \"Error\".\n */\nimport type { FileNode } from '../types/FileNode';\n\n/**\n * Why a link will not open.\n *\n * The first three are `storage.LinkOutsideRoot` / `LinkBroken` /\n * `LinkUnresolved`. `unknown` is ours: the row says it is a link and the\n * server did not say why — a row the sync has not given a reason yet (see the\n * note above), or a server newer than this client that named a state we have\n * never heard of. Both deserve the honest general sentence rather than\n * silence.\n */\nexport type LinkState = 'outside_root' | 'broken' | 'unresolved' | 'unknown';\n\nconst NAMED: readonly string[] = ['outside_root', 'broken', 'unresolved'];\n\n/**\n * The state of a row the server will not follow, or `null` for every ordinary\n * row — including a link it DID follow, which arrives as its target and is not\n * a link as far as anyone using it is concerned.\n */\nexport function linkStateOf(node: Pick<FileNode, 'symlink' | 'link_state'> | null | undefined): LinkState | null {\n  if (!node || node.symlink !== true) return null;\n  const s = node.link_state;\n  return typeof s === 'string' && NAMED.includes(s) ? (s as LinkState) : 'unknown';\n}\n\n/** What `linkWords` needs from the caller's locale. */\nexport interface LinkWordsHost {\n  t: (key: string, vars?: Record<string, string | number>) => string;\n}\n\n/** The short word on the row, and the sentence behind it. */\nexport interface LinkWords {\n  state: LinkState;\n  /** The badge's visible text — two words at most; the row is narrow. */\n  badge: string;\n  /**\n   * What it is, why it will not open, and who can change that — in a sentence,\n   * because \"Outside\" on its own is a second riddle rather than an answer.\n   */\n  why: string;\n}\n\n/**\n * The words for a state.\n *\n * ⚠ BROKEN IS NOT OUTSIDE-OF-ROOT and must never read as if it were. Telling\n * somebody an administrator can allow a link whose target has been deleted\n * sends them to a settings screen that will not help, and leaves the real\n * repair — fix or remove the link on the server — unsaid.\n *\n * ⚠ Literal `t('…')` keys on purpose: `web/tests/i18n/coreKeysUsed.test.ts`\n * scans the source for them and skips anything computed, so a table built with\n * `t('symlink.badge.' + state)` would take these eight strings outside the only\n * check that notices a key nobody ever added to the catalogues.\n */\nexport function linkWords(state: LinkState | null, host: LinkWordsHost): LinkWords | null {\n  switch (state) {\n    case 'outside_root':\n      return { state, badge: host.t('symlink.badge.outside_root'), why: host.t('symlink.why.outside_root') };\n    case 'broken':\n      return { state, badge: host.t('symlink.badge.broken'), why: host.t('symlink.why.broken') };\n    case 'unresolved':\n      return { state, badge: host.t('symlink.badge.unresolved'), why: host.t('symlink.why.unresolved') };\n    case 'unknown':\n      return { state, badge: host.t('symlink.badge.unknown'), why: host.t('symlink.why.unknown') };\n    default:\n      return null;\n  }\n}\n\n/** The one call a view makes: the words for this row, or `null`. */\nexport function linkWordsFor(\n  node: Pick<FileNode, 'symlink' | 'link_state'> | null | undefined,\n  host: LinkWordsHost,\n): LinkWords | null {\n  return linkWords(linkStateOf(node), host);\n}\n\n/**\n * Is this row one no surface may try to open?\n *\n * ⚠⚠ THE DECISION, WRITTEN DOWN. An unfollowable link is refused by the\n * CLIENT, before any request, and the refusal is spoken (a toast carrying\n * `why`). The two alternatives were both live bugs:\n *\n *   • doing nothing is issue #34 itself — the row that \"just does not open\";\n *   • letting the request go is barely better, because the driver answers with\n *     a containment error that surfaces as a generic failure and reads like a\n *     server fault rather than a deliberate, configurable boundary.\n *\n * Refusing here costs nothing the person could have had: the server would\n * refuse it too, and only this side knows the sentence that says why and names\n * the setting that changes it.\n */\nexport function isUnopenableLink(node: Pick<FileNode, 'symlink' | 'link_state'> | null | undefined): boolean {\n  return linkStateOf(node) !== null;\n}\n","/**\n * unavailable - an entry the STORAGE COULD NOT ANSWER FOR, said in words.\n *\n * Issue #104. The storage sync drops a row whose object is gone only when the\n * storage itself says \"not found\". When it answers anything else - a storage\n * plugin that cannot look at a folder, a permission it lacks, a backend error\n * - the row is kept and MARKED: the listing carries `unavailable: true` and\n * the storage's own answer in `unavailable_reason`. The server refuses every\n * operation on it, and on anything inside it, with 409 `ENTRY_UNAVAILABLE`\n * until the storage answers for it again.\n *\n * ⚠ ONE reader, for the reason `lib/symlink` is one: the \"!\" on the row, the\n * line in the details panel, the toast after a refused open and the words for\n * the server's refusal all take their sentence from here, so a badge and a\n * toast can never disagree about what happened.\n *\n * ⚠ The storage's answer is shown as it came (usually English, sometimes a\n * backend's error text), AFTER our own sentence: ours says what it means and\n * what will happen; the reason is the detail an administrator can act on.\n */\nimport type { FileNode } from '../types/FileNode';\n\n/** What `unavailableWords` needs from the caller's locale. */\nexport interface UnavailableWordsHost {\n  t: (key: string, vars?: Record<string, string | number>) => string;\n}\n\n/** The words for an unavailable entry. */\nexport interface UnavailableWords {\n  /** The badge's visible text: one character, the row is narrow. */\n  badge: string;\n  /** What it means and what will happen, in a sentence. */\n  why: string;\n  /** The storage's own answer, '' when it sent none. */\n  reason: string;\n  /** `why` and `reason` together: a tooltip, an aria-label, a toast. */\n  full: string;\n}\n\n/** Is this an entry the storage could not answer for? */\nexport function isUnavailable(node: Pick<FileNode, 'unavailable'> | null | undefined): boolean {\n  return !!node && node.unavailable === true;\n}\n\n/**\n * The words for an unavailable entry, or `null` for every ordinary row.\n *\n * ⚠ Literal `t('…')` keys on purpose: `web/tests/i18n/coreKeysUsed.test.ts`\n * scans the source for them and skips anything computed.\n */\nexport function unavailableWordsFor(\n  node: Pick<FileNode, 'unavailable' | 'unavailable_reason' | 'type'> | null | undefined,\n  host: UnavailableWordsHost,\n): UnavailableWords | null {\n  if (!isUnavailable(node)) return null;\n  const why = node!.type === 'dir' ? host.t('unavailable.why.dir') : host.t('unavailable.why.file');\n  const reason = typeof node!.unavailable_reason === 'string' ? node!.unavailable_reason.trim() : '';\n  const full = reason ? host.t('unavailable.withReason', { why, reason }) : why;\n  return { badge: '!', why, reason, full };\n}\n","/**\n * personName — how filex names a person on screen. ONE rule, every surface.\n *\n * ⚠⚠ QA, 2026-09-21: one administrator was \"admin2\" in the explorer's Owner\n * column, \"admin@local\" in notifications, the permissions panel and the admin\n * tables, and a full name on signatures. Each place had its own chain —\n * display name → username → e-mail (the Owner column, on the server), display\n * name → e-mail (the share dialog, the details panel, the admin header),\n * display name → e-mail local part (the presence strip). One chain now:\n *\n *   the name the server already worked out (`name` — a row's `owner_name`,\n *   `user_name`, `creator_name`: model.PersonLabel on the server, the same\n *   rule) → the display name → the username → the e-mail address.\n *\n * The server's twin is `model.PersonLabel` (backend/internal/model/user.go);\n * web/tests/lib/personName.test.ts and the Go test hold both to the same\n * cases. docs/CONTRIBUTING.md → \"A person is named one way\". The e-mail is a\n * second line or a tooltip where it helps — never the name while a name exists.\n */\nexport interface PersonLike {\n  /** A label the server already resolved by the same rule. */\n  name?: string | null;\n  display_name?: string | null;\n  username?: string | null;\n  email?: string | null;\n}\n\nexport function personName(p: PersonLike | null | undefined): string {\n  if (!p) return '';\n  for (const v of [p.name, p.display_name, p.username, p.email]) {\n    const s = typeof v === 'string' ? v.trim() : '';\n    if (s) return s;\n  }\n  return '';\n}\n\n/**\n * The letter for a person's avatar circle: the first character of their name\n * — a whole character (an emoji or an astral letter is a surrogate PAIR, and\n * one half of it prints as �), upper-cased in the viewer's language (Turkish\n * `i` → `İ`, never `I`). '' when there is no name; the caller draws a glyph.\n */\nexport function personInitial(p: PersonLike | null | undefined, tag?: string): string {\n  const n = personName(p);\n  if (!n) return '';\n  return [...n][0].toLocaleUpperCase(tag);\n}\n","/**\n * pdfFieldsGeom — where a `pdf-fields` box is, as pure arithmetic.\n *\n * A field's place is stored as FRACTIONS of the page's rendered viewport\n * (0..1, origin top-left, CropBox and /Rotate already applied by pdf.js's\n * viewport), so it survives any zoom and any screen. Three conversions are\n * needed around that and they all live here, DOM-free:\n *\n *   fraction ↔ pixel   the drag on screen (a page drawn `size` CSS px wide)\n *   fraction ↔ PDF     the rectangle in PDF user space (points, origin\n *                      bottom-left of the UNROTATED page) that a stamping\n *                      plugin needs, for /Rotate 0, 90, 180 and 270\n *\n * The rotation maps are the ones pdf.js's `PageViewport` applies: 90 is the\n * page turned clockwise on screen, so the unrotated top-left corner lands at\n * the rendered top-right; 270 turns it counter-clockwise.\n */\n\n/** A box as fractions of the rendered page (0..1, origin top-left). */\nexport interface FracRect {\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n}\n\n/** A box in CSS pixels on a drawn page. */\nexport interface PixelRect {\n  left: number;\n  top: number;\n  width: number;\n  height: number;\n}\n\n/** A box in PDF user space: points, origin bottom-left of the unrotated page. */\nexport interface PdfRect {\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n}\n\n/** The rendered viewport at scale 1: its size after rotation, and that rotation. */\nexport interface PageBox {\n  width: number;\n  height: number;\n  rotation: number;\n}\n\nexport type Rotation = 0 | 90 | 180 | 270;\n\n/** Any degree count as one of the four the PDF spec allows. */\nexport function normRotation(r: number | undefined | null): Rotation {\n  const n = Number(r);\n  if (!Number.isFinite(n)) return 0;\n  const m = ((Math.round(n / 90) * 90) % 360 + 360) % 360;\n  return m as Rotation;\n}\n\n/** The smallest box the editor lets a field shrink to (fractions). */\nexport const MIN_FIELD_FRAC = { w: 0.02, h: 0.01 };\n\nconst clamp01 = (v: number) => Math.min(1, Math.max(0, v));\n\n/** Inside the page, at least the minimum size, no NaN. */\nexport function clampFrac(r: FracRect): FracRect {\n  const w = Math.min(1, Math.max(MIN_FIELD_FRAC.w, Number(r.w) || 0));\n  const h = Math.min(1, Math.max(MIN_FIELD_FRAC.h, Number(r.h) || 0));\n  const x = Math.min(1 - w, clamp01(Number(r.x) || 0));\n  const y = Math.min(1 - h, clamp01(Number(r.y) || 0));\n  return { x, y, w, h };\n}\n\n/** A box drawn between two points (any corner order), as fractions. */\nexport function rectFromPoints(a: { x: number; y: number }, b: { x: number; y: number }): FracRect {\n  return clampFrac({\n    x: Math.min(a.x, b.x),\n    y: Math.min(a.y, b.y),\n    w: Math.abs(a.x - b.x),\n    h: Math.abs(a.y - b.y),\n  });\n}\n\nexport function fracToPixel(r: FracRect, size: { width: number; height: number }): PixelRect {\n  return {\n    left: r.x * size.width,\n    top: r.y * size.height,\n    width: r.w * size.width,\n    height: r.h * size.height,\n  };\n}\n\nexport function pixelToFrac(px: PixelRect, size: { width: number; height: number }): FracRect {\n  const W = size.width || 1;\n  const H = size.height || 1;\n  return { x: px.left / W, y: px.top / H, w: px.width / W, h: px.height / H };\n}\n\n/** A pointer position on a drawn page (CSS px from its top-left) as fractions. */\nexport function pointToFrac(p: { x: number; y: number }, size: { width: number; height: number }): { x: number; y: number } {\n  return { x: clamp01(p.x / (size.width || 1)), y: clamp01(p.y / (size.height || 1)) };\n}\n\n/** The unrotated page's size in points, from the rendered viewport. */\nexport function unrotatedSize(page: PageBox): { width: number; height: number } {\n  const rot = normRotation(page.rotation);\n  return rot === 90 || rot === 270 ? { width: page.height, height: page.width } : { width: page.width, height: page.height };\n}\n\n/** A rendered point (px, origin top-left) → the unrotated page's top-left system (points). */\nfunction renderedToPage(X: number, Y: number, page: PageBox): { x: number; y: number } {\n  const rot = normRotation(page.rotation);\n  const W = page.width;\n  const H = page.height;\n  switch (rot) {\n    case 90:\n      return { x: Y, y: W - X };\n    case 180:\n      return { x: W - X, y: H - Y };\n    case 270:\n      return { x: H - Y, y: X };\n    default:\n      return { x: X, y: Y };\n  }\n}\n\n/** Inverse of `renderedToPage`. */\nfunction pageToRendered(x: number, y: number, page: PageBox): { X: number; Y: number } {\n  const rot = normRotation(page.rotation);\n  const W = page.width;\n  const H = page.height;\n  switch (rot) {\n    case 90:\n      return { X: W - y, Y: x };\n    case 180:\n      return { X: W - x, Y: H - y };\n    case 270:\n      return { X: y, Y: H - x };\n    default:\n      return { X: x, Y: y };\n  }\n}\n\n/** Fractions of the rendered page → PDF user-space rectangle (points, origin bottom-left, unrotated). */\nexport function fracToPdf(r: FracRect, page: PageBox): PdfRect {\n  const a = renderedToPage(r.x * page.width, r.y * page.height, page);\n  const b = renderedToPage((r.x + r.w) * page.width, (r.y + r.h) * page.height, page);\n  const { height: ph } = unrotatedSize(page);\n  const left = Math.min(a.x, b.x);\n  const right = Math.max(a.x, b.x);\n  const top = Math.min(a.y, b.y);\n  const bottom = Math.max(a.y, b.y);\n  return round({ x: left, y: ph - bottom, w: right - left, h: bottom - top });\n}\n\n/** PDF user-space rectangle → fractions of the rendered page. */\nexport function pdfToFrac(r: PdfRect, page: PageBox): FracRect {\n  const { height: ph } = unrotatedSize(page);\n  const topLeft = { x: r.x, y: ph - (r.y + r.h) };\n  const bottomRight = { x: r.x + r.w, y: ph - r.y };\n  const a = pageToRendered(topLeft.x, topLeft.y, page);\n  const b = pageToRendered(bottomRight.x, bottomRight.y, page);\n  const W = page.width || 1;\n  const H = page.height || 1;\n  return round({\n    x: Math.min(a.X, b.X) / W,\n    y: Math.min(a.Y, b.Y) / H,\n    w: Math.abs(a.X - b.X) / W,\n    h: Math.abs(a.Y - b.Y) / H,\n  });\n}\n\nfunction round<T extends Record<string, number>>(o: T): T {\n  const out: Record<string, number> = {};\n  for (const [k, v] of Object.entries(o)) out[k] = Math.round(v * 1e6) / 1e6;\n  return out as T;\n}\n\n/**\n * v3 §3.2 — the width to draw a page at so the WHOLE page fits the box.\n *\n * ⚠⚠ The complaint that started the round: a signature page you had to\n * scroll in two directions. The document was fitted to the column's WIDTH, so\n * a portrait page in a landscape window ran off the bottom — the boxes were\n * then found by hunting rather than by reading. Fitting means whichever of\n * the two constraints binds.\n *\n * `gap` is the breathing room around the page (the scroll box's padding),\n * taken off the HEIGHT: a page that touches the toolbar reads as clipped.\n * A box with no height yet (before layout) falls back to the width, which is\n * the old behaviour and is corrected on the first resize observation.\n */\nexport function fitPageWidth(\n  box: { width: number; height: number },\n  page: { width: number; height: number },\n  gap = 16,\n): number {\n  const w = Math.max(0, box.width);\n  const h = Math.max(0, box.height) - gap;\n  if (!page.width || !page.height || h <= 0) return w;\n  const byHeight = (h * page.width) / page.height;\n  return Math.max(120, Math.min(w, byHeight));\n}\n","/**\n * signFonts — the closed set of faces a signature may be written in.\n *\n * A typed signature and a `pdf-fields` text field both let the signer choose\n * how their words are drawn, and the choice TRAVELS: it rides back to the\n * plugin as `font` (see docs/APP-PLUGINS-API.md → `pdf-fields` props), which\n * then stamps the PDF in that face. So the browser and the stamping plugin\n * have to agree on a small, stable vocabulary — five keys, not a free-text\n * CSS family — and this file is that vocabulary.\n *\n * ⚠ ONE definition, three readers: the signature pad's \"type\" mode, the\n * pdf-fields overlay and anything that later re-renders a stored value. A\n * second copy is how a signature typed in Caveat comes back in Inter.\n *\n * ⚠ The faces themselves are self-hosted (`styles/sign-fonts.css` +\n * `assets/fonts/`), never a CDN: see that stylesheet's note for why a signing\n * screen in particular must not phone out for a font.\n */\n\n/** The wire value of a `font` choice. */\nexport type SignFontKey = 'caveat' | 'dancing-script' | 'homemade-apple' | 'inter' | 'source-serif';\n\nexport interface SignFont {\n  key: SignFontKey;\n  /** What the person sees in the picker — a font's name is not translated. */\n  name: string;\n  /** Handwriting faces are offered first; the formal pair closes the list. */\n  kind: 'hand' | 'formal';\n  /** The class `styles/sign-fonts.css` declares for this key. */\n  className: string;\n  /**\n   * The same stack as a string, for a canvas `ctx.font` (canvas takes no\n   * class). ⚠ `inter` resolves through `var(--fe-font)` in CSS but a canvas\n   * cannot read a custom property, so its literal stack is spelled out here\n   * and kept in step with `styles/variables.css`.\n   */\n  stack: string;\n}\n\n/** Handwriting first, formal last — the order the picker draws. */\nexport const SIGN_FONTS: readonly SignFont[] = [\n  { key: 'caveat', name: 'Caveat', kind: 'hand', className: 'fe-signfont--caveat', stack: \"'Caveat', cursive\" },\n  {\n    key: 'dancing-script',\n    name: 'Dancing Script',\n    kind: 'hand',\n    className: 'fe-signfont--dancing-script',\n    stack: \"'Dancing Script', cursive\",\n  },\n  {\n    key: 'homemade-apple',\n    name: 'Homemade Apple',\n    kind: 'hand',\n    className: 'fe-signfont--homemade-apple',\n    stack: \"'Homemade Apple', cursive\",\n  },\n  {\n    key: 'inter',\n    name: 'Inter',\n    kind: 'formal',\n    className: 'fe-signfont--inter',\n    stack: 'Inter, system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif',\n  },\n  {\n    key: 'source-serif',\n    name: 'Source Serif 4',\n    kind: 'formal',\n    className: 'fe-signfont--source-serif',\n    stack: \"'Source Serif 4', Georgia, 'Times New Roman', serif\",\n  },\n];\n\n/** The face a screen starts on when the plugin named none. */\nexport const DEFAULT_SIGN_FONT: SignFontKey = 'caveat';\n\n/** The named face, or the default — never `undefined`, so no caller branches. */\nexport function signFont(key: unknown): SignFont {\n  const k = String(key ?? '');\n  return SIGN_FONTS.find((f) => f.key === k) ?? SIGN_FONTS.find((f) => f.key === DEFAULT_SIGN_FONT)!;\n}\n\n/** Is this one of the five? (A value off the wire is not trusted.) */\nexport function isSignFontKey(v: unknown): v is SignFontKey {\n  return typeof v === 'string' && SIGN_FONTS.some((f) => f.key === v);\n}\n","/**\n * pdfFieldRules — what a `text` field on a PDF will accept, as pure data.\n *\n * A signing app does not only want \"a box for some words\": it wants a tax\n * number that is digits, a date in the shape the paper form prints, an\n * address that fits the line. So a `text` field may carry a `rule`, and the\n * browser enforces it WHILE the person types rather than after they submit —\n * an invalid signature page that only says so on the way out is a page that\n * gets signed twice.\n *\n * ⚠ The rule travels back to the plugin with the value\n * (`{fields: [{id, value, font?, rule?}]}`, docs/APP-PLUGINS-API.md →\n * `pdf-fields` props) so the stamper formats what it is handed instead of\n * guessing from the string: `01/02/2026` is a date to a rule and ambiguous\n * text to a parser.\n *\n * ⚠⚠ This is a CONVENIENCE, not the boundary (0.54, #212). The HOST decides:\n * it normalises every text box's `rule` before the screen leaves it\n * (backend/internal/wasmplugin/surface_values.go NormalizePdfRule, so the\n * rule read here is the one it judges by), and at submit it refuses a value\n * that breaks the rule, in its own words, and hands the app each box with\n * the node's own rule and label — not the ones the browser sent back. A fill\n * page posts nothing while it is typed into, so this file keeps only what\n * the signer needs on the spot: the keyboard, the shaping, and the hint\n * under the box. `web/tests/lib/pdfFieldRules.test.ts` and the Go judge read\n * the same cases (`pdf_rule_cases.json`), so the two cannot drift apart.\n */\n\n/**\n * What a `text` field accepts. `any` is the default and means \"anything\".\n *\n * ⚠⚠ v3 §3.3 — there is no `date` rule any more. `date` is a FIELD TYPE,\n * and two ways to ask for the same thing is how you get two answers: a date\n * placed as a date field arrived as `YYYY-MM-DD` and a date typed into a text\n * field under the old rule arrived as `DD/MM/YYYY`, so the stamping plugin\n * had to guess which of its own boxes it was looking at. An older manifest's\n * `kind: \"date\"` is read as `any` rather than refused — the box keeps taking\n * what the person types, it just stops pretending to be a second date\n * control.\n */\nexport type PdfRuleKind = 'any' | 'number' | 'email';\n\nexport const PDF_RULE_KINDS: readonly PdfRuleKind[] = ['any', 'number', 'email'];\n\nexport interface PdfFieldRule {\n  kind: PdfRuleKind;\n  /** Shortest accepted length in characters (0 = no floor). */\n  min?: number;\n  /** Longest accepted length in characters (0 = no ceiling). */\n  max?: number;\n}\n\nexport function isRuleKind(v: unknown): v is PdfRuleKind {\n  return typeof v === 'string' && PDF_RULE_KINDS.includes(v as PdfRuleKind);\n}\n\n/** The wire's `rule`, reduced to something drawable; `null` when there is none. */\nexport function normalizeRule(raw: unknown): PdfFieldRule | null {\n  if (!raw || typeof raw !== 'object') return null;\n  const r = raw as Record<string, unknown>;\n  const kind: PdfRuleKind = isRuleKind(r.kind) ? r.kind : 'any';\n  const out: PdfFieldRule = { kind };\n  const min = Math.trunc(Number(r.min));\n  const max = Math.trunc(Number(r.max));\n  if (Number.isFinite(min) && min > 0) out.min = min;\n  if (Number.isFinite(max) && max > 0) out.max = max;\n  // A bare `{kind: \"any\"}` with no bounds says nothing; treat it as no rule so\n  // it does not travel back as noise.\n  if (out.kind === 'any' && out.min === undefined && out.max === undefined) return null;\n  return out;\n}\n\n/** `inputmode` for the on-screen keyboard a rule wants. */\nexport function ruleInputMode(rule: PdfFieldRule | null): 'text' | 'numeric' | 'email' {\n  if (!rule) return 'text';\n  if (rule.kind === 'number') return 'numeric';\n  if (rule.kind === 'email') return 'email';\n  return 'text';\n}\n\n/** The longest string the rule allows to be typed at all. */\nexport function ruleMaxLength(rule: PdfFieldRule | null): number | undefined {\n  if (!rule) return undefined;\n  return rule.max && rule.max > 0 ? rule.max : undefined;\n}\n\n/**\n * Type-as-you-go shaping. Returns what the field should hold after this\n * keystroke — never an error: a rule refuses a CHARACTER here, and says why\n * only in `ruleError` once there is something to judge.\n */\nexport function applyRule(raw: string, rule: PdfFieldRule | null): string {\n  let v = String(raw ?? '');\n  if (!rule) return v;\n  if (rule.kind === 'number') {\n    // Digits, one leading minus, one decimal separator — the separator kept\n    // as typed so a Turkish keyboard's comma is not silently rewritten.\n    const neg = v.startsWith('-');\n    let seen = false;\n    v = v\n      .split('')\n      .filter((ch) => {\n        if (ch >= '0' && ch <= '9') return true;\n        if ((ch === '.' || ch === ',') && !seen) {\n          seen = true;\n          return true;\n        }\n        return false;\n      })\n      .join('');\n    if (neg) v = `-${v}`;\n  } else if (rule.kind === 'email') {\n    v = v.replace(/\\s+/g, '');\n  }\n  const max = ruleMaxLength(rule);\n  if (max && v.length > max) v = v.slice(0, max);\n  return v;\n}\n\n/** Codes `ruleErrorText` turns into words; `''` when the value is acceptable. */\nexport type PdfRuleError = '' | 'number' | 'email' | 'min' | 'max';\n\n/** Is `value` acceptable under `rule`? An empty value is never wrong here — `required` is a separate question. */\nexport function ruleError(value: unknown, rule: PdfFieldRule | null): PdfRuleError {\n  const v = typeof value === 'string' ? value.trim() : '';\n  if (!rule || v === '') return '';\n  if (rule.min && v.length < rule.min) return 'min';\n  if (rule.max && v.length > rule.max) return 'max';\n  if (rule.kind === 'number') return /^-?\\d+([.,]\\d+)?$/.test(v) ? '' : 'number';\n  if (rule.kind === 'email') return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/.test(v) ? '' : 'email';\n  return '';\n}\n\n","/**\n * pdfFields — the `pdf-fields` node's rules, as pure data.\n *\n * What a field is, which fields a signer may touch, what the node sends\n * back in each mode, and how the editor adds, copies and colours boxes —\n * all DOM-free so the tests can hold the rules without pdf.js or a canvas.\n * `SurfacePdfFields.vue` is the drawing; this is the meaning.\n *\n * Wire shapes follow docs/APP-PLUGINS-API.md → \"Frontend needs (M3)\":\n *   edit mode  → `data.values[id]` = the whole `fields[]` array\n *   fill mode  → `data.values[id]` = `{fields: [{id, value}]}` for the\n *                signer's own fields that hold a value\n */\nimport type { PluginText } from '../types/Plugins';\nimport { clampFrac } from './pdfFieldsGeom';\nimport { isSignFontKey, type SignFontKey } from './signFonts';\nimport { normalizeRule, type PdfFieldRule } from './pdfFieldRules';\n\nexport const PDF_FIELD_TYPES = ['signature', 'initials', 'date', 'text', 'checkbox'] as const;\nexport type PdfFieldType = (typeof PDF_FIELD_TYPES)[number];\n\n/**\n * How a signature or initials box is given: a drawing (the pad's draw or\n * upload), or a name typed in one of the shipped faces. Absent = drawn.\n */\nexport type PdfSignatureStyle = 'drawn' | 'typed';\n\n/** A box whose value is a picture of somebody's hand: signature, initials. */\nexport function isDrawnType(type: string | undefined): boolean {\n  return type === 'signature' || type === 'initials';\n}\n\n/**\n * One line a plugin can print under a signature — the node's\n * `stamp_lines[]` (docs/APP-PLUGINS-API.md → pdf-fields).\n *\n * ⚠⚠ The catalogue is the PLUGIN's, and so are the words: `examples` is how\n * the plugin itself would write the line for each signer id (`'*'` for a box\n * that belongs to anyone), so a card previews the plugin's wording instead\n * of this package inventing one that the paper then contradicts. The VALUES\n * printed on the day come from the plugin's signing record — never from\n * anything typed on this screen.\n */\nexport interface PdfStampLine {\n  id: string;\n  label: PluginText | string;\n  examples?: Record<string, PluginText | string>;\n  /** Printed when a box has made no choice of its own. */\n  default?: boolean;\n}\n\n/**\n * A plugin's catalogue prop (`formats`, `stamp_lines`): the entries that\n * carry an id, each once, in the plugin's order, with their label — and\n * whatever else `more` reads off the raw entry.\n */\nfunction catalogue<T extends { id: string; label: PluginText | string }>(\n  raw: unknown,\n  more: (entry: T, src: Record<string, unknown>) => void,\n): T[] {\n  if (!Array.isArray(raw)) return [];\n  const out: T[] = [];\n  const seen = new Set<string>();\n  for (const src of raw as Array<Record<string, unknown>>) {\n    if (!src || typeof src !== 'object') continue;\n    const id = typeof src.id === 'string' ? src.id.trim() : '';\n    if (!id || seen.has(id)) continue;\n    seen.add(id);\n    const entry = { id, label: (src.label as PluginText | string) ?? id } as T;\n    more(entry, src);\n    out.push(entry);\n  }\n  return out;\n}\n\n/** The `stamp_lines` prop, dropped of anything that could not be offered. */\nexport function normalizeStampLines(raw: unknown): PdfStampLine[] {\n  return catalogue<PdfStampLine>(raw, (entry, l) => {\n    if (l.examples && typeof l.examples === 'object' && !Array.isArray(l.examples)) {\n      entry.examples = l.examples as Record<string, PluginText | string>;\n    }\n    if (l.default === true) entry.default = true;\n  });\n}\n\n/**\n * The line ids a box prints, in the CATALOGUE's order: its own choice, or\n * the catalogue's defaults when it has none. An explicit empty list is a\n * choice (nothing under the signature) and is kept as one.\n */\nexport function linesOf(field: Pick<PdfField, 'lines'>, catalogue: PdfStampLine[]): string[] {\n  if (Array.isArray(field.lines)) {\n    const want = new Set(field.lines);\n    return catalogue.filter((l) => want.has(l.id)).map((l) => l.id);\n  }\n  return catalogue.filter((l) => l.default).map((l) => l.id);\n}\n\n/** The plugin's own wording of one line for a box's signer (`'*'` = anyone). */\nexport function stampExample(line: PdfStampLine, assignee: string | undefined): PluginText | string {\n  const ex = line.examples ?? {};\n  return ex[assignee || '*'] ?? ex['*'] ?? '';\n}\n\nexport interface PdfField {\n  id: string;\n  type: PdfFieldType;\n  /**\n   * v3 3.1 - what the field is CALLED (\"Ad soyad\", \"Imza\", \"Tarih\").\n   *\n   * The reason it exists: a signer was shown a whole document and told to\n   * find their boxes. A named field can be listed, asked for and reported -\n   * the label shows in the box, in the fill form and in the audit trail - and\n   * three boxes of the same type on one page stop being indistinguishable.\n   * Absent: the type's own name stands in, which is what every field placed\n   * before v3 has.\n   */\n  label?: string;\n  /** 1-based. */\n  page: number;\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n  /** A signer id (`signers[].id`). Absent: anybody's. */\n  assignee?: string;\n  required?: boolean;\n  /**\n   * v3 3.3 - false while the box has been DEFINED but not yet put on the\n   * page.\n   *\n   * Naming a box and finding a place for it are two different jobs, and\n   * doing them in one screen is what made the wizard's hardest step: a\n   * palette of types, a rectangle drawn under the pointer and a strip of\n   * properties for whichever box happened to be selected. Defined first,\n   * placed after: the `define` screen writes boxes with `placed: false`,\n   * and `place` hands them out one at a time. Absent means placed, so every\n   * field written before this (and every other plugin's) reads as it did.\n   */\n  placed?: boolean;\n  value?: unknown;\n  /**\n   * `text` only: what the box accepts (`lib/pdfFieldRules`). Enforced while\n   * the person types and echoed back with the value, so the stamping plugin\n   * formats what it is handed instead of guessing from the string.\n   */\n  rule?: PdfFieldRule;\n  /**\n   * `date` only: which layout the date is written in, as one of the ids the\n   * surface offered in its `formats` prop (`DD.MM.YYYY`, `MM/DD/YYYY`,\n   * `YYYY-MM-DD` for the signing app). It is the date field's answer to what\n   * `rule` is for a text one, and it has to SURVIVE the round trip: a box\n   * whose layout is dropped here comes back to the plugin as \"no layout\" and\n   * is stamped in whatever that plugin defaults to — a form that asked for\n   * `12/31/2000` quietly starts printing `31.12.2000`.\n   *\n   * ⚠ Not narrowed to a fixed set on purpose: the catalogue belongs to the\n   * plugin, not to this package.\n   */\n  format?: string;\n  /**\n   * The face the words are drawn in — one of `lib/signFonts`' five keys. On\n   * a `signature`/`initials` field it is the typed-signature face (and only\n   * means something when `style` is `typed`); on a `text`/`date` one it is\n   * the face the stamper should use. Absent = the screen's default.\n   */\n  font?: SignFontKey;\n  /**\n   * `signature`/`initials` only: drawn by hand (absent) or a name typed in\n   * `font`. The requester decides; the signer's pad then offers exactly that.\n   */\n  style?: PdfSignatureStyle;\n  /**\n   * `signature`/`initials` only: which of the plugin's `stamp_lines` are\n   * printed under this signature, by id. Absent = the plugin's default set;\n   * `[]` = nothing under it.\n   */\n  lines?: string[];\n}\n\nexport interface PdfSigner {\n  id: string;\n  label: PluginText | string;\n  color?: string;\n}\n\n/** A sensible first size per type, as fractions of a portrait page. */\nexport const DEFAULT_FIELD_SIZE: Record<PdfFieldType, { w: number; h: number }> = {\n  signature: { w: 0.28, h: 0.06 },\n  initials: { w: 0.1, h: 0.05 },\n  date: { w: 0.16, h: 0.035 },\n  text: { w: 0.26, h: 0.035 },\n  checkbox: { w: 0.03, h: 0.022 },\n};\n\n/** Six colours that read on both palettes; a signer without `color` takes one by position. */\nexport const SIGNER_PALETTE = ['#2563eb', '#16a34a', '#d97706', '#9333ea', '#dc2626', '#0891b2'];\n\nexport function isFieldType(v: unknown): v is PdfFieldType {\n  return typeof v === 'string' && (PDF_FIELD_TYPES as readonly string[]).includes(v);\n}\n\n/** The palette a surface allows: `types` narrowed to known ones, else every type. */\nexport function allowedTypes(raw: unknown): PdfFieldType[] {\n  if (!Array.isArray(raw)) return [...PDF_FIELD_TYPES];\n  const picked = raw.filter(isFieldType);\n  return picked.length ? PDF_FIELD_TYPES.filter((t) => picked.includes(t)) : [...PDF_FIELD_TYPES];\n}\n\n/** The wire's `fields[]`, dropped of anything a browser cannot draw. */\nexport function normalizeFields(raw: unknown): PdfField[] {\n  if (!Array.isArray(raw)) return [];\n  const out: PdfField[] = [];\n  const seen = new Set<string>();\n  for (const f of raw as Array<Record<string, unknown>>) {\n    if (!f || typeof f !== 'object') continue;\n    const id = String(f.id ?? '');\n    if (!id || seen.has(id) || !isFieldType(f.type)) continue;\n    seen.add(id);\n    const box = clampFrac({ x: Number(f.x), y: Number(f.y), w: Number(f.w), h: Number(f.h) });\n    const page = Math.max(1, Math.trunc(Number(f.page) || 1));\n    const field: PdfField = { id, type: f.type, page, ...box };\n    // ⚠ EXACTLY as typed: any script, inner spaces, and a trailing one.\n    // This array round-trips through the plugin while the name is being\n    // typed (`change` is debounced at 300 ms), so a trim here takes the\n    // space back off between two words. Only a name that is nothing at all\n    // is no name; one that is nothing but spaces is carried so the step can\n    // refuse it and say why.\n    if (typeof f.label === 'string' && f.label) field.label = f.label;\n    if (typeof f.assignee === 'string' && f.assignee) field.assignee = f.assignee;\n    if (f.required === true) field.required = true;\n    // ⚠ Only `false` is carried. \"Placed\" is the ordinary state and says\n    // nothing; a flag on every box would be noise on the wire and a second\n    // thing to keep true.\n    if (f.placed === false) field.placed = false;\n    if (f.value !== undefined && f.value !== null) field.value = f.value;\n    const rule = normalizeRule(f.rule);\n    if (rule) field.rule = rule;\n    if (typeof f.format === 'string' && f.format.trim()) field.format = f.format.trim();\n    if (isSignFontKey(f.font)) field.font = f.font;\n    // ⚠ Both ride only on a box whose value is a hand. They must survive the\n    // round trip (the wizard's state is rebuilt from what this posts), and\n    // they mean nothing on a date or a tick.\n    if (isDrawnType(f.type)) {\n      if (f.style === 'typed') field.style = 'typed';\n      if (Array.isArray(f.lines)) {\n        field.lines = [...new Set((f.lines as unknown[]).filter((x): x is string => typeof x === 'string' && !!x))].slice(0, 16);\n      }\n    }\n    out.push(field);\n  }\n  return out;\n}\n\n/** Is this box on the page yet? Absent `placed` means yes. */\nexport function isPlaced(f: PdfField): boolean {\n  return f.placed !== false;\n}\n\n/** The boxes still waiting for a place, in the order they were defined. */\nexport function unplacedFields(list: PdfField[]): PdfField[] {\n  return list.filter((f) => !isPlaced(f));\n}\n\n/**\n * Define a box without placing it: a name, a type, whose it is — and a\n * sensible rectangle it will WEAR once somebody drops it on a page, so\n * placing is one click rather than a drawing exercise.\n */\nexport function defineField(\n  list: PdfField[],\n  type: PdfFieldType,\n  opts: { label?: string; assignee?: string; required?: boolean } = {},\n): PdfField {\n  const size = DEFAULT_FIELD_SIZE[type];\n  const f: PdfField = {\n    id: newFieldId(type, list),\n    type,\n    page: 1,\n    x: 0.1,\n    y: 0.1,\n    w: size.w,\n    h: size.h,\n    placed: false,\n  };\n  if (opts.label?.trim()) f.label = opts.label.trim();\n  if (opts.assignee) f.assignee = opts.assignee;\n  if (opts.required) f.required = true;\n  return f;\n}\n\n/**\n * One date layout a surface offers: the id that travels as `format`, the\n * name to put on the button, and an EXAMPLE of a date written that way —\n * `DD.MM.YYYY` tells somebody nothing that `31.12.2000` does not tell them\n * better.\n */\nexport interface PdfDateFormat {\n  id: string;\n  /** A `Text` from the plugin, as `signers[].label` is; resolve with `lib/pluginLabel`. */\n  label: PluginText | string;\n  example?: string;\n  /**\n   * The TWO ANSWERS that made this layout, when the plugin sends them: the\n   * arrangement (`DDMMYYYY`, `MMDDYY`, `YYYYMMDD`…) and the separator\n   * (`.`, `/`, `-`, a space), each with the plugin's own name for it.\n   * Present: the editor asks the two questions separately, which is what a\n   * grid of layouts really is. Absent: one row of whole layouts, as before.\n   */\n  order?: string;\n  orderLabel?: PluginText | string;\n  separator?: string;\n  separatorLabel?: PluginText | string;\n}\n\n/** The `formats` prop, dropped of anything that could not be drawn. */\nexport function normalizeFormats(raw: unknown): PdfDateFormat[] {\n  return catalogue<PdfDateFormat>(raw, (entry, f) => {\n    if (typeof f.example === 'string' && f.example.trim()) entry.example = f.example.trim();\n    if (typeof f.order === 'string' && f.order.trim()) entry.order = f.order.trim();\n    if (f.order_label) entry.orderLabel = f.order_label as PluginText | string;\n    // ⚠ NOT trimmed and NOT tested for truthiness: a single space is one of\n    // the separators offered, and both would throw it away.\n    if (typeof f.separator === 'string' && f.separator !== '') entry.separator = f.separator;\n    if (f.separator_label) entry.separatorLabel = f.separator_label as PluginText | string;\n  });\n}\n\n/** The three captions the date control needs, as the plugin words them. */\nexport interface PdfDateLabels {\n  order?: PluginText | string;\n  separator?: PluginText | string;\n  example?: PluginText | string;\n}\n\n/** The `date_labels` prop, with anything unusable dropped. */\nexport function normalizeDateLabels(raw: unknown): PdfDateLabels {\n  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return {};\n  const src = raw as Record<string, unknown>;\n  const out: PdfDateLabels = {};\n  for (const k of ['order', 'separator', 'example'] as const) {\n    const v = src[k];\n    if (typeof v === 'string' ? v.trim() : v && typeof v === 'object') out[k] = v as PluginText | string;\n  }\n  return out;\n}\n\n/** One button in a date control: the value that travels, the plugin's name for it. */\nexport interface PdfDateChoice {\n  id: string;\n  label: PluginText | string;\n}\n\n/**\n * The two questions a `formats` catalogue really asks, or null when it\n * does not ask them — the order and the separator, each once, in the\n * catalogue's own order.\n *\n * ⚠ Null when ANY entry is missing half of itself: half a grid drawn as\n * two rows of buttons would offer combinations the plugin never listed,\n * and a layout the plugin does not know is a date stamped in a shape it\n * did not agree to.\n */\nexport function dateChoices(\n  formats: PdfDateFormat[],\n): { orders: PdfDateChoice[]; separators: PdfDateChoice[] } | null {\n  if (!formats.length) return null;\n  const orders: PdfDateChoice[] = [];\n  const separators: PdfDateChoice[] = [];\n  for (const f of formats) {\n    if (f.order === undefined || f.separator === undefined) return null;\n    if (!orders.some((o) => o.id === f.order)) orders.push({ id: f.order, label: f.orderLabel ?? f.order });\n    if (!separators.some((s) => s.id === f.separator)) {\n      separators.push({ id: f.separator, label: f.separatorLabel ?? f.separator });\n    }\n  }\n  return orders.length && separators.length ? { orders, separators } : null;\n}\n\n/**\n * The layout id for a pair of answers: the catalogue's own entry for it,\n * or — when the plugin listed no such pair — the first entry with that\n * arrangement, so changing the separator can never leave the box with a\n * layout the plugin has never heard of.\n */\nexport function formatFor(formats: PdfDateFormat[], order: string, separator: string): string {\n  const exact = formats.find((f) => f.order === order && f.separator === separator);\n  if (exact) return exact.id;\n  return formats.find((f) => f.order === order)?.id ?? formats[0]?.id ?? '';\n}\n\n/** The two answers behind a layout id, as the catalogue records them. */\nexport function splitFormat(\n  formats: PdfDateFormat[],\n  id: string,\n): { order: string; separator: string } | null {\n  const hit = formats.find((f) => f.id === id);\n  if (!hit || hit.order === undefined || hit.separator === undefined) return null;\n  return { order: hit.order, separator: hit.separator };\n}\n\n/** `DDMMYYYY` → ['DD','MM','YYYY']; anything else in the id is ignored. */\nfunction orderTokens(order: string): string[] {\n  const out: string[] = [];\n  let i = 0;\n  while (i < order.length) {\n    if (order.startsWith('YYYY', i)) {\n      out.push('YYYY');\n      i += 4;\n    } else if (order.startsWith('YY', i)) {\n      out.push('YY');\n      i += 2;\n    } else if (order.startsWith('DD', i)) {\n      out.push('DD');\n      i += 2;\n    } else if (order.startsWith('MM', i)) {\n      out.push('MM');\n      i += 2;\n    } else i += 1;\n  }\n  return out;\n}\n\n/**\n * A real date written the chosen way — what the card shows under the two\n * questions, and what the paper will carry.\n *\n * ⚠ Plain ASCII digits, and no `Intl` anywhere near it. The reader's\n * language decides NOTHING here: the arrangement and the separator are the\n * ones just chosen, and the digits are the ones the stamper will print. An\n * example localised into Arabic-Indic numerals would be a promise the PDF\n * then breaks.\n */\nexport function dateExample(order: string, separator: string, on: Date): string {\n  const parts = orderTokens(order).map((t) => {\n    if (t === 'YYYY') return String(on.getFullYear()).padStart(4, '0');\n    if (t === 'YY') return String(on.getFullYear() % 100).padStart(2, '0');\n    if (t === 'MM') return String(on.getMonth() + 1).padStart(2, '0');\n    return String(on.getDate()).padStart(2, '0');\n  });\n  return parts.join(separator);\n}\n\nexport function normalizeSigners(raw: unknown): PdfSigner[] {\n  if (!Array.isArray(raw)) return [];\n  return (raw as Array<Record<string, unknown>>)\n    .filter((s) => s && typeof s === 'object' && typeof s.id === 'string' && s.id)\n    .map((s) => ({\n      id: s.id as string,\n      label: (s.label as PluginText | string) ?? (s.id as string),\n      color: typeof s.color === 'string' ? s.color : undefined,\n    }));\n}\n\n/** The colour a field is drawn in: its signer's, else by the signer's position, else the first. */\nexport function signerColor(signers: PdfSigner[], assignee: string | undefined): string {\n  const idx = signers.findIndex((s) => s.id === assignee);\n  if (idx < 0) return SIGNER_PALETTE[0];\n  return signers[idx].color || SIGNER_PALETTE[idx % SIGNER_PALETTE.length];\n}\n\n/**\n * Fill mode: may `signer` act on this field? Their own, and any field that\n * was never assigned (a one-signer document rarely bothers with assignees).\n */\nexport function isFieldOf(field: Pick<PdfField, 'assignee'>, signer: string | undefined): boolean {\n  if (!field.assignee) return true;\n  return !!signer && field.assignee === signer;\n}\n\n/** What a filled value looks like on the wire, per type. */\nexport function hasValue(field: Pick<PdfField, 'type' | 'value'>): boolean {\n  const v = field.value;\n  if (field.type === 'checkbox') return v === true;\n  return typeof v === 'string' ? v !== '' : v !== undefined && v !== null;\n}\n\n/** One entry of fill mode's answer. `label`/`font`/`rule` ride along when the field has them. */\nexport interface PdfFillEntry {\n  id: string;\n  value: unknown;\n  /** v3 3.1 - the field's name, so the audit trail says what was filled in. */\n  label?: string;\n  font?: SignFontKey;\n  rule?: PdfFieldRule;\n}\n\n/**\n * Fill mode's `data.values[id]`: the signer's own fields that hold a value.\n *\n * ⚠ `font` and `rule` travel WITH the value. The plugin stamps the PDF from\n * this array alone — it never sees the screen — so a signature typed in\n * Caveat that arrives as a bare string is stamped in whatever the plugin\n * happens to default to, which is how a signed document comes back in a\n * face the signer never chose.\n */\nexport function fillValues(fields: PdfField[], signer: string | undefined): { fields: PdfFillEntry[] } {\n  return {\n    fields: fields\n      .filter((f) => isFieldOf(f, signer) && hasValue(f))\n      .map((f) => {\n        const e: PdfFillEntry = { id: f.id, value: f.value };\n        if (f.label) e.label = f.label;\n        if (f.font) e.font = f.font;\n        if (f.rule) e.rule = f.rule;\n        return e;\n      }),\n  };\n}\n\n/** The fields with the values a previous fill answer (`{fields: [{id, value}]}`) carried. */\nexport function applyFillValues(fields: PdfField[], raw: unknown): PdfField[] {\n  const given = (raw as { fields?: unknown } | null)?.fields;\n  if (!Array.isArray(given)) return fields;\n  const byId = new Map<string, { value: unknown; font?: SignFontKey }>();\n  for (const e of given as Array<{ id?: unknown; value?: unknown; font?: unknown }>) {\n    if (e && typeof e.id === 'string') {\n      byId.set(e.id, { value: e.value, font: isSignFontKey(e.font) ? e.font : undefined });\n    }\n  }\n  return fields.map((f) => {\n    const seeded = byId.get(f.id);\n    if (!seeded) return f;\n    return { ...f, value: seeded.value, ...(seeded.font ? { font: seeded.font } : {}) };\n  });\n}\n\n/** One field's face changed (the signer picked another one from the field's own picker). */\nexport function withFont(fields: PdfField[], id: string, font: SignFontKey): PdfField[] {\n  return fields.map((f) => (f.id === id ? { ...f, font } : f));\n}\n\n/** One field changed value. */\nexport function withValue(fields: PdfField[], id: string, value: unknown): PdfField[] {\n  return fields.map((f) => {\n    if (f.id !== id) return f;\n    const next = { ...f };\n    if (value === undefined || value === null || value === '' || value === false) delete next.value;\n    else next.value = value;\n    return next;\n  });\n}\n\n/** Are all the signer's required fields filled? */\nexport function missingRequired(fields: PdfField[], signer: string | undefined): PdfField[] {\n  return fields.filter((f) => f.required && isFieldOf(f, signer) && !hasValue(f));\n}\n\n/** `sig-1`, `sig-2`, … — never one already on the page. */\nexport function newFieldId(type: PdfFieldType, existing: Array<Pick<PdfField, 'id'>>): string {\n  const prefix = { signature: 'sig', initials: 'ini', date: 'date', text: 'text', checkbox: 'chk' }[type];\n  const ids = new Set(existing.map((f) => f.id));\n  for (let n = 1; ; n++) {\n    const id = `${prefix}-${n}`;\n    if (!ids.has(id)) return id;\n  }\n}\n\n/** A field placed at `at` (fractions, top-left) with the type's default size, kept inside the page. */\nexport function placeField(\n  fields: PdfField[],\n  type: PdfFieldType,\n  page: number,\n  at: { x: number; y: number },\n  size: { w: number; h: number } = DEFAULT_FIELD_SIZE[type],\n  assignee?: string,\n): PdfField {\n  const box = clampFrac({ x: at.x, y: at.y, w: size.w, h: size.h });\n  const f: PdfField = { id: newFieldId(type, fields), type, page, ...box };\n  if (assignee) f.assignee = assignee;\n  return f;\n}\n\n/** The same box on another page, as a new field. */\nexport function copyToPage(fields: PdfField[], id: string, page: number): PdfField[] {\n  const src = fields.find((f) => f.id === id);\n  if (!src) return fields;\n  const copy: PdfField = { ...src, id: newFieldId(src.type, fields), page: Math.max(1, Math.trunc(page)) };\n  delete copy.value;\n  return [...fields, copy];\n}\n\n/** Today as `YYYY-MM-DD` in the local calendar — the `date` field's auto value. */\nexport function todayIso(now: Date = new Date()): string {\n  const y = now.getFullYear();\n  const m = String(now.getMonth() + 1).padStart(2, '0');\n  const d = String(now.getDate()).padStart(2, '0');\n  return `${y}-${m}-${d}`;\n}\n","/**\n * surfaceValues — what a surface's nodes hold, as pure data.\n *\n * A plugin view is a conversation: every event the browser posts carries\n * `data.values`, one entry per node that holds a value (contract: \"a node\n * with `id` that holds a value contributes `data.values[id]`\"; a `form`'s\n * fields are FLAT, keyed by field key, because that is what the plugin\n * declared them as). The modal and the inspector section both post events,\n * so the walk that seeds the map from a fresh surface lives here, once, and\n * the two cannot seed differently.\n *\n * DOM-free on purpose: tests exercise the seeding and the field mapping\n * without mounting anything.\n */\nimport type { StorageField } from '../types/Connections';\nimport type {\n  FileChooserNodeProps,\n  FormNodeProps,\n  PdfFieldsNodeProps,\n  PeoplePickerNodeProps,\n  PluginField,\n  SurfaceNode,\n} from '../types/Plugins';\nimport { fillValues, normalizeFields } from './pdfFields';\nimport { labelOf } from './pluginLabel';\n\n/** Every `SurfaceNode` in the tree, depth first (rows are transparent). */\nexport function walkNodes(nodes: SurfaceNode[] | undefined, visit: (n: SurfaceNode) => void): void {\n  for (const n of nodes ?? []) {\n    visit(n);\n    if (n.children?.length) walkNodes(n.children, visit);\n  }\n}\n\n/**\n * The values a surface arrives with: `form.props.values` (flat, by field key,\n * else each field's `default`), `people-picker.props.value`,\n * `file-chooser.props.value`, a `pdf-fields` node's fields and an empty\n * `signature-pad` under the node's id. Nodes without an id hold nothing the\n * server can address, so they contribute nothing.\n */\nexport function initialValues(nodes: SurfaceNode[] | undefined): Record<string, unknown> {\n  const out: Record<string, unknown> = {};\n  walkNodes(nodes, (n) => {\n    const p = (n.props ?? {}) as Record<string, unknown>;\n    if (n.type === 'form') {\n      const fp = p as unknown as FormNodeProps;\n      for (const f of fp.fields ?? []) {\n        if (!f?.key) continue;\n        const given = fp.values?.[f.key];\n        if (given !== undefined) out[f.key] = multiSafe(f, given);\n        else if (f.default !== undefined) out[f.key] = multiSafe(f, f.default);\n        else if (f.multi === true && f.type === 'select') out[f.key] = [];\n      }\n      return;\n    }\n    if (!n.id) return;\n    if (n.type === 'people-picker') {\n      const v = (p as PeoplePickerNodeProps).value;\n      out[n.id] = Array.isArray(v) ? v.filter((x) => x && typeof x.email === 'string') : [];\n    } else if (n.type === 'file-chooser') {\n      const v = (p as FileChooserNodeProps).value;\n      out[n.id] = typeof v === 'string' ? v : '';\n    } else if (n.type === 'pin-input') {\n      out[n.id] = '';\n    } else if (n.type === 'signature-pad') {\n      out[n.id] = null;\n    } else if (n.type === 'pdf-fields') {\n      // Edit mode sends the whole array back; fill mode only the signer's\n      // own filled fields (lib/pdfFields.fillValues) — seeded from what the\n      // surface already carries, so a re-opened screen keeps its values.\n      const pp = p as unknown as PdfFieldsNodeProps;\n      const fields = normalizeFields(pp.fields);\n      out[n.id] = pp.mode === 'fill' ? fillValues(fields, pp.signer) : fields;\n    }\n  });\n  return out;\n}\n\n/**\n * A `multi` select always holds a LIST, whatever the plugin seeded it with.\n *\n * ⚠ A plugin that declares `multi: true` and sends `\"pdf\"` as the default is\n * not wrong on the wire — the contract says the value is \"a string (single)\n * or a list of strings (multi)\" — but a control that receives a string and\n * emits an array would send a different SHAPE back than it was given, and\n * the plugin would have to handle both. Normalised once, on the way in.\n */\nfunction multiSafe(f: PluginField, v: unknown): unknown {\n  if (f.multi !== true || f.type !== 'select') return v;\n  if (Array.isArray(v)) return v.map((x) => String(x));\n  return v === undefined || v === null || v === '' ? [] : [String(v)];\n}\n\nconst FIELD_TYPES = new Set(['string', 'int', 'bool', 'password', 'select']);\n\n/**\n * Is this `bool` a DECISION the person must read, or an on/off switch?\n *\n * The wire HAS a word for it now — `wire.Field.Style` (`switch` | `choice`)\n * — so the plugin's own answer comes first and the guess only runs when the\n * plugin said nothing:\n *\n *   - `style: \"choice\"` → two buttons, `style: \"switch\"` → the toggle. Said\n *     outright, it beats every heuristic below, including `options`: a\n *     plugin that names its two labels and still wants a switch gets one.\n *   - the plugin NAMED the two answers (`options`), which nobody does for a\n *     switch: \"Keep the original / Replace it\" is a decision;\n *   - the field is `required`, i.e. the form will not go until it is\n *     answered — and an unticked checkbox is indistinguishable from a\n *     question nobody has reached yet.\n *\n * Everything else stays the checkbox a settings toggle wants. ⚠ That last\n * line is a GUESS, and a wrong one for a question like \"should this\n * installation add time stamps?\" — which is why the contract asks a plugin\n * to say `style` when the answer matters, rather than this file getting\n * cleverer about bools it was told nothing about.\n *\n * ⚠ `select` never asks: it is buttons whatever `style` says (`storageFieldOf`\n * below), because a surface has no dropdown to fall back to.\n */\nfunction boolIsDecision(f: PluginField): boolean {\n  const style = String(f.style ?? '').toLowerCase();\n  if (style === 'choice') return true;\n  if (style === 'switch') return false;\n  if ((f.options ?? []).length > 0) return true;\n  return f.required === true;\n}\n\n/**\n * A plugin's field as the shared field renderer (`components/StorageFields`)\n * reads it. `i18n_key` is empty on purpose: the renderer asks the catalogue\n * first and falls back to `label` when the key is unknown, and `''` is\n * unknown — so a plugin's own words (already read in the viewer's language)\n * are what show. `secret` fields are drawn masked whatever their type says.\n *\n * ⚠⚠ v3: `choice` is set HERE, for every plugin `select`, and `advanced` is\n * not carried at all. Those two lines are the whole of \"no dropdowns and no\n * hidden sections in a surface\" — applied to the declaration on its way in,\n * so the renderer stays one renderer and no plugin can opt out of the rule\n * by drawing its own control.\n *\n * ⚠⚠ This is the ONLY mapper. Every screen that turns a plugin's `Field`\n * into something drawable goes through it: the surface form\n * (`components/plugin/nodes/SurfaceForm.vue`) AND the admin's own app\n * settings screen (web `components/plugins/AppPluginDetail.vue`). There used\n * to be a second one in the admin (`api/appPlugins.fieldToStorageField`); it\n * never set `choice`, dropped `multi` and carried an `advanced` the contract\n * had already deleted, so one manifest field meant two different things on\n * two screens. A new surface adds a CALLER here, never a mapper of its own.\n */\nexport function storageFieldOf(f: PluginField, locale: string): StorageField {\n  const type = f.secret ? 'password' : FIELD_TYPES.has(String(f.type)) ? f.type : 'string';\n  return {\n    key: f.key,\n    type: type as StorageField['type'],\n    label: labelOf(f.label, locale) || f.key,\n    help: labelOf(f.help, locale) || undefined,\n    i18n_key: '',\n    required: f.required === true,\n    secret: f.secret === true,\n    default: f.default,\n    placeholder: labelOf(f.placeholder, locale) || undefined,\n    options: (f.options ?? []).map((o) => ({ value: String(o.value), label: labelOf(o.label, locale) || String(o.value) })),\n    min: f.min,\n    max: f.max,\n    monospace: f.monospace === true,\n    // ⚠⚠ `text` IS the contract's long text (wire.Field: \"string | password\n    // | int | bool | select | text\"), and the field renderer draws a textarea\n    // only on `multiline`. Nothing mapped the two, so every long field a\n    // plugin asked for arrived as a one-line box — including the signing\n    // app's list of signers, under a help line that says \"one per line\".\n    multiline: f.multiline === true || String(f.type) === 'text',\n    choice: type === 'select' || (type === 'bool' && boolIsDecision(f)),\n    multi: f.multi === true,\n  };\n}\n\n/** Good enough for \"this looks like an address\" — the server validates. */\nexport function looksLikeEmail(s: string): boolean {\n  const v = s.trim();\n  const at = v.indexOf('@');\n  return at > 0 && at < v.length - 1 && !/\\s/.test(v) && v.indexOf('@', at + 1) === -1;\n}\n","/**\n * surfaceConditions — `show_when` / `required_when`, as pure data.\n *\n * v3 §2.1: \"a form may not present a contradiction\". A field may declare\n * that it exists only while another field holds a particular answer (\"the\n * name of the new file\" appears only when the output IS a new file, and is\n * then required), and the renderer — not the plugin — is what makes that\n * true. The plugin cannot opt out of it and cannot get it half right.\n *\n * Three promises, all of them enforced here rather than in a component so\n * the modal, the page, the public shell and the tests share one answer:\n *\n *   1. a field whose `show_when` does not hold is NOT drawn;\n *   2. its value is dropped before the event is posted — it cannot arrive\n *      at the plugin as a surprise, which is the whole point;\n *   3. a field whose `required_when` holds behaves as `required`, so an\n *      empty one blocks the submit instead of failing on the server.\n *\n * ⚠ Conditions CASCADE. A field can be shown by a field that is itself\n * hidden, and a hidden controller answers nothing — so visibility is\n * resolved to a fixed point rather than in one pass. Without it, hiding the\n * middle of a three-field chain leaves the last one on screen asking about\n * an answer nobody can see.\n *\n * ⚠ This is a CONVENIENCE for the person at the screen, not a security\n * boundary — the host re-checks both rules when the job is submitted\n * (v3 §2.1). Same relationship `applies` has with the server's re-check.\n */\nimport type { PluginCondition, PluginField, SurfaceNode } from '../types/Plugins';\nimport { walkNodes } from './surfaceValues';\n\n/** Is there anything in this value at all? `false` and `0` count as answers. */\nexport function hasAnswer(v: unknown): boolean {\n  if (v === undefined || v === null) return false;\n  if (typeof v === 'string') return v.trim() !== '';\n  if (Array.isArray(v)) return v.length > 0;\n  return true;\n}\n\n/** Every string a value holds — one for a scalar, several for a multi-select. */\nfunction valueStrings(v: unknown): string[] {\n  if (v === undefined || v === null) return [];\n  if (Array.isArray(v)) return v.map((x) => String(x));\n  if (typeof v === 'boolean') return [v ? 'true' : 'false'];\n  return [String(v)];\n}\n\n/**\n * Does `cond` hold against the surface's values?\n *\n * ⚠ An absent condition HOLDS. `show_when: null` is \"always\", which is what\n * every field without one means, so the two paths do not diverge.\n */\nexport function conditionMet(cond: PluginCondition | null | undefined, values: Record<string, unknown>): boolean {\n  if (!cond || !cond.key) return true;\n  const raw = values?.[cond.key];\n  const wanted = cond.equals ?? [];\n  // No list of values: the condition is \"that field has been answered\".\n  if (!wanted.length) return hasAnswer(raw);\n  if (!hasAnswer(raw)) return false;\n  const have = valueStrings(raw);\n  return wanted.some((w) => have.includes(String(w)));\n}\n\n/** The fields of one form that the person may see, conditions cascaded. */\nexport function visibleFields(\n  fields: PluginField[] | undefined,\n  values: Record<string, unknown>,\n): PluginField[] {\n  const all = (fields ?? []).filter((f) => f && f.key);\n  if (!all.length) return [];\n\n  // Fixed point: a field hidden in this pass stops answering for the next\n  // one, which can hide the field that depended on it, and so on. Bounded\n  // by the field count — a cycle simply settles.\n  let shown = all;\n  for (let pass = 0; pass <= all.length; pass++) {\n    const scope = scopedValues(all, shown, values);\n    const next = all.filter((f) => conditionMet(f.show_when, scope));\n    if (next.length === shown.length) return next;\n    shown = next;\n  }\n  return shown;\n}\n\n/** The values as the VISIBLE fields answer them — a hidden field answers nothing. */\nfunction scopedValues(\n  all: PluginField[],\n  shown: PluginField[],\n  values: Record<string, unknown>,\n): Record<string, unknown> {\n  const visible = new Set(shown.map((f) => f.key));\n  const out: Record<string, unknown> = { ...values };\n  for (const f of all) if (!visible.has(f.key)) delete out[f.key];\n  return out;\n}\n\n/** Is this field required right now — declared, or by a `required_when` that holds? */\nexport function fieldRequired(f: PluginField, values: Record<string, unknown>): boolean {\n  if (f.required === true) return true;\n  if (!f.required_when) return false;\n  return conditionMet(f.required_when, values);\n}\n\n/** Every `form` node's fields in a surface, flat. */\nexport function formFields(nodes: SurfaceNode[] | undefined): PluginField[] {\n  const out: PluginField[] = [];\n  walkNodes(nodes, (n) => {\n    if (n.type !== 'form') return;\n    const fields = (n.props as { fields?: PluginField[] } | undefined)?.fields;\n    for (const f of fields ?? []) if (f && f.key) out.push(f);\n  });\n  return out;\n}\n\n/** The keys a surface is currently NOT showing (across every form on it). */\nexport function hiddenKeys(nodes: SurfaceNode[] | undefined, values: Record<string, unknown>): string[] {\n  const all = formFields(nodes);\n  if (!all.length) return [];\n  const shown = new Set(visibleFields(all, values).map((f) => f.key));\n  return all.filter((f) => !shown.has(f.key)).map((f) => f.key);\n}\n\n/**\n * The values to POST: everything the surface holds, minus what a hidden\n * field was carrying.\n *\n * ⚠ Dropped, not blanked. `{name: \"\"}` is an answer (\"call it nothing\");\n * the contract says the value \"is dropped before the job runs\", so the key\n * must not be in the map at all.\n */\nexport function stripHiddenValues(\n  nodes: SurfaceNode[] | undefined,\n  values: Record<string, unknown>,\n): Record<string, unknown> {\n  const hidden = hiddenKeys(nodes, values);\n  if (!hidden.length) return { ...values };\n  const out = { ...values };\n  for (const k of hidden) delete out[k];\n  return out;\n}\n\n/**\n * The visible-and-required fields a person has not answered. Empty means the\n * submit may go; anything else is what to point at.\n */\nexport function missingRequired(\n  nodes: SurfaceNode[] | undefined,\n  values: Record<string, unknown>,\n): PluginField[] {\n  const all = formFields(nodes);\n  if (!all.length) return [];\n  const shown = visibleFields(all, values);\n  const scope = scopedValues(all, shown, values);\n  return shown.filter((f) => fieldRequired(f, scope) && !hasAnswer(scope[f.key]));\n}\n","/**\n * usePluginSurface — one plugin view's conversation with the server.\n *\n * A `modal` view (PluginViewModal) and an `inspector` section\n * (PluginInspectorSection) draw the same kind of screen and post the same\n * events; what differs is only the frame around it. So the conversation\n * lives here, once: the current surface, the values its nodes hold, the\n * debounced `change`, the footer press, the list row action, and what an\n * answer does — a new screen, a toast, `done`, or `{op}` (the server queued\n * a job; the caller registers the row and closes).\n *\n * Values: seeded from every fresh surface (`lib/surfaceValues.initialValues`),\n * replaced as the components edit them, and sent whole on every event as\n * `data.values`. After a `change` answer the person's current entries WIN\n * over the echo — they may have typed more while the request was out.\n */\nimport { computed, getCurrentInstance, onBeforeUnmount, ref } from 'vue';\nimport type { FileApi } from './useFileApi';\nimport type {\n  PluginSurface,\n  PluginViewEventBody,\n  PluginViewEventData,\n  SurfaceAction,\n  SurfaceOpenRequest,\n} from '../types/Plugins';\nimport { foreignText } from '../lib/direction';\nimport { isOpenRequest } from '../lib/surfaceOpen';\nimport { labelOf } from '../lib/pluginLabel';\nimport { initialValues } from '../lib/surfaceValues';\nimport { missingRequired, stripHiddenValues } from '../lib/surfaceConditions';\n\n/** The contract's debounce for `form` edits → `event: \"change\"`. */\nexport const SURFACE_CHANGE_DEBOUNCE_MS = 300;\n\nexport interface PluginSurfaceHost {\n  api: Pick<FileApi, 'pluginViewEvent'>;\n  plugin: string;\n  view: string;\n  /** Adapter-qualified path the view was opened on — echoed on every event. */\n  path?: () => string | undefined;\n  /**\n   * Every row the view was opened on (a selection) — echoed on every event\n   * as `paths`, beside `path`. Absent or empty for a frame opened on one\n   * row or on none (a deep link, a home page, the inspector, a public page),\n   * which then sends `path` alone, exactly as before.\n   */\n  paths?: () => readonly string[] | undefined;\n  locale: () => string;\n  /** The words for an answer without a surface. */\n  errorText: () => string;\n}\n\nexport interface PluginSurfaceEvents {\n  /** The server enqueued a job: the raw ops row. */\n  onOp: (op: Record<string, unknown>) => void;\n  /** The conversation is over (`done`, or after `{op}`). */\n  onDone: () => void;\n  onToast: (message: string) => void;\n  /**\n   * v3 §3.0 — the answer says \"go to this file\" (`lib/surfaceOpen`).\n   *\n   * ⚠ Raised AFTER `onDone` when the answer also carries `done: true`: the\n   * screen that asked for the navigation is closed first, or the person\n   * arrives at the new one with the old one still over it.\n   *\n   * ⚠ A frame with nowhere to navigate (a public page has no explorer\n   * behind it) simply does not pass this in, and the request is dropped.\n   */\n  onOpen?: (req: SurfaceOpenRequest) => void;\n}\n\nexport function usePluginSurface(host: PluginSurfaceHost, events: PluginSurfaceEvents) {\n  const current = ref<PluginSurface | null>(null);\n  const values = ref<Record<string, unknown>>({});\n  const busy = ref(false);\n  const failure = ref('');\n  /**\n   * v3 §2.1 — the visible, required fields a blocked submit is waiting for.\n   *\n   * ⚠ Pointed at, not merely refused. A submit that does nothing and says\n   * nothing is the worst of the three possible behaviours; this list is what\n   * puts the star and the \"required\" line on the fields themselves.\n   */\n  const invalidKeys = ref<string[]>([]);\n\n  const footer = computed<SurfaceAction[]>(() => current.value?.actions ?? []);\n  const errors = computed(() => current.value?.errors);\n\n  /** A new screen. `keepValues` overlays what the person already entered. */\n  function setSurface(s: PluginSurface | null, keepValues = false): void {\n    current.value = s;\n    failure.value = '';\n    invalidKeys.value = [];\n    const seeded = initialValues(s?.nodes);\n    values.value = keepValues ? { ...seeded, ...values.value } : seeded;\n  }\n\n  function updateValues(v: Record<string, unknown>): void {\n    values.value = v;\n    // Answering one of them clears its mark as it is typed, rather than on\n    // the next press: a field that has been filled must not stay red.\n    if (invalidKeys.value.length) {\n      const still = missingRequired(current.value?.nodes, v).map((f) => f.key);\n      if (still.length !== invalidKeys.value.length) invalidKeys.value = still;\n    }\n  }\n\n  let changeTimer: ReturnType<typeof setTimeout> | null = null;\n  function cancelChange(): void {\n    if (changeTimer !== null) clearTimeout(changeTimer);\n    changeTimer = null;\n  }\n  /** A form edit: one `change` event 300 ms after the last keystroke. */\n  function scheduleChange(): void {\n    cancelChange();\n    changeTimer = setTimeout(() => {\n      changeTimer = null;\n      void post('change');\n    }, SURFACE_CHANGE_DEBOUNCE_MS);\n  }\n\n  let seq = 0;\n\n  async function post(\n    event: PluginViewEventBody['event'],\n    actionId?: string,\n    extra: Omit<PluginViewEventData, 'values'> = {},\n  ): Promise<void> {\n    if (!current.value) return;\n    const blocking = event !== 'change';\n    if (blocking) {\n      cancelChange();\n      if (busy.value) return;\n      busy.value = true;\n    }\n    const mine = ++seq;\n    failure.value = '';\n    // ⚠⚠ The WHOLE selection, on every event (#64). The opening `run` carried\n    // it; echoing only `path` here made the server answer every later event\n    // about the first file, and the submit queue the job on that file alone.\n    const selection = host.paths?.();\n    try {\n      const res = await host.api.pluginViewEvent(host.plugin, host.view, {\n        path: host.path?.(),\n        ...(selection?.length ? { paths: [...selection] } : {}),\n        state: current.value?.state ?? {},\n        event,\n        action_id: actionId,\n        // ⚠⚠ The values a HIDDEN field holds are dropped here, not blanked\n        // (v3 §2.1: \"a value belonging to a hidden field is dropped before\n        // the job runs — it cannot arrive as a surprise\"). The plugin is\n        // re-asked the same question by the host at submit; this is the\n        // client half of the same promise, and it also keeps a `change`\n        // event from echoing back a field the step no longer shows.\n        data: { values: stripHiddenValues(current.value?.nodes, values.value), ...extra },\n      });\n      // A `change` answer that arrives after a later event started is stale:\n      // the later event's answer is the screen that counts.\n      if (!blocking && mine !== seq) return;\n      if (res.op) {\n        events.onOp(res.op);\n        events.onDone();\n        return;\n      }\n      const next = res.surface;\n      if (!next) {\n        failure.value = host.errorText();\n        return;\n      }\n      const toast = labelOf(next.toast, host.locale());\n      if (toast) events.onToast(toast);\n      // ⚠ The order is the contract's: `done` closes the screen, and only\n      // then does the navigation happen. Reversed, the person lands on the\n      // new screen with the finished one still drawn over it.\n      const go = isOpenRequest(next.open) ? next.open : null;\n      if (next.done) {\n        events.onDone();\n        if (go) events.onOpen?.(go);\n        return;\n      }\n      setSurface(next, !blocking);\n      if (go) events.onOpen?.(go);\n    } catch (e) {\n      if (!blocking && mine !== seq) return;\n      // ⚠ An app's own error text never met the catalogue — isolate it.\n      failure.value = foreignText(host.locale(), String((e as Error)?.message ?? e)) || host.errorText();\n    } finally {\n      if (blocking) busy.value = false;\n    }\n  }\n\n  /**\n   * A footer button: `submit` when it is the primary one, `action` otherwise.\n   *\n   * ⚠ A submit is refused locally while a visible, required field is empty.\n   * The server refuses it too — that is the boundary — but a round trip to\n   * be told \"this is required\" about a box that is on the screen is a round\n   * trip the person should not have to make.\n   */\n  function press(a: SurfaceAction): Promise<void> {\n    if (busy.value || a.disabled) return Promise.resolve();\n    if (a.primary) {\n      const missing = missingRequired(current.value?.nodes, values.value);\n      invalidKeys.value = missing.map((f) => f.key);\n      if (missing.length) return Promise.resolve();\n    }\n    return post(a.primary ? 'submit' : 'action', a.id);\n  }\n\n  /** A `list` row's button. */\n  function rowAction(p: { action_id: string; row_id: string }): Promise<void> {\n    return post('action', p.action_id, { row_id: p.row_id });\n  }\n\n  if (getCurrentInstance()) onBeforeUnmount(cancelChange);\n\n  return {\n    current,\n    values,\n    busy,\n    failure,\n    footer,\n    errors,\n    invalidKeys,\n    setSurface,\n    updateValues,\n    scheduleChange,\n    post,\n    press,\n    rowAction,\n    dispose: cancelChange,\n  };\n}\n\nexport type PluginSurfaceStore = ReturnType<typeof usePluginSurface>;\n","/**\n * signaturePad — the `signature-pad` node's rules without a canvas.\n *\n * Which modes a surface offers, how big an uploaded picture may be and how\n * it is fitted, what the value on the wire looks like. The component draws;\n * this decides, so the decisions can be tested on their own.\n */\nimport { DEFAULT_SIGN_FONT, isSignFontKey, type SignFontKey } from './signFonts';\n\nexport const SIGNATURE_MODES = ['draw', 'type', 'upload'] as const;\nexport type SignatureMode = (typeof SIGNATURE_MODES)[number];\n\n/** `data.values[id]` of a signed pad. */\nexport interface SignatureValue {\n  png_b64: string;\n  mode: SignatureMode;\n  /**\n   * `type` mode only: which of the five faces the signer picked\n   * (`lib/signFonts`).\n   *\n   * ⚠ It travels even though the PNG is already rendered in that face,\n   * because the plugin may re-render the name at print resolution rather\n   * than upscale a 600×200 bitmap — and it cannot ask the screen which\n   * font was used after the fact.\n   */\n  font?: SignFontKey;\n}\n\n/** An uploaded picture may weigh this much. */\nexport const SIGNATURE_UPLOAD_MAX_BYTES = 200 * 1024;\n/** The box every signature is fitted into (CSS px). */\nexport const SIGNATURE_MAX_WIDTH = 600;\nexport const SIGNATURE_MAX_HEIGHT = 200;\n/** The pad's own size when the node names none. */\nexport const SIGNATURE_DEFAULT_WIDTH = 480;\nexport const SIGNATURE_DEFAULT_HEIGHT = 160;\n\n/** Ink is black whatever the theme: it ends up on paper, not on a screen. */\nexport const SIGNATURE_INK = '#111111';\n/**\n * The face a typed signature is drawn in when the signer has not chosen one.\n *\n * ⚠⚠ It is a KEY from `lib/signFonts`, not a CSS stack any more. The stack\n * that used to live here named fonts the machine might happen to have\n * ('Segoe Script', 'Apple Chancery', …), so the same name signed on a Mac,\n * on Windows and on a phone came out in three different hands — and on a\n * machine with none of them, in the browser's generic cursive. The five faces\n * are shipped with the package now, so every signer gets the one they picked.\n */\nexport const SIGNATURE_FONT_DEFAULT: SignFontKey = DEFAULT_SIGN_FONT;\n\nexport function isSignatureMode(v: unknown): v is SignatureMode {\n  return typeof v === 'string' && (SIGNATURE_MODES as readonly string[]).includes(v);\n}\n\n/** The modes the node offers, in the catalogue's order; every mode when it names none. */\nexport function signatureModes(raw: unknown): SignatureMode[] {\n  if (!Array.isArray(raw)) return [...SIGNATURE_MODES];\n  const picked = raw.filter(isSignatureMode);\n  return picked.length ? SIGNATURE_MODES.filter((m) => picked.includes(m)) : [...SIGNATURE_MODES];\n}\n\nexport function isSignatureValue(v: unknown): v is SignatureValue {\n  const o = v as SignatureValue | null;\n  return !!o && typeof o === 'object' && typeof o.png_b64 === 'string' && o.png_b64 !== '' && isSignatureMode(o.mode);\n}\n\n/** The face a value was typed in, or the default. Never `undefined`. */\nexport function signatureFontOf(v: unknown): SignFontKey {\n  const o = v as SignatureValue | null;\n  return o && isSignFontKey(o.font) ? o.font : SIGNATURE_FONT_DEFAULT;\n}\n\n/** The pad's drawing size: the node's numbers, bounded, else the defaults. */\nexport function padSize(width: unknown, height: unknown): { width: number; height: number } {\n  const w = Number(width);\n  const h = Number(height);\n  return {\n    width: Number.isFinite(w) && w > 0 ? Math.min(SIGNATURE_MAX_WIDTH, Math.max(120, Math.round(w))) : SIGNATURE_DEFAULT_WIDTH,\n    height: Number.isFinite(h) && h > 0 ? Math.min(SIGNATURE_MAX_HEIGHT, Math.max(60, Math.round(h))) : SIGNATURE_DEFAULT_HEIGHT,\n  };\n}\n\n/** `w×h` scaled down (never up) to fit inside `maxW×maxH`, aspect kept. */\nexport function fitWithin(w: number, h: number, maxW: number, maxH: number): { width: number; height: number } {\n  if (!(w > 0) || !(h > 0)) return { width: maxW, height: maxH };\n  const k = Math.min(1, maxW / w, maxH / h);\n  return { width: Math.max(1, Math.round(w * k)), height: Math.max(1, Math.round(h * k)) };\n}\n\n/** `data:image/png;base64,AAAA` → `AAAA`. Anything without the prefix is returned as is. */\nexport function stripDataUrl(s: string): string {\n  const i = s.indexOf('base64,');\n  return i >= 0 ? s.slice(i + 'base64,'.length) : s;\n}\n\nexport type UploadVerdict = 'ok' | 'too_big' | 'bad_type';\n\n/** PNG or JPEG, at most the ceiling. */\nexport function uploadVerdict(file: { type: string; size: number }): UploadVerdict {\n  if (file.type !== 'image/png' && file.type !== 'image/jpeg') return 'bad_type';\n  if (file.size > SIGNATURE_UPLOAD_MAX_BYTES) return 'too_big';\n  return 'ok';\n}\n\n/** The largest font size (px) at which `text` fits `maxWidth`, measured by the caller. */\nexport function fitFontSize(measure: (px: number) => number, maxWidth: number, maxHeight: number): number {\n  let px = Math.min(96, Math.floor(maxHeight * 0.6));\n  while (px > 12 && measure(px) > maxWidth) px -= 2;\n  return px;\n}\n","/**\n * Where a dropdown list goes, relative to the field it drops from\n * (`components/ChoiceSelect.vue`).\n *\n * The list is teleported out of the field's tree (so no `overflow: hidden`\n * ancestor can clip it) and is `position: fixed`, so it needs viewport\n * coordinates. The rule, once:\n *\n *   - under the field, 4px below it; ABOVE it when the room below is less\n *     than the list wants (capped at 160px) and there is more room above;\n *   - at least as wide as the field and never narrower than 180px, never\n *     wider than the window less an 8px gutter on each side;\n *   - starting at the field's inline-START edge (its right edge in a\n *     right-to-left interface) and pushed back inside the window when it\n *     would cross the far edge (lib/direction `clampAlongInline`);\n *   - as tall as the room on its side allows, between 120px and 320px.\n *\n * ⚠ `start` is the distance from the viewport's inline-start edge, written as\n * `inset-inline-start` on a list that carries the field's `dir` — never a\n * physical left or right (web/tests/quality/rtlLogical.test.ts).\n */\nimport { clampAlongInline, inlineStartX, type TextDirection } from './direction';\n\nexport interface ListPlacement {\n  /** The list's top edge, when it opens downwards. */\n  top: number;\n  /** The list's distance from the viewport's bottom edge, when it opens upwards. */\n  bottom: number;\n  /** The list's distance from the viewport's inline-start edge. */\n  start: number;\n  width: number;\n  maxHeight: number;\n  /** Opens upwards (there was no room below). */\n  up: boolean;\n}\n\n/** A row of the list is at most this tall (a finger's target). */\nconst ROW = 44;\n\nexport function placeListUnder(\n  field: { top: number; bottom: number; left: number; right: number; width: number },\n  viewport: { width: number; height: number },\n  dir: TextDirection,\n  rows: number,\n): ListPlacement {\n  const below = viewport.height - field.bottom - 8;\n  const above = field.top - 8;\n  const want = Math.min(320, rows * ROW + 8);\n  const up = below < Math.min(want, 160) && above > below;\n  const width = Math.min(Math.max(field.width, 180), viewport.width - 16);\n  // A physical x from the viewport's left edge, mirrored for right to left.\n  const x = clampAlongInline(inlineStartX(field, dir), width, viewport.width, dir);\n  return {\n    top: Math.round(field.bottom + 4),\n    bottom: Math.round(viewport.height - field.top + 4),\n    start: Math.round(dir === 'rtl' ? viewport.width - x - width : x),\n    width: Math.round(width),\n    maxHeight: Math.round(Math.max(120, Math.min(320, up ? above : below))),\n    up,\n  };\n}\n","<script setup lang=\"ts\">\n/**\n * ChoiceSelect — one answer from a list, without the browser's own dropdown.\n *\n * ⚠⚠ filex draws NO native select element, anywhere (the owner, 2026-10-04:\n * \"hiç bir yerde öyle basit bir dropdown kullanma\"). The browser's list is\n * painted by the operating system: it ignores the palette, opens white over a\n * dark panel, is a different control on every platform, and on a phone it is\n * a sheet nobody designed. So the choice is ours, in two shapes:\n *\n *   - two to four answers that fit on the line: `ChoiceButtons` (with\n *     `segmented` when it sits inline beside other fields) — every answer is\n *     readable without a click;\n *   - a longer list, or one whose length the data decides (storages, people,\n *     buckets, a plugin's options): this control.\n *\n * `web/tests/ui/noNativeSelect.test.ts` is the gate over both trees, and\n * `web/src/components/ui/Select.vue` is the admin panel's labelled frame\n * around this same component — there is no second implementation.\n *\n * The WAI-ARIA \"select-only combobox\" pattern: a button-like combobox that\n * KEEPS the focus, and a listbox it points into with `aria-activedescendant`.\n *\n * - v-model is a string or a number: the chosen option's own `value` comes\n *   back, so a numeric list needs no `.number` and a mixed one keeps its types;\n * - `options` [{ value, label, help?, disabled? }] — `help` is a second line\n *   under the label (what choosing this one means); a disabled option stays\n *   in the list, greyed, and cannot be chosen by click, arrows or typing;\n * - `id` lands on the combobox, so `<label for=\"id\">` (or a wrapping label)\n *   names it;\n * - `required` / `name`: a hidden input carries the native constraint and the\n *   name into a surrounding form. The form's own check stops on it, the\n *   combobox takes the focus and is marked, and `invalid` is emitted so a host\n *   can say why in its own words (web ui/Select does, through lib/formCheck);\n * - keyboard: ArrowDown / ArrowUp / Enter / Space / Alt+ArrowDown open;\n *   arrows, Home / End and PageUp / PageDown move; typing jumps to the next\n *   label that starts with what was typed; Enter or Space choose; Escape\n *   closes without a change (and is not passed on, so the dialog around it\n *   stays open); Tab chooses and moves on;\n * - the list is teleported to <body> — or into the open <dialog> the field\n *   sits in, because a modal dialog lives in the browser's top layer, above\n *   anything <body> can stack — and placed under the field, or above it when\n *   there is no room below. It starts at the field's inline-start edge (the\n *   right edge in a right-to-left interface) and stays inside the window\n *   (lib/listPlacement), follows scroll and resize, takes its layer from what\n *   it hangs over (lib/popupLayer) and closes on a press anywhere outside it.\n *\n * ⚠ The list leaves the tree that scoped the theme (the explorer's `.fe`, a\n * dialog's theme class, a host's own `--fe-*` overrides), so it carries the\n * field's COMPUTED tokens with it rather than falling back to the light ones\n * on `:root`. Its styles live in base.css, beside ChoiceButtons', for the\n * reason written there (both published stylesheets must carry them).\n *\n * Moved here from the Apps store (filex-apps `FaSelect`, 2026-10-04), which\n * wrote it to come here: Vue, the lucide icons core already ships and the\n * `--fe-*` tokens, every text through props.\n */\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue';\nimport { Check, ChevronDown } from 'lucide-vue-next';\nimport { dirOfElement, type TextDirection } from '../lib/direction';\nimport { placeListUnder, type ListPlacement } from '../lib/listPlacement';\nimport { POPUP_BASE_Z, popupLayer } from '../lib/popupLayer';\n\nexport interface SelectOption {\n  value: string | number;\n  label: string;\n  /** A second line under the label — what choosing this one means. */\n  help?: string;\n  /** Shown, greyed, and not choosable. */\n  disabled?: boolean;\n}\n\ntype Value = string | number;\n\nconst props = withDefaults(\n  defineProps<{\n    modelValue?: Value | null;\n    options: SelectOption[];\n    id?: string;\n    name?: string;\n    /** Shown in the field while no option is chosen. */\n    placeholder?: string;\n    required?: boolean;\n    disabled?: boolean;\n    invalid?: boolean;\n    /** The field's height: the `--fe-h-sm|md|lg` control heights. */\n    size?: 'sm' | 'md' | 'lg';\n    ariaLabel?: string;\n    ariaLabelledby?: string;\n    ariaDescribedby?: string;\n    /** The message a form's own validation carries when a required value is missing. */\n    requiredMessage?: string;\n    /** `data-testid` of the combobox; the list is `<testid>-list`, an option `<testid>-option-<value>`. */\n    testid?: string;\n  }>(),\n  {\n    modelValue: null,\n    id: undefined,\n    name: undefined,\n    placeholder: '',\n    required: false,\n    disabled: false,\n    invalid: false,\n    size: 'md',\n    ariaLabel: undefined,\n    ariaLabelledby: undefined,\n    ariaDescribedby: undefined,\n    requiredMessage: '',\n    testid: undefined,\n  },\n);\nconst emit = defineEmits<{\n  (e: 'update:modelValue', v: Value): void;\n  (e: 'change', v: Value): void;\n  /** The surrounding form's check refused the field (required, nothing chosen). */\n  (e: 'invalid', ev: Event): void;\n}>();\n\n/* Random, not a counter: two of these on one page (a test, a host drawing\n   two explorers) must not share ids, and `useId` is Vue 3.5 while the\n   package asks 3.4 (the same reason as MegaMenu). */\nconst uid = `fe-sel-${Math.random().toString(36).slice(2, 10)}`;\nconst comboId = computed(() => props.id ?? uid);\nconst listId = `${uid}-list`;\nconst optId = (i: number) => `${uid}-opt-${i}`;\n\nconst open = ref(false);\nconst active = ref(-1);\nconst trigger = ref<HTMLButtonElement | null>(null);\nconst panel = ref<HTMLElement | null>(null);\nconst hidden = ref<HTMLInputElement | null>(null);\nconst target = ref<HTMLElement | null>(null);\n/** Where the list is (lib/listPlacement), the layer it sits on and the direction it is laid out in. */\nconst place = ref<ListPlacement & { z: number; dir: TextDirection }>({\n  top: 0,\n  bottom: 0,\n  start: 0,\n  width: 0,\n  maxHeight: 280,\n  up: false,\n  z: POPUP_BASE_Z,\n  dir: 'ltr',\n});\n/** The field's tokens and type, carried onto the teleported list. */\nconst carried = ref<Record<string, string>>({});\nconst flagged = ref(false);\n// What was typed for the jump to a matching option, and when.\nlet typed = '';\nlet typedAt = 0;\n\nconst isEmpty = (v: Value | null | undefined) => v === null || v === undefined || v === '';\nconst selectedIndex = computed(() => props.options.findIndex((o) => o.value === props.modelValue));\nconst selected = computed(() => props.options[selectedIndex.value]);\nconst shown = computed(() => selected.value?.label ?? props.placeholder);\nconst isInvalid = computed(() => props.invalid || flagged.value);\n/** The hidden input exists only for a form to read: a name to send or a value it requires. */\nconst formBound = computed(() => props.required || !!props.name);\n\nfunction syncValidity() {\n  hidden.value?.setCustomValidity(props.required && isEmpty(props.modelValue) ? props.requiredMessage || ' ' : '');\n}\nwatch(\n  () => props.modelValue,\n  (v) => {\n    if (!isEmpty(v)) flagged.value = false;\n    void nextTick(syncValidity);\n  },\n  { immediate: true },\n);\nwatch(() => props.required, () => void nextTick(syncValidity));\nwatch(\n  () => props.disabled,\n  (d) => {\n    if (d) close(false);\n  },\n);\n\n/** The first choosable option from `start`, walking by `step`; -1 when there is none. */\nfunction enabledFrom(start: number, step: number): number {\n  const n = props.options.length;\n  for (let k = 0, i = start; k < n; k++, i += step) {\n    if (i < 0 || i >= n) return -1;\n    if (!props.options[i].disabled) return i;\n  }\n  return -1;\n}\n\n/** The tokens the list paints with, as the FIELD resolves them. */\nconst CARRIED_TOKENS = [\n  '--fe-bg',\n  '--fe-bg-hover',\n  '--fe-border',\n  '--fe-text',\n  '--fe-text-muted',\n  '--fe-primary',\n  '--fe-primary-ink',\n  '--fe-radius',\n  '--fe-radius-sm',\n  '--fe-shadow',\n  '--fe-text-xs',\n];\nfunction readCarried(el: Element): Record<string, string> {\n  const out: Record<string, string> = {};\n  try {\n    const cs = window.getComputedStyle(el);\n    for (const name of CARRIED_TOKENS) {\n      const v = cs.getPropertyValue(name).trim();\n      if (v) out[name] = v;\n    }\n    // The list reads in the type of the field it drops from.\n    if (cs.fontFamily) out['font-family'] = cs.fontFamily;\n    if (cs.fontSize) out['font-size'] = cs.fontSize;\n  } catch {\n    /* A detached node: the stylesheet's own values stand. */\n  }\n  return out;\n}\n\nfunction placePanel() {\n  const t = trigger.value;\n  if (!t) return;\n  const dir = dirOfElement(t);\n  const at = placeListUnder(\n    t.getBoundingClientRect(),\n    { width: window.innerWidth, height: window.innerHeight },\n    dir,\n    props.options.length,\n  );\n  place.value = { ...at, z: place.value.z, dir };\n}\n\nfunction onOutside(e: Event) {\n  const n = e.target as Node | null;\n  if (!n || trigger.value?.contains(n) || panel.value?.contains(n)) return;\n  close(false);\n}\n\nfunction listen(on: boolean) {\n  if (on) {\n    window.addEventListener('resize', placePanel);\n    window.addEventListener('scroll', placePanel, true);\n    document.addEventListener('pointerdown', onOutside, true);\n  } else {\n    window.removeEventListener('resize', placePanel);\n    window.removeEventListener('scroll', placePanel, true);\n    document.removeEventListener('pointerdown', onOutside, true);\n  }\n}\n\nasync function show(at?: number) {\n  if (props.disabled || open.value) return;\n  const t = trigger.value;\n  target.value = (t?.closest('dialog[open]') as HTMLElement | null) ?? document.body;\n  if (t) {\n    carried.value = readCarried(t);\n    place.value = { ...place.value, z: popupLayer(t) };\n  }\n  placePanel();\n  open.value = true;\n  active.value = at ?? (selectedIndex.value >= 0 ? selectedIndex.value : enabledFrom(0, 1));\n  listen(true);\n  await nextTick();\n  scrollActive();\n}\n\nfunction close(refocus = true) {\n  if (!open.value) return;\n  open.value = false;\n  typed = '';\n  listen(false);\n  if (refocus) trigger.value?.focus();\n}\n\nfunction choose(i: number, refocus = true) {\n  const o = props.options[i];\n  if (!o || o.disabled) return;\n  if (o.value !== props.modelValue) {\n    emit('update:modelValue', o.value);\n    emit('change', o.value);\n  }\n  close(refocus);\n}\n\nfunction scrollActive() {\n  const el = document.getElementById(optId(active.value));\n  if (el && typeof el.scrollIntoView === 'function') el.scrollIntoView({ block: 'nearest' });\n}\n\nfunction move(to: number) {\n  if (to < 0) return;\n  active.value = to;\n  void nextTick(scrollActive);\n}\n\n// Typing jumps to the next option whose label starts with what was typed.\nfunction typeahead(ch: string): number {\n  const now = Date.now();\n  typed = now - typedAt > 600 ? ch : typed + ch;\n  typedAt = now;\n  const n = props.options.length;\n  const from = typed.length > 1 ? Math.max(active.value, 0) : active.value + 1;\n  const want = typed.toLocaleLowerCase();\n  for (let k = 0; k < n; k++) {\n    const i = (from + k + n) % n;\n    const o = props.options[i];\n    if (!o.disabled && o.label.toLocaleLowerCase().startsWith(want)) return i;\n  }\n  return -1;\n}\n\nfunction onKey(e: KeyboardEvent) {\n  if (props.disabled) return;\n  const k = e.key;\n  if (!open.value) {\n    if (k === 'ArrowDown' || k === 'ArrowUp' || k === 'Enter' || k === ' ') {\n      e.preventDefault();\n      void show();\n    } else if (k === 'Home' || k === 'End') {\n      e.preventDefault();\n      void show(k === 'Home' ? enabledFrom(0, 1) : enabledFrom(props.options.length - 1, -1));\n    } else if (k.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n      const i = typeahead(k);\n      if (i >= 0) void show(i);\n    }\n    return;\n  }\n  switch (k) {\n    case 'ArrowDown':\n      e.preventDefault();\n      if (e.altKey) return;\n      move(enabledFrom(active.value + 1, 1));\n      return;\n    case 'ArrowUp':\n      e.preventDefault();\n      if (e.altKey) return choose(active.value);\n      move(enabledFrom(active.value - 1, -1));\n      return;\n    case 'Home':\n      e.preventDefault();\n      move(enabledFrom(0, 1));\n      return;\n    case 'End':\n      e.preventDefault();\n      move(enabledFrom(props.options.length - 1, -1));\n      return;\n    case 'PageDown':\n      e.preventDefault();\n      move(enabledFrom(Math.min(active.value + 10, props.options.length - 1), -1));\n      return;\n    case 'PageUp':\n      e.preventDefault();\n      move(enabledFrom(Math.max(active.value - 10, 0), 1));\n      return;\n    case 'Enter':\n    case ' ':\n      e.preventDefault();\n      choose(active.value);\n      return;\n    case 'Escape':\n      // Not passed on: the dialog this field sits in closes on Escape too,\n      // and one press must close the list only.\n      e.preventDefault();\n      e.stopPropagation();\n      close();\n      return;\n    case 'Tab':\n      choose(active.value, false);\n      return;\n  }\n  if (k.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n    const i = typeahead(k);\n    if (i >= 0) move(i);\n  }\n}\n\nfunction onTrigger() {\n  if (open.value) close();\n  else void show();\n}\n\n/**\n * The form's own validation found the required value missing. The browser's\n * bubble is suppressed (it would speak the BROWSER's language), the field is\n * marked, the host is told, and the combobox takes the focus — only the FIRST\n * refused field of the form does, the rule web/src/lib/formCheck keeps with\n * the same `fxInvalidFocus` mark, so a form refusing two fields at once lands\n * on the first one.\n */\nfunction onInvalid(e: Event) {\n  e.preventDefault();\n  flagged.value = true;\n  emit('invalid', e);\n  const form = hidden.value?.form ?? null;\n  if (form) {\n    if (form.dataset.fxInvalidFocus) return;\n    form.dataset.fxInvalidFocus = '1';\n    queueMicrotask(() => {\n      delete form.dataset.fxInvalidFocus;\n    });\n  }\n  trigger.value?.focus();\n}\n\nonBeforeUnmount(() => listen(false));\ndefineExpose({ focus: () => trigger.value?.focus(), open: show, close });\n</script>\n\n<template>\n  <span\n    class=\"fe-select\"\n    :class=\"[\n      size !== 'md' ? `fe-select--${size}` : '',\n      { 'is-open': open, 'is-disabled': disabled, 'is-invalid': isInvalid },\n    ]\"\n  >\n    <button\n      :id=\"comboId\"\n      ref=\"trigger\"\n      type=\"button\"\n      class=\"fe-select__trigger\"\n      role=\"combobox\"\n      :disabled=\"disabled\"\n      aria-haspopup=\"listbox\"\n      :aria-expanded=\"open ? 'true' : 'false'\"\n      :aria-controls=\"listId\"\n      :aria-activedescendant=\"open && active >= 0 ? optId(active) : undefined\"\n      :aria-label=\"ariaLabel\"\n      :aria-labelledby=\"ariaLabelledby\"\n      :aria-describedby=\"ariaDescribedby\"\n      :aria-required=\"required ? 'true' : undefined\"\n      :aria-invalid=\"isInvalid ? 'true' : undefined\"\n      :data-testid=\"testid\"\n      :data-value=\"modelValue ?? ''\"\n      @click=\"onTrigger\"\n      @keydown=\"onKey\"\n      @keyup.space.prevent\n    >\n      <span class=\"fe-select__value\" :class=\"{ 'is-placeholder': !selected }\">{{ shown }}</span>\n      <ChevronDown class=\"fe-select__chev\" aria-hidden=\"true\" />\n    </button>\n    <input\n      v-if=\"formBound\"\n      ref=\"hidden\"\n      class=\"fe-select__native\"\n      tabindex=\"-1\"\n      aria-hidden=\"true\"\n      :name=\"name\"\n      :value=\"modelValue ?? ''\"\n      :required=\"required\"\n      :disabled=\"disabled\"\n      @invalid=\"onInvalid\"\n    />\n    <Teleport v-if=\"open && target\" :to=\"target\">\n      <ul\n        :id=\"listId\"\n        ref=\"panel\"\n        class=\"fe-select__panel\"\n        :class=\"{ 'is-up': place.up }\"\n        :dir=\"place.dir\"\n        role=\"listbox\"\n        :aria-labelledby=\"ariaLabelledby ?? comboId\"\n        :style=\"[\n          carried,\n          {\n            insetInlineStart: place.start + 'px',\n            width: place.width + 'px',\n            maxHeight: place.maxHeight + 'px',\n            top: place.up ? undefined : place.top + 'px',\n            bottom: place.up ? place.bottom + 'px' : undefined,\n            zIndex: place.z,\n          },\n        ]\"\n        :data-testid=\"testid ? `${testid}-list` : undefined\"\n        @mousedown.prevent\n      >\n        <li\n          v-for=\"(o, i) in options\"\n          :id=\"optId(i)\"\n          :key=\"String(o.value)\"\n          class=\"fe-select__option\"\n          :class=\"{ 'is-active': i === active, 'is-selected': o.value === modelValue }\"\n          role=\"option\"\n          :aria-selected=\"o.value === modelValue ? 'true' : 'false'\"\n          :aria-disabled=\"o.disabled ? 'true' : undefined\"\n          :data-value=\"o.value\"\n          :data-testid=\"testid ? `${testid}-option-${o.value === '' ? 'none' : o.value}` : undefined\"\n          @mousemove=\"!o.disabled && (active = i)\"\n          @click=\"choose(i)\"\n        >\n          <span class=\"fe-select__label\">\n            <span class=\"fe-select__text\">{{ o.label }}</span>\n            <span v-if=\"o.help\" class=\"fe-select__help\">{{ o.help }}</span>\n          </span>\n          <Check v-if=\"o.value === modelValue\" class=\"fe-select__check\" aria-hidden=\"true\" />\n        </li>\n      </ul>\n    </Teleport>\n  </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * StorageFields — a driver's config form, rendered from the driver's own\n * descriptor (`GET /api/admin/storage-drivers`) and from nothing else.\n *\n * ⚠ There is no per-driver template here and there must never be one. The\n * form this replaces on the web was a `v-if` chain that drifted away from\n * the backend it posted to — it asked for `base_path` where the driver read\n * `root` and never offered the s3 `prefix` at all, so three of the four\n * drivers it offered answered 400 ROOT_PATH_FORBIDDEN on every submit. The\n * descriptor fixes the class; a hand-written form re-opens it.\n *\n * It lives in the shared package so the desktop app and the web app render\n * the same fields, in the same order, with the same help text, from the\n * same declaration — which is the only way \"the same form on every surface\"\n * survives the next driver.\n */\nimport { computed, ref } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { StorageField, StorageFieldOption } from '../types/Connections';\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport ChoiceButtons, { type ChoiceOption } from './ChoiceButtons.vue';\nimport ChoiceSelect from './ChoiceSelect.vue';\n\nconst props = defineProps<{\n  fields: StorageField[];\n  modelValue: Record<string, unknown>;\n  locale: LocaleCode;\n  /** Keys to mark as failing validation (missing required). */\n  invalid?: string[];\n  /**\n   * Field-level messages, keyed by field key — what a server (an app\n   * plugin's `surface.errors`, a driver's 400) said about the value. A key\n   * here is invalid too, and its own words replace the generic \"required\".\n   */\n  errors?: Record<string, string>;\n  disabled?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'update:modelValue', v: Record<string, unknown>): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst showAdvanced = ref(false);\nconst revealed = ref<Record<string, boolean>>({});\n\nconst basic = computed(() => props.fields.filter((f) => !f.advanced));\nconst advanced = computed(() => props.fields.filter((f) => f.advanced));\n\n/**\n * Translation first, the driver's English fallback second.\n *\n * A driver shipped after this bundle carries labels the catalogue has never\n * heard of. Falling back to the descriptor's own English is how the field\n * still reads as a field instead of as `storages.fields.something`.\n */\nfunction label(f: StorageField): string {\n  const s = t(f.i18n_key);\n  return s === f.i18n_key ? f.label : s;\n}\n\nfunction help(f: StorageField): string {\n  if (!f.help_i18n_key) return f.help ?? '';\n  const s = t(f.help_i18n_key);\n  return s === f.help_i18n_key ? (f.help ?? '') : s;\n}\n\nfunction optionLabel(o: StorageFieldOption): string {\n  if (!o.i18n_key) return o.label;\n  const s = t(o.i18n_key);\n  return s === o.i18n_key ? o.label : s;\n}\n\nfunction set(key: string, value: unknown) {\n  emit('update:modelValue', { ...props.modelValue, [key]: value });\n}\n\n/** Current value, honouring the legacy spellings the driver still reads —\n *  an old row keyed `base_path` shows up in the `root` box rather than as\n *  an empty field the operator would refill by hand. */\nfunction raw(f: StorageField): unknown {\n  const v = props.modelValue?.[f.key];\n  if (v !== undefined && v !== null) return v;\n  for (const alias of f.aliases ?? []) {\n    const a = props.modelValue?.[alias];\n    if (a !== undefined && a !== null) return a;\n  }\n  return f.default ?? undefined;\n}\n\nfunction str(f: StorageField): string {\n  const v = raw(f);\n  return v === undefined || v === null ? '' : String(v);\n}\n\nfunction num(f: StorageField): string {\n  const v = raw(f);\n  return v === '' || v === undefined || v === null ? '' : String(v);\n}\n\nfunction bool(f: StorageField): boolean {\n  return raw(f) === true;\n}\n\nfunction isInvalid(f: StorageField): boolean {\n  return (props.invalid ?? []).includes(f.key) || !!props.errors?.[f.key];\n}\n\nfunction errorText(f: StorageField): string {\n  return props.errors?.[f.key] || (isInvalid(f) ? t('conn.form.required') : '');\n}\n\n/**\n * The options a `choice` field draws as buttons.\n *\n * A `bool` has two by definition and the catalogue names them, unless the\n * declaration named them itself — \"Keep the original / Replace it\" reads\n * better than \"Yes / No\" and is the plugin author's call, not ours.\n */\nfunction choiceOptions(f: StorageField): ChoiceOption[] {\n  if (f.type === 'bool') {\n    const given = (f.options ?? []).filter((o) => o.value === 'true' || o.value === 'false');\n    const yes = given.find((o) => o.value === 'true');\n    const no = given.find((o) => o.value === 'false');\n    return [\n      { value: 'true', label: yes ? optionLabel(yes) : t('conn.form.yes') },\n      { value: 'false', label: no ? optionLabel(no) : t('conn.form.no') },\n    ];\n  }\n  return (f.options ?? []).map((o) => ({ value: o.value, label: optionLabel(o) }));\n}\n\n/** What a `choice` field holds right now, in the shape ChoiceButtons reads. */\nfunction choiceValue(f: StorageField): string | string[] {\n  const v = raw(f);\n  if (f.type === 'bool') return v === true || v === 'true' ? 'true' : v === false || v === 'false' ? 'false' : '';\n  if (f.multi) return Array.isArray(v) ? v.map((x) => String(x)) : v === undefined || v === null || v === '' ? [] : [String(v)];\n  return v === undefined || v === null ? '' : String(v);\n}\n\n/** …and back: a bool becomes a boolean again, everything else stays as declared. */\nfunction setChoice(f: StorageField, v: string | string[]): void {\n  if (f.type === 'bool') {\n    set(f.key, v === 'true');\n    return;\n  }\n  set(f.key, v);\n}\n\n/** A field drawn as buttons — never as a dropdown, never as a lone checkbox. */\nfunction isChoice(f: StorageField): boolean {\n  return f.choice === true && (f.type === 'select' || f.type === 'bool');\n}\n\nfunction inputType(f: StorageField): string {\n  if (f.type === 'int') return 'number';\n  if (f.type === 'password' && !revealed.value[f.key]) return 'password';\n  return 'text';\n}\n\nfunction toggleReveal(key: string) {\n  revealed.value = { ...revealed.value, [key]: !revealed.value[key] };\n}\n</script>\n\n<template>\n  <div class=\"fe-cfield\">\n    <p v-if=\"!fields.length\" class=\"fe-cfield__empty\">{{ t('conn.form.noFields') }}</p>\n\n    <template v-for=\"f in basic\" :key=\"f.key\">\n      <div class=\"fe-cfield__row\" :class=\"{ 'is-invalid': isInvalid(f) }\">\n        <!-- bool: the label belongs next to the box, not above it — unless\n             the field is a DECISION, which is drawn as two buttons under a\n             label of its own (v3 §2.2). -->\n        <label v-if=\"f.type === 'bool' && !isChoice(f)\" class=\"fe-cfield__check\">\n          <input\n            type=\"checkbox\"\n            :checked=\"bool(f)\"\n            :disabled=\"disabled\"\n            @change=\"set(f.key, ($event.target as HTMLInputElement).checked)\"\n          />\n          <span>{{ label(f) }}</span>\n        </label>\n        <label v-else class=\"fe-cfield__label\" :for=\"`fe-cf-${f.key}`\">\n          {{ label(f) }}<span v-if=\"f.required\" class=\"fe-cfield__req\" aria-hidden=\"true\">*</span>\n        </label>\n\n        <ChoiceButtons\n          v-if=\"isChoice(f)\"\n          :options=\"choiceOptions(f)\"\n          :model-value=\"choiceValue(f)\"\n          :multi=\"f.multi === true\"\n          :disabled=\"disabled\"\n          :invalid=\"isInvalid(f)\"\n          :aria-label=\"label(f)\"\n          :testid-prefix=\"`fe-choice-${f.key}`\"\n          @update:model-value=\"(v: string | string[]) => setChoice(f, v)\"\n        />\n\n        <!-- A long or open-ended list (a region, a storage class): core's\n             own list, never the browser's dropdown (#160). -->\n        <ChoiceSelect\n          v-else-if=\"f.type === 'select'\"\n          :id=\"`fe-cf-${f.key}`\"\n          :model-value=\"str(f)\"\n          :options=\"choiceOptions(f)\"\n          :disabled=\"disabled\"\n          :invalid=\"isInvalid(f)\"\n          @update:model-value=\"(v) => set(f.key, String(v))\"\n        />\n\n        <textarea\n          v-else-if=\"f.multiline\"\n          :id=\"`fe-cf-${f.key}`\"\n          class=\"fe-cfield__input fe-cfield__input--area\"\n          :class=\"{ 'fe-cfield__input--mono': f.monospace }\"\n          rows=\"4\"\n          :value=\"str(f)\"\n          :placeholder=\"f.placeholder\"\n          :disabled=\"disabled\"\n          @input=\"set(f.key, ($event.target as HTMLTextAreaElement).value)\"\n        ></textarea>\n\n        <div v-else-if=\"f.type === 'password'\" class=\"fe-cfield__secret\">\n          <input\n            :id=\"`fe-cf-${f.key}`\"\n            class=\"fe-cfield__input fe-cfield__input--mono\"\n            :type=\"inputType(f)\"\n            autocomplete=\"new-password\"\n            spellcheck=\"false\"\n            :value=\"str(f)\"\n            :placeholder=\"f.placeholder\"\n            :disabled=\"disabled\"\n            @input=\"set(f.key, ($event.target as HTMLInputElement).value)\"\n          />\n          <button\n            type=\"button\"\n            class=\"fe-cfield__eye\"\n            :title=\"revealed[f.key] ? t('conn.form.hide') : t('conn.form.reveal')\"\n            :aria-label=\"revealed[f.key] ? t('conn.form.hide') : t('conn.form.reveal')\"\n            @click=\"toggleReveal(f.key)\"\n          >\n            <!-- ikon:emoji — the two states of a secret field. 👁/🙈 were a\n                 hairline dingbat beside a full-colour monkey, i.e. two\n                 different fonts for one toggle; these are the same eye the\n                 context menu's Preview row uses, with and without its slash.\n                 The state is named on the button (title + aria-label). -->\n            <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n            <span\n              aria-hidden=\"true\"\n              v-html=\"actionIconSvg(revealed[f.key] ? 'toggle-hidden' : 'preview')\"\n            ></span>\n          </button>\n        </div>\n\n        <input\n          v-else-if=\"f.type !== 'bool'\"\n          :id=\"`fe-cf-${f.key}`\"\n          class=\"fe-cfield__input\"\n          :class=\"{ 'fe-cfield__input--mono': f.monospace }\"\n          :type=\"inputType(f)\"\n          :value=\"f.type === 'int' ? num(f) : str(f)\"\n          :placeholder=\"f.placeholder\"\n          :min=\"f.min\"\n          :max=\"f.max\"\n          :disabled=\"disabled\"\n          @input=\"\n            set(\n              f.key,\n              f.type === 'int'\n                ? ($event.target as HTMLInputElement).value === ''\n                  ? null\n                  : Number(($event.target as HTMLInputElement).value)\n                : ($event.target as HTMLInputElement).value,\n            )\n          \"\n        />\n\n        <p v-if=\"help(f)\" class=\"fe-cfield__help\">{{ help(f) }}</p>\n        <p v-if=\"errorText(f)\" class=\"fe-cfield__error\">{{ errorText(f) }}</p>\n      </div>\n    </template>\n\n    <div v-if=\"advanced.length\" class=\"fe-cfield__adv\">\n      <button type=\"button\" class=\"fe-cfield__advtoggle\" @click=\"showAdvanced = !showAdvanced\">\n        {{ showAdvanced ? '▾' : '▸' }} {{ t('conn.form.advanced') }}\n      </button>\n      <div v-if=\"showAdvanced\" class=\"fe-cfield__advbody\">\n        <div v-for=\"f in advanced\" :key=\"f.key\" class=\"fe-cfield__row\">\n          <label v-if=\"f.type === 'bool'\" class=\"fe-cfield__check\">\n            <input\n              type=\"checkbox\"\n              :checked=\"bool(f)\"\n              :disabled=\"disabled\"\n              @change=\"set(f.key, ($event.target as HTMLInputElement).checked)\"\n            />\n            <span>{{ label(f) }}</span>\n          </label>\n          <template v-else>\n            <label class=\"fe-cfield__label\" :for=\"`fe-cfa-${f.key}`\">{{ label(f) }}</label>\n            <input\n              :id=\"`fe-cfa-${f.key}`\"\n              class=\"fe-cfield__input\"\n              :class=\"{ 'fe-cfield__input--mono': f.monospace }\"\n              :type=\"inputType(f)\"\n              :value=\"f.type === 'int' ? num(f) : str(f)\"\n              :placeholder=\"f.placeholder\"\n              :disabled=\"disabled\"\n              @input=\"\n                set(\n                  f.key,\n                  f.type === 'int'\n                    ? ($event.target as HTMLInputElement).value === ''\n                      ? null\n                      : Number(($event.target as HTMLInputElement).value)\n                    : ($event.target as HTMLInputElement).value,\n                )\n              \"\n            />\n          </template>\n          <p v-if=\"help(f)\" class=\"fe-cfield__help\">{{ help(f) }}</p>\n          <p v-if=\"errorText(f)\" class=\"fe-cfield__error\">{{ errorText(f) }}</p>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<style>\n.fe-cfield {\n  display: flex;\n  flex-direction: column;\n  gap: 14px;\n}\n.fe-cfield__empty {\n  margin: 0;\n  color: var(--fe-text-muted);\n  font-size: 13px;\n}\n.fe-cfield__row {\n  display: flex;\n  flex-direction: column;\n  gap: 5px;\n}\n.fe-cfield__label {\n  font-size: 13px;\n  font-weight: 600;\n  color: var(--fe-text);\n}\n.fe-cfield__req {\n  color: var(--fe-danger);\n  margin-inline-start: 3px;\n}\n.fe-cfield__input {\n  font: inherit;\n  font-size: 13.5px;\n  padding: 8px 10px;\n  border-radius: var(--fe-radius);\n  border: 1px solid var(--fe-border-strong);\n  background: var(--fe-bg);\n  color: var(--fe-text);\n  width: 100%;\n  /* ⚠ Explicit, because the host's own form styling reaches in here\n     (shadowRoot: false). The desktop shell sets `input[type=\"text\"]\n     { min-width: 260px }` for its settings rows; inherited, that floors\n     every field in this form and overflows a narrow embed. */\n  min-width: 0;\n  box-sizing: border-box;\n}\n.fe-cfield__input:focus {\n  outline: 2px solid var(--fe-primary);\n  outline-offset: -1px;\n}\n.fe-cfield__input--mono {\n  font-family: var(--fe-font-mono);\n  font-size: 12.5px;\n}\n.fe-cfield__input--area {\n  resize: vertical;\n}\n.fe-cfield__row.is-invalid .fe-cfield__input {\n  border-color: var(--fe-danger);\n}\n.fe-cfield__secret {\n  display: flex;\n  gap: 6px;\n  align-items: stretch;\n}\n.fe-cfield__eye {\n  flex: 0 0 auto;\n  /* ikon:emoji — it holds an SVG now, not a 👁, so it centres the box\n     instead of a text baseline. */\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  border: 1px solid var(--fe-border-strong);\n  background: var(--fe-bg-elev);\n  color: var(--fe-text);\n  border-radius: var(--fe-radius);\n  padding: 0 10px;\n  cursor: pointer;\n  font-size: 14px;\n}\n.fe-cfield__eye .fe-aicon {\n  color: currentColor;\n}\n.fe-cfield__check {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 13.5px;\n  color: var(--fe-text);\n  cursor: pointer;\n}\n.fe-cfield__help {\n  margin: 0;\n  font-size: 12px;\n  color: var(--fe-text-muted);\n  line-height: 1.45;\n}\n.fe-cfield__error {\n  margin: 0;\n  font-size: 12px;\n  color: var(--fe-danger);\n}\n.fe-cfield__advtoggle {\n  border: 0;\n  background: none;\n  color: var(--fe-text-muted);\n  font: inherit;\n  font-size: 12.5px;\n  font-weight: 600;\n  cursor: pointer;\n  padding: 2px 0;\n}\n.fe-cfield__advtoggle:hover {\n  color: var(--fe-text);\n}\n.fe-cfield__advbody {\n  display: flex;\n  flex-direction: column;\n  gap: 14px;\n  margin-top: 12px;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * SurfaceForm — a plugin surface's `form` node.\n *\n * The fields are drawn by `StorageFields`, the ONE field renderer this\n * package has (a storage driver's config form, an app's settings form and\n * now a plugin screen all declare `Field[]` in the same shape). This file\n * only translates: a plugin's `label`/`help` may be Text, and the values are\n * flat in the surface's value map, keyed by field key.\n *\n * ⚠⚠ v3 — it also decides WHICH fields exist right now. A field may carry\n * `show_when` / `required_when` (`lib/surfaceConditions`), so \"the name of\n * the new file\" is simply not on the step while the output is a new version\n * of the old one. A form may not present a contradiction, and the renderer\n * is what makes that true rather than each plugin.\n *\n * ⚠ Hiding is only half of it: the hidden field's VALUE must not travel\n * either, or the plugin receives an answer to a question it stopped asking.\n * That half is `usePluginSurface`'s, because it owns what goes on the wire —\n * this component could only blank the value, and `\"\"` is an answer too.\n */\nimport { computed } from 'vue';\nimport type { LocaleCode } from '../../../types/ExplorerConfig';\nimport type { PluginField, PluginText } from '../../../types/Plugins';\nimport { labelOf } from '../../../lib/pluginLabel';\nimport { storageFieldOf } from '../../../lib/surfaceValues';\nimport { fieldRequired, visibleFields } from '../../../lib/surfaceConditions';\nimport StorageFields from '../../StorageFields.vue';\n\nconst props = defineProps<{\n  fields: PluginField[];\n  /** The surface's whole value map — field values are read and written flat. */\n  values: Record<string, unknown>;\n  locale: LocaleCode;\n  /** `surface.errors`: an entry under a field key marks it invalid, with those words. */\n  errors?: Record<string, PluginText>;\n  disabled?: boolean;\n  /** Field keys the host is pointing at as unanswered (a blocked submit). */\n  invalid?: string[];\n}>();\n\nconst emit = defineEmits<{\n  (e: 'update:values', v: Record<string, unknown>): void;\n}>();\n\n/** Only the fields whose `show_when` holds, conditions cascaded. */\nconst shown = computed(() => visibleFields(props.fields, props.values));\n\nconst mapped = computed(() =>\n  shown.value.map((f) => {\n    const sf = storageFieldOf(f, props.locale);\n    // `required_when` is the same promise as `required`, made conditionally:\n    // once the condition holds, the star is on the label and the submit is\n    // blocked — so nobody is refused by the server for a rule the screen\n    // never showed them.\n    return { ...sf, required: fieldRequired(f, props.values) };\n  }),\n);\n\nconst fieldErrors = computed<Record<string, string>>(() => {\n  const out: Record<string, string> = {};\n  for (const f of mapped.value) {\n    const msg = labelOf(props.errors?.[f.key], props.locale);\n    if (msg) out[f.key] = msg;\n  }\n  return out;\n});\n</script>\n\n<template>\n  <div class=\"fe-surface__form\" data-testid=\"surface-form\">\n    <StorageFields\n      :fields=\"mapped\"\n      :model-value=\"values\"\n      :locale=\"locale\"\n      :errors=\"fieldErrors\"\n      :invalid=\"invalid\"\n      :disabled=\"disabled\"\n      @update:model-value=\"(v: Record<string, unknown>) => emit('update:values', v)\"\n    />\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * SurfaceSteps — a plugin surface's `steps` node: where the person is in a\n * wizard. Purely a picture; the plugin moves the active step by answering\n * with a new surface.\n */\nimport type { LocaleCode } from '../../../types/ExplorerConfig';\nimport type { StepsNodeProps } from '../../../types/Plugins';\nimport { useLocale } from '../../../composables/useLocale';\nimport { labelOf } from '../../../lib/pluginLabel';\n\nconst props = defineProps<{\n  items: StepsNodeProps['items'];\n  locale: LocaleCode;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nfunction stateOf(s: unknown): 'done' | 'active' | 'todo' {\n  return s === 'done' || s === 'active' ? s : 'todo';\n}\n</script>\n\n<template>\n  <ol class=\"fe-steps\" :aria-label=\"t('plugin.steps.label')\" data-testid=\"surface-steps\">\n    <li\n      v-for=\"(it, i) in items ?? []\"\n      :key=\"it.id || i\"\n      class=\"fe-steps__item\"\n      :class=\"`is-${stateOf(it.state)}`\"\n      :aria-current=\"stateOf(it.state) === 'active' ? 'step' : undefined\"\n      :data-step=\"it.id\"\n    >\n      <span class=\"fe-steps__marker\" aria-hidden=\"true\">\n        <svg\n          v-if=\"stateOf(it.state) === 'done'\"\n          class=\"fe-ficon\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2.2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          focusable=\"false\"\n        >\n          <path d=\"M4.8 12.6l4.7 4.7L19.2 6.9\" />\n        </svg>\n        <template v-else>{{ i + 1 }}</template>\n      </span>\n      <span class=\"fe-steps__label\">{{ labelOf(it.label, locale) }}</span>\n    </li>\n  </ol>\n</template>\n","/**\n * tablePrefs — where every table that is NOT the explorer's listing keeps its\n * columns and its sort.\n *\n * One corner of the per-person view document (`lib/viewPrefs` →\n * `viewPrefsSlot('t')`), keyed by a table id the table is given:\n *\n *   { \"t\": { \"admin.users\": { \"c\": {w, hidden, o}, \"s\": {k, d} }, … } }\n *\n * ⚠⚠ On the ACCOUNT, like the explorer's folders, and for the same reason the\n * owner gave for those (\"tarayıcıya değil db'ye kaydedeceğiz\"): a column\n * dragged wider in the Users table on the office machine is there at home,\n * and a second person signing into the same browser does not inherit it.\n * With nobody signed in (a public page, an app token) the slot is\n * session-only — the table still resizes and sorts, it just forgets on reload.\n *\n * ⚠ The id is the table's name, not its route: two tables on one page (the\n * Replica screen draws three) need three ids, and a table that moves to\n * another page keeps its arrangement. `web/tests/ui/tablePinnedActions.test.ts`\n * refuses a table with no id and two tables with the same one.\n */\nimport { viewPrefsSlot } from './viewPrefs';\nimport type { ColsState, ColumnBacking } from './tableColumns';\n\n/** One table's remembered state. */\nexport interface TablePrefs {\n  c?: ColsState;\n  s?: { k: string; d: 'asc' | 'desc' };\n}\n\ntype TableMap = Record<string, TablePrefs>;\n\n/**\n * The slot is created lazily and ONCE: `viewPrefsSlot` throws for a reserved\n * name, and calling it at module load would make importing this file a side\n * effect in every bundle that never draws a table.\n */\nlet slot: ReturnType<typeof viewPrefsSlot<TableMap>> | null = null;\nfunction tables() {\n  if (!slot) slot = viewPrefsSlot<TableMap>('t');\n  return slot;\n}\n\nfunction read(): TableMap {\n  const v = tables().get();\n  return v && typeof v === 'object' && !Array.isArray(v) ? v : {};\n}\n\nfunction write(id: string, patch: Partial<TablePrefs>): void {\n  const all = read();\n  const cur: TablePrefs = { ...(all[id] ?? {}) };\n  for (const [k, v] of Object.entries(patch) as [keyof TablePrefs, unknown][]) {\n    if (v === undefined) delete cur[k];\n    else (cur as Record<string, unknown>)[k] = v;\n  }\n  const next = { ...all };\n  if (Object.keys(cur).length) next[id] = cur;\n  else delete next[id];\n  tables().set(next);\n}\n\n/** The backing a `ColumnStore` for table `id` reads and writes through. */\nexport function tableColumnBacking(id: string): ColumnBacking {\n  return {\n    get: () => read()[id]?.c,\n    set: (next) => {\n      const says =\n        Object.keys(next.w).length > 0 || next.hidden.length > 0 || (next.o?.length ?? 0) > 0;\n      write(id, { c: says ? next : undefined });\n    },\n  };\n}\n\n/** The table's remembered sort, or null. */\nexport function tableSort(id: string): { key: string; dir: 'asc' | 'desc' } | null {\n  const s = read()[id]?.s;\n  if (!s || typeof s.k !== 'string' || (s.d !== 'asc' && s.d !== 'desc')) return null;\n  return { key: s.k, dir: s.d };\n}\n\n/** Remember (or with null, forget) the table's sort. */\nexport function setTableSort(id: string, sort: { key: string; dir: 'asc' | 'desc' } | null): void {\n  write(id, { s: sort ? { k: sort.key, d: sort.dir } : undefined });\n}\n","<script setup lang=\"ts\">\n/**\n * ItemCheck — the checkbox on a listing item: the list row's tick column and\n * the grid and gallery cards' corner (issue #26, fourth round: \"only clicking\n * on checkbox selects it\"). One element for the three views, so the tick a\n * card shows cannot drift from the one a row shows.\n *\n * The view binds the click on the wrapper around it and routes it through\n * `checkMod` — the same `click-row` emit and the same `useSelection.click`\n * every selection goes through, so shift ranges and toggles are one\n * implementation, not two.\n *\n * ⚠ A button with role=\"checkbox\", NOT an <input type=\"checkbox\">. The input\n * owns a `checked` state of its own: the browser flips it before the click\n * handler runs and, if the default is prevented, flips it back AFTER Vue has\n * patched — so the row went selected while the box stayed empty (measured:\n * rowSelected=true, domChecked=false). Drawing the state from the selection\n * leaves nothing to drift. Space and Enter still tick it, because a button\n * fires `click` for both.\n *\n * ⚠ A mouse press does not move focus onto it (`mousedown.prevent`). The tick\n * is now the ONLY click that selects, so \"tick, then Space\" is the way to\n * quick-look a file — and Space on a focused button is that button's own\n * activation, which the shortcut layer rightly leaves alone: the peek would\n * never open and the tick would flip back off. Tab still reaches it, and Space\n * still ticks it from the keyboard.\n */\ndefineProps<{\n  /** Whether the item is selected. */\n  on: boolean;\n  /** The item's display name — the checkbox's accessible name. */\n  label: string;\n}>();\n</script>\n\n<template>\n  <button\n    type=\"button\"\n    class=\"fe-list__check\"\n    :class=\"{ 'is-on': on }\"\n    role=\"checkbox\"\n    :aria-checked=\"on ? 'true' : 'false'\"\n    :aria-label=\"label\"\n    :title=\"label\"\n    @mousedown.prevent\n  ></button>\n</template>\n","<script setup lang=\"ts\">\n/**\n * ONE control at the end of a row, and the row's actions behind it.\n *\n * The owner, 2026-09-20: \"adminde aksiyonlar karma karışık; onlarda da aynı\n * explore'da olduğu gibi en dibe sabitli tek buton olmalı. Adminde 'Aksiyon'\n * diye yazmalı, explore'da ⋮ var, adminde aksiyon yazacak.\"\n *\n * What it replaces: a row that ended in two or three unlabelled icon buttons —\n * a pencil, a key, a bin — in a column that had to be 180-260px wide to hold\n * them, differently ordered in every table, and the first thing to fall off\n * the right-hand edge on a narrow window. Users had three unnamed buttons;\n * Webhooks had `test / pencil / bin`, Users `pencil / key / bin`, Shares\n * `link / ban / bin`, and no two agreed on what a ghost button meant.\n *\n * ⚠⚠ THE SAME MENU THE EXPLORER OPENS. This wraps `ContextMenu` — the one the\n * file list's ⋮ opens — rather than building a second popover, for the reason\n * filex lesson #67 records: a menu assembled beside the real one drifts from\n * it the first time an action is added. The only difference between the two\n * surfaces is the handle: the explorer's is the ⋮ glyph, the admin panel's is\n * a LABELLED button reading \"Actions\" / \"Aksiyon\", because an admin row's\n * verbs (revoke a token, reset a password, purge a version) are not guessable\n * from a glyph the way \"open / rename / delete\" are.\n *\n * ⚠ NOTHING MAY BE LOST IN THE MOVE. Every loose button a row used to draw\n * becomes one entry here, disabled entries included: a verb that is currently\n * impossible stays visible and greyed with its reason in `title`, because a\n * hidden verb reads as a missing feature (the same rule ContextMenu already\n * states for the explorer). Destructive verbs keep `danger: true`, which is\n * what paints them apart inside the menu, and keep whatever confirmation\n * dialog the page already put behind them — this control does not confirm\n * anything itself, it only says which verb was chosen.\n *\n * ⚠ `shortcutId: ''` on every entry. `ContextMenu` prints the keyboard hint\n * the shortcut registry holds for an action key, and that registry is the\n * EXPLORER's: a row offering \"Delete\" in the admin panel would otherwise\n * advertise the file manager's Del binding, which does nothing on that page.\n * An entry that genuinely has an admin shortcut can still name one.\n */\nimport { computed, ref } from 'vue';\nimport ContextMenu, { type ContextAction } from './ContextMenu.vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { inlineStartX } from '../lib/direction';\n\nconst props = withDefaults(\n  defineProps<{\n    /** The row's verbs, in the order they should be offered. */\n    actions: ContextAction[];\n    locale?: LocaleCode;\n    /** Overrides the built-in \"Actions\" / \"Aksiyon\" label. */\n    label?: string;\n    /** The whole control is off (a row being saved, a read-only demo). */\n    disabled?: boolean;\n    theme?: ThemeMode;\n    /** A test hook, so a spec can address one row's control without guessing. */\n    testid?: string;\n  }>(),\n  { locale: 'en' as LocaleCode },\n);\n\nconst emit = defineEmits<{\n  (e: 'select', key: string, action: ContextAction): void;\n}>();\n\nconst { t, dir } = useLocale(() => props.locale);\n\nconst menu = ref<{ show: (ev: { clientX: number; clientY: number }, nodes: []) => void } | null>(\n  null,\n);\n\nconst text = computed(() => props.label || t('row.actions'));\n\n/**\n * ⚠ Every entry gets an address. The menu teleports to <body>, so an entry\n * cannot be reached through the component that opened it, and the verbs that\n * used to be loose buttons each had a `data-testid` of their own — losing\n * those would have made the move untestable and quietly un-automatable. An\n * entry's own `testid` wins; otherwise it is this control's testid plus the\n * action key, so `user-actions-3` yields `user-actions-3-delete`.\n */\nconst items = computed<ContextAction[]>(() =>\n  props.actions\n    .filter((a) => !a.hidden)\n    .map((a) => ({\n      ...a,\n      shortcutId: a.shortcutId ?? '',\n      testid: a.testid ?? (props.testid ? `${props.testid}-${a.key}` : undefined),\n    })),\n);\n\n/** A control with nothing behind it is not a control. A row whose every verb\n *  is conditional (Queue: retry only when failed, cancel only when pending)\n *  can legitimately have none, and then the button is disabled rather than\n *  absent, so the column does not go ragged from row to row. */\nconst usable = computed(() => items.value.some((a) => !a.divider && !a.disabled));\n\nfunction open(ev: MouseEvent) {\n  // Anchored to the BUTTON's own corner, exactly as the explorer's ⋮ is\n  // (ListView `onRowMenu`): the menu drops from the control the person\n  // clicked, and ContextMenu flips it left/up itself when the viewport edge\n  // is close — which, for a control pinned to the right edge, is always.\n  const box = (ev.currentTarget as HTMLElement | null)?.getBoundingClientRect();\n  menu.value?.show(\n    // ⚠ RTL: the START corner (right in RTL), as ListView `onRowMenu` does.\n    { clientX: box ? inlineStartX(box, dir.value) : ev.clientX, clientY: box ? box.bottom : ev.clientY },\n    [],\n  );\n}\n\nfunction pick(a: ContextAction) {\n  emit('select', a.key, a);\n}\n</script>\n\n<template>\n  <!-- ⚠ `click.stop`: the shared table emits `row-click` from the cell, and a\n       row that navigates would otherwise fire it under the menu. -->\n  <div class=\"tbl-rowactions\" @click.stop>\n    <button\n      type=\"button\"\n      class=\"tbl-rowactions__btn\"\n      :disabled=\"disabled || !usable\"\n      :data-testid=\"testid\"\n      data-fe-control\n      aria-haspopup=\"menu\"\n      @click.stop=\"open\"\n    >\n      <span>{{ text }}</span>\n      <span class=\"tbl-rowactions__caret\" aria-hidden=\"true\">▾</span>\n    </button>\n    <ContextMenu ref=\"menu\" :locale=\"locale\" :theme=\"theme\" :actions=\"items\" @select=\"pick\" />\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * DataTable — THE table. There is no other.\n *\n * ⚠⚠ This is the explorer's list view with the files taken out of it. The\n * explorer's own listing (`ListView`) renders through it, and so does every\n * other table in the product: every admin page, the connection panels, My\n * shares, the notifications list and an app's `list` node. A raw `<table>` or\n * a second table component anywhere in `web/src` or `packages/core/src` fails\n * `web/tests/ui/tablePinnedActions.test.ts`, and `docs/CONTRIBUTING.md` → \"UI\n * rules\" says why.\n *\n * The owner, 2026-09-21, verbatim: \"Artık explore tablomuz bizim her yerde\n * kullanacağımız tablo yapısıdır; bir yere tablo gerekiyorsa bu tabloyu koymak\n * zorundayız.\" And, about the round before: \"Admin tabloları hâlâ explore\n * tablolarıyla AYNI KODDA DEĞİL … tablo sütunları düzenlenebilir değil,\n * büyütme küçültme yok, sıralama yok.\" That round had built `ui/Table.vue`, a\n * second table that imitated this one — the same frozen edges, the same\n * Actions menu — and got exactly the parts somebody remembered to copy. The\n * rest (resizing, sorting, the column menu, persistence) lived here and never\n * reached the admin panel. The imitation is deleted; this is the one table.\n *\n * WHAT EVERY TABLE THEREFORE GETS, whoever draws it:\n *\n *   · resizable columns — drag the edge, arrow keys on the focused handle,\n *     double-click to put a column back to its shipped width;\n *   · sorting — click a header, click it again to reverse; or, over rows that\n *     are one page of many, headers that are CLOSED and say why, because\n *     sorting one page of a paginated list would lie about the order of the\n *     rest (the same shape as the explorer's ranked search results);\n *   · a column menu (the header's ⋮ or a right-click on the header): show and\n *     hide columns, step them left and right, reset;\n *   · reordering by dragging a header;\n *   · all of it REMEMBERED — on the account, per table (`tableId` →\n *     `lib/tablePrefs`), or per folder for the explorer (its own store);\n *   · the lead column frozen on the left and ONE actions control frozen on\n *     the right while the rest scrolls sideways — the table is as wide as its\n *     columns and scrolls, it never sheds a column for want of room.\n *\n * ⚠ The markup and every class name are the explorer's (`fe-list__*`), on\n * purpose: its stylesheet in `styles/base.css` is this table's stylesheet,\n * and the end-to-end suites that address the explorer's rows keep addressing\n * them. Nothing here carries a colour of its own — every value is a `--fe-*`\n * token, so every table follows the palette the person picked.\n */\nimport { computed, getCurrentInstance, nextTick, onBeforeUnmount, ref, useSlots, watch } from 'vue';\nimport type { Slots } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { useSystemDark } from '../composables/useSystemDark';\nimport {\n  createColumnStore,\n  memoryBacking,\n  type ColumnStore,\n  type LayoutMetrics,\n  type TableColumnSpec,\n} from '../lib/tableColumns';\nimport { setTableSort, tableColumnBacking, tableSort } from '../lib/tablePrefs';\nimport { useTableEnv } from '../lib/tableEnv';\nimport { clampAlongInline, dirOfElement, inlineKeyStep, inlineSign, inlineStartX } from '../lib/direction';\nimport ItemCheck from './ItemCheck.vue';\nimport RowActions from './RowActions.vue';\nimport type { ContextAction } from './ContextMenu.vue';\n\n/** One column of a table. */\nexport interface DataColumn<Row = any> {\n  /** Stable id — the cell slot is `cell-<id>`, and it is what is remembered. */\n  id: string;\n  /** Header text (translated by the caller). */\n  label: string;\n  /** Shipped width, px. */\n  width?: number;\n  min?: number;\n  max?: number;\n  /** May the person hide it (and therefore move it)? Default true. */\n  hideable?: boolean;\n  /** May the person drag its edge? Default true. */\n  resizable?: boolean;\n  /** Does a header click sort by it? Default false. */\n  sortable?: boolean;\n  /** The first direction a click sorts in. Default 'asc'. */\n  sortDir?: 'asc' | 'desc';\n  /** What the column sorts by when the TABLE sorts (uncontrolled). Default:\n   *  `format(row)`, else `row[id]`. Numbers sort as numbers, strings in the\n   *  viewer's collation with digits read as numbers, empty values last. */\n  sortValue?: (row: Row) => string | number | boolean | null | undefined;\n  /** The cell's text when no `cell-<id>` slot is given. Default `row[id]`. */\n  format?: (row: Row) => string | number | null | undefined;\n  /** Hover text for the cell. Default: the text itself when it may be cut. */\n  title?: (row: Row) => string | undefined;\n  align?: 'left' | 'right' | 'center';\n  /** Extra class on the header cell and every body cell of the column. */\n  class?: string;\n  /** Draw the header label? The explorer's star column draws none. */\n  headerLabel?: boolean;\n  /** The column that says WHICH ROW this is: pinned first, frozen left, never\n   *  hidden or moved. Default: the first column. */\n  lead?: boolean;\n}\n\ninterface Group {\n  id: string;\n  label?: string;\n  items: any[];\n}\n\nconst props = withDefaults(\n  defineProps<{\n    rows: any[];\n    columns: DataColumn[];\n    /** How a row is keyed: a property name or a function. Default: its index. */\n    rowKey?: string | ((row: any) => string | number);\n    /** The name its arrangement is remembered under (`lib/tablePrefs`).\n     *  Every table in the product passes one; the guard test refuses a table\n     *  without. Absent = remembered for this mount only. */\n    tableId?: string;\n    /** The explorer passes its own per-folder store; everybody else gets one\n     *  built from `tableId`. */\n    columnStore?: ColumnStore;\n    /** Which non-lead columns this listing will draw at all (the explorer's\n     *  Location only in cross-folder views). Default: every column. */\n    candidates?: string[];\n    /** Table arithmetic, for a caller whose tracks differ (the explorer). */\n    metrics?: LayoutMetrics;\n    locale?: LocaleCode;\n    theme?: ThemeMode;\n    loading?: boolean;\n    /** What an empty table says. '' or null says nothing: no empty-state box\n     *  is drawn at all (a caller showing an error beside the table passes '').\n     *  An `empty` slot still draws. */\n    empty?: string | null;\n    ariaLabel?: string;\n    /** A tick column that selects (issue #26). */\n    selectable?: boolean;\n    isSelected?: (row: any) => boolean;\n    /**\n     * CONTROLLED sort: pass it (null = \"no sort\") and handle `sort`; the\n     * caller orders the rows (a server, or the explorer's sort store). Leave\n     * it out and the table sorts the rows itself and remembers the choice.\n     */\n    sort?: { key: string; dir: 'asc' | 'desc' } | null;\n    /** Headers closed, with this sentence as the reason (the explorer's\n     *  ranked search results). */\n    sortClosed?: string | null;\n    /** Rows in groups under headings (the explorer's date headings). The\n     *  caller has already ordered them; the table draws them as given. */\n    groups?: Group[];\n    rowClass?: (row: any, index: number) => string | Record<string, boolean> | undefined;\n    /** Attributes for a row (`data-*`, `aria-*`, `draggable`, `tabindex`). */\n    rowAttrs?: (row: any) => Record<string, unknown>;\n    /** The row's verbs — drawn as ONE labelled Actions control frozen right. */\n    rowActions?: (row: any) => ContextAction[];\n    /** A test hook for a row's Actions control. */\n    rowActionsTestId?: (row: any) => string | undefined;\n    /** The trailing column's content width, px (the explorer's ⋮ is 28). */\n    actionsWidth?: number;\n    /** A card around the table, with the toolbar and pager inside it. The\n     *  explorer's listing is not framed — its pane is the frame. */\n    framed?: boolean;\n    page?: number;\n    pageSize?: number;\n    total?: number;\n    /** Pages, for an endpoint that answers \"there is another page\" and no\n     *  total. */\n    pages?: number;\n    /** A line in the footer (a count, a note). */\n    footNote?: string;\n  }>(),\n  {\n    locale: undefined,\n    framed: true,\n    rowKey: undefined,\n    tableId: undefined,\n    columnStore: undefined,\n    candidates: undefined,\n    metrics: undefined,\n    theme: undefined,\n    empty: undefined,\n    ariaLabel: undefined,\n    isSelected: undefined,\n    sort: undefined,\n    sortClosed: undefined,\n    groups: undefined,\n    rowClass: undefined,\n    rowAttrs: undefined,\n    rowActions: undefined,\n    rowActionsTestId: undefined,\n    actionsWidth: undefined,\n    page: undefined,\n    pageSize: undefined,\n    total: undefined,\n    pages: undefined,\n    footNote: undefined,\n  },\n);\n\nconst emit = defineEmits<{\n  (e: 'sort', payload: { key: string; dir: 'asc' | 'desc' }): void;\n  (e: 'row-click', row: any, ev: MouseEvent): void;\n  (e: 'row-dblclick', row: any, ev: MouseEvent): void;\n  (e: 'row-contextmenu', row: any, ev: MouseEvent): void;\n  (e: 'check-click', row: any, ev: MouseEvent): void;\n  (e: 'row-action', key: string, row: any, action: ContextAction): void;\n  (e: 'row-dragstart', row: any, ev: DragEvent): void;\n  (e: 'row-dragover', row: any, ev: DragEvent): void;\n  (e: 'row-dragleave', row: any, ev: DragEvent): void;\n  (e: 'row-drop', row: any, ev: DragEvent): void;\n  (e: 'row-touchstart', row: any, ev: TouchEvent): void;\n  (e: 'row-touchend', ev: TouchEvent): void;\n  (e: 'row-touchmove', ev: TouchEvent): void;\n  (e: 'page', page: number): void;\n}>();\n\n/* ⚠ Two roots (the table and the teleported column menu), so a class or a\n * test id the caller puts on <DataTable> would otherwise go nowhere. */\ndefineOptions({ inheritAttrs: false });\n\n/* The host's language and light/dark mode (lib/tableEnv) unless this table\n * was handed its own. */\nconst env = useTableEnv();\nconst lang = computed<LocaleCode>(() => props.locale ?? env?.locale.value ?? 'en');\nconst mode = computed<ThemeMode | undefined>(() => props.theme ?? env?.theme?.value);\n\n// ⚠ RTL: `dir` (the table's language) goes on the teleported column menu; the\n// table's own maths reads the direction it is actually DRAWN in\n// (`dirOfElement(listEl)`), because a pointer only knows physical x.\nconst { t, dir } = useLocale(() => lang.value);\n\n// ── the columns ───────────────────────────────────────────────────────\n\nconst colById = computed(() => {\n  const m = new Map<string, DataColumn>();\n  for (const c of props.columns) m.set(c.id, c);\n  return m;\n});\n\nconst leadId = computed(() => (props.columns.find((c) => c.lead) ?? props.columns[0])?.id ?? '');\n\n/** The columns as the store sees them. */\nconst specs = computed<TableColumnSpec[]>(() =>\n  props.columns.map((c) => {\n    const lead = c.id === leadId.value;\n    const width = c.width ?? (lead ? 240 : 140);\n    return {\n      id: c.id,\n      width,\n      min: Math.min(c.min ?? (lead ? 120 : 56), width),\n      max: Math.max(c.max ?? 900, width),\n      hideable: lead ? false : c.hideable !== false,\n      resizable: c.resizable !== false,\n    };\n  }),\n);\n\n/**\n * THE store: the caller's (the explorer's per-folder one), else one of this\n * table's own, remembered under `tableId` on the account.\n *\n * ⚠ Built once per mount. `tableId` does not change under a mounted table in\n * any caller, and a store rebuilt on every render would throw away the\n * `computed` that keeps the parse to once per change.\n */\nconst ownStore = createColumnStore(\n  () => specs.value,\n  props.tableId ? tableColumnBacking(props.tableId) : memoryBacking(),\n  { lead: leadId.value },\n);\nconst store = computed<ColumnStore>(() => props.columnStore ?? ownStore);\n\n/** The ids this listing is willing to draw at all, lead excluded. */\nconst candidateCols = computed<string[]>(() =>\n  (props.candidates ?? props.columns.map((c) => c.id)).filter((id) => id !== store.value.lead),\n);\n\n// ── the geometry ──────────────────────────────────────────────────────\n\n/** `--fe-gap-sm` between cells and `--fe-gap` down each side. */\nconst CELL_GAP = 8;\nconst ROW_PAD = 12;\n/** The tick's frozen track: its 28px plus the row padding that moves INTO it. */\nconst CHECK_TRACK = 28;\nconst LEAD_CHECK = CHECK_TRACK + ROW_PAD;\n\n/** The trailing column's content width. The explorer's ⋮ is 28; a labelled\n *  \"Actions\" control needs room for its word. */\nconst menuContent = computed(() => props.actionsWidth ?? (props.rowActions ? 92 : 28));\n\nconst metrics = computed<LayoutMetrics>(() => ({\n  gap: CELL_GAP,\n  padding: ROW_PAD * 2,\n  check: props.selectable ? CHECK_TRACK : 0,\n  menu: menuContent.value,\n  ...(props.metrics ?? {}),\n}));\n\n/**\n * The width the table actually has — its OWN scrollport, watched with a\n * ResizeObserver, not the window's. An embed in a side panel is narrow on a\n * wide screen. 0 until the first observation, which the layout reads as\n * \"keep the shipped widths\" so the first paint is not a guess that jumps.\n */\nconst listEl = ref<HTMLElement | null>(null);\nconst listWidth = ref(0);\nlet ro: ResizeObserver | null = null;\nlet pendingWidth = 0;\nlet widthFrame = 0;\n\n/** Is the table scrolled off its START edge? Draws the frozen edges' dividers —\n *  a permanent divider would claim a column floats when it simply fits. */\nconst scrolledX = ref(false);\n\nfunction onListScroll(ev: Event) {\n  const el = ev.currentTarget as HTMLElement | null;\n  /* ⚠⚠ RTL: `scrollLeft` is 0 at the start edge and goes NEGATIVE as a\n     right-to-left table scrolls toward its end (the CSSOM rule every current\n     engine follows). `> 0` was never true there, so the frozen Name and ⋮\n     never drew their edges. Distance from the start, either way. */\n  const on = Math.abs(el?.scrollLeft ?? 0) > 0;\n  if (on !== scrolledX.value) scrolledX.value = on;\n}\n\n/* ⚠ The observer is (re)attached whenever the element appears, not only at\n * mount (filex lesson #226): a table that mounts inside a `v-if` that opens\n * later would otherwise lay out against 0px forever. */\nwatch(\n  listEl,\n  (el) => {\n    ro?.disconnect();\n    ro = null;\n    if (widthFrame) cancelAnimationFrame(widthFrame);\n    widthFrame = 0;\n    if (!el || typeof ResizeObserver === 'undefined') return;\n    /* ⚠ Straight in, no filter (PR #39's \"settler\" was taken back out). The\n       loop it guarded against — this width feeding a layout that summons the\n       vertical scrollbar that changes this width — cannot turn over any more:\n       `.fe-list` reserves the scrollbar's room (`scrollbar-gutter: stable`,\n       base.css), so the scrollbar never changes what is observed here. The\n       filter itself held a REAL resize that came back within 500 ms (a panel\n       toggled open and shut) at the narrower width: measured, the table stayed\n       300px narrower than its pane (e2e 139). */\n    /* ⚠ The width is applied on the next frame, not inside the callback: a\n       layout that changes what is observed in the same delivery makes WebKit\n       report \"ResizeObserver loop completed with undelivered notifications\"\n       as a page error (task #153). A frame later the change is a new\n       observation, not an undelivered one. Only the newest width is applied. */\n    ro = new ResizeObserver((entries) => {\n      const w = entries[0]?.contentRect?.width ?? 0;\n      pendingWidth = w;\n      if (widthFrame) return;\n      widthFrame = requestAnimationFrame(() => {\n        widthFrame = 0;\n        if (Math.abs(pendingWidth - listWidth.value) >= 1) listWidth.value = pendingWidth;\n      });\n    });\n    ro.observe(el);\n  },\n  { flush: 'post' },\n);\n\nconst layout = computed(() => store.value.layout(listWidth.value, candidateCols.value, metrics.value));\nconst visibleCols = computed<string[]>(() => layout.value.visible);\n\n/** ONE object, bound to the header and to every row, so the two cannot drift\n *  out of line with each other when the table is scrolled sideways. */\nconst tableStyle = computed(() => ({ width: `${layout.value.total}px` }));\n\n/**\n * THE FROZEN LEAD — only while it leaves room to scroll.\n *\n * ⚠⚠ A sticky cell wider than the pane covers the pane: 900px of Name frozen\n * in a 706px list paints over every column it was frozen to keep company. So\n * at least `PIN_LEAD_ROOM` of the pane has to be left for the columns that\n * slide under it, or nothing is pinned and the table scrolls as one piece.\n */\nconst PIN_LEAD_ROOM = 160;\n\nconst leadWidth = computed(\n  () =>\n    (props.selectable ? LEAD_CHECK + CELL_GAP : ROW_PAD) +\n    (layout.value.widths[store.value.lead] ?? store.value.width(store.value.lead)),\n);\n\nconst pinLead = computed(\n  () => listWidth.value > 0 && listWidth.value - leadWidth.value >= PIN_LEAD_ROOM,\n);\n\n/** The trailing control's own track: its content plus the row padding. */\nconst menuWidth = computed(() => menuContent.value + ROW_PAD);\n\n/**\n * THE FROZEN CONTROL — the same rule as the lead's, for the same reason.\n *\n * ⚠⚠ A sticky cell paints over whatever slides beneath it, and it carries\n * an opaque ground so it must. A labelled `Actions` control is 104px; in a\n * 265px inspector panel it covered the two columns an app was drawing\n * (State, When) so completely that its signer table read as names and\n * buttons with a gap between them, while the person's promised \"Waiting /\n * Signed / Refused\" was under the pinned cell (v0.43.0). So a control is\n * frozen only while it leaves the columns sliding under it somewhere to be:\n * `PIN_MENU_ROOM` of readable middle beside the lead. Below that nothing is\n * pinned, the row scrolls as one piece, and the person sees the columns\n * first and reaches the verbs with the same swipe the table already asks\n * for.\n *\n * ⚠ Unmeasured (0 on the first tick, a test with no layout) keeps it\n * pinned: that is what every table did before this rule, so nothing flashes.\n */\nconst PIN_MENU_ROOM = 160;\n\nconst pinMenu = computed(\n  () =>\n    listWidth.value <= 0 ||\n    listWidth.value - leadWidth.value - menuWidth.value >= PIN_MENU_ROOM,\n);\n\n/** The lead's sticky offset: after the tick when there is one, the edge when\n *  there is not. */\nconst rootStyle = computed(() => ({\n  '--fe-list-lead': props.selectable ? `${LEAD_CHECK + CELL_GAP}px` : '0px',\n}));\n\n/** A drawn track's width, as the inline style the cell carries. `flex-basis`,\n *  not a grid track: a sticky GRID item is confined to its own grid area and\n *  cannot move at all. */\nfunction colStyle(id: string) {\n  let w = layout.value.widths[id] ?? store.value.width(id);\n  /* Frozen with no tick in front of it, the lead takes the row's leading\n     padding INTO itself — `left: 0` pulls it to the glass, and a 12px inset\n     left on the row would scroll away and put the text against the edge. */\n  if (id === store.value.lead && pinLead.value && !props.selectable) w += ROW_PAD;\n  return { flex: `0 0 ${w}px` };\n}\n\n/** The trailing cell's track: content plus the 12px of row padding it absorbs. */\nconst menuStyle = computed(() =>\n  menuContent.value === 28 ? undefined : { flex: `0 0 ${menuContent.value + ROW_PAD}px` },\n);\n\nfunction colClass(id: string): string[] {\n  const c = colById.value.get(id);\n  const out = ['fe-list__col', 'fe-list__cell'];\n  /* ⚠ The column's OWN class before the lead role. CSS does not care about\n     the order, but anything that names a cell by its first\n     `fe-list__col--<id>` (the e2e column specs, a person's user stylesheet\n     inspected in devtools) read \"lead\" for the Name column instead of\n     \"name\" once the lead marker came first — 108-column-reorder went red\n     on every case on a table that was working. */\n  if (c?.class) out.push(c.class);\n  if (id === store.value.lead) out.push('fe-list__col--lead');\n  if (c?.align === 'right') out.push('is-right');\n  else if (c?.align === 'center') out.push('is-center');\n  return out;\n}\n\nfunction label(id: string): string {\n  return colById.value.get(id)?.label ?? id;\n}\n\n// ── sorting ───────────────────────────────────────────────────────────\n\nconst controlled = computed(() => props.sort !== undefined);\n\n/** The table's own sort, when nobody controls it — remembered per table. */\nconst localSort = ref<{ key: string; dir: 'asc' | 'desc' } | null>(\n  props.tableId ? tableSort(props.tableId) : null,\n);\n\nconst activeSort = computed(() => (controlled.value ? (props.sort ?? null) : localSort.value));\n\n/** More rows exist than are on screen: the list is one page of several. */\nconst paged = computed(\n  () => (props.pages ?? 1) > 1 || (props.total != null && props.total > props.rows.length),\n);\n\n/**\n * WHY the headers are closed, or null when they are open.\n *\n * ⚠⚠ A table that sorts its own rows while holding ONE PAGE of a longer list\n * would put \"A\" at the top of page 2 and \"B\" at the top of page 1 and call the\n * result sorted. The honest answer is the one the explorer already gives over\n * a ranked search: the headers close and say why. A caller whose SERVER sorts\n * passes `sort` and is never closed for this.\n */\nconst closedWhy = computed<string | null>(() => {\n  if (props.sortClosed) return props.sortClosed;\n  if (!controlled.value && paged.value) return t('table.sort_paged');\n  return null;\n});\n\nfunction isSortable(id: string): boolean {\n  return colById.value.get(id)?.sortable === true;\n}\n\nfunction toggleSort(id: string) {\n  /* ⚠⚠ The `disabled` attribute is the AFFORDANCE, not the rule: a click\n   * dispatched in script still runs this listener. Measured on the explorer\n   * 2026-09-13: a scripted click on a closed header re-ordered nothing on\n   * screen and still wrote a new stored sort. */\n  if (closedWhy.value || !isSortable(id)) return;\n  const cur = activeSort.value;\n  const col = colById.value.get(id);\n  const next =\n    cur && cur.key === id\n      ? { key: id, dir: cur.dir === 'asc' ? ('desc' as const) : ('asc' as const) }\n      : { key: id, dir: col?.sortDir ?? ('asc' as const) };\n  if (!controlled.value) {\n    localSort.value = next;\n    if (props.tableId) setTableSort(props.tableId, next);\n  }\n  emit('sort', next);\n}\n\nfunction sortArrow(id: string): string {\n  const s = activeSort.value;\n  if (closedWhy.value || !s || s.key !== id) return '';\n  return s.dir === 'asc' ? '↑' : '↓';\n}\n\nfunction ariaSort(id: string): 'ascending' | 'descending' | 'none' | undefined {\n  if (!isSortable(id)) return undefined;\n  const s = activeSort.value;\n  if (closedWhy.value || !s || s.key !== id) return 'none';\n  return s.dir === 'asc' ? 'ascending' : 'descending';\n}\n\nconst sortTitle = computed(() => closedWhy.value ?? t('col.sort'));\n\nfunction valueOf(row: any, id: string): unknown {\n  const c = colById.value.get(id);\n  if (c?.sortValue) return c.sortValue(row);\n  if (c?.format) return c.format(row);\n  return row?.[id];\n}\n\n/** Empty last in both directions; numbers as numbers; words in the viewer's\n *  collation with digits read as numbers (\"file 9\" before \"file 10\"). */\nfunction compareValues(a: unknown, b: unknown): number {\n  const ae = a === null || a === undefined || a === '';\n  const be = b === null || b === undefined || b === '';\n  if (ae && be) return 0;\n  if (ae) return 1;\n  if (be) return -1;\n  if (typeof a === 'number' && typeof b === 'number') return a - b;\n  if (typeof a === 'boolean' && typeof b === 'boolean') return Number(a) - Number(b);\n  return String(a).localeCompare(String(b), lang.value, { numeric: true, sensitivity: 'base' });\n}\n\nconst sortedRows = computed<any[]>(() => {\n  const s = activeSort.value;\n  if (controlled.value || closedWhy.value || !s || !colById.value.has(s.key)) return props.rows;\n  const dir = s.dir === 'asc' ? 1 : -1;\n  return props.rows\n    .map((row, i) => ({ row, i, v: valueOf(row, s.key) }))\n    .sort((x, y) => {\n      const ae = x.v === null || x.v === undefined || x.v === '';\n      const be = y.v === null || y.v === undefined || y.v === '';\n      // ⚠ Empties go last in BOTH directions, so the arrow never floats a\n      // column of dashes to the top.\n      if (ae !== be) return ae ? 1 : -1;\n      return dir * compareValues(x.v, y.v) || x.i - y.i;\n    })\n    .map((x) => x.row);\n});\n\nconst segments = computed<Group[]>(() => props.groups ?? [{ id: 'all', items: sortedRows.value }]);\n\n/** What an empty table says; '' (or null) says nothing and draws no box. */\n// ⚠ `Slots`, written out: the declaration build (vite-plugin-dts, on\n// @vue/language-core 2.2.0) types `useSlots()` as the template's own slots,\n// the template reads `emptyShown`, and `emptyShown` reads `slots` - a loop\n// TypeScript answers with TS7022/TS7024 and an `any` template (DataTable's\n// `$slots: any`) in dist/index.d.ts. vue-tsc --noEmit (2.2.12) does not infer\n// it and stays green, and the plugin only prints its errors, so the build\n// passed with them (since 0.54 they fail it: scripts/vite-dts-strict.mjs).\nconst slots: Slots = useSlots();\nconst emptyText = computed(() => (props.empty === undefined ? t('table.empty') : (props.empty ?? '')));\nconst emptyShown = computed(() => !props.loading && rowCount.value === 0 && (!!slots.empty || emptyText.value !== ''));\n/** Is anything in the body to own? An empty rowgroup is invalid ARIA. */\nconst bodyHasContent = computed(() => rowCount.value > 0 || (props.loading && rowCount.value === 0) || emptyShown.value);\n/** The one cell of a notice row spans the lead, the visible columns and the ⋮. */\nconst spanCols = computed(() => visibleCols.value.length + 2 + (props.selectable ? 1 : 0));\n\nconst rowCount = computed(() => segments.value.reduce((s, g) => s + g.items.length, 0));\n\n// ── rows ──────────────────────────────────────────────────────────────\n\nfunction keyOf(row: any, i: number): string | number {\n  if (typeof props.rowKey === 'function') return props.rowKey(row);\n  if (props.rowKey) return row?.[props.rowKey] as string | number;\n  return i;\n}\n\nfunction selected(row: any): boolean {\n  return props.isSelected ? props.isSelected(row) : false;\n}\n\nfunction cellValue(row: any, id: string): unknown {\n  return row?.[id];\n}\n\nfunction cellText(row: any, id: string): string {\n  const c = colById.value.get(id);\n  const v = c?.format ? c.format(row) : row?.[id];\n  if (v === null || v === undefined || v === '') return '-';\n  return String(v);\n}\n\nfunction cellTitle(row: any, id: string): string | undefined {\n  const c = colById.value.get(id);\n  if (c?.title) return c.title(row);\n  const text = cellText(row, id);\n  return text === '-' ? undefined : text;\n}\n\nfunction rowClasses(row: any, i: number) {\n  return [\n    'fe-list__row',\n    { 'is-selected': selected(row), 'is-clickable': !!rowClickable.value },\n    props.rowClass?.(row, i),\n  ];\n}\n\n/** Rows answer a click only when somebody listens for one. */\nconst rowClickable = ref(false);\n\n// ── resizing ──────────────────────────────────────────────────────────\n\n/** `sign` is the gesture's direction, read ONCE at pointerdown: +1 when the\n *  column's trailing edge is its right (LTR), -1 when it is its left (RTL). */\nlet resizing: { id: string; startX: number; startW: number; sign: 1 | -1 } | null = null;\n\n/**\n * THE FIRST DRAG FREEZES THE WHOLE ROW. Until somebody sizes a column the\n * widths are derived from the pane and the auto lead takes the slack — so\n * narrowing one column would widen the lead, which is the behaviour the owner\n * called wrong. Committing every drawn width at the start of the gesture\n * turns the drag into what it looks like.\n */\nfunction freezeBeforeEdit() {\n  if (!store.value.widthsAreAuto()) return;\n  store.value.freeze(layout.value.widths);\n}\n\nfunction isResizable(id: string): boolean {\n  return store.value.spec(id)?.resizable === true;\n}\n\n/* The handle is a focusable `separator`, so ARIA wants its value: the column's\n * drawn width in px, between the column's own min and max. Read from the same\n * layout the cell is drawn from, so a keyboard step, a drag, a double-click\n * reset and a pane resize all show up in `aria-valuenow` with no extra wiring. */\nfunction resizeNow(id: string): number {\n  return Math.round(layout.value.widths[id] ?? store.value.width(id));\n}\nfunction resizeMin(id: string): number | undefined {\n  return store.value.spec(id)?.min;\n}\nfunction resizeMax(id: string): number | undefined {\n  return store.value.spec(id)?.max;\n}\n\nfunction onResizeStart(id: string, ev: PointerEvent) {\n  if (!isResizable(id)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  freezeBeforeEdit();\n  /* ⚠⚠ RTL: the handle sits on the column's inline END edge — its LEFT side in\n   * a right-to-left table — so dragging it LEFT widens the column. A column\n   * edge follows the pointer in both directions; without the sign it grew\n   * when the pointer went the other way. */\n  resizing = { id, startX: ev.clientX, startW: store.value.width(id), sign: inlineSign(dirOfElement(listEl.value)) };\n  /* ⚠ On the WINDOW, not a pointer capture on the handle: the pointer leaves\n   * the 9px handle within a few pixels, and a capture on an element Vue\n   * re-renders mid-drag is released the moment it is patched. */\n  window.addEventListener('pointermove', onResizeMove);\n  window.addEventListener('pointerup', onResizeEnd);\n}\n\nfunction onResizeMove(ev: PointerEvent) {\n  if (!resizing) return;\n  store.value.setWidth(resizing.id, resizing.startW + resizing.sign * (ev.clientX - resizing.startX));\n}\n\nfunction onResizeEnd() {\n  resizing = null;\n  window.removeEventListener('pointermove', onResizeMove);\n  window.removeEventListener('pointerup', onResizeEnd);\n}\n\n/** Keyboard resizing — the handle is focusable, so it has to do something.\n *  16px a step, about one character of the 13px body text. */\nfunction onResizeKey(id: string, ev: KeyboardEvent) {\n  /* ⚠ Ctrl/⌘ + arrow is the REORDER (onHeadKey), and the handle sits inside\n     the header cell the reorder listens on. */\n  if (ev.ctrlKey || ev.metaKey) return;\n  /* The arrow moves the EDGE the way it points: → widens in LTR, ← in RTL. */\n  const step = 16 * inlineKeyStep(ev.key, dirOfElement(listEl.value));\n  if (!step) return;\n  ev.preventDefault();\n  freezeBeforeEdit();\n  store.value.setWidth(id, store.value.width(id) + step);\n}\n\n/** Double-click a handle: back to this column's shipped width. */\nfunction onResizeReset(id: string) {\n  const spec = store.value.spec(id);\n  if (!spec) return;\n  freezeBeforeEdit();\n  store.value.setWidth(id, spec.width);\n}\n\n// ── reordering ────────────────────────────────────────────────────────\n\n/**\n * DRAG A HEADER TO MOVE ITS COLUMN.\n *\n * ⚠⚠ The threshold is the whole difficulty: clicking a header sorts and\n * dragging it moves, and both start with the same pointerdown. Nothing\n * happens until the pointer has travelled `DRAG_SLOP`; above it, the click\n * the browser fires on pointerup is swallowed on its way past\n * (`onHeadClickCapture`), or every completed drag would also re-sort.\n */\nconst DRAG_SLOP = 5;\nlet dragState: { id: string; startX: number; armed: boolean } | null = null;\nconst dragCol = ref<string | null>(null);\n/**\n * Where it would land: a GAP index into the DRAWN columns (with the dragged\n * one still in them — that is the row on screen). ⚠⚠ The drop reads this\n * number against the SAME list; reading it against the list without the\n * dragged column once turned \"one place right\" into three (2026-09-20).\n * `null` means the release would change nothing, and the marker is absent.\n */\nconst dropAt = ref<number | null>(null);\n/** When a real drag last ended — a TIMESTAMP, because a flag left armed by a\n *  drag that produced no click would eat the next, unrelated sort click. */\nlet dragEndedAt = 0;\nconst CLICK_SWALLOW_MS = 300;\n\nfunction isMovable(id: string): boolean {\n  return id !== store.value.lead && store.value.spec(id)?.hideable === true;\n}\n\nfunction onHeadPointerDown(id: string, ev: PointerEvent) {\n  if (ev.button !== 0 || !isMovable(id)) return;\n  dragState = { id, startX: ev.clientX, armed: false };\n  window.addEventListener('pointermove', onHeadPointerMove);\n  window.addEventListener('pointerup', onHeadPointerUp);\n  window.addEventListener('keydown', onDragKey, true);\n  /* ⚠ Every way a gesture can END, not just the happy one — a pointer the\n     browser takes away fires neither pointerup nor keydown. */\n  window.addEventListener('pointercancel', onDragAbort);\n  window.addEventListener('blur', onDragAbort);\n}\n\nfunction onDragAbort() {\n  const armed = dragState?.armed === true;\n  endDrag();\n  if (armed) dragEndedAt = Date.now();\n}\n\n/** The gaps a dragged column may be dropped into: the pinned columns at\n *  either end are un-passable (the explorer's star stays beside its ⋮). */\nfunction dropGapRange(): { first: number; last: number } {\n  const drawn = visibleCols.value;\n  let first = 0;\n  while (first < drawn.length && !isMovable(drawn[first])) first++;\n  let last = drawn.length;\n  while (last > first && !isMovable(drawn[last - 1])) last--;\n  return { first, last };\n}\n\nfunction onHeadPointerMove(ev: PointerEvent) {\n  if (!dragState) return;\n  if (!dragState.armed) {\n    if (Math.abs(ev.clientX - dragState.startX) < DRAG_SLOP) return;\n    dragState.armed = true;\n    dragCol.value = dragState.id;\n  }\n  const head = listEl.value?.querySelector('.fe-list__head');\n  if (!head) return;\n  /* The header's own cells. ⚠ `children`, not `:scope > …`: the same answer\n     in a browser, and the one a DOM without `:scope` (happy-dom) gives too —\n     the RTL drop test (web/tests/ui/rtlGeometry) measured nothing without it. */\n  const cells = Array.from(head.children).filter((c) => c.classList.contains('fe-list__col')) as HTMLElement[];\n  /* The tick (when there is one) and the lead come first, the actions column\n     last; only the ones between are positions a column can take. */\n  const lead = props.selectable ? 2 : 1;\n  const drawnCells = cells.slice(lead, lead + visibleCols.value.length);\n  /* ⚠ RTL: gap i is BEFORE cell i in reading order — its right-hand half in a\n   * right-to-left table. The pointer is compared against each cell's middle\n   * in the direction the columns run. */\n  const sign = inlineSign(dirOfElement(listEl.value));\n  let idx = drawnCells.length;\n  for (let i = 0; i < drawnCells.length; i++) {\n    const box = drawnCells[i].getBoundingClientRect();\n    if (sign * (ev.clientX - (box.left + box.width / 2)) < 0) {\n      idx = i;\n      break;\n    }\n  }\n  const { first, last } = dropGapRange();\n  idx = Math.max(first, Math.min(last, idx));\n  /* ⚠⚠ Its own two gaps are NOT a drop: landing in either leaves the order as\n   * it was, so the marker hides and the release writes nothing. (Owner,\n   * 2026-09-20: \"bırakmadan kendi yerine geri getirip bırakınca yine bir adım\n   * ileri gidiyor\".) */\n  const from = visibleCols.value.indexOf(dragState.id);\n  dropAt.value = idx === from || idx === from + 1 ? null : idx;\n}\n\nfunction onHeadPointerUp() {\n  const st = dragState;\n  const target = dropAt.value;\n  endDrag();\n  if (!st?.armed) return;\n  dragEndedAt = Date.now();\n  if (target == null) return;\n  applyColumnDrop(st.id, target);\n}\n\n/**\n * A gap among the DRAWN columns → a place in the full stored order, through\n * the NEIGHBOUR's identity: a column this listing does not draw still holds a\n * place in the stored sequence, and dropping between two visible columns must\n * not silently reshuffle the one hiding between them.\n */\nfunction applyColumnDrop(id: string, gap: number) {\n  const drawn = visibleCols.value;\n  const from = drawn.indexOf(id);\n  if (from === -1) return;\n  if (gap === from || gap === from + 1) return;\n  const restDrawn = drawn.filter((c) => c !== id);\n  const beforeId = restDrawn[gap > from ? gap - 1 : gap];\n  const restFull = store.value.order().filter((c) => c !== id);\n  const index = beforeId ? restFull.indexOf(beforeId) : restFull.length;\n  if (index === -1) return;\n  store.value.move(id, index);\n}\n\n/**\n * The columns a keyboard step may land among: the movable ones THIS LISTING\n * offers, in the person's order. ⚠ Not the stored order — a column this\n * listing does not draw (the explorer's Location in an ordinary folder) would\n * be stepped over invisibly and the button would read as broken (measured\n * 2026-09-20).\n */\nfunction steppableCols(): string[] {\n  return store.value.order().filter((id) => isMovable(id) && candidateCols.value.includes(id));\n}\n\nfunction stepColumn(id: string, delta: -1 | 1) {\n  const list = steppableCols();\n  const at = list.indexOf(id);\n  const to = at + delta;\n  if (at === -1 || to < 0 || to >= list.length) return;\n  const neighbour = list[to];\n  const rest = store.value.order().filter((c) => c !== id);\n  const k = rest.indexOf(neighbour);\n  if (k === -1) return;\n  store.value.move(id, delta === -1 ? k : k + 1);\n}\n\nfunction canStepColumn(id: string, delta: -1 | 1): boolean {\n  const list = steppableCols();\n  const at = list.indexOf(id);\n  return at !== -1 && at + delta >= 0 && at + delta < list.length;\n}\n\n/** Ctrl/⌘ + ←/→ on a focused header moves its column one place — the drag,\n *  reachable without a pointer. ⚠ RTL: the column moves the way the arrow\n *  points, which is one place EARLIER for → in a right-to-left table. */\nfunction onHeadKey(id: string, ev: KeyboardEvent) {\n  if (!ev.ctrlKey && !ev.metaKey) return;\n  const delta = inlineKeyStep(ev.key, dirOfElement(listEl.value));\n  if (!delta || !isMovable(id)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  stepColumn(id, delta as -1 | 1);\n}\n\nfunction onDragKey(ev: KeyboardEvent) {\n  if (ev.key !== 'Escape') return;\n  ev.stopPropagation();\n  onDragAbort();\n}\n\n/** THE ONE PLACE THE DRAG STATE IS TORN DOWN — the state the template reads\n *  and the window listeners, always both. */\nfunction endDrag() {\n  dragState = null;\n  dragCol.value = null;\n  dropAt.value = null;\n  window.removeEventListener('pointermove', onHeadPointerMove);\n  window.removeEventListener('pointerup', onHeadPointerUp);\n  window.removeEventListener('keydown', onDragKey, true);\n  window.removeEventListener('pointercancel', onDragAbort);\n  window.removeEventListener('blur', onDragAbort);\n}\n\n/** Capture phase, on the header row: a click that ended a drag never reaches\n *  the sort button underneath it. */\nfunction onHeadClickCapture(ev: MouseEvent) {\n  if (Date.now() - dragEndedAt > CLICK_SWALLOW_MS) return;\n  dragEndedAt = 0;\n  ev.preventDefault();\n  ev.stopPropagation();\n}\n\n// ── the column menu ───────────────────────────────────────────────────\n\n/**\n * A small settings popover, opened by the header's ⋮ or by right-clicking\n * the header. ⚠ Not `ContextMenu`: it is a panel of checkboxes, and a menu\n * closes on every pick, so turning four columns off would be four separate\n * right-clicks.\n */\nconst colMenuOpen = ref(false);\nconst colMenuX = ref(0);\nconst colMenuY = ref(0);\n/** The x the menu was opened at — kept apart from `colMenuX`, which the clamp rewrites. */\nlet colMenuAnchor = 0;\nconst colMenuEl = ref<HTMLElement | null>(null);\n\n/* The OS mode for `auto`, and every time it changes while the table is on\n   screen - composables/useSystemDark, the one shared listener (#74). It was\n   read once on mount here, so the column menu kept the mode it first saw. */\nconst prefersDark = useSystemDark();\n/** ⚠ The menu is teleported to <body>, outside the `.fe` ancestor that scopes\n *  the explorer's tokens, so it carries the theme class `variables.css`\n *  re-applies dark values under — the same reason ContextMenu takes one. */\nconst colMenuThemeClass = computed(() => `fe-ctx-backdrop--theme-${mode.value || 'auto'}`);\n\n/**\n * ⚠ RTL — the two nudges follow READING order, like every other logical\n * thing: the first moves the column one place EARLIER (toward the table's\n * start edge), the second one place later, and they sit in that order. What\n * they SAY is physical — `cols.move_left` \"Move {col} left\" under ← — so in a\n * right-to-left table, where earlier is RIGHTWARD, the first one wears → and\n * `cols.move_right`, the second ← and `cols.move_left`. Arrow, label and\n * movement agree in both directions, and the tab order is the reading order\n * (a CSS `order` swap would have kept the picture and broken that).\n */\nconst nudge = computed(() =>\n  dir.value === 'rtl'\n    ? { earlier: { key: 'cols.move_right', arrow: '\\u2192' }, later: { key: 'cols.move_left', arrow: '\\u2190' } }\n    : { earlier: { key: 'cols.move_left', arrow: '\\u2190' }, later: { key: 'cols.move_right', arrow: '\\u2192' } },\n);\n\nconst menuCols = computed(() =>\n  /* In the person's OWN order, so the list reads as the table on screen. */\n  store.value\n    .order()\n    .filter((id) => isMovable(id) && candidateCols.value.includes(id))\n    .map((id) => ({\n      id,\n      label: label(id),\n      on: !store.value.hidden(id),\n      canEarlier: canStepColumn(id, -1),\n      canLater: canStepColumn(id, 1),\n    })),\n);\n\nconst canResetCols = computed(() => store.value.customised());\n\nasync function openColMenu(ev: MouseEvent) {\n  ev.preventDefault();\n  ev.stopPropagation();\n  const el = ev.currentTarget as HTMLElement | null;\n  const box = el?.getBoundingClientRect();\n  // ⚠ RTL: a keyboard open (no pointer) hangs the menu from the ⋮'s START edge.\n  colMenuAnchor = ev.clientX || (box ? inlineStartX(box, dir.value) : 0);\n  colMenuX.value = colMenuAnchor;\n  colMenuY.value = ev.clientY || (box ? box.bottom : 0);\n  colMenuOpen.value = true;\n  await nextTick();\n  clampColMenu();\n  colMenuEl.value?.focus();\n}\n\nfunction clampColMenu() {\n  const el = colMenuEl.value;\n  if (!el) return;\n  const box = el.getBoundingClientRect();\n  const pad = 8;\n  /* ⚠ RTL: it hangs toward the inline END of its anchor — leftward in a\n     right-to-left table — and is pushed back from THAT edge\n     (lib/direction; the LTR arithmetic is unchanged). */\n  colMenuX.value = clampAlongInline(colMenuAnchor, box.width, window.innerWidth, dir.value, pad);\n  if (box.bottom > window.innerHeight - pad) {\n    colMenuY.value = Math.max(pad, window.innerHeight - pad - box.height);\n  }\n}\n\nfunction closeColMenu() {\n  colMenuOpen.value = false;\n}\n\n/**\n * ESCAPE CLOSES IT, from wherever the focus happens to be. ⚠⚠ Half the\n * controls in the menu remove themselves when used (\"Reset columns\" vanishes\n * once there is nothing to reset), focus falls back to <body>, and a\n * full-screen backdrop that only heard Escape from inside itself became a\n * trap that swallowed every later pointer gesture (measured 2026-09-20).\n */\nfunction onColMenuKey(ev: KeyboardEvent) {\n  if (ev.key !== 'Escape') return;\n  ev.stopPropagation();\n  closeColMenu();\n}\n\nwatch(colMenuOpen, (open) => {\n  if (typeof window === 'undefined') return;\n  if (open) window.addEventListener('keydown', onColMenuKey, true);\n  else window.removeEventListener('keydown', onColMenuKey, true);\n});\n\nfunction toggleCol(id: string) {\n  store.value.setHidden(id, !store.value.hidden(id));\n}\n\nfunction onResetColumns() {\n  store.value.reset();\n}\n\nonBeforeUnmount(() => {\n  ro?.disconnect();\n  ro = null;\n  if (widthFrame) cancelAnimationFrame(widthFrame);\n  widthFrame = 0;\n  onResizeEnd();\n  endDrag();\n  if (typeof window !== 'undefined') window.removeEventListener('keydown', onColMenuKey, true);\n});\n\n// ── the footer ────────────────────────────────────────────────────────\n\nconst totalPages = computed(() => {\n  if (props.pages != null) return Math.max(1, props.pages);\n  if (!props.total || !props.pageSize) return 1;\n  return Math.max(1, Math.ceil(props.total / props.pageSize));\n});\nconst currentPage = computed(() => props.page ?? 1);\nconst showPager = computed(() => totalPages.value > 1);\n\n/** \"26 – 50 / 58\" when the endpoint knows the total. */\nconst rangeLabel = computed(() => {\n  if (props.total != null && props.pageSize != null && props.total > 0) {\n    const from = (currentPage.value - 1) * props.pageSize + 1;\n    const to = Math.min(currentPage.value * props.pageSize, props.total);\n    return `${from} - ${to} / ${props.total}`;\n  }\n  return '';\n});\n\nfunction go(p: number) {\n  if (p < 1 || p > totalPages.value) return;\n  emit('page', p);\n}\n\n// ── row events ────────────────────────────────────────────────────────\n\n/* A row is \"clickable\" (pointer cursor) when the caller listens for clicks —\n * read off the vnode props the parent bound. */\nconst inst = getCurrentInstance();\nrowClickable.value = !!(inst?.vnode.props as Record<string, unknown> | null)?.onRowClick;\n\nfunction onRowClick(row: any, ev: MouseEvent) {\n  emit('row-click', row, ev);\n}\n\nfunction onRowAction(key: string, row: any, action: ContextAction) {\n  emit('row-action', key, row, action);\n}\n\ndefineExpose({ store, layout, pinLead });\n</script>\n\n<template>\n  <!-- ⚠ `display: contents` when unframed (the explorer): the listing's pane\n       lays out `.fe-list` exactly as it did before there was a wrapper. -->\n  <div v-bind=\"$attrs\" class=\"fe-table\" :class=\"{ 'fe-table--framed': framed, 'fe-table--bare': !framed }\">\n    <div v-if=\"$slots.toolbar\" class=\"tbl-bar\">\n      <slot name=\"toolbar\" />\n    </div>\n    <!-- A listing read again keeps its rows until the answer comes (opening\n         a folder, Refresh, a search): they are marked as the old ones, and\n         a thin bar runs along the top. The list carried an `is-loading`\n         class that nothing drew, so the previous folder's rows looked like\n         the answer for as long as a large folder took.\n         ⚠ BESIDE the list, not in it: a `role=\"grid\"` owns rows, and a\n         status among them is an invalid child (the list says aria-busy\n         itself). Sticky here, it also stays in view however far the rows\n         are scrolled. -->\n    <div v-if=\"loading && rowCount > 0\" class=\"fe-list__refreshing\" role=\"status\">\n      <span class=\"fe-sr-only\">{{ t('loading') }}</span>\n    </div>\n    <div\n      ref=\"listEl\"\n      class=\"fe-list\"\n      :class=\"{\n        'is-loading': loading,\n        'is-scrolled-x': scrolledX,\n        'is-pin-lead': pinLead,\n        'is-pin-menu': pinMenu,\n        'fe-list--nocheck': !selectable,\n      }\"\n      :style=\"rootStyle\"\n      role=\"grid\"\n      :aria-label=\"ariaLabel\"\n      :aria-busy=\"loading ? 'true' : undefined\"\n      :data-table-id=\"tableId\"\n      @scroll.passive=\"onListScroll\"\n    >\n      <div\n        class=\"fe-list__head\"\n        role=\"row\"\n        :class=\"{ 'is-dragging-col': !!dragCol }\"\n        :style=\"tableStyle\"\n        @contextmenu=\"openColMenu\"\n        @click.capture=\"onHeadClickCapture\"\n      >\n        <!-- The tick column's header stays empty on purpose: a select-all tick\n             is a real affordance with real consequences and none of the\n             callers asks for one. -->\n        <div v-if=\"selectable\" class=\"fe-list__col fe-list__col--check\" role=\"columnheader\"></div>\n        <div\n          :class=\"colClass(store.lead)\"\n          role=\"columnheader\"\n          :style=\"colStyle(store.lead)\"\n          :aria-sort=\"ariaSort(store.lead)\"\n          :data-col=\"store.lead\"\n        >\n          <button\n            v-if=\"isSortable(store.lead)\"\n            type=\"button\"\n            class=\"fe-list__sort\"\n            :disabled=\"!!closedWhy\"\n            :title=\"sortTitle\"\n            @click=\"toggleSort(store.lead)\"\n          >\n            {{ label(store.lead) }}\n            <span v-if=\"sortArrow(store.lead)\" class=\"fe-list__sort-arrow\" aria-hidden=\"true\">{{ sortArrow(store.lead) }}</span>\n          </button>\n          <span v-else class=\"fe-list__head-label\">{{ label(store.lead) }}</span>\n          <span\n            v-if=\"isResizable(store.lead)\"\n            class=\"fe-list__resize\"\n            role=\"separator\"\n            aria-orientation=\"vertical\"\n            tabindex=\"0\"\n            :aria-valuenow=\"resizeNow(store.lead)\"\n            :aria-valuemin=\"resizeMin(store.lead)\"\n            :aria-valuemax=\"resizeMax(store.lead)\"\n            :aria-label=\"t('cols.resize', { col: label(store.lead) })\"\n            :title=\"t('cols.resize', { col: label(store.lead) })\"\n            @pointerdown=\"onResizeStart(store.lead, $event)\"\n            @dblclick.stop=\"onResizeReset(store.lead)\"\n            @keydown=\"onResizeKey(store.lead, $event)\"\n          ></span>\n        </div>\n        <div\n          v-for=\"(id, ci) in visibleCols\"\n          :key=\"id\"\n          :class=\"[\n            colClass(id),\n            {\n              'is-col-dragging': dragCol === id,\n              'is-drop-before': dropAt === ci,\n              'is-drop-after': dropAt === visibleCols.length && ci === visibleCols.length - 1,\n              'is-movable': isMovable(id),\n            },\n          ]\"\n          role=\"columnheader\"\n          :style=\"colStyle(id)\"\n          :aria-sort=\"ariaSort(id)\"\n          :aria-label=\"colById.get(id)?.headerLabel === false ? label(id) : undefined\"\n          :data-col=\"id\"\n          @pointerdown=\"onHeadPointerDown(id, $event)\"\n          @keydown=\"onHeadKey(id, $event)\"\n        >\n          <button\n            v-if=\"isSortable(id)\"\n            type=\"button\"\n            class=\"fe-list__sort\"\n            :disabled=\"!!closedWhy\"\n            :title=\"sortTitle\"\n            @click=\"toggleSort(id)\"\n          >\n            {{ label(id) }}\n            <span v-if=\"sortArrow(id)\" class=\"fe-list__sort-arrow\" aria-hidden=\"true\">{{ sortArrow(id) }}</span>\n          </button>\n          <span v-else-if=\"colById.get(id)?.headerLabel !== false\" class=\"fe-list__head-label\">{{ label(id) }}</span>\n          <span\n            v-if=\"isResizable(id)\"\n            class=\"fe-list__resize\"\n            role=\"separator\"\n            aria-orientation=\"vertical\"\n            tabindex=\"0\"\n            :aria-valuenow=\"resizeNow(id)\"\n            :aria-valuemin=\"resizeMin(id)\"\n            :aria-valuemax=\"resizeMax(id)\"\n            :aria-label=\"t('cols.resize', { col: label(id) })\"\n            :title=\"t('cols.resize', { col: label(id) })\"\n            @pointerdown=\"onResizeStart(id, $event)\"\n            @dblclick.stop=\"onResizeReset(id)\"\n            @keydown=\"onResizeKey(id, $event)\"\n          ></span>\n        </div>\n        <div\n          class=\"fe-list__col fe-list__col--menu\"\n          :class=\"{ 'is-wide': menuContent !== 28 }\"\n          :style=\"menuStyle\"\n          role=\"columnheader\"\n        >\n          <button\n            type=\"button\"\n            class=\"fe-list__menu fe-list__colmenu-btn\"\n            :title=\"t('cols.menu')\"\n            :aria-label=\"t('cols.menu')\"\n            aria-haspopup=\"dialog\"\n            :aria-expanded=\"colMenuOpen ? 'true' : 'false'\"\n            @click=\"openColMenu\"\n          ><span aria-hidden=\"true\">&#8942;</span></button>\n        </div>\n      </div>\n      <div class=\"fe-list__body\" :role=\"bodyHasContent ? 'rowgroup' : 'presentation'\">\n        <template v-for=\"seg in segments\" :key=\"seg.id\">\n          <div v-if=\"seg.label\" class=\"fe-list__group\" role=\"presentation\">{{ seg.label }}</div>\n          <div\n            v-for=\"(row, ri) in seg.items\"\n            :key=\"keyOf(row, ri)\"\n            :class=\"rowClasses(row, ri)\"\n            role=\"row\"\n            :style=\"tableStyle\"\n            :aria-selected=\"selectable ? (selected(row) ? 'true' : 'false') : undefined\"\n            v-bind=\"rowAttrs ? rowAttrs(row) : {}\"\n            @click=\"onRowClick(row, $event)\"\n            @dblclick=\"emit('row-dblclick', row, $event)\"\n            @contextmenu=\"emit('row-contextmenu', row, $event)\"\n            @dragstart=\"emit('row-dragstart', row, $event)\"\n            @dragover=\"emit('row-dragover', row, $event)\"\n            @dragleave=\"emit('row-dragleave', row, $event)\"\n            @drop=\"emit('row-drop', row, $event)\"\n            @touchstart.passive=\"emit('row-touchstart', row, $event)\"\n            @touchend=\"emit('row-touchend', $event)\"\n            @touchmove.passive=\"emit('row-touchmove', $event)\"\n          >\n            <!-- issue #26 — the tick is the one click that selects; the whole\n                 cell is its target. `data-fe-control` keeps a finger on it\n                 from counting as a tap on the row (useRowTouch). -->\n            <div\n              v-if=\"selectable\"\n              class=\"fe-list__col fe-list__col--check\"\n              role=\"gridcell\"\n              data-fe-control\n              @click.stop=\"emit('check-click', row, $event)\"\n              @dblclick.stop\n            >\n              <ItemCheck :on=\"selected(row)\" :label=\"cellText(row, store.lead)\" />\n            </div>\n            <div :class=\"colClass(store.lead)\" role=\"gridcell\" :style=\"colStyle(store.lead)\" :title=\"$slots[`cell-${store.lead}`] ? undefined : cellTitle(row, store.lead)\">\n              <slot :name=\"`cell-${store.lead}`\" :row=\"row\" :value=\"cellValue(row, store.lead)\">\n                <span class=\"fe-list__cell-text\"><bdi>{{ cellText(row, store.lead) }}</bdi></span>\n              </slot>\n            </div>\n            <div\n              v-for=\"id in visibleCols\"\n              :key=\"id\"\n              :class=\"colClass(id)\"\n              role=\"gridcell\"\n              :style=\"colStyle(id)\"\n              :data-col=\"id\"\n              :title=\"$slots[`cell-${id}`] ? undefined : cellTitle(row, id)\"\n            >\n              <slot :name=\"`cell-${id}`\" :row=\"row\" :value=\"cellValue(row, id)\">\n                <span class=\"fe-list__cell-text\"><bdi>{{ cellText(row, id) }}</bdi></span>\n              </slot>\n            </div>\n            <div\n              class=\"fe-list__col fe-list__col--menu\"\n              :class=\"{ 'is-wide': menuContent !== 28 }\"\n              :style=\"menuStyle\"\n              role=\"gridcell\"\n              data-fe-control\n              @click.stop\n              @dblclick.stop\n            >\n              <slot name=\"actions\" :row=\"row\">\n                <!-- A row with NO verbs at all draws no control (a disabled\n                     \"Actions\" over nothing is a promise the row cannot keep);\n                     a row whose verbs are all unavailable right now draws it\n                     greyed, with each verb's reason — RowActions' own rule. -->\n                <RowActions\n                  v-if=\"rowActions && rowActions(row).length\"\n                  :locale=\"lang\"\n                  :theme=\"mode\"\n                  :actions=\"rowActions(row)\"\n                  :testid=\"rowActionsTestId?.(row)\"\n                  @select=\"(key: string, action: ContextAction) => onRowAction(key, row, action)\"\n                />\n              </slot>\n            </div>\n          </div>\n        </template>\n        <!-- ⚠ A rowgroup holds ROWS (axe aria-required-children): the loading\n             and empty notices are a row with one cell spanning the table. -->\n        <div v-if=\"loading && rowCount === 0\" class=\"fe-list__empty fe-list__empty--loading\" role=\"row\">\n          <div role=\"gridcell\" :aria-colspan=\"spanCols\" aria-live=\"polite\">{{ t('loading') }}</div>\n        </div>\n        <div v-else-if=\"emptyShown\" class=\"fe-list__empty\" role=\"row\">\n          <div role=\"gridcell\" :aria-colspan=\"spanCols\">\n            <slot name=\"empty\">{{ emptyText }}</slot>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div v-if=\"showPager || footNote || $slots.foot\" class=\"tbl-foot\">\n      <span>\n        <slot name=\"foot\">{{ footNote || rangeLabel }}</slot>\n      </span>\n      <div v-if=\"showPager\" class=\"tbl-pager\">\n        <button\n          type=\"button\"\n          class=\"tbl-page\"\n          :disabled=\"currentPage <= 1\"\n          :aria-label=\"t('table.prev')\"\n          :title=\"t('table.prev')\"\n          @click=\"go(currentPage - 1)\"\n        >‹</button>\n        <span class=\"tbl-pager__at\" dir=\"ltr\">{{ currentPage }} / {{ totalPages }}</span>\n        <button\n          type=\"button\"\n          class=\"tbl-page\"\n          :disabled=\"currentPage >= totalPages\"\n          :aria-label=\"t('table.next')\"\n          :title=\"t('table.next')\"\n          @click=\"go(currentPage + 1)\"\n        >›</button>\n      </div>\n    </div>\n  </div>\n  <Teleport to=\"body\">\n    <div\n      v-if=\"colMenuOpen\"\n      class=\"fe-colmenu__backdrop\"\n      :dir=\"dir\"\n      :class=\"colMenuThemeClass\"\n      :data-prefers-dark=\"prefersDark ? '1' : '0'\"\n      @click=\"closeColMenu\"\n      @contextmenu.prevent=\"closeColMenu\"\n    >\n      <div\n        ref=\"colMenuEl\"\n        class=\"fe-colmenu\"\n        role=\"dialog\"\n        tabindex=\"-1\"\n        :aria-label=\"t('cols.menu')\"\n        :style=\"{ top: colMenuY + 'px', left: colMenuX + 'px' }\"\n        @click.stop\n        @keydown.esc.stop=\"closeColMenu\"\n      >\n        <p class=\"fe-colmenu__title\">{{ t('cols.title') }}</p>\n        <div v-for=\"c in menuCols\" :key=\"c.id\" class=\"fe-colmenu__line\">\n          <button\n            type=\"button\"\n            class=\"fe-colmenu__row\"\n            role=\"checkbox\"\n            :aria-checked=\"c.on ? 'true' : 'false'\"\n            @click=\"toggleCol(c.id)\"\n          >\n            <span class=\"fe-list__check fe-colmenu__tick\" :class=\"{ 'is-on': c.on }\" aria-hidden=\"true\"></span>\n            <span class=\"fe-colmenu__label\">{{ c.label }}</span>\n          </button>\n          <button\n            type=\"button\"\n            class=\"fe-colmenu__nudge\"\n            :disabled=\"!c.canEarlier\"\n            :title=\"t(nudge.earlier.key, { col: c.label })\"\n            :aria-label=\"t(nudge.earlier.key, { col: c.label })\"\n            @click=\"stepColumn(c.id, -1)\"\n          ><span aria-hidden=\"true\">{{ nudge.earlier.arrow }}</span></button>\n          <button\n            type=\"button\"\n            class=\"fe-colmenu__nudge\"\n            :disabled=\"!c.canLater\"\n            :title=\"t(nudge.later.key, { col: c.label })\"\n            :aria-label=\"t(nudge.later.key, { col: c.label })\"\n            @click=\"stepColumn(c.id, 1)\"\n          ><span aria-hidden=\"true\">{{ nudge.later.arrow }}</span></button>\n        </div>\n        <div v-if=\"canResetCols\" class=\"fe-colmenu__sep\" role=\"separator\"></div>\n        <button v-if=\"canResetCols\" type=\"button\" class=\"fe-colmenu__row\" @click=\"onResetColumns\">\n          <span class=\"fe-colmenu__label\">{{ t('cols.reset') }}</span>\n        </button>\n        <slot name=\"colmenu-extra\" :close=\"closeColMenu\" />\n      </div>\n    </div>\n  </Teleport>\n</template>\n","/**\n * surfaceCell — a plugin list's cell, as the reader reads it.\n *\n * A `list` column may say what its cells ARE (`format: \"date\" | \"datetime\"`),\n * and then the app hands over the machine's value — `2026-09-29`,\n * `2026-09-29T14:03:00Z` — and the host prints it the way the explorer prints\n * every date: in the reader's language, on the reader's clock. The value stays\n * what the column sorts by.\n *\n * ⚠⚠ Why the host and not the app (v0.43.0 wave 2, 2026-09-22): the\n * Signatures page's \"Son tarih\" read \"2026-09-29\" a column away from the\n * explorer's \"22 Eyl 2026, 14:01\". An app formatting dates itself means one\n * more date format per app — the one thing \"one format, the explorer's\" rules\n * out — and it cannot know the reader's chosen time zone.\n *\n * ⚠ No formatter of its own: a calendar DAY goes through useLocale's\n * `formatCalendarDay` (UTC, so no time zone can move a due date to the day\n * before), an instant through the reader's own `formatDate`. Anything the\n * format does not recognise is shown as it came (a dash, a word).\n */\nimport { formatCalendarDay } from '../composables/useLocale';\n\nexport type SurfaceCellFormat = 'date' | 'datetime';\n\n/**\n * The cell's text. `formatInstant` is the reader's own date formatter\n * (useLocale().formatDate), which knows their language AND their clock.\n */\nexport function formatSurfaceCell(\n  raw: string,\n  format: string | undefined,\n  locale: string,\n  formatInstant: (ms: number, opts?: { time?: boolean }) => string,\n): string {\n  if (!raw || (format !== 'date' && format !== 'datetime')) return raw;\n  const day = formatCalendarDay(raw, locale);\n  if (day) return day;\n  const ms = Date.parse(raw.trim());\n  if (Number.isNaN(ms)) return raw;\n  return formatInstant(ms, { time: format === 'datetime' }) || raw;\n}\n","<script setup lang=\"ts\">\n/**\n * SurfaceList — a plugin surface's `list` node: a table whose rows may carry\n * actions. Picking one posts `event: \"action\"` with the button's id and\n * `data.row_id` — the plugin answers with a new screen (or a job).\n *\n * ⚠⚠ THIS IS THE PRODUCT'S ONE TABLE (DataTable — the explorer's own), not a\n * table of the plugin surface's own. `/admin/apps/<plugin>/<view>` is a menu\n * in the admin panel (Signatures is the one the owner opens daily), and the\n * owner's rule since 2026-09-21 is that every table in the product is the\n * explorer's: \"bir yere tablo gerekiyorsa bu tabloyu koymak zorundayız.\" So an\n * app's list resizes, sorts, hides and moves its columns like the file list\n * does, and remembers that on the account per app and node\n * (`app.<plugin>.<node id>`), with:\n *\n *   · the first column frozen left (it is what says which row this is),\n *   · ONE `Actions` control frozen right, opening the same ContextMenu the\n *     explorer's ⋮ opens, instead of a scatter of loose buttons,\n *   · the shared empty state rather than a paragraph above an absent table.\n *\n * ⚠ The wire contract is unchanged and every field below is OPTIONAL\n * (docs/APP-PLUGINS-API.md → `list`): a plugin written against the old node\n * draws the same rows, now sortable. Sorting is on by default because a list\n * node carries ALL its rows — nothing is paged away, so sorting what is on\n * screen is sorting the list. A plugin that needs a fixed order says\n * `sortable: false` on the column; one whose cells are formatted for people\n * (a localised date, \"1.2 MB\") hands the table the raw value to sort by in\n * `row.sort`.\n *\n * ⚠ A plugin's own action ids and labels are passed straight through, so a\n * plugin that offered three buttons still offers three verbs — nothing is\n * dropped in the move, and `danger` still paints the destructive one apart.\n */\nimport { computed } from 'vue';\nimport type { LocaleCode } from '../../../types/ExplorerConfig';\nimport type { ListNodeProps, PluginText } from '../../../types/Plugins';\nimport type { ContextAction } from '../../ContextMenu.vue';\nimport DataTable, { type DataColumn } from '../../DataTable.vue';\nimport { useLocale } from '../../../composables/useLocale';\nimport { appTextOr, labelOf } from '../../../lib/pluginLabel';\nimport { formatSurfaceCell } from '../../../lib/surfaceCell';\n\ntype ListRow = ListNodeProps['rows'][number];\n\nconst props = defineProps<{\n  columns: ListNodeProps['columns'];\n  rows: ListNodeProps['rows'];\n  empty?: PluginText | string;\n  locale: LocaleCode;\n  disabled?: boolean;\n  /** Where the table's arrangement is remembered (`app.<plugin>.<node>`). */\n  tableId?: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'action', p: { action_id: string; row_id: string }): void;\n}>();\n\nconst { t, formatDate } = useLocale(() => props.locale);\n\nconst rows = computed(() => props.rows ?? []);\n\n/** The actions column's control exists when ANY row has a verb — one shape for\n *  the whole table, so the column does not go ragged from row to row. */\nconst hasActions = computed(() => rows.value.some((r) => (r.actions ?? []).length > 0));\n\n/* ⚠ The app's empty line for THIS reader, else filex's own, else whatever\n   language the app has — see `appTextOr`. */\nconst emptyText = computed(() => appTextOr(props.empty, props.locale, () => t('plugin.list.empty')));\n\nfunction cell(row: ListRow, key: string): string {\n  return labelOf(row.cells?.[key], props.locale);\n}\n\n/** The node's columns, as the table draws them. Width is clamped to what a\n *  person could have dragged it to; a plugin cannot make a column that no\n *  handle can reach. */\nconst columns = computed<DataColumn<ListRow>[]>(() =>\n  (props.columns ?? []).map((c) => {\n    const w =\n      typeof c.width === 'number' && Number.isFinite(c.width) ? Math.round(c.width) : undefined;\n    return {\n      id: c.key,\n      label: labelOf(c.label, props.locale),\n      width: w === undefined ? undefined : Math.min(900, Math.max(60, w)),\n      align: c.align,\n      sortable: c.sortable !== false,\n      // A date column is printed the explorer's way, and sorted by the value.\n      format: (row: ListRow) => formatSurfaceCell(cell(row, c.key), c.format, props.locale, formatDate),\n      sortValue: (row: ListRow) => {\n        const raw = row.sort?.[c.key];\n        return typeof raw === 'number' || typeof raw === 'string' ? raw : cell(row, c.key);\n      },\n    };\n  }),\n);\n\n/** The plugin's buttons, as menu entries. `testid` keeps the address each\n *  action already had (`surface-list-action-<row>-<action>`) so a spec, and a\n *  plugin's own e2e, can still reach a named verb. */\nfunction actionsOf(row: ListRow): ContextAction[] {\n  return (row.actions ?? []).map((a) => ({\n    key: a.id,\n    label: labelOf(a.label, props.locale),\n    danger: a.danger,\n    disabled: props.disabled,\n    testid: `surface-list-action-${row.id}-${a.id}`,\n  }));\n}\n</script>\n\n<template>\n  <div class=\"fe-slist\" data-testid=\"surface-list\">\n    <DataTable\n      :table-id=\"tableId\"\n      :columns=\"columns\"\n      :rows=\"rows\"\n      row-key=\"id\"\n      :locale=\"locale\"\n      :empty=\"emptyText\"\n      :row-attrs=\"(r: ListRow) => ({ 'data-row': r.id })\"\n      :row-actions=\"hasActions ? actionsOf : undefined\"\n      :row-actions-test-id=\"(r: ListRow) => ((r.actions ?? []).length ? `surface-list-actions-${r.id}` : undefined)\"\n      @row-action=\"(key: string, r: ListRow) => emit('action', { action_id: key, row_id: r.id })\"\n    />\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * SurfaceProgress — a plugin surface's `progress` node. `value` 0..100, or\n * null for \"busy, no idea how long\" (drawn as a moving bar).\n */\nimport { computed } from 'vue';\nimport type { LocaleCode } from '../../../types/ExplorerConfig';\nimport type { PluginText } from '../../../types/Plugins';\nimport { useLocale } from '../../../composables/useLocale';\nimport { appTextOr } from '../../../lib/pluginLabel';\n\nconst props = defineProps<{\n  value: number | null | undefined;\n  label?: PluginText | string;\n  locale: LocaleCode;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst pct = computed<number | null>(() => {\n  const v = props.value;\n  if (v === null || v === undefined || !Number.isFinite(Number(v))) return null;\n  return Math.min(100, Math.max(0, Math.round(Number(v))));\n});\n\n/* ⚠ See `appTextOr`: the app's line for this reader, then filex's own. */\nconst text = computed(() => appTextOr(props.label, props.locale, () => t('plugin.view.busy')));\n</script>\n\n<template>\n  <div class=\"fe-sprogress\" data-testid=\"surface-progress\">\n    <div class=\"fe-sprogress__head\">\n      <span class=\"fe-sprogress__label\">{{ text }}</span>\n      <span v-if=\"pct !== null\" class=\"fe-sprogress__pct\">{{ pct }}%</span>\n    </div>\n    <div\n      class=\"fe-sprogress__track\"\n      :class=\"{ 'is-indeterminate': pct === null }\"\n      role=\"progressbar\"\n      :aria-label=\"text\"\n      aria-valuemin=\"0\"\n      aria-valuemax=\"100\"\n      :aria-valuenow=\"pct === null ? undefined : pct\"\n    >\n      <div class=\"fe-sprogress__bar\" :style=\"pct === null ? undefined : { width: `${pct}%` }\"></div>\n    </div>\n  </div>\n</template>\n","/**\n * listInput — the ONE splitter for \"several things typed into one field\":\n * recipients, extensions, tags, identities, a multi-select's stored answer.\n *\n * ⚠⚠ The comma is not one character. An Arabic, Persian or Urdu keyboard\n * types \"،\" (U+060C ARABIC COMMA) where an English one types \",\", Chinese and\n * Japanese input methods type \"，\" (U+FF0C FULLWIDTH COMMA) or \"、\" (U+3001\n * IDEOGRAPHIC COMMA), and the semicolon has its own Arabic (U+061B \"؛\") and\n * fullwidth (U+FF1B \"；\") forms. Every list field used to split on the ASCII\n * characters only, so `a@x.com، b@y.com` — exactly what a person writing in\n * Arabic produces — became ONE malformed address and the share mail said\n * \"enter a valid email\" about a perfectly valid list. Five fields each carried\n * their own `split(/[,…]/)`; they all read through here now, so the next\n * script's comma is added once.\n *\n * Items are trimmed and empty ones dropped; nothing else is decided here\n * (lower-casing, de-duplication, \"does it contain an @\" stay with the caller,\n * which knows what an item is).\n */\n\n/** , ، 、 ， — the characters people type between list items. */\nconst COMMAS = ',\\u060C\\u3001\\uFF0C';\n/** ; ؛ ； */\nconst SEMICOLONS = ';\\u061B\\uFF1B';\n\nexport interface SplitListOptions {\n  /** Whitespace separates items too (never for tags, which may contain a space). */\n  spaces?: boolean;\n  /** Semicolons separate items too (a mail client's recipient habit). */\n  semicolons?: boolean;\n  /** Line breaks separate items too (a pasted column). Implied by `spaces`. */\n  newlines?: boolean;\n}\n\nconst cache = new Map<string, RegExp>();\n\nfunction separatorRe(o: SplitListOptions): RegExp {\n  const key = `${o.spaces ? 1 : 0}${o.semicolons ? 1 : 0}${o.newlines ? 1 : 0}`;\n  let re = cache.get(key);\n  if (!re) {\n    const cls = COMMAS + (o.semicolons ? SEMICOLONS : '') + (o.newlines ? '\\\\n\\\\r' : '') + (o.spaces ? '\\\\s' : '');\n    re = new RegExp(`[${cls}]+`, 'u');\n    cache.set(key, re);\n  }\n  return re;\n}\n\n/** `\"a، b ,c\"` → `[\"a\", \"b\", \"c\"]`. */\nexport function splitList(raw: string | null | undefined, opts: SplitListOptions = {}): string[] {\n  return String(raw ?? '')\n    .split(separatorRe(opts))\n    .map((s) => s.trim())\n    .filter((s) => s !== '');\n}\n\n/**\n * Does this key END a list item in a chip-style field (the typed address or\n * tag becomes a chip)? `,` and each of its siblings above — the same set the\n * splitter uses, so a field that splits a paste and a field that commits on a\n * keypress agree about what a comma is.\n */\nexport function isListSeparatorKey(key: string): boolean {\n  return key.length === 1 && COMMAS.includes(key);\n}\n","<script setup lang=\"ts\">\n/**\n * SurfacePeoplePicker — a plugin surface's `people-picker` node: who a\n * document goes to. Chips for the people already chosen, one box to add\n * the next.\n *\n * Internal users come from `GET /api/files/plugins/users?plugin=&q=`, which\n * answers only for a plugin that holds `users:lookup`. A 403 (or a 404 from\n * a server without the route) turns the lookup off for the life of the\n * node and the box becomes plain e-mail entry — the contract's fallback,\n * and the reason the box never says \"no results\" for a refusal.\n *\n * Free e-mail entry is offered when the plugin allows external people OR\n * the lookup is off: with neither a way to name a user nor a way to type\n * one, the node would be a wall.\n */\nimport { computed, onBeforeUnmount, ref, watch } from 'vue';\nimport type { LocaleCode } from '../../../types/ExplorerConfig';\nimport type { FileApi } from '../../../composables/useFileApi';\nimport type { PluginPerson } from '../../../types/Plugins';\nimport { useLocale } from '../../../composables/useLocale';\nimport { personName } from '../../../lib/personName';\nimport { looksLikeEmail } from '../../../lib/surfaceValues';\nimport { isListSeparatorKey } from '../../../lib/listInput';\n\nconst props = defineProps<{\n  id: string;\n  modelValue: PluginPerson[];\n  multi?: boolean;\n  allowExternal?: boolean;\n  /** Absent: no lookup at all — free e-mail entry only. */\n  api?: Pick<FileApi, 'pluginUsers'>;\n  /** The plugin the lookup is asked for. */\n  plugin?: string;\n  locale: LocaleCode;\n  disabled?: boolean;\n  invalid?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'update:modelValue', v: PluginPerson[]): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst query = ref('');\nconst suggestions = ref<PluginPerson[]>([]);\nconst showSuggest = ref(false);\n/** The server refused (403) or has no route (404): free e-mail entry only. */\nconst lookupOff = ref(!props.api || !props.plugin);\nconst notice = ref('');\nlet timer: ReturnType<typeof setTimeout> | null = null;\nlet lastQuery = 0;\n\nconst people = computed(() => props.modelValue ?? []);\nconst freeEntry = computed(() => props.allowExternal === true || lookupOff.value);\nconst full = computed(() => props.multi !== true && people.value.length >= 1);\n\n/* One rule for naming a person (lib/personName). */\nfunction personLabel(p: PluginPerson): string {\n  return personName({ name: p.name, email: p.email });\n}\n\nfunction add(p: PluginPerson) {\n  const email = String(p.email ?? '').trim().toLowerCase();\n  if (!email) return;\n  const rest = props.multi === true ? people.value.filter((x) => x.email.toLowerCase() !== email) : [];\n  emit('update:modelValue', [...rest, { ...p, email }]);\n  query.value = '';\n  suggestions.value = [];\n  showSuggest.value = false;\n  notice.value = '';\n}\n\nfunction remove(email: string) {\n  emit('update:modelValue', people.value.filter((x) => x.email !== email));\n}\n\nfunction onInput() {\n  notice.value = '';\n  const q = query.value.trim();\n  if (timer) clearTimeout(timer);\n  if (!q || lookupOff.value) {\n    suggestions.value = [];\n    showSuggest.value = false;\n    return;\n  }\n  timer = setTimeout(() => void search(q), 180);\n}\n\nasync function search(q: string) {\n  if (!props.api || !props.plugin || lookupOff.value) return;\n  const mine = ++lastQuery;\n  try {\n    const r = await props.api.pluginUsers(props.plugin, q);\n    if (mine !== lastQuery) return;\n    suggestions.value = (r.users ?? []).filter((u) => u && typeof u.email === 'string');\n    showSuggest.value = suggestions.value.length > 0;\n  } catch (e) {\n    if (mine !== lastQuery) return;\n    const status = (e as { status?: number })?.status;\n    if (status === 403 || status === 404) lookupOff.value = true;\n    suggestions.value = [];\n    showSuggest.value = false;\n  }\n}\n\n/** Enter / comma: the typed address, when free entry is allowed. */\nfunction commit() {\n  const q = query.value.trim();\n  if (!q) return;\n  if (!freeEntry.value) {\n    notice.value = t('plugin.people.external_off');\n    return;\n  }\n  if (!looksLikeEmail(q)) {\n    notice.value = t('plugin.people.invalid_email');\n    return;\n  }\n  add({ email: q });\n}\n\nfunction onKeydown(ev: KeyboardEvent) {\n  // ⚠ \"،\" / \"，\" commit too (lib/listInput — an Arabic or CJK keyboard).\n  if (ev.key === 'Enter' || isListSeparatorKey(ev.key)) {\n    ev.preventDefault();\n    commit();\n  } else if (ev.key === 'Backspace' && query.value === '' && people.value.length) {\n    remove(people.value[people.value.length - 1].email);\n  } else if (ev.key === 'Escape') {\n    showSuggest.value = false;\n  }\n}\n\nfunction onBlur() {\n  // Let a mousedown on a suggestion land first.\n  setTimeout(() => {\n    showSuggest.value = false;\n  }, 120);\n}\n\nwatch(\n  () => [props.api, props.plugin] as const,\n  ([api, plugin]) => {\n    if (api && plugin) lookupOff.value = false;\n  },\n);\n\nonBeforeUnmount(() => {\n  if (timer) clearTimeout(timer);\n});\n</script>\n\n<template>\n  <div class=\"fe-speople\" :class=\"{ 'is-invalid': invalid }\" data-testid=\"surface-people\">\n    <ul v-if=\"people.length\" class=\"fe-speople__chips\" data-testid=\"surface-people-chips\">\n      <li v-for=\"p in people\" :key=\"p.email\" class=\"fe-speople__chip\" :title=\"p.email\">\n        <span class=\"fe-speople__av\" aria-hidden=\"true\">{{ personLabel(p).charAt(0).toUpperCase() }}</span>\n        <span class=\"fe-speople__name\">{{ personLabel(p) }}</span>\n        <button\n          type=\"button\"\n          class=\"fe-speople__remove\"\n          :disabled=\"disabled\"\n          :title=\"t('plugin.people.remove', { name: personLabel(p) })\"\n          :aria-label=\"t('plugin.people.remove', { name: personLabel(p) })\"\n          :data-testid=\"`surface-people-remove-${p.email}`\"\n          @click=\"remove(p.email)\"\n        >\n          <svg class=\"fe-ficon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\" focusable=\"false\">\n            <path d=\"M6 6l12 12M18 6L6 18\" />\n          </svg>\n        </button>\n      </li>\n    </ul>\n    <div v-if=\"!full\" class=\"fe-speople__addwrap\">\n      <input\n        v-model=\"query\"\n        class=\"fe-cfield__input fe-speople__input\"\n        type=\"email\"\n        autocomplete=\"off\"\n        spellcheck=\"false\"\n        :placeholder=\"lookupOff ? t('plugin.people.placeholder_email') : t('plugin.people.placeholder')\"\n        :disabled=\"disabled\"\n        :aria-invalid=\"invalid ? 'true' : undefined\"\n        data-testid=\"surface-people-input\"\n        @input=\"onInput\"\n        @keydown=\"onKeydown\"\n        @focus=\"onInput\"\n        @blur=\"onBlur\"\n      />\n      <button\n        v-if=\"freeEntry\"\n        type=\"button\"\n        class=\"fe-btn fe-btn--sm\"\n        :disabled=\"disabled || !query.trim()\"\n        data-testid=\"surface-people-add\"\n        @click=\"commit\"\n      >\n        {{ t('plugin.people.add') }}\n      </button>\n      <ul v-if=\"showSuggest\" class=\"fe-share__suggest fe-speople__suggest\" data-testid=\"surface-people-suggest\">\n        <li v-for=\"u in suggestions\" :key=\"u.user_id ?? u.email\" @mousedown.prevent=\"add(u)\">\n          <span class=\"fe-share__av fe-share__av--sm\">{{ personLabel(u).charAt(0).toUpperCase() }}</span>\n          <span class=\"fe-share__suggesttxt\">\n            <span class=\"fe-share__suggestname\">{{ personLabel(u) }}</span>\n            <span class=\"fe-share__suggestmeta\">{{ u.email }}</span>\n          </span>\n        </li>\n      </ul>\n    </div>\n    <p v-if=\"notice\" class=\"fe-surface__error\" role=\"alert\">{{ notice }}</p>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * SurfacePinInput — a plugin surface's `pin-input` node: a short code, 4..8\n * characters, into `data.values[id]`. One input with the browser's one-time\n * code affordances rather than N boxes: paste works, screen readers read one\n * field.\n *\n * ⚠ The length is the HOST's: the server writes every `pin-input` node's\n * `length` (clamped to the contract's 4..8, 6 when the app named none;\n * wasmplugin.PinLength) before the screen leaves it, and refuses a code of\n * any other length at submit in its own words. This box only draws that\n * number — it does not decide it.\n */\nimport { computed } from 'vue';\nimport type { LocaleCode } from '../../../types/ExplorerConfig';\nimport { useLocale } from '../../../composables/useLocale';\n\nconst props = defineProps<{\n  id: string;\n  length?: number | unknown;\n  modelValue: string;\n  locale: LocaleCode;\n  disabled?: boolean;\n  invalid?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'update:modelValue', v: string): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/** The host's length; nothing to hold the box to when a node carries none. */\nconst len = computed<number | undefined>(() => {\n  const n = Number(props.length);\n  return Number.isInteger(n) && n > 0 ? n : undefined;\n});\n\nfunction onInput(ev: Event) {\n  const raw = (ev.target as HTMLInputElement).value.replace(/\\s+/g, '').slice(0, len.value);\n  (ev.target as HTMLInputElement).value = raw;\n  emit('update:modelValue', raw);\n}\n</script>\n\n<template>\n  <div class=\"fe-spin\" data-testid=\"surface-pin\">\n    <label class=\"fe-cfield__label\" :for=\"`fe-spin-${id}`\">{{ t('plugin.pin.label') }}</label>\n    <input\n      :id=\"`fe-spin-${id}`\"\n      class=\"fe-cfield__input fe-cfield__input--mono fe-spin__input\"\n      :class=\"{ 'is-invalid': invalid }\"\n      type=\"text\"\n      inputmode=\"numeric\"\n      autocomplete=\"one-time-code\"\n      spellcheck=\"false\"\n      :maxlength=\"len\"\n      :size=\"len\"\n      :value=\"modelValue\"\n      :disabled=\"disabled\"\n      :aria-invalid=\"invalid ? 'true' : undefined\"\n      :style=\"{ '--spin-len': len }\"\n      @input=\"onInput\"\n    />\n  </div>\n</template>\n","/**\n * destinationTree — the rules behind \"choose a folder\".\n *\n * filex had no folder chooser. Copy and move existed (cut/paste, drag between\n * panes) but both required the destination to already be on screen, which is\n * why there was no \"Move to…\" or \"Copy to…\" anywhere: the verb was never the\n * missing part, the picker was. `NewDocumentModal` grew a private one-level\n * browser for its own \"where should this document go?\" question, and a second\n * private copy for Move/Copy would have been the moment the two started\n * disagreeing about what a writable folder is.\n *\n * Everything here is DOM-free and synchronous so the rules can be tested\n * without mounting anything. The component\n * (`modals/DestinationPickerModal.vue`) owns the reactive state and the\n * listing calls; this module owns the answers.\n *\n * # Wire paths\n *\n * A destination is an adapter-qualified wire path — `main://belgeler/2026` —\n * exactly what `api.copy` / `api.moveAsync` take and what the backend resolves\n * to a storage. The tree therefore spans storages, because copy and move\n * already do: `internal/ops` streams bytes between two drivers when the source\n * and destination storages differ. A picker that could only offer folders in\n * the current storage would hide a capability the product already has.\n */\n\nimport type { FileNode } from '../types/FileNode';\n\n/**\n * The browser's top level: the list of drives rather than a folder.\n *\n * It cannot collide with a real destination because every wire path contains\n * `://` and this string does not. (The same sentinel and the same reasoning as\n * NewDocumentModal's private browser, which this module is meant to replace.)\n */\nexport const DRIVES = '@@drives';\n\n/** Split `adapter://rel` into its two halves; a bare path has no adapter. */\nexport function splitWire(p: string): [string, string] {\n  const i = p.indexOf('://');\n  if (i < 0) return ['', trimSlashes(p)];\n  return [p.slice(0, i), trimSlashes(p.slice(i + 3))];\n}\n\n/** Rebuild `adapter://rel`. An empty rel is the storage root. */\nexport function joinWire(adapter: string, rel: string): string {\n  const r = trimSlashes(rel);\n  return r ? `${adapter}://${r}` : `${adapter}://`;\n}\n\nfunction trimSlashes(s: string): string {\n  return s.replace(/^\\/+|\\/+$/g, '');\n}\n\n/**\n * The wire path one level up, or null when there is nowhere further up.\n *\n * `multiDrive` decides what sits above a storage root: with more than one\n * storage the answer is the list of drives, with exactly one there is nothing\n * above the root and the Up button must be disabled rather than land the user\n * on a one-row list of the drive they are already in.\n */\nexport function parentOfWire(p: string, multiDrive: boolean): string | null {\n  if (p === DRIVES) return null;\n  const [adapter, rel] = splitWire(p);\n  if (!adapter) return null;\n  if (!rel) return multiDrive ? DRIVES : null;\n  const parts = rel.split('/');\n  parts.pop();\n  return joinWire(adapter, parts.join('/'));\n}\n\n/** The last segment of a wire path — what a breadcrumb or a row shows. */\nexport function labelOfWire(p: string, drivesLabel: string): string {\n  if (p === DRIVES) return drivesLabel;\n  const [adapter, rel] = splitWire(p);\n  if (!rel) return adapter || drivesLabel;\n  const parts = rel.split('/');\n  return parts[parts.length - 1] || adapter;\n}\n\n/** Every step from the storage root down to `p`, for a clickable breadcrumb. */\nexport function crumbsOfWire(p: string): Array<{ label: string; path: string }> {\n  if (p === DRIVES || !p) return [];\n  const [adapter, rel] = splitWire(p);\n  if (!adapter) return [];\n  const out = [{ label: adapter, path: joinWire(adapter, '') }];\n  if (!rel) return out;\n  let acc = '';\n  for (const seg of rel.split('/')) {\n    acc = acc ? `${acc}/${seg}` : seg;\n    out.push({ label: seg, path: joinWire(adapter, acc) });\n  }\n  return out;\n}\n\n/**\n * May the caller write into a folder with this `perm`?\n *\n * ⚠ `undefined` AND `''` both mean \"this storage does not enforce ACL\", which\n * is the pre-RBAC default and full access. The declared type says one of four\n * levels, but the wire really does carry `''` for an unenforced storage, so\n * reading both as allowed is the truthful reading and not a convenience.\n *\n * This is deliberately the same predicate as `FileExplorer.permCanEdit` and\n * `NewDocumentModal.permAllowsWrite`. Two answers to \"may I write here\" is how\n * a dialog ends up offering a destination the toolbar hides.\n */\nexport function permAllowsWrite(perm: string | undefined | null): boolean {\n  return perm === undefined || perm === null || perm === '' || perm === 'editor' || perm === 'owner';\n}\n\n/** Is `child` the same as, or inside, `ancestor`? Both are wire paths. */\nexport function isAtOrInside(child: string, ancestor: string): boolean {\n  if (child === DRIVES || ancestor === DRIVES) return false;\n  const [ca, cr] = splitWire(child);\n  const [aa, ar] = splitWire(ancestor);\n  if (ca !== aa) return false;\n  if (ar === '') return true;\n  return cr === ar || cr.startsWith(ar + '/');\n}\n\n/**\n * Why this folder cannot be the destination, or null when it can.\n *\n * `'self'` and `'descendant'` are kept apart because they need different\n * sentences. \"You cannot move a folder into itself\" and \"…into a folder inside\n * it\" are the two halves of the mistake, and a single message covering both\n * reads as a riddle at the moment the person is trying to work out what they\n * did wrong.\n *\n * ⚠ This is a courtesy, not a control. The same refusal exists in\n * `internal/ops.SubmitTo` and answers 400 whatever the picker offered —\n * measured on a live local storage 2026-09-13, where the API accepted the\n * request and the queue worker failed it minutes later with an errno.\n */\nexport function blockedReason(\n  candidate: string,\n  moving: string[] | undefined,\n): 'self' | 'descendant' | null {\n  if (!moving || moving.length === 0) return null;\n  if (candidate === DRIVES) return null;\n  const norm = (p: string) => {\n    const [a, r] = splitWire(p);\n    return joinWire(a, r);\n  };\n  const c = norm(candidate);\n  for (const src of moving) {\n    if (!src) continue;\n    // Order matters: equality is also \"inside\", and the two need different\n    // sentences.\n    if (c === norm(src)) return 'self';\n    if (isAtOrInside(candidate, src)) return 'descendant';\n  }\n  return null;\n}\n\n/* wiring:e2 vault -------------------------------------------------------\n * A vault (docs/E2E-VAULT-FORMAT.md) is written only through its own API:\n * what is inside one moves and copies only inside it, and nothing is moved\n * into a vault or out of one on the server - that is an upload or a\n * download. The picker says so before the person chooses, rather than\n * offering a folder the transfer then refuses. */\n\n/** The vault `p` is in or is, or null. `roots` are the vault folders known:\n *  the ones the explorer opened, and the ones the server's listings named. */\nexport function vaultOfWire(p: string, roots: Iterable<string>): string | null {\n  if (!p || p === DRIVES) return null;\n  for (const r of roots) if (r && isAtOrInside(p, r)) return r;\n  return null;\n}\n\n/**\n * Why the vault rule refuses `dest`, or null. `from` is the vault the items\n * are in (null: outside every vault); `vaultOf` answers the vault a path is\n * in or is.\n *\n *   `'into'`  the items are outside every vault and dest is in one;\n *   `'out'`   the items are in a vault and dest is not in that one.\n */\nexport function vaultBlocked(\n  dest: string,\n  from: string | null | undefined,\n  vaultOf: (p: string) => string | null,\n): 'into' | 'out' | null {\n  if (!dest || dest === DRIVES) return null;\n  const v = vaultOf(dest);\n  if (from) return v === from ? null : 'out';\n  return v ? 'into' : null;\n}\n\n/** A row the vault rule closes for good: nothing under it may be chosen\n *  either. A folder that holds the items' vault stays open - it is the way\n *  back into the vault. */\nexport function vaultDeadEnd(\n  dest: string,\n  from: string | null | undefined,\n  vaultOf: (p: string) => string | null,\n): boolean {\n  if (!vaultBlocked(dest, from, vaultOf)) return false;\n  return !(from && isAtOrInside(from, dest));\n}\n\n/* /wiring:e2 vault */\n\n/** One row in the picker's list. */\nexport interface DestinationRow {\n  /** Wire path of the folder (or, in a file pick, the file). */\n  path: string;\n  /** What to show — the entry's own name. */\n  label: string;\n  /** May the caller write into it? Drives the disabled Choose button. */\n  writable: boolean;\n  /** Set when this row is one of the folders being moved, or inside one -\n   *  or, `'vault'`, a folder the vault rule closes (vaultBlocked). */\n  blocked: 'self' | 'descendant' | 'vault' | null;\n  /** wiring:e2 vault — the folder is a vault (docs/E2E-VAULT-FORMAT.md). */\n  vault?: boolean;\n  /**\n   * Folders are walked into; a file (offered only when the picker is asked\n   * for one — an app plugin's `file-chooser`) is the answer itself.\n   */\n  kind: 'dir' | 'file';\n}\n\n/**\n * Turn a listing into rows.\n *\n * ⚠ An unwritable folder is LISTED and stays OPENABLE. The grant that allows\n * writing may live on a subfolder, so hiding the parent would make the\n * destination unreachable; hiding it also tells the user their folder is gone\n * rather than that they may not write into it. Same rule NewDocumentModal\n * settled on.\n *\n * ⚠ A blocked folder (the one being moved, or inside it) is also listed rather\n * than hidden: seeing it greyed out with a reason is how a person understands\n * the refusal. It is not openable, because everything under it is blocked too\n * and walking into a dead end is not navigation.\n */\nexport function destinationRows(\n  files: FileNode[] | undefined,\n  moving?: string[],\n  opts: { files?: boolean } = {},\n): DestinationRow[] {\n  const out: DestinationRow[] = [];\n  for (const f of files ?? []) {\n    if (f.type !== 'dir') {\n      // A file row is a choice, not a place: it needs no write check (the\n      // chooser READS it) and cannot be \"inside\" a moving folder in any way\n      // that matters, so it carries neither.\n      if (opts.files && f.type === 'file') {\n        out.push({ path: f.path, label: f.basename, writable: true, blocked: null, kind: 'file' });\n      }\n      continue;\n    }\n    out.push({\n      path: f.path,\n      label: f.basename,\n      writable: permAllowsWrite(f.perm as string | undefined),\n      blocked: blockedReason(f.path, moving),\n      kind: 'dir',\n    });\n  }\n  return out;\n}\n\n/** The drives level: one row per storage, each its own root. */\nexport function driveRows(storages: string[] | undefined, moving?: string[]): DestinationRow[] {\n  return (storages ?? []).map((name) => {\n    const path = joinWire(name, '');\n    return {\n      path,\n      label: name,\n      // A storage root's own writability is not knowable from the drive list;\n      // it is answered by the listing when the user opens it. Offering it as\n      // writable here and letting the listing correct that is the honest\n      // order — the alternative greys out every drive until each is opened.\n      writable: true,\n      blocked: blockedReason(path, moving),\n      kind: 'dir',\n    };\n  });\n}\n\n/**\n * Where the picker should open.\n *\n * The current folder, because that is where the person is standing and most\n * destinations are near it. Falls back to the drives list when there is more\n * than one storage and no current folder, and to the single storage's root\n * when there is only one.\n */\nexport function initialLocation(\n  current: string | undefined,\n  storages: string[] | undefined,\n): string {\n  const multi = (storages?.length ?? 0) > 1;\n  if (current && current.includes('://')) return current;\n  if (multi) return DRIVES;\n  const only = storages?.[0];\n  return only ? joinWire(only, '') : DRIVES;\n}\n","/**\n * modalStack — which explorer dialog is on top.\n *\n * Every open `modals/Modal.vue` registers here, and only the LAST one\n * answers the keyboard (Escape, the Tab trap). Two dialogs open at once is\n * ordinary — a confirmation over a plugin's screen, the destination picker\n * over a move — and Escape must close the one in front, not both.\n *\n * ⚠ Module state on purpose: `<script setup>` top-level declarations are\n * per INSTANCE, so a stack declared inside the component would hold one\n * entry per dialog and every dialog would think it was on top.\n */\nconst stack: symbol[] = [];\n\nexport function pushModal(id: symbol): void {\n  stack.push(id);\n}\n\nexport function popModal(id: symbol): void {\n  const i = stack.lastIndexOf(id);\n  if (i >= 0) stack.splice(i, 1);\n}\n\nexport function isTopModal(id: symbol): boolean {\n  return stack[stack.length - 1] === id;\n}\n","<script setup lang=\"ts\">\n/**\n * Modal — tiny headless wrapper. Backdrop + centered card + ESC + autofocus.\n *\n * ⚠⚠ Every dialog the explorer draws is this one — rename, new folder, the\n * delete confirmation, and the frame EVERY app plugin's screen opens in\n * (PluginViewModal). What it does on Escape, on a click outside the card\n * and with the focus is therefore what all of them do, and until v0.43.0\n * it did none of the three for a dialog MOUNTED open:\n *\n *   • the keys and the focus were wired in a `watch` on `open` without\n *     `immediate`, so a dialog created with `open` already true (the plugin\n *     frame is `v-if` + `:open=\"true\"`) never heard Escape and never took\n *     the focus — the converter's dialog stayed up on Escape while the share\n *     dialog next to it closed (release-candidate sweep, 2026-09-21);\n *   • `closeOnBackdrop` was read as `!== false`, but Vue casts an absent\n *     boolean prop to `false`, so NO dialog closed on an outside click.\n */\nimport { watch, onBeforeUnmount, ref, getCurrentInstance, inject, nextTick } from 'vue';\nimport { isTopModal, popModal, pushModal } from '../lib/modalStack';\nimport { EXPLORER_LOCALE, useLocale } from '../composables/useLocale';\n\nconst props = withDefaults(defineProps<{\n  /** The explorer's language, for the close button's name. Absent = English. */\n  locale?: string;\n  open: boolean;\n  title?: string;\n  size?: 'sm' | 'md' | 'lg' | 'xl';\n  /** A click outside the card closes the dialog (the default, as the share\n   *  dialog and the admin panel's dialogs do). `false` for a dialog that\n   *  must be answered — the recovery key a person has to write down. */\n  closeOnBackdrop?: boolean;\n  /** When true, drop the dialog chrome (backdrop tint, header, footer,\n   *  centered card with border-radius) and render the slot full-bleed.\n   *  Used by the standalone /files/edit route where the browser tab IS\n   *  the container — a modal frame on top of it just steals real estate\n   *  from the editor.\n   *\n   *  ⚠ Escape does NOT close a chromeless dialog. There it would close the\n   *  TAB (the route answers `close` with window.close()), and Escape is a\n   *  key editors use for themselves — dismissing a suggestion list in the\n   *  text editor must not throw the document away. It never did in\n   *  practice (the route mounts the dialog open, see above); now it is a\n   *  rule rather than an accident. */\n  chromeless?: boolean;\n  /**\n   * gorunum:v1 — full-bleed overlay. Like `chromeless` it drops the dialog\n   * head and footer and lets the card own the whole viewport, but it KEEPS\n   * the modal identity: the card still paints a ground and the caller draws\n   * its own chrome inside the slot (see PreviewModal's viewer bar).\n   *\n   * ⚠ Deliberately a second flag rather than a reuse of `chromeless`.\n   * `chromeless` means \"the browser tab IS the container\" (the standalone\n   * /files/edit route) and e2e/tests/83 asserts on exactly that class; an\n   * in-page preview that borrowed it would start claiming to be that route.\n   */\n  fullbleed?: boolean;\n  /** Explicit theme. When set the modal stamps the appropriate\n   *  `.fe--theme-{light,dark}` class on its `.fe` backdrop so the CSS\n   *  variable cascade matches the host shell regardless of OS\n   *  preference (Modal is a portal-shaped descendant of `<body>`\n   *  rather than a child of the parent component, so plain DOM\n   *  inheritance isn't always enough). */\n  theme?: 'light' | 'dark' | 'auto';\n  /**\n   * The work this dialog started is on its way (a rename, a delete, an app's\n   * answer, a conversion). Escape and a click outside do nothing, × is shut,\n   * and the dialog says `aria-busy`; the caller shuts its own buttons.\n   *\n   * ⚠⚠ ONE rule for every dialog. #59's dialogs closed anyway and lost the\n   * server's refusal, an app's screen refused to close while its × looked\n   * live, and the converter asked with the browser's own `confirm()` —\n   * unthemed, not right-to-left, and simply blocked in an iframe sandboxed\n   * without `allow-modals`.\n   */\n  busy?: boolean;\n  /**\n   * A busy dialog that closing can still END — the converter, whose work runs\n   * in the dialog's own frame, for up to half an hour. × stays live and asks\n   * INSIDE the dialog: `question`, then \"Keep going\" or `confirm` (default\n   * \"Stop and close\"). Escape and an outside click still do nothing.\n   */\n  busyClose?: { question: string; confirm?: string } | null;\n  /**\n   * The slot draws the WHOLE card — its own head, its own close button, its\n   * own size and ground (the user settings dialog: head, rail and pane). The\n   * frame keeps everything that makes it a dialog: the backdrop, Escape, a\n   * click outside, the focus trap, the focus going home, `aria-modal`.\n   *\n   * ⚠ Why the settings dialog is THIS and not a native `<dialog>` any more:\n   * showModal() puts a dialog in the browser's top layer, above every\n   * z-index, and makes the rest of the page inert. In the desktop app the\n   * window's title bar IS page content (a frameless window), so minimise,\n   * maximise and close were under the backdrop and a click on them closed\n   * the dialog instead (owner, 2026-09-27: the title bar works ALWAYS).\n   */\n  bare?: boolean;\n  /** The id of a heading the slot draws itself — the dialog's name when there\n   *  is no `title` (a bare dialog names itself with its own heading). */\n  labelledby?: string;\n}>(), {\n  closeOnBackdrop: true,\n  busyClose: null,\n});\n// ⚠ The explorer's language when the caller names none (EXPLORER_LOCALE):\n// the × used to be \"Close\" under every Turkish dialog.\nconst ambientLocale = getCurrentInstance() ? inject(EXPLORER_LOCALE, undefined) : undefined;\nconst { t } = useLocale(() => props.locale ?? ambientLocale?.() ?? 'en');\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n}>();\n\nconst cardEl = ref<HTMLElement | null>(null);\n\n/* wiring:c4 — a11y: unique title id for aria-labelledby + focus restore.\n * The element focused before the modal opened gets focus back on close so\n * keyboard users return to where they were instead of <body>. */\nlet modalSeq = 0;\nconst titleId = `fe-modal-title-${++modalSeq}-${Math.random().toString(36).slice(2, 7)}`;\nlet prevFocus: HTMLElement | null = null;\n/** Where the focus was the moment this dialog took it, if that is not\n *  `prevFocus` — the home to fall back on when `prevFocus` is gone. */\nlet lateFocus: HTMLElement | null = null;\n\nconst FOCUSABLE =\n  'input:not([disabled]),select:not([disabled]),textarea:not([disabled]),' +\n  'button:not([disabled]),a[href],[tabindex]:not([tabindex=\"-1\"])';\n\n/** This dialog's place in lib/modalStack: only the top one answers keys. */\nconst me = Symbol('fe-modal');\nlet wired = false;\nlet focusTimer: ReturnType<typeof setTimeout> | undefined;\n\n/**\n * The first thing to focus: something in the BODY when there is one, so a\n * form's first box — or a plugin screen's first choice — has the cursor,\n * not the header's ×; then the footer; then anything in the card (the ×).\n */\nfunction focusFirst() {\n  const card = cardEl.value;\n  if (!card) return;\n  // A dialog that names its default answer (`data-fe-autofocus`) gets it, even\n  // in the footer: the draft close question's first footer button is Discard,\n  // and focusing it made Enter throw the draft away (v0.48.0 pretag, after\n  // the viewer behind the question had taken the focus; see wire()).\n  const preferred = card.querySelector<HTMLElement>('[data-fe-autofocus]');\n  if (preferred) {\n    preferred.focus();\n    return;\n  }\n  const within = (sel: string) => card.querySelector(sel)?.querySelector<HTMLElement>(FOCUSABLE) ?? null;\n  const target = within('.fe-modal__body') ?? within('.fe-modal__actions') ?? card.querySelector<HTMLElement>(FOCUSABLE);\n  target?.focus();\n}\n\nfunction wire() {\n  if (wired) return;\n  wired = true;\n  prevFocus = (document.activeElement as HTMLElement | null) ?? null; /* wiring:c4 */\n  lateFocus = null;\n  pushModal(me);\n  document.addEventListener('keydown', onKey);\n  // ⚠ The handle is kept and cleared on unwire: a dialog closed (or torn\n  // down, as a test environment is) inside these 30 ms must not reach for a\n  // document that is gone — vitest reported exactly that as an unhandled\n  // \"document is not defined\" once dialogs created open were wired.\n  focusTimer = setTimeout(() => {\n    focusTimer = undefined;\n    if (typeof document === 'undefined') return;\n    // Only if the focus is not already inside (a component that focuses its\n    // own field on mount keeps it), and only while this dialog is the one in\n    // FRONT.\n    //\n    // ⚠⚠ A dialog behind another does not take the focus: it belongs to the\n    // one in front. A draft's editor whose close question opened within these\n    // 30 ms (the question is a SIBLING of the viewer's card, so \"inside\" is\n    // false) pulled the focus off \"Keep in Drafts\" into its own text box when\n    // this timer fired, until the question's own timer took it back 30 ms\n    // later; an Enter in between went into the draft's text. previewDraft's\n    // focus check landed in that window on the v0.48.0 release run and on a\n    // v0.48.1 CI run (activeElement: the viewer's textarea). Frozen timers\n    // reproduce it every time (previewDraft.test.ts, coreModal.test.ts).\n    if (wired && isTopModal(me) && !cardEl.value?.contains(document.activeElement)) {\n      // ⚠ A dialog opened from a MENU row: at wire time the focus is on that\n      // row, the menu hands the focus back to its own button a tick later,\n      // and the row is gone once the menu's closing transition ends. Keep\n      // where the focus is NOW as the second home: measured in the desktop\n      // app, Escape on the user settings dialog (opened from the avatar)\n      // left the focus on <body> instead of on the avatar.\n      const now = document.activeElement as HTMLElement | null;\n      lateFocus = now && now !== document.body && now !== prevFocus ? now : null;\n      focusFirst();\n    }\n  }, 30);\n}\n\nfunction unwire() {\n  if (!wired) return;\n  wired = false;\n  if (focusTimer !== undefined) {\n    clearTimeout(focusTimer);\n    focusTimer = undefined;\n  }\n  document.removeEventListener('keydown', onKey);\n  popModal(me);\n  /* wiring:c4 — return focus to the opener; to where the focus stood when\n     the dialog took it if the opener is gone (a menu row). */\n  const home = prevFocus?.isConnected ? prevFocus : lateFocus?.isConnected ? lateFocus : prevFocus;\n  home?.focus?.();\n  prevFocus = null;\n  lateFocus = null;\n}\n\n// ⚠ `immediate`: a dialog created open (v-if + :open=\"true\", which is how\n// the explorer mounts every plugin screen) must be wired exactly like one\n// that opens later. See the header for what happened without it.\nwatch(\n  () => props.open,\n  (v) => (v ? wire() : unwire()),\n  { immediate: true },\n);\n\n// Removed while still open (the parent's v-if went false first): the keys\n// come off and the focus goes home, as if it had closed.\nonBeforeUnmount(unwire);\n\n/** × pressed on a busy dialog that closing can end: the question is up. */\nconst asking = ref(false);\nconst keepEl = ref<HTMLButtonElement | null>(null);\n// The work ended (or the dialog went) while the question was up: there is\n// nothing left to stop, and the question would be about nothing.\nwatch(\n  () => [props.busy, props.open] as const,\n  ([busy, open]) => {\n    if (!busy || !open) asking.value = false;\n  },\n);\n\n/** × — the one way out of a dialog that is not busy; asks on one whose work\n *  closing would end; does nothing (it is shut) on any other busy dialog. */\nfunction requestClose() {\n  if (!props.busy) {\n    emit('close');\n    return;\n  }\n  if (!props.busyClose) return;\n  asking.value = true;\n  // The safe answer has the focus: Enter or Space keeps the work going.\n  void nextTick(() => keepEl.value?.focus());\n}\n\nfunction stopAndClose() {\n  asking.value = false;\n  emit('close');\n}\n\nfunction onKey(e: KeyboardEvent) {\n  if (!isTopModal(me)) return;\n  if (e.key === 'Escape') {\n    if (props.chromeless) return;\n    // Escape answers the question with the safe answer, and otherwise does\n    // nothing while the work is on its way.\n    if (asking.value) {\n      asking.value = false;\n      return;\n    }\n    if (props.busy) return;\n    emit('close');\n    return;\n  }\n  /* wiring:c4 — focus trap: Tab cycles inside the card (WAI-ARIA dialog).\n   * Without it, Tab walked out into the host page behind the backdrop. */\n  if (e.key === 'Tab' && cardEl.value) {\n    const nodes = Array.from(cardEl.value.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n      (el) => el.offsetParent !== null || el === document.activeElement,\n    );\n    if (nodes.length === 0) return;\n    const first = nodes[0];\n    const last = nodes[nodes.length - 1];\n    const active = document.activeElement as HTMLElement | null;\n    if (e.shiftKey && (active === first || !cardEl.value.contains(active))) {\n      e.preventDefault();\n      last.focus();\n    } else if (!e.shiftKey && (active === last || !cardEl.value.contains(active))) {\n      e.preventDefault();\n      first.focus();\n    }\n  }\n}\n\n/**\n * A click outside the card closes the dialog — but only a click that also\n * STARTED outside it. A drag that selects text in a field and is released\n * over the backdrop fires `click` on the backdrop (the common ancestor), and\n * closing then would throw away what was being typed.\n */\nlet downOnBackdrop = false;\nfunction onBackdropDown(e: PointerEvent) {\n  downOnBackdrop = e.target === e.currentTarget;\n}\nfunction onBackdrop(e: MouseEvent) {\n  const started = downOnBackdrop;\n  downOnBackdrop = false;\n  if (!props.closeOnBackdrop || props.chromeless || props.busy) return;\n  if (e.target !== e.currentTarget || !started) return;\n  emit('close');\n}\n</script>\n\n<template>\n  <transition name=\"fe-modal\">\n    <div\n      v-if=\"open\"\n      class=\"fe fe-modal__backdrop\"\n      :class=\"[\n        { 'fe-modal__backdrop--chromeless': chromeless },\n        { 'fe-modal__backdrop--fullbleed': fullbleed && !chromeless },\n        theme === 'light' ? 'fe--theme-light' : '',\n        theme === 'dark' ? 'fe--theme-dark' : '',\n      ]\"\n      role=\"presentation\"\n      @pointerdown=\"onBackdropDown\"\n      @click=\"onBackdrop\"\n    >\n      <div\n        ref=\"cardEl\"\n        class=\"fe-modal__card\"\n        :class=\"[\n          bare ? 'fe-modal__card--bare' : `fe-modal__card--${size || 'md'}`,\n          chromeless && 'fe-modal__card--chromeless',\n          fullbleed && !chromeless && 'fe-modal__card--fullbleed',\n        ]\"\n        role=\"dialog\"\n        aria-modal=\"true\"\n        :aria-labelledby=\"labelledby || (title && !chromeless && !fullbleed && !bare ? titleId : undefined)\"\n        :aria-label=\"labelledby ? undefined : !title || chromeless || fullbleed || bare ? title || undefined : undefined\"\n        :aria-busy=\"busy ? 'true' : undefined\"\n        @click.stop\n      >\n        <header v-if=\"title && !chromeless && !fullbleed && !bare\" class=\"fe-modal__head\">\n          <h2 :id=\"titleId\" class=\"fe-modal__title\">{{ title }}</h2>\n          <button\n            type=\"button\"\n            class=\"fe-modal__close\"\n            :aria-label=\"t('modal.close')\"\n            :disabled=\"busy && !busyClose\"\n            @click=\"requestClose\"\n          >×</button>\n        </header>\n        <div class=\"fe-modal__body\">\n          <slot />\n        </div>\n        <!-- The question a busy dialog asks before closing ends its work — in\n             the dialog, themed and in the reader's direction, never the\n             browser's confirm(). -->\n        <div v-if=\"asking && busyClose\" class=\"fe-modal__ask\" role=\"alert\" data-testid=\"modal-busy-close\">\n          <p class=\"fe-modal__ask-text\">{{ busyClose.question }}</p>\n          <div class=\"fe-modal__ask-actions\">\n            <button\n              ref=\"keepEl\"\n              type=\"button\"\n              class=\"fe-btn\"\n              data-testid=\"modal-busy-close-keep\"\n              @click=\"asking = false\"\n            >{{ t('modal.busy_close.keep') }}</button>\n            <button\n              type=\"button\"\n              class=\"fe-btn fe-btn--danger\"\n              data-testid=\"modal-busy-close-confirm\"\n              @click=\"stopAndClose\"\n            >{{ busyClose.confirm || t('modal.busy_close.confirm') }}</button>\n          </div>\n        </div>\n        <footer v-if=\"$slots.actions && !chromeless && !fullbleed && !bare\" class=\"fe-modal__actions\">\n          <slot name=\"actions\" />\n        </footer>\n      </div>\n    </div>\n  </transition>\n</template>\n","<script setup lang=\"ts\">\n/**\n * DestinationPickerModal — \"choose a folder\", as one component.\n *\n * # Why it exists\n *\n * `Move to…` and `Copy to…` were missing from the selection bar, and the\n * missing part was never the verb: `transferItems` already moves and copies,\n * across storages, and cut+paste has always done it. What did not exist\n * anywhere in the client was a way to SAY WHERE. `dirsOnly` — the backend's\n * folders-only listing — had zero consumers; `api.subfolders()` had been\n * written and never called.\n *\n * # Why a component and not two buttons' private dialog\n *\n * `NewDocumentModal` already grew a private one-level browser for its own\n * \"where should this go?\" question. A second private copy for Move/Copy is how\n * the two start disagreeing — about what a writable folder is, about whether an\n * unwritable one is hidden or greyed, about what sits above a storage root. So\n * this takes its inputs as props and answers with one event, and the rules live\n * in `lib/destinationTree.ts` where they can be tested without a DOM. Anything\n * that needs a folder — Move, Copy, the new-document flow, an app plugin's\n * `file-chooser` and an app's save-as (AppFrame, `mode=\"save\"`) — mounts\n * this.\n *\n * # Contract\n *\n *   <DestinationPickerModal\n *     :open=\"show\" :api=\"api\" :locale=\"locale\"\n *     :storages=\"['main','s3']\"        // drive names; >1 adds a drives level\n *     :start-at=\"'main://belgeler'\"     // where to open (the current folder)\n *     :moving=\"['main://belgeler/eski']\" // folders that may not be the target\n *     mode=\"move\"                        // move | copy | choose | save: the title and the button\n *     @pick=\"(wirePath) => …\"\n *     @close=\"show = false\"\n *   />\n *\n * `pick` emits an adapter-qualified wire path — exactly what `api.copy` and\n * `api.moveAsync` take.\n */\nimport { computed, inject, ref, watch } from 'vue';\nimport { E2E_NAME_VIEW } from '../composables/useE2eNames';\nimport Modal from './Modal.vue';\nimport { useLocale } from '../composables/useLocale';\nimport type { FileApi, ManagerResponse } from '../composables/useFileApi';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { fileIconTile, iconTile } from '../lib/fileIcons';\nimport {\n  DRIVES,\n  type DestinationRow,\n  blockedReason,\n  crumbsOfWire,\n  destinationRows,\n  driveRows,\n  initialLocation,\n  labelOfWire,\n  parentOfWire,\n  permAllowsWrite,\n  vaultBlocked,\n  vaultDeadEnd,\n  vaultOfWire,\n} from '../lib/destinationTree';\n\nconst props = defineProps<{\n  open: boolean;\n  api: Pick<FileApi, 'index'>;\n  locale: LocaleCode;\n  /** Storage names. More than one adds a drives level above the roots. */\n  storages?: string[];\n  /** Wire path to open at — normally the folder the user is looking at. */\n  startAt?: string;\n  /**\n   * Folders that must not be offered: what is being moved. A destination equal\n   * to one of these, or inside one, is shown greyed with a reason rather than\n   * hidden, because a folder that silently vanishes reads as data loss.\n   */\n  moving?: string[];\n  /**\n   * Titles the dialog and names its confirm button. `save` is an app's\n   * save-as (`file.saveAs`, AppFrame): \"Save here\".\n   */\n  mode?: 'move' | 'copy' | 'choose' | 'save';\n  /**\n   * The dialog's title, when the caller has a better one than the mode's —\n   * an app's save-as names the app and the file (security review UI-14:\n   * what filex draws for an app says who is asking).\n   */\n  title?: string;\n  /** The explorer's theme, for a dialog drawn outside its root. */\n  theme?: 'light' | 'dark' | 'auto';\n  /**\n   * What the answer is. `dir` (the default) is the folder you are standing in;\n   * `file` lists the files too and the answer is the one you tick — an app\n   * plugin's `file-chooser` asks for this. A file pick has no write check:\n   * the chooser reads, it never writes.\n   */\n  pick?: 'dir' | 'file';\n  /** The parent is running the operation: the dialog stays up but inert. */\n  busy?: boolean;\n  /**\n   * wiring:e2 vault — the vault folders the explorer knows (opened here, or\n   * remembered). The listings add the ones the server names\n   * (`e2e_vault`, `e2e_vault_root`); `api` lists an open vault from its index.\n   */\n  vaultRoots?: string[];\n  /** wiring:e2 vault — the vault the items are in; null or absent: outside\n   *  every vault. Inside a vault only that vault is a destination; outside,\n   *  no vault is (docs/E2E-VAULT-FORMAT.md: that is an upload or a download). */\n  vaultFrom?: string | null;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'pick', path: string): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst at = ref<string>(DRIVES);\nconst rows = ref<DestinationRow[]>([]);\nconst loading = ref(false);\n/** The listing of `at` itself — what says whether the CURRENT folder is writable. */\nconst here = ref<ManagerResponse | undefined>(undefined);\nconst failed = ref(false);\n\nconst multiDrive = computed(() => (props.storages?.length ?? 0) > 1);\nconst drivesLabel = computed(() => t('destpicker.drives'));\nconst pickingFile = computed(() => props.pick === 'file');\n/** The file ticked in this folder — file pick only. */\nconst picked = ref<string | null>(null);\n\n/**\n * One listing cache for the life of the dialog.\n *\n * Walking up and back down is the normal way people use a picker, and without\n * this every Up button press costs another round trip to a storage that may be\n * an S3 bucket on another continent.\n */\nlet cache = new Map<string, ManagerResponse>();\n\n/* wiring:e2 vault — vault folders the listings of this dialog named. */\nconst learnedVaults = ref<string[]>([]);\nfunction learnVault(root: string): void {\n  const r = String(root ?? '').replace(/\\/+$/, '');\n  if (r && !learnedVaults.value.includes(r)) learnedVaults.value = [...learnedVaults.value, r];\n}\nfunction vaultOf(p: string): string | null {\n  return vaultOfWire(p, [...(props.vaultRoots ?? []), ...learnedVaults.value]);\n}\n\nwatch(\n  () => props.open,\n  (isOpen) => {\n    if (!isOpen) return;\n    cache = new Map();\n    learnedVaults.value = [];\n    void goTo(initialLocation(props.startAt, props.storages));\n  },\n  { immediate: true },\n);\n\n/* wiring:e2 names — folders inside an encrypted folder are offered under\n * their plaintext names (the explorer's one name view), and the key file and\n * long-name sidecars are never offered at all. */\nconst e2eNameView = inject(E2E_NAME_VIEW, null);\n\nasync function load(path: string): Promise<ManagerResponse | undefined> {\n  const hit = cache.get(path);\n  if (hit) return hit;\n  try {\n    let resp = await props.api.index(path);\n    /* wiring:e2 vault */\n    if (typeof resp.e2e_vault_root === 'string' && resp.e2e_vault_root) learnVault(resp.e2e_vault_root);\n    for (const f of resp.files ?? []) if (f.type === 'dir' && f.e2e_vault) learnVault(f.path);\n    if (e2eNameView) {\n      const root = typeof resp.e2e_root === 'string' && resp.e2e_root ? resp.e2e_root : null;\n      resp = { ...resp, files: await e2eNameView.decorate(resp.files ?? [], { root }) };\n    }\n    cache.set(path, resp);\n    return resp;\n  } catch {\n    // A folder that cannot be listed is a folder that cannot be offered. The\n    // dialog says so in its own body; a listing failure inside a picker is not\n    // an error the host should be made to toast.\n    return undefined;\n  }\n}\n\nasync function goTo(path: string): Promise<void> {\n  at.value = path;\n  failed.value = false;\n  picked.value = null;\n  if (path === DRIVES) {\n    here.value = undefined;\n    rows.value = driveRows(props.storages, props.moving);\n    return;\n  }\n  loading.value = true;\n  const resp = await load(path);\n  // A second navigation may have started while this listing was in flight;\n  // only the newest one gets to write the rows.\n  if (at.value !== path) return;\n  loading.value = false;\n  here.value = resp;\n  failed.value = !resp;\n  /* wiring:e2 vault — inside a vault the items do not come from, a server\n     listing is the vault's layout on the storage (`v/`, packs): no rows. */\n  const inVault = vaultOf(path);\n  const shown = inVault && inVault !== (props.vaultFrom ?? null) ? [] : resp?.files;\n  rows.value = destinationRows(shown, props.moving, { files: pickingFile.value }).map((row): DestinationRow => {\n    /* wiring:e2 vault — a vault reads as one, and the rule closes what it must. */\n    if (row.kind !== 'dir') return row;\n    const isVault = vaultOf(row.path) === row.path.replace(/\\/+$/, '');\n    const dead = !row.blocked && vaultDeadEnd(row.path, props.vaultFrom ?? null, vaultOf);\n    return { ...row, vault: isVault, blocked: dead ? 'vault' : row.blocked };\n  });\n}\n\nconst parent = computed(() => parentOfWire(at.value, multiDrive.value));\nconst crumbs = computed(() =>\n  crumbsOfWire(at.value).map((c) => ({ ...c, label: e2eNameView?.segmentLabel(c.path) ?? c.label })),\n);\n\n/** Why the CURRENT folder cannot be chosen, or null when it can. */\nconst hereBlocked = computed(() => blockedReason(at.value, props.moving));\n/** wiring:e2 vault — why the vault rule refuses the CURRENT folder. A file\n *  pick reads (an app's chooser): it asks the server for the file by its path,\n *  which a vault never answers, so it is refused the same way. */\nconst hereVault = computed(() => {\n  void learnedVaults.value;\n  return vaultBlocked(at.value, props.vaultFrom ?? null, vaultOf);\n});\n\nconst hereWritable = computed(() => {\n  if (at.value === DRIVES) return false;\n  if (!here.value) return false;\n  if (here.value.read_only) return false;\n  return permAllowsWrite(here.value.perm as string | undefined);\n});\n\nconst canChoose = computed(() => {\n  if (props.busy || at.value === DRIVES) return false;\n  if (hereVault.value) return false; /* wiring:e2 vault */\n  if (pickingFile.value) return picked.value !== null;\n  return hereWritable.value && hereBlocked.value === null;\n});\n\n/**\n * Is the line under the list a REFUSAL or a prompt?\n *\n * \"Open a storage to choose a folder inside it\" is not a mistake anybody made —\n * it is the drives level telling you what to do next. Painting it in the danger\n * colour, which is what happened the first time this was drawn, makes the very\n * first screen of the dialog look like something has gone wrong.\n */\nconst reasonIsRefusal = computed(() => at.value !== DRIVES && !(pickingFile.value && !failed.value));\n\n/** The one line under the list that says why Choose is off, if it is. */\nconst reason = computed<string>(() => {\n  if (at.value === DRIVES) return t('destpicker.pick_a_drive');\n  if (pickingFile.value) {\n    if (failed.value) return t('destpicker.unreadable');\n    if (hereVault.value) return t('destpicker.blocked.vault_in'); /* wiring:e2 vault */\n    return picked.value === null ? t('destpicker.pick_a_file') : '';\n  }\n  if (hereBlocked.value === 'self') return t('destpicker.blocked.self');\n  if (hereBlocked.value === 'descendant') return t('destpicker.blocked.descendant');\n  if (hereVault.value === 'into') return t('destpicker.blocked.vault_in'); /* wiring:e2 vault */\n  if (hereVault.value === 'out') return t('destpicker.blocked.vault_out');\n  if (failed.value) return t('destpicker.unreadable');\n  if (here.value && !hereWritable.value) return t('destpicker.readonly_here');\n  return '';\n});\n\nconst dialogTitle = computed(() => {\n  if (props.title) return props.title;\n  if (props.mode === 'move') return t('destpicker.title.move');\n  if (props.mode === 'copy') return t('destpicker.title.copy');\n  if (props.mode === 'save') return t('destpicker.title.save');\n  return pickingFile.value ? t('destpicker.title.choose_file') : t('destpicker.title.choose');\n});\n\nconst confirmLabel = computed(() => {\n  if (props.mode === 'move') return t('destpicker.confirm.move');\n  if (props.mode === 'copy') return t('destpicker.confirm.copy');\n  if (props.mode === 'save') return t('destpicker.confirm.save');\n  return pickingFile.value ? t('destpicker.confirm.choose_file') : t('destpicker.confirm.choose');\n});\n\n/** What the line under the list names: the ticked file, else the folder. */\nconst targetName = computed(() =>\n  pickingFile.value && picked.value !== null\n    ? labelOfWire(picked.value, drivesLabel.value)\n    : labelOfWire(at.value, drivesLabel.value),\n);\n\nfunction rowIcon(row: DestinationRow): string {\n  return row.kind === 'file' ? fileIconTile({ type: 'file', basename: row.label }) : iconTile('folder');\n}\n\nfunction rowTitle(row: DestinationRow): string {\n  if (row.kind === 'file') return row.label;\n  if (row.blocked === 'self') return t('destpicker.blocked.self');\n  if (row.blocked === 'descendant') return t('destpicker.blocked.descendant');\n  if (row.blocked === 'vault') return t(props.vaultFrom ? 'destpicker.blocked.vault_out' : 'destpicker.blocked.vault_in'); /* wiring:e2 vault */\n  if (!row.writable) return t('destpicker.readonly');\n  return row.label;\n}\n\nfunction openRow(row: DestinationRow): void {\n  // A file is the answer, not a place to go.\n  if (row.kind === 'file') {\n    picked.value = row.path;\n    return;\n  }\n  // A blocked row is a dead end — everything under it is blocked too — so\n  // walking into it would be navigation that cannot end anywhere.\n  if (row.blocked) return;\n  void goTo(row.path);\n}\n\nfunction choose(): void {\n  if (!canChoose.value) return;\n  emit('pick', pickingFile.value && picked.value !== null ? picked.value : at.value);\n}\n</script>\n\n<template>\n  <Modal\n    :open=\"open\"\n    :title=\"dialogTitle\"\n    size=\"md\"\n    :locale=\"locale\"\n    :theme=\"theme\"\n    :busy=\"busy\"\n    @close=\"emit('close')\"\n  >\n    <div class=\"fe-destpick\" data-testid=\"destpicker\">\n      <div class=\"fe-destpick__bar\">\n        <button\n          type=\"button\"\n          class=\"fe-destpick__up\"\n          :disabled=\"!parent\"\n          :title=\"t('destpicker.up')\"\n          :aria-label=\"t('destpicker.up')\"\n          data-testid=\"destpicker-up\"\n          @click=\"goTo(parent as string)\"\n        >\n          <svg\n            class=\"fe-ficon\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"2\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n            aria-hidden=\"true\"\n            focusable=\"false\"\n          >\n            <path d=\"M12 19V5M5 12l7-7 7 7\" />\n          </svg>\n        </button>\n        <nav class=\"fe-destpick__crumbs\" :aria-label=\"t('destpicker.crumbs')\">\n          <button\n            v-if=\"multiDrive\"\n            type=\"button\"\n            class=\"fe-destpick__crumb\"\n            :class=\"{ 'is-current': at === DRIVES }\"\n            @click=\"goTo(DRIVES)\"\n          >\n            {{ drivesLabel }}\n          </button>\n          <template v-for=\"c in crumbs\" :key=\"c.path\">\n            <span class=\"fe-destpick__sep\" aria-hidden=\"true\">/</span>\n            <button\n              type=\"button\"\n              class=\"fe-destpick__crumb\"\n              :class=\"{ 'is-current': c.path === at }\"\n              @click=\"goTo(c.path)\"\n            >\n              {{ c.label }}\n            </button>\n          </template>\n          <span v-if=\"!multiDrive && !crumbs.length\" class=\"fe-destpick__crumb is-current\">\n            {{ labelOfWire(at, drivesLabel) }}\n          </span>\n        </nav>\n      </div>\n\n      <ul class=\"fe-destpick__rows\" data-testid=\"destpicker-rows\">\n        <li v-if=\"loading\" class=\"fe-destpick__note\">{{ t('destpicker.loading') }}</li>\n        <li v-else-if=\"failed\" class=\"fe-destpick__note\">{{ t('destpicker.unreadable') }}</li>\n        <li v-else-if=\"!rows.length\" class=\"fe-destpick__note\">\n          {{ pickingFile ? t('destpicker.empty_files') : t('destpicker.empty') }}\n        </li>\n        <li v-for=\"row in rows\" :key=\"row.path\">\n          <button\n            type=\"button\"\n            class=\"fe-destpick__row\"\n            :class=\"{\n              'is-locked': !row.writable,\n              'is-blocked': !!row.blocked,\n              'is-file': row.kind === 'file',\n              'is-picked': row.kind === 'file' && picked === row.path,\n            }\"\n            :disabled=\"!!row.blocked\"\n            :title=\"rowTitle(row)\"\n            :aria-pressed=\"row.kind === 'file' ? picked === row.path : undefined\"\n            :data-testid=\"'destpicker-row-' + row.label\"\n            @click=\"openRow(row)\"\n          >\n            <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons -->\n            <span class=\"fe-destpick__rowicon\" aria-hidden=\"true\" v-html=\"rowIcon(row)\"></span>\n            <span class=\"fe-destpick__rowname\"><bdi>{{ row.label }}</bdi></span>\n            <!-- wiring:e2 vault — a vault is said to be one, open or not. -->\n            <span v-if=\"row.vault\" class=\"fe-destpick__rowtag\" data-testid=\"destpicker-vault-tag\">{{ t('destpicker.tag.vault') }}</span>\n            <span v-if=\"row.blocked\" class=\"fe-destpick__rowtag\">{{ t('destpicker.tag.blocked') }}</span>\n            <span v-else-if=\"!row.writable\" class=\"fe-destpick__rowtag\">{{ t('destpicker.readonly') }}</span>\n            <svg\n              v-if=\"row.kind === 'dir'\"\n              class=\"fe-destpick__rowinto\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              stroke-width=\"2\"\n              stroke-linecap=\"round\"\n              stroke-linejoin=\"round\"\n              aria-hidden=\"true\"\n              focusable=\"false\"\n            >\n              <path d=\"M9 5l7 7-7 7\" />\n            </svg>\n          </button>\n        </li>\n      </ul>\n\n      <p\n        v-if=\"reason\"\n        class=\"fe-destpick__reason\"\n        :class=\"{ 'is-hint': !reasonIsRefusal }\"\n        data-testid=\"destpicker-reason\"\n      >\n        {{ reason }}\n      </p>\n      <p v-else class=\"fe-destpick__target\" data-testid=\"destpicker-target\">\n        {{ t('destpicker.target', { name: targetName }) }}\n      </p>\n    </div>\n\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">\n        {{ t('destpicker.cancel') }}\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :disabled=\"!canChoose\"\n        data-testid=\"destpicker-confirm\"\n        @click=\"choose\"\n      >\n        {{ confirmLabel }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * SurfaceFileChooser — a plugin surface's `file-chooser` node. \"Choose…\"\n * opens the explorer's OWN destination picker (`modals/DestinationPickerModal`,\n * the same dialog Move to… / Copy to… use) in `choose` mode; `kind: \"file\"`\n * asks it to list files and answer with the one ticked. The answer is an\n * adapter-qualified path, which is what goes into `data.values[id]`.\n */\nimport { computed, ref } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../../../types/ExplorerConfig';\nimport type { FileApi } from '../../../composables/useFileApi';\nimport { useLocale } from '../../../composables/useLocale';\nimport { labelOfWire, parentOfWire } from '../../../lib/destinationTree';\nimport DestinationPickerModal from '../../../modals/DestinationPickerModal.vue';\n\nconst props = defineProps<{\n  id: string;\n  kind?: string;\n  modelValue: string;\n  locale: LocaleCode;\n  theme?: ThemeMode;\n  /** Absent: the button is drawn disabled — there is nothing to browse with. */\n  api?: Pick<FileApi, 'index'>;\n  /** Storage names the picker may span. */\n  storages?: string[];\n  /** Where the picker opens — the folder the view was opened in. */\n  startAt?: string;\n  disabled?: boolean;\n  invalid?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'update:modelValue', v: string): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst open = ref(false);\nconst pick = computed<'file' | 'dir'>(() => (props.kind === 'dir' ? 'dir' : 'file'));\nconst shown = computed(() => (props.modelValue ? labelOfWire(props.modelValue, '') || props.modelValue : ''));\n/** Where the picker opens: the chosen entry's folder, else where the view was opened. */\nconst openAt = computed(() => {\n  if (!props.modelValue) return props.startAt;\n  if (pick.value === 'dir') return props.modelValue;\n  return parentOfWire(props.modelValue, false) ?? props.modelValue;\n});\n\nfunction onPick(path: string) {\n  open.value = false;\n  emit('update:modelValue', path);\n}\n</script>\n\n<template>\n  <div class=\"fe-sfile\" :class=\"{ 'is-invalid': invalid }\" data-testid=\"surface-file-chooser\">\n    <span\n      class=\"fe-sfile__value\"\n      :class=\"{ 'fe-sfile__value--empty': !modelValue }\"\n      :title=\"modelValue || undefined\"\n      data-testid=\"surface-file-chooser-value\"\n    >{{ shown || t('plugin.file.none') }}</span>\n    <button\n      type=\"button\"\n      class=\"fe-btn fe-btn--sm\"\n      :disabled=\"disabled || !api\"\n      data-testid=\"surface-file-chooser-open\"\n      @click=\"open = true\"\n    >\n      {{ t('plugin.file.choose') }}\n    </button>\n    <button\n      v-if=\"modelValue\"\n      type=\"button\"\n      class=\"fe-btn fe-btn--sm\"\n      :disabled=\"disabled\"\n      data-testid=\"surface-file-chooser-clear\"\n      @click=\"emit('update:modelValue', '')\"\n    >\n      {{ t('plugin.file.clear') }}\n    </button>\n    <DestinationPickerModal\n      v-if=\"api\"\n      :open=\"open\"\n      :api=\"api\"\n      :locale=\"locale\"\n      mode=\"choose\"\n      :pick=\"pick\"\n      :storages=\"storages\"\n      :start-at=\"openAt\"\n      @close=\"open = false\"\n      @pick=\"onPick\"\n    />\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * SurfacePreview — a plugin surface's `preview` node: the explorer's own\n * look at a storage file. The bytes come through `api.fetchBlob`, the same\n * authenticated preview fetch every rich viewer uses (bearer / CSRF /\n * credentials mode all honoured), so an embed on another origin sees the\n * picture too. Pictures, video and audio are shown as themselves; anything\n * else gets the listing's own type tile and the name.\n *\n * ⚠ No `<img src=\"/api/…\">` for a PATH: a plain URL cannot carry the auth\n * header and resolves against the HOST page's origin in an embed (see\n * useThumbs). A public page's exposed copy (`ref`, M3) is the exception by\n * design: there is no auth header, the PIN cookie rides with the same-origin\n * URL the host's `fileUrl` resolver hands out, and the browser's own\n * viewer draws it (`<img>` for a picture, `<embed>` for a PDF or anything\n * else) — so the page never buffers a document in memory.\n */\nimport { computed, onBeforeUnmount, ref, watch } from 'vue';\nimport type { LocaleCode } from '../../../types/ExplorerConfig';\nimport type { FileApi } from '../../../composables/useFileApi';\nimport type { FileRefResolver } from '../../../types/Plugins';\nimport { useLocale } from '../../../composables/useLocale';\nimport { labelOfWire } from '../../../lib/destinationTree';\nimport { fileIconTile } from '../../../lib/fileIcons';\n\nconst props = defineProps<{\n  /** Adapter-qualified path of a storage file. */\n  path: string;\n  /** A public page's exposed copy (`pub:N`), shown from `fileUrl(ref)`. */\n  fileRef?: string;\n  fileUrl?: FileRefResolver;\n  locale: LocaleCode;\n  /** Absent: the node says the preview is unavailable. */\n  api?: Pick<FileApi, 'fetchBlob'>;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst url = ref<string | null>(null);\nconst mime = ref('');\nconst state = ref<'loading' | 'ok' | 'error'>('loading');\nlet seq = 0;\n\n/** The exposed copy, when the node names one and the host can resolve it. */\nconst exposed = computed(() => (props.fileRef && props.fileUrl ? props.fileUrl(props.fileRef) : null));\n\nconst name = computed(() => exposed.value?.name || labelOfWire(props.path, '') || props.path || props.fileRef || '');\nconst kind = computed<'image' | 'video' | 'audio' | 'other'>(() => {\n  const m = mime.value;\n  if (m.startsWith('image/')) return 'image';\n  if (m.startsWith('video/')) return 'video';\n  if (m.startsWith('audio/')) return 'audio';\n  return 'other';\n});\nconst tile = computed(() => fileIconTile({ type: 'file', basename: name.value }));\n\nfunction release() {\n  // Only a blob URL this node minted is ours to revoke; an exposed copy's\n  // URL is the server's.\n  if (url.value && url.value.startsWith('blob:')) URL.revokeObjectURL(url.value);\n  url.value = null;\n}\n\nasync function load() {\n  const mine = ++seq;\n  release();\n  mime.value = '';\n  if (props.fileRef) {\n    if (!exposed.value) {\n      state.value = 'error';\n      return;\n    }\n    url.value = exposed.value.url;\n    mime.value = exposed.value.mime || '';\n    state.value = 'ok';\n    return;\n  }\n  if (!props.api || !props.path) {\n    state.value = 'error';\n    return;\n  }\n  state.value = 'loading';\n  try {\n    const r = await props.api.fetchBlob(props.path);\n    if (mine !== seq) {\n      URL.revokeObjectURL(r.url);\n      return;\n    }\n    url.value = r.url;\n    mime.value = r.mime || '';\n    state.value = 'ok';\n  } catch {\n    if (mine !== seq) return;\n    state.value = 'error';\n  }\n}\n\nwatch([() => props.path, () => props.fileRef], () => void load(), { immediate: true });\nonBeforeUnmount(() => {\n  seq++;\n  release();\n});\n</script>\n\n<template>\n  <figure class=\"fe-spreview\" data-testid=\"surface-preview\" :data-state=\"state\">\n    <p v-if=\"state === 'loading'\" class=\"fe-surface__text fe-surface__text--muted\">{{ t('plugin.view.loading') }}</p>\n    <p v-else-if=\"state === 'error'\" class=\"fe-surface__text fe-surface__text--muted\">{{ t('plugin.view.preview_failed') }}</p>\n    <template v-else>\n      <img v-if=\"kind === 'image' && url\" class=\"fe-spreview__media\" :src=\"url\" :alt=\"name\" />\n      <video v-else-if=\"kind === 'video' && url\" class=\"fe-spreview__media\" :src=\"url\" controls preload=\"metadata\"></video>\n      <audio v-else-if=\"kind === 'audio' && url\" class=\"fe-spreview__audio\" :src=\"url\" controls preload=\"metadata\"></audio>\n      <embed v-else-if=\"fileRef && url\" class=\"fe-spreview__media fe-spreview__embed\" :src=\"url\" :type=\"mime || undefined\" />\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons -->\n      <span v-else class=\"fe-spreview__tile\" aria-hidden=\"true\" v-html=\"tile\"></span>\n    </template>\n    <figcaption class=\"fe-spreview__name\" :title=\"path\">{{ name }}</figcaption>\n  </figure>\n</template>\n","<script setup lang=\"ts\">\n/**\n * SurfaceSignaturePad — a plugin surface's `signature-pad` node: a\n * signature as a transparent PNG into `data.values[id]` (`{png_b64, mode}`).\n *\n * Three ways in, the node picks which: draw (pointer strokes on a canvas,\n * DPR-aware so a phone's signature is not a blur), type (a name set in one of\n * the five shipped faces, rendered to the same canvas size), upload (a\n * PNG/JPEG of at most 200 KB, fitted into 600×200). Every way ends in the\n * same value; Clear ends in `null`. The ink is black whatever the theme: the\n * picture is bound for a document, not for this screen.\n *\n * ⚠⚠ The typed face is CHOSEN and the choice travels (`value.font`). It\n * used to be one CSS stack of fonts the machine might happen to have, so the\n * same name signed on a Mac, on Windows and on a phone came out in three\n * different hands — and on a machine with none of them, in the browser's\n * generic cursive. The five are shipped with the package (`lib/signFonts`,\n * `styles/sign-fonts.css`) and the same five are offered on a PDF text field,\n * so a document signed here and filled there matches.\n *\n * The rules (modes, sizes, verdicts) are in `lib/signaturePad`; this file\n * is the canvas work.\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport type { LocaleCode } from '../../../types/ExplorerConfig';\nimport { useLocale } from '../../../composables/useLocale';\nimport { SIGN_FONTS, isSignFontKey, signFont, type SignFontKey } from '../../../lib/signFonts';\nimport {\n  SIGNATURE_FONT_DEFAULT,\n  SIGNATURE_INK,\n  SIGNATURE_MAX_HEIGHT,\n  SIGNATURE_MAX_WIDTH,\n  fitFontSize,\n  fitWithin,\n  isSignatureValue,\n  padSize,\n  signatureFontOf,\n  signatureModes,\n  stripDataUrl,\n  uploadVerdict,\n  type SignatureMode,\n  type SignatureValue,\n} from '../../../lib/signaturePad';\n\nconst props = defineProps<{\n  id: string;\n  modes?: unknown;\n  width?: unknown;\n  height?: unknown;\n  modelValue: SignatureValue | null | undefined;\n  locale: LocaleCode;\n  disabled?: boolean;\n  invalid?: boolean;\n  /** The face a typed signature starts in (a `lib/signFonts` key). */\n  font?: unknown;\n  /**\n   * The faces a typed signature may use; one face means no picker at all.\n   * A box whose face the REQUESTER chose passes just that one, so what the\n   * signer sees is what the stamper prints.\n   */\n  fonts?: unknown;\n  /**\n   * The box's name, drawn as a field label — with the same `*` a required\n   * form field carries (v3). ⚠ The owner, 2026-09-21: \"imza zorunluydu ama\n   * imzanın zorunlu olduğunu `*` ile belirtmiyoruz\". The signature was the\n   * one required box on the screen that did not say so, because it was a\n   * plain text line above the pad rather than a label.\n   */\n  label?: string;\n  required?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'update:modelValue', v: SignatureValue | null): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst modes = computed(() => signatureModes(props.modes));\nconst size = computed(() => padSize(props.width, props.height));\nconst mode = ref<SignatureMode>(isSignatureValue(props.modelValue) && modes.value.includes(props.modelValue.mode) ? props.modelValue.mode : modes.value[0]);\n\n/** The faces this pad offers — all five unless the node narrowed them. */\nconst offeredFonts = computed(() => {\n  const want = Array.isArray(props.fonts) ? (props.fonts as unknown[]).filter(isSignFontKey) : [];\n  return want.length ? SIGN_FONTS.filter((f) => want.includes(f.key)) : SIGN_FONTS;\n});\n\nfunction startFont(): SignFontKey {\n  const offered = offeredFonts.value.map((f) => f.key);\n  const fromValue = isSignatureValue(props.modelValue) ? signatureFontOf(props.modelValue) : undefined;\n  if (fromValue && offered.includes(fromValue)) return fromValue;\n  if (isSignFontKey(props.font) && offered.includes(props.font)) return props.font;\n  return offered.includes(SIGNATURE_FONT_DEFAULT) ? SIGNATURE_FONT_DEFAULT : offered[0];\n}\n\nconst canvas = ref<HTMLCanvasElement | null>(null);\nconst typed = ref('');\n/** The face the typed signature is set in — seeded from an arriving value. */\nconst font = ref<SignFontKey>(startFont());\nconst uploadError = ref<'' | 'too_big' | 'bad_type' | 'unreadable'>('');\n/** What the pad currently shows for `type` / `upload` (a data URL). */\nconst preview = ref('');\n\nconst hasValue = computed(() => isSignatureValue(props.modelValue));\n/** The picture the value holds, for the non-draw modes and for a value that arrived with the surface. */\nconst valueUrl = computed(() => (isSignatureValue(props.modelValue) ? `data:image/png;base64,${props.modelValue.png_b64}` : ''));\n\nfunction ctxOf(c: HTMLCanvasElement | null): CanvasRenderingContext2D | null {\n  if (!c) return null;\n  try {\n    return c.getContext('2d');\n  } catch {\n    return null;\n  }\n}\n\nfunction dpr(): number {\n  return typeof window !== 'undefined' && window.devicePixelRatio > 0 ? Math.min(3, window.devicePixelRatio) : 1;\n}\n\n/** The drawing canvas sized for the pad (CSS px × DPR), cleared, ink ready. */\nfunction prepareCanvas(): void {\n  const c = canvas.value;\n  if (!c) return;\n  const k = dpr();\n  c.width = Math.round(size.value.width * k);\n  c.height = Math.round(size.value.height * k);\n  const ctx = ctxOf(c);\n  if (!ctx) return;\n  ctx.setTransform(1, 0, 0, 1, 0, 0);\n  ctx.clearRect(0, 0, c.width, c.height);\n  ctx.scale(k, k);\n  ctx.lineWidth = 2.2;\n  ctx.lineCap = 'round';\n  ctx.lineJoin = 'round';\n  ctx.strokeStyle = SIGNATURE_INK;\n}\n\n/* ── draw ─────────────────────────────────────────────────────────────── */\n\nlet drawing = false;\nlet last: { x: number; y: number } | null = null;\n\nfunction pointOf(ev: PointerEvent): { x: number; y: number } {\n  const c = canvas.value;\n  const r = c?.getBoundingClientRect();\n  if (!c || !r || !r.width) return { x: ev.clientX, y: ev.clientY };\n  // The canvas may be drawn narrower than its logical size on a phone.\n  const kx = size.value.width / r.width;\n  const ky = size.value.height / r.height;\n  return { x: (ev.clientX - r.left) * kx, y: (ev.clientY - r.top) * ky };\n}\n\nfunction onDown(ev: PointerEvent): void {\n  if (props.disabled) return;\n  const ctx = ctxOf(canvas.value);\n  if (!ctx) return;\n  drawing = true;\n  last = pointOf(ev);\n  try {\n    (ev.target as Element).setPointerCapture?.(ev.pointerId);\n  } catch {\n    /* not every runtime has pointer capture */\n  }\n  // A dot: a tap must leave a mark too.\n  ctx.beginPath();\n  ctx.moveTo(last.x, last.y);\n  ctx.lineTo(last.x + 0.1, last.y + 0.1);\n  ctx.stroke();\n  ev.preventDefault?.();\n}\n\nfunction onMove(ev: PointerEvent): void {\n  if (!drawing || !last) return;\n  const ctx = ctxOf(canvas.value);\n  if (!ctx) return;\n  const p = pointOf(ev);\n  ctx.beginPath();\n  ctx.moveTo(last.x, last.y);\n  ctx.lineTo(p.x, p.y);\n  ctx.stroke();\n  last = p;\n  ev.preventDefault?.();\n}\n\nfunction onUp(): void {\n  if (!drawing) return;\n  drawing = false;\n  last = null;\n  exportCanvas(canvas.value, 'draw');\n}\n\nfunction exportCanvas(c: HTMLCanvasElement | null, m: SignatureMode): void {\n  if (!c) return;\n  let url = '';\n  try {\n    url = c.toDataURL('image/png');\n  } catch {\n    url = '';\n  }\n  const b64 = stripDataUrl(url);\n  if (!b64) return;\n  if (m !== 'draw') preview.value = url;\n  // ⚠ The face rides ONLY with a typed signature: on a drawn or uploaded\n  // one it would be a fact about nothing, and a plugin reading `font` would\n  // re-render somebody's handwriting as text.\n  emit('update:modelValue', m === 'type' ? { png_b64: b64, mode: m, font: font.value } : { png_b64: b64, mode: m });\n}\n\n/* ── type ─────────────────────────────────────────────────────────────── */\n\n/**\n * Make sure the chosen face is actually LOADED before the canvas uses it.\n *\n * ⚠⚠ A canvas does not wait. `ctx.font = \"48px Caveat\"` on a face the\n * browser has not fetched yet silently falls back to the generic, the PNG is\n * exported from that, and the signature is wrong in a way nothing on screen\n * shows — the preview repaints correctly a moment later, when the font\n * arrives, while the exported bytes keep the fallback. `document.fonts.load`\n * is the only honest gate; a browser without the Font Loading API just\n * renders as it always did.\n */\nasync function ensureFont(px: number, stack: string): Promise<void> {\n  const fonts = (document as Document & { fonts?: FontFaceSet }).fonts;\n  if (!fonts || typeof fonts.load !== 'function') return;\n  try {\n    await fonts.load(`${px}px ${stack}`, 'Aa');\n  } catch {\n    /* an unknown descriptor is not worth failing a signature over */\n  }\n}\n\nasync function renderTyped(): Promise<void> {\n  const text = typed.value.trim();\n  if (!text) {\n    preview.value = '';\n    emit('update:modelValue', null);\n    return;\n  }\n  const stack = signFont(font.value).stack;\n  await ensureFont(Math.round(size.value.height * 0.6), stack);\n  // The person may have cleared the field while the face was loading.\n  if (typed.value.trim() !== text) return;\n  const c = document.createElement('canvas');\n  const k = 2;\n  const { width, height } = size.value;\n  c.width = width * k;\n  c.height = height * k;\n  const ctx = ctxOf(c);\n  if (!ctx) return;\n  ctx.scale(k, k);\n  ctx.fillStyle = SIGNATURE_INK;\n  ctx.textBaseline = 'middle';\n  const px = fitFontSize(\n    (n) => {\n      ctx.font = `${n}px ${stack}`;\n      return ctx.measureText(text).width;\n    },\n    width - 24,\n    height,\n  );\n  ctx.font = `${px}px ${stack}`;\n  ctx.fillText(text, 12, height / 2);\n  exportCanvas(c, 'type');\n}\n\n/** Another face for the same name: re-render, so the value matches the pick. */\nfunction pickFont(key: SignFontKey): void {\n  if (props.disabled || key === font.value) return;\n  font.value = key;\n  if (typed.value.trim()) void renderTyped();\n}\n\n/* ── upload ───────────────────────────────────────────────────────────── */\n\nconst fileInput = ref<HTMLInputElement | null>(null);\n\nfunction onFile(ev: Event): void {\n  const input = ev.target as HTMLInputElement;\n  const file = input.files?.[0];\n  input.value = '';\n  if (!file) return;\n  const verdict = uploadVerdict(file);\n  if (verdict !== 'ok') {\n    uploadError.value = verdict;\n    return;\n  }\n  uploadError.value = '';\n  const url = URL.createObjectURL(file);\n  const img = new Image();\n  img.onload = () => {\n    URL.revokeObjectURL(url);\n    const fit = fitWithin(img.naturalWidth, img.naturalHeight, SIGNATURE_MAX_WIDTH, SIGNATURE_MAX_HEIGHT);\n    const c = document.createElement('canvas');\n    c.width = fit.width;\n    c.height = fit.height;\n    const ctx = ctxOf(c);\n    if (!ctx) return;\n    ctx.drawImage(img, 0, 0, fit.width, fit.height);\n    exportCanvas(c, 'upload');\n  };\n  img.onerror = () => {\n    URL.revokeObjectURL(url);\n    uploadError.value = 'unreadable';\n  };\n  img.src = url;\n}\n\n/* ── shared ───────────────────────────────────────────────────────────── */\n\nfunction clear(): void {\n  typed.value = '';\n  preview.value = '';\n  uploadError.value = '';\n  prepareCanvas();\n  emit('update:modelValue', null);\n}\n\nfunction pick(m: SignatureMode): void {\n  if (m === mode.value) return;\n  mode.value = m;\n}\n\nwatch(mode, async (m) => {\n  if (m === 'draw') {\n    await nextTick();\n    prepareCanvas();\n  }\n});\n\nwatch(size, () => {\n  if (mode.value === 'draw') prepareCanvas();\n});\n\nonMounted(() => {\n  if (mode.value === 'draw') prepareCanvas();\n});\n\nonBeforeUnmount(() => {\n  drawing = false;\n});\n\nconst uploadErrorText = computed(() => {\n  switch (uploadError.value) {\n    case 'too_big':\n      return t('plugin.sig.upload_too_big', { kb: 200 });\n    case 'bad_type':\n      return t('plugin.sig.upload_bad_type');\n    case 'unreadable':\n      return t('plugin.sig.upload_unreadable');\n    default:\n      return '';\n  }\n});\n</script>\n\n<template>\n  <div\n    class=\"fe-ssig\"\n    data-testid=\"surface-signature\"\n    :class=\"{ 'is-invalid': invalid, 'is-disabled': disabled }\"\n    :data-mode=\"mode\"\n    :role=\"label ? 'group' : undefined\"\n    :aria-labelledby=\"label ? `fe-ssig-${id}-lbl` : undefined\"\n  >\n    <!-- The same label a form field wears, star included. -->\n    <span v-if=\"label\" :id=\"`fe-ssig-${id}-lbl`\" class=\"fe-cfield__label\" data-testid=\"surface-signature-label\">\n      {{ label }}<span v-if=\"required\" class=\"fe-cfield__req\" aria-hidden=\"true\">*</span>\n    </span>\n    <div v-if=\"modes.length > 1\" class=\"fe-ssig__modes\" role=\"tablist\">\n      <button\n        v-for=\"m in modes\"\n        :key=\"m\"\n        type=\"button\"\n        class=\"fe-btn fe-btn--sm\"\n        :class=\"{ 'fe-btn--primary': m === mode }\"\n        role=\"tab\"\n        :aria-selected=\"m === mode ? 'true' : 'false'\"\n        :disabled=\"disabled\"\n        :data-testid=\"`surface-signature-mode-${m}`\"\n        @click=\"pick(m)\"\n      >\n        {{ t(`plugin.sig.mode_${m}`) }}\n      </button>\n    </div>\n\n    <div v-if=\"mode === 'draw'\" class=\"fe-ssig__padwrap\" :style=\"{ maxWidth: `${size.width}px` }\">\n      <canvas\n        ref=\"canvas\"\n        class=\"fe-ssig__canvas\"\n        :style=\"{ aspectRatio: `${size.width} / ${size.height}` }\"\n        :aria-label=\"t('plugin.sig.draw_hint')\"\n        data-testid=\"surface-signature-canvas\"\n        @pointerdown=\"onDown\"\n        @pointermove=\"onMove\"\n        @pointerup=\"onUp\"\n        @pointercancel=\"onUp\"\n        @pointerleave=\"onUp\"\n      ></canvas>\n      <p v-if=\"!hasValue\" class=\"fe-ssig__hint\">{{ t('plugin.sig.draw_hint') }}</p>\n    </div>\n\n    <div v-else-if=\"mode === 'type'\" class=\"fe-ssig__typewrap\">\n      <input\n        :id=\"`fe-ssig-${id}`\"\n        class=\"fe-cfield__input fe-ssig__typed\"\n        type=\"text\"\n        :placeholder=\"t('plugin.sig.type_placeholder')\"\n        :disabled=\"disabled\"\n        :value=\"typed\"\n        autocomplete=\"name\"\n        data-testid=\"surface-signature-typed\"\n        @input=\"typed = ($event.target as HTMLInputElement).value; void renderTyped()\"\n      />\n      <!-- The five faces, each button set in the face it offers: a name of a\n           font tells nobody what their signature will look like. -->\n      <div\n        v-if=\"offeredFonts.length > 1\"\n        class=\"fe-signfonts\"\n        role=\"group\"\n        :aria-label=\"t('plugin.sign.font_label')\"\n        data-testid=\"surface-signature-fonts\"\n      >\n        <button\n          v-for=\"f in offeredFonts\"\n          :key=\"f.key\"\n          type=\"button\"\n          class=\"fe-signfonts__btn\"\n          :class=\"[f.className, { 'is-on': f.key === font }]\"\n          :disabled=\"disabled\"\n          :title=\"f.name\"\n          :aria-pressed=\"f.key === font ? 'true' : 'false'\"\n          :data-testid=\"`surface-signature-font-${f.key}`\"\n          @click=\"pickFont(f.key)\"\n        >\n          {{ typed.trim() || f.name }}\n        </button>\n      </div>\n      <div class=\"fe-ssig__preview\" :style=\"{ maxWidth: `${size.width}px`, aspectRatio: `${size.width} / ${size.height}` }\">\n        <img v-if=\"preview || valueUrl\" class=\"fe-ssig__img\" :src=\"preview || valueUrl\" alt=\"\" />\n      </div>\n    </div>\n\n    <div v-else class=\"fe-ssig__uploadwrap\">\n      <label class=\"fe-btn fe-btn--sm fe-ssig__pick\">\n        <input\n          ref=\"fileInput\"\n          type=\"file\"\n          accept=\"image/png,image/jpeg\"\n          class=\"fe-ssig__file\"\n          :disabled=\"disabled\"\n          data-testid=\"surface-signature-file\"\n          @change=\"onFile\"\n        />\n        {{ t('plugin.sig.upload_pick') }}\n      </label>\n      <p class=\"fe-ssig__hint\">{{ t('plugin.sig.upload_hint', { kb: 200 }) }}</p>\n      <p v-if=\"uploadErrorText\" class=\"fe-surface__error\" role=\"alert\">{{ uploadErrorText }}</p>\n      <div v-if=\"preview || valueUrl\" class=\"fe-ssig__preview\" :style=\"{ maxWidth: `${size.width}px` }\">\n        <img class=\"fe-ssig__img\" :src=\"preview || valueUrl\" alt=\"\" />\n      </div>\n    </div>\n\n    <div class=\"fe-ssig__foot\">\n      <button type=\"button\" class=\"fe-btn fe-btn--sm\" :disabled=\"disabled || !hasValue\" data-testid=\"surface-signature-clear\" @click=\"clear\">\n        {{ t('plugin.sig.clear') }}\n      </button>\n      <span v-if=\"hasValue\" class=\"fe-ssig__signed\">{{ t('plugin.sig.signed') }}</span>\n    </div>\n  </div>\n</template>\n","/**\n * useViewerFetch — tiny wrapper around `fetch` for the rich viewers.\n *\n * The PreviewModal already builds and pushes `authHeaders` + the\n * configured `credentials` mode into every viewer. The viewers need\n * binary access (ArrayBuffer for utif/ag-psd/pdfjs, Blob for EPUB,\n * text for CSV/Mermaid/ipynb), and they all want to honour the same\n * auth strategy.\n *\n * Each helper uses the URL the modal hands down (`previewUrl(path)`)\n * and merges in the same headers + credentials so a CSRF/Bearer host\n * doesn't reject the request when the viewer fetches the file body\n * directly (instead of letting the browser do it via `<img src>` etc).\n */\nimport { requestFailure } from '../lib/errorWords';\n\nexport interface ViewerFetchOptions {\n  url: string;\n  headers?: Record<string, string>;\n  credentials?: RequestCredentials;\n  signal?: AbortSignal;\n}\n\nasync function fetchOk(opts: ViewerFetchOptions): Promise<Response> {\n  const res = await fetch(opts.url, {\n    headers: opts.headers ?? {},\n    credentials: opts.credentials ?? 'same-origin',\n    signal: opts.signal,\n  });\n  if (!res.ok) {\n    // Said, not printed (lib/errorWords): the viewers used to show\n    // \"404 Not Found — {…}\" in the pane. The viewer re-says it in its own\n    // language through `sayFailure(err, …, { t })`.\n    const text = await res.text().catch(() => '');\n    throw requestFailure(res.status, text, undefined);\n  }\n  return res;\n}\n\nexport async function fetchViewerArrayBuffer(\n  opts: ViewerFetchOptions,\n): Promise<ArrayBuffer> {\n  const res = await fetchOk(opts);\n  return res.arrayBuffer();\n}\n\nexport async function fetchViewerBlob(\n  opts: ViewerFetchOptions,\n): Promise<{ blob: Blob; objectUrl: string; mime: string }> {\n  const res = await fetchOk(opts);\n  const blob = await res.blob();\n  const mime = blob.type || res.headers.get('content-type') || '';\n  return { blob, objectUrl: URL.createObjectURL(blob), mime };\n}\n\nexport async function fetchViewerText(\n  opts: ViewerFetchOptions,\n): Promise<string> {\n  const res = await fetchOk(opts);\n  return res.text();\n}\n","/**\n * usePublicBranding — whose product the visitor thinks they are looking at.\n *\n * ⚠⚠ v3 §1.2: whitelabel means whitelabel. A share, a file request and a\n * signature request are the surfaces an OUTSIDER sees, and until now they\n * were the only ones that ignored the instance's own name, logo and colour\n * — so an operator who had renamed filex everywhere still sent out links\n * that said filex. The branding record is the same one the admin\n * \"Corporate identity\" page writes; this composable is how the public shell\n * wears it.\n *\n * ⚠ It is a PUBLIC fetch, and the page must be usable before it lands: the\n * shell paints with the stock palette and re-paints when the answer arrives.\n * Nothing waits on it and a failure is not an error — an older server has no\n * such route, and the product's own name is a perfectly good answer.\n *\n * ⚠ The accent is written as `--fe-*` custom properties on the SHELL's root\n * element, never on `:root`. The same shell is mounted inside other pages\n * (an embed, a test harness), and a public link must not repaint the host\n * around it.\n */\nimport { computed, ref } from 'vue';\nimport type { PublicBranding } from '../types/Public';\nimport { setLocalesFromBranding } from '../lib/uiLocales';\nimport { apiRootOr } from '../lib/appBase';\n\n/** The product's own name, used until (and unless) an operator renames it. */\nexport const DEFAULT_BRAND_NAME = 'filex';\n\nexport interface PublicBrandingOptions {\n  /** API origin; empty = same origin. */\n  base?: string;\n  fetchImpl?: typeof fetch;\n}\n\nconst HEX = /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\n\n/** `#abc` → `#aabbcc`; anything that is not a hex colour → ''. */\nexport function normalizeAccent(raw: string | undefined | null): string {\n  const v = String(raw ?? '').trim();\n  if (!HEX.test(v)) return '';\n  if (v.length === 4) return `#${v[1]}${v[1]}${v[2]}${v[2]}${v[3]}${v[3]}`.toLowerCase();\n  return v.toLowerCase();\n}\n\n/** The same colour, `k` of the way to black (0.85 = the hover state). */\nexport function shade(hex: string, k: number): string {\n  const v = normalizeAccent(hex);\n  if (!v) return '';\n  const n = parseInt(v.slice(1), 16);\n  const part = (shift: number) => Math.max(0, Math.min(255, Math.round(((n >> shift) & 0xff) * k)));\n  const hx = (x: number) => x.toString(16).padStart(2, '0');\n  return `#${hx(part(16))}${hx(part(8))}${hx(part(0))}`;\n}\n\n/**\n * Black or white on this colour, by luminance.\n *\n * ⚠ Not a constant. An operator who picks a pale accent gets white text on\n * pale yellow if the ink is hardcoded — which is what \"unreadable button\"\n * looks like to the person reporting it, and it is only ever seen on\n * somebody else's instance.\n */\nexport function inkOn(hex: string): string {\n  const v = normalizeAccent(hex);\n  if (!v) return '';\n  const n = parseInt(v.slice(1), 16);\n  const lin = (c: number) => {\n    const x = c / 255;\n    return x <= 0.04045 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;\n  };\n  const L = 0.2126 * lin((n >> 16) & 0xff) + 0.7152 * lin((n >> 8) & 0xff) + 0.0722 * lin(n & 0xff);\n  return L > 0.42 ? '#0b0f14' : '#ffffff';\n}\n\n/**\n * The `--fe-*` properties an accent colour becomes on the public shell — the\n * ONE derivation, used by the real page (usePublicBranding) and by the admin\n * page's live preview (PublicLinkPreview), so the preview cannot paint a\n * button the page itself would not. `{}` for no (or no valid) accent.\n */\nexport function accentStyleOf(raw: string | undefined | null): Record<string, string> {\n  const accent = normalizeAccent(raw);\n  if (!accent) return {} as Record<string, string>;\n  const n = parseInt(accent.slice(1), 16);\n  const rgb = `${(n >> 16) & 0xff}, ${(n >> 8) & 0xff}, ${n & 0xff}`;\n  return {\n    '--fe-primary': accent,\n    '--fe-primary-hover': shade(accent, 0.85),\n    '--fe-text-on-primary': inkOn(accent),\n    // ⚠ The TINT and the ink on it, or the accent only half arrives: the\n    // button turned orange while the round badge behind the padlock, the\n    // focus ring on the PIN box and the row hover stayed the stock blue\n    // (measured on the first after-shot of the restored gate). The old\n    // Go-rendered page derived exactly these from the same colour\n    // (`--px-accent-soft: rgba(r,g,b,0.14)`, `color: var(--px-accent)`), and\n    // a translucent tint is right rather than a solid: it composites onto\n    // the card in light and in dark without a second value.\n    '--fe-primary-soft': `rgba(${rgb}, 0.14)`,\n    '--fe-primary-ink': accent,\n  };\n}\n\nexport function usePublicBranding(opts: PublicBrandingOptions = {}) {\n  const branding = ref<PublicBranding | null>(null);\n  const loaded = ref(false);\n\n  const name = computed(() => branding.value?.name?.trim() || DEFAULT_BRAND_NAME);\n  /** True when the operator has named the instance something of their own. */\n  const whitelabel = computed(() => !!branding.value?.name?.trim() && name.value !== DEFAULT_BRAND_NAME);\n  const logo = computed(() => branding.value?.logo_url?.trim() || '');\n  const footerText = computed(() => branding.value?.footer_text?.trim() || '');\n  const hidePoweredBy = computed(() => branding.value?.hide_powered_by === true);\n\n  /**\n   * The instance's light/dark default for a visitor who has chosen nothing.\n   *\n   * ⚠ The server's word is `system`; this package's is `auto`. They mean\n   * the same thing and the translation happens HERE, once, rather than in\n   * every component that compares the string.\n   */\n  const themeDefault = computed<'light' | 'dark' | 'auto'>(() => {\n    const t = branding.value?.theme;\n    return t === 'light' || t === 'dark' ? t : 'auto';\n  });\n\n  /** The languages this instance offers, as the branding answer lists them. */\n  const locales = computed<string[]>(() => branding.value?.locales ?? []);\n\n  /** The accent, as the `--fe-*` properties the shell's root carries. */\n  const accentStyle = computed<Record<string, string>>(() => accentStyleOf(branding.value?.accent));\n\n  /**\n   * Ask the server.\n   *\n   * ⚠ `/api/public/branding` first, `/api/branding` second. The second is\n   * the route this product has served since wiring:e1 and answers a\n   * compatible record; asking only for the new address and giving up on a\n   * 404 would mean a whitelabelled instance goes back to saying \"filex\" the\n   * moment it is updated in the wrong order.\n   *\n   * ⚠ The languages ride along: `locales` / `ui_locales` are on this payload,\n   * so the picker is filled by the fetch the shell already makes\n   * (`lib/uiLocales.setLocalesFromBranding`). Only the language somebody\n   * actually reads has its strings fetched, once.\n   */\n  async function load(): Promise<PublicBranding | null> {\n    const doFetch = opts.fetchImpl ?? (typeof fetch === 'function' ? fetch : null);\n    if (!doFetch) return null;\n    const origin = apiRootOr(opts.base);\n    for (const path of ['/api/public/branding', '/api/branding']) {\n      try {\n        const res = await doFetch(`${origin}${path}`, {\n          method: 'GET',\n          headers: { Accept: 'application/json' },\n          credentials: 'same-origin',\n        });\n        if (!res.ok) continue;\n        branding.value = (await res.json()) as PublicBranding;\n        loaded.value = true;\n        // ⚠ With the same origin and fetch: a language's STRINGS are fetched\n        // later from `/api/public/ui-locales/{code}` on this same server.\n        setLocalesFromBranding(branding.value, { base: opts.base, fetchImpl: opts.fetchImpl });\n        return branding.value;\n      } catch {\n        /* try the next address; the default name is already on screen */\n      }\n    }\n    return null;\n  }\n\n  return { branding, loaded, name, whitelabel, logo, footerText, hidePoweredBy, themeDefault, locales, accentStyle, load };\n}\n","/**\n * pdfjsLoader — the ONE way this package brings pdf.js in.\n *\n * `pdfjs-dist` is ~600 KB and an optional peer, so it is imported lazily and\n * its absence is an answer (`null`), not an exception. The worker script is\n * a separate file the browser fetches: the host may point at its own copy\n * (`pdfWorkerUrl` in the explorer config) and otherwise the pinned version\n * is taken from jsDelivr. `viewers/PdfViewer.vue` and the sign track's\n * `pdf-fields` node both open documents through here, so the legacy build,\n * the worker rule and the fallback cannot drift between them.\n */\n\n/** The subset of the library the callers use; `any` on purpose — pdf.js ships no stable types for the legacy build. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PdfjsLib = any;\n\nlet cached: Promise<PdfjsLib | null> | null = null;\n\n/** The worker URL for a pdf.js version when the host names none. */\nexport function defaultPdfWorkerUrl(version: string): string {\n  return `https://cdn.jsdelivr.net/npm/pdfjs-dist@${version}/legacy/build/pdf.worker.min.mjs`;\n}\n\n/**\n * The library, or `null` when it cannot be loaded (not installed, blocked).\n * The first caller's `workerUrl` wins; pdf.js holds one global worker path.\n */\nexport function loadPdfjs(workerUrl?: string | null): Promise<PdfjsLib | null> {\n  if (!cached) {\n    cached = (async () => {\n      try {\n        // The legacy build: broader browser support and a classic worker\n        // bootstrap (no module-worker requirement).\n        const mod = await import(/* @vite-ignore */ 'pdfjs-dist/legacy/build/pdf');\n        const lib = mod.default ?? mod;\n        if (lib.GlobalWorkerOptions && !lib.GlobalWorkerOptions.workerSrc) {\n          lib.GlobalWorkerOptions.workerSrc = workerUrl || defaultPdfWorkerUrl(lib.version || '5.7.284');\n        }\n        return lib;\n      } catch {\n        return null;\n      }\n    })();\n  }\n  return cached;\n}\n\n/** Tests only: forget the cached import so a mocked module is picked up. */\nexport function resetPdfjsLoader(): void {\n  cached = null;\n}\n","<script setup lang=\"ts\">\n/**\n * PdfFieldEditor — what a box IS, as opposed to where it sits.\n *\n * ⚠⚠ One editor, two screens. The request wizard asks for a box in two\n * steps now — \"define the boxes\" (this, one card per box, no document in\n * sight) and \"place them\" (the document, with these boxes handed out one at\n * a time) — and the one-screen `edit` mode still shows it for whichever box\n * is selected. If the controls were written twice they would drift, and the\n * person would meet two different ideas of what naming a box means.\n *\n * Nothing here knows about pages, rectangles or pointers: placing is the\n * parent's job. That split is the whole point of the component.\n */\nimport { computed } from 'vue';\nimport type { LocaleCode } from '../../../types/ExplorerConfig';\nimport { useLocale } from '../../../composables/useLocale';\nimport { appTextOr, labelOf } from '../../../lib/pluginLabel';\nimport {\n  dateChoices,\n  dateExample,\n  formatFor,\n  isDrawnType,\n  linesOf,\n  normalizeDateLabels,\n  normalizeFormats,\n  normalizeStampLines,\n  splitFormat,\n  stampExample,\n  type PdfField,\n  type PdfSigner,\n  type PdfSignatureStyle,\n} from '../../../lib/pdfFields';\nimport { PDF_RULE_KINDS, type PdfFieldRule, type PdfRuleKind } from '../../../lib/pdfFieldRules';\nimport { SIGN_FONTS, type SignFontKey } from '../../../lib/signFonts';\nimport ChoiceButtons, { type ChoiceOption } from '../../ChoiceButtons.vue';\n\nconst props = defineProps<{\n  field: PdfField;\n  signers: PdfSigner[];\n  /**\n   * The date layouts this surface offers (`[{id, label, example}]`, the\n   * node's own `formats` prop). Empty or absent: no layout control is\n   * drawn at all, because there is nothing to choose between.\n   */\n  formats?: unknown;\n  /**\n   * The date control's three captions as the PLUGIN words them\n   * (`date_labels`): the two questions and the word over the example.\n   * Absent: this package's own catalogue stands in.\n   */\n  dateLabels?: unknown;\n  locale: LocaleCode;\n  disabled?: boolean;\n  /** `surface-pdf` on the one-screen editor; the define cards pass their own. */\n  testidPrefix?: string;\n  /**\n   * The lines a plugin can print under a signature (the node's\n   * `stamp_lines`, `lib/pdfFields.normalizeStampLines`). Absent or empty:\n   * the plugin offers no choice, and no control is drawn.\n   */\n  stampLines?: unknown;\n}>();\n\nconst emit = defineEmits<{\n  /** A changed copy of the field. */\n  (e: 'patch', f: PdfField): void;\n  (e: 'remove'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst prefix = computed(() => props.testidPrefix || 'surface-pdf');\n\nfunction typeLabel(type: PdfField['type']): string {\n  return t(`plugin.pdf.type_${type}`);\n}\n\n/** Change the field through a copy — the parent owns the list. */\nfunction patch(fn: (f: PdfField) => void): void {\n  const next = { ...props.field };\n  fn(next);\n  emit('patch', next);\n}\n\n/**\n * The box's NAME, exactly as it was typed — spaces and all.\n *\n * ⚠⚠ NEVER trim here. `:value` is bound to the field, so a trim on every\n * keystroke writes the trimmed name straight back into the input: the space\n * typed after a word is taken off again before the next letter arrives, and\n * a two-word name becomes impossible to type (the owner, 2026-09-23:\n * \"isimde boşluk bırakamıyorum hiç izin vermiyor\"). A name is free text in\n * any script; the ASCII IDENTITY the PDF names the field by is derived from\n * it by the plugin (`fields.Slug`) and shown to nobody. The record is\n * trimmed once, where the record is written.\n */\nfunction setLabel(v: string): void {\n  patch((f) => {\n    if (v) f.label = v;\n    else delete f.label;\n  });\n}\n\nfunction assign(assignee: string): void {\n  patch((f) => {\n    if (assignee) f.assignee = assignee;\n    else delete f.assignee;\n  });\n}\n\nfunction setRequired(on: boolean): void {\n  patch((f) => {\n    if (on) f.required = true;\n    else delete f.required;\n  });\n}\n\nfunction setRuleKind(kind: string): void {\n  patch((f) => {\n    const k = (PDF_RULE_KINDS as readonly string[]).includes(kind) ? (kind as PdfRuleKind) : 'any';\n    const rule: PdfFieldRule = { ...(f.rule ?? { kind: 'any' }), kind: k };\n    if (k === 'any' && !rule.min && !rule.max) delete f.rule;\n    else f.rule = rule;\n  });\n}\n\nfunction setRuleBound(which: 'min' | 'max', raw: unknown): void {\n  const n = Math.trunc(Number(String(raw ?? '').trim()));\n  patch((f) => {\n    const rule: PdfFieldRule = { ...(f.rule ?? { kind: 'any' }) };\n    if (Number.isFinite(n) && n > 0) rule[which] = n;\n    else delete rule[which];\n    if (rule.kind === 'any' && !rule.min && !rule.max) delete f.rule;\n    else f.rule = rule;\n  });\n}\n\nfunction setFormat(id: string): void {\n  patch((f) => {\n    if (id) f.format = id;\n    else delete f.format;\n  });\n}\n\nfunction setFont(key: SignFontKey): void {\n  patch((f) => {\n    f.font = key;\n  });\n}\n\n/** A signature or initials box: drawn by hand, or a name typed in a face. */\nconst drawn = computed(() => isDrawnType(props.field.type));\n\n/** How this signature box is given. Absent means drawn — what a signature is. */\nconst style = computed<PdfSignatureStyle>(() => props.field.style ?? 'drawn');\n\nfunction setStyle(v: string): void {\n  patch((f) => {\n    if (v === 'typed') f.style = 'typed';\n    else delete f.style;\n  });\n}\n\nconst styleOptions = computed<ChoiceOption[]>(() => [\n  { value: 'drawn', label: t('plugin.pdf.style_drawn') },\n  { value: 'typed', label: t('plugin.pdf.style_typed') },\n]);\n\n/**\n * Is the face a question here at all?\n *\n * ⚠ The owner, 2026-09-21: \"text seçersem font çıkar, text seçmezsem font\n * seçimi çıkmaz\". A drawn signature is somebody's hand; a face offered for it\n * was a control that changed nothing the signer would ever see. Text and\n * date boxes are words, so they always have one; a checkbox never does.\n */\nconst asksFont = computed(() => {\n  if (props.field.type === 'checkbox') return false;\n  if (drawn.value) return style.value === 'typed';\n  return true;\n});\n\n/* ── what is printed under a signature ────────────────────────────── */\n\nconst lineCatalogue = computed(() => normalizeStampLines(props.stampLines));\n/** The ids this box prints, in the catalogue's order (its default set when it has none). */\nconst pickedLines = computed(() => linesOf(props.field, lineCatalogue.value));\nconst lineOptions = computed<ChoiceOption[]>(() =>\n  lineCatalogue.value.map((l) => ({ value: l.id, label: labelOf(l.label, props.locale) || l.id })),\n);\n\nfunction setLines(v: string | string[]): void {\n  const ids = (Array.isArray(v) ? v : [v]).filter(Boolean);\n  patch((f) => {\n    // ⚠ An EMPTY list is kept, and means \"nothing under the signature\". It is\n    // not the same as absent (the plugin's default set), and folding the two\n    // together would put back the very lines the person just took off.\n    f.lines = ids;\n  });\n}\n\n/**\n * The words the plugin will print, one per line, for this box's signer —\n * the plugin's own example for each chosen line, so the card previews its\n * wording rather than this package guessing at it.\n */\nconst linePreview = computed(() =>\n  pickedLines.value\n    .map((id) => lineCatalogue.value.find((l) => l.id === id))\n    .filter((l): l is NonNullable<typeof l> => !!l)\n    .map((l) => labelOf(stampExample(l, props.field.assignee), props.locale) || labelOf(l.label, props.locale)),\n);\n\n/**\n * Who fills this box, or who signs it.\n *\n * ⚠ The owner, 2026-09-21: \"tarih, metin, onay kutusu gibi şeylerde\n * 'imzacı' yazısı yerine 'dolduran' yazısı koyalım\". A date or a tick is\n * FILLED; calling its owner \"the signer\" asked the requester a question\n * about the wrong act.\n */\nconst assigneeLabel = computed(() => t(drawn.value ? 'plugin.pdf.assignee' : 'plugin.pdf.filled_by'));\n\n/**\n * \"Anyone\"'s value on the buttons. ⚠ Not `''`: the choice control reads an\n * empty value as \"nothing picked\", so a box that belonged to anyone showed\n * NO button pressed — measured on the define step, 2026-09-21, three\n * unpressed buttons under every new box of a two-signer request. The\n * sentinel lives only between this control and `assign`; the field still\n * carries no `assignee` at all.\n */\nconst ANYONE = '*';\n\n/** Who the box belongs to, as buttons — \"Anyone\" first. */\nconst assigneeOptions = computed<ChoiceOption[]>(() => [\n  { value: ANYONE, label: t('plugin.pdf.unassigned') },\n  ...props.signers.map((sg) => ({ value: sg.id, label: labelOf(sg.label, props.locale) || sg.id })),\n]);\n\n/** What a text box accepts, as buttons. */\nconst ruleOptions = computed<ChoiceOption[]>(() =>\n  PDF_RULE_KINDS.map((k) => ({ value: k, label: t(`plugin.pdf.rule_kind_${k}`) })),\n);\n\n/**\n * How a date box is written, as buttons — each one with an example under\n * it, because `MM/DD/YYYY` is a puzzle and `12/31/2000` is an answer.\n */\nconst dateFormats = computed(() => normalizeFormats(props.formats));\nconst formatOptions = computed<ChoiceOption[]>(() =>\n  dateFormats.value.map((f) => ({ value: f.id, label: labelOf(f.label, props.locale) || f.id, help: f.example })),\n);\n\n/**\n * Which layout is shown as chosen. A box that has not been given one yet is\n * drawn on the FIRST the surface offers: a catalogue's first entry is what\n * the plugin falls back to, so showing nothing selected would be telling\n * the person their date has no layout when it has one.\n */\nconst pickedFormat = computed(() => props.field.format ?? dateFormats.value[0]?.id ?? '');\n\n/* ── a date's layout: TWO questions ───────────────────────────────────\n *\n * ⚠⚠ The owner, 2026-09-23: \"tarih biçimi ve ayraçlarını ayrı ayrı\n * seçebilir olalım … Tarih biçimi iki farklı seçimle tamamlandığında örnek\n * halini alta gösterelim\". Twenty layouts in one row is a wall to hunt\n * through; the same twenty are five arrangements and four separators, and\n * nobody has to read a pattern to answer either one. The BOX still stores\n * the whole pattern, so a request made before this keeps its layout\n * exactly and no signed document is re-written under anybody.\n */\nconst dateParts = computed(() => dateChoices(dateFormats.value));\nconst dateCaptions = computed(() => normalizeDateLabels(props.dateLabels));\n/* An app may caption these three itself; filex has its own words for all of\n   them. ⚠ `appTextOr`, not `labelOf(…) || t(…)`: the app's caption for THIS\n   reader wins, then filex's own, and the app's other languages last — or a\n   reader in Arabic gets the app's English in the middle of an Arabic screen\n   while the language pack holds the very same caption (v0.43.0). */\nfunction caption(k: 'order' | 'separator' | 'example', fallback: string): string {\n  return appTextOr(dateCaptions.value[k], props.locale, () => t(fallback));\n}\n\nconst pickedPair = computed(() => splitFormat(dateFormats.value, pickedFormat.value));\nconst pickedOrder = computed(() => pickedPair.value?.order ?? dateParts.value?.orders[0]?.id ?? '');\nconst pickedSeparator = computed(() => pickedPair.value?.separator ?? dateParts.value?.separators[0]?.id ?? '');\n\nconst orderOptions = computed<ChoiceOption[]>(() =>\n  (dateParts.value?.orders ?? []).map((o) => ({ value: o.id, label: labelOf(o.label, props.locale) || o.id })),\n);\nconst separatorOptions = computed<ChoiceOption[]>(() =>\n  (dateParts.value?.separators ?? []).map((s) => ({ value: s.id, label: labelOf(s.label, props.locale) || s.id })),\n);\n\n/** Today, written the way the two answers say — the whole point of asking. */\nconst dateShown = computed(() => dateExample(pickedOrder.value, pickedSeparator.value, new Date()));\n\nfunction setOrder(v: string): void {\n  setFormat(formatFor(dateFormats.value, v, pickedSeparator.value));\n}\nfunction setSeparator(v: string): void {\n  setFormat(formatFor(dateFormats.value, pickedOrder.value, v));\n}\n</script>\n\n<template>\n  <div class=\"fe-spdf__props\" :data-testid=\"`${prefix}-editor`\">\n    <span class=\"fe-spdf__propname\">{{ typeLabel(field.type) }}</span>\n\n    <!-- v3 §3.1 — the box's own name. Offered with the type's name already\n         in it, so a page of boxes is never a page of \"Signature\". -->\n    <label class=\"fe-spdf__prop\">\n      <span>{{ t('plugin.pdf.label') }}</span>\n      <input\n        class=\"fe-cfield__input fe-spdf__name\"\n        type=\"text\"\n        :value=\"field.label ?? ''\"\n        :placeholder=\"typeLabel(field.type)\"\n        :disabled=\"disabled\"\n        :data-testid=\"`${prefix}-label`\"\n        @input=\"setLabel(($event.target as HTMLInputElement).value)\"\n      />\n    </label>\n\n    <div v-if=\"signers.length\" class=\"fe-spdf__prop\">\n      <span :id=\"`${prefix}-${field.id}-assignee-lbl`\" :data-testid=\"`${prefix}-assignee-label`\">{{ assigneeLabel }}</span>\n      <ChoiceButtons\n        :options=\"assigneeOptions\"\n        :model-value=\"field.assignee || ANYONE\"\n        :disabled=\"disabled\"\n        :aria-labelledby=\"`${prefix}-${field.id}-assignee-lbl`\"\n        :testid-prefix=\"`${prefix}-assignee`\"\n        @update:model-value=\"(v: string | string[]) => assign(String(v) === ANYONE ? '' : String(v))\"\n      />\n    </div>\n\n    <!-- A signature is drawn, or it is a name typed in a face — the\n         requester decides which, and only the typed one has a face to pick. -->\n    <div v-if=\"drawn\" class=\"fe-spdf__prop\" :data-testid=\"`${prefix}-style`\">\n      <span :id=\"`${prefix}-${field.id}-style-lbl`\">{{ t('plugin.pdf.style') }}</span>\n      <ChoiceButtons\n        :options=\"styleOptions\"\n        :model-value=\"style\"\n        :disabled=\"disabled\"\n        :aria-labelledby=\"`${prefix}-${field.id}-style-lbl`\"\n        :testid-prefix=\"`${prefix}-style`\"\n        @update:model-value=\"(v: string | string[]) => setStyle(String(v))\"\n      />\n    </div>\n\n    <label class=\"fe-spdf__prop fe-spdf__prop--check\">\n      <input\n        type=\"checkbox\"\n        :checked=\"field.required === true\"\n        :disabled=\"disabled\"\n        :data-testid=\"`${prefix}-required`\"\n        @change=\"setRequired(($event.target as HTMLInputElement).checked)\"\n      />\n      <span>{{ t('plugin.pdf.required') }}</span>\n    </label>\n\n    <!-- A text box says what it will take. ⚠ Only `text`: a date field\n         already IS a date, a checkbox is a boolean, and a signature is a\n         picture — a rule on any of them would be a control that does\n         nothing. -->\n    <template v-if=\"field.type === 'text'\">\n      <div class=\"fe-spdf__prop\">\n        <span :id=\"`${prefix}-${field.id}-rule-lbl`\">{{ t('plugin.pdf.rule') }}</span>\n        <ChoiceButtons\n          :options=\"ruleOptions\"\n          :model-value=\"field.rule?.kind ?? 'any'\"\n          :disabled=\"disabled\"\n          :aria-labelledby=\"`${prefix}-${field.id}-rule-lbl`\"\n          :testid-prefix=\"`${prefix}-rule`\"\n          @update:model-value=\"(v: string | string[]) => setRuleKind(String(v))\"\n        />\n      </div>\n      <label class=\"fe-spdf__prop\">\n        <span>{{ t('plugin.pdf.rule_min_label') }}</span>\n        <input\n          class=\"fe-cfield__input fe-spdf__num\"\n          type=\"number\"\n          min=\"0\"\n          :value=\"field.rule?.min ?? ''\"\n          :disabled=\"disabled\"\n          :data-testid=\"`${prefix}-rule-min`\"\n          @input=\"setRuleBound('min', ($event.target as HTMLInputElement).value)\"\n        />\n      </label>\n      <label class=\"fe-spdf__prop\">\n        <span>{{ t('plugin.pdf.rule_max_label') }}</span>\n        <input\n          class=\"fe-cfield__input fe-spdf__num\"\n          type=\"number\"\n          min=\"0\"\n          :value=\"field.rule?.max ?? ''\"\n          :disabled=\"disabled\"\n          :data-testid=\"`${prefix}-rule-max`\"\n          @input=\"setRuleBound('max', ($event.target as HTMLInputElement).value)\"\n        />\n      </label>\n    </template>\n\n    <!-- ⚠ A date box's layout is its `rule`: it is the one thing about the\n         box that is still an open question once it has a name, and leaving\n         it unasked meant the plugin's own default was the only answer\n         anybody could give. Buttons, never a dropdown (v3 §2). -->\n    <template v-if=\"field.type === 'date' && dateParts\">\n      <div class=\"fe-spdf__prop\">\n        <span :id=\"`${prefix}-${field.id}-order-lbl`\">{{ caption('order', 'plugin.pdf.date_order') }}</span>\n        <ChoiceButtons\n          :options=\"orderOptions\"\n          :model-value=\"pickedOrder\"\n          :disabled=\"disabled\"\n          :aria-labelledby=\"`${prefix}-${field.id}-order-lbl`\"\n          :testid-prefix=\"`${prefix}-order`\"\n          @update:model-value=\"(v: string | string[]) => setOrder(String(v))\"\n        />\n      </div>\n      <div class=\"fe-spdf__prop\">\n        <span :id=\"`${prefix}-${field.id}-sep-lbl`\">{{ caption('separator', 'plugin.pdf.date_separator') }}</span>\n        <ChoiceButtons\n          :options=\"separatorOptions\"\n          :model-value=\"pickedSeparator\"\n          :disabled=\"disabled\"\n          :aria-labelledby=\"`${prefix}-${field.id}-sep-lbl`\"\n          :testid-prefix=\"`${prefix}-sep`\"\n          @update:model-value=\"(v: string | string[]) => setSeparator(String(v))\"\n        />\n      </div>\n      <p class=\"fe-spdf__dateex\" :data-testid=\"`${prefix}-date-example`\">\n        <span class=\"fe-spdf__dateex-title\">{{ caption('example', 'plugin.pdf.date_example') }}</span>\n        <bdi class=\"fe-spdf__dateex-value\">{{ dateShown }}</bdi>\n      </p>\n    </template>\n    <div v-else-if=\"field.type === 'date' && formatOptions.length\" class=\"fe-spdf__prop\">\n      <span :id=\"`${prefix}-${field.id}-format-lbl`\">{{ t('plugin.pdf.format') }}</span>\n      <ChoiceButtons\n        :options=\"formatOptions\"\n        :model-value=\"pickedFormat\"\n        :disabled=\"disabled\"\n        :aria-labelledby=\"`${prefix}-${field.id}-format-lbl`\"\n        :testid-prefix=\"`${prefix}-format`\"\n        @update:model-value=\"(v: string | string[]) => setFormat(String(v))\"\n      />\n    </div>\n\n    <!-- The face the stamper draws this field in. Each button is set in the\n         face it offers: a font's NAME tells nobody what it looks like. -->\n    <div\n      v-if=\"asksFont\"\n      class=\"fe-signfonts fe-spdf__prop\"\n      role=\"group\"\n      :aria-label=\"t('plugin.pdf.font')\"\n      :data-testid=\"`${prefix}-fonts`\"\n    >\n      <button\n        v-for=\"f in SIGN_FONTS\"\n        :key=\"f.key\"\n        type=\"button\"\n        class=\"fe-signfonts__btn\"\n        :class=\"[f.className, { 'is-on': (field.font ?? 'caveat') === f.key }]\"\n        :title=\"f.name\"\n        :disabled=\"disabled\"\n        :aria-pressed=\"(field.font ?? 'caveat') === f.key ? 'true' : 'false'\"\n        :data-testid=\"`${prefix}-font-${f.key}`\"\n        @click=\"setFont(f.key)\"\n      >\n        Aa\n      </button>\n    </div>\n\n    <!-- What is printed under the signature: chosen per box, from the\n         lines the plugin can really fill in (its signing record), with the\n         plugin's own wording previewed underneath. ⚠ Nothing typed here\n         reaches the paper — the requester picks WHICH facts, never their\n         values. -->\n    <div v-if=\"drawn && lineOptions.length\" class=\"fe-spdf__prop fe-spdf__lines\" :data-testid=\"`${prefix}-lines`\">\n      <span :id=\"`${prefix}-${field.id}-lines-lbl`\">{{ t('plugin.pdf.lines') }}</span>\n      <ChoiceButtons\n        :options=\"lineOptions\"\n        :model-value=\"pickedLines\"\n        multi\n        :disabled=\"disabled\"\n        :aria-labelledby=\"`${prefix}-${field.id}-lines-lbl`\"\n        :testid-prefix=\"`${prefix}-line`\"\n        @update:model-value=\"setLines\"\n      />\n      <div class=\"fe-spdf__linepreview\" :data-testid=\"`${prefix}-lines-preview`\">\n        <span class=\"fe-spdf__linepreview-title\">{{ t('plugin.pdf.lines_preview') }}</span>\n        <template v-if=\"linePreview.length\">\n          <span v-for=\"(ln, i) in linePreview\" :key=\"i\" class=\"fe-spdf__linepreview-line\">{{ ln }}</span>\n        </template>\n        <span v-else class=\"fe-spdf__linepreview-line is-none\">{{ t('plugin.pdf.lines_none') }}</span>\n      </div>\n    </div>\n\n    <slot name=\"extra\"></slot>\n\n    <button\n      type=\"button\"\n      class=\"fe-btn fe-btn--sm fe-btn--danger\"\n      :disabled=\"disabled\"\n      :data-testid=\"`${prefix}-delete`\"\n      @click=\"emit('remove')\"\n    >\n      {{ t('plugin.pdf.delete') }}\n    </button>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * SurfacePdfFields — a plugin surface's `pdf-fields` node: a PDF drawn by\n * pdf.js with signature / initials / date / text / checkbox boxes on top.\n *\n * Four modes, one drawing.\n *\n * ⚠⚠ `define` and `place` are the author's two JOBS, split (v3 §3.3).\n * Naming a box and finding a place for it were one screen — a palette of\n * types, a rectangle under the pointer, and a strip of properties for\n * whichever box happened to be selected — and the owner's words for it were\n * \"you are still doing both at once\". `define` shows the boxes as cards and\n * no document at all; `place` shows the document and hands out the boxes\n * that still need a place, one tap each. `edit` keeps the one-screen form\n * for a plugin that wants it. All three send the WHOLE `fields[]` back under\n * the node's id; an unplaced box travels as `placed: false`.\n *\n * `fill` is a signer filling their own boxes (the pad opens inline for a signature, text is typed in place\n * under its rule, a checkbox toggles, a date takes today on a tap) and sends\n * `{fields: [{id, value, font?, rule?}]}`; the other signers' boxes are grey\n * outlines carrying that signer's name.\n *\n * ⚠⚠ A `text` field's rule is enforced WHILE the person types, not after\n * they submit: an invalid signature page that only says so on the way out is\n * a page that gets signed twice. `lib/pdfFieldRules` holds the shaping and\n * the verdict; the rule then travels back with the value so the stamping\n * plugin formats what it is handed instead of guessing from the string\n * (`01/02/2026` is a date to a rule and ambiguous text to a parser).\n *\n * ⚠ The FACE travels for the same reason, and it is one of five shipped\n * with the package (`lib/signFonts`) rather than a CSS name the machine might\n * happen to have — the same five the signature pad offers, so a document\n * signed on a phone and filled on a desktop matches.\n *\n * Geometry is fractions of the rendered page (`lib/pdfFieldsGeom`), so the\n * boxes are CSS percentages of the page element and survive every zoom\n * without being recomputed; the canvas underneath is re-rendered lazily\n * per page (IntersectionObserver) at the device's pixel ratio. The rules —\n * who may touch what, what goes on the wire — are `lib/pdfFields`.\n *\n * Bytes: `src.path` through the explorer's authenticated preview fetch\n * (like SurfacePreview), `src.ref` through the host's `fileUrl` resolver\n * (a public page's exposed copy), `src.url` as given. A document that will\n * not load is an error node, never a blank.\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../../../types/ExplorerConfig';\nimport type { FileApi } from '../../../composables/useFileApi';\nimport type { FileRefResolver, PdfFieldsSource } from '../../../types/Plugins';\nimport { useLocale } from '../../../composables/useLocale';\nimport { fetchViewerArrayBuffer } from '../../../composables/useViewerFetch';\nimport { labelOf } from '../../../lib/pluginLabel';\nimport { inkOn } from '../../../composables/usePublicBranding';\nimport { loadPdfjs } from '../../../lib/pdfjsLoader';\nimport { actionIconSvg } from '../../../lib/actionIcons';\nimport {\n  DEFAULT_FIELD_SIZE,\n  allowedTypes,\n  applyFillValues,\n  copyToPage,\n  fillValues,\n  hasValue,\n  isFieldOf,\n  defineField,\n  isPlaced,\n  normalizeFields,\n  normalizeSigners,\n  placeField,\n  unplacedFields,\n  signerColor,\n  todayIso,\n  withFont,\n  withValue,\n  type PdfField,\n  type PdfFieldType,\n} from '../../../lib/pdfFields';\nimport {\n  PDF_RULE_KINDS,\n  applyRule,\n  ruleError,\n  ruleInputMode,\n  ruleMaxLength,\n  type PdfFieldRule,\n  type PdfRuleKind,\n} from '../../../lib/pdfFieldRules';\nimport { SIGN_FONTS, signFont, type SignFontKey } from '../../../lib/signFonts';\nimport { clampFrac, fitPageWidth, pointToFrac, rectFromPoints, type PageBox } from '../../../lib/pdfFieldsGeom';\nimport type { SignatureValue } from '../../../lib/signaturePad';\nimport PdfFieldEditor from './PdfFieldEditor.vue';\nimport SurfaceSignaturePad from './SurfaceSignaturePad.vue';\nimport ChoiceButtons, { type ChoiceOption } from '../../ChoiceButtons.vue';\n\nconst props = defineProps<{\n  id: string;\n  src?: PdfFieldsSource;\n  mode?: string;\n  fields?: unknown;\n  signers?: unknown;\n  signer?: string;\n  types?: unknown;\n  /** `define` / `edit`: the date layouts a `date` box may be written in. */\n  formats?: unknown;\n  /** The date control's three captions, as the plugin words them (`date_labels`). */\n  dateLabels?: unknown;\n  /** Edit: the `fields[]` the host holds; fill: `{fields: [{id, value}]}`. */\n  modelValue?: unknown;\n  locale: LocaleCode;\n  theme?: ThemeMode;\n  disabled?: boolean;\n  invalid?: boolean;\n  api?: Pick<FileApi, 'fetchBlob'>;\n  fileUrl?: FileRefResolver;\n  pdfWorkerUrl?: string | null;\n  /**\n   * v3 §3.2 — `page`: this node owns the screen, so the document is fitted\n   * to the BOX rather than to the text column, and the person never scrolls\n   * in two directions to reach a signature box. The zoom controls stay:\n   * fitting is the starting point, not a cage.\n   */\n  layout?: 'inline' | 'page';\n  /** The height a `page` layout may fill (a CSS length). Default: the frame's. */\n  pageHeight?: string;\n  /**\n   * The lines the plugin can print under a signature, offered per signature\n   * box on the author's screens (`lib/pdfFields.PdfStampLine`).\n   */\n  stampLines?: unknown;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'update:modelValue', v: unknown): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/** Every author mode; `fill` is the signer's. */\nconst editing = computed(() => props.mode !== 'fill');\n/** The boxes as cards, with no document on screen. */\nconst defining = computed(() => props.mode === 'define');\n/** The document, with the defined boxes waiting to be put on it. */\nconst placingStep = computed(() => props.mode === 'place');\nconst signers = computed(() => normalizeSigners(props.signers));\nconst palette = computed(() => allowedTypes(props.types));\n\n/* ── the fields ───────────────────────────────────────────────────────── */\n\nconst local = ref<PdfField[]>([]);\nlet lastEmitted: unknown = undefined;\n\nfunction seed(): void {\n  if (editing.value) {\n    local.value = Array.isArray(props.modelValue) ? normalizeFields(props.modelValue) : normalizeFields(props.fields);\n  } else {\n    local.value = applyFillValues(normalizeFields(props.fields), props.modelValue);\n  }\n}\n\nfunction publish(): void {\n  const v = editing.value ? local.value.map((f) => ({ ...f })) : fillValues(local.value, props.signer);\n  lastEmitted = v;\n  emit('update:modelValue', v);\n}\n\n/**\n * A seed that arrives WHILE a box is being dragged waits for the drag to end.\n *\n * ⚠⚠ Every `change` answer re-sends the surface, so `fields` arrives as a new\n * array (and, for an echo the person has already overtaken, with the box\n * where it was BEFORE the gesture in progress). Seeding then replaced the\n * list under the pointer: the dragged box snapped back for a frame and was\n * pulled forward again on the next move — part of the flicker the owner saw\n * while placing and moving boxes (2026-09-21, item 6). The drag's own\n * `publish()` at the end carries the newer list anyway, so the deferred seed\n * is usually dropped rather than run.\n */\nlet seedLater = false;\nfunction reseed(): void {\n  if (drag) {\n    seedLater = true;\n    return;\n  }\n  seed();\n}\n\nseed();\nwatch([() => props.fields, () => props.mode, () => props.signer], () => reseed());\nwatch(\n  () => props.modelValue,\n  (v) => {\n    if (v !== lastEmitted) reseed();\n  },\n);\n\nconst byPage = computed(() => {\n  const m = new Map<number, PdfField[]>();\n  for (const f of local.value) {\n    // A defined box that nobody has placed is not anywhere yet.\n    if (!isPlaced(f)) continue;\n    const arr = m.get(f.page) ?? [];\n    arr.push(f);\n    m.set(f.page, arr);\n  }\n  return m;\n});\n\nfunction fieldColor(f: PdfField): string {\n  return signerColor(signers.value, f.assignee);\n}\n\n/**\n * A box card's colours: its signer's, and the ink that reads on THAT colour.\n *\n * ⚠ Not `--fe-text-on-primary`. A signer's colour is an identity colour, the\n * same in every theme, so the ink on it must be the colour's own — the theme\n * token is dark in dark mode and measured 3.5:1 on the first signer's blue\n * (#57). A colour that is not hex (a plugin may name its own) keeps the token.\n */\nfunction cardStyle(f: PdfField): Record<string, string> {\n  const color = fieldColor(f);\n  const ink = inkOn(color);\n  return ink ? { '--spdf-color': color, '--spdf-ink': ink } : { '--spdf-color': color };\n}\n\nfunction signerLabel(assignee: string | undefined): string {\n  const s = signers.value.find((x) => x.id === assignee);\n  return s ? labelOf(s.label, props.locale) || s.id : assignee || '';\n}\n\nfunction mine(f: PdfField): boolean {\n  return !editing.value && isFieldOf(f, props.signer);\n}\n\nfunction typeLabel(type: PdfFieldType): string {\n  return t(`plugin.pdf.type_${type}`);\n}\n\n/**\n * What this field is CALLED — its own name, or the type's as a stand-in.\n *\n * ⚠ v3 §3.1. Three signature boxes on one page were three identical grey\n * rectangles saying \"Signature\"; a signer could only tell them apart by\n * where they were. The name is shown in the box, in the pad's heading and\n * on the text box's own label, so the same word identifies the field\n * wherever the person meets it.\n */\nfunction fieldLabel(f: PdfField): string {\n  const own = (f.label ?? '').trim();\n  if (own) return own;\n  // An unnamed box is its kind's name, NUMBERED among the unnamed boxes of\n  // that kind when there are several — the same rule the signing app uses\n  // on its own screens (views.NameIn), so \"Signature 2\" on the document is\n  // \"Signature 2\" in the form that asks for it.\n  const same = local.value.filter((g) => g.type === f.type && !(g.label ?? '').trim());\n  if (same.length < 2) return typeLabel(f.type);\n  return `${typeLabel(f.type)} ${same.findIndex((g) => g.id === f.id) + 1}`;\n}\n\n/* ── the document ─────────────────────────────────────────────────────── */\n\nconst status = ref<'loading' | 'ok' | 'error'>('loading');\nconst pages = ref<Array<PageBox & { num: number }>>([]);\nconst zoom = ref(1);\nconst containerEl = ref<HTMLDivElement | null>(null);\nconst containerW = ref(640);\nconst containerH = ref(0);\n\n/** This node has the screen to itself. */\nconst pageLayout = computed(() => props.layout === 'page');\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet pdfDoc: any = null;\nlet seq = 0;\nlet observer: IntersectionObserver | null = null;\nlet resizeObs: ResizeObserver | null = null;\nconst pageEls = new Map<number, HTMLDivElement>();\nconst rendered = new Map<number, number>();\nconst canvases = new Map<number, HTMLCanvasElement>();\n\n/**\n * The width a page is drawn at before zoom.\n *\n * ⚠⚠ In `page` layout it is whichever of the two constraints binds: the\n * column's width, or the width at which the WHOLE page still fits the\n * height. Fitting to width alone is what produced the complaint that\n * started this — a portrait page in a landscape window is taller than the\n * screen, so signing meant scrolling down to find the box and sideways to\n * read the line it sits on. A margin is taken off the height so the page\n * does not touch the toolbar above it.\n */\nconst fitWidth = computed(() => {\n  if (!pageLayout.value) return containerW.value;\n  const first = pages.value[0];\n  if (!first) return containerW.value;\n  return fitPageWidth({ width: containerW.value, height: containerH.value }, first);\n});\n\n/** The page's drawn width in CSS px: the fitted width, times the zoom. */\nconst pageWidth = computed(() => Math.max(120, Math.round(fitWidth.value * zoom.value)));\n\nasync function bytes(): Promise<ArrayBuffer> {\n  const s = props.src ?? {};\n  if (s.path) {\n    if (!props.api) throw new Error('no api');\n    const r = await props.api.fetchBlob(s.path);\n    URL.revokeObjectURL(r.url);\n    return r.blob.arrayBuffer();\n  }\n  const url = s.url || (s.ref ? props.fileUrl?.(s.ref)?.url : '');\n  if (!url) throw new Error('no source');\n  return fetchViewerArrayBuffer({ url, headers: {}, credentials: 'same-origin' });\n}\n\nasync function load(): Promise<void> {\n  const run = ++seq;\n  status.value = 'loading';\n  pages.value = [];\n  disconnect();\n  try {\n    pdfDoc?.destroy?.();\n  } catch {\n    /* ignore */\n  }\n  pdfDoc = null;\n  try {\n    const lib = await loadPdfjs(props.pdfWorkerUrl ?? undefined);\n    if (!lib) throw new Error('pdfjs unavailable');\n    const data = await bytes();\n    if (run !== seq) return;\n    const doc = await lib.getDocument({ data }).promise;\n    if (run !== seq) {\n      doc.destroy?.();\n      return;\n    }\n    pdfDoc = doc;\n    const list: Array<PageBox & { num: number }> = [];\n    for (let n = 1; n <= doc.numPages; n++) {\n      const page = await doc.getPage(n);\n      const vp = page.getViewport({ scale: 1 });\n      list.push({ num: n, width: vp.width, height: vp.height, rotation: vp.rotation ?? 0 });\n    }\n    if (run !== seq) return;\n    pages.value = list;\n    status.value = 'ok';\n    await nextTick();\n    observe();\n  } catch {\n    if (run !== seq) return;\n    status.value = 'error';\n  }\n}\n\nfunction disconnect(): void {\n  observer?.disconnect();\n  observer = null;\n  pageEls.clear();\n  rendered.clear();\n  canvases.clear();\n}\n\n/**\n * A page element arrived (or was replaced): remember it, and have it drawn.\n *\n * ⚠⚠ Observed HERE, not only in `observe()` after a load. The same node\n * lives through the wizard's `define` step, where no page is drawn at all,\n * and its document finishes loading there — `observe()` then finds no page\n * to watch, and when `place` draws the pages a moment later nothing ever\n * renders them. Measured 2026-09-21: the observer was made at t=2.7 s, the\n * page element arrived at t=3.7 s, and the place step showed a blank page.\n * (It had been hidden by the reload-on-every-surface bug this round fixed:\n * the reload happened to observe the pages the second time.)\n */\nfunction setPageEl(num: number, el: unknown): void {\n  if (!(el instanceof HTMLDivElement)) return;\n  const before = pageEls.get(num);\n  if (before === el) return;\n  if (before) observer?.unobserve(before);\n  pageEls.set(num, el);\n  if (!pdfDoc) return;\n  if (observer) observer.observe(el);\n  else if (typeof IntersectionObserver === 'undefined') void renderPage(num);\n  // A replaced element holds no canvas: draw it again at the current width.\n  if (before) {\n    rendered.delete(num);\n    canvases.delete(num);\n  }\n}\n\nfunction observe(): void {\n  if (typeof IntersectionObserver === 'undefined') {\n    for (const n of pageEls.keys()) void renderPage(n);\n    return;\n  }\n  observer = new IntersectionObserver(\n    (entries) => {\n      for (const e of entries) {\n        const n = Number((e.target as HTMLElement).dataset.page);\n        if (e.isIntersecting) void renderPage(n);\n      }\n    },\n    { rootMargin: '200px 0px' },\n  );\n  for (const el of pageEls.values()) observer.observe(el);\n}\n\n/**\n * Draws page `num` at the current width × DPR, once per width.\n *\n * ⚠⚠ Into a FRESH canvas, swapped in only once pdf.js has finished. Writing\n * `canvas.width` on the canvas already on screen clears it on the spot, and\n * the page stayed white until the asynchronous render came back — every\n * zoom, every re-fit (a strip appearing above the document is enough to\n * re-fit a `page` layout) blinked the whole document. The old bitmap now\n * stays up, stretched by CSS to the new size, until its replacement is\n * ready.\n */\nasync function renderPage(num: number): Promise<void> {\n  if (!pdfDoc) return;\n  const el = pageEls.get(num);\n  if (!el) return;\n  const wantW = pageWidth.value;\n  if (rendered.get(num) === wantW) return;\n  rendered.set(num, wantW);\n  const meta = pages.value.find((p) => p.num === num);\n  if (!meta) return;\n  const k = typeof window !== 'undefined' && window.devicePixelRatio > 0 ? Math.min(3, window.devicePixelRatio) : 1;\n  const scale = (wantW / meta.width) * k;\n  const doc = pdfDoc;\n  try {\n    const page = await doc.getPage(num);\n    const viewport = page.getViewport({ scale });\n    const fresh = document.createElement('canvas');\n    fresh.className = 'fe-spdf__canvas';\n    fresh.width = Math.round(viewport.width);\n    fresh.height = Math.round(viewport.height);\n    const ctx = fresh.getContext('2d');\n    if (!ctx) return;\n    await page.render({ canvasContext: ctx, viewport }).promise;\n    // A newer width (or another document) overtook this render: its own\n    // render will swap in, and this bitmap is already stale.\n    if (doc !== pdfDoc || rendered.get(num) !== wantW) return;\n    const live = pageEls.get(num);\n    if (!live) return;\n    const old = canvases.get(num);\n    if (old && old.parentNode === live) live.replaceChild(fresh, old);\n    else live.prepend(fresh);\n    canvases.set(num, fresh);\n  } catch {\n    if (rendered.get(num) === wantW) rendered.delete(num);\n  }\n}\n\nfunction rerenderVisible(): void {\n  for (const n of pageEls.keys()) {\n    if (rendered.has(n)) {\n      rendered.delete(n);\n      void renderPage(n);\n    }\n  }\n}\n\nwatch(pageWidth, () => rerenderVisible());\n\nfunction zoomIn(): void {\n  zoom.value = Math.min(3, Math.round(zoom.value * 1.25 * 100) / 100);\n}\nfunction zoomOut(): void {\n  zoom.value = Math.max(0.5, Math.round((zoom.value / 1.25) * 100) / 100);\n}\nfunction zoomFit(): void {\n  zoom.value = 1;\n}\n\n/**\n * Measure the pane the document is drawn into, and keep measuring it.\n *\n * ⚠⚠ Called on mount AND whenever the pane appears, because it does not\n * always exist when this component mounts: the wizard draws the same node in\n * `define` first (cards, no document) and the pane arrives only on the next\n * step. Measured once at mount, `containerEl` was null, no observer was\n * attached, and the width kept its 640px default — so the \"fit the page to\n * the window\" rule was computed against a box that had nothing to do with\n * the window, and an A4 page ran off the bottom of the screen.\n */\nfunction measurePane(): void {\n  const el = containerEl.value;\n  if (!el) return;\n  containerW.value = el.clientWidth || containerW.value;\n  containerH.value = el.clientHeight || containerH.value;\n  if (typeof ResizeObserver === 'undefined') return;\n  resizeObs?.disconnect();\n  resizeObs = new ResizeObserver(() => applyPaneSize());\n  resizeObs.observe(el);\n}\n\n/**\n * Take the pane's current size — unless a box is being dragged.\n *\n * ⚠⚠ A re-fit DURING a drag changes the page's size under the pointer: the\n * fractions the drag is computing are then fractions of a different page,\n * and the box slides away from the finger. Measured 2026-09-21: selecting\n * the box on pointer-down brought a strip in above the document, the pane\n * lost 34px of height, and the fitted page shrank from 383px to 349px wide\n * mid-gesture. The size is taken again the moment the drag ends.\n */\nfunction applyPaneSize(): void {\n  if (drag) {\n    sizeLater = true;\n    return;\n  }\n  const w = containerEl.value?.clientWidth ?? 0;\n  const h = containerEl.value?.clientHeight ?? 0;\n  if (w > 0 && Math.abs(w - containerW.value) > 2) containerW.value = w;\n  // ⚠ The height matters: in `page` layout it is half of what decides the\n  // drawn width, so a window resized shorter must re-fit rather than keep\n  // a page that no longer fits it.\n  if (h > 0 && Math.abs(h - containerH.value) > 2) containerH.value = h;\n}\nlet sizeLater = false;\n\nwatch(containerEl, () => {\n  void nextTick(measurePane);\n});\n\nonMounted(() => {\n  measurePane();\n  void load();\n});\n\n/**\n * Which document this is, as a VALUE.\n *\n * ⚠⚠ Not the `src` object. Every `change` answer re-sends the surface, so\n * this node is handed a NEW `src` object carrying the same three strings,\n * and the deep watcher that stood here fired on every such arrival and\n * reloaded the document from scratch. Measured 2026-09-21 (the owner's\n * \"the screen flickers while I place and drag boxes\"): each placement's\n * debounced `change` answer tore the page down — \"Loading…\", every canvas\n * thrown away, redrawn — and a drag that was in progress when it landed kept\n * a DETACHED page element, whose zero-size rectangle made every later\n * pointer position read as the bottom-right corner: \"sometimes the box goes\n * to the edge of the document\". Only a different document reloads now.\n */\nconst srcKey = computed(() => {\n  const s = props.src ?? {};\n  return [s.ref ?? '', s.path ?? '', s.url ?? ''].join('\\u0000');\n});\nwatch(srcKey, () => void load());\n\nonBeforeUnmount(() => {\n  seq++;\n  disconnect();\n  resizeObs?.disconnect();\n  try {\n    pdfDoc?.destroy?.();\n  } catch {\n    /* ignore */\n  }\n  pdfDoc = null;\n});\n\n/* ── edit mode: place, move, resize ───────────────────────────────────── */\n\nconst selected = ref('');\nconst placing = ref<PdfFieldType | ''>('');\n\ninterface Drag {\n  kind: 'place' | 'move' | 'resize';\n  page: number;\n  el: HTMLElement;\n  start: { x: number; y: number };\n  id?: string;\n  orig?: PdfField;\n  /** The box being drawn, while placing. */\n  ghost?: { x: number; y: number; w: number; h: number };\n}\nlet drag: Drag | null = null;\nconst ghost = ref<{ page: number; x: number; y: number; w: number; h: number } | null>(null);\n\nfunction fracAt(ev: PointerEvent, el: HTMLElement): { x: number; y: number } {\n  const r = el.getBoundingClientRect();\n  return pointToFrac({ x: ev.clientX - r.left, y: ev.clientY - r.top }, { width: r.width, height: r.height });\n}\n\n/**\n * The rectangle of the page a drag is on, read FRESH, or null when there is\n * no page to read it from.\n *\n * ⚠⚠ The element captured at pointer-down is only a fallback. If the page\n * list is re-rendered mid-gesture the captured element is detached, and a\n * detached element measures 0×0 — `pointToFrac` then turns ANY pointer into\n * the corner (it clamps `x / 1` to 1), which is exactly how a dragged box\n * ended up pinned to the document's edge. A rectangle that is not a real\n * page is refused, and the box simply stays where it was for that frame.\n */\nfunction dragRect(d: { page: number; el: HTMLElement }): DOMRect | null {\n  const live = pageEls.get(d.page);\n  const el = live && live.isConnected ? live : d.el;\n  if (!el || !el.isConnected) return null;\n  const r = el.getBoundingClientRect();\n  return r.width >= 1 && r.height >= 1 ? r : null;\n}\n\nfunction fracIn(ev: PointerEvent, r: DOMRect): { x: number; y: number } {\n  return pointToFrac({ x: ev.clientX - r.left, y: ev.clientY - r.top }, { width: r.width, height: r.height });\n}\n\nfunction pickType(type: PdfFieldType): void {\n  placing.value = placing.value === type ? '' : type;\n  selected.value = '';\n}\n\n/* ── define: the boxes, as cards ──────────────────────────────────────── */\n\n/**\n * Add a box of this type. It has an owner; it has no place — and no name\n * until somebody types one.\n *\n * ⚠ Not pre-filled with the type's name any more. That default was written\n * into the request in the REQUESTER's language, so a Turkish signer of an\n * English requester's document was asked for \"Signature\", \"Date\" and \"Text\"\n * (2026-09-21). An unnamed box is shown under its kind's name — here as the\n * input's placeholder, and on every other screen in that reader's language.\n */\nfunction addField(type: PdfFieldType): void {\n  const f = defineField(local.value, type, {\n    assignee: defaultAssignee(),\n    required: true,\n  });\n  local.value = [...local.value, f];\n  publish();\n}\n\n/** One card changed. */\nfunction patchField(next: PdfField): void {\n  local.value = local.value.map((f) => (f.id === next.id ? next : f));\n  publish();\n}\n\nfunction removeField(id: string): void {\n  local.value = local.value.filter((f) => f.id !== id);\n  if (selected.value === id) selected.value = '';\n  publish();\n}\n\n/* ── place: hand the defined boxes out, one at a time ─────────────────── */\n\n/** The boxes still waiting for a place, in the order they were defined. */\nconst pending = computed(() => unplacedFields(local.value));\n/** Which of them the next tap on the page will put down. */\nconst placingId = ref('');\n\nfunction pickPending(id: string): void {\n  placingId.value = placingId.value === id ? '' : id;\n  selected.value = '';\n}\n\n/** Put the chosen box on this page, at this rectangle. */\nfunction placePending(page: number, rect: { x: number; y: number; w: number; h: number }): void {\n  const id = placingId.value;\n  if (!id) return;\n  local.value = local.value.map((f) => {\n    if (f.id !== id) return f;\n    const next: PdfField = { ...f, page, ...clampFrac(rect) };\n    delete next.placed;\n    return next;\n  });\n  placingId.value = '';\n  selected.value = id;\n  publish();\n}\n\n/** Take a box off the page again: it goes back to the waiting list. */\nfunction unplace(): void {\n  const id = selected.value;\n  if (!id) return;\n  local.value = local.value.map((f) => (f.id === id ? { ...f, placed: false } : f));\n  selected.value = '';\n  publish();\n}\n\n/** The name a waiting box is offered under, with whose it is. */\nfunction pendingLabel(f: PdfField): string {\n  const who = signerLabel(f.assignee);\n  const name = fieldLabel(f);\n  return who ? `${name} · ${who}` : name;\n}\n\nfunction onPageDown(ev: PointerEvent, num: number): void {\n  if (!editing.value || props.disabled) return;\n  const el = ev.currentTarget as HTMLElement;\n  if (placingStep.value && placingId.value) {\n    drag = { kind: 'place', page: num, el, start: fracAt(ev, el) };\n    ghost.value = null;\n    bindWindow();\n    ev.preventDefault?.();\n    return;\n  }\n  if (placing.value) {\n    drag = { kind: 'place', page: num, el, start: fracAt(ev, el) };\n    ghost.value = null;\n    bindWindow();\n    ev.preventDefault?.();\n    return;\n  }\n  selected.value = '';\n}\n\nfunction onFieldDown(ev: PointerEvent, f: PdfField, num: number): void {\n  if (!editing.value || props.disabled) return;\n  const el = (ev.currentTarget as HTMLElement).closest('.fe-spdf__page') as HTMLElement | null;\n  if (!el) return;\n  selected.value = f.id;\n  placing.value = '';\n  drag = { kind: 'move', page: num, el, start: fracAt(ev, el), id: f.id, orig: { ...f } };\n  bindWindow();\n  ev.stopPropagation();\n  ev.preventDefault?.();\n}\n\nfunction onHandleDown(ev: PointerEvent, f: PdfField, num: number): void {\n  if (!editing.value || props.disabled) return;\n  const el = (ev.currentTarget as HTMLElement).closest('.fe-spdf__page') as HTMLElement | null;\n  if (!el) return;\n  selected.value = f.id;\n  drag = { kind: 'resize', page: num, el, start: fracAt(ev, el), id: f.id, orig: { ...f } };\n  bindWindow();\n  ev.stopPropagation();\n  ev.preventDefault?.();\n}\n\nfunction onWindowMove(ev: PointerEvent): void {\n  if (!drag) return;\n  const r = dragRect(drag);\n  if (!r) return;\n  const p = fracIn(ev, r);\n  if (drag.kind === 'place') {\n    const r = rectFromPoints(drag.start, p);\n    ghost.value = { page: drag.page, ...r };\n    return;\n  }\n  if (!drag.id || !drag.orig) return;\n  const dx = p.x - drag.start.x;\n  const dy = p.y - drag.start.y;\n  const o = drag.orig;\n  const next = drag.kind === 'move' ? clampFrac({ x: o.x + dx, y: o.y + dy, w: o.w, h: o.h }) : clampFrac({ x: o.x, y: o.y, w: o.w + dx, h: o.h + dy });\n  const id = drag.id;\n  local.value = local.value.map((f) => (f.id === id ? { ...f, ...next } : f));\n}\n\nfunction onWindowUp(ev: PointerEvent): void {\n  if (!drag) return;\n  const d = drag;\n  drag = null;\n  unbindWindow();\n  const r = dragRect(d);\n  // The pane may have changed size while the gesture held it still.\n  if (sizeLater) {\n    sizeLater = false;\n    applyPaneSize();\n  }\n  // A seed that waited for the gesture is overtaken by what the gesture\n  // publishes below; one that nothing will overtake runs now.\n  const publishes = d.kind === 'place' || d.kind === 'move' || d.kind === 'resize';\n  if (seedLater) {\n    seedLater = false;\n    if (!publishes) seed();\n  }\n  if (!r) {\n    // No page to measure against (it was re-drawn under the gesture): keep\n    // what the last good frame put down rather than inventing a place.\n    ghost.value = null;\n    if (d.kind === 'move' || d.kind === 'resize') publish();\n    return;\n  }\n  if (d.kind === 'place' && placingStep.value && placingId.value) {\n    const p = fracIn(ev, r);\n    const box = local.value.find((f) => f.id === placingId.value);\n    const dragged = Math.abs(p.x - d.start.x) > 0.01 || Math.abs(p.y - d.start.y) > 0.01;\n    // ⚠ A tap is enough. The box already knows how big it wants to be (it\n    // was defined with a size), so placing is one gesture, not a drawing\n    // exercise; a drag is still honoured for somebody who wants a different\n    // size straight away.\n    const rect = dragged\n      ? rectFromPoints(d.start, p)\n      : { x: p.x - (box?.w ?? 0.2) / 2, y: p.y - (box?.h ?? 0.05) / 2, w: box?.w ?? 0.2, h: box?.h ?? 0.05 };\n    placePending(d.page, rect);\n    ghost.value = null;\n    return;\n  }\n  if (d.kind === 'place' && placing.value) {\n    const p = fracIn(ev, r);\n    const dragged = Math.abs(p.x - d.start.x) > 0.01 || Math.abs(p.y - d.start.y) > 0.01;\n    const type = placing.value;\n    const f = dragged\n      ? placeField(local.value, type, d.page, rectFromPoints(d.start, p), rectFromPoints(d.start, p), defaultAssignee())\n      : placeField(local.value, type, d.page, { x: p.x - DEFAULT_FIELD_SIZE[type].w / 2, y: p.y - DEFAULT_FIELD_SIZE[type].h / 2 }, undefined, defaultAssignee());\n    // Born with a name (the type's) rather than nameless: the placer\n    // renames it if they want to, and a field nobody renamed still reads as\n    // something in the signer's form.\n    local.value = [...local.value, { ...f, label: typeLabel(type) }];\n    selected.value = f.id;\n    ghost.value = null;\n    publish();\n    return;\n  }\n  ghost.value = null;\n  if (d.kind === 'move' || d.kind === 'resize') {\n    // A tap on a placed box selects it and moves nothing: no round trip for\n    // a list that did not change.\n    const now = local.value.find((f) => f.id === d.id);\n    const o = d.orig;\n    if (!now || !o || now.x !== o.x || now.y !== o.y || now.w !== o.w || now.h !== o.h) publish();\n  }\n}\n\nfunction defaultAssignee(): string | undefined {\n  return signers.value.length === 1 ? signers.value[0].id : undefined;\n}\n\n/**\n * Reactive twin of `drag` for the template: the one-screen editor waits for\n * the gesture to end before it appears, so selecting a box by dragging it\n * does not push the document down under the pointer mid-drag.\n */\nconst dragging = ref(false);\n\nfunction bindWindow(): void {\n  dragging.value = true;\n  window.addEventListener('pointermove', onWindowMove);\n  window.addEventListener('pointerup', onWindowUp);\n  window.addEventListener('pointercancel', onWindowUp);\n}\nfunction unbindWindow(): void {\n  dragging.value = false;\n  window.removeEventListener('pointermove', onWindowMove);\n  window.removeEventListener('pointerup', onWindowUp);\n  window.removeEventListener('pointercancel', onWindowUp);\n}\n\nconst selectedField = computed(() => local.value.find((f) => f.id === selected.value) ?? null);\n\nconst copyTarget = ref(1);\nfunction copy(): void {\n  if (!selectedField.value) return;\n  const before = local.value.length;\n  local.value = copyToPage(local.value, selected.value, copyTarget.value);\n  if (local.value.length === before) return;\n  // The copy is the box you are now working on, and it is on another page —\n  // which in a tall document is usually off the screen. Select it and go\n  // there, or the button answers by appearing to do nothing.\n  selected.value = local.value[local.value.length - 1].id;\n  publish();\n}\n\n/**\n * Bring the selected box into view inside the document pane.\n *\n * ⚠ The pane scrolls, the page does not: `.fe-spdf__scroll` is the window\n * on to a column of pages, so \"scroll to the box\" is arithmetic on ITS\n * scrollTop, not `el.scrollIntoView()` (which would also scroll the app\n * frame, whose whole point in this layout is that it does not move).\n * Nothing happens mid-gesture: a drag selects the box it picks up, and a\n * pane that scrolled under the pointer would take the box with it.\n */\nfunction revealSelected(): void {\n  const pane = containerEl.value;\n  const f = selectedField.value;\n  if (!pane || !f || drag || !isPlaced(f)) return;\n  const pageEl = pageEls.get(f.page);\n  if (!pageEl) return;\n  const page = pageEl.getBoundingClientRect();\n  const view = pane.getBoundingClientRect();\n  if (!page.height || !view.height) return;\n  const top = page.top - view.top + pane.scrollTop + f.y * page.height;\n  const bottom = top + f.h * page.height;\n  const pad = 24;\n  if (top < pane.scrollTop + pad) pane.scrollTop = Math.max(0, top - pad);\n  else if (bottom > pane.scrollTop + pane.clientHeight - pad) pane.scrollTop = bottom - pane.clientHeight + pad;\n}\nwatch(selected, () => void nextTick(revealSelected));\n\n/* ── fill mode ────────────────────────────────────────────────────────── */\n\n/** The field whose signature pad is open. */\nconst padFor = ref('');\n\nfunction setValue(id: string, value: unknown): void {\n  local.value = withValue(local.value, id, value);\n  publish();\n}\n\nfunction onFieldTap(f: PdfField): void {\n  if (editing.value || props.disabled || !mine(f)) return;\n  switch (f.type) {\n    case 'signature':\n    case 'initials':\n      padFor.value = padFor.value === f.id ? '' : f.id;\n      break;\n    case 'checkbox':\n      setValue(f.id, f.value === true ? false : true);\n      break;\n    case 'date':\n      setValue(f.id, hasValue(f) ? '' : todayIso());\n      break;\n    default:\n      break;\n  }\n}\n\nfunction onTextInput(f: PdfField, ev: Event): void {\n  const el = ev.target as HTMLInputElement;\n  // ⚠ Shaped as it is typed (digits only, the GG/AA/YYYY mask, …) and the\n  // INPUT is written back, because a value the box refused has to leave the\n  // box too — otherwise the person sees what they typed and the document\n  // gets something else.\n  const shaped = applyRule(el.value, ruleOf(f));\n  if (shaped !== el.value) el.value = shaped;\n  setValue(f.id, shaped);\n}\n\nconst padField = computed(() => local.value.find((f) => f.id === padFor.value) ?? null);\n\n/**\n * What the pad offers for this box: the requester chose drawn or typed, so\n * the signer gets exactly that — a drawn box draws (or takes a picture of a\n * signature), a typed one types, in the face that was chosen for it.\n */\nconst padModes = computed(() => (padField.value?.style === 'typed' ? ['type'] : ['draw', 'upload']));\nconst padFonts = computed(() =>\n  padField.value?.style === 'typed' && padField.value.font ? [padField.value.font] : undefined,\n);\nconst padValue = computed<SignatureValue | null>(() => {\n  const v = padField.value?.value;\n  return typeof v === 'string' && v ? { png_b64: v, mode: 'draw' } : null;\n});\n\nfunction onPadValue(v: SignatureValue | null): void {\n  if (!padField.value) return;\n  setValue(padField.value.id, v?.png_b64 ?? '');\n}\n\nfunction sigSrc(f: PdfField): string {\n  return typeof f.value === 'string' && f.value ? `data:image/png;base64,${f.value}` : '';\n}\n\n/* ── rules and faces ─────────────────────────────────────── */\n\n/** A field's rule, or `null` — only `text` carries one. */\nfunction ruleOf(f: PdfField): PdfFieldRule | null {\n  return f.type === 'text' ? (f.rule ?? null) : null;\n}\n\n/** The words under a text box: what it will accept. `''` when anything goes. */\nfunction ruleHint(f: PdfField): string {\n  const r = ruleOf(f);\n  if (!r) return '';\n  const parts: string[] = [];\n  if (r.kind === 'number') parts.push(t('plugin.pdf.rule_number'));\n  else if (r.kind === 'email') parts.push(t('plugin.pdf.rule_email'));\n  if (r.min && r.max) parts.push(t('plugin.pdf.rule_length', { min: r.min, max: r.max }));\n  else if (r.min) parts.push(t('plugin.pdf.rule_min', { min: r.min }));\n  else if (r.max) parts.push(t('plugin.pdf.rule_max', { max: r.max }));\n  return parts.join(' · ');\n}\n\n/** What is wrong with what is in the box right now. `''` when nothing is. */\nfunction ruleMessage(f: PdfField): string {\n  const r = ruleOf(f);\n  const code = ruleError(f.value, r);\n  if (!code || !r) return '';\n  if (code === 'min') return t('plugin.pdf.err_min', { min: r.min ?? 0 });\n  if (code === 'max') return t('plugin.pdf.err_max', { max: r.max ?? 0 });\n  return t(`plugin.pdf.err_${code}`);\n}\n\n/** The face a field's words are drawn in — the field's, else the default. */\nfunction fontClassOf(f: PdfField): string {\n  return signFont(f.font).className;\n}\n\nconst checkIcon = actionIconSvg('check');\n</script>\n\n<template>\n  <div\n    class=\"fe-spdf\"\n    data-testid=\"surface-pdf-fields\"\n    :class=\"{\n      'is-edit': editing,\n      'is-fill': !editing,\n      'is-invalid': invalid,\n      'is-disabled': disabled,\n      'is-placing': !!placing || !!placingId,\n      'is-define': defining,\n      'fe-spdf--page': pageLayout && !defining,\n    }\"\n    :style=\"pageLayout ? { '--spdf-h': pageHeight || '100%' } : undefined\"\n    :data-state=\"status\"\n    :data-layout=\"pageLayout ? 'page' : 'inline'\"\n  >\n    <div v-if=\"!defining\" class=\"fe-spdf__bar\">\n      <!-- ⚠ In `place` the toolbar is not a palette of TYPES but the boxes\n           that were defined a step earlier and still have nowhere to go.\n           Choosing one and tapping the page is the whole gesture. -->\n      <div v-if=\"placingStep\" class=\"fe-spdf__palette\" role=\"toolbar\" :aria-label=\"t('plugin.pdf.pending')\">\n        <button\n          v-for=\"f in pending\"\n          :key=\"f.id\"\n          type=\"button\"\n          class=\"fe-btn fe-btn--sm\"\n          :class=\"{ 'fe-btn--primary': placingId === f.id }\"\n          :style=\"{ '--spdf-color': fieldColor(f) }\"\n          :disabled=\"disabled || status !== 'ok'\"\n          :aria-pressed=\"placingId === f.id ? 'true' : 'false'\"\n          :data-testid=\"`surface-pdf-pending-${f.id}`\"\n          @click=\"pickPending(f.id)\"\n        >\n          {{ pendingLabel(f) }}\n        </button>\n        <span v-if=\"!pending.length\" class=\"fe-spdf__done\" data-testid=\"surface-pdf-all-placed\">\n          {{ t('plugin.pdf.all_placed') }}\n        </span>\n      </div>\n      <div v-else-if=\"editing\" class=\"fe-spdf__palette\" role=\"toolbar\" :aria-label=\"t('plugin.pdf.palette')\">\n        <button\n          v-for=\"ty in palette\"\n          :key=\"ty\"\n          type=\"button\"\n          class=\"fe-btn fe-btn--sm\"\n          :class=\"{ 'fe-btn--primary': placing === ty }\"\n          :disabled=\"disabled || status !== 'ok'\"\n          :aria-pressed=\"placing === ty ? 'true' : 'false'\"\n          :data-testid=\"`surface-pdf-type-${ty}`\"\n          @click=\"pickType(ty)\"\n        >\n          {{ typeLabel(ty) }}\n        </button>\n      </div>\n      <div class=\"fe-spdf__zoom\">\n        <button type=\"button\" class=\"fe-btn fe-btn--sm\" :aria-label=\"t('plugin.pdf.zoom_out')\" :disabled=\"status !== 'ok'\" @click=\"zoomOut\">−</button>\n        <button type=\"button\" class=\"fe-btn fe-btn--sm fe-spdf__zoomval\" :aria-label=\"t(pageLayout ? 'plugin.pdf.zoom_fit_page' : 'plugin.pdf.zoom_fit')\" :disabled=\"status !== 'ok'\" @click=\"zoomFit\">\n          {{ Math.round(zoom * 100) }}%\n        </button>\n        <button type=\"button\" class=\"fe-btn fe-btn--sm\" :aria-label=\"t('plugin.pdf.zoom_in')\" :disabled=\"status !== 'ok'\" @click=\"zoomIn\">+</button>\n      </div>\n    </div>\n    <p v-if=\"editing && !defining && !placingStep && placing\" class=\"fe-surface__text fe-surface__text--info fe-spdf__hint\">{{ t('plugin.pdf.place_hint', { type: typeLabel(placing) }) }}</p>\n\n    <!-- ⚠⚠ DEFINE: the boxes as cards, and no document anywhere on the\n         screen. This step answers \"what is being asked of whom\"; where each\n         box goes is the next one's question. -->\n    <div v-if=\"defining\" class=\"fe-spdf__define\" data-testid=\"surface-pdf-define\">\n      <div v-if=\"!local.length\" class=\"fe-spdf__empty\" data-testid=\"surface-pdf-no-boxes\">\n        {{ t('plugin.pdf.no_boxes') }}\n      </div>\n      <div\n        v-for=\"(f, i) in local\"\n        :key=\"f.id\"\n        class=\"fe-spdf__card\"\n        :style=\"cardStyle(f)\"\n        :data-testid=\"`surface-pdf-card-${f.id}`\"\n      >\n        <span class=\"fe-spdf__cardno\" aria-hidden=\"true\">{{ i + 1 }}</span>\n        <PdfFieldEditor\n          :field=\"f\"\n          :signers=\"signers\"\n          :formats=\"formats\"\n          :date-labels=\"dateLabels\"\n          :stamp-lines=\"stampLines\"\n          :locale=\"locale\"\n          :disabled=\"disabled\"\n          :testid-prefix=\"`surface-pdf-card-${f.id}`\"\n          @patch=\"patchField\"\n          @remove=\"removeField(f.id)\"\n        />\n      </div>\n      <div class=\"fe-spdf__add\" role=\"toolbar\" :aria-label=\"t('plugin.pdf.add_box')\">\n        <span class=\"fe-spdf__addlbl\">{{ t('plugin.pdf.add_box') }}</span>\n        <button\n          v-for=\"ty in palette\"\n          :key=\"ty\"\n          type=\"button\"\n          class=\"fe-btn fe-btn--sm\"\n          :disabled=\"disabled\"\n          :data-testid=\"`surface-pdf-add-${ty}`\"\n          @click=\"addField(ty)\"\n        >\n          + {{ typeLabel(ty) }}\n        </button>\n      </div>\n    </div>\n\n    <!-- ⚠⚠ PLACE asks WHERE, and only where. The box was named a step ago;\n         putting the naming controls back on this screen would be \"both at\n         once\" again, which is the thing this split exists to end. What a\n         selected box offers here is about its PLACE: take it off, put a\n         copy on another page, or drop it. -->\n    <!-- ⚠⚠ ONE strip of constant height in `place`, whatever it is saying.\n         It used to be three things that came and went — a hint while a box\n         was chosen, a property strip once one was selected, nothing in\n         between — and each arrival took height from the document pane. In\n         a `page` layout the page is fitted to that pane, so every tap\n         re-fitted (and redrew) the whole document: measured 2026-09-21, the\n         page shrank from 383px to 349px wide the moment the first box was\n         selected, in the middle of the gesture that selected it. -->\n    <div v-else-if=\"placingStep\" class=\"fe-spdf__strip\" data-testid=\"surface-pdf-strip\">\n      <div v-if=\"selectedField\" class=\"fe-spdf__props\" data-testid=\"surface-pdf-selected\">\n        <span class=\"fe-spdf__propname\" :style=\"{ '--spdf-color': fieldColor(selectedField) }\">\n          {{ fieldLabel(selectedField) }}\n        </span>\n        <span v-if=\"signerLabel(selectedField.assignee)\" class=\"fe-spdf__propwho\">\n          {{ signerLabel(selectedField.assignee) }}\n        </span>\n        <button type=\"button\" class=\"fe-btn fe-btn--sm\" data-testid=\"surface-pdf-unplace\" @click=\"unplace\">\n          {{ t('plugin.pdf.unplace') }}\n        </button>\n        <!-- ⚠ A number, not a list. The rule is \"no dropdown in a surface\",\n             and a 200-page contract would answer it with 200 buttons — the\n             same complaint (a control you have to hunt through) wearing the\n             fix's clothes. -->\n        <label v-if=\"pages.length > 1\" class=\"fe-spdf__prop\">\n          <span>{{ t('plugin.pdf.copy_to_page') }}</span>\n          <input\n            v-model.number=\"copyTarget\"\n            class=\"fe-cfield__input fe-spdf__num\"\n            type=\"number\"\n            min=\"1\"\n            :max=\"pages.length\"\n            data-testid=\"surface-pdf-copy-page\"\n          />\n          <button type=\"button\" class=\"fe-btn fe-btn--sm\" data-testid=\"surface-pdf-copy\" @click=\"copy\">{{ t('plugin.pdf.copy') }}</button>\n        </label>\n        <button\n          type=\"button\"\n          class=\"fe-btn fe-btn--sm fe-btn--danger\"\n          data-testid=\"surface-pdf-delete\"\n          @click=\"removeField(selectedField.id)\"\n        >\n          {{ t('plugin.pdf.delete') }}\n        </button>\n      </div>\n      <p\n        v-else-if=\"placingId\"\n        class=\"fe-surface__text fe-surface__text--info fe-spdf__hint\"\n        data-testid=\"surface-pdf-place-hint\"\n      >\n        {{ t('plugin.pdf.place_box_hint', { name: pendingLabel(local.find((f) => f.id === placingId) ?? local[0]) }) }}\n      </p>\n      <p v-else class=\"fe-surface__text fe-surface__text--muted fe-spdf__hint\" data-testid=\"surface-pdf-idle-hint\">\n        {{ t(pending.length ? 'plugin.pdf.place_idle' : 'plugin.pdf.place_idle_done') }}\n      </p>\n    </div>\n\n    <!-- The one-screen `edit` mode keeps the whole editor for whichever box\n         is selected: a plugin that asks for both jobs at once gets both.\n         ⚠ Not while a box is being dragged: the editor arriving above the\n         document on pointer-down pushed the page down under the pointer. -->\n    <div v-else-if=\"editing && selectedField && !dragging\" data-testid=\"surface-pdf-selected\">\n      <PdfFieldEditor\n        :field=\"selectedField\"\n        :signers=\"signers\"\n        :formats=\"formats\"\n        :date-labels=\"dateLabels\"\n        :stamp-lines=\"stampLines\"\n        :locale=\"locale\"\n        :disabled=\"disabled\"\n        testid-prefix=\"surface-pdf\"\n        @patch=\"patchField\"\n        @remove=\"removeField(selectedField.id)\"\n      >\n        <template #extra>\n          <label v-if=\"pages.length > 1\" class=\"fe-spdf__prop\">\n            <span>{{ t('plugin.pdf.copy_to_page') }}</span>\n            <input\n              v-model.number=\"copyTarget\"\n              class=\"fe-cfield__input fe-spdf__num\"\n              type=\"number\"\n              min=\"1\"\n              :max=\"pages.length\"\n              data-testid=\"surface-pdf-copy-page\"\n            />\n            <button type=\"button\" class=\"fe-btn fe-btn--sm\" data-testid=\"surface-pdf-copy\" @click=\"copy\">{{ t('plugin.pdf.copy') }}</button>\n          </label>\n        </template>\n      </PdfFieldEditor>\n    </div>\n\n    <div v-if=\"!defining\" ref=\"containerEl\" class=\"fe-spdf__scroll\">\n      <p v-if=\"status === 'loading'\" class=\"fe-surface__text fe-surface__text--muted\">{{ t('plugin.view.loading') }}</p>\n      <p v-else-if=\"status === 'error'\" class=\"fe-surface__unknown\" role=\"alert\" data-testid=\"surface-pdf-error\">{{ t('plugin.pdf.load_failed') }}</p>\n      <div v-else class=\"fe-spdf__pages\">\n        <div\n          v-for=\"p in pages\"\n          :key=\"p.num\"\n          :ref=\"(el) => setPageEl(p.num, el)\"\n          class=\"fe-spdf__page\"\n          :data-page=\"p.num\"\n          :style=\"{ width: `${pageWidth}px`, aspectRatio: `${p.width} / ${p.height}` }\"\n          @pointerdown=\"onPageDown($event, p.num)\"\n        >\n          <div\n            v-for=\"f in byPage.get(p.num) ?? []\"\n            :key=\"f.id\"\n            class=\"fe-spdf__field\"\n            :class=\"[\n              `fe-spdf__field--${f.type}`,\n              {\n                'is-selected': editing && selected === f.id,\n                'is-mine': mine(f),\n                'is-foreign': !editing && !mine(f),\n                'is-filled': hasValue(f),\n                'is-required': f.required === true,\n              },\n            ]\"\n            :style=\"{ left: `${f.x * 100}%`, top: `${f.y * 100}%`, width: `${f.w * 100}%`, height: `${f.h * 100}%`, '--spdf-color': fieldColor(f) }\"\n            :data-testid=\"`surface-pdf-field-${f.id}`\"\n            :data-field-type=\"f.type\"\n            :role=\"mine(f) ? 'button' : undefined\"\n            :tabindex=\"mine(f) ? 0 : undefined\"\n            :title=\"editing || !mine(f) ? signerLabel(f.assignee) : undefined\"\n            @pointerdown=\"onFieldDown($event, f, p.num)\"\n            @click=\"onFieldTap(f)\"\n            @keydown.enter.prevent=\"onFieldTap(f)\"\n          >\n            <img v-if=\"(f.type === 'signature' || f.type === 'initials') && sigSrc(f)\" class=\"fe-spdf__sig\" :src=\"sigSrc(f)\" alt=\"\" />\n            <input\n              v-else-if=\"f.type === 'text' && mine(f)\"\n              class=\"fe-spdf__text\"\n              :class=\"fontClassOf(f)\"\n              type=\"text\"\n              :value=\"typeof f.value === 'string' ? f.value : ''\"\n              :placeholder=\"fieldLabel(f)\"\n              :aria-label=\"fieldLabel(f)\"\n              :inputmode=\"ruleInputMode(ruleOf(f))\"\n              :maxlength=\"ruleMaxLength(ruleOf(f))\"\n              :aria-invalid=\"ruleMessage(f) ? 'true' : undefined\"\n              :aria-describedby=\"ruleHint(f) ? `${id}-${f.id}-rule` : undefined\"\n              :title=\"ruleHint(f) || undefined\"\n              :disabled=\"disabled\"\n              :data-testid=\"`surface-pdf-text-${f.id}`\"\n              @pointerdown.stop\n              @click.stop\n              @input=\"onTextInput(f, $event)\"\n            />\n            <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n            <span v-else-if=\"f.type === 'checkbox' && f.value === true\" class=\"fe-spdf__check\" aria-hidden=\"true\" v-html=\"checkIcon\"></span>\n            <span\n              v-else-if=\"f.type === 'date' && typeof f.value === 'string' && f.value\"\n              class=\"fe-spdf__val\"\n              :class=\"fontClassOf(f)\"\n            >{{ f.value }}</span>\n<!-- ⚠ The NAME, then what to do about it. A box called \"Yetkili\n                 imzası\" says more than a third grey rectangle reading\n                 \"Signature\", and the person filling it is looking for the\n                 name they were told, not for a type. -->\n            <span v-else class=\"fe-spdf__label\">\n              {{ fieldLabel(f) }}\n              <small v-if=\"mine(f)\" class=\"fe-spdf__who\">{{ t(`plugin.pdf.tap_${f.type}`) }}</small>\n              <small v-else-if=\"f.assignee && (editing || !mine(f))\" class=\"fe-spdf__who\">{{ signerLabel(f.assignee) }}</small>\n            </span>\n            <!-- ⚠ The rule's words sit OUTSIDE the box, not inside it: a\n                 field is a few millimetres of a page, and a hint drawn in it\n                 would cover the value it is about. -->\n            <span\n              v-if=\"!editing && mine(f) && f.type === 'text' && (ruleMessage(f) || ruleHint(f))\"\n              :id=\"`${id}-${f.id}-rule`\"\n              class=\"fe-spdf__rule\"\n              :class=\"{ 'is-bad': !!ruleMessage(f) }\"\n              :role=\"ruleMessage(f) ? 'alert' : undefined\"\n              :data-testid=\"`surface-pdf-rule-${f.id}`\"\n            >{{ ruleMessage(f) || ruleHint(f) }}</span>\n            <span v-if=\"editing\" class=\"fe-spdf__handle\" data-testid=\"surface-pdf-handle\" @pointerdown=\"onHandleDown($event, f, p.num)\"></span>\n          </div>\n          <div\n            v-if=\"ghost && ghost.page === p.num\"\n            class=\"fe-spdf__field fe-spdf__field--ghost\"\n            :style=\"{ left: `${ghost.x * 100}%`, top: `${ghost.y * 100}%`, width: `${ghost.w * 100}%`, height: `${ghost.h * 100}%` }\"\n          ></div>\n        </div>\n      </div>\n    </div>\n\n    <div v-if=\"!editing && padField\" class=\"fe-spdf__pad\" data-testid=\"surface-pdf-pad\">\n      <p class=\"fe-surface__text fe-surface__text--muted\">{{ t('plugin.pdf.pad_for', { type: fieldLabel(padField) }) }}</p>\n      <SurfaceSignaturePad\n        :id=\"`${id}-${padField.id}`\"\n        :model-value=\"padValue\"\n        :modes=\"padModes\"\n        :font=\"padField.font\"\n        :fonts=\"padFonts\"\n        :locale=\"locale\"\n        :disabled=\"disabled\"\n        :width=\"padField.type === 'initials' ? 240 : undefined\"\n        :height=\"padField.type === 'initials' ? 120 : undefined\"\n        @update:model-value=\"onPadValue\"\n      />\n      <button type=\"button\" class=\"fe-btn fe-btn--sm\" data-testid=\"surface-pdf-pad-done\" @click=\"padFor = ''\">{{ t('plugin.pdf.pad_done') }}</button>\n    </div>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * SurfaceRenderer — draws a plugin's declarative screen with filex's own\n * components. The plugin sends data (`wire.Surface.nodes`); nothing it sends\n * is ever markup, a script or a frame — a node type this file does not know\n * is shown AS unknown, not skipped and not interpreted.\n *\n * M1 drew `text` (and layout `row` / `divider`). M2 adds the rest of the\n * v1 catalogue — form, steps, list, progress, people-picker, pin-input,\n * file-chooser, preview — one `<template v-else-if>` each, each a small\n * component under `./nodes/`. M3 (the sign track) adds `signature-pad` and\n * `pdf-fields`, and lets `preview` show a public page's exposed copy by\n * `ref` through the host's `fileUrl` resolver.\n *\n * Values: nodes that hold one read and write the ONE map the host owns\n * (`values`, v-model style), keyed by node id — a `form`'s fields flat by\n * field key. Events up: `update:values` on any edit, `change` on a form\n * edit (the host debounces it into the contract's `change` event), `action`\n * for a list row's button. Nested rows forward all three.\n */\nimport type { LocaleCode, ThemeMode } from '../../types/ExplorerConfig';\nimport type { FileApi } from '../../composables/useFileApi';\nimport type {\n  FileChooserNodeProps,\n  FileRefResolver,\n  FormNodeProps,\n  ListNodeProps,\n  PdfFieldsNodeProps,\n  PeoplePickerNodeProps,\n  PinInputNodeProps,\n  PluginPerson,\n  PluginText,\n  PreviewNodeProps,\n  ProgressNodeProps,\n  SignaturePadNodeProps,\n  StepsNodeProps,\n  SurfaceNode,\n  TextNodeProps,\n} from '../../types/Plugins';\nimport { isSignatureValue } from '../../lib/signaturePad';\nimport { useLocale } from '../../composables/useLocale';\nimport { labelOf } from '../../lib/pluginLabel';\nimport SurfaceForm from './nodes/SurfaceForm.vue';\nimport SurfaceSteps from './nodes/SurfaceSteps.vue';\nimport SurfaceList from './nodes/SurfaceList.vue';\nimport SurfaceProgress from './nodes/SurfaceProgress.vue';\nimport SurfacePeoplePicker from './nodes/SurfacePeoplePicker.vue';\nimport SurfacePinInput from './nodes/SurfacePinInput.vue';\nimport SurfaceFileChooser from './nodes/SurfaceFileChooser.vue';\nimport SurfacePreview from './nodes/SurfacePreview.vue';\nimport SurfaceSignaturePad from './nodes/SurfaceSignaturePad.vue';\nimport SurfacePdfFields from './nodes/SurfacePdfFields.vue';\n\n/** What the value-holding and file-reading nodes need from the explorer's API. */\nexport type SurfaceApi = Pick<FileApi, 'index' | 'pluginUsers' | 'fetchBlob'>;\n\nconst props = defineProps<{\n  nodes: SurfaceNode[];\n  locale: LocaleCode;\n  theme?: ThemeMode;\n  /** Field-level errors the surface carries, keyed by node id / field key. */\n  errors?: Record<string, PluginText>;\n  /** The surface's values (node id → value; form fields flat). */\n  values?: Record<string, unknown>;\n  /** Absent in a bare render: choosers and previews say so instead of failing. */\n  api?: SurfaceApi;\n  /** The plugin the surface belongs to (the people-picker's lookup asks for it). */\n  plugin?: string;\n  /** Storage names a file-chooser may span; where its picker opens. */\n  storages?: string[];\n  startAt?: string;\n  /** The host is talking to the server: inputs and buttons stay put. */\n  disabled?: boolean;\n  /** A public page's exposed copies (`pub:N`) → a URL the browser may load (M3). */\n  fileUrl?: FileRefResolver;\n  /** Where pdf.js fetches its worker from; the pinned CDN copy when absent. */\n  pdfWorkerUrl?: string | null;\n  /**\n   * v3 §2.1 — field keys a refused submit is waiting for. Passed down to the\n   * form so the star and the \"required\" line land on the FIELD, not in a\n   * banner the person has to map back onto a box themselves.\n   */\n  invalidKeys?: string[];\n  /**\n   * v3 §3.2 — `page` means this surface owns the viewport, so a `pdf-fields`\n   * node fits the document to the screen instead of to the text column. The\n   * frame says which; a node never measures the window itself.\n   */\n  layout?: 'inline' | 'page';\n  /** The box a `page` layout's document may fill (a CSS length). */\n  pageHeight?: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'update:values', v: Record<string, unknown>): void;\n  /** A form field was edited (the host debounces into `event: \"change\"`). */\n  (e: 'change'): void;\n  (e: 'action', p: { action_id: string; row_id: string }): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst vals = () => props.values ?? {};\n\nfunction set(id: string, v: unknown) {\n  emit('update:values', { ...vals(), [id]: v });\n}\n\nfunction onFormValues(v: Record<string, unknown>) {\n  emit('update:values', v);\n  emit('change');\n}\n\n/** A `pdf-fields` edit is authoring: it posts `change` like a form does. Filling rides on the next submit. */\nfunction onPdfValue(n: SurfaceNode, v: unknown) {\n  set(n.id as string, v);\n  if (p<PdfFieldsNodeProps>(n).mode !== 'fill') emit('change');\n}\n\nfunction p<T>(n: SurfaceNode): T {\n  return (n.props ?? {}) as unknown as T;\n}\n\n/** A `text` node's words: `props.text` (a Text or a string), else `props.value`. */\nfunction textOf(n: SurfaceNode): string {\n  const tp = p<TextNodeProps>(n);\n  return labelOf(tp.text ?? tp.value ?? '', props.locale);\n}\n\nfunction toneOf(n: SurfaceNode): string {\n  const tone = String(p<TextNodeProps>(n).tone ?? '');\n  return tone === 'muted' || tone === 'danger' || tone === 'info' ? `fe-surface__text--${tone}` : '';\n}\n\nfunction errorOf(n: SurfaceNode): string {\n  if (!n.id || !props.errors) return '';\n  return labelOf(props.errors[n.id], props.locale);\n}\n\nfunction str(v: unknown): string {\n  return typeof v === 'string' ? v : '';\n}\n\nfunction people(v: unknown): PluginPerson[] {\n  return Array.isArray(v) ? (v as PluginPerson[]) : [];\n}\n</script>\n\n<template>\n  <div class=\"fe-surface\">\n    <template v-for=\"(n, i) in nodes\" :key=\"n.id || i\">\n      <p\n        v-if=\"n.type === 'text'\"\n        class=\"fe-surface__text\"\n        :class=\"[toneOf(n), p<TextNodeProps>(n).heading ? 'fe-surface__text--heading' : '']\"\n        :data-node=\"n.id || undefined\"\n      >{{ textOf(n) }}</p>\n      <hr v-else-if=\"n.type === 'divider'\" class=\"fe-surface__divider\" />\n      <div v-else-if=\"n.type === 'row'\" class=\"fe-surface__row\">\n        <SurfaceRenderer\n          :nodes=\"n.children ?? []\"\n          :locale=\"locale\"\n          :theme=\"theme\"\n          :errors=\"errors\"\n          :values=\"values\"\n          :api=\"api\"\n          :plugin=\"plugin\"\n          :storages=\"storages\"\n          :start-at=\"startAt\"\n          :disabled=\"disabled\"\n          :file-url=\"fileUrl\"\n          :pdf-worker-url=\"pdfWorkerUrl\"\n          :invalid-keys=\"invalidKeys\"\n          :layout=\"layout\"\n          :page-height=\"pageHeight\"\n          @update:values=\"(v) => emit('update:values', v)\"\n          @change=\"emit('change')\"\n          @action=\"(a) => emit('action', a)\"\n        />\n      </div>\n      <SurfaceForm\n        v-else-if=\"n.type === 'form'\"\n        :fields=\"p<FormNodeProps>(n).fields ?? []\"\n        :values=\"vals()\"\n        :locale=\"locale\"\n        :errors=\"errors\"\n        :invalid=\"invalidKeys\"\n        :disabled=\"disabled\"\n        @update:values=\"onFormValues\"\n      />\n      <SurfaceSteps v-else-if=\"n.type === 'steps'\" :items=\"p<StepsNodeProps>(n).items ?? []\" :locale=\"locale\" />\n      <SurfaceList\n        v-else-if=\"n.type === 'list'\"\n        :columns=\"p<ListNodeProps>(n).columns ?? []\"\n        :rows=\"p<ListNodeProps>(n).rows ?? []\"\n        :empty=\"p<ListNodeProps>(n).empty\"\n        :locale=\"locale\"\n        :disabled=\"disabled\"\n        :table-id=\"plugin ? `app.${plugin}.${n.id || 'list'}` : undefined\"\n        @action=\"(a) => emit('action', a)\"\n      />\n      <SurfaceProgress\n        v-else-if=\"n.type === 'progress'\"\n        :value=\"p<ProgressNodeProps>(n).value\"\n        :label=\"p<ProgressNodeProps>(n).label\"\n        :locale=\"locale\"\n      />\n      <SurfacePeoplePicker\n        v-else-if=\"n.type === 'people-picker' && n.id\"\n        :id=\"n.id\"\n        :model-value=\"people(vals()[n.id])\"\n        :multi=\"p<PeoplePickerNodeProps>(n).multi === true\"\n        :allow-external=\"p<PeoplePickerNodeProps>(n).allow_external === true\"\n        :api=\"api\"\n        :plugin=\"plugin\"\n        :locale=\"locale\"\n        :disabled=\"disabled\"\n        :invalid=\"!!errorOf(n)\"\n        @update:model-value=\"(v) => set(n.id as string, v)\"\n      />\n      <SurfacePinInput\n        v-else-if=\"n.type === 'pin-input' && n.id\"\n        :id=\"n.id\"\n        :length=\"p<PinInputNodeProps>(n).length\"\n        :model-value=\"str(vals()[n.id])\"\n        :locale=\"locale\"\n        :disabled=\"disabled\"\n        :invalid=\"!!errorOf(n)\"\n        @update:model-value=\"(v) => set(n.id as string, v)\"\n      />\n      <SurfaceFileChooser\n        v-else-if=\"n.type === 'file-chooser' && n.id\"\n        :id=\"n.id\"\n        :kind=\"p<FileChooserNodeProps>(n).kind\"\n        :model-value=\"str(vals()[n.id])\"\n        :api=\"api\"\n        :storages=\"storages\"\n        :start-at=\"startAt\"\n        :locale=\"locale\"\n        :theme=\"theme\"\n        :disabled=\"disabled\"\n        :invalid=\"!!errorOf(n)\"\n        @update:model-value=\"(v) => set(n.id as string, v)\"\n      />\n      <SurfacePreview\n        v-else-if=\"n.type === 'preview'\"\n        :path=\"str(p<PreviewNodeProps>(n).path)\"\n        :file-ref=\"str(p<PreviewNodeProps>(n).ref)\"\n        :file-url=\"fileUrl\"\n        :api=\"api\"\n        :locale=\"locale\"\n      />\n      <SurfaceSignaturePad\n        v-else-if=\"n.type === 'signature-pad' && n.id\"\n        :id=\"n.id\"\n        :modes=\"p<SignaturePadNodeProps>(n).modes\"\n        :width=\"p<SignaturePadNodeProps>(n).width\"\n        :height=\"p<SignaturePadNodeProps>(n).height\"\n        :font=\"p<SignaturePadNodeProps>(n).font\"\n        :fonts=\"p<SignaturePadNodeProps>(n).fonts\"\n        :label=\"labelOf(p<SignaturePadNodeProps>(n).label ?? '', locale)\"\n        :required=\"p<SignaturePadNodeProps>(n).required === true\"\n        :model-value=\"isSignatureValue(vals()[n.id]) ? (vals()[n.id] as never) : null\"\n        :locale=\"locale\"\n        :disabled=\"disabled\"\n        :invalid=\"!!errorOf(n)\"\n        @update:model-value=\"(v) => set(n.id as string, v)\"\n      />\n      <SurfacePdfFields\n        v-else-if=\"n.type === 'pdf-fields' && n.id\"\n        :id=\"n.id\"\n        :src=\"p<PdfFieldsNodeProps>(n).src\"\n        :mode=\"p<PdfFieldsNodeProps>(n).mode\"\n        :fields=\"p<PdfFieldsNodeProps>(n).fields\"\n        :layout=\"layout\"\n        :page-height=\"pageHeight\"\n        :signers=\"p<PdfFieldsNodeProps>(n).signers\"\n        :signer=\"p<PdfFieldsNodeProps>(n).signer\"\n        :types=\"p<PdfFieldsNodeProps>(n).types\"\n        :formats=\"p<PdfFieldsNodeProps>(n).formats\"\n        :date-labels=\"p<PdfFieldsNodeProps>(n).date_labels\"\n        :stamp-lines=\"p<PdfFieldsNodeProps>(n).stamp_lines\"\n        :model-value=\"vals()[n.id]\"\n        :api=\"api\"\n        :file-url=\"fileUrl\"\n        :pdf-worker-url=\"pdfWorkerUrl\"\n        :locale=\"locale\"\n        :theme=\"theme\"\n        :disabled=\"disabled\"\n        :invalid=\"!!errorOf(n)\"\n        @update:model-value=\"(v) => onPdfValue(n, v)\"\n      />\n      <p v-else class=\"fe-surface__unknown\" :data-node-type=\"n.type\">\n        {{ t('plugin.view.unsupported', { type: n.type }) }}\n      </p>\n      <p v-if=\"errorOf(n) && n.type !== 'form'\" class=\"fe-surface__error\">{{ errorOf(n) }}</p>\n    </template>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * SurfaceConversation — the body of ANY screen a plugin is talking through.\n *\n * Three frames draw a plugin surface: the modal a `modal` view opens, the\n * whole page a `page` view opens, and the card an outside participant gets\n * at `/p/<token>`. The FRAME is what differs (a dialog, a document, a card);\n * the body is the same five things every time — the nodes, the toast the\n * answer carried, \"working…\", the failure, and the footer buttons.\n *\n * ⚠⚠ Written once for that reason. Three copies of this block existed by the\n * time the `page` placement arrived, and the drift had already started: the\n * modal showed no toast at all, so a plugin that answered `{toast}` from a\n * dialog was simply not heard. Anything added here — a node type's wiring, a\n * busy affordance, an aria role — now reaches all three frames or none.\n */\nimport type { LocaleCode, ThemeMode } from '../../types/ExplorerConfig';\nimport type { PluginSurfaceStore } from '../../composables/usePluginSurface';\nimport type { FileRefResolver } from '../../types/Plugins';\nimport { useLocale } from '../../composables/useLocale';\nimport SurfaceRenderer, { type SurfaceApi } from './SurfaceRenderer.vue';\n\nconst props = defineProps<{\n  /** The conversation this body belongs to (`usePluginSurface`). */\n  conv: PluginSurfaceStore;\n  locale: LocaleCode;\n  theme?: ThemeMode;\n  /** Absent in a bare render (the public page has no explorer API). */\n  api?: SurfaceApi;\n  /** The plugin the surface belongs to — the people-picker's lookup asks for it. */\n  plugin?: string;\n  storages?: string[];\n  startAt?: string;\n  /** A public page's exposed copies (`pub:N`) → a URL the browser may load. */\n  fileUrl?: FileRefResolver;\n  /** The last toast the frame collected, if it shows one inline. */\n  toast?: string;\n  /**\n   * v3 §3.2 — `page` lets a `pdf-fields` node take the viewport instead of\n   * sitting in the document flow. The FRAME knows which it is; the nodes do\n   * not, and must not guess from the window size (an embed in a narrow\n   * column is not a page).\n   */\n  layout?: 'inline' | 'page';\n  /** Where the document may grow to in `page` layout — the frame's own box. */\n  pageHeight?: string;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n</script>\n\n<template>\n  <SurfaceRenderer\n    v-if=\"conv.current.value\"\n    :nodes=\"conv.current.value.nodes ?? []\"\n    :locale=\"locale\"\n    :theme=\"theme\"\n    :errors=\"conv.errors.value\"\n    :values=\"conv.values.value\"\n    :api=\"api\"\n    :plugin=\"plugin\"\n    :storages=\"storages\"\n    :start-at=\"startAt\"\n    :file-url=\"fileUrl\"\n    :layout=\"layout\"\n    :page-height=\"pageHeight\"\n    :invalid-keys=\"conv.invalidKeys.value\"\n    :disabled=\"conv.busy.value\"\n    @update:values=\"conv.updateValues\"\n    @change=\"conv.scheduleChange\"\n    @action=\"conv.rowAction\"\n  />\n  <p v-if=\"toast\" class=\"fe-surface__text fe-surface__text--info\" role=\"status\">{{ toast }}</p>\n  <p v-if=\"conv.busy.value\" class=\"fe-surface__text fe-surface__text--muted\">{{ t('plugin.view.busy') }}</p>\n  <p v-if=\"conv.failure.value\" class=\"fe-surface__error\" role=\"alert\">{{ conv.failure.value }}</p>\n</template>\n","/**\n * surfaceSteps — \"one step asks one thing\", as pure data.\n *\n * v3 §2 rule 3: a multi-step surface has at most ONE primary button plus\n * Back. The complaint behind it: a wizard step with eight fields and four\n * buttons, where nothing on the screen said which button was the way\n * forward — so the person picked one and found out afterwards.\n *\n * ⚠ Enforced by the RENDERER, not by each plugin. A plugin that marks three\n * of its actions `primary: true` gets one primary (the first one it\n * declared) and two ordinary buttons — it is not refused, and it does not\n * get to draw three ways forward. Nothing is hidden: a button the plugin\n * declared is a button the person can press, because silently dropping one\n * would break a wizard in a way no test of ours would ever see.\n *\n * ⚠ \"Back\" is recognised by its ACTION ID, which is the only signal on the\n * wire. `back`, `prev`, `previous` and the `step_back` / `go-back` spellings\n * of them, case- and separator-insensitive. A step that calls its own\n * backward action something else simply gets an ordinary button, which is\n * what it would have had anyway.\n */\nimport type { SurfaceAction, SurfaceNode } from '../types/Plugins';\nimport { walkNodes } from './surfaceValues';\n\n/** Does this surface have a `steps` node — i.e. is it a step of a walk? */\nexport function hasSteps(nodes: SurfaceNode[] | undefined): boolean {\n  let found = false;\n  walkNodes(nodes, (n) => {\n    if (n.type === 'steps') found = true;\n  });\n  return found;\n}\n\nconst BACK_IDS = new Set(['back', 'prev', 'previous', 'stepback', 'goback', 'prevstep', 'previousstep']);\n\n/** Is this the step's backward action? */\nexport function isBackAction(a: Pick<SurfaceAction, 'id'>): boolean {\n  const id = String(a?.id ?? '')\n    .toLowerCase()\n    .replace(/[^a-z]/g, '');\n  return BACK_IDS.has(id);\n}\n\n/** A footer, arranged: Back on the left, the ordinary buttons, one primary last. */\nexport interface StepFooter {\n  back: SurfaceAction | null;\n  /** In declaration order, minus Back and minus the one primary. */\n  others: SurfaceAction[];\n  primary: SurfaceAction | null;\n}\n\n/**\n * Arrange a surface's actions for a step.\n *\n * `stepped` is what `hasSteps` said. On a surface that is NOT a step the\n * plugin's own arrangement is left alone — a dialog with two equally weighted\n * actions is a legitimate screen, and the rule is about walks.\n */\nexport function stepFooter(actions: SurfaceAction[] | undefined, stepped: boolean): StepFooter {\n  const list = (actions ?? []).filter((a) => a && a.id);\n  if (!stepped) {\n    return { back: null, others: list, primary: null };\n  }\n  const back = list.find(isBackAction) ?? null;\n  const rest = list.filter((a) => a !== back);\n  const primary = rest.find((a) => a.primary === true) ?? null;\n  return { back, others: rest.filter((a) => a !== primary), primary };\n}\n","<script setup lang=\"ts\">\n/**\n * SurfaceFooterButtons — a surface's footer, wherever the frame puts it.\n *\n * The rule a plugin's buttons follow is not the frame's business: the\n * primary one posts `submit`, every other one posts `action`, a `danger` one\n * is red, and none of them is clickable while the conversation is busy\n * (`usePluginSurface.press`). Three frames (dialog, page, public shell)\n * place the row differently and must not each re-derive that.\n *\n * ⚠⚠ v3 §2 rule 3 — on a STEP (a surface carrying a `steps` node) the row is\n * arranged rather than merely listed: Back on the left, one primary on the\n * right, everything else between them, and a second `primary: true` is drawn\n * as an ordinary button. `lib/surfaceSteps` holds the arrangement so the\n * frames, the tests and the plugin test kit all read one answer.\n *\n * ⚠ `testidPrefix` is the one thing that legitimately differs per frame: the\n * suites address the dialog's buttons and the page's separately, so a shared\n * id would make a passing test ambiguous about which screen it measured.\n */\nimport { computed } from 'vue';\nimport type { LocaleCode } from '../../types/ExplorerConfig';\nimport type { PluginSurfaceStore } from '../../composables/usePluginSurface';\nimport type { SurfaceAction } from '../../types/Plugins';\nimport { labelOf } from '../../lib/pluginLabel';\nimport { hasSteps, stepFooter } from '../../lib/surfaceSteps';\n\nconst props = defineProps<{\n  conv: PluginSurfaceStore;\n  locale: LocaleCode;\n  /** `plugin-view` → `data-testid=\"plugin-view-action-<id>\"`. */\n  testidPrefix: string;\n  /** The inspector's row is compact; every other frame uses the full size. */\n  small?: boolean;\n}>();\n\nconst stepped = computed(() => hasSteps(props.conv.current.value?.nodes));\n\nconst arranged = computed(() => stepFooter(props.conv.footer.value, stepped.value));\n\n/** Back, the ordinary buttons, then the one primary — in that DOM order. */\nconst ordered = computed<SurfaceAction[]>(() => {\n  const f = arranged.value;\n  return [...(f.back ? [f.back] : []), ...f.others, ...(f.primary ? [f.primary] : [])];\n});\n\n/** Only the arranged primary is primary; a plugin's second one is not. */\nfunction isPrimary(a: SurfaceAction): boolean {\n  if (!stepped.value) return a.primary === true;\n  return a === arranged.value.primary;\n}\n</script>\n\n<template>\n  <button\n    v-for=\"a in ordered\"\n    :key=\"a.id\"\n    type=\"button\"\n    class=\"fe-btn\"\n    :class=\"{\n      'fe-btn--sm': small,\n      'fe-btn--primary': isPrimary(a) && !a.danger,\n      'fe-btn--danger': a.danger,\n      'fe-surface__back': stepped && a === arranged.back,\n    }\"\n    :disabled=\"props.conv.busy.value || a.disabled\"\n    :data-testid=\"`${testidPrefix}-action-${a.id}`\"\n    @click=\"props.conv.press(a)\"\n  >\n    {{ labelOf(a.label, locale) }}\n  </button>\n</template>\n\n","/**\n * The bridge between filex and an app's own interface — the ONE definition.\n *\n * An app's interface (the `ui` block of its filex-app.json) runs in a frame\n * filex draws with `sandbox=\"allow-scripts\"`: an opaque origin, no cookies, no\n * storage, no network (the server's CSP says `connect-src 'none'`). Everything\n * it may do goes through this bridge, and the host decides every call.\n *\n * Both halves import this file — the SDK the app bundles (`src/index.ts`) and\n * filex's own frame (`packages/core/src/components/plugin/AppFrame.vue`) — so a\n * method or an event added here is added on both sides at once.\n *\n * The wire, in order (docs/APP-PLUGINS-API.md → \"The interface bridge\"):\n *\n *  1. The app posts `{type: 'filex:hello', v: 1}` to its parent window.\n *  2. The host takes it ONLY when `event.source` is the frame it drew. The\n *     origin says nothing here: a sandboxed frame's origin is always \"null\",\n *     so any other sandboxed frame on the page would look the same (measured,\n *     2026-09-27, Chrome, Firefox and WebKit).\n *  3. The host answers with a MessagePort: `{type: 'filex:port', v: 1}` and\n *     the port transferred. Once per load of the frame; a second hello is\n *     ignored.\n *  4. The app takes the port ONLY when `event.source` is its parent window.\n *  5. From then on, only the port: requests `{id, method, params}`, answers\n *     `{id, result}` or `{id, error}`, events `{event, data}`, and the host's\n *     own requests `{hid, request, params}` answered `{hid, result|error}`.\n */\n\n/** The bridge generation both sides speak. */\nexport const BRIDGE_VERSION = 1;\n\n/** The app's first message, to `window.parent`. */\nexport const HELLO = 'filex:hello';\n/** The host's answer, carrying the port. */\nexport const PORT = 'filex:port';\n\n/** What the app may ask the host. Anything else is `unknown_method`. */\nexport type Method =\n  | 'session.get'\n  | 'file.read'\n  | 'file.save'\n  | 'file.saveAs'\n  | 'ui.dirty'\n  | 'ui.title'\n  | 'ui.toast'\n  | 'ui.confirm'\n  | 'ui.close'\n  | 'clipboard.write'\n  | 'ui.download'\n  | 'engine.call'\n  | 'job.submit'\n  | 'state.get'\n  | 'state.set'\n  /** 0.52.0: what the app's license says (a paid app from a store), `LicenseInfo`. */\n  | 'license.get';\n\nexport const METHODS: readonly Method[] = [\n  'session.get',\n  'file.read',\n  'file.save',\n  'file.saveAs',\n  'ui.dirty',\n  'ui.title',\n  'ui.toast',\n  'ui.confirm',\n  'ui.close',\n  'clipboard.write',\n  'ui.download',\n  'engine.call',\n  'job.submit',\n  'state.get',\n  'state.set',\n  'license.get',\n];\n\n/** What the host tells the app, unasked. */\nexport type HostEvent =\n  /** The interface's colours changed (light/dark, palette). `data: Theme`. */\n  | 'theme'\n  /** The reader's language changed. `data: {locale, dir}`. */\n  | 'locale'\n  /** The open file changed underneath (another tab, another person). */\n  | 'file.changed'\n  /** The person closed the frame's surroundings; last chance to say so. */\n  | 'close.request'\n  /** An administrator installed a new version of this app: reload to use it. */\n  | 'app.updated';\n\n/** What the host may ask the app (and wait for). */\nexport type HostRequest =\n  /** Save now (the host's Save button, a draft's \"Save to disk\"): the app\n   *  hands its document to `file.save` and answers when it is written. */\n  'save';\n\n/** Why a call was refused. */\nexport type ErrorCode =\n  /** The app was not granted what the call needs (files:write for a save…). */\n  | 'not_granted'\n  /** No such file (an index past the opened files), no such key. */\n  | 'not_found'\n  /** The file cannot be written: a read-only storage, a view-only opening. */\n  | 'read_only'\n  /** The call's parameters are wrong. */\n  | 'invalid'\n  /** Over a limit (LIMITS). */\n  | 'too_large'\n  /** The server could not be reached or refused; `message` says what. */\n  | 'failed'\n  /** The person said no (a confirm, a save-as picker closed). */\n  | 'cancelled'\n  /** The host does not offer this here (no engine, no save handler). */\n  | 'unavailable'\n  | 'unknown_method';\n\nexport interface BridgeError {\n  code: ErrorCode;\n  message?: string;\n}\n\n/* ── messages ──────────────────────────────────────────────────────────── */\n\nexport interface HelloMessage {\n  type: typeof HELLO;\n  v: number;\n}\n\nexport interface PortMessage {\n  type: typeof PORT;\n  v: number;\n}\n\nexport interface RequestMessage {\n  id: number;\n  method: Method;\n  params?: unknown;\n}\n\nexport interface ResponseMessage {\n  id: number;\n  result?: unknown;\n  error?: BridgeError;\n}\n\nexport interface EventMessage {\n  event: HostEvent;\n  data?: unknown;\n}\n\nexport interface HostRequestMessage {\n  hid: number;\n  request: HostRequest;\n  params?: unknown;\n}\n\nexport interface HostResponseMessage {\n  hid: number;\n  result?: unknown;\n  error?: BridgeError;\n}\n\n/* ── shapes ────────────────────────────────────────────────────────────── */\n\n/** The interface's look: `mode` and filex's own `--fe-*` custom properties. */\nexport interface Theme {\n  mode: 'light' | 'dark';\n  /** `--fe-bg`, `--fe-text`, `--fe-accent`… — the SDK sets them on `<html>`. */\n  tokens: Record<string, string>;\n}\n\n/** One file the interface was opened with. Never a storage path. */\nexport interface FileInfo {\n  index: number;\n  name: string;\n  /** Lower-case, no dot. */\n  ext: string;\n  size: number;\n  mime: string;\n  /** It cannot be saved over: read-only storage, view-only opening, or the\n   *  app holds no `files:write`. */\n  readOnly: boolean;\n}\n\n/** What `session.get` answers — what the app knows about where it runs. */\nexport interface Session {\n  v: number;\n  app: { name: string; version: string };\n  view: { id: string; placement: 'modal' | 'page' | 'inspector' | 'home' | 'viewer' };\n  /** The reader's language tag (`tr`, `pt-br`) and its direction. */\n  locale: string;\n  dir: 'ltr' | 'rtl';\n  theme: Theme;\n  /** The person's display name; never their e-mail, never a token. */\n  user: { name: string };\n  files: FileInfo[];\n  /** The permissions this app was granted — so it can hide what it may not do. */\n  grants: string[];\n  /** The administrator's non-secret settings for this app (grant `settings`). */\n  settings?: Record<string, string>;\n}\n\n/** `file.read` params. */\nexport interface ReadParams {\n  index?: number;\n  /** `stream` (a transferred ReadableStream<Uint8Array>), `bytes` (an\n   *  ArrayBuffer), or `text` (UTF-8, at most LIMITS.maxTextBytes). */\n  as?: 'stream' | 'bytes' | 'text';\n}\n\nexport interface ReadResult {\n  name: string;\n  size: number;\n  mime: string;\n  stream?: ReadableStream<Uint8Array>;\n  bytes?: ArrayBuffer;\n  text?: string;\n}\n\n/** `file.save` params: the new content of the opened file. */\nexport interface SaveParams {\n  index?: number;\n  /** A transferred ReadableStream<Uint8Array>, an ArrayBuffer or a string. */\n  data: ReadableStream<Uint8Array> | ArrayBuffer | string;\n  mime?: string;\n}\n\nexport interface SaveResult {\n  saved: true;\n  size: number;\n}\n\n/**\n * `ui.download`: a file for the person's own disk. filex does it (a sandboxed\n * frame cannot download), with the app's `ui:download` grant, on a gesture in\n * the frame or the person's yes, never over LIMITS.maxDownloadBytes.\n */\nexport interface DownloadParams {\n  /** The file name offered — a name, not a path. */\n  name: string;\n  /** A transferred ReadableStream<Uint8Array>, an ArrayBuffer or a string. */\n  data: ReadableStream<Uint8Array> | ArrayBuffer | string;\n  mime?: string;\n}\n\nexport interface DownloadResult {\n  saved: true;\n  size: number;\n}\n\n/**\n * `file.saveAs`: a NEW file, in a folder the person picks in filex's own\n * folder dialog (the one its Move to… uses), which opens in the opened\n * file's folder. Closing the dialog answers `cancelled`.\n */\nexport interface SaveAsParams {\n  /** The file name — a name, not a path. */\n  name: string;\n  data: ReadableStream<Uint8Array> | ArrayBuffer | string;\n  mime?: string;\n}\n\nexport interface SaveAsResult {\n  saved: true;\n  name: string;\n  size: number;\n}\n\nexport interface ToastParams {\n  text: string;\n  tone?: 'info' | 'success' | 'warning' | 'error';\n}\n\nexport interface ConfirmParams {\n  title?: string;\n  text: string;\n  confirm?: string;\n  cancel?: string;\n  danger?: boolean;\n}\n\n/**\n * `license.get` (filex 0.52.0): what the app's license says. A paid app is\n * installed from a store, which issues its license and is asked about it every\n * day; filex keeps the key and never hands it to the app. `status`:\n *\n *   - `free`: not a paid app;\n *   - `valid`: the store said valid at its last check;\n *   - `grace`: valid, but the store could not be asked since - it holds until\n *     the grace the store signed ends;\n *   - anything else (`revoked`, `expired`, `invalid`, `seats_exhausted`,\n *     `wrong_app`, `grace_expired`, `missing`, `unverified`): the app is held\n *     and its interface is not served, so an app rarely reads one of these.\n *\n * `valid_until` / `updates_until` are there for a valid license (dates as\n * RFC 3339). Who holds the license is not the app's to read. filex 0.51.0\n * and older answer `unknown_method`.\n */\nexport interface LicenseInfo {\n  status: string;\n  valid_until?: string;\n  updates_until?: string;\n}\n\n/** `engine.call`: the app's own module, `ui_call` export. */\nexport interface EngineCallParams {\n  method: string;\n  params?: unknown;\n}\n\n/** `job.submit`: queue one of the app's actions on the opened files. */\nexport interface JobSubmitParams {\n  action: string;\n  params?: Record<string, unknown>;\n}\n\n/* ── limits ────────────────────────────────────────────────────────────── */\n\nexport const LIMITS = {\n  /** `file.read({as: 'text'})` refuses a file larger than this; read a stream. */\n  maxTextBytes: 32 << 20,\n  /** One `state.set` value, as JSON. */\n  maxStateBytes: 8 << 10,\n  /** A `ui.toast` / `ui.title` text, in characters. */\n  maxLineChars: 300,\n  /** How long the SDK waits for the host's port. */\n  connectTimeoutMs: 10_000,\n  /** The largest file `ui.download` hands the person (streamed or not). */\n  maxDownloadBytes: 256 << 20,\n} as const;\n\n/* ── guards ────────────────────────────────────────────────────────────── */\n\nexport function isHello(d: unknown): d is HelloMessage {\n  return !!d && typeof d === 'object' && (d as HelloMessage).type === HELLO && typeof (d as HelloMessage).v === 'number';\n}\n\nexport function isPortMessage(d: unknown): d is PortMessage {\n  return !!d && typeof d === 'object' && (d as PortMessage).type === PORT;\n}\n\nexport function isRequest(d: unknown): d is RequestMessage {\n  return (\n    !!d &&\n    typeof d === 'object' &&\n    typeof (d as RequestMessage).id === 'number' &&\n    typeof (d as RequestMessage).method === 'string'\n  );\n}\n\nexport function isKnownMethod(m: string): m is Method {\n  return (METHODS as readonly string[]).includes(m);\n}\n","/**\n * appBridge — filex's half of the bridge to an app's own interface.\n *\n * The interface runs in a frame `AppFrame.vue` draws with\n * `sandbox=\"allow-scripts\"`: an opaque origin with no network, no storage and\n * no cookie. It may only talk to us, and only like this (the protocol is the\n * SDK's `protocol.ts`, imported here so the two halves cannot drift):\n *\n *  - its first message must be `filex:hello`, and it is taken ONLY when\n *    `event.source` is the frame we drew — a sandboxed frame's origin is\n *    \"null\" whoever it is, so the origin tells two of them apart no better\n *    than a payload field does (measured 2026-09-27: a naive listener took a\n *    sibling frame's forged `save`; lesson #635);\n *  - we answer ONCE, with a MessagePort; from then on only the port counts;\n *  - one port per frame element: when the frame loads a second time (the\n *    interface navigated itself somewhere) the port is closed and no new\n *    hello is taken — the document there is not the package the\n *    administrator approved for this view. Reloading an interface means a\n *    new element (AppFrame does it).\n *\n * Every request is answered by a handler the host passes in; a method with\n * no handler answers `unavailable`, one the protocol does not know\n * `unknown_method`. Nothing here decides what a call may do — the handlers\n * do (AppFrame: grants, the opened files, read-only).\n */\nimport {\n  BRIDGE_VERSION,\n  PORT,\n  isHello,\n  isKnownMethod,\n  isRequest,\n  type BridgeError,\n  type ErrorCode,\n  type HostEvent,\n  type HostRequest,\n  type Method,\n} from '@brftech/filex-app-ui/protocol';\n\n/**\n * How much ONE frame may ask (security review UI-14): at most `inFlight`\n * calls unanswered at once, and at most `perWindow` requests in any\n * `windowMs`. Past either, a request is answered `unavailable` with the\n * message `busy` — the page around the frame is filex's, and an interface\n * that floods it (a million toasts, a thousand module calls) must not freeze\n * it. Generous for any real editor: an autosave, a title, a dirty flag.\n */\nexport const BRIDGE_CAPS = { inFlight: 32, perWindow: 400, windowMs: 10_000 } as const;\n\n/** A refusal a handler throws: it reaches the app as `{code, message}`. */\nexport class BridgeFailure extends Error {\n  readonly code: ErrorCode;\n  constructor(code: ErrorCode, message?: string) {\n    super(message || code);\n    this.name = 'BridgeFailure';\n    this.code = code;\n  }\n}\n\nexport type BridgeHandler = (params: unknown) => unknown | Promise<unknown>;\n\nexport interface AppBridgeOptions {\n  /** The window the frame lives in (default: the global one). */\n  win?: Window;\n  /** The frame we drew. */\n  frame: () => HTMLIFrameElement | null;\n  handlers: Partial<Record<Method, BridgeHandler>>;\n  /** The port is up (the interface said hello). */\n  onConnect?: () => void;\n  /** The port was closed (a second load, or destroy). */\n  onDisconnect?: (why: 'reload' | 'destroyed') => void;\n}\n\nexport interface AppBridge {\n  readonly connected: () => boolean;\n  /** Tell the interface something. Dropped while there is no port. */\n  emit(event: HostEvent, data?: unknown, transfer?: Transferable[]): void;\n  /** Ask the interface something and wait for its answer. */\n  ask(request: HostRequest, params?: unknown, timeoutMs?: number): Promise<unknown>;\n  /** The frame element fired `load` — call it from the element's listener. */\n  frameLoaded(): void;\n  destroy(): void;\n}\n\n/** A value that may cross postMessage as the result's transfer list. */\nfunction transferables(v: unknown): Transferable[] {\n  if (!v || typeof v !== 'object') return [];\n  const out: Transferable[] = [];\n  for (const x of Object.values(v as Record<string, unknown>)) {\n    if (x instanceof ArrayBuffer) out.push(x);\n    else if (typeof ReadableStream !== 'undefined' && x instanceof ReadableStream) out.push(x as unknown as Transferable);\n  }\n  return out;\n}\n\n/** A server refusal's `error` field, when it is a code (`quota_exceeded`). */\nconst CODE_TOKEN = /^[a-z][a-z0-9_]{0,39}$/;\n\n/**\n * What the interface is told when a handler failed.\n *\n * ⚠ Security review UI-15: a BridgeFailure is filex's own refusal and says\n * its own words. ANYTHING else — a server refusal (useFileApi's\n * requestFailure), a browser error, a bug — is told as a protocol code plus,\n * at most, the server's short `error` code: never its sentence, never an\n * exception's text. Those can hold a path on the server's disk, a storage\n * path, a driver's words; the interface is an app, not an administrator.\n */\nfunction asError(e: unknown): BridgeError {\n  if (e instanceof BridgeFailure) return { code: e.code, message: e.message };\n  const f = (e ?? {}) as { status?: unknown; code?: unknown };\n  const status = typeof f.status === 'number' ? f.status : 0;\n  const token = typeof f.code === 'string' && CODE_TOKEN.test(f.code) ? f.code : '';\n  let code: ErrorCode = 'failed';\n  if (status === 404) code = 'not_found';\n  else if (status === 413) code = 'too_large';\n  else if (status === 400 || status === 422) code = 'invalid';\n  else if (status === 409 && token === 'read_only') code = 'read_only';\n  else if (status === 403 && token === 'not_granted') code = 'not_granted';\n  return { code, message: token || code };\n}\n\nexport function createAppBridge(opts: AppBridgeOptions): AppBridge {\n  const win = opts.win ?? window;\n  let port: MessagePort | null = null;\n  /** A hello was taken for this element: never another. */\n  let used = false;\n  /** How many times the element has loaded a document. */\n  let loads = 0;\n  let destroyed = false;\n  let hseq = 0;\n  const asking = new Map<number, { resolve: (v: unknown) => void; reject: (e: unknown) => void; timer: ReturnType<typeof setTimeout> }>();\n\n  function close(why: 'reload' | 'destroyed') {\n    if (port) {\n      port.onmessage = null;\n      try {\n        port.close();\n      } catch {\n        /* already gone */\n      }\n      port = null;\n      for (const [, a] of asking) {\n        clearTimeout(a.timer);\n        a.reject(new BridgeFailure('unavailable', 'the interface went away'));\n      }\n      asking.clear();\n      opts.onDisconnect?.(why);\n    }\n  }\n\n  /** Calls being answered, and the requests of the current window (UI-14). */\n  let inFlight = 0;\n  let windowStart = 0;\n  let windowCount = 0;\n\n  function withinRate(): boolean {\n    const now = Date.now();\n    if (now - windowStart >= BRIDGE_CAPS.windowMs) {\n      windowStart = now;\n      windowCount = 0;\n    }\n    if (windowCount >= BRIDGE_CAPS.perWindow) return false;\n    windowCount++;\n    return true;\n  }\n\n  async function answer(p: MessagePort, id: number, method: string, params: unknown) {\n    let msg: { id: number; result?: unknown; error?: BridgeError };\n    let transfer: Transferable[] = [];\n    if (!withinRate()) {\n      msg = { id, error: { code: 'unavailable', message: 'busy' } };\n    } else if (!isKnownMethod(method)) {\n      msg = { id, error: { code: 'unknown_method', message: method } };\n    } else {\n      const h = opts.handlers[method];\n      if (!h) {\n        msg = { id, error: { code: 'unavailable', message: `${method} is not offered here` } };\n      } else if (inFlight >= BRIDGE_CAPS.inFlight) {\n        msg = { id, error: { code: 'unavailable', message: 'busy' } };\n      } else {\n        inFlight++;\n        try {\n          const result = await h(params);\n          msg = { id, result };\n          transfer = transferables(result);\n        } catch (e) {\n          msg = { id, error: asError(e) };\n        } finally {\n          inFlight--;\n        }\n      }\n    }\n    if (p !== port) return; // closed while the handler ran\n    try {\n      p.postMessage(msg, transfer);\n    } catch (e) {\n      // A result that cannot cross (a stream this browser cannot transfer):\n      // say so rather than leave the call hanging.\n      p.postMessage({ id, error: { code: 'failed', message: 'the answer cannot be sent to the interface' } });\n    }\n  }\n\n  function onPortMessage(p: MessagePort) {\n    return (ev: MessageEvent) => {\n      const m = ev.data as Record<string, unknown> | null;\n      if (!m || typeof m !== 'object') return;\n      if (typeof m.hid === 'number') {\n        const a = asking.get(m.hid);\n        if (!a) return;\n        asking.delete(m.hid);\n        clearTimeout(a.timer);\n        if (m.error) {\n          const e = m.error as BridgeError;\n          a.reject(new BridgeFailure(e.code ?? 'failed', e.message));\n        } else a.resolve(m.result);\n        return;\n      }\n      if (!isRequest(m)) return;\n      void answer(p, m.id, m.method, m.params);\n    };\n  }\n\n  function onWindowMessage(ev: MessageEvent) {\n    if (destroyed || used) return;\n    const frame = opts.frame();\n    const cw = frame?.contentWindow;\n    // ⚠ The SOURCE decides, never the origin (always \"null\" here) and never\n    // anything in the payload.\n    if (!frame || !cw || ev.source !== cw) return;\n    if (!isHello(ev.data)) return;\n    // After a second load, the document in the frame is not the one we\n    // opened (see the file's header): no port for it.\n    if (loads > 1) return;\n    used = true;\n    const ch = new MessageChannel();\n    port = ch.port1;\n    port.onmessage = onPortMessage(port);\n    port.start?.();\n    // '*' because the frame's origin is opaque — there is no origin to name.\n    // What guarantees the port reaches the right document is that `cw` is\n    // the frame we drew and this runs synchronously on its hello.\n    cw.postMessage({ type: PORT, v: BRIDGE_VERSION }, '*', [ch.port2]);\n    opts.onConnect?.();\n  }\n\n  win.addEventListener('message', onWindowMessage);\n\n  return {\n    connected: () => port !== null,\n    emit(event, data, transfer = []) {\n      if (!port) return;\n      try {\n        port.postMessage({ event, data }, transfer);\n      } catch {\n        /* the interface is gone */\n      }\n    },\n    ask(request, params, timeoutMs = 60_000) {\n      const p = port;\n      if (!p) return Promise.reject(new BridgeFailure('unavailable', 'the interface is not connected'));\n      const hid = ++hseq;\n      return new Promise((resolve, reject) => {\n        const timer = setTimeout(() => {\n          asking.delete(hid);\n          reject(new BridgeFailure('failed', `the interface did not answer \"${request}\"`));\n        }, timeoutMs);\n        asking.set(hid, { resolve, reject, timer });\n        p.postMessage({ hid, request, params });\n      });\n    },\n    frameLoaded() {\n      loads++;\n      if (loads > 1) close('reload');\n    },\n    destroy() {\n      destroyed = true;\n      win.removeEventListener('message', onWindowMessage);\n      close('destroyed');\n    },\n  };\n}\n","/**\n * prefs — the look-and-language preferences, kept on the ACCOUNT.\n *\n * ⚠⚠ Why this module exists: a palette picked in one browser was not there\n * in the next one. Theme, palette, density and language were each stored in\n * `localStorage` and nowhere else, so every device — and every private\n * window, and every cleared cache — started the product over with somebody\n * else's defaults. They are a PERSON's preferences, not a machine's.\n *\n * So the answer lives on the account: `GET /api/me/prefs?surface=web` on\n * boot, `PUT /api/me/prefs?surface=web` on every change, debounced.\n *\n * ⚠ `localStorage` stays, and stays for exactly ONE job: the first paint.\n * The fetch cannot beat the first frame, so the mirror is what stops the\n * window flashing the stock palette on the way to the chosen one. It is a\n * CACHE of the account's answer, never the answer — when the server's\n * values land they overwrite it.\n *\n * ⚠⚠ ONE module, several surfaces. The web app asks for `surface=web` and\n * the desktop app for `surface=desktop` — same code, same keys, same\n * debounce; only the query differs, because a person may legitimately want\n * a dense list on a laptop and a roomy one on a wall screen. There is no\n * per-surface BRANCH anywhere in here, and there must not be one: a\n * behaviour that exists on one surface only is the bug this product keeps\n * having to un-write.\n */\n\nimport { apiRootOr } from './appBase';\n\n/** The preferences an account carries for one surface. */\nexport interface UiPrefs {\n  /** `light` | `dark` | `auto`. */\n  theme?: string;\n  /** A palette id from `lib/themes` (`default`, `night-blue`, …). */\n  palette?: string;\n  /** `comfortable` | `compact`. */\n  density?: string;\n  /** A language tag the interface offers (`lib/uiLocales`). */\n  locale?: string;\n  /**\n   * The order this person put their storages in, in the navigation panel\n   * (GitHub #57) — a JSON list of storage keys (`lib/storageOrder`). Absent or\n   * empty = the host's own order, which is what everybody who never reordered\n   * keeps seeing.\n   *\n   * ⚠ A string, like every other value here: `sanitize` keeps strings only, so\n   * a raw array would be dropped on the way in and erased on the next write.\n   */\n  storageOrder?: string;\n  /**\n   * Set (to `done`) once the first-use tour has been OFFERED to this person\n   * (`lib/tour`). Not a look: it has no first-paint mirror of its own, and it\n   * only ever goes one way — nothing in the product clears it.\n   */\n  tour?: string;\n  /**\n   * v4 — what apps' own interfaces keep for this person (`state.set` over the\n   * bridge; lib/appState): a JSON object `{app: {key: value}}`. An interface\n   * runs on an opaque origin with no storage of its own, so this is its only\n   * way to remember anything, and it follows the person like the rest.\n   */\n  appState?: string;\n  /**\n   * v4 — the app versions this person has been told about (lib/appState): a\n   * JSON object `{app: version}`. An administrator approved a new version →\n   * the next time the person opens that app, the \"updated\" note shows once.\n   */\n  appsSeen?: string;\n  /**\n   * 0.50 - \"always open this kind with this app\" (lib/openWith): a JSON object\n   * `{ext: handlerId}`, the handler `builtin` or `app:<plugin>/<view>`. A\n   * choice the administrator has since switched off is kept, and not used,\n   * until the person picks another (Settings → Preferences → Default apps\n   * says so).\n   *\n   * ⚠⚠ ONE record per ACCOUNT, not per surface (ACCOUNT_KEYS): the server\n   * hands it in with every surface's document and drops it from every PUT;\n   * it changes one kind at a time through `/api/me/open-with`\n   * (`accountFetch`), so a copy this page read at boot cannot undo a choice\n   * made since on another surface.\n   */\n  openWith?: string;\n}\n\nexport type PrefKey = keyof UiPrefs;\n\n/** The keys that paint the window — each has a first-paint mirror (below). */\nexport type LookKey = Exclude<PrefKey, 'tour' | 'appState' | 'appsSeen' | 'openWith'>;\n\n/**\n * Every key the account document carries.\n *\n * ⚠⚠ A key the client does not list here is DROPPED on the next write:\n * `sanitize` keeps only these, and `PUT` replaces the whole document. So a\n * preference that is not a look (the tour) still has to be named here, or the\n * first palette change after it was stored would erase it.\n */\nexport const PREF_KEYS: readonly PrefKey[] = ['theme', 'palette', 'density', 'locale', 'storageOrder', 'tour', 'appState', 'appsSeen', 'openWith'];\n\n/**\n * The keys that belong to the ACCOUNT, not to this surface: read with the\n * surface's document (the server puts them in), never written with it - each\n * has its own route (`accountFetch`) and is set here with `setAccountPref`.\n */\nexport const ACCOUNT_KEYS: readonly PrefKey[] = ['openWith'];\n\n/**\n * The keys with a first-paint mirror in `localStorage` — what the window is\n * painted with, nothing else.\n *\n * ⚠ `storageOrder` is one: the navigation panel draws the storages on the very\n * first frame, and without a mirror a person who reordered them would watch\n * the list jump from the host's order to theirs once the account answered. It\n * is also the ONLY place the order lives for an embed that never wires the\n * account document (`prefsConfigured()` false). The tour is not: it is a\n * one-way flag with a browser key of its own (`lib/tour`).\n */\nexport const LOOK_KEYS: readonly LookKey[] = ['theme', 'palette', 'density', 'locale', 'storageOrder'];\n\n/**\n * The localStorage mirror's key per preference.\n *\n * ⚠⚠ These are the names the surfaces ALREADY read at first paint\n * (`web/src/lib/theme`, `lib/themes.THEME_LS_KEY`, `lib/density`,\n * `web/src/i18n`). Inventing new ones here would have left four first-paint\n * readers looking at keys nobody writes — the preference would work, and\n * the window would flash on every load, which is the failure this module is\n * supposed to remove.\n */\nexport const PREF_LS_KEYS: Record<LookKey, string> = {\n  theme: 'filex.theme',\n  palette: 'filex.palette',\n  density: 'filex.density',\n  locale: 'filex.locale',\n  // New in 0.45.2 (#57); no earlier reader to stay compatible with.\n  storageOrder: 'filex.storageOrder',\n};\n\n/** How long a change waits for the next one before it is sent. */\nexport const PREFS_PUT_DEBOUNCE_MS = 400;\n\n/* ── is anybody signed in? ────────────────────────────────────────────── */\n\n/**\n * ⚠⚠ WITH NO SESSION, NOTHING PERSONAL PAINTS. The owner's rule, verbatim:\n * \"logoutluyken zaten seçtiğim tema değil, şirketin default, yoksa filex'in\n * default teması gelecek; tarayıcı gece modundaysa gece modunda olacak ya da\n * light mode.\"\n *\n * So a signed-out window wears the INSTANCE's look (`ui.default_theme`, or\n * filex's own stock palette when the operator has not set one) and follows the\n * BROWSER's `prefers-color-scheme`. The palette and the light/dark mode became\n * per-PERSON settings in v3 (migration 00047, `GET/PUT /api/me/prefs`), and a\n * person is exactly what a signed-out window does not have.\n *\n * ⚠ Measured before it was changed (2026-09-21, vitest against the shipped\n * `packages/core/dist`): with `filex.palette` = `night` and no session at all,\n * `useThemeState().themeId` came back `\"night\"` and `filex.thememode` = `dark`\n * came back `\"dark\"` — both read at MODULE LOAD, long before anything could\n * know whether a session existed. Worse, `instanceThemes.hasOwnChoice()` saw\n * the same key and suppressed the operator's own default entirely, so an\n * instance with a brand theme showed the LAST PERSON WHO SIGNED IN HERE their\n * colours on its sign-in page — and showed the next person at that shared\n * machine the previous one's taste.\n *\n * ⚠⚠ WHY A STORED HINT AND NOT THE REAL ANSWER. The real answer is\n * `/api/auth/me`, and it cannot be had at the first paint: the session cookie\n * is HttpOnly (handlers/auth.go) so JavaScript cannot see it, and the fetch\n * resolves long after the window has painted. A wrong answer is a visible bug\n * in BOTH directions — read the personal palette with no session and the leak\n * above is back; ignore it WITH a session and every single load flashes the\n * instance default on the way to the person's own palette. So this is a guess\n * that is right in the overwhelming case (this browser's last load answered\n * the same question) and is corrected within one round trip by\n * `rememberSession`, which every entry path reaches through `/api/auth/me`.\n */\nexport const SESSION_LS_KEY = 'filex.session';\n\n/**\n * Set for THIS DOCUMENT only, never persisted: a public link (`/s/`, `/d/`)\n * cannot carry a session whatever the browser remembers.\n *\n * ⚠ Persisting it would be the bug. The same browser's admin tab reads the\n * same localStorage, so writing \"no session\" from a share link would make that\n * tab flash the instance default on its next load — the very flash the mirror\n * exists to prevent.\n */\nlet sealed = false;\n\nfunction readSessionHint(): boolean {\n  try {\n    return localStorage.getItem(SESSION_LS_KEY) === '1';\n  } catch {\n    // Private window / blocked site data. \"No session\" is the safe answer: it\n    // shows the instance's look, never somebody else's.\n    return false;\n  }\n}\n\n/**\n * Is a person signed in here? The synchronous, first-paint answer.\n *\n * ⚠ `true` for a host that has not declared `sessionAware` — see that\n * option. \"Nobody told us about sessions\" means \"this explorer is inside\n * something that already dealt with it\", not \"nobody is here\".\n */\nexport function hasSession(): boolean {\n  if (sealed) return false;\n  if (!cfg.sessionAware) return true;\n  return readSessionHint();\n}\n\n/**\n * `/api/auth/me` has answered. Remember it for this browser's next first paint.\n *\n * ⚠ A hint and nothing more — it is not a credential, it grants nothing, and\n * every authenticated request still carries the HttpOnly cookie. Forging it\n * buys an attacker the wrong palette.\n */\nexport function rememberSession(present: boolean): void {\n  try {\n    if (present) localStorage.setItem(SESSION_LS_KEY, '1');\n    else localStorage.removeItem(SESSION_LS_KEY);\n  } catch {\n    /* quota / private mode — `hasSession()` then answers false, which is the\n       safe direction */\n  }\n  if (present) sealed = false;\n}\n\n/** This document is a public link: the answer is no, and it is not remembered. */\nexport function sealSessionless(): void {\n  sealed = true;\n}\n\n/**\n * Every localStorage key that mirrors a PERSON and must not outlive their\n * session.\n *\n * ⚠⚠ An allow-list, never `localStorage.clear()`. Most of what this product\n * keeps in a browser is a fact about the MACHINE or the INSTALL and survives a\n * sign-out on purpose:\n *   • `filex.instancetheme` — the operator's default, a PUBLIC fact identical\n *     for everybody. Clearing it would put back the very flash it was added to\n *     remove, on the sign-in page, for nothing.\n *   • `filex.installPrompt.dismissed`, `filex.notify.browserAsked`,\n *     `filex.tourDone` — \"this browser has already been asked\". Clearing them\n *     re-nags whoever sits down next, which is worse than useless. (The tour\n *     is ALSO recorded on the account now — `lib/tour` — and the two are read\n *     as one answer: seen here OR seen by this person anywhere.)\n *   • `filex.sidenav`, `filex.inspector`, `filex.tabs`, `filex.showHidden`,\n *     `filex.startpage`, `filex.shortcuts`, `filex.presence.expanded` — window\n *     furniture and this machine's ergonomics, not a look somebody wears.\n *   • `filex.openTrigger`, `filex.desktopHandoff` — in-flight machinery for a\n *     hand-off that may be mid-sign-in right now.\n * `filex.bearer` is already dropped by the auth store, and it lives in\n * sessionStorage besides.\n */\nconst personalMirrors = new Set<string>(Object.values(PREF_LS_KEYS));\n\n/**\n * A module with a per-person key of its own adds it here.\n *\n * ⚠ `lib/themes` registers `filex.thememode` this way rather than having its\n * name repeated in the list above — a second copy of a storage key is exactly\n * the drift `lib/density`' header warns about, where a rename on one side\n * leaves the other writing to a key nobody reads.\n */\nexport function registerPersonalMirror(key: string): void {\n  personalMirrors.add(key);\n}\n\n/**\n * A module whose per-person keys are not one fixed name (lib/menuAnswers keeps\n * one key per person and storage, #196) registers how it forgets them; a\n * sign-out runs it with the rest. It must not throw; if it does, the others\n * still run.\n */\nconst personalForgets = new Set<() => void>();\nexport function registerPersonalForget(forget: () => void): void {\n  personalForgets.add(forget);\n}\n\n/**\n * The session ended: this browser forgets everything it cached ABOUT THE\n * PERSON.\n *\n * Owner, 2026-09-21: *\"oturum kapanınca temizlersek localstorage'ı tamamız ya\n * o kısımda\"* — once somebody has left, their preferences are not something\n * this machine should go on holding.\n *\n * ⚠⚠ It is an \"and\", not an \"instead of\". Clearing only covers the moments\n * the app KNOWS about; it cannot cover a cookie that quietly expired, a tab\n * closed without signing out, or a browser whose owner never signs out at all.\n * `hasSession()` is what covers those, by making the keys unreadable rather\n * than absent. Drop either one and the sign-in page goes back to wearing the\n * last person who used this browser.\n *\n * ⚠ The in-memory document goes too, and the queued PUT with it. Leaving\n * `remote` behind would keep `hasOwnChoice()` answering for somebody who has\n * gone; leaving `pending` behind would fire a write with their values a moment\n * after their cookie stopped existing.\n */\nexport function forgetPersonalPrefs(): void {\n  rememberSession(false);\n  for (const key of personalMirrors) {\n    try {\n      localStorage.removeItem(key);\n    } catch {\n      /* blocked site data — `hasSession()` already makes the key unreadable */\n    }\n  }\n  for (const forget of personalForgets) {\n    try {\n      forget();\n    } catch {\n      /* one module's failure does not keep the others' data */\n    }\n  }\n  remote = {};\n  hydrated = false;\n  pending = {};\n  if (timer !== null) clearTimeout(timer);\n  timer = null;\n  // The answer to \"whose preferences?\" is \"nobody's\": nothing more is coming\n  // for this document until somebody signs in (and `hydratePrefs` runs again).\n  settle();\n}\n\nexport interface PrefsConfig {\n  /** `web`, `desktop`, or whatever a new surface calls itself. */\n  surface: string;\n  /** API origin; empty = same origin. Unset: the base path this document was\n   *  served under (lib/appBase) — `''` at the root. */\n  base?: string;\n  /** Per-call auth, for a host that does not ride on cookies (the desktop app). */\n  headers?: () => Promise<Record<string, string>> | Record<string, string>;\n  fetchImpl?: typeof fetch;\n  /**\n   * ⚠⚠ Does this host have a SIGNED-OUT state at all?\n   *\n   * The filex SPA does: it draws a sign-in page, and the rule this flag turns\n   * on is the owner's (`SESSION_LS_KEY` above) — with nobody signed in, the\n   * palette and the light/dark mode in this browser belong to somebody else\n   * and are not read.\n   *\n   * Most hosts do NOT. An explorer embedded in work.example.com or in the fishapp\n   * is mounted inside a page the host already authenticated; the desktop app\n   * is past its pairing screen. They never call `rememberSession`, they have\n   * no `/api/auth/me` to call, and gating them would mean the palette a person\n   * picked inside the embed silently stopped applying on the next load — a\n   * regression, not a fix.\n   *\n   * ⚠ This is a fact about the HOST, declared once beside `surface` and\n   * `base`, not a branch on which surface is running: there is exactly one\n   * mechanism and every caller goes through it. Default OFF, so a host that\n   * says nothing keeps the behaviour it has always had.\n   */\n  sessionAware?: boolean;\n}\n\nlet cfg: PrefsConfig = { surface: 'web' };\nlet remote: UiPrefs = {};\n/** The server has answered at least once. */\nlet hydrated = false;\n/** A host said where the account's document lives (`configurePrefs`). */\nlet configured = false;\n/**\n * The question \"whose preferences are these?\" has been answered for this\n * document: the server's copy arrived, or the fetch gave up, or the session\n * turned out to be nobody's (`forgetPersonalPrefs`). Something that must not\n * decide before the account has spoken (the first-use tour) waits for this,\n * not for `hydrated` — a fetch that failed never hydrates.\n */\nlet settled = false;\n\nconst listeners = new Set<(p: UiPrefs) => void>();\nconst settleWaiters = new Set<() => void>();\n\nexport function configurePrefs(next: PrefsConfig): void {\n  cfg = { ...next };\n  configured = true;\n}\n\n/**\n * Did the host wire the account's document at all? An explorer embedded in\n * another product never calls `configurePrefs`, and for it there is no account\n * copy to wait for — only this browser's.\n */\nexport function prefsConfigured(): boolean {\n  return configured;\n}\n\n/** See `settled`. */\nexport function prefsSettled(): boolean {\n  return settled;\n}\n\n/** Be told once the account's answer is in (or known not to be coming). Returns the unsubscribe. */\nexport function onPrefsSettled(fn: () => void): () => void {\n  if (settled) {\n    fn();\n    return () => {};\n  }\n  settleWaiters.add(fn);\n  return () => settleWaiters.delete(fn);\n}\n\nfunction settle(): void {\n  settled = true;\n  const waiting = [...settleWaiters];\n  settleWaiters.clear();\n  for (const fn of waiting) {\n    try {\n      fn();\n    } catch {\n      /* one waiter's mistake is not another's */\n    }\n  }\n}\n\n/** The preferences as they stand — the server's answer once it has landed. */\nexport function currentPrefs(): UiPrefs {\n  return { ...remote };\n}\n\nexport function prefsHydrated(): boolean {\n  return hydrated;\n}\n\n/** Be told when the account's answer arrives or changes. Returns the unsubscribe. */\nexport function onPrefs(fn: (p: UiPrefs) => void): () => void {\n  listeners.add(fn);\n  return () => listeners.delete(fn);\n}\n\nfunction announce(): void {\n  const snapshot = currentPrefs();\n  for (const fn of listeners) {\n    try {\n      fn(snapshot);\n    } catch {\n      /* one listener's mistake is not another's */\n    }\n  }\n}\n\n/* ── the first-paint mirror ───────────────────────────────────────────── */\n\n/** What this DEVICE last saw — read before the network, never trusted after it. */\nexport function localPref(key: LookKey): string {\n  try {\n    return localStorage.getItem(PREF_LS_KEYS[key]) ?? '';\n  } catch {\n    // Private window, blocked site data: the caller's own default is the\n    // answer, and a preference is never worth an exception.\n    return '';\n  }\n}\n\nexport function setLocalPref(key: LookKey, value: string): void {\n  try {\n    if (value) localStorage.setItem(PREF_LS_KEYS[key], value);\n    else localStorage.removeItem(PREF_LS_KEYS[key]);\n  } catch {\n    /* see above */\n  }\n}\n\n/** Everything the mirror holds, for the boot that has no server answer yet. */\nexport function localPrefs(): UiPrefs {\n  const out: UiPrefs = {};\n  for (const k of LOOK_KEYS) {\n    const v = localPref(k);\n    if (v) out[k] = v;\n  }\n  return out;\n}\n\n/* ── the account's copy ───────────────────────────────────────────────── */\n\nfunction url(): string {\n  const base = apiRootOr(cfg.base);\n  return `${base}/api/me/prefs?surface=${encodeURIComponent(cfg.surface)}`;\n}\n\nasync function headers(withBody: boolean): Promise<Record<string, string>> {\n  const h: Record<string, string> = { Accept: 'application/json' };\n  if (withBody) h['Content-Type'] = 'application/json';\n  // ⚠ awaited — the desktop app's token is a FUNCTION that resolves\n  // asynchronously, and spreading the promise sends no Authorization at all.\n  const extra = cfg.headers ? await cfg.headers() : {};\n  return { ...h, ...extra };\n}\n\n/**\n * `headers`, without waiting: the page is closing and there is no later turn\n * to resolve a promise in. A host whose token is a function that answers\n * asynchronously (the desktop app) gets cookies-only here; its window is not\n * a browser tab that closes under a pending write.\n */\nfunction headersNow(withBody: boolean): Record<string, string> {\n  const h: Record<string, string> = { Accept: 'application/json' };\n  if (withBody) h['Content-Type'] = 'application/json';\n  const extra = cfg.headers ? cfg.headers() : {};\n  return extra && typeof (extra as Promise<unknown>).then !== 'function' ? { ...h, ...(extra as Record<string, string>) } : h;\n}\n\n/** Only the keys this client knows, only as strings — a server that grows another is ignored, not obeyed. */\nfunction sanitize(raw: unknown): UiPrefs {\n  const src = (raw && typeof raw === 'object' ? raw : {}) as Record<string, unknown>;\n  const body = (src.prefs && typeof src.prefs === 'object' ? src.prefs : src) as Record<string, unknown>;\n  const out: UiPrefs = {};\n  for (const k of PREF_KEYS) {\n    const v = body[k];\n    if (typeof v === 'string' && v) out[k] = v;\n  }\n  return out;\n}\n\n/**\n * Read the account's preferences.\n *\n * Answers `null` when there is nothing to apply — no session, an older\n * server with no such route, a network that is not there. ⚠ `null` is not an\n * error: the mirror has already painted the window, and a preference is the\n * last thing that should put an error in front of a person.\n */\nexport async function hydratePrefs(): Promise<UiPrefs | null> {\n  const doFetch = cfg.fetchImpl ?? (typeof fetch === 'function' ? fetch : null);\n  if (!doFetch) {\n    settle();\n    return null;\n  }\n  // ⚠ A new question is being asked. A sign-out settled the last one with\n  // \"nobody's\" (`forgetPersonalPrefs`), and a person who then signs in on the\n  // sign-in page — no reload — must not be decided for on that stale answer\n  // while their own document is still on its way.\n  settled = false;\n  try {\n    const res = await doFetch(url(), {\n      method: 'GET',\n      headers: await headers(false),\n      credentials: 'same-origin',\n      cache: 'no-store',\n    });\n    if (!res.ok) return null;\n    remote = sanitize(await res.json());\n    hydrated = true;\n    // ⚠⚠ An account that has NEVER stored anything adopts what this browser\n    // already had, instead of wiping it. Every one of these preferences lived\n    // in localStorage alone until v3, so the first load after the upgrade\n    // would otherwise meet an empty document, clear the mirror and hand the\n    // person back the stock palette they had chosen their way out of — a\n    // silent reset that looks exactly like the bug this module was written to\n    // fix. One key already stored is enough to make the ACCOUNT the answer:\n    // somebody who cleared a palette on another device has a document, and\n    // nothing here resurrects what they cleared.\n    if (!Object.keys(remote).length) {\n      const mine = localPrefs();\n      // ⚠⚠ …except the language. The account's language is the SERVER's\n      // (users.locale; one for every surface, #191), and since 0.54 this\n      // browser's copy of it IS the account's: the sign-in writes it into the\n      // first-paint mirror (web i18n applyAccountLocale). Adopting it wrote\n      // the account's own language back to it on every new account's first\n      // page - a PUT the sign-in's navigation (/admin/login -> /drive/) cut\n      // off or sent from pagehide, which hung the browser suites (0.54 full\n      // run 001b652e: Chromium networkidle, a WebKit navigation error). An\n      // account that holds no language is given one by the server at the\n      // sign-in (handlers/auth.go adoptSignInLanguage).\n      delete mine.locale;\n      if (Object.keys(mine).length) {\n        remote = mine;\n        for (const k of LOOK_KEYS) if (mine[k]) pending[k] = mine[k];\n        if (timer !== null) clearTimeout(timer);\n        timer = setTimeout(() => {\n          inFlight = flush();\n        }, PREFS_PUT_DEBOUNCE_MS);\n      }\n    }\n    // The mirror is a cache of THIS answer from here on. ⚠ A document with no\n    // language leaves the language's mirror alone: it then caches the\n    // account's users.locale, written at sign-in (web i18n\n    // applyAccountLocale), and clearing it would paint the next cold load in\n    // the browser's language until the account answers.\n    for (const k of LOOK_KEYS) {\n      if (k === 'locale' && !remote[k]) continue;\n      setLocalPref(k, remote[k] ?? '');\n    }\n    announce();\n    return currentPrefs();\n  } catch {\n    return null;\n  } finally {\n    settle();\n  }\n}\n\nlet pending: UiPrefs = {};\nlet timer: ReturnType<typeof setTimeout> | null = null;\nlet inFlight: Promise<void> | null = null;\n\nasync function flush(leaving = false): Promise<void> {\n  timer = null;\n  const changed = pending;\n  pending = {};\n  if (!Object.keys(changed).length) return;\n  // ⚠⚠ The WHOLE document, wrapped in `{prefs: …}`. `PUT /api/me/prefs`\n  // REPLACES the stored document (handlers/userprefs.go: \"Put replaces the\n  // caller's document for one surface\") — sending only what changed would\n  // drop every other preference the account holds, which is a data loss that\n  // looks like \"my palette reset itself\".\n  const doc = currentPrefs();\n  for (const k of ACCOUNT_KEYS) delete doc[k];\n  const body = { prefs: doc };\n  const doFetch = cfg.fetchImpl ?? (typeof fetch === 'function' ? fetch : null);\n  if (!doFetch) return;\n  const payload = JSON.stringify(body);\n  try {\n    await doFetch(url(), {\n      method: 'PUT',\n      headers: leaving ? headersNow(true) : await headers(true),\n      credentials: 'same-origin',\n      body: payload,\n      // ⚠ Sent while the page is going away: `keepalive` is what lets the\n      // request outlive it. Browsers reject a keepalive body over 64 KB\n      // outright, so the flag goes only on documents that fit.\n      ...(leaving && payload.length < 60000 ? { keepalive: true } : {}),\n    });\n  } catch {\n    /* the change is already on screen and in the mirror; a failed write\n       means the next device does not see it, not that this one breaks */\n  }\n}\n\n/**\n * A preference changed: mirror it now, tell the account shortly.\n *\n * ⚠ The mirror is written FIRST and unconditionally. If the PUT fails, this\n * device still opens the way the person left it — which is exactly the\n * behaviour the product had before the account copy existed.\n */\nexport function savePref(key: PrefKey, value: string): void {\n  remote = { ...remote, [key]: value };\n  // Only a LOOK has a first-paint mirror (PREF_LS_KEYS).\n  if ((LOOK_KEYS as readonly string[]).includes(key)) setLocalPref(key as LookKey, value);\n  pending = { ...pending, [key]: value };\n  if (timer !== null) clearTimeout(timer);\n  timer = setTimeout(() => {\n    inFlight = flush();\n  }, PREFS_PUT_DEBOUNCE_MS);\n}\n\n/**\n * An account key changed (ACCOUNT_KEYS): this page's copy, and whoever\n * listens, now. Nothing is sent - the caller already asked the key's own\n * route (`accountFetch`), and the surface document does not carry it.\n */\nexport function setAccountPref(key: PrefKey, value: string): void {\n  remote = { ...remote, [key]: value };\n  announce();\n}\n\n/**\n * Ask the account's API with this host's address, credentials and fetch -\n * the transport the preferences use, so every surface (the browser, the\n * desktop app, an embed) reaches the same record. `null` when the host has\n * no fetch or the network is not there: an account preference is never\n * worth an exception.\n */\nexport async function accountFetch(path: string, init: { method: string; body?: string }): Promise<Response | null> {\n  const doFetch = cfg.fetchImpl ?? (typeof fetch === 'function' ? fetch : null);\n  if (!doFetch) return null;\n  try {\n    return await doFetch(`${apiRootOr(cfg.base)}${path}`, {\n      method: init.method,\n      headers: await headers(init.body !== undefined),\n      credentials: 'same-origin',\n      body: init.body,\n    });\n  } catch {\n    return null;\n  }\n}\n\n/** Send anything still waiting, now (a window closing, a test). */\nexport async function flushPrefs(): Promise<void> {\n  if (timer !== null) {\n    clearTimeout(timer);\n    inFlight = flush();\n  }\n  await inFlight;\n}\n\n/**\n * The page is being hidden or closed: send what is still inside the debounce\n * window NOW, with `keepalive`. Without this a choice made in the last 400 ms\n * (an app's `state.set`, a palette) never left the browser, and the next\n * open read the account's older answer.\n *\n * ⚠ The timer is cleared by `flush` itself, so the debounce cannot send the\n * same document a second time; with nothing pending this sends nothing.\n */\nexport function flushPrefsOnHide(): void {\n  if (timer === null) return;\n  clearTimeout(timer);\n  inFlight = flush(true);\n}\n\nif (typeof window !== 'undefined') {\n  window.addEventListener('pagehide', flushPrefsOnHide);\n  // The event is fired AT the document.\n  document.addEventListener('visibilitychange', () => {\n    if (document.visibilityState === 'hidden') flushPrefsOnHide();\n  });\n}\n\n/** Testing seam: forget the session's state. */\nexport function resetPrefs(): void {\n  remote = {};\n  hydrated = false;\n  // ⚠ The document seal too. It is per-DOCUMENT state and a test file is one\n  // document: a spec that opened a public link would otherwise leave every\n  // later spec in this file believing it was on one.\n  sealed = false;\n  pending = {};\n  if (timer !== null) clearTimeout(timer);\n  timer = null;\n  inFlight = null;\n  listeners.clear();\n  settled = false;\n  settleWaiters.clear();\n  configured = false;\n}\n","/**\n * appState — what an app's own interface keeps for this person, and which\n * app versions the person has been told about.\n *\n * ⚠ An interface runs on an OPAQUE origin (sandbox without allow-same-origin):\n * localStorage, IndexedDB and cookies throw there, by design — they would be\n * shared by every app, or reach filex's own. So `state.get` / `state.set` over\n * the bridge land here, keyed by the app's name, in the ACCOUNT's preference\n * document (lib/prefs, `appState`), the same place a palette lives: it follows\n * the person to the next browser. Where the host keeps no account document (an\n * embed that wires none), it lasts as long as the page — never in another\n * app's reach either way.\n */\nimport { LIMITS } from '@brftech/filex-app-ui/protocol';\nimport { currentPrefs, savePref } from './prefs';\nimport { serverLimit } from './serverRules';\n\n/**\n * One app's whole store, as JSON bytes: the SERVER's number\n * (`capabilities.limits.app_state_max_bytes`), which PUT /api/me/prefs\n * enforces (handlers/userprefs.go, #211 - it used to live here alone). Said\n * here only so the app hears \"too large\" at once instead of the whole\n * account document being refused; a server that publishes no number holds\n * the document to its own 64 KiB and nothing is checked here.\n */\nfunction appStateMax(): number | undefined {\n  return serverLimit('app_state_max_bytes');\n}\n\nconst utf8 = new TextEncoder();\n\ntype Store = Record<string, Record<string, unknown>>;\n\nfunction read(key: 'appState' | 'appsSeen'): Record<string, unknown> {\n  const raw = currentPrefs()[key];\n  if (!raw) return {};\n  try {\n    const v = JSON.parse(raw);\n    return v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : {};\n  } catch {\n    return {};\n  }\n}\n\n/** The value an app kept under `key`; undefined when none. */\nexport function appStateGet(app: string, key: string): unknown {\n  const mine = (read('appState') as Store)[app];\n  return mine && Object.prototype.hasOwnProperty.call(mine, key) ? mine[key] : undefined;\n}\n\nexport class AppStateTooLarge extends Error {}\n\n/** Keep `value` (JSON) under `key` for this app; undefined removes it. */\nexport function appStateSet(app: string, key: string, value: unknown): void {\n  if (!key || key.length > 128 || key === '__proto__' || key === 'constructor' || key === 'prototype') {\n    throw new AppStateTooLarge('a state key is 1-128 characters');\n  }\n  const encoded = value === undefined ? undefined : JSON.stringify(value);\n  if (encoded !== undefined && encoded.length > LIMITS.maxStateBytes) {\n    throw new AppStateTooLarge(`a state value is at most ${LIMITS.maxStateBytes} bytes as JSON`);\n  }\n  const all = read('appState') as Store;\n  const mine: Record<string, unknown> = { ...(all[app] ?? {}) };\n  if (encoded === undefined) delete mine[key];\n  else mine[key] = JSON.parse(encoded);\n  const max = appStateMax();\n  if (max !== undefined && utf8.encode(JSON.stringify(mine)).length > max) {\n    throw new AppStateTooLarge(`an app keeps at most ${max} bytes`);\n  }\n  const next: Store = { ...all, [app]: mine };\n  if (!Object.keys(mine).length) delete next[app];\n  savePref('appState', JSON.stringify(next));\n}\n\n/** The version of `app` this person was last told about ('' = never). */\nexport function appSeenVersion(app: string): string {\n  const v = read('appsSeen')[app];\n  return typeof v === 'string' ? v : '';\n}\n\n/** Remember that this person has seen `app` at `version`. */\nexport function markAppSeen(app: string, version: string): void {\n  const all = read('appsSeen');\n  if (all[app] === version) return;\n  savePref('appsSeen', JSON.stringify({ ...all, [app]: version }));\n}\n","<script setup lang=\"ts\">\n/**\n * PluginConfirmModal — the question an action's manifest `confirm` text asks\n * before the job is queued. The same small dialog every surface uses\n * (`modals/Modal`), so a plugin's confirmation looks like the trash's.\n */\nimport type { LocaleCode, ThemeMode } from '../../types/ExplorerConfig';\nimport { useLocale } from '../../composables/useLocale';\nimport Modal from '../../modals/Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  theme?: ThemeMode;\n  /** The action's label — the dialog's title. */\n  title: string;\n  /** The manifest's `confirm` text in the viewer's language. */\n  message: string;\n  danger?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'confirm'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n</script>\n\n<template>\n  <Modal\n    :open=\"open\"\n    :title=\"title || t('plugin.confirm.title')\"\n    size=\"sm\"\n    :theme=\"theme\"\n    :locale=\"locale\"\n    @close=\"emit('close')\"\n  >\n    <p data-testid=\"plugin-confirm-message\">{{ message }}</p>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">\n        {{ t('plugin.confirm.cancel') }}\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-btn\"\n        :class=\"danger ? 'fe-btn--danger' : 'fe-btn--primary'\"\n        data-testid=\"plugin-confirm-run\"\n        @click=\"emit('confirm')\"\n      >\n        {{ t('plugin.confirm.run') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * AppFrame — the ONE frame an app's own interface runs in, wherever it is\n * opened: a dialog (`modal`), a tab of its own (`page`), a section of the\n * details panel (`inspector`), the app's home screen (`home`), or a file's\n * viewer (`viewer`). The web app, the desktop app and every embed draw this\n * same component (docs/APP-PLUGINS-API.md → An app's own interface).\n *\n * ⚠⚠ What makes the frame a sandbox, each rule measured in Chrome, Firefox\n * and WebKit before it was written (design report, 2026-09-27):\n *\n *  - The element is built by hand with `sandbox=\"allow-scripts\"` set BEFORE\n *    `src` and before it is in the document. A sandbox added afterwards\n *    applies from the NEXT navigation only: the first document runs with\n *    filex's own origin and reads `sessionStorage['filex.bearer']` (lesson\n *    #635). A template `<iframe :src sandbox>` leaves that order to the\n *    renderer, so it is not used.\n *  - No `allow-same-origin`, ever: with it, an interface served from filex's\n *    own origin IS filex (measured: the bearer read in all three).\n *  - `referrerpolicy=\"no-referrer\"` and no `allow` attribute: no camera, no\n *    microphone, no clipboard, no fullscreen for the frame itself.\n *  - The bridge (lib/appBridge) takes the interface's hello only from THIS\n *    element's window, answers with a MessagePort once, and closes it when\n *    the frame loads a second document. Reloading = a new element.\n *\n * A newer version approved while the frame is open (realtime `app.updated`,\n * lib/appUpdates) is said above the frame with \"Reload\" — which asks about\n * unsaved changes first — and told to the interface (`app.updated`). The\n * first opening after an approval says \"X was updated to 1.3.0\" once per\n * person (account preferences, lib/appState).\n *\n * Every call the interface makes is decided here: what it may read and save\n * (the files it was opened with, the grants it holds, read-only), what it may\n * ask of the module. The server's policy gives the interface no connection\n * of its own (`connect-src 'none'`), no storage and no cookie — ⚠ not a\n * promise that it cannot send anything out: WebRTC ignores a page's policy\n * (closed by Connection-Allowlist in Chrome, by the bootstrap in Firefox;\n * docs/APP-PLUGINS.md → What a sandbox cannot promise).\n *\n * ⚠ `file.saveAs` asks the person for a folder in filex's own dialog — the\n * one Move to… / Copy to… use (modals/DestinationPickerModal) — and THIS\n * frame draws it, so every placement in every host offers save-as the same\n * way. It used to be a prop no host passed: save-as answered `unavailable`\n * everywhere while the documentation promised the dialog (task #149).\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport {\n  BRIDGE_VERSION,\n  LIMITS,\n  type ConfirmParams,\n  type DownloadParams,\n  type EngineCallParams,\n  type FileInfo,\n  type JobSubmitParams,\n  type LicenseInfo,\n  type ReadParams,\n  type SaveAsParams,\n  type SaveParams,\n  type Session,\n  type Theme,\n  type ToastParams,\n} from '@brftech/filex-app-ui/protocol';\nimport type { LocaleCode, ThemeMode } from '../../types/ExplorerConfig';\nimport type { FileApi } from '../../composables/useFileApi';\nimport type { PluginUIRef } from '../../types/Plugins';\nimport { useLocale } from '../../composables/useLocale';\nimport { useSystemDark } from '../../composables/useSystemDark';\nimport { localeDir } from '../../lib/direction';\nimport { createAppBridge, BridgeFailure, type AppBridge } from '../../lib/appBridge';\nimport { appStateGet, appStateSet, AppStateTooLarge, appSeenVersion, markAppSeen } from '../../lib/appState';\nimport { onAppUpdated } from '../../lib/appUpdates';\nimport { labelOf } from '../../lib/pluginLabel';\nimport { parentOfWire } from '../../lib/destinationTree';\nimport { isInternalPath, listingAddress } from '../../lib/internalPaths';\nimport PluginConfirmModal from './PluginConfirmModal.vue';\nimport Modal from '../../modals/Modal.vue';\nimport DestinationPickerModal from '../../modals/DestinationPickerModal.vue';\n\n/** A file the interface was opened with. `path` is adapter-qualified. */\nexport interface AppFrameFile {\n  path: string;\n  name: string;\n  size?: number;\n  mime?: string;\n  /** Cannot be written (read-only storage, view-only opening). */\n  readOnly?: boolean;\n}\n\nconst props = defineProps<{\n  api: FileApi;\n  /** The app (plugin name) and the view the interface draws. */\n  app: string;\n  version?: string;\n  view: string;\n  placement: 'modal' | 'page' | 'inspector' | 'home' | 'viewer';\n  ui: PluginUIRef;\n  /** The files it was opened with (none for a home screen). */\n  files?: AppFrameFile[];\n  /**\n   * Where `file.save` of the first file writes: the file itself, or — for a\n   * draft (issue #71) — the draft the host is editing it as. Absent: the\n   * file's own path.\n   */\n  savePath?: string;\n  /** The whole opening is view-only: nothing may be saved over. */\n  readOnly?: boolean;\n  locale: LocaleCode;\n  theme?: ThemeMode;\n  /** The person, as the interface may know them: a display name only. */\n  userName?: string;\n  /** The frame's accessible name (the view's label). */\n  title?: string;\n  /**\n   * Storage names the save-as dialog may span (`file.saveAs`) — the host's\n   * own list, the one its Move to… / Copy to… offer. Absent: the server's\n   * listing names them.\n   */\n  storages?: string[];\n  /**\n   * Where the save-as dialog opens when the opened file's folder will not do\n   * — no file (a home screen): the folder the person is in; a draft: the\n   * folder it will be saved to. With an ordinary file, the dialog opens in\n   * that file's folder.\n   */\n  startAt?: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'connected'): void;\n  (e: 'dirty', dirty: boolean): void;\n  (e: 'title', text: string): void;\n  (e: 'toast', t: { text: string; tone: NonNullable<ToastParams['tone']> }): void;\n  (e: 'close'): void;\n  (e: 'saved', r: { path: string; size: number; index: number }): void;\n  (e: 'saved-as', r: { path: string; name: string; size: number }): void;\n  (e: 'op', op: Record<string, unknown>): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst systemDark = useSystemDark();\nconst host = ref<HTMLElement | null>(null);\nlet frame: HTMLIFrameElement | null = null;\nlet bridge: AppBridge | null = null;\nconst connected = ref(false);\n/** The interface said it holds changes that are not saved (`ui.dirty`). */\nconst dirty = ref(false);\n/** The unsaved-changes question, while it is on screen. */\nconst closeAsk = ref<((v: 'save' | 'discard' | 'keep') => void) | null>(null);\nconst closeBusy = ref(false);\n/** Bumped to replace the element (a reload): one bridge per element. */\nconst generation = ref(0);\n/** The interface's newer address after \"Reload\" on an approved version. */\nconst liveUI = ref<PluginUIRef | null>(null);\n/** What is open: the newer interface once reloaded to it, else the one given. */\nconst current = computed<PluginUIRef>(() => liveUI.value ?? props.ui);\n/** A newer version approved while this frame is open (\"\" = none). */\nconst newer = ref('');\n/** \"Updated to\" said once per person, on the first opening after an approval. */\nconst updatedNote = ref('');\n\nconst src = computed(() => props.api.appUIUrl(current.value.url));\nconst grants = computed(() => new Set(current.value.grants ?? []));\nconst appVersion = computed(() => liveUI.value?.version || props.version || props.ui.version || '');\nconst mode = computed<'light' | 'dark'>(() =>\n  props.theme === 'dark' || (props.theme !== 'light' && systemDark.value) ? 'dark' : 'light',\n);\n\n/** The `--fe-*` tokens the interface is handed, as the explorer resolves them here. */\nconst TOKENS = [\n  '--fe-bg', '--fe-bg-elev', '--fe-bg-hover', '--fe-bg-selected',\n  '--fe-border', '--fe-border-soft', '--fe-border-strong',\n  '--fe-text', '--fe-text-muted', '--fe-text-on-primary',\n  '--fe-primary', '--fe-primary-hover', '--fe-primary-soft', '--fe-primary-ink',\n  '--fe-danger', '--fe-danger-hover', '--fe-warning', '--fe-ok',\n  '--fe-radius', '--fe-radius-sm', '--fe-radius-md', '--fe-radius-lg',\n  '--fe-font', '--fe-font-mono', '--fe-text-xs', '--fe-text-sm', '--fe-text-md',\n  '--fe-shadow', '--fe-shadow-sm',\n];\n\nfunction themeInfo(): Theme {\n  const tokens: Record<string, string> = {};\n  if (host.value && typeof getComputedStyle === 'function') {\n    const cs = getComputedStyle(host.value);\n    for (const k of TOKENS) {\n      const v = cs.getPropertyValue(k).trim();\n      if (v) tokens[k] = v;\n    }\n  }\n  return { mode: mode.value, tokens };\n}\n\nfunction extOf(name: string): string {\n  const i = name.lastIndexOf('.');\n  return i > 0 ? name.slice(i + 1).toLowerCase() : '';\n}\n\nfunction fileInfos(): FileInfo[] {\n  const writable = grants.value.has('files:write') && !props.readOnly;\n  return (props.files ?? []).map((f, index) => ({\n    index,\n    name: f.name,\n    ext: extOf(f.name),\n    size: f.size ?? 0,\n    mime: f.mime ?? '',\n    readOnly: !writable || !!f.readOnly,\n  }));\n}\n\nfunction session(): Session {\n  return {\n    v: BRIDGE_VERSION,\n    app: { name: props.app, version: appVersion.value },\n    view: { id: props.view, placement: props.placement },\n    locale: props.locale,\n    dir: localeDir(props.locale),\n    theme: themeInfo(),\n    user: { name: props.userName ?? '' },\n    files: fileInfos(),\n    grants: [...grants.value],\n  };\n}\n\nfunction need(grant: string) {\n  if (!grants.value.has(grant)) throw new BridgeFailure('not_granted', `this app was not granted ${grant}`);\n}\n\nfunction fileAt(index: unknown): AppFrameFile {\n  const i = typeof index === 'number' ? index : 0;\n  const f = (props.files ?? [])[i];\n  if (!Number.isInteger(i) || !f) throw new BridgeFailure('not_found', `no file at ${String(index)}`);\n  return f;\n}\n\n/**\n * What a save hands us, as a body the API sends: a string or bytes as a Blob,\n * a stream AS A STREAM — the API sends it in chunks as it is read, so a large\n * document never sits whole in this page.\n */\nasync function toBody(data: unknown, mime?: string): Promise<Blob | ReadableStream<Uint8Array>> {\n  const type = typeof mime === 'string' && mime.length < 200 ? mime : '';\n  if (typeof data === 'string') return new Blob([data], { type: type || 'text/plain;charset=utf-8' });\n  if (data instanceof ArrayBuffer) return new Blob([data], { type });\n  if (typeof ReadableStream !== 'undefined' && data instanceof ReadableStream) return data as ReadableStream<Uint8Array>;\n  throw new BridgeFailure('invalid', 'save takes a string, an ArrayBuffer or a ReadableStream');\n}\n\n/* ── the bridge's methods: every decision is made here ─────────────────── */\n\nconst confirmAsk = ref<(ConfirmParams & { resolve: (v: boolean) => void }) | null>(null);\n\n/**\n * Who is speaking, in the words filex puts around what an app says (a toast,\n * a question, a request for consent): the view's label, with the app's\n * installed name when the label does not already say it — a label cannot\n * pass itself off as filex (security review UI-14).\n */\nconst who = computed(() => {\n  const label = (props.title || '').trim();\n  if (!label) return props.app;\n  return label.toLowerCase().includes(props.app.toLowerCase()) ? label : `${label} (${props.app})`;\n});\n\n/**\n * What only the PERSON may start (security review UI-5, UI-10, and a\n * download): a job, a copy to the clipboard. On a gesture — the person\n * clicked or typed in the frame a moment ago, which the browser tells this\n * page too (`navigator.userActivation`) — it goes ahead; one gesture stands\n * for ONE such call. Otherwise filex asks, above the frame and in its own\n * words, naming the app; \"no\" is `cancelled`.\n */\nconst consentAsk = ref<{ text: string; resolve: (v: boolean) => void } | null>(null);\n/** A browser's transient activation lasts about this long (Chrome, Firefox). */\nconst GESTURE_MS = 5000;\nlet gestureSpentAt = Number.NEGATIVE_INFINITY;\n/**\n * When the person last acted on filex's OWN page — a click, a key, a touch.\n * The browser tells this page about those and never about the frame's, and\n * the activation they give is NOT a gesture in the interface: measured\n * 2026-09-27 (Chrome, Firefox), the double-click that opened an app left the\n * page active long enough for the app to fill the clipboard at once, without\n * a question. So an activation within GESTURE_MS of one of filex's own\n * gestures does not count — and at mount, an activation already live is the\n * one that opened the app.\n */\nlet hostGestureAt = Number.NEGATIVE_INFINITY;\n\nfunction activationLive(): boolean {\n  const ua = typeof navigator !== 'undefined' ? (navigator as Navigator & { userActivation?: { isActive?: boolean } }).userActivation : undefined;\n  return !!ua?.isActive;\n}\n\nfunction onHostGesture(): void {\n  hostGestureAt = Date.now();\n}\n\nfunction gestureNow(): boolean {\n  if (!activationLive()) return false;\n  const now = Date.now();\n  if (now - gestureSpentAt < GESTURE_MS || now - hostGestureAt < GESTURE_MS) return false;\n  gestureSpentAt = now;\n  return true;\n}\n\nasync function consent(text: string): Promise<void> {\n  if (gestureNow()) return;\n  await askConsent(text);\n}\n\n/**\n * \"Allow\" answers only once the question has been on screen a moment. The\n * app decides WHEN it asks, so it can ask right under a click it invited\n * (\"double-click here\"): the second click would land on a button that\n * appeared beneath it. And the row pushes the frame down, which Chromium's\n * hit-testing follows a frame late (measured 2026-09-27: a click at once\n * went to the frame, not the row). So Allow is disabled for CONSENT_ARM_MS;\n * \"Don't allow\" never is.\n */\nconst CONSENT_ARM_MS = 600;\nconst consentArmed = ref(false);\nlet consentArmTimer: ReturnType<typeof setTimeout> | null = null;\n\nasync function askConsent(text: string): Promise<void> {\n  if (consentAsk.value) throw new BridgeFailure('unavailable', 'a question is already on screen');\n  consentArmed.value = false;\n  if (consentArmTimer) clearTimeout(consentArmTimer);\n  consentArmTimer = setTimeout(() => {\n    consentArmed.value = true;\n  }, CONSENT_ARM_MS);\n  const yes = await new Promise<boolean>((resolve) => {\n    consentAsk.value = { text, resolve };\n  });\n  if (!yes) throw new BridgeFailure('cancelled');\n}\n\n/* The consent row's sentences, one function each so the key stays a literal\n * the catalogue checks can find, and none is built once at setup. */\nfunction clipboardQuestion(): string {\n  return t('appframe.consent_clipboard', { app: who.value });\n}\nfunction jobQuestion(action: string): string {\n  return t('appframe.consent_job', { app: who.value, action });\n}\nfunction downloadQuestion(name: string): string {\n  return t('appframe.consent_download', { app: who.value, name });\n}\n\nfunction answerConsent(yes: boolean) {\n  if (yes && !consentArmed.value) return;\n  const q = consentAsk.value;\n  consentAsk.value = null;\n  if (consentArmTimer) clearTimeout(consentArmTimer);\n  consentArmTimer = null;\n  q?.resolve(yes);\n}\n\n/* ── ui.download: a file for the person's own disk ──────────────────── */\n\n/** A name for the person's disk: a leaf — nothing that is a path. */\nfunction downloadName(v: unknown): string {\n  const name = typeof v === 'string' ? v.trim() : '';\n  if (!name || name.length > 255 || name === '.' || name === '..' || /[\\\\/\\u0000-\\u001f]/.test(name)) {\n    throw new BridgeFailure('invalid', 'name is a file name, without a folder');\n  }\n  return name;\n}\n\nfunction tooLarge(): BridgeFailure {\n  return new BridgeFailure('too_large', `at most ${LIMITS.maxDownloadBytes >> 20} MiB`);\n}\n\n/** The data as byte chunks, whatever it came as; a stream is read as it is\n *  used, and let go of (cancelled) when the reading stops early. */\nasync function* chunksOf(data: string | ArrayBuffer | ReadableStream<Uint8Array>): AsyncGenerator<Uint8Array> {\n  if (typeof data === 'string') {\n    yield new TextEncoder().encode(data);\n    return;\n  }\n  if (data instanceof ArrayBuffer) {\n    yield new Uint8Array(data);\n    return;\n  }\n  const reader = data.getReader();\n  let done = false;\n  try {\n    for (;;) {\n      const r = await reader.read();\n      if (r.done) {\n        done = true;\n        return;\n      }\n      if (r.value) yield r.value;\n    }\n  } finally {\n    if (!done) await reader.cancel().catch(() => undefined);\n  }\n}\n\ntype SaveFilePicker = (o: { suggestedName: string }) => Promise<{\n  createWritable(): Promise<{ write(c: Uint8Array): Promise<void>; close(): Promise<void>; abort?(): Promise<void> }>;\n}>;\n\n/**\n * Hand the file to the person's disk. Where the browser has File System\n * Access (Chromium) the bytes are streamed into the file the person picks —\n * never whole in this page; elsewhere (or where the picker is refused here: a\n * frame of another site) they become a Blob the browser downloads. Either\n * way nothing past LIMITS.maxDownloadBytes is written.\n */\nasync function saveToDisk(name: string, data: string | ArrayBuffer | ReadableStream<Uint8Array>, type: string) {\n  const picker = (window as unknown as { showSaveFilePicker?: SaveFilePicker }).showSaveFilePicker;\n  if (typeof picker === 'function') {\n    let handle: Awaited<ReturnType<SaveFilePicker>> | null = null;\n    try {\n      handle = await picker.call(window, { suggestedName: name });\n    } catch (e) {\n      if ((e as DOMException)?.name === 'AbortError') throw new BridgeFailure('cancelled');\n      handle = null; // not offered here: the Blob below\n    }\n    if (handle) {\n      const w = await handle.createWritable();\n      let size = 0;\n      try {\n        for await (const chunk of chunksOf(data)) {\n          size += chunk.byteLength;\n          if (size > LIMITS.maxDownloadBytes) throw tooLarge();\n          await w.write(chunk);\n        }\n      } catch (e) {\n        await w.abort?.().catch(() => undefined);\n        throw e;\n      }\n      await w.close();\n      return { saved: true as const, size };\n    }\n  }\n  const parts: Uint8Array[] = [];\n  let size = 0;\n  for await (const chunk of chunksOf(data)) {\n    size += chunk.byteLength;\n    if (size > LIMITS.maxDownloadBytes) throw tooLarge();\n    parts.push(chunk);\n  }\n  const url = URL.createObjectURL(new Blob(parts as BlobPart[], { type }));\n  const a = document.createElement('a');\n  a.href = url;\n  a.download = name;\n  a.rel = 'noopener';\n  a.style.display = 'none';\n  document.body.appendChild(a);\n  try {\n    a.click();\n  } finally {\n    a.remove();\n    setTimeout(() => URL.revokeObjectURL(url), 60_000);\n  }\n  return { saved: true as const, size };\n}\n\n/* ── file.saveAs: a new file, in a folder the person picks ────────────── */\n\n/**\n * The save-as question while it is on screen: filex's own folder dialog\n * (modals/DestinationPickerModal — the one Move to… / Copy to… use, not a\n * second private browser), titled with the app's name and the file's. One\n * at a time, like every question an interface can raise.\n */\nconst saveAsAsk = ref<{ name: string; storages: string[]; startAt?: string; resolve: (dir: string | null) => void } | null>(null);\n/** From the call to the dialog (the storages may still be on their way). */\nlet saveAsPending = false;\n/** The person's storages as the server's listing names them, once asked. */\nlet learnedStorages: string[] | null = null;\n\n/**\n * Where the dialog opens: the folder of the file the interface was opened\n * with, else the folder the host names (`startAt`).\n *\n * ⚠ A draft (issue #71) and a desktop open-with copy live in filex's OWN\n * folders (`.filex-drafts/…`, `.filex-open`), which a person is never shown\n * and never writes into: the dialog opens where the host says instead (a\n * draft's own folder-to-be), else at that storage's root.\n */\nfunction saveAsStart(): string | undefined {\n  const first = props.files?.[0]?.path ?? '';\n  const own = first.includes('://') ? (parentOfWire(first, false) ?? '') : '';\n  if (own && !isInternalPath(own)) return own;\n  const host = props.startAt ?? '';\n  if (host.includes('://') && !isInternalPath(host)) return host;\n  return own ? listingAddress(own) : undefined;\n}\n\n/**\n * The storages the dialog may span: the host's own list when it gave one\n * (what its Move to… offers), else the ones the server's listing names —\n * a host without the list (the viewer, an app's page) offers the same.\n */\nasync function saveAsStorages(start: string | undefined): Promise<string[]> {\n  if (props.storages?.length) return props.storages;\n  if (learnedStorages) return learnedStorages;\n  try {\n    const r = await props.api.index(start ?? '');\n    learnedStorages = Array.isArray(r?.storages) ? r.storages.filter((s) => typeof s === 'string' && !!s) : [];\n    return learnedStorages;\n  } catch {\n    return [];\n  }\n}\n\n/** Ask the person for a folder; null when they closed the dialog. */\nasync function askFolder(name: string): Promise<string | null> {\n  if (saveAsPending || saveAsAsk.value) throw new BridgeFailure('unavailable', 'a question is already on screen');\n  saveAsPending = true;\n  try {\n    const startAt = saveAsStart();\n    const storages = await saveAsStorages(startAt);\n    if (!startAt && !storages.length) throw new BridgeFailure('unavailable', 'there is no folder to save into here');\n    return await new Promise<string | null>((resolve) => {\n      saveAsAsk.value = { name, storages, startAt, resolve };\n    });\n  } finally {\n    saveAsPending = false;\n  }\n}\n\nfunction answerSaveAs(dir: string | null) {\n  const q = saveAsAsk.value;\n  saveAsAsk.value = null;\n  q?.resolve(dir);\n}\n\n/* The dialog's title: who asks, and for which file (security review UI-14). */\nfunction saveAsTitle(name: string): string {\n  return t('appframe.save_as_title', { app: who.value, name });\n}\n\n/** A stream the interface handed over and nothing will read: let it go. */\nasync function release(body: Blob | ReadableStream<Uint8Array>): Promise<void> {\n  if (typeof ReadableStream !== 'undefined' && body instanceof ReadableStream) await body.cancel().catch(() => undefined);\n}\n\n/** An action's label, for the question; its id when the list cannot say. */\nasync function actionLabel(id: string): Promise<string> {\n  try {\n    const list = await props.api.pluginActions();\n    const a = list.actions.find((x) => x.plugin === props.app && x.id === id);\n    const label = a ? labelOf(a.label, props.locale) : '';\n    if (label) return label;\n  } catch {\n    /* no list: the id */\n  }\n  return id;\n}\n\nconst handlers = {\n  'session.get': () => session(),\n\n  async 'file.read'(params: unknown) {\n    need('files:read');\n    const p = (params ?? {}) as ReadParams;\n    const f = fileAt(p.index);\n    // Through the server's own door for an interface (#211, audit B19): it\n    // checks the grant and the kind again, as it does for a save. A host api\n    // without it (an older embed) reads the preview as before.\n    const read = props.api.pluginUIRead;\n    const res = typeof read === 'function'\n      ? await read(props.app, props.view, f.path)\n      : await props.api.fetchResponse(f.path);\n    const size = Number(res.headers.get('content-length') ?? f.size ?? 0) || (f.size ?? 0);\n    const mime = f.mime || res.headers.get('content-type') || '';\n    const out = { name: f.name, size, mime };\n    switch (p.as ?? 'stream') {\n      case 'text': {\n        if (size > LIMITS.maxTextBytes) throw new BridgeFailure('too_large', 'read a file this large as a stream');\n        return { ...out, text: await res.text() };\n      }\n      case 'bytes':\n        return { ...out, bytes: await res.arrayBuffer() };\n      case 'stream':\n        if (!res.body) return { ...out, bytes: await res.arrayBuffer() };\n        return { ...out, stream: res.body };\n      default:\n        throw new BridgeFailure('invalid', 'as is stream, bytes or text');\n    }\n  },\n\n  async 'file.save'(params: unknown) {\n    need('files:write');\n    const p = (params ?? {}) as SaveParams;\n    const index = typeof p.index === 'number' ? p.index : 0;\n    const f = fileAt(index);\n    if (props.readOnly || f.readOnly) throw new BridgeFailure('read_only', 'this file cannot be saved over here');\n    const body = await toBody(p.data, p.mime);\n    const target = index === 0 && props.savePath ? props.savePath : f.path;\n    const r = await props.api.pluginUISave(props.app, props.view, { path: target }, body);\n    emit('saved', { path: r.path || target, size: r.size, index });\n    // Saved: whatever the interface held is on the storage now. It says\n    // `dirty(true)` again with its next change.\n    dirty.value = false;\n    emit('dirty', false);\n    return { saved: true, size: r.size };\n  },\n\n  async 'file.saveAs'(params: unknown) {\n    need('files:write');\n    const p = (params ?? {}) as SaveAsParams;\n    const name = typeof p.name === 'string' ? p.name.trim() : '';\n    if (!name || name.includes('/') || name.includes('\\\\') || name === '.' || name === '..' || name.length > 255) {\n      throw new BridgeFailure('invalid', 'name is a file name, without a folder');\n    }\n    const body = await toBody(p.data, p.mime);\n    let dir: string | null;\n    try {\n      dir = await askFolder(name);\n    } catch (e) {\n      await release(body);\n      throw e;\n    }\n    if (!dir) {\n      await release(body);\n      throw new BridgeFailure('cancelled');\n    }\n    const r = await props.api.pluginUISave(props.app, props.view, { dir, name }, body);\n    emit('saved-as', { path: r.path, name: r.name, size: r.size });\n    return { saved: true, name: r.name, size: r.size };\n  },\n\n  'ui.dirty'(params: unknown) {\n    dirty.value = !!(params as { dirty?: boolean } | null)?.dirty;\n    emit('dirty', dirty.value);\n    return null;\n  },\n\n  'ui.title'(params: unknown) {\n    const text = String((params as { text?: unknown } | null)?.text ?? '').slice(0, LIMITS.maxLineChars);\n    emit('title', text);\n    return null;\n  },\n\n  'ui.toast'(params: unknown) {\n    const p = (params ?? {}) as ToastParams;\n    const tone = p.tone === 'success' || p.tone === 'warning' || p.tone === 'error' ? p.tone : 'info';\n    emit('toast', { text: `${who.value}: ${String(p.text ?? '').slice(0, LIMITS.maxLineChars)}`, tone });\n    return null;\n  },\n\n  'ui.confirm'(params: unknown) {\n    const p = (typeof params === 'object' && params ? params : {}) as ConfirmParams;\n    if (confirmAsk.value) throw new BridgeFailure('unavailable', 'a question is already on screen');\n    return new Promise<boolean>((resolve) => {\n      confirmAsk.value = {\n        text: String(p.text ?? '').slice(0, 1000),\n        title: p.title ? String(p.title).slice(0, LIMITS.maxLineChars) : undefined,\n        danger: !!p.danger,\n        resolve,\n      };\n    });\n  },\n\n  'ui.close'() {\n    emit('close');\n    return null;\n  },\n\n  async 'clipboard.write'(params: unknown) {\n    const text = String((params as { text?: unknown } | null)?.text ?? '');\n    if (text.length > 1 << 20) throw new BridgeFailure('too_large', 'at most 1 MiB of text');\n    if (typeof navigator === 'undefined' || !navigator.clipboard?.writeText) {\n      throw new BridgeFailure('unavailable', 'this browser offers no clipboard here');\n    }\n    // On a gesture in the frame the page writes at once — except where the\n    // browser wants the gesture in THIS document (WebKit, measured: the\n    // write is refused): then the person is asked, and their click on\n    // Allow is the gesture.\n    if (gestureNow()) {\n      try {\n        await navigator.clipboard.writeText(text);\n        return null;\n      } catch (e) {\n        if ((e as DOMException)?.name !== 'NotAllowedError') throw e;\n      }\n    }\n    await askConsent(clipboardQuestion());\n    await navigator.clipboard.writeText(text);\n    return null;\n  },\n\n  async 'ui.download'(params: unknown) {\n    need('ui:download');\n    const p = (params ?? {}) as DownloadParams;\n    const name = downloadName(p.name);\n    const data = p.data as unknown;\n    const isStream = typeof ReadableStream !== 'undefined' && data instanceof ReadableStream;\n    if (typeof data !== 'string' && !(data instanceof ArrayBuffer) && !isStream) {\n      throw new BridgeFailure('invalid', 'download takes a string, an ArrayBuffer or a ReadableStream');\n    }\n    const known = typeof data === 'string' ? new Blob([data]).size : data instanceof ArrayBuffer ? data.byteLength : 0;\n    if (known > LIMITS.maxDownloadBytes) throw tooLarge();\n    const type = typeof p.mime === 'string' && /^[\\w.+-]+\\/[\\w.+-]+$/.test(p.mime) ? p.mime : 'application/octet-stream';\n    try {\n      await consent(downloadQuestion(name));\n    } catch (e) {\n      if (isStream) await (data as ReadableStream).cancel().catch(() => undefined);\n      throw e;\n    }\n    return saveToDisk(name, data as string | ArrayBuffer | ReadableStream<Uint8Array>, type);\n  },\n\n  async 'engine.call'(params: unknown) {\n    if (!current.value.engine) throw new BridgeFailure('unavailable', 'this app has no module');\n    const p = (params ?? {}) as EngineCallParams;\n    if (typeof p.method !== 'string' || !p.method) throw new BridgeFailure('invalid', 'method is required');\n    const r = await props.api.pluginUICall(props.app, props.view, {\n      method: p.method,\n      params: p.params,\n      paths: (props.files ?? []).map((f) => f.path),\n    });\n    return r.result;\n  },\n\n  async 'job.submit'(params: unknown) {\n    if (!current.value.engine) throw new BridgeFailure('unavailable', 'this app has no module');\n    const p = (params ?? {}) as JobSubmitParams;\n    if (typeof p.action !== 'string' || !p.action) throw new BridgeFailure('invalid', 'action is required');\n    if (!gestureNow()) await askConsent(jobQuestion(await actionLabel(p.action)));\n    const r = await props.api.pluginActionRun(props.app, p.action, {\n      paths: (props.files ?? []).map((f) => f.path),\n      params: p.params && typeof p.params === 'object' ? p.params : {},\n    });\n    const op = (r as { op?: Record<string, unknown> }).op;\n    if (!op) throw new BridgeFailure('failed', 'nothing was queued');\n    emit('op', op);\n    return { op };\n  },\n\n  'state.get'(params: unknown) {\n    const key = String((params as { key?: unknown } | null)?.key ?? '');\n    return appStateGet(props.app, key) ?? null;\n  },\n\n  /**\n   * 0.52.0: what the app's license says (`LicenseInfo`) - the status, and for a\n   * valid license its dates. filex keeps the key and the licensee's name; the\n   * app sees neither (only these three fields cross the bridge, whatever the\n   * server answers). A free app reads `{status: \"free\"}`.\n   */\n  async 'license.get'() {\n    const r = await props.api.pluginLicense(props.app);\n    const out: LicenseInfo = { status: String(r.status ?? 'free') };\n    if (r.valid_until) out.valid_until = r.valid_until;\n    if (r.updates_until) out.updates_until = r.updates_until;\n    return out;\n  },\n\n  'state.set'(params: unknown) {\n    const p = (params ?? {}) as { key?: unknown; value?: unknown };\n    try {\n      appStateSet(props.app, String(p.key ?? ''), p.value);\n    } catch (e) {\n      if (e instanceof AppStateTooLarge) throw new BridgeFailure('too_large', e.message);\n      throw e;\n    }\n    return null;\n  },\n};\n\nfunction answerConfirm(yes: boolean) {\n  const q = confirmAsk.value;\n  confirmAsk.value = null;\n  q?.resolve(yes);\n}\n\n/* ── the element ────────────────────────────────────────────────────── */\n\n/**\n * Build the frame: the sandbox, the referrer policy and the title first, the\n * address last, and only then into the document. The ORDER is the security\n * (see the file's header) — tests read it back.\n */\nfunction buildFrame(): HTMLIFrameElement {\n  const f = document.createElement('iframe');\n  f.setAttribute('sandbox', 'allow-scripts');\n  f.setAttribute('referrerpolicy', 'no-referrer');\n  f.setAttribute('title', props.title || props.app);\n  f.className = 'fe-appframe__frame';\n  f.dataset.testid = 'app-frame';\n  f.setAttribute('src', src.value);\n  return f;\n}\n\nfunction mount() {\n  unmount();\n  if (!host.value) return;\n  const f = buildFrame();\n  const b = createAppBridge({\n    frame: () => f,\n    handlers,\n    onConnect: () => {\n      connected.value = true;\n      emit('connected');\n    },\n    onDisconnect: () => {\n      connected.value = false;\n    },\n  });\n  f.addEventListener('load', () => b.frameLoaded());\n  frame = f;\n  bridge = b;\n  host.value.appendChild(f);\n}\n\nfunction unmount() {\n  bridge?.destroy();\n  bridge = null;\n  if (frame) {\n    frame.remove();\n    frame = null;\n  }\n  connected.value = false;\n  dirty.value = false;\n  if (confirmAsk.value) answerConfirm(false);\n  if (consentAsk.value) answerConsent(false);\n  if (closeAsk.value) answerClose('keep');\n  if (saveAsAsk.value) answerSaveAs(null);\n}\n\nlet offUpdated: (() => void) | null = null;\n\nconst HOST_GESTURES = ['pointerdown', 'keydown', 'touchstart'] as const;\n\nonMounted(() => {\n  if (activationLive()) hostGestureAt = Date.now();\n  for (const ev of HOST_GESTURES) window.addEventListener(ev, onHostGesture, true);\n  mount();\n  offUpdated = onAppUpdated((app, version) => {\n    if (app !== props.app || !version || version === appVersion.value) return;\n    newer.value = version;\n    notifyUpdated(version);\n  });\n  // Said once per person: the first opening after the version they last saw.\n  const v = appVersion.value;\n  if (v) {\n    const seen = appSeenVersion(props.app);\n    if (seen && seen !== v) updatedNote.value = v;\n    if (seen !== v) markAppSeen(props.app, v);\n  }\n});\nonBeforeUnmount(() => {\n  for (const ev of HOST_GESTURES) window.removeEventListener(ev, onHostGesture, true);\n  offUpdated?.();\n  offUpdated = null;\n  unmount();\n});\nwatch([src, generation], () => mount());\n// A parent that hands a different interface wins over a reload's.\nwatch(\n  () => props.ui,\n  () => {\n    liveUI.value = null;\n  },\n);\n\n// The look and the language follow the explorer while the frame is open.\nwatch(mode, () => bridge?.emit('theme', themeInfo()));\nwatch(\n  () => props.locale,\n  (l) => bridge?.emit('locale', { locale: l, dir: localeDir(l) }),\n);\n\n/**\n * Ask the interface to save (the host's Save, a draft's \"Save to disk\"):\n * resolves true once it saved, false when it has nothing to save with or\n * refused. Never throws.\n */\nasync function requestSave(): Promise<boolean> {\n  if (!bridge || !connected.value) return false;\n  try {\n    await bridge.ask('save');\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * May the frame's surroundings close? True at once when nothing is unsaved;\n * otherwise the person is asked — save and close (the interface saves\n * through the bridge first; a failed save keeps it open), close without\n * saving, or keep editing. Every placement's close goes through here, so the\n * question is the same in a dialog, a tab and the viewer.\n */\nasync function confirmClose(): Promise<boolean> {\n  if (!dirty.value || !connected.value) {\n    notifyClosing();\n    return true;\n  }\n  const answer = await new Promise<'save' | 'discard' | 'keep'>((resolve) => {\n    closeAsk.value = resolve;\n  });\n  if (answer === 'keep') return false;\n  if (answer === 'save') {\n    closeBusy.value = true;\n    try {\n      if (!(await requestSave())) return false;\n    } finally {\n      closeBusy.value = false;\n    }\n  }\n  notifyClosing();\n  return true;\n}\n\nfunction answerClose(v: 'save' | 'discard' | 'keep') {\n  const r = closeAsk.value;\n  closeAsk.value = null;\n  r?.(v);\n}\n\n/** A new version of the app was approved: tell the interface. */\nfunction notifyUpdated(version: string) {\n  bridge?.emit('app.updated', { version });\n}\n\n/** Tell the interface its surroundings are closing. */\nfunction notifyClosing() {\n  bridge?.emit('close.request');\n}\n\n/** Replace the frame with a fresh one (a reload: one bridge per element). */\nfunction reload() {\n  generation.value++;\n}\n\n/**\n * \"Reload\" on a newer approved version: unsaved changes are asked about\n * first (the same question as closing), then the frame opens the newer\n * interface — its address comes from the server's list, which carries the\n * new bundle's hash.\n */\nasync function reloadNewer() {\n  if (!(await confirmClose())) return;\n  const version = newer.value;\n  let next: PluginUIRef | null = null;\n  try {\n    const list = await props.api.pluginActions();\n    next =\n      list.views.find((v) => v.plugin === props.app && v.id === props.view && v.ui)?.ui ??\n      list.actions.find((a) => a.plugin === props.app && a.view === props.view && a.ui)?.ui ??\n      null;\n  } catch {\n    /* no list: reload what is open */\n  }\n  newer.value = '';\n  updatedNote.value = '';\n  if (next) {\n    liveUI.value = next;\n    markAppSeen(props.app, next.version || version);\n  }\n  reload();\n}\n\nfunction dismissNote() {\n  newer.value = '';\n  updatedNote.value = '';\n}\n\ndefineExpose({ requestSave, confirmClose, notifyUpdated, notifyClosing, reload, reloadNewer, connected, dirty });\n</script>\n\n<template>\n  <div\n    ref=\"host\"\n    class=\"fe-appframe\"\n    :class=\"`fe-appframe--${placement}`\"\n    :data-app=\"app\"\n    :data-connected=\"connected ? 'true' : 'false'\"\n  >\n    <div v-if=\"newer || updatedNote\" class=\"fe-appframe__note\" role=\"status\" data-testid=\"appframe-updated\">\n      <span class=\"fe-appframe__note-text\">\n        {{ newer ? t('appframe.updated_reload', { app: title || app }) : t('appframe.updated', { app: title || app, version: updatedNote }) }}\n      </span>\n      <button v-if=\"newer\" type=\"button\" class=\"fe-btn fe-btn--primary\" data-testid=\"appframe-reload\" @click=\"reloadNewer\">\n        {{ t('appframe.reload') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn\" data-testid=\"appframe-dismiss\" @click=\"dismissNote\">\n        {{ t('appframe.dismiss') }}\n      </button>\n    </div>\n    <div\n      v-if=\"consentAsk\"\n      class=\"fe-appframe__note fe-appframe__consent\"\n      role=\"alertdialog\"\n      aria-live=\"assertive\"\n      data-testid=\"appframe-consent\"\n    >\n      <span class=\"fe-appframe__note-text\">{{ consentAsk.text }}</span>\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        data-testid=\"appframe-consent-allow\"\n        :disabled=\"!consentArmed\"\n        @click=\"answerConsent(true)\"\n      >\n        {{ t('appframe.consent_allow') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn\" data-testid=\"appframe-consent-deny\" @click=\"answerConsent(false)\">\n        {{ t('appframe.consent_deny') }}\n      </button>\n    </div>\n    <PluginConfirmModal\n      v-if=\"confirmAsk\"\n      :open=\"true\"\n      :locale=\"locale\"\n      :theme=\"theme\"\n      :title=\"`${who}: ${confirmAsk.title || t('appframe.confirm_title')}`\"\n      :message=\"confirmAsk.text\"\n      :danger=\"confirmAsk.danger\"\n      @close=\"answerConfirm(false)\"\n      @confirm=\"answerConfirm(true)\"\n    />\n    <Modal\n      v-if=\"closeAsk\"\n      :open=\"true\"\n      size=\"sm\"\n      :locale=\"locale\"\n      :theme=\"theme\"\n      :busy=\"closeBusy\"\n      :title=\"t('appframe.unsaved_title')\"\n      @close=\"answerClose('keep')\"\n    >\n      <p data-testid=\"appframe-unsaved\">{{ t('appframe.unsaved_text', { app: title || app }) }}</p>\n      <template #actions>\n        <button type=\"button\" class=\"fe-btn\" data-testid=\"appframe-keep\" :disabled=\"closeBusy\" @click=\"answerClose('keep')\">\n          {{ t('appframe.keep_open') }}\n        </button>\n        <button type=\"button\" class=\"fe-btn fe-btn--danger\" data-testid=\"appframe-discard\" :disabled=\"closeBusy\" @click=\"answerClose('discard')\">\n          {{ t('appframe.discard') }}\n        </button>\n        <button type=\"button\" class=\"fe-btn fe-btn--primary\" data-testid=\"appframe-save-close\" :disabled=\"closeBusy\" @click=\"answerClose('save')\">\n          {{ t('appframe.save_close') }}\n        </button>\n      </template>\n    </Modal>\n    <DestinationPickerModal\n      v-if=\"saveAsAsk\"\n      :open=\"true\"\n      :api=\"api\"\n      :locale=\"locale\"\n      :theme=\"theme\"\n      mode=\"save\"\n      :title=\"saveAsTitle(saveAsAsk.name)\"\n      :storages=\"saveAsAsk.storages\"\n      :start-at=\"saveAsAsk.startAt\"\n      @close=\"answerSaveAs(null)\"\n      @pick=\"answerSaveAs\"\n    />\n  </div>\n</template>\n\n<style>\n/* ⚠ Not scoped: the web-component build does not match scoped hashes (see\n   DrawioViewer). Every selector is prefixed. */\n.fe-appframe {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 0;\n  background: var(--fe-bg, #fff);\n}\n.fe-appframe--inspector {\n  height: 320px;\n}\n.fe-appframe--viewer,\n.fe-appframe--page,\n.fe-appframe--home {\n  min-height: 70vh;\n}\n.fe-appframe--modal {\n  min-height: 60vh;\n}\n.fe-appframe__note {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: 8px;\n  padding: 6px 10px;\n  border-block-end: 1px solid var(--fe-border, #e4e4e7);\n  background: var(--fe-bg-elev, #f4f4f5);\n  color: var(--fe-text, #18181b);\n  font-size: 13px;\n}\n.fe-appframe__note-text {\n  flex: 1 1 16rem;\n  min-width: 0;\n}\n.fe-appframe__frame {\n  flex: 1;\n  width: 100%;\n  min-height: 0;\n  border: 0;\n  background: transparent;\n  color-scheme: normal;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * PluginInspectorSection — one `inspector` view of an app plugin, as a\n * collapsible section of the details panel.\n *\n * Closed, it is a heading and nothing else: no request is made until the\n * person opens it (a panel that loaded every plugin's view for every click\n * would make N calls per selection). Opened, it asks\n * `GET …/views/{plugin}/{view}?path=` once for the selected item and draws\n * the surface inline; the footer buttons post events through the same\n * conversation the modal holds (`usePluginSurface`), and a `{op}` answer\n * goes up for the host to register in the tray, exactly as M1's modal does.\n * A new selection resets the section to closed-and-unloaded.\n *\n * v4 — a view that is the app's OWN interface (`view.ui`) is drawn by\n * AppFrame instead, opened with the selected file; nothing is asked of the\n * server but the interface's own files.\n */\nimport { computed, ref, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../../types/ExplorerConfig';\nimport type { FileApi } from '../../composables/useFileApi';\nimport type { PluginViewRow, SurfaceOpenRequest } from '../../types/Plugins';\nimport { useLocale } from '../../composables/useLocale';\nimport { usePluginSurface } from '../../composables/usePluginSurface';\nimport { labelOf } from '../../lib/pluginLabel';\nimport SurfaceConversation from './SurfaceConversation.vue';\nimport SurfaceFooterButtons from './SurfaceFooterButtons.vue';\nimport AppFrame from './AppFrame.vue';\nimport type { FileNode } from '../../types/FileNode';\n\nconst props = defineProps<{\n  api: FileApi;\n  view: PluginViewRow;\n  /** Adapter-qualified path of the selected item. */\n  path: string;\n  locale: LocaleCode;\n  theme?: ThemeMode;\n  storages?: string[];\n  /** The selected row itself — what an app's own interface is opened with. */\n  node?: FileNode;\n  /** This person may change the selected row (the explorer's write gate). */\n  writable?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'op', op: Record<string, unknown>): void;\n  (e: 'toast', message: string): void;\n  /** v3 §3.0 — the answer says \"go to this file\"; the explorer navigates. */\n  (e: 'open', req: SurfaceOpenRequest): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst expanded = ref(false);\nconst loading = ref(false);\nconst loadError = ref('');\n\nconst conv = usePluginSurface(\n  {\n    api: props.api,\n    plugin: props.view.plugin,\n    view: props.view.id,\n    path: () => props.path,\n    locale: () => props.locale,\n    errorText: () => t('plugin.view.error'),\n  },\n  {\n    onOp: (op) => emit('op', op),\n    onOpen: (req) => emit('open', req),\n    // The conversation ended (a job was queued, or the plugin said `done`):\n    // what the section shows next is the view's fresh state.\n    onDone: () => void load(),\n    onToast: (m) => emit('toast', m),\n  },\n);\n\nconst label = computed(() => labelOf(props.view.label, props.locale) || props.view.id);\nconst sectionId = computed(() => `fe-plugin-insp-${props.view.plugin}-${props.view.id}`);\n\nasync function load() {\n  loading.value = true;\n  loadError.value = '';\n  try {\n    const res = await props.api.pluginView(props.view.plugin, props.view.id, props.path);\n    conv.setSurface(res?.surface ?? null);\n    if (!res?.surface) loadError.value = t('plugin.view.error');\n  } catch (e) {\n    conv.setSurface(null);\n    // ⚠ An app's own error text never met the catalogue: isolate its\n    //   machine runs for the reader's direction (lib/direction).\n    loadError.value = t.foreign?.(String((e as Error)?.message ?? e)) || t('plugin.view.error');\n  } finally {\n    loading.value = false;\n  }\n}\n\n/** The file an app's own interface is opened with (a folder: none). */\nconst appFiles = computed(() =>\n  props.node && props.node.type === 'file'\n    ? [{\n        path: props.node.path,\n        name: props.node.basename,\n        size: props.node.size,\n        mime: props.node.mime_type,\n        readOnly: props.writable === false || !!props.node.read_only,\n      }]\n    : [],\n);\n\nfunction toggle() {\n  expanded.value = !expanded.value;\n  if (props.view.ui) return;\n  if (expanded.value && !conv.current.value && !loading.value) void load();\n}\n\nwatch(\n  () => props.path,\n  () => {\n    expanded.value = false;\n    loadError.value = '';\n    conv.setSurface(null);\n  },\n);\n</script>\n\n<template>\n  <section class=\"fe-inspector__section fe-pinsp\" :data-testid=\"`inspector-plugin-${view.plugin}-${view.id}`\">\n    <h3 class=\"fe-inspector__heading fe-pinsp__heading\">\n      <button\n        type=\"button\"\n        class=\"fe-pinsp__toggle\"\n        :aria-expanded=\"expanded\"\n        :aria-controls=\"sectionId\"\n        :data-testid=\"`inspector-plugin-toggle-${view.plugin}-${view.id}`\"\n        @click=\"toggle\"\n      >\n        <svg\n          class=\"fe-ficon fe-pinsp__chev\"\n          :class=\"{ 'is-open': expanded }\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n          focusable=\"false\"\n        >\n          <path d=\"M9 5l7 7-7 7\" />\n        </svg>\n        <span>{{ label }}</span>\n      </button>\n    </h3>\n    <div v-if=\"expanded && view.ui\" :id=\"sectionId\" class=\"fe-pinsp__body\">\n      <AppFrame\n        :key=\"path\"\n        :api=\"api\"\n        :app=\"view.plugin\"\n        :version=\"view.ui.version\"\n        :view=\"view.id\"\n        placement=\"inspector\"\n        :ui=\"view.ui\"\n        :files=\"appFiles\"\n        :storages=\"storages\"\n        :start-at=\"path\"\n        :locale=\"locale\"\n        :theme=\"theme\"\n        :title=\"label\"\n        @toast=\"(m) => emit('toast', m.text)\"\n        @op=\"(op) => emit('op', op)\"\n      />\n    </div>\n    <div v-else-if=\"expanded\" :id=\"sectionId\" class=\"fe-pinsp__body\">\n      <p v-if=\"loading\" class=\"fe-inspector__empty\">{{ t('plugin.view.loading') }}</p>\n      <p v-else-if=\"loadError\" class=\"fe-surface__error\" role=\"alert\">{{ loadError }}</p>\n      <template v-else-if=\"conv.current.value\">\n        <SurfaceConversation\n          :conv=\"conv\"\n          :locale=\"locale\"\n          :theme=\"theme\"\n          :api=\"api\"\n          :plugin=\"view.plugin\"\n          :storages=\"storages\"\n          :start-at=\"path\"\n        />\n        <div v-if=\"conv.footer.value.length\" class=\"fe-pinsp__actions\">\n          <SurfaceFooterButtons :conv=\"conv\" :locale=\"locale\" testid-prefix=\"inspector-plugin\" small />\n        </div>\n      </template>\n    </div>\n  </section>\n</template>\n","<script setup lang=\"ts\">\n/**\n * InspectorPanel — koru:k1 details (\"Ayrıntılar\") side panel.\n *\n * Rendered as a flex sibling of `.fe__body` (right side, ~300px). In\n * `fe--narrow` embeds it becomes a full-size overlay with its own close\n * button (Esc handled by FileExplorer's shortcut chain).\n *\n * Sections:\n *   - Genel     : icon/thumb, name, path (copy), size, modified, mime, etag.\n *                 Multi-select → \"N items, total X\" summary; no selection →\n *                 current-folder summary.\n *   - Sürümler  : version history via GET /api/files/versions?node_id=…\n *                 + restore (with optional snapshot-current) + snapshot-now.\n *                 The section hides silently when the backend gates the\n *                 endpoint (401/403) or doesn't ship it (404).\n *   - İzinler   : effective RBAC level badge + \"manage\" (opens the existing\n *                 PermissionsModal through the host). Only when ACL is\n *                 enforced on the storage (perm is a non-empty string).\n *   - Paylaşımlar: existing share links (GET /api/files/share?path=…) with\n *                 copy buttons. Hidden silently when the list call fails\n *                 (viewer-level users get 403 by design).\n *\n * The panel is mounted with v-if by the host — closed state leaves zero DOM.\n */\nimport { computed, ref, watch } from 'vue';\nimport type { FileApi, Grant, NodeVersion } from '../composables/useFileApi';\nimport type { FileNode, ShareInfo } from '../types/FileNode';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport type { PluginViewRow } from '../types/Plugins';\nimport { localeTag, useLocale } from '../composables/useLocale';\nimport { fileIconTile, isStorageRow, typeLabelFor } from '../lib/fileIcons';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport { appliesToNodes } from '../lib/pluginApplies';\nimport { lockedRefusal, lockOf, lockWords } from '../lib/appLock';\nimport { linkWordsFor } from '../lib/symlink'; /* issue #34 */\nimport { unavailableWordsFor } from '../lib/unavailable'; /* issue #104 */\nimport { ALL_SHARING, type SharingHeld } from '../lib/sharingHeld';\nimport { publicLinksOff } from '../lib/e2eLinks';\nimport { personInitial as initialOfPerson, personName as nameOfPerson } from '../lib/personName';\nimport TagPicker from './TagPicker.vue';\nimport { clipRunes, serverLimit } from '../lib/serverRules';\nimport type { TagKind } from '../lib/tags';\nimport PluginInspectorSection from './plugin/PluginInspectorSection.vue';\n\nconst props = withDefaults(\n  defineProps<{\n  api: FileApi;\n  /** Current selection (empty array → current-folder summary). */\n  nodes: FileNode[];\n  /** Display label of the folder being viewed (for the no-selection state). */\n  dirLabel: string;\n  /** Number of entries in the folder being viewed. */\n  dirCount: number;\n  /** RBAC effective level of the current dir ('' = ACL not enforced). */\n  dirPerm?: string;\n  /**\n   * pane:p1 — non-empty ⇒ `nodes` is the LAST selected thing, not what is\n   * ticked in the pane the person is looking at; the value NAMES where it\n   * lives.\n   *\n   * ⚠ The panel holds its subject on purpose (owner, 2026-09-13: \"son seçilen\n   * şeyi tutsun\"), which means it can be describing a file in the other half of\n   * a split window — so it has to SAY so. Without this line the panel would be\n   * a fact with no address: three sections about `report.pdf` over a listing\n   * with nothing ticked in it, and no way to tell whether that is the file you\n   * just clicked or the one you clicked five minutes ago.\n   */\n  heldIn?: string;\n  locale: LocaleCode;\n  /** Narrow/embed mode → full-size overlay presentation. */\n  narrow?: boolean;\n  /**\n   * Is the reader an administrator (`capabilities.caller_admin`)?\n   *\n   * ⚠ Only the NODE ID row depends on it (the maintainer, 2026-09-23). The id is a\n   * support handle — what an administrator quotes in Admin → File history or\n   * an audit row — and it means nothing to anybody else; on a shared surface\n   * it was a number in front of every reader. Absent = not an administrator,\n   * which is the safe answer for an embed that never asks the server.\n   */\n  callerAdmin?: boolean;\n  /**\n   * Which kinds of sharing the account may use on the ONE selected item\n   * (lib/sharingHeld). \"Create link\" is drawn only with `links`, \"Manage\"\n   * (the people with access) only with `users` — the doors here make what\n   * the share dialog makes, and ask the same permissions. Absent = all\n   * three: the server decides.\n   */\n  sharing?: SharingHeld;\n  /**\n   * wiring:e2 - the selected item sits in an end-to-end encrypted folder (the\n   * host's listing is one, or the item was selected in one). \"Create link\"\n   * then follows the explorer's Share row (lib/e2eLinks publicLinksOff): never\n   * a public link for an encrypted folder or anything in it, which the server\n   * refuses with 409 E2E_ENCRYPTED. The folder's own row (`e2e`) and a row\n   * that names its folder (`e2e_root`) are told by the rows themselves.\n   * Absent = the rows decide alone.\n   */\n  inEncrypted?: boolean;\n  /** Authenticated thumbnail resolver (useThumbs.src). Optional. */\n  thumbSrc?: (n: FileNode) => string | null;\n  /* === surucu:d1 — the Drive shell's details panel ===================== */\n  /**\n   * Split the panel into **Details** and **Activity** tabs, and draw the two\n   * sections the mockups add: who has access, and the share link with a\n   * \"Create link\" button. `uiProfile: 'drive'` turns it on; absent/false is\n   * the flat scroll of sections this panel has always been, with no extra\n   * request made.\n   *\n   * ⚠ \"Activity\" is version history + comments, and nothing else, because\n   * nothing else exists: there is no per-file activity endpoint. The audit log\n   * is admin-only, has no path filter, and stores an EMPTY `target_id` for\n   * every file action (auth/audit_middleware.go) — so \"Ayşe renamed this on\n   * Tuesday\" cannot be answered by this server, and a timeline that made it up\n   * would be worse than the two real feeds.\n   */\n  tabs?: boolean;\n  /* === etiket:t1 — the Tags section ==================================\n   *\n   * The three props a self-fetching child in this package takes, passed\n   * straight through to `TagPicker`: it talks to\n   * `/api/files/manager/tags` itself and needs all three to do it.\n   *\n   * ⚠ `authCredentials` is not decoration. A credentialed cross-origin\n   * request cannot be answered with `Access-Control-Allow-Origin: *`, so\n   * an embed served from a different origin to the API loses its tags\n   * without it — the same reason TagPicker's own prop documents.\n   *\n   * All three optional: a host that passes none gets no Tags section\n   * rather than a control that reads nothing. That is the honest failure\n   * for this panel, which hides every section it cannot fill.\n   */\n  /** API origin for the tag routes. `''` is valid — it means \"same origin\". */\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  /* === App plugins (docs/APP-PLUGINS-API.md → Placements, `inspector`) ===\n   * The `views[]` rows with placement `inspector`, as the host fetched them\n   * (`usePluginActions.views`); `[]` while the feature is off. One collapsible\n   * section per row whose `applies` rule accepts the selected SINGLE item —\n   * the client-side mirror the menu uses (lib/pluginApplies), re-checked by\n   * the server when the view loads. */\n  pluginViews?: PluginViewRow[];\n  /** Resolved theme, for the dialogs a plugin surface can open. */\n  theme?: ThemeMode;\n  /** Storage names a surface's file-chooser may span. */\n  storages?: string[];\n  }>(),\n  {\n    /* ⚠ ON by default, and that is the owner's call of 2026-09-12, not a\n     * taste: the Details/Activity split, \"People with access\" and the share\n     * link row used to arrive only with `uiProfile: 'drive'`, which meant the\n     * screen the owner actually uses — the admin one — was the only screen\n     * that never got them (\"their app and our app will be one to one\";\n     * web/src/views/Explore.vue carries the full quote). The profile string\n     * is gone; this is the last gate that answered to it, so it answers yes.\n     * An embedder that wants the old flat scroll can still pass `:tabs=\"false\"`.\n     */\n    tabs: true,\n    narrow: false,\n    dirPerm: '',\n    thumbSrc: undefined,\n    pluginViews: () => [],\n  },\n);\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  /** surucu:d1 — a share link was minted from the panel. */\n  (e: 'share-created', payload: { path: string; url: string }): void;\n  (e: 'manage-permissions', node: FileNode): void;\n  (e: 'toast', message: string): void;\n  /** Fired after a successful restore/snapshot so the host can reload. */\n  (e: 'changed'): void;\n  /**\n   * etiket:t1 — tags on this node were edited here.\n   *\n   * ⚠ The host drops its cached tag list on this, refreshes the panel's\n   * Tags section and reloads an open tag view — exactly what the\n   * context-menu tag modal already causes. Without the emit the edit\n   * lands on the server and the sidebar keeps showing the list from\n   * before it, which is the kind of staleness nobody notices until they\n   * go looking for the tag they just made.\n   */\n  (e: 'tags-changed', tags: string[]): void;\n  /**\n   * etiket:t1 — a tag chip was clicked: open that tag's view.\n   *\n   * ⚠ Re-emitted rather than handled, like every other navigation this panel\n   * offers. The panel knows a tag's NAME; only the host knows that the tag view\n   * is a `.tag~<name>` sentinel, how to leave whatever view is on screen to get\n   * there, and what that does to the tab strip.\n   */\n  (e: 'open-tag', tag: string, kind: TagKind): void;\n  /** App plugins — an inspector view's event enqueued a job: the raw ops row. */\n  (e: 'plugin-op', op: Record<string, unknown>): void;\n  /**\n   * v3 §3.0 — an app's inspector screen answered \"go to this file\".\n   *\n   * ⚠ Carried UP with the plugin's name rather than acted on: the panel\n   * cannot navigate, and the explorer that can is the one holding it.\n   */\n  (e: 'plugin-open', payload: { plugin: string; req: { path: string; action?: string; view?: string } }): void;\n}>();\n\nconst { t, formatSize, formatNodeSize, nodeSizeHint, formatDate: formatDateOf, nodeDisplayName } = useLocale(\n  () => props.locale,\n);\n\n// ── selection shape ──────────────────────────────────────────────────\n/* wiring:e2 names — the path as the person reads it: plaintext inside an\n * encrypted-names folder. The copy button still copies the wire path, the\n * one every tool and API call understands. */\nfunction shownPath(n: FileNode): string {\n  if (typeof n.e2e_display_dir !== 'string' || typeof n.e2e_stored !== 'string') return n.path;\n  const i = n.path.indexOf('://');\n  const prefix = i === -1 ? '' : n.path.slice(0, i + 3);\n  return `${prefix}${n.e2e_display_dir ? `${n.e2e_display_dir}/` : ''}${n.basename}`;\n}\nconst single = computed<FileNode | null>(() =>\n  props.nodes.length === 1 ? props.nodes[0] : null,\n);\nconst isMulti = computed(() => props.nodes.length > 1);\n\n/* App plugins — the app holding this file, in the same words the row's badge\n * uses (lib/appLock). ⚠ It goes ABOVE the facts, not among them: the panel's\n * \"Permission: viewer\" line is TRUE and misleading on its own, because the\n * reason is not a permission the owner can change. */\nconst lockLine = computed(() => lockWords(lockOf(single.value), { t, formatDate: formatDateOf, locale: props.locale }));\n/* issue #34 — a symlink the server will not follow. It goes in the SAME place\n * and for the same reason as the lock above: this panel's \"Size: 0 bytes\" and\n * \"Type: file\" are both true and both misleading on their own, and the reason\n * is not something the person can read off any of the facts below. */\nconst linkNote = computed(() => linkWordsFor(single.value, { t }));\n/* issue #104 - an entry the storage could not answer for: the same place as\n * the two notes above, and the storage's own answer on its own line. */\nconst unavailableNote = computed(() => unavailableWordsFor(single.value, { t }));\nconst isFile = computed(() => single.value?.type === 'file');\nconst nodeId = computed<number | null>(() =>\n  typeof single.value?.id === 'number' ? (single.value.id as number) : null,\n);\nconst multiTotal = computed(() =>\n  props.nodes.reduce((acc, n) => acc + (typeof n.size === 'number' ? n.size : 0), 0),\n);\n/** The selection's total, as a size: a lower bound when any selected folder's\n *  own size is one (`size_partial`, drawn by useLocale formatNodeSize). */\nconst multiSize = computed(() => ({\n  size: multiTotal.value,\n  size_partial: props.nodes.some((n) => n.size_partial === true),\n}));\nconst etag = computed<string | null>(() => {\n  const v = single.value?.etag;\n  return typeof v === 'string' && v !== '' ? v : null;\n});\nconst thumb = computed<string | null>(() =>\n  single.value && isFile.value && props.thumbSrc ? props.thumbSrc(single.value) : null,\n);\n\n/** App plugins — the inspector views whose rule accepts the selected item. */\nconst pluginSections = computed<PluginViewRow[]>(() => {\n  const n = single.value;\n  if (!n || isStorageRow(n) || n.trashed === true) return [];\n  return (props.pluginViews ?? []).filter(\n    (v) => v.placement === 'inspector' && appliesToNodes(v.applies, [n], v.plugin),\n  );\n});\n\n/* === gorunum:v4-dialogs — what the head says =============================\n *\n * The panel used to open with the word \"Details\" and put the item's own name\n * a section lower, under a second heading. The reference shell puts the item\n * in the head — its glyph, its name, and one caption naming what it is — and\n * that is the right way round: the panel is ABOUT the item, and a header that\n * names the panel instead of its subject is a label on the frame.\n *\n * All three fall back cleanly: a multi-selection is counted, no selection at\n * all describes the folder being viewed. Nothing here invents a fact — the\n * caption is the same kind name the listing's Type column prints\n * (`typeLabelFor`) and the same size formatter the rows use.\n * ---------------------------------------------------------------------- */\n\n/** The name in the head: the item, the count, or the folder you are in. */\nconst headName = computed<string>(() => {\n  if (isMulti.value) return t('inspector.items', { n: props.nodes.length });\n  if (single.value) return nodeDisplayName(single.value);\n  return props.dirLabel;\n});\n\n/** The line under it — \"Folder\", \"TypeScript · 4.8 KB\", \"12.4 MB in total\". */\nconst headCaption = computed<string>(() => {\n  if (isMulti.value) return formatNodeSize(multiSize.value);\n  const n = single.value;\n  if (n) {\n    const kind = typeLabelFor(n, t);\n    if (n.type === 'dir') return kind;\n    const size = typeof n.size === 'number' ? formatSize(n.size) : '';\n    return size ? `${kind} · ${size}` : kind;\n  }\n  return t('inspector.folder_items', { n: props.dirCount });\n});\n\n/**\n * Whether the thumbnail is worth the space it takes.\n *\n * ⚠ `thumbSrc` answers for text files too — the host renders the source and\n * hands back a picture of it — and at panel width that came out as a blank\n * olive rectangle with \"TS\" in the middle of it: a large, prominent block\n * that tells the reader less than the one-word caption already did. A\n * thumbnail earns its place when the file IS a picture; for everything else\n * the type tile and the kind name are the whole of what an image could say.\n */\nconst previewSrc = computed<string | null>(() =>\n  thumb.value && /^(image|video)[/]/.test(String(single.value?.mime_type ?? ''))\n    ? thumb.value\n    : null,\n);\n\n/**\n * The glyph — the LISTING'S tile, not a second drawing of the same idea and\n * not the thumbnail.\n *\n * ⚠ It was the thumbnail first, and that was wrong twice over: the host\n * resolves a thumbnail for text files too, so `app.ts` came out as a 30px\n * smudge of rendered source with no glyph in it at all, and the panel's mark\n * then disagreed with the mark on the row it describes. `fileIconTile` is the\n * same object the row draws, so the head and the row match by construction.\n * The thumbnail is still shown — below, at a size where a picture is a\n * picture.\n */\nconst headIcon = computed<string>(() =>\n  fileIconTile(single.value && !isMulti.value ? single.value : { type: 'dir' }),\n);\n\n/**\n * Whether the Tags section has everything it needs.\n *\n * A node id, because the tag routes are keyed by it (a client-synthesized row\n * — a multi-storage virtual folder — has none), and a host that wired the\n * three props. Missing either, the section is not drawn at all rather than\n * drawn empty: an \"Add tag\" button that cannot save is worse than no button.\n */\nconst canTag = computed(\n  () => nodeId.value != null && props.apiBase !== undefined && !isMulti.value,\n);\n\nfunction shortHash(h: string): string {\n  return h.length > 12 ? `${h.slice(0, 12)}…` : h;\n}\n\n/**\n * zaman:z1 — the panel prints the SAME string the row behind it prints.\n *\n * This used to be a private `formatDate()` that called `toLocaleString` with\n * no `timeZone` at all, so the details panel answered on the BROWSER's clock\n * while the listing cell four pixels away answered on the zone the viewer\n * chose. It also mapped the locale by hand ('en-GB'), so even in one zone the\n * two disagreed about the shape of a date. Both halves live in\n * `useLocale.formatDate` now; `{ time: true }` is the listing's own variant.\n */\nfunction formatDate(ms: number | undefined): string {\n  return formatDateOf(ms, { time: true }) || '-';\n}\n\nfunction formatDateStr(s: string | undefined | null): string {\n  if (!s) return '-';\n  const ms = Date.parse(s);\n  return Number.isNaN(ms) ? s : formatDate(ms);\n}\n\nasync function copyText(text: string): Promise<void> {\n  try {\n    await navigator.clipboard.writeText(text);\n    emit('toast', t('inspector.copied'));\n  } catch {\n    emit('toast', text);\n  }\n}\n\n// ── RBAC (İzinler) ───────────────────────────────────────────────────\n// Effective level for the selected item: its own perm, else the dir's.\n// A non-empty string means ACL is enforced → section shows.\nconst effectivePerm = computed<string>(() => {\n  if (!single.value) return '';\n  // Backends may send '' when ACL is off — widen past the declared union.\n  const own = single.value.perm as string | undefined;\n  if (typeof own === 'string' && own !== '') return own;\n  return props.dirPerm || '';\n});\n/**\n * \"Manage permissions\" — for an OWNER only.\n *\n * ⚠ It used to be offered to editors too, and an editor cannot read the grant\n * list at all (`GET /api/files/permissions` answers 403): the button opened a\n * dialog with no permissions in it, and the refusal was swallowed (QA,\n * 2026-09-21). An editor shares from the row's \"Share\" like everybody else.\n */\n/** The sharing kinds this account may use on the item (lib/sharingHeld). */\nconst mayShare = computed<SharingHeld>(() => props.sharing ?? ALL_SHARING);\n/** wiring:e2 - no public link here: the explorer's Share row asks the same\n *  rule (lib/e2eLinks), and the server refuses it with 409 E2E_ENCRYPTED. */\nconst linksOff = computed(() => publicLinksOff(props.nodes, props.inEncrypted === true));\n// …and without `share.users` the people in that dialog are not theirs to\n// change either, so the button that opens it for them is not drawn.\nconst canManagePerms = computed(() => effectivePerm.value === 'owner' && mayShare.value.users);\nfunction permLabel(level: string): string {\n  return t(`inspector.perm.${level}`) === `inspector.perm.${level}`\n    ? level\n    : t(`inspector.perm.${level}`);\n}\n\n// ── versions state ───────────────────────────────────────────────────\ntype SectionState = 'idle' | 'loading' | 'ok' | 'hidden' | 'error';\nconst versionsState = ref<SectionState>('idle');\nconst versions = ref<NodeVersion[]>([]);\nconst confirmVersionId = ref<number | null>(null);\nconst snapshotFirst = ref(true);\n/* ⚠ Which version work is under way, not just THAT one is: both copy the\n * whole file on the storage, and the buttons only went grey, so a long\n * restore read as a stuck pane. The pressed button names its work. */\nconst versionWork = ref<'restore' | 'snapshot' | null>(null);\nconst versionBusy = computed(() => versionWork.value !== null);\n\n// ── shares state ─────────────────────────────────────────────────────\nconst sharesState = ref<SectionState>('idle');\nconst shares = ref<ShareInfo[]>([]);\n\n// Race guard: only the latest refresh may write state.\nlet refreshSeq = 0;\n\nasync function refresh(): Promise<void> {\n  const seq = ++refreshSeq;\n  confirmVersionId.value = null;\n  versions.value = [];\n  shares.value = [];\n\n  // Versions — single file with a backend node id only.\n  if (single.value && isFile.value && nodeId.value != null) {\n    versionsState.value = 'loading';\n    void loadVersions(seq);\n  } else {\n    versionsState.value = 'hidden';\n  }\n\n  // Shares — any single selection (files and folders both shareable).\n  if (single.value) {\n    sharesState.value = 'loading';\n    const path = single.value.path;\n    try {\n      const { shares: list } = await props.api.listShares(path);\n      if (seq !== refreshSeq) return;\n      shares.value = Array.isArray(list) ? list : [];\n      sharesState.value = 'ok';\n    } catch {\n      if (seq !== refreshSeq) return;\n      // 403 = viewer-level user (by design), anything else — auxiliary\n      // info, hide silently rather than alarm.\n      sharesState.value = 'hidden';\n    }\n  } else {\n    sharesState.value = 'hidden';\n  }\n}\n\nasync function loadVersions(seq: number): Promise<void> {\n  const id = nodeId.value;\n  if (id == null) return;\n  try {\n    const list = await props.api.listVersions(id);\n    if (seq !== refreshSeq) return;\n    versions.value = list;\n    versionsState.value = 'ok';\n  } catch (err) {\n    if (seq !== refreshSeq) return;\n    const status = (err as { status?: number }).status;\n    // Gated (401/403) or absent (404) endpoint → section silently hidden.\n    if (status === 401 || status === 403 || status === 404) {\n      versionsState.value = 'hidden';\n    } else {\n      versionsState.value = 'error';\n    }\n  }\n}\n\nfunction askRestore(v: NodeVersion): void {\n  confirmVersionId.value = v.id;\n  snapshotFirst.value = true;\n}\n\nasync function confirmRestore(v: NodeVersion): Promise<void> {\n  const id = nodeId.value;\n  if (id == null || versionBusy.value) return;\n  versionWork.value = 'restore';\n  try {\n    await props.api.restoreVersion(id, v.id, snapshotFirst.value);\n    emit('toast', t('inspector.versions.restored'));\n    confirmVersionId.value = null;\n    emit('changed');\n    await loadVersions(++refreshSeq);\n  } catch (err) {\n    // ⚠ A 423 is an app's freeze (the signing app, while signatures are\n    // collected): say which app and why, in the reader's language — the\n    // server's own text is English and names a path.\n    const held = lockedRefusal(err);\n    emit('toast', held ? lockWords(held, { t, formatDate: formatDateOf, locale: props.locale }) : (err as Error).message);\n  } finally {\n    versionWork.value = null;\n  }\n}\n\nasync function takeSnapshot(): Promise<void> {\n  const id = nodeId.value;\n  if (id == null || versionBusy.value) return;\n  versionWork.value = 'snapshot';\n  try {\n    await props.api.snapshotVersion(id);\n    emit('toast', t('inspector.versions.snapshotted'));\n    await loadVersions(++refreshSeq);\n  } catch (err) {\n    const status = (err as { status?: number }).status;\n    // Older backends don't ship POST /versions/snapshot yet.\n    if (status === 404 || status === 405 || status === 501) {\n      emit('toast', t('inspector.versions.unsupported'));\n    } else {\n      emit('toast', (err as Error).message);\n    }\n  } finally {\n    versionWork.value = null;\n  }\n}\n\n/* === surucu:d1 — tabs, people with access, the share-link row ==========\n *\n * The tab strip is presentation only: every section below is the same section,\n * rendered under Details or under Activity. Nothing is fetched twice, and\n * nothing new is fetched at all unless `tabs` is on.\n */\ntype InspectorTab = 'details' | 'activity';\nconst tab = ref<InspectorTab>('details');\n\n/** People with access — `GET /api/files/permissions?path=…`.\n *\n * ⚠ Owner-gated on the server (handlers/grants.go `requireOwner`), so an\n * editor or a viewer gets a 403 for a file they can perfectly well see. That\n * is the server's call, not something to route around: the section hides,\n * exactly the way the shares list already hides for the same class of caller.\n * What it must NOT do is render an empty \"People with access\" and let the\n * reader conclude that nobody has any.\n */\nconst peopleState = ref<SectionState>('hidden');\nconst people = ref<Grant[]>([]);\nlet peopleSeq = 0;\n\nasync function loadPeople(): Promise<void> {\n  const seq = ++peopleSeq;\n  const node = single.value;\n  if (!props.tabs || !node) {\n    peopleState.value = 'hidden';\n    people.value = [];\n    return;\n  }\n  peopleState.value = 'loading';\n  try {\n    const r = await props.api.listPermissions(node.path);\n    if (seq !== peopleSeq) return;\n    // RBAC off on this storage → there are no grants, and a section reading\n    // \"nobody\" would misdescribe a drive where everyone can already read it.\n    if (!r.storage_rbac) {\n      peopleState.value = 'hidden';\n      people.value = [];\n      return;\n    }\n    people.value = [...(r.direct ?? []), ...(r.inherited ?? [])];\n    peopleState.value = 'ok';\n  } catch {\n    if (seq !== peopleSeq) return;\n    people.value = [];\n    peopleState.value = 'hidden';\n  }\n}\n\n/* One rule for naming a person (lib/personName). */\nfunction grantPerson(g: Grant) {\n  return { name: g.user_name, display_name: g.user_display_name, email: g.user_email };\n}\n\nfunction personName(g: Grant): string {\n  return nameOfPerson(grantPerson(g)) || `#${g.user_id}`;\n}\n\nfunction personInitial(g: Grant): string {\n  return initialOfPerson(grantPerson(g), localeTag(props.locale)) || '?';\n}\n\n/** The share-link row: the first live link, or the Create button. */\nconst primaryShare = computed(() => (shares.value.length ? shares.value[0] : null));\nconst shareBusy = ref(false);\n\nasync function createLink(): Promise<void> {\n  const node = single.value;\n  if (!node || shareBusy.value || !mayShare.value.links || linksOff.value) return;\n  shareBusy.value = true;\n  try {\n    const r = await props.api.createShare({ path: node.path });\n    const url = r.share?.url ?? '';\n    // Re-read the list rather than push the response into it: the LIST\n    // endpoint is what a later copy or revoke acts on, and its `uuid` is the\n    // numeric id the DELETE route wants — not the token the create response\n    // carries under that name.\n    const { shares: list } = await props.api.listShares(node.path);\n    shares.value = Array.isArray(list) ? list : [];\n    sharesState.value = 'ok';\n    if (url) {\n      emit('share-created', { path: node.path, url });\n      await copyText(url);\n    }\n  } catch (err) {\n    emit('toast', (err as Error).message);\n  } finally {\n    shareBusy.value = false;\n  }\n}\n\nwatch(\n  () => [props.nodes.map((n) => n.path).join('|'), props.tabs] as const,\n  () => void loadPeople(),\n  { immediate: true },\n);\n\n/* Versions and comments are the two real feeds; when a selection has neither,\n * the Activity tab says so instead of showing two empty headings. */\nconst activityUsable = computed(\n  () => versionsState.value !== 'hidden' || commentsState.value !== 'hidden',\n);\n/* === /surucu:d1 === */\n\nwatch(\n  () => props.nodes.map((n) => n.path).join('\\u0000'),\n  () => void refresh(),\n  { immediate: true },\n);\n\n/* === calisma:d3 — Yorumlar (node comments) ===\n * Flat chronological thread per node (files AND folders — every backend\n * row carries an id). Loaded through its own watcher + seq guard so the\n * existing refresh() stays untouched. Add/delete are NOT optimistic: the\n * list re-fetches after each successful API round-trip. The section hides\n * silently when the backend gates (401/403) or lacks (404) the endpoint.\n */\nimport type { NodeComment } from '../composables/useFileApi';\n\nconst commentsState = ref<SectionState>('hidden');\nconst comments = ref<NodeComment[]>([]);\nconst commentDraft = ref('');\n/* The longest comment the server keeps, in characters (`limits.\n   comment_max_runes`, #211 audit B20). `maxlength=\"5000\"` counted UTF-16\n   units: an emoji took two of the server's one. */\nwatch(commentDraft, (v) => {\n  const clipped = clipRunes(v, serverLimit('comment_max_runes'));\n  if (clipped !== v) commentDraft.value = clipped;\n});\nconst commentBusy = ref(false);\nconst commentNodeId = computed<number | null>(() =>\n  typeof single.value?.id === 'number' ? (single.value.id as number) : null,\n);\nlet commentSeq = 0;\n\nasync function loadComments(): Promise<void> {\n  const seq = ++commentSeq;\n  const id = commentNodeId.value;\n  if (id == null) {\n    commentsState.value = 'hidden';\n    comments.value = [];\n    return;\n  }\n  commentsState.value = comments.value.length > 0 ? 'ok' : 'loading';\n  try {\n    const list = await props.api.listComments(id);\n    if (seq !== commentSeq) return;\n    comments.value = list;\n    commentsState.value = 'ok';\n  } catch (err) {\n    if (seq !== commentSeq) return;\n    comments.value = [];\n    const status = (err as { status?: number }).status;\n    commentsState.value =\n      status === 401 || status === 403 || status === 404 ? 'hidden' : 'error';\n  }\n}\n\nasync function sendComment(): Promise<void> {\n  const id = commentNodeId.value;\n  const body = commentDraft.value.trim();\n  if (id == null || body === '' || commentBusy.value) return;\n  commentBusy.value = true;\n  try {\n    await props.api.addComment(id, body);\n    commentDraft.value = '';\n    await loadComments();\n  } catch (err) {\n    emit('toast', (err as Error).message);\n  } finally {\n    commentBusy.value = false;\n  }\n}\n\nasync function removeComment(c: NodeComment): Promise<void> {\n  if (commentBusy.value) return;\n  commentBusy.value = true;\n  try {\n    await props.api.deleteComment(c.id);\n    await loadComments();\n  } catch (err) {\n    emit('toast', (err as Error).message);\n  } finally {\n    commentBusy.value = false;\n  }\n}\n\n/** Relative \"3 minutes ago\" stamp via Intl (locale-aware, no i18n keys). */\nfunction relativeTime(iso: string): string {\n  const ms = Date.parse(iso);\n  if (Number.isNaN(ms)) return iso;\n  const diffS = Math.round((ms - Date.now()) / 1000);\n  const abs = Math.abs(diffS);\n  const units: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n    ['year', 31536000],\n    ['month', 2592000],\n    ['day', 86400],\n    ['hour', 3600],\n    ['minute', 60],\n  ];\n  try {\n    const rtf = new Intl.RelativeTimeFormat(\n      localeTag(props.locale),\n      { numeric: 'auto' },\n    );\n    for (const [unit, secs] of units) {\n      if (abs >= secs) return rtf.format(Math.trunc(diffS / secs), unit);\n    }\n    return rtf.format(diffS, 'second');\n  } catch {\n    return formatDateStr(iso);\n  }\n}\n\nwatch(\n  () => commentNodeId.value,\n  () => {\n    comments.value = [];\n    commentDraft.value = '';\n    void loadComments();\n  },\n  { immediate: true },\n);\n/* === /calisma:d3 === */\n</script>\n\n<template>\n  <aside\n    class=\"fe-inspector\"\n    :class=\"{ 'fe-inspector--overlay': narrow }\"\n    role=\"complementary\"\n    :aria-label=\"t('inspector.title')\"\n  >\n    <!-- The head is about the ITEM, not about the panel: its glyph, its name\n         and one caption naming what it is. \"Copy name\" is next to the name it\n         copies; the close button is last, on the edge. -->\n    <header class=\"fe-inspector__head\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons -->\n      <span class=\"fe-inspector__head-icon\" aria-hidden=\"true\" v-html=\"headIcon\"></span>\n      <div class=\"fe-inspector__head-text\">\n        <h2 class=\"fe-inspector__title\" :title=\"headName\"><bdi>{{ headName }}</bdi></h2>\n        <p class=\"fe-inspector__caption\">{{ headCaption }}</p>\n        <!-- pane:p1 — the held-subject line. Drawn ONLY while this panel is\n             describing the last selected thing rather than a live selection,\n             and it names the folder that thing is in, because with a split\n             window that folder may not be the one on screen. `role=\"note\"`:\n             it is a fact about the panel, not another fact about the file. -->\n        <p v-if=\"heldIn\" class=\"fe-inspector__held\" role=\"note\" data-testid=\"inspector-held\">\n          {{ t('inspector.held', { where: heldIn }) }}\n        </p>\n      </div>\n      <button\n        v-if=\"single\"\n        type=\"button\"\n        class=\"fe-inspector__iconbtn\"\n        :title=\"t('inspector.copy_name')\"\n        :aria-label=\"t('inspector.copy_name')\"\n        data-testid=\"inspector-copy-name\"\n        @click=\"copyText(headName)\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n        <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-inspector__iconbtn fe-inspector__close\"\n        :title=\"t('inspector.close')\"\n        :aria-label=\"t('inspector.close')\"\n        @click=\"emit('close')\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n        <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n      </button>\n    </header>\n\n    <!-- surucu:d1 — Details / Activity. Rendered only in the drive shell; the\n         classic panel keeps its single flat scroll of sections. -->\n    <div v-if=\"tabs\" class=\"fe-inspector__tabs\" role=\"tablist\" :aria-label=\"t('inspector.title')\">\n      <button\n        type=\"button\"\n        class=\"fe-inspector__tab\"\n        :class=\"{ 'is-active': tab === 'details' }\"\n        role=\"tab\"\n        :aria-selected=\"tab === 'details'\"\n        data-testid=\"inspector-tab-details\"\n        @click=\"tab = 'details'\"\n      >{{ t('inspector.tab.details') }}</button>\n      <button\n        type=\"button\"\n        class=\"fe-inspector__tab\"\n        :class=\"{ 'is-active': tab === 'activity' }\"\n        role=\"tab\"\n        :aria-selected=\"tab === 'activity'\"\n        data-testid=\"inspector-tab-activity\"\n        @click=\"tab = 'activity'\"\n      >{{ t('inspector.tab.activity') }}</button>\n    </div>\n\n    <div class=\"fe-inspector__scroll\">\n      <!-- ══ Genel ══ -->\n      <section v-if=\"!tabs || tab === 'details'\" class=\"fe-inspector__section\">\n        <h3 class=\"fe-inspector__heading\">{{ t('inspector.section.general') }}</h3>\n\n        <!-- App plugins — an app is holding this file read-only. -->\n        <p v-if=\"lockLine\" class=\"fe-inspector__lock\" role=\"note\" data-testid=\"inspector-lock\">\n          <span aria-hidden=\"true\">&#128274;</span>\n          <span><strong>{{ t('applock.inspector') }}</strong><br />{{ lockLine }}</span>\n        </p>\n\n        <!-- issue #34 — a link the server will not follow. -->\n        <p\n          v-if=\"linkNote\"\n          class=\"fe-inspector__linknote\"\n          role=\"note\"\n          data-testid=\"inspector-symlink\"\n          :data-link-state=\"linkNote.state\"\n        >\n          <span aria-hidden=\"true\">&#128279;</span>\n          <span><strong>{{ t('symlink.inspector') }}</strong><br />{{ linkNote.why }}</span>\n        </p>\n\n        <!-- issue #104 - an entry the storage could not answer for. -->\n        <p\n          v-if=\"unavailableNote\"\n          class=\"fe-inspector__unavailable\"\n          role=\"note\"\n          data-testid=\"inspector-unavailable\"\n        >\n          <span aria-hidden=\"true\">!</span>\n          <span>\n            <strong>{{ t('unavailable.inspector') }}</strong><br />{{ unavailableNote.why }}\n            <template v-if=\"unavailableNote.reason\"><br /><bdi>{{ unavailableNote.reason }}</bdi></template>\n          </span>\n        </p>\n\n        <!-- Multi selection → summary. The head already counts them, so this\n             is the one fact the head does not carry. -->\n        <dl v-if=\"isMulti\" class=\"fe-inspector__meta\">\n          <div class=\"fe-inspector__row\">\n            <dt>{{ t('inspector.size') }}</dt>\n            <dd :title=\"nodeSizeHint(multiSize)\">{{ formatNodeSize(multiSize) }}</dd>\n          </div>\n        </dl>\n\n        <!-- Single selection → full meta.\n             ⚠ No Owner row. There is no per-node owner on the wire\n             (`handlers/shared.go`: \"There is no per-node owner\"), so the\n             reference shell's \"Owner: You\" would be a constant wearing the\n             shape of a fact. -->\n        <template v-else-if=\"single\">\n          <!-- The thumbnail, when the host resolved one. Wide and short: this\n               is the one place in the panel where a picture beats a word, and\n               the 30px square in the head is not that place.\n               ⚠ INSIDE this branch, not before it: a `v-if` sibling between\n               `v-if=\"isMulti\"` and this `v-else-if` silently captures the\n               else — which is exactly what happened, and the whole General\n               table stopped rendering while the heading above it stayed. -->\n          <img\n            v-if=\"previewSrc\"\n            class=\"fe-inspector__preview\"\n            :src=\"previewSrc\"\n            alt=\"\"\n            aria-hidden=\"true\"\n          />\n          <dl class=\"fe-inspector__meta\">\n            <div class=\"fe-inspector__row\">\n              <dt>{{ t('inspector.type') }}</dt>\n              <dd>{{ typeLabelFor(single, t) }}</dd>\n            </div>\n            <div class=\"fe-inspector__row\">\n              <dt>{{ t('inspector.path') }}</dt>\n              <dd class=\"fe-inspector__pathcell\">\n                <span class=\"fe-inspector__path\" :title=\"single.path\"><bdi>{{ shownPath(single) }}</bdi></span>\n                <button\n                  type=\"button\"\n                  class=\"fe-inspector__copy\"\n                  :title=\"t('inspector.copy')\"\n                  :aria-label=\"t('inspector.copy')\"\n                  @click=\"copyText(single.path)\"\n                >\n                  <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n                  <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                </button>\n              </dd>\n            </div>\n            <div v-if=\"isFile\" class=\"fe-inspector__row\">\n              <dt>{{ t('inspector.size') }}</dt>\n              <dd>{{ formatSize(typeof single.size === 'number' ? single.size : null) }}</dd>\n            </div>\n            <div class=\"fe-inspector__row\">\n              <dt>{{ t('inspector.modified') }}</dt>\n              <dd>{{ formatDate(single.last_modified) }}</dd>\n            </div>\n            <div v-if=\"isFile && single.mime_type\" class=\"fe-inspector__row\">\n              <dt>{{ t('inspector.mime') }}</dt>\n              <dd class=\"fe-inspector__mime\">{{ single.mime_type }}</dd>\n            </div>\n            <!-- ⚠ The node id lives HERE and nowhere else (owner's call,\n                 2026-09-13). It used to be a row in the right-click menu and the\n                 selection bar — a developer's handle on a support ticket sitting\n                 in front of everyone, twice. This panel is where the other\n                 technical facts about a file already are (Path, MIME, ETag), and\n                 it is still one click to copy. Drawn only when the row actually\n                 has one: a client-synthesized row (a multi-storage folder) has\n                 no backend id, and an empty \"ID —\" teaches nothing.\n\n                 ⚠⚠ And only for an ADMINISTRATOR (the maintainer, 2026-09-23): the id\n                 is the handle admin screens take (Admin → File history, an\n                 audit row), and it says nothing to anyone else. Here, in the\n                 shared panel, so every surface that draws it — the explorer,\n                 the Drive shell, an embed — answers the same way. -->\n            <div v-if=\"callerAdmin && typeof single.id === 'number'\" class=\"fe-inspector__row\">\n              <dt>{{ t('inspector.nodeId') }}</dt>\n              <dd class=\"fe-inspector__pathcell\">\n                <span class=\"fe-inspector__path\">{{ single.id }}</span>\n                <button\n                  type=\"button\"\n                  class=\"fe-inspector__copy\"\n                  :title=\"t('inspector.copy')\"\n                  :aria-label=\"t('inspector.copy')\"\n                  @click=\"copyText(String(single.id))\"\n                >\n                  <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n                  <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                </button>\n              </dd>\n            </div>\n            <div v-if=\"etag\" class=\"fe-inspector__row\">\n              <dt>{{ t('inspector.etag') }}</dt>\n              <dd class=\"fe-inspector__pathcell\">\n                <span class=\"fe-inspector__path\" :title=\"etag\">{{ shortHash(etag) }}</span>\n                <button\n                  type=\"button\"\n                  class=\"fe-inspector__copy\"\n                  :title=\"t('inspector.copy')\"\n                  :aria-label=\"t('inspector.copy')\"\n                  @click=\"copyText(etag)\"\n                >\n                  <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n                  <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                </button>\n              </dd>\n            </div>\n          </dl>\n        </template>\n\n        <!-- No selection → nothing more to say. The head already names the\n             folder you are in and counts what is in it. -->\n        <p v-else class=\"fe-inspector__empty\">{{ t('inspector.select_hint') }}</p>\n      </section>\n\n      <!-- ══ etiket:t1 — Etiketler ══\n           The SAME `TagPicker` the context menu opens in a modal, mounted\n           inline. Not a second tag editor: one component, so the chips, the\n           colours and the add flow are identical wherever tags are edited,\n           and a fix to any of them reaches both places at once. -->\n      <section\n        v-if=\"canTag && (!tabs || tab === 'details')\"\n        class=\"fe-inspector__section\"\n        data-testid=\"inspector-tags\"\n      >\n        <h3 class=\"fe-inspector__heading\">{{ t('inspector.section.tags') }}</h3>\n        <TagPicker\n          :node-id=\"nodeId as number\"\n          :locale=\"locale\"\n          :api-base=\"apiBase\"\n          :auth-headers=\"authHeaders\"\n          :auth-credentials=\"authCredentials\"\n          @change=\"(tags: string[]) => emit('tags-changed', tags)\"\n          @open=\"(tag: string, kind: TagKind) => emit('open-tag', tag, kind) /* etiket:k2 —\n                 the KIND travels with the name: a file can carry a personal\n                 and a team tag of one name, and the chip that was clicked\n                 decides which view opens. */\"\n          @error=\"() => emit('toast', t('inspector.error'))\"\n        />\n      </section>\n\n      <!-- ══ App plugins — one collapsible section per matching `inspector`\n           view. Lazy: nothing is requested until the section is opened. -->\n      <template v-if=\"single && (!tabs || tab === 'details')\">\n        <PluginInspectorSection\n          v-for=\"v in pluginSections\"\n          :key=\"`${v.plugin}/${v.id}`\"\n          :api=\"api\"\n          :view=\"v\"\n          :path=\"single.path\"\n          :node=\"single\"\n          :locale=\"locale\"\n          :theme=\"theme\"\n          :storages=\"storages\"\n          @op=\"(op) => emit('plugin-op', op)\"\n          @toast=\"(m) => emit('toast', m)\"\n          @open=\"(req) => emit('plugin-open', { plugin: v.plugin, req })\"\n        />\n      </template>\n\n      <!-- ══ Sürümler ══ -->\n      <section\n        v-if=\"(versionsState === 'ok' || versionsState === 'error') && (!tabs || tab === 'activity')\"\n        class=\"fe-inspector__section\"\n      >\n        <h3 class=\"fe-inspector__heading\">{{ t('inspector.section.versions') }}</h3>\n\n        <p v-if=\"versionsState === 'error'\" class=\"fe-inspector__empty\">\n          {{ t('inspector.error') }}\n        </p>\n        <template v-else>\n          <p v-if=\"versions.length === 0\" class=\"fe-inspector__empty\">\n            {{ t('inspector.versions.empty') }}\n          </p>\n          <ul v-else class=\"fe-inspector__versions\">\n            <li v-for=\"v in versions\" :key=\"v.id\" class=\"fe-inspector__version\">\n              <div class=\"fe-inspector__version-main\">\n                <span class=\"fe-inspector__version-n\">\n                  {{ t('inspector.versions.v', { n: v.version_n }) }}\n                </span>\n                <span class=\"fe-inspector__version-meta\">\n                  {{ formatDateStr(v.created_at) }} · {{ formatSize(v.size) }}\n                </span>\n              </div>\n              <div v-if=\"confirmVersionId === v.id\" class=\"fe-inspector__confirm\">\n                <p class=\"fe-inspector__confirm-q\">{{ t('inspector.versions.restore_confirm') }}</p>\n                <label class=\"fe-inspector__check\">\n                  <input v-model=\"snapshotFirst\" type=\"checkbox\" />\n                  {{ t('inspector.versions.snapshot_current') }}\n                </label>\n                <div class=\"fe-inspector__confirm-actions\">\n                  <button\n                    type=\"button\"\n                    class=\"fe-btn fe-btn--primary fe-btn--sm\"\n                    :disabled=\"versionBusy\"\n                    :aria-busy=\"versionWork === 'restore'\"\n                    @click=\"confirmRestore(v)\"\n                  >{{ versionWork === 'restore' ? t('inspector.versions.restoring') : t('inspector.versions.confirm') }}</button>\n                  <button\n                    type=\"button\"\n                    class=\"fe-btn fe-btn--sm\"\n                    :disabled=\"versionBusy\"\n                    @click=\"confirmVersionId = null\"\n                  >{{ t('inspector.versions.cancel') }}</button>\n                </div>\n              </div>\n              <button\n                v-else\n                type=\"button\"\n                class=\"fe-btn fe-btn--sm\"\n                :disabled=\"versionBusy\"\n                @click=\"askRestore(v)\"\n              >{{ t('inspector.versions.restore') }}</button>\n            </li>\n          </ul>\n          <button\n            type=\"button\"\n            class=\"fe-btn fe-btn--sm fe-inspector__snapshot\"\n            :disabled=\"versionBusy\"\n            :aria-busy=\"versionWork === 'snapshot'\"\n            @click=\"takeSnapshot\"\n          >{{ versionWork === 'snapshot' ? t('inspector.versions.snapshotting') : t('inspector.versions.take_snapshot') }}</button>\n        </template>\n      </section>\n\n      <!-- ══ İzinler ══ -->\n      <!-- ⚠ surucu:d1 — stands down when \"People with access\" is on screen. The\n           two say the same thing there (your own row is in the roster, with the\n           same level) and each carries its own button into the SAME modal —\n           two doors into one room, six lines apart. It stays for every other\n           case, which is exactly the case where People is hidden: RBAC off on\n           the storage, or the server refusing the grant list to a non-owner. -->\n      <section\n        v-if=\"\n          single &&\n          effectivePerm &&\n          (!tabs || tab === 'details') &&\n          !(tabs && peopleState === 'ok')\n        \"\n        class=\"fe-inspector__section\"\n      >\n        <h3 class=\"fe-inspector__heading\">{{ t('inspector.section.permissions') }}</h3>\n        <div class=\"fe-inspector__permrow\">\n          <span\n            class=\"fe-inspector__badge\"\n            :class=\"`fe-inspector__badge--${effectivePerm}`\"\n          >{{ permLabel(effectivePerm) }}</span>\n          <button\n            v-if=\"canManagePerms\"\n            type=\"button\"\n            class=\"fe-btn fe-btn--sm\"\n            @click=\"emit('manage-permissions', single)\"\n          >{{ t('inspector.perm.manage') }}</button>\n        </div>\n      </section>\n\n      <!-- ══ surucu:d1 — People with access ══\n           Real grants from `GET /api/files/permissions`; hidden entirely when\n           the caller is not an owner (403) or the storage has RBAC off, rather\n           than drawn empty. -->\n      <section\n        v-if=\"tabs && tab === 'details' && peopleState === 'ok'\"\n        class=\"fe-inspector__section\"\n        data-testid=\"inspector-people\"\n      >\n        <h3 class=\"fe-inspector__heading\">{{ t('inspector.people') }}</h3>\n        <p v-if=\"people.length === 0\" class=\"fe-inspector__empty\">\n          {{ t('inspector.people.empty') }}\n        </p>\n        <ul v-else class=\"fe-inspector__people\">\n          <li v-for=\"g in people\" :key=\"`${g.id}-${g.user_id}`\" class=\"fe-inspector__person\">\n            <span class=\"fe-inspector__avatar\" aria-hidden=\"true\">{{ personInitial(g) }}</span>\n            <span class=\"fe-inspector__person-main\">\n              <span class=\"fe-inspector__person-name\" :title=\"g.user_email\">{{ personName(g) }}</span>\n              <span class=\"fe-inspector__person-sub\">\n                {{ permLabel(g.level) }}<template v-if=\"g.inherited\"> · {{ t('inspector.people.inherited') }}</template>\n              </span>\n            </span>\n          </li>\n        </ul>\n        <button\n          v-if=\"canManagePerms && single\"\n          type=\"button\"\n          class=\"fe-btn fe-btn--sm\"\n          @click=\"emit('manage-permissions', single)\"\n        >{{ t('inspector.people.manage') }}</button>\n      </section>\n\n      <!-- ══ Paylaşımlar ══ -->\n      <section\n        v-if=\"sharesState === 'ok' && (!tabs || tab === 'details')\"\n        class=\"fe-inspector__section\"\n        data-testid=\"inspector-shares\"\n      >\n        <h3 class=\"fe-inspector__heading\">\n          {{ tabs ? t('inspector.link') : t('inspector.section.shares') }}\n        </h3>\n        <!-- surucu:d1 — the mockup's link row: what the state IS, and the one\n             button that changes it. Only when there is no link yet; the list\n             below is what an item that HAS links has always shown. -->\n        <div v-if=\"tabs && shares.length === 0\" class=\"fe-inspector__linkrow\">\n          <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n          <span class=\"fe-inspector__linkicon\" aria-hidden=\"true\" v-html=\"actionIconSvg('link')\"></span>\n          <span class=\"fe-inspector__linknone\">{{ t('inspector.link.none') }}</span>\n          <button\n            v-if=\"mayShare.links && !linksOff\"\n            type=\"button\"\n            class=\"fe-btn fe-btn--sm\"\n            :disabled=\"shareBusy || !single\"\n            data-testid=\"inspector-create-link\"\n            @click=\"createLink\"\n          >{{ t('inspector.link.create') }}</button>\n        </div>\n        <p v-else-if=\"shares.length === 0\" class=\"fe-inspector__empty\">\n          {{ t('inspector.shares.empty') }}\n        </p>\n        <ul v-else class=\"fe-inspector__shares\">\n          <li v-for=\"s in shares\" :key=\"s.uuid\" class=\"fe-inspector__share\">\n            <span class=\"fe-inspector__share-url\" :title=\"s.url\">{{ s.url }}</span>\n            <span v-if=\"s.password_pin\" class=\"fe-inspector__badge fe-inspector__badge--pin\">PIN</span>\n            <span v-if=\"s.expires_at\" class=\"fe-inspector__share-exp\">\n              {{ formatDateStr(s.expires_at) }}\n            </span>\n            <button\n              type=\"button\"\n              class=\"fe-inspector__copy\"\n              :title=\"t('inspector.shares.copy')\"\n              :aria-label=\"t('inspector.shares.copy')\"\n              @click=\"copyText(s.url)\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n              <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n            </button>\n          </li>\n        </ul>\n      </section>\n\n      <!-- ══ calisma:d3 — Yorumlar ══ -->\n      <section\n        v-if=\"(commentsState === 'ok' || commentsState === 'error') && (!tabs || tab === 'activity')\"\n        class=\"fe-inspector__section\"\n      >\n        <h3 class=\"fe-inspector__heading\">\n          {{ t('inspector.section.comments') }}\n          <span\n            v-if=\"comments.length > 0\"\n            class=\"fe-inspector__countbadge\"\n          >{{ comments.length }}</span>\n        </h3>\n\n        <p v-if=\"commentsState === 'error'\" class=\"fe-inspector__empty\">\n          {{ t('inspector.error') }}\n        </p>\n        <template v-else>\n          <p v-if=\"comments.length === 0\" class=\"fe-inspector__empty\">\n            {{ t('inspector.comments.empty') }}\n          </p>\n          <ul v-else class=\"fe-inspector__comments\">\n            <li v-for=\"c in comments\" :key=\"c.id\" class=\"fe-inspector__comment\">\n              <div class=\"fe-inspector__comment-top\">\n                <span class=\"fe-inspector__comment-author\" :title=\"c.author_name\">\n                  {{ c.author_name || '-' }}\n                </span>\n                <span class=\"fe-inspector__comment-time\" :title=\"formatDateStr(c.created_at)\">\n                  {{ relativeTime(c.created_at) }}\n                </span>\n                <button\n                  v-if=\"c.can_delete\"\n                  type=\"button\"\n                  class=\"fe-inspector__comment-del\"\n                  :disabled=\"commentBusy\"\n                  :title=\"t('inspector.comments.delete')\"\n                  :aria-label=\"t('inspector.comments.delete')\"\n                  @click=\"removeComment(c)\"\n                >×</button>\n              </div>\n              <p class=\"fe-inspector__comment-body\">{{ c.body }}</p>\n            </li>\n          </ul>\n          <form class=\"fe-inspector__comment-form\" @submit.prevent=\"sendComment\">\n            <input\n              v-model=\"commentDraft\"\n              type=\"text\"\n              class=\"fe-inspector__comment-input\"\n              :placeholder=\"t('inspector.comments.placeholder')\"\n              :aria-label=\"t('inspector.comments.placeholder')\"\n              :disabled=\"commentBusy\"\n            />\n            <button\n              type=\"submit\"\n              class=\"fe-btn fe-btn--primary fe-btn--sm\"\n              :disabled=\"commentBusy || commentDraft.trim() === ''\"\n            >{{ t('inspector.comments.send') }}</button>\n          </form>\n        </template>\n      </section>\n      <!-- ══ /calisma:d3 ══ -->\n\n      <!-- surucu:d1 — the Activity tab with nothing behind it. It says which\n           two feeds fill it, because there is no third one to wait for: this\n           server keeps no per-file audit trail (target_id is empty for every\n           file action, and the log is admin-only). -->\n      <section\n        v-if=\"tabs && tab === 'activity' && !activityUsable\"\n        class=\"fe-inspector__section\"\n        data-testid=\"inspector-activity-empty\"\n      >\n        <p class=\"fe-inspector__empty\">\n          {{ single ? t('inspector.activity.empty') : t('inspector.activity.select') }}\n        </p>\n        <p v-if=\"single\" class=\"fe-inspector__hint\">{{ t('inspector.activity.hint') }}</p>\n      </section>\n    </div>\n  </aside>\n</template>\n","/**\n * useRowTouch — the one click and touch grammar every file view speaks (list,\n * grid, gallery).\n *\n * The rule (issue #26, fourth round — the reporter's words: \"only clicking on\n * checkbox selects it, any other click will open\"), the same on every device:\n *\n *   - the item's CHECKBOX selects: a tick adds or removes, shift+tick extends\n *     the range from the anchor;\n *   - a click or tap ANYWHERE ELSE on the item opens it — the name, the icon,\n *     the size column, the empty space beside the name, with or without a\n *     selection, with or without Ctrl/Shift held;\n *   - a right click (mouse) or a long press (finger) opens the item's menu;\n *   - the item's own controls — the star, the ⋮ button — do their own job.\n *\n * The views only report. What a click means is decided once, in FilePane.\n *\n * How the rule got here:\n *   - First round: a finger has no double-click, so on a phone nothing could\n *     be opened at all. A tap was made to open.\n *   - Second round: a press on the NAME opened on every device, a press\n *     beside it still selected. The reporter: \"need to click precisely on\n *     name, if a lil bit on the right then it selects file\".\n *   - Third round: on a phone the name still needed two taps. A tap reaches a\n *     page as a click only at the end of the browser's compatibility sequence\n *     (touch → mouse move → hover → mouse down/up → click), and iOS WebKit\n *     stops that sequence when the hover step reveals content. So a finger\n *     lifted on the item opens it right there, at `touchend`, and cancels the\n *     emulated mouse events that would follow (`onTap`); the hover reveals are\n *     kept off screens that cannot hover (styles/base.css,\n *     `@media (hover: hover)`).\n *   - Fourth round: the checkbox became the only way a click selects, and the\n *     grid and gallery cards got one too (they had none).\n *\n * ⚠ A tap is judged from the gesture that produced the click, never from the\n * screen: `pointerType` where the browser sets it on click (Chromium, Firefox),\n * and the touchend that just preceded the click where it does not (older\n * WebKit). A touch laptop's trackpad and its screen are two different gestures\n * a `(pointer: coarse)` media query cannot tell apart.\n *\n * ⚠ It used to live as three identical copies of the long-press timer, one per\n * view; a rule like this one is exactly the kind of addition a copy misses.\n */\nimport { onBeforeUnmount } from 'vue';\n\n/** How long a finger rests before the press becomes a long press. */\nexport const LONG_PRESS_MS = 500;\n/** A click this soon after a touchend is the tap that touchend ended. */\nconst TAP_WINDOW_MS = 800;\n/** A finger that travels further than this is scrolling, not pressing. */\nconst MOVE_TOLERANCE_PX = 10;\n\n/**\n * What on an item is a control of its own: a press there is the control's,\n * not the item's. The checkbox is one (it selects on its own click), and so\n * are the star and the ⋮ button. A wrapper cell that swallows its clicks\n * carries `data-fe-control` so a finger on its padding is not an open either.\n */\nexport const ITEM_CONTROL_SELECTOR =\n  'button, a, input, select, textarea, label, [role=\"checkbox\"], [data-fe-control]';\n\nexport interface TouchPoint {\n  clientX: number;\n  clientY: number;\n}\n\n/** What a view reports about a click on one of its items. */\nexport interface ClickMod {\n  ctrl: boolean;\n  shift: boolean;\n  /** The click was a finger's tap. */\n  touch?: boolean;\n  /** The click was on the item's checkbox — the one click that selects. */\n  check?: boolean;\n}\n\n/** The one place a view turns a click on an item into a `ClickMod`. */\nexport function clickMod(ev: MouseEvent, touch: boolean): ClickMod {\n  return { ctrl: ev.ctrlKey || ev.metaKey, shift: ev.shiftKey, touch };\n}\n\n/**\n * The one place a view turns a click on an item's CHECKBOX into a `ClickMod`.\n * `ctrl` because a tick adds to a selection rather than replacing it; `shift`\n * passes through so a shift-tick still extends the range from the anchor.\n */\nexport function checkMod(ev: MouseEvent): ClickMod {\n  return { ctrl: true, shift: ev.shiftKey, check: true };\n}\n\nexport interface RowTouchOptions<T> {\n  /** A tap on the item outside its controls: open it, before any click. */\n  onTap?: (item: T) => void;\n}\n\n/** Whether the press started on one of the item's own controls. */\nfunction onControl(ev: Event): boolean {\n  const el = ev.target as Element | null;\n  if (typeof el?.closest !== 'function') return false;\n  const control = el.closest(ITEM_CONTROL_SELECTOR);\n  const item = ev.currentTarget as Element | null;\n  // Only a control INSIDE the item counts: the listing itself may sit in a\n  // label or a link on some host page, and that must not disarm every tap.\n  return control !== null && (item === null || typeof item.contains !== 'function' || item.contains(control));\n}\n\nexport function useRowTouch<T>(onLongPress: (item: T, at: TouchPoint) => void, options: RowTouchOptions<T> = {}) {\n  let timer: ReturnType<typeof setTimeout> | undefined;\n  let target: T | null = null;\n  let origin: TouchPoint = { clientX: 0, clientY: 0 };\n  let longPressed = false;\n  let tapEndedAt = 0;\n  let startedOnItem = false;\n\n  function stopTimer() {\n    if (timer) clearTimeout(timer);\n    timer = undefined;\n  }\n\n  function onTouchStart(item: T, ev: TouchEvent) {\n    const t0 = ev.touches[0];\n    if (!t0) return;\n    stopTimer();\n    target = item;\n    longPressed = false;\n    origin = { clientX: t0.clientX, clientY: t0.clientY };\n    startedOnItem = !onControl(ev);\n    timer = setTimeout(() => {\n      timer = undefined;\n      if (target === null) return;\n      longPressed = true;\n      onLongPress(target, origin);\n    }, LONG_PRESS_MS);\n  }\n\n  function onTouchMove(ev: TouchEvent) {\n    const t0 = ev.touches[0];\n    if (\n      !t0 ||\n      Math.abs(t0.clientX - origin.clientX) > MOVE_TOLERANCE_PX ||\n      Math.abs(t0.clientY - origin.clientY) > MOVE_TOLERANCE_PX\n    ) {\n      stopTimer();\n      target = null;\n    }\n  }\n\n  /**\n   * ⚠ Bind it WITHOUT `.passive`: a passive listener cannot cancel the\n   * emulated mouse events, and the click they end in would then reach the new\n   * listing under the finger (FilePane's open guard catches that too).\n   */\n  function onTouchEnd(ev?: TouchEvent) {\n    stopTimer();\n    const item = target;\n    const tapped = item !== null && !longPressed;\n    if (tapped) tapEndedAt = Date.now();\n    target = null;\n    if (tapped && startedOnItem && options.onTap) {\n      if (ev?.cancelable) ev.preventDefault();\n      options.onTap(item as T);\n    }\n    startedOnItem = false;\n  }\n\n  /** Whether this click is a finger's tap. */\n  function isTap(ev: MouseEvent): boolean {\n    const kind = (ev as PointerEvent).pointerType;\n    if (kind) return kind === 'touch';\n    return Date.now() - tapEndedAt < TAP_WINDOW_MS;\n  }\n\n  onBeforeUnmount(stopTimer);\n\n  return { onTouchStart, onTouchMove, onTouchEnd, isTap };\n}\n","/**\n * useReorderDrag — drag a row of a vertical list to a new place (GitHub #57).\n *\n * ONE gesture for every list that can be put in order by hand: the navigation\n * panel's storages (SideNav, a person's own order) and the admin Storages table\n * (the administrator's order, dragged by its handle). Two lists, one grammar —\n * a second copy of this is how the two would start to feel different under the\n * hand.\n *\n * Pointer events, not HTML5 drag-and-drop: HTML5 DnD does not start from a\n * finger in most mobile browsers, and it would also look like a FILE drag to\n * the explorer's own drop targets.\n *\n *   · mouse / pen — the press becomes a drag once it has travelled DRAG_SLOP;\n *     below that it is an ordinary click and nothing here gets in its way;\n *   · a finger — after `touchDelayMs` of stillness (a long press on a whole\n *     row, so a finger that only wanted to SCROLL the list scrolls it; 0 on a\n *     dedicated handle, whose `touch-action: none` means it never scrolls);\n *     moving further than TOUCH_SLOP before that is a scroll and ends the\n *     gesture. Once pressed, the finger's moves are kept from scrolling.\n *   · a finger that long-pressed and lifted without moving is not a drop: it\n *     is `onHold` (the navigation panel opens the row's menu there).\n *\n * The caller owns the answer: `onDrop(key, gap)` is called only for a release\n * that changes the order — `gap` is the gap BEFORE row `gap` among the rows\n * drawn, the dragged one still counted, and its own two gaps are not a drop.\n * `dropGap` / `dragKey` are what the caller draws the marker and the lifted\n * row from.\n */\nimport { onBeforeUnmount, ref, type Ref } from 'vue';\nimport { LONG_PRESS_MS } from './useRowTouch';\n\n/** How far a mouse/pen press travels before it is a drag, not a click. */\nexport const DRAG_SLOP = 5;\n/** A finger that travels further than this before it is pressed is scrolling. */\nconst TOUCH_SLOP = 10;\n/** A click this soon after a drag ended is the drag's own release. */\nconst CLICK_SWALLOW_MS = 300;\n/** How close to the scroller's top/bottom edge a drag scrolls it. */\nconst EDGE_PX = 28;\n\nexport interface ReorderDragOptions {\n  /** The rows' keys, in the order they are drawn. */\n  keys: () => readonly string[];\n  /** A row's element — the drop gap is measured against its box. */\n  rowEl: (key: string) => Element | null | undefined;\n  /** What scrolls the rows; nudged when a drag reaches its edge. */\n  scroller?: () => Element | null | undefined;\n  /** A finger's wait before the row can be dragged. Default: a long press. */\n  touchDelayMs?: number;\n  /** A release that changes the order. */\n  onDrop: (key: string, gap: number) => void;\n  /** A finger's long press lifted where it was. */\n  onHold?: (key: string) => void;\n}\n\nexport interface ReorderDrag {\n  /** The row in hand (and the row a finger is holding). */\n  dragKey: Ref<string | null>;\n  /** Where it would land; null = nowhere new. */\n  dropGap: Ref<number | null>;\n  /** A drag is under way (the list wears the grabbing cursor). */\n  reordering: Ref<boolean>;\n  /** A finger's gesture is in progress — its long-press `contextmenu` is the gesture's, not a menu request. */\n  touchActive: () => boolean;\n  onPointerDown: (key: string, ev: PointerEvent) => void;\n  /** Bind with `@click.capture` on the list: swallows the click a release produces. */\n  onClickCapture: (ev: MouseEvent) => void;\n}\n\ninterface Gesture {\n  key: string;\n  pointerId: number;\n  touch: boolean;\n  startX: number;\n  startY: number;\n  /** Mouse/pen: from the start. Finger: once `touchDelayMs` has passed. */\n  pressed: boolean;\n  /** Travelled far enough to be a drag. */\n  armed: boolean;\n  timer?: ReturnType<typeof setTimeout>;\n}\n\nexport function useReorderDrag(opts: ReorderDragOptions): ReorderDrag {\n  const dragKey = ref<string | null>(null);\n  const dropGap = ref<number | null>(null);\n  const reordering = ref(false);\n  let g: Gesture | null = null;\n  let endedAt = 0;\n\n  /** The gap under the pointer: before the first row whose middle is below it. */\n  function gapAt(y: number): number {\n    const keys = opts.keys();\n    for (let i = 0; i < keys.length; i++) {\n      const el = opts.rowEl(keys[i]);\n      if (!el) continue;\n      const r = el.getBoundingClientRect();\n      if (y < r.top + r.height / 2) return i;\n    }\n    return keys.length;\n  }\n\n  function onPointerDown(key: string, ev: PointerEvent) {\n    const touch = ev.pointerType === 'touch';\n    if (!touch && ev.button !== 0) return;\n    end();\n    const delay = opts.touchDelayMs ?? LONG_PRESS_MS;\n    const gesture: Gesture = {\n      key,\n      pointerId: ev.pointerId,\n      touch,\n      startX: ev.clientX,\n      startY: ev.clientY,\n      pressed: !touch || delay <= 0,\n      armed: false,\n    };\n    if (touch && delay > 0) {\n      gesture.timer = setTimeout(() => {\n        if (g !== gesture) return;\n        gesture.pressed = true;\n        // The row lifts: the press registered — drag it now, or lift the finger.\n        dragKey.value = key;\n      }, delay);\n    }\n    g = gesture;\n    window.addEventListener('pointermove', onMove);\n    window.addEventListener('pointerup', onUp);\n    // ⚠ Every way a gesture can END, not just the happy one — a pointer the\n    // browser takes away fires neither pointerup nor a key.\n    window.addEventListener('pointercancel', abort);\n    window.addEventListener('blur', abort);\n    window.addEventListener('keydown', onKey, true);\n    // ⚠ Not passive: a pressed finger's moves must not scroll the list away\n    // from under the drag.\n    if (touch) window.addEventListener('touchmove', onTouchMove, { passive: false });\n  }\n\n  function onTouchMove(ev: TouchEvent) {\n    if (g?.pressed && ev.cancelable) ev.preventDefault();\n  }\n\n  function onMove(ev: PointerEvent) {\n    const d = g;\n    if (!d || ev.pointerId !== d.pointerId) return;\n    const dx = ev.clientX - d.startX;\n    const dy = ev.clientY - d.startY;\n    if (!d.armed) {\n      if (!d.pressed) {\n        // A finger before the long press: moving means scrolling. Let it.\n        if (Math.abs(dx) > TOUCH_SLOP || Math.abs(dy) > TOUCH_SLOP) end();\n        return;\n      }\n      if (Math.abs(dx) < DRAG_SLOP && Math.abs(dy) < DRAG_SLOP) return;\n      d.armed = true;\n      dragKey.value = d.key;\n      reordering.value = true;\n    }\n    const gap = gapAt(ev.clientY);\n    const from = opts.keys().indexOf(d.key);\n    // Its own two gaps are not a drop: no marker, and the release writes nothing.\n    dropGap.value = gap === from || gap === from + 1 ? null : gap;\n    const scroller = opts.scroller?.();\n    if (scroller) {\n      const r = scroller.getBoundingClientRect();\n      if (ev.clientY < r.top + EDGE_PX) scroller.scrollTop -= 12;\n      else if (ev.clientY > r.bottom - EDGE_PX) scroller.scrollTop += 12;\n    }\n  }\n\n  /**\n   * ⚠ A finger that held (or dragged) is not a tap, but the browser may still\n   * emulate one when it lifts: mousedown / mouseup / CLICK at the point under\n   * it. Measured (e2e 158, Chromium touch emulation): that click landed on the\n   * menu sheet the hold had just opened — on its backdrop, which closes on a\n   * click — and the sheet was gone 50 ms later. Cancelling the touchend is\n   * what stops the emulation (useRowTouch follows the same rule). Just the one\n   * touchend that ends THIS gesture: pointerup comes first, so it is caught on\n   * its way in.\n   */\n  function cancelEmulatedClick() {\n    const stop = (e: Event) => {\n      if (e.cancelable) e.preventDefault();\n      off();\n    };\n    const timer = setTimeout(() => off(), 600);\n    function off() {\n      clearTimeout(timer);\n      window.removeEventListener('touchend', stop, true);\n    }\n    window.addEventListener('touchend', stop, { capture: true, passive: false });\n  }\n\n  function onUp(ev: PointerEvent) {\n    const d = g;\n    if (!d || ev.pointerId !== d.pointerId) return;\n    const gap = dropGap.value;\n    end();\n    if (d.touch && d.pressed) cancelEmulatedClick();\n    if (d.armed) {\n      endedAt = Date.now();\n      if (gap !== null) opts.onDrop(d.key, gap);\n      return;\n    }\n    if (d.touch && d.pressed && (opts.touchDelayMs ?? LONG_PRESS_MS) > 0) {\n      endedAt = Date.now();\n      opts.onHold?.(d.key);\n    }\n  }\n\n  function onKey(ev: KeyboardEvent) {\n    if (ev.key !== 'Escape' || !g) return;\n    ev.preventDefault();\n    ev.stopPropagation();\n    abort();\n  }\n\n  function abort() {\n    const armed = g?.armed === true;\n    end();\n    if (armed) endedAt = Date.now();\n  }\n\n  function end() {\n    if (g?.timer) clearTimeout(g.timer);\n    g = null;\n    dragKey.value = null;\n    dropGap.value = null;\n    reordering.value = false;\n    window.removeEventListener('pointermove', onMove);\n    window.removeEventListener('pointerup', onUp);\n    window.removeEventListener('pointercancel', abort);\n    window.removeEventListener('blur', abort);\n    window.removeEventListener('keydown', onKey, true);\n    window.removeEventListener('touchmove', onTouchMove);\n  }\n\n  function onClickCapture(ev: MouseEvent) {\n    if (Date.now() - endedAt < CLICK_SWALLOW_MS) {\n      ev.preventDefault();\n      ev.stopPropagation();\n    }\n  }\n\n  onBeforeUnmount(end);\n\n  return {\n    dragKey,\n    dropGap,\n    reordering,\n    touchActive: () => g?.touch === true,\n    onPointerDown,\n    onClickCapture,\n  };\n}\n","/**\n * storageOrder — the order a person put their storages in (GitHub #57:\n * \"Sidebar Storage sorting or manual reordering\").\n *\n * The navigation panel used to list the storages in the order the HOST hands\n * them over (the server's creation order in our own app). That order is\n * nobody's choice: a person with a \"Work\" drive they open fifty times a day\n * and an \"Archive\" they open once a year had no way to put the first one\n * first, and neither had the administrator who set both up.\n *\n * What this module decides, once, for every surface the explorer runs on\n * (the web app, the desktop app, fm.example.com and every embed — it is the SAME\n * component everywhere, so there is no per-surface branch here and must not\n * be one). Three layers, the most personal first:\n *\n *   1. the PERSON's own order, when they have made one (dragged a row, used\n *      the row menu, \"Sort by name\");\n *   2. else the ADMINISTRATOR's order — `sortOrder` on each storage (the\n *      server's `sort_order`, set on the admin Storages page; 1 = first).\n *      Storages the administrator has not placed come after the placed ones;\n *   3. else the host's order, unchanged. Nobody who never reorders, under an\n *      administrator who never reorders, sees anything move.\n *\n *   · A person's order wins for the storages it names. A storage it does NOT\n *     name — added since, or never visible to them when they ordered — keeps\n *     the position layers 2-3 give it, and the storages it names fill the\n *     other positions in the person's order. So a drive the administrator\n *     adds at the top appears at the top for everybody, and one added at the\n *     end appears at the end, without undoing anybody's arrangement. A name\n *     it holds that no longer exists is dropped from the screen without a\n *     word.\n *   · \"Sort by name\" is not a mode: it WRITES a name-sorted order, which the\n *     person can then keep adjusting by hand. One mechanism, not two that can\n *     disagree about which one is in charge. \"Use default order\" is the empty\n *     order — back to layers 2-3.\n *\n * WHERE IT LIVES. It is a PERSON's preference, so it is kept where the palette\n * is kept — the account document (`lib/prefs`, key `storageOrder`), which\n * follows them to every browser that signs in as them, with this browser's\n * `filex.storageOrder` as the first-paint mirror. An embed that never wires\n * the account document keeps it in the mirror alone, per browser. The\n * administrator's order is a column on the storage (migration 00060), sent\n * with every storage list.\n *\n * A storage is identified by its `uid` when the host sends one (a name can be\n * edited; a uid cannot) and by its name otherwise, and a saved entry matches\n * either — so an order saved before a host started sending uids still applies.\n */\nimport { computed, getCurrentInstance, onBeforeUnmount, ref, type ComputedRef, type Ref } from 'vue';\nimport {\n  PREF_LS_KEYS,\n  currentPrefs,\n  flushPrefs,\n  hasSession,\n  localPref,\n  onPrefs,\n  prefsConfigured,\n  prefsHydrated,\n  savePref,\n  setLocalPref,\n} from './prefs';\nimport { compareNames } from './sortOrder';\n\n/** What a storage has to carry to be ordered. `ExplorerConfig.storages` rows fit. */\nexport interface OrderableStorage {\n  name: string;\n  uid?: string;\n  label?: string;\n  /** The administrator's position (1 = first); null/absent = not placed. */\n  sortOrder?: number | null;\n}\n\n/** The key a saved order holds for this storage: its uid, else its name. */\nexport function storageOrderKey(s: OrderableStorage): string {\n  return s.uid || s.name;\n}\n\n/** The keys of a list, in its order — the form every gesture below answers in. */\nfunction keysOf(list: readonly OrderableStorage[]): string[] {\n  return list.map(storageOrderKey);\n}\n\n/**\n * The stored form → a list of keys. Anything that is not a JSON list of\n * strings reads as \"no order\": a preference is never worth an exception, and\n * a damaged value must fall back to the host's order, not to a blank panel.\n */\nexport function parseStorageOrder(raw: unknown): string[] {\n  if (typeof raw !== 'string' || !raw) return [];\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(raw);\n  } catch {\n    return [];\n  }\n  if (!Array.isArray(parsed)) return [];\n  const out: string[] = [];\n  const seen = new Set<string>();\n  for (const k of parsed) {\n    if (typeof k !== 'string' || !k || seen.has(k)) continue;\n    seen.add(k);\n    out.push(k);\n  }\n  return out;\n}\n\n/** A list of keys → the stored form. Empty is `''`: \"never reordered\". */\nexport function serializeStorageOrder(keys: readonly string[]): string {\n  return keys.length ? JSON.stringify(keys) : '';\n}\n\n/** A number the list can be sorted on, or null. Anything else is \"not placed\". */\nfunction placed(v: unknown): number | null {\n  return typeof v === 'number' && Number.isFinite(v) ? v : null;\n}\n\n/**\n * Layers 2-3: the administrator's order over the host's. A STABLE sort, so\n * storages with no position, and storages that share one, keep the host's\n * relative order.\n */\nexport function defaultStorageOrder<T extends OrderableStorage>(storages: readonly T[]): T[] {\n  return storages\n    .map((s, i) => ({ s, i, p: placed(s.sortOrder) }))\n    .sort((a, b) => {\n      if (a.p === null || b.p === null) return a.p === b.p ? a.i - b.i : a.p === null ? 1 : -1;\n      return a.p - b.p || a.i - b.i;\n    })\n    .map((x) => x.s);\n}\n\n/**\n * The storages in the order this person sees them: theirs over the\n * administrator's over the host's (the header has the rule).\n *\n * ⚠ The host's rows are returned as they came (same objects, every field\n * intact), only reordered. The person's order is applied by SLOT: the\n * positions the default order gives the storages the person named are\n * re-filled with those storages in the person's order; every other storage\n * stays exactly where the default order put it.\n */\nexport function orderStorages<T extends OrderableStorage>(storages: readonly T[], saved: readonly string[]): T[] {\n  const base = defaultStorageOrder(storages);\n  if (!saved.length || base.length < 2) return base;\n  const rank = new Map<string, number>();\n  saved.forEach((k, i) => {\n    if (!rank.has(k)) rank.set(k, i);\n  });\n  const rankOf = (s: T): number | undefined => (s.uid ? rank.get(s.uid) : undefined) ?? rank.get(s.name);\n  const named = base\n    .filter((s) => rankOf(s) !== undefined)\n    .sort((a, b) => (rankOf(a) ?? 0) - (rankOf(b) ?? 0));\n  let next = 0;\n  return base.map((s) => (rankOf(s) === undefined ? s : named[next++]));\n}\n\n/**\n * Move one storage `delta` rows (−1 = up, +1 = down). The whole new order, or\n * `null` when the move would go past either end — the menu greys the row out\n * for exactly that case, and a caller that asks anyway changes nothing.\n */\nexport function moveStorage(ordered: readonly OrderableStorage[], key: string, delta: number): string[] | null {\n  const keys = keysOf(ordered);\n  const from = keys.indexOf(key);\n  const to = from + delta;\n  if (from < 0 || delta === 0 || to < 0 || to >= keys.length) return null;\n  keys.splice(from, 1);\n  keys.splice(to, 0, key);\n  return keys;\n}\n\n/**\n * A drag released over GAP `gap` — the gap BEFORE row `gap` among the rows on\n * screen, the dragged row still counted (`0` = above the first, `n` = below\n * the last). ⚠ Its own two gaps are not a drop: releasing there leaves the\n * order as it was, and `null` says so, so nothing is written for a drag that\n * went nowhere.\n */\nexport function dropStorageAt(ordered: readonly OrderableStorage[], key: string, gap: number): string[] | null {\n  const keys = keysOf(ordered);\n  const from = keys.indexOf(key);\n  if (from < 0) return null;\n  const g = Math.max(0, Math.min(keys.length, Math.trunc(gap)));\n  if (g === from || g === from + 1) return null;\n  keys.splice(from, 1);\n  keys.splice(g > from ? g - 1 : g, 0, key);\n  return keys;\n}\n\n/**\n * \"Sort by name\": the order the Name column would give the labels a person\n * READS (`label`, else the name) — `compareNames`, the listing's own rule, so\n * the panel and the drives listing sorted by name agree.\n */\nexport function sortStoragesByName(ordered: readonly OrderableStorage[]): string[] {\n  return ordered\n    .map((s, i) => ({ s, i }))\n    .sort((a, b) => compareNames(a.s.label || a.s.name, b.s.label || b.s.name) || a.i - b.i)\n    .map((x) => storageOrderKey(x.s));\n}\n\n/**\n * The order to STORE after the visible storages were reordered to `visibleKeys`.\n *\n * ⚠⚠ A saved entry this view cannot see is KEPT, right after the entry it\n * followed. What a view draws is not the whole list: a grant that comes and\n * goes, an administrator's explorer beside the RBAC-filtered one, a host that\n * hands an embed fewer drives. Storing only what is on screen would erase the\n * place of every drive that happened to be off it — and the person would find\n * their arrangement gone the next time it came back.\n */\nexport function mergeStorageOrder(\n  visibleKeys: readonly string[],\n  visible: readonly OrderableStorage[],\n  saved: readonly string[],\n): string[] {\n  const result = [...visibleKeys];\n  if (!saved.length) return result;\n  /* Every identity a visible storage answers to (name AND uid), mapped to the\n   * key it is stored under now. */\n  const keyOf = new Map<string, string>();\n  for (const s of visible) {\n    keyOf.set(s.name, storageOrderKey(s));\n    if (s.uid) keyOf.set(s.uid, storageOrderKey(s));\n  }\n  let anchor: string | null = null;\n  for (const k of saved) {\n    const visibleKey = keyOf.get(k);\n    if (visibleKey !== undefined) {\n      anchor = visibleKey;\n      continue;\n    }\n    if (result.includes(k)) continue;\n    const at = anchor === null ? 0 : result.indexOf(anchor) + 1;\n    result.splice(at, 0, k);\n    anchor = k;\n  }\n  return result;\n}\n\n/* ── the person's order, shared by every explorer on the page ────────────── */\n\nconst saved: Ref<string[]> = ref([]);\n/** The account write queued until the account's document arrives. */\nlet queuedWrite: (() => void) | null = null;\nlet queuedRaw = '';\n\n/**\n * This browser's copy. ⚠ Behind `hasSession()`, like the palette: with nobody\n * signed in, an order found here belongs to whoever used this browser last.\n */\nfunction readMirror(): string[] {\n  if (!hasSession()) return [];\n  return parseStorageOrder(localPref('storageOrder'));\n}\n\n/**\n * Store a new order.\n *\n * `visibleKeys` is the whole list as the person now sees it; `[]` is \"Reset\n * order\". `visible` is the list the gesture was made on, so the entries it\n * does not draw keep their place (`mergeStorageOrder`).\n *\n * ⚠⚠ Never written to the account BEFORE the account's document has arrived\n * (the same rule `lib/tour` follows): `PUT /api/me/prefs` replaces the whole\n * document, and a write made from an empty copy would erase the person's\n * palette, density and language to record the order of their drives. Until it\n * arrives the order is on screen and in the mirror, and is sent the moment it\n * does.\n */\nexport function saveStorageOrder(visibleKeys: readonly string[], visible: readonly OrderableStorage[]): void {\n  const next = visibleKeys.length ? mergeStorageOrder(visibleKeys, visible, saved.value) : [];\n  saved.value = next;\n  const raw = serializeStorageOrder(next);\n  if (!prefsConfigured()) {\n    // An embed with no account document: this browser is the only home.\n    setLocalPref('storageOrder', raw);\n    return;\n  }\n  if (prefsHydrated()) {\n    sendNow(raw);\n    return;\n  }\n  setLocalPref('storageOrder', raw);\n  queuedRaw = raw;\n  if (queuedWrite) return;\n  queuedWrite = onPrefs(() => {\n    queuedWrite?.();\n    queuedWrite = null;\n    sendNow(queuedRaw);\n    saved.value = parseStorageOrder(queuedRaw);\n  });\n}\n\n/**\n * To the account AT ONCE, not after the debounce — the language switcher's\n * rule (web/src/i18n), for the same reason: a reorder is one drop or one\n * click, not a slider, and the account's copy OUTRANKS this browser's on the\n * next load. Left to the 400 ms debounce, a reload or a closed tab right after\n * the drop read the old order back from the server (measured, e2e 158).\n */\nfunction sendNow(raw: string): void {\n  savePref('storageOrder', raw);\n  void flushPrefs();\n}\n\nexport interface StorageOrderHandle {\n  /** The saved order, as keys (`[]` = the host's order). */\n  saved: Readonly<Ref<string[]>>;\n  /** The person has an order of their own — what \"Use default order\" lets go of. */\n  custom: ComputedRef<boolean>;\n}\n\n/**\n * The explorer's handle on the order.\n *\n * Each call re-reads this browser's mirror — a mount after a sign-out, or\n * after another tab changed it, starts from the current answer rather than\n * the last one this module happened to hold — and follows the account's\n * document while the calling component lives.\n */\nexport function useStorageOrder(): StorageOrderHandle {\n  saved.value = readMirror();\n  /* ⚠ `currentPrefs()`, not the snapshot the listener is handed: a queued\n   * write (above) may have run earlier in the same announcement, and the\n   * snapshot predates it. */\n  const off = onPrefs(() => {\n    saved.value = parseStorageOrder(currentPrefs().storageOrder);\n  });\n  if (getCurrentInstance()) onBeforeUnmount(off);\n  return { saved, custom: computed(() => saved.value.length > 0) };\n}\n\n/* Another tab changed it: follow, but only for a signed-in window (the same\n * gate, and the same reason, as the palette's cross-tab listener in\n * lib/themes). */\nif (typeof window !== 'undefined') {\n  try {\n    window.addEventListener('storage', (e) => {\n      if (e.key !== PREF_LS_KEYS.storageOrder || !hasSession()) return;\n      saved.value = parseStorageOrder(e.newValue);\n    });\n  } catch {\n    /* non-browser env */\n  }\n}\n\n/** Testing seam: forget the module's state. */\nexport function resetStorageOrderState(): void {\n  saved.value = [];\n  queuedWrite?.();\n  queuedWrite = null;\n  queuedRaw = '';\n}\n","<script setup lang=\"ts\">\n/**\n * StorageTags — what kind of storage a row is, in the same words everywhere.\n *\n * ⚠⚠ ONE vocabulary (release-candidate sweep, 2026-09-21, QA #34): the admin\n * panel had TWO lists of the same storages, and they described them in two\n * dialects — Admin → Storages marked a read-only storage \"RO\" next to a raw\n * driver id (\"local\"), Connections → Storages marked it \"SALT OKUNUR\" next to\n * \"LOCAL\" (the same id, upper-cased by CSS), and the explorer's side bar says\n * \"Salt okunur\". This component is the one place those words are chosen: the\n * driver's NAME (the same `storages.driver.*` names the storage form offers),\n * then \"Read-only\" and \"Disabled\" when they apply. Both lists draw it.\n *\n * A driver this build has no name for (an external plugin's) is shown as its\n * id rather than hidden.\n *\n * ⚠ It is also THE read-only mark of the explorer: the side panel's storage\n * row and the Home card draw it with no `driver` (only the fact that matters\n * there). Wave 2 had grown two looks for one fact — the explorer's tinted pill\n * (\"Salt okunur\" on the panel and on Home) and this bordered one in the admin\n * lists — so the explorer now draws this component too.\n */\nimport { computed } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = withDefaults(\n  defineProps<{\n    /** The driver id; absent draws no driver tag (the explorer's read-only mark). */\n    driver?: string;\n    readOnly?: boolean;\n    /** `false` draws \"Disabled\"; `undefined` / `true` draws nothing. */\n    enabled?: boolean;\n    locale?: LocaleCode | string;\n  }>(),\n  // ⚠ An explicit `undefined` default. Vue casts an ABSENT boolean prop to\n  // `false`, so without it every caller that does not pass `enabled` (the\n  // explorer's marks, Admin → Replica) drew \"Disabled\" beside \"Read-only\".\n  { enabled: undefined },\n);\n\nconst { t } = useLocale(() => props.locale ?? 'en');\n\nconst driverName = computed(() => {\n  if (!props.driver) return '';\n  const key = `storages.driver.${props.driver}`;\n  const out = t(key);\n  return out === key ? props.driver : out;\n});\n</script>\n\n<template>\n  <span class=\"fe-stags\" data-testid=\"storage-tags\">\n    <span v-if=\"driver\" class=\"fe-stag\" :title=\"driver\" data-testid=\"storage-tag-driver\">{{ driverName }}</span>\n    <span v-if=\"readOnly\" class=\"fe-stag fe-stag--warn\" data-testid=\"storage-tag-readonly\">{{\n      t('sidenav.storage.readOnly')\n    }}</span>\n    <span v-if=\"enabled === false\" class=\"fe-stag\" data-testid=\"storage-tag-disabled\">{{\n      t('conn.list.disabled')\n    }}</span>\n  </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * SideNav — the explorer's navigation panel.\n *\n * A left column inside `.fe__main`, sibling to `.fe__primary` and the mirror\n * image of `InspectorPanel` on the other side. Three sections, top to bottom:\n * the primary action (Upload, with New folder as a secondary), the views\n * (Recent / Starred / Shared with me / Trash), and the storages the caller can\n * see.\n *\n * Why it exists (GitHub #14): the explorer's shape — split pane, tabs, three\n * view modes, \"How to connect\" — is a power-user tool, and the reporter's\n * users read that as a file manager they would have to relearn. The answer is\n * not a second UI: it is one explorer with the navigation people already know\n * from Drive, that anyone can collapse when they want the width back.\n *\n * Collapse goes to a RAIL, not to nothing. A panel that vanishes takes its own\n * re-open affordance with it; the rail keeps every destination one click away\n * and every icon tab-reachable, with its label in `title` + `aria-label`.\n *\n * ⚠ Presentational only. It fetches nothing and owns no listing state — the\n * host (FileExplorer) loads the views and tells this component which one is\n * active, exactly as it does for Toolbar. Two components fetching the same\n * list is how the panel and the pane end up disagreeing.\n *\n * ⚠ No `<style>` block, scoped or otherwise: the package's CSS lives in\n * `styles/base.css`. A scoped block compiles to `.cls[data-v-HASH]` and the\n * hash does not match in the web-component build, so the rules silently stop\n * applying in every embed (measured on the share dialog: raw unstyled HTML).\n */\nimport { computed, nextTick, onBeforeUnmount, ref } from 'vue';\nimport { useLocale } from '../composables/useLocale';\nimport { useReorderDrag } from '../composables/useReorderDrag';\nimport { inlineStartX } from '../lib/direction';\nimport { dropStorageAt, moveStorage, sortStoragesByName, storageOrderKey } from '../lib/storageOrder';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport type { TagItem, TagKind } from '../lib/tags';\nimport TagKindIcon from './TagKindIcon.vue';\nimport StorageTags from './StorageTags.vue';\nimport ContextMenu, { type ContextAction } from './ContextMenu.vue';\n\n/** The virtual listings the panel can open. '' = an ordinary folder.\n *  ⚠ `home` is not a listing: it is the overview (storages · recent · starred)\n *  the reference shell lands on, and the explorer renders it instead of a file\n *  list. It is in this union because the panel's selected-row logic, the\n *  address bar and the tab strip all key off ONE type — a second mechanism for\n *  \"which destination am I on\" is how two of them end up disagreeing. */\nexport type NavView = '' | 'home' | 'recent' | 'starred' | 'shared' | 'drafts' | 'trash' | 'tag';\n\n/**\n * A row in the panel's first group — what `open-view` carries.\n *\n * ⚠ It is NOT `NavView`. \"My files\" is a destination without being a view: it\n * opens the root LISTING, so the explorer answers it with an ordinary\n * navigation and `activeView` goes back to `''`. Giving it a NavView value\n * would mean a mode that every `if (navView)` in the explorer — \"is this a\n * cross-folder view?\", \"is there a folder to upload into?\", \"what does Up do?\"\n * — would answer wrongly, for a row whose whole job is to be an ordinary\n * folder again.\n */\nexport type NavDest = Exclude<NavView, '' | 'tag'> | 'myfiles';\n\nexport interface NavStorage {\n  name: string;\n  /** The storage's immutable id, when the host knows it — what a saved order keys on (#57). */\n  uid?: string;\n  label?: string;\n  driver?: string;\n  readOnly?: boolean;\n}\n\n/**\n * A row of the \"Apps\" section — an app plugin's `home` view, already read in\n * the viewer's language by the host (docs/APP-PLUGINS-API.md → Placements).\n */\nexport interface NavApp {\n  /** `<plugin>/<view>` — what `open-app` carries back. */\n  key: string;\n  label: string;\n  /** A manifest icon name; drawn when `lib/actionIcons` has it, else the plugin glyph. */\n  icon?: string;\n}\n\nconst props = withDefaults(defineProps<{\n  /** Expanded (labels visible) vs collapsed to the icon rail. */\n  expanded: boolean;\n  /** Narrow/embed mode — the panel is a drawer over the listing, not a column. */\n  narrow?: boolean;\n  /** Which virtual view is on screen, so the row can read as selected. */\n  activeView: NavView;\n  /** Storage currently open ('' at the multi-storage root). */\n  activeStorage?: string;\n  /**\n   * Storages the caller can see (ExplorerConfig.storages), ALREADY in the\n   * person's order (#57, `lib/storageOrder`). The panel draws them as handed\n   * and announces a new order with `reorder-storages`; it stores nothing.\n   */\n  storages: NavStorage[];\n  /**\n   * The person has an order of their own (#57) — \"Use default order\" is live only\n   * then. Absent = the host's order, and the row is greyed out.\n   */\n  storageOrderCustom?: boolean;\n  /**\n   * Names of storages the caller reaches through a GRANT rather than their own\n   * role — Drive's \"shared drives\". Marked, not sorted out: the reporter's ask\n   * was that they \"just appear there\", one click, no mount instructions.\n   */\n  sharedStorages?: string[];\n  /** Show the Trash entry (mirrors ExplorerConfig.trashVisible). */\n  trashVisible?: boolean;\n  /**\n   * Drafts (issue #71): draw the \"Drafts\" row — true when the server keeps\n   * drafts for this caller (`capabilities.drafts`). Absent means no: an older\n   * server, an app token or a confined embed has no drafts to show.\n   */\n  draftsVisible?: boolean;\n  /** How many drafts the person keeps — the row's badge. 0 draws none: a\n   *  count, never a notification. */\n  draftCount?: number;\n  /* === etiket:t1 — the Tags section ==================================\n   * \"Tagged files should show up inside the tag.\" Tags are the one\n   * navigation family whose entries are USER data: unbounded in number and\n   * dynamic in name. Still presentational here — the host fetches\n   * `tags/all` (once, cached) and hands the list over, exactly as it does\n   * for storages. */\n  /** Every tag the person can see, alphabetical, WITH its kind (v0.43:\n   *  personal or team). Empty → the section shows its own \"no tags yet\" line\n   *  rather than disappearing. */\n  tags?: TagItem[];\n  /** False until the first answer arrives, so \"no tags yet\" is never shown\n   *  to somebody who is simply still waiting. */\n  tagsLoaded?: boolean;\n  /** The tag currently on screen (activeView === 'tag'). */\n  activeTag?: string;\n  /** …and its kind ('' = a view of both kinds, e.g. an old `#.tag~x` link). */\n  activeTagKind?: TagKind | '';\n  /**\n   * Show the Connections entries — \"How to connect\" and \"API keys\".\n   * ⚠ Never derived from a role here or anywhere: the backend decides what a\n   * caller may see, and hiding the surface client-side only hides it from the\n   * accounts that need it (see ExplorerConfig.connections).\n   */\n  showConnections?: boolean;\n  /**\n   * paylas:m1 — draw the \"My shares\" row (mirrors ExplorerConfig.mySharesVisible).\n   *\n   * ⚠ Absent means NO, and that is the one place this prop differs from\n   * `trashVisible` beside it: the row's destination is a page of the HOST, so\n   * a panel that draws it without being asked draws a button that does\n   * nothing. Vue casts an absent Boolean prop to `false`, which is exactly the\n   * answer wanted here — a host that says nothing has not promised a screen.\n   * (The inverse default is the trap lib-wide; see ExplorerConfig.trashVisible,\n   * read as `!== false`, and `withDefaults` everywhere a default is ON.)\n   */\n  showMyShares?: boolean;\n  /**\n   * #162 - draw the \"App store\" row under \"Apps\" (FileExplorer decides it,\n   * lib/appStoreRow: the host's `appStorePage`, a person, the server's\n   * answer). Absent means no, as for `showMyShares`: the screen is the\n   * host's.\n   */\n  showAppStore?: boolean;\n  /**\n   * Draw the surfaces that only mean something for ONE person: API keys,\n   * Recent, Starred, Shared with me. False when the caller is an app token —\n   * a host proxy's shared credential, where \"your keys\" would be the proxy's\n   * own and \"your Recent\" would be the token owner's history shown to a\n   * stranger (see ExplorerConfig.callerKind).\n   *\n   * ⚠ This is a KIND check, not the role check the comment above forbids, and\n   * it is not the whole panel: Upload, the storages, Trash and \"How to\n   * connect\" stay — an embed's users still upload and still mount. An embedder\n   * who wants no panel at all already has `sideNav: false`.\n   */\n  showIdentitySurfaces?: boolean;\n  /** RBAC/root state — false hides the write affordances. */\n  canWrite?: boolean;\n  locale: LocaleCode;\n  /* === surucu:d1 — the shell ========================================== */\n  /**\n   * ⚠ There is no `newMenu` prop any more. The two-button block (Upload as the\n   * primary, New folder one step quieter) is gone and the \"+ New\" menu is what\n   * this panel draws, everywhere — it is the shell, not a profile. Nothing was\n   * removed: the menu holds what the explorer could already do — upload files,\n   * make a folder (the modal offers the encrypted variant from inside itself),\n   * and ask somebody else for files.\n   *\n   * There is deliberately no \"Upload folder\": the upload path takes a flat\n   * `File[]` and would have to create the intermediate directories itself, and\n   * an entry that quietly flattens someone's folder into one heap is worse\n   * than an entry that is not there.\n   */\n  /** Offer \"Request files\" in that menu — a folder we may write to and share. */\n  canRequestFiles?: boolean;\n  /**\n   * May this account make file requests at all here (`share.upload_links`)?\n   * `false` drops the row — like every action the account's role does not\n   * allow, it is not offered — where `canRequestFiles` only greys it for a\n   * folder that cannot take one. Absent = allowed: the server decides.\n   */\n  requestFilesAllowed?: boolean;\n  /**\n   * belge:n1 — offer \"New document\" in that menu. False on a server that\n   * publishes no `newdoc_types`, and on one where every type it publishes\n   * needs an editor service this deployment has not got.\n   */\n  canNewDocument?: boolean;\n  /**\n   * The storage line, as `lib/storageLine` decided it. Null (the default)\n   * renders nothing at all.\n   *\n   * ⚠ Which number it is depends on the person, and the label covers both:\n   * with a quota, their own uploads against it (\"X of Y\"); without one, the\n   * size of the drives listed above — the figure Home's cards print, in the\n   * same sentence. `partial` makes that size a lower bound (\"at least X\").\n   * The mockup labels it with one drive's name; the line may sum several, so\n   * the label says \"Storage\" and the drive names stay out of it.\n   */\n  quota?: { used: number; total: number; unlimited: boolean; partial?: boolean } | null;\n  /** Resolved theme — the teleported New menu leaves the `.fe` variable scope. */\n  theme?: ThemeMode;\n  /**\n   * App plugins — the `home` views, one row each under \"Apps\". Empty or\n   * absent hides the section entirely: a heading over nothing is a promise\n   * the deployment cannot keep.\n   */\n  apps?: NavApp[];\n}>(), {\n  // An absent Boolean prop is `false` in Vue; this one defaults to ON — a\n  // host that says nothing lets the server decide.\n  requestFilesAllowed: true,\n});\n\nconst emit = defineEmits<{\n  (e: 'toggle'): void;\n  (e: 'open-view', view: NavDest): void;\n  (e: 'open-tag', tag: string, kind: TagKind): void;\n  (e: 'open-storage', name: string): void;\n  (e: 'open-root'): void;\n  (e: 'upload'): void;\n  (e: 'new-folder'): void;\n  (e: 'new-document'): void;\n  (e: 'open-connections'): void;\n  (e: 'open-tokens'): void;\n  /**\n   * \"My shares\" — the public links THIS person handed out.\n   *\n   * ⚠ Unlike every other row in the views group, it does not change the\n   * listing: the screen lives in the HOST (the SPA's `my-shares` route), so\n   * the panel can only announce the intent and the host decides where it\n   * lands. A host with no such screen does not listen, and nothing here\n   * pretends otherwise.\n   */\n  (e: 'open-my-shares'): void;\n  /** #162 - the \"App store\" row: the host opens its store screen. */\n  (e: 'open-app-store'): void;\n  /** App plugins — an \"Apps\" row: open that `home` view. */\n  (e: 'open-app', key: string): void;\n  /* surucu:d1 — \"Request files\": the access modal on THIS folder, drop tab. */\n  (e: 'request-files'): void;\n  /**\n   * #57 — the storages were reordered: a drag, \"Move up/down\" or \"Sort by\n   * name\". Carries the WHOLE new order as storage keys (`uid`, else the name);\n   * `[]` is \"Use default order\". The host stores it (`lib/storageOrder`).\n   */\n  (e: 'reorder-storages', keys: string[]): void;\n  /** Drawer scrim / Esc — narrow mode only. */\n  (e: 'close'): void;\n}>();\n\nconst { t, formatSize, dir } = useLocale(() => props.locale);\n\n// In drawer mode \"expanded\" is the only meaningful state: a rail inside an\n// overlay would be an overlay that shows nothing but icons while covering the\n// listing anyway.\nconst showLabels = computed(() => props.expanded || !!props.narrow);\n\nconst sharedSet = computed(() => new Set(props.sharedStorages ?? []));\n\n/** The views that answer \"what did *I* do\" — dropped for an app token. */\nconst IDENTITY_VIEWS = new Set<string>(['recent', 'starred', 'shared', 'drafts']);\n\n/**\n * gorunum:v3-shell — the destinations, and their ORDER.\n *\n * Home · My files · Shared with me · Recent · Starred · Trash. The order is\n * not a taste: it runs from the widest answer to the narrowest — everything\n * you have, then your own tree, then somebody else's, then two slices of your\n * own, then what you threw away. The panel used to open with Recent, which\n * put a slice of the tree above the tree.\n *\n * ⚠⚠ \"My files\" is drawn ONLY where it can honestly mean \"my files\" — a\n * deployment whose caller can see at most ONE storage. There it opens that\n * storage's root and the label is the truth (measured: `soleStorageName` in\n * FileExplorer sends `load('')` straight to the storage, so the row lands on\n * the file list, exactly as the reference build's own \"My files\" does).\n *\n * With SEVERAL storages it cannot mean that, and what it actually did was open\n * the multi-storage root — a listing OF THE DRIVES. Owner, 2026-09-13: \"my\n * files kısmında yüklediğimiz dosyalar gelmesi lazım ama onun yerine storages\n * gösteren ana bölge geliyor… direk silebiliriz.\" Three reasons it goes rather\n * than gets repointed:\n *\n *   1. it was the THIRD copy of that list. Home's \"Storages\" section draws the\n *      same drives as cards with a size caption, and this panel's own STORAGES\n *      group draws them one click away — and all three are on screen together.\n *      \"Aynı işlevi yapan iki buton olmaması lazım.\"\n *   2. it was the worst of the three. The drives are synthesized rows, so the\n *      listing shows them under Type / Modified / Size columns that are all\n *      \"—\", owner \"System\", and with no filter row at all.\n *   3. nothing is stranded. Measured in the browser: the breadcrumb's house\n *      crumb (`crumbs[0]`, `adapterPath: ''`) and Alt+↑ from a storage root\n *      both land on exactly that listing, and both leave the panel in the same\n *      state this row used to.\n *\n * ⚠ `<= 1`, not `=== 1`: a caller who can see NO storage keeps the row, so an\n * account with nothing mounted still has a door back to the root listing and\n * its \"no storages\" message, rather than a panel of views with no files in it.\n * ⚠ It is still not an identity view — where it IS drawn it stays drawn for an\n * app token, which has no Recent and no Starred to escape through.\n */\nconst views = computed(() => {\n  const list: Array<{ key: NavDest; label: string }> = [\n    { key: 'home', label: t('sidenav.home') },\n    ...(props.storages.length <= 1\n      ? [{ key: 'myfiles' as NavDest, label: t('sidenav.myfiles') }]\n      : []),\n    { key: 'shared', label: t('sidenav.shared') },\n    { key: 'recent', label: t('sidenav.recent') },\n    { key: 'starred', label: t('sidenav.starred') },\n  ];\n  // Drafts (issue #71): beside Trash, the other place a document waits.\n  if (props.draftsVisible) list.push({ key: 'drafts', label: t('sidenav.drafts') });\n  if (props.trashVisible !== false) list.push({ key: 'trash', label: t('sidenav.trash') });\n  // Filtered at the end rather than built conditionally: Trash is shared by\n  // everyone and the list keeps growing, so one rule at the bottom beats a\n  // condition wrapped around each entry.\n  if (props.showIdentitySurfaces === false) return list.filter((v) => !IDENTITY_VIEWS.has(v.key));\n  return list;\n});\n\nconst writable = computed(() => props.canWrite !== false);\n\n/** App plugins — the \"Apps\" rows, with a glyph the icon library knows. */\nconst appRows = computed(() =>\n  (props.apps ?? []).map((a) => ({\n    ...a,\n    svg: actionIconSvg(a.icon && actionIconSvg(a.icon) !== '' ? a.icon : 'plugin'),\n  })),\n);\n\n/**\n * The storage the listing is in is mounted read-only. Its \"+ New\" menu is not\n * disabled but GONE: on a read-only mount there is no folder where any of\n * its rows could ever work, and a disabled menu invites the question a menu\n * cannot answer. The row itself says why — see the tag on it (issue #30).\n */\nconst activeReadOnly = computed(\n  () => !!props.activeStorage && props.storages.some((s) => s.name === props.activeStorage && s.readOnly === true),\n);\n\n/**\n * The Trash is read-only in the same sense, and gets the same answer: no\n * \"+ New\". It used to stand there with every row greyed (QA, 2026-09-21) —\n * nothing is ever made inside the Trash, so a menu of things you cannot make\n * there only asks a question it cannot answer.\n */\nconst newShown = computed(() => !activeReadOnly.value && props.activeView !== 'trash');\n\n/**\n * Which row reads as the one you are standing on.\n *\n * Every view answers for itself. \"My files\" is the exception, because it has\n * no view value to compare against: it is lit when the explorer is showing the\n * ROOT of the tree and nothing else — no virtual view, and no storage opened,\n * which is the state where the storage rows below all read as inactive too.\n * Inside a storage the storage's own row is the active one, so lighting both\n * would claim the selection is in two places.\n */\n/**\n * A row's name as it is announced: its label, and for Drafts the count the\n * badge draws — the badge itself is aria-hidden, so a screen reader hears\n * \"Drafts, 3 drafts\" once rather than a stray number.\n */\nfunction viewLabel(v: { key: NavDest; label: string }): string {\n  const n = props.draftCount ?? 0;\n  if (v.key !== 'drafts' || n <= 0) return v.label;\n  return `${v.label}, ${t('sidenav.drafts.count', { n })}`;\n}\n\nfunction isActiveDest(key: NavDest): boolean {\n  if (key === 'myfiles') return !props.activeView && !props.activeStorage;\n  return props.activeView === key;\n}\n\n/* === etiket:t1 — an unbounded list in a fixed panel ====================\n * A user with sixty tags must not push Storages and Connections off the\n * bottom of the panel, and must not be handed sixty identical glyphs on a\n * 56px rail either.\n *\n *   expanded / drawer → the first TAG_PEEK, then \"Show all (N)\". Both states\n *                       scroll (.fe-sidenav__scroll), so this is about the\n *                       sections BELOW staying reachable, not about overflow.\n *   rail             → ONE \"Tags\" button that opens the panel. Sixty rail\n *                       icons would be sixty copies of the same glyph with no\n *                       label — the rail's contract is \"every destination one\n *                       click away\", and this keeps it with one click more.\n */\nconst TAG_PEEK = 8;\nconst tagsExpanded = ref(false);\nconst allTags = computed(() => props.tags ?? []);\n/* etiket:k2 (v0.43.0) — the list is two GROUPS, Personal then Team, each under\n * its own caption with the kind's glyph, and each row repeats the glyph. Until\n * this release there was one kind, shared with every account on the server,\n * and the panel never said so (tester, 2026-09-22). The peek applies per\n * group: sixty personal tags must not push the team's off the panel. */\nconst tagGroups = computed(() =>\n  (['personal', 'team'] as TagKind[])\n    .map((kind) => {\n      const list = allTags.value.filter((tag) => tag.kind === kind);\n      return { kind, list, visible: tagsExpanded.value ? list : list.slice(0, TAG_PEEK) };\n    })\n    .filter((g) => g.list.length > 0),\n);\nconst hiddenTagCount = computed(() =>\n  tagGroups.value.reduce((n, g) => n + g.list.length - g.visible.length, 0),\n);\nconst anyGroupLong = computed(() => tagGroups.value.some((g) => g.list.length > TAG_PEEK));\n\nfunction tagIsActive(tag: TagItem): boolean {\n  if (props.activeView !== 'tag' || props.activeTag !== tag.name) return false;\n  return !props.activeTagKind || props.activeTagKind === tag.kind;\n}\n/* The section is rendered as soon as the panel knows there ARE tags, and also\n * once the answer came back empty — an empty section that says why is how a\n * user learns the feature exists at all. It stays hidden only while the first\n * answer is still in flight. */\nconst showTags = computed(() => !!props.tagsLoaded || allTags.value.length > 0);\n\n/* === surucu:d1 — the \"+ New\" menu ====================================\n * One primary action instead of two buttons, the shape the reporter drew and\n * the shape Drive/FileRun/Nextcloud share. It is the SAME ContextMenu the\n * right-click menu uses — teleported to <body>, so the panel's own scroll\n * container cannot clip it, and one keyboard/focus behaviour for both. */\nconst newBtnEl = ref<HTMLElement | null>(null);\nconst newMenuRef = ref<InstanceType<typeof ContextMenu> | null>(null);\n\nconst newActions = computed<ContextAction[]>(() => {\n  const list: ContextAction[] = [\n    /* ⚠ NO `icon:` on any of these three, and that is the fix rather than an\n       omission. `ContextMenu.iconFor` resolves `actionIconSvg(a.icon || a.key)`,\n       so an `icon` string is an OVERRIDE — and `'⬆'` / `'📁'` / `'🔗'` are not\n       keys, so the lookup missed, the component fell through to its literal\n       branch and printed the emoji. Meanwhile `new-document`, which carries no\n       override, resolved by key and drew a proper glyph: one menu, two icon\n       systems, three rows apart. All three keys have had stroked glyphs in\n       `lib/actionIcons.ts` the whole time (`upload`, `new-folder`,\n       `request-files`); dropping the override is what reaches them.\n       ⚠ Emoji in markup is forbidden here for a reason that is visible in this\n       very menu: they are rendered by whatever font the OS ships, so the row\n       came out flat-grey on one machine and full-colour on another, at a weight\n       that matched nothing beside it. */\n    { key: 'upload', label: t('drive.new.upload'), disabled: !writable.value },\n    { key: 'new-folder', label: t('drive.new.folder'), disabled: !writable.value },\n  ];\n  // belge:n1 — DROPPED rather than disabled when unavailable, unlike\n  // \"Request files\": a disabled row invites the question \"why?\" and cannot\n  // answer it. The dialog behind it explains what is missing; a greyed row\n  // in a menu has nowhere to say so.\n  if (props.canNewDocument) {\n    list.push({ key: 'new-document', label: t('drive.new.document'), disabled: !writable.value });\n  }\n  // Only when there is a real folder to hang a drop link on. Rendered as a\n  // disabled row rather than dropped, so the menu does not change height\n  // between folders — a menu whose items move is a menu people misclick.\n  // ⚠ Except when the account may not make file requests at all\n  // (`share.upload_links`): then it is not offered, like every other action\n  // the role does not allow. It used to stay, and the server said no.\n  if (props.requestFilesAllowed !== false) {\n    list.push({ divider: true, key: 'new-sep', label: '' });\n    list.push({\n      key: 'request-files',\n      label: t('drive.new.request'),\n      disabled: !props.canRequestFiles,\n    });\n  }\n  return list;\n});\n\nfunction openNewMenu() {\n  const r = newBtnEl.value?.getBoundingClientRect();\n  newMenuRef.value?.show(\n    // ⚠ RTL: hangs from the pill's START edge (its right side in RTL).\n    { clientX: r ? inlineStartX(r, dir.value) : 0, clientY: r ? r.bottom + 6 : 0 } as MouseEvent,\n    [],\n  );\n}\n\nfunction onNewSelect(a: ContextAction) {\n  if (a.key === 'upload') emit('upload');\n  else if (a.key === 'new-document') emit('new-document');\n  else if (a.key === 'new-folder') emit('new-folder');\n  else if (a.key === 'request-files') emit('request-files');\n}\n\n/* === surucu:d1 — the storage line ===================================\n * The size comes from `useLocale.formatSize`, the same call `HomeView` makes\n * for the same `drive.storage.*` string. There was a private byte formatter\n * here with hardcoded English units and its own rounding, so one quota\n * rendered two ways — \"9.3 GB\" in this rail, \"9.31 GB\" on the home screen,\n * and \"10 GB\" in the admin panel that set it. */\n\nconst quotaPercent = computed(() => {\n  const q = props.quota;\n  if (!q || q.unlimited || q.total <= 0) return 0;\n  return Math.max(0, Math.min(100, Math.round((q.used / q.total) * 100)));\n});\n\nconst quotaText = computed(() => {\n  const q = props.quota;\n  if (!q) return '';\n  if (q.unlimited || q.total <= 0) {\n    // The drives' size — said as Home's card says it (HomeView.storageCaption).\n    return q.partial\n      ? t('drive.storage.used_partial', { used: formatSize(q.used) })\n      : t('drive.storage.used_unlimited', { used: formatSize(q.used) });\n  }\n  return t('drive.storage.used', { used: formatSize(q.used), total: formatSize(q.total) });\n});\n\n/** Only the drawer draws this control now (see the template). */\nconst toggleLabel = computed(() => t('sidenav.close'));\n\n/* === #57 — reordering the storages ======================================\n * \"Is it possible to implement sorting or even better — manual reordering for\n * sidebar Storages?\" Three doors to one verb, each announcing the WHOLE new\n * order through `reorder-storages` (the explorer stores it, `lib/storageOrder`):\n *\n *   · drag a row (mouse or pen: once it has travelled DRAG_SLOP; a finger:\n *     after a long press, so a finger that only wanted to scroll the panel\n *     scrolls it);\n *   · the row's menu — right click, a finger's long press lifted without\n *     moving, or Shift+F10 / the Menu key on a focused row: Move up, Move\n *     down, Sort by name, Use default order. This is the keyboard's way in, and\n *     the way for anybody who cannot drag;\n *   · \"Sort by name\" is part of that menu and WRITES an order — there is no\n *     sort mode that could disagree with the hand-made one.\n *\n * ⚠ With fewer than two storages there is nothing to order: no menu, no drag,\n * and the browser's own context menu is left alone. */\nconst canReorder = computed(() => props.storages.length > 1);\n\n/** The row buttons, by storage key — for focus after a move and for the drop geometry. */\nconst rowEls = new Map<string, HTMLElement>();\nfunction setRowEl(key: string, el: unknown) {\n  if (el instanceof HTMLElement) rowEls.set(key, el);\n  else rowEls.delete(key);\n}\nconst navEl = ref<HTMLElement | null>(null);\n\nconst storageMenuRef = ref<InstanceType<typeof ContextMenu> | null>(null);\n/** The storage whose menu is open. */\nconst menuKey = ref('');\n/** Opened by a finger: the menu comes up as the bottom sheet the file rows use. */\nconst menuSheet = ref(false);\n\nfunction indexOfKey(key: string): number {\n  return props.storages.findIndex((s) => storageOrderKey(s) === key);\n}\n\nconst storageActions = computed<ContextAction[]>(() => {\n  const i = indexOfKey(menuKey.value);\n  const n = props.storages.length;\n  const current = props.storages.map(storageOrderKey);\n  const sorted = sortStoragesByName(props.storages);\n  const alreadySorted = sorted.every((k, j) => k === current[j]);\n  return [\n    {\n      key: 'storage-move-up',\n      icon: 'move-up',\n      label: t('sidenav.storage.moveUp'),\n      disabled: i <= 0,\n      testid: 'sidenav-storage-move-up',\n    },\n    {\n      key: 'storage-move-down',\n      icon: 'move-down',\n      label: t('sidenav.storage.moveDown'),\n      disabled: i < 0 || i >= n - 1,\n      testid: 'sidenav-storage-move-down',\n    },\n    { divider: true, key: 'storage-order-sep', label: '' },\n    {\n      key: 'storage-sort-name',\n      icon: 'sort-name',\n      label: t('sidenav.storage.sortName'),\n      disabled: alreadySorted,\n      // ⚠ A greyed row says why, or it reads as broken (ContextAction.title).\n      title: alreadySorted ? t('sidenav.storage.sortName.done') : undefined,\n      testid: 'sidenav-storage-sort-name',\n    },\n    {\n      // \"Use default order\": drop the person's own order and fall back to the\n      // administrator's (or, with none, the host's). Not \"Reset\": nothing of\n      // the default is being reset, the person's order is being let go.\n      key: 'storage-default-order',\n      icon: 'reset-order',\n      label: t('sidenav.storage.defaultOrder'),\n      disabled: !props.storageOrderCustom,\n      title: props.storageOrderCustom ? undefined : t('sidenav.storage.defaultOrder.none'),\n      testid: 'sidenav-storage-default-order',\n    },\n  ];\n});\n\n/**\n * Open a storage row's menu. `at` is the pointer; without one (the keyboard,\n * a finger) the menu hangs from the row's start edge, like \"+ New\" does.\n */\nfunction openStorageMenu(s: NavStorage, at: { clientX: number; clientY: number } | null, sheet = false) {\n  if (!canReorder.value) return;\n  const key = storageOrderKey(s);\n  menuKey.value = key;\n  menuSheet.value = sheet;\n  let point = at;\n  if (!point) {\n    const r = rowEls.get(key)?.getBoundingClientRect();\n    point = r ? { clientX: inlineStartX(r, dir.value), clientY: r.bottom + 4 } : { clientX: 0, clientY: 0 };\n  }\n  void storageMenuRef.value?.show(point, []);\n}\n\nfunction onStorageContextMenu(s: NavStorage, ev: MouseEvent) {\n  if (!canReorder.value) return;\n  ev.preventDefault();\n  // ⚠⚠ Stopped HERE: FileExplorer's root answers every contextmenu that\n  // reaches it with the blank-canvas menu, whose backdrop then lands on top\n  // of this one and swallows every click (measured, e2e 158).\n  ev.stopPropagation();\n  // A finger's long press: the gesture decides — lifted where it was, it opens\n  // the menu (onStoragePointerUp); moved, it drags. The browser's own\n  // long-press event would otherwise open it under the moving finger.\n  if (reorder.touchActive()) return;\n  openStorageMenu(s, { clientX: ev.clientX, clientY: ev.clientY });\n}\n\n/**\n * ⚠ The browser can answer the SAME gesture with a `contextmenu` of its own,\n * AFTER this component has already opened the menu — and the menu's backdrop\n * closes on a contextmenu (\"a right click outside closes me\"), so the menu\n * would shut the moment it opened:\n *\n *   · the keyboard: on Windows the Menu key raises one when the key is\n *     RELEASED, aimed at whatever has focus — by then the menu's first entry.\n *     Preventing the keydown does not stop it.\n *   · a finger: a browser that shows its context menu on the long TAP (the\n *     finger lifting) aims it at the point under the finger — by then the\n *     sheet's backdrop. (One that shows it while the finger is still down\n *     aims it at the row, where `onStorageContextMenu` ignores it.)\n *\n * Neither is reproducible headless — Playwright's keys never reach the\n * system, and its touch emulation sends no long-tap contextmenu — so the unit\n * tests dispatch both echoes themselves. (What the emulation DOES send after a\n * held finger, an emulated click, is `useReorderDrag`'s to cancel.) For the\n * next second the one contextmenu that lands inside a menu (or, for a finger,\n * anywhere — the lifted finger is not a right click) is that echo, and it is\n * swallowed before anything sees it.\n */\nlet echoOff: (() => void) | null = null;\nfunction swallowMenuEcho(anywhere = false) {\n  echoOff?.();\n  const swallow = (ev: Event) => {\n    const target = ev.target as Element | null;\n    const inMenu = typeof target?.closest === 'function' && !!target.closest('.fe-ctx-backdrop');\n    if (!anywhere && !inMenu) return;\n    ev.preventDefault();\n    ev.stopPropagation();\n    off();\n  };\n  const timer = setTimeout(() => off(), 1000);\n  function off() {\n    clearTimeout(timer);\n    window.removeEventListener('contextmenu', swallow, true);\n    echoOff = null;\n  }\n  window.addEventListener('contextmenu', swallow, true);\n  echoOff = off;\n}\nonBeforeUnmount(() => echoOff?.());\n\nfunction onStorageKeydown(s: NavStorage, ev: KeyboardEvent) {\n  if (ev.key !== 'ContextMenu' && !(ev.key === 'F10' && ev.shiftKey)) return;\n  if (!canReorder.value) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  swallowMenuEcho();\n  openStorageMenu(s, null);\n}\n\n/** Announce an order, then put focus back on the row that moved. */\nasync function commitOrder(keys: string[] | null, focusKey: string) {\n  if (keys === null) return;\n  emit('reorder-storages', keys);\n  // ⚠ The row's element is MOVED in the DOM by the re-render (the list is\n  // keyed), and a node that is moved loses focus — the menu's own focus\n  // restore ran before the move. Without this a keyboard user who pressed\n  // \"Move down\" would find focus on <body>.\n  await nextTick();\n  rowEls.get(focusKey)?.focus();\n}\n\nfunction onStorageMenuSelect(a: ContextAction) {\n  const key = menuKey.value;\n  if (a.key === 'storage-move-up') void commitOrder(moveStorage(props.storages, key, -1), key);\n  else if (a.key === 'storage-move-down') void commitOrder(moveStorage(props.storages, key, 1), key);\n  else if (a.key === 'storage-sort-name') void commitOrder(sortStoragesByName(props.storages), key);\n  else if (a.key === 'storage-default-order') void commitOrder([], key);\n}\n\n/* ── the drag ────────────────────────────────────────────────────────────\n * The gesture is `useReorderDrag`'s — the same one the admin Storages table\n * drags its rows with. A finger long-presses a row (a finger that only wanted\n * to scroll the panel scrolls it); lifted where it was, that long press is the\n * row's menu, as the bottom sheet. */\nconst reorder = useReorderDrag({\n  keys: () => props.storages.map(storageOrderKey),\n  rowEl: (key) => rowEls.get(key),\n  scroller: () => navEl.value?.querySelector('.fe-sidenav__scroll'),\n  onDrop: (key, gap) => void commitOrder(dropStorageAt(props.storages, key, gap), key),\n  onHold: (key) => {\n    const s = props.storages.find((x) => storageOrderKey(x) === key);\n    if (!s) return;\n    swallowMenuEcho(true);\n    openStorageMenu(s, null, true);\n  },\n});\nconst { dragKey, dropGap, reordering, onClickCapture: onStorageClickCapture } = reorder;\n\nfunction onStoragePointerDown(s: NavStorage, ev: PointerEvent) {\n  if (!canReorder.value) return;\n  reorder.onPointerDown(storageOrderKey(s), ev);\n}\n</script>\n\n<template>\n  <nav\n    ref=\"navEl\"\n    class=\"fe-sidenav\"\n    :class=\"{\n      'fe-sidenav--rail': !expanded && !narrow,\n      'fe-sidenav--drawer': narrow,\n      'fe-sidenav--reordering': reordering /* #57 */,\n    }\"\n    role=\"navigation\"\n    :aria-label=\"t('sidenav.title')\"\n    data-testid=\"sidenav\"\n  >\n    <!-- gorunum:v3-shell — the panel's own edge control is now the DRAWER's\n         close button and nothing else.\n         ⚠ At 560px and up it is gone, deliberately: the collapse button lives\n         at the far left of the top bar (`.fe-toolbar__brand`), above the panel\n         rather than inside it, which is where the reference puts it and where\n         it still exists when the panel is a 56px rail. Two buttons for one\n         verb, one of them inside the thing it collapses, was the duplicate\n         this removed. At 390px the panel is an overlay ON TOP of the files, so\n         it keeps a dismiss of its own — the same reason a dialog has one. -->\n    <div v-if=\"narrow\" class=\"fe-sidenav__head\">\n      <button\n        type=\"button\"\n        class=\"fe-sidenav__toggle\"\n        :aria-expanded=\"showLabels\"\n        :title=\"toggleLabel\"\n        :aria-label=\"toggleLabel\"\n        data-testid=\"sidenav-toggle\"\n        @click=\"emit('close')\"\n      >\n        <svg\n          class=\"fe-ficon\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"1.8\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n          focusable=\"false\"\n        >\n          <path d=\"M6 6l12 12M18 6L6 18\" />\n        </svg>\n      </button>\n    </div>\n\n    <!-- Primary action. Making something is what people come to this panel to\n         do, so it reads as the main button rather than one toolbar icon among\n         fourteen. -->\n    <!-- Rendered even with nowhere to write, and disabled instead. A block\n         that appears and disappears makes every row below it jump by 90px each\n         time the user opens a view, which reads as the panel reloading. -->\n    <div class=\"fe-sidenav__primary\">\n      <!-- surucu:d1 — ONE primary action, the shape #14's mockups draw, in\n           every profile and every embed. The two-button block that used to\n           stand here behind `v-if=\"!newMenu\"` (Upload + New folder) is gone:\n           both verbs are the first two rows of this menu. -->\n      <button\n        v-if=\"newShown\"\n        ref=\"newBtnEl\"\n        type=\"button\"\n        class=\"fe-sidenav__new\"\n        aria-haspopup=\"menu\"\n        :title=\"t('drive.new')\"\n        :aria-label=\"t('drive.new')\"\n        data-testid=\"sidenav-new\"\n        @click=\"openNewMenu\"\n      >\n        <!-- ⚠⚠ TWO SPANS AND A DIVIDER, NOT A SPLIT BUTTON. The reference draws\n             a label half, a hairline and a chevron half; the owner asked twice\n             for the chevron (\"new tuşunun yanına caret koymamışsın, onu koymanı\n             istiyorum\") because a button that opens a menu has to look like\n             one. But it stays ONE `<button aria-haspopup=\"menu\">`: a real split\n             button needs two focusable regions with two different actions, and\n             here both halves do the same thing. Copying the shape without\n             copying the mechanism is deliberate — two tab stops that lead to\n             one menu is a keyboard user counting controls that do not exist.\n             ⚠ The divider is `aria-hidden` decoration; it is 16px inset inside\n             a 34px pill, not full height, or it reads as a seam between two\n             buttons — which is exactly the thing this is not. -->\n        <span class=\"fe-sidenav__new-main\">\n          <svg\n            class=\"fe-ficon\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"2\"\n            stroke-linecap=\"round\"\n            aria-hidden=\"true\"\n            focusable=\"false\"\n          >\n            <path d=\"M12 5v14M5 12h14\" />\n          </svg>\n          <span v-if=\"showLabels\" class=\"fe-sidenav__text\">{{ t('drive.new') }}</span>\n        </span>\n        <span v-if=\"showLabels\" class=\"fe-sidenav__new-rule\" aria-hidden=\"true\"></span>\n        <span v-if=\"showLabels\" class=\"fe-sidenav__new-caret\" aria-hidden=\"true\">\n          <svg\n            class=\"fe-ficon\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"2\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n            aria-hidden=\"true\"\n            focusable=\"false\"\n          >\n            <path d=\"M7 10l5 5 5-5\" />\n          </svg>\n        </span>\n      </button>\n    </div>\n\n    <div class=\"fe-sidenav__scroll\">\n      <ul class=\"fe-sidenav__group\" :aria-label=\"t('sidenav.views')\">\n        <template v-for=\"v in views\" :key=\"v.key\">\n          <li>\n            <button\n              type=\"button\"\n              class=\"fe-sidenav__item\"\n              :class=\"{ 'is-active': isActiveDest(v.key) }\"\n              :aria-current=\"isActiveDest(v.key) ? 'page' : undefined\"\n              :title=\"viewLabel(v)\"\n              :aria-label=\"viewLabel(v)\"\n              :data-testid=\"`sidenav-view-${v.key}`\"\n              @click=\"emit('open-view', v.key)\"\n            >\n              <svg\n                class=\"fe-ficon\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                stroke-width=\"1.8\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                aria-hidden=\"true\"\n                focusable=\"false\"\n              >\n                <template v-if=\"v.key === 'home'\">\n                  <path d=\"M4 10.5L12 4l8 6.5\" />\n                  <path d=\"M6 9.8V19a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V9.8\" />\n                  <path d=\"M10 20v-5.5h4V20\" />\n                </template>\n                <template v-else-if=\"v.key === 'myfiles'\">\n                  <path d=\"M3.5 7.5A1.5 1.5 0 0 1 5 6h4l2 2.5h8A1.5 1.5 0 0 1 20.5 10v7.5A1.5 1.5 0 0 1 19 19H5a1.5 1.5 0 0 1-1.5-1.5z\" />\n                </template>\n                <template v-else-if=\"v.key === 'recent'\">\n                  <circle cx=\"12\" cy=\"12\" r=\"8.5\" />\n                  <path d=\"M12 7.5V12l3 2\" />\n                </template>\n                <template v-else-if=\"v.key === 'starred'\">\n                  <path d=\"M12 4l2.4 4.9 5.4.8-3.9 3.8.9 5.4-4.8-2.5-4.8 2.5.9-5.4-3.9-3.8 5.4-.8z\" />\n                </template>\n                <template v-else-if=\"v.key === 'shared'\">\n                  <circle cx=\"17.5\" cy=\"6.5\" r=\"2.5\" />\n                  <circle cx=\"6.5\" cy=\"12\" r=\"2.5\" />\n                  <circle cx=\"17.5\" cy=\"17.5\" r=\"2.5\" />\n                  <path d=\"M8.8 10.8l6.4-3.2M8.8 13.2l6.4 3.2\" />\n                </template>\n                <template v-else-if=\"v.key === 'drafts'\">\n                  <path d=\"M13.5 4H7a1.5 1.5 0 0 0-1.5 1.5v13A1.5 1.5 0 0 0 7 20h10a1.5 1.5 0 0 0 1.5-1.5V9z\" />\n                  <path d=\"M13.5 4v5h5\" />\n                  <path d=\"M9 15.5l4.8-4.8 1.7 1.7-4.8 4.8H9z\" />\n                </template>\n                <template v-else>\n                  <path d=\"M4.5 7h15\" />\n                  <path d=\"M9.5 7V5.2A1.2 1.2 0 0 1 10.7 4h2.6a1.2 1.2 0 0 1 1.2 1.2V7\" />\n                  <path d=\"M6.5 7l.9 11.1A1.4 1.4 0 0 0 8.8 19.4h6.4a1.4 1.4 0 0 0 1.4-1.3L17.5 7\" />\n                </template>\n              </svg>\n              <span v-if=\"showLabels\" class=\"fe-sidenav__text\">{{ v.label }}</span>\n              <!-- Drafts (issue #71): how many, as a count — never a\n                   notification. On the rail it sits on the icon's corner. -->\n              <span\n                v-if=\"v.key === 'drafts' && (draftCount ?? 0) > 0\"\n                class=\"fe-sidenav__count\"\n                :class=\"{ 'fe-sidenav__count--rail': !showLabels }\"\n                aria-hidden=\"true\"\n                data-testid=\"sidenav-drafts-count\"\n              >{{ draftCount }}</span>\n            </button>\n          </li>\n\n          <!-- paylas:m1 — \"My shares\", directly under \"Shared with me\".\n               The pair is one question asked in both directions: what other\n               people handed to me, and what I handed out. A person hunting for\n               a link they minted looks where the sharing rows are, not under\n               Connections — that group is the one-time setup corner (how to\n               mount this, which API keys exist), and burying a daily lookup in\n               it is how a screen stays undiscovered.\n\n               ⚠ Anchored to the 'shared' row rather than appended to the group:\n               it has to sit BESIDE its mirror, and `views` may or may not carry\n               \"My files\" above it. That anchoring also carries the app-token\n               rule for free — `views` drops the identity rows for an app token,\n               so \"Shared with me\" goes and this row goes with it, which is\n               right: an app token is not a person and has shared nothing.\n\n               ⚠ It emits rather than navigates. The destination is a host\n               route, not a listing this panel can open — which is exactly why\n               `showMyShares` gates it and why that gate is OFF unless a host\n               asks. In an embed (`<filex-explorer>` on work.example.com, in the\n               fishapp, on fm.example.com) nothing listens for `open-my-shares`, so\n               an ungated row would be the one entry in this panel that draws,\n               takes a click and leads nowhere. Every other row is either\n               handled inside FileExplorer or gated by a flag of its own\n               (`trashVisible`, `showConnections`); this one now is too. -->\n          <li v-if=\"v.key === 'shared' && showMyShares\">\n            <button\n              type=\"button\"\n              class=\"fe-sidenav__item\"\n              :title=\"t('sidenav.myshares')\"\n              :aria-label=\"t('sidenav.myshares')\"\n              data-testid=\"sidenav-my-shares\"\n              @click=\"emit('open-my-shares')\"\n            >\n              <!-- A chain link, against the three-node graph the row above\n                   draws: what leaves here is a URL. -->\n              <svg\n                class=\"fe-ficon\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                stroke-width=\"1.8\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                aria-hidden=\"true\"\n                focusable=\"false\"\n              >\n                <path d=\"M10 13.5a4.5 4.5 0 0 0 6.8.5l2.7-2.7a4.5 4.5 0 0 0-6.36-6.36L11.6 6.5\" />\n                <path d=\"M14 10.5a4.5 4.5 0 0 0-6.8-.5l-2.7 2.7a4.5 4.5 0 0 0 6.36 6.36l1.53-1.53\" />\n              </svg>\n              <span v-if=\"showLabels\" class=\"fe-sidenav__text\">{{ t('sidenav.myshares') }}</span>\n            </button>\n          </li>\n        </template>\n      </ul>\n\n      <!-- etiket:t1 — Tags. Between the views and the storages because a tag\n           IS a view (a listing with no folder behind it), not a place files\n           live. On the rail it collapses to one button that opens the panel:\n           sixty tags would otherwise be sixty copies of one glyph with no\n           label, and the rail's promise is that every destination stays one\n           click away. -->\n      <div v-if=\"showTags\" class=\"fe-sidenav__section\">\n        <template v-if=\"showLabels\">\n          <p class=\"fe-sidenav__heading\">{{ t('sidenav.tags') }}</p>\n          <template v-for=\"g in tagGroups\" :key=\"g.kind\">\n            <!-- etiket:k2 — whose tags these are, in words and in the glyph\n                 every tag chip carries. -->\n            <p class=\"fe-sidenav__subheading\" :data-testid=\"`sidenav-tags-${g.kind}`\">\n              <TagKindIcon :kind=\"g.kind\" :size=\"12\" />\n              <span>{{ t(`sidenav.tags.${g.kind}`) }}</span>\n            </p>\n            <ul\n              class=\"fe-sidenav__group\"\n              :aria-label=\"`${t('sidenav.tags')} - ${t(`sidenav.tags.${g.kind}`)}`\"\n            >\n              <li v-for=\"tag in g.visible\" :key=\"`${tag.kind}:${tag.name}`\">\n                <button\n                  type=\"button\"\n                  class=\"fe-sidenav__item fe-sidenav__item--tag\"\n                  :class=\"{ 'is-active': tagIsActive(tag) }\"\n                  :aria-current=\"tagIsActive(tag) ? 'page' : undefined\"\n                  :title=\"t(`tags.chip.${tag.kind}`, { tag: tag.name })\"\n                  :aria-label=\"t(`tags.chip.${tag.kind}`, { tag: tag.name })\"\n                  :data-testid=\"`sidenav-tag-${tag.name}`\"\n                  :data-tag-kind=\"tag.kind\"\n                  @click=\"emit('open-tag', tag.name, tag.kind)\"\n                >\n                  <TagKindIcon class=\"fe-ficon\" :kind=\"tag.kind\" :size=\"16\" />\n                  <span class=\"fe-sidenav__text\">{{ tag.name }}</span>\n                </button>\n              </li>\n            </ul>\n          </template>\n          <ul class=\"fe-sidenav__group\" :aria-label=\"t('sidenav.tags')\">\n            <!-- Nothing tagged yet: the section stays, and says how tags get\n                 made. A section that only exists once you already know the\n                 feature teaches nobody. -->\n            <li v-if=\"allTags.length === 0\">\n              <p class=\"fe-sidenav__hint\">{{ t('sidenav.tags.empty') }}</p>\n            </li>\n            <li v-if=\"hiddenTagCount > 0\">\n              <button\n                type=\"button\"\n                class=\"fe-sidenav__more\"\n                data-testid=\"sidenav-tags-more\"\n                @click=\"tagsExpanded = true\"\n              >\n                {{ t('sidenav.tags.more', { count: hiddenTagCount }) }}\n              </button>\n            </li>\n            <li v-else-if=\"tagsExpanded && anyGroupLong\">\n              <button\n                type=\"button\"\n                class=\"fe-sidenav__more\"\n                data-testid=\"sidenav-tags-less\"\n                @click=\"tagsExpanded = false\"\n              >\n                {{ t('sidenav.tags.less') }}\n              </button>\n            </li>\n          </ul>\n        </template>\n        <template v-else>\n          <hr class=\"fe-sidenav__rule\" aria-hidden=\"true\" />\n          <ul class=\"fe-sidenav__group\" :aria-label=\"t('sidenav.tags')\">\n            <li>\n              <button\n                type=\"button\"\n                class=\"fe-sidenav__item\"\n                :class=\"{ 'is-active': activeView === 'tag' }\"\n                :title=\"t('sidenav.tags')\"\n                :aria-label=\"t('sidenav.tags')\"\n                data-testid=\"sidenav-tags-rail\"\n                @click=\"emit('toggle')\"\n              >\n                <svg\n                  class=\"fe-ficon\"\n                  viewBox=\"0 0 24 24\"\n                  fill=\"none\"\n                  stroke=\"currentColor\"\n                  stroke-width=\"1.8\"\n                  stroke-linecap=\"round\"\n                  stroke-linejoin=\"round\"\n                  aria-hidden=\"true\"\n                  focusable=\"false\"\n                >\n                  <path d=\"M4 4.5h7l9 9-6.5 6.5-9-9z\" />\n                  <circle cx=\"8\" cy=\"8.5\" r=\"1.4\" />\n                </svg>\n              </button>\n            </li>\n          </ul>\n        </template>\n      </div>\n\n      <div v-if=\"storages.length\" class=\"fe-sidenav__section\">\n        <p v-if=\"showLabels\" class=\"fe-sidenav__heading\">{{ t('sidenav.storages') }}</p>\n        <hr v-else class=\"fe-sidenav__rule\" aria-hidden=\"true\" />\n        <!-- #57 — the rows can be reordered: dragged, or from their own menu\n             (right click, a long press, Shift+F10). The drop marker is the\n             `is-drop-*` class on the <li> the row would land beside. -->\n        <ul\n          class=\"fe-sidenav__group\"\n          :aria-label=\"t('sidenav.storages')\"\n          data-testid=\"sidenav-storages\"\n          @click.capture=\"onStorageClickCapture\"\n        >\n          <li\n            v-for=\"(s, i) in storages\"\n            :key=\"s.name\"\n            :class=\"{\n              'is-drop-before': dropGap === i,\n              'is-drop-after': dropGap === storages.length && i === storages.length - 1,\n            }\"\n          >\n            <button\n              :ref=\"(el) => setRowEl(storageOrderKey(s), el)\"\n              type=\"button\"\n              class=\"fe-sidenav__item fe-sidenav__item--storage\"\n              :class=\"{\n                'is-active': !activeView && activeStorage === s.name,\n                'is-dragging': dragKey === storageOrderKey(s),\n              }\"\n              :title=\"\n                sharedSet.has(s.name)\n                  ? `${s.label || s.name} - ${t('sidenav.storage.shared')}`\n                  : s.label || s.name\n              \"\n              :aria-label=\"\n                sharedSet.has(s.name)\n                  ? `${s.label || s.name} - ${t('sidenav.storage.shared')}`\n                  : s.label || s.name\n              \"\n              :data-testid=\"`sidenav-storage-${s.name}`\"\n              @click=\"emit('open-storage', s.name)\"\n              @contextmenu=\"onStorageContextMenu(s, $event)\"\n              @keydown=\"onStorageKeydown(s, $event)\"\n              @pointerdown=\"onStoragePointerDown(s, $event)\"\n            >\n              <!-- A granted storage gets a different glyph, not a badge glued\n                   into the label: a badge inside the name span changes the\n                   row's textContent and breaks every selector that finds a row\n                   by its name (measured on the compliance badges, PR #12). -->\n              <svg\n                class=\"fe-ficon\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                stroke-width=\"1.8\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                aria-hidden=\"true\"\n                focusable=\"false\"\n              >\n                <template v-if=\"sharedSet.has(s.name)\">\n                  <path d=\"M3 8.5A1.5 1.5 0 0 1 4.5 7h5L11 9h8.5A1.5 1.5 0 0 1 21 10.5v7A1.5 1.5 0 0 1 19.5 19h-15A1.5 1.5 0 0 1 3 17.5z\" />\n                  <circle cx=\"15.6\" cy=\"13.6\" r=\"1.6\" />\n                  <circle cx=\"9.4\" cy=\"15.4\" r=\"1.6\" />\n                  <path d=\"M10.9 14.7l3.3-.9\" />\n                </template>\n                <template v-else>\n                  <rect x=\"3\" y=\"5\" width=\"18\" height=\"6\" rx=\"1.6\" />\n                  <rect x=\"3\" y=\"13\" width=\"18\" height=\"6\" rx=\"1.6\" />\n                  <path d=\"M6.5 8h.01M6.5 16h.01\" />\n                </template>\n              </svg>\n              <span v-if=\"showLabels\" class=\"fe-sidenav__text\">{{ s.label || s.name }}</span>\n              <span\n                v-if=\"showLabels && sharedSet.has(s.name)\"\n                class=\"fe-sidenav__tag\"\n                role=\"img\"\n                :aria-label=\"t('sidenav.storage.shared')\"\n                >{{ t('sidenav.storage.shared') }}</span\n              >\n              <!-- A read-only mount says so on the row, where the user looks\n                   for it. The admin list had an \"RO\" badge; the people it\n                   applied to never saw one (issue #30). -->\n              <StorageTags\n                v-if=\"showLabels && s.readOnly\"\n                read-only\n                :locale=\"locale\"\n                class=\"fe-sidenav__stags\"\n                data-testid=\"sidenav-storage-readonly\"\n              />\n            </button>\n          </li>\n        </ul>\n      </div>\n\n      <!-- App plugins — \"Apps\": one row per `home` view. Between the storages\n           and Connections: an app is a place you go, like a drive, not a\n           setting. Hidden entirely when there are none. -->\n      <div v-if=\"appRows.length || showAppStore\" class=\"fe-sidenav__section\" data-testid=\"sidenav-apps\">\n        <p v-if=\"showLabels\" class=\"fe-sidenav__heading\">{{ t('sidenav.apps') }}</p>\n        <hr v-else class=\"fe-sidenav__rule\" aria-hidden=\"true\" />\n        <ul class=\"fe-sidenav__group\" :aria-label=\"t('sidenav.apps')\">\n          <li v-for=\"a in appRows\" :key=\"a.key\">\n            <button\n              type=\"button\"\n              class=\"fe-sidenav__item\"\n              :title=\"a.label\"\n              :aria-label=\"a.label\"\n              :data-testid=\"`sidenav-app-${a.key}`\"\n              @click=\"emit('open-app', a.key)\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n              <span class=\"fe-sidenav__appicon\" aria-hidden=\"true\" v-html=\"a.svg\"></span>\n              <span v-if=\"showLabels\" class=\"fe-sidenav__text\">{{ a.label }}</span>\n            </button>\n          </li>\n          <!-- #162 - the store screen: where a person reads the catalog of the\n               stores an administrator turned on and asks for an app. The last\n               row of the group: the apps a person has come first. The screen\n               is the host's (showAppStore gates it, off by default). -->\n          <li v-if=\"showAppStore\">\n            <button\n              type=\"button\"\n              class=\"fe-sidenav__item\"\n              :title=\"t('sidenav.appstore')\"\n              :aria-label=\"t('sidenav.appstore')\"\n              data-testid=\"sidenav-app-store\"\n              @click=\"emit('open-app-store')\"\n            >\n              <!-- A shop front: an awning over a door. -->\n              <svg\n                class=\"fe-ficon\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                stroke-width=\"1.8\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                aria-hidden=\"true\"\n                focusable=\"false\"\n              >\n                <path d=\"M3 9l1.5-5h15L21 9\" />\n                <path d=\"M3 9a3 3 0 0 0 6 0a3 3 0 0 0 6 0a3 3 0 0 0 6 0\" />\n                <path d=\"M5 11.5V20h14v-8.5\" />\n                <path d=\"M10 20v-5h4v5\" />\n              </svg>\n              <span v-if=\"showLabels\" class=\"fe-sidenav__text\">{{ t('sidenav.appstore') }}</span>\n            </button>\n          </li>\n        </ul>\n      </div>\n\n      <!-- Connections. Last, because it is where you go once rather than every\n           day — and in core rather than in the host app, so an embedded\n           explorer's users can reach the guides and mint their own keys\n           instead of being told to ask an administrator. -->\n      <div v-if=\"showConnections\" class=\"fe-sidenav__section\">\n        <p v-if=\"showLabels\" class=\"fe-sidenav__heading\">{{ t('sidenav.connections') }}</p>\n        <hr v-else class=\"fe-sidenav__rule\" aria-hidden=\"true\" />\n        <ul class=\"fe-sidenav__group\" :aria-label=\"t('sidenav.connections')\">\n          <li>\n            <button\n              type=\"button\"\n              class=\"fe-sidenav__item\"\n              :title=\"t('sidenav.connect')\"\n              :aria-label=\"t('sidenav.connect')\"\n              data-testid=\"sidenav-connect\"\n              @click=\"emit('open-connections')\"\n            >\n              <svg\n                class=\"fe-ficon\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                stroke-width=\"1.8\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                aria-hidden=\"true\"\n                focusable=\"false\"\n              >\n                <path d=\"M9.5 14.5l-2.6 2.6a3.7 3.7 0 0 1-5.2-5.2l2.6-2.6\" />\n                <path d=\"M14.5 9.5l2.6-2.6a3.7 3.7 0 0 1 5.2 5.2l-2.6 2.6\" />\n                <path d=\"M9 15l6-6\" />\n              </svg>\n              <span v-if=\"showLabels\" class=\"fe-sidenav__text\">{{ t('sidenav.connect') }}</span>\n            </button>\n          </li>\n          <!-- API keys is the person half of this section: \"How to connect\"\n               stays for an app token (mount instructions are not identity),\n               the keys go. -->\n          <li v-if=\"showIdentitySurfaces !== false\">\n            <button\n              type=\"button\"\n              class=\"fe-sidenav__item\"\n              :title=\"t('sidenav.apikeys')\"\n              :aria-label=\"t('sidenav.apikeys')\"\n              data-testid=\"sidenav-apikeys\"\n              @click=\"emit('open-tokens')\"\n            >\n              <svg\n                class=\"fe-ficon\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                stroke-width=\"1.8\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                aria-hidden=\"true\"\n                focusable=\"false\"\n              >\n                <circle cx=\"8\" cy=\"12\" r=\"3.5\" />\n                <path d=\"M11.5 12H21\" />\n                <path d=\"M17.5 12v3.2M20 12v2.2\" />\n              </svg>\n              <span v-if=\"showLabels\" class=\"fe-sidenav__text\">{{ t('sidenav.apikeys') }}</span>\n            </button>\n          </li>\n        </ul>\n      </div>\n    </div>\n\n    <!-- surucu:d1 — the storage line. Under the navigation, above nothing:\n         it is the last thing in the panel because it is a status, not a\n         destination. Hidden entirely when the server did not answer (an app\n         token has no person to have a quota) rather than drawn empty. -->\n    <div v-if=\"quota\" class=\"fe-sidenav__quota\" data-testid=\"sidenav-quota\">\n      <p v-if=\"showLabels\" class=\"fe-sidenav__quota-label\">{{ t('drive.storage.label') }}</p>\n      <div\n        class=\"fe-sidenav__quota-bar\"\n        role=\"progressbar\"\n        :aria-valuenow=\"quotaPercent\"\n        aria-valuemin=\"0\"\n        aria-valuemax=\"100\"\n        :aria-label=\"quotaText\"\n        :title=\"quotaText\"\n      >\n        <span class=\"fe-sidenav__quota-fill\" :style=\"{ width: quotaPercent + '%' }\"></span>\n      </div>\n      <p v-if=\"showLabels\" class=\"fe-sidenav__quota-text\">{{ quotaText }}</p>\n    </div>\n\n    <ContextMenu\n      ref=\"newMenuRef\"\n      :locale=\"locale\"\n      :theme=\"theme\"\n      :actions=\"newActions\"\n      @select=\"onNewSelect\"\n    />\n    <!-- #57 — a storage row's order menu. The same ContextMenu as every other\n         menu here (teleported, one keyboard grammar), a sheet when a finger\n         opened it. -->\n    <ContextMenu\n      ref=\"storageMenuRef\"\n      :locale=\"locale\"\n      :theme=\"theme\"\n      :sheet=\"menuSheet\"\n      :actions=\"storageActions\"\n      @select=\"onStorageMenuSelect\"\n    />\n  </nav>\n</template>\n","/**\n * \"Filter in this folder…\" — answered by the SERVER's name rule (task #207,\n * audit D5).\n *\n * ⚠⚠ Why. The box used to narrow the rows in hand with a rule of its own (an\n * accent-stripped substring, `lib/fileFilters` foldText) and its comment said\n * that was the search's rule. It was not: the search keeps accents (\"musteri\"\n * does not find \"müşteri\"), treats `.`, `-`, `_` and a space as one separator\n * (\"invoice 2026\" finds \"invoice_2026.pdf\") and wants every word. The same\n * folder answered the same words two ways depending on which box was used.\n * Now the box asks the server (`POST /api/files/search/match`, FileApi\n * `matchNames`) which of the names on screen answer the words, and the server\n * answers with the search's own matcher (internal/search NameMatcher).\n *\n * The one exception is the one the rule allows: a name the server does not\n * know. A row whose name was decrypted in this tab (an encrypted-names folder,\n * `e2e_name_state`) or that lives in a vault (`vault_root`) is never sent - its\n * plaintext must not leave the tab - and is matched here by `nameMatches`.\n *\n * Typing is debounced and a question the person has typed past is aborted, so\n * only the last one is answered. Until the first answer arrives the rows stay\n * as they were; a server without the route (before 0.54) leaves the box on the\n * local rule rather than dead.\n */\nimport { getCurrentScope, onScopeDispose, ref, watch } from 'vue';\n\nimport { nameMatches } from './fileFilters';\n\n/** The server question: which of `names` answer `q` (indexes). */\nexport type MatchNamesFn = (q: string, names: string[], signal?: AbortSignal) => Promise<number[]>;\n\n/** How long typing has to pause before the server is asked. */\nexport const NAME_FILTER_DEBOUNCE_MS = 200;\n\n/** True for a row whose name only this tab knows (see the file note). */\nexport function nameIsLocal(row: unknown): boolean {\n  if (!row || typeof row !== 'object') return false;\n  const r = row as Record<string, unknown>;\n  const st = r.e2e_name_state;\n  if (st === 'enc' || st === 'locked' || st === 'unreadable') return true;\n  return typeof r.vault_root === 'string' && r.vault_root !== '';\n}\n\nexport interface ServerNameFilter<T> {\n  /** The rows the box keeps, or `items` itself when it narrows nothing. */\n  apply(items: T[]): T[];\n  /** A question is out (typing paused, answer not back yet). */\n  readonly pending: { value: boolean };\n}\n\n/**\n * One box's filter. `needle` is what was typed, `items` the rows it narrows,\n * `nameOf` a row's name, `match` the server question (FileApi `matchNames`;\n * undefined = no server, the local rule answers).\n */\nexport function useServerNameFilter<T>(\n  needle: () => string,\n  items: () => T[],\n  nameOf: (item: T) => string,\n  match: () => MatchNamesFn | undefined,\n): ServerNameFilter<T> {\n  /** The names the server said answer the needle it was last asked. */\n  const answered = ref<{ q: string; names: Set<string> } | null>(null);\n  /** The server could not answer (older build, offline): local rule. */\n  const unanswered = ref(false);\n  const pending = ref(false);\n  let timer: ReturnType<typeof setTimeout> | null = null;\n  let inflight: AbortController | null = null;\n\n  function cancel() {\n    if (timer) clearTimeout(timer);\n    timer = null;\n    inflight?.abort();\n    inflight = null;\n  }\n\n  async function ask(q: string, names: string[]) {\n    const fn = match();\n    if (!fn) {\n      unanswered.value = true;\n      return;\n    }\n    const ctl = new AbortController();\n    inflight = ctl;\n    pending.value = true;\n    try {\n      const idx = await fn(q, names, ctl.signal);\n      if (ctl.signal.aborted) return;\n      answered.value = { q, names: new Set(idx.map((i) => names[i]).filter((n): n is string => typeof n === 'string')) };\n      unanswered.value = false;\n    } catch (e) {\n      if ((e as Error)?.name === 'AbortError' || ctl.signal.aborted) return;\n      unanswered.value = true;\n    } finally {\n      if (inflight === ctl) {\n        inflight = null;\n        pending.value = false;\n      }\n    }\n  }\n\n  watch(\n    () => {\n      const q = needle().trim();\n      if (!q) return '';\n      const names = new Set<string>();\n      for (const it of items()) {\n        if (!nameIsLocal(it)) names.add(nameOf(it) || '');\n      }\n      return JSON.stringify([q, [...names].sort()]);\n    },\n    (key) => {\n      cancel();\n      if (!key) {\n        answered.value = null;\n        pending.value = false;\n        return;\n      }\n      const [q, names] = JSON.parse(key) as [string, string[]];\n      if (names.length === 0) {\n        answered.value = { q, names: new Set() };\n        return;\n      }\n      pending.value = true;\n      timer = setTimeout(() => {\n        timer = null;\n        void ask(q, names);\n      }, NAME_FILTER_DEBOUNCE_MS);\n    },\n    { immediate: true },\n  );\n\n  // A component's setup (or any effect scope) drops the timer and the question\n  // out with it; called outside one (a test), nothing to tie it to.\n  if (getCurrentScope()) onScopeDispose(cancel);\n\n  return {\n    pending,\n    apply(list: T[]): T[] {\n      const q = needle().trim();\n      if (!q) return list;\n      const got = answered.value;\n      return list.filter((it) => {\n        const name = nameOf(it) || '';\n        // No server to ask (a host that wires none), or it could not answer:\n        // the local rule, at once - not rows left unnarrowed while waiting.\n        if (nameIsLocal(it) || unanswered.value || !match()) return nameMatches(name, q);\n        // Not answered yet for these words: keep the row rather than flash an\n        // empty folder; the answer narrows it a moment later.\n        if (!got || got.q !== q) return true;\n        return got.names.has(name);\n      });\n    },\n  };\n}\n","/**\n * Dragging files OUT of filex — onto the desktop, into another app.\n *\n * There are exactly two ways a page can hand real files to the operating\n * system, and filex uses both because neither one alone covers the ask:\n *\n * 1. **`DownloadURL`** (any Chromium browser, so the web explorer AND the\n *    desktop app get it for free). One `dataTransfer.setData('DownloadURL',\n *    'mime:name:url')` and the browser downloads that URL into wherever the\n *    drop landed. Costs nothing until the drop happens — but Chromium carries\n *    exactly ONE such entry, so it is a single-file gesture, and the URL is\n *    fetched by the browser's own download stack, which sends cookies but no\n *    Authorization header (see `canDownloadUrlDrag`).\n *\n * 2. **A native OS drag** (`webContents.startDrag`, desktop app only). Takes a\n *    list of real paths, so folders and multi-selections drop as separate real\n *    files — the WinRAR gesture. The catch is in the word *real*: the shell\n *    copies the bytes at DROP time, from a path, so the file has to be on this\n *    computer BEFORE the drag starts. There is no lazy/virtual-file API to\n *    borrow (that is a Win32 `IDataObject` affair Chromium does not expose).\n *\n * ⚠ The native drag REPLACES the HTML5 drag — `startDrag` requires\n * `preventDefault()` on `dragstart`, and after that the app's own drop targets\n * see an OS file drag instead of `application/x-brf-files`. Dropping a row on a\n * folder inside filex would then UPLOAD the temp copy back to the server: a\n * round trip of the same bytes, a copy instead of a move, and the original left\n * behind. That is what `beginNativeDrag` is for — the payload is remembered on\n * this side, and every drop target asks `internalDragItems(ev)` rather than\n * reading the dataTransfer directly. An OS drag we started is still an internal\n * drag when it lands inside our own window.\n *\n * Because the bytes must exist first, the shell is asked to prepare them on\n * `mousedown` — before the gesture becomes a drag — and the native path is only\n * taken when it answered \"ready\". Anything else keeps the ordinary HTML5 drag,\n * so an internal move never waits on a download it does not need.\n */\n\nexport interface DragItem {\n  path: string;\n  basename: string;\n  type: 'file' | 'dir';\n}\n\nexport const FE_DND_MIME = 'application/x-brf-files';\nexport const FE_DND_SRC_MIME = 'application/x-brf-files-src';\n\n/** An OS drag this window started, and where it came from. */\ninterface NativeDrag {\n  items: DragItem[];\n  origin: string;\n  startedAt: number;\n}\n\nlet native: NativeDrag | null = null;\n\n/**\n * A native drag has no `dragend` on our side (the HTML5 one never started), so\n * the record is dropped by whoever notices the gesture is over — a drop we\n * handled, a pointerup, or this ceiling. Five minutes is far longer than any\n * drag and short enough that a stale record cannot outlive the user's memory\n * of it.\n */\nconst NATIVE_DRAG_TTL_MS = 5 * 60_000;\n\nexport function beginNativeDrag(items: DragItem[], origin: string): void {\n  native = { items: items.slice(), origin, startedAt: Date.now() };\n}\n\nexport function endNativeDrag(): void {\n  native = null;\n}\n\nexport function activeNativeDrag(): NativeDrag | null {\n  if (!native) return null;\n  if (Date.now() - native.startedAt > NATIVE_DRAG_TTL_MS) {\n    native = null;\n    return null;\n  }\n  return native;\n}\n\n/**\n * True when this drag is filex's own — either the HTML5 payload is on the\n * dataTransfer, or we are mid-native-drag. Safe to call from `dragover`, where\n * `getData` is blocked and only `types` may be read.\n */\nexport function hasInternalDrag(ev: DragEvent): boolean {\n  if (ev.dataTransfer?.types.includes(FE_DND_MIME)) return true;\n  return activeNativeDrag() !== null;\n}\n\n/** The dragged rows, from whichever of the two drag mechanisms is in play. */\nexport function internalDragItems(ev: DragEvent): DragItem[] | null {\n  const raw = ev.dataTransfer?.getData(FE_DND_MIME);\n  if (raw) {\n    try {\n      const parsed = JSON.parse(raw) as DragItem[];\n      return Array.isArray(parsed) && parsed.length > 0 ? parsed : null;\n    } catch {\n      return null;\n    }\n  }\n  const n = activeNativeDrag();\n  return n && n.items.length > 0 ? n.items : null;\n}\n\n/** The folder a drag started from — the origin stamp used by move ops. */\nexport function internalDragOrigin(ev: DragEvent): string | undefined {\n  const v = ev.dataTransfer?.getData(FE_DND_SRC_MIME);\n  if (v) return v;\n  return activeNativeDrag()?.origin || undefined;\n}\n\n/**\n * Can this install hand a plain URL to the browser's download stack?\n *\n * Only when the credential travels on its own: a cookie session (the web\n * explorer) or no auth at all. With a bearer token the page holds the\n * credential and the download would arrive unauthenticated — a drop that\n * silently produces a 401 page named like the file is worse than a drop that\n * does nothing. The desktop app (bearer) uses the native path instead, and a\n * bearer page in a browser (the admin SPA) hands over a minted link — see\n * `createDragLinks`.\n */\nexport function canDownloadUrlDrag(auth: unknown): boolean {\n  const kind = authKindOf(auth);\n  return kind === undefined || kind === 'none' || kind === 'csrf';\n}\n\n/** `AuthConfig` carries the strategy as `kind`, or as `type` in the 0.1.0\n *  shape embedders still pass. Both mean the same thing here. */\nexport function authKindOf(auth: unknown): string | undefined {\n  if (!auth || typeof auth !== 'object') return undefined;\n  const a = auth as { kind?: unknown; type?: unknown };\n  const raw = typeof a.kind === 'string' ? a.kind : typeof a.type === 'string' ? a.type : undefined;\n  return raw;\n}\n\n/**\n * The `DownloadURL` value Chromium wants: `<mime>:<filename>:<absolute url>`.\n *\n * ⚠ Absolute. A relative URL is accepted by `setData` and then fails to\n * resolve in the browser process, which is a drop that quietly does nothing.\n */\nexport function downloadUrlPayload(item: DragItem, url: string, mime?: string): string | null {\n  if (item.type !== 'file') return null;\n  let abs = url;\n  try {\n    abs = new URL(url, typeof location !== 'undefined' ? location.href : undefined).toString();\n  } catch {\n    return null;\n  }\n  if (!/^https?:/i.test(abs)) return null;\n  const name = item.basename.replace(/[:\\r\\n]/g, '_');\n  return `${mime && mime.trim() ? mime : 'application/octet-stream'}:${name}:${abs}`;\n}\n\n/** Stable key for \"is the shell's prepared set still the one being dragged?\" */\nexport function dragKey(items: Array<{ path: string }>): string {\n  return items\n    .map((i) => i.path)\n    .sort()\n    .join(String.fromCharCode(0));\n}\n\n/* === #71 — a minted link for a session the browser cannot sign ===========\n *\n * A bearer page (the admin SPA) cannot give `DownloadURL` its plain download\n * URL: the browser's download stack sends no Authorization header. The server\n * mints a short-lived, single-use, credential-free link to one file instead\n * (`requestFileLink`). The catch is WHEN: `dragstart` must fill the\n * dataTransfer synchronously — it is writable during that event and never\n * after — so a link asked for at dragstart arrives too late, every time. It\n * has to exist before the drag begins.\n *\n * So the explorer asks while the pointer rests on a row and again on the press\n * (`warm`), and `dragstart` only reads what is already here (`take`). A person\n * hovers before pressing and presses before moving the few pixels that start\n * a drag; a mint is one small POST answered from the catalogue, not the\n * storage. When it has still not answered, the drag goes without a\n * `DownloadURL` — it never waits and never guesses.\n *\n * Three rules keep that cheap and honest:\n *   - one mint in flight at a time, and the rows a pointer crossed meanwhile\n *     collapse to the LAST one — sweeping across forty rows is two requests,\n *     not forty;\n *   - a link is handed out once: the server consumes it with the download it\n *     starts, so a second drag of the same row needs a new one;\n *   - a link close to its end is refreshed on the next hover/press, and is not\n *     handed out at all in its last seconds — a drop on a lapsed link is a 410\n *     the person only sees as a failed download.\n */\n\n/** A minted link, and how long the server said it lives. */\nexport interface MintedLink {\n  url: string;\n  ttlMs: number;\n}\n\nexport interface DragLinks {\n  /** Get a link for this file ready (hover / press). Cheap to call often. */\n  warm(path: string): void;\n  /** The live link for this file, handed out ONCE; null when there is none. */\n  take(path: string): string | null;\n  /** False once the server has shown it cannot mint file links. */\n  readonly supported: boolean;\n}\n\nexport interface DragLinkOptions {\n  now?: () => number;\n  /** Below this much life left, the next warm mints a fresh link. */\n  refreshBelowMs?: number;\n  /** Below this much life left, a link is no longer handed to a drag. */\n  usableAboveMs?: number;\n  /** How long a refused mint is not asked again for the same file. */\n  failPauseMs?: number;\n  /** How many links are kept at once. */\n  max?: number;\n  /** Called once when the server turns out not to mint file links. */\n  onUnsupported?: () => void;\n}\n\nexport function createDragLinks(\n  mint: (path: string) => Promise<MintedLink | null>,\n  opts: DragLinkOptions = {},\n): DragLinks {\n  const now = opts.now ?? (() => Date.now());\n  const refreshBelow = opts.refreshBelowMs ?? 30_000;\n  const usableAbove = opts.usableAboveMs ?? 5_000;\n  const failPause = opts.failPauseMs ?? 30_000;\n  const max = opts.max ?? 32;\n  const links = new Map<string, { url: string; expiresAt: number }>();\n  const pausedUntil = new Map<string, number>();\n  let inflight: string | null = null;\n  let queued: string | null = null;\n  let supported = true;\n\n  function remaining(path: string): number {\n    const e = links.get(path);\n    return e ? e.expiresAt - now() : -Infinity;\n  }\n\n  function start(path: string) {\n    inflight = path;\n    // A throw from `mint` itself is a refusal like any other, not a crash of\n    // the hover that asked.\n    let pending: Promise<MintedLink | null>;\n    try {\n      pending = mint(path);\n    } catch (err) {\n      pending = Promise.reject(err);\n    }\n    pending\n      .then((got) => {\n        if (got === null) {\n          if (supported) {\n            supported = false;\n            links.clear();\n            opts.onUnsupported?.();\n          }\n          return;\n        }\n        links.delete(path);\n        links.set(path, { url: got.url, expiresAt: now() + got.ttlMs });\n        while (links.size > max) {\n          const oldest = links.keys().next().value;\n          if (oldest === undefined) break;\n          links.delete(oldest);\n        }\n      })\n      .catch(() => {\n        pausedUntil.set(path, now() + failPause);\n      })\n      .finally(() => {\n        inflight = null;\n        const next = queued;\n        queued = null;\n        if (next) warm(next);\n      });\n  }\n\n  function warm(path: string) {\n    if (!supported || !path) return;\n    if (remaining(path) > refreshBelow) return;\n    const paused = pausedUntil.get(path);\n    if (paused !== undefined) {\n      if (paused > now()) return;\n      pausedUntil.delete(path);\n    }\n    if (inflight === path) return;\n    if (inflight !== null) {\n      queued = path;\n      return;\n    }\n    start(path);\n  }\n\n  function take(path: string): string | null {\n    const e = links.get(path);\n    if (!e) return null;\n    links.delete(path);\n    return e.expiresAt - now() > usableAbove ? e.url : null;\n  }\n\n  return {\n    warm,\n    take,\n    get supported() {\n      return supported;\n    },\n  };\n}\n\n/** One report of a drop being filled in (ExplorerConfig.dragOut.onProgress). */\nexport interface DragProgressLike {\n  done: number;\n  total: number;\n  name?: string;\n  /** Where it was dropped: set once the drop has landed. */\n  dropped?: string;\n  finished?: boolean;\n  error?: string;\n  /** Files written into the drop so far (inside folders too). */\n  files?: number;\n}\n\nexport type DragProgressSay =\n  | { kind: 'flash'; message: string }\n  /** A line held on screen until the next report: the work is still going. */\n  | { kind: 'hold'; message: string; stoppable: boolean }\n  | null;\n\n/**\n * What the explorer says about a drop being filled in.\n *\n * ⚠ After the drop the desktop app downloads what was dragged into the place\n * it was dropped. The explorer said \"Downloading…\" for 2.5 s once per dragged\n * item — one folder, one toast — and then nothing until the end, however many\n * minutes and files that was, with no way to stop it. While it runs the line\n * now stays, counts the files written so far, and offers Stop when the shell\n * can stop it; the end is said once.\n */\nexport function sayDragProgress(\n  p: DragProgressLike,\n  opts: { quiet: boolean; stoppable: boolean; t: (key: string, vars?: Record<string, string | number>) => string },\n): DragProgressSay {\n  const { t } = opts;\n  const afterDrop = !!p.dropped;\n  if (p.error === 'drop_not_found') return { kind: 'flash', message: t('dragout.not_found') };\n  if (p.error === 'cancelled') return { kind: 'flash', message: t('dragout.stopped') };\n  if (p.error) return afterDrop || !opts.quiet ? { kind: 'flash', message: p.error } : null;\n  if (afterDrop) {\n    if (p.finished) return { kind: 'flash', message: t('dragout.done') };\n    return {\n      kind: 'hold',\n      message: p.files ? t('dragout.downloading_n', { n: p.files }) : t('dragout.downloading'),\n      stoppable: opts.stoppable,\n    };\n  }\n  if (opts.quiet) return null;\n  if (!p.finished && p.done === 0) return { kind: 'flash', message: t('dragout.preparing') };\n  return null;\n}\n","/**\n * thumbNote - why a file has no thumbnail, said ON the file (filex 0.50).\n *\n * A listing carries `thumb_note` on a file whose thumbnail will not come\n * because of the file itself (backend thumb/notes.go, one table):\n *\n *   corrupt    it could not be read: damaged or incomplete\n *   encrypted  a password on an office document, a zip's encrypted entries,\n *              or filex's own end-to-end encryption\n *   too_large  over a preview size limit (office, SVG, archive, an app's)\n *\n * The file keeps its type icon, and a small marker with an icon sits in its\n * corner; resting the pointer on it, or tapping it, says the sentence below.\n * A failure that may pass (the network, a busy document server) has no note:\n * it is drawn again later.\n *\n * ⚠ ONE reader, for the reason lib/unavailable is one: the list, the grid\n * and the gallery all take the note, its words and its icon from here, and\n * ThumbTile draws it, so the three views cannot disagree. The marker belongs\n * to the type icon, never to a picture: a file with a thumbnail has no note,\n * and the list's type badge (lib/filePreview thumbTypeBadge) is only drawn\n * on a picture, so the two never meet.\n */\nimport type { FileNode, ThumbNote } from '../types/FileNode';\n\n/** What `thumbNoteWords` needs from the caller's locale. */\nexport interface ThumbNoteHost {\n  t: (key: string, vars?: Record<string, string | number>) => string;\n}\n\n/** The words and the icon of one note. */\nexport interface ThumbNoteWords {\n  note: ThumbNote;\n  /** One or two words: \"Damaged\". */\n  label: string;\n  /** Why there is no thumbnail, in a sentence. */\n  why: string;\n  /** `label` and `why` together: the tooltip, the accessible name. */\n  full: string;\n  /** The icon, as the `d` of 24x24 stroked paths (the icon set's style). */\n  paths: readonly string[];\n}\n\n/** The notes this client knows; any other value is ignored. */\nexport const THUMB_NOTES: readonly ThumbNote[] = ['corrupt', 'encrypted', 'too_large'];\n\n/** The icon of each note: a page with a cross, a padlock, arrows apart. */\nconst ICONS: Record<ThumbNote, readonly string[]> = {\n  corrupt: [\n    'M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z',\n    'M14 2v4a2 2 0 0 0 2 2h4',\n    'm14.5 12.5-5 5',\n    'm9.5 12.5 5 5',\n  ],\n  encrypted: ['M5 11h14a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2Z', 'M7 11V7a5 5 0 0 1 10 0v4'],\n  too_large: ['M15 3h6v6', 'M9 21H3v-6', 'M21 3l-7 7', 'M3 21l7-7'],\n};\n\n/** Every wording handed out, by note and words (see thumbNoteWords). */\nconst WORDS = new Map<string, ThumbNoteWords>();\n\n/** The note of a file that has no thumbnail, or null. */\nexport function thumbNoteOf(\n  node: Pick<FileNode, 'type' | 'thumb_note' | 'thumb_url'> | null | undefined,\n): ThumbNote | null {\n  if (!node || node.type !== 'file' || node.thumb_url) return null;\n  const n = node.thumb_note;\n  return n && (THUMB_NOTES as readonly string[]).includes(n) ? n : null;\n}\n\n/**\n * The words for a file's note, or `null` when it has none.\n *\n * ⚠ Literal `t('…')` keys on purpose: `web/tests/i18n/coreKeysUsed.test.ts`\n * scans the source for them and skips anything computed.\n */\nexport function thumbNoteWords(\n  node: Pick<FileNode, 'type' | 'thumb_note' | 'thumb_url'> | null | undefined,\n  host: ThumbNoteHost,\n): ThumbNoteWords | null {\n  const note = thumbNoteOf(node);\n  if (!note) return null;\n  let label: string;\n  let why: string;\n  switch (note) {\n    case 'corrupt':\n      label = host.t('thumbNote.corrupt');\n      why = host.t('thumbNote.corrupt_why');\n      break;\n    case 'encrypted':\n      label = host.t('thumbNote.encrypted');\n      why = host.t('thumbNote.encrypted_why');\n      break;\n    default:\n      label = host.t('thumbNote.too_large');\n      why = host.t('thumbNote.too_large_why');\n  }\n  const full = host.t('thumbNote.full', { label, why });\n  // One object per note and wording, so a re-render hands ThumbTile the same\n  // value and the tile has nothing to compare (as thumbTypeBadge does).\n  const key = `${note}|${full}`;\n  let words = WORDS.get(key);\n  if (!words) {\n    words = { note, label, why, full, paths: ICONS[note] };\n    WORDS.set(key, words);\n  }\n  return words;\n}\n","/**\n * filePreview — gorunum:v1-preview.\n *\n * The first lines of the REAL file, drawn inside the card's preview box when\n * there is nothing better to put there.\n *\n * ## Why this exists at all\n *\n * The backend already answers `thumb_url` for a `.ts` or a `.csv` — but what\n * it renders for them is `internal/thumb/generic.go`: a card tinted from a\n * hash of the extension with the letters \"TS\" drawn in the middle. Measured\n * on the local backend, `GET /api/files/thumb/6` (app.ts) is a 1,745-byte\n * JPEG of exactly that. So the card was already spending a request to be told\n * the same thing its own footer tile says, in a colour nobody chose.\n *\n * A code file's first five lines say what it is in a way no glyph can. That\n * is the whole idea: for the kinds we can read as text we skip the generic\n * thumbnail entirely and fetch a few kilobytes of the file instead — the same\n * number of requests, a preview that means something.\n *\n * ⚠ This never competes with a REAL thumbnail. The kinds it claims (code,\n * plain text, csv/tsv) are precisely the kinds this backend cannot render a\n * content-derived thumbnail for; images, video, audio and PDFs are untouched\n * and keep their `<img>`.\n *\n * ## What bounds the cost\n *\n * Four independent limits, because any one of them alone is a promise rather\n * than a bound:\n *\n *   1. **Visibility.** Nothing is fetched until the card intersects the\n *      viewport (IntersectionObserver, 150px of margin so a scroll does not\n *      chase the reader). ⚠ `useThumbs` does NOT do this — it fires on first\n *      render for every row the parent hands it — so there was nothing to\n *      reuse here; a 400-file folder would have been 400 reads.\n *   2. **A ranged request.** `Range: bytes=0-8191`. The preview endpoint\n *      answers 206 through `http.ServeContent` whenever the driver can seek\n *      (`vfStream`, manager.go).\n *   3. **A bounded read.** ⚠ A driver that cannot seek answers 200 with the\n *      WHOLE body and `Accept-Ranges: none` — the Range header is a request,\n *      not a guarantee. So the body is consumed chunk by chunk and the reader\n *      is cancelled the moment we have enough. This, not the header, is what\n *      actually caps the bytes.\n *   4. **A file-size ceiling + a concurrency cap.** 4 MB and 3 in flight.\n *\n * Results are cached per path AND per version (etag, else mtime, else size),\n * so an edited file re-reads and an unchanged one never does.\n */\n\nimport { ref } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport { extensionLabel, iconFamilyFor, type IconFamily } from './fileIcons';\nimport { resolveEndpoints } from '../composables/useFileApi';\n\n/** What shape the preview takes. `null` = this node has no text preview. */\nexport type PreviewKind = 'code' | 'text' | 'table';\n\n/**\n * One rendered line. Split in three so the view can print it WITHOUT\n * `v-html` — the content is somebody's file, and interpolation is the only\n * honest way to put it on screen.\n */\nexport interface PreviewLine {\n  /** Leading whitespace, kept so nesting is visible. */\n  indent: string;\n  /** The opening token when it is worth tinting ('' = leave it plain). */\n  tint: string;\n  /** Everything after it, verbatim. */\n  text: string;\n}\n\nexport interface FilePreview {\n  kind: PreviewKind;\n  /** `code` / `text`. Empty for a table. */\n  lines: PreviewLine[];\n  /**\n   * `table` only: first rows × first columns, already clipped and PADDED to a\n   * rectangle. The card lays them out as one CSS grid, so a short row has to\n   * carry its empty cells or every row below it shifts a column left.\n   */\n  rows: string[][];\n  /** `table` only: the grid's column count (0 otherwise). */\n  cols: number;\n}\n\n/* ---------------------------------------------------------------- limits */\n\n/** Bytes asked for, and the hard cap on bytes actually read. */\nconst MAX_BYTES = 8 * 1024;\n/** Files bigger than this are left alone. See the header: the streaming\n *  cancel is the real bound, this is the \"never surprise the operator whose\n *  driver cannot seek\" guard. */\nconst MAX_FILE_BYTES = 4 * 1024 * 1024;\n/** Concurrent reads. Three keeps a fast scroll responsive without turning a\n *  folder of scripts into a thundering herd against one S3 bucket. */\nconst MAX_INFLIGHT = 3;\n/**\n * How much is parsed — NOT how much is shown.\n *\n * ⚠ These used to be 10 lines / 6 rows / 4 columns, and those numbers were\n * chosen for one box: the 184×108 grid card. They are not that box's height\n * in any other view, and a fixed count is the wrong shape of answer anyway.\n * Measured on 2026-09-12, before this change:\n *\n *   grid card    184×108  · 10 lines parsed, ~9 fit          → close enough\n *   gallery tile 220×220  · 10 lines parsed, 15 fit          → the bottom\n *                                                              HALF of every\n *                                                              tile was empty\n *   csv, either  · 6 rows × 4 cols whatever the box was, and budget.csv has\n *                  six columns, so two of them were simply never shown\n *\n * The owner's instruction is \"as much as we can fit\" (2026-09-12), so the box\n * decides: the parser hands over more than any box can show and the box\n * clips what it cannot, which is what `overflow: hidden` and the bottom fade\n * on `.fe-fprev` have always been for. These are therefore CEILINGS on work\n * and DOM, not layout constants — big enough for the largest tile we draw\n * with room over it, small enough that a 400-file folder stays cheap.\n */\nconst MAX_LINES = 24;\n/** Characters kept per line. The box clips long lines anyway; this bounds\n *  the DOM when a minified file arrives as one 8 KB line. */\nconst MAX_LINE_CHARS = 120;\nconst MAX_ROWS = 16;\n/** Columns parsed. How many are DRAWN follows the box: the grid lays the\n *  cells out on tracks with a readable minimum width and clips the overflow,\n *  so a wide tile shows more of the table than a narrow one without either\n *  view knowing anything the other does not. */\nconst MAX_COLS = 8;\n/** Cache ceiling, mirroring useThumbs' own. Parsed previews are a few hundred\n *  bytes each, so this is generous. */\nconst MAX_CACHED = 400;\n\n/* ------------------------------------------------------------ can we read */\n\n/** The two tabular extensions. `sheet` as a FAMILY also holds xls/xlsx/ods,\n *  which are zip containers — reading their first bytes gives binary. */\nconst TABLE_EXTS = new Set(['csv', 'tsv']);\n\n/**\n * Is this row a deleted thing?\n *\n * ⚠ Two fields, because the two ways filex shows you a deleted file disagree.\n * A normal listing marks a soft-deleted row with `trashed`. The TRASH VIEW\n * does not: `FileExplorer.loadTrash` builds its rows from `TrashEntry` by hand\n * and that literal sets neither `trashed` nor `size` — it writes `file_size`\n * and stamps `extra_metadata.deleted_at`.\n *\n * Which means the size ceiling below was already excluding the whole trash\n * view, by accident, because `size` came back undefined. That is not a guard,\n * it is a coincidence one line in an unrelated file would end: the trash row's\n * `path` points at the trash KEY, not at the file it used to be, so a content\n * read there fetches a 404 for every row in the folder.\n */\nfunction isTrashRow(node: FileNode): boolean {\n  if (node.trashed) return true;\n  const meta = node.extra_metadata;\n  return !!meta && typeof meta === 'object' && 'deleted_at' in meta;\n}\n\n/**\n * Which preview this node could have, ignoring whether anything is wired up.\n *\n * Built on `iconFamilyFor` rather than on a second extension list: the\n * families ARE the taxonomy (filex lesson #67), so a new extension registered\n * for the icon set becomes previewable in the same edit. `svg` belongs to the\n * `image` family and is therefore excluded here — it is text, but it has a\n * real thumbnail, and the real one wins.\n */\nexport function previewKindFor(node: FileNode): PreviewKind | null {\n  if (node.type !== 'file') return null;\n  if (node.basename === '.trash' || node.mime_type === 'inode/storage') return null;\n  if (isTrashRow(node)) return null;\n  // ⚠ A node with NO size is excluded too, not just an empty one: the size is\n  // what the 4 MB ceiling is checked against, and \"we don't know\" is not a\n  // basis for deciding to read a file. Every row `projectFileNodes` emits\n  // carries one.\n  const size = node.size ?? 0;\n  if (size <= 0 || size > MAX_FILE_BYTES) return null;\n  const ext = (node.extension || '').trim().toLowerCase();\n  if (TABLE_EXTS.has(ext)) return 'table';\n  const family = iconFamilyFor(node);\n  if (family === 'code') return 'code';\n  if (family === 'text') return 'text';\n  return null;\n}\n\n/**\n * Is this node's thumbnail a PAGE — the first page of a document, rather than\n * a picture that was already the shape it wanted to be?\n *\n * It matters because of where the card crops. A thumbnail box is landscape\n * (184×108 in the grid) and a page is portrait, so `object-fit: cover` has to\n * throw away most of the height, and WHICH part it throws away is the whole\n * question. Centred — the default, and what this did before — discards the\n * top, which on a document is the letterhead, the title and the date: the\n * only part that says which document it is. Measured on 2026-09-12 against a\n * reference deployment carrying the same defect, five different PDFs sharing\n * one template produced five cards nobody could tell apart, because the only\n * thing that differed between them was the title that had been cropped away.\n *\n * So pages anchor to the top and photographs stay centred, and this is the\n * one place that decides which is which. Built on `iconFamilyFor` rather than\n * a private extension list, for the same reason the preview kinds are: the\n * families ARE the taxonomy (filex lesson #67).\n */\nexport function drawsAsPage(node: FileNode): boolean {\n  if (node.type !== 'file') return false;\n  switch (iconFamilyFor(node)) {\n    case 'pdf':\n    case 'doc':\n    case 'sheet':\n    case 'slides':\n      return true;\n    default:\n      return false;\n  }\n}\n\n/**\n * Is this node's thumbnail a still taken from a MOVING picture?\n *\n * A frame lifted out of a video is, on a card, indistinguishable from a\n * photograph — which is the one thing a person needs to know before they\n * click it. The views draw a play badge over these, so the answer lives here\n * rather than in each of them.\n */\nexport function drawsAsVideo(node: FileNode): boolean {\n  return node.type === 'file' && iconFamilyFor(node) === 'video';\n}\n\n/**\n * The families whose thumbnail is drawn on PAPER: a white or near-white sheet\n * with dark marks on it. The first page of an office document or a PDF, the\n * first lines of a text or Markdown file, the list of what an archive holds\n * (backend/internal/thumb: office.go, pdf.go, text.go, archive.go).\n *\n * ⚠ The ONE place this is decided. The folder peek pictures these (with\n * photographs and video frames) where it would otherwise show a type tile.\n * The list's type badge is wider than this set: every thumbnail that is not\n * a picture of its own carries one (`thumbTypeBadge`), because at 24 pixels\n * a page is a white square on a white row and the row looks as if it had\n * lost its icon (0.50, the first release that drew real pages there: 0.49\n * drew a coloured card with the extension on it).\n */\nconst PAPER_FAMILIES: ReadonlySet<IconFamily> = new Set<IconFamily>([\n  'pdf',\n  'doc',\n  'sheet',\n  'slides',\n  'text',\n  'archive',\n]);\n\n/** Is this node's thumbnail a light sheet of paper (see PAPER_FAMILIES)? */\nexport function drawsOnPaper(node: FileNode): boolean {\n  return node.type === 'file' && PAPER_FAMILIES.has(iconFamilyFor(node));\n}\n\n/**\n * The families whose thumbnail is a picture of its own - a photograph, a\n * frame of a video - and needs no caption. Every other thumbnail in the list\n * names its kind (`thumbTypeBadge`).\n */\nconst PICTURE_FAMILIES: ReadonlySet<IconFamily> = new Set<IconFamily>(['image', 'video']);\n\n/** What the list view's type badge says and which family's colour it wears. */\nexport interface ThumbTypeBadge {\n  /** Picks the colour: the same `fe-ftile--<family>` the type tile is filled with. */\n  family: IconFamily;\n  /** The extension in capitals, the words the type tile's caption would use. */\n  label: string;\n}\n\n/** One object per family and label, so a re-render hands the tile the same\n *  value and the tile has nothing to compare. */\nconst BADGES = new Map<string, ThumbTypeBadge>();\n\n/**\n * The type badge for this node's thumbnail, or null when it gets none: a\n * photograph or a video frame (PICTURE_FAMILIES), not a file, or no\n * extension to name (`LICENSE`, a `Makefile`).\n *\n * ⚠ Every OTHER thumbnail carries one, not only the families filex draws on\n * paper: an app can draw a thumbnail for any kind (Admin → Plugins → Default\n * apps), and the 0.50 release shots showed what an app draws for a kind with\n * no family of its own - a package's list of contents, `.jar` / `.apk` /\n * `.whl` - as the white square on a white row this badge is there to prevent.\n * A kind with no family wears the neutral grey of the unknown type icon.\n *\n * Built from the two sources the type tile itself uses, never a table of its\n * own: the family from `iconFamilyFor` (its colour is that family's\n * `--fe-icon-<family>` token, through the tile's `fe-ftile--<family>` class)\n * and the words from `extensionLabel`.\n *\n * ⚠ It says nothing about whether a thumbnail is actually drawn. The badge\n * belongs to the PICTURE, so ThumbTile shows it only while it has one; without\n * a picture the row already shows the coloured type tile, and a badge on top\n * of that would say the same thing twice.\n */\nexport function thumbTypeBadge(node: FileNode): ThumbTypeBadge | null {\n  if (node.type !== 'file') return null;\n  const family = iconFamilyFor(node);\n  if (PICTURE_FAMILIES.has(family)) return null;\n  const label = extensionLabel(node);\n  if (!label) return null;\n  const key = `${family}:${label}`;\n  let badge = BADGES.get(key);\n  if (!badge) {\n    badge = { family, label };\n    BADGES.set(key, badge);\n  }\n  return badge;\n}\n\n/* --------------------------------------------------------------- parsing */\n\n/**\n * Openers worth a tint. Deliberately small and deliberately language-agnostic:\n * the brief's own instruction is that plain text beats fake colour, so a token\n * is tinted only when it really is a keyword. A JSON file opening on `{`, or a\n * YAML file opening on a key, gets no colour at all — which is the correct\n * answer, not a missing feature.\n */\nconst KEYWORDS = new Set([\n  'import', 'export', 'from', 'require', 'include', 'use', 'using', 'package',\n  'module', 'namespace', 'const', 'let', 'var', 'function', 'func', 'fn', 'def',\n  'class', 'struct', 'enum', 'interface', 'type', 'impl', 'trait',\n  'public', 'private', 'protected', 'static', 'async', 'await', 'return',\n  'if', 'else', 'for', 'while', 'switch', 'case', 'try', 'catch',\n  'select', 'insert', 'update', 'delete', 'create', 'alter', 'drop',\n]);\n\n/** Markdown-ish line markers — the only thing tinted in a `text` preview. */\nconst TEXT_MARKER = /^(#{1,6}|[-*+]|>|\\d+\\.)$/;\n\n/** Strip the punctuation a keyword is usually wearing (`const,` `if(` `def:`). */\nfunction bareToken(token: string): string {\n  return token.replace(/[(){}[\\];:,.]+$/, '').toLowerCase();\n}\n\nfunction toLine(raw: string, kind: PreviewKind): PreviewLine {\n  const clipped = raw.length > MAX_LINE_CHARS ? raw.slice(0, MAX_LINE_CHARS) : raw;\n  const m = /^(\\s*)(\\S+)([\\s\\S]*)$/.exec(clipped);\n  if (!m) return { indent: '', tint: '', text: clipped };\n  const [, indent, first, rest] = m;\n  const tintable =\n    kind === 'code' ? KEYWORDS.has(bareToken(first)) : TEXT_MARKER.test(first);\n  if (!tintable) return { indent: '', tint: '', text: clipped };\n  return { indent, tint: first, text: rest };\n}\n\n/**\n * Split one delimited row into cells, honouring `\"…\"` quoting (and `\"\"` as an\n * escaped quote) so a value containing the separator does not become two\n * columns. Small on purpose — this draws six rows on a 184px card, it is not\n * a CSV parser and must never grow into one.\n */\nexport function splitCells(line: string, sep: string): string[] {\n  const out: string[] = [];\n  let cur = '';\n  let quoted = false;\n  for (let i = 0; i < line.length; i++) {\n    const c = line[i];\n    if (quoted) {\n      if (c === '\"') {\n        if (line[i + 1] === '\"') {\n          cur += '\"';\n          i++;\n        } else {\n          quoted = false;\n        }\n      } else {\n        cur += c;\n      }\n    } else if (c === '\"') {\n      quoted = true;\n    } else if (c === sep) {\n      out.push(cur);\n      cur = '';\n    } else {\n      cur += c;\n    }\n  }\n  out.push(cur);\n  return out;\n}\n\n/** `,` normally; `\\t` for a .tsv; `;` when the first row clearly uses it —\n *  the shape Excel writes in most of Europe, Turkey included. */\nfunction separatorFor(ext: string, firstLine: string): string {\n  if (ext === 'tsv') return '\\t';\n  if (!firstLine.includes(',') && firstLine.includes(';')) return ';';\n  return ',';\n}\n\n/**\n * Bytes → a drawable preview, or null when the bytes are not text after all\n * (a `.json` that is really a binary blob, ciphertext, a mislabelled file).\n *\n * `truncated` says the byte cap cut the stream, in which case the last line is\n * dropped: half a line of source looks like a bug, not like a preview.\n */\nexport function parsePreview(\n  bytes: Uint8Array,\n  kind: PreviewKind,\n  ext: string,\n  truncated: boolean,\n): FilePreview | null {\n  // A NUL in the first few KB is the cheapest reliable \"this is not text\".\n  for (let i = 0; i < bytes.length; i++) {\n    if (bytes[i] === 0) return null;\n  }\n  const text = new TextDecoder('utf-8', { fatal: false }).decode(bytes);\n  // A decode full of replacement characters is binary wearing a text\n  // extension — or a file in an encoding we are not going to guess at.\n  let bad = 0;\n  for (const ch of text) if (ch === '�') bad++;\n  if (text.length > 0 && bad / text.length > 0.1) return null;\n\n  const lines = text.split(/\\r\\n|\\r|\\n/);\n  if (truncated && lines.length > 1) lines.pop();\n  // Blank lines at either end waste a box that only holds eight — and every\n  // text file that ends in a newline has one. Interior blanks stay: they are\n  // part of how the file looks, which is the whole point.\n  while (lines.length && lines[0].trim() === '') lines.shift();\n  while (lines.length && lines[lines.length - 1].trim() === '') lines.pop();\n  if (lines.length === 0) return null;\n\n  if (kind === 'table') {\n    const sep = separatorFor(ext, lines[0]);\n    const rows = lines\n      .filter((l) => l.trim() !== '')\n      .slice(0, MAX_ROWS)\n      .map((l) => splitCells(l, sep).slice(0, MAX_COLS).map((c) => c.trim().slice(0, 24)));\n    if (rows.length === 0) return null;\n    const cols = rows.reduce((n, r) => Math.max(n, r.length), 0);\n    for (const r of rows) while (r.length < cols) r.push('');\n    return { kind, lines: [], rows, cols };\n  }\n\n  return {\n    kind,\n    lines: lines.slice(0, MAX_LINES).map((l) => toLine(l, kind)),\n    rows: [],\n    cols: 0,\n  };\n}\n\n/* ---------------------------------------------------------------- loading */\n\nexport interface PreviewLoaderOptions {\n  /** Same prefix the explorer hands the views. `undefined` = no API wired\n   *  (a legacy embedder on an explicit `endpoint`) → the loader stays off. */\n  apiBase?: string;\n  /**\n   * ⚠ ASYNC, and it is the whole reason this signature is a function and not\n   * an object. Spreading a Promise into a headers literal yields `{}` — the\n   * request goes out with no Authorization and 401s with nothing in the\n   * console. Every call site here `await`s it.\n   */\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  credentials?: RequestCredentials;\n  /**\n   * Answered on every decision, not once at construction: \"is reading file\n   * bytes off right now?\". The explorer passes its encrypted-folder state —\n   * inside one, every body on the wire is ciphertext, and fetching 8 KB of it\n   * to discover that it does not decode is a request spent to learn nothing.\n   */\n  disabled?: () => boolean;\n}\n\nexport interface FilePreviewLoader {\n  /** False when nothing is wired — callers must then keep their old markup. */\n  readonly enabled: boolean;\n  /** The kind this node would get, or null (including when disabled). */\n  kindFor: (node: FileNode) => PreviewKind | null;\n  /** Reactive read. null = not loaded (yet), or never. */\n  get: (node: FileNode) => FilePreview | null;\n  /** Template-ref sink: hand it the preview box and its node. */\n  bind: (el: Element | null, node: FileNode) => void;\n  /** In-flight + queued, for tests and measurement. */\n  stats: () => { loaded: number; inflight: number; queued: number; failed: number };\n  dispose: () => void;\n}\n\n/** Between a key's path and its version: a character no path or version\n *  holds. ⚠ Written as an expression, never as the byte itself — a raw NUL\n *  made git treat this whole file as binary and hide its diffs. */\nconst KEY_SEP = String.fromCharCode(0);\n\n/** path + version: an edited file re-reads, an untouched one never does. */\nfunction keyOf(node: FileNode): string {\n  const etag = typeof node.etag === 'string' ? node.etag : '';\n  const version = etag || String(node.last_modified ?? '') || String(node.size ?? '');\n  return `${node.path}${KEY_SEP}${version}`;\n}\n\nexport function createFilePreviews(opts: PreviewLoaderOptions): FilePreviewLoader {\n  const enabled =\n    opts.apiBase !== undefined &&\n    typeof opts.authHeaders === 'function' &&\n    typeof IntersectionObserver !== 'undefined' &&\n    typeof fetch === 'function';\n\n  const cache = ref<Record<string, FilePreview>>({});\n  const order: string[] = [];\n  const failed = new Set<string>();\n  const queued = new Set<string>();\n  const queue: FileNode[] = [];\n  const controllers = new Set<AbortController>();\n  /** element → the key it is currently observed for, so a re-render of the\n   *  same card does not re-observe and a recycled row does. */\n  const bound = new WeakMap<Element, string>();\n  let inflight = 0;\n  let observer: IntersectionObserver | null = null;\n  /** The observed element's node, kept until the callback fires. */\n  const watching = new Map<Element, FileNode>();\n\n  function previewUrl(path: string): string {\n    // resolveEndpoints is the one place that knows how apiBase becomes a\n    // manager URL; `?q=` + `&action=` is the pair every other caller sends.\n    const manager = resolveEndpoints({ apiBase: opts.apiBase }).manager;\n    const sep = manager.includes('?') ? '&' : '?';\n    const query = new URLSearchParams({ q: 'preview', action: 'preview', path });\n    return `${manager}${sep}${query.toString()}`;\n  }\n\n  function remember(key: string, value: FilePreview) {\n    if (order.length >= MAX_CACHED) {\n      const evict = order.shift();\n      if (evict) {\n        const next = { ...cache.value };\n        delete next[evict];\n        cache.value = next;\n      }\n    }\n    order.push(key);\n    cache.value = { ...cache.value, [key]: value };\n  }\n\n  /**\n   * Read at most `MAX_BYTES` of the body, whatever the server decided to send.\n   * A 206 is already short; a 200 from a driver that cannot seek is the whole\n   * file, and cancelling the reader is what stops it.\n   */\n  async function readHead(res: Response): Promise<{ bytes: Uint8Array; truncated: boolean }> {\n    const body = res.body;\n    if (!body) {\n      const buf = new Uint8Array(await res.arrayBuffer());\n      return { bytes: buf.slice(0, MAX_BYTES), truncated: buf.length > MAX_BYTES };\n    }\n    const reader = body.getReader();\n    const chunks: Uint8Array[] = [];\n    let total = 0;\n    try {\n      while (total < MAX_BYTES) {\n        const { done, value } = await reader.read();\n        if (done) break;\n        if (value && value.length) {\n          chunks.push(value);\n          total += value.length;\n        }\n      }\n    } finally {\n      try {\n        await reader.cancel();\n      } catch {\n        /* already closed */\n      }\n    }\n    const joined = new Uint8Array(Math.min(total, MAX_BYTES));\n    let at = 0;\n    for (const c of chunks) {\n      if (at >= joined.length) break;\n      joined.set(c.subarray(0, joined.length - at), at);\n      at += c.length;\n    }\n    return { bytes: joined, truncated: total >= MAX_BYTES };\n  }\n\n  async function load(node: FileNode, kind: PreviewKind): Promise<void> {\n    const key = keyOf(node);\n    const ctrl = new AbortController();\n    controllers.add(ctrl);\n    try {\n      // ⚠ The await. Without it this object holds a Promise under\n      // `authHeaders`, fetch drops it, and the request 401s silently.\n      const base = opts.authHeaders ? await opts.authHeaders() : {};\n      const res = await fetch(previewUrl(node.path), {\n        headers: { ...base, Accept: '*/*', Range: `bytes=0-${MAX_BYTES - 1}` },\n        credentials: opts.credentials,\n        signal: ctrl.signal,\n      });\n      if (!res.ok && res.status !== 206) throw new Error(String(res.status));\n      const { bytes, truncated } = await readHead(res);\n      ctrl.abort();\n      const ext = (node.extension || '').trim().toLowerCase();\n      const parsed = parsePreview(bytes, kind, ext, truncated);\n      if (!parsed) {\n        failed.add(key);\n        return;\n      }\n      remember(key, parsed);\n    } catch {\n      // 403/404/offline/not-really-text — the card keeps its type tile, and\n      // we do not retry inside this session (same policy as useThumbs).\n      failed.add(key);\n    } finally {\n      controllers.delete(ctrl);\n    }\n  }\n\n  function pump() {\n    while (inflight < MAX_INFLIGHT && queue.length > 0) {\n      const node = queue.shift()!;\n      const kind = previewKindFor(node);\n      queued.delete(keyOf(node));\n      if (!kind) continue;\n      inflight++;\n      void load(node, kind).finally(() => {\n        inflight--;\n        pump();\n      });\n    }\n  }\n\n  function enqueue(node: FileNode) {\n    const key = keyOf(node);\n    if (cache.value[key] || failed.has(key) || queued.has(key)) return;\n    queued.add(key);\n    queue.push(node);\n    pump();\n  }\n\n  function ensureObserver(): IntersectionObserver | null {\n    if (!enabled) return null;\n    if (!observer) {\n      observer = new IntersectionObserver(\n        (entries) => {\n          for (const entry of entries) {\n            if (!entry.isIntersecting) continue;\n            const node = watching.get(entry.target);\n            observer?.unobserve(entry.target);\n            watching.delete(entry.target);\n            if (node) enqueue(node);\n          }\n        },\n        { rootMargin: '150px' },\n      );\n    }\n    return observer;\n  }\n\n  function kindFor(node: FileNode): PreviewKind | null {\n    if (!enabled) return null;\n    if (opts.disabled?.()) return null;\n    return previewKindFor(node);\n  }\n\n  return {\n    enabled,\n    kindFor,\n    get(node: FileNode): FilePreview | null {\n      if (!enabled) return null;\n      return cache.value[keyOf(node)] ?? null;\n    },\n    bind(el: Element | null, node: FileNode) {\n      if (!el || !kindFor(node)) return;\n      const key = keyOf(node);\n      if (bound.get(el) === key) return;\n      bound.set(el, key);\n      if (cache.value[key] || failed.has(key)) return;\n      const io = ensureObserver();\n      if (!io) return;\n      watching.set(el, node);\n      io.observe(el);\n    },\n    stats: () => ({\n      loaded: order.length,\n      inflight,\n      queued: queue.length,\n      failed: failed.size,\n    }),\n    dispose() {\n      observer?.disconnect();\n      observer = null;\n      watching.clear();\n      for (const c of controllers) c.abort();\n      controllers.clear();\n      queue.length = 0;\n      queued.clear();\n    },\n  };\n}\n","/**\n * dateGroups — ONE date ladder, for every view that draws one.\n *\n * ⚠⚠ WHY THIS FILE EXISTS. The ladder used to live inside `ListView.vue` as a\n * private `bucketFor()`, and only the list drew headings at all: the grid and\n * the gallery showed the same rows in the same date order with nothing naming\n * the days. The owner asked for the headings in every view (\"Ve bunu her\n * görünümde de yapması lazım\"), and the shape of that request is exactly the\n * shape this repository keeps getting wrong — a rule copied into a second view\n * agrees with the first on the day it is written and on no day after it.\n * `lib/sortOrder` and `lib/listing.byFoldersFirst` are here for the same\n * reason, after the grid and the list had already drifted once (filex lesson\n * #67). So the ladder is written once, and List, Grid and Gallery all read it.\n *\n * ⚠ THE HEADING IS A CLAIM ABOUT THE ORDER. \"Today / Yesterday / March 2026\"\n * over rows that are not in date order is not a grouping, it is a lie: the\n * same heading would reappear wherever the real order happened to interleave\n * two days. `groupingActive()` is that rule, and it is the reason grouping\n * follows the SORT KEY rather than a switch of its own — a switch would create\n * a state in which the key says one thing and the grouping another, and no\n * view could honestly draw both (`lib/viewPrefs`'s header says the same).\n *\n * ⚠ zaman:z1 — every boundary here is a boundary in the VIEWER's zone, never\n * the device's. A file touched at 01:00 in Istanbul belongs under \"Yesterday\"\n * for a reader on UTC and under \"Today\" for a reader on Istanbul, and the\n * header has to agree with the date the cell four pixels away prints. That is\n * why the labels and the month id are taken from the caller (`useLocale`,\n * which reads `lib/timezone`) instead of being formatted here.\n */\nimport { zonedDayNumber } from './timezone';\n\nimport type { ListingOrder, SortKey } from './sortOrder';\n\n/** One rung: a stable id to compare runs by, and the words to draw. */\nexport interface DateBucket {\n  id: string;\n  label: string;\n}\n\n/**\n * What a view lends this module so the headings speak its language and read\n * its clock. All three come straight off `useLocale(...)`.\n */\nexport interface DateGroupLabels {\n  t: (key: string) => string;\n  /** \"September 2026\", in the viewer's locale and zone. */\n  formatMonthYear: (value: number | Date | undefined | null) => string;\n  /** `YYYY-MM` in the viewer's zone — a bucket id, not a label. */\n  zonedYearMonth: (value: number | Date | undefined | null) => string;\n}\n\n/**\n * THE LADDER.\n *\n * Today · Yesterday · This Week · This Month · then one rung per month,\n * named (\"September 2026\"). Undated rows land in \"No date\", which the sort\n * already parks at the end in both directions (`lib/sortOrder.byActiveKey`).\n *\n * Measured against the reference the owner pointed at — filex.blipnova.com,\n * 2026-09-13, the `/recent` page, which is the only surface there that groups.\n * Its ladder is `Today · Yesterday · <that day's date>`: one heading per\n * calendar day for ever, taken from the browser's own clock. Ours keeps its\n * first two rungs verbatim and then collapses, deliberately:\n *\n *   - a heading per day is not a grouping once a listing is long — a folder\n *     touched file-by-file over a month draws thirty headings over thirty\n *     single rows;\n *   - the owner's own words name the rungs we keep: \"son bir hafta, dün,\n *     bugün, bu ay içinde vb.\" (last week, yesterday, today, within this\n *     month, and so on);\n *   - and the reference reads the DEVICE's calendar, which is the bug\n *     `lib/timezone` exists to have fixed here.\n *\n * ⚠ \"This Week\" is the six days before yesterday (`day > today - 7`), NOT a\n * calendar week: a Monday listing with a calendar rule would put Sunday —\n * eighteen hours ago — under a month heading.\n *\n * ⚠ A stamp in the future reads best as \"today\". Clock skew between a storage\n * and the reader is ordinary, and \"September 2027\" over the file somebody just\n * saved is worse than a day's imprecision.\n */\nexport function dateBucketFor(d: Date | null, l: DateGroupLabels): DateBucket {\n  if (!d) return { id: 'none', label: l.t('group.no_date') };\n  const now = new Date();\n  const today = zonedDayNumber(now);\n  const day = zonedDayNumber(d);\n  if (day >= today) return { id: 'today', label: l.t('group.today') };\n  if (day === today - 1) return { id: 'yesterday', label: l.t('group.yesterday') };\n  if (day > today - 7) return { id: 'week', label: l.t('group.this_week') };\n  const ym = l.zonedYearMonth(d);\n  if (ym === l.zonedYearMonth(now)) return { id: 'month', label: l.t('group.this_month') };\n  return { id: `m-${ym}`, label: l.formatMonthYear(d) };\n}\n\n/**\n * Is a date heading honest over THIS listing?\n *\n * Both halves are required and neither is cosmetic:\n *   - the key has to be `modified`, because that is the only order in which\n *     consecutive rows share a day;\n *   - the listing must not be the server's RANKED answer, where the key is\n *     still `modified` (nothing cleared it) and the rows simply are not\n *     obeying it.\n *\n * Sorting by name with date headings on would be exactly the lie above, so\n * every other key draws no headings at all — in all three views.\n */\nexport function groupingActive(key: SortKey, order: ListingOrder | undefined): boolean {\n  return order !== 'relevance' && key === 'modified';\n}\n\n/** A contiguous run of items that share a heading. `label: null` = no heading. */\nexport interface DateRun<T> {\n  id: string;\n  label: string | null;\n  items: T[];\n}\n\n/** An item that is not filed under a date, and the run it belongs to instead. */\nexport interface AsideRun {\n  id: string;\n  /** A heading for that run, or null/absent for a run drawn without one. */\n  label?: string | null;\n}\n\nexport interface DateGroupOptions<T> {\n  /** `groupingActive(...)`. False → one unlabelled run holding everything. */\n  active: boolean;\n  /** The instant this item is filed under, or null for \"no date\". */\n  dateOf: (item: T) => Date | null;\n  /**\n   * Items that are NOT filed under a date — return the run they belong to, or\n   * null to bucket them by date like everything else.\n   *\n   * ⚠ This is how \"folders first\" survives a date sort. Folders are given a\n   * run of their own at the top rather than floating to the top of each\n   * bucket, because floating would split a bucket in two and draw \"Today\"\n   * twice — once over the folders, once over the files. A folder has no\n   * meaningful modification date to file under anyway. The list uses it for\n   * its pinned storage rows as well.\n   */\n  aside?: (item: T) => AsideRun | null;\n  labels: DateGroupLabels;\n}\n\n/**\n * The grouping, in the two shapes the three views need.\n *\n * `runs` is for a view that renders segment by segment (the list, whose rows\n * are already nested under a heading element). `headingBefore` is for a view\n * that renders one flat sequence of cards and inserts a full-width heading\n * item in front of the card that starts a run (the grid and the gallery).\n *\n * ⚠ They are two readings of ONE pass, not two implementations: the map is\n * built from the runs. A view that used its own \"did the bucket change since\n * the previous card\" test would be the second copy this module exists to\n * prevent.\n */\nexport interface DateGrouping<T> {\n  /** Mirrors the `active` that was asked for — views branch on it. */\n  active: boolean;\n  runs: DateRun<T>[];\n  /** The heading to draw immediately before this item, or null. */\n  headingBefore: (item: T) => string | null;\n}\n\nexport function groupByDate<T>(items: readonly T[], opts: DateGroupOptions<T>): DateGrouping<T> {\n  const runs: DateRun<T>[] = [];\n  if (!opts.active) {\n    runs.push({ id: 'all', label: null, items: [...items] });\n  } else {\n    let cur: DateRun<T> | null = null;\n    for (const item of items) {\n      const side = opts.aside?.(item) ?? null;\n      const b: { id: string; label: string | null } = side\n        ? { id: side.id, label: side.label ?? null }\n        : dateBucketFor(opts.dateOf(item), opts.labels);\n      if (!cur || cur.id !== b.id) {\n        cur = { id: b.id, label: b.label, items: [] };\n        runs.push(cur);\n      }\n      cur.items.push(item);\n    }\n  }\n  /* Identity-keyed: the items are the very objects the template loops over in\n   * the same render, so no key function has to be invented — and inventing one\n   * is how two views end up disagreeing about what \"the same row\" means. */\n  const firsts = new Map<T, string>();\n  for (const r of runs) {\n    if (r.label && r.items.length) firsts.set(r.items[0], r.label);\n  }\n  return {\n    active: opts.active,\n    runs,\n    headingBefore: (item: T) => firsts.get(item) ?? null,\n  };\n}\n","/**\n * star.ts — the ONE place that talks to `POST /api/files/manager/star`.\n *\n * Starring grew a second surface (the context menu, then the grid/gallery\n * cards) and a menu entry cannot render a component, so the request had to\n * come out of `StarButton.vue` — but only ONCE. `StarButton` calls this, the\n * explorer's menu action calls this, and there is no third copy of the URL,\n * the credentials rule or the payload shape anywhere.\n *\n * ⚠ `credentials` defaults to 'same-origin', never 'include': a credentialed\n * cross-origin request may not be answered with `Access-Control-Allow-Origin:\n * *`, which is what filex sends — hardcoding 'include' silently broke starring\n * in every embed served from a different origin to the API (the desktop app is\n * one). Same trap as `loadStarred`/`fetchNavRows` in FileExplorer.\n */\n\nimport { requestFailure } from './errorWords';\n\nexport interface StarRequestOptions {\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  /** The language a refusal is said in (lib/errorWords). */\n  locale?: string;\n}\n\n/** Toggle the starred flag for ONE node. Throws on a non-2xx answer so the\n *  caller can roll its optimistic state back. */\nexport async function setNodeStarred(\n  nodeId: number,\n  starred: boolean,\n  opts: StarRequestOptions = {},\n): Promise<void> {\n  const headers = {\n    'Content-Type': 'application/json',\n    ...(await (opts.authHeaders ?? (() => ({})))()),\n  };\n  const base = opts.apiBase ?? '';\n  const res = await fetch(`${base}/api/files/manager/star`, {\n    method: 'POST',\n    headers,\n    credentials: opts.authCredentials ?? 'same-origin',\n    body: JSON.stringify({ node_id: nodeId, starred }),\n  });\n  // Said (lib/errorWords), not \"star toggle failed: 403\" — the caller that\n  // shows it passes the language it speaks.\n  if (!res.ok) throw requestFailure(res.status, await res.text().catch(() => ''), opts.locale);\n}\n","<script setup lang=\"ts\">\n/**\n * StarButton — toggleable star indicator for a node.\n *\n * Backed by the `node_meta key=\"starred\"` server-side row (see\n * `POST /api/files/manager/star`). Optimistic update — flips the local\n * state immediately and rolls back on API error.\n */\nimport { ref, watch, computed } from 'vue';\nimport { setNodeStarred } from '../lib/star';\nimport { useLocale } from '../composables/useLocale';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { resolveLocale } from '../locales/resolve';\n\nconst props = defineProps<{\n  starred: boolean;\n  nodeId: number;\n  apiBase?: string;\n  /** Auth header builder injected by the parent file explorer. */\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  /** Credentials mode, from the explorer's auth kind. ⚠ Defaults to\n   *  'same-origin': a credentialed cross-origin request cannot be answered\n   *  with ACAO:* , so hardcoding 'include' broke this call in every embed\n   *  served from a different origin to the API. */\n  authCredentials?: RequestCredentials;\n  /** Compact mode for grid view (no label, just the icon). */\n  compact?: boolean;\n  /**\n   * Card mode — the same button sitting ON a grid/gallery tile instead of in\n   * a list cell: a round translucent chip in the tile's corner. It is the SAME\n   * component, deliberately: a card star written separately is a second\n   * starring path, and the two drift the first time one of them is fixed.\n   */\n  card?: boolean;\n  /** Locale for the title/label. ⚠ The strings used to be hardcoded English\n   *  (\"Star\"/\"Unstar\"), which is a Turkish user's only untranslated control in\n   *  the row. */\n  locale?: LocaleCode;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'change', value: boolean): void;\n  (e: 'error', message: string): void;\n}>();\n\nconst local = ref(props.starred);\nwatch(() => props.starred, (v) => { local.value = v; });\n\nconst { t } = useLocale(() => resolveLocale(props.locale));\nconst label = computed(() => t(local.value ? 'ctx.unstar' : 'ctx.star'));\n\nasync function toggle() {\n  const next = !local.value;\n  local.value = next; // optimistic\n  try {\n    await setNodeStarred(props.nodeId, next, {\n      apiBase: props.apiBase,\n      authHeaders: props.authHeaders,\n      authCredentials: props.authCredentials,\n      locale: resolveLocale(props.locale),\n    });\n    emit('change', next);\n  } catch (err) {\n    local.value = !next; // rollback\n    emit('error', err instanceof Error ? err.message : String(err));\n  }\n}\n</script>\n\n<template>\n  <button\n    type=\"button\"\n    class=\"filex-star-btn\"\n    :class=\"{ 'is-starred': local, 'is-compact': compact, 'is-card': card }\"\n    :aria-pressed=\"local\"\n    :title=\"label\"\n    :aria-label=\"label\"\n    data-testid=\"star-toggle\"\n    @click.stop=\"toggle\"\n  >\n    <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n      <path\n        :fill=\"local ? 'currentColor' : 'none'\"\n        stroke=\"currentColor\"\n        stroke-width=\"2\"\n        stroke-linejoin=\"round\"\n        d=\"M12 2.5l3.09 6.26 6.91 1-5 4.87 1.18 6.87L12 18.27l-6.18 3.23L7 14.63 2 9.76l6.91-1z\"\n      />\n    </svg>\n    <span v-if=\"!compact\" class=\"filex-star-label\">{{ label }}</span>\n  </button>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-star-btn {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  background: transparent;\n  border: 1px solid transparent;\n  border-radius: 6px;\n  padding: 4px 8px;\n  color: var(--filex-text-muted, #9ca3af);\n  cursor: pointer;\n  transition: color 120ms, background 120ms;\n}\n.filex-star-btn:hover {\n  color: var(--filex-accent-amber, #f59e0b);\n  background: var(--filex-bg-soft, rgba(0, 0, 0, 0.04));\n}\n.filex-star-btn.is-starred {\n  color: var(--filex-accent-amber, #f59e0b);\n}\n.filex-star-btn.is-compact {\n  padding: 4px;\n}\n.filex-star-label {\n  font-size: 13px;\n}\n</style>\n","/**\n * whenNearViewport — call `cb` once `el` comes within NEAR of the viewport.\n *\n * A folder view puts every tile on the page at once, and a thumbnail is a\n * request: a folder of 344 files asked for ~240 of them the moment it opened,\n * most for tiles nobody had scrolled to. ThumbTile asks only once this says\n * its tile is close.\n *\n * ONE IntersectionObserver for the page, not one per tile, and each element is\n * heard once and then forgotten. With a null root it watches the viewport, and\n * a tile hidden by the scroll box it sits in (the explorer's pane scrolls on\n * its own) does not count as near. Where IntersectionObserver does not exist\n * (an old engine, a test DOM) every element counts as near at once — which is\n * how every tile behaved before.\n */\n\n/** How far outside the viewport a tile already counts as near: a thumbnail\n *  should be on its way before the tile scrolls in, not after. */\nconst NEAR = '300px';\n\nlet io: IntersectionObserver | null = null;\nconst waiting = new Map<Element, Set<() => void>>();\n\nfunction observer(): IntersectionObserver {\n  if (!io) {\n    io = new IntersectionObserver(\n      (entries) => {\n        for (const e of entries) {\n          if (!e.isIntersecting) continue;\n          const cbs = waiting.get(e.target);\n          if (!cbs) continue;\n          waiting.delete(e.target);\n          io?.unobserve(e.target);\n          cbs.forEach((cb) => cb());\n        }\n      },\n      // `rootMargin` widens the viewport only: a tile in the pane's own scroll\n      // box is still cut off at that box's edge. `scrollMargin` widens the\n      // scroll boxes too (Chromium 120+; an engine that does not know it\n      // ignores it, and the picture is asked for as the tile scrolls in).\n      { rootMargin: NEAR, scrollMargin: NEAR } as IntersectionObserverInit,\n    );\n  }\n  return io;\n}\n\n/** Call `cb` once `el` is near the viewport. Returns a function that cancels\n *  the wait (call it when the element goes away first). */\nexport function whenNearViewport(el: Element | null | undefined, cb: () => void): () => void {\n  if (!el || typeof IntersectionObserver === 'undefined') {\n    cb();\n    return () => {};\n  }\n  let cbs = waiting.get(el);\n  if (!cbs) {\n    cbs = new Set();\n    waiting.set(el, cbs);\n    observer().observe(el);\n  }\n  cbs.add(cb);\n  return () => {\n    const set = waiting.get(el);\n    if (!set) return;\n    set.delete(cb);\n    if (set.size === 0) {\n      waiting.delete(el);\n      io?.unobserve(el);\n    }\n  };\n}\n\n/** Tests only: drop the shared observer so the next wait builds a fresh one. */\nexport function __resetNearViewport(): void {\n  io?.disconnect();\n  io = null;\n  waiting.clear();\n}\n","<script setup lang=\"ts\">\n/**\n * ThumbTile — one file's thumbnail, or whatever the view draws instead.\n *\n * ⚠⚠ Why a component. A thumbnail's object URL arrives later, and whatever\n * read it is woken when it does. Read in a folder view's own template, that was\n * the whole view: every arrival re-rendered every row (see useThumbs). Read\n * here, it is this tile.\n *\n * It also asks late. The resolver starts the fetch, and it is only called once\n * the tile is near the viewport (lib/nearViewport), so opening a folder no\n * longer downloads the thumbnails of tiles nobody has scrolled to.\n *\n * The <img> takes the attributes the view gives the tile (class, alt, aria-*);\n * the default slot is the fallback — the view's type tile — drawn until the\n * picture is there, and for good when there is none.\n *\n * ⚠ No `loading=\"lazy\"`: the picture is already only handed over near the\n * viewport, and it is an object URL in memory, so lazy would defer nothing but\n * the decode — and an <img> that has not loaded yet when useThumbs revokes its\n * URL (its oldest, past the cache's cap) would come up broken.\n *\n * The note (0.50, lib/thumbNote): a file whose thumbnail will not come because\n * of the file itself (damaged, encrypted, too large) wears a small marker with\n * an icon on its type tile, and the sentence why on a resting pointer or a\n * tap. Drawn only WITHOUT a picture, the type badge only WITH one: the two\n * never meet. The sentence is teleported to <body> (a list row's 24px box\n * clips), placed along the inline axis like the folder peek (lib/direction).\n */\nimport { computed, getCurrentInstance, nextTick, onBeforeUnmount, onMounted, ref } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport type { ThumbTypeBadge } from '../lib/filePreview';\nimport type { ThumbNoteWords } from '../lib/thumbNote';\nimport { whenNearViewport } from '../lib/nearViewport';\nimport { clampAlongInline, dirOfElement } from '../lib/direction';\nimport { popupLayer } from '../lib/popupLayer';\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = defineProps<{\n  node: FileNode;\n  /** The view's resolver: the object URL to draw, or null (not yet, or none). */\n  srcOf: (n: FileNode) => string | null;\n  /** Draw the play badge over the picture — a frame lifted out of a video is,\n   *  on a card, indistinguishable from a photograph. */\n  videoBadge?: boolean;\n  /**\n   * Name the kind in a corner of the picture (lib/filePreview `thumbTypeBadge`).\n   * The list view passes it for a thumbnail drawn on paper: 24 pixels of a\n   * white page on a white row reads as a missing icon. Drawn only WITH the\n   * picture: the fallback is the coloured type tile, which already says it.\n   * Decorative (`aria-hidden`): the row's accessible name is the file's.\n   */\n  typeBadge?: ThumbTypeBadge | null;\n  /**\n   * Why the file has no thumbnail, when the reason is the file's own\n   * (lib/thumbNote `thumbNoteWords`): drawn on the fallback only.\n   */\n  note?: ThumbNoteWords | null;\n}>();\n\nconst near = ref(false);\nlet stopWaiting: (() => void) | null = null;\n\nonMounted(() => {\n  /* The tile draws no box of its own (it is the picture, or the fallback), so\n     it watches the box it sits in — the view's thumbnail cell. */\n  const anchor = getCurrentInstance()?.subTree.el as Node | null | undefined;\n  stopWaiting = whenNearViewport(anchor?.parentElement, () => {\n    near.value = true;\n  });\n});\nonBeforeUnmount(() => {\n  stopWaiting?.();\n  closeTip();\n});\n\nconst src = computed(() => (near.value ? props.srcOf(props.node) : null));\n\n/* ── the note's sentence ──────────────────────────────────────────────── */\n\nconst mark = ref<HTMLElement | null>(null);\nconst tip = ref<HTMLElement | null>(null);\nconst tipOpen = ref(false);\nconst tipDir = ref<'ltr' | 'rtl'>('ltr');\n\n/** Under the marker, starting at its inline-start edge; above it when there\n *  is no room below; always inside the window (FolderPeek's rule). */\nfunction placeTip() {\n  const el = tip.value;\n  const m = mark.value;\n  if (!el || !m) return;\n  const r = m.getBoundingClientRect();\n  const vw = window.innerWidth;\n  const vh = window.innerHeight;\n  const w = el.offsetWidth;\n  const h = el.offsetHeight;\n  const d = tipDir.value;\n  const x = clampAlongInline(d === 'rtl' ? r.right : r.left, w, vw, d);\n  let y = r.bottom + 6;\n  if (y + h > vh - 8) y = Math.max(8, r.top - h - 6);\n  el.style.insetInlineStart = `${Math.round(d === 'rtl' ? vw - x - w : x)}px`;\n  el.style.top = `${Math.round(y)}px`;\n  el.style.zIndex = String(popupLayer(m));\n}\n\n/** A tap anywhere else, or a scroll, puts it away. */\nfunction onOutside(e: Event) {\n  if (mark.value && e.target instanceof Node && mark.value.contains(e.target)) return;\n  closeTip();\n}\n\nfunction openTip() {\n  if (tipOpen.value || !mark.value) return;\n  tipDir.value = dirOfElement(mark.value);\n  tipOpen.value = true;\n  document.addEventListener('pointerdown', onOutside, true);\n  window.addEventListener('scroll', closeTip, true);\n  void nextTick(placeTip);\n}\n\nfunction closeTip() {\n  if (!tipOpen.value) return;\n  tipOpen.value = false;\n  document.removeEventListener('pointerdown', onOutside, true);\n  window.removeEventListener('scroll', closeTip, true);\n}\n\n/** A mouse shows it while it rests on the marker; touch and pen tap it. */\nfunction onEnter(e: PointerEvent) {\n  if (e.pointerType === 'mouse') openTip();\n}\nfunction onLeave(e: PointerEvent) {\n  if (e.pointerType === 'mouse') closeTip();\n}\n/* ⚠ What pressed last. A mouse's click lands on a marker whose sentence its\n   own hover has just opened: toggling there put the sentence away on every\n   click (0.50 full round, a real document server, all three engines - \"a\n   tap shows the sentence\" never held with a mouse). A mouse's click keeps it\n   open; touch and pen toggle it. */\nlet pressedBy = '';\nfunction onDown(e: PointerEvent) {\n  pressedBy = e.pointerType;\n}\nfunction onTap() {\n  if (pressedBy === 'mouse') {\n    openTip();\n    return;\n  }\n  if (tipOpen.value) closeTip();\n  else openTip();\n}\n</script>\n\n<template>\n  <img v-if=\"src\" v-bind=\"$attrs\" :src=\"src\" draggable=\"false\" />\n  <slot v-else />\n  <span v-if=\"src && videoBadge\" class=\"fe-thumb__play\" aria-hidden=\"true\"></span>\n  <!-- The colour is the type tile's own (`fe-ftile--<family>` fills it with\n       `--fe-icon-<family>`, both themes); no second colour table. -->\n  <span\n    v-if=\"src && typeBadge\"\n    :class=\"['fe-thumb__type', `fe-ftile--${typeBadge.family}`, { 'fe-thumb__type--long': typeBadge.label.length > 4 }]\"\n    aria-hidden=\"true\"\n  >{{ typeBadge.label }}</span>\n  <!-- The note: on the type tile only, never over a picture. The click is\n       the marker's own (a tap shows the sentence), never the card's: it\n       neither selects nor opens the file. -->\n  <span\n    v-if=\"!src && note\"\n    ref=\"mark\"\n    :class=\"['fe-thumb__note', `fe-thumb__note--${note.note}`]\"\n    role=\"img\"\n    :aria-label=\"note.full\"\n    :data-note=\"note.note\"\n    data-testid=\"thumb-note\"\n    @pointerenter=\"onEnter\"\n    @pointerleave=\"onLeave\"\n    @pointerdown=\"onDown\"\n    @click.stop=\"onTap\"\n    @dblclick.stop\n  >\n    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n      <path v-for=\"(d, i) in note.paths\" :key=\"i\" :d=\"d\" />\n    </svg>\n  </span>\n  <Teleport to=\"body\">\n    <span\n      v-if=\"tipOpen && note\"\n      ref=\"tip\"\n      class=\"fe-thumb__note-tip\"\n      :dir=\"tipDir\"\n      role=\"tooltip\"\n      data-testid=\"thumb-note-tip\"\n    >{{ note.full }}</span>\n  </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * FolderMosaic — a folder drawn with the files that came into it last (the\n * listing's `preview`, newest first; docs/thumbnails.md → Folder previews).\n * One component, one shape per view, so the three can never disagree about\n * which files a folder shows:\n *\n *   - `peek` (the grid): the folder large, its back with the tab, up to three\n *     of its files rising out of it as prints turned a little, and its front\n *     over their lower half. With none, the same folder, empty, so a row of\n *     cards keeps one height and one look.\n *   - `fan` (the gallery): the same folder drawn large behind, and up to three\n *     prints fanned out in front of it from their foot, the newest in front.\n *   - `mini` (the list): the row's small folder with the newest file rising\n *     out of its mouth.\n *\n * With no files to show, each shape is its folder empty: a view where any\n * folder has files draws every folder so, and keeps one look.\n *\n * A file with a thumbnail is its picture, through ThumbTile (the same\n * authenticated loader and cache as the file cards, and only once near the\n * viewport); one without is its type icon on the print. An end-to-end\n * encrypted folder keeps its padlock glyph. An administrator can turn folder\n * previews off (Settings); the listing then sends no `preview` and the views\n * keep their classic folder icons.\n *\n * ⚠ No `<style>` here: the rules are in styles/base.css (`.fe-fmosaic`), so\n * the core and web-component stylesheets stay the same bytes.\n */\nimport { computed } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport ThumbTile from './ThumbTile.vue';\nimport { encryptedFolderTile, fileIconTile, isEncryptedFolder } from '../lib/fileIcons';\n\nconst props = withDefaults(\n  defineProps<{\n    node: FileNode;\n    /** The view's thumbnail resolver (useThumbs.src). */\n    srcOf: (n: FileNode) => string | null;\n    shape?: 'peek' | 'fan' | 'mini';\n  }>(),\n  { shape: 'peek' },\n);\n\n/** How many files a shape shows: the list's row has room for one. */\nconst room = computed(() => (props.shape === 'mini' ? 1 : 3));\n\n/** The files as nodes the resolver and the icon table understand: a path\n *  under the folder (the cache key), the stamped URL when the listing gave\n *  one, and the extension the type icon is picked by. */\nconst items = computed<FileNode[]>(() =>\n  (props.node.preview ?? []).slice(0, room.value).map((p) => {\n    const dot = p.name.lastIndexOf('.');\n    return {\n      path: `${props.node.path.replace(/\\/+$/, '')}/${p.name}`,\n      basename: p.name,\n      type: 'file' as const,\n      extension: dot > 0 ? p.name.slice(dot + 1).toLowerCase() : undefined,\n      thumb_url: p.thumb_url,\n    };\n  }),\n);\n\n/** Back to front: the newest is drawn last, on top and in the middle (1:\n *  left, 2: middle or right, 3: right; styles/base.css). */\nconst prints = computed(() => {\n  const [a, b, c] = items.value;\n  if (c) return [{ it: c, at: 1 }, { it: b, at: 3 }, { it: a, at: 2 }];\n  if (b) return [{ it: b, at: 1 }, { it: a, at: 2 }];\n  return a ? [{ it: a, at: 1 }] : [];\n});\n</script>\n\n<template>\n  <div\n    class=\"fe-fmosaic\"\n    :class=\"[`fe-fmosaic--${shape}`, `fe-fmosaic--${items.length}`]\"\n    aria-hidden=\"true\"\n    data-fe-mosaic\n  >\n    <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n    <span v-if=\"isEncryptedFolder(node)\" class=\"fe-fmosaic__glyph fe-grid__icon fe-grid__icon--svg\" v-html=\"encryptedFolderTile()\"></span>\n    <div v-else class=\"fe-fmosaic__stage\">\n      <!-- The back, with its tab on the inline-start side. -->\n      <svg class=\"fe-fmosaic__back\" viewBox=\"0 0 120 88\" preserveAspectRatio=\"none\" focusable=\"false\">\n        <path d=\"M0 10a6 6 0 0 1 6-6h27.5a6 6 0 0 1 4.4 1.9L43.6 12H114a6 6 0 0 1 6 6v64a6 6 0 0 1-6 6H6a6 6 0 0 1-6-6z\" />\n      </svg>\n      <div\n        v-for=\"p in prints\"\n        :key=\"p.it.path\"\n        class=\"fe-fmosaic__print\"\n        :class=\"[`fe-fmosaic__print--${p.at}`, { 'is-icon': !p.it.thumb_url }]\"\n      >\n        <ThumbTile :node=\"p.it\" :src-of=\"srcOf\" alt=\"\" class=\"fe-fmosaic__img\">\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span class=\"fe-fmosaic__icon fe-grid__icon--svg\" v-html=\"fileIconTile(p.it)\"></span>\n        </ThumbTile>\n      </div>\n      <!-- The front, a little narrower at the bottom, as if seen from above. -->\n      <svg class=\"fe-fmosaic__front\" viewBox=\"0 0 120 56\" preserveAspectRatio=\"none\" focusable=\"false\">\n        <path d=\"M5 0h110a5 5 0 0 1 5 5.4l-3.3 44.6a6 6 0 0 1-6 5.6H9.3a6 6 0 0 1-6-5.6L0 5.4A5 5 0 0 1 5 0z\" />\n      </svg>\n    </div>\n  </div>\n</template>\n","/* bul:s3 */\n/**\n * Snippet segment parser — the search backend returns content snippets as\n * PLAIN TEXT with matched words wrapped in «guillemets» (contract: no HTML\n * ever crosses the wire). The UI renders highlights by splitting the string\n * into segments and emitting each one as a TEXT node (a <mark> wrapper for\n * matches) — never via innerHTML, so a file whose content contains markup\n * can't inject anything into the page.\n */\n\nexport interface SnippetSegment {\n  /** Literal text of this segment. Always rendered as a text node. */\n  text: string;\n  /** True when the segment was «wrapped» — render inside <mark>. */\n  match: boolean;\n}\n\n/**\n * Split a `«»`-annotated snippet into render segments. An unpaired `«`\n * degrades gracefully: the rest of the string is treated as plain text.\n */\nexport function snippetSegments(snippet: string): SnippetSegment[] {\n  const out: SnippetSegment[] = [];\n  if (!snippet) return out;\n  const re = /«([^«»]*)»/g;\n  let last = 0;\n  let m: RegExpExecArray | null;\n  while ((m = re.exec(snippet)) !== null) {\n    if (m.index > last) out.push({ text: snippet.slice(last, m.index), match: false });\n    if (m[1]) out.push({ text: m[1], match: true });\n    last = m.index + m[0].length;\n  }\n  if (last < snippet.length) out.push({ text: snippet.slice(last), match: false });\n  return out;\n}\n\n/** Matched-in values the search contract allows on a hit. */\nexport type SearchMatched = 'name' | 'content' | 'both';\n\n/** True when the hit matched (at least partly) inside file CONTENT. */\nexport function matchedInContent(matched: unknown): boolean {\n  return matched === 'content' || matched === 'both';\n}\n","/**\n * dragGhost — wiring:c4 custom HTML5 drag image.\n *\n * The browser default drag image (a translucent snapshot of the row/card)\n * reads poorly for multi-selection drags. This builds a small pill with the\n * dragged item's name and, for multi-drags, a count badge, parks it\n * off-screen (setDragImage requires a rendered element), and removes it on\n * the next tick. Purely visual — the dataTransfer payload is untouched.\n *\n * Styled by `.fe-dragghost` in base.css via the `--fe-*` tokens published\n * at :root (and re-published at `.dark`/html level for dark hosts), so it\n * matches the active theme even though it's appended to <body>.\n */\nexport function applyDragGhost(ev: DragEvent, name: string, count: number): void {\n  const dt = ev.dataTransfer;\n  if (!dt || typeof document === 'undefined' || typeof dt.setDragImage !== 'function') return;\n  try {\n    const el = document.createElement('div');\n    el.className = 'fe-dragghost';\n    const label = document.createElement('span');\n    label.className = 'fe-dragghost__name';\n    // ⚠ RTL: a file name is the person's text, not the interface's — `auto`\n    // lets `Report (final).pdf` read right inside an Arabic page and an Arabic\n    // name read right inside an English one.\n    label.dir = 'auto';\n    label.textContent = name;\n    el.appendChild(label);\n    if (count > 1) {\n      const badge = document.createElement('span');\n      badge.className = 'fe-dragghost__badge';\n      badge.textContent = String(count);\n      el.appendChild(badge);\n    }\n    el.style.position = 'fixed';\n    el.style.top = '-1000px';\n    // Physical on purpose: FIXED boxes add no scrollable overflow, so off the\n    // left edge is off screen in either direction (the RTL guard allow-lists it).\n    el.style.left = '-1000px';\n    document.body.appendChild(el);\n    dt.setDragImage(el, 14, 14);\n    // The engine snapshots the element synchronously during dragstart —\n    // safe to drop it right after.\n    setTimeout(() => el.remove(), 0);\n  } catch {\n    /* non-critical visual nicety — native ghost remains */\n  }\n}\n","<script setup lang=\"ts\">\n/**\n * GridView — card grid.\n *\n * gorunum:v1 — the card has an anatomy now, and it is not the same anatomy\n * for a folder and for a file:\n *\n *   folder  186×56   glyph · name over \"Folder\" · ⋮\n *   file    186×166  184×108 preview · 56px footer (24px type tile · name\n *                    over \"1.7 MB • Sep 9, 2026\" · ⋮)\n *\n * A folder has no preview to show and no size or date worth printing, so a\n * square thumbnail box above its name was 108px of nothing on the most common\n * row in any listing. The two shapes share one footer row — the folder card\n * IS that row — so there is a single piece of markup to change when the row\n * changes.\n */\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'; /* wiring:c4 */\nimport type { FileNode } from '../types/FileNode';\nimport { hasInternalDrag } from '../lib/dragOut';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { lockOf, lockWords } from '../lib/appLock';\nimport { linkWordsFor } from '../lib/symlink'; /* issue #34 — a link that will not open */\nimport { unavailableWordsFor } from '../lib/unavailable'; /* issue #104 - an entry the storage could not answer for */\nimport { thumbNoteWords } from '../lib/thumbNote'; /* 0.50 - why a file has no thumbnail */\nimport { checkMod, clickMod, useRowTouch, type ClickMod } from '../composables/useRowTouch';\nimport ItemCheck from './ItemCheck.vue';\nimport { encryptedFolderTile, fileIconTile, isEncryptedFolder } from '../lib/fileIcons';\nimport {\n  createFilePreviews,\n  drawsAsPage,\n  drawsAsVideo,\n  type FilePreview,\n} from '../lib/filePreview'; /* gorunum:v1-preview */\nimport { byFoldersFirst, displayParentDirOf } from '../lib/listing'; /* gorunum:v1 */\nimport {\n  groupByDate,\n  groupingActive,\n} from '../lib/dateGroups'; /* gruplama */\nimport { useSortStore, type ListingOrder } from '../lib/sortOrder'; /* gruplama */\nimport StarButton from './StarButton.vue';\nimport ThumbTile from './ThumbTile.vue';\nimport FolderMosaic from './FolderMosaic.vue';\nimport { snippetSegments } from '../lib/snippet'; /* bul:s3 */\nimport { applyDragGhost } from '../lib/dragGhost'; /* wiring:c4 */\nimport { contentDir } from '../lib/direction';\n\nconst props = withDefaults(defineProps<{\n  files: FileNode[];\n  selected: Set<string>;\n  clipped?: Set<string>;\n  showParentPath?: boolean;\n  locale: LocaleCode;\n  loading?: boolean;\n  /** Authenticated thumb resolver (useThumbs.src). Raw `thumb_url` is\n   *  root-relative and unauthenticated — a bare <img src> only works for the\n   *  native same-origin SPA, so embedded hosts NEED this. null = icon. */\n  thumbSrc?: (n: FileNode) => string | null;\n  /** Desktop selective sync: availability badge per tile. Absent on the\n   *  web — no badge renders at all. */\n  keepBadgeFor?: (n: FileNode) => 'kept' | 'syncing' | 'cloud' | 'partial' | null;\n  /**\n   * Starring on a card. Same contract as ListView: the id set the explorer\n   * keeps, plus the API wiring StarButton needs. Absent apiBase → no star is\n   * rendered at all, exactly as in the list.\n   *\n   * ⚠ Not list-only. The Starred VIEW shipped before starring was reachable\n   * from anywhere but the list, so a user in grid view — the mode the panel's\n   * own screenshots show — had a view they could not fill.\n   */\n  starredIds?: Set<number>;\n  /**\n   * Offer the star affordance at all. Follows the Starred view: when the panel\n   * leaves that view out — a shared app token has no single person behind it,\n   * so \"your starred files\" is one list shown to strangers — offering to star\n   * something is offering to write into that same shared list. Owner's call,\n   * 2026-09-05, verbatim (translated from Turkish): \"if the starred place is\n   * not visible, then star/unstar should not be visible either\".\n   */\n  starEnabled?: boolean;\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  /**\n   * surucu:d1 — draw \"Folders\" and \"Files\" as labelled sections.\n   *\n   * ⚠ It used to arrive with `uiProfile: 'drive'`; the explorer now passes it\n   * unconditionally, because the sections are part of the shell rather than of\n   * a profile. The prop stays for an embedder mounting this view directly:\n   * absent/false renders the grid without them, down to the DOM — the two\n   * headings are the only extra nodes, and without this prop none are emitted.\n   *\n   * ⚠ The prop gates the HEADINGS, not the order. Folders come before files\n   * in every profile (see `ordered`) — a heading only names a group that is\n   * there either way.\n   */\n  sections?: boolean;\n  /**\n   * gruplama — where these rows got their order, exactly as `ListView` takes\n   * it (`lib/sortOrder.ListingOrder`).\n   *\n   * ⚠ It changes nothing about the ORDER here — the pane hands this view rows\n   * that are already sorted, and `compareInOrder('relevance')` is\n   * byte-for-byte the folders-first pass below. It is read for one thing: a\n   * date heading over a RANKED answer would be a claim about an order the\n   * rows are not in. Omitted = an ordinary folder listing.\n   */\n  order?: ListingOrder;\n  /**\n   * gorunum:v1-preview — we are inside an E2E-encrypted folder.\n   *\n   * Every body on the wire in there is ciphertext, so reading a file's first\n   * kilobytes to draw its first lines would spend a request to learn that the\n   * bytes do not decode. The text preview stays off; the cards keep their\n   * type tiles. Absent/false = the ordinary case.\n   */\n  e2eActive?: boolean;\n  /**\n   * issue #26 — draw the checkbox on each card, the one click that selects.\n   * Default on. Home passes false: its cards open on a click and there is no\n   * selection there to put anything into.\n   */\n  selectable?: boolean;\n}>(), {\n  // ⚠ Not left to `undefined`: Vue casts an absent boolean prop to false, and\n  // the listing would lose its checkboxes wherever the host said nothing.\n  selectable: true,\n});\n\nconst emit = defineEmits<{\n  (e: 'click-card', node: FileNode, mod: ClickMod): void;\n  (e: 'dbl-card', node: FileNode): void;\n  (e: 'context-card', node: FileNode, ev: MouseEvent): void;\n  (e: 'item-drag-start', node: FileNode, ev: DragEvent): void;\n  (e: 'item-drop-into', target: FileNode, ev: DragEvent): void;\n  (e: 'star-change', node: FileNode, value: boolean): void;\n  /** gorunum:v1 — the order this view renders, so the parent's shift-range\n   *  arithmetic runs over what the user sees rather than over the backend's\n   *  answer. See the same emit in ListView. */\n  (e: 'display-order', nodes: FileNode[]): void;\n  /** The pointer came to rest on a folder card, or left it (useFolderPeek:\n   *  the pane shows what is inside). */\n  (e: 'peek', node: FileNode, el: Element, pointerType: string): void;\n  (e: 'peek-end'): void;\n}>();\n\n/**\n * Folder previews (0.50, docs/thumbnails.md): a folder whose listing row\n * carries `preview` shows its pictures as a mosaic (FolderMosaic) in the same\n * 184x108 box a file card has. ⚠ All folder cards get the box as soon as one\n * of them has pictures, so a row of folders stays one height; a view with no\n * pictured folder keeps the compact 56px folder cards it always had.\n */\nconst folderPreviews = computed(() => props.files.some((n) => n.type === 'dir' && (n.preview?.length ?? 0) > 0));\n\nfunction onCardEnter(n: FileNode, ev: PointerEvent) {\n  if (n.type === 'dir') emit('peek', n, ev.currentTarget as Element, ev.pointerType);\n}\n\n/**\n * gorunum:v1 — folders first, always, and by the SHARED comparator\n * (`lib/listing.byFoldersFirst`) the list view uses as its own primary key.\n * Two sorts, one rule: a second private copy of \"dirs are 0, files are 1\" is\n * how the grid and the list end up disagreeing (filex lesson #67).\n *\n * `Array.prototype.sort` is stable, and this comparator returns 0 for any two\n * nodes of the same kind, so whatever order the parent sends survives\n * untouched INSIDE each group. The day a sort control reaches the grid,\n * descending will mean folders descending and then files descending, without\n * this line being touched.\n *\n * Display order only. Selection is keyed by path and the explorer's shift-range\n * still walks its own list, so nothing here moves an index the parent holds.\n */\nconst { t, formatSize, nodeDisplayName, formatDate, formatMonthYear, zonedYearMonth, toDate } =\n  useLocale(() => props.locale);\n\n/* App plugins — an app's hold on a row (docs/APP-PLUGINS-API.md → \"File\n   locks\"). The listing already caps `perm` at viewer, so the write verbs are\n   gone without this; the badge is what stops that reading as a bug. ⚠ One\n   source of words for every view and the details panel (lib/appLock). */\nfunction lockTitleOf(n: FileNode): string {\n  return lockWords(lockOf(n), { t, formatDate, locale: props.locale });\n}\n\n/* issue #34 — a symlink the server will not follow. Same shape as the lock\n   badge above and for the same reason: the words live in ONE module\n   (lib/symlink), so the row, the details panel and the toast that explains a\n   refused open cannot drift apart. `null` for every ordinary row — a link\n   whose target is inside the root was already followed and arrives as that\n   target, so it is not one of these. */\nfunction linkOf(n: FileNode) {\n  return linkWordsFor(n, { t });\n}\n\n/* issue #104 - an entry the storage could not answer for: \"!\" with the\n   sentence and the storage's own answer, from the one module (lib/unavailable)\n   the details panel and the refused-open toast read too. */\nfunction unavailableOf(n: FileNode) {\n  return unavailableWordsFor(n, { t });\n}\n/** Why the file has no thumbnail, when the reason is its own (lib/thumbNote,\n *  the same rule in the list, the grid and the gallery). */\nfunction thumbNoteOf(n: FileNode) {\n  return thumbNoteWords(n, { t });\n}\n\n\nconst ordered = computed<FileNode[]>(() => [...props.files].sort(byFoldersFirst));\nwatch(\n  ordered,\n  (list) => emit('display-order', list),\n  { immediate: true },\n);\n\nconst firstDirPath = computed(() => ordered.value.find((f) => f.type === 'dir')?.path ?? null);\nconst firstFilePath = computed(() => ordered.value.find((f) => f.type !== 'dir')?.path ?? null);\n\n/* gruplama — the same sort this pane's list view reads, by injection, so the\n * two cannot disagree about whether a date heading is honest right now. */\nconst sort = useSortStore();\n\n/**\n * gruplama — THE DATE HEADINGS, from `lib/dateGroups`, which is also where the\n * list gets them. Not a grid variant of the ladder: a rung added there has to\n * appear here on the same day or the two views name the same day differently.\n */\nconst grouped = computed(() =>\n  groupByDate(ordered.value, {\n    active: groupingActive(sort.key.value, props.order),\n    dateOf: (n) => toDate(n.last_modified),\n    /* Folders keep their own run at the top — the same rule the list follows,\n     * and the reason \"folders before files\" survives a date sort. Here the run\n     * is the one that already had a name. */\n    aside: (n) =>\n      n.type === 'dir'\n        ? { id: 'dirs', label: props.sections ? t('drive.section.folders') : null }\n        : null,\n    labels: { t, formatMonthYear, zonedYearMonth },\n  }),\n);\n\n/**\n * ⚠⚠ TWO HEADING SYSTEMS DO NOT STACK. While the rows are in date order the\n * \"Files\" label is replaced by the date headings rather than sitting above\n * them: the date headings ARE the files' headings, and \"Files\" followed\n * immediately by \"Today\" names one group twice and tells the reader nothing\n * the second time. \"Folders\" stays, because the folders are still one run and\n * no date can name it.\n *\n * Off that order (any other sort key, or a ranked search answer) the grid\n * keeps exactly the Folders / Files sections it has always drawn.\n */\nfunction headingBefore(n: FileNode): string | null {\n  if (grouped.value.active) return grouped.value.headingBefore(n);\n  if (!props.sections) return null;\n  if (n.path === firstDirPath.value) return t('drive.section.folders');\n  if (n.path === firstFilePath.value) return t('drive.section.files');\n  return null;\n}\n\n\n// Prefer the authenticated resolver when the host wired one; otherwise fall\n// back to the raw URL (legacy same-origin behavior). ⚠ Called by ThumbTile,\n// not by this template — see the note on the tile in the markup.\nfunction thumbOf(n: FileNode): string | null {\n  return props.thumbSrc ? props.thumbSrc(n) : (n.thumb_url ?? null);\n}\n\n/* ==================================================================\n * gorunum:v1-preview — the card shows the file's own first lines.\n *\n * ⚠ The brief for this slice said these files \"have no thumbnail\". Measured\n * on the local backend, they do: `internal/thumb/generic.go` renders a card\n * tinted from a hash of the extension with the letters \"TS\"/\"CSV\"/\"ZIP\" drawn\n * in it, and the listing hands out a `thumb_url` for it (app.ts → a 1,745-byte\n * JPEG). So the choice is not \"preview or nothing\", it is \"the file's first\n * lines, or a coloured rectangle repeating the extension the footer tile and\n * the Type column both already say\".\n *\n * Hence the order below: for a node we can read as TEXT the `<img>` is not\n * rendered at all — which also means `thumbOf()` is never called for it and\n * `useThumbs` never fetches that generic JPEG, so this costs the same one\n * request it replaces. Every other node is untouched: images, video, audio\n * and PDFs keep their real, content-derived thumbnails.\n *\n * While the read is in flight (and if it fails, or the bytes turn out not to\n * be text) the card shows the type tile on `--fe-bg-elev` — the spec's stated\n * fallback, and no flash of a placeholder we are about to replace.\n * ================================================================== */\nconst previews = createFilePreviews({\n  // Read once: the explorer's `config.apiBase` is fixed for the life of a\n  // mounted panel, and `enabled` has to be answerable at construction.\n  apiBase: props.apiBase,\n  // Wrapped rather than passed, so a parent that re-creates its arrow on each\n  // render is still called through the CURRENT prop. ⚠ The builder is async;\n  // `createFilePreviews` awaits it (see the note there — a Promise spread into\n  // a headers object sends no Authorization and 401s in silence).\n  authHeaders: props.authHeaders ? () => props.authHeaders!() : undefined,\n  credentials: props.authCredentials,\n  disabled: () => props.e2eActive === true,\n});\nonBeforeUnmount(() => previews.dispose());\n\n/** Non-null only for a node whose bytes we can read as text. */\nfunction previewKind(n: FileNode) {\n  return previews.kindFor(n);\n}\n\n/** At most one element, so the template gets a typed local without a\n *  non-null assertion repeated at every nested loop. */\nfunction previewFor(n: FileNode): FilePreview[] {\n  const p = previews.get(n);\n  return p ? [p] : [];\n}\n\n/** Template-ref sink: the preview box itself is what the IntersectionObserver\n *  watches, so nothing is fetched for a card that never comes into view.\n *  ⚠ `unknown` because a Vue template `:ref` hands back an Element, a\n *  component instance or null depending on what it is put on. */\nfunction bindPreview(el: unknown, n: FileNode) {\n  previews.bind(el instanceof Element ? el : null, n);\n}\n\n/** A card carries a star when the host wired the API and the node is a file\n *  with a server id — the same rule the list row uses. */\nfunction canStar(n: FileNode): boolean {\n  if (props.starEnabled === false) return false;\n  return props.apiBase !== undefined && typeof n.id === 'number' && n.type === 'file';\n}\n\nfunction isSelected(n: FileNode): boolean {\n  return props.selected.has(n.path);\n}\n\n/**\n * issue #26 — the card's checkbox is the one click that selects (a click\n * anywhere else on the card opens it), routed exactly like the list row's:\n * one `click-card` emit marked `check`, one `useSelection.click`.\n */\nfunction onCheckClick(n: FileNode, ev: MouseEvent) {\n  emit('click-card', n, checkMod(ev));\n}\n\nfunction onClick(n: FileNode, ev: MouseEvent) {\n  emit('click-card', n, clickMod(ev, touch.isTap(ev)));\n}\n\nfunction onDbl(n: FileNode) {\n  emit('dbl-card', n);\n}\n\nfunction onCtx(n: FileNode, ev: MouseEvent) {\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('context-card', n, ev);\n}\n\n/**\n * gorunum:v1 — the ⋮ button. It calls the RIGHT-CLICK handler with the same\n * node and the same event, so the menu it opens is the context menu, built by\n * the explorer's one `selectionActionList`. There is deliberately no action\n * list here: a second one drifts from the first the week after it is written\n * (filex lesson #67).\n */\nfunction onMenuButton(n: FileNode, ev: MouseEvent) {\n  onCtx(n, ev);\n}\n\nfunction onItemDragStart(n: FileNode, ev: DragEvent) {\n  /* wiring:c4 — custom ghost (name + multi-select count badge), visual only. */\n  applyDragGhost(\n    ev,\n    nodeDisplayName(n),\n    props.selected.has(n.path) ? props.selected.size : 1,\n  );\n  emit('item-drag-start', n, ev);\n}\n\n/* wiring:c4 — droptarget highlight, mirrors ListView (visual layer only). */\nconst dropTargetPath = ref<string | null>(null);\n\nfunction onItemDragOver(n: FileNode, ev: DragEvent) {\n  if (n.type !== 'dir') return;\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n  dropTargetPath.value = n.path; /* wiring:c4 */\n}\n\n/* wiring:c4 */\nfunction onItemDragLeave(n: FileNode) {\n  if (dropTargetPath.value === n.path) dropTargetPath.value = null;\n}\n\nfunction onItemDrop(n: FileNode, ev: DragEvent) {\n  dropTargetPath.value = null; /* wiring:c4 */\n  if (n.type !== 'dir') return;\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('item-drop-into', n, ev);\n}\n\n/* Long press → the card's menu; a tap is reported as a tap (issue #26). */\nconst touch = useRowTouch<FileNode>(\n  (n, at) =>\n    emit('context-card', n, { ...at, preventDefault: () => {}, stopPropagation: () => {} } as unknown as MouseEvent),\n  {\n    // A finger lifted on the item, off its controls, opens at touchend — see useRowTouch.\n    onTap: (n) => emit('click-card', n, { ctrl: false, shift: false, touch: true }),\n  },\n);\n\n/**\n * The card's second line. A file prints \"1.7 MB • Sep 9, 2026\"; a folder\n * prints what it is, because its size is 0 and its date is the date something\n * inside it changed.\n *\n * Same epoch normalization the list and the gallery use (the backend has sent\n * both seconds and milliseconds), and the same locale the rest of the card is\n * drawn in — `toLocaleDateString` with the explorer's own tag, not the\n * browser's, so a Turkish panel says \"9 Eyl 2026\" whatever the OS is set to.\n */\nfunction displayDate(ms: number | undefined): string {\n  return formatDate(ms);\n}\n\nfunction captionFor(n: FileNode): string {\n  if (n.type === 'dir') return t('node.folder');\n  const when = displayDate(n.last_modified);\n  const size = formatSize(n.size);\n  return when ? `${size} • ${when}` : size;\n}\n\nfunction keepGlyph(b: 'kept' | 'syncing' | 'cloud' | 'partial'): string {\n  if (b === 'kept') return '\\u2713';\n  if (b === 'syncing') return '\\u27f3';\n  if (b === 'partial') return '\\u25d0';\n  return '\\u2601';\n}\n\n/* bul:s3 — search-result enrichment, same presence-gating as ListView:\n * only search hits carry `snippet`, so normal listings render nothing. */\nfunction cardSnippet(n: FileNode): string {\n  const s = (n as Record<string, unknown>).snippet;\n  return typeof s === 'string' ? s : '';\n}\n\n// Plain-text form for the title attribute — same parser as the render\n// path, guillemets dropped (no separate sanitize route).\nfunction snippetTitle(snippet: string): string {\n  return snippetSegments(snippet)\n    .map((seg) => seg.text)\n    .join('');\n}\n</script>\n\n<template>\n  <!-- `display: contents`: the grid lays out in its pane exactly as it did\n       before there was a wrapper; the wrapper exists so the bar below can be\n       the grid's SIBLING. -->\n  <div class=\"fe-gridbox\">\n  <!-- The cards on screen are the old ones while the listing is read again\n       (see DataTable's fe-list__refreshing). ⚠ Beside the listbox, not in it\n       — a listbox owns options — and sticky to the top of the pane that\n       scrolls the cards, so it stays in view however far they are scrolled\n       (inside the grid it was absolutely placed at the grid's top and\n       scrolled away with the first row). -->\n  <div v-if=\"loading && ordered.length > 0\" class=\"fe-grid__refreshing\" role=\"status\">\n    <span class=\"fe-sr-only\">{{ t('loading') }}</span>\n  </div>\n  <!-- wiring:c4 — listbox semantics (multi-selectable cards as options);\n       localized label + busy state. Structure/layout untouched. -->\n  <div\n    class=\"fe-grid\"\n    :class=\"{ 'is-loading': loading, 'has-selection': selectable && selected.size > 0, 'has-folder-previews': folderPreviews }\"\n    role=\"listbox\"\n    aria-multiselectable=\"true\"\n    :aria-label=\"t('grid.aria')\"\n    :aria-busy=\"loading ? 'true' : undefined\"\n  >\n    <template v-for=\"n in ordered\" :key=\"n.path\">\n    <!-- surucu:d1 — the section label: a grid item spanning every column. The\n         cards keep `role=\"option\"`; the heading is aria-hidden, and the group\n         it names is already in each card's own label. -->\n    <p v-if=\"headingBefore(n)\" class=\"fe-grid__heading\" aria-hidden=\"true\">{{ headingBefore(n) }}</p>\n    <div\n      class=\"fe-grid__card\"\n      :class=\"{\n        'fe-grid__card--folder': n.type === 'dir' /* gorunum:v1 */,\n        'fe-grid__card--file': n.type !== 'dir' /* gorunum:v1 */,\n        'is-selected': isSelected(n),\n        'is-dir': n.type === 'dir',\n        'is-trash': n.trashed,\n        'is-clipped': clipped?.has(n.path),\n        'is-droptarget': dropTargetPath === n.path /* wiring:c4 */,\n      }\"\n      tabindex=\"0\"\n      role=\"option\"\n      :aria-selected=\"isSelected(n) ? 'true' : 'false'\"\n      :aria-label=\"nodeDisplayName(n) /* wiring:c4 */\"\n      :data-fe-path=\"n.path /* wiring:d1 — middle-click open-in-new-tab delegation */\"\n      draggable=\"true\"\n      @click=\"onClick(n, $event)\"\n      @dblclick=\"onDbl(n)\"\n      @contextmenu=\"onCtx(n, $event)\"\n      @dragstart=\"onItemDragStart(n, $event)\"\n      @dragover=\"onItemDragOver(n, $event)\"\n      @dragleave=\"onItemDragLeave(n) /* wiring:c4 */\"\n      @drop=\"onItemDrop(n, $event)\"\n      @touchstart.passive=\"touch.onTouchStart(n, $event)\"\n      @touchend=\"touch.onTouchEnd\"\n      @touchmove.passive=\"touch.onTouchMove\"\n      @pointerenter=\"onCardEnter(n, $event)\"\n      @pointerleave=\"n.type === 'dir' && emit('peek-end')\"\n      @pointerdown=\"emit('peek-end')\"\n    >\n      <!-- gorunum:v1 — the preview, files only: 184×108. A thumbnail when\n           there is one, otherwise the type tile centred on --fe-bg-elev.\n           gorunum:v1-preview — and, for a file we can read as text, its own\n           first lines instead (see the block comment in the script). -->\n      <div v-if=\"n.type !== 'dir'\" class=\"fe-grid__thumb\" :ref=\"(el) => bindPreview(el, n)\">\n        <!-- gorunum:v1-preview — text-readable kinds never reach the <img>\n             branch, so no generic placeholder thumbnail is fetched for them. -->\n        <template v-if=\"previewKind(n)\">\n          <!-- ⚠ Interpolated, never v-html: this is somebody's file content. -->\n          <div\n            v-for=\"p in previewFor(n)\"\n            :key=\"'fprev'\"\n            class=\"fe-fprev\"\n            :dir=\"contentDir(p.kind)\"\n            :class=\"'fe-fprev--' + p.kind\"\n            :style=\"p.kind === 'table' ? { '--fprev-cols': String(p.cols) } : undefined\"\n            aria-hidden=\"true\"\n          >\n            <!-- One grid, cells emitted flat: <template> makes no DOM, so a\n                 short row's padding cells keep every column aligned. -->\n            <template v-if=\"p.kind === 'table'\">\n              <template v-for=\"(row, ri) in p.rows\" :key=\"ri\">\n                <span\n                  v-for=\"(cell, ci) in row\"\n                  :key=\"ci\"\n                  class=\"fe-fprev__cell\"\n                  :class=\"{ 'is-head': ri === 0 }\"\n                >{{ cell }}</span>\n              </template>\n            </template>\n            <template v-else>\n              <div v-for=\"(ln, li) in p.lines\" :key=\"li\" class=\"fe-fprev__line\"><span\n                v-if=\"ln.tint\"\n                class=\"fe-fprev__tint\"\n              >{{ ln.indent }}{{ ln.tint }}</span>{{ ln.text }}</div>\n            </template>\n          </div>\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span\n            v-if=\"previewFor(n).length === 0\"\n            class=\"fe-grid__icon fe-grid__icon--svg\"\n            v-html=\"fileIconTile(n)\"\n          ></span>\n        </template>\n        <!-- ⚠⚠ The thumbnail is read inside ThumbTile, never here: read in\n             this template, each thumbnail that arrived re-rendered every card\n             of the folder (see ThumbTile). The tile draws the <img> once there\n             is a picture — draggable=\"false\", because an image drag puts a\n             'Files' MIME on the dataTransfer and the parent's upload handler\n             re-uploads the file being moved — and its slot until then.\n             gorunum:v1-preview — the play badge goes over a real video frame\n             only: a video that fell back to its type tile already says what\n             it is. -->\n        <ThumbTile\n          v-else\n          :node=\"n\"\n          :src-of=\"thumbOf\"\n          :video-badge=\"drawsAsVideo(n)\"\n          :note=\"thumbNoteOf(n)\"\n          :alt=\"n.basename\"\n          :class=\"{ 'fe-thumb--page': drawsAsPage(n) /* gorunum:v1-preview — crop a page from its TOP */ }\"\n        >\n          <!-- ikon:emoji — an encrypted folder is still a FOLDER, so it keeps the\n               folder's own shape and colour with the padlock cut out of it; the\n               🔒 it replaces said \"locked\" and nothing else. One definition,\n               in lib/fileIcons, for all three views. -->\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span\n            v-if=\"isEncryptedFolder(n)\"\n            class=\"fe-grid__icon fe-grid__icon--svg\"\n            role=\"img\"\n            :aria-label=\"t('e2e.badge')\"\n            v-html=\"encryptedFolderTile()\"\n          ></span>\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span v-else class=\"fe-grid__icon fe-grid__icon--svg\" v-html=\"fileIconTile(n)\"></span>\n        </ThumbTile>\n        <!-- Star, ON the tile. A hover-only affordance would be invisible to\n             the person looking for what they starred, so the chip is always\n             painted once the file IS starred and only appears on hover/focus\n             otherwise (see .fe-grid__star in styles/base.css). @click.stop so\n             starring never doubles as opening the card. -->\n        <div v-if=\"canStar(n)\" class=\"fe-grid__star\" @click.stop @dblclick.stop>\n          <StarButton\n            :starred=\"!!starredIds?.has(n.id!)\"\n            :node-id=\"n.id!\"\n            :api-base=\"apiBase\"\n            :auth-headers=\"authHeaders\"\n            :auth-credentials=\"authCredentials\"\n            :locale=\"locale\"\n            compact\n            card\n            @change=\"(val: boolean) => emit('star-change', n, val)\"\n          />\n        </div>\n      </div>\n\n      <!-- Folder previews (0.50): the folder's pictures, or its glyph large,\n           in the file card's box; only while some folder here has pictures. -->\n      <div v-else-if=\"folderPreviews\" class=\"fe-grid__thumb fe-grid__thumb--folder\">\n        <FolderMosaic :node=\"n\" :src-of=\"thumbOf\" />\n      </div>\n\n      <!-- gorunum:v1 — the row both cards share: tile · name over caption · ⋮.\n           On a file it is the 56px footer under the preview; on a folder it is\n           the whole 56px card. -->\n      <div class=\"fe-grid__foot\">\n        <!-- issue #26 — the checkbox takes the tile's place while it shows\n             (hovered, focused, selected, or once anything is selected), so\n             the name does not move when it appears. -->\n        <span class=\"fe-grid__lead\" :class=\"{ 'fe-grid__lead--pick': selectable }\">\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span\n            v-if=\"isEncryptedFolder(n)\"\n            class=\"fe-grid__tile fe-grid__tile--svg\"\n            role=\"img\"\n            :aria-label=\"t('e2e.badge')\"\n            v-html=\"encryptedFolderTile()\"\n          ></span>\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span v-else class=\"fe-grid__tile fe-grid__tile--svg\" v-html=\"fileIconTile(n)\"></span>\n          <span\n            v-if=\"selectable\"\n            class=\"fe-item-check\"\n            data-fe-control\n            @click.stop=\"onCheckClick(n, $event)\"\n            @dblclick.stop\n          >\n            <ItemCheck :on=\"isSelected(n)\" :label=\"nodeDisplayName(n)\" />\n          </span>\n        </span>\n        <div class=\"fe-grid__main\">\n          <div class=\"fe-grid__label\" :title=\"n.basename\">\n            <bdi>{{ nodeDisplayName(n) }}</bdi>\n            <span\n              v-if=\"keepBadgeFor && keepBadgeFor(n)\"\n              :class=\"['fe-keepbadge', 'fe-keepbadge--' + keepBadgeFor(n)]\"\n              :title=\"t('keep.badge_' + keepBadgeFor(n))\"\n              role=\"img\"\n              :aria-label=\"t('keep.badge_' + keepBadgeFor(n))\"\n            >{{ keepGlyph(keepBadgeFor(n)!) }}</span>\n          </div>\n          <!-- The whole caption on hover: the card has room for \"110 B • Sep 22,\n               2026\" and not for every language's date (German \"22. Sept. 2026\"\n               lost its year to the ellipsis, v0.43.0 translator pass). -->\n          <div class=\"fe-grid__meta\" :title=\"captionFor(n)\">\n            <span\n            v-if=\"lockTitleOf(n)\"\n            class=\"fe-applock\"\n            role=\"img\"\n            :title=\"lockTitleOf(n)\"\n            :aria-label=\"lockTitleOf(n)\"\n            data-testid=\"lock-badge\"\n            ><span class=\"fe-applock__glyph\" aria-hidden=\"true\">&#128274;</span>{{ t('applock.badge') }}</span>\n            <!-- issue #34 — a symlink the server will not follow. Same badge,\n                 same words, same module as the list and the gallery. -->\n            <span\n            v-if=\"linkOf(n)\"\n            class=\"fe-symlink\"\n            :class=\"'fe-symlink--' + linkOf(n)!.state\"\n            role=\"img\"\n            :title=\"linkOf(n)!.why\"\n            :aria-label=\"linkOf(n)!.why\"\n            data-testid=\"symlink-badge\"\n            :data-link-state=\"linkOf(n)!.state\"\n            ><span class=\"fe-symlink__glyph\" aria-hidden=\"true\">&#128279;</span>{{ linkOf(n)!.badge }}</span>\n            <!-- issue #104 - an entry the storage could not answer for. -->\n            <span\n            v-if=\"unavailableOf(n)\"\n            class=\"fe-unavailable\"\n            role=\"img\"\n            :title=\"unavailableOf(n)!.full\"\n            :aria-label=\"unavailableOf(n)!.full\"\n            data-testid=\"unavailable-badge\"\n            >{{ unavailableOf(n)!.badge }}</span>\n            {{ captionFor(n) }}\n          </div>\n          <!-- A card at a storage's root has no parent folder to name: no line,\n               not an em dash — the same rule the gallery follows and the list's\n               Location cell (tablo:t1). The dash read as a stray character under\n               the filename in search results. -->\n          <div\n            v-if=\"showParentPath && displayParentDirOf(n)\"\n            class=\"fe-grid__parent\"\n            :title=\"displayParentDirOf(n)\"\n          ><bdi>{{ displayParentDirOf(n) }}</bdi></div>\n          <!-- bul:s3 — content snippet («» → <mark> via TEXT segments, no innerHTML) -->\n          <div v-if=\"cardSnippet(n)\" class=\"fe-grid__snippet\" :title=\"snippetTitle(cardSnippet(n))\">\n            <template v-for=\"(seg, si) in snippetSegments(cardSnippet(n))\" :key=\"si\">\n              <mark v-if=\"seg.match\" class=\"fe-grid__mark\">{{ seg.text }}</mark>\n              <template v-else>{{ seg.text }}</template>\n            </template>\n          </div>\n        </div>\n        <button\n          type=\"button\"\n          class=\"fe-grid__menu\"\n          :aria-label=\"t('toolbar.more')\"\n          :title=\"t('toolbar.more')\"\n          @click.stop=\"onMenuButton(n, $event)\"\n          @dblclick.stop\n        >⋮</button>\n      </div>\n    </div>\n    </template>\n    <div v-if=\"!loading && files.length === 0\" class=\"fe-grid__empty\">\n      {{ t('empty.folder') }}\n    </div>\n  </div>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * HomeView — the overview the explorer lands on, INSIDE the shell.\n *\n * Three blocks, each answering a question somebody actually has on arrival:\n *\n *   Storages  which drives are mine to open?   (one card per storage)\n *   Recent    what was I just working on?\n *   Starred   what did I mark to come back to?\n *\n * ⚠⚠ Why it is in this package and not in the web app. It used to be a\n * separate PAGE there (`web/src/views/Home.vue`) with a header of its own — a\n * logo, a refresh, an \"All files\" button, an apps grid, sign-out and a\n * language switch — and no navigation panel at all, so moving between Home and\n * the files replaced the whole screen and half of that header repeated a\n * control the explorer already drew. Home is a VIEW, the way Recent and\n * Starred are: same panel, same top bar, only the content area changes. A view\n * of the explorer belongs to the explorer, and putting it here is also what\n * makes the panel's \"Home\" row mean something inside `<filex-explorer>`\n * instead of being a destination that only exists on one surface.\n *\n * ⚠ Recent and Starred render through GridView — the SAME card, with the same\n * thumbnails, the same type tiles and the same right-click menu as the listing\n * behind it. A second card implementation for the same object is how the two\n * start disagreeing about what a .docx looks like (it already happened once:\n * the web page deep-imported `fileIcons` precisely to avoid it).\n *\n * ⚠ No `<style>` block, scoped or otherwise — the package's CSS lives in\n * `styles/base.css`. A scoped block compiles to `.cls[data-v-HASH]` and the\n * hash does not match in the web-component build, so the rules would silently\n * stop applying in every embed.\n */\nimport StorageTags from './StorageTags.vue';\nimport { computed, ref } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { fileIconTile } from '../lib/fileIcons';\nimport { useServerNameFilter, type MatchNamesFn } from '../lib/nameFilter';\nimport GridView from './GridView.vue';\n\nexport interface HomeStorage {\n  name: string;\n  label?: string;\n  driver?: string;\n  readOnly?: boolean;\n  /** Bytes this storage holds, when the server reported one. */\n  usedBytes?: number;\n  /** The figure counts only part of the storage: its catalog does not cover\n   *  all of it yet (lib/catalogCoverage). Drawn as a lower bound. */\n  usedPartial?: boolean;\n}\n\nconst props = defineProps<{\n  storages: HomeStorage[];\n  recent: FileNode[];\n  starred: FileNode[];\n  /** True while the two per-user lists are still in flight. */\n  loading?: boolean;\n  locale: LocaleCode;\n  /**\n   * surucu:d1-scope — what the filter row above this view has in its name box.\n   *\n   * ⚠ It narrows ALL THREE blocks, not the two made of files. Home's first\n   * block is the drive list, and \"orada adam isterse storage ismi aratabilir\"\n   * is precisely the case the owner asked for; a box that skipped the block\n   * with the fewest, longest-lived names in it would be the box that misses\n   * the one thing people look for here.\n   *\n   * ⚠ Through the server's name rule (`lib/nameFilter`, task #207), the one\n   * the listing's box and the search use — so a name answers here exactly as\n   * it answers there. Optional: an embedder that draws no filter row passes\n   * nothing and sees everything, which is what this view has always done.\n   */\n  nameFilter?: string;\n  /** The server question the box is answered by (FileApi `matchNames`).\n   *  Absent: the local rule (lib/fileFilters nameMatches) stands in. */\n  matchNames?: MatchNamesFn;\n  /** Authenticated thumb resolver (useThumbs.src) — the grid needs it in an\n   *  embed, where a bare root-relative `thumb_url` is not authenticated. */\n  thumbSrc?: (n: FileNode) => string | null;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'open-storage', name: string): void;\n  (e: 'open-node', node: FileNode): void;\n  (e: 'context-node', node: FileNode, ev: MouseEvent): void;\n}>();\n\nconst { t, formatSize } = useLocale(() => props.locale);\n\n/* surucu:d1-scope — the three narrowed blocks.\n *\n * ⚠ A storage is matched on the word ON THE CARD (`label || name`), which is\n * also the only word a person can see to type. A card labelled \"Arşiv\" over a\n * storage named `s3-archive` must answer to \"arş\"; matching the wire name\n * instead would make the filter miss the thing it is pointing at.\n */\nconst needle = computed(() => (props.nameFilter ?? '').trim());\nconst filtering = computed(() => needle.value !== '');\nconst storageFilter = useServerNameFilter<HomeStorage>(\n  () => needle.value,\n  () => props.storages,\n  (s) => s.label || s.name,\n  () => props.matchNames,\n);\nconst recentFilter = useServerNameFilter<FileNode>(\n  () => needle.value,\n  () => props.recent,\n  (n) => n.basename || '',\n  () => props.matchNames,\n);\nconst starredFilter = useServerNameFilter<FileNode>(\n  () => needle.value,\n  () => props.starred,\n  (n) => n.basename || '',\n  () => props.matchNames,\n);\nconst shownStorages = computed(() => storageFilter.apply(props.storages));\nconst shownRecent = computed(() => recentFilter.apply(props.recent));\nconst shownStarred = computed(() => starredFilter.apply(props.starred));\n/** True when a block has rows but the filter hid all of them — a different\n *  fact from \"you have starred nothing\", and it must not borrow that sentence. */\nfunction filteredEmpty(total: number, shown: number): boolean {\n  return filtering.value && total > 0 && shown === 0;\n}\n\n/**\n * ⚠ One frozen empty set, not `new Set()` in the template. GridView takes the\n * selection as a prop and a fresh Set on every render is a new identity every\n * time, which re-runs everything downstream of it for a value that never\n * changes. Nothing on Home is selectable: there is no selection bar, no\n * checkbox column and no verb to apply — so the honest answer is \"nothing\",\n * once.\n */\nconst NO_SELECTION: Set<string> = new Set();\n\n/**\n * The storage card's glyph.\n *\n * ⚠ `mime_type: 'inode/storage'` is the whole point of this line. A storage row\n * IS `type: 'dir'`, so asking for `{ type: 'dir' }` alone falls through to the\n * plain folder branch and every drive on the first screen a person sees — the\n * screen with the most drives on it — came out as a yellow folder. `storage` is\n * a real icon family now (lib/fileIcons answers it BEFORE the folder branch),\n * and it is the two-bay drive the navigation panel already draws for the same\n * storages: one shape for a drive across the panel, the list, the grid and here.\n *\n * One constant rather than a per-card call: every storage resolves to the same\n * family, so this is one string, not one per row.\n */\nconst storageTile = fileIconTile({ type: 'dir', mime_type: 'inode/storage' });\n\n/**\n * What a storage card says under its name.\n *\n * ⚠ A size only when the server reported one, and it is the same quantity for\n * everybody who gets it (`/api/admin/storages` for an operator, the\n * RBAC-filtered `/api/files/quota/storages` for everybody else). The per-USER\n * quota is a sum across every storage, so printing that here would be a number\n * about the person under a label about the drive. With no figure the caption\n * names the kind of thing instead: a card with no size line says less; a card\n * with the wrong size line says something false.\n */\nfunction storageCaption(s: HomeStorage): string {\n  if (typeof s.usedBytes !== 'number' || s.usedBytes < 0) return t('conn.guide.storage');\n  // ⚠ A figure the catalog does not stand behind in full is a lower bound —\n  // \"at least 1.2 GB used\" — the same rule the listing's folder sizes follow.\n  return s.usedPartial\n    ? t('drive.storage.used_partial', { used: formatSize(s.usedBytes) })\n    : t('drive.storage.used_unlimited', { used: formatSize(s.usedBytes) });\n}\n\n/**\n * A card opens what it names.\n *\n * A single click, exactly as in the listing behind it (issue #26: a click\n * anywhere but the checkbox opens). Home's cards carry no checkbox at all —\n * there is no selection here to tick anything into (see NO_SELECTION).\n *\n * ⚠ Which is why the double click has to be swallowed: a real double click\n * fires `click-card` twice, and two opens of a file are two viewer tabs. The\n * guard is on the NODE, not on a timer alone — opening the same thing twice in\n * a moment is the accident; opening two different things quickly is somebody\n * working fast.\n */\nconst lastOpen = ref<{ path: string; at: number }>({ path: '', at: 0 });\nfunction openNode(n: FileNode) {\n  const now = Date.now();\n  if (n.path === lastOpen.value.path && now - lastOpen.value.at < 700) return;\n  lastOpen.value = { path: n.path, at: now };\n  emit('open-node', n);\n}\n</script>\n\n<template>\n  <!-- ⚠ No title of its own, and as of 2026-09-13 nobody else draws one either.\n       The explorer used to render \"Home\" into the breadcrumb row above this;\n       the owner had it removed (\"ver sayfa içinde salak bir Home yazısı var,\n       onu kaldıralım\") because the panel row, the tab and the address bar\n       already say it three times over. The section headings below stay — they\n       name the blocks, not the page. -->\n  <div class=\"fe-home\" data-testid=\"home-view\">\n    <!-- ── Storages ──────────────────────────────────────────────────── -->\n    <section class=\"fe-home__section\" data-testid=\"home-storages\">\n      <h2 class=\"fe-home__heading\">{{ t('sidenav.storages') }}</h2>\n\n      <div v-if=\"shownStorages.length\" class=\"fe-home__storages\">\n        <button\n          v-for=\"s in shownStorages\"\n          :key=\"s.name\"\n          type=\"button\"\n          class=\"fe-home__storage\"\n          data-testid=\"home-storage-card\"\n          :data-storage=\"s.name\"\n          :title=\"s.label || s.name\"\n          @click=\"emit('open-storage', s.name)\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span class=\"fe-home__storage-tile\" aria-hidden=\"true\" v-html=\"storageTile\"></span>\n          <span class=\"fe-home__storage-main\">\n            <span class=\"fe-home__storage-label\">{{ s.label || s.name }}</span>\n            <span\n              class=\"fe-home__storage-meta\"\n              data-testid=\"home-storage-used\"\n              :data-partial=\"s.usedPartial ? 'true' : undefined\"\n            >{{ storageCaption(s) }}</span>\n            <!-- A read-only mount says so on its card too (issue #30) — on a\n                 line of its own, the panel's own mark (StorageTags, the one\n                 read-only tag of every surface). ⚠ It used to be glued to\n                 the size (\"81 GB belegt · Nur lesen\") inside a fixed 124 px\n                 caption, and in German the words that mattered were the ones\n                 the ellipsis ate (translator measurement, v0.43.0). A tag of\n                 its own fits any language that fits the panel's. -->\n            <StorageTags\n              v-if=\"s.readOnly\"\n              read-only\n              :locale=\"locale\"\n              class=\"fe-home__storage-ro\"\n              data-testid=\"home-storage-readonly\"\n            />\n          </span>\n        </button>\n      </div>\n\n      <!-- ⚠ The filter hid them — NOT \"no storages yet\". Two different facts,\n           and borrowing the second sentence for the first tells an operator\n           their drives are gone. One row per block, `data-testid` included, so\n           a test can tell the two apart too. -->\n      <p\n        v-else-if=\"filteredEmpty(storages.length, shownStorages.length)\"\n        class=\"fe-home__nomatch\"\n        data-testid=\"home-storages-nomatch\"\n      >\n        {{ t('filter.empty.title') }}\n      </p>\n\n      <div v-else class=\"fe-state fe-home__state\" data-testid=\"home-storages-empty\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"96\"\n          height=\"80\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <rect x=\"26\" y=\"30\" width=\"68\" height=\"18\" rx=\"5\" />\n          <rect x=\"26\" y=\"54\" width=\"68\" height=\"18\" rx=\"5\" />\n          <path d=\"M38 39h.01M38 63h.01\" />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('home.storages.empty') }}</p>\n        <p class=\"fe-state__hint\">{{ t('home.storages.hint') }}</p>\n      </div>\n    </section>\n\n    <!-- ── Recent ────────────────────────────────────────────────────── -->\n    <section class=\"fe-home__section\" data-testid=\"home-recent\">\n      <h2 class=\"fe-home__heading\">{{ t('sidenav.recent') }}</h2>\n\n      <GridView\n        v-if=\"shownRecent.length\"\n        :files=\"shownRecent\"\n        :selected=\"NO_SELECTION\"\n        :selectable=\"false\"\n        :locale=\"locale\"\n        :thumb-src=\"thumbSrc\"\n        @click-card=\"openNode\"\n        @dbl-card=\"openNode\"\n        @context-card=\"(n: FileNode, ev: MouseEvent) => emit('context-node', n, ev)\"\n      />\n      <!-- ⚠ A block still loading says so, and must NOT fall through to the\n           empty state: every visit would otherwise flash \"Nothing starred yet\"\n           at somebody who has starred things. -->\n      <p v-else-if=\"loading\" class=\"fe-home__loading\">{{ t('loading') }}</p>\n      <p\n        v-else-if=\"filteredEmpty(recent.length, shownRecent.length)\"\n        class=\"fe-home__nomatch\"\n        data-testid=\"home-recent-nomatch\"\n      >\n        {{ t('filter.empty.title') }}\n      </p>\n      <div v-else class=\"fe-state fe-home__state\" data-testid=\"home-recent-empty\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"96\"\n          height=\"80\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <circle cx=\"60\" cy=\"50\" r=\"28\" />\n          <path d=\"M60 32v18l12 8\" />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('empty.recent.title') }}</p>\n        <p class=\"fe-state__hint\">{{ t('empty.recent.hint') }}</p>\n      </div>\n    </section>\n\n    <!-- ── Starred ───────────────────────────────────────────────────── -->\n    <section class=\"fe-home__section\" data-testid=\"home-starred\">\n      <h2 class=\"fe-home__heading\">{{ t('sidenav.starred') }}</h2>\n\n      <GridView\n        v-if=\"shownStarred.length\"\n        :files=\"shownStarred\"\n        :selected=\"NO_SELECTION\"\n        :selectable=\"false\"\n        :locale=\"locale\"\n        :thumb-src=\"thumbSrc\"\n        @click-card=\"openNode\"\n        @dbl-card=\"openNode\"\n        @context-card=\"(n: FileNode, ev: MouseEvent) => emit('context-node', n, ev)\"\n      />\n      <p v-else-if=\"loading\" class=\"fe-home__loading\">{{ t('loading') }}</p>\n      <p\n        v-else-if=\"filteredEmpty(starred.length, shownStarred.length)\"\n        class=\"fe-home__nomatch\"\n        data-testid=\"home-starred-nomatch\"\n      >\n        {{ t('filter.empty.title') }}\n      </p>\n      <div v-else class=\"fe-state fe-home__state\" data-testid=\"home-starred-empty\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"96\"\n          height=\"80\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <path\n            d=\"M60 26l9 18.6 20.4 3-14.8 14.4 3.5 20.4L60 72.8 41.9 82.4l3.5-20.4L30.6 47.6l20.4-3z\"\n          />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('empty.starred.title') }}</p>\n        <p class=\"fe-state__hint\">{{ t('empty.starred.hint') }}</p>\n      </div>\n    </section>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * DraftsView — the explorer's \"Drafts\" view (issue #71).\n *\n * A new document is a DRAFT until its first save: a file in the person's own\n * drafts area of the storage they chose, remembered with where it is meant to\n * go (lib/drafts). This lists every draft of theirs, across every storage —\n * its name, where it will be saved, the storage, when it last changed — with\n * the three things one does with a draft: open it, save it where it belongs,\n * or delete it (it goes to the trash, like any deleted file).\n *\n * ⚠⚠ THE table (DataTable — the explorer's own), never a table of its own:\n * the owner's rule \"filex'te TEK TABLO\". The columns resize, sort, hide and\n * move, and that is remembered on the account like every other table's\n * (`explorer.drafts`).\n *\n * ⚠ Presentational: it fetches nothing. The explorer loads the drafts, runs\n * the verbs (the save's \"name (2).ext?\" question included) and hands the rows\n * back — the same split HomeView has, for the same reason: one owner of the\n * list, so the badge and the view cannot disagree.\n *\n * ⚠ No `<style>` block — the package's CSS lives in `styles/base.css` (a\n * scoped block does not reach the web-component build).\n */\nimport { computed } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { fileIconTile } from '../lib/fileIcons';\nimport { useServerNameFilter, type MatchNamesFn } from '../lib/nameFilter';\nimport type { DraftDto } from '../lib/drafts';\nimport DataTable, { type DataColumn } from './DataTable.vue';\nimport type { ContextAction } from './ContextMenu.vue';\n\nconst props = defineProps<{\n  drafts: DraftDto[];\n  /** True while the list is in flight. */\n  loading?: boolean;\n  /** The most drafts this server keeps for one person (0 = not said). */\n  limit?: number;\n  locale: LocaleCode;\n  /** The shell's name filter — the same box Home narrows. */\n  nameFilter?: string;\n  /** The server question the box is answered by (FileApi `matchNames`,\n   *  task #207). Absent: the local rule stands in. */\n  matchNames?: MatchNamesFn;\n  /** A draft a verb is running on: its row's actions are greyed. */\n  busyKey?: string | null;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'open', draft: DraftDto): void;\n  (e: 'save', draft: DraftDto): void;\n  (e: 'delete', draft: DraftDto): void;\n}>();\n\nconst { t, formatDate } = useLocale(() => props.locale);\n\nconst draftFilter = useServerNameFilter<DraftDto>(\n  () => props.nameFilter ?? '',\n  () => props.drafts,\n  (d) => d.name,\n  () => props.matchNames,\n);\nconst rows = computed(() => draftFilter.apply(props.drafts));\n\nfunction extOf(name: string): string {\n  const dot = name.lastIndexOf('.');\n  return dot > 0 ? name.slice(dot + 1).toLowerCase() : '';\n}\n\nfunction tileFor(d: DraftDto): string {\n  return fileIconTile({ type: 'file', basename: d.name, extension: extOf(d.name) || d.type });\n}\n\n/** The folder it is meant for, inside its storage: `Reports / 2026`, or `/`. */\nfunction folderOf(d: DraftDto): string {\n  const at = d.target_dir.indexOf('://');\n  const rel = (at >= 0 ? d.target_dir.slice(at + 3) : d.target_dir).replace(/^\\/+|\\/+$/g, '');\n  return rel ? rel.split('/').filter(Boolean).join(' / ') : '/';\n}\n\nfunction whenOf(d: DraftDto): number {\n  return Date.parse(d.modified_at || d.created_at) || 0;\n}\n\nconst columns = computed<DataColumn<DraftDto>[]>(() => [\n  {\n    id: 'name',\n    label: t('col.name'),\n    lead: true,\n    sortable: true,\n    width: 280,\n    min: 160,\n    format: (d) => d.name,\n  },\n  {\n    id: 'target',\n    label: t('drafts.col.target'),\n    sortable: true,\n    width: 240,\n    format: folderOf,\n    title: (d) => d.target,\n  },\n  {\n    id: 'storage',\n    label: t('drafts.col.storage'),\n    sortable: true,\n    width: 140,\n    format: (d) => d.storage,\n  },\n  {\n    id: 'modified',\n    label: t('col.modified'),\n    sortable: true,\n    sortDir: 'desc',\n    width: 170,\n    format: (d) => formatDate(whenOf(d)),\n    sortValue: (d) => whenOf(d),\n  },\n]);\n\nfunction rowActions(d: DraftDto): ContextAction[] {\n  const busy = props.busyKey === d.key;\n  return [\n    { key: 'open', label: t('ctx.open'), icon: 'open', disabled: busy },\n    { key: 'save', label: t('drafts.action.save'), icon: 'check', disabled: busy },\n    { key: 'delete', label: t('ctx.delete'), icon: 'delete', danger: true, disabled: busy },\n  ];\n}\n\nfunction onRowAction(key: string, d: DraftDto) {\n  if (key === 'open') emit('open', d);\n  else if (key === 'save') emit('save', d);\n  else if (key === 'delete') emit('delete', d);\n}\n\n/** \"3 of 50 drafts\" — how close the person is to the limit, said plainly. */\nconst countLine = computed(() =>\n  props.limit && props.limit > 0\n    ? t('drafts.count_of', { n: props.drafts.length, limit: props.limit })\n    : '',\n);\n</script>\n\n<template>\n  <section class=\"fe-drafts\" data-testid=\"drafts-view\">\n    <header class=\"fe-drafts__head\">\n      <p class=\"fe-drafts__lead\">{{ t('drafts.lead') }}</p>\n      <p v-if=\"countLine && drafts.length\" class=\"fe-drafts__count\" data-testid=\"drafts-count-line\">\n        {{ countLine }}\n      </p>\n    </header>\n\n    <div v-if=\"!loading && drafts.length === 0\" class=\"fe-state\" data-testid=\"empty-drafts\">\n      <svg\n        class=\"fe-state__art\"\n        viewBox=\"0 0 120 100\"\n        width=\"110\"\n        height=\"92\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        stroke-width=\"2\"\n        stroke-linecap=\"round\"\n        stroke-linejoin=\"round\"\n        aria-hidden=\"true\"\n      >\n        <path d=\"M66 18H38a6 6 0 0 0-6 6v52a6 6 0 0 0 6 6h44a6 6 0 0 0 6-6V40z\" />\n        <path d=\"M66 18v22h22\" />\n        <path d=\"M50 66l18-18 6 6-18 18H50z\" />\n      </svg>\n      <p class=\"fe-state__title\">{{ t('empty.drafts.title') }}</p>\n      <p class=\"fe-state__hint\">{{ t('empty.drafts.hint') }}</p>\n    </div>\n\n    <DataTable\n      v-else\n      table-id=\"explorer.drafts\"\n      :columns=\"columns\"\n      :rows=\"rows\"\n      row-key=\"key\"\n      :locale=\"locale\"\n      :loading=\"loading\"\n      :framed=\"false\"\n      :empty=\"t('drafts.no_match')\"\n      :aria-label=\"t('node.drafts')\"\n      :row-attrs=\"(d: DraftDto) => ({ 'data-testid': `draft-row-${d.key}`, 'data-draft-name': d.name })\"\n      :row-actions=\"rowActions\"\n      :row-actions-test-id=\"(d: DraftDto) => `draft-actions-${d.key}`\"\n      @row-action=\"(key: string, d: DraftDto) => onRowAction(key, d)\"\n      @row-dblclick=\"(d: DraftDto) => emit('open', d)\"\n    >\n      <template #cell-name=\"{ row }\">\n        <span class=\"fe-drafts__name\">\n          <span class=\"fe-drafts__tile\" aria-hidden=\"true\" v-html=\"tileFor(row)\"></span>\n          <button\n            type=\"button\"\n            class=\"fe-drafts__open\"\n            :title=\"t('drafts.open_hint', { name: row.name })\"\n            :data-testid=\"`draft-open-${row.key}`\"\n            @click.stop=\"emit('open', row)\"\n          >\n            <bdi>{{ row.name }}</bdi>\n          </button>\n        </span>\n      </template>\n      <template #cell-target=\"{ row }\">\n        <bdi class=\"fe-drafts__target\">{{ folderOf(row) }}</bdi>\n      </template>\n    </DataTable>\n  </section>\n</template>\n","/**\n * useConnections — the one client for the storage-connection surface.\n *\n * It talks to the same server the explorer does, through the same auth\n * plumbing (`useFileApi` owns bearer/CSRF/basic resolution, including the\n * function-token the desktop app hands down), so there is no second place\n * that knows how to authenticate.\n *\n * Two audiences, deliberately separated:\n *\n *   • an ADMIN gets the driver descriptors and full CRUD over storages\n *     (`/api/admin/*`);\n *   • everybody else gets `visible` — the storage names the manager root\n *     already returns to them — plus their own identity, which is all the\n *     \"how to connect\" pages need.\n *\n * ⚠ Permission is decided by ASKING THE SERVER, never by reading a role\n * off `/api/auth/me`. An API token whose scopes exclude `admin` belongs to\n * an admin account and still gets 403 on `/api/admin/storages`; trusting\n * the role would render a form whose every submit fails.\n */\n\nimport { computed, ref, shallowRef } from 'vue';\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type {\n  ConnectionsUser,\n  ManageDenial,\n  StorageDriverDescriptor,\n  StorageField,\n  StorageRow,\n  StorageTestResult,\n  StorageWrite,\n} from '../types/Connections';\nimport { useFileApi } from './useFileApi';\nimport { serverWords } from '../lib/errorWords';\n\n/**\n * The URL prefix the `/api/...` routes hang off.\n *\n * `apiBase: ''` is a legitimate value (the admin SPA is same-origin), so\n * only `undefined`/`null` means \"not given\" — a falsy check would send the\n * SPA's requests to the wrong place. Legacy embedders configure `endpoint`\n * instead of `apiBase`; the prefix is recovered from it so they are not\n * excluded.\n */\nexport function connectionsBase(config: ExplorerConfig): string {\n  if (config.apiBase != null) return config.apiBase.replace(/\\/+$/, '');\n  const m = config.endpoint ?? '';\n  const cut = m.indexOf('/api/');\n  return cut >= 0 ? m.slice(0, cut) : '';\n}\n\n/**\n * The origin a client program should be pointed at.\n *\n * The instruction pages are only worth anything if they name the real\n * deployment, so this resolves to an absolute address, best evidence first:\n *\n *   1. `publicUrl` — what the SERVER says it is reached at\n *      (`/api/files/capabilities` → `public_url`, published only when the\n *      operator configured it or the request came in on a tenant's own host);\n *   2. the configured apiBase when it is absolute (the desktop app, embeds\n *      that talk to filex directly);\n *   3. the page's own origin (the admin SPA, which the same binary serves).\n *\n * ⚠ Rungs 2 and 3 keep the API base's PATH. filex can live under a sub-path\n * (`https://example.com/filex`, FILEX_BASE_PATH): the desktop app then has\n * that as its apiBase and the admin app `/filex`, and a guide that kept only\n * the origin printed `https://example.com/dav/` — the host's root, not filex.\n *\n * ⚠⚠ The first rung is new and it is the fix. Without it an explorer embedded\n * in ANOTHER app — which proxies `/api` to filex under its own origin, the way\n * work.example.com and fishapp do — printed `https://<that app>/dav/`: an address\n * that reaches the host application, never filex. It also left one guide page\n * speaking with two voices, because its S3 endpoint and SFTP host were always\n * the server's and only the WebDAV / mount lines were the page's.\n */\nexport function connectionsOrigin(config: ExplorerConfig, publicUrl?: string | null): string {\n  const told = String(publicUrl ?? '').trim();\n  if (/^https?:\\/\\/[^/]/i.test(told)) return told.replace(/\\/+$/, '');\n  const base = connectionsBase(config);\n  if (/^https?:\\/\\//i.test(base)) {\n    try {\n      const u = new URL(base);\n      return u.origin + u.pathname.replace(/\\/+$/, '');\n    } catch {\n      return base;\n    }\n  }\n  if (typeof window !== 'undefined' && window.location) {\n    return window.location.origin + (base.startsWith('/') ? base : '');\n  }\n  return base;\n}\n\nexport function useConnections(config: ExplorerConfig) {\n  const api = useFileApi(config);\n  const base = connectionsBase(config);\n  const url = (path: string) => `${base}${path}`;\n\n  const drivers = shallowRef<StorageDriverDescriptor[]>([]);\n  const storages = shallowRef<StorageRow[]>([]);\n  /** Storage names a non-admin may see (manager root). */\n  const visible = shallowRef<string[]>([]);\n  const me = ref<ConnectionsUser | null>(null);\n  /**\n   * The caller's tenant realm on a multi-tenant server (`/api/auth/me` →\n   * `realm`), else null. A protocol that carries no address a tenant could be\n   * told by is signed in to as `realm/name` (docs/PROTOCOLS.md), so the guides\n   * print it.\n   */\n  const realm = ref<string | null>(null);\n  /** The server's own public address, when it has one to give (see connectionsOrigin). */\n  const publicUrl = ref<string | null>(null);\n\n  const loading = ref(false);\n  const loaded = ref(false);\n  const error = ref<string | null>(null);\n  /** null until the first load decides; then true, or a reason it is false. */\n  const canManage = ref<boolean | null>(null);\n  const denial = ref<ManageDenial | null>(null);\n\n  function statusOf(e: unknown): number | undefined {\n    return (e as { status?: number } | null)?.status;\n  }\n\n  /** A refusal, said — lib/errorWords `serverWords`, the one rule every\n   *  connection panel shares (it used to print the server's `error` field as\n   *  it came: an environment variable, to a regular user). ⚠ The locale is\n   *  passed because what comes back may be the SERVER's own sentence: it\n   *  never met a translator, and an Arabic panel needs its machine runs\n   *  isolated (lib/direction `foreignText`). */\n  function messageOf(e: unknown): string {\n    return serverWords(e, config.locale);\n  }\n\n  /** The full picture, in as few round-trips as the permission allows. */\n  async function load(): Promise<void> {\n    loading.value = true;\n    error.value = null;\n    try {\n      // Where the server says it lives. Best-effort and in parallel: a server\n      // older than `public_url`, or one that has none to give, leaves the\n      // guides on the address the page loaded from — exactly as before.\n      const told = api\n        .capabilities()\n        .then((c) => {\n          const v = (c as { public_url?: unknown } | null)?.public_url;\n          publicUrl.value = typeof v === 'string' && v ? v : null;\n        })\n        .catch(() => {\n          publicUrl.value = null;\n        });\n\n      // Identity first: the guides need the caller's own e-mail (it IS the\n      // WebDAV username), and it is the one call every role may make.\n      try {\n        const body = await api.jsonFetch<{ user: ConnectionsUser; realm?: string }>(url('/api/auth/me'));\n        me.value = body?.user ?? null;\n        realm.value = typeof body?.realm === 'string' && body.realm ? body.realm : null;\n      } catch (e) {\n        if (statusOf(e) === 401) {\n          canManage.value = false;\n          denial.value = 'anonymous';\n        }\n        me.value = null;\n      }\n\n      try {\n        drivers.value = await api.jsonFetch<StorageDriverDescriptor[]>(\n          url('/api/admin/storage-drivers'),\n        );\n        canManage.value = true;\n        denial.value = null;\n      } catch (e) {\n        drivers.value = [];\n        canManage.value = false;\n        // 401/403 is a permission answer, not a fault: a viewer is meant to\n        // land on the guides. Anything else is a real failure and is shown.\n        const st = statusOf(e);\n        if (st === 403) denial.value = 'none';\n        else if (st === 401) denial.value = 'anonymous';\n        else {\n          denial.value = 'unreachable';\n          error.value = messageOf(e);\n        }\n      }\n\n      if (canManage.value) {\n        try {\n          const rows = await api.jsonFetch<StorageRow[]>(url('/api/admin/storages'));\n          storages.value = Array.isArray(rows) ? rows : [];\n          visible.value = storages.value.map((s) => s.name);\n        } catch (e) {\n          error.value = messageOf(e);\n        }\n      } else {\n        // What a non-admin may see, from the endpoint they already use.\n        try {\n          const root = await api.index('');\n          visible.value = Array.isArray(root?.storages) ? root.storages : [];\n        } catch {\n          visible.value = [];\n        }\n      }\n      await told;\n      loaded.value = true;\n    } finally {\n      loading.value = false;\n    }\n  }\n\n  async function createStorage(body: StorageWrite): Promise<StorageRow> {\n    const created = await api.jsonFetch<StorageRow>(url('/api/admin/storages'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(body),\n    });\n    await load();\n    return created;\n  }\n\n  async function updateStorage(id: number, body: Partial<StorageWrite>): Promise<StorageRow> {\n    const updated = await api.jsonFetch<StorageRow>(url(`/api/admin/storages/${id}`), {\n      method: 'PATCH',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(body),\n    });\n    await load();\n    return updated;\n  }\n\n  async function deleteStorage(id: number): Promise<void> {\n    await api.jsonFetch(url(`/api/admin/storages/${id}`), { method: 'DELETE' });\n    await load();\n  }\n\n  /**\n   * Try a driver config without saving it.\n   *\n   * The endpoint answers 200 with `{ok:false,error}` for a connection that\n   * did not work — a failed *test* is a successful *request* — so a thrown\n   * error here means the call itself failed and is reported as such.\n   */\n  async function testStorage(body: {\n    driver: string;\n    config: Record<string, unknown>;\n  }): Promise<StorageTestResult> {\n    try {\n      return await api.jsonFetch<StorageTestResult>(url('/api/admin/storages/test'), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(body),\n      });\n    } catch (e) {\n      return { ok: false, error: messageOf(e) };\n    }\n  }\n\n  function descriptor(driver: string): StorageDriverDescriptor | undefined {\n    return drivers.value.find((d) => d.driver === driver);\n  }\n\n  function fields(driver: string): StorageField[] {\n    return descriptor(driver)?.fields ?? [];\n  }\n\n  /** The config a fresh form starts from: every declared default, nothing else. */\n  function defaults(driver: string): Record<string, unknown> {\n    const out: Record<string, unknown> = {};\n    for (const f of fields(driver)) {\n      if (f.default !== undefined && f.default !== null) out[f.key] = f.default;\n    }\n    return out;\n  }\n\n  /**\n   * Required fields the config has not filled — checked HERE as well as on\n   * the server so the user is told before a round-trip, and with the same\n   * alias rules (`base_path` still counts as `root`).\n   */\n  function missingRequired(driver: string, cfg: Record<string, unknown>): StorageField[] {\n    return fields(driver).filter((f) => {\n      if (!f.required || f.default !== undefined) return false;\n      for (const k of [f.key, ...(f.aliases ?? [])]) {\n        const v = cfg[k];\n        if (v === undefined || v === null) continue;\n        if (typeof v === 'string' && v.trim() === '') continue;\n        return false;\n      }\n      return true;\n    });\n  }\n\n  const driverNames = computed(() => drivers.value.map((d) => d.driver));\n\n  return {\n    // state\n    drivers,\n    driverNames,\n    storages,\n    visible,\n    me,\n    realm,\n    publicUrl,\n    loading,\n    loaded,\n    error,\n    canManage,\n    denial,\n    // actions\n    load,\n    createStorage,\n    updateStorage,\n    deleteStorage,\n    testStorage,\n    // descriptor helpers\n    descriptor,\n    fields,\n    defaults,\n    missingRequired,\n  };\n}\n\nexport type ConnectionsApi = ReturnType<typeof useConnections>;\n","/**\n * webdavMount — the forms of a filex WebDAV address, and the operating\n * systems' own commands that attach one as a drive.\n *\n * Two readers, one source:\n *  - the connection guide (`connectionGuides.ts`) PRINTS these for a person to\n *    copy;\n *  - the desktop app's \"Mount as a drive\" (`desktop/src/drive.ts`) RUNS them.\n * Written twice, the command the guide teaches and the one the button runs\n * would drift apart, and the person who copied the guide's version would hit\n * a failure the button never shows — or the other way round.\n *\n * ⚠ No imports, and none may be added. The desktop main process and its\n * `node --test` runner import this file by relative path (the way\n * `packages/core/src/lib/notificationTarget.ts` is imported), and plain node does not\n * resolve an extensionless specifier.\n */\n\n/** True when the deployment is not on TLS — several clients refuse that,\n *  and Windows refuses it silently, which is worse. */\nexport function isPlainHttp(origin: string): boolean {\n  return /^http:\\/\\//i.test(origin);\n}\n\n/**\n * `https://fm.example.com` (+ `docs`) → `https://fm.example.com/dav/docs/`.\n *\n * The storage name is NOT percent-encoded: this is the form a person reads and\n * types, and the form `net use` and Explorer's \"Map network drive\" take — both\n * encode it on the wire themselves. Consumers that need a URI (GVfs, NetFS)\n * go through `new URL()`, which encodes it for them.\n */\nexport function webdavUrl(origin: string, storage?: string): string {\n  const base = origin.replace(/\\/+$/, '');\n  return storage ? `${base}/dav/${storage}/` : `${base}/dav/`;\n}\n\n/**\n * The GVfs form (`gio mount`, GNOME Files, Dolphin): `https:` → `davs:`,\n * `http:` → `dav:`. With `user`, the account goes in the URI — which is what\n * makes `gio mount` ask for the PASSWORD only, so the one line piped to it\n * lands in the right prompt (gvfs adds the username prompt only when the URI\n * carries none).\n */\nexport function gioUri(url: string, user?: string): string {\n  let u: URL;\n  try {\n    u = new URL(url);\n  } catch {\n    return url.replace(/^https:/i, 'davs:').replace(/^http:/i, 'dav:');\n  }\n  const scheme = u.protocol === 'http:' ? 'dav' : 'davs';\n  const auth = user ? `${encodeURIComponent(user)}@` : '';\n  return `${scheme}://${auth}${u.host}${u.pathname}`;\n}\n\n/**\n * The UNC path Windows' WebDAV redirector gives the same address:\n * `https://fm.example.com:8443/dav/My files/` → `\\\\fm.example.com@SSL@8443\\dav\\My files`.\n *\n * It is what `net use` lists for a mapped drive and what WNetAddConnection2\n * takes, so it is also how a mapping is recognised as ours.\n */\nexport function webdavUnc(url: string): string {\n  const u = new URL(url);\n  const ssl = u.protocol === 'https:';\n  let host = u.hostname.replace(/^\\[|\\]$/g, '');\n  if (ssl) host += '@SSL';\n  if (u.port) host += `@${u.port}`;\n  const segments = u.pathname\n    .split('/')\n    .filter(Boolean)\n    .map((s) => decodeURIComponent(s));\n  return `\\\\\\\\${host}${segments.length ? '\\\\' + segments.join('\\\\') : ''}`;\n}\n\nexport interface NetUseOptions {\n  /** `Z:` */\n  letter: string;\n  url: string;\n  user: string;\n  /** What goes in the password slot. The guide prints a placeholder there;\n   *  nothing that runs this should ever put a real secret in an argv. */\n  password: string;\n  persistent: boolean;\n}\n\n/** `net use` arguments (without `net`), in the order `net` wants them. */\nexport function netUseArgs(o: NetUseOptions): string[] {\n  return ['use', o.letter, o.url, `/user:${o.user}`, o.password, `/persistent:${o.persistent ? 'yes' : 'no'}`];\n}\n\n/** The same, as a line to paste into cmd.exe — the address quoted, since a\n *  storage name may carry a space. */\nexport function netUseCommand(o: NetUseOptions): string {\n  const [verb, letter, url, ...rest] = netUseArgs(o);\n  return ['net', verb, letter, `\"${url}\"`, ...rest].join(' ');\n}\n\n/** Detaching a mapped drive: no credential involved, safe to run as is. */\nexport function netUseDeleteArgs(letter: string): string[] {\n  return ['use', letter, '/delete', '/y'];\n}\n\n/**\n * Windows' WebDAV client has two built-in limits that look exactly like filex\n * bugs: transfers stop at ~47.7 MB (`FileSizeLimitInBytes`, default\n * 50,000,000) and folders of roughly a thousand entries fail to open\n * (`FileAttributesLimitInBytes`, default 1,000,000). These are the values the\n * guide recommends, and the registry lines that set them (an administrator\n * runs them; the WebClient service must restart after).\n */\nexport const WEBCLIENT_KEY = 'HKLM\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\WebClient\\\\Parameters';\nexport const WEBCLIENT_FILE_SIZE_RECOMMENDED = 4294967295;\nexport const WEBCLIENT_ATTRIBUTES_RECOMMENDED = 20000000;\nexport const WEBCLIENT_LIMIT_COMMANDS: string[] = [\n  `reg add \"${WEBCLIENT_KEY}\" /v FileSizeLimitInBytes /t REG_DWORD /d ${WEBCLIENT_FILE_SIZE_RECOMMENDED} /f`,\n  `reg add \"${WEBCLIENT_KEY}\" /v FileAttributesLimitInBytes /t REG_DWORD /d ${WEBCLIENT_ATTRIBUTES_RECOMMENDED} /f`,\n  'net stop webclient && net start webclient',\n];\n","/**\n * connectionGuides — \"how do I connect to this thing?\", generated from the\n * live deployment instead of written as prose.\n *\n * A published document says `https://fm.example.com/dav/` and leaves the\n * reader to substitute three values, one of which (their own username) they\n * usually get wrong. What ships here is the real host, the real storage\n * name and the caller's own credential, with a copy button — which is the\n * difference between a doc and a working paste. No surveyed product\n * (Backblaze, R2, Storj, MinIO, Garage) does this; it is the cheapest win\n * on the whole surface.\n *\n * Shape of the thing: a protocol is a `GuideBuilder` registered in\n * `GUIDE_BUILDERS`. WebDAV is built here because WebDAV is what filex\n * serves today; S3 and SFTP are a builder each and a registry line when\n * their servers land — no second implementation, no second UI.\n *\n * The commands are not invented. They are the ones verified on 2026-08-14\n * and written down in `docs/WEBDAV.md` and §13.5 of the write-path\n * handover, including the three Windows registry limits that otherwise\n * look exactly like filex bugs.\n */\n\nimport { gioUri, isPlainHttp, netUseCommand, webdavUrl, WEBCLIENT_LIMIT_COMMANDS } from './webdavMount';\n\n// ⚠ The address forms and the OS commands live in webdavMount.ts, because the\n// desktop app's \"Mount as a drive\" RUNS the same commands this page prints.\n// Re-exported so the existing importers keep working.\nexport { isPlainHttp };\n\nexport type Translate = (key: string, vars?: Record<string, string | number>) => string;\n\n/** Everything a guide is allowed to know about the deployment. */\nexport interface GuideContext {\n  /** Absolute origin of the server, e.g. `https://fm.example.com`. */\n  origin: string;\n  /** The caller's own account e-mail — the username on every protocol. */\n  user: string;\n  /** Storage names the caller may see. */\n  storages: string[];\n  /** The storage the page is currently focused on, when any. */\n  storage?: string;\n  /**\n   * The S3 endpoint, as the server computes it.\n   *\n   * ⚠ NOT derived from `origin` here. With a dedicated host the endpoint is\n   * that host's root; without one it lives under `/s3`, and a client pointed\n   * at the application root reaches the web app — rclone reported\n   * \"XML syntax error on line 10\" against an HTML redirect page. The server\n   * returns this with every key, and the guide repeats it verbatim.\n   */\n  s3Endpoint?: string;\n  /** True when clients must be told to force path-style addressing. */\n  s3PathStyle?: boolean;\n  /** The access key id to write into the examples, when the caller has one. */\n  s3AccessKeyID?: string;\n  /** The freshly minted secret, shown only while the user is looking at it. */\n  s3Secret?: string;\n  /** The SFTP endpoint, as the server reports it. */\n  sftpHost?: string;\n  sftpPort?: number;\n  /** False when the operator has the endpoint switched off. */\n  sftpEnabled?: boolean;\n  /** The login name a client must use — the username when there is one. */\n  sftpLogin?: string;\n  /** True when the account has at least one usable key registered. */\n  sftpHasKey?: boolean;\n  /** The FTPS endpoint, as the server reports it. */\n  ftpsHost?: string;\n  ftpsPort?: number;\n  ftpsEnabled?: boolean;\n  /** The passive data-port range, which the client's firewall must allow. */\n  ftpsPasvMin?: number;\n  ftpsPasvMax?: number;\n  /** True when the server is using a self-signed certificate. */\n  ftpsSelfSigned?: boolean;\n  /** The NFS endpoint, as the server reports it. */\n  nfsHost?: string;\n  nfsPort?: number;\n  nfsEnabled?: boolean;\n  /** The freshly minted export path — the credential, shown once. */\n  nfsPath?: string;\n  /** True when the active export refuses writes. */\n  nfsReadOnly?: boolean;\n}\n\nexport type GuideBlockKind = 'text' | 'steps' | 'code' | 'note' | 'warn';\n\nexport interface GuideBlock {\n  kind: GuideBlockKind;\n  /** Prose for `text` / `note` / `warn`. */\n  text?: string;\n  /** Ordered instructions for `steps`. */\n  steps?: string[];\n  /** Copyable payload for `code`. */\n  code?: string;\n  /** Syntax hint / file name shown above a code block. */\n  caption?: string;\n}\n\nexport interface GuideClient {\n  id: string;\n  /** Product name — never translated (\"Cyberduck\" is Cyberduck). */\n  name: string;\n  platform: 'windows' | 'macos' | 'linux' | 'any';\n  blocks: GuideBlock[];\n}\n\n/** One connection fact, rendered as a copyable row. */\nexport interface GuideFact {\n  label: string;\n  value: string;\n  hint?: string;\n  /** Rendered as a hint rather than a value — filex never has the\n   *  plaintext of your password and must not pretend otherwise. */\n  placeholderOnly?: boolean;\n}\n\nexport interface ProtocolGuide {\n  id: string;\n  /** Protocol name — a wire protocol is not translated either. */\n  name: string;\n  summary: string;\n  /** Server + credential, filled in from this deployment. */\n  facts: GuideFact[];\n  clients: GuideClient[];\n  notes: GuideBlock[];\n}\n\nexport type GuideBuilder = (ctx: GuideContext, t: Translate) => ProtocolGuide;\n\n/** `https://fm.example.com` → `fm.example.com`; anything unparseable comes back whole. */\nexport function hostOf(origin: string): string {\n  try {\n    return new URL(origin).host;\n  } catch {\n    return origin.replace(/^https?:\\/\\//i, '').replace(/\\/+$/, '');\n  }\n}\n\n/**\n * The path a server address lives under: `https://example.com/filex` →\n * `/filex`, `https://fm.example.com` → `''`. filex can be served under a sub-path\n * (FILEX_BASE_PATH), and a guide that asks for a host and a path separately\n * has to put it in the path.\n */\nexport function pathOf(origin: string): string {\n  try {\n    return new URL(origin).pathname.replace(/\\/+$/, '');\n  } catch {\n    return '';\n  }\n}\n\n/**\n * The name a password-carrying client signs in with, from the account's e-mail\n * and — on a multi-tenant server, for a tenant's account — its realm\n * (`/api/auth/me` → `realm`): `acme/alice@example.com`. A protocol that carries no\n * address a tenant could be told by needs the realm written in front\n * (docs/PROTOCOLS.md), and on the tenant's own address it names the same\n * tenant, so it is always correct to print it. No realm: the e-mail alone,\n * exactly as before.\n */\nexport function guideUser(email: string, realm?: string | null): string {\n  const e = String(email ?? '').trim();\n  const r = String(realm ?? '').trim();\n  return e && r ? `${r}/${e}` : e;\n}\n\n/**\n * The username a client should be given. Falls back to a placeholder so a\n * guide rendered before `/api/auth/me` answers is still readable rather\n * than showing `undefined` in the middle of a command line.\n */\nfunction userOf(ctx: GuideContext, t: Translate): string {\n  return ctx.user || t('conn.guide.userPlaceholder');\n}\n\n// ─────────────────────────────────────────────────────────────────────\n// WebDAV\n// ─────────────────────────────────────────────────────────────────────\n\nexport const buildWebdavGuide: GuideBuilder = (ctx, t) => {\n  const origin = ctx.origin.replace(/\\/+$/, '');\n  const target = webdavUrl(origin, ctx.storage);\n  const user = userOf(ctx, t);\n  const secret = t('conn.guide.secretPlaceholder');\n\n  const facts: GuideFact[] = [\n    { label: t('conn.guide.fact.url'), value: target, hint: ctx.storage ? t('conn.guide.fact.urlStorageHint', { storage: ctx.storage }) : t('conn.guide.fact.urlRootHint') },\n    { label: t('conn.guide.fact.user'), value: user, hint: t('conn.guide.webdav.userHint') },\n    { label: t('conn.guide.fact.password'), value: secret, hint: t('conn.guide.webdav.passwordHint'), placeholderOnly: true },\n  ];\n\n  const clients: GuideClient[] = [\n    {\n      id: 'windows',\n      name: 'Windows Explorer',\n      platform: 'windows',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.webdav.win.s1'),\n            t('conn.guide.webdav.win.s2', { url: target }),\n            t('conn.guide.webdav.win.s3'),\n          ],\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.webdav.win.cmdCaption'),\n          code: netUseCommand({ letter: 'Z:', url: target, user, password: secret, persistent: true }),\n        },\n        {\n          kind: 'warn',\n          text: t('conn.guide.webdav.win.limits'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.webdav.win.regCaption'),\n          code: WEBCLIENT_LIMIT_COMMANDS.join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.webdav.win.https') },\n        { kind: 'note', text: t('conn.guide.webdav.win.persist') },\n        { kind: 'note', text: t('conn.guide.webdav.win.service') },\n      ],\n    },\n    {\n      id: 'macos',\n      name: 'macOS Finder',\n      platform: 'macos',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.webdav.mac.s1'),\n            t('conn.guide.webdav.mac.s2', { url: target }),\n            t('conn.guide.webdav.mac.s3'),\n          ],\n        },\n        { kind: 'note', text: t('conn.guide.webdav.mac.note') },\n      ],\n    },\n    {\n      id: 'linux',\n      name: 'Linux (davfs2 / GNOME / KDE)',\n      platform: 'linux',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.webdav.linux.mountCaption'),\n          code: [\n            `sudo mount -t davfs ${target} /mnt/filex`,\n            '',\n            `# ${t('conn.guide.webdav.linux.gvfsComment')}`,\n            `gio mount ${gioUri(target)}`,\n          ].join('\\n'),\n        },\n        {\n          kind: 'warn',\n          text: t('conn.guide.webdav.linux.locks'),\n        },\n        {\n          kind: 'code',\n          caption: '/etc/davfs2/davfs2.conf',\n          code: 'use_locks 0',\n        },\n      ],\n    },\n    {\n      id: 'rclone',\n      name: 'rclone',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.webdav.rclone.obscureCaption'),\n          code: `rclone obscure \"${secret}\"`,\n        },\n        {\n          kind: 'code',\n          caption: '~/.config/rclone/rclone.conf',\n          code: [\n            '[filex]',\n            'type = webdav',\n            `url = ${origin}/dav`,\n            'vendor = other',\n            `user = ${user}`,\n            `pass = ${t('conn.guide.webdav.rclone.passPlaceholder')}`,\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.webdav.rclone.useCaption'),\n          code: [\n            'rclone lsd filex:',\n            ctx.storage ? `rclone lsl filex:${ctx.storage}` : 'rclone lsl filex:<storage>',\n            ctx.storage\n              ? `rclone copy ./local filex:${ctx.storage}/backup`\n              : 'rclone copy ./local filex:<storage>/backup',\n            'rclone mount filex: /mnt/filex',\n          ].join('\\n'),\n        },\n      ],\n    },\n    {\n      id: 'cyberduck',\n      name: 'Cyberduck / Mountain Duck',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.webdav.duck.s1'),\n            t('conn.guide.webdav.duck.s2', { host: hostOf(origin) }),\n            t('conn.guide.webdav.duck.s3', { path: pathOf(origin) + (ctx.storage ? `/dav/${ctx.storage}/` : '/dav/') }),\n            t('conn.guide.webdav.duck.s4', { user }),\n          ],\n        },\n      ],\n    },\n  ];\n\n  const notes: GuideBlock[] = [\n    { kind: 'note', text: t('conn.guide.webdav.note.delete') },\n    { kind: 'note', text: t('conn.guide.webdav.note.locks') },\n    { kind: 'note', text: t('conn.guide.webdav.note.permissions') },\n  ];\n\n  if (isPlainHttp(origin)) {\n    // Not decoration: over plain HTTP Windows refuses to send Basic\n    // credentials at all, and says nothing useful about why.\n    notes.unshift({ kind: 'warn', text: t('conn.guide.webdav.note.http') });\n  }\n\n  return {\n    id: 'webdav',\n    name: 'WebDAV',\n    summary: t('conn.guide.webdav.summary'),\n    facts,\n    clients,\n    notes,\n  };\n};\n\n// ─────────────────────────────────────────────────────────────────────\n// S3\n// ─────────────────────────────────────────────────────────────────────\n\n/**\n * Every command here was RUN against the endpoint on 2026-08-16, not copied\n * from a vendor page: rclone 1.73.5, aws-cli 2.11.6, restic 0.19.1, mc\n * 2025-08-13 and s3fs 1.93 each did a full round trip, and the flags below are\n * the ones those runs actually needed. Five of the endpoint's bugs were found\n * that way — a guide assembled from documentation would have shipped them.\n */\nexport const buildS3Guide: GuideBuilder = (ctx, t) => {\n  const endpoint = (ctx.s3Endpoint || `${ctx.origin.replace(/\\/+$/, '')}/s3`).replace(/\\/+$/, '');\n  const bucket = ctx.storage || ctx.storages[0] || '<bucket>';\n  const akid = ctx.s3AccessKeyID || t('conn.guide.s3.keyPlaceholder');\n  const secret = ctx.s3Secret || t('conn.guide.s3.secretPlaceholder');\n  const pathStyle = ctx.s3PathStyle !== false;\n  const host = hostOf(endpoint);\n\n  const facts: GuideFact[] = [\n    { label: t('conn.guide.s3.fact.endpoint'), value: endpoint, hint: t('conn.guide.s3.fact.endpointHint') },\n    { label: t('conn.guide.s3.fact.bucket'), value: bucket, hint: t('conn.guide.s3.fact.bucketHint') },\n    { label: t('conn.guide.s3.fact.key'), value: akid, hint: t('conn.guide.s3.fact.keyHint') },\n    {\n      label: t('conn.guide.s3.fact.secret'),\n      value: secret,\n      hint: t('conn.guide.s3.fact.secretHint'),\n      // ⚠ Only real right after minting. filex stores the secret sealed and\n      // cannot show it again, and a guide that printed something secret-shaped\n      // would be teaching a value that authenticates as nothing.\n      placeholderOnly: !ctx.s3Secret,\n    },\n    { label: t('conn.guide.s3.fact.region'), value: 'us-east-1', hint: t('conn.guide.s3.fact.regionHint') },\n    {\n      label: t('conn.guide.s3.fact.addressing'),\n      value: pathStyle ? t('conn.guide.s3.fact.pathStyle') : t('conn.guide.s3.fact.virtualHosted'),\n      hint: pathStyle ? t('conn.guide.s3.fact.pathStyleHint') : t('conn.guide.s3.fact.virtualHostedHint'),\n    },\n  ];\n\n  const clients: GuideClient[] = [\n    {\n      id: 'rclone',\n      name: 'rclone',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: '~/.config/rclone/rclone.conf',\n          code: [\n            '[filex]',\n            'type = s3',\n            'provider = Other',\n            `endpoint = ${endpoint}`,\n            `access_key_id = ${akid}`,\n            `secret_access_key = ${secret}`,\n            'region = us-east-1',\n            ...(pathStyle ? ['force_path_style = true'] : []),\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.rclone.useCaption'),\n          code: [\n            'rclone lsd filex:',\n            `rclone copy ./local filex:${bucket}/backup -P`,\n            `rclone sync ./local filex:${bucket}/backup`,\n            `rclone mount filex:${bucket} /mnt/filex`,\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.s3.rclone.mtime') },\n      ],\n    },\n    {\n      id: 'awscli',\n      name: 'AWS CLI',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.aws.configureCaption'),\n          code: [\n            'aws configure set aws_access_key_id ' + akid,\n            'aws configure set aws_secret_access_key ' + secret,\n            'aws configure set region us-east-1',\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.aws.useCaption'),\n          code: [\n            `aws --endpoint-url ${endpoint} s3 ls`,\n            `aws --endpoint-url ${endpoint} s3 cp ./file.pdf s3://${bucket}/file.pdf`,\n            `aws --endpoint-url ${endpoint} s3 sync ./local s3://${bucket}/backup`,\n            `aws --endpoint-url ${endpoint} s3 presign s3://${bucket}/file.pdf --expires-in 300`,\n          ].join('\\n'),\n        },\n        ...(pathStyle\n          ? [\n              {\n                kind: 'note' as GuideBlockKind,\n                text: t('conn.guide.s3.aws.pathStyle'),\n              },\n              {\n                kind: 'code' as GuideBlockKind,\n                caption: '~/.aws/config',\n                code: ['[default]', 's3 =', '    addressing_style = path'].join('\\n'),\n              },\n            ]\n          : []),\n      ],\n    },\n    {\n      id: 'restic',\n      name: 'restic',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.restic.envCaption'),\n          code: [\n            `export AWS_ACCESS_KEY_ID=${akid}`,\n            `export AWS_SECRET_ACCESS_KEY=${secret}`,\n            `export RESTIC_REPOSITORY=\"s3:${endpoint}/${bucket}/restic\"`,\n            'export RESTIC_PASSWORD=…',\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.restic.useCaption'),\n          code: [\n            `restic init${pathStyle ? ' -o s3.bucket-lookup=path' : ''}`,\n            `restic backup ~/Documents${pathStyle ? ' -o s3.bucket-lookup=path' : ''}`,\n            `restic check --read-data${pathStyle ? ' -o s3.bucket-lookup=path' : ''}`,\n            `restic forget --keep-daily 7 --prune${pathStyle ? ' -o s3.bucket-lookup=path' : ''}`,\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.s3.restic.verified') },\n      ],\n    },\n    {\n      id: 'mc',\n      name: 'MinIO Client (mc)',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.mc.aliasCaption'),\n          code: `mc alias set filex ${endpoint} ${akid} ${secret} --api S3v4${pathStyle ? ' --path on' : ''}`,\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.mc.useCaption'),\n          code: [\n            'mc ls filex',\n            `mc cp ./file.pdf filex/${bucket}/file.pdf`,\n            `mc mirror ./local filex/${bucket}/backup`,\n            `mc du filex/${bucket}`,\n          ].join('\\n'),\n        },\n      ],\n    },\n    {\n      id: 's3fs',\n      name: 's3fs (Linux / macOS)',\n      platform: 'linux',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.s3fs.credsCaption'),\n          code: [\n            `echo \"${akid}:${secret}\" > ~/.passwd-s3fs`,\n            'chmod 600 ~/.passwd-s3fs',\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.s3fs.mountCaption'),\n          code: [\n            `s3fs ${bucket} /mnt/filex \\\\`,\n            '  -o passwd_file=~/.passwd-s3fs \\\\',\n            `  -o url=${endpoint} \\\\`,\n            ...(pathStyle ? ['  -o use_path_request_style'] : []),\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.s3.s3fs.note') },\n      ],\n    },\n    {\n      id: 'cyberduck',\n      name: 'Cyberduck / Mountain Duck',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.s3.duck.s1'),\n            t('conn.guide.s3.duck.s2', { host }),\n            t('conn.guide.s3.duck.s3', { key: akid }),\n            t('conn.guide.s3.duck.s4'),\n          ],\n        },\n        ...(pathStyle ? [{ kind: 'warn' as GuideBlockKind, text: t('conn.guide.s3.duck.pathStyle') }] : []),\n      ],\n    },\n    {\n      id: 'sdk',\n      name: 'SDK (Go / Python / JS)',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: 'boto3',\n          code: [\n            'import boto3',\n            's3 = boto3.client(',\n            '    \"s3\",',\n            `    endpoint_url=\"${endpoint}\",`,\n            `    aws_access_key_id=\"${akid}\",`,\n            `    aws_secret_access_key=\"${secret}\",`,\n            '    region_name=\"us-east-1\",',\n            ...(pathStyle\n              ? [\n                  '    config=boto3.session.Config(s3={\"addressing_style\": \"path\"}),',\n                ]\n              : []),\n            ')',\n            `print([o[\"Key\"] for o in s3.list_objects_v2(Bucket=\"${bucket}\").get(\"Contents\", [])])`,\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.s3.sdk.note') },\n      ],\n    },\n  ];\n\n  const notes: GuideBlock[] = [\n    { kind: 'note', text: t('conn.guide.s3.note.buckets') },\n    { kind: 'note', text: t('conn.guide.s3.note.permissions') },\n    { kind: 'note', text: t('conn.guide.s3.note.trash') },\n    { kind: 'note', text: t('conn.guide.s3.note.mtime') },\n  ];\n\n  if (pathStyle) {\n    // First, because it is the one setting that makes a current SDK fail with\n    // a DNS error that names neither filex nor the cause.\n    notes.unshift({ kind: 'warn', text: t('conn.guide.s3.note.pathStyle') });\n  }\n  if (isPlainHttp(endpoint)) {\n    notes.unshift({ kind: 'warn', text: t('conn.guide.s3.note.http') });\n  }\n\n  return {\n    id: 's3',\n    name: 'S3',\n    summary: t('conn.guide.s3.summary'),\n    facts,\n    clients,\n    notes,\n  };\n};\n\n\n// ─────────────────────────────────────────────────────────────────────\n// SFTP\n// ─────────────────────────────────────────────────────────────────────\n\n/**\n * Every command here was RUN against the endpoint on 2026-08-16 with OpenSSH\n * 9.6 and rclone 1.73 — including the two settings rclone needs because filex\n * has no shell, which are the difference between a clean run and a pile of\n * warnings about a missing `md5sum`.\n */\nexport const buildSftpGuide: GuideBuilder = (ctx, t) => {\n  const host = ctx.sftpHost || hostOf(ctx.origin);\n  const port = ctx.sftpPort || 2022;\n  const user = ctx.sftpLogin || userOf(ctx, t);\n  const target = ctx.storage ? `/${ctx.storage}` : '/<storage>';\n  const portFlag = port === 22 ? '' : ` -P ${port}`;\n\n  const facts: GuideFact[] = [\n    { label: t('conn.guide.sftp.fact.host'), value: host, hint: t('conn.guide.sftp.fact.hostHint') },\n    { label: t('conn.guide.sftp.fact.port'), value: String(port), hint: t('conn.guide.sftp.fact.portHint') },\n    { label: t('conn.guide.fact.user'), value: user, hint: t('conn.guide.sftp.fact.userHint') },\n    {\n      label: t('conn.guide.sftp.fact.auth'),\n      value: ctx.sftpHasKey ? t('conn.guide.sftp.fact.authKey') : t('conn.guide.sftp.fact.authPassword'),\n      hint: t('conn.guide.sftp.fact.authHint'),\n      placeholderOnly: true,\n    },\n    { label: t('conn.guide.sftp.fact.path'), value: target, hint: t('conn.guide.sftp.fact.pathHint') },\n  ];\n\n  const clients: GuideClient[] = [\n    {\n      id: 'openssh',\n      name: 'OpenSSH (sftp / scp)',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.sftp.openssh.connectCaption'),\n          code: [\n            `sftp${portFlag} ${user}@${host}`,\n            `scp${portFlag} ./report.pdf ${user}@${host}:${target}/report.pdf`,\n            `scp${portFlag} ${user}@${host}:${target}/report.pdf ./`,\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: '~/.ssh/config',\n          code: [\n            'Host filex',\n            `  HostName ${host}`,\n            `  Port ${port}`,\n            `  User ${user}`,\n            '  # IdentityFile ~/.ssh/id_ed25519',\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.sftp.openssh.noShell') },\n      ],\n    },\n    {\n      id: 'key',\n      name: t('conn.guide.sftp.key.tab'),\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.sftp.key.s1'),\n            t('conn.guide.sftp.key.s2'),\n            t('conn.guide.sftp.key.s3'),\n          ],\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.sftp.key.genCaption'),\n          code: ['ssh-keygen -t ed25519 -C \"filex\"', 'cat ~/.ssh/id_ed25519.pub'].join('\\n'),\n        },\n        // ⚠ The one command people reach for, and the one that cannot work.\n        { kind: 'warn', text: t('conn.guide.sftp.key.noCopyId') },\n      ],\n    },\n    {\n      id: 'winscp',\n      name: 'WinSCP',\n      platform: 'windows',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.sftp.winscp.s1'),\n            t('conn.guide.sftp.winscp.s2', { host, port: String(port) }),\n            t('conn.guide.sftp.winscp.s3', { user }),\n            t('conn.guide.sftp.winscp.s4'),\n          ],\n        },\n      ],\n    },\n    {\n      id: 'filezilla',\n      name: 'FileZilla',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.sftp.filezilla.s1'),\n            t('conn.guide.sftp.filezilla.s2', { host: `sftp://${host}`, port: String(port) }),\n            t('conn.guide.sftp.filezilla.s3', { user }),\n          ],\n        },\n      ],\n    },\n    {\n      id: 'rclone',\n      name: 'rclone',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: '~/.config/rclone/rclone.conf',\n          code: [\n            '[filex-sftp]',\n            'type = sftp',\n            `host = ${host}`,\n            `port = ${port}`,\n            `user = ${user}`,\n            'key_file = ~/.ssh/id_ed25519',\n            '# filex has no shell, so tell rclone not to look for one:',\n            'shell_type = none',\n            'md5sum_command = none',\n            'sha1sum_command = none',\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.sftp.rclone.useCaption'),\n          code: [\n            'rclone lsd filex-sftp:',\n            `rclone copy ./local filex-sftp:${target}/backup -P`,\n            `rclone sync ./local filex-sftp:${target}/backup`,\n          ].join('\\n'),\n        },\n      ],\n    },\n    {\n      id: 'sshfs',\n      name: 'sshfs (Linux / macOS)',\n      platform: 'linux',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.sftp.sshfs.mountCaption'),\n          code: [\n            `sshfs -p ${port} ${user}@${host}:${target} /mnt/filex`,\n            'fusermount -u /mnt/filex',\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.sftp.sshfs.note') },\n      ],\n    },\n  ];\n\n  const notes: GuideBlock[] = [\n    { kind: 'note', text: t('conn.guide.sftp.note.storages') },\n    { kind: 'note', text: t('conn.guide.sftp.note.permissions') },\n    { kind: 'note', text: t('conn.guide.sftp.note.trash') },\n    { kind: 'note', text: t('conn.guide.sftp.note.totp') },\n  ];\n  if (ctx.sftpEnabled === false) {\n    notes.unshift({ kind: 'warn', text: t('conn.guide.sftp.note.disabled') });\n  }\n\n  return {\n    id: 'sftp',\n    name: 'SFTP',\n    summary: t('conn.guide.sftp.summary'),\n    facts,\n    clients,\n    notes,\n  };\n};\n\n\n// ─────────────────────────────────────────────────────────────────────\n// FTPS\n// ─────────────────────────────────────────────────────────────────────\n\n/**\n * Every command here was RUN against the endpoint on 2026-08-16 with curl\n * 8.5, lftp 4.9 and rclone 1.73 — including the settings each of them needs to\n * negotiate explicit TLS, which is the half of FTPS that goes wrong quietly.\n */\nexport const buildFtpsGuide: GuideBuilder = (ctx, t) => {\n  const host = ctx.ftpsHost || hostOf(ctx.origin);\n  const port = ctx.ftpsPort || 2121;\n  const user = ctx.sftpLogin || userOf(ctx, t);\n  const secret = t('conn.guide.secretPlaceholder');\n  const target = ctx.storage ? `/${ctx.storage}` : '/<storage>';\n  const pasv =\n    ctx.ftpsPasvMin && ctx.ftpsPasvMax ? `${ctx.ftpsPasvMin}-${ctx.ftpsPasvMax}` : '30000-30100';\n\n  const facts: GuideFact[] = [\n    { label: t('conn.guide.ftps.fact.host'), value: host, hint: t('conn.guide.ftps.fact.hostHint') },\n    { label: t('conn.guide.ftps.fact.port'), value: String(port), hint: t('conn.guide.ftps.fact.portHint') },\n    { label: t('conn.guide.ftps.fact.mode'), value: t('conn.guide.ftps.fact.modeValue'), hint: t('conn.guide.ftps.fact.modeHint') },\n    { label: t('conn.guide.fact.user'), value: user, hint: t('conn.guide.ftps.fact.userHint') },\n    { label: t('conn.guide.fact.password'), value: secret, hint: t('conn.guide.ftps.fact.passwordHint'), placeholderOnly: true },\n    { label: t('conn.guide.ftps.fact.pasv'), value: pasv, hint: t('conn.guide.ftps.fact.pasvHint') },\n  ];\n\n  const clients: GuideClient[] = [\n    {\n      id: 'filezilla',\n      name: 'FileZilla',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.ftps.filezilla.s1'),\n            t('conn.guide.ftps.filezilla.s2', { host, port: String(port) }),\n            t('conn.guide.ftps.filezilla.s3', { user }),\n            t('conn.guide.ftps.filezilla.s4'),\n          ],\n        },\n      ],\n    },\n    {\n      id: 'winscp',\n      name: 'WinSCP',\n      platform: 'windows',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.ftps.winscp.s1'),\n            t('conn.guide.ftps.winscp.s2', { host, port: String(port) }),\n            t('conn.guide.ftps.winscp.s3', { user }),\n          ],\n        },\n      ],\n    },\n    {\n      id: 'curl',\n      name: 'curl',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.ftps.curl.caption'),\n          code: [\n            `curl --ssl-reqd --ftp-pasv --user ${user} \\\\`,\n            `  -T ./report.pdf \"ftp://${host}:${port}${target}/report.pdf\"`,\n            '',\n            `curl --ssl-reqd --ftp-pasv --user ${user} \\\\`,\n            `  -o ./report.pdf \"ftp://${host}:${port}${target}/report.pdf\"`,\n          ].join('\\n'),\n        },\n        // ⚠ The flag that matters. Without it curl will happily fall back to\n        // plaintext against a server that allows it — this one does not, but\n        // the habit is what protects you against the ones that do.\n        { kind: 'note', text: t('conn.guide.ftps.curl.sslReqd') },\n      ],\n    },\n    {\n      id: 'lftp',\n      name: 'lftp',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: '~/.lftprc',\n          code: [\n            'set ftp:ssl-force true',\n            'set ftp:ssl-protect-data true',\n            'set ftp:passive-mode true',\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.ftps.lftp.caption'),\n          code: [\n            `lftp -u ${user} ftp://${host}:${port}`,\n            `# then: cd ${target}; put ./report.pdf; ls`,\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.ftps.lftp.protectData') },\n      ],\n    },\n    {\n      id: 'rclone',\n      name: 'rclone',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: '~/.config/rclone/rclone.conf',\n          code: [\n            '[filex-ftp]',\n            'type = ftp',\n            `host = ${host}`,\n            `port = ${port}`,\n            `user = ${user}`,\n            '# rclone obscure \"<your password>\"',\n            'pass = …',\n            'explicit_tls = true',\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.ftps.rclone.useCaption'),\n          code: [\n            'rclone lsd filex-ftp:',\n            `rclone copy ./local filex-ftp:${target}/backup -P`,\n          ].join('\\n'),\n        },\n      ],\n    },\n    {\n      id: 'printer',\n      name: t('conn.guide.ftps.printer.tab'),\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.ftps.printer.s1', { host, port: String(port) }),\n            t('conn.guide.ftps.printer.s2', { user }),\n            t('conn.guide.ftps.printer.s3', { path: target }),\n            t('conn.guide.ftps.printer.s4'),\n          ],\n        },\n        // ⚠ The honest warning: plenty of scan-to-FTP firmware cannot do TLS\n        // at all, and this endpoint will not talk to it. Saying so beats an\n        // afternoon spent debugging a device that was never going to connect.\n        { kind: 'warn', text: t('conn.guide.ftps.printer.noTLS') },\n      ],\n    },\n  ];\n\n  const notes: GuideBlock[] = [\n    { kind: 'warn', text: t('conn.guide.ftps.note.tls') },\n    { kind: 'note', text: t('conn.guide.ftps.note.passive') },\n    { kind: 'note', text: t('conn.guide.ftps.note.storages') },\n    { kind: 'note', text: t('conn.guide.ftps.note.trash') },\n    { kind: 'note', text: t('conn.guide.ftps.note.prefer') },\n  ];\n  if (ctx.ftpsSelfSigned) {\n    notes.push({ kind: 'warn', text: t('conn.guide.ftps.note.selfSigned') });\n  }\n  if (ctx.ftpsEnabled === false) {\n    notes.unshift({ kind: 'warn', text: t('conn.guide.ftps.note.disabled') });\n  }\n\n  return {\n    id: 'ftps',\n    name: 'FTPS',\n    summary: t('conn.guide.ftps.summary'),\n    facts,\n    clients,\n    notes,\n  };\n};\n\n\n// ─────────────────────────────────────────────────────────────────────\n// NFS\n// ─────────────────────────────────────────────────────────────────────\n\n/**\n * Every command here was RUN against the endpoint on 2026-08-16 with the LINUX\n * KERNEL's own NFSv3 client — including the two options a mount fails silently\n * without (`port=` and `mountport=`, because filex serves both on one port and\n * runs no portmapper).\n */\nexport const buildNfsGuide: GuideBuilder = (ctx, t) => {\n  const host = ctx.nfsHost || hostOf(ctx.origin);\n  const port = ctx.nfsPort || 2049;\n  const path = ctx.nfsPath || t('conn.guide.nfs.pathPlaceholder');\n  const ro = ctx.nfsReadOnly ? ',ro' : '';\n  const opts = `nfsvers=3,tcp,port=${port},mountport=${port},nolock${ro}`;\n\n  const facts: GuideFact[] = [\n    { label: t('conn.guide.nfs.fact.host'), value: host, hint: t('conn.guide.nfs.fact.hostHint') },\n    { label: t('conn.guide.nfs.fact.port'), value: String(port), hint: t('conn.guide.nfs.fact.portHint') },\n    {\n      label: t('conn.guide.nfs.fact.export'),\n      value: path,\n      hint: t('conn.guide.nfs.fact.exportHint'),\n      // ⚠ Only real right after minting: the path is stored hashed and cannot\n      // be shown again, and printing something path-shaped would produce a\n      // mount line that fails with no clue why.\n      placeholderOnly: !ctx.nfsPath,\n    },\n    { label: t('conn.guide.nfs.fact.options'), value: opts, hint: t('conn.guide.nfs.fact.optionsHint') },\n  ];\n\n  const clients: GuideClient[] = [\n    {\n      id: 'linux',\n      name: 'Linux',\n      platform: 'linux',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.nfs.linux.mountCaption'),\n          code: [\n            'sudo mkdir -p /mnt/filex',\n            `sudo mount -t nfs -o ${opts} ${host}:${path} /mnt/filex`,\n            '',\n            '# and to unmount:',\n            'sudo umount /mnt/filex',\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: '/etc/fstab',\n          code: `${host}:${path}  /mnt/filex  nfs  ${opts},_netdev,noauto,x-systemd.automount  0  0`,\n        },\n        // ⚠ The warning that belongs next to the fstab line rather than in a\n        // document: that file is world-readable on most systems.\n        { kind: 'warn', text: t('conn.guide.nfs.linux.fstabSecret') },\n      ],\n    },\n    {\n      id: 'macos',\n      name: 'macOS',\n      platform: 'macos',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.nfs.mac.mountCaption'),\n          code: [\n            'sudo mkdir -p /Volumes/filex',\n            `sudo mount -t nfs -o vers=3,tcp,port=${port},mountport=${port},nolock${ro},resvport ${host}:${path} /Volumes/filex`,\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.nfs.mac.resvport') },\n      ],\n    },\n    {\n      id: 'windows',\n      name: 'Windows (Client for NFS)',\n      platform: 'windows',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.nfs.win.s1'),\n            t('conn.guide.nfs.win.s2'),\n            t('conn.guide.nfs.win.s3'),\n          ],\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.nfs.win.cmdCaption'),\n          code: `mount -o anon nolock ${host}:${path} Z:`,\n        },\n        // ⚠ Windows' client has no way to say \"the mount service is on this\n        // port\", so it only works when filex is on 2049.\n        { kind: 'warn', text: t('conn.guide.nfs.win.port') },\n      ],\n    },\n    {\n      id: 'synology',\n      name: t('conn.guide.nfs.nas.tab'),\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.nfs.nas.s1', { host, port: String(port) }),\n            t('conn.guide.nfs.nas.s2'),\n            t('conn.guide.nfs.nas.s3'),\n          ],\n        },\n      ],\n    },\n  ];\n\n  const notes: GuideBlock[] = [\n    { kind: 'warn', text: t('conn.guide.nfs.note.unencrypted') },\n    { kind: 'warn', text: t('conn.guide.nfs.note.pathIsSecret') },\n    { kind: 'note', text: t('conn.guide.nfs.note.noPortmapper') },\n    { kind: 'note', text: t('conn.guide.nfs.note.uid') },\n    { kind: 'note', text: t('conn.guide.nfs.note.trash') },\n    { kind: 'note', text: t('conn.guide.nfs.note.revoke') },\n  ];\n  if (ctx.nfsEnabled === false) {\n    notes.unshift({ kind: 'warn', text: t('conn.guide.nfs.note.disabled') });\n  }\n\n  return {\n    id: 'nfs',\n    name: 'NFS',\n    summary: t('conn.guide.nfs.summary'),\n    facts,\n    clients,\n    notes,\n  };\n};\n\n\n// ─────────────────────────────────────────────────────────────────────\n// filex mount (FUSE)\n// ─────────────────────────────────────────────────────────────────────\n\n/**\n * `filex mount` is the odd one out here: there is no server to point a\n * third-party client at, because filex's OWN binary is the client. It speaks\n * the REST API over the same HTTPS the browser uses, which is what makes it\n * the only one of these that works from anywhere — NFS needs a LAN, SFTP needs\n * sshfs or WinFsp already configured, and this needs a URL and a token.\n *\n * ⚠ It is not a sync. Nothing is copied except a bounded read cache, so it\n * opens one file out of a hundred thousand without downloading the rest;\n * `filex sync` is still the answer for having the files offline. The guide says\n * so, because somebody who picks the wrong one finds out slowly.\n */\nexport const buildMountGuide: GuideBuilder = (ctx, t) => {\n  const origin = ctx.origin.replace(/\\/+$/, '');\n  const storage = ctx.storage || ctx.storages[0] || 'main';\n\n  const facts: GuideFact[] = [\n    { label: t('conn.guide.mount.fact.url'), value: origin, hint: t('conn.guide.mount.fact.urlHint') },\n    {\n      label: t('conn.guide.mount.fact.token'),\n      value: t('conn.guide.mount.fact.tokenPlaceholder'),\n      hint: t('conn.guide.mount.fact.tokenHint'),\n      // filex never has the plaintext of a token after it is minted, and a\n      // fact row that looked like one would be a lie the user pastes.\n      placeholderOnly: true,\n    },\n    { label: t('conn.guide.mount.fact.remote'), value: `${storage}://`, hint: t('conn.guide.mount.fact.remoteHint') },\n  ];\n\n  const clients: GuideClient[] = [\n    {\n      id: 'linux',\n      name: 'Linux',\n      platform: 'linux',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.mount.linux.mountCaption'),\n          code: [\n            `export FILEX_URL=${origin}`,\n            'export FILEX_TOKEN=<token>',\n            '',\n            'mkdir -p ~/filex',\n            'filex mount ~/filex',\n            '',\n            `# one storage only, or a subfolder of it:`,\n            `filex mount --remote '${storage}://' ~/filex`,\n            `filex mount --remote '${storage}://projects/acme' --read-only ~/acme`,\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.mount.linux.umountCaption'),\n          code: 'fusermount -u ~/filex',\n        },\n        // ⚠ The one that costs an afternoon if it is not said: killing the\n        // process leaves a directory where every `ls` hangs.\n        { kind: 'warn', text: t('conn.guide.mount.linux.umountWarn') },\n        {\n          kind: 'code',\n          caption: t('conn.guide.mount.linux.systemdCaption'),\n          code: [\n            '# ~/.config/systemd/user/filex-mount.service',\n            '[Unit]',\n            'Description=filex mount',\n            'After=network-online.target',\n            '',\n            '[Service]',\n            `Environment=FILEX_URL=${origin}`,\n            'Environment=FILEX_TOKEN=<token>',\n            'ExecStart=%h/.local/bin/filex mount %h/filex',\n            'ExecStop=/bin/fusermount -u %h/filex',\n            'Restart=on-failure',\n            '',\n            '[Install]',\n            'WantedBy=default.target',\n          ].join('\\n'),\n        },\n      ],\n    },\n    {\n      id: 'windows',\n      name: 'Windows',\n      platform: 'windows',\n      blocks: [\n        { kind: 'note', text: t('conn.guide.mount.win.winfsp') },\n        {\n          kind: 'code',\n          caption: t('conn.guide.mount.win.mountCaption'),\n          code: [\n            `$env:FILEX_URL   = \"${origin}\"`,\n            '$env:FILEX_TOKEN = \"<token>\"',\n            '',\n            'filex mount Z:',\n          ].join('\\n'),\n        },\n        // ⚠ The drive letter is CREATED, not reused — pointing it at one that\n        // already exists is the commonest way this fails, and the message the\n        // driver gives for it says nothing useful.\n        { kind: 'warn', text: t('conn.guide.mount.win.freeLetter') },\n        { kind: 'note', text: t('conn.guide.mount.win.stop') },\n      ],\n    },\n    {\n      id: 'macos',\n      name: 'macOS',\n      platform: 'macos',\n      blocks: [\n        // ⚠⚠ A refusal stated up front rather than discovered. macFUSE's Go\n        // binding needs a C toolchain filex deliberately does not use, and its\n        // licence forbids a commercial program from installing it. Pretending\n        // otherwise would mean a command that appears to work and does nothing.\n        { kind: 'warn', text: t('conn.guide.mount.mac.unsupported') },\n        { kind: 'note', text: t('conn.guide.mount.mac.alternatives') },\n      ],\n    },\n  ];\n\n  const notes: GuideBlock[] = [\n    { kind: 'note', text: t('conn.guide.mount.note.notASync') },\n    { kind: 'note', text: t('conn.guide.mount.note.reachable') },\n    { kind: 'note', text: t('conn.guide.mount.note.wholeFileWrites') },\n    { kind: 'note', text: t('conn.guide.mount.note.trash') },\n    { kind: 'note', text: t('conn.guide.mount.note.revoke') },\n  ];\n\n  return {\n    id: 'mount',\n    name: 'filex mount',\n    summary: t('conn.guide.mount.summary'),\n    facts,\n    clients,\n    notes,\n  };\n};\n\n// ─────────────────────────────────────────────────────────────────────\n// Registry\n// ─────────────────────────────────────────────────────────────────────\n\n/**\n * Protocol id → builder.\n *\n * S3 and SFTP land here as one entry each once their servers exist; the\n * panel, the copy buttons, the client tabs and the i18n plumbing are\n * already written for them. That is the whole point of the shape.\n */\nexport const GUIDE_BUILDERS: Record<string, GuideBuilder> = {\n  webdav: buildWebdavGuide,\n  s3: buildS3Guide,\n  sftp: buildSftpGuide,\n  ftps: buildFtpsGuide,\n  nfs: buildNfsGuide,\n  mount: buildMountGuide,\n};\n\n/**\n * Display name per protocol id.\n *\n * ⚠ Not `id.toUpperCase()`, which the picker used to do. That reads fine for\n * S3 and NFS and turns `filex mount` into \"MOUNT\" — a name for a thing that is\n * not a protocol at all, in a list where every other entry is one.\n */\nexport const GUIDE_NAMES: Record<string, string> = {\n  webdav: 'WebDAV',\n  s3: 'S3',\n  sftp: 'SFTP',\n  ftps: 'FTPS',\n  nfs: 'NFS',\n  mount: 'filex mount',\n};\n\n/** The label to show for a protocol id in a picker. */\nexport function guideName(id: string): string {\n  return GUIDE_NAMES[id] || id.toUpperCase();\n}\n\n/** Protocol ids that have a guide, in display order. */\nexport function guideProtocols(): string[] {\n  return Object.keys(GUIDE_BUILDERS);\n}\n\nexport function buildGuide(\n  protocol: string,\n  ctx: GuideContext,\n  t: Translate,\n): ProtocolGuide | null {\n  const builder = GUIDE_BUILDERS[protocol];\n  return builder ? builder(ctx, t) : null;\n}\n","<script setup lang=\"ts\">\n/**\n * ConnectionGuideView — renders one `ProtocolGuide`.\n *\n * The guide itself is generated from the live deployment\n * (`lib/connectionGuides.ts`); this component only draws it. Keeping the\n * two apart is what lets S3 and SFTP arrive as a builder each rather than\n * as a second page with its own copy buttons and its own bugs.\n */\nimport { computed, ref } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { GuideBlock, ProtocolGuide } from '../lib/connectionGuides';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = defineProps<{\n  guide: ProtocolGuide;\n  locale: LocaleCode;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst activeClient = ref<string>(props.guide.clients[0]?.id ?? '');\nconst copied = ref<string | null>(null);\nlet copyTimer: ReturnType<typeof setTimeout> | null = null;\n\nconst client = computed(\n  () => props.guide.clients.find((c) => c.id === activeClient.value) ?? props.guide.clients[0],\n);\n\n/**\n * Copy, with a fallback.\n *\n * `navigator.clipboard` needs a secure context. The desktop app's `app://`\n * scheme is registered secure, and the web app is on https — but an embed\n * on plain http is a real deployment too, and a copy button that silently\n * does nothing there is worse than no button.\n */\nasync function copy(text: string, id: string) {\n  let ok = false;\n  try {\n    await navigator.clipboard.writeText(text);\n    ok = true;\n  } catch {\n    try {\n      const ta = document.createElement('textarea');\n      ta.value = text;\n      ta.setAttribute('readonly', '');\n      ta.style.position = 'fixed';\n      ta.style.opacity = '0';\n      document.body.appendChild(ta);\n      ta.select();\n      ok = document.execCommand('copy');\n      document.body.removeChild(ta);\n    } catch {\n      ok = false;\n    }\n  }\n  copied.value = ok ? id : null;\n  if (copyTimer) clearTimeout(copyTimer);\n  copyTimer = setTimeout(() => {\n    copied.value = null;\n  }, 1600);\n}\n\nfunction blockId(prefix: string, i: number): string {\n  return `${prefix}-${i}`;\n}\n\nfunction isCode(b: GuideBlock): boolean {\n  return b.kind === 'code';\n}\n</script>\n\n<template>\n  <div class=\"fe-guide\">\n    <p class=\"fe-guide__summary\">{{ guide.summary }}</p>\n\n    <!-- The facts. This is the part that makes the page worth generating:\n         the real host, the real storage, the caller's own username. -->\n    <section class=\"fe-guide__facts\" data-testid=\"guide-facts\">\n      <div v-for=\"(f, i) in guide.facts\" :key=\"f.label\" class=\"fe-guide__fact\">\n        <span class=\"fe-guide__factlabel\">{{ f.label }}</span>\n        <span class=\"fe-guide__factvalue\">\n          <code :class=\"{ 'fe-guide__ph': f.placeholderOnly }\">{{ f.value }}</code>\n          <button\n            v-if=\"!f.placeholderOnly\"\n            type=\"button\"\n            class=\"fe-guide__copy\"\n            :data-testid=\"`copy-fact-${i}`\"\n            @click=\"copy(f.value, blockId('fact', i))\"\n          >\n            {{ copied === blockId('fact', i) ? t('conn.guide.copied') : t('conn.guide.copy') }}\n          </button>\n        </span>\n        <span v-if=\"f.hint\" class=\"fe-guide__facthint\">{{ f.hint }}</span>\n      </div>\n    </section>\n\n    <!-- One tab per client. A \"how to connect\" page that covers one OS is a\n         page most readers bounce off. -->\n    <nav class=\"fe-guide__tabs\" role=\"tablist\">\n      <button\n        v-for=\"c in guide.clients\"\n        :key=\"c.id\"\n        type=\"button\"\n        role=\"tab\"\n        class=\"fe-guide__tab\"\n        :class=\"{ 'is-active': client && c.id === client.id }\"\n        :aria-selected=\"client && c.id === client.id\"\n        :data-testid=\"`guide-tab-${c.id}`\"\n        @click=\"activeClient = c.id\"\n      >\n        {{ c.name }}\n      </button>\n    </nav>\n\n    <div v-if=\"client\" class=\"fe-guide__body\" role=\"tabpanel\">\n      <template v-for=\"(b, i) in client.blocks\" :key=\"i\">\n        <ol v-if=\"b.kind === 'steps'\" class=\"fe-guide__steps\">\n          <li v-for=\"(s, j) in b.steps ?? []\" :key=\"j\">{{ s }}</li>\n        </ol>\n        <div v-else-if=\"isCode(b)\" class=\"fe-guide__codewrap\">\n          <div class=\"fe-guide__codehead\">\n            <span class=\"fe-guide__caption\">{{ b.caption }}</span>\n            <button\n              type=\"button\"\n              class=\"fe-guide__copy\"\n              :data-testid=\"`copy-code-${i}`\"\n              @click=\"copy(b.code ?? '', blockId(client.id, i))\"\n            >\n              {{ copied === blockId(client.id, i) ? t('conn.guide.copied') : t('conn.guide.copy') }}\n            </button>\n          </div>\n          <pre class=\"fe-guide__code\"><code>{{ b.code }}</code></pre>\n        </div>\n        <p v-else-if=\"b.kind === 'warn'\" class=\"fe-guide__warn\">{{ b.text }}</p>\n        <p v-else-if=\"b.kind === 'note'\" class=\"fe-guide__note\">{{ b.text }}</p>\n        <p v-else class=\"fe-guide__text\">{{ b.text }}</p>\n      </template>\n    </div>\n\n    <section v-if=\"guide.notes.length\" class=\"fe-guide__notes\">\n      <h4 class=\"fe-guide__notestitle\">{{ t('conn.guide.goodToKnow') }}</h4>\n      <p\n        v-for=\"(n, i) in guide.notes\"\n        :key=\"i\"\n        :class=\"n.kind === 'warn' ? 'fe-guide__warn' : 'fe-guide__note'\"\n      >\n        {{ n.text }}\n      </p>\n    </section>\n  </div>\n</template>\n\n<style>\n.fe-guide {\n  display: flex;\n  flex-direction: column;\n  gap: 16px;\n}\n.fe-guide__summary {\n  margin: 0;\n  color: var(--fe-text-muted);\n  font-size: 13.5px;\n  line-height: 1.55;\n}\n.fe-guide__facts {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius);\n  background: var(--fe-bg-elev);\n  padding: 12px 14px;\n}\n.fe-guide__fact {\n  display: grid;\n  grid-template-columns: minmax(120px, 180px) 1fr;\n  gap: 4px 14px;\n  align-items: baseline;\n}\n.fe-guide__factlabel {\n  font-size: 12.5px;\n  font-weight: 600;\n  color: var(--fe-text-muted);\n}\n.fe-guide__factvalue {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  min-width: 0;\n  flex-wrap: wrap;\n}\n.fe-guide__factvalue code {\n  font-family: var(--fe-font-mono);\n  font-size: 12.5px;\n  color: var(--fe-text);\n  background: var(--fe-bg);\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius-sm);\n  padding: 2px 6px;\n  overflow-wrap: anywhere;\n}\n.fe-guide__ph {\n  color: var(--fe-text-muted) !important;\n  font-style: italic;\n}\n.fe-guide__facthint {\n  grid-column: 2;\n  font-size: 12px;\n  color: var(--fe-text-muted);\n}\n.fe-guide__tabs {\n  display: flex;\n  gap: 4px;\n  flex-wrap: wrap;\n  border-bottom: 1px solid var(--fe-border);\n  padding-bottom: 2px;\n}\n.fe-guide__tab {\n  font: inherit;\n  font-size: 13px;\n  border: 0;\n  background: none;\n  color: var(--fe-text-muted);\n  padding: 6px 10px;\n  border-radius: var(--fe-radius-sm) var(--fe-radius-sm) 0 0;\n  cursor: pointer;\n  border-bottom: 2px solid transparent;\n}\n.fe-guide__tab:hover {\n  color: var(--fe-text);\n  background: var(--fe-bg-hover);\n}\n.fe-guide__tab.is-active {\n  color: var(--fe-primary);\n  border-bottom-color: var(--fe-primary);\n  font-weight: 600;\n}\n.fe-guide__body {\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n}\n.fe-guide__steps {\n  margin: 0;\n  padding-inline-start: 20px;\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  font-size: 13.5px;\n  line-height: 1.55;\n  color: var(--fe-text);\n}\n.fe-guide__codewrap {\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius);\n  overflow: hidden;\n  background: var(--fe-bg-elev);\n}\n.fe-guide__codehead {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 10px;\n  padding: 6px 10px;\n  border-bottom: 1px solid var(--fe-border);\n}\n.fe-guide__caption {\n  font-size: 12px;\n  color: var(--fe-text-muted);\n  font-family: var(--fe-font-mono);\n  overflow-wrap: anywhere;\n}\n.fe-guide__code {\n  margin: 0;\n  padding: 10px 12px;\n  /* Wide command lines scroll INSIDE the block. Without this the whole\n     settings surface grows a horizontal scrollbar and the layout around\n     it breaks — the same failure the tab strip had. */\n  overflow-x: auto;\n  font-family: var(--fe-font-mono);\n  font-size: 12.5px;\n  line-height: 1.6;\n  color: var(--fe-text);\n  white-space: pre;\n}\n.fe-guide__copy {\n  font: inherit;\n  font-size: 12px;\n  border: 1px solid var(--fe-border-strong);\n  background: var(--fe-bg);\n  color: var(--fe-text);\n  border-radius: var(--fe-radius-sm);\n  padding: 3px 9px;\n  cursor: pointer;\n  flex: 0 0 auto;\n}\n.fe-guide__copy:hover {\n  border-color: var(--fe-primary);\n  color: var(--fe-primary);\n}\n.fe-guide__note,\n.fe-guide__warn,\n.fe-guide__text {\n  margin: 0;\n  font-size: 12.5px;\n  line-height: 1.55;\n}\n.fe-guide__text {\n  color: var(--fe-text);\n}\n.fe-guide__note {\n  color: var(--fe-text-muted);\n}\n.fe-guide__warn {\n  color: var(--fe-danger);\n}\n.fe-guide__notes {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  border-top: 1px solid var(--fe-border);\n  padding-top: 12px;\n}\n.fe-guide__notestitle {\n  margin: 0;\n  font-size: 12px;\n  text-transform: uppercase;\n  letter-spacing: 0.05em;\n  color: var(--fe-text-muted);\n}\n</style>\n","/**\n * useS3Keys — the one client for the S3 access-key surface.\n *\n * It goes through `useFileApi`, the same auth plumbing the explorer uses, so\n * the desktop app's function-token, the web app's cookie and an embedder's\n * bearer all work here without this file knowing which is which.\n *\n * ⚠ Every surface mounts THIS, not a copy. The keys panel, the guide and the\n * copy buttons exist once in `packages/core`; the web app and the desktop app\n * render the same component. That is the standing rule (\"never write\n * surface-specific behaviour\") applied to a credential surface, where a\n * divergence would mean one surface handing out keys the other cannot revoke.\n */\n\nimport { computed, ref, shallowRef } from 'vue';\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { S3AccessKey, S3Connection, S3KeyCreated, S3KeyRequest } from '../types/S3Keys';\nimport { connectionsBase } from './useConnections';\nimport { useFileApi } from './useFileApi';\nimport { serverWords } from '../lib/errorWords';\n\nexport function useS3Keys(config: ExplorerConfig) {\n  const api = useFileApi(config);\n  const base = connectionsBase(config);\n  const url = (path: string) => `${base}${path}`;\n\n  const keys = shallowRef<S3AccessKey[]>([]);\n  const connection = ref<S3Connection | null>(null);\n  const loading = ref(false);\n  const loaded = ref(false);\n  const error = ref<string | null>(null);\n  /** The fix, when the server told THIS caller one (`admin_hint`: only an\n   *  administrator who can act on it is sent it). */\n  const errorHint = ref<string | null>(null);\n  /**\n   * null until the first load answers. False means the caller may not mint\n   * keys (anonymous, or a token without the right to) — the guide is still\n   * worth showing, so this is a fact rather than an error.\n   */\n  const canMint = ref<boolean | null>(null);\n\n  /** The secret, held in memory for exactly as long as the user is looking. */\n  const revealed = ref<S3KeyCreated | null>(null);\n\n  /** A refusal, said — lib/errorWords `serverWords`, the one rule every\n   *  connection panel shares (it used to print the server's `error` field as\n   *  it came: an environment variable, to a regular user). ⚠ The locale is\n   *  passed because what comes back may be the SERVER's own sentence: it\n   *  never met a translator, and an Arabic panel needs its machine runs\n   *  isolated (lib/direction `foreignText`). */\n  function messageOf(e: unknown): string {\n    errorHint.value = (e as { hint?: string } | null)?.hint ?? null;\n    return serverWords(e, config.locale);\n  }\n\n  function statusOf(e: unknown): number | undefined {\n    return (e as { status?: number } | null)?.status;\n  }\n\n  async function load(): Promise<void> {\n    loading.value = true;\n    error.value = null;\n    errorHint.value = null;\n    try {\n      const body = await api.jsonFetch<{ keys: S3AccessKey[] } & S3Connection>(\n        url('/api/auth/s3-keys'),\n      );\n      keys.value = Array.isArray(body?.keys) ? body.keys : [];\n      connection.value = {\n        endpoint: body?.endpoint ?? '',\n        enabled: body?.enabled !== false,\n        path_style: body?.path_style !== false,\n      };\n      canMint.value = true;\n    } catch (e) {\n      keys.value = [];\n      const st = statusOf(e);\n      if (st === 401 || st === 403) {\n        canMint.value = false;\n      } else {\n        canMint.value = false;\n        error.value = messageOf(e);\n      }\n    } finally {\n      loading.value = false;\n      loaded.value = true;\n    }\n  }\n\n  /**\n   * Mint a key. The secret comes back once and is held in `revealed` until\n   * the caller dismisses it — there is no second chance, so the UI must not\n   * navigate away from it on its own.\n   */\n  async function create(req: S3KeyRequest): Promise<S3KeyCreated | null> {\n    error.value = null;\n    errorHint.value = null;\n    try {\n      const body = await api.jsonFetch<S3KeyCreated>(url('/api/auth/s3-keys'), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(req),\n      });\n      revealed.value = body;\n      if (body?.endpoint) {\n        connection.value = {\n          endpoint: body.endpoint,\n          enabled: body.enabled !== false,\n          path_style: body.path_style !== false,\n        };\n      }\n      await load();\n      return body;\n    } catch (e) {\n      error.value = messageOf(e);\n      return null;\n    }\n  }\n\n  async function setDisabled(id: number, disabled: boolean): Promise<void> {\n    error.value = null;\n    errorHint.value = null;\n    try {\n      await api.jsonFetch(url(`/api/auth/s3-keys/${id}/state`), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ disabled }),\n      });\n      await load();\n    } catch (e) {\n      error.value = messageOf(e);\n    }\n  }\n\n  async function remove(id: number): Promise<void> {\n    error.value = null;\n    errorHint.value = null;\n    try {\n      await api.jsonFetch(url(`/api/auth/s3-keys/${id}`), { method: 'DELETE' });\n      // A revealed secret belonging to the key just revoked must go with it.\n      if (revealed.value?.key?.id === id) revealed.value = null;\n      await load();\n    } catch (e) {\n      error.value = messageOf(e);\n    }\n  }\n\n  function dismissSecret() {\n    revealed.value = null;\n  }\n\n  /**\n   * The key a guide should be rendered with: the one just minted, else the\n   * newest usable one. A guide showing a DISABLED key's id would produce a\n   * paste that authenticates as nothing.\n   */\n  const guideKey = computed<S3AccessKey | null>(() => {\n    if (revealed.value?.key) return revealed.value.key;\n    const usable = keys.value.filter((k) => !k.disabled_at);\n    if (!usable.length) return null;\n    return usable.reduce((a, b) => (a.created_at >= b.created_at ? a : b));\n  });\n\n  return {\n    keys,\n    connection,\n    loading,\n    loaded,\n    error,\n    errorHint,\n    canMint,\n    revealed,\n    guideKey,\n    load,\n    create,\n    setDisabled,\n    remove,\n    dismissSecret,\n  };\n}\n","<script setup lang=\"ts\">\n/**\n * S3KeysPanel — mint, list and revoke the caller's own S3 access keys.\n *\n * It sits above the S3 guide because the guide is only worth anything with a\n * real key in it: the commands below fill in the access key id automatically,\n * and the secret right after minting, which is the difference between a\n * document and a working paste.\n *\n * ⚠⚠ One component, every surface. The desktop app and the web app mount this\n * same file; neither owns a copy of the form or the revoke button. A credential\n * surface is the worst possible place for two implementations — one of them\n * would eventually hand out keys the other cannot revoke.\n *\n * ⚠ The secret leaves the server exactly once. Nothing here re-fetches it,\n * nothing stores it, and it is dropped from memory when the user dismisses it\n * or revokes the key — so the panel cannot become a place where a credential\n * quietly persists.\n */\nimport { computed, onMounted, ref } from 'vue';\nimport type { ExplorerConfig, LocaleCode } from '../types/ExplorerConfig';\nimport type { S3AccessKey } from '../types/S3Keys';\nimport { useLocale } from '../composables/useLocale';\nimport { useS3Keys } from '../composables/useS3Keys';\nimport DataTable, { type DataColumn } from './DataTable.vue';\nimport ChoiceSelect, { type SelectOption } from './ChoiceSelect.vue';\nimport type { ContextAction } from './ContextMenu.vue';\nimport { resolveLocale } from '../locales/resolve';\n\nconst props = defineProps<{\n  config: ExplorerConfig;\n  /** Storage names the caller may see, for the confinement picker. */\n  storages: string[];\n}>();\n\nconst emit = defineEmits<{\n  /** The key a guide should render with, and its one-time secret. */\n  (e: 'active', v: { accessKeyID: string; secret?: string; endpoint: string; pathStyle: boolean }): void;\n}>();\n\nconst locale = computed<LocaleCode>(() => resolveLocale(props.config.locale));\nconst { t, formatDate } = useLocale(locale);\n\nconst {\n  keys,\n  connection,\n  loading,\n  error,\n  errorHint,\n  canMint,\n  revealed,\n  guideKey,\n  load,\n  create,\n  setDisabled,\n  remove,\n  dismissSecret,\n} = useS3Keys(props.config);\n\nconst label = ref('');\nconst bucket = ref('');\n/* Which bucket the key is limited to (#160: the shared list, no native select). */\nconst bucketChoices = computed<SelectOption[]>(() => [\n  { value: '', label: t('conn.s3keys.everyBucket') },\n  ...props.storages.map((s) => ({ value: s, label: s })),\n]);\nconst prefix = ref('');\nconst busy = ref(false);\nconst confirmRevoke = ref<number | null>(null);\nconst copied = ref<string | null>(null);\nlet copyTimer: ReturnType<typeof setTimeout> | null = null;\n\n/** Publish whatever the guide should render with, whenever it changes. */\nfunction publish() {\n  const conn = connection.value;\n  if (!conn) return;\n  emit('active', {\n    accessKeyID: guideKey.value?.access_key_id ?? '',\n    // Only the freshly minted one. Re-emitting a stale secret would put a\n    // dead credential into the commands.\n    secret: revealed.value?.key?.id === guideKey.value?.id ? revealed.value?.secret : undefined,\n    endpoint: conn.endpoint,\n    pathStyle: conn.path_style,\n  });\n}\n\nonMounted(async () => {\n  await load();\n  publish();\n});\n\nasync function mint() {\n  busy.value = true;\n  try {\n    await create({\n      label: label.value.trim() || t('conn.s3keys.defaultLabel'),\n      bucket: bucket.value.trim() || undefined,\n      prefix: prefix.value.trim() || undefined,\n    });\n    label.value = '';\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\n/**\n * The row's verbs. They used to be two loose text buttons in the last cell;\n * they are now the entries behind the row's one `Actions` control\n * (RowActions → ContextMenu, the menu the explorer's ⋮ opens).\n *\n * ⚠ `revoke` keeps its two-step confirmation exactly as it was: the first\n * pick arms it and the label becomes \"Confirm\", the second pick revokes.\n * Nothing about a credential's destruction got easier in the move.\n */\nfunction rowActions(k: S3AccessKey): ContextAction[] {\n  /* The whole control used to be `:disabled=\"busy\"`; the table draws the\n     control now, so each verb carries it and RowActions greys a button with\n     nothing usable behind it. */\n  return [\n    {\n      key: 'toggle',\n      label: k.disabled_at ? t('conn.s3keys.enable') : t('conn.s3keys.disable'),\n      icon: k.disabled_at ? 'check' : 'lock',\n      disabled: busy.value,\n    },\n    {\n      key: 'revoke',\n      label: confirmRevoke.value === k.id ? t('conn.s3keys.confirm') : t('conn.s3keys.revoke'),\n      icon: 'delete',\n      danger: true,\n      disabled: busy.value,\n    },\n  ];\n}\n\n/** The list's columns — the product's one table (DataTable). */\nconst columns = computed<DataColumn<S3AccessKey>[]>(() => [\n  {\n    id: 'label',\n    label: t('conn.s3keys.col.label'),\n    sortable: true,\n    width: 180,\n    format: (k) => k.label || t('conn.s3keys.noLabel'),\n  },\n  {\n    id: 'key',\n    label: t('conn.s3keys.col.key'),\n    sortable: true,\n    width: 200,\n    sortValue: (k) => k.access_key_id,\n    title: (k) => k.access_key_id,\n  },\n  { id: 'scope', label: t('conn.s3keys.col.scope'), sortable: true, width: 160, format: scopeOf },\n  {\n    id: 'lastUsed',\n    label: t('conn.s3keys.col.lastUsed'),\n    sortable: true,\n    sortDir: 'desc',\n    width: 140,\n    format: (k) => (k.last_used_at ? shortDate(k.last_used_at) : t('conn.s3keys.neverUsed')),\n    sortValue: (k) => (k.last_used_at ? new Date(k.last_used_at).getTime() : null),\n  },\n]);\n\nfunction onRowAction(key: string, k: S3AccessKey) {\n  if (key === 'toggle') void toggle(k);\n  else if (key === 'revoke') void revoke(k);\n}\n\nasync function toggle(k: S3AccessKey) {\n  busy.value = true;\n  try {\n    await setDisabled(k.id, !k.disabled_at);\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\nasync function revoke(k: S3AccessKey) {\n  if (confirmRevoke.value !== k.id) {\n    confirmRevoke.value = k.id;\n    return;\n  }\n  confirmRevoke.value = null;\n  busy.value = true;\n  try {\n    await remove(k.id);\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\n/**\n * Copy, with the same fallback the guide uses: `navigator.clipboard` needs a\n * secure context, and an embed on plain http is a real deployment.\n */\nasync function copy(text: string, id: string) {\n  let ok = false;\n  try {\n    await navigator.clipboard.writeText(text);\n    ok = true;\n  } catch {\n    try {\n      const ta = document.createElement('textarea');\n      ta.value = text;\n      ta.setAttribute('readonly', '');\n      ta.style.position = 'fixed';\n      ta.style.opacity = '0';\n      document.body.appendChild(ta);\n      ta.select();\n      ok = document.execCommand('copy');\n      document.body.removeChild(ta);\n    } catch {\n      ok = false;\n    }\n  }\n  if (!ok) return;\n  copied.value = id;\n  if (copyTimer) clearTimeout(copyTimer);\n  copyTimer = setTimeout(() => (copied.value = null), 1600);\n}\n\n/* zaman:z1 — one date formatter for the package. This was a bare\n * `toLocaleDateString()`: the browser's locale and the browser's zone, so a\n * key minted at 23:30 in Istanbul was dated a day early for a viewer reading\n * UTC and came out in the wrong language besides. */\nfunction shortDate(v?: string | null): string {\n  const ms = new Date(v ?? '').getTime();\n  return Number.isNaN(ms) ? '' : formatDate(ms);\n}\n\n/** What a key is limited to, in one line. */\nfunction scopeOf(k: S3AccessKey): string {\n  if (!k.bucket) return t('conn.s3keys.scopeAll');\n  return k.prefix ? `${k.bucket}/${k.prefix}` : k.bucket;\n}\n</script>\n\n<template>\n  <section class=\"fe-s3keys\" data-testid=\"s3-keys\">\n    <header class=\"fe-s3keys__head\">\n      <h4 class=\"fe-s3keys__title\">{{ t('conn.s3keys.title') }}</h4>\n      <p class=\"fe-s3keys__lead\">{{ t('conn.s3keys.lead') }}</p>\n    </header>\n\n    <!-- The operator turned the endpoint off. Saying so beats handing out a\n         key that authenticates against a 404. -->\n    <p v-if=\"connection && !connection.enabled\" class=\"fe-s3keys__warn\">\n      {{ t('conn.s3keys.disabled') }}\n    </p>\n\n    <p v-if=\"canMint === false\" class=\"fe-s3keys__muted\">{{ t('conn.s3keys.cannotMint') }}</p>\n    <p v-if=\"error\" class=\"fe-s3keys__warn\">{{ error }}</p>\n    <!-- The fix, for an administrator the server chose to tell (admin_hint). -->\n    <p v-if=\"error && errorHint\" class=\"fe-s3keys__hint\" data-testid=\"s3keys-admin-hint\">{{ errorHint }}</p>\n\n    <!-- ── mint ─────────────────────────────────────────────────── -->\n    <div v-if=\"canMint\" class=\"fe-s3keys__form\">\n      <input\n        v-model=\"label\"\n        class=\"fe-cfield__input\"\n        :placeholder=\"t('conn.s3keys.label')\"\n        data-testid=\"s3-key-label\"\n      />\n      <ChoiceSelect\n        :model-value=\"bucket\"\n        :options=\"bucketChoices\"\n        :aria-label=\"t('conn.s3keys.col.scope')\"\n        testid=\"s3-key-bucket\"\n        @update:model-value=\"(v) => (bucket = String(v))\"\n      />\n      <input\n        v-model=\"prefix\"\n        class=\"fe-cfield__input\"\n        :placeholder=\"t('conn.s3keys.prefix')\"\n        :disabled=\"!bucket\"\n        data-testid=\"s3-key-prefix\"\n      />\n      <button class=\"fe-s3keys__btn\" :disabled=\"busy\" data-testid=\"s3-key-mint\" @click=\"mint\">\n        {{ t('conn.s3keys.mint') }}\n      </button>\n    </div>\n    <p v-if=\"canMint\" class=\"fe-s3keys__hint\">{{ t('conn.s3keys.inheritNote') }}</p>\n\n    <!-- ── the one-time secret ──────────────────────────────────── -->\n    <div v-if=\"revealed\" class=\"fe-s3keys__secret\" data-testid=\"s3-key-secret\">\n      <p class=\"fe-s3keys__once\">{{ t('conn.s3keys.once') }}</p>\n      <div class=\"fe-s3keys__pair\">\n        <span class=\"fe-s3keys__k\">{{ t('conn.s3keys.accessKeyID') }}</span>\n        <code>{{ revealed.key.access_key_id }}</code>\n        <button class=\"fe-s3keys__copy\" @click=\"copy(revealed.key.access_key_id, 'akid')\">\n          {{ copied === 'akid' ? t('conn.guide.copied') : t('conn.guide.copy') }}\n        </button>\n      </div>\n      <div class=\"fe-s3keys__pair\">\n        <span class=\"fe-s3keys__k\">{{ t('conn.s3keys.secret') }}</span>\n        <code>{{ revealed.secret }}</code>\n        <button class=\"fe-s3keys__copy\" @click=\"copy(revealed.secret, 'secret')\">\n          {{ copied === 'secret' ? t('conn.guide.copied') : t('conn.guide.copy') }}\n        </button>\n      </div>\n      <button class=\"fe-s3keys__dismiss\" @click=\"dismissSecret\">\n        {{ t('conn.s3keys.dismiss') }}\n      </button>\n    </div>\n\n    <!-- ── the keys ─────────────────────────────────────────────── -->\n    <!-- ⚠ THE table (DataTable — the explorer's own), not a table of its own:\n         reachable from the admin panel's Connections menu and from the\n         explorer, so it resizes, sorts, hides and moves columns and remembers\n         that on the account (`conn.s3keys`), like every other table. -->\n    <p v-if=\"loading\" class=\"fe-s3keys__muted\">…</p>\n    <DataTable\n      v-else\n      table-id=\"conn.s3keys\"\n      :columns=\"columns\"\n      :rows=\"keys\"\n      row-key=\"id\"\n      :locale=\"locale\"\n      :empty=\"t('conn.s3keys.empty')\"\n      :row-class=\"(k: S3AccessKey) => (k.disabled_at ? 'is-muted' : undefined)\"\n      :row-actions=\"rowActions\"\n      :row-actions-test-id=\"(k: S3AccessKey) => `s3-key-actions-${k.id}`\"\n      @row-action=\"(key: string, k: S3AccessKey) => onRowAction(key, k)\"\n    >\n      <template #cell-key=\"{ row }\">\n        <code class=\"tbl-mono\">{{ row.access_key_id }}</code>\n      </template>\n    </DataTable>\n  </section>\n</template>\n\n<style>\n/* ⚠ Only tokens that packages/core/src/styles/variables.css declares. This\n   block shipped with `--fe-surface`, `--fe-muted`, `--fe-accent`,\n   `--fe-surface-2` and `--fe-mono` — none of them exist — so the box had no\n   ground, the muted text was full-strength, and the mint button wore a\n   hardcoded blue that ignored the dark palette while the button beside it\n   used --fe-primary. web/tests/api/themeTokens.test.ts now refuses a token\n   that variables.css does not declare. */\n.fe-s3keys {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n  padding: 14px;\n  border: 1px solid var(--fe-border);\n  border-radius: 10px;\n  background: var(--fe-bg-elev);\n}\n.fe-s3keys__title {\n  margin: 0;\n  font-size: 14px;\n  font-weight: 600;\n}\n.fe-s3keys__lead,\n.fe-s3keys__hint,\n.fe-s3keys__muted {\n  margin: 0;\n  font-size: 12px;\n  color: var(--fe-text-muted);\n}\n.fe-s3keys__warn {\n  margin: 0;\n  font-size: 12px;\n  color: var(--fe-danger);\n}\n.fe-s3keys__form {\n  display: grid;\n  grid-template-columns: 1.4fr 1fr 1fr auto;\n  gap: 8px;\n  align-items: center;\n}\n@media (max-width: 640px) {\n  .fe-s3keys__form {\n    grid-template-columns: 1fr;\n  }\n}\n.fe-s3keys__btn {\n  padding: 7px 12px;\n  border-radius: 8px;\n  border: 1px solid transparent;\n  background: var(--fe-primary);\n  color: #fff;\n  font-size: 13px;\n  cursor: pointer;\n}\n.fe-s3keys__btn:disabled {\n  opacity: 0.55;\n  cursor: default;\n}\n.fe-s3keys__secret {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  padding: 10px;\n  border-radius: 8px;\n  border: 1px solid var(--fe-primary);\n  background: var(--fe-bg-selected);\n}\n.fe-s3keys__once {\n  margin: 0;\n  font-size: 12px;\n  font-weight: 600;\n}\n.fe-s3keys__pair {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 12px;\n  min-width: 0;\n}\n.fe-s3keys__pair code {\n  flex: 1;\n  overflow-wrap: anywhere;\n  font-family: var(--fe-font-mono);\n}\n.fe-s3keys__k {\n  min-width: 96px;\n  color: var(--fe-text-muted);\n}\n.fe-s3keys__copy,\n.fe-s3keys__dismiss {\n  background: none;\n  border: none;\n  padding: 0 4px;\n  color: var(--fe-primary);\n  font-size: 12px;\n  cursor: pointer;\n}\n.fe-s3keys__dismiss {\n  align-self: flex-start;\n}\n/* ⚠ The key table's own look USED to be written here — 12px type, 4-6px\n   padding, `--fe-border` instead of `--fe-border-soft`, its own disabled-row\n   opacity and its own right-aligned actions cell. All of it is deleted rather\n   than tuned: the panel now draws `.tbl`, and the one place that says what an\n   admin table looks like is packages/core/src/styles/base.css (\"THE ADMIN\n   TABLE\"). Four panels shared this block, so four tables drifted together;\n   sharing the real stylesheet is what stops the next drift. */\n</style>\n","/**\n * useSSHKeys — the one client for the SSH key surface.\n *\n * Same shape as useS3Keys and for the same reason: the panel, the guide and\n * the buttons exist once in `packages/core`, and the desktop app and the web\n * app mount the same component. A credential surface with two implementations\n * eventually hands out access one of them cannot take back.\n *\n * ⚠ There is no secret to reveal here. The user pastes the PUBLIC half; the\n * private key never touches filex, which is the entire point of preferring\n * keys over a password on a file server.\n */\n\nimport { computed, ref, shallowRef } from 'vue';\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { SSHConnection, SSHPublicKey } from '../types/SSHKeys';\nimport { connectionsBase } from './useConnections';\nimport { useFileApi } from './useFileApi';\nimport { serverWords } from '../lib/errorWords';\n\nexport function useSSHKeys(config: ExplorerConfig) {\n  const api = useFileApi(config);\n  const base = connectionsBase(config);\n  const url = (path: string) => `${base}${path}`;\n\n  const keys = shallowRef<SSHPublicKey[]>([]);\n  const connection = ref<SSHConnection | null>(null);\n  const loading = ref(false);\n  const loaded = ref(false);\n  const error = ref<string | null>(null);\n  const canAdd = ref<boolean | null>(null);\n\n  /** A refusal, said — lib/errorWords `serverWords`, the one rule every\n   *  connection panel shares (it used to print the server's `error` field as\n   *  it came: an environment variable, to a regular user). ⚠ The locale is\n   *  passed because what comes back may be the SERVER's own sentence: it\n   *  never met a translator, and an Arabic panel needs its machine runs\n   *  isolated (lib/direction `foreignText`). */\n  function messageOf(e: unknown): string {\n    return serverWords(e, config.locale);\n  }\n\n  function statusOf(e: unknown): number | undefined {\n    return (e as { status?: number } | null)?.status;\n  }\n\n  async function load(): Promise<void> {\n    loading.value = true;\n    error.value = null;\n    try {\n      const body = await api.jsonFetch<{ keys: SSHPublicKey[] } & SSHConnection>(\n        url('/api/auth/ssh-keys'),\n      );\n      keys.value = Array.isArray(body?.keys) ? body.keys : [];\n      connection.value = {\n        enabled: body?.enabled !== false,\n        host: body?.host ?? '',\n        port: body?.port ?? 2022,\n        login: body?.login ?? '',\n        ftps: body?.ftps,\n      };\n      canAdd.value = true;\n    } catch (e) {\n      keys.value = [];\n      canAdd.value = false;\n      if (statusOf(e) !== 401 && statusOf(e) !== 403) error.value = messageOf(e);\n    } finally {\n      loading.value = false;\n      loaded.value = true;\n    }\n  }\n\n  async function add(key: string, name?: string): Promise<boolean> {\n    error.value = null;\n    try {\n      await api.jsonFetch(url('/api/auth/ssh-keys'), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ key, name }),\n      });\n      await load();\n      return true;\n    } catch (e) {\n      error.value = messageOf(e);\n      return false;\n    }\n  }\n\n  async function setDisabled(id: number, disabled: boolean): Promise<void> {\n    error.value = null;\n    try {\n      await api.jsonFetch(url(`/api/auth/ssh-keys/${id}/state`), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ disabled }),\n      });\n      await load();\n    } catch (e) {\n      error.value = messageOf(e);\n    }\n  }\n\n  async function remove(id: number): Promise<void> {\n    error.value = null;\n    try {\n      await api.jsonFetch(url(`/api/auth/ssh-keys/${id}`), { method: 'DELETE' });\n      await load();\n    } catch (e) {\n      error.value = messageOf(e);\n    }\n  }\n\n  /** True when at least one key can actually be used to sign in. */\n  const hasUsableKey = computed(() => keys.value.some((k) => !k.disabled_at));\n\n  return { keys, connection, loading, loaded, error, canAdd, hasUsableKey, load, add, setDisabled, remove };\n}\n","<script setup lang=\"ts\">\n/**\n * SSHKeysPanel — register, disable and remove the keys this account signs in\n * with over SFTP.\n *\n * ⚠⚠ This is not a convenience screen. `ssh-copy-id` — the command everybody\n * reaches for — appends to `~/.ssh/authorized_keys` over a shell, and filex has\n * no shell. Without a box to paste a key into, public-key authentication is\n * unreachable and every user ends up sending their account password to a file\n * server instead. That is why the screen shipped WITH the endpoint rather than\n * after it.\n *\n * One component, every surface: the desktop app and the web app mount this same\n * file (see S3KeysPanel for the same rule stated at length).\n */\nimport { computed, onMounted, ref } from 'vue';\nimport type { ExplorerConfig, LocaleCode } from '../types/ExplorerConfig';\nimport type { FTPSFacts, SSHPublicKey } from '../types/SSHKeys';\nimport { useLocale } from '../composables/useLocale';\nimport { useSSHKeys } from '../composables/useSSHKeys';\nimport DataTable, { type DataColumn } from './DataTable.vue';\nimport type { ContextAction } from './ContextMenu.vue';\nimport { resolveLocale } from '../locales/resolve';\n\nconst props = defineProps<{\n  config: ExplorerConfig;\n  /**\n   * Draw the key list and the paste box.\n   *\n   * ⚠ False for FTPS, which authenticates with a password or an API token and\n   * has no use for an SSH key — the panel is still MOUNTED there because it is\n   * the call that reports where the FTP endpoint listens and under what login\n   * name. Showing a key box on the FTPS page would invite somebody to register\n   * a key that protocol will never look at.\n   */\n  keysVisible?: boolean;\n}>();\n\nconst showKeys = computed(() => props.keysVisible !== false);\n\nconst emit = defineEmits<{\n  /** What the guide should render with: where to connect and as whom. */\n  (e: 'active', v: {\n    host: string;\n    port: number;\n    login: string;\n    enabled: boolean;\n    hasKey: boolean;\n    ftps?: FTPSFacts;\n  }): void;\n}>();\n\nconst locale = computed<LocaleCode>(() => resolveLocale(props.config.locale));\nconst { t, formatDate } = useLocale(locale);\n\nconst { keys, connection, loading, error, canAdd, hasUsableKey, load, add, setDisabled, remove } =\n  useSSHKeys(props.config);\n\nconst pasted = ref('');\nconst name = ref('');\nconst busy = ref(false);\nconst confirmRemove = ref<number | null>(null);\n\nfunction publish() {\n  const c = connection.value;\n  if (!c) return;\n  emit('active', {\n    host: c.host,\n    port: c.port,\n    login: c.login,\n    enabled: c.enabled,\n    hasKey: hasUsableKey.value,\n    // The FTPS endpoint travels with the SSH facts: for the user this is one\n    // question (\"how do I reach this from a program?\"), and two calls to\n    // answer it would be two chances to disagree.\n    ftps: c.ftps,\n  });\n}\n\nonMounted(async () => {\n  await load();\n  publish();\n});\n\nasync function submit() {\n  if (!pasted.value.trim()) return;\n  busy.value = true;\n  try {\n    if (await add(pasted.value.trim(), name.value.trim() || undefined)) {\n      pasted.value = '';\n      name.value = '';\n    }\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\n/** The row's verbs, behind its one `Actions` control. ⚠ `remove` keeps the\n *  two-step confirmation it had as a loose button: the first pick arms it and\n *  the label becomes \"Confirm\", the second pick deletes the key. */\nfunction rowActions(k: SSHPublicKey): ContextAction[] {\n  /* The whole control used to be `:disabled=\"busy\"`; the table draws the\n     control now, so each verb carries it. */\n  return [\n    {\n      key: 'toggle',\n      label: k.disabled_at ? t('conn.sshkeys.enable') : t('conn.sshkeys.disable'),\n      icon: k.disabled_at ? 'check' : 'lock',\n      disabled: busy.value,\n    },\n    {\n      key: 'remove',\n      label: confirmRemove.value === k.id ? t('conn.sshkeys.confirm') : t('conn.sshkeys.remove'),\n      icon: 'delete',\n      danger: true,\n      disabled: busy.value,\n    },\n  ];\n}\n\n/** The list's columns — the product's one table (DataTable). */\nconst columns = computed<DataColumn<SSHPublicKey>[]>(() => [\n  {\n    id: 'name',\n    label: t('conn.sshkeys.col.name'),\n    sortable: true,\n    width: 180,\n    format: (k) => k.name || t('conn.sshkeys.noName'),\n  },\n  {\n    id: 'fingerprint',\n    label: t('conn.sshkeys.col.fingerprint'),\n    sortable: true,\n    width: 240,\n    sortValue: (k) => fingerprintOf(k),\n    title: (k) => fingerprintOf(k),\n  },\n  {\n    id: 'lastUsed',\n    label: t('conn.sshkeys.col.lastUsed'),\n    sortable: true,\n    sortDir: 'desc',\n    width: 140,\n    format: (k) => (k.last_used_at ? shortDate(k.last_used_at) : t('conn.sshkeys.neverUsed')),\n    sortValue: (k) => (k.last_used_at ? new Date(k.last_used_at).getTime() : null),\n  },\n]);\n\nfunction onRowAction(key: string, k: SSHPublicKey) {\n  if (key === 'toggle') void toggle(k);\n  else if (key === 'remove') void drop(k);\n}\n\nasync function toggle(k: SSHPublicKey) {\n  busy.value = true;\n  try {\n    await setDisabled(k.id, !k.disabled_at);\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\nasync function drop(k: SSHPublicKey) {\n  if (confirmRemove.value !== k.id) {\n    confirmRemove.value = k.id;\n    return;\n  }\n  confirmRemove.value = null;\n  busy.value = true;\n  try {\n    await remove(k.id);\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\n/* zaman:z1 — one date formatter for the package. This was a bare\n * `toLocaleDateString()`: the browser's locale and the browser's zone, so a\n * key minted at 23:30 in Istanbul was dated a day early for a viewer reading\n * UTC and came out in the wrong language besides. */\nfunction shortDate(v?: string | null): string {\n  const ms = new Date(v ?? '').getTime();\n  return Number.isNaN(ms) ? '' : formatDate(ms);\n}\n\n/** Shown the way OpenSSH prints it, so it can be compared with `ssh-keygen -lf`. */\nfunction fingerprintOf(k: SSHPublicKey): string {\n  return 'SHA256:' + k.fingerprint;\n}\n</script>\n\n<template>\n  <section v-if=\"showKeys\" class=\"fe-s3keys\" data-testid=\"ssh-keys\">\n    <header class=\"fe-s3keys__head\">\n      <h4 class=\"fe-s3keys__title\">{{ t('conn.sshkeys.title') }}</h4>\n      <p class=\"fe-s3keys__lead\">{{ t('conn.sshkeys.lead') }}</p>\n    </header>\n\n    <p v-if=\"connection && !connection.enabled\" class=\"fe-s3keys__warn\">\n      {{ t('conn.sshkeys.disabled') }}\n    </p>\n    <p v-if=\"canAdd === false\" class=\"fe-s3keys__muted\">{{ t('conn.sshkeys.cannotAdd') }}</p>\n    <p v-if=\"error\" class=\"fe-s3keys__warn\">{{ error }}</p>\n\n    <div v-if=\"canAdd\" class=\"fe-sshkeys__form\">\n      <textarea\n        v-model=\"pasted\"\n        class=\"fe-cfield__input fe-sshkeys__paste\"\n        rows=\"2\"\n        spellcheck=\"false\"\n        :placeholder=\"t('conn.sshkeys.paste')\"\n        data-testid=\"ssh-key-input\"\n      ></textarea>\n      <div class=\"fe-sshkeys__row\">\n        <input\n          v-model=\"name\"\n          class=\"fe-cfield__input\"\n          :placeholder=\"t('conn.sshkeys.name')\"\n          data-testid=\"ssh-key-name\"\n        />\n        <button class=\"fe-s3keys__btn\" :disabled=\"busy\" data-testid=\"ssh-key-add\" @click=\"submit\">\n          {{ t('conn.sshkeys.add') }}\n        </button>\n      </div>\n      <p class=\"fe-s3keys__hint\">{{ t('conn.sshkeys.noCopyId') }}</p>\n    </div>\n\n    <!-- ⚠ THE table (DataTable — the explorer's own), not a table of its own:\n         reachable from the admin panel's Connections menu and from the\n         explorer, so it resizes, sorts, hides and moves columns and remembers\n         that on the account (`conn.sshkeys`), like every other table. -->\n    <p v-if=\"loading\" class=\"fe-s3keys__muted\">…</p>\n    <DataTable\n      v-else\n      table-id=\"conn.sshkeys\"\n      :columns=\"columns\"\n      :rows=\"keys\"\n      row-key=\"id\"\n      :locale=\"locale\"\n      :empty=\"t('conn.sshkeys.empty')\"\n      :row-class=\"(k: SSHPublicKey) => (k.disabled_at ? 'is-muted' : undefined)\"\n      :row-actions=\"rowActions\"\n      :row-actions-test-id=\"(k: SSHPublicKey) => `ssh-key-actions-${k.id}`\"\n      @row-action=\"(key: string, k: SSHPublicKey) => onRowAction(key, k)\"\n    >\n      <template #cell-fingerprint=\"{ row }\">\n        <code class=\"tbl-mono\">{{ fingerprintOf(row) }}</code>\n      </template>\n    </DataTable>\n  </section>\n</template>\n\n<style>\n/* The layout is shared with the access-key panel (fe-s3keys__*); only the\n   paste box is different, because a public key is two lines long. */\n.fe-sshkeys__form {\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n}\n.fe-sshkeys__paste {\n  width: 100%;\n  font-family: var(--fe-font-mono);\n  font-size: 12px;\n  resize: vertical;\n  overflow-wrap: anywhere;\n}\n.fe-sshkeys__row {\n  display: flex;\n  gap: 8px;\n  align-items: center;\n}\n.fe-sshkeys__row .fe-cfield__input {\n  flex: 1;\n}\n</style>\n","/**\n * useNFSExports — the one client for the NFS export surface.\n *\n * Same shape as useS3Keys and useSSHKeys, and mounted by every surface from\n * packages/core for the same reason: a credential screen with two\n * implementations eventually hands out access one of them cannot revoke.\n */\n\nimport { computed, ref, shallowRef } from 'vue';\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { NFSConnection, NFSExport, NFSExportCreated } from '../types/NFSExports';\nimport { connectionsBase } from './useConnections';\nimport { useFileApi } from './useFileApi';\nimport { serverWords } from '../lib/errorWords';\n\nexport function useNFSExports(config: ExplorerConfig) {\n  const api = useFileApi(config);\n  const base = connectionsBase(config);\n  const url = (path: string) => `${base}${path}`;\n\n  const exports = shallowRef<NFSExport[]>([]);\n  const connection = ref<NFSConnection | null>(null);\n  const loading = ref(false);\n  const loaded = ref(false);\n  const error = ref<string | null>(null);\n  const canMint = ref<boolean | null>(null);\n  /** The path, held only while the user is looking at it. */\n  const revealed = ref<NFSExportCreated | null>(null);\n\n  /** A refusal, said — lib/errorWords `serverWords`, the one rule every\n   *  connection panel shares (it used to print the server's `error` field as\n   *  it came: an environment variable, to a regular user). ⚠ The locale is\n   *  passed because what comes back may be the SERVER's own sentence: it\n   *  never met a translator, and an Arabic panel needs its machine runs\n   *  isolated (lib/direction `foreignText`). */\n  function messageOf(e: unknown): string {\n    return serverWords(e, config.locale);\n  }\n\n  function statusOf(e: unknown): number | undefined {\n    return (e as { status?: number } | null)?.status;\n  }\n\n  async function load(): Promise<void> {\n    loading.value = true;\n    error.value = null;\n    try {\n      const body = await api.jsonFetch<{ exports: NFSExport[] } & NFSConnection>(\n        url('/api/auth/nfs-exports'),\n      );\n      exports.value = Array.isArray(body?.exports) ? body.exports : [];\n      connection.value = {\n        enabled: body?.enabled !== false,\n        host: body?.host ?? '',\n        port: body?.port ?? 2049,\n      };\n      canMint.value = true;\n    } catch (e) {\n      exports.value = [];\n      canMint.value = false;\n      if (statusOf(e) !== 401 && statusOf(e) !== 403) error.value = messageOf(e);\n    } finally {\n      loading.value = false;\n      loaded.value = true;\n    }\n  }\n\n  async function create(req: {\n    label: string;\n    storage?: string;\n    prefix?: string;\n    read_only?: boolean;\n    allow_cidrs?: string;\n  }): Promise<NFSExportCreated | null> {\n    error.value = null;\n    try {\n      const body = await api.jsonFetch<NFSExportCreated>(url('/api/auth/nfs-exports'), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(req),\n      });\n      revealed.value = body;\n      if (body?.host) {\n        connection.value = { enabled: body.enabled !== false, host: body.host, port: body.port };\n      }\n      await load();\n      return body;\n    } catch (e) {\n      error.value = messageOf(e);\n      return null;\n    }\n  }\n\n  async function setDisabled(id: number, disabled: boolean): Promise<void> {\n    error.value = null;\n    try {\n      await api.jsonFetch(url(`/api/auth/nfs-exports/${id}/state`), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ disabled }),\n      });\n      await load();\n    } catch (e) {\n      error.value = messageOf(e);\n    }\n  }\n\n  async function remove(id: number): Promise<void> {\n    error.value = null;\n    try {\n      await api.jsonFetch(url(`/api/auth/nfs-exports/${id}`), { method: 'DELETE' });\n      if (revealed.value?.export?.id === id) revealed.value = null;\n      await load();\n    } catch (e) {\n      error.value = messageOf(e);\n    }\n  }\n\n  function dismissPath() {\n    revealed.value = null;\n  }\n\n  /** The export a guide should render a mount line for. */\n  const guideExport = computed<NFSExport | null>(() => {\n    if (revealed.value?.export) return revealed.value.export;\n    const usable = exports.value.filter((e) => !e.disabled_at);\n    if (!usable.length) return null;\n    return usable.reduce((a, b) => (a.created_at >= b.created_at ? a : b));\n  });\n\n  return {\n    exports,\n    connection,\n    loading,\n    loaded,\n    error,\n    canMint,\n    revealed,\n    guideExport,\n    load,\n    create,\n    setDisabled,\n    remove,\n    dismissPath,\n  };\n}\n","<script setup lang=\"ts\">\n/**\n * NFSExportsPanel — mint, disable and revoke the NFS exports this account can\n * be mounted through.\n *\n * ⚠⚠ The path this hands back IS the credential, and that is unusual enough to\n * say twice. NFSv3 cannot authenticate a request without Kerberos, so filex\n * binds the identity to a high-entropy export path: whoever knows it mounts as\n * this account. It goes into an /etc/fstab line or a NAS admin page — places\n * nobody treats as a password store — so the panel says so where the path is\n * shown, not in a document somebody will not read.\n *\n * One component, every surface (see S3KeysPanel for the rule at length).\n */\nimport { computed, onMounted, ref } from 'vue';\nimport type { ExplorerConfig, LocaleCode } from '../types/ExplorerConfig';\nimport type { NFSExport } from '../types/NFSExports';\nimport { useLocale } from '../composables/useLocale';\nimport DataTable, { type DataColumn } from './DataTable.vue';\nimport ChoiceSelect, { type SelectOption } from './ChoiceSelect.vue';\nimport type { ContextAction } from './ContextMenu.vue';\nimport { useNFSExports } from '../composables/useNFSExports';\nimport { resolveLocale } from '../locales/resolve';\n\nconst props = defineProps<{\n  config: ExplorerConfig;\n  /** Storage names the caller may see, for the confinement picker. */\n  storages: string[];\n}>();\n\nconst emit = defineEmits<{\n  (e: 'active', v: { host: string; port: number; enabled: boolean; path?: string; readOnly: boolean }): void;\n}>();\n\nconst locale = computed<LocaleCode>(() => resolveLocale(props.config.locale));\nconst { t, formatDate } = useLocale(locale);\n\nconst {\n  exports,\n  connection,\n  loading,\n  error,\n  canMint,\n  revealed,\n  guideExport,\n  load,\n  create,\n  setDisabled,\n  remove,\n  dismissPath,\n} = useNFSExports(props.config);\n\nconst label = ref('');\nconst storage = ref('');\n/* Which storage the export is limited to (#160: the shared list, no native select). */\nconst storageChoices = computed<SelectOption[]>(() => [\n  { value: '', label: t('conn.nfs.everyStorage') },\n  ...props.storages.map((s) => ({ value: s, label: s })),\n]);\nconst prefix = ref('');\nconst readOnly = ref(true);\nconst allowCidrs = ref('');\nconst busy = ref(false);\nconst confirmRemove = ref<number | null>(null);\nconst copied = ref(false);\nlet copyTimer: ReturnType<typeof setTimeout> | null = null;\n\nfunction publish() {\n  const c = connection.value;\n  if (!c) return;\n  emit('active', {\n    host: c.host,\n    port: c.port,\n    enabled: c.enabled,\n    // Only the freshly minted path — the stored ones cannot be recovered, and\n    // printing a placeholder in a mount line somebody copies would produce a\n    // command that fails with no clue why.\n    path: revealed.value?.path,\n    readOnly: guideExport.value?.read_only ?? readOnly.value,\n  });\n}\n\nonMounted(async () => {\n  await load();\n  publish();\n});\n\nasync function mint() {\n  busy.value = true;\n  try {\n    await create({\n      label: label.value.trim() || t('conn.nfs.defaultLabel'),\n      storage: storage.value.trim() || undefined,\n      prefix: prefix.value.trim() || undefined,\n      read_only: readOnly.value,\n      allow_cidrs: allowCidrs.value.trim() || undefined,\n    });\n    label.value = '';\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\n/** The row's verbs, behind its one `Actions` control. ⚠ `revoke` keeps the\n *  two-step confirmation it had as a loose button. */\nfunction rowActions(e: NFSExport): ContextAction[] {\n  /* The whole control used to be `:disabled=\"busy\"`; the table draws the\n     control now, so each verb carries it. */\n  return [\n    {\n      key: 'toggle',\n      label: e.disabled_at ? t('conn.nfs.enable') : t('conn.nfs.disable'),\n      icon: e.disabled_at ? 'check' : 'lock',\n      disabled: busy.value,\n    },\n    {\n      key: 'revoke',\n      label: confirmRemove.value === e.id ? t('conn.nfs.confirm') : t('conn.nfs.revoke'),\n      icon: 'delete',\n      danger: true,\n      disabled: busy.value,\n    },\n  ];\n}\n\n/** The list's columns — the product's one table (DataTable). */\nconst columns = computed<DataColumn<NFSExport>[]>(() => [\n  {\n    id: 'label',\n    label: t('conn.nfs.col.label'),\n    sortable: true,\n    width: 180,\n    format: (e) => e.label || t('conn.nfs.noLabel'),\n  },\n  { id: 'scope', label: t('conn.nfs.col.scope'), sortable: true, width: 180, format: scopeOf },\n  {\n    id: 'mode',\n    label: t('conn.nfs.col.mode'),\n    sortable: true,\n    width: 120,\n    format: (e) => (e.read_only ? t('conn.nfs.modeRead') : t('conn.nfs.modeWrite')),\n  },\n  {\n    id: 'lastUsed',\n    label: t('conn.nfs.col.lastUsed'),\n    sortable: true,\n    sortDir: 'desc',\n    width: 140,\n    format: (e) => (e.last_used_at ? shortDate(e.last_used_at) : t('conn.nfs.neverUsed')),\n    sortValue: (e) => (e.last_used_at ? new Date(e.last_used_at).getTime() : null),\n  },\n]);\n\nfunction onRowAction(key: string, e: NFSExport) {\n  if (key === 'toggle') void toggle(e);\n  else if (key === 'revoke') void drop(e);\n}\n\nasync function toggle(e: NFSExport) {\n  busy.value = true;\n  try {\n    await setDisabled(e.id, !e.disabled_at);\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\nasync function drop(e: NFSExport) {\n  if (confirmRemove.value !== e.id) {\n    confirmRemove.value = e.id;\n    return;\n  }\n  confirmRemove.value = null;\n  busy.value = true;\n  try {\n    await remove(e.id);\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\n/** The mount line for the path just minted — the thing to copy. */\nconst mountLine = computed(() => {\n  const c = connection.value;\n  const p = revealed.value?.path;\n  if (!c || !p) return '';\n  const ro = revealed.value?.export?.read_only ? ',ro' : '';\n  return `sudo mount -t nfs -o nfsvers=3,tcp,port=${c.port},mountport=${c.port},nolock${ro} ${c.host}:${p} /mnt/filex`;\n});\n\nasync function copyLine() {\n  const text = mountLine.value;\n  if (!text) return;\n  let ok = false;\n  try {\n    await navigator.clipboard.writeText(text);\n    ok = true;\n  } catch {\n    try {\n      const ta = document.createElement('textarea');\n      ta.value = text;\n      ta.setAttribute('readonly', '');\n      ta.style.position = 'fixed';\n      ta.style.opacity = '0';\n      document.body.appendChild(ta);\n      ta.select();\n      ok = document.execCommand('copy');\n      document.body.removeChild(ta);\n    } catch {\n      ok = false;\n    }\n  }\n  if (!ok) return;\n  copied.value = true;\n  if (copyTimer) clearTimeout(copyTimer);\n  copyTimer = setTimeout(() => (copied.value = false), 1600);\n}\n\n/* zaman:z1 — one date formatter for the package. This was a bare\n * `toLocaleDateString()`: the browser's locale and the browser's zone, so a\n * key minted at 23:30 in Istanbul was dated a day early for a viewer reading\n * UTC and came out in the wrong language besides. */\nfunction shortDate(v?: string | null): string {\n  const ms = new Date(v ?? '').getTime();\n  return Number.isNaN(ms) ? '' : formatDate(ms);\n}\n\nfunction scopeOf(e: NFSExport): string {\n  if (!e.storage_name) return t('conn.nfs.scopeAll');\n  return e.prefix ? `${e.storage_name}/${e.prefix}` : e.storage_name;\n}\n</script>\n\n<template>\n  <section class=\"fe-s3keys\" data-testid=\"nfs-exports\">\n    <header class=\"fe-s3keys__head\">\n      <h4 class=\"fe-s3keys__title\">{{ t('conn.nfs.title') }}</h4>\n      <p class=\"fe-s3keys__lead\">{{ t('conn.nfs.lead') }}</p>\n    </header>\n\n    <!-- ⚠⚠ The one thing somebody must read before they mint one. -->\n    <p class=\"fe-s3keys__warn\">{{ t('conn.nfs.pathIsSecret') }}</p>\n    <p v-if=\"connection && !connection.enabled\" class=\"fe-s3keys__warn\">\n      {{ t('conn.nfs.disabled') }}\n    </p>\n    <p v-if=\"canMint === false\" class=\"fe-s3keys__muted\">{{ t('conn.nfs.cannotMint') }}</p>\n    <p v-if=\"error\" class=\"fe-s3keys__warn\">{{ error }}</p>\n\n    <div v-if=\"canMint\" class=\"fe-s3keys__form fe-nfs__form\">\n      <input\n        v-model=\"label\"\n        class=\"fe-cfield__input\"\n        :placeholder=\"t('conn.nfs.label')\"\n        data-testid=\"nfs-label\"\n      />\n      <ChoiceSelect\n        :model-value=\"storage\"\n        :options=\"storageChoices\"\n        :aria-label=\"t('conn.nfs.col.scope')\"\n        testid=\"nfs-storage\"\n        @update:model-value=\"(v) => (storage = String(v))\"\n      />\n      <input\n        v-model=\"prefix\"\n        class=\"fe-cfield__input\"\n        :placeholder=\"t('conn.nfs.prefix')\"\n        :disabled=\"!storage\"\n        data-testid=\"nfs-prefix\"\n      />\n      <input\n        v-model=\"allowCidrs\"\n        class=\"fe-cfield__input\"\n        :placeholder=\"t('conn.nfs.allowCidrs')\"\n        data-testid=\"nfs-cidrs\"\n      />\n      <label class=\"fe-nfs__ro\">\n        <input type=\"checkbox\" v-model=\"readOnly\" data-testid=\"nfs-readonly\" />\n        {{ t('conn.nfs.readOnly') }}\n      </label>\n      <button class=\"fe-s3keys__btn\" :disabled=\"busy\" data-testid=\"nfs-mint\" @click=\"mint\">\n        {{ t('conn.nfs.mint') }}\n      </button>\n    </div>\n    <p v-if=\"canMint\" class=\"fe-s3keys__hint\">{{ t('conn.nfs.readOnlyHint') }}</p>\n\n    <!-- The path, once. -->\n    <div v-if=\"revealed\" class=\"fe-s3keys__secret\" data-testid=\"nfs-path\">\n      <p class=\"fe-s3keys__once\">{{ t('conn.nfs.once') }}</p>\n      <div class=\"fe-s3keys__pair\">\n        <code>{{ mountLine }}</code>\n        <button class=\"fe-s3keys__copy\" @click=\"copyLine\">\n          {{ copied ? t('conn.guide.copied') : t('conn.guide.copy') }}\n        </button>\n      </div>\n      <button class=\"fe-s3keys__dismiss\" @click=\"dismissPath\">\n        {{ t('conn.nfs.dismiss') }}\n      </button>\n    </div>\n\n    <!-- ⚠ THE table (DataTable — the explorer's own), not a table of its own:\n         reachable from the admin panel's Connections menu and from the\n         explorer, so it resizes, sorts, hides and moves columns and remembers\n         that on the account (`conn.nfs`), like every other table. (It once had\n         no scroll container at all, so its actions cell could not pin; the\n         one table owns that now.) -->\n    <p v-if=\"loading\" class=\"fe-s3keys__muted\">…</p>\n    <DataTable\n      v-else\n      table-id=\"conn.nfs\"\n      :columns=\"columns\"\n      :rows=\"exports\"\n      row-key=\"id\"\n      :locale=\"locale\"\n      :empty=\"t('conn.nfs.empty')\"\n      :row-class=\"(e: NFSExport) => (e.disabled_at ? 'is-muted' : undefined)\"\n      :row-actions=\"rowActions\"\n      :row-actions-test-id=\"(e: NFSExport) => `nfs-export-actions-${e.id}`\"\n      @row-action=\"(key: string, e: NFSExport) => onRowAction(key, e)\"\n    />\n  </section>\n</template>\n\n<style>\n/* Shares the access-key panel's layout; only the form is wider, because an\n   export has one more field than a key does. */\n.fe-nfs__form {\n  grid-template-columns: 1.2fr 1fr 1fr 1fr auto auto;\n}\n@media (max-width: 900px) {\n  .fe-nfs__form {\n    grid-template-columns: 1fr;\n  }\n}\n.fe-nfs__ro {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  font-size: 12px;\n  white-space: nowrap;\n}\n</style>\n","/**\n * useTokens — the one client for the self-service API-token surface.\n *\n * It goes through `useFileApi`, the same auth plumbing the explorer uses, so\n * the desktop app's function-token, the web app's cookie and an embedder's\n * bearer all work here without this file knowing which is which.\n *\n * ⚠ `/api/tokens`, NOT `/api/admin/ai-tokens`. The admin route needs an admin;\n * this one is open to every account and caps what it hands out to the caller's\n * own role and grants. Pointing this at the admin route would put the panel on\n * three surfaces and have it fail with 403 on two of them.\n *\n * ⚠ Every surface mounts THIS, not a copy — the standing rule applied to a\n * credential surface, where a divergence would mean one surface minting\n * tokens the other cannot see or revoke.\n */\n\nimport { ref, shallowRef } from 'vue';\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { ApiToken, ApiTokenCreated, ApiTokenRequest } from '../types/Tokens';\nimport { connectionsBase } from './useConnections';\nimport { useFileApi } from './useFileApi';\nimport { serverWords } from '../lib/errorWords';\n\nexport function useTokens(config: ExplorerConfig) {\n  const api = useFileApi(config);\n  const base = connectionsBase(config);\n  const url = (path: string) => `${base}${path}`;\n\n  const tokens = shallowRef<ApiToken[]>([]);\n  const loading = ref(false);\n  const loaded = ref(false);\n  const error = ref<string | null>(null);\n  /**\n   * null until the first load answers. False means the caller may not mint\n   * one (anonymous, or a share/proxy session) — the guide around it is still\n   * worth showing, so this is a fact rather than an error.\n   */\n  const canMint = ref<boolean | null>(null);\n\n  /** The secret, held in memory for exactly as long as the user is looking. */\n  const revealed = ref<ApiTokenCreated | null>(null);\n\n  /** A refusal, said — lib/errorWords `serverWords`, the one rule every\n   *  connection panel shares (it used to print the server's `error` field as\n   *  it came: an environment variable, to a regular user). ⚠ The locale is\n   *  passed because what comes back may be the SERVER's own sentence: it\n   *  never met a translator, and an Arabic panel needs its machine runs\n   *  isolated (lib/direction `foreignText`). */\n  function messageOf(e: unknown): string {\n    return serverWords(e, config.locale);\n  }\n\n  function statusOf(e: unknown): number | undefined {\n    return (e as { status?: number } | null)?.status;\n  }\n\n  async function load(): Promise<void> {\n    loading.value = true;\n    error.value = null;\n    try {\n      const body = await api.jsonFetch<{ tokens: ApiToken[] }>(url('/api/tokens'));\n      tokens.value = Array.isArray(body?.tokens) ? body.tokens : [];\n      canMint.value = true;\n    } catch (e) {\n      tokens.value = [];\n      const st = statusOf(e);\n      canMint.value = false;\n      // 401/403 is \"not for you\", which the panel says in its own words. Any\n      // other status is a fault worth showing verbatim.\n      if (st !== 401 && st !== 403) error.value = messageOf(e);\n    } finally {\n      loading.value = false;\n      loaded.value = true;\n    }\n  }\n\n  /**\n   * Mint a token. The secret comes back once and is held in `revealed` until\n   * the caller dismisses it — there is no second chance, so the UI must not\n   * navigate away from it on its own.\n   */\n  async function create(req: ApiTokenRequest): Promise<ApiTokenCreated | null> {\n    error.value = null;\n    try {\n      const body = await api.jsonFetch<ApiTokenCreated>(url('/api/tokens'), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(req),\n      });\n      revealed.value = body;\n      await load();\n      return body;\n    } catch (e) {\n      error.value = messageOf(e);\n      return null;\n    }\n  }\n\n  async function remove(id: number): Promise<void> {\n    error.value = null;\n    try {\n      await api.jsonFetch(url(`/api/tokens/${id}`), { method: 'DELETE' });\n      // A revealed secret belonging to the token just revoked goes with it.\n      if (revealed.value?.row?.id === id) revealed.value = null;\n      await load();\n    } catch (e) {\n      error.value = messageOf(e);\n    }\n  }\n\n  /**\n   * Change the levels of a token's permissions - `{comments: 'rw'}` lets it\n   * add and delete comments, `{comments: 'read'}` takes that back (task #157).\n   * Its verbs never change. A token calling this cannot raise a token above\n   * its own level, itself included; the server says so in words.\n   */\n  async function setPermissions(id: number, permissions: Record<string, string>): Promise<boolean> {\n    error.value = null;\n    try {\n      await api.jsonFetch(url(`/api/tokens/${id}`), {\n        method: 'PATCH',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ permissions }),\n      });\n      await load();\n      return true;\n    } catch (e) {\n      error.value = messageOf(e);\n      return false;\n    }\n  }\n\n  function dismiss(): void {\n    revealed.value = null;\n  }\n\n  return { tokens, loading, loaded, error, canMint, revealed, load, create, remove, setPermissions, dismiss };\n}\n","<script setup lang=\"ts\">\n/**\n * TokensPanel — mint and revoke the API tokens this account signs in with on\n * the protocols whose credential IS a token.\n *\n * ⚠⚠ Why this had to exist. FTPS, WebDAV and `filex mount` all take an API\n * token as the password — the guides next to this panel say so in as many\n * words. Until 2026-08-17 the only place to mint one was the admin panel's\n * `/api/admin/ai-tokens` screen, so a normal user read \"use an API token\" and\n * had nowhere to get one. The route it calls (`/api/tokens`) has always been\n * open to every account and caps what it hands out to the caller's own role\n * and grants; only the UI was missing.\n *\n * One component, every surface (see S3KeysPanel for the rule at length): the\n * admin panel, the web explorer and the desktop app render THIS.\n *\n * Two shapes, one implementation. `full` adds what a person managing their own\n * API keys needs — which scopes, confined to which folder, expiring when — and\n * without it the panel is the compact minter that sits inside a protocol guide,\n * byte for byte as before.\n *\n * ⚠ `full` exists because the rich version had been written a second time, in\n * `web/src/components/SelfTokensModal.vue`, against the same `/api/tokens`\n * route. That copy was reachable only from our own web app: an embedder\n * mounting the explorer got users with no way to mint the credential WebDAV,\n * FTPS and `filex mount` ask for. The copy is gone; this is the surface.\n */\nimport { computed, onMounted, ref } from 'vue';\nimport type { ExplorerConfig, LocaleCode } from '../types/ExplorerConfig';\nimport type { ApiToken } from '../types/Tokens';\nimport { useLocale } from '../composables/useLocale';\nimport { useTokens } from '../composables/useTokens';\nimport DataTable, { type DataColumn } from './DataTable.vue';\nimport type { ContextAction } from './ContextMenu.vue';\nimport ChoiceButtons, { type ChoiceOption } from './ChoiceButtons.vue';\nimport { resolveLocale } from '../locales/resolve';\n\nconst props = defineProps<{\n  config: ExplorerConfig;\n  /**\n   * Render the full self-service key manager (scopes, folder confinement,\n   * expiry) instead of the one-field minter the guides embed.\n   */\n  full?: boolean;\n  /**\n   * Which protocol the surrounding guide is showing. It only changes the\n   * default label — a token minted here works on all of them, and pretending\n   * otherwise would have people mint one per protocol.\n   */\n  protocol?: string;\n  /**\n   * The host the surrounding guide tells people to connect to. Given by the\n   * connection guides, which know the server's own public address; without\n   * it the label falls back to where this panel was loaded from. ⚠ The\n   * default label used to be built from apiBase / the page while the guide\n   * right under it printed the server's address — one screen, two machines.\n   */\n  host?: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'active', v: { hasToken: boolean }): void;\n}>();\n\nconst locale = computed<LocaleCode>(() => resolveLocale(props.config.locale));\nconst { t, formatDate } = useLocale(locale);\n\nconst { tokens, loading, error, canMint, revealed, load, create, remove, setPermissions, dismiss } = useTokens(\n  props.config,\n);\n\nconst label = ref('');\nconst busy = ref(false);\nconst copied = ref(false);\nconst confirming = ref<number | null>(null);\n\n/* ── full mode ──────────────────────────────────────────────────────────\n * ⚠ All four verbs are offered to everyone on purpose. The old copy of this\n * screen hid `write`/`delete` from viewer accounts by reading a store that\n * only the web app has — which is precisely the coupling that kept this\n * surface out of every embed. The server caps each scope against the caller's\n * own role and grants and answers in words worth showing (\"scope 'write' is\n * not available here\"), so asking is never granting and the refusal explains\n * itself. `admin` is not offered at all: the server rejects it outright. */\nconst FULL_SCOPES = ['read', 'write', 'delete', 'mcp'] as const;\nconst scopeState = ref<Record<string, boolean>>({\n  read: true,\n  write: false,\n  delete: false,\n  mcp: false,\n});\nconst rootPath = ref('');\nconst expiresInDays = ref<number | null>(null);\n\n/*\n * ⚠ Comments are a permission of their own, with a level (task #157): every\n * key reads them unless it says otherwise, and adding and deleting them is\n * `comments:rw` - `write` does not include it. Only `rw` is sent; the server\n * answers each key's levels in `permissions`, so the list below reads them\n * from there instead of a copy of the default rule.\n */\ntype CommentLevel = 'read' | 'rw';\nconst commentLevel = ref<CommentLevel>('read');\nconst commentOptions = computed<ChoiceOption[]>(() => [\n  { value: 'read', label: t('conn.tokens.commentsRead') },\n  { value: 'rw', label: t('conn.tokens.commentsRw') },\n]);\nfunction commentsOf(row: ApiToken): string {\n  return row.permissions?.comments === 'rw' ? t('conn.tokens.commentsRw') : t('conn.tokens.commentsRead');\n}\n\n/**\n * ⚠⚠ Nothing ticked is not a request (owner's decision, v0.43.0): no door\n * mints a token without an explicit list, and this form used to paper over\n * an empty one with `|| 'read'` — a silent default, the very thing the rule\n * removes. The button waits for a tick and says why.\n */\nconst noScope = computed(() => !FULL_SCOPES.some((s) => scopeState.value[s]));\n\nfunction buildScopes(): string {\n  const parts = FULL_SCOPES.filter((s) => scopeState.value[s]) as string[];\n  const root = rootPath.value.trim();\n  if (root) parts.push('root:' + root);\n  if (commentLevel.value === 'rw') parts.push('comments:rw');\n  return parts.join(',');\n}\n\nonMounted(async () => {\n  await load();\n  emit('active', { hasToken: tokens.value.length > 0 });\n});\n\n/**\n * The name a token gets when the field is left empty — one the user will\n * recognise in the list later.\n *\n * A protocol guide knows both halves: `WebDAV — files.example.com`, the host\n * being the PUBLIC address the guide resolved (connectionsOrigin). The API\n * keys page knows neither, and it used to make a host up from `apiBase`,\n * which is whatever the page happens to talk to: every key on a local\n * instance was called `127.0.0.1:5297`, and that address was printed as the\n * placeholder in the README screenshots. It names the key by the day it was\n * made instead.\n */\nfunction defaultLabel(): string {\n  const p = (props.protocol || '').toUpperCase();\n  if (p) return props.host ? `${p} - ${props.host}` : p;\n  return t('conn.tokens.defaultName', { date: new Date().toISOString().slice(0, 10) });\n}\n\n/** What the empty name field suggests: the saved default on a protocol guide,\n *  an example of a useful name on the API keys page. */\nfunction labelPlaceholder(): string {\n  return props.protocol ? defaultLabel() : t('conn.tokens.namePlaceholder');\n}\n\nasync function mint(): Promise<void> {\n  if (busy.value) return;\n  busy.value = true;\n  copied.value = false;\n  try {\n    if (props.full) {\n      if (noScope.value) return;\n      const scopes = buildScopes();\n      await create({\n        label: label.value.trim() || defaultLabel(),\n        scopes,\n        expires_in_days: expiresInDays.value && expiresInDays.value > 0\n          ? expiresInDays.value\n          : undefined,\n      });\n      await load();\n      emit('active', { hasToken: tokens.value.length > 0 });\n      label.value = '';\n      rootPath.value = '';\n      commentLevel.value = 'read';\n      return;\n    }\n    // ⚠ `read,write,delete` and nothing more. `share` is a web-surface verb\n    // and `admin` is refused by the server anyway; a token for mounting a\n    // drive should not be able to publish public links. The server caps this\n    // again against the caller's own role, so asking is not granting.\n    await create({ label: label.value.trim() || defaultLabel(), scopes: 'read,write,delete' });\n    await load();\n    emit('active', { hasToken: tokens.value.length > 0 });\n    label.value = '';\n  } finally {\n    busy.value = false;\n  }\n}\n\n/** The list's columns — the product's one table (DataTable). */\nconst columns = computed<DataColumn<ApiToken>[]>(() => [\n  {\n    id: 'label',\n    label: t('conn.tokens.col.label'),\n    sortable: true,\n    width: 200,\n    format: (row) => row.label || '-',\n  },\n  { id: 'scopes', label: t('conn.tokens.col.scopes'), sortable: true, width: 200 },\n  {\n    id: 'comments',\n    label: t('conn.tokens.col.comments'),\n    sortable: true,\n    width: 140,\n    format: commentsOf,\n  },\n  {\n    id: 'used',\n    label: t('conn.tokens.col.used'),\n    sortable: true,\n    sortDir: 'desc',\n    width: 140,\n    format: usedLabel,\n    sortValue: (row) => (row.last_used_at ? new Date(row.last_used_at).getTime() : null),\n  },\n]);\n\n/** The row's verbs, behind its one `Actions` control: the comments level\n *  (task #157 - the one thing about a key that can change after it is made),\n *  and revoking. ⚠ Revoke keeps the two-step confirmation it had as a loose\n *  button: the first pick arms it and the label becomes \"Confirm\", the second\n *  pick revokes the token — which also ends any session already open on it. */\nfunction rowActions(row: ApiToken): ContextAction[] {\n  const writes = row.permissions?.comments === 'rw';\n  return [\n    {\n      key: 'comments',\n      label: writes ? t('conn.tokens.commentsToRead') : t('conn.tokens.commentsToRw'),\n      icon: 'rename',\n      disabled: busy.value,\n    },\n    {\n      key: 'revoke',\n      label: confirming.value === row.id ? t('conn.tokens.confirm') : t('conn.tokens.revoke'),\n      icon: 'delete',\n      danger: true,\n      /* The whole control used to be `:disabled=\"busy\"`; the table draws the\n         control, so the verb carries it — RowActions greys a button with\n         nothing usable behind it. */\n      disabled: busy.value,\n    },\n  ];\n}\n\nfunction onRowAction(key: string, row: ApiToken) {\n  if (key === 'revoke') void revoke(row);\n  else if (key === 'comments') void toggleComments(row);\n}\n\nasync function toggleComments(row: ApiToken): Promise<void> {\n  busy.value = true;\n  try {\n    await setPermissions(row.id, { comments: row.permissions?.comments === 'rw' ? 'read' : 'rw' });\n  } finally {\n    busy.value = false;\n  }\n}\n\nasync function revoke(row: ApiToken): Promise<void> {\n  if (confirming.value !== row.id) {\n    confirming.value = row.id;\n    return;\n  }\n  confirming.value = null;\n  busy.value = true;\n  try {\n    await remove(row.id);\n    emit('active', { hasToken: tokens.value.length > 0 });\n  } finally {\n    busy.value = false;\n  }\n}\n\nasync function copySecret(): Promise<void> {\n  if (!revealed.value?.token) return;\n  try {\n    await navigator.clipboard.writeText(revealed.value.token);\n    copied.value = true;\n    window.setTimeout(() => (copied.value = false), 1600);\n  } catch {\n    /* clipboard refused (insecure origin, no permission) — the value is on\n       screen and selectable, which is the fallback that always works. */\n  }\n}\n\n/* zaman:z1 — one date formatter for the package. This was a bare\n * `toLocaleDateString()`: the browser's locale and the browser's zone, so a\n * key minted at 23:30 in Istanbul was dated a day early for a viewer reading\n * UTC and came out in the wrong language besides. */\nfunction fmtDate(v?: string | null): string {\n  const ms = new Date(v ?? '').getTime();\n  return Number.isNaN(ms) ? '' : formatDate(ms);\n}\n\nfunction usedLabel(row: ApiToken): string {\n  return row.last_used_at ? fmtDate(row.last_used_at) : t('conn.tokens.neverUsed');\n}\n</script>\n\n<template>\n  <section class=\"fe-s3keys\" data-testid=\"api-tokens\">\n    <header class=\"fe-s3keys__head\">\n      <h4 class=\"fe-s3keys__title\">{{ t('conn.tokens.title') }}</h4>\n      <p class=\"fe-s3keys__lead\">{{ t('conn.tokens.lead') }}</p>\n    </header>\n\n    <p v-if=\"canMint === false\" class=\"fe-s3keys__muted\">{{ t('conn.tokens.cannotMint') }}</p>\n    <p v-if=\"error\" class=\"fe-s3keys__warn\">{{ error }}</p>\n\n    <div v-if=\"canMint && !full\" class=\"fe-s3keys__form\">\n      <input\n        v-model=\"label\"\n        class=\"fe-cfield__input\"\n        :placeholder=\"labelPlaceholder()\"\n        data-testid=\"token-label\"\n      />\n      <button class=\"fe-s3keys__btn\" :disabled=\"busy\" data-testid=\"token-mint\" @click=\"mint\">\n        {{ t('conn.tokens.mint') }}\n      </button>\n    </div>\n\n    <!-- full — the self-service key manager. Same route, same composable, same\n         list below; only the mint form is richer. -->\n    <div v-else-if=\"canMint\" class=\"fe-tokform\" data-testid=\"token-form-full\">\n      <input\n        v-model=\"label\"\n        class=\"fe-cfield__input\"\n        :placeholder=\"labelPlaceholder()\"\n        data-testid=\"token-label\"\n      />\n\n      <fieldset class=\"fe-tokform__scopes\">\n        <legend class=\"fe-tokform__legend\">{{ t('conn.tokens.scopes') }}</legend>\n        <label v-for=\"s in FULL_SCOPES\" :key=\"s\" class=\"fe-tokform__scope\">\n          <input v-model=\"scopeState[s]\" type=\"checkbox\" :data-testid=\"`token-scope-${s}`\" />\n          <span>{{ s }}</span>\n        </label>\n        <p v-if=\"noScope\" class=\"fe-s3keys__hint fe-tokform__required\" role=\"alert\" data-testid=\"token-scopes-required\">\n          {{ t('conn.tokens.scopesRequired') }}\n        </p>\n      </fieldset>\n\n      <div class=\"fe-tokform__field\">\n        <span id=\"token-comments-label\" class=\"fe-tokform__label\">{{ t('conn.tokens.comments') }}</span>\n        <ChoiceButtons\n          :model-value=\"commentLevel\"\n          :options=\"commentOptions\"\n          aria-labelledby=\"token-comments-label\"\n          testid-prefix=\"token-comments\"\n          @update:model-value=\"(v: string | string[]) => (commentLevel = v as CommentLevel)\"\n        />\n        <p class=\"fe-s3keys__hint\">{{ t('conn.tokens.commentsHint') }}</p>\n      </div>\n\n      <label class=\"fe-tokform__field\">\n        <span class=\"fe-tokform__label\">{{ t('conn.tokens.root') }}</span>\n        <input\n          v-model=\"rootPath\"\n          class=\"fe-cfield__input\"\n          :placeholder=\"t('conn.tokens.rootPlaceholder')\"\n          data-testid=\"token-root\"\n        />\n      </label>\n\n      <div class=\"fe-tokform__row\">\n        <label class=\"fe-tokform__field fe-tokform__field--narrow\">\n          <span class=\"fe-tokform__label\">{{ t('conn.tokens.expiry') }}</span>\n          <input\n            v-model.number=\"expiresInDays\"\n            type=\"number\"\n            min=\"0\"\n            class=\"fe-cfield__input\"\n            :placeholder=\"t('conn.tokens.expiryNever')\"\n            data-testid=\"token-expiry\"\n          />\n        </label>\n        <button class=\"fe-s3keys__btn\" :disabled=\"busy || noScope\" data-testid=\"token-mint\" @click=\"mint\">\n          {{ t('conn.tokens.mint') }}\n        </button>\n      </div>\n\n      <!-- Said before the refusal rather than after it: the server caps every\n           scope against the account's own role and grants. -->\n      <p class=\"fe-s3keys__hint\">{{ t('conn.tokens.capNote') }}</p>\n    </div>\n\n    <!-- The secret, once. -->\n    <div v-if=\"revealed\" class=\"fe-s3keys__secret\" data-testid=\"token-secret\">\n      <p class=\"fe-s3keys__once\">{{ t('conn.tokens.once') }}</p>\n      <div class=\"fe-s3keys__pair\">\n        <code>{{ revealed.token }}</code>\n        <button class=\"fe-s3keys__copy\" @click=\"copySecret\">\n          {{ copied ? t('conn.guide.copied') : t('conn.guide.copy') }}\n        </button>\n      </div>\n      <button class=\"fe-s3keys__dismiss\" @click=\"dismiss\">\n        {{ t('conn.tokens.dismiss') }}\n      </button>\n    </div>\n\n    <!-- ⚠ THE table (DataTable — the explorer's own), not a table of its own.\n         This panel is reachable from the admin panel's Connections menu and\n         from the explorer, so its list resizes, sorts, hides and moves columns\n         and remembers that on the account (`conn.tokens`), like every other\n         table. The raised ground is the panel's own (`.fe-s3keys` sets\n         `--tbl-bg` once). -->\n    <p v-if=\"loading\" class=\"fe-s3keys__muted\">…</p>\n    <DataTable\n      v-else\n      table-id=\"conn.tokens\"\n      :columns=\"columns\"\n      :rows=\"tokens\"\n      row-key=\"id\"\n      :locale=\"locale\"\n      :empty=\"t('conn.tokens.empty')\"\n      :row-actions=\"rowActions\"\n      :row-actions-test-id=\"(row: ApiToken) => `api-token-actions-${row.id}`\"\n      @row-action=\"(key: string, row: ApiToken) => onRowAction(key, row)\"\n    >\n      <template #cell-scopes=\"{ row }\">\n        <code class=\"tbl-mono\">{{ row.scopes }}</code>\n      </template>\n    </DataTable>\n\n    <!-- ⚠ Said next to the button rather than in a document nobody opens: a\n         revoked token stops a session that is already open, not only the next\n         login. That is a change in behaviour worth knowing before relying on\n         it, and it is the honest answer to \"how do I stop this machine\". -->\n    <p v-if=\"canMint\" class=\"fe-s3keys__hint\">{{ t('conn.tokens.revokeHint') }}</p>\n  </section>\n</template>\n","<script setup lang=\"ts\">\n/**\n * ConnectionsPanel — how to connect your computer to this server.\n *\n * ⚠⚠ This component is the reason the feature exists ONCE. The desktop\n * app, the web app and any embed mount this same file; none of them owns a\n * hand-written copy of the credential panels or the instructions. A fix here\n * lands everywhere on the next release of the package, which is precisely\n * the standing rule (\"never write surface-specific behaviour\") applied to a\n * feature that was asked for on three surfaces at once.\n *\n * ONE question, answered for the protocol you pick: \"connect my computer to\n * filex\". Generated from the live deployment — the real host, the storage\n * name, the caller's own username — with the credential each protocol needs\n * minted right above the commands that use it, and a copy button.\n *\n * ⚠ There is NO storage form here, and there has not been one since v0.43.0.\n * The owner, testing the release: \"nasıl bağlanılır kısmında ve adminde\n * bağlantılar sayfası … ikisinde de depolar gözüküyor bu depolar sekmesine\n * hiç ihtiyaç yok. kaldıralım.\" Managing storages is a console job and it\n * already had a console: Admin → Storages (create, edit, delete, plus sync\n * mode, RBAC, drift — everything this panel's half never had). Browsing the\n * storages you can see is the explorer's navigation panel. A second, poorer\n * copy of the first in the screen that answers the OTHER question was the\n * whole complaint; do not bring it back, extend Admin → Storages instead.\n */\nimport { computed, onMounted, ref, watch } from 'vue';\nimport type { ExplorerConfig, LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { useSystemDark } from '../composables/useSystemDark';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { useConnections, connectionsOrigin } from '../composables/useConnections';\nimport {\n  buildGuide,\n  guideName,\n  guideProtocols,\n  guideUser,\n  hostOf,\n  type ProtocolGuide,\n} from '../lib/connectionGuides';\nimport ConnectionGuideView from './ConnectionGuideView.vue';\nimport ChoiceSelect, { type SelectOption } from './ChoiceSelect.vue';\nimport S3KeysPanel from './S3KeysPanel.vue';\nimport SSHKeysPanel from './SSHKeysPanel.vue';\nimport NFSExportsPanel from './NFSExportsPanel.vue';\nimport TokensPanel from './TokensPanel.vue';\nimport { resolveLocale } from '../locales/resolve';\n\nconst props = defineProps<{\n  config: ExplorerConfig;\n  /** Draw a close control — the desktop app opens this as a full surface\n   *  and needs a way out; a page-embedded copy has the page's own chrome. */\n  closable?: boolean;\n}>();\n\n/* ⚠ No `changed`. It existed for one reason — a storage added or removed in\n   this panel had to reach the host's own list — and this panel no longer\n   adds or removes one. An event that can never fire is worse than none: every\n   host wires a handler for it and then trusts a refresh that never comes. */\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'error', err: { message: string }): void;\n}>();\n\nconst locale = computed<LocaleCode>(() => resolveLocale(props.config.locale));\nconst { t } = useLocale(locale);\n\n// Destructured on purpose: Vue only auto-unwraps refs that are top-level in\n// the setup scope, so `conn.storages` inside a template would render a Ref\n// object rather than its value.\nconst { visible, me, realm, publicUrl, error, load } = useConnections(props.config);\n\n/** The name a WebDAV client signs in with (lib/connectionGuides `guideUser`):\n *  the e-mail, with a tenant account's realm in front on a multi-tenant\n *  server. The SFTP/FTPS login comes from the server already written that way. */\nconst guideUserName = computed(() => guideUser(me.value?.email ?? '', realm.value));\n\n// ── theme ────────────────────────────────────────────────────────────\n// Resolved in JS rather than left to `prefers-color-scheme`, because the\n// stylesheet's auto rule keys off the explorer's own `.fe` root and this\n// panel is mounted on its own.\nconst osDark = useSystemDark();\nconst themeResolved = computed(() => {\n  const mode = props.config.theme ?? 'auto';\n  if (mode === 'light' || mode === 'dark') return mode;\n  return osDark.value ? 'dark' : 'light';\n});\n\n// ── outward: the guides ──────────────────────────────────────────────\nconst protocols = guideProtocols();\nconst protocol = ref(protocols[0] ?? 'webdav');\nconst guideStorage = ref<string>('');\n/* The two pickers above the guide (#160: the shared list, no native select). */\nconst protocolChoices = computed<SelectOption[]>(() => protocols.map((p) => ({ value: p, label: guideName(p) })));\nconst storageChoices = computed<SelectOption[]>(() => [\n  { value: '', label: t('conn.guide.allStorages') },\n  ...visible.value.map((s) => ({ value: s, label: s })),\n]);\n\n/** What the NFS panel published: where to mount, and the path just minted. */\nconst nfs = ref<{ host: string; port: number; enabled: boolean; path?: string; readOnly: boolean } | null>(\n  null,\n);\n\nconst origin = computed(() => connectionsOrigin(props.config, publicUrl.value));\n\n/**\n * What the S3 key panel published: the caller's own key, the endpoint the\n * SERVER computed, and whether path-style is mandatory.\n *\n * ⚠ The endpoint is not derived here. With a dedicated host it is a different\n * host from the application, and a guide that assembled it from the page\n * origin would print a URL that reaches the web app — which is exactly how the\n * first real-client run failed.\n */\nconst s3 = ref<{ accessKeyID: string; secret?: string; endpoint: string; pathStyle: boolean } | null>(\n  null,\n);\n\n/**\n * What the SSH key panel published: where the SFTP endpoint listens, the login\n * name the account actually uses, and whether a key is registered.\n *\n * ⚠ The port comes from the SERVER. SFTP is raw TCP on a port of its own, and a\n * page that printed the web port would send every client at a proxy that speaks\n * only HTTP.\n */\nconst sftp = ref<{\n  host: string;\n  port: number;\n  login: string;\n  enabled: boolean;\n  hasKey: boolean;\n  ftps?: { enabled: boolean; host: string; port: number; pasv_min: number; pasv_max: number; self_signed: boolean };\n} | null>(null);\n\nconst guide = computed<ProtocolGuide | null>(() =>\n  buildGuide(\n    protocol.value,\n    {\n      origin: origin.value,\n      user: guideUserName.value,\n      storages: visible.value,\n      storage: guideStorage.value || undefined,\n      s3Endpoint: s3.value?.endpoint,\n      s3PathStyle: s3.value?.pathStyle,\n      s3AccessKeyID: s3.value?.accessKeyID || undefined,\n      s3Secret: s3.value?.secret,\n      sftpHost: sftp.value?.host || undefined,\n      sftpPort: sftp.value?.port,\n      sftpEnabled: sftp.value?.enabled,\n      sftpLogin: sftp.value?.login || undefined,\n      sftpHasKey: sftp.value?.hasKey,\n      ftpsHost: sftp.value?.ftps?.host || undefined,\n      ftpsPort: sftp.value?.ftps?.port,\n      ftpsEnabled: sftp.value?.ftps?.enabled,\n      ftpsPasvMin: sftp.value?.ftps?.pasv_min,\n      ftpsPasvMax: sftp.value?.ftps?.pasv_max,\n      ftpsSelfSigned: sftp.value?.ftps?.self_signed,\n      nfsHost: nfs.value?.host || undefined,\n      nfsPort: nfs.value?.port,\n      nfsEnabled: nfs.value?.enabled,\n      nfsPath: nfs.value?.path,\n      nfsReadOnly: nfs.value?.readOnly,\n    },\n    t,\n  ),\n);\n\nwatch(\n  () => visible.value,\n  (names) => {\n    if (!guideStorage.value && names.length === 1) guideStorage.value = names[0];\n  },\n);\n\n// ── lifecycle ────────────────────────────────────────────────────────\nonMounted(() => {\n  void load();\n});\n\n// The panel is often mounted once and re-pointed (the desktop app switches\n// accounts without tearing the window down), so a changed server must\n// re-fetch rather than keep showing the previous one's storages.\nwatch(\n  () => [props.config.apiBase, props.config.endpoint],\n  () => {\n    void load();\n  },\n);\n</script>\n\n<template>\n  <div\n    class=\"fe-conn\"\n    :class=\"{\n      'fe--theme-dark': themeResolved === 'dark',\n      'fe--theme-light': themeResolved === 'light',\n    }\"\n    data-testid=\"connections-panel\"\n  >\n    <header class=\"fe-conn__head\">\n      <div>\n        <h2 class=\"fe-conn__title\">{{ t('conn.title') }}</h2>\n        <p class=\"fe-conn__sub\">{{ t('conn.subtitle', { host: hostOf(origin) }) }}</p>\n      </div>\n      <button\n        v-if=\"closable\"\n        type=\"button\"\n        class=\"fe-conn__btn\"\n        data-testid=\"connections-close\"\n        :aria-label=\"t('conn.close')\"\n        @click=\"emit('close')\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n      </button>\n    </header>\n\n    <!-- ⚠ The server's own words when the storage list cannot be fetched. It\n         used to be printed by the storage half, which is gone; the guides\n         below are built from that same list, so swallowing the failure here\n         would leave a page of instructions quietly missing its storages. -->\n    <p v-if=\"error\" class=\"fe-conn__error\" data-testid=\"conn-error\">{{ error }}</p>\n\n    <section class=\"fe-conn__body\">\n      <div class=\"fe-conn__guidebar\">\n        <label v-if=\"protocols.length > 1\" class=\"fe-conn__pick\">\n          <span class=\"fe-cfield__label\">{{ t('conn.guide.protocol') }}</span>\n          <ChoiceSelect\n            :model-value=\"protocol\"\n            :options=\"protocolChoices\"\n            testid=\"guide-protocol\"\n            @update:model-value=\"(v) => (protocol = String(v))\"\n          />\n        </label>\n        <label class=\"fe-conn__pick\">\n          <span class=\"fe-cfield__label\">{{ t('conn.guide.storage') }}</span>\n          <ChoiceSelect\n            :model-value=\"guideStorage\"\n            :options=\"storageChoices\"\n            testid=\"guide-storage\"\n            @update:model-value=\"(v) => (guideStorage = String(v))\"\n          />\n        </label>\n      </div>\n\n      <!-- The keys come first: the guide below is filled in from whichever\n           key is active, so minting one rewrites every command on the page. -->\n      <S3KeysPanel\n        v-if=\"protocol === 's3'\"\n        :config=\"config\"\n        :storages=\"visible\"\n        @active=\"s3 = $event\"\n      />\n\n      <!-- The same shape for SFTP: the credential first, because the commands\n           below are only worth anything with a real login name in them. -->\n      <!-- Mounted for FTPS too: it is the same call that reports where the FTP\n           endpoint listens, and the login name is the same one. -->\n      <SSHKeysPanel\n        v-if=\"protocol === 'sftp' || protocol === 'ftps'\"\n        :config=\"config\"\n        :keys-visible=\"protocol === 'sftp'\"\n        @active=\"sftp = $event\"\n      />\n\n      <NFSExportsPanel\n        v-if=\"protocol === 'nfs'\"\n        :config=\"config\"\n        :storages=\"visible\"\n        @active=\"nfs = $event\"\n      />\n\n      <!-- ⚠⚠ The credential for the other three. FTPS, WebDAV and `filex\n           mount` all take an API TOKEN as the password — the guides below say\n           so — and until this panel existed the only place to mint one was the\n           admin panel, so a normal user read the instruction and had nowhere\n           to follow it. Same component on all three surfaces. -->\n      <TokensPanel\n        v-if=\"protocol === 'ftps' || protocol === 'webdav' || protocol === 'mount'\"\n        :config=\"config\"\n        :protocol=\"protocol\"\n        :host=\"hostOf(origin)\"\n      />\n\n      <ConnectionGuideView v-if=\"guide\" :guide=\"guide\" :locale=\"locale\" />\n    </section>\n  </div>\n</template>\n\n<style>\n.fe-conn {\n  display: flex;\n  flex-direction: column;\n  gap: 14px;\n  font-family: var(--fe-font);\n  font-size: 14px;\n  color: var(--fe-text);\n  /* ⚠ No painted ground. This is a SECTION of whatever page mounts it, not a\n     full-bleed app like the explorer, and every host paints its own page:\n     the web admin's dark shell is zinc #09090b, the desktop's is #14181d,\n     the light shells are #fafafa / #ffffff. `background: var(--fe-bg)`\n     (#0f1419 / #ffffff) drew a slightly-different rectangle behind the\n     panel that ended where the panel ended — measured on demo.filex.sh\n     2026-08-18 in dark mode: a blue-black box on a zinc page, cards and\n     inputs inside it on their own tint. The tokens still colour the cards,\n     inputs and buttons; only the page ground belongs to the host. */\n  background: transparent;\n  min-width: 0;\n}\n/* An explicit light palette, so a panel asked for light stays light even\n   inside a host that publishes dark tokens at :root (the admin shell sets\n   `.dark` on <html>). Without this, \"light\" only means \"not dark\". */\n.fe-conn.fe--theme-light {\n  --fe-bg: #ffffff;\n  --fe-bg-elev: #f7f8fa;\n  --fe-bg-hover: #edf0f5;\n  --fe-border: #e2e6ed;\n  --fe-border-strong: #c7ced9;\n  --fe-text: #1a1e27;\n  --fe-text-muted: #5a6475;\n  --fe-primary: #2f6fe0;\n  --fe-danger: #dc2626;\n}\n.fe-conn__head {\n  display: flex;\n  align-items: flex-start;\n  justify-content: space-between;\n  gap: 16px;\n}\n/* ⚠ The component renders into the HOST's document (shadowRoot: false, on\n   purpose — Tailwind, OS dark mode and the host's fonts are meant to reach\n   it). That also means the host's element selectors reach it: the desktop\n   shell styles `h2 { text-transform: uppercase; letter-spacing: .05em }`\n   for its own section headings, and the panel's title came out\n   \"STORAGE CONNECTIONS\" there while the web app rendered\n   \"Storage connections\". Same component, two typographies, decided by\n   whichever page it landed on — which is the split this package exists to\n   prevent. Headings state their own type. */\n.fe-conn h2,\n.fe-conn h3,\n.fe-conn h4 {\n  text-transform: none;\n  letter-spacing: normal;\n}\n.fe-conn__title {\n  margin: 0;\n  font-size: 17px;\n  font-weight: 650;\n}\n.fe-conn__sub {\n  margin: 3px 0 0;\n  color: var(--fe-text-muted);\n  font-size: 13px;\n  overflow-wrap: anywhere;\n}\n.fe-conn__body {\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n  min-width: 0;\n}\n.fe-conn__error {\n  margin: 0;\n  color: var(--fe-danger);\n  font-size: 13px;\n  overflow-wrap: anywhere;\n}\n.fe-conn__btn {\n  font: inherit;\n  font-size: 13px;\n  padding: 6px 12px;\n  border-radius: var(--fe-radius);\n  border: 1px solid var(--fe-border-strong);\n  background: var(--fe-bg);\n  color: var(--fe-text);\n  cursor: pointer;\n}\n.fe-conn__btn:hover:not(:disabled) {\n  border-color: var(--fe-primary);\n}\n.fe-conn__btn:disabled {\n  opacity: 0.55;\n  cursor: default;\n}\n.fe-conn__guidebar {\n  display: flex;\n  gap: 12px;\n  flex-wrap: wrap;\n}\n.fe-conn__pick {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  min-width: 180px;\n}\n</style>\n","/**\n * gorunum:v1-advsearch — the model behind the Advanced search dialog.\n *\n * ⚠⚠ 0.54 (task #207, audit D6): the split described below is HISTORY. Every\n * choice in `filters` now travels to the server as a parameter\n * (`advFilterParams`: type, modified_after/before, min/max_size, under,\n * not_under, owner, hidden) and the server applies it to each candidate\n * BEFORE it cuts its page, on `/api/files/search` and on the manager's\n * `action=search` alike, and MCP `file_search` and the CLI take the same\n * parameters. The browser no longer narrows search hits; the count is the\n * server's rows and its `truncated` says whether the page was cut.\n *\n * Kept out of the component so the two halves of a search can be read (and\n * tested) side by side, because the honesty of the whole feature lives in the\n * split:\n *\n *   SERVER — `text`, `tags`, `excludeTags`, `scope`. These are the ONLY things\n *   filex's search endpoints actually read. `GET|POST /api/files/search` takes\n *   `q`/`query`, `storage_id`, `limit` and `scope` (name|content|all) and\n *   nothing else (handlers/search.go `searchRequest`); the query text may carry\n *   `tag:x` / `-tag:x`, which the backend parses out and resolves against the\n *   database (docs/SEARCH.md, \"Filtering by tag\"). The manager's\n *   `?action=search&filter=…` speaks the same query language.\n *\n *   CLIENT — everything in `filters` (`lib/fileFilters.ts`). There is no date,\n *   size, mime or path parameter on either endpoint, so those four narrow the\n *   rows that came back. That is the same bargain the filter row already makes\n *   and is documented at the top of fileFilters.ts.\n *\n * ⚠ The one thing that is NOT the same bargain: over a folder listing the rows\n * in hand ARE the folder, so a client-side filter is a complete answer. Over a\n * SEARCH result they are the first N hits the ranker returned (50 by default on\n * `/api/files/search`, 250 on the manager's search action). A size range over\n * that is a filter over what came back — true of the rows shown, not a\n * statement about the storage. The dialog prints that rather than implying a\n * full scan; see `advSearchTruncated`.\n *\n * ⚠ Owner USED to be on this list, with the reason \"there is no per-node owner\n * on the wire at all\". Migration 00038 made ownership a real fact on the row\n * and the listing projection carries `owner_id` / `owner_name` / `owner_self`,\n * so `filters.people` is now a client-side filter over a field the rows\n * ALREADY carry — exactly the bargain the other four make. The rule did not\n * bend; the data arrived.\n *\n * What is still NOT modelled here, because nothing could carry it:\n *   - A \"paths\" scope. `scope` accepts exactly name|content|all\n *     (search.ParseScope); paths are matched *within* the name scope and cannot\n *     be selected on their own. Measured against the reference build on\n *     2026-09-13: its `scope:\"path\"` returns the byte-identical result set its\n *     `scope:\"name\"` returns, over every query tried.\n *   - \"Match whole phrase\". The query language has no phrase operator — the\n *     only quoting the parser knows keeps a `tag:\"two words\"` value together\n *     (search.splitQuery/unquote), and a quoted free-text token keeps its\n *     quotes and is matched with them.\n */\nimport type { DriveFilters, PeopleOption } from './fileFilters';\nimport { EMPTY_FILTERS, modifiedWindow, sizeBounds } from './fileFilters';\nimport { splitList } from './listInput';\n\n/** Which fields the backend consults. Mirrors `search.ParseScope`. */\nexport type AdvScope = 'name' | 'content' | 'all';\n\n/**\n * What one live-count run reports back.\n *\n * `capped` is the honest half: true when the server returned as many hits as\n * it was allowed to, so the client-side filters narrowed a window rather than\n * the whole result set and the number is \"N of the first page\", not \"N in the\n * storage\". The dialog prints a different sentence for each.\n */\nexport interface AdvCountResult {\n  count: number;\n  capped: boolean;\n  /**\n   * The per-account People members the counted rows actually contained\n   * (`peopleOptions(rows)` minus the three fixed ones), so the Owner select\n   * can offer a name without asking for a user directory it must not have.\n   *\n   * ⚠ Optional. A caller that does not report them — the explorer does not\n   * yet — leaves the select with `Anyone` / `You` / `System`, which is three\n   * working members, not a broken menu. The field exists so the follow-up is\n   * one change in the shell that owns the API client, not a second change in\n   * this component.\n   */\n  people?: PeopleOption[];\n}\n\nexport interface AdvSearchRequest {\n  /** Free text. Never carries `tag:` tokens — those live in the two arrays. */\n  text: string;\n  /** ANDed include filters, emitted as `tag:x`. */\n  tags: string[];\n  /** Exclusions, emitted as `-tag:x`. Applied after the includes. */\n  excludeTags: string[];\n  scope: AdvScope;\n  /** The client-side half. Same model and same predicate as the filter row. */\n  filters: DriveFilters;\n}\n\nexport function emptyAdvSearch(pathBase = ''): AdvSearchRequest {\n  return {\n    text: '',\n    tags: [],\n    excludeTags: [],\n    scope: 'name',\n    filters: { ...EMPTY_FILTERS, pathBase },\n  };\n}\n\n/** A tag value only needs quoting when it contains whitespace — the parser\n *  splits on spaces unless a double quote is open (search.splitQuery). */\nfunction tagToken(tag: string, negated: boolean): string {\n  const v = tag.trim();\n  if (!v) return '';\n  const body = /\\s/.test(v) ? `\"${v}\"` : v;\n  return `${negated ? '-' : ''}tag:${body}`;\n}\n\n/**\n * The string that actually goes on the wire, as `q` / `filter`.\n *\n * Text first so the free-text half reads the way the user typed it, then the\n * tag filters. A bare `tag:x` with no text is legal and means \"list the files\n * carrying that tag, newest first\" — the backend says so explicitly, so an\n * empty `text` is not an empty search.\n */\nexport function advQueryString(req: AdvSearchRequest): string {\n  const parts: string[] = [];\n  const text = req.text.trim();\n  if (text) parts.push(text);\n  for (const t of req.tags) {\n    const tok = tagToken(t, false);\n    if (tok) parts.push(tok);\n  }\n  for (const t of req.excludeTags) {\n    const tok = tagToken(t, true);\n    if (tok) parts.push(tok);\n  }\n  return parts.join(' ');\n}\n\n/**\n * The narrowing as the server reads it (internal/nodefilter Parse): one\n * parameter per choice, absent when the choice narrows nothing. Dates are the\n * viewer's own clock turned into epoch milliseconds here - \"today\" is their\n * midnight, which only the browser knows - and the server compares them.\n *\n * `showHidden` is the explorer's \"show hidden files\" choice: off sends\n * `hidden=false`, so dot names are dropped before the page is cut rather than\n * after (a page of 250 hits could otherwise shrink to a handful).\n */\nexport function advFilterParams(\n  f: DriveFilters,\n  now: number = Date.now(),\n  opts: { showHidden?: boolean } = {},\n): Record<string, string> {\n  const out: Record<string, string> = {};\n  if (f.type && f.type !== 'any') out.type = f.type === 'folder' ? 'dir' : f.type;\n  const w = modifiedWindow(f, now);\n  if (w?.after !== undefined) out.modified_after = String(Math.floor(w.after));\n  if (w?.before !== undefined) out.modified_before = String(Math.floor(w.before));\n  const b = sizeBounds(f);\n  if (b?.min !== undefined) out.min_size = String(Math.max(0, Math.floor(b.min)));\n  if (b?.max !== undefined) out.max_size = String(Math.max(0, Math.floor(b.max)));\n  const base = (f.pathBase ?? '').replace(/\\/+$/, '');\n  if (base && f.pathMode === 'here') out.under = base;\n  if (base && f.pathMode === 'skip') out.not_under = base;\n  const who = f.people ?? 'any';\n  if (who === 'me' || who === 'system') out.owner = who;\n  else if (who.startsWith('u:')) out.owner = who.slice(2);\n  if (opts.showHidden === false) out.hidden = 'false';\n  return out;\n}\n\n/** Nothing for the server to answer — no text and no tag filter. */\nexport function advSearchEmpty(req: AdvSearchRequest): boolean {\n  return advQueryString(req) === '';\n}\n\n/**\n * Split a comma/newline separated tag box into values.\n *\n * Commas rather than spaces, because a tag may contain a space\n * (`quarterly report`) and splitting on whitespace would turn one filter that\n * matches into two that do not — and a tag that does not exist returns the\n * empty set by design, so the mistake would look like \"there is nothing here\".\n */\nexport function parseTagList(raw: string): string[] {\n  // ⚠ lib/listInput: \"،\" and \"，\" are commas too (an Arabic or Chinese keyboard).\n  return splitList(raw, { newlines: true });\n}\n\n/**\n * True when the hit list was cut, so the client-side filters ran over a window\n * rather than over everything that matches.\n *\n * The dialog and the count line say this out loud. A count that silently\n * describes \"the first 50 hits, then filtered\" as \"N matching items\" is the\n * exact shape of a number that looks measured and is not.\n *\n * `serverSaid` is the response's own `truncated` flag, and when the server\n * sends one it is the answer. Only the server knows: without the index the\n * manager reads a window of names several times the page size, so 400 rows can\n * be a complete answer and 12 a cut one (the window was full and only 12 of\n * its rows matched every word). A server too old to say leaves the guess this\n * function always made — a full page is a cut page.\n */\nexport function advSearchTruncated(returned: number, limit: number, serverSaid?: boolean): boolean {\n  // (0.54: the server narrows before it cuts, so its flag covers the\n  // narrowing too.)\n  if (typeof serverSaid === 'boolean') return serverSaid;\n  return returned >= limit;\n}\n","<script setup lang=\"ts\">\n/**\n * ShortcutsHelp — \"?\" cheat-sheet modal.\n *\n * wiring:c2 — renders the live shortcut registry (useShortcutList) so\n * user remaps show up here too, grouped by section. Unbound actions are\n * listed with an \"unassigned\" chip. The footer carries a \"Customize\"\n * button that asks the host to open ShortcutSettings. Modal.vue\n * supplies Esc handling, backdrop, focus and the close button.\n */\nimport { computed } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { useShortcutList, type ShortcutView } from '../composables/useKeyboardShortcuts';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'customize'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst list = useShortcutList();\n\nconst groups = computed(() => {\n  const order: string[] = [];\n  const map = new Map<string, ShortcutView[]>();\n  for (const s of list.value) {\n    if (!map.has(s.groupKey)) {\n      map.set(s.groupKey, []);\n      order.push(s.groupKey);\n    }\n    map.get(s.groupKey)!.push(s);\n  }\n  return order.map((key) => ({ key, items: map.get(key)! }));\n});\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('shortcuts.title')\" size=\"md\" @close=\"emit('close')\">\n    <div class=\"fe-shortcuts\">\n      <section v-for=\"g in groups\" :key=\"g.key\" class=\"fe-shortcuts__group\">\n        <h3 class=\"fe-shortcuts__heading\">{{ t(g.key) }}</h3>\n        <div class=\"fe-shortcuts__table\">\n          <div v-for=\"s in g.items\" :key=\"s.id\" class=\"fe-shortcuts__row\">\n            <span class=\"fe-shortcuts__keys\">\n              <template v-if=\"s.keys.length === 0\">\n                <span class=\"fe-shortcuts__unbound\">{{ t('shortcuts.settings.unbound') }}</span>\n              </template>\n              <template v-for=\"(combo, i) in s.keys\" v-else :key=\"combo\">\n                <kbd class=\"fe-kbd\">{{ combo }}</kbd>\n                <span v-if=\"i < s.keys.length - 1\" class=\"fe-shortcuts__or\" aria-hidden=\"true\">/</span>\n              </template>\n            </span>\n            <span class=\"fe-shortcuts__desc\">\n              {{ t(s.labelKey) }}\n              <span\n                v-if=\"s.overridden\"\n                class=\"fe-shortcuts__custom\"\n                :title=\"t('shortcuts.settings.customized')\"\n              >●</span>\n            </span>\n          </div>\n        </div>\n      </section>\n    </div>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"emit('customize')\">\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('shortcut-settings')\"></span>\n        {{ t('shortcuts.customize') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">{{ t('viewer.close') }}</button>\n    </template>\n  </Modal>\n</template>\n","/**\n * catalogCoverage — how much of a storage its catalog covers, as the server\n * says it, and the one set of rules every view draws that by.\n *\n * filex keeps a catalog of every storage, and search, folder sizes and drive\n * usage are answered from it. While it does not cover a storage in full the\n * server says so (docs/LAZY-CATALOGUE.md → \"Coverage in the UI\"):\n *\n *   - `first_scan`   — any storage whose first sync has not finished;\n *   - `lazy_filling` — a lazily cataloged storage whose background pass is\n *                      still going (behaviour A);\n *   - `lazy_on_open` — a lazily cataloged storage that catalogs only the\n *                      folders people open (behaviour B).\n *\n * The listing and search responses carry it per storage in `storage_info`,\n * drive usage per row. A folder row whose own size leaves something out\n * carries `size_partial` (see useLocale `formatNodeSize`).\n *\n * ⚠ One module for the whole explorer: the banner over a listing, the banner\n * over search results and Home's drive cards read the SAME object through the\n * SAME rules, so they cannot tell a person two different things about one\n * storage.\n */\n\n/** Why a storage's catalog is not complete. */\nexport type CoverageReason = 'first_scan' | 'lazy_filling' | 'lazy_on_open';\n\n/** The server's `coverage` object (sync.CatalogueCoverage). */\nexport interface CatalogCoverage {\n  complete: boolean;\n  reason?: CoverageReason | string;\n  /** `lazy` for a lazily cataloged storage. */\n  mode?: string;\n  /** The lazy behaviour: `background` (A) or `on_open` (B). */\n  fill?: string;\n  catalogued_folders?: number;\n  pending_folders?: number;\n  watched_folders?: number;\n  max_watches?: number;\n  filler?: string;\n  held_back_folders?: number;\n  reconciles?: number;\n}\n\n/** One entry of a listing's `storage_info`. */\nexport interface StorageInfo {\n  name: string;\n  read_only?: boolean;\n  coverage?: CatalogCoverage | null;\n}\n\n/** A coverage object worth telling anybody about, or null. */\nexport function incomplete(c: CatalogCoverage | null | undefined): CatalogCoverage | null {\n  if (!c || typeof c !== 'object' || c.complete === true) return null;\n  return c;\n}\n\n/**\n * The share of the folders found so far that are cataloged, 0–99 while any\n * is still waiting (a floor, so \"100%\" is never shown beside a notice that\n * says the work is not done).\n */\nexport function coveragePercent(c: CatalogCoverage): number {\n  const done = Math.max(0, c.catalogued_folders ?? 0);\n  const pending = Math.max(0, c.pending_folders ?? 0);\n  if (done + pending === 0) return 0;\n  const pct = Math.floor((done * 100) / (done + pending));\n  return pending > 0 ? Math.min(pct, 99) : pct;\n}\n\n/** The sentence one storage's coverage is told in: a catalog key and its values. */\nexport function coverageMessage(c: CatalogCoverage): { key: string; vars: Record<string, number> } {\n  switch (c.reason) {\n    case 'lazy_on_open':\n      return { key: 'coverage.lazy_on_open', vars: {} };\n    case 'lazy_filling':\n      return { key: 'coverage.lazy_filling', vars: { pct: coveragePercent(c) } };\n    default:\n      return { key: 'coverage.first_scan', vars: {} };\n  }\n}\n\n/** `storage_info` → storage name → its incomplete coverage (null = complete). */\nexport function coverageByStorage(info: unknown): Record<string, CatalogCoverage | null> {\n  const out: Record<string, CatalogCoverage | null> = {};\n  if (!Array.isArray(info)) return out;\n  for (const row of info as StorageInfo[]) {\n    if (!row || typeof row.name !== 'string' || row.name === '') continue;\n    out[row.name] = incomplete(row.coverage ?? null);\n  }\n  return out;\n}\n\n/** What the banner over a listing or a search says, and whether it offers an action. */\nexport interface CoverageNotice {\n  key: string;\n  vars: Record<string, string | number>;\n  /** The storage the notice is about, when it is about one. */\n  storage?: string;\n  /** Offer \"Catalog everything\" (an administrator, behaviour B). */\n  offerCatalogAll: boolean;\n}\n\n/**\n * The notice for what is on screen.\n *\n *   - A listing, or a search inside one storage: that storage's coverage.\n *   - A search that spans every storage (the server searches them all when\n *     the query is typed at a storage's root and there is more than one):\n *     the names of the ones not fully cataloged.\n *\n * `admin` decides the action only; everybody reads the same sentence.\n */\nexport function coverageNotice(opts: {\n  map: Record<string, CatalogCoverage | null>;\n  adapter: string;\n  searching: boolean;\n  crossStorage: boolean;\n  admin: boolean;\n}): CoverageNotice | null {\n  const { map, adapter, searching, crossStorage, admin } = opts;\n  if (searching && crossStorage) {\n    const names = Object.keys(map)\n      .filter((n) => map[n] !== null)\n      .sort((a, b) => a.localeCompare(b));\n    if (names.length === 0) return null;\n    if (names.length === 1) return single(names[0], map[names[0]] as CatalogCoverage, admin);\n    return { key: 'coverage.search_some', vars: { names: names.join(', ') }, offerCatalogAll: false };\n  }\n  const c = map[adapter];\n  return c ? single(adapter, c, admin) : null;\n}\n\nfunction single(storage: string, c: CatalogCoverage, admin: boolean): CoverageNotice {\n  const m = coverageMessage(c);\n  return { key: m.key, vars: m.vars, storage, offerCatalogAll: admin && c.reason === 'lazy_on_open' };\n}\n","/**\n * Which of the listings in flight the explorer shows: the NEWEST asked for.\n *\n * ⚠⚠ A folder's address (`currentPath`) moves when its listing answers, and\n * two listings can be out at once. Measured in the 0.50 integration run (e2e\n * 172): an upload into Eski/alt reached the disk, the person clicked \"Eski\" in\n * the breadcrumb (its listing went out), and then the upload answered and\n * reloaded the folder still on screen - Eski/alt. Eski answered first, alt\n * last, and the explorer went back into alt: the click was undone.\n *\n * So every loader takes a ticket when it starts and commits nothing - rows,\n * address, selection, error state - unless no newer ticket was taken since\n * (`isNewest`). A reload with no path (an action's refresh, the realtime\n * layer, Refresh) goes where the newest folder load is GOING, not to the\n * folder still on screen (`begin`). A panel view (Starred, Recent, a tag, the\n * trash) moves its address at once (lesson #608) and takes a ticket too\n * (`view`), so a folder's answer that arrives after it cannot paint over it.\n *\n * ⚠⚠ And `await load(x)` resolves when the explorer SHOWS the newest listing\n * (`follow`), not when its own answer was thrown away. Measured in the 0.50\n * final run (e2e 174, then forced in the browser): \"Encrypt with E2EE…\" on an\n * existing folder writes the key file, awaits `load(folder)` and starts the\n * conversion only if the explorer is in that folder by then. The key file's\n * own change event made the realtime layer reload while that listing was\n * out; the reload went to the same folder and took the newer ticket, so the\n * dialog's listing committed nothing and its `await` returned with the\n * explorer still on the parent. The reload committed a moment later, the\n * folder was on screen, and the conversion had never started: every file\n * stayed plaintext until someone pressed Continue. Every caller that awaits\n * a load and then reads the rows or the address (a job's output, a palette\n * hit, a new document) stood on the same gap.\n */\nexport interface ListingTickets {\n  /** A load starts: its ticket, and where it goes - the path asked for, else\n   *  where the newest folder load is going, else the folder on screen. */\n  begin(path: string | undefined, shown: string): { ticket: number; want: string };\n  /** The load is a folder listing on its way to `want`. */\n  going(want: string): void;\n  /** A panel view starts: no folder is on its way any more. */\n  view(): number;\n  /** Was no newer load started since this ticket was taken? */\n  isNewest(ticket: number): boolean;\n  /** The load ended; when it was the newest, nothing is on its way. */\n  end(ticket: number): void;\n  /**\n   * Start a folder load (`start`) and resolve when it has ended AND every\n   * folder load started since it has ended too - the listing on screen is\n   * then the newest asked for. Its own failure is thrown; a later load's is\n   * that load's caller's to see.\n   *\n   * ⚠ A thunk, not a started promise: this load is marked newest BEFORE it\n   * starts. A load can start another before its own first await (a root with\n   * one storage opens that storage; an unreachable view falls back to the\n   * root). Marked after starting, the outer load was taken for newer than\n   * the one it started, the inner one waited for the outer, the outer waited\n   * for the inner, and neither ever resolved: the 0.50 final run's 111 (a\n   * notification that never opened the Trash, behind a first load that never\n   * ended) and 121.\n   */\n  follow(start: () => Promise<void>): Promise<void>;\n}\n\nexport function listingTickets(): ListingTickets {\n  let latest = 0;\n  let goingTo: string | null = null;\n  let newestRun: Promise<void> = Promise.resolve();\n  return {\n    begin(path, shown) {\n      latest += 1;\n      return { ticket: latest, want: path ?? goingTo ?? shown };\n    },\n    going(want) {\n      goingTo = want;\n    },\n    view() {\n      goingTo = null;\n      latest += 1;\n      return latest;\n    },\n    isNewest(ticket) {\n      return ticket === latest;\n    },\n    end(ticket) {\n      if (ticket === latest) goingTo = null;\n    },\n    async follow(start) {\n      // This load's place in the order, settled when its own work ends -\n      // never when its follow ends, so no load ever waits for an older one.\n      let ended!: () => void;\n      const mine = new Promise<void>((r) => (ended = r));\n      newestRun = mine;\n      try {\n        await start();\n      } finally {\n        ended();\n      }\n      let awaited = mine;\n      while (newestRun !== awaited) {\n        awaited = newestRun;\n        await awaited;\n      }\n    },\n  };\n}\n","// pendingAnswers: the server questions a menu's rows are waiting on, and a\n// bounded wait for them (#196).\n//\n// Some rows of the explorer's right-click menu depend on an answer from the\n// server that is asked only when the menu is built: \"Encrypt with E2EE…\" asks\n// `POST /api/files/e2e/allowed` for the row's path, and the folder-dependent\n// permissions ask `allowedAt`. Until the answer lands the row is hidden. The\n// menu used to open at once and draw the row when the answer came back, which\n// pushed every row below it one place down while the person was aiming: in the\n// 0.53 release run (Firefox, e2e 115) the answer took 101 ms and landed between\n// the press and the release of a click on \"Tags\", which then hit \"Star\". On a\n// slow server the same thing puts a person's click on a different verb, a\n// destructive one included.\n//\n// The explorer now counts these questions here and opens a row's menu once\n// none is outstanding, or after a short ceiling, whichever comes first. A\n// question that is never answered costs the ceiling, not a menu that never\n// opens; whatever lands after the menu is open is the menu's business\n// (lib/heldMenuRows: nothing moves, late rows are added at its end).\nexport interface PendingAnswers {\n  /** One question has been asked. Call the returned function once it is\n   *  answered, failed or dropped; calling it again does nothing. */\n  start(): () => void;\n  /** Resolves `true` as soon as no question is outstanding (at once when none\n   *  is), or `false` once `capMs` has passed with some still out. */\n  settled(capMs: number): Promise<boolean>;\n  /** Questions outstanding right now. */\n  readonly count: number;\n}\n\nexport function pendingAnswers(): PendingAnswers {\n  let count = 0;\n  let waiters: Array<() => void> = [];\n\n  function wake(): void {\n    if (count > 0 || waiters.length === 0) return;\n    const now = waiters;\n    waiters = [];\n    for (const w of now) w();\n  }\n\n  return {\n    start() {\n      count++;\n      let done = false;\n      return () => {\n        if (done) return;\n        done = true;\n        count--;\n        wake();\n      };\n    },\n    settled(capMs: number) {\n      if (count === 0) return Promise.resolve(true);\n      return new Promise<boolean>((resolve) => {\n        let timer: ReturnType<typeof setTimeout> | undefined;\n        const answered = () => {\n          if (timer !== undefined) clearTimeout(timer);\n          resolve(true);\n        };\n        waiters.push(answered);\n        timer = setTimeout(() => {\n          waiters = waiters.filter((w) => w !== answered);\n          resolve(false);\n        }, Math.max(0, capMs));\n      });\n    },\n    get count() {\n      return count;\n    },\n  };\n}\n","// menuAnswers: the server's answers a row's right-click menu depends on, kept\n// per person and per storage so the menu opens on them at once (#196).\n//\n// Some rows of the explorer's menu exist only where the server says so: which\n// of the per-folder permissions are held at a path (`POST /api/files/manager\n// ?action=allowed`, question `p`) and may this person start encrypting there\n// (`POST /api/files/e2e/allowed`, questions `e:file`, `e:folder`,\n// `e:new_folder`). The first round of #196 made the menu wait for them (up to\n// 400 ms) so no row moved under the pointer. The maintainers' rule since\n// (2026-10-08): a menu must not wait on the network. So the answers are asked\n// BEFORE the menu is opened and remembered:\n//\n//   - When a folder is listed, every row's questions go out in one batched\n//     request per question (FileExplorer prefetchMenuAnswers), together with\n//     the rows remembered around it - the storage's root and its first level,\n//     the parent's level and the level below (`around`). That is the HOT tier:\n//     asked again whenever it is stale. Everything else is COLD: shown from\n//     here as it was last answered, asked again when it becomes hot.\n//   - \"Stale\" is an era, not only an age: the server sends `access.changed` on\n//     the live socket when a grant, a role, a group, a rule, the encryption\n//     policy or an approval changed (internal/realtime/access.go), and a\n//     socket that was down may have missed one; either starts a new era\n//     (`stale`) and the hot tier is asked again. Without a live socket every\n//     read of a folder is a new era. An answer also ages out after FRESH_MS.\n//   - Remembered in localStorage, one key per person (origin, user, tenant,\n//     root) and storage, versioned, bounded (rows per storage, storages per\n//     person, bytes per key, age) and dropped least-recently-used first. Where\n//     localStorage is not there or refuses (a private window, blocked site\n//     data, a full quota) the answers live in memory for the page. A sign-out\n//     forgets every key (lib/prefs forgetPersonalPrefs → clearMenuAnswers).\n//\n// ⚠ An answer here only SHAPES a menu. Every action is decided by the server\n// again, whatever the menu offered; a remembered answer that turned out wrong\n// costs a refused click, never an action the person may not take.\n// ⚠ Nothing below a vault's folder is ever asked or kept: the explorer asks\n// about a vault's rows as the vault folder (vaultAskPath).\nimport { ref, type Ref } from 'vue';\nimport { registerPersonalForget } from './prefs';\n\n/** `p`: the per-folder permissions held at a path; `e:<kind>`: may this\n *  person start encrypting there, for that kind. */\nexport type MenuQuestion = 'p' | 'e:file' | 'e:folder' | 'e:new_folder';\n/** The two families: a family's answers are asked under one rule set (the\n *  account's per-folder permission list, the encryption policy) and dropped\n *  together when it changes (`sign`). */\nexport type MenuFamily = 'p' | 'e';\n\n/** Every key this module writes starts with this. */\nexport const MENU_ANSWERS_PREFIX = 'filex.menuAnswers.v1|';\nconst VERSION = 1;\n/** Remembered rows per storage; the least recently used go first. */\nexport const MENU_ANSWERS_MAX_ROWS = 1500;\n/** Storages remembered per person; the least recently used go first. */\nexport const MENU_ANSWERS_MAX_STORAGES = 6;\n/** Characters one storage's key may hold. */\nexport const MENU_ANSWERS_MAX_CHARS = 196_608;\n/** A row older than this is not read back. */\nexport const MENU_ANSWERS_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n/** An answer of this era older than this is asked again when it is hot. */\nexport const MENU_ANSWERS_FRESH_MS = 30_000;\nconst FLUSH_MS = 400;\n\nconst E2E_WORDS = ['allowed', 'request', 'denied'];\nconst QUESTIONS: readonly string[] = ['p', 'e:file', 'e:folder', 'e:new_folder'];\n\n/** value, answered at (ms), era it was answered in ('' = an earlier page),\n *  persisted (1) or this page's only (0: a question that failed). */\ntype Row = [unknown, number, string, 0 | 1];\n\ninterface Bucket {\n  sig: Partial<Record<MenuFamily, string>>;\n  rows: Map<string, Row>;\n  dirty: boolean;\n}\n\nexport interface MenuAnswerStore {\n  /** Bumped when remembered answers appear or go (attach, sign, stale,\n   *  forget): a computed that reads `peek` re-runs. */\n  readonly rev: Ref<number>;\n  /** Whose answers these are: `scope` names the person (origin, user,\n   *  tenant, root) or is null (kept in memory only). `sig` is the rule set\n   *  each family is asked under. Answers asked before are kept when the\n   *  person is the same one this store was used for. */\n  attach(scope: string | null, sig: Record<MenuFamily, string>): void;\n  /** A family's rule set changed: its answers are dropped. */\n  sign(family: MenuFamily, sig: string): void;\n  /** The remembered answer, fresh or not; undefined when never answered. */\n  peek(q: MenuQuestion, path: string): unknown;\n  /** Answered in this era and recently: asking again would be waste. */\n  fresh(q: MenuQuestion, path: string): boolean;\n  /** The server answered. `keep` false: shown for this page, not remembered\n   *  (a question that failed and was answered by the fallback). */\n  put(q: MenuQuestion, path: string, value: unknown, keep?: boolean): void;\n  /** A new era: every answer is still shown, and asked again when hot. */\n  stale(): void;\n  /** The remembered questions around the folder `dir` (a wire path): the\n   *  storage's root and its first level, `dir`'s parent's level, `dir`'s own\n   *  level and the level below it, and those folders themselves. */\n  around(dir: string): Array<{ q: MenuQuestion; path: string }>;\n  /** Write what is waiting now (an unmount). */\n  flush(): void;\n  /** Drop everything this store holds, and stop writing (a sign-out). */\n  forget(): void;\n  /** The explorer is gone. */\n  dispose(): void;\n}\n\nconst live = new Set<MenuAnswerStore>();\n\n/** The storage part of a wire path (`main://a/b` → `main`), or ''. */\nfunction storageOf(path: string): string {\n  const i = path.indexOf('://');\n  return i > 0 ? path.slice(0, i) : '';\n}\n\n/** `main://a/b/` → `main://a/b`; `main:///` → `main://`. */\nfunction normal(path: string): string {\n  const i = path.indexOf('://');\n  if (i < 0) return path;\n  return path.slice(0, i + 3) + path.slice(i + 3).replace(/^\\/+|\\/+$/g, '');\n}\n\n/** The folder a normal wire path is in; null for a storage's root. */\nfunction parentOf(path: string): string | null {\n  const i = path.indexOf('://');\n  if (i < 0) return null;\n  const rest = path.slice(i + 3);\n  if (!rest) return null;\n  const j = rest.lastIndexOf('/');\n  return path.slice(0, i + 3) + (j < 0 ? '' : rest.slice(0, j));\n}\n\nfunction familyOf(q: string): MenuFamily {\n  return q === 'p' ? 'p' : 'e';\n}\n\n/** A remembered value is read back only in the shape its question answers. */\nfunction validAnswer(q: string, v: unknown): boolean {\n  if (q === 'p') return Array.isArray(v) && v.every((x) => typeof x === 'string');\n  return typeof v === 'string' && E2E_WORDS.includes(v);\n}\n\n/** Two FNV-1a passes: the person's key without their address and id in the\n *  clear, short enough for a storage key. */\nexport function menuScopeId(scope: string): string {\n  let a = 0x811c9dc5;\n  let b = 0x01000193 ^ 0x5bd1e995;\n  for (let i = 0; i < scope.length; i++) {\n    const c = scope.charCodeAt(i);\n    a = Math.imul(a ^ c, 0x01000193);\n    b = Math.imul(b ^ c, 0x5bd1e995);\n  }\n  return (a >>> 0).toString(16).padStart(8, '0') + (b >>> 0).toString(16).padStart(8, '0');\n}\n\n/** localStorage when this page may use it, else null (memory only). */\nfunction probeStorage(): Storage | null {\n  try {\n    const ls = globalThis.localStorage;\n    if (!ls) return null;\n    const k = `${MENU_ANSWERS_PREFIX}probe`;\n    ls.setItem(k, '1');\n    ls.removeItem(k);\n    return ls;\n  } catch {\n    return null;\n  }\n}\n\nexport interface MenuAnswerStoreOptions {\n  now?: () => number;\n  /** Where to keep the answers; the page's localStorage when absent. Null\n   *  keeps them in memory. A function so a test can hand one that throws. */\n  storage?: () => Storage | null;\n}\n\nexport function menuAnswerStore(opts: MenuAnswerStoreOptions = {}): MenuAnswerStore {\n  const now = opts.now ?? (() => Date.now());\n  const rev = ref(0);\n  const buckets = new Map<string, Bucket>();\n  const page = Math.random().toString(36).slice(2, 8);\n  let era = 0;\n  let epoch = `${page}.0`;\n  let scope: string | null = null;\n  let ls: Storage | null = null;\n  let sig: Partial<Record<MenuFamily, string>> = {};\n  let timer: ReturnType<typeof setTimeout> | null = null;\n  let disposed = false;\n\n  const indexKey = () => `${MENU_ANSWERS_PREFIX}${scope}`;\n  const bucketKey = (storage: string) => `${MENU_ANSWERS_PREFIX}${scope}|${encodeURIComponent(storage)}`;\n\n  /** Read one storage's remembered rows into b, under the rows b already has\n   *  (those are this page's, and newer). */\n  function load(storage: string, b: Bucket): void {\n    if (!ls || !scope || !storage) return;\n    let doc: { v?: unknown; sig?: Record<string, unknown>; r?: unknown } | null = null;\n    try {\n      doc = JSON.parse(ls.getItem(bucketKey(storage)) ?? 'null');\n    } catch {\n      doc = null;\n    }\n    if (!doc || doc.v !== VERSION || !Array.isArray(doc.r)) return;\n    const t = now();\n    const kept = new Map<string, Row>();\n    for (const row of doc.r as unknown[]) {\n      if (!Array.isArray(row)) continue;\n      const [k, v, at] = row as [unknown, unknown, unknown];\n      if (typeof k !== 'string' || typeof at !== 'number' || t - at > MENU_ANSWERS_MAX_AGE_MS) continue;\n      const q = k.slice(0, k.indexOf('|'));\n      if (!QUESTIONS.includes(q) || doc.sig?.[familyOf(q)] !== sig[familyOf(q)] || !validAnswer(q, v)) continue;\n      if (!b.rows.has(k)) kept.set(k, [v, at, '', 1]);\n    }\n    // The remembered rows are older than this page's: they go first in the\n    // least-recently-used order.\n    for (const [k, r] of b.rows) kept.set(k, r);\n    b.rows = kept;\n  }\n\n  function bucket(storage: string): Bucket {\n    let b = buckets.get(storage);\n    if (!b) {\n      b = { sig: { ...sig }, rows: new Map(), dirty: false };\n      buckets.set(storage, b);\n      load(storage, b);\n    }\n    return b;\n  }\n\n  function schedule(): void {\n    if (!ls || !scope || timer || disposed) return;\n    timer = setTimeout(flushNow, FLUSH_MS);\n  }\n\n  /** One storage's rows, as small as they must be to fit. The older half goes\n   *  until they do; a key that holds nothing is removed. */\n  function write(storage: string, b: Bucket, t: number): void {\n    if (!ls) return;\n    let rows = [...b.rows].filter(([, r]) => r[3] === 1).map(([k, r]) => [k, r[0], r[1]]);\n    while (rows.length > 0) {\n      const text = JSON.stringify({ v: VERSION, at: t, sig: b.sig, r: rows });\n      if (text.length <= MENU_ANSWERS_MAX_CHARS) {\n        try {\n          ls.setItem(bucketKey(storage), text);\n          return;\n        } catch {\n          /* the quota: fewer rows */\n        }\n      }\n      rows = rows.slice(Math.ceil(rows.length / 2));\n    }\n    try {\n      ls.removeItem(bucketKey(storage));\n    } catch {\n      /* nothing to do */\n    }\n  }\n\n  function readIndex(): Record<string, number> {\n    try {\n      const doc = JSON.parse(ls?.getItem(indexKey()) ?? 'null') as { v?: unknown; s?: unknown } | null;\n      if (doc && doc.v === VERSION && doc.s && typeof doc.s === 'object') {\n        const out: Record<string, number> = {};\n        for (const [k, v] of Object.entries(doc.s as Record<string, unknown>)) if (typeof v === 'number') out[k] = v;\n        return out;\n      }\n    } catch {\n      /* unreadable: start again */\n    }\n    return {};\n  }\n\n  function flushNow(): void {\n    if (timer) clearTimeout(timer);\n    timer = null;\n    if (!ls || !scope) return;\n    const t = now();\n    const index = readIndex();\n    for (const [storage, b] of buckets) {\n      if (!b.dirty) continue;\n      b.dirty = false;\n      if (!storage) continue;\n      index[storage] = t;\n      write(storage, b, t);\n    }\n    const order = Object.entries(index).sort((x, y) => y[1] - x[1]);\n    for (const [storage] of order.slice(MENU_ANSWERS_MAX_STORAGES)) {\n      delete index[storage];\n      try {\n        ls.removeItem(bucketKey(storage));\n      } catch {\n        /* nothing to do */\n      }\n    }\n    try {\n      ls.setItem(indexKey(), JSON.stringify({ v: VERSION, at: t, s: index }));\n    } catch {\n      /* full: the rows are written, the order is not */\n    }\n  }\n\n  /** Remove every key of this module older than the age limit, whoever it\n   *  belongs to (a person who never signed out on this browser). */\n  function sweep(): void {\n    if (!ls) return;\n    const t = now();\n    const old: string[] = [];\n    try {\n      for (let i = 0; i < ls.length; i++) {\n        const k = ls.key(i);\n        if (!k || !k.startsWith(MENU_ANSWERS_PREFIX)) continue;\n        let at = 0;\n        try {\n          at = Number((JSON.parse(ls.getItem(k) ?? 'null') as { at?: unknown } | null)?.at) || 0;\n        } catch {\n          at = 0;\n        }\n        if (t - at > MENU_ANSWERS_MAX_AGE_MS) old.push(k);\n      }\n      for (const k of old) ls.removeItem(k);\n    } catch {\n      /* nothing to do */\n    }\n  }\n\n  const store: MenuAnswerStore = {\n    rev,\n    attach(next, nextSig) {\n      if (disposed) return;\n      flushNow();\n      const id = next ? menuScopeId(next) : null;\n      // Somebody else's answers are never kept: a different person starts\n      // from nothing. The same person (or nobody known yet) keeps what this\n      // page already asked.\n      if (scope !== null && id !== scope) buckets.clear();\n      scope = id;\n      ls = id ? (opts.storage ? opts.storage() : probeStorage()) : null;\n      for (const f of ['p', 'e'] as const) if (sig[f] !== undefined && sig[f] !== nextSig[f]) store.sign(f, nextSig[f]);\n      sig = { ...nextSig };\n      if (ls) {\n        sweep();\n        for (const [storage, b] of buckets) {\n          b.sig = { ...sig };\n          load(storage, b);\n          b.dirty = true;\n        }\n        schedule();\n      }\n      rev.value++;\n    },\n    sign(family, value) {\n      if (sig[family] === value) return;\n      sig = { ...sig, [family]: value };\n      for (const b of buckets.values()) {\n        for (const k of [...b.rows.keys()]) if (familyOf(k.slice(0, k.indexOf('|'))) === family) b.rows.delete(k);\n        b.sig = { ...sig };\n        b.dirty = true;\n      }\n      schedule();\n      rev.value++;\n    },\n    peek(q, path) {\n      void rev.value;\n      return bucket(storageOf(path)).rows.get(`${q}|${path}`)?.[0];\n    },\n    fresh(q, path) {\n      const r = bucket(storageOf(path)).rows.get(`${q}|${path}`);\n      return !!r && r[2] === epoch && now() - r[1] < MENU_ANSWERS_FRESH_MS;\n    },\n    put(q, path, value, keep = true) {\n      if (disposed) return;\n      // ⚠ A path with no storage in it is answered too, in memory only (the\n      // '' bucket is never written): an answer that could not be put would\n      // never be fresh, and the explorer would ask it again on every render.\n      const b = bucket(storageOf(path));\n      const k = `${q}|${path}`;\n      b.rows.delete(k);\n      b.rows.set(k, [value, now(), epoch, keep ? 1 : 0]);\n      while (b.rows.size > MENU_ANSWERS_MAX_ROWS) {\n        const oldest = b.rows.keys().next().value;\n        if (oldest === undefined) break;\n        b.rows.delete(oldest);\n      }\n      if (keep) {\n        b.dirty = true;\n        schedule();\n      }\n    },\n    stale() {\n      era++;\n      epoch = `${page}.${era}`;\n      rev.value++;\n    },\n    around(dir) {\n      const st = storageOf(dir);\n      if (!st) return [];\n      const here = normal(dir);\n      const root = `${st}://`;\n      const up = parentOf(here);\n      const levels = new Set([root, here]);\n      if (up !== null) levels.add(up);\n      const out: Array<{ q: MenuQuestion; path: string }> = [];\n      for (const k of bucket(st).rows.keys()) {\n        const i = k.indexOf('|');\n        const path = k.slice(i + 1);\n        const at = normal(path);\n        const p = parentOf(at);\n        if (levels.has(at) || (p !== null && (levels.has(p) || parentOf(p) === here))) {\n          out.push({ q: k.slice(0, i) as MenuQuestion, path });\n        }\n      }\n      return out;\n    },\n    flush() {\n      flushNow();\n    },\n    forget() {\n      if (timer) clearTimeout(timer);\n      timer = null;\n      buckets.clear();\n      scope = null;\n      ls = null;\n      rev.value++;\n    },\n    dispose() {\n      flushNow();\n      disposed = true;\n      live.delete(store);\n    },\n  };\n  live.add(store);\n  return store;\n}\n\n/**\n * Forget every remembered answer on this browser: each open explorer's, and\n * every key this module wrote, whoever it belonged to. A sign-out runs it\n * (lib/prefs forgetPersonalPrefs); a host with a sign-out of its own that does\n * not go through there may call it.\n */\nexport function clearMenuAnswers(): void {\n  for (const s of live) s.forget();\n  try {\n    const ls = globalThis.localStorage;\n    if (!ls) return;\n    const keys: string[] = [];\n    for (let i = 0; i < ls.length; i++) {\n      const k = ls.key(i);\n      if (k && k.startsWith(MENU_ANSWERS_PREFIX)) keys.push(k);\n    }\n    for (const k of keys) ls.removeItem(k);\n  } catch {\n    /* blocked site data: nothing was written there either */\n  }\n}\n\nregisterPersonalForget(clearMenuAnswers);\n\n// A page that is closed within a moment of an answer still remembers it.\nif (typeof window !== 'undefined' && typeof window.addEventListener === 'function') {\n  window.addEventListener('pagehide', () => {\n    for (const s of live) s.flush();\n  });\n}\n","/**\n * storageLine — WHICH number the storage line prints: the \"Storage · 245.3 GB\n * used\" at the foot of the navigation panel (web explorer and desktop app)\n * and the storage chip in the admin top bar.\n *\n * Two figures are in reach and they answer different questions:\n *\n *   - `GET /api/files/quota/me` — the person's upload counter,\n *     `SUM(nodes.size) WHERE owner_id = me`. Only the upload path sets an\n *     owner, so every file a storage sync discovered counts for nobody;\n *   - `GET /api/files/quota/storages` — how full each drive the person can\n *     open is (RBAC-filtered, the figure Home's drive cards print).\n *\n * The line used to print the first for everybody, under \"Storage\", in the\n * very sentence Home's card uses for the second. Measured on a production\n * install (2026-09-25): the card said 245.3 GB, the line 523.5 MB — 228.6 GB\n * of that drive had arrived through a sync and the rest was uploaded by\n * eleven people.\n *\n * So:\n *   - a person WITH a quota sees their share against it. That ceiling is what\n *     refuses their next upload, so it is the number that matters to them;\n *   - a person WITHOUT one sees the size of the drives the panel lists — the\n *     host's figures where it sent them (the Home cards print those), the\n *     measured ones for the rest;\n *   - a figure the server does not stand behind in full is a lower bound:\n *     a drive whose catalogue does not cover it yet, or one nobody measured;\n *   - and with nothing trustworthy to say, the line says nothing (null).\n */\nimport { incomplete, type CatalogCoverage } from './catalogCoverage';\n\n/** What the line says. */\nexport interface StorageLine {\n  /** The bytes it reports. */\n  used: number;\n  /** The person's ceiling; 0 when there is none. */\n  total: number;\n  /** No ceiling — `used` is the drives' size, not the person's uploads. */\n  unlimited: boolean;\n  /** `used` is a lower bound. */\n  partial: boolean;\n}\n\n/** The fields of `GET /api/files/quota/me` (quota.Snapshot) the line reads. */\nexport interface PersonUsage {\n  used_bytes: number;\n  quota_bytes: number;\n  unlimited?: boolean;\n}\n\n/** One drive as the navigation panel holds it (`ExplorerConfig.storages`). */\nexport interface PanelDrive {\n  name: string;\n  usedBytes?: number;\n  usedPartial?: boolean;\n}\n\n/** One row of `GET /api/files/quota/storages` (handlers.StorageUsageRow). */\nexport interface MeasuredDrive {\n  name: string;\n  used_bytes: number;\n  file_count?: number;\n  coverage?: CatalogCoverage | null;\n}\n\n/** A byte count that can be added up. */\nfunction bytes(n: unknown): number | null {\n  return typeof n === 'number' && Number.isFinite(n) && n >= 0 ? n : null;\n}\n\n/** The person has a ceiling: a positive quota the server did not call unlimited. */\nexport function hasCeiling(p: PersonUsage | null | undefined): boolean {\n  return !!p && !p.unlimited && p.quota_bytes > 0;\n}\n\n/**\n * Whether the line has to ask the server for drive sizes: there is no\n * ceiling, and the host left at least one of the panel's drives unsized (the\n * desktop app hands over names only) — or listed none at all.\n */\nexport function needsMeasuredDrives(\n  p: PersonUsage | null | undefined,\n  panel: readonly PanelDrive[],\n): boolean {\n  if (!p || hasCeiling(p)) return false;\n  return panel.length === 0 || panel.some((d) => bytes(d.usedBytes) === null);\n}\n\nexport function storageLine(\n  p: PersonUsage | null | undefined,\n  panel: readonly PanelDrive[],\n  measured: readonly MeasuredDrive[] | null | undefined,\n): StorageLine | null {\n  if (!p) return null;\n  if (hasCeiling(p)) {\n    return { used: bytes(p.used_bytes) ?? 0, total: p.quota_bytes, unlimited: false, partial: false };\n  }\n\n  const rows = new Map<string, MeasuredDrive>();\n  for (const r of measured ?? []) if (r && typeof r.name === 'string') rows.set(r.name, r);\n  // A host that lists no drives gets every drive the server measured for it.\n  const drives: readonly PanelDrive[] = panel.length ? panel : [...rows.keys()].map((name) => ({ name }));\n\n  let used = 0;\n  let counted = 0;\n  let partial = false;\n  const seen = new Set<string>();\n  for (const d of drives) {\n    if (seen.has(d.name)) continue; // one drive, one figure, however often it is listed\n    seen.add(d.name);\n    const own = bytes(d.usedBytes);\n    const row = own === null ? rows.get(d.name) : undefined;\n    const figure = own ?? bytes(row?.used_bytes);\n    if (figure === null) {\n      partial = true; // listed, but nobody could say how full it is\n      continue;\n    }\n    used += figure;\n    counted++;\n    if (own !== null ? d.usedPartial === true : incomplete(row?.coverage) !== null) partial = true;\n  }\n  if (!counted || used <= 0) return null;\n  return { used, total: 0, unlimited: true, partial };\n}\n","/**\n * themes.ts — wiring:c1 theme registry + application engine.\n *\n * A \"theme\" is a palette-only preset: a map of `--fe-*` CSS custom\n * properties in TWO variants (light + dark). Picking a theme is fully\n * independent from the light/dark MODE — the mode (config.theme prop /\n * OS preference) keeps deciding which variant of the selected theme is\n * active, exactly like the stock palette in styles/variables.css.\n *\n * Application strategy (two cooperating layers):\n *\n *  1. Inline `--fe-*` variables on the explorer ROOT element\n *     (`applyThemeToEl`) — the documented \"consumer overrides by setting\n *     --fe-* on a higher scope\" philosophy, resolved to the currently\n *     active variant. Covers the whole `.fe` subtree, works in embeds\n *     without touching the host page's own theme.\n *\n *  2. A singleton injected `<style data-filex-theme>` (`syncThemeStyle`)\n *     that mirrors variables.css' EXACT selector cascade with the\n *     selected theme's values. This is required because some surfaces\n *     re-declare the variables on themselves and would otherwise shadow\n *     the inherited inline values back to the stock palette:\n *       - the Teleport-ed context menu backdrop (`.fe-ctx-backdrop…`\n *         lives under <body>, outside the root element entirely), and\n *       - modal backdrops, which carry their own `.fe` /\n *         `.fe--theme-dark` classes (dark-mode selectors like\n *         `.dark .fe` re-set the tokens on those descendants).\n *     Because the injected element is appended to <head> at runtime it\n *     always comes AFTER the bundled stylesheet, so equal-specificity\n *     rules win by source order — the same mechanism variables.css uses\n *     internally. No `!important` needed.\n *\n * The `default` theme applies NOTHING (inline vars removed, style\n * element emptied) so host-level `--fe-*` overrides keep working\n * untouched — its token maps below exist only to render the gallery\n * preview card.\n *\n * Persistence: localStorage `filex.palette` (absent/invalid → default),\n * shared reactively across every explorer instance on the page and\n * synced across tabs via the `storage` event.\n *\n * All palettes were contrast-checked (WCAG 2.1): text/bg ≥ 7:1,\n * text on elevated/hover/selected surfaces + muted text + text-on-primary\n * ≥ 4.5:1, primary & danger vs bg ≥ 3:1 — in BOTH variants.\n */\n\nimport { ref, type Ref } from 'vue';\nimport { hasSession, registerPersonalMirror, savePref, setLocalPref } from './prefs';\n\n/** Map of `--fe-*` custom property → value. */\nexport type ThemeTokenMap = Record<string, string>;\n\nexport interface ThemeDef {\n  /** Stable id — what a palette choice stores (on the account where the host\n   *  keeps preferences there, `lib/prefs`; mirrored in localStorage for the\n   *  first paint), never shown to users. */\n  id: string;\n  /**\n   * i18n catalogue key for the display name (tr + en).\n   *\n   * ⚠ Built-in palettes only. An operator's own theme carries `name` instead:\n   * \"Acme Bulut\" is not a string this product translates, and putting it\n   * through `t()` would print the key straight back at them the first time\n   * somebody named a theme something the catalogue did not contain.\n   */\n  nameKey?: string;\n  /** Literal display name — operator-defined themes only (tema:v1). */\n  name?: string;\n  /** Palette applied when the resolved mode is light. */\n  light: ThemeTokenMap;\n  /** Palette applied when the resolved mode is dark. */\n  dark: ThemeTokenMap;\n}\n\n/**\n * tema:v1 — the prefix that keeps the two namespaces apart.\n *\n * An operator-defined theme's id is always `custom:<slug>`, so no name an\n * operator types can ever shadow `night`, `forest` or `default`. The server\n * stores the slug bare and adds the prefix on the way out\n * (backend/internal/api/handlers/themes.go).\n */\nexport const CUSTOM_THEME_PREFIX = 'custom:';\n\n/**\n * ⚠⚠ `filex.palette`, NOT `filex.theme` — and the rename is a BUG FIX, not\n * tidying.\n *\n * `web/src/lib/theme.ts` has always stored the admin app's light/dark/auto\n * MODE under `filex.theme`, and this module stored the PALETTE id under the\n * same name. Two writers, one key, neither aware of the other — and because\n * both readers fall back silently on a value they do not recognise, nothing\n * ever threw: picking \"Night Blue\" in the explorer reset the panel's\n * light/dark choice to auto, and choosing Dark in the panel reset the palette\n * to default. It went unseen for as long as the two controls lived on\n * opposite sides of the product; putting them both in the settings modal\n * makes it a one-click round trip.\n */\nexport const THEME_LS_KEY = 'filex.palette';\n\n/** The key this preference used to share with the app's mode. Read once, to\n *  carry a palette across the rename; never written. */\nconst LEGACY_THEME_LS_KEY = 'filex.theme';\n\nexport const DEFAULT_THEME_ID = 'default';\n\n/* ------------------------------------------------------------------ */\n/* Registry                                                            */\n/* ------------------------------------------------------------------ */\n\n/**\n * ⚠⚠ Every theme declares the SAME key set, and there is a test for it\n * (`web/tests/api/themeTokenParity.test.ts`). That test exists because of a\n * bug whose whole nature is that nothing notices:\n *\n *   `--fe-primary-soft` was declared by variables.css and used by nine rules\n *   in base.css — the active tab of a segmented control, a filter chip that is\n *   set, an active toolbar button, the advanced-search tabs — and by NO theme\n *   map at all. So somebody on Forest, Amber or Lilac got their palette\n *   everywhere except the one token that marks \"this is the selected thing\",\n *   which stayed stock blue and clashed with the palette they had just picked.\n *   `--fe-border-soft` (ten rules, the quieter separators inside panels) was\n *   missing the same way. Neither errored, neither looked broken in the\n *   gallery card, and the only way to see it was to pick a theme and look.\n *\n * How the two are derived, so a new theme fills them the same way:\n *\n *   --fe-primary-soft = the theme's OWN primary mixed into its OWN background,\n *     at the fraction that reproduces the STOCK tint's separation from its\n *     background (1.184:1 light, 1.207:1 dark). Separation is the invariant,\n *     not the mix fraction: the palettes' primaries run from a near-black\n *     green to a pale grey, so a fixed 13% lands anywhere between invisible\n *     and a slab. Held that way, every palette's tint reads with the same\n *     weight as the stock one. Measured: text on it is 9.44:1 (Terminal dark)\n *     to 17.85:1 (High Contrast light), so the 4.5 bar is never in question.\n *   --fe-border-soft = the theme's own border mixed toward its own background\n *     at the stock fraction (0.60 light / 0.68 dark), which reproduces the\n *     stock value exactly. ⚠ High Contrast is the deliberate exception: it\n *     takes its own `--fe-border` unchanged, because a *soft* separator is the\n *     one thing that theme exists to not have.\n *\n * ⚠ What is deliberately NOT themed, and why:\n *   `--fe-ok` / `--fe-warning` / `--fe-keep-ok` — status signals, not taste.\n *     They are identical in light and dark on purpose; \"ok\" that is green in\n *     one palette and amber in another stops being a signal.\n *   `--fe-icon-*` — file-type accents. A PDF is red and a folder is yellow in\n *     every palette, and they are never the only cue (the row carries its name\n *     in `--fe-text` too).\n *   radii, control heights, the type scale, gaps, `--fe-sidenav-w`,\n *     `--fe-font-mono` — metrics, not a palette.\n *   `--fe-shadow` / `--fe-shadow-sm` / `--fe-font` — depth and face rather\n *     than colour, and the two themes that DO override them (High Contrast's\n *     hard 1px outlines, Terminal's monospace face) are extras on top of the\n *     shared set, not holes in it. The parity test allows extras and requires\n *     the shared set.\n */\nexport const THEMES: ThemeDef[] = [\n  {\n    // Stock palette — the maps duplicate variables.css ONLY for the\n    // gallery preview; applying this theme clears all overrides.\n    id: DEFAULT_THEME_ID,\n    nameKey: 'theme.name.default',\n    light: {\n      /* ⚠ Mirrors styles/variables.css exactly — web/tests/api/themeContrast.test.ts\n       * fails on any drift. It has drifted before: the stock primary was\n       * darkened for contrast and this preview map kept the old blue, so the\n       * gallery card advertised a colour the product no longer used. */\n      '--fe-bg': '#ffffff',\n      '--fe-bg-elev': '#f7f8fb',\n      '--fe-bg-hover': '#f3f4f6',\n      '--fe-bg-selected': '#eef3ff',\n      '--fe-border': '#e5e7eb',\n      '--fe-border-soft': '#eef0f4',\n      '--fe-border-strong': '#d1d5db',\n      '--fe-text': '#1f2937',\n      '--fe-text-muted': '#6b7280',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#2f6ceb',\n      '--fe-primary-hover': '#2559c9',\n      '--fe-primary-soft': '#e6ecfa',\n      '--fe-primary-ink': '#2559c9',\n      '--fe-danger': '#dc2626',\n      '--fe-danger-hover': '#b91c1c',\n      /* The outward-facing pages, as the stock palette defines them (#74):\n       * the share page's ground and card (variables.css `.fe.fe-ppage`) and\n       * the sign-in page's (`--fe-login-*`, which are the palette's own\n       * sunken ground and surface). Optional for every theme - PAGE_TOKENS\n       * below. */\n      '--fe-ppage-ground-1': '#f5f7fb',\n      '--fe-ppage-ground-2': '#e9edf4',\n      '--fe-ppage-card': '#ffffff',\n      '--fe-login-ground': '#f7f8fb',\n      '--fe-login-card': '#ffffff',\n    },\n    dark: {\n      '--fe-bg': '#15171c',\n      '--fe-bg-elev': '#1a1d23',\n      '--fe-bg-hover': '#1f232a',\n      '--fe-bg-selected': '#1c2740',\n      '--fe-border': '#2e333c',\n      '--fe-border-soft': '#262a32',\n      '--fe-border-strong': '#3d444f',\n      '--fe-text': '#e6e8ec',\n      '--fe-text-muted': '#888f9b',\n      /* Dark ink, not white: white on the button measures 3.16 against the 4.5\n       * this file claims. Mirrors styles/variables.css. */\n      '--fe-text-on-primary': '#15171c',\n      '--fe-primary': '#5b8cff',\n      '--fe-primary-hover': '#7ba3ff',\n      '--fe-primary-soft': '#1c2740',\n      '--fe-primary-ink': '#7ba3ff',\n      '--fe-danger': '#f87171',\n      '--fe-danger-hover': '#ef4444',\n      '--fe-ppage-ground-1': '#12151a',\n      '--fe-ppage-ground-2': '#191e25',\n      '--fe-ppage-card': '#1f242c',\n      '--fe-login-ground': '#1a1d23',\n      '--fe-login-card': '#15171c',\n    },\n  },\n  {\n    // Night Blue — deep indigo/navy.\n    id: 'night',\n    nameKey: 'theme.name.night',\n    light: {\n      '--fe-bg': '#f6f8fd',\n      '--fe-bg-elev': '#edf1fa',\n      '--fe-bg-hover': '#e2e9f7',\n      '--fe-bg-selected': '#d2ddf4',\n      '--fe-border': '#d6deee',\n      '--fe-border-soft': '#e3e8f4',\n      '--fe-border-strong': '#aebfda',\n      '--fe-text': '#151f38',\n      '--fe-text-muted': '#49587a',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#2c4a9e',\n      '--fe-primary-hover': '#213a80',\n      '--fe-primary-soft': '#e0e6f4',\n      '--fe-primary-ink': '#213a80',\n      '--fe-danger': '#c62828',\n      '--fe-danger-hover': '#a51f1f',\n    },\n    dark: {\n      '--fe-bg': '#0a1024',\n      '--fe-bg-elev': '#111a35',\n      '--fe-bg-hover': '#1a2547',\n      '--fe-bg-selected': '#243665',\n      '--fe-border': '#26335a',\n      '--fe-border-soft': '#1d2748',\n      '--fe-border-strong': '#3c4e84',\n      '--fe-text': '#dfe6f7',\n      '--fe-text-muted': '#96a5cc',\n      '--fe-text-on-primary': '#050b26',\n      '--fe-primary': '#6d8dfc',\n      '--fe-primary-hover': '#5273f2',\n      '--fe-primary-soft': '#182243',\n      '--fe-primary-ink': '#6d8dfc',\n      '--fe-danger': '#f87171',\n      '--fe-danger-hover': '#ef4444',\n    },\n  },\n  {\n    // Forest — calm greens.\n    id: 'forest',\n    nameKey: 'theme.name.forest',\n    light: {\n      '--fe-bg': '#f5faf5',\n      '--fe-bg-elev': '#eaf3eb',\n      '--fe-bg-hover': '#dcecdf',\n      '--fe-bg-selected': '#c8e2ce',\n      '--fe-border': '#d2e2d4',\n      '--fe-border-soft': '#e0ece1',\n      '--fe-border-strong': '#a2c3a8',\n      '--fe-text': '#182b1d',\n      '--fe-text-muted': '#42604a',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#2b7a41',\n      '--fe-primary-hover': '#226334',\n      '--fe-primary-soft': '#dbe9dc',\n      '--fe-primary-ink': '#226334',\n      '--fe-danger': '#c62828',\n      '--fe-danger-hover': '#a51f1f',\n    },\n    dark: {\n      '--fe-bg': '#0d1611',\n      '--fe-bg-elev': '#132019',\n      '--fe-bg-hover': '#1b2d23',\n      '--fe-bg-selected': '#264532',\n      '--fe-border': '#28402f',\n      '--fe-border-soft': '#1f3225',\n      '--fe-border-strong': '#3e5f49',\n      '--fe-text': '#dcebe0',\n      '--fe-text-muted': '#93b09b',\n      '--fe-text-on-primary': '#04180b',\n      '--fe-primary': '#54c17a',\n      '--fe-primary-hover': '#3fae66',\n      '--fe-primary-soft': '#16291d',\n      '--fe-primary-ink': '#54c17a',\n      '--fe-danger': '#f87171',\n      '--fe-danger-hover': '#ef4444',\n    },\n  },\n  {\n    // Amber — warm amber/bronze.\n    id: 'amber',\n    nameKey: 'theme.name.amber',\n    light: {\n      '--fe-bg': '#fdf9f0',\n      '--fe-bg-elev': '#f7efdd',\n      '--fe-bg-hover': '#f0e3c8',\n      '--fe-bg-selected': '#ead6ab',\n      '--fe-border': '#e6dabf',\n      '--fe-border-soft': '#efe6d3',\n      '--fe-border-strong': '#c6b184',\n      '--fe-text': '#33270f',\n      '--fe-text-muted': '#655631',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#9a4b00',\n      '--fe-primary-hover': '#7c3c00',\n      '--fe-primary-soft': '#f3e5d7',\n      '--fe-primary-ink': '#7c3c00',\n      '--fe-danger': '#c62828',\n      '--fe-danger-hover': '#a51f1f',\n    },\n    dark: {\n      '--fe-bg': '#191307',\n      '--fe-bg-elev': '#231a0c',\n      '--fe-bg-hover': '#2f2312',\n      '--fe-bg-selected': '#44331b',\n      '--fe-border': '#3b2e17',\n      '--fe-border-soft': '#302512',\n      '--fe-border-strong': '#5b4a29',\n      '--fe-text': '#f2e7d4',\n      '--fe-text-muted': '#bda887',\n      '--fe-text-on-primary': '#2a1c02',\n      '--fe-primary': '#f5a524',\n      '--fe-primary-hover': '#ffb84d',\n      '--fe-primary-soft': '#31230c',\n      '--fe-primary-ink': '#ffb84d',\n      '--fe-danger': '#f87171',\n      '--fe-danger-hover': '#ef4444',\n    },\n  },\n  {\n    // Lilac — soft purple.\n    id: 'lilac',\n    nameKey: 'theme.name.lilac',\n    light: {\n      '--fe-bg': '#faf7fd',\n      '--fe-bg-elev': '#f2ecfa',\n      '--fe-bg-hover': '#e8ddf5',\n      '--fe-bg-selected': '#dccaf0',\n      '--fe-border': '#e1d6ee',\n      '--fe-border-soft': '#ebe3f4',\n      '--fe-border-strong': '#bda6d9',\n      '--fe-text': '#241a33',\n      '--fe-text-muted': '#584871',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#7231e0',\n      '--fe-primary-hover': '#5f21c4',\n      '--fe-primary-soft': '#e9e3fc',\n      '--fe-primary-ink': '#5f21c4',\n      '--fe-danger': '#c62828',\n      '--fe-danger-hover': '#a51f1f',\n    },\n    dark: {\n      '--fe-bg': '#130f1c',\n      '--fe-bg-elev': '#1b1527',\n      '--fe-bg-hover': '#261d37',\n      '--fe-bg-selected': '#37294f',\n      '--fe-border': '#302546',\n      '--fe-border-soft': '#261e38',\n      '--fe-border-strong': '#4b3a6d',\n      '--fe-text': '#e9e2f5',\n      '--fe-text-muted': '#a999c5',\n      '--fe-text-on-primary': '#180d33',\n      '--fe-primary': '#b197fa',\n      '--fe-primary-hover': '#9c7cf4',\n      '--fe-primary-soft': '#272038',\n      '--fe-primary-ink': '#b197fa',\n      '--fe-danger': '#f87171',\n      '--fe-danger-hover': '#ef4444',\n    },\n  },\n  {\n    // High Contrast — black/white with strong borders, saturated accents.\n    id: 'contrast',\n    nameKey: 'theme.name.contrast',\n    light: {\n      '--fe-bg': '#ffffff',\n      '--fe-bg-elev': '#f2f2f2',\n      '--fe-bg-hover': '#e0e0e0',\n      '--fe-bg-selected': '#c9dcff',\n      '--fe-border': '#5c5c5c',\n      '--fe-border-soft': '#5c5c5c',\n      '--fe-border-strong': '#000000',\n      '--fe-text': '#000000',\n      '--fe-text-muted': '#3d3d3d',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#003d99',\n      '--fe-primary-hover': '#002a6b',\n      '--fe-primary-soft': '#e7edf7',\n      '--fe-primary-ink': '#002a6b',\n      '--fe-danger': '#a80000',\n      '--fe-danger-hover': '#7d0000',\n      '--fe-shadow': '0 0 0 1px #000000, 0 10px 32px rgba(0, 0, 0, 0.25)',\n      '--fe-shadow-sm': '0 0 0 1px #000000',\n    },\n    dark: {\n      '--fe-bg': '#000000',\n      '--fe-bg-elev': '#0d0d0d',\n      '--fe-bg-hover': '#212121',\n      '--fe-bg-selected': '#003d80',\n      '--fe-border': '#8f8f8f',\n      '--fe-border-soft': '#8f8f8f',\n      '--fe-border-strong': '#ffffff',\n      '--fe-text': '#ffffff',\n      '--fe-text-muted': '#d6d6d6',\n      '--fe-text-on-primary': '#001430',\n      '--fe-primary': '#7ab8ff',\n      '--fe-primary-hover': '#9ccaff',\n      '--fe-primary-soft': '#0e1a29',\n      '--fe-primary-ink': '#9ccaff',\n      '--fe-danger': '#ff7575',\n      '--fe-danger-hover': '#ff9999',\n      '--fe-shadow': '0 0 0 1px #ffffff, 0 12px 32px rgba(0, 0, 0, 0.65)',\n      '--fe-shadow-sm': '0 0 0 1px #ffffff',\n    },\n  },\n  {\n    // Soft Gray — desaturated, quiet neutral.\n    id: 'gray',\n    nameKey: 'theme.name.gray',\n    light: {\n      '--fe-bg': '#f7f7f8',\n      '--fe-bg-elev': '#efeff1',\n      '--fe-bg-hover': '#e4e4e7',\n      '--fe-bg-selected': '#d6d7db',\n      '--fe-border': '#dfdfe2',\n      '--fe-border-soft': '#e9e9eb',\n      '--fe-border-strong': '#b9b9c0',\n      '--fe-text': '#26272b',\n      '--fe-text-muted': '#585a63',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#4b4b54',\n      '--fe-primary-hover': '#38383f',\n      '--fe-primary-soft': '#e4e4e6',\n      '--fe-primary-ink': '#38383f',\n      '--fe-danger': '#c62828',\n      '--fe-danger-hover': '#a51f1f',\n    },\n    dark: {\n      '--fe-bg': '#131316',\n      '--fe-bg-elev': '#1b1b1f',\n      '--fe-bg-hover': '#26262b',\n      '--fe-bg-selected': '#35353c',\n      '--fe-border': '#2d2d33',\n      '--fe-border-soft': '#242429',\n      '--fe-border-strong': '#4a4a52',\n      '--fe-text': '#e6e6e9',\n      '--fe-text-muted': '#a4a4ad',\n      '--fe-text-on-primary': '#17171b',\n      '--fe-primary': '#b0b0ba',\n      '--fe-primary-hover': '#c4c4cd',\n      '--fe-primary-soft': '#242428',\n      '--fe-primary-ink': '#c4c4cd',\n      '--fe-danger': '#f87171',\n      '--fe-danger-hover': '#ef4444',\n    },\n  },\n  {\n    // Terminal Green — phosphor green, monospace face for the full CRT vibe.\n    id: 'terminal',\n    nameKey: 'theme.name.terminal',\n    light: {\n      '--fe-bg': '#f3f9f4',\n      '--fe-bg-elev': '#e5f2e8',\n      '--fe-bg-hover': '#d5ead9',\n      '--fe-bg-selected': '#bce3c6',\n      '--fe-border': '#cbe2d1',\n      '--fe-border-soft': '#dbebdf',\n      '--fe-border-strong': '#94c2a0',\n      '--fe-text': '#0c2913',\n      '--fe-text-muted': '#31573c',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#116b33',\n      '--fe-primary-hover': '#0c5427',\n      '--fe-primary-soft': '#dbe9dd',\n      '--fe-primary-ink': '#0c5427',\n      '--fe-danger': '#c62828',\n      '--fe-danger-hover': '#a51f1f',\n      '--fe-font': 'ui-monospace, \"SF Mono\", Consolas, Menlo, monospace',\n    },\n    dark: {\n      '--fe-bg': '#050d07',\n      '--fe-bg-elev': '#0a1710',\n      '--fe-bg-hover': '#112418',\n      '--fe-bg-selected': '#1a3a26',\n      '--fe-border': '#1c3a2a',\n      '--fe-border-soft': '#142b1e',\n      '--fe-border-strong': '#316144',\n      '--fe-text': '#4fdd8b',\n      '--fe-text-muted': '#38a668',\n      '--fe-text-on-primary': '#03180a',\n      '--fe-primary': '#25c95e',\n      '--fe-primary-hover': '#4fdd8b',\n      '--fe-primary-soft': '#0c2412',\n      '--fe-primary-ink': '#4fdd8b',\n      '--fe-danger': '#ff6b62',\n      '--fe-danger-hover': '#ff8d86',\n      '--fe-font': 'ui-monospace, \"SF Mono\", Consolas, Menlo, monospace',\n    },\n  },\n];\n\n/* ------------------------------------------------------------------ */\n/* tema:v1 — operator-defined themes                                   */\n/* ------------------------------------------------------------------ */\n\n/**\n * The instance's own themes, fetched once per page load from the public\n * `GET /api/appearance` and published here.\n *\n * ⚠⚠ THE SERVER'S LIST IS THE ONLY DEFINITION OF \"EXISTS\", and that is what\n * makes deleting a theme safe. Nothing goes and rewrites the stored choice of\n * everybody who was using a deleted theme — there is more than one place such\n * a choice can live (this browser's localStorage, a per-account document on\n * the server) and a cleanup pass that missed one would leave somebody pinned\n * to a palette that no longer paints anything. Instead every lookup RESOLVES:\n * `themeById` returns undefined for an id the server did not send, and every\n * caller already treats undefined as \"the stock palette\".\n */\nconst customThemes: Ref<ThemeDef[]> = ref([]);\n\n/**\n * Replace the operator-defined themes. Called once at boot with the payload\n * from `/api/appearance`.\n *\n * ⚠ It also RE-RESOLVES the active selection, which is the client half of\n * \"deleting a theme puts anybody using it back on the default\": a browser\n * holding `custom:acme` in localStorage keeps it across the fetch, and the\n * moment a list arrives that does not contain it, the selection drops to\n * `default`.\n *\n * ⚠⚠ The correction is LOCAL — `applyStoredPalette`, never `setTheme`. Third\n * merge repair, and the most destructive of the three had it been left.\n * `setTheme` now writes the account, so correcting through it would send a\n * fact the SERVER just told us straight back to the server, as though the\n * person had chosen it. That is harmless only when the correction is right.\n * It is not always right: this browser's mirror can hold a stale id from\n * before the account was read, the two fetches have no ordering, and a\n * correction fired from that stale value would overwrite the account's real\n * choice — on every device — for a theme that was never deleted.\n *\n * Leaving the account's dead id untouched costs nothing: every read resolves\n * it to the stock palette anyway, which is the whole point of building\n * deletion as resolution rather than as a cleanup pass. The first deliberate\n * pick the person makes writes a live id over it.\n */\nexport function setCustomThemes(defs: ThemeDef[]): void {\n  customThemes.value = Array.isArray(defs) ? defs : [];\n  if (themeId.value !== DEFAULT_THEME_ID && !themeById(themeId.value)) {\n    applyStoredPalette(DEFAULT_THEME_ID);\n  }\n}\n\n/** Reactive handle for components that render the palette list. */\nexport function useCustomThemes(): { customThemes: Ref<ThemeDef[]> } {\n  return { customThemes };\n}\n\n/**\n * Every palette a person may pick: the built-ins, then the instance's own.\n *\n * ⚠ Operator themes come LAST and are never interleaved. The built-in order\n * is the order of the gallery cards people have learned, and a theme named\n * \"Amber Kurumsal\" sorting itself between Amber and Lilac would move the card\n * under somebody's cursor the first time a theme was added.\n */\nexport function allThemes(): ThemeDef[] {\n  return [...THEMES, ...customThemes.value];\n}\n\nexport function themeById(id: string | null | undefined): ThemeDef | undefined {\n  if (!id) return undefined;\n  return THEMES.find((t) => t.id === id) ?? customThemes.value.find((t) => t.id === id);\n}\n\n/** The display name of a theme, translated for built-ins and literal for an\n *  operator's own. */\nexport function themeName(theme: ThemeDef, t: (key: string) => string): string {\n  return theme.name ?? (theme.nameKey ? t(theme.nameKey) : theme.id);\n}\n\n/**\n * Every token key ANY theme touches — used to fully clear inline overrides\n * when switching themes (a theme that skips a token must not inherit the\n * previous theme's value for it).\n *\n * ⚠⚠ A FUNCTION, not the constant it used to be. Computed once at module load\n * it covered only the built-in palettes, so switching FROM an operator theme\n * that set a token no built-in declares would leave that token's inline value\n * on the root element — the new palette applied, and one stray colour from the\n * old one survived it. It has to be recomputed against the list that is\n * actually installed.\n */\nfunction allTokenKeys(): string[] {\n  return Array.from(\n    new Set(allThemes().flatMap((t) => [...Object.keys(t.light), ...Object.keys(t.dark)])),\n  );\n}\n\n/* ------------------------------------------------------------------ */\n/* Shared reactive state + persistence                                 */\n/* ------------------------------------------------------------------ */\n\n/**\n * Whether an id is worth holding on to before the server's theme list has\n * arrived.\n *\n * ⚠ `themeById` cannot answer this at module load: the operator themes are\n * fetched over the network and the first paint happens long before they land.\n * A boot check that rejected every `custom:` id would silently reset the\n * palette of anybody whose choice was an operator theme, on every page load —\n * the preference would look like it never saved. So a prefixed id is kept on\n * trust here and re-resolved for real by `setCustomThemes` once the list is\n * in. Until then nothing paints it, which is the stock palette: correct, and\n * the same thing the person would see anyway while the fetch is in flight.\n */\nfunction plausibleThemeId(v: string | null): boolean {\n  return !!v && (!!themeById(v) || v.startsWith(CUSTOM_THEME_PREFIX));\n}\n\nfunction readStoredThemeId(): string {\n  // ⚠⚠ THE MIRROR BELONGS TO A PERSON, so with nobody signed in it is not read\n  // at all (`lib/prefs` → `hasSession`). It is not a machine's palette: it is a\n  // cache of ONE ACCOUNT's answer, and handing it to a signed-out window paints\n  // the last person who used this browser onto the sign-in page — which is what\n  // this line was measured doing on 2026-09-21, and is also how the operator's\n  // own default came to be suppressed (`instanceThemes.hasOwnChoice`).\n  if (!hasSession()) return DEFAULT_THEME_ID;\n  try {\n    const v = localStorage.getItem(THEME_LS_KEY);\n    if (plausibleThemeId(v)) return v as string;\n    // One-time carry-over from the shared key. `themeById` is what makes this\n    // safe: 'light' / 'dark' / 'auto' are not palette ids, so a value the app's\n    // mode wrote can never be mistaken for a palette here.\n    const legacy = localStorage.getItem(LEGACY_THEME_LS_KEY);\n    if (legacy && themeById(legacy)) {\n      localStorage.setItem(THEME_LS_KEY, legacy);\n      localStorage.removeItem(LEGACY_THEME_LS_KEY);\n      return legacy;\n    }\n    return DEFAULT_THEME_ID;\n  } catch {\n    return DEFAULT_THEME_ID;\n  }\n}\n\n// Module-level singleton so every explorer instance on the page follows the\n// same selection instantly.\nconst themeId: Ref<string> = ref(\n  typeof window === 'undefined' ? DEFAULT_THEME_ID : readStoredThemeId(),\n);\n\n/**\n * Pick a palette.\n *\n * ⚠⚠ It is saved on the ACCOUNT, not only in this browser (`lib/prefs`).\n * A palette lived in `localStorage` alone until v3, which meant a person who\n * chose one on their laptop opened the product on their phone in the stock\n * colours and had to choose again — reported by the maintainer as exactly that. The\n * localStorage write stays as the FIRST-PAINT cache: it is what this browser\n * reads before the account's answer can arrive, so the window does not flash\n * the default on the way to the chosen one.\n */\nexport function setTheme(id: string): void {\n  const valid = plausibleThemeId(id) ? id : DEFAULT_THEME_ID;\n  themeId.value = valid;\n  try {\n    // ⚠ tema:v1 — the stock palette is WRITTEN, not cleared. It used to be\n    // removed, on the reasonable-sounding grounds that \"no key\" and \"the\n    // default\" mean the same thing. They stopped meaning the same thing the\n    // moment an instance could have a default of its own: an operator whose\n    // house style is a brand theme needs to tell \"this person has not chosen\"\n    // from \"this person deliberately chose the product's own colours\", and\n    // with the key cleared those are the same state. The second one would\n    // have had the brand theme re-applied over it on every page load, which\n    // reads as a preference that will not save.\n    localStorage.setItem(THEME_LS_KEY, valid);\n  } catch {\n    /* quota / private mode */\n  }\n  // ⚠⚠ `valid`, NEVER ''. This line is a merge repair and it must not go back.\n  // `THEME_LS_KEY` and `PREF_LS_KEYS.palette` are the SAME string,\n  // 'filex.palette'; `savePref` mirrors into local storage and `setLocalPref`\n  // DELETES the key when handed an empty value. So a `'' for stock` ternary\n  // here wrote the key on the line above and erased it on this one:\n  // `setTheme('default')` left no trace of itself, the account learned\n  // nothing, and \"deliberately chose the product's own colours\" collapsed back\n  // into \"has never chosen\" — the very state an instance default paints over,\n  // on every page load. \"Never chosen\" is the key being ABSENT, and nothing\n  // else.\n  savePref('palette', valid);\n}\n\n/**\n * The account's palette has arrived: paint it, without sending it back.\n *\n * ⚠ Separate from `setTheme` on purpose. Echoing a value that came FROM the\n * server back TO it is how a hydration turns into a write, and a write into\n * another device's surprise.\n *\n * ⚠⚠ `plausibleThemeId`, not `themeById` — the second merge repair, and the\n * race it closes is worth spelling out. The account's answer and the operator\n * themes are two independent fetches with no ordering between them. When the\n * account arrives first and says `custom:acme`, `themeById` cannot know that\n * id yet (the list is still in flight), would call it invalid, and would drop\n * the person onto the stock palette — writing that demotion into this\n * browser's mirror. `setCustomThemes` then finds the selection already at the\n * default and sees nothing to correct, so the choice is gone rather than\n * restored. Holding a prefixed id on trust and letting the list resolve it for\n * real is the same contract `readStoredThemeId` already follows at boot.\n */\nexport function applyStoredPalette(id: string | undefined | null): void {\n  // ⚠⚠ NOTHING is not an ANSWER. An account that carries no `palette` key has\n  // never been asked the question on this server; it has not said \"the stock\n  // palette\". Treating the two the same is how e2e 98-custom-theme.spec.ts:97\n  // went red: the browser painted its own `custom:e2e-acme` at boot, then\n  // `App.vue` hydrated an account document with no palette in it and called\n  // this function with `''`, which resolved to the stock id and overwrote both\n  // the selection AND this browser's mirror. `expect.poll(--fe-primary)` won\n  // the race against the fetch and the unpolled `--fe-bg` read on the very\n  // next line lost it, which is exactly what a flake caused by a real bug\n  // looks like.\n  //\n  // ⚠ The other three preferences already got this right and only the palette\n  // did not — `applyAccountTheme` (web/src/lib/theme.ts), `applyAccountDensity`\n  // (lib/density.ts) and `applyPrefLocale` (web/src/i18n) each return\n  // early on a value the account does not carry. This was the odd one out.\n  //\n  // ⚠⚠ Silence is not the same as an invalid id, either: `setCustomThemes`\n  // deliberately calls this with `DEFAULT_THEME_ID` to demote somebody off a\n  // theme the operator deleted, and that IS an answer and must still paint.\n  if (!id) return;\n  const valid = plausibleThemeId(id) ? id : DEFAULT_THEME_ID;\n  themeId.value = valid;\n  setLocalPref('palette', valid);\n}\n\n/**\n * Paint a palette this person did not choose — the instance's own default,\n * applied to somebody who has never expressed a preference.\n *\n * ⚠⚠ It records NOTHING: not the account, not this browser's mirror. An\n * instance default is the operator's standing answer, not a personal choice,\n * and the difference is load-bearing in both directions. Written to the\n * account, it would overwrite on one device a choice the person made on\n * another. Written to the mirror, it would make `hasOwnChoice()` true, so the\n * day the operator picks a different house theme every existing person would\n * stay pinned to the old one, permanently, with no way to tell why.\n */\nexport function applyInstanceDefault(id: string | undefined | null): void {\n  if (id && plausibleThemeId(id)) themeId.value = id;\n}\n\n/** Reactive handle for components: `{ themeId, setTheme }`. */\nexport function useThemeState(): { themeId: Ref<string>; setTheme: (id: string) => void } {\n  return { themeId, setTheme };\n}\n\n/* ------------------------------------------------------------------ */\n/* Light / dark MODE preference                                        */\n/* ------------------------------------------------------------------ */\n\n/**\n * The user's own light/dark choice — a different question from WHICH theme\n * paints (that is `themeId` above).\n *\n * `'host'` is the default and means \"whatever the embedder passed in\n * `config.theme`\". That is what keeps every existing embed unchanged: work and\n * the fishapp hand the explorer the mode their own page is in, and an explorer\n * that silently overrode it would sit as a dark rectangle inside a light page.\n * The other three are an explicit choice by the person looking at it and\n * outrank the host: `'auto'` follows the operating system, `'light'`/`'dark'`\n * are fixed.\n */\nexport type ThemeModePref = 'host' | 'auto' | 'light' | 'dark';\n\nexport const THEME_MODE_LS_KEY = 'filex.thememode';\n\n/**\n * ⚠ It is a PERSON's key, so a sign-out takes it with the rest\n * (`lib/prefs` → `forgetPersonalPrefs`). Registered from here rather than\n * listed over there because a storage key written down in two modules is the\n * drift `lib/density`' header was written about.\n */\nregisterPersonalMirror(THEME_MODE_LS_KEY);\n\nconst MODE_VALUES: ThemeModePref[] = ['host', 'auto', 'light', 'dark'];\n\nfunction readStoredThemeMode(): ThemeModePref {\n  // ⚠⚠ Same rule as the palette, same reason: light or dark is a PERSON's\n  // answer. `'host'` is the neutral one — the explorer then falls back to\n  // `config.theme || 'auto'` (FileExplorer.vue) and `'auto'` is\n  // `prefers-color-scheme`, which is exactly what the owner asked a signed-out\n  // window to follow.\n  if (!hasSession()) return 'host';\n  try {\n    const v = localStorage.getItem(THEME_MODE_LS_KEY) as ThemeModePref | null;\n    return v && MODE_VALUES.includes(v) ? v : 'host';\n  } catch {\n    return 'host';\n  }\n}\n\nconst themeMode: Ref<ThemeModePref> = ref(\n  typeof window === 'undefined' ? 'host' : readStoredThemeMode(),\n);\n\nexport function setThemeMode(mode: ThemeModePref): void {\n  const valid = MODE_VALUES.includes(mode) ? mode : 'host';\n  themeMode.value = valid;\n  try {\n    if (valid === 'host') localStorage.removeItem(THEME_MODE_LS_KEY);\n    else localStorage.setItem(THEME_MODE_LS_KEY, valid);\n  } catch {\n    /* quota / private mode */\n  }\n}\n\n/**\n * The session answer changed — re-decide whose look this window wears.\n *\n * ⚠⚠ Needed because the two reads above happen at MODULE LOAD, and the only\n * synchronous evidence available then is `hasSession()`'s stored hint. Two\n * things can contradict it later and both must be obeyed:\n *   • the document turns out to be a public link (`sealSessionless` in the\n *     host's boot), and\n *   • `/api/auth/me` answers \"nobody\" on a browser whose hint said otherwise —\n *     a session that expired, or somebody who closed the tab instead of\n *     signing out. That is the shared-machine case, and leaving it unhandled\n *     would keep the leak alive for exactly the people most likely to hit it.\n *\n * ⚠ It re-READS rather than assuming: called after a sign-in it restores the\n * person's own palette from the mirror, so the function is one answer to the\n * question, not a one-way demotion.\n *\n * ⚠ It touches no storage. Nothing here is a choice anybody made.\n */\nexport function resolveSessionLook(): void {\n  themeId.value = readStoredThemeId();\n  themeMode.value = readStoredThemeMode();\n}\n\n/** Reactive handle for components: `{ themeMode, setThemeMode }`. */\nexport function useThemeModeState(): {\n  themeMode: Ref<ThemeModePref>;\n  setThemeMode: (mode: ThemeModePref) => void;\n} {\n  return { themeMode, setThemeMode };\n}\n\n// Cross-tab sync, same contract as the theme id above.\n//\n// ⚠⚠ Gated on the session for the same reason the boot read is. A `storage`\n// event is broadcast to EVERY tab on the origin, so a signed-in tab changing\n// the mode would otherwise push that person's answer into a tab sitting on the\n// sign-in page or on somebody's share link — the leak coming back through a\n// side door after the front one was shut.\nif (typeof window !== 'undefined') {\n  try {\n    window.addEventListener('storage', (e) => {\n      if (e.key !== THEME_MODE_LS_KEY || !hasSession()) return;\n      const v = e.newValue as ThemeModePref | null;\n      themeMode.value = v && MODE_VALUES.includes(v) ? v : 'host';\n    });\n  } catch {\n    /* non-browser env */\n  }\n}\n\n// Cross-tab sync — another tab changing the preference updates this one live.\nif (typeof window !== 'undefined') {\n  try {\n    window.addEventListener('storage', (e) => {\n      // ⚠ `hasSession()` — see the mode listener above. Same event, same\n      // origin-wide broadcast, same leak.\n      if (e.key !== THEME_LS_KEY || !hasSession()) return;\n      themeId.value = plausibleThemeId(e.newValue) ? (e.newValue as string) : DEFAULT_THEME_ID;\n    });\n  } catch {\n    /* non-browser env */\n  }\n}\n\n/* ------------------------------------------------------------------ */\n/* Application — layer 1: inline vars on the explorer root             */\n/* ------------------------------------------------------------------ */\n\n/**\n * Set (or clear, for the default theme) the selected theme's tokens as\n * inline CSS variables on the explorer root element, resolved to the\n * active variant. Inline style wins over every stylesheet rule, so the\n * root subtree is always correct regardless of host CSS.\n */\nexport function applyThemeToEl(el: HTMLElement, id: string, dark: boolean): void {\n  for (const key of allTokenKeys()) el.style.removeProperty(key);\n  if (id === DEFAULT_THEME_ID) return;\n  const theme = themeById(id);\n  if (!theme) return;\n  const map = dark ? theme.dark : theme.light;\n  for (const [key, value] of Object.entries(map)) el.style.setProperty(key, value);\n}\n\n/* ------------------------------------------------------------------ */\n/* Application — layer 2: injected stylesheet for shadowed surfaces    */\n/* ------------------------------------------------------------------ */\n\nconst STYLE_ATTR = 'data-filex-theme';\n\nfunction cssDecls(map: ThemeTokenMap): string {\n  return Object.entries(map)\n    .map(([k, v]) => `${k}:${v};`)\n    .join('');\n}\n\n/* === The outward-facing pages (#74) ======================================\n *\n * The share page (`/s/`, `/d/`, an app's public page - core PublicShell) and\n * the sign-in page are what a stranger sees of an installation, so the\n * owner's rule (2026-10-01) is that they follow the operator's theme: a theme\n * that DEFINES its own values for them gets those; one that does not gets\n * them in its own tones. Both kinds of page live in the same light and dark\n * maps as the rest of the palette - one theme, one shape (`ThemeDef`), the\n * same export file - and every one of these tokens is OPTIONAL there.\n *\n *   share page - `--fe-ppage-ground-1` / `-ground-2` (the page's two-stop\n *     wash) and `--fe-ppage-card`. Their stock values are hexes of their own\n *     (variables.css `.fe.fe-ppage`, the default theme's map above), not the\n *     palette's: a card on a page sits ABOVE its ground, which `--fe-bg` /\n *     `--fe-bg-elev` say the other way round. So a theme without them must\n *     have them worked out - `DERIVED_PUBLIC_PAGE` - or the page keeps the\n *     stock greys under the theme's text and buttons, which is what it did.\n *   sign-in page - `--fe-login-ground` / `--fe-login-card`. Their stock\n *     values ARE the palette's (`var(--fe-bg-elev)` / `var(--fe-bg)`,\n *     variables.css), so a theme without them is already in its own tones;\n *     one that defines them is written like any other token.\n *\n * ⚠ The shadow (`--fe-ppage-shadow`) and the badge's ok colour stay stock: a\n * shadow is not a colour the operator's validator can check (hex only), and\n * ok is a signal, not taste (see \"What is deliberately NOT themed\" above). */\n\n/** The share page's own ground and card. */\nexport const PUBLIC_PAGE_TOKENS = ['--fe-ppage-ground-1', '--fe-ppage-ground-2', '--fe-ppage-card'] as const;\n/** The sign-in page's ground and card. */\nexport const LOGIN_PAGE_TOKENS = ['--fe-login-ground', '--fe-login-card'] as const;\n/** Every outward-facing page token a theme MAY define (none is required). */\nexport const PAGE_TOKENS: readonly string[] = [...PUBLIC_PAGE_TOKENS, ...LOGIN_PAGE_TOKENS];\n\n/**\n * The share page in a theme's own tones, for a theme that does not define it.\n *\n * Fitted to the stock page: light - the card IS the surface and the wash is\n * the surface drawn 4% and 10% toward the ink (stock bg/ink give #f6f6f7 and\n * #e9eaeb against the page's #f5f7fb / #e9edf4); dark - the card is lifted 8%\n * toward the ink and the wash runs from the surface sunk 12% toward black to\n * the surface lifted 4% (#26282d / #121419 / #1d1f24 against #1f242c /\n * #12151a / #191e25). Mixed by the browser (`color-mix`), from the theme's\n * own `--fe-bg` / `--fe-text` on the page's element, so a theme that is only\n * a palette needs no colour maths here.\n */\nexport const DERIVED_PUBLIC_PAGE: Record<'light' | 'dark', Record<(typeof PUBLIC_PAGE_TOKENS)[number], string>> = {\n  light: {\n    '--fe-ppage-ground-1': 'color-mix(in srgb, var(--fe-bg) 96%, var(--fe-text))',\n    '--fe-ppage-ground-2': 'color-mix(in srgb, var(--fe-bg) 90%, var(--fe-text))',\n    '--fe-ppage-card': 'var(--fe-bg)',\n  },\n  dark: {\n    '--fe-ppage-ground-1': 'color-mix(in srgb, var(--fe-bg) 88%, #000000)',\n    '--fe-ppage-ground-2': 'color-mix(in srgb, var(--fe-bg) 96%, var(--fe-text))',\n    '--fe-ppage-card': 'color-mix(in srgb, var(--fe-bg) 92%, var(--fe-text))',\n  },\n};\n\n/** The share page's three tokens for one variant: each one the theme defines,\n *  the derived one for each it does not. */\nexport function publicPageTokens(theme: ThemeDef, variant: 'light' | 'dark'): ThemeTokenMap {\n  const own = theme[variant] ?? {};\n  const out: ThemeTokenMap = {};\n  for (const k of PUBLIC_PAGE_TOKENS) {\n    const v = typeof own[k] === 'string' ? own[k].trim() : '';\n    out[k] = v || DERIVED_PUBLIC_PAGE[variant][k];\n  }\n  return out;\n}\n\nconst PUBLIC_PAGE_SET = new Set<string>(PUBLIC_PAGE_TOKENS);\n\n/** A palette map without the share page's tokens - those are written under the\n *  page's own selectors, which outrank `:root,.fe`. */\nfunction withoutPublicPage(map: ThemeTokenMap): ThemeTokenMap {\n  const out: ThemeTokenMap = {};\n  for (const [k, v] of Object.entries(map)) if (!PUBLIC_PAGE_SET.has(k)) out[k] = v;\n  return out;\n}\n\n/**\n * Generate a stylesheet that mirrors styles/variables.css' selector\n * cascade 1:1 (light base → explicit-dark selectors → prefers-dark media\n * block) with the theme's palette. Appended after the bundled CSS it\n * overrides every surface — teleported context menus, modal backdrops —\n * in whichever mode they resolve to, without JS having to track them.\n *\n * The share page's tokens follow, under the page's own selectors\n * (variables.css `.fe.fe-ppage` and its dark twins - the same specificity,\n * later in the document, so the theme's win): what the theme defines, else\n * its own tones (`publicPageTokens`).\n */\nexport function generateThemeCss(theme: ThemeDef): string {\n  const light = cssDecls(withoutPublicPage(theme.light));\n  const dark = cssDecls(withoutPublicPage(theme.dark));\n  const pageLight = cssDecls(publicPageTokens(theme, 'light'));\n  const pageDark = cssDecls(publicPageTokens(theme, 'dark'));\n  const pageDarkSelectors = [\n    '.fe.fe-ppage.fe--theme-dark',\n    \":root[data-theme='dark'] .fe.fe-ppage\",\n    ':root.dark .fe.fe-ppage',\n    '.dark .fe.fe-ppage',\n  ].join(',');\n  const darkSelectors = [\n    '.fe--theme-dark',\n    \":root[data-theme='dark'] .fe\",\n    '.fe.fe--theme-dark',\n    ':root.dark',\n    '.dark',\n    ':root.dark .fe',\n    '.dark .fe',\n    '.fe-ctx-backdrop--theme-dark',\n    \".fe-ctx-backdrop--theme-auto[data-prefers-dark='1']\",\n  ].join(',');\n  const autoDarkSelectors = [\n    '.fe:not(.fe--theme-light)',\n    '.fe-ctx-backdrop--theme-auto:not(.fe-ctx-backdrop--theme-light)',\n  ].join(',');\n  return (\n    `/* filex theme: ${theme.id} */` +\n    `:root,.fe{${light}}` +\n    `${darkSelectors}{${dark}}` +\n    `@media (prefers-color-scheme: dark){${autoDarkSelectors}{${dark}}}` +\n    `.fe.fe-ppage{${pageLight}}` +\n    `${pageDarkSelectors}{${pageDark}}` +\n    `@media (prefers-color-scheme: dark){.fe.fe-ppage:not(.fe--theme-light){${pageDark}}}`\n  );\n}\n\n/**\n * Create/update/empty the singleton `<style data-filex-theme>` element in\n * <head>. Idempotent — safe to call from every explorer instance.\n */\nexport function syncThemeStyle(id: string): void {\n  if (typeof document === 'undefined') return;\n  let el = document.head.querySelector<HTMLStyleElement>(`style[${STYLE_ATTR}]`);\n  const theme = id === DEFAULT_THEME_ID ? undefined : themeById(id);\n  if (!theme) {\n    if (el) el.textContent = '';\n    return;\n  }\n  if (!el) {\n    el = document.createElement('style');\n    el.setAttribute(STYLE_ATTR, '');\n    document.head.appendChild(el);\n  } else if (el !== document.head.lastElementChild) {\n    // Keep it AFTER any stylesheet injected later (e.g. the webcomponent's\n    // own core-CSS injection) so equal-specificity rules keep losing to us.\n    document.head.appendChild(el);\n  }\n  const css = generateThemeCss(theme);\n  if (el.textContent !== css) el.textContent = css;\n}\n","<script setup lang=\"ts\">\n/**\n * ThemePalette — the grid of palette cards, and nothing else.\n *\n * Each card is a mini live preview (surface + toolbar chips + sample rows)\n * painted with that palette's own tokens for the currently resolved light/dark\n * mode, so the card shows exactly what you would get. Click emits `select`;\n * the selected card carries a ✓.\n *\n * ⚠ Split out of `ThemeGallery.vue` rather than copied: the appearance\n * controls now have TWO hosts — the explorer's own gallery modal, and the web\n * app's user-settings modal, which cannot mount the gallery because the\n * gallery IS a modal (`modals/Modal.vue`, a fixed full-viewport backdrop) and\n * a dialog inside a dialog is not a settings pane. Duplicating thirty lines of\n * card markup into `web/` would have meant the two pickers drift apart the\n * first time a token is added to a preview — the same split this package\n * exists to prevent. One component, two hosts.\n *\n * Presentational only. Selection state + persistence live in lib/themes.ts,\n * shared across every instance on the page; the host forwards `select` to it.\n *\n * `default` is the first card and IS the reset: applying it clears every\n * override. A host therefore needs no separate \"reset\" control (the gallery\n * keeps one in its footer because a modal has a footer to keep it in).\n */\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { allThemes, themeName, type ThemeDef } from '../lib/themes';\n\nconst props = defineProps<{\n  locale: LocaleCode;\n  /** Resolved mode — decides which variant the preview cards paint. */\n  dark: boolean;\n  /** Currently selected theme id. */\n  current: string;\n  /** Draw the explanatory line above the grid. Default true. */\n  hint?: boolean;\n}>();\n\nconst emit = defineEmits<{ (e: 'select', id: string): void }>();\n\nconst { t } = useLocale(() => props.locale);\n\n/** Inline variables for one card — a self-contained mini `--fe-*` scope,\n *  so the preview markup can use the exact same tokens the real UI uses. */\nfunction cardVars(th: ThemeDef): Record<string, string> {\n  return props.dark ? th.dark : th.light;\n}\n</script>\n\n<template>\n  <p v-if=\"hint !== false\" class=\"fe-themes__hint\">{{ t('theme.hint') }}</p>\n  <div class=\"fe-themes\" role=\"listbox\" :aria-label=\"t('theme.title')\">\n    <button\n      v-for=\"th in allThemes()\"\n      :key=\"th.id\"\n      type=\"button\"\n      class=\"fe-themecard\"\n      :class=\"{ 'is-selected': th.id === current }\"\n      role=\"option\"\n      :aria-selected=\"th.id === current\"\n      :data-theme-id=\"th.id\"\n      :style=\"cardVars(th)\"\n      @click=\"emit('select', th.id)\"\n    >\n      <span class=\"fe-themecard__preview\" aria-hidden=\"true\">\n        <span class=\"fe-themecard__topbar\">\n          <span class=\"fe-themecard__chip fe-themecard__chip--primary\"></span>\n          <span class=\"fe-themecard__chip\"></span>\n          <span class=\"fe-themecard__chip fe-themecard__chip--ghost\"></span>\n        </span>\n        <span class=\"fe-themecard__row\">\n          <span class=\"fe-themecard__dot\"></span>\n          <span class=\"fe-themecard__line\" style=\"width: 62%\"></span>\n        </span>\n        <span class=\"fe-themecard__row fe-themecard__row--selected\">\n          <span class=\"fe-themecard__dot fe-themecard__dot--primary\"></span>\n          <span class=\"fe-themecard__line\" style=\"width: 44%\"></span>\n        </span>\n        <span class=\"fe-themecard__row\">\n          <span class=\"fe-themecard__dot fe-themecard__dot--muted\"></span>\n          <span class=\"fe-themecard__line fe-themecard__line--muted\" style=\"width: 74%\"></span>\n        </span>\n      </span>\n      <span class=\"fe-themecard__name\">\n        {{ themeName(th, t) }}\n        <span v-if=\"th.id === current\" class=\"fe-themecard__check\" :title=\"t('theme.selected')\">✓</span>\n      </span>\n    </button>\n  </div>\n</template>\n\n<!-- Deliberately NOT scoped: the webcomponent injects the CORE package's\n     built style.css, whose data-v scope ids don't match the ids the\n     webcomponent's own compile assigns (verified: fe-themecard got\n     data-v-99a95ed7 in core vs data-v-5d4cc1fd in the wc bundle) — scoped\n     rules would silently not apply in embeds. Class names are fe-*\n     namespaced, so global is collision-safe (same approach as base.css). -->\n<style>\n.fe-themes__hint {\n  margin: 0 0 12px;\n  font-size: 12.5px;\n  color: var(--fe-text-muted);\n}\n\n.fe-themes {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n  gap: 12px;\n}\n\n/* Each card is its own mini token scope (inline --fe-* vars from the theme\n   definition), so every color below refers to the CARD's theme — not the\n   active page theme. */\n.fe-themecard {\n  display: flex;\n  flex-direction: column;\n  padding: 0;\n  border: 2px solid var(--fe-border-strong);\n  border-radius: var(--fe-radius, 8px);\n  background: var(--fe-bg);\n  cursor: pointer;\n  overflow: hidden;\n  text-align: start;\n  transition: transform 0.12s ease, box-shadow 0.12s ease;\n  font: inherit;\n}\n\n.fe-themecard:hover {\n  transform: translateY(-2px);\n  box-shadow: var(--fe-shadow-sm, 0 2px 6px rgba(15, 23, 42, 0.08));\n}\n\n.fe-themecard:focus-visible {\n  outline: 2px solid var(--fe-primary);\n  outline-offset: 2px;\n}\n\n.fe-themecard.is-selected {\n  border-color: var(--fe-primary);\n  box-shadow: 0 0 0 2px var(--fe-primary);\n}\n\n.fe-themecard__preview {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  padding: 10px;\n  background: var(--fe-bg);\n  border-bottom: 1px solid var(--fe-border);\n  min-height: 84px;\n}\n\n.fe-themecard__topbar {\n  display: flex;\n  gap: 4px;\n  margin-bottom: 2px;\n}\n\n.fe-themecard__chip {\n  height: 8px;\n  width: 22px;\n  border-radius: 4px;\n  background: var(--fe-bg-hover);\n  border: 1px solid var(--fe-border);\n}\n\n.fe-themecard__chip--primary {\n  background: var(--fe-primary);\n  border-color: var(--fe-primary);\n}\n\n.fe-themecard__chip--ghost {\n  background: var(--fe-bg-elev);\n}\n\n.fe-themecard__row {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  padding: 3px 4px;\n  border-radius: 4px;\n}\n\n.fe-themecard__row--selected {\n  background: var(--fe-bg-selected);\n}\n\n.fe-themecard__dot {\n  width: 8px;\n  height: 8px;\n  border-radius: 50%;\n  background: var(--fe-text);\n  opacity: 0.75;\n  flex: none;\n}\n\n.fe-themecard__dot--primary {\n  background: var(--fe-primary);\n  opacity: 1;\n}\n\n.fe-themecard__dot--muted {\n  background: var(--fe-text-muted);\n}\n\n.fe-themecard__line {\n  height: 6px;\n  border-radius: 3px;\n  background: var(--fe-text);\n  opacity: 0.55;\n}\n\n.fe-themecard__line--muted {\n  background: var(--fe-text-muted);\n}\n\n.fe-themecard__name {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 8px;\n  padding: 8px 10px;\n  font-size: 12.5px;\n  font-weight: 600;\n  color: var(--fe-text);\n  background: var(--fe-bg-elev);\n  font-family: var(--fe-font, inherit);\n}\n\n.fe-themecard__check {\n  flex: none;\n  width: 18px;\n  height: 18px;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 50%;\n  background: var(--fe-primary);\n  color: var(--fe-text-on-primary);\n  font-size: 11px;\n  line-height: 1;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * ThemeGallery — wiring:c1 theme picker modal.\n *\n * A grid of theme cards, each rendering a mini live preview (surface +\n * toolbar chips + sample rows) painted with that theme's tokens for the\n * CURRENTLY resolved light/dark mode — so the card shows exactly what\n * you'd get. Click applies instantly (live preview behind the modal) and\n * persists; the selected card carries a ✓. \"Reset to default\" resets.\n *\n * Presentational only — selection state + persistence live in\n * lib/themes.ts (shared across instances); the parent forwards `select`.\n *\n * ⚠ The cards themselves live in `ThemePalette.vue` and are mounted, not\n * copied: the web app's user-settings modal shows the same grid inside a pane\n * and cannot mount this component, because this one IS a modal. See that\n * file's header.\n */\nimport { computed } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { DEFAULT_THEME_ID, type ThemeModePref } from '../lib/themes';\nimport Modal from '../modals/Modal.vue';\nimport ThemePalette from './ThemePalette.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /** Host mode (forwarded to Modal so the backdrop themes correctly). */\n  theme?: ThemeMode;\n  /** Resolved mode — decides which variant the preview cards paint. */\n  dark: boolean;\n  /** Currently selected theme id. */\n  current: string;\n  /** The user's own light/dark preference; 'host' = never chosen. */\n  mode: ThemeModePref;\n  /** What the embedder asked for — what 'host' resolves to. */\n  hostMode: ThemeMode;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'select', id: string): void;\n  (e: 'mode', mode: ThemeModePref): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/* ---- light / dark / auto -------------------------------------------\n * A theme says which palette; this says whether it paints its light or its\n * dark variant. Two separate questions, one place to answer both — the theme\n * button is where people come looking for \"night mode\".\n *\n * Only three choices are ever offered. 'host' is an internal default, not an\n * option: when it is still in force the control highlights whichever of the\n * three the embedder asked for, so the strip always shows the truth, and the\n * first click pins an explicit choice. */\nconst MODES: { id: Exclude<ThemeModePref, 'host'>; labelKey: string }[] = [\n  { id: 'light', labelKey: 'theme.mode.light' },\n  { id: 'dark', labelKey: 'theme.mode.dark' },\n  { id: 'auto', labelKey: 'theme.mode.auto' },\n];\n\nconst shownMode = computed(() => (props.mode === 'host' ? props.hostMode : props.mode));\n\nconst DEFAULT_ID = DEFAULT_THEME_ID;\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('theme.title')\" size=\"lg\" :theme=\"theme\" @close=\"emit('close')\">\n    <div class=\"fe-thememode\" role=\"group\" :aria-label=\"t('theme.mode.label')\">\n      <span class=\"fe-thememode__label\">{{ t('theme.mode.label') }}</span>\n      <div class=\"fe-thememode__seg\">\n        <button\n          v-for=\"m in MODES\"\n          :key=\"m.id\"\n          type=\"button\"\n          class=\"fe-thememode__opt\"\n          :class=\"{ 'is-active': shownMode === m.id }\"\n          :aria-pressed=\"shownMode === m.id\"\n          @click=\"emit('mode', m.id)\"\n        >\n          <svg\n            class=\"fe-ficon\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"1.8\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n            aria-hidden=\"true\"\n            focusable=\"false\"\n          >\n            <template v-if=\"m.id === 'light'\">\n              <circle cx=\"12\" cy=\"12\" r=\"4\" />\n              <path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" />\n            </template>\n            <template v-else-if=\"m.id === 'dark'\">\n              <path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z\" />\n            </template>\n            <template v-else>\n              <!-- Half-filled disc: the mode that is neither, decided elsewhere. -->\n              <circle cx=\"12\" cy=\"12\" r=\"9\" />\n              <path d=\"M12 3a9 9 0 0 1 0 18z\" fill=\"currentColor\" stroke=\"none\" />\n            </template>\n          </svg>\n          <span>{{ t(m.labelKey) }}</span>\n        </button>\n      </div>\n    </div>\n    <ThemePalette\n      :locale=\"locale\"\n      :dark=\"dark\"\n      :current=\"current\"\n      @select=\"(id: string) => emit('select', id)\"\n    />\n    <template #actions>\n      <button\n        type=\"button\"\n        class=\"fe-btn\"\n        :disabled=\"current === DEFAULT_ID\"\n        @click=\"emit('select', DEFAULT_ID)\"\n      >\n        {{ t('theme.reset') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"emit('close')\">\n        {{ t('theme.close') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","/**\n * useExplorerTimeZone — what ONE explorer instance knows about the clock, fed\n * into `lib/timezone`'s resolver.\n *\n * An explorer knows two of the four tiers and nobody else can know them for\n * it: the zone its host configured (`config.timeZone`, tier `host`) and the\n * account behind the credential it holds (tier `account`). The viewer tier is\n * the browser's and the device tier is `Intl`'s; neither needs an instance.\n *\n * How the account is learned — nothing new on the server:\n *\n *   1. the credential's KIND, from `GET /api/files/capabilities`\n *      (`caller_kind`, migration 00030), which the explorer already fetches —\n *      or `config.callerKind`, which a host may set to answer sooner and which\n *      wins over the server's, exactly as it does for the panel's surfaces;\n *   2. for a person, `GET /api/auth/me` — the route every role may call, open\n *      to a bearer token (MiddlewareWithToken) and to cross-origin callers\n *      (CORS allows `Authorization`), and already used by the Connections\n *      panel for the caller's own e-mail. `user.timezone` is the zone.\n *\n * ⚠⚠ An `app` token skips the tier. It authenticates AS its owner, so\n * `/api/auth/me` would happily answer with that owner's zone — and the embeds\n * we run authenticate every visitor with ONE such token. Imposing its owner's\n * clock on all of them is the exact thing the owner ruled out.\n *\n * ⚠ Unknown kind also skips. When capabilities never lands (an old server, a\n * host that routes nothing but the manager), nobody can say whether the key is\n * a person's, and guessing \"person\" would be guessing the dangerous way.\n *\n * ⚠ Every failure is silent and falls through: a 401, a 404 from a host that\n * does not proxy `/api/auth/me`, a network error. The tier is withdrawn and\n * the browser's zone answers. A clock must never throw.\n */\n\nimport { onBeforeUnmount, provide, watch, type Ref } from 'vue';\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { Capabilities } from '../types/FileNode';\nimport { EXPLORER_CLOCK, releaseTimeZoneOwner, setAccountTimeZone, setHostTimeZone } from '../lib/timezone';\n\nexport interface ExplorerTimeZoneDeps {\n  config: () => ExplorerConfig;\n  /** The explorer's capabilities answer; `null` until (and unless) it lands. */\n  capabilities: Ref<Capabilities | null>;\n  /** `GET /api/auth/me` with this explorer's credential. */\n  fetchMe: () => Promise<{ user?: { timezone?: unknown } | null } | undefined>;\n}\n\nexport function useExplorerTimeZone(deps: ExplorerTimeZoneDeps): symbol {\n  const owner = Symbol('filex-explorer');\n  // Every component under this explorer reads its dates on this owner's\n  // tiers, not the page's newest (lib/timezone, timeZoneSourcesFor).\n  provide(EXPLORER_CLOCK, owner);\n\n  watch(\n    () => deps.config().timeZone,\n    (tz) => setHostTimeZone(owner, tz),\n    { immediate: true },\n  );\n\n  const kind = (): 'user' | 'app' | undefined =>\n    deps.config().callerKind ?? deps.capabilities.value?.caller_kind;\n\n  let asked = false;\n  watch(\n    kind,\n    (k) => {\n      if (k !== 'user') {\n        // `app`: nobody's account. Unknown: cannot tell. Either way, withdraw.\n        setAccountTimeZone(owner, null);\n        return;\n      }\n      if (asked) return;\n      asked = true;\n      deps\n        .fetchMe()\n        .then((body) => {\n          // The kind may have changed while the request was out.\n          if (kind() !== 'user') return;\n          const tz = body?.user?.timezone;\n          setAccountTimeZone(owner, typeof tz === 'string' ? tz : null);\n        })\n        .catch(() => setAccountTimeZone(owner, null));\n    },\n    { immediate: true },\n  );\n\n  onBeforeUnmount(() => releaseTimeZoneOwner(owner));\n  return owner;\n}\n","<script setup lang=\"ts\">\n/**\n * OperationsCenter — the single visible surface for long-running work\n * (wiring:c3). Compact bottom-right badge (active count + aggregate\n * progress ring; hidden when idle) that expands into a panel: active\n * operations on top, session history below.\n *\n * Renders whatever the useOperations store aggregates — uploads, ops-queue\n * jobs, future convert/archive kinds — with one uniform row template.\n * Cancel / retry / dismiss route back through the store's action registry\n * to the owning publisher.\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { Operation, OperationsStore } from '../composables/useOperations';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = defineProps<{\n  center: OperationsStore;\n  locale: LocaleCode;\n  narrow?: boolean;\n}>();\n\nconst { t, formatSize } = useLocale(() => props.locale);\n\nconst open = ref(false);\nconst rootEl = ref<HTMLElement | null>(null);\n\nconst active = computed(() => props.center.active.value);\nconst history = computed(() => props.center.history.value);\nconst hasError = computed(() => props.center.hasError.value);\nconst overall = computed(() => props.center.overallPercent.value);\nconst runningCount = computed(() => props.center.runningCount.value);\n\n// Badge visible while anything is active; once the panel is open it stays\n// up (showing history) until the user closes it. Idle + closed → hidden.\nconst visible = computed(() => active.value.length > 0 || (open.value && history.value.length > 0));\n\nwatch(visible, (v) => {\n  if (!v) open.value = false;\n});\n\n// A job the person just started opens the panel on its row (useOperations\n// `reveal`). ⚠ Optional-chained: a store written by hand for a test or an\n// embed may not carry it, and a missing counter must not break the badge.\nwatch(\n  () => props.center.revealRequests?.value ?? 0,\n  (n, before) => {\n    if (n > before) open.value = true;\n  },\n);\n\n// ---- progress ring ----\nconst RING_R = 8.5;\nconst RING_C = 2 * Math.PI * RING_R;\nconst ringOffset = computed(() => {\n  const p = overall.value;\n  if (p === null) return RING_C * 0.72; // spinner arc\n  return RING_C * (1 - Math.min(100, Math.max(0, p)) / 100);\n});\nconst ringSpin = computed(() => overall.value === null && runningCount.value > 0);\n\nconst pctText = computed(() => {\n  if (runningCount.value === 0 || overall.value === null) return '';\n  return t('opc.percent', { n: overall.value });\n});\n\nconst badgeAria = computed(() => t('opc.aria_badge', { n: active.value.length }));\n\n// ---- row helpers ----\nconst KIND_ICONS: Record<Operation['kind'], string> = {\n  upload: 'M12 16V5M7 9.5 12 5l5 4.5M5 19h14',\n  copy: 'M9 9h11v11H9zM5 15V4h11',\n  move: 'M4 12h13M12 6l6 6-6 6',\n  delete: 'M5 7h14M9 7V5h6v2M8 7l1 13h6l1-13',\n  /* A folder given a new name, and one brought back from the trash. */\n  rename: 'M4 20h4L18.5 9.5l-4-4L4 16zM13 7l4 4',\n  restore: 'M9 14 4 9l5-5M4 9h10.5a5.5 5.5 0 0 1 0 11H11',\n  /* A trash entry taken out for good: the bin, crossed. */\n  purge: 'M5 7h14M9 7V5h6v2M8 7l1 13h6l1-13M10 11l4 5M14 11l-4 5',\n  convert: 'M20 8A8 8 0 0 0 6 6L4 8M4 16a8 8 0 0 0 14 2l2-2M20 3v5h-5M4 21v-5h5',\n  archive: 'M4 8V5h16v3zM5 8h14v12H5zM10 12h4',\n  /* \"Empty the trash\" — the bin, with the lines of what is going. */\n  trash: 'M5 7h14M9 7V5h6v2M8 7l1 13h6l1-13M10.5 11v5M13.5 11v5',\n  /* \"Repair thumbnails\" (Admin → Tools): a picture, its frame and its hill. */\n  thumbs: 'M4 5h16v14H4zM4 16l5-5 4 4 3-3 4 4M15 9.5h.01',\n  /* An app-plugin job — the puzzle piece its menu row wears (lib/actionIcons). */\n  plugin:\n    'M9.5 4.5a2 2 0 1 1 4 0h3a1.5 1.5 0 0 1 1.5 1.5v3a2 2 0 1 1 0 4v3a1.5 1.5 0 0 1-1.5 1.5h-3a2 2 0 1 1-4 0h-3A1.5 1.5 0 0 1 5 16v-3a2 2 0 1 1 0-4V6a1.5 1.5 0 0 1 1.5-1.5z',\n  'archive-create': 'M4 8V5h16v3zM5 8h14v12H5zM10 12h4',\n  'archive-extract': 'M4 8V5h16v3zM5 8h14v12H5zM10 12h4',\n};\n\nfunction kindLabel(o: Operation): string {\n  return t(`opc.kind.${o.kind}`);\n}\n\nfunction rowTitle(o: Operation): string {\n  return o.name || kindLabel(o);\n}\n\n/**\n * The words for an app job's output mode, or `''`. ⚠ Only the two WRITING\n * modes get a chip: `none` is the normal case for a job that reports rather\n * than produces (a probe, a notification), and labelling it \"no output\"\n * would put a badge on almost every row for no information.\n */\nfunction outputModeLabel(o: Operation): string {\n  if (o.outputMode === 'sibling') return t('plugin.output.sibling');\n  if (o.outputMode === 'version') return t('plugin.output.version');\n  return '';\n}\n\nfunction outputModeTitle(o: Operation): string {\n  if (o.outputMode === 'sibling') return t('plugin.output.sibling_title');\n  if (o.outputMode === 'version') return t('plugin.output.version_title');\n  return '';\n}\n\nfunction statusText(o: Operation): string {\n  if (o.status === 'running') {\n    if (o.cancelling) return t('opc.cancelling');\n    if (o.queued) return t('opc.queued');\n    // A plugin job says what it is doing in its own words (`job_progress`\n    // message); that beats a bare count.\n    if (o.message) return o.message;\n    if (o.totalBytes && o.totalBytes > 0) {\n      return `${formatSize(o.uploadedBytes ?? 0)} / ${formatSize(o.totalBytes)}`;\n    }\n    if ((o.kind === 'archive-create' || o.kind === 'archive-extract') && o.percent !== null) {\n      return t('opc.percent', { n: o.percent });\n    }\n    if (o.itemsTotal && o.itemsTotal > 0) {\n      return t('opc.items', { done: o.itemsDone ?? 0, total: o.itemsTotal });\n    }\n    // ⚠ Not \"0/1\": one selected folder is one source until it ends, and a\n    // count that cannot move reads as a job that died. It is running; the\n    // moving indicator beside it says so. Whether a count is honest is\n    // lib/opProgress's to decide (`percent === null`), not a second rule here.\n    if (o.percent !== null && o.totalCount && o.totalCount > 1) {\n      return `${o.doneCount ?? 0}/${o.totalCount}`;\n    }\n    return t('opc.status.running');\n  }\n  if (o.status === 'done') return o.message || t('opc.status.done');\n  if (o.status === 'aborted') return t('opc.status.aborted');\n  return o.error || t('opc.status.error');\n}\n\n/** A finished job that produced files can be opened from its row. */\nfunction canOpen(o: Operation): boolean {\n  return o.status === 'done' && o.outputs.length > 0;\n}\n\nfunction chipText(o: Operation): string {\n  return t(`opc.status.${o.status === 'running' ? 'running' : o.status}`);\n}\n\n// ---- outside click + Escape ----\nfunction onDocPointerDown(ev: MouseEvent) {\n  if (!open.value) return;\n  const el = rootEl.value;\n  if (el && ev.target instanceof Node && !el.contains(ev.target)) open.value = false;\n}\nfunction onDocKeydown(ev: KeyboardEvent) {\n  if (open.value && ev.key === 'Escape') open.value = false;\n}\nonMounted(() => {\n  document.addEventListener('mousedown', onDocPointerDown);\n  document.addEventListener('keydown', onDocKeydown);\n});\nonBeforeUnmount(() => {\n  document.removeEventListener('mousedown', onDocPointerDown);\n  document.removeEventListener('keydown', onDocKeydown);\n});\n</script>\n\n<template>\n  <div\n    v-if=\"visible\"\n    ref=\"rootEl\"\n    class=\"fe-opc\"\n    :class=\"{ 'fe-opc--narrow': narrow, 'fe-opc--open': open }\"\n  >\n    <transition name=\"fe-opc-pop\">\n      <section v-if=\"open\" class=\"fe-opc__panel\" role=\"dialog\" :aria-label=\"t('opc.title')\">\n        <header class=\"fe-opc__head\">\n          <strong>{{ t('opc.title') }}</strong>\n          <button\n            type=\"button\"\n            class=\"fe-opc__x\"\n            :aria-label=\"t('opc.close')\"\n            @click=\"open = false\"\n          >×</button>\n        </header>\n        <div class=\"fe-opc__body\">\n          <div v-if=\"active.length > 0\" class=\"fe-opc__section\" aria-live=\"polite\">\n            <h3 class=\"fe-opc__section-title\">{{ t('opc.active') }}</h3>\n            <ul class=\"fe-opc__list\">\n              <li\n                v-for=\"o in active\"\n                :key=\"o.key\"\n                class=\"fe-opc__item\"\n                :class=\"`is-${o.status}`\"\n              >\n                <svg\n                  class=\"fe-opc__kicon\"\n                  viewBox=\"0 0 24 24\"\n                  fill=\"none\"\n                  stroke=\"currentColor\"\n                  stroke-width=\"1.8\"\n                  stroke-linecap=\"round\"\n                  stroke-linejoin=\"round\"\n                  aria-hidden=\"true\"\n                  focusable=\"false\"\n                >\n                  <path :d=\"KIND_ICONS[o.kind]\" />\n                </svg>\n                <div class=\"fe-opc__mid\">\n                  <div class=\"fe-opc__name\" :title=\"rowTitle(o)\">{{ rowTitle(o) }}</div>\n                  <div class=\"fe-opc__sub\">\n                    <span class=\"fe-opc__kind\">{{ kindLabel(o) }}</span>\n                    <template v-if=\"outputModeLabel(o)\">\n                      <span class=\"fe-opc__dot\" aria-hidden=\"true\">·</span>\n                      <span class=\"fe-opc__outmode\" :title=\"outputModeTitle(o)\" data-testid=\"opc-output-mode\">\n                        {{ outputModeLabel(o) }}\n                      </span>\n                    </template>\n                    <span class=\"fe-opc__dot\" aria-hidden=\"true\">·</span>\n                    <span class=\"fe-opc__state\">{{ statusText(o) }}</span>\n                  </div>\n                  <!-- An administrator's second line (lib/errorWords): the raw\n                       words behind the sentence above. Nobody else gets them. -->\n                  <div\n                    v-if=\"o.status === 'error' && o.errorDetail\"\n                    class=\"fe-opc__sub fe-opc__sub--detail\"\n                    data-testid=\"opc-error-detail\"\n                  >\n                    {{ o.errorDetail }}\n                  </div>\n                  <div\n                    v-if=\"o.status === 'running' && o.percent !== null\"\n                    class=\"fe-opc__bar\"\n                    role=\"progressbar\"\n                    :aria-valuenow=\"o.percent\"\n                    aria-valuemin=\"0\"\n                    aria-valuemax=\"100\"\n                  >\n                    <div class=\"fe-opc__bar-fill\" :style=\"{ width: o.percent + '%' }\" />\n                  </div>\n                </div>\n                <span\n                  v-if=\"o.status === 'running' && o.percent === null && !o.queued\"\n                  class=\"fe-opc__spin\"\n                  aria-hidden=\"true\"\n                />\n                <div class=\"fe-opc__acts\">\n                  <button\n                    v-if=\"o.status === 'running' && o.cancellable\"\n                    type=\"button\"\n                    class=\"fe-opc__act\"\n                    @click=\"center.cancel(o.key)\"\n                  >{{ t('opc.cancel') }}</button>\n                  <button\n                    v-if=\"canOpen(o)\"\n                    type=\"button\"\n                    class=\"fe-opc__act\"\n                    data-testid=\"opc-open\"\n                    @click=\"center.open(o.key)\"\n                  >{{ t('opc.open') }}</button>\n                  <button\n                    v-if=\"o.status === 'error' && o.retryable\"\n                    type=\"button\"\n                    class=\"fe-opc__act fe-opc__act--retry\"\n                    @click=\"center.retry(o.key)\"\n                  >{{ t('opc.retry') }}</button>\n                  <button\n                    v-if=\"o.status !== 'running'\"\n                    type=\"button\"\n                    class=\"fe-opc__x\"\n                    :aria-label=\"t('opc.dismiss')\"\n                    @click=\"center.dismiss(o.key)\"\n                  >×</button>\n                </div>\n              </li>\n            </ul>\n          </div>\n\n          <div v-if=\"history.length > 0\" class=\"fe-opc__section\">\n            <h3 class=\"fe-opc__section-title\">\n              {{ t('opc.history') }}\n              <button type=\"button\" class=\"fe-opc__act\" @click=\"center.clearHistory()\">\n                {{ t('opc.clear') }}\n              </button>\n            </h3>\n            <ul class=\"fe-opc__list fe-opc__list--history\">\n              <li\n                v-for=\"o in history\"\n                :key=\"'h-' + o.key\"\n                class=\"fe-opc__item fe-opc__item--history\"\n                :class=\"`is-${o.status}`\"\n              >\n                <svg\n                  class=\"fe-opc__kicon\"\n                  viewBox=\"0 0 24 24\"\n                  fill=\"none\"\n                  stroke=\"currentColor\"\n                  stroke-width=\"1.8\"\n                  stroke-linecap=\"round\"\n                  stroke-linejoin=\"round\"\n                  aria-hidden=\"true\"\n                  focusable=\"false\"\n                >\n                  <path :d=\"KIND_ICONS[o.kind]\" />\n                </svg>\n                <div class=\"fe-opc__mid\">\n                  <div class=\"fe-opc__name\" :title=\"rowTitle(o)\">{{ rowTitle(o) }}</div>\n                  <!-- ⚠ The history row keeps the chip: in `version` mode\n                       \"Open\" lands on the file the job started from, and\n                       without these words that reads as \"it did nothing\". -->\n                  <div v-if=\"outputModeLabel(o)\" class=\"fe-opc__sub\">\n                    <span class=\"fe-opc__outmode\" :title=\"outputModeTitle(o)\" data-testid=\"opc-output-mode\">\n                      {{ outputModeLabel(o) }}\n                    </span>\n                  </div>\n                  <div v-if=\"o.status === 'error' && o.error\" class=\"fe-opc__sub fe-opc__sub--err\">\n                    {{ o.error }}\n                  </div>\n                  <!-- An administrator's second line: the raw words behind the\n                       sentence (lib/errorWords). Nobody else is given them. -->\n                  <div\n                    v-if=\"o.status === 'error' && o.errorDetail\"\n                    class=\"fe-opc__sub fe-opc__sub--detail\"\n                    data-testid=\"opc-error-detail\"\n                  >\n                    {{ o.errorDetail }}\n                  </div>\n                </div>\n                <button\n                  v-if=\"canOpen(o)\"\n                  type=\"button\"\n                  class=\"fe-opc__act\"\n                  @click=\"center.open(o.key)\"\n                >{{ t('opc.open') }}</button>\n                <span class=\"fe-opc__chip\" :class=\"`is-${o.status}`\">{{ chipText(o) }}</span>\n              </li>\n            </ul>\n          </div>\n\n          <p v-if=\"active.length === 0 && history.length === 0\" class=\"fe-opc__empty\">\n            {{ t('opc.empty') }}\n          </p>\n        </div>\n      </section>\n    </transition>\n\n    <button\n      type=\"button\"\n      class=\"fe-opc__badge\"\n      :class=\"{ 'is-error': hasError }\"\n      :aria-expanded=\"open\"\n      :aria-label=\"badgeAria\"\n      @click=\"open = !open\"\n    >\n      <svg\n        class=\"fe-opc__ring\"\n        :class=\"{ 'fe-opc__ring--spin': ringSpin }\"\n        viewBox=\"0 0 22 22\"\n        aria-hidden=\"true\"\n        focusable=\"false\"\n      >\n        <circle class=\"fe-opc__ring-track\" cx=\"11\" cy=\"11\" :r=\"RING_R\" fill=\"none\" stroke-width=\"2.5\" />\n        <circle\n          class=\"fe-opc__ring-fill\"\n          cx=\"11\"\n          cy=\"11\"\n          :r=\"RING_R\"\n          fill=\"none\"\n          stroke-width=\"2.5\"\n          stroke-linecap=\"round\"\n          :stroke-dasharray=\"RING_C\"\n          :stroke-dashoffset=\"ringOffset\"\n          transform=\"rotate(-90 11 11)\"\n        />\n      </svg>\n      <span class=\"fe-opc__count\">{{ active.length }}</span>\n      <span v-if=\"pctText\" class=\"fe-opc__pct\">{{ pctText }}</span>\n    </button>\n  </div>\n</template>\n","/**\n * useOperations — unified long-running-operation store (wiring:c3).\n *\n * One presentation-level aggregation point for everything that used to be\n * scattered across corner UIs:\n *   - uploads        (useUploadChunked jobs / legacy multipart rows)\n *   - ops-queue jobs (usePendingOps copy/move/delete worker ops)\n *   - future kinds   (convert / archive — same `sync()` contract, own group)\n *\n * The store does NOT talk to the network. Publishers (renderless\n * UploadProgress / PendingOpsTray adapters) reconcile their reactive source\n * lists into the store via `sync(group, items)`; OperationsCenter renders the\n * merged picture (badge + panel). Action callbacks (cancel/retry/dismiss)\n * are registered per row so the panel can route user intent back to the\n * owning surface without the store knowing any transport details.\n *\n * Lifecycle rules (per the Operations Center contract):\n *   - running rows live in `active`;\n *   - done/aborted rows linger in `active` for DONE_LINGER_MS (\"done\"\n *     flash) then move to `history` (session-only, capped);\n *   - error rows are STICKY: they stay in `active` until the user\n *     dismisses or retries them — even after the source list swept them\n *     (usePendingOps drops terminal ops after its RETAIN window).\n */\n\nimport { computed, getCurrentScope, onScopeDispose, ref } from 'vue';\n\n/** `plugin` — an app-plugin job (docs/APP-PLUGINS-API.md); also what any\n *  queue kind this package has no drawing for is shown as. */\nexport type OperationKind =\n  | 'upload' | 'copy' | 'move' | 'delete' | 'rename' | 'restore' | 'purge' | 'convert'\n  | 'archive' | 'archive-create' | 'archive-extract' | 'plugin' | 'trash' | 'thumbs';\nexport type OperationStatus = 'running' | 'done' | 'error' | 'aborted';\n\n/** What a publisher hands to `sync()` for one row. */\nexport interface OperationInput {\n  /** Stable id within the group (upload uuid / ops row id). */\n  id: string | number;\n  kind: OperationKind;\n  /** Primary label — file name or target path. '' → renderer falls back to the kind verb. */\n  name: string;\n  /** 0..100, or null for indeterminate (renderer shows a spinner). */\n  percent: number | null;\n  status: OperationStatus;\n  /** The failure, SAID (lib/errorWords) — never a raw server string. */\n  error?: string | null;\n  /** The raw words behind it — set only for a caller who administers the\n   *  instance; drawn as a second line under the sentence. */\n  errorDetail?: string | null;\n  /** Queue op accepted but not started yet (\"Queued\"). */\n  queued?: boolean;\n  /** Cancellation was accepted and the worker is stopping/cleaning up. */\n  cancelling?: boolean;\n  /** Progress counters for queue ops (3/5 items). */\n  doneCount?: number;\n  totalCount?: number;\n  /** The items one source is made of, when the server counts them (a folder\n   *  job on one storage): \"25 of 100 items\" instead of a source count of 0/1. */\n  itemsDone?: number;\n  itemsTotal?: number;\n  /** Byte progress for uploads. */\n  uploadedBytes?: number;\n  totalBytes?: number;\n  cancellable?: boolean;\n  retryable?: boolean;\n  /** A plugin job's last progress message — shown under the name while it runs. */\n  message?: string | null;\n  /** Files a finished job produced (adapter-qualified paths); the row offers \"Open\". */\n  outputs?: string[];\n  /**\n   * An app-plugin job's output mode — `sibling` (a new file beside the\n   * original) or `version` (the same file, a new version of it).\n   *\n   * ⚠ It is on the row because the two are indistinguishable once the job\n   * lands: \"Open\" navigates to `outputs[0]`, which in `version` mode IS the\n   * input the person started from, so without the chip the tray reads as if\n   * nothing was produced. Absent for every other kind.\n   */\n  outputMode?: string | null;\n}\n\nexport interface OperationActions {\n  cancel?: () => void;\n  /** Clean the row out of the OWNING source list (called on retire/dismiss). */\n  dismiss?: () => void;\n  retry?: () => void;\n  /** Reveal one of the row's outputs in the listing. */\n  open?: (path: string) => void;\n}\n\nexport interface Operation {\n  /** `${group}:${id}` — unique across publishers. */\n  key: string;\n  kind: OperationKind;\n  name: string;\n  percent: number | null;\n  status: OperationStatus;\n  error: string | null;\n  errorDetail: string | null;\n  queued: boolean;\n  cancelling: boolean;\n  doneCount: number | null;\n  totalCount: number | null;\n  itemsDone: number | null;\n  itemsTotal: number | null;\n  uploadedBytes: number | null;\n  totalBytes: number | null;\n  cancellable: boolean;\n  retryable: boolean;\n  message: string | null;\n  outputs: string[];\n  outputMode: string | null;\n  startedAt: number;\n  settledAt: number | null;\n}\n\nconst DONE_LINGER_MS = 4000;\nconst HISTORY_CAP = 50;\n\nfunction toOperation(key: string, input: OperationInput, prev?: Operation): Operation {\n  const terminal = input.status !== 'running';\n  return {\n    key,\n    kind: input.kind,\n    name: input.name,\n    percent: input.percent,\n    status: input.status,\n    error: input.error ?? null,\n    errorDetail: input.errorDetail ?? null,\n    queued: input.queued ?? false,\n    cancelling: input.cancelling ?? false,\n    doneCount: input.doneCount ?? null,\n    totalCount: input.totalCount ?? null,\n    itemsDone: input.itemsDone ?? null,\n    itemsTotal: input.itemsTotal ?? null,\n    uploadedBytes: input.uploadedBytes ?? null,\n    totalBytes: input.totalBytes ?? null,\n    cancellable: input.cancellable ?? false,\n    retryable: input.retryable ?? false,\n    message: input.message ?? null,\n    outputs: input.outputs ?? [],\n    outputMode: input.outputMode ?? null,\n    startedAt: prev?.startedAt ?? Date.now(),\n    settledAt: prev?.settledAt ?? (terminal ? Date.now() : null),\n  };\n}\n\nexport function useOperations() {\n  const active = ref<Operation[]>([]);\n  const history = ref<Operation[]>([]);\n\n  const actions = new Map<string, OperationActions>();\n  /** Keys already moved to history — sync must not resurrect them. */\n  const retired = new Set<string>();\n  const lingerTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n  function clearTimer(key: string) {\n    const tm = lingerTimers.get(key);\n    if (tm !== undefined) {\n      clearTimeout(tm);\n      lingerTimers.delete(key);\n    }\n  }\n\n  /** Move a row from active to the session history (newest first). */\n  function retire(key: string, opts: { toHistory?: boolean } = {}) {\n    clearTimer(key);\n    const idx = active.value.findIndex((o) => o.key === key);\n    if (idx === -1) return;\n    const [op] = active.value.splice(idx, 1);\n    active.value = [...active.value];\n    retired.add(key);\n    if (opts.toHistory !== false) {\n      history.value = [{ ...op, settledAt: op.settledAt ?? Date.now() }, ...history.value].slice(\n        0,\n        HISTORY_CAP,\n      );\n    }\n  }\n\n  function scheduleLinger(key: string) {\n    if (lingerTimers.has(key)) return;\n    lingerTimers.set(\n      key,\n      setTimeout(() => {\n        lingerTimers.delete(key);\n        // Retire + ask the owning source to drop its row so it doesn't\n        // resurrect on the next sync (uploads keep done rows forever).\n        const acts = actions.get(key);\n        retire(key);\n        acts?.dismiss?.();\n      }, DONE_LINGER_MS),\n    );\n  }\n\n  /**\n   * Full-list reconcile for one publisher group. Upserts every present row,\n   * removes vanished ones (sticky errors excepted), and manages the\n   * done-linger → history hand-off.\n   */\n  function sync(\n    group: string,\n    items: Array<{ input: OperationInput; actions?: OperationActions }>,\n  ): void {\n    const prefix = `${group}:`;\n    const present = new Set<string>();\n    let next = [...active.value];\n    let changed = false;\n\n    for (const item of items) {\n      const key = `${group}:${item.input.id}`;\n      present.add(key);\n      if (item.actions) actions.set(key, item.actions);\n      if (retired.has(key)) continue; // already history — don't resurrect\n      const idx = next.findIndex((o) => o.key === key);\n      const op = toOperation(key, item.input, idx === -1 ? undefined : next[idx]);\n      if (idx === -1) {\n        next = [op, ...next];\n        changed = true;\n      } else if (JSON.stringify(next[idx]) !== JSON.stringify(op)) {\n        next[idx] = op;\n        changed = true;\n      }\n      if (op.status === 'done' || op.status === 'aborted') scheduleLinger(key);\n    }\n\n    // Vanished from source: running → drop silently (superseded elsewhere),\n    // done/aborted → straight to history, error → sticky (keep visible).\n    for (const o of [...next]) {\n      if (!o.key.startsWith(prefix) || present.has(o.key)) continue;\n      if (o.status === 'error') continue;\n      clearTimer(o.key);\n      next = next.filter((x) => x.key !== o.key);\n      changed = true;\n      if (o.status !== 'running') {\n        retired.add(o.key);\n        history.value = [{ ...o, settledAt: o.settledAt ?? Date.now() }, ...history.value].slice(\n          0,\n          HISTORY_CAP,\n        );\n      }\n    }\n\n    // Bookkeeping: retired keys whose source rows are gone can be forgotten\n    // (their ids won't reappear — uuids / monotonic op ids).\n    for (const key of [...retired]) {\n      if (key.startsWith(prefix) && !present.has(key)) retired.delete(key);\n    }\n    for (const key of [...actions.keys()]) {\n      if (key.startsWith(prefix) && !present.has(key) && !active.value.some((o) => o.key === key)) {\n        // keep actions for rows still on screen (sticky errors) and for\n        // history rows that can still be opened (a finished job's outputs)\n        if (next.some((o) => o.key === key)) continue;\n        if (history.value.some((o) => o.key === key && o.outputs.length > 0)) continue;\n        actions.delete(key);\n      }\n    }\n\n    if (changed) active.value = next;\n  }\n\n  function cancel(key: string) {\n    actions.get(key)?.cancel?.();\n  }\n\n  function retry(key: string) {\n    const acts = actions.get(key);\n    retire(key); // failed attempt goes to history; retry publishes a fresh row\n    acts?.dismiss?.();\n    acts?.retry?.();\n  }\n\n  function dismiss(key: string) {\n    const acts = actions.get(key);\n    retire(key);\n    acts?.dismiss?.();\n  }\n\n  /** Reveal a finished row's output — the first one unless a path is named. */\n  function open(key: string, path?: string) {\n    const row = active.value.find((o) => o.key === key) ?? history.value.find((o) => o.key === key);\n    const target = path ?? row?.outputs[0];\n    if (target) actions.get(key)?.open?.(target);\n  }\n\n  function clearHistory() {\n    history.value = [];\n  }\n\n  /**\n   * Bumped by `reveal()`; OperationsCenter opens its panel on every bump.\n   *\n   * ⚠ For a job the person has JUST started and whose dialog has closed — the\n   * collapsed badge alone is a small pill in a far corner, and a job with only\n   * that on screen reads as a click that did nothing. Measured in production\n   * (2026-09-25): an archive of 175 files ran for two minutes, and the person\n   * who started it saw no sign of it at all. Not for work nobody is waiting on\n   * (a background sync, somebody else's job).\n   */\n  const revealRequests = ref(0);\n  function reveal() {\n    revealRequests.value += 1;\n  }\n\n  const runningCount = computed(\n    () => active.value.filter((o) => o.status === 'running').length,\n  );\n  const errorCount = computed(() => active.value.filter((o) => o.status === 'error').length);\n  const hasError = computed(() => errorCount.value > 0);\n\n  /**\n   * Aggregate progress across determinate running rows: each row's own\n   * `percent`, the number its publisher already decided is honest. null →\n   * nothing determinate is running (badge ring spins instead of filling).\n   *\n   * ⚠ Not the rows' counters. This used to read done/total before `percent`,\n   * and a queued move, copy or delete of ONE folder is \"0 of 1\" until it ends\n   * (the queue counts what was selected; on an object store every object\n   * inside is its own request): the row drew a moving indicator, because\n   * lib/opProgress gives it no percent, while the badge beside it read \"0%\"\n   * over an empty ring for minutes. An upload whose bytes are all in filex\n   * has no percent either while the server writes it to the storage.\n   */\n  const overallPercent = computed<number | null>(() => {\n    const running = active.value.filter((o) => o.status === 'running');\n    let sum = 0;\n    let n = 0;\n    for (const o of running) {\n      if (o.percent === null) continue;\n      sum += Math.min(1, Math.max(0, o.percent / 100));\n      n += 1;\n    }\n    if (n === 0) return null;\n    return Math.round((sum / n) * 100);\n  });\n\n  if (getCurrentScope()) {\n    onScopeDispose(() => {\n      for (const tm of lingerTimers.values()) clearTimeout(tm);\n      lingerTimers.clear();\n    });\n  }\n\n  return {\n    active,\n    history,\n    runningCount,\n    errorCount,\n    hasError,\n    overallPercent,\n    sync,\n    cancel,\n    retry,\n    dismiss,\n    open,\n    clearHistory,\n    revealRequests,\n    reveal,\n  };\n}\n\nexport type OperationsStore = ReturnType<typeof useOperations>;\n","/**\n * tour — \"has this person already been offered the first-use tour?\"\n *\n * ⚠⚠ Why this module exists (v0.43.0). The tour used to open 900 ms after\n * EVERY explorer mount whose browser had no `filex.tourDone` flag, and the\n * flag was written only when the tour was CLOSED. So a person who opened a\n * second tab before closing the tour got it again; so did every new tab, every\n * route that remounted the explorer, every other browser, every other device.\n * A browser-automation run met it on each fresh mount and its clicks landed on\n * the tour card one run in two. The owner's rule: the tour is offered to a\n * PERSON once — never once per mount.\n *\n * The answer is kept in two places and read as ONE (an \"or\"):\n *\n *   · the account document (`lib/prefs`, key `tour`) — the person's answer,\n *     on every browser and device that signs in as them;\n *   · this browser's `filex.tourDone` — the answer before the account's\n *     arrives, and the only one an embed without an account copy has.\n *\n * ⚠ It only ever goes one way. Nothing clears it: a tour that has been seen\n * cannot be un-seen, and \"Restart the tour\" opens it without resetting it.\n * That is why the local flag is NOT a per-person mirror cleared at sign-out —\n * a flag that can only say \"yes\" cannot leak a wrong \"no\" to the next person.\n *\n * ⚠ It is recorded when the tour is OFFERED, not when it is closed. Closing\n * was the old trigger, and it is exactly what made a second tab, opened while\n * the first still showed the tour, offer it again.\n */\nimport {\n  currentPrefs,\n  onPrefs,\n  onPrefsSettled,\n  prefsConfigured,\n  prefsHydrated,\n  prefsSettled,\n  savePref,\n} from './prefs';\n\n/** This browser's copy. The name is the one every earlier release wrote. */\nexport const TOUR_LS_KEY = 'filex.tourDone';\n\n/** The value the account document carries once the tour was offered. */\nexport const TOUR_DONE = 'done';\n\n/** How long after a mount the tour opens — the listing and toolbar are laid out by then. */\nexport const TOUR_DELAY_MS = 900;\n\n/**\n * How long a mount waits for the account's answer before it decides on this\n * browser's alone. Bounded: a server that never answers must not mean a tour\n * that never comes, nor one that lands in the middle of somebody's work.\n */\nexport const TOUR_ACCOUNT_WAIT_MS = 5000;\n\nfunction seenHere(): boolean {\n  try {\n    return !!localStorage.getItem(TOUR_LS_KEY);\n  } catch {\n    // No storage (blocked site data, a private window that refuses it): never\n    // auto-nag. The tour is one menu row away for anybody who wants it.\n    return true;\n  }\n}\n\n/** Has this person — here, or on the account — already been offered the tour? */\nexport function tourSeen(): boolean {\n  return seenHere() || !!currentPrefs().tour;\n}\n\nlet accountWriteQueued: (() => void) | null = null;\n\n/**\n * Record that the tour has been offered: in this browser at once, and on the\n * account as soon as the account's document is known.\n *\n * ⚠⚠ Never written to the account BEFORE its document has arrived. `PUT\n * /api/me/prefs` replaces the whole document, and a write made from an empty\n * copy would erase the person's palette, density and language to record a\n * tour.\n */\nexport function markTourSeen(): void {\n  try {\n    localStorage.setItem(TOUR_LS_KEY, '1');\n  } catch {\n    /* see seenHere */\n  }\n  if (!prefsConfigured()) return;\n  if (prefsHydrated()) {\n    if (!currentPrefs().tour) savePref('tour', TOUR_DONE);\n    return;\n  }\n  if (accountWriteQueued) return;\n  const off = onPrefs((p) => {\n    off();\n    accountWriteQueued = null;\n    if (!p.tour) savePref('tour', TOUR_DONE);\n  });\n  accountWriteQueued = off;\n}\n\n/**\n * Offer the tour once, `delayMs` after a mount, unless this person has already\n * been offered it. Returns a cancel for the unmount.\n *\n * With an account behind the explorer the decision waits for the account's\n * answer (at most `accountWaitMs`), so a person who took the tour on another\n * device is not shown it again while the answer is on its way.\n */\nexport function offerTourOnce(\n  show: () => void,\n  opts: { delayMs?: number; accountWaitMs?: number } = {},\n): () => void {\n  const delayMs = opts.delayMs ?? TOUR_DELAY_MS;\n  const waitMs = opts.accountWaitMs ?? TOUR_ACCOUNT_WAIT_MS;\n  let cancelled = false;\n  let delay: ReturnType<typeof setTimeout> | undefined;\n  let giveUp: ReturnType<typeof setTimeout> | undefined;\n  let unwait: (() => void) | undefined;\n\n  const cancel = () => {\n    cancelled = true;\n    if (delay) clearTimeout(delay);\n    if (giveUp) clearTimeout(giveUp);\n    unwait?.();\n  };\n  if (tourSeen()) return cancel;\n\n  const decide = () => {\n    if (giveUp) clearTimeout(giveUp);\n    unwait?.();\n    if (cancelled || tourSeen()) return;\n    markTourSeen();\n    show();\n  };\n\n  delay = setTimeout(() => {\n    if (cancelled || tourSeen()) return;\n    if (!prefsConfigured() || prefsSettled()) {\n      decide();\n      return;\n    }\n    giveUp = setTimeout(decide, waitMs);\n    unwait = onPrefsSettled(decide);\n  }, delayMs);\n  return cancel;\n}\n\n/** Testing seam. */\nexport function resetTourState(): void {\n  accountWriteQueued?.();\n  accountWriteQueued = null;\n}\n","<script setup lang=\"ts\">\n/**\n * TabBar — wiring:d1 the tab strip.\n *\n * Thin strip that sits ABOVE the toolbar. The host renders it only when\n * 2+ tabs exist (embed pixel-parity: a single tab shows nothing at all).\n * Purely presentational: every mutation is an emit; useTabs owns state.\n *\n * Interactions:\n *   click tab      → select\n *   ×/middle-click → close\n *   +              → new tab (clone of the current location)\n *   drag           → reorder (HTML5 DnD; live-swap while dragging)\n *   ⫿ (split)      → toggle the active tab's secondary pane\n *\n * UNSCOPED styles (`fe-tabs*` in base.css) — the webcomponent build\n * cannot carry scoped data-v hashes (v0.5.0 discovery).\n */\nimport { ref } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\n\nexport interface TabItem {\n  id: string;\n  label: string;\n  /** true → the tab carries a split pane (small accent dot). */\n  split: boolean;\n}\n\nconst props = defineProps<{\n  tabs: TabItem[];\n  activeId: string;\n  locale: LocaleCode;\n  /** false → the split toggle is hidden (narrow embeds). */\n  splitEnabled?: boolean;\n  /** true → the split toggle renders pressed (active tab has a pane). */\n  splitActive?: boolean;\n  /**\n   * gorunum:v5-panerow — the details (inspector) toggle lives in this row too.\n   *\n   * ⚠ Opt-in, and absent means NOT DRAWN rather than \"closed\": until the host\n   * moves its own copy out of the breadcrumb row there would otherwise be two\n   * of the same button on screen, which is the duplicate this wave removes.\n   */\n  inspectorEnabled?: boolean;\n  /** true → the details toggle renders pressed (the panel is open). */\n  inspectorOpen?: boolean;\n  /**\n   * gorunum:v5-panerow — hide the tabs themselves (and \"+\"), keeping the row.\n   *\n   * ⚠ True is not \"no tabs exist\", it is \"this deployment does not offer\n   * them\": the `simple` profile drops tabs deliberately (#14 named them as\n   * power-user chrome) but still needs this row, because the details toggle\n   * lives in it. Without the flag the row could only be all-or-nothing, and\n   * the ⓘ would have to keep a second home in the breadcrumb row for that one\n   * profile — a control with two homes is how the two drift.\n   *\n   * ⚠⚠ Phrased as HIDE, not SHOW, and that is not taste. A prop declared\n   * `showTabs?: boolean` compiles to a runtime Boolean prop, and Vue casts an\n   * ABSENT Boolean prop to `false` — not to `undefined`. So `showTabs !== false`\n   * read false for every host that passed nothing, and the strip rendered with\n   * no tabs and no \"+\" at all. Measured in a real browser: `.fe-tabs__tab`\n   * count went from 1 to 0 the moment the prop was added, in both themes at\n   * both widths. Negative default = safe default.\n   */\n  hideTabs?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'select', id: string): void;\n  (e: 'close', id: string): void;\n  (e: 'new'): void;\n  (e: 'reorder', from: number, to: number): void;\n  (e: 'toggle-split'): void;\n  (e: 'toggle-inspector'): void /* gorunum:v5-panerow */;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n// ---- drag-sort (HTML5 DnD, live swap) ------------------------------\nconst dragIndex = ref<number | null>(null);\nconst overIndex = ref<number | null>(null);\n\nfunction onDragStart(i: number, ev: DragEvent) {\n  dragIndex.value = i;\n  if (ev.dataTransfer) {\n    ev.dataTransfer.effectAllowed = 'move';\n    // Firefox requires SOME payload for a drag to start. Deliberately not\n    // the internal file-DnD MIME, so the explorer's drop surfaces ignore it.\n    ev.dataTransfer.setData('text/plain', props.tabs[i]?.id ?? '');\n  }\n}\n\nfunction onDragOver(i: number, ev: DragEvent) {\n  if (dragIndex.value === null) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n  overIndex.value = i;\n}\n\nfunction onDragLeave(i: number) {\n  if (overIndex.value === i) overIndex.value = null;\n}\n\nfunction onDrop(i: number, ev: DragEvent) {\n  if (dragIndex.value === null) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  if (dragIndex.value !== i) emit('reorder', dragIndex.value, i);\n  dragIndex.value = null;\n  overIndex.value = null;\n}\n\nfunction onDragEnd() {\n  dragIndex.value = null;\n  overIndex.value = null;\n}\n\n// Middle-click closes a tab (browser convention). The mousedown guard\n// cancels Chromium's autoscroll on the scrollable strip — without it the\n// auxclick event is never generated.\nfunction onTabMiddleDown(ev: MouseEvent) {\n  if (ev.button === 1) ev.preventDefault();\n}\nfunction onAux(id: string, ev: MouseEvent) {\n  if (ev.button !== 1) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  // ⚠ The same guard the × has. `useTabs.closeTab()` refuses the last tab, so\n  // middle-clicking it was already a no-op; leaving it live while the × is\n  // hidden would be two doors to one verb disagreeing about whether it exists.\n  if (props.tabs.length <= 1) return;\n  emit('close', id);\n}\n</script>\n\n<template>\n  <div class=\"fe-tabs\" role=\"tablist\" :aria-label=\"t('tabs.strip')\">\n    <div v-if=\"!hideTabs\" class=\"fe-tabs__scroll\">\n      <div\n        v-for=\"(tab, i) in tabs\"\n        :key=\"tab.id\"\n        class=\"fe-tabs__tab\"\n        :class=\"{\n          'is-active': tab.id === activeId,\n          'is-dragover': overIndex === i && dragIndex !== null && dragIndex !== i,\n        }\"\n        role=\"tab\"\n        :aria-selected=\"tab.id === activeId ? 'true' : 'false'\"\n        tabindex=\"0\"\n        draggable=\"true\"\n        :title=\"tab.label\"\n        @click=\"emit('select', tab.id)\"\n        @keydown.enter.prevent=\"emit('select', tab.id)\"\n        @mousedown=\"onTabMiddleDown($event)\"\n        @auxclick=\"onAux(tab.id, $event)\"\n        @dragstart=\"onDragStart(i, $event)\"\n        @dragover=\"onDragOver(i, $event)\"\n        @dragleave=\"onDragLeave(i)\"\n        @drop=\"onDrop(i, $event)\"\n        @dragend=\"onDragEnd\"\n      >\n        <span v-if=\"tab.split\" class=\"fe-tabs__splitdot\" aria-hidden=\"true\"></span>\n        <span class=\"fe-tabs__label\"><bdi>{{ tab.label }}</bdi></span>\n        <!-- ⚠ Not drawn when this is the only tab. Owner's decision,\n             2026-09-13, verbatim: *\"tek kalan tab'de x gözükmemeli, onu da\n             kaldırırsın.\"* It is not a style choice — `useTabs.closeTab()`\n             opens with `if (tabs.length <= 1) return null`, so at one tab the\n             × has always been a control that cannot do anything. Drawing it\n             was inviting a dead click. -->\n        <button\n          v-if=\"tabs.length > 1\"\n          type=\"button\"\n          class=\"fe-tabs__close\"\n          :aria-label=\"t('tabs.close')\"\n          :title=\"t('tabs.close')\"\n          @click.stop=\"emit('close', tab.id)\"\n        >×</button>\n      </div>\n    </div>\n    <!-- ⚠ OUTSIDE the scrolling area. Inside it, \"new tab\" scrolled away with\n         the tabs it creates: past a dozen tabs the + was off the right edge and\n         the only way back to it was scrolling a strip most people do not know\n         scrolls. Pinned here it is always where it was. -->\n    <button\n      v-if=\"!hideTabs\"\n      type=\"button\"\n      class=\"fe-tabs__new\"\n      :aria-label=\"t('tabs.new')\"\n      :title=\"t('tabs.new')\"\n      @click=\"emit('new')\"\n    >+</button>\n    <!-- gorunum:v5-panerow — back in THIS row, where it was.\n         ⚠ It spent one round teleported up into the breadcrumb row beside the\n         details toggle. The reasoning was sound (that row is always drawn,\n         this strip is `v-if`'d) and it was approved, but the owner looked at\n         the result and rejected it: *\"kanka split pane ve info butonunu alt\n         kısımda bırak\"*. He decides. The reachability problem the teleport was\n         solving is real and is answered properly in the handover diff instead:\n         this row becomes the WINDOW's row — tabs, +, split and the details\n         toggle — and is drawn whenever any of the four has something to do,\n         rather than only when a second tab exists. -->\n    <button\n      v-if=\"splitEnabled !== false\"\n      type=\"button\"\n      class=\"fe-tabs__split\"\n      :class=\"{ 'is-active': splitActive }\"\n      :aria-label=\"splitActive ? t('tabs.split_off') : t('tabs.split')\"\n      :title=\"splitActive ? t('tabs.split_off') : t('tabs.split')\"\n      :aria-pressed=\"splitActive ? 'true' : 'false'\"\n      data-testid=\"tabs-split\"\n      @click=\"emit('toggle-split')\"\n    >\n      <svg\n        class=\"fe-ficon\"\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        stroke-width=\"1.8\"\n        stroke-linecap=\"round\"\n        stroke-linejoin=\"round\"\n        aria-hidden=\"true\"\n        focusable=\"false\"\n      >\n        <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" />\n        <path d=\"M12 4v16\" />\n      </svg>\n    </button>\n\n    <!-- gorunum:v5-panerow — the details toggle's home in this row.\n         ⚠ Rendered ONLY when the host passes `inspectorEnabled`, which nothing\n         does yet: until the FileExplorer diff in the handover is applied, the\n         ⓘ is still drawn in the breadcrumb row and this must stay silent, or\n         there would be two of it. When the diff lands, `infoPanelToggle` is\n         passed here and the subhead's copy is deleted in the same change. -->\n    <button\n      v-if=\"inspectorEnabled\"\n      type=\"button\"\n      class=\"fe-tabs__inspector\"\n      :class=\"{ 'is-active': inspectorOpen }\"\n      :aria-pressed=\"inspectorOpen ? 'true' : 'false'\"\n      :title=\"t('toolbar.inspector')\"\n      :aria-label=\"t('toolbar.inspector')\"\n      data-testid=\"tabs-inspector\"\n      @click=\"emit('toggle-inspector')\"\n    >\n      <svg\n        class=\"fe-ficon\"\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        stroke-width=\"1.8\"\n        stroke-linecap=\"round\"\n        aria-hidden=\"true\"\n        focusable=\"false\"\n      >\n        <circle cx=\"12\" cy=\"12\" r=\"9\" />\n        <path d=\"M12 11v5\" />\n        <circle cx=\"12\" cy=\"7.6\" r=\"1\" fill=\"currentColor\" stroke=\"none\" />\n      </svg>\n    </button>\n  </div>\n</template>\n","/**\n * The explorer's encrypted-folder lock, for the panes it hosts (wiring:e2).\n *\n * The key ring is the explorer's and there is one per tab: a folder unlocked\n * in one pane is unlocked in the other. The split pane (FilePane, self-driven)\n * lists folders on its own, so when it stands inside a locked encrypted folder\n * it needs the same lock screen and the same unlock the main pane has — this\n * is how it reaches them without a second copy of the unlock code.\n */\nimport type { InjectionKey } from 'vue';\n\nexport interface E2eLockContext {\n  /** Is the encrypted folder at this wire root locked in this tab? Reactive. */\n  locked(root: string): boolean;\n  /** Unlock it with its password: null when it opened, else what to show. */\n  unlock(root: string, password: string): Promise<string | null>;\n  /** The other doors (recovery key, escrow key): in the main pane, which has\n   *  the dialogs for them — it goes to the folder and opens them there. */\n  recovery(root: string): void;\n}\n\nexport const E2E_LOCK: InjectionKey<E2eLockContext> = Symbol('filex.e2eLock');\n","<script setup lang=\"ts\">\n/**\n * E2eLockScreen — an encrypted folder's lock screen (wiring:e2).\n *\n * One component for every pane that can stand inside an encrypted folder:\n * the main pane and the split pane draw the same screen, and the same unlock\n * opens the folder for both (the key ring is the explorer's, shared). The\n * password is checked against the folder's key file in the browser; it never\n * reaches the server. Collects the password; the unlocking is the parent's.\n */\nimport { ref } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = withDefaults(\n  defineProps<{\n    locale: LocaleCode;\n    busy?: boolean;\n    error?: string;\n    /** The recovery-key / escrow door. Always offered where the dialog\n     *  behind it can answer; whether the folder has one is said there. */\n    showRecovery?: boolean;\n    /** Smaller, for a narrow pane. */\n    compact?: boolean;\n  }>(),\n  { busy: false, error: '', showRecovery: true, compact: false },\n);\nconst emit = defineEmits<{\n  (e: 'unlock', password: string): void;\n  (e: 'recovery'): void;\n}>();\nconst { t } = useLocale(() => props.locale);\nconst pw = ref('');\n\nfunction submit() {\n  if (!pw.value || props.busy) return;\n  emit('unlock', pw.value);\n}\ndefineExpose({ clear: () => (pw.value = '') });\n</script>\n\n<template>\n  <div class=\"fe-state fe-e2e-lock\" :class=\"{ 'fe-e2e-lock--compact': compact }\" data-testid=\"e2e-lock\">\n    <svg\n      class=\"fe-state__art\"\n      viewBox=\"0 0 120 100\"\n      :width=\"compact ? 80 : 110\"\n      :height=\"compact ? 67 : 92\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      stroke-width=\"2\"\n      stroke-linecap=\"round\"\n      stroke-linejoin=\"round\"\n      aria-hidden=\"true\"\n    >\n      <rect x=\"38\" y=\"44\" width=\"44\" height=\"34\" rx=\"6\" />\n      <path d=\"M46 44v-8a14 14 0 0 1 28 0v8\" />\n      <circle cx=\"60\" cy=\"59\" r=\"3\" fill=\"currentColor\" stroke=\"none\" />\n      <path d=\"M60 62v7\" />\n    </svg>\n    <p class=\"fe-state__title\">{{ t('e2e.locked.title') }}</p>\n    <p class=\"fe-state__hint\">{{ t('e2e.locked.hint') }}</p>\n    <form class=\"fe-e2e-lock__form\" @submit.prevent=\"submit\">\n      <input\n        v-model=\"pw\"\n        type=\"password\"\n        class=\"fe-input fe-e2e-lock__input\"\n        :placeholder=\"t('e2e.locked.pw_placeholder')\"\n        :aria-label=\"t('e2e.locked.pw_placeholder') /* the title and hint above\n          say what this screen is; the field still needs its own name */\"\n        autocomplete=\"current-password\"\n        :disabled=\"busy\"\n      />\n      <button type=\"submit\" class=\"fe-btn fe-btn--primary\" :disabled=\"busy || !pw\">\n        {{ busy ? t('e2e.locked.busy') : t('e2e.locked.unlock') }}\n      </button>\n    </form>\n    <p v-if=\"error\" class=\"fe-form__error\" role=\"alert\">{{ error }}</p>\n    <!-- wiring:e2 recovery — the second door. Always offered: whether this\n         folder actually has one is answered inside the dialog, which can say\n         \"this folder predates recovery keys\" instead of leaving the user\n         guessing why there is no link. -->\n    <button v-if=\"showRecovery\" type=\"button\" class=\"fe-e2e-optlink\" @click=\"emit('recovery')\">\n      {{ t('e2e.locked.use_recovery') }}\n    </button>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Breadcrumb — adapter-aware path crumbs.\n *\n * Dirname arrives as `<adapter>://<rel>` (e.g. `s3-test://aa/bb`). The\n * first crumb is ALWAYS the storage root — its label is the adapter\n * name itself (`s3-test`) and clicking it lands you at `<adapter>://`,\n * NOT at the first sub-folder you happened to be inside. The remaining\n * crumbs walk down the path one segment at a time.\n *\n * Examples:\n *   `s3-test://`           → [s3-test]\n *   `s3-test://aa`         → [s3-test] › [aa]\n *   `s3-test://aa/bb`      → [s3-test] › [aa] › [bb]\n *\n * `rootLabel` overrides the adapter name when the embedder wants a\n * branded label ('Files', 'My Drive', etc). Defaults to the adapter.\n *\n * The ✏ button swaps the crumbs for a free-form input; Enter\n * navigates, Escape cancels.\n */\nimport { computed, inject, nextTick, onBeforeUnmount, ref, watch } from 'vue';\nimport { E2E_NAME_VIEW } from '../composables/useE2eNames';\nimport { hasInternalDrag } from '../lib/dragOut';\nimport { virtualSegmentLabel } from '../lib/listing';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons';\n\nconst props = defineProps<{\n  dirname: string;\n  adapter: string;\n  rootLabel: string;\n  locale: LocaleCode;\n  /**\n   * Multi-storage mode — when true the breadcrumb prepends a global\n   * \"/\" crumb so the user can pop all the way back to the storage\n   * picker. Storage name then occupies crumb #1 instead of #0.\n   */\n  multiStorageRoot?: boolean;\n  /**\n   * Root confinement (qualified `<adapter>://<rel>`). When set the breadcrumb\n   * treats this folder as `/`: crumbs above it are hidden, the root crumb is\n   * the confined folder's own name, and the ✏ path editor shows/accepts paths\n   * relative to it (`/`, `/sub`). Pairs with FileExplorer's rootPath clamp.\n   */\n  rootPath?: string;\n  /**\n   * gorunum:v2-topbar — what is INSIDE the folder the last crumb names, for\n   * the chevron the reference shell puts there (\"Subfolders\"). Supplied by\n   * the parent, because the listing it comes from is the parent's: a second\n   * fetch from here would be a second answer to \"what is in this folder\".\n   *\n   * ⚠ The affordance is drawn whenever the array is PRESENT, empty or not —\n   * a control that appears and disappears as you walk the tree is a control\n   * nobody learns. An empty folder says so in the menu instead.\n   */\n  subfolders?: { label: string; adapterPath: string }[];\n}>();\n\n// Confined root parsed into its adapter-relative form (\"projeler/acme\") and\n// the trailing folder name used as the \"/\" crumb label.\nconst confinedRel = computed(() => {\n  if (!props.rootPath) return '';\n  const r = props.rootPath;\n  const i = r.indexOf('://');\n  return (i >= 0 ? r.slice(i + 3) : r).replace(/^\\/+|\\/+$/g, '');\n});\nconst floorLabel = computed(() => {\n  const rel = confinedRel.value;\n  if (!rel) return props.rootLabel || props.adapter;\n  const parts = rel.split('/');\n  return parts[parts.length - 1] || (props.rootLabel || props.adapter);\n});\n\nconst { t } = useLocale(() => props.locale);\n/* wiring:e2 names — provided by FileExplorer; absent when used on its own. */\nconst e2eNameView = inject(E2E_NAME_VIEW, null);\n\n\nconst emit = defineEmits<{\n  (e: 'navigate', adapterPath: string): void;\n  (e: 'copy-path', adapterPath: string): void;\n  (e: 'crumb-context', payload: { x: number; y: number; adapterPath: string; label: string }): void;\n  (e: 'crumb-drop', adapterPath: string, ev: DragEvent): void;\n}>();\n\ninterface Crumb {\n  label: string;\n  adapterPath: string;\n}\n\nconst crumbs = computed<Crumb[]>(() => {\n  /* ⚠ Empty adapter → EMPTY prefix, not a bare `://`. A virtual view\n     (`.starred`, `.tag~invoices`) belongs to no storage, so the pane hands us\n     the sentinel with no adapter at all; gluing `://` onto it would make every\n     crumb's `adapterPath` read `://.starred`, which navigates nowhere — the\n     view's own address is the bare sentinel. */\n  const adapterPrefix = props.adapter ? `${props.adapter}://` : '';\n  const raw = adapterPrefix && props.dirname.startsWith(adapterPrefix)\n    ? props.dirname.slice(adapterPrefix.length)\n    : props.dirname;\n  const parts = raw.split('/').filter(Boolean);\n  /* wiring:e2 names — a segment inside an encrypted-names folder reads as its\n     plaintext (or the locked placeholder); everything else is untouched. */\n  const e2eLabel = (wire: string) => e2eNameView?.segmentLabel(wire) ?? null;\n\n  const out: Crumb[] = [];\n\n  // Confined: the root folder is the top crumb (its own name), and only the\n  // path BELOW it is walked — segments above the confinement are never shown.\n  if (props.rootPath) {\n    const floor = confinedRel.value;\n    const cur = raw.replace(/^\\/+|\\/+$/g, '');\n    const below = floor && (cur === floor || cur.startsWith(floor + '/'))\n      ? cur.slice(floor.length).replace(/^\\/+/, '')\n      : '';\n    out.push({ label: floorLabel.value, adapterPath: props.rootPath });\n    let acc = floor;\n    for (const part of below.split('/').filter(Boolean)) {\n      acc = acc ? `${acc}/${part}` : part;\n      /* ⚠ THE SAME resolver the unconfined branch below uses. This line used to\n         carry a private `part === '.trash' ? t('node.trash') : part` — a second\n         copy of the sentinel mapping that knew about exactly one sentinel, so a\n         confined embed printed `.starred`, `.shared`, `.recent` and\n         `.tag~invoices` raw while the panel three inches away named them\n         properly. One resolver, and a sentinel added to `lib/listing` reaches\n         both branches on the day it lands. */\n      out.push({\n        label: virtualSegmentLabel(part, t) || e2eLabel(`${adapterPrefix}${acc}`) || part,\n        adapterPath: `${adapterPrefix}${acc}`,\n      });\n    }\n    return out;\n  }\n\n  if (props.multiStorageRoot) {\n    // Global \"/\" crumb — clicking it pops back to the storage picker\n    // (FileExplorer treats the empty string as the virtual root).\n    out.push({ label: '/', adapterPath: '' });\n    if (props.adapter) {\n      // Storage segment — wire form `<adapter>://` lands at storage\n      // root regardless of where we are now.\n      out.push({ label: props.rootLabel || props.adapter, adapterPath: adapterPrefix });\n    }\n  } else if (props.adapter || props.rootLabel) {\n    // Single-storage mode: the storage name IS the root, no \"/\"\n    // above it.\n    // ⚠ …and with NEITHER a storage nor a branded label there is nothing to\n    // name: that is a virtual view in a single-storage explorer, where the\n    // crumb would otherwise be an empty, clickable box in front of \"Starred\".\n    out.push({\n      label: props.rootLabel || props.adapter,\n      adapterPath: adapterPrefix,\n    });\n  }\n\n  let acc = '';\n  for (const part of parts) {\n    acc = acc ? `${acc}/${part}` : part;\n    // gezinti:g1 — the sentinel segments the virtual views park in `dirname`\n    // (`.trash` predates them). Without a mapping the crumb reads \".starred\",\n    // which is a filename the user never typed and cannot navigate to.\n    // etiket:t1 — via the shared resolver, which also knows the tag view's\n    // `.tag~<name>` segment; the raw map only covers the fixed-label views.\n    const label = virtualSegmentLabel(part, t) || e2eLabel(`${adapterPrefix}${acc}`) || part;\n    out.push({ label, adapterPath: `${adapterPrefix}${acc}` });\n  }\n  return out;\n});\n\n// ------------------------------------------------------------------\n// Overflow collapse (cila:c / I5) — when the trail grows past the\n// threshold, show `root › … › parent › current`; the middle crumbs move\n// into a dropdown. Visible crumbs keep their full click/drag-drop/context\n// behavior; dropdown entries only navigate.\n// ------------------------------------------------------------------\n/* gorunum:v2-topbar — the home crumb.\n *\n * ⚠ It REPLACES the root crumb, it is not added beside it. In multi-storage\n * mode `crumbs[0]` is a bare \"/\" whose only job is \"back to the storage\n * list\" — exactly what a house glyph says, and better than a slash nobody\n * reads as a button. Drawing both would be two controls for one destination,\n * which is the duplicate this pass exists to remove.\n * ⚠ Only that \"/\" crumb is swallowed. A single-storage explorer's first crumb\n * is the storage's NAME and a confined one's is the folder's — information a\n * tooltip on a house cannot carry, so those keep their text. */\nconst homeCrumb = computed<Crumb | null>(() => {\n  const first = crumbs.value[0];\n  if (!first) return null;\n  return props.multiStorageRoot && first.adapterPath === '' ? first : null;\n});\n/** The crumbs drawn as text — everything the home button did not swallow. */\nconst trail = computed<Crumb[]>(() =>\n  homeCrumb.value ? crumbs.value.slice(1) : crumbs.value,\n);\n/** True while the home button is the current folder (nothing below it). */\nconst homeIsCurrent = computed(() => !!homeCrumb.value && trail.value.length === 0);\n\nconst OVERFLOW_THRESHOLD = 4;\nconst collapsed = computed(() => trail.value.length > OVERFLOW_THRESHOLD);\nconst leadCrumbs = computed<Crumb[]>(() =>\n  collapsed.value ? trail.value.slice(0, 1) : trail.value,\n);\nconst middleCrumbs = computed<Crumb[]>(() =>\n  collapsed.value ? trail.value.slice(1, -2) : [],\n);\nconst tailCrumbs = computed<Crumb[]>(() =>\n  collapsed.value ? trail.value.slice(-2) : [],\n);\n\nconst overflowOpen = ref(false);\nconst moreWrapEl = ref<HTMLElement | null>(null);\n/* gorunum:v2-topbar — the \"Subfolders\" chevron's own menu. Separate state\n   from the overflow \"…\", because the two open different lists (crumbs ABOVE\n   this folder vs folders INSIDE it) and only ever one at a time. */\nconst subOpen = ref(false);\nconst subWrapEl = ref<HTMLElement | null>(null);\n\nconst anyMenuOpen = computed(() => overflowOpen.value || subOpen.value);\n\nfunction closeMenus() {\n  overflowOpen.value = false;\n  subOpen.value = false;\n}\n\nfunction onOverflowPick(crumb: Crumb) {\n  closeMenus();\n  emit('navigate', crumb.adapterPath);\n}\n\nfunction toggleSub() {\n  overflowOpen.value = false;\n  subOpen.value = !subOpen.value;\n}\n\nfunction onDocClick(e: MouseEvent) {\n  const t = e.target;\n  if (!(t instanceof Node)) {\n    closeMenus();\n    return;\n  }\n  if (moreWrapEl.value?.contains(t) || subWrapEl.value?.contains(t)) return;\n  closeMenus();\n}\n\nfunction onDocKeydown(e: KeyboardEvent) {\n  if (e.key === 'Escape') {\n    e.stopPropagation();\n    closeMenus();\n  }\n}\n\nwatch(anyMenuOpen, (v) => {\n  if (v) {\n    document.addEventListener('click', onDocClick, true);\n    document.addEventListener('keydown', onDocKeydown, true);\n  } else {\n    document.removeEventListener('click', onDocClick, true);\n    document.removeEventListener('keydown', onDocKeydown, true);\n  }\n});\n// Navigation rebuilds the trail — a stale open menu would list crumbs of\n// the previous folder (and subfolders of the one we just left).\nwatch(crumbs, closeMenus);\nonBeforeUnmount(() => {\n  document.removeEventListener('click', onDocClick, true);\n  document.removeEventListener('keydown', onDocKeydown, true);\n});\n\nfunction onClick(crumb: Crumb) {\n  emit('navigate', crumb.adapterPath);\n}\n\n/* The home button's three handlers, null-guarded here rather than in the\n * template: `v-if=\"homeCrumb\"` does not narrow the ref inside an event\n * binding, and a `!` in markup is an assertion no reader can check. */\nfunction onHomeClick() {\n  if (homeCrumb.value) onClick(homeCrumb.value);\n}\nfunction onHomeContext(ev: MouseEvent) {\n  if (homeCrumb.value) onContext(ev, homeCrumb.value);\n}\nfunction onHomeDrop(ev: DragEvent) {\n  if (homeCrumb.value) onCrumbDrop(ev, homeCrumb.value);\n}\n\nfunction onContext(ev: MouseEvent, crumb: Crumb) {\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('crumb-context', {\n    x: ev.clientX,\n    y: ev.clientY,\n    adapterPath: crumb.adapterPath,\n    label: crumb.label,\n  });\n}\n\nfunction onCrumbDragOver(ev: DragEvent) {\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n}\n\nfunction onCrumbDrop(ev: DragEvent, crumb: Crumb) {\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('crumb-drop', crumb.adapterPath, ev);\n}\n\nconst editing = ref(false);\nconst pathDraft = ref('');\nconst pathInput = ref<HTMLInputElement | null>(null);\n\nfunction startEdit() {\n  const adapterPrefix = `${props.adapter}://`;\n  const rel = props.dirname.startsWith(adapterPrefix)\n    ? props.dirname.slice(adapterPrefix.length)\n    : props.dirname;\n  // Confined: edit relative to the root folder — `/` is the root, `/sub` below.\n  if (props.rootPath) {\n    const floor = confinedRel.value;\n    const cur = rel.replace(/^\\/+|\\/+$/g, '');\n    const below = floor && (cur === floor || cur.startsWith(floor + '/'))\n      ? cur.slice(floor.length).replace(/^\\/+/, '')\n      : '';\n    pathDraft.value = below ? `/${below}` : '/';\n    editing.value = true;\n    void nextTick(() => {\n      pathInput.value?.focus();\n      pathInput.value?.select();\n    });\n    return;\n  }\n  // Multi-storage: show `/<storage>/<rel>` so the user can edit the\n  // whole tree (`/main/foo`, `/s3-test/example`, just `/` for root).\n  if (props.multiStorageRoot) {\n    if (!props.adapter) {\n      pathDraft.value = '/';\n    } else {\n      const trimmed = rel.replace(/^\\/+|\\/+$/g, '');\n      pathDraft.value = trimmed\n        ? `/${props.adapter}/${trimmed}`\n        : `/${props.adapter}`;\n    }\n  } else {\n    pathDraft.value = rel;\n  }\n  editing.value = true;\n  void nextTick(() => {\n    pathInput.value?.focus();\n    pathInput.value?.select();\n  });\n}\n\nfunction submitPath() {\n  const raw = pathDraft.value.trim();\n  editing.value = false;\n\n  // Confined: the typed path is relative to the root folder; prepend the floor.\n  if (props.rootPath) {\n    const sub = raw.replace(/^\\/+|\\/+$/g, '');\n    const floor = confinedRel.value;\n    const rel = sub ? (floor ? `${floor}/${sub}` : sub) : floor;\n    emit('navigate', rel ? `${props.adapter}://${rel}` : `${props.adapter}://`);\n    return;\n  }\n\n  if (props.multiStorageRoot) {\n    // Strip leading/trailing slashes. First segment = storage.\n    const clean = raw.replace(/^\\/+|\\/+$/g, '');\n    if (!clean) {\n      // navigate to global root by emitting empty wire path; the\n      // FileExplorer treats it as virtual storage list.\n      emit('navigate', '');\n      return;\n    }\n    const slash = clean.indexOf('/');\n    const adapter = slash === -1 ? clean : clean.slice(0, slash);\n    const rel = slash === -1 ? '' : clean.slice(slash + 1);\n    emit('navigate', rel ? `${adapter}://${rel}` : `${adapter}://`);\n    return;\n  }\n\n  const v = raw.replace(/^\\/+|\\/+$/g, '');\n  if (!v) return;\n  emit('navigate', `${props.adapter}://${v}`);\n}\n\nfunction cancelEdit() {\n  editing.value = false;\n}\n</script>\n\n<template>\n  <nav class=\"fe-breadcrumb\" :aria-label=\"t('breadcrumb.aria')\">\n    <template v-if=\"!editing\">\n      <!-- gorunum:v2-topbar — the root crumb. It IS `crumbs[0]` (see the\n           script), drawn as a house instead of a \"/\" nobody reads as a\n           button; it is never an extra control beside the root.\n\n           ⚠⚠ It is named `breadcrumb.root`, NOT `breadcrumb.home`, and that\n           was a real collision rather than a synonym. This button goes to\n           `adapterPath: ''` — the top of the tree: the DRIVES listing where\n           several storages are visible, the storage root where one is. The\n           panel's own \"Home\" row goes somewhere else entirely (the overview\n           with Storages · Recent · Starred). Two controls, one word, two\n           destinations — and the word belonged to the other one. It mattered\n           more from 2026-09-13, when \"My files\" stopped being drawn for a\n           multi-storage deployment: this button became the only door to that\n           listing, so the one thing it must not do is point at a different\n           row in the panel.\n\n           `breadcrumb.root` rather than a new string because the product\n           ALREADY names this destination: FileExplorer labels the tab you\n           land on with exactly this key (\"Root\" / \"Kök\"). Hovering the house\n           and reading the tab now say the same word instead of two.\n\n           ⚠ Relabelled, NOT repointed. Sending it to the Home overview would\n           break two things that are measured: `crumbs[0]` is this crumb, and\n           `trail` is `crumbs.slice(1)`, so the root would lose its only crumb\n           and (post-\"My files\") its last door; and `goUp()`/Alt+↑ from a\n           storage root loads `''`, so Up and the crumb would then disagree\n           about what sits above a storage.\n           ⚠ `data-testid` stays `breadcrumb-home`: it is a selector other\n           surfaces already use, and renaming it buys nothing. -->\n      <button\n        v-if=\"homeCrumb\"\n        type=\"button\"\n        class=\"fe-breadcrumb__crumb fe-breadcrumb__home\"\n        :class=\"{ 'is-last': homeIsCurrent }\"\n        :aria-current=\"homeIsCurrent ? 'page' : undefined\"\n        :title=\"t('breadcrumb.root')\"\n        :aria-label=\"t('breadcrumb.root')\"\n        data-testid=\"breadcrumb-home\"\n        @click=\"onHomeClick\"\n        @contextmenu=\"onHomeContext\"\n        @dragover=\"onCrumbDragOver\"\n        @drop=\"onHomeDrop\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('home')\"></span>\n        <span v-if=\"!homeIsCurrent\" class=\"fe-breadcrumb__sep\" aria-hidden=\"true\">›</span>\n      </button>\n      <button\n        v-for=\"(c, i) in leadCrumbs\"\n        :key=\"c.adapterPath\"\n        class=\"fe-breadcrumb__crumb\"\n        :class=\"{ 'is-last': !collapsed && i === leadCrumbs.length - 1 }\"\n        type=\"button\"\n        :aria-current=\"!collapsed && i === leadCrumbs.length - 1 ? 'page' : undefined\"\n        @click=\"onClick(c)\"\n        @contextmenu=\"onContext($event, c)\"\n        @dragover=\"onCrumbDragOver\"\n        @drop=\"onCrumbDrop($event, c)\"\n      >\n        <span><bdi>{{ c.label }}</bdi></span>\n        <span v-if=\"collapsed || i < leadCrumbs.length - 1\" class=\"fe-breadcrumb__sep\" aria-hidden=\"true\">›</span>\n      </button>\n      <span v-if=\"middleCrumbs.length\" ref=\"moreWrapEl\" class=\"fe-breadcrumb__more-wrap\">\n        <button\n          type=\"button\"\n          class=\"fe-breadcrumb__more\"\n          aria-haspopup=\"menu\"\n          :aria-expanded=\"overflowOpen\"\n          :aria-label=\"t('breadcrumb.more')\"\n          :title=\"t('breadcrumb.more')\"\n          @click=\"overflowOpen = !overflowOpen\"\n        >…</button>\n        <span class=\"fe-breadcrumb__sep\" aria-hidden=\"true\">›</span>\n        <div v-if=\"overflowOpen\" class=\"fe-breadcrumb__menu\" role=\"menu\">\n          <button\n            v-for=\"c in middleCrumbs\"\n            :key=\"c.adapterPath\"\n            type=\"button\"\n            class=\"fe-breadcrumb__menu-item\"\n            role=\"menuitem\"\n            @click=\"onOverflowPick(c)\"\n          ><bdi>{{ c.label }}</bdi></button>\n        </div>\n      </span>\n      <button\n        v-for=\"(c, i) in tailCrumbs\"\n        :key=\"c.adapterPath\"\n        class=\"fe-breadcrumb__crumb\"\n        :class=\"{ 'is-last': i === tailCrumbs.length - 1 }\"\n        type=\"button\"\n        :aria-current=\"i === tailCrumbs.length - 1 ? 'page' : undefined\"\n        @click=\"onClick(c)\"\n        @contextmenu=\"onContext($event, c)\"\n        @dragover=\"onCrumbDragOver\"\n        @drop=\"onCrumbDrop($event, c)\"\n      >\n        <span><bdi>{{ c.label }}</bdi></span>\n        <span v-if=\"i < tailCrumbs.length - 1\" class=\"fe-breadcrumb__sep\" aria-hidden=\"true\">›</span>\n      </button>\n      <!-- gorunum:v2-topbar — \"Subfolders\": the chevron the reference shell\n           hangs on the LAST crumb, opening what is inside the folder you are\n           standing in. Drawn whenever the parent supplies the list, empty or\n           not (see the prop's note). -->\n      <span v-if=\"subfolders\" ref=\"subWrapEl\" class=\"fe-breadcrumb__sub-wrap\">\n        <button\n          type=\"button\"\n          class=\"fe-breadcrumb__sub\"\n          aria-haspopup=\"menu\"\n          :aria-expanded=\"subOpen\"\n          :title=\"t('breadcrumb.subfolders')\"\n          :aria-label=\"t('breadcrumb.subfolders')\"\n          data-testid=\"breadcrumb-subfolders\"\n          @click=\"toggleSub\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('subfolders')\"></span>\n        </button>\n        <div v-if=\"subOpen\" class=\"fe-breadcrumb__menu\" role=\"menu\">\n          <button\n            v-for=\"c in subfolders\"\n            :key=\"c.adapterPath\"\n            type=\"button\"\n            class=\"fe-breadcrumb__menu-item\"\n            role=\"menuitem\"\n            @click=\"onOverflowPick(c)\"\n          ><bdi>{{ c.label }}</bdi></button>\n          <p v-if=\"!subfolders.length\" class=\"fe-breadcrumb__menu-empty\">\n            {{ t('breadcrumb.subfolders.empty') }}\n          </p>\n        </div>\n      </span>\n      <!-- gorunum:v1 — \"type a path and go\". The glyph was the ✏ emoji, which\n           this row draws from whichever emoji font the machine has: on a\n           headless Chromium and on a Linux box without one it comes out as a\n           stray dash beside the crumbs. An inline SVG is the same mark\n           everywhere and inherits the row's colour.\n           gorunum:v2-topbar — the mark now comes from lib/actionIcons with\n           every other glyph in the row; the reference shell has no path\n           editor at all, so this is ours and it stays. -->\n      <button\n        type=\"button\"\n        class=\"fe-breadcrumb__edit\"\n        :title=\"t('breadcrumb.go_to_path')\"\n        :aria-label=\"t('breadcrumb.go_to_path')\"\n        data-testid=\"breadcrumb-edit-path\"\n        @click=\"startEdit\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('edit-path')\"></span>\n      </button>\n    </template>\n    <template v-else>\n      <input\n        ref=\"pathInput\"\n        v-model=\"pathDraft\"\n        type=\"text\"\n        class=\"fe-breadcrumb__input\"\n        :placeholder=\"t('breadcrumb.path_placeholder')\"\n        spellcheck=\"false\"\n        autocomplete=\"off\"\n        @keydown.enter.prevent=\"submitPath\"\n        @keydown.escape.prevent=\"cancelEdit\"\n        @blur=\"cancelEdit\"\n      />\n    </template>\n  </nav>\n</template>\n","<script setup lang=\"ts\">\n/**\n * FilterBar — surucu:d1, the chip row under the breadcrumb in the `drive`\n * profile.\n *\n * Four chips: Type · People · Modified · Size. Each opens a small single-choice\n * popover; a chip with a choice made carries that choice as its label, so the\n * row says what is being filtered without opening anything.\n *\n * ⚠ Type comes FIRST. The row used to open with People, which put the one\n * chip that is empty in a single-account install in front of the one every\n * listing has an answer for.\n *\n * ⚠ It was THREE for a long time, and the reason was written here: there was\n * nothing behind a People chip, because a listing row carried no owner and\n * `nodes.owner_id` was quota bookkeeping nobody serialized. That is no longer\n * true — migration 00038 made ownership a fact on the row and the listing\n * projection carries it — so the chip now filters on data the row already has,\n * like the other three. If ownership is ever taken back off the wire, this chip\n * has to go with it: a control that opens, offers names and changes nothing is\n * worse than an absent one.\n *\n * ⚠ The People options are NOT a directory listing. `Anyone`, `You` and\n * `System` are always offered; the named accounts are only the ones that\n * actually own something in the rows on screen (`peopleOptions`). Offering\n * every account on the install would put inert names in the menu and leak the\n * user list into a folder view.\n *\n * === surucu:d1-sort — the trailing edge ===============================\n * Two controls at the right of the same row: a button that NAMES the active\n * sort and flips its direction, and a chevron whose menu picks the key.\n *\n * ⚠⚠ They do not own a sort. Both reach for `lib/sortOrder`'s store for the\n * PANE they are inside, the same one the list view's own column headers reach\n * for, so the chip row and the headers are two handles on ONE piece of state\n * — sort by Size here and\n * the Size column's arrow moves, click the Name header and this button says\n * Name. A control with its own private copy of the answer is filex lesson #67\n * one level up, and it is what this row was one commit away from becoming.\n *\n * ⚠⚠ …and while a SEARCH RESULT is on screen there is no key to name. The\n * rows were ranked by the server (`order === 'relevance'`, see\n * `lib/sortOrder`), so this button prints \"Relevance\" instead of the key,\n * drops its direction arrow, and closes — with the reason in its own tooltip\n * and accessible name. A button reading \"Name ↑\" over a list that is not in\n * name order is the failure this whole row is otherwise built to avoid, and a\n * control that simply went inert would be the same lie without the wording.\n * The key itself is untouched: it is still there the moment the search is\n * left.\n *\n * ⚠ Deliberately NOT here: the reference build's \"Listing actions\" ⋮ that sits\n * beside these two. Its menu is New folder / New file / Upload files / Paste /\n * Select all / Deselect all — six commands this component cannot perform and\n * has no handle on. Drawing the menu here would mean six items that open,\n * offer a word and do nothing, which is the failure the People note above is\n * about. It needs events from the explorer; see the report.\n *\n * ⚠ Popovers are TELEPORTED to <body>, like ContextMenu, and positioned\n * `fixed`. An absolutely-positioned panel inside the explorer is clipped by\n * `.fe__body`'s own scroll container, which is how a menu ends up half visible\n * with its own scrollbar. ONE popover machine serves the chips and the sort\n * menu — same positioning, same outside-click, same Escape — because two of\n * them is two chances for a panel to be left open behind the other.\n *\n * ⚠ No `<style>` block. Package CSS lives in `styles/base.css` — a scoped block\n * compiles to `.cls[data-v-HASH]` and the hash does not match in the\n * web-component build, so the rules silently stop applying in every embed.\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { useLocale } from '../composables/useLocale';\nimport { clampAlongInline, inlineStartX } from '../lib/direction';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport type { FileNode } from '../types/FileNode';\nimport type { DriveFilters, ModifiedFilter, SizeFilter, TypeFilter } from '../lib/fileFilters';\nimport { activeFilterCount, peopleOptions } from '../lib/fileFilters';\nimport {\n  SORT_KEYS,\n  setSortLocale,\n  useSortStore,\n  type ListingOrder,\n  type SortKey,\n} from '../lib/sortOrder';\n\nconst props = defineProps<{\n  value: DriveFilters;\n  locale: LocaleCode;\n  /** Resolved theme — the teleported popover leaves the `.fe` variable scope. */\n  theme?: ThemeMode;\n  /** Rows currently shown / rows the folder holds, for the count chip. */\n  shown?: number;\n  total?: number;\n  /**\n   * The rows the People chip derives its named accounts from — the listing\n   * BEFORE filtering, so choosing a person does not empty the menu that\n   * offered them.\n   *\n   * ⚠ Optional. Without it the chip still offers Anyone / You / System, which\n   * are the three that never depend on data; an embedder who passes nothing\n   * gets a working control rather than a broken one.\n   */\n  files?: FileNode[];\n  /* === surucu:d1-actions — the \"⋮\" listing menu ======================\n   * ⚠ Every row in it is a command this component cannot run: the clipboard,\n   * the selection and the write permissions all live in the explorer. So the\n   * menu takes its two ENABLED states as props and emits the verbs, and the\n   * host decides whether a row is reachable. A menu that draws \"Paste\" alive\n   * over an empty clipboard is a menu that lies once per folder. */\n  /** There is something on the clipboard to paste here. */\n  canPaste?: boolean;\n  /** This folder can be written to (false at a read-only root, in the trash). */\n  canWrite?: boolean;\n  /**\n   * Where the listing behind this row got its order — see `lib/sortOrder`.\n   * `relevance` (a search result) closes the sort control and makes it name\n   * the order it is actually in. Omitted = an ordinary folder listing, which\n   * is what every embedder that never searches has.\n   */\n  order?: ListingOrder;\n  /* === surucu:d1-scope — the row where there is nothing to chip ==========\n   *\n   * ⚠⚠ `find` is not \"a smaller filter bar\". It is this row over a listing\n   * whose rows are not files: the multi-storage ROOT (every row is a drive)\n   * and HOME (three blocks of cards). Type / People / Modified / Size all\n   * answer from `extension`, `mime_type`, `owner_id`, `size` and\n   * `last_modified`, and a drive has none of the five — the chips would open,\n   * offer ten words and narrow nothing, which is the exact failure the People\n   * note above is about. The name box is the one dimension those rows DO\n   * have, so it is the one that stays.\n   *\n   * ⚠ And it stays REACHABLE, rather than the row being dropped: \"root\n   * folder'da filtre barı kalsın, en kötü o bardan search kalacak — orada adam\n   * isterse storage ismi aratabilir\" (owner, 2026-09-13). A box that filters\n   * nothing would be worse than no box; this one filters the rows in hand\n   * through the same `DriveFilters.name` predicate every other listing uses.\n   */\n  mode?: 'full' | 'find';\n  /**\n   * What the name box says it narrows. The default names a FOLDER, which is\n   * wrong in both `find` places — neither the drive list nor Home is one.\n   * Passed already translated: the pane knows which of the two it is, the\n   * catalogue lookup belongs with the caller that knows.\n   */\n  findLabel?: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'update:value', v: DriveFilters): void;\n  /* surucu:d1-actions — the listing's own verbs. Names match the events the\n     navigation panel already emits for the same two commands, so the host\n     wires one handler for each rather than one per menu. */\n  (e: 'new-folder'): void;\n  (e: 'upload'): void;\n  (e: 'paste'): void;\n  (e: 'select-all'): void;\n}>();\n\n// ⚠ RTL: `dir` goes on the teleported popover (under <body> it would take the\n// host page's direction) and steers where it hangs from its chip.\nconst { t, dir } = useLocale(() => props.locale);\n\n/** surucu:d1-scope — everything except the name box is drawn only in `full`. */\nconst full = computed(() => (props.mode ?? 'full') === 'full');\n/** The name box's placeholder AND its accessible name — one value, read twice,\n *  so the two cannot describe different things. */\nconst findLabel = computed(() => props.findLabel || t('filter.find'));\n\ntype Group = 'people' | 'type' | 'modified' | 'size';\n/** Everything this row can open. `sort` is not a filter group — it shares the\n *  popover machine, not the filter model. */\ntype PopId = Group | 'sort' | 'actions';\n\n/** The chips, in the order they are drawn. One array, so the template loop and\n *  `optionsFor` cannot disagree about how many there are. */\nconst GROUPS: Group[] = ['type', 'people', 'modified', 'size'];\n\nconst TYPE_OPTIONS: TypeFilter[] = [\n  'any', 'folder', 'document', 'spreadsheet', 'presentation', 'pdf',\n  'image', 'video', 'audio', 'archive', 'code',\n];\nconst MODIFIED_OPTIONS: ModifiedFilter[] = ['any', 'today', '7d', '30d', 'year'];\nconst SIZE_OPTIONS: SizeFilter[] = ['any', 'lt1', '1to10', '10to100', 'gt100'];\n\n/** Anyone / You / System, plus every other account owning a row on screen. */\nconst peopleChoices = computed(() => peopleOptions(props.files ?? []));\n\nfunction optionsFor(g: Group): string[] {\n  if (g === 'people') return peopleChoices.value.map((o) => o.value);\n  if (g === 'type') return TYPE_OPTIONS;\n  if (g === 'modified') return MODIFIED_OPTIONS;\n  return SIZE_OPTIONS;\n}\n\nfunction optionLabel(g: Group, v: string): string {\n  // A named account is labelled by its NAME, which no locale file can know.\n  // The three fixed members are ordinary keys like every other group's.\n  if (g === 'people' && v.startsWith('u:')) {\n    return peopleChoices.value.find((o) => o.value === v)?.name || v.slice(2);\n  }\n  return t(`filter.${g}.${v}`);\n}\n\n/** The chip's own label: the group name until a choice is made, then the\n *  choice — a row of three identical words tells the reader nothing. */\nfunction chipLabel(g: Group): string {\n  const v = g === 'people' ? (props.value.people ?? 'any') : props.value[g];\n  return v === 'any' ? t(`filter.${g}`) : optionLabel(g, v);\n}\n\n/** `value[g]` for a group whose field is optional. */\nfunction chosen(g: Group): string {\n  return g === 'people' ? (props.value.people ?? 'any') : props.value[g];\n}\n\nconst activeCount = computed(() => activeFilterCount(props.value));\n\n// ── surucu:d1-sort — the sort control ─────────────────────────────────\n// Reading through the STORE OF THE PANE this row is inside, so the call\n// subscribes this render to that pane's state and there is no second place\n// holding a copy that could go stale.\n//\n// ⚠⚠ Per pane, not per bundle. The split view draws this row in both halves;\n// while the key lived in a module-level singleton, choosing \"Size ↓\" on the\n// right re-ordered the listing on the left (measured 2026-09-13). With no\n// provider — one listing, a bare <FilterBar> in a test — this is the default\n// store and nothing changes.\nconst sort = useSortStore();\nconst sortKey = computed<SortKey>(() => sort.key.value);\nconst sortAscending = computed(() => sort.dir.value === 'asc');\n\n/** The rows behind this row are the server's ranked answer, so the key below\n *  is not what is on screen. One boolean, read by everything in the control. */\nconst ranked = computed(() => props.order === 'relevance');\n\n/** \"Modified\", \"Size\" … — the SAME words the list view's column headers use\n *  (`col.*`), because they name the same sort. Over a ranked listing it is\n *  \"Relevance\" instead: the button must name the order it is IN. */\nconst sortKeyLabel = computed(() => (ranked.value ? t('sort.relevance') : t(`col.${sortKey.value}`)));\n/** Read only by a screen reader, exactly as in the reference build: the arrow\n *  says the direction to everyone who can see it. Over a ranked listing the\n *  arrow is gone and this carries the REASON instead — the same sentence the\n *  tooltip shows, because \"disabled\" with no explanation is the state the\n *  owner specifically did not want. */\nconst sortDirLabel = computed(() =>\n  ranked.value ? t('sort.relevance_why') : t(sortAscending.value ? 'sort.asc' : 'sort.desc'),\n);\n\n/** The sort's own `type` order is by the word the Type column prints, so the\n *  comparator has to know which catalogue that word comes from. */\nwatch(() => props.locale, (l) => setSortLocale(l), { immediate: true });\n\n/**\n * ⚠ `setSort`, not `chooseSortKey`: a menu item NAMES a destination, so\n * picking the key that is already active must leave it where it is rather\n * than quietly reverse it. The button beside this menu is the toggle, and a\n * column header — where clicking the active one again is what everybody\n * expects — uses the other one.\n */\nfunction pickSortKey(k: SortKey): void {\n  sort.setSort(k);\n  close(true);\n}\n\n/**\n * ⚠⚠ The two sort handles refuse to act over a RANKED listing, in the handler\n * and not only through the `disabled` attribute on the button.\n *\n * `disabled` suppresses the browser's own activation, but a click dispatched\n * in script still reaches this listener, and the damage is silent: nothing on\n * screen moves (the rows are the server's), the shared key is written to\n * `filex.list-sort`, and the FOLDER the person goes back to is re-ordered\n * behind their back. Measured 2026-09-13 on the list view's twin control — a\n * scripted click on the closed Size header left the rows untouched and still\n * turned the stored sort from Name ↑ into Size ↑.\n */\nfunction flipSortDir(): void {\n  if (ranked.value) return;\n  sort.toggleSortDir();\n}\nfunction openSortMenu(): void {\n  if (ranked.value) return;\n  void toggle('sort');\n}\n\n/* === surucu:d1-actions — what the \"⋮\" offers ==========================\n * The reference build's listing menu, minus one row: it also carries \"File\",\n * and this explorer has no create-empty-file command anywhere — not in the\n * \"+ New\" menu, not in the right-click menu, not as a shortcut. Shipping the\n * word with nothing behind it is the one thing this menu was held back for.\n *\n * ⚠ Disabled rather than hidden, all of them. A menu whose height changes\n * between folders is a menu people misclick, and \"Paste\" greyed out says the\n * clipboard is empty — \"Paste\" absent says the feature does not exist.\n *\n * ⚠⚠ And there is no \"Deselect all\", which the reference build does carry.\n * MEASURED, not assumed: the instant anything is selected this whole row is\n * replaced by the selection bar (`.fe-selbar-slot.is-active`) — filter row\n * hidden, this button hidden — and that bar draws its own \"Clear selection\"\n * button. So a Deselect row here could never be reached (having a selection is\n * exactly the state that hides the menu) and would duplicate a control that IS\n * on screen at that moment. \"Select all\" is the opposite case and stays: it is\n * reachable precisely when it is useful, and it exists nowhere else but a\n * keystroke.\n */\nconst actionRows = computed(() => [\n  { key: 'new-folder', label: t('toolbar.new_folder'), disabled: props.canWrite === false },\n  { key: 'upload', label: t('toolbar.upload'), disabled: props.canWrite === false },\n  { key: 'paste', label: t('ctx.paste'), disabled: !props.canPaste || props.canWrite === false },\n  { key: 'sep', label: '', divider: true, disabled: true },\n  { key: 'select-all', label: t('shortcuts.select_all'), disabled: false },\n]);\n\nfunction runAction(key: string): void {\n  close(true);\n  if (key === 'new-folder') emit('new-folder');\n  else if (key === 'upload') emit('upload');\n  else if (key === 'paste') emit('paste');\n  else if (key === 'select-all') emit('select-all');\n}\n\n// ── the popover ──────────────────────────────────────────────────────\nconst openPop = ref<PopId | null>(null);\nconst pos = ref({ x: 0, y: 0 });\nconst panelEl = ref<HTMLElement | null>(null);\nconst anchorEls = ref<Record<string, HTMLElement | null>>({});\n\nfunction setAnchorEl(id: PopId, el: unknown) {\n  anchorEls.value[id] = (el as HTMLElement | null) ?? null;\n}\n\n// The open popover's data, precomputed. Reading `value[openPop]` straight\n// from the template would lean on template narrowing across a Teleport, and\n// `vue-tsc --noEmit` is part of this package's build.\nconst openGroup = computed<Group | null>(() =>\n  openPop.value && openPop.value !== 'sort' && openPop.value !== 'actions'\n    ? openPop.value\n    : null,\n);\nconst popOptions = computed<string[]>(() => (openGroup.value ? optionsFor(openGroup.value) : []));\nconst popTitle = computed(() =>\n  openGroup.value\n    ? t(`filter.${openGroup.value}`)\n    : openPop.value === 'actions'\n      ? t('filter.actions')\n      : t('sort.by'),\n);\nfunction popChecked(opt: string): boolean {\n  return !!openGroup.value && chosen(openGroup.value) === opt;\n}\nfunction popLabel(opt: string): string {\n  return openGroup.value ? optionLabel(openGroup.value, opt) : opt;\n}\nfunction popPick(opt: string): void {\n  if (openGroup.value) pick(openGroup.value, opt);\n}\n\nasync function toggle(id: PopId) {\n  if (openPop.value === id) {\n    close();\n    return;\n  }\n  const r = anchorEls.value[id]?.getBoundingClientRect();\n  // ⚠ RTL: hung from the chip's START edge — its right side in RTL.\n  const anchor = r ? inlineStartX(r, dir.value) : 8;\n  pos.value = { x: anchor, y: r ? r.bottom + 6 : 8 };\n  openPop.value = id;\n  await nextTick();\n  // Keep it on screen: a chip near the right edge would otherwise open a panel\n  // that runs off it, and the row is right beside the info panel.\n  const panel = panelEl.value;\n  if (panel) {\n    const box = panel.getBoundingClientRect();\n    /* ⚠ RTL: it runs toward the inline END of the chip (leftward in RTL) and is\n       pushed back from that edge — lib/direction; LTR is the arithmetic this\n       block always did. */\n    pos.value = { ...pos.value, x: clampAlongInline(anchor, box.width, window.innerWidth, dir.value) };\n    if (box.bottom > window.innerHeight - 8) {\n      const r2 = anchorEls.value[id]?.getBoundingClientRect();\n      pos.value = { ...pos.value, y: Math.max(8, (r2 ? r2.top : 0) - box.height - 6) };\n    }\n    // `data-active` rather than a tick: the sort menu draws no check mark (the\n    // button beside it already names the active key), but the keyboard still\n    // has to land on it.\n    panel.querySelector<HTMLElement>('[data-active=\"true\"]')?.focus();\n  }\n}\n\nfunction close(restoreFocus = false) {\n  const id = openPop.value;\n  openPop.value = null;\n  if (restoreFocus && id) anchorEls.value[id]?.focus();\n}\n\n/* surucu:d1-sort — ⚠ a listing can BECOME ranked while the Sort-by menu is\n * open: the header field searches on a debounce, so the rows change under a\n * popover that is already up. Leaving it there would offer four keys the\n * listing no longer obeys, and the anchor it is positioned against has just\n * gone disabled — so it would also be unreachable by keyboard. */\nwatch(\n  () => props.order,\n  (o) => {\n    if (o === 'relevance' && openPop.value === 'sort') close();\n  },\n);\n\nfunction pick(g: Group, v: string) {\n  emit('update:value', { ...props.value, [g]: v } as DriveFilters);\n  close(true);\n}\n\nfunction clearAll() {\n  localName.value = '';\n  // ⚠ Every dimension, named. This literal is hand-written rather than\n  // EMPTY_FILTERS because it must NOT reset the advanced-search fields the\n  // dialog owns — but a dimension left out here is a chip \"Clear\" cannot\n  // clear, which is how `people` would have stayed set forever.\n  //\n  // ⚠ The sort is NOT one of them. \"Clear filters\" un-hides rows; it does not\n  // re-order the ones that were never hidden, and a button that silently threw\n  // away the order you chose would be a second, invisible job.\n  emit('update:value', {\n    ...props.value,\n    type: 'any',\n    modified: 'any',\n    size: 'any',\n    name: '',\n    people: 'any',\n  });\n}\n\n/* === gorunum:v1 — \"Filter in this folder…\" ============================\n * The chips narrow the rows in hand by type/date/size; this narrows the same\n * rows by name, and it is part of the SAME model (`DriveFilters.name`) rather\n * than a second channel — one predicate, one \"Clear\", one empty state.\n *\n * ⚠ Not the header field. That one runs a server search and replaces the\n * listing with hits from below this folder; this one never leaves the folder\n * and never issues a request.\n *\n * Debounced, because every emit clears the selection in the parent (a row the\n * filter just hid would still be what Delete acts on) — doing that on each\n * keystroke would be a selection that dies while you type. */\nconst localName = ref(props.value.name ?? '');\nwatch(\n  () => props.value.name ?? '',\n  (v) => {\n    // The parent resets the filters on navigation; the box has to follow, or\n    // it keeps printing a word that no longer filters anything.\n    if (v !== localName.value.trim()) localName.value = v;\n  },\n);\nlet nameTimer: ReturnType<typeof setTimeout> | undefined;\nfunction onNameInput(ev: Event) {\n  localName.value = (ev.target as HTMLInputElement).value;\n  if (nameTimer) clearTimeout(nameTimer);\n  nameTimer = setTimeout(() => {\n    emit('update:value', { ...props.value, name: localName.value.trim() });\n  }, 140);\n}\nfunction clearName() {\n  if (nameTimer) clearTimeout(nameTimer);\n  localName.value = '';\n  emit('update:value', { ...props.value, name: '' });\n}\nonBeforeUnmount(() => {\n  if (nameTimer) clearTimeout(nameTimer);\n});\n\nfunction onDocPointer(ev: PointerEvent) {\n  if (!openPop.value) return;\n  const el = ev.target as Node;\n  if (panelEl.value?.contains(el)) return;\n  if (Object.values(anchorEls.value).some((c) => c?.contains(el))) return;\n  close();\n}\n\nfunction onKey(ev: KeyboardEvent) {\n  if (ev.key === 'Escape' && openPop.value) {\n    ev.stopPropagation();\n    close(true);\n  }\n}\n\nonMounted(() => {\n  document.addEventListener('pointerdown', onDocPointer, true);\n  document.addEventListener('keydown', onKey, true);\n});\nonBeforeUnmount(() => {\n  document.removeEventListener('pointerdown', onDocPointer, true);\n  document.removeEventListener('keydown', onKey, true);\n});\n</script>\n\n<template>\n  <div class=\"fe-filterbar\" :data-mode=\"full ? 'full' : 'find'\" data-testid=\"filterbar\">\n    <!-- `display: contents` — the chips stay flex items of the row while the\n         group role covers exactly the four that ARE filters. The sort control\n         at the far end is not one of them and must not be announced as one. -->\n    <div v-if=\"full\" class=\"fe-filterbar__chips\" role=\"group\" :aria-label=\"t('filter.aria')\">\n      <button\n        v-for=\"g in GROUPS\"\n        :key=\"g\"\n        :ref=\"(el) => setAnchorEl(g, el)\"\n        type=\"button\"\n        class=\"fe-filterbar__chip\"\n        :class=\"{ 'is-set': chosen(g) !== 'any', 'is-open': openPop === g }\"\n        :aria-expanded=\"openPop === g\"\n        aria-haspopup=\"listbox\"\n        :data-testid=\"`filter-${g}`\"\n        @click=\"toggle(g)\"\n      >\n        <span class=\"fe-filterbar__label\">{{ chipLabel(g) }}</span>\n        <svg\n          class=\"fe-ficon fe-filterbar__caret\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n          focusable=\"false\"\n        >\n          <path d=\"M7 10l5 5 5-5\" />\n        </svg>\n      </button>\n    </div>\n\n    <!-- gorunum:v1 — the name box. Same height as the chips beside it; it is\n         one more way to narrow THIS folder, not a second search. -->\n    <div class=\"fe-filterbar__find\">\n      <svg\n        class=\"fe-ficon fe-filterbar__find-glass\"\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        stroke-width=\"1.9\"\n        stroke-linecap=\"round\"\n        aria-hidden=\"true\"\n        focusable=\"false\"\n      >\n        <circle cx=\"11\" cy=\"11\" r=\"6.5\" />\n        <path d=\"M16 16l4.5 4.5\" />\n      </svg>\n      <input\n        type=\"search\"\n        class=\"fe-filterbar__find-input\"\n        :placeholder=\"findLabel\"\n        :aria-label=\"findLabel\"\n        :value=\"localName\"\n        data-testid=\"filter-find\"\n        @input=\"onNameInput\"\n        @keydown.esc.stop.prevent=\"clearName\"\n      />\n    </div>\n\n    <button\n      v-if=\"full && activeCount > 0\"\n      type=\"button\"\n      class=\"fe-filterbar__clear\"\n      data-testid=\"filter-clear\"\n      @click=\"clearAll\"\n    >\n      {{ t('filter.clear') }}\n    </button>\n\n    <span\n      v-if=\"full && activeCount > 0 && typeof shown === 'number' && typeof total === 'number'\"\n      class=\"fe-filterbar__count\"\n      role=\"status\"\n      data-testid=\"filter-count\"\n      >{{ t('filter.count', { shown: String(shown), total: String(total) }) }}</span\n    >\n\n    <!-- surucu:d1-sort — pushed to the trailing edge of the row.\n         ⚠ `full` only: a drive list and Home's three card blocks are not a\n         sorted listing this row owns, so a button naming a sort key would be\n         naming one nothing on screen obeys — the same lie the ranked-search\n         case above is built to avoid. -->\n    <div v-if=\"full\" class=\"fe-filterbar__sort\">\n      <button\n        :ref=\"(el) => setAnchorEl('sort', el)\"\n        type=\"button\"\n        class=\"fe-filterbar__sortdir\"\n        :class=\"{ 'is-ranked': ranked }\"\n        :disabled=\"ranked\"\n        :title=\"ranked ? sortDirLabel : undefined\"\n        data-testid=\"sort-dir\"\n        @click=\"flipSortDir()\"\n      >\n        <span>{{ sortKeyLabel }}</span>\n        <!-- The accessible name becomes \"Modified, Descending\". The arrow\n             carries the same fact for everyone who can see it, so it is not\n             repeated as a title. Ranked: \"Relevance, <why it is closed>\" —\n             the reason reaches a screen reader through the same channel it\n             reaches a mouse, rather than living only in a tooltip. -->\n        <span class=\"fe-sr-only\">, {{ sortDirLabel }}</span>\n        <svg\n          v-if=\"!ranked\"\n          class=\"fe-ficon fe-filterbar__sortarrow\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n          focusable=\"false\"\n        >\n          <template v-if=\"sortAscending\">\n            <path d=\"M12 19V5\" />\n            <path d=\"M5 12l7-7 7 7\" />\n          </template>\n          <template v-else>\n            <path d=\"M12 5v14\" />\n            <path d=\"M19 12l-7 7-7-7\" />\n          </template>\n        </svg>\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-filterbar__sortpick\"\n        :aria-label=\"ranked ? sortDirLabel : t('sort.by')\"\n        :title=\"ranked ? sortDirLabel : t('sort.by')\"\n        :disabled=\"ranked\"\n        aria-haspopup=\"menu\"\n        :aria-expanded=\"openPop === 'sort'\"\n        data-testid=\"sort-menu\"\n        @click=\"openSortMenu()\"\n      >\n        <svg\n          class=\"fe-ficon fe-filterbar__caret\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n          focusable=\"false\"\n        >\n          <path d=\"M7 10l5 5 5-5\" />\n        </svg>\n      </button>\n    </div>\n\n    <!-- surucu:d1-actions — the listing's own menu, at the very end of the row.\n         ⚠ VERTICAL dots, and the header's overflow is HORIZONTAL dots, which is\n         the whole distinction: in this product ⋮ means \"act on this thing\" (it\n         is the glyph on every file row) and ⋯ means \"settings for the app\". Two\n         menus one row apart would otherwise read as two doors to one place. -->\n    <button\n      v-if=\"full\"\n      :ref=\"(el) => setAnchorEl('actions', el)\"\n      type=\"button\"\n      class=\"fe-filterbar__actions\"\n      :aria-label=\"t('filter.actions')\"\n      :title=\"t('filter.actions')\"\n      aria-haspopup=\"menu\"\n      :aria-expanded=\"openPop === 'actions'\"\n      data-testid=\"listing-actions\"\n      @click=\"toggle('actions')\"\n    >\n      <svg\n        class=\"fe-ficon\"\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        stroke-width=\"2\"\n        stroke-linecap=\"round\"\n        aria-hidden=\"true\"\n        focusable=\"false\"\n      >\n        <circle cx=\"12\" cy=\"5.5\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" />\n        <circle cx=\"12\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" />\n        <circle cx=\"12\" cy=\"18.5\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" />\n      </svg>\n    </button>\n\n    <Teleport to=\"body\">\n      <div\n        v-if=\"openPop\"\n        ref=\"panelEl\"\n        class=\"fe-filterpop\"\n        :dir=\"dir\"\n        :class=\"{\n          'fe--theme-light': theme === 'light',\n          'fe--theme-dark': theme === 'dark',\n          'fe-filterpop--sort': openPop === 'sort',\n          'fe-filterpop--actions': openPop === 'actions',\n        }\"\n        :role=\"openPop === 'sort' || openPop === 'actions' ? 'menu' : 'listbox'\"\n        :aria-label=\"popTitle\"\n        :style=\"{ left: pos.x + 'px', top: pos.y + 'px' }\"\n      >\n        <template v-if=\"openPop === 'actions'\">\n          <template v-for=\"a in actionRows\" :key=\"a.key\">\n            <hr v-if=\"a.divider\" class=\"fe-filterpop__rule\" aria-hidden=\"true\" />\n            <button\n              v-else\n              type=\"button\"\n              class=\"fe-filterpop__item\"\n              role=\"menuitem\"\n              :disabled=\"a.disabled\"\n              :aria-disabled=\"a.disabled\"\n              :data-active=\"'false'\"\n              :data-testid=\"`listing-action-${a.key}`\"\n              @click=\"runAction(a.key)\"\n            >\n              <span>{{ a.label }}</span>\n            </button>\n          </template>\n        </template>\n        <template v-else-if=\"openPop === 'sort'\">\n          <button\n            v-for=\"k in SORT_KEYS\"\n            :key=\"k\"\n            type=\"button\"\n            class=\"fe-filterpop__item\"\n            role=\"menuitem\"\n            :data-active=\"sortKey === k ? 'true' : 'false'\"\n            :data-testid=\"`sort-opt-${k}`\"\n            @click=\"pickSortKey(k)\"\n          >\n            <span>{{ t(`col.${k}`) }}</span>\n          </button>\n        </template>\n        <template v-else>\n          <button\n            v-for=\"opt in popOptions\"\n            :key=\"opt\"\n            type=\"button\"\n            class=\"fe-filterpop__item\"\n            role=\"option\"\n            :aria-selected=\"popChecked(opt)\"\n            :data-checked=\"popChecked(opt) ? 'true' : 'false'\"\n            :data-active=\"popChecked(opt) ? 'true' : 'false'\"\n            :data-testid=\"`filter-opt-${opt}`\"\n            @click=\"popPick(opt)\"\n          >\n            <span class=\"fe-filterpop__tick\" aria-hidden=\"true\">{{ popChecked(opt) ? '✓' : '' }}</span>\n            <span>{{ popLabel(opt) }}</span>\n          </button>\n        </template>\n      </div>\n    </Teleport>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * ViewSwitcher — the list / grid / gallery toggle.\n *\n * Lifted out of Toolbar.vue unchanged (same classes, same glyphs, same\n * `role=\"tablist\"` semantics — the glyphs moved to lib/actionIcons with the\n * rest of the emoji, see `gorunum:v1-icons`) because the `drive` profile puts it on the\n * breadcrumb row instead of in the header, and two copies of a switcher is\n * how the two rows end up offering different modes. One component, mounted\n * in whichever row the profile asks for.\n *\n * `modes` absent = all three, so every embedder that predates `uiProfile`\n * keeps the switcher it had.\n *\n * ⚠ No `<style>` block — package CSS lives in `styles/base.css` (a scoped\n * block's `data-v` hash does not match in the web-component build).\n */\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { ViewMode } from '../types/FileNode';\n\nconst props = defineProps<{\n  viewMode: ViewMode;\n  locale: LocaleCode;\n  modes?: ViewMode[];\n}>();\n\nconst emit = defineEmits<{ (e: 'update:viewMode', v: ViewMode): void }>();\n\nconst { t } = useLocale(() => props.locale);\n\nfunction offers(v: ViewMode): boolean {\n  return !props.modes || props.modes.includes(v);\n}\n</script>\n\n<template>\n  <div class=\"fe-toolbar__view\" role=\"tablist\" :aria-label=\"t('toolbar.view_label')\">\n    <button\n      v-if=\"offers('list')\"\n      type=\"button\"\n      class=\"fe-btn fe-btn--icon-only\"\n      :class=\"{ 'is-active': viewMode === 'list' }\"\n      role=\"tab\"\n      :aria-selected=\"viewMode === 'list'\"\n      :title=\"t('toolbar.view.list')\"\n      :aria-label=\"t('toolbar.view.list')\"\n      data-testid=\"view-list\"\n      @click=\"emit('update:viewMode', 'list')\"\n    >\n      <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n      <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('view-list')\"></span>\n    </button>\n    <button\n      v-if=\"offers('grid')\"\n      type=\"button\"\n      class=\"fe-btn fe-btn--icon-only\"\n      :class=\"{ 'is-active': viewMode === 'grid' }\"\n      role=\"tab\"\n      :aria-selected=\"viewMode === 'grid'\"\n      :title=\"t('toolbar.view.grid')\"\n      :aria-label=\"t('toolbar.view.grid')\"\n      data-testid=\"view-grid\"\n      @click=\"emit('update:viewMode', 'grid')\"\n    >\n      <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n      <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('view-grid')\"></span>\n    </button>\n    <button\n      v-if=\"offers('gallery')\"\n      type=\"button\"\n      class=\"fe-btn fe-btn--icon-only\"\n      :class=\"{ 'is-active': viewMode === 'gallery' }\"\n      role=\"tab\"\n      :aria-selected=\"viewMode === 'gallery'\"\n      :title=\"t('toolbar.view.gallery')\"\n      :aria-label=\"t('toolbar.view.gallery')\"\n      data-testid=\"view-gallery\"\n      @click=\"emit('update:viewMode', 'gallery')\"\n    >\n      <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n      <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('view-gallery')\"></span>\n    </button>\n  </div>\n</template>\n","/**\n * The Trash's \"time left\" for one item, in words: the server's own count of\n * whole days before it is purged (`ttl_days`, trash/service.go — retention\n * minus the days since deletion, never below zero).\n *\n *   30 → \"30 days\"   1 → \"1 day\"   0 → \"Due for deletion\"   none → \"—\"\n *\n * ⚠ ONE sentence for one concept, shared by the explorer's Trash view\n * (ListView) and the admin panel's Trash page. They used to carry two key\n * families for it — `trash.days_left` in the explorer's table and\n * `trash.days_remaining` in the admin panel's — and the admin page printed\n * \"0 days\" for an item the explorer called due for deletion. The keys live in\n * the explorer's table (`trash.days_remaining`, `_one`, `_due`); a caller\n * hands its own `t` so a surface keeps its own reactivity.\n */\nexport function trashTimeLeft(\n  ttl: number | null | undefined,\n  t: (key: string, vars?: Record<string, string | number>) => string,\n): string {\n  if (typeof ttl !== 'number' || !Number.isFinite(ttl)) return '-';\n  if (ttl <= 0) return t('trash.days_remaining_due');\n  return t('trash.days_remaining', { n: ttl });\n}\n","<script setup lang=\"ts\">\n/**\n * ListView — the explorer's listing: files, in the product's ONE table.\n *\n * ⚠⚠ Since 2026-09-21 the table itself is `DataTable`, extracted from this\n * file so that every table in the product — admin pages, connection panels,\n * an app's `list` node — runs the same code this listing does. The owner:\n * \"Artık explore tablomuz bizim her yerde kullanacağımız tablo yapısıdır.\"\n * This file is the layer ON TOP of it that knows about files: the columns\n * (Name · Type · Location · Owner · Modified · Size · ★), what each prints for\n * a file, the row's gestures (open, select, drag, drop, touch), the date\n * headings, and where the arrangement is remembered — per folder.\n *\n * Selection + context menu + double-click open are caller-owned — we just\n * emit the events and let FileExplorer.vue handle them uniformly across List\n * and Grid.\n */\nimport { computed, ref, watch } from 'vue';\nimport { hasInternalDrag } from '../lib/dragOut';\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { inlineStartX } from '../lib/direction';\nimport { lockOf, lockWords } from '../lib/appLock';\nimport { linkWordsFor } from '../lib/symlink'; /* issue #34 — a link that will not open */\nimport { unavailableWordsFor } from '../lib/unavailable'; /* issue #104 - an entry the storage could not answer for */\nimport { thumbNoteWords } from '../lib/thumbNote'; /* 0.50 - why a file has no thumbnail */\nimport { checkMod, clickMod, useRowTouch, type ClickMod } from '../composables/useRowTouch';\nimport {\n  arrivedFromOutside,\n  deletedByViewer,\n  deleterIdOf,\n  deleterNameOf,\n  ownedByViewer,\n  ownerIdOf,\n  ownerNameOf,\n} from '../lib/fileFilters';\nimport {\n  encryptedFolderTile,\n  fileIconTile,\n  isEncryptedFolder,\n  isStorageRow,\n  typeLabelFor,\n} from '../lib/fileIcons'; /* gorunum:v1-preview · ikon:emoji */\nimport {\n  SORT_KEYS,\n  setSortLocale,\n  useSortStore,\n  type ListingOrder,\n  type SortKey,\n} from '../lib/sortOrder'; /* surucu:d1-sort */\nimport { matchedInContent, snippetSegments } from '../lib/snippet'; /* bul:s3 */\nimport { drawsAsPage, previewKindFor, thumbTypeBadge } from '../lib/filePreview'; /* tablo:t1 */\nimport { applyDragGhost } from '../lib/dragGhost'; /* wiring:c4 */\nimport { displayParentDirOf } from '../lib/listing'; /* Location column — one split rule for every view */\nimport { trashTimeLeft } from '../lib/trashTimeLeft'; /* one \"time left\" sentence, shared with the admin Trash page */\nimport {\n  groupByDate,\n  groupingActive,\n  type DateRun,\n} from '../lib/dateGroups'; /* zaman:z1 · gruplama */\nimport {\n  EXPLORER_METRICS,\n  applyToAllFolders,\n  folderColumnStore,\n  folderIsRemembered,\n  forgetFolder,\n  rememberedCount,\n  type ColumnId,\n} from '../lib/viewPrefs'; /* tablo:t1 — per-folder columns */\nimport DataTable, { type DataColumn } from './DataTable.vue';\nimport StarButton from './StarButton.vue';\nimport ThumbTile from './ThumbTile.vue';\nimport FolderMosaic from './FolderMosaic.vue';\n\nconst props = defineProps<{\n  files: FileNode[];\n  selected: Set<string>;\n  /** Paths that were cut → dim them so the user sees the pending move. */\n  clipped?: Set<string>;\n  /**\n   * Show each row's parent directory under the basename. Caller flips\n   * this on while a search filter is active so the user can tell\n   * `invoice.pdf` (in 2024/) apart from `invoice.pdf` (in 2025/) when\n   * both match the same query.\n   */\n  showParentPath?: boolean;\n  locale: LocaleCode;\n  loading?: boolean;\n  /** Set of node IDs flagged starred by the user — render an inline\n   *  filled star indicator and let the user toggle it from the row. */\n  starredIds?: Set<number>;\n  /**\n   * Offer the star affordance at all. Follows the Starred view: when the panel\n   * leaves that view out — a shared app token has no single person behind it,\n   * so \"your starred files\" is one list shown to strangers — offering to star\n   * something is offering to write into that same shared list. Owner's call,\n   * 2026-09-05, verbatim (translated from Turkish): \"if the starred place is\n   * not visible, then star/unstar should not be visible either\".\n   */\n  starEnabled?: boolean;\n  /** Backend base URL + auth header builder forwarded to StarButton\n   *  so it can POST /api/files/manager/star on click. Optional —\n   *  embedders without auth wire-up pass nothing and the star column\n   *  hides itself. */\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  /** Desktop selective sync: availability badge per row (kept on this\n   *  computer / syncing right now / online only). Absent on the web —\n   *  no badge renders at all. */\n  keepBadgeFor?: (n: FileNode) => 'kept' | 'syncing' | 'cloud' | 'partial' | null;\n  /**\n   * surucu:d1-sort — where these rows got their order (`lib/sortOrder`).\n   *\n   * `relevance` means the server ranked them: this view then draws them in\n   * the order they arrived, groups nothing by date and closes its column\n   * sorts. Omitted = an ordinary folder listing, sorted by the active key —\n   * which is what every caller that does not search passes, including the\n   * split view's secondary pane.\n   */\n  order?: ListingOrder;\n  /**\n   * tablo:t1 — the key the folder on screen is remembered under\n   * (`lib/viewPrefs.folderKey`), or '' when this listing has no folder behind\n   * it or the host turned the memory off. The column menu reads it for its\n   * two per-folder rows and nothing else does; the memory itself is written by\n   * the caller, which is the only thing that knows when a navigation ended.\n   */\n  folderKey?: string;\n  /**\n   * tablo:t1 — the resolved theme, forwarded to the column menu.\n   *\n   * ⚠ Needed because that menu is teleported to <body>, where the `.fe`\n   * ancestor that scopes the design tokens is gone — the same reason\n   * `ContextMenu` takes one, and the class it tags itself with is the same one\n   * `variables.css` already re-applies dark values under.\n   */\n  theme?: ThemeMode;\n  /**\n   * tablo:t1 — the authenticated thumbnail resolver, the same one the grid and\n   * the gallery are handed (`useThumbs.src`).\n   *\n   * ⚠ Optional, and the list draws its type tile when it is absent: an embed\n   * with no auth wire-up cannot fetch a thumb at all, and a broken <img> in\n   * every row would be worse than the glyph it replaced.\n   */\n  thumbSrc?: (n: FileNode) => string | null;\n  /**\n   * These rows are the TRASH.\n   *\n   * ⚠ A deleted item's facts are not a file's facts (QA, 2026-09-21): its\n   * date column read \"—\" (a trashed row has no modification date to show),\n   * it said nothing about how long it had left or where it had been, and its\n   * Owner read \"System\" for every row because the trash listing carries no\n   * owner. So in the Trash the date is WHEN it was deleted, Location is where\n   * it was deleted FROM, a column says how long until it is gone for good, and\n   * Owner and the star are not drawn — the same facts the admin's Trash page\n   * shows, in the explorer's own table.\n   */\n  trash?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'click-row', node: FileNode, mod: ClickMod): void;\n  (e: 'dbl-row', node: FileNode): void;\n  (e: 'context-row', node: FileNode, ev: MouseEvent): void;\n  (e: 'item-drag-start', node: FileNode, ev: DragEvent): void;\n  (e: 'item-drop-into', target: FileNode, ev: DragEvent): void;\n  (e: 'star-change', node: FileNode, value: boolean): void;\n  /**\n   * gorunum:v1 — the order this view actually renders.\n   *\n   * A shift-range is arithmetic over a list, and until now the parent did that\n   * arithmetic over the BACKEND's order while the user was looking at a sorted\n   * one. Sorting by size and shift-clicking two adjacent rows selected\n   * whatever happened to lie between them in the server's answer. Hoisting\n   * folders made it reachable without sorting anything, which is how it was\n   * found. The view knows what it drew; it says so.\n   */\n  (e: 'display-order', nodes: FileNode[]): void;\n  /** The pointer came to rest on a folder row, or left it (useFolderPeek:\n   *  the pane shows what is inside). */\n  (e: 'peek', node: FileNode, el: Element, pointerType: string): void;\n  (e: 'peek-end'): void;\n}>();\n\nconst {\n  t,\n  formatNodeSize,\n  nodeSizeHint,\n  formatDate,\n  formatDateFull,\n  formatMonthYear,\n  zonedYearMonth,\n  toDate,\n  nodeDisplayName,\n  dir,\n} = useLocale(() => props.locale);\n\n\n/* App plugins — an app's hold on a row (docs/APP-PLUGINS-API.md → \"File\n   locks\"). The listing already caps `perm` at viewer, so the write verbs are\n   gone without this; the badge is what stops that reading as a bug. ⚠ One\n   source of words for every view and the details panel (lib/appLock). */\nfunction lockTitleOf(n: FileNode): string {\n  return lockWords(lockOf(n), { t, formatDate, locale: props.locale });\n}\n\n/* issue #34 — a symlink the server will not follow. Same shape as the lock\n   badge above and for the same reason: the words live in ONE module\n   (lib/symlink), so the row, the details panel and the toast that explains a\n   refused open cannot drift apart. `null` for every ordinary row — a link\n   whose target is inside the root was already followed and arrives as that\n   target, so it is not one of these. */\nfunction linkOf(n: FileNode) {\n  return linkWordsFor(n, { t });\n}\n\n/* issue #104 - an entry the storage could not answer for: \"!\" with the\n   sentence and the storage's own answer, from the one module (lib/unavailable)\n   the details panel and the refused-open toast read too. */\nfunction unavailableOf(n: FileNode) {\n  return unavailableWordsFor(n, { t });\n}\n/** Why the file has no thumbnail, when the reason is its own (lib/thumbNote,\n *  the same rule in the list, the grid and the gallery). */\nfunction thumbNoteOf(n: FileNode) {\n  return thumbNoteWords(n, { t });\n}\n\nfunction isSelected(n: FileNode): boolean {\n  return props.selected.has(n.path);\n}\n\nfunction onRowClick(n: FileNode, ev: MouseEvent) {\n  emit('click-row', n, clickMod(ev, touch.isTap(ev)));\n}\n\nfunction onRowDbl(n: FileNode) {\n  emit('dbl-row', n);\n}\n\nfunction onRowCtx(n: FileNode, ev: MouseEvent) {\n  // Stop bubbling so the root `@contextmenu` handler doesn't fire and\n  // clear the selection we just set.\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('context-row', n, ev);\n}\n\n/**\n * gorunum:v1 — the row's ⋮ button opens THE SAME menu the right-click opens.\n *\n * It emits `context-row` with the same node, i.e. it walks the caller's\n * existing context-menu path (`onContextTarget` → `selectionActionList`) with\n * a synthetic event carrying the button's own corner as the anchor. There is\n * deliberately no second action list here: a menu assembled beside the real\n * one drifts from it the first time an action is added, and the row's \"⋮\" and\n * its right-click would then offer different things on the same file\n * (filex lesson #67).\n */\nfunction onRowMenu(n: FileNode, ev: MouseEvent) {\n  const el = ev.currentTarget as HTMLElement | null;\n  const box = el?.getBoundingClientRect();\n  emit('context-row', n, {\n    // ⚠ RTL: the button's START corner — its right one in RTL — so the menu\n    // hangs from the control and opens the way the line reads.\n    clientX: box ? inlineStartX(box, dir.value) : ev.clientX,\n    clientY: box ? box.bottom : ev.clientY,\n    preventDefault: () => {},\n    stopPropagation: () => {},\n  } as unknown as MouseEvent);\n}\n\n/**\n * issue #26 — the checkbox is the one click that selects (a click anywhere\n * else on the row opens it). It goes out as the same `click-row` emit every\n * other gesture uses, marked `check`, so FilePane routes it to the one\n * `useSelection.click` — one anchor, one set, the one the context menu acts\n * on. See composables/useRowTouch `checkMod`.\n */\nfunction onCheckClick(n: FileNode, ev: MouseEvent) {\n  emit('click-row', n, checkMod(ev));\n}\n\nfunction onItemDragStart(n: FileNode, ev: DragEvent) {\n  /* wiring:c4 — custom ghost (name + multi-select count badge). Visual\n   * only; the payload/selection logic stays in FileExplorer. */\n  applyDragGhost(\n    ev,\n    nodeDisplayName(n),\n    props.selected.has(n.path) ? props.selected.size : 1,\n  );\n  emit('item-drag-start', n, ev);\n}\n\n/* wiring:c4 — droptarget highlight: the folder row currently hovered by an\n * internal drag gets `.is-droptarget`. Purely visual — the accept/deny\n * decision below is untouched (files never preventDefault, so the browser\n * shows the native no-drop cursor on invalid targets). */\nconst dropTargetPath = ref<string | null>(null);\n\nfunction onItemDragOver(n: FileNode, ev: DragEvent) {\n  if (n.type !== 'dir') return;\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n  dropTargetPath.value = n.path; /* wiring:c4 */\n}\n\n/* wiring:c4 */\nfunction onItemDragLeave(n: FileNode) {\n  if (dropTargetPath.value === n.path) dropTargetPath.value = null;\n}\n\nfunction onItemDrop(n: FileNode, ev: DragEvent) {\n  dropTargetPath.value = null; /* wiring:c4 */\n  if (n.type !== 'dir') return;\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('item-drop-into', n, ev);\n}\n\n/* Long press → the row's menu; a tap is reported as a tap (issue #26). */\nconst touch = useRowTouch<FileNode>(\n  (n, at) =>\n    emit('context-row', n, { ...at, preventDefault: () => {}, stopPropagation: () => {} } as unknown as MouseEvent),\n  {\n    // A finger lifted on the item, off its controls, opens at touchend — see useRowTouch.\n    onTap: (n) => emit('click-row', n, { ctrl: false, shift: false, touch: true }),\n  },\n);\n\nfunction keepGlyph(b: 'kept' | 'syncing' | 'cloud' | 'partial'): string {\n  if (b === 'kept') return '\\u2713';\n  if (b === 'syncing') return '\\u27f3';\n  if (b === 'partial') return '\\u25d0';\n  return '\\u2601';\n}\n\nfunction isPinnedSpecial(n: FileNode): boolean {\n  return n.basename === '.trash' || isStorageRow(n);\n}\n\nfunction displayDate(ms: number | undefined): string {\n  return formatDate(ms, { time: true }) || '-';\n}\n\n/**\n * zaman:z1 — the hover text behind the date cell: the whole instant, named\n * with the zone it is being read in. The cell itself has room for\n * \"Sep 12, 2026, 3:14 AM\" and no room to say whose 3:14 that is.\n */\nfunction fullDate(ms: number | undefined): string {\n  return formatDateFull(ms);\n}\n\n/**\n * gorunum:v1-preview — the Type column names the KIND: `TypeScript`,\n * `Spreadsheet`, `PDF document`, `Folder`.\n *\n * ⚠ This reverses the note that stood here, which argued the raw extension in\n * caps was \"the only kind fact a listing actually carries\" and that a name\n * table would only repeat what the coloured tile says. Both halves were wrong.\n * `TS` is not a fact about the kind, it is the suffix someone typed; and the\n * tile says *family* (one glyph covers .ts, .go, .css and .sql), which is\n * exactly the distinction a column headed \"Type\" is there to make. The owner\n * asked for the words, and the words are strictly more informative.\n *\n * The table itself is in `lib/fileIcons` beside the extension → family map it\n * is built on, so this column, the info panel and anything else that names a\n * kind read one answer (filex lesson #67). Everything unmapped still falls\n * back to the uppercased extension — no empty cells.\n *\n * The pinned virtual rows (Trash, a storage drive) keep their em dash: Trash\n * is a `type: 'dir'` sentinel, and calling it a folder in this column is the\n * sort of small lie that sends someone looking for it on disk.\n */\nfunction typeLabel(n: FileNode): string {\n  if (isPinnedSpecial(n)) return '-';\n  return typeLabelFor(n, t);\n}\n\n/**\n * tablo:t1 — THE ROW'S PICTURE, where there is a real one to show.\n *\n * The grid and the gallery have drawn true thumbnails for a while; the list\n * drew a type glyph for every row, including a 38 KB photograph. The data was\n * always there and the endpoint always worked — the list simply never asked.\n *\n * ⚠⚠ It asks under exactly the grid's condition, not a second one of its own.\n * `previewKindFor` is non-null for anything we can read as text, and for those\n * the backend's \"thumbnail\" is a generated rectangle with the extension\n * stencilled on it — the same three letters the Type column prints in words\n * two inches to the right. Skipping the call for them is what keeps this\n * costing zero extra requests rather than one per row; copying the rule rather\n * than restating it is what stops the list and the grid disagreeing about\n * which files have pictures (filex lesson #67).\n */\nfunction thumbOf(n: FileNode): string | null {\n  if (n.type === 'dir') return null;\n  if (previewKindFor(n)) return null;\n  return props.thumbSrc ? props.thumbSrc(n) : (n.thumb_url ?? null);\n}\n\n/** Some folder here has files to show: every folder row then draws the\n *  small folder (FolderMosaic). Folder previews off: none does. */\nconst folderPreviews = computed(() => props.files.some((n) => n.type === 'dir' && (n.preview?.length ?? 0) > 0));\n\n/** A folder's newest file (FolderMosaic): its thumbnail whatever its kind. A\n *  text file's row draws its first lines itself (thumbOf skips it), but on a\n *  folder's print the server's drawing of those lines is the picture. */\nfunction printSrc(n: FileNode): string | null {\n  return props.thumbSrc ? props.thumbSrc(n) : (n.thumb_url ?? null);\n}\n\n/** Whether the Type column is on screen. While it is, it already says \"Folder\"\n *  in its own cell, and the word beside the name printed it twice per row. */\nconst typeColumnShown = computed(() => visibleCols.value.includes('type'));\n\n/** The muted \"Folder\" said beside a directory's name — not on the sentinels,\n *  and only while no Type column says it (see typeColumnShown). */\nfunction isPlainDir(n: FileNode): boolean {\n  return n.type === 'dir' && !isPinnedSpecial(n);\n}\n\n/**\n * tablo:t1 — WHERE THE ROW LIVES, for the Location column.\n *\n * ⚠⚠ This used to be a second line printed UNDER the file's name, and that is\n * the defect the owner reported, verbatim: \"name yazılarının altında uzun tire\n * görüyorum aynı modified'da olduğu gibi… her değer kendi sütununda gözükmesi\n * gerekmekte\" — a long dash under the name text, and every value belongs in\n * its own column. Measured on Recent, where every row sits at its storage's\n * root: the parent folder was '' for all of them, the template printed the\n * `|| '—'` fallback, and eleven em dashes hung under eleven filenames. A value\n * with no column of its own has nowhere to be absent from, so it had to invent\n * a placeholder; give it a column and \"no sub-folder\" is simply an empty cell.\n *\n * The storage leads, so this reads the way the reference build's own Location\n * column does (`demo`, `demo/Design`) and a row at the root of a drive still\n * says which drive.\n *\n * ⚠ The folder comes from `parentDirOf` (lib/listing), which splits on the\n * first `://`. This file had its own copy that stripped a URL-scheme pattern\n * instead, and a storage NAME is not a scheme: for `My files` nothing was\n * stripped and this printed `My files/My files://Photos` (2026-09-14).\n */\nfunction locationLabel(n: FileNode): string {\n  // #71 — a discarded draft came from Drafts, not from a folder: the server\n  // sends only its name as the path, and Restore puts it back in Drafts.\n  if (((n as Record<string, unknown>).extra_metadata as { draft?: boolean } | undefined)?.draft) {\n    return t('node.drafts');\n  }\n  const dir = displayParentDirOf(n);\n  const store = String((n as Record<string, unknown>).storage ?? '').trim();\n  return [store, dir].filter(Boolean).join('/');\n}\n\n/**\n * The Trash's \"time left\": the server's own count of whole days before the\n * item is purged (`ttl_days`, trash/service.go — retention minus the days\n * since deletion, never below zero). No count, no claim.\n */\nfunction remainingLabel(n: FileNode): string {\n  const meta = (n as Record<string, unknown>).extra_metadata as\n    | { ttl_days?: number | null; purging?: boolean }\n    | undefined;\n  // A permanent delete is on its way for it: no time is left to count.\n  if (meta?.purging) return t('trash.purging');\n  const ttl = meta?.ttl_days;\n  return trashTimeLeft(ttl, t);\n}\n\n/* bul:s3 — search-result enrichment. The v0.2 backend inlines `snippet`\n * (plain text, «» highlights) + `matched` on search hits; regular listings\n * never carry them, so presence-gating keeps normal rows untouched and an\n * older backend simply renders nothing extra. */\nfunction rowSnippet(n: FileNode): string {\n  const s = (n as Record<string, unknown>).snippet;\n  return typeof s === 'string' ? s : '';\n}\n\nfunction rowInContent(n: FileNode): boolean {\n  return matchedInContent((n as Record<string, unknown>).matched);\n}\n// ------------------------------------------------------------------\n// Sorting.\n//\n// ⚠⚠ NOT local to the list view. The key, the direction, the click cycle and\n// the comparator live in `lib/sortOrder`, the store of the PANE this list is\n// inside, which the filter row's sort control also drives — so these headers\n// and that control are two handles on ONE piece of state (filex lesson #67).\n// The table draws the headers and reports a click; the store decides.\n//\n// ⚠⚠ `order === 'relevance'` says the server ranked this listing: no key is\n// applied, no column claims to be sorting, and the headers CLOSE and say why.\n// A header click over a ranked listing would set the pane's key, move nothing\n// at all, and then re-order the FOLDER the person returns to — a control\n// whose only effect is somewhere the user is not looking.\n// ------------------------------------------------------------------\n\n/* ⚠⚠ The store of the PANE this list is inside, not a module-level singleton:\n * two panes of a split each carry a sort control, and one shared answer means\n * the control in the right pane re-orders the left one. */\nconst sort = useSortStore();\nconst sortKey = computed<SortKey>(() => sort.key.value);\n/** These rows are the server's ranked answer — see the `order` prop. */\nconst ranked = computed(() => props.order === 'relevance');\n\n/* `type` sorts by the word this very column prints, so the comparator needs\n * the catalogue that word comes from. */\nwatch(() => props.locale, (l) => setSortLocale(l), { immediate: true });\n\nconst tableSort = computed(() =>\n  ranked.value ? null : { key: sortKey.value as string, dir: sort.dir.value },\n);\n\nfunction onSort(p: { key: string; dir: 'asc' | 'desc' }) {\n  /* The table computed a direction too, but the STORE owns the click\n     vocabulary (`chooseSortKey`: a new key arrives in its own default\n     direction, the active one flips) — handing it the key keeps one answer. */\n  if (ranked.value) return;\n  if ((SORT_KEYS as readonly string[]).includes(p.key)) sort.chooseSortKey(p.key as SortKey);\n}\n\n// ------------------------------------------------------------------\n// The columns.\n//\n// ⚠⚠ THE TABLE ITSELF IS `DataTable` — the product's one table, which this\n// view used to BE. Everything that is not about files moved there on\n// 2026-09-21 (resizing, reordering, the column menu, the frozen edges, the\n// sideways scroll) so that every other table in the product runs the same\n// code rather than an imitation of it. What stays here is what only a file\n// listing knows: which columns exist, what a cell prints for a file, the row's\n// gestures, and where the arrangement is remembered — per FOLDER.\n// ------------------------------------------------------------------\n\n/** Which optional columns this listing is willing to draw at all, before any\n *  question of the person's own choices. */\nconst candidateCols = computed<ColumnId[]>(() => {\n  /* The Trash has no owner to show (its listing carries none), and it draws\n     WHO DELETED IT on that track instead — the way the date track says when\n     it was deleted and the location track where from. */\n  if (props.trash) return ['type', 'location', 'owner', 'modified', 'remaining', 'size'];\n  const out: ColumnId[] = ['type'];\n  /* Location only where the rows come from more than one folder. In an\n     ordinary folder every row shares one location and the column would be a\n     wall of the same string. */\n  if (props.showParentPath) out.push('location');\n  out.push('owner', 'modified', 'size');\n  if (props.starEnabled !== false && (!!props.apiBase || props.apiBase === '')) out.push('star');\n  return out;\n});\n\n/**\n * THIS FOLDER's columns (`lib/viewPrefs.folderColumnStore`): its own, else the\n * person's default, else the instance's, else the shipped layout. A column\n * dragged wider here stays here — the owner, 2026-09-21: \"Explore içindeki\n * değişikliklerimiz o klasör özelinde olmalı.\"\n *\n * ⚠ Built once, reading `folderKey` through a getter, so a navigation swaps\n * the arrangement on screen without rebuilding the store.\n */\nconst cols = folderColumnStore(() => props.folderKey ?? '');\n\n/** The optional columns on screen, in the person's order — the same list the\n *  table draws (width never sheds a column). */\nconst visibleCols = computed<ColumnId[]>(() =>\n  cols\n    .order()\n    .filter((id) => id !== 'name' && candidateCols.value.includes(id) && !cols.hidden(id)),\n);\n\n/** The column definitions the table draws, in the explorer's own classes so\n *  every rule written against `fe-list__col--*` keeps applying. */\nconst columns = computed<DataColumn<FileNode>[]>(() => [\n  { id: 'name', label: t('col.name'), lead: true, sortable: true, class: 'fe-list__col--name' },\n  { id: 'type', label: t('col.type'), sortable: true, class: 'fe-list__col--type', format: typeLabel },\n  {\n    id: 'location',\n    label: props.trash ? t('col.deleted_from') : t('col.location'),\n    class: 'fe-list__col--location',\n    format: locationLabel,\n    title: (n) => locationLabel(n) || undefined,\n  },\n  {\n    id: 'owner',\n    label: props.trash ? t('col.deleted_by') : t('col.owner'),\n    class: 'fe-list__col--owner',\n    format: props.trash ? deleterLabel : ownerLabel,\n    title: props.trash ? deleterTitle : ownerTitle,\n  },\n  {\n    id: 'modified',\n    label: props.trash ? t('col.deleted') : t('col.modified'),\n    sortable: true,\n    sortDir: 'desc',\n    class: 'fe-list__col--mod',\n    format: (n) => displayDate(n.last_modified),\n    title: (n) => fullDate(n.last_modified),\n  },\n  {\n    id: 'remaining',\n    label: t('col.remaining'),\n    class: 'fe-list__col--remaining',\n    format: remainingLabel,\n  },\n  {\n    id: 'size',\n    label: t('col.size'),\n    sortable: true,\n    class: 'fe-list__col--size',\n    // A folder the catalog does not cover in full says so: \"≥ 1.2 GB\", or\n    // \"—\" when nothing below it is known (useLocale formatNodeSize).\n    format: (n) => formatNodeSize(n),\n    title: (n) => nodeSizeHint(n),\n  },\n  { id: 'star', label: t('col.star'), class: 'fe-list__col--star', headerLabel: false },\n]);\n\n/**\n * The name cell's hover text.\n *\n * ⚠ Carries the location too when the Location column is not drawn (only when\n * the person has turned it off): a column somebody hid must not silently\n * destroy the only copy of a fact, or `report.pdf` in two folders is two\n * identical rows.\n */\nfunction nameTitle(n: FileNode): string {\n  if (!props.showParentPath || visibleCols.value.includes('location')) return n.basename;\n  const loc = locationLabel(n);\n  return loc ? `${n.basename} · ${loc}` : n.basename;\n}\n\nfunction rowAttrs(n: FileNode): Record<string, unknown> {\n  const attrs: Record<string, unknown> = {\n    tabindex: 0,\n    'aria-label': nodeDisplayName(n) /* wiring:c4 */,\n    'data-fe-path': n.path /* wiring:d1 — middle-click open-in-new-tab delegation */,\n    draggable: 'true',\n  };\n  // A folder row shows what is inside when the pointer rests on it (the same\n  // peek the grid's folder cards have).\n  if (n.type === 'dir') {\n    attrs.onPointerenter = (ev: PointerEvent) => emit('peek', n, ev.currentTarget as Element, ev.pointerType);\n    attrs.onPointerleave = () => emit('peek-end');\n    attrs.onPointerdown = () => emit('peek-end');\n  }\n  return attrs;\n}\n\nfunction rowClass(n: FileNode) {\n  return {\n    'is-dir': n.type === 'dir',\n    'is-trash': !!n.trashed,\n    'is-clipped': !!props.clipped?.has(n.path),\n    'is-droptarget': dropTargetPath.value === n.path /* wiring:c4 */,\n  };\n}\n\n// ── the column menu's folder rows ─────────────────────────────────────\n\nconst rememberedFolders = computed(() => rememberedCount());\nconst thisFolderRemembered = computed(() => !!props.folderKey && folderIsRemembered(props.folderKey));\n\n/**\n * \"Apply to all folders\" — makes THIS folder's setup the person's default and\n * forgets every folder's own, which is what the words promise.\n *\n * ⚠ It has to WRITE the default. It used to be a pure forget, because every\n * click already wrote a global default — and that implicit write was the leak\n * the owner reported (\"tüm klasörlerde görünüm değişikliği geçerli oluyor\").\n * The view mode is `list` because this menu only exists in the list.\n */\nfunction onApplyToAll(close: () => void) {\n  applyToAllFolders({\n    v: 'list',\n    ...(ranked.value ? {} : { k: sort.key.value, d: sort.dir.value }),\n    c: cols.state(),\n  });\n  close();\n}\n\nfunction onForgetFolder(close: () => void) {\n  if (props.folderKey) forgetFolder(props.folderKey);\n  close();\n}\n\nconst rows = computed(() => {\n  // Virtual rows (.trash / storage drives) stay pinned on top in their\n  // original order; only real entries take part in the sort.\n  const pinned: FileNode[] = [];\n  const rest: FileNode[] = [];\n  for (const n of props.files) (isPinnedSpecial(n) ? pinned : rest).push(n);\n\n  /* The listing's order, from the one place that owns the rule\n   * (`lib/sortOrder.compareInOrder`). An ordinary folder: folders first, then\n   * the active key. A ranked answer: folders first and NOTHING else, which is\n   * byte-for-byte the pass GridView already makes — so the two views cannot\n   * disagree in either mode. Array#sort is stable, so ties keep the order the\n   * backend answered in, and in `relevance` every pair of same-kind rows is a\n   * tie: that stability IS how the server's ranking survives this line. */\n  return [...pinned, ...rest.sort(sort.compareInOrder(props.order ?? 'sort'))];\n});\n\n// ------------------------------------------------------------------\n// Date grouping — only while sorted by modified date. Rows are split\n// into contiguous segments so the row markup below stays untouched.\n//\n// ⚠⚠ The LADDER and the \"is a heading honest here\" rule both moved to\n// `lib/dateGroups`, because the grid and the gallery draw the same headings\n// now and a second copy of either would drift the first time a rung changed.\n// This file keeps only what is its own: which rows are aside from the dates.\n// ------------------------------------------------------------------\n\n/* zaman:z1 — the headings answer \"what day is this row from\", so they read the\n * same clock the cell beside them prints (composables/useLocale → lib/timezone\n * → lib/dateGroups). They used to ask the DEVICE, so for a viewer set to UTC a\n * file touched at 01:00 Istanbul sat under \"Today\" in the group header and\n * printed yesterday's date in its own cell, one line apart. */\nconst groupLabels = computed(() => ({ t, formatMonthYear, zonedYearMonth }));\n\nwatch(\n  rows,\n  (list) => emit('display-order', list),\n  { immediate: true },\n);\n\n/* ── Owner ────────────────────────────────────────────────────────────────\n *\n * Three answers, and only three: your own name is \"You\", a row nobody put here\n * through filex is \"System\", and anything else is the account's display name.\n *\n * ⚠ \"System\" is not a placeholder for missing data — it is the true answer for\n * a file the scanner found in the bucket, and most rows on a mounted storage\n * are exactly that. Leaving the cell blank there would read as \"we failed to\n * look it up\", which is a different and false statement. */\nfunction ownerLabel(n: FileNode): string {\n  if (ownedByViewer(n)) return t('owner.you');\n  if (ownerIdOf(n) === null) return t('owner.system');\n  return ownerNameOf(n) || t('owner.unknown');\n}\n\n/** The hover text. It carries the two facts the column has no room for: that\n *  the bytes were handed in by an anonymous visitor through a drop link, and\n *  who touched the thing last when that is not the owner. */\nfunction ownerTitle(n: FileNode): string {\n  const parts = [ownerLabel(n)];\n  if (arrivedFromOutside(n)) parts.push(t('owner.external'));\n  const actor = (n as Record<string, unknown>).last_actor_name;\n  const actorSelf = (n as Record<string, unknown>).last_actor_self === true;\n  const actorId = (n as Record<string, unknown>).last_actor_id;\n  if (actorSelf || (typeof actor === 'string' && actor)) {\n    const who = actorSelf ? t('owner.you') : String(actor);\n    if (who !== parts[0]) parts.push(t('owner.last_actor', { who }));\n  } else if (actorId === undefined && ownerIdOf(n) !== null) {\n    // An owned row whose last change came from outside filex.\n    parts.push(t('owner.last_actor', { who: t('owner.system') }));\n  }\n  return parts.join(' · ');\n}\n\n/* ── Deleted by (the Trash) ───────────────────────────────────────────────\n *\n * \"You\", the account's name, or a dash. ⚠ Not \"System\": a row nobody is named\n * on may have been quarantined by the virus scan OR trashed before filex\n * kept this, and \"System\" would be a false answer for the second. (An item\n * deleted outside filex is not in the trash at all since 0.48.) The dash says \"not recorded\", and its hover text says why. */\nfunction deleterLabel(n: FileNode): string {\n  if (deletedByViewer(n)) return t('owner.you');\n  if (deleterIdOf(n) === null) return '-';\n  return deleterNameOf(n) || t('owner.unknown');\n}\n\nfunction deleterTitle(n: FileNode): string | undefined {\n  if (deleterIdOf(n) === null && !deletedByViewer(n)) return t('trash.deleted_by_nobody');\n  return deleterLabel(n);\n}\n\nconst segments = computed<DateRun<FileNode>[]>(() =>\n  groupByDate(rows.value, {\n    /* ⚠ `ranked` is half of this and not a detail: over a search's ranked\n     * answer the key is still `modified` (nothing cleared it), the listing\n     * just is not obeying it — see `lib/dateGroups.groupingActive`. */\n    active: groupingActive(sortKey.value, props.order),\n    dateOf: (n) => toDate(n.last_modified),\n    /* ⚠ Folders are their OWN run, above the first date heading, and that is\n     * what lets \"folders before files\" hold while sorted by date. The rule\n     * used to be softened instead — rows sorted by date, folders floating to\n     * the top of each bucket — because hoisting them all would have split a\n     * bucket in two and drawn \"Today\" twice, once over the folders and once\n     * over the files. A run of their own removes that reason, and a folder has\n     * no meaningful modification date to file under anyway. */\n    aside: (n) =>\n      isPinnedSpecial(n) ? { id: 'pinned' } : n.type === 'dir' ? { id: 'dirs' } : null,\n    labels: groupLabels.value,\n  }).runs,\n);\n/** The date runs, in the shape the table draws groups in. */\nconst tableGroups = computed(() =>\n  segments.value.map((s) => ({ id: s.id, label: s.label ?? undefined, items: s.items })),\n);\n\n</script>\n\n<template>\n  <!-- tablo:t3 — the explorer's listing is DataTable, the product's one table,\n       with the file-specific parts handed in: the columns, what a cell prints\n       for a file, the row's gestures and a per-FOLDER column store. Every\n       class the explorer's stylesheet and the e2e suites address\n       (`fe-list__row`, `fe-list__col--name`, `[data-fe-path]`, the ⋮) is\n       still drawn, by DataTable. -->\n  <DataTable\n    :rows=\"rows\"\n    :groups=\"tableGroups\"\n    :columns=\"columns\"\n    :column-store=\"cols\"\n    :candidates=\"candidateCols\"\n    :metrics=\"EXPLORER_METRICS\"\n    :row-key=\"(n: FileNode) => n.path\"\n    :locale=\"locale\"\n    :theme=\"theme\"\n    :loading=\"loading\"\n    :empty=\"t('empty.folder')\"\n    :aria-label=\"t('list.aria')\"\n    :framed=\"false\"\n    selectable\n    :is-selected=\"isSelected\"\n    :sort=\"tableSort\"\n    :sort-closed=\"ranked ? t('sort.relevance_why') : null\"\n    :row-class=\"rowClass\"\n    :row-attrs=\"rowAttrs\"\n    @sort=\"onSort\"\n    @row-click=\"onRowClick\"\n    @row-dblclick=\"onRowDbl\"\n    @row-contextmenu=\"onRowCtx\"\n    @check-click=\"onCheckClick\"\n    @row-dragstart=\"onItemDragStart\"\n    @row-dragover=\"onItemDragOver\"\n    @row-dragleave=\"onItemDragLeave\"\n    @row-drop=\"onItemDrop\"\n    @row-touchstart=\"(n: FileNode, ev: TouchEvent) => touch.onTouchStart(n, ev)\"\n    @row-touchend=\"(ev: TouchEvent) => touch.onTouchEnd(ev)\"\n    @row-touchmove=\"(ev: TouchEvent) => touch.onTouchMove(ev)\"\n  >\n    <template #cell-name=\"{ row }\">\n      <!-- ikon:emoji — an encrypted folder is still a FOLDER: it keeps the\n           folder's shape and colour with the padlock cut out of it. One\n           definition for all three views, in lib/fileIcons. -->\n      <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n      <span\n        v-if=\"isEncryptedFolder(row)\"\n        class=\"fe-list__icon fe-list__icon--svg\"\n        role=\"img\"\n        :aria-label=\"t('e2e.badge')\"\n        v-html=\"encryptedFolderTile()\"\n      ></span>\n      <!-- tablo:t1 — the real thumbnail, at the tile's own size so the row\n           height does not move. ⚠⚠ Through ThumbTile, never read in this\n           template: here, each thumbnail that arrived re-rendered every row of\n           the table. The tile draws the <img> (`draggable=\"false\"`: dragging\n           an <img> puts a 'Files' MIME on the dataTransfer and the parent's\n           upload handler re-uploads the thing you were only moving) and the\n           type tile until then. -->\n      <!-- Folder previews (0.50): the newest file rising out of the row's\n           small folder (FolderMosaic, the list's shape), in the icon's box.\n           Once any folder here has files to show, every folder is drawn so\n           (an empty one empty), and the rows keep one look. -->\n      <FolderMosaic\n        v-else-if=\"row.type === 'dir' && folderPreviews\"\n        shape=\"mini\"\n        :node=\"row\"\n        :src-of=\"printSrc\"\n        class=\"fe-list__icon\"\n      />\n      <!-- 0.50: a thumbnail drawn on paper (an office page, a PDF, a text, an\n           archive's list) is, at 24 pixels, a white square on a white row, and\n           the row looked as if it had lost its icon. ThumbTile puts a small\n           badge in the colour of the type tile in its inline-end corner while\n           the picture is there (lib/filePreview thumbTypeBadge); the box below\n           is what the badge is placed against, and it is exactly the tile's\n           size, so no row moves. List view only: the grid and the gallery\n           draw their pictures large enough to read. -->\n      <span v-else class=\"fe-list__thumb\">\n        <ThumbTile\n          :node=\"row\"\n          :src-of=\"thumbOf\"\n          :type-badge=\"thumbTypeBadge(row)\"\n          :note=\"thumbNoteOf(row)\"\n          class=\"fe-list__icon fe-list__icon--img\"\n          :class=\"{ 'fe-thumb--page': drawsAsPage(row) }\"\n          alt=\"\"\n          aria-hidden=\"true\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span class=\"fe-list__icon fe-list__icon--svg\" aria-hidden=\"true\" v-html=\"fileIconTile(row)\"></span>\n        </ThumbTile>\n      </span>\n      <div class=\"fe-list__name-wrap\">\n        <span class=\"fe-list__name\" :title=\"nameTitle(row)\">\n          <!-- ⚠ RTL: `<bdi>` — the name is the person's text, not the\n               interface's: its own letters decide its direction, so `2026\n               report.pdf` keeps its number in front in an Arabic list and an\n               Arabic name keeps its order in an English one. -->\n          <bdi>{{ nodeDisplayName(row) }}</bdi>\n          <!-- bul:s3 — content-match badge -->\n          <span v-if=\"rowInContent(row)\" class=\"fe-list__badge\">{{ t('search.in_content') }}</span>\n          <span\n            v-if=\"keepBadgeFor && keepBadgeFor(row)\"\n            :class=\"['fe-keepbadge', 'fe-keepbadge--' + keepBadgeFor(row)]\"\n            :title=\"t('keep.badge_' + keepBadgeFor(row))\"\n            role=\"img\"\n            :aria-label=\"t('keep.badge_' + keepBadgeFor(row))\"\n          >{{ keepGlyph(keepBadgeFor(row)!) }}</span>\n        </span>\n        <!-- bul:s3 — content snippet («» → <mark> via TEXT segments, no innerHTML) -->\n        <span v-if=\"rowSnippet(row)\" class=\"fe-list__snippet\">\n          <template v-for=\"(seg, si) in snippetSegments(rowSnippet(row))\" :key=\"si\">\n            <mark v-if=\"seg.match\" class=\"fe-list__mark\">{{ seg.text }}</mark>\n            <template v-else>{{ seg.text }}</template>\n          </template>\n        </span>\n      </div>\n      <!-- ⚠ Badges OUTSIDE `.fe-list__name`: the shot scripts read that\n           element's textContent as the filename, and a row whose name reads\n           \"nda.pdf Locked\" breaks them silently (lesson #29). -->\n      <span\n        v-if=\"lockTitleOf(row)\"\n        class=\"fe-applock\"\n        role=\"img\"\n        :title=\"lockTitleOf(row)\"\n        :aria-label=\"lockTitleOf(row)\"\n        data-testid=\"lock-badge\"\n      ><span class=\"fe-applock__glyph\" aria-hidden=\"true\">&#128274;</span>{{ t('applock.badge') }}</span>\n      <!-- issue #34 — a symlink the server will not follow; `aria-label`\n           carries the SENTENCE, because \"Outside storage\" read aloud is a\n           second riddle. -->\n      <span\n        v-if=\"linkOf(row)\"\n        class=\"fe-symlink\"\n        :class=\"'fe-symlink--' + linkOf(row)!.state\"\n        role=\"img\"\n        :title=\"linkOf(row)!.why\"\n        :aria-label=\"linkOf(row)!.why\"\n        data-testid=\"symlink-badge\"\n        :data-link-state=\"linkOf(row)!.state\"\n      ><span class=\"fe-symlink__glyph\" aria-hidden=\"true\">&#128279;</span>{{ linkOf(row)!.badge }}</span>\n      <!-- issue #104 - an entry the storage could not answer for. -->\n      <span\n        v-if=\"unavailableOf(row)\"\n        class=\"fe-unavailable\"\n        role=\"img\"\n        :title=\"unavailableOf(row)!.full\"\n        :aria-label=\"unavailableOf(row)!.full\"\n        data-testid=\"unavailable-badge\"\n      >{{ unavailableOf(row)!.badge }}</span>\n      <span v-if=\"isPlainDir(row) && !typeColumnShown\" class=\"fe-list__kind\">{{ t('node.folder') }}</span>\n    </template>\n\n    <template #cell-star=\"{ row }\">\n      <!-- issue #26 — only the star itself is a control; the rest of the cell\n           opens the row like any other empty space on it. -->\n      <span\n        v-if=\"starEnabled !== false && typeof row.id === 'number' && row.type === 'file'\"\n        class=\"fe-list__star-hit\"\n        data-fe-control\n        @click.stop\n        @dblclick.stop\n      >\n        <StarButton\n          :starred=\"!!starredIds?.has(row.id)\"\n          :node-id=\"row.id\"\n          :api-base=\"apiBase\"\n          :auth-headers=\"authHeaders\"\n          :auth-credentials=\"authCredentials\"\n          :locale=\"locale\"\n          compact\n          @change=\"(val: boolean) => emit('star-change', row, val)\"\n        />\n      </span>\n    </template>\n\n    <template #actions=\"{ row }\">\n      <!-- gorunum:v1 — the ⋮ opens THE SAME menu the right-click opens. -->\n      <button\n        type=\"button\"\n        class=\"fe-list__menu\"\n        :title=\"t('toolbar.more')\"\n        :aria-label=\"t('toolbar.more')\"\n        @click=\"onRowMenu(row, $event)\"\n      ><span aria-hidden=\"true\">&#8942;</span></button>\n    </template>\n\n    <template #colmenu-extra=\"{ close }\">\n      <div v-if=\"thisFolderRemembered || rememberedFolders > 0\" class=\"fe-colmenu__sep\" role=\"separator\"></div>\n      <p v-if=\"thisFolderRemembered || rememberedFolders > 0\" class=\"fe-colmenu__title\">{{ t('cols.folder_title') }}</p>\n      <!-- The rule, in one sentence, next to the two buttons that act on it.\n           A per-folder memory nobody can explain is the difference between a\n           feature and a haunting. -->\n      <p v-if=\"thisFolderRemembered || rememberedFolders > 0\" class=\"fe-colmenu__hint\">{{ t('cols.folder_hint') }}</p>\n      <button v-if=\"thisFolderRemembered\" type=\"button\" class=\"fe-colmenu__row\" @click=\"onForgetFolder(close)\">\n        <span class=\"fe-colmenu__label\">{{ t('cols.forget_folder') }}</span>\n      </button>\n      <button v-if=\"rememberedFolders > 0 || thisFolderRemembered\" type=\"button\" class=\"fe-colmenu__row\" @click=\"onApplyToAll(close)\">\n        <span class=\"fe-colmenu__label\">{{ t('cols.apply_all', { count: rememberedFolders }) }}</span>\n      </button>\n    </template>\n  </DataTable>\n</template>\n","<script setup lang=\"ts\">\n// (unscoped styles by design — see base.css wiring:d2 block; SFC scoped\n// styles are banned for webcomponent data-v hash mismatch reasons.)\n/**\n * GalleryView — wiring:d2. Third view mode: large-thumbnail gallery for\n * visual browsing (photos/videos). Derived from GridView (same props/emits,\n * same listbox a11y, same selection/drag/touch contract) but renders big\n * square tiles: thumbnail (or SVG file-type icon fallback) with the name\n * below and size+date revealed on hover/focus. GridView itself is untouched.\n */\nimport { computed, onBeforeUnmount, ref } from 'vue';\nimport { hasInternalDrag } from '../lib/dragOut';\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { lockOf, lockWords } from '../lib/appLock';\nimport { linkWordsFor } from '../lib/symlink'; /* issue #34 — a link that will not open */\nimport { unavailableWordsFor } from '../lib/unavailable'; /* issue #104 - an entry the storage could not answer for */\nimport { thumbNoteWords } from '../lib/thumbNote'; /* 0.50 - why a file has no thumbnail */\nimport { checkMod, clickMod, useRowTouch, type ClickMod } from '../composables/useRowTouch';\nimport ItemCheck from './ItemCheck.vue';\nimport { encryptedFolderTile, fileIconTile, isEncryptedFolder } from '../lib/fileIcons';\nimport {\n  createFilePreviews,\n  drawsAsPage,\n  drawsAsVideo,\n  type FilePreview,\n} from '../lib/filePreview'; /* gorunum:v1-preview */\nimport StarButton from './StarButton.vue';\nimport ThumbTile from './ThumbTile.vue';\nimport FolderMosaic from './FolderMosaic.vue';\nimport { applyDragGhost } from '../lib/dragGhost';\nimport { displayParentDirOf } from '../lib/listing'; /* the folder a row sits in — one split rule for every view */\nimport {\n  groupByDate,\n  groupingActive,\n} from '../lib/dateGroups'; /* gruplama */\nimport { useSortStore, type ListingOrder } from '../lib/sortOrder'; /* gruplama */\nimport { contentDir } from '../lib/direction';\n\nconst props = withDefaults(defineProps<{\n  files: FileNode[];\n  selected: Set<string>;\n  clipped?: Set<string>;\n  showParentPath?: boolean;\n  locale: LocaleCode;\n  loading?: boolean;\n  /** Authenticated thumb resolver (useThumbs.src) — same contract as\n   *  GridView: raw `thumb_url` is root-relative and unauthenticated, so\n   *  embedded hosts NEED this. null = icon fallback. */\n  thumbSrc?: (n: FileNode) => string | null;\n  /**\n   * Starring on a card. Same contract as ListView: the id set the explorer\n   * keeps, plus the API wiring StarButton needs. Absent apiBase → no star is\n   * rendered at all, exactly as in the list.\n   *\n   * ⚠ Not list-only. The Starred VIEW shipped before starring was reachable\n   * from anywhere but the list, so a user in grid view — the mode the panel's\n   * own screenshots show — had a view they could not fill.\n   */\n  starredIds?: Set<number>;\n  /**\n   * Offer the star affordance at all. Follows the Starred view: when the panel\n   * leaves that view out — a shared app token has no single person behind it,\n   * so \"your starred files\" is one list shown to strangers — offering to star\n   * something is offering to write into that same shared list. Owner's call,\n   * 2026-09-05, verbatim (translated from Turkish): \"if the starred place is\n   * not visible, then star/unstar should not be visible either\".\n   */\n  starEnabled?: boolean;\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  /** gorunum:v1-preview — inside an E2E-encrypted folder every body is\n   *  ciphertext, so the text preview stays off. Same prop, same meaning and\n   *  same default as GridView's. */\n  e2eActive?: boolean;\n  /**\n   * gruplama — where these rows got their order, the same prop the list and\n   * the grid take (`lib/sortOrder.ListingOrder`). Read for one thing only: a\n   * date heading over the server's RANKED answer would be a claim about an\n   * order the tiles are not in. Omitted = an ordinary folder listing.\n   */\n  order?: ListingOrder;\n  /**\n   * issue #26 — draw the checkbox on each card, the one click that selects.\n   * Default on. Same prop, same meaning as GridView's.\n   */\n  selectable?: boolean;\n}>(), {\n  // ⚠ Not left to `undefined`: Vue casts an absent boolean prop to false, and\n  // the listing would lose its checkboxes wherever the host said nothing.\n  selectable: true,\n});\n\nconst emit = defineEmits<{\n  (e: 'click-card', node: FileNode, mod: ClickMod): void;\n  (e: 'dbl-card', node: FileNode): void;\n  (e: 'context-card', node: FileNode, ev: MouseEvent): void;\n  (e: 'item-drag-start', node: FileNode, ev: DragEvent): void;\n  (e: 'item-drop-into', target: FileNode, ev: DragEvent): void;\n  (e: 'star-change', node: FileNode, value: boolean): void;\n}>();\n\nconst { t, formatSize, nodeDisplayName, formatDate, formatMonthYear, zonedYearMonth, toDate } =\n  useLocale(() => props.locale);\n\n/* App plugins — an app's hold on a row (docs/APP-PLUGINS-API.md → \"File\n   locks\"). The listing already caps `perm` at viewer, so the write verbs are\n   gone without this; the badge is what stops that reading as a bug. ⚠ One\n   source of words for every view and the details panel (lib/appLock). */\nfunction lockTitleOf(n: FileNode): string {\n  return lockWords(lockOf(n), { t, formatDate, locale: props.locale });\n}\n\n/* issue #34 — a symlink the server will not follow. Same shape as the lock\n   badge above and for the same reason: the words live in ONE module\n   (lib/symlink), so the row, the details panel and the toast that explains a\n   refused open cannot drift apart. `null` for every ordinary row — a link\n   whose target is inside the root was already followed and arrives as that\n   target, so it is not one of these. */\nfunction linkOf(n: FileNode) {\n  return linkWordsFor(n, { t });\n}\n\n/* issue #104 - an entry the storage could not answer for: \"!\" with the\n   sentence and the storage's own answer, from the one module (lib/unavailable)\n   the details panel and the refused-open toast read too. */\nfunction unavailableOf(n: FileNode) {\n  return unavailableWordsFor(n, { t });\n}\n/** Why the file has no thumbnail, when the reason is its own (lib/thumbNote,\n *  the same rule in the list, the grid and the gallery). */\nfunction thumbNoteOf(n: FileNode) {\n  return thumbNoteWords(n, { t });\n}\n\n\n/* gruplama — this pane's sort, by injection, so the gallery cannot disagree\n * with the list beside it about whether a date heading is honest right now. */\nconst sort = useSortStore();\n\n/**\n * gruplama — THE DATE HEADINGS, from the one module that owns the ladder\n * (`lib/dateGroups`), read identically by ListView and GridView.\n *\n * ⚠ The gallery has no Folders / Files sections to collide with, so nothing\n * here replaces anything: folders keep a run of their own at the top — with no\n * heading, because the gallery has never named one — and each day of files\n * gets its label. Any sort key but `modified` draws nothing at all, exactly as\n * before this existed.\n *\n * ⚠ The tiles are handed to us ALREADY sorted (`FilePane.displayFiles` runs\n * the pane's comparator, folders first, then the key), which is why this\n * groups `props.files` in place rather than re-sorting: a second sort here is\n * a second opinion about the order, and the grid learned that lesson once.\n */\nconst grouped = computed(() =>\n  groupByDate(props.files, {\n    active: groupingActive(sort.key.value, props.order),\n    dateOf: (n) => toDate(n.last_modified),\n    aside: (n) => (n.type === 'dir' ? { id: 'dirs' } : null),\n    labels: { t, formatMonthYear, zonedYearMonth },\n  }),\n);\n\n/** Some folder here has files to show: every folder is then drawn large\n *  (FolderMosaic), so the tiles keep one look. Folder previews off: none. */\nconst folderPreviews = computed(() => props.files.some((n) => n.type === 'dir' && (n.preview?.length ?? 0) > 0));\n\nfunction thumbOf(n: FileNode): string | null {\n  return props.thumbSrc ? props.thumbSrc(n) : (n.thumb_url ?? null);\n}\n\n/* gorunum:v1-preview — the SAME preview the grid card draws, from the same\n * module and with the same bounds. Not a gallery variant: a text file in a\n * gallery is the identical hole (the backend's generic extension-card), and\n * \"open it on the desktop, leave the embeds on the old behaviour\" is how one\n * product becomes two. Only the type scale differs, and that is CSS. */\nconst previews = createFilePreviews({\n  apiBase: props.apiBase,\n  authHeaders: props.authHeaders ? () => props.authHeaders!() : undefined,\n  credentials: props.authCredentials,\n  disabled: () => props.e2eActive === true,\n});\nonBeforeUnmount(() => previews.dispose());\n\nfunction previewKind(n: FileNode) {\n  return previews.kindFor(n);\n}\n\n/** At most one element — a typed local for the template, no `!` per loop. */\nfunction previewFor(n: FileNode): FilePreview[] {\n  const p = previews.get(n);\n  return p ? [p] : [];\n}\n\nfunction bindPreview(el: unknown, n: FileNode) {\n  previews.bind(el instanceof Element ? el : null, n);\n}\n\n/** A card carries a star when the host wired the API and the node is a file\n *  with a server id — the same rule the list row uses. */\nfunction canStar(n: FileNode): boolean {\n  if (props.starEnabled === false) return false;\n  return props.apiBase !== undefined && typeof n.id === 'number' && n.type === 'file';\n}\n\nfunction isSelected(n: FileNode): boolean {\n  return props.selected.has(n.path);\n}\n\n/**\n * issue #26 — the card's checkbox is the one click that selects (a click\n * anywhere else on the card opens it), routed exactly like the list row's:\n * one `click-card` emit marked `check`, one `useSelection.click`.\n */\nfunction onCheckClick(n: FileNode, ev: MouseEvent) {\n  emit('click-card', n, checkMod(ev));\n}\n\nfunction onClick(n: FileNode, ev: MouseEvent) {\n  emit('click-card', n, clickMod(ev, touch.isTap(ev)));\n}\n\nfunction onDbl(n: FileNode) {\n  emit('dbl-card', n);\n}\n\nfunction onCtx(n: FileNode, ev: MouseEvent) {\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('context-card', n, ev);\n}\n\nfunction onItemDragStart(n: FileNode, ev: DragEvent) {\n  applyDragGhost(\n    ev,\n    nodeDisplayName(n),\n    props.selected.has(n.path) ? props.selected.size : 1,\n  );\n  emit('item-drag-start', n, ev);\n}\n\n// Drop-target highlight — mirrors GridView (visual layer only).\nconst dropTargetPath = ref<string | null>(null);\n\nfunction onItemDragOver(n: FileNode, ev: DragEvent) {\n  if (n.type !== 'dir') return;\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n  dropTargetPath.value = n.path;\n}\n\nfunction onItemDragLeave(n: FileNode) {\n  if (dropTargetPath.value === n.path) dropTargetPath.value = null;\n}\n\nfunction onItemDrop(n: FileNode, ev: DragEvent) {\n  dropTargetPath.value = null;\n  if (n.type !== 'dir') return;\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('item-drop-into', n, ev);\n}\n\n/* Long press → the card's menu; a tap is reported as a tap (issue #26). */\nconst touch = useRowTouch<FileNode>(\n  (n, at) =>\n    emit('context-card', n, { ...at, preventDefault: () => {}, stopPropagation: () => {} } as unknown as MouseEvent),\n  {\n    // A finger lifted on the item, off its controls, opens at touchend — see useRowTouch.\n    onTap: (n) => emit('click-card', n, { ctrl: false, shift: false, touch: true }),\n  },\n);\n\n/**\n * zaman:z1 — routed through useLocale.formatDate, the package's one date\n * formatter. It was a bare `toLocaleString()`, i.e. the BROWSER's locale and\n * the BROWSER's zone: the same file's timestamp came out in a different\n * language here than in the list two clicks away, and in a different clock\n * than the viewer had chosen. Neither of those is a gallery decision.\n */\nfunction displayDate(ms: number | undefined): string {\n  return formatDate(ms, { time: true });\n}\n\n// Hover meta line: size for files, entry count (when known) for dirs.\nfunction metaFor(n: FileNode): string {\n  const date = displayDate(n.last_modified);\n  const size = n.type === 'dir' ? '' : formatSize(n.size);\n  return [size, date].filter((s) => !!s).join(' · ');\n}\n</script>\n\n<template>\n  <div\n    class=\"fe-gal\"\n    :class=\"{ 'is-loading': loading, 'has-selection': selectable && selected.size > 0 }\"\n    role=\"listbox\"\n    aria-multiselectable=\"true\"\n    :aria-label=\"t('gallery.aria')\"\n    :aria-busy=\"loading ? 'true' : undefined\"\n  >\n    <template v-for=\"n in files\" :key=\"n.path\">\n    <!-- gruplama — the date label: a grid item spanning every column, so the\n         tiles keep flowing under it. The cards keep `role=\"option\"`; the\n         heading is aria-hidden and the day it names is already in each\n         card's own hover text. -->\n    <p v-if=\"grouped.headingBefore(n)\" class=\"fe-gal__heading\" aria-hidden=\"true\">{{ grouped.headingBefore(n) }}</p>\n    <div\n      class=\"fe-gal__card\"\n      :class=\"{\n        'is-selected': isSelected(n),\n        'is-dir': n.type === 'dir',\n        'is-trash': n.trashed,\n        'is-clipped': clipped?.has(n.path),\n        'is-droptarget': dropTargetPath === n.path,\n      }\"\n      tabindex=\"0\"\n      role=\"option\"\n      :aria-selected=\"isSelected(n) ? 'true' : 'false'\"\n      :aria-label=\"nodeDisplayName(n)\"\n      :data-fe-path=\"n.path /* wiring:d1 - middle-click new-tab delegation */\"\n      draggable=\"true\"\n      @click=\"onClick(n, $event)\"\n      @dblclick=\"onDbl(n)\"\n      @contextmenu=\"onCtx(n, $event)\"\n      @dragstart=\"onItemDragStart(n, $event)\"\n      @dragover=\"onItemDragOver(n, $event)\"\n      @dragleave=\"onItemDragLeave(n)\"\n      @drop=\"onItemDrop(n, $event)\"\n      @touchstart.passive=\"touch.onTouchStart(n, $event)\"\n      @touchend=\"touch.onTouchEnd\"\n      @touchmove.passive=\"touch.onTouchMove\"\n    >\n      <div class=\"fe-gal__thumb\" :ref=\"(el) => bindPreview(el, n)\">\n        <!-- gorunum:v1-preview — a text-readable file shows its own first\n             lines; it never reaches the <img> branch, so no generic\n             placeholder thumbnail is fetched for it either. -->\n        <template v-if=\"previewKind(n)\">\n          <!-- ⚠ Interpolated, never v-html: this is somebody's file content. -->\n          <div\n            v-for=\"p in previewFor(n)\"\n            :key=\"'fprev'\"\n            class=\"fe-fprev\"\n            :dir=\"contentDir(p.kind)\"\n            :class=\"'fe-fprev--' + p.kind\"\n            :style=\"p.kind === 'table' ? { '--fprev-cols': String(p.cols) } : undefined\"\n            aria-hidden=\"true\"\n          >\n            <!-- One grid, cells emitted flat: <template> makes no DOM, so a\n                 short row's padding cells keep every column aligned. -->\n            <template v-if=\"p.kind === 'table'\">\n              <template v-for=\"(row, ri) in p.rows\" :key=\"ri\">\n                <span\n                  v-for=\"(cell, ci) in row\"\n                  :key=\"ci\"\n                  class=\"fe-fprev__cell\"\n                  :class=\"{ 'is-head': ri === 0 }\"\n                >{{ cell }}</span>\n              </template>\n            </template>\n            <template v-else>\n              <div v-for=\"(ln, li) in p.lines\" :key=\"li\" class=\"fe-fprev__line\"><span\n                v-if=\"ln.tint\"\n                class=\"fe-fprev__tint\"\n              >{{ ln.indent }}{{ ln.tint }}</span>{{ ln.text }}</div>\n            </template>\n          </div>\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span\n            v-if=\"previewFor(n).length === 0\"\n            class=\"fe-gal__icon fe-gal__icon--svg\"\n            v-html=\"fileIconTile(n)\"\n          ></span>\n        </template>\n        <!-- ⚠⚠ Through ThumbTile, as in GridView: read in this template, each\n             thumbnail that arrived re-rendered every tile of the folder. The\n             tile draws the <img> (draggable=\"false\", same reason as GridView)\n             and the play badge over a video frame; its slot until then. -->\n        <!-- Folder previews (0.50): the files that came into a folder last,\n             fanned out as prints in front of the folder drawn large\n             (FolderMosaic, the gallery's shape); once any folder here has\n             files to show, every folder is drawn so, an empty one empty. -->\n        <FolderMosaic\n          v-else-if=\"n.type === 'dir' && folderPreviews && !isEncryptedFolder(n)\"\n          shape=\"fan\"\n          :node=\"n\"\n          :src-of=\"thumbOf\"\n        />\n        <ThumbTile\n          v-else\n          :node=\"n\"\n          :src-of=\"thumbOf\"\n          :video-badge=\"drawsAsVideo(n)\"\n          :note=\"thumbNoteOf(n)\"\n          :alt=\"n.basename\"\n          :class=\"{ 'fe-thumb--page': drawsAsPage(n) /* gorunum:v1-preview — crop a page from its TOP */ }\"\n        >\n          <!-- ikon:emoji — see GridView: the folder shape survives, the padlock\n               is cut out of it, and the name the 🔒 never had is on the span. -->\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span\n            v-if=\"isEncryptedFolder(n)\"\n            class=\"fe-gal__icon fe-gal__icon--svg\"\n            role=\"img\"\n            :aria-label=\"t('e2e.badge')\"\n            v-html=\"encryptedFolderTile()\"\n          ></span>\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span v-else class=\"fe-gal__icon fe-gal__icon--svg\" v-html=\"fileIconTile(n)\"></span>\n        </ThumbTile>\n        <!-- Same star chip as the grid, same component, same rule: painted\n             when starred, on hover/focus otherwise. It sits above .fe-gal__meta\n             (which is aria-hidden and covers the tile's foot on hover). -->\n        <!-- issue #26 — the card's checkbox, the one click that selects: the\n             corner opposite the star, on the same reveal rule plus \"anything\n             is selected\" (styles/base.css .fe-item-check). -->\n        <span\n          v-if=\"selectable\"\n          class=\"fe-item-check fe-gal__check\"\n          data-fe-control\n          @click.stop=\"onCheckClick(n, $event)\"\n          @dblclick.stop\n        >\n          <ItemCheck :on=\"isSelected(n)\" :label=\"nodeDisplayName(n)\" />\n        </span>\n        <div v-if=\"canStar(n)\" class=\"fe-gal__star\" @click.stop @dblclick.stop>\n          <StarButton\n            :starred=\"!!starredIds?.has(n.id!)\"\n            :node-id=\"n.id!\"\n            :api-base=\"apiBase\"\n            :auth-headers=\"authHeaders\"\n            :auth-credentials=\"authCredentials\"\n            :locale=\"locale\"\n            compact\n            card\n            @change=\"(val: boolean) => emit('star-change', n, val)\"\n          />\n        </div>\n        <div class=\"fe-gal__meta\" aria-hidden=\"true\">\n          <span v-if=\"metaFor(n)\" class=\"fe-gal__meta-line\">{{ metaFor(n) }}</span>\n          <span\n            v-if=\"showParentPath && displayParentDirOf(n)\"\n            class=\"fe-gal__meta-line fe-gal__meta-line--path\"\n            :title=\"displayParentDirOf(n)\"\n          ><bdi>{{ displayParentDirOf(n) }}</bdi></span>\n        </div>\n      </div>\n      <div class=\"fe-gal__label\" :title=\"n.basename\">\n        <bdi>{{ nodeDisplayName(n) }}</bdi>\n      </div>\n      <!-- issue #34 — a symlink the server will not follow. Its own line: a\n           gallery card has no caption row to hang it off, and a badge that\n           only appeared in two of the three views is how the same fix reaches\n           some people and not others. -->\n      <div v-if=\"linkOf(n)\" class=\"fe-gal__meta-line\">\n        <span\n        class=\"fe-symlink\"\n        :class=\"'fe-symlink--' + linkOf(n)!.state\"\n        role=\"img\"\n        :title=\"linkOf(n)!.why\"\n        :aria-label=\"linkOf(n)!.why\"\n        data-testid=\"symlink-badge\"\n        :data-link-state=\"linkOf(n)!.state\"\n        ><span class=\"fe-symlink__glyph\" aria-hidden=\"true\">&#128279;</span>{{ linkOf(n)!.badge }}</span>\n      </div>\n      <!-- issue #104 - an entry the storage could not answer for. -->\n      <div v-if=\"unavailableOf(n)\" class=\"fe-gal__meta-line\">\n        <span\n        class=\"fe-unavailable\"\n        role=\"img\"\n        :title=\"unavailableOf(n)!.full\"\n        :aria-label=\"unavailableOf(n)!.full\"\n        data-testid=\"unavailable-badge\"\n        >{{ unavailableOf(n)!.badge }}</span>\n      </div>\n      <div v-if=\"lockTitleOf(n)\" class=\"fe-gal__meta-line\">\n        <span\n        v-if=\"lockTitleOf(n)\"\n        class=\"fe-applock\"\n        role=\"img\"\n        :title=\"lockTitleOf(n)\"\n        :aria-label=\"lockTitleOf(n)\"\n        data-testid=\"lock-badge\"\n            ><span class=\"fe-applock__glyph\" aria-hidden=\"true\">&#128274;</span>{{ t('applock.badge') }}</span>\n      </div>\n    </div>\n    </template>\n    <div v-if=\"!loading && files.length === 0\" class=\"fe-gal__empty\">\n      {{ t('empty.folder') }}\n    </div>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * FolderPeek — the quiet list a folder shows when the pointer rests on it\n * (useFolderPeek): how many things are inside, and the first few, each with\n * its thumbnail or type tile. Not a menu: nothing in it takes a click\n * (`pointer-events: none` in base.css), so it can never catch the click that\n * was meant for the folder under it.\n *\n * ⚠ Teleported to <body>, so it carries its own `dir` (lesson #333) and takes\n * its layer from what it hangs over (lib/popupLayer), and it is placed in a\n * function through `el.style`, along its inline axis (lesson #508; lib/\n * direction does the direction-aware maths).\n */\nimport { computed, nextTick, ref, watch } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport type { FolderPeekState } from '../composables/useFolderPeek';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { clampAlongInline, dirOfElement } from '../lib/direction';\nimport { popupLayer } from '../lib/popupLayer';\nimport { encryptedFolderTile, fileIconTile, iconFamilyFor, isEncryptedFolder } from '../lib/fileIcons';\nimport { drawsOnPaper, previewKindFor, thumbTypeBadge } from '../lib/filePreview';\nimport ThumbTile from './ThumbTile.vue';\n\nconst props = defineProps<{\n  state: FolderPeekState | null;\n  srcOf: (n: FileNode) => string | null;\n  locale: LocaleCode;\n}>();\n\nconst { t, dir, nodeDisplayName } = useLocale(() => props.locale);\n\nconst box = ref<HTMLElement | null>(null);\n\n/**\n * A row gets its thumbnail when the thumbnail is a picture of the content: a\n * photograph, a video frame, or a page (lib/filePreview `drawsOnPaper`, the\n * list view's rule, so the two lists agree). A kind the list draws as its type\n * tile instead (a short text or csv, code: `previewKindFor`) keeps its tile\n * here too, and so does a kind the server can only draw as a coloured card\n * repeating the extension (audio, unknown).\n *\n * ⚠ This was a private set (image, video, pdf, doc, slides) that left a\n * spreadsheet, a text and an archive on their tiles from before 0.50 drew\n * their pages. A page gets the list's type badge (`thumbTypeBadge`): at 24\n * pixels it is a white square on a white card otherwise.\n */\nconst pictured = (n: FileNode) => {\n  if (n.type === 'dir' || previewKindFor(n)) return false;\n  const family = iconFamilyFor(n);\n  return family === 'image' || family === 'video' || drawsOnPaper(n);\n};\nconst more = computed(() => (props.state ? Math.max(0, props.state.total - props.state.items.length) : 0));\n\n/** Below the card, starting at its inline-start edge; above it when there is\n *  no room below; always inside the window. */\nfunction place() {\n  const el = box.value;\n  const st = props.state;\n  if (!el || !st) return;\n  const vw = window.innerWidth;\n  const vh = window.innerHeight;\n  const w = el.offsetWidth;\n  const h = el.offsetHeight;\n  const d = dirOfElement(el);\n  const start = d === 'rtl' ? st.anchor.right : st.anchor.left;\n  const x = clampAlongInline(start, w, vw, d);\n  let y = st.anchor.bottom + 6;\n  if (y + h > vh - 8) y = Math.max(8, st.anchor.top - h - 6);\n  // clampAlongInline answers from the viewport's left; the box is placed\n  // along its own inline axis, so it is written as the inline-start inset.\n  el.style.insetInlineStart = `${Math.round(d === 'rtl' ? vw - x - w : x)}px`;\n  el.style.top = `${Math.round(y)}px`;\n  el.style.zIndex = String(popupLayer(document.elementFromPoint(st.anchor.left + 1, st.anchor.top + 1)));\n}\n\nwatch(\n  () => props.state,\n  async () => {\n    await nextTick();\n    place();\n  },\n);\n</script>\n\n<template>\n  <Teleport to=\"body\">\n    <div\n      v-if=\"state\"\n      ref=\"box\"\n      class=\"fe-fpeek\"\n      :dir=\"dir\"\n      role=\"tooltip\"\n      data-fe-peek\n      :aria-label=\"nodeDisplayName(state.node)\"\n    >\n      <p class=\"fe-fpeek__head\">\n        <bdi class=\"fe-fpeek__name\">{{ nodeDisplayName(state.node) }}</bdi>\n        <span v-if=\"!state.loading\" class=\"fe-fpeek__count\">\n          {{ state.total === 0 ? t('peek.empty') : t('peek.items', { n: state.total }) }}\n        </span>\n      </p>\n      <p v-if=\"state.loading\" class=\"fe-fpeek__loading\">{{ t('peek.loading') }}</p>\n      <ul v-else-if=\"state.items.length\" class=\"fe-fpeek__list\">\n        <li v-for=\"it in state.items\" :key=\"it.path\" class=\"fe-fpeek__row\">\n          <span class=\"fe-fpeek__tile\">\n            <ThumbTile\n              v-if=\"pictured(it)\"\n              :node=\"it\"\n              :src-of=\"srcOf\"\n              :type-badge=\"thumbTypeBadge(it)\"\n              alt=\"\"\n              class=\"fe-fpeek__img\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n              <span class=\"fe-grid__tile--svg\" v-html=\"fileIconTile(it)\"></span>\n            </ThumbTile>\n            <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n            <span v-else-if=\"isEncryptedFolder(it)\" class=\"fe-grid__tile--svg\" v-html=\"encryptedFolderTile()\"></span>\n            <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n            <span v-else class=\"fe-grid__tile--svg\" v-html=\"fileIconTile(it)\"></span>\n          </span>\n          <bdi class=\"fe-fpeek__label\">{{ nodeDisplayName(it) }}</bdi>\n        </li>\n      </ul>\n      <p v-if=\"!state.loading && more > 0\" class=\"fe-fpeek__more\">{{ t('peek.more', { n: more }) }}</p>\n    </div>\n  </Teleport>\n</template>\n","/**\n * useFolderPeek — \"what is in this folder?\" on hover (docs/thumbnails.md →\n * Folder previews).\n *\n * A pointer that rests on a folder for PEEK_DELAY_MS gets a quiet list of\n * what is inside it (FolderPeek): how many things, and the first few with\n * their thumbnails. It is a glance, not a way in: nothing in it is clickable,\n * and it goes away the moment the pointer leaves, a button is pressed, the\n * page scrolls or a drag starts.\n *\n * ⚠ Mouse only. A touch \"hover\" is the first half of a tap, and a list that\n * appears under a finger on its way to open the folder is in the way.\n *\n * The folder is listed through the pane's own `index` (the API every listing\n * goes through), so what the peek shows is what opening the folder shows, and\n * the listing hands its missing thumbnails to the server's refresher as any\n * listing does. Answers are kept for PEEK_TTL_MS per folder.\n *\n * An administrator can turn folder previews off (Settings; the explorer reads\n * it from capabilities `folder_previews`): `enabled` then answers false and a\n * resting pointer shows nothing, as on the folder cards.\n */\nimport { shallowRef } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport { byFoldersFirst } from '../lib/listing';\n\nexport const PEEK_DELAY_MS = 500;\nexport const PEEK_TTL_MS = 30_000;\n/** How many entries the peek names; the rest is a count. */\nexport const PEEK_ROWS = 8;\n\nexport interface FolderPeekState {\n  node: FileNode;\n  /** The card or row it hangs from, measured when it opened. */\n  anchor: DOMRect;\n  loading: boolean;\n  items: FileNode[];\n  total: number;\n}\n\nexport function useFolderPeek(\n  index: (path: string) => Promise<{ files?: FileNode[] }>,\n  /** Whether folder previews are on; read at every enter. Absent: on. */\n  enabled: () => boolean = () => true,\n) {\n  const state = shallowRef<FolderPeekState | null>(null);\n  const cache = new Map<string, { at: number; items: FileNode[]; total: number }>();\n  let timer: ReturnType<typeof setTimeout> | undefined;\n  /** Bumped on every enter and leave: an answer for an older hover is dropped. */\n  let token = 0;\n\n  async function listed(path: string): Promise<{ items: FileNode[]; total: number }> {\n    const hit = cache.get(path);\n    if (hit && Date.now() - hit.at < PEEK_TTL_MS) return hit;\n    const resp = await index(path);\n    const files = [...(resp.files ?? [])].sort(byFoldersFirst);\n    const got = { at: Date.now(), items: files.slice(0, PEEK_ROWS), total: files.length };\n    cache.set(path, got);\n    return got;\n  }\n\n  /** The pointer came to rest on `node` (a folder) over `el`. */\n  function enter(node: FileNode, el: Element | null | undefined, pointerType = 'mouse') {\n    if (node.type !== 'dir' || pointerType !== 'mouse' || !el || !enabled()) return;\n    const my = ++token;\n    clearTimeout(timer);\n    timer = setTimeout(async () => {\n      if (my !== token) return;\n      const anchor = el.getBoundingClientRect();\n      state.value = { node, anchor, loading: true, items: [], total: 0 };\n      try {\n        const got = await listed(node.path);\n        if (my !== token) return;\n        state.value = { node, anchor, loading: false, items: got.items, total: got.total };\n      } catch {\n        if (my === token) state.value = null;\n      }\n    }, PEEK_DELAY_MS);\n  }\n\n  /** The pointer left, a button went down, the view scrolled, a drag began. */\n  function leave() {\n    token++;\n    clearTimeout(timer);\n    timer = undefined;\n    state.value = null;\n  }\n\n  /** A folder changed: its next peek lists it again. */\n  function forget(path?: string) {\n    if (path) cache.delete(path);\n    else cache.clear();\n  }\n\n  return { state, enter, leave, forget };\n}\n","<script setup lang=\"ts\">\n/**\n * FilePane — pane:p1 THE pane. One component, rendered once per half of the\n * window.\n *\n * ⚠⚠ WHY THIS FILE EXISTS, and why adding the missing controls to the old\n * `SecondaryPane` would have been the wrong fix for the second time.\n *\n * The split view used to be two IMPLEMENTATIONS of a pane: `.fe__primary`\n * inside `FileExplorer.vue` on the left, `SecondaryPane.vue` on the right.\n * They shared the three view components and nothing else, so every control\n * that hangs off a listing had to be written twice or it existed only on the\n * left. It was written twice exactly once — the right-click menu, in July\n * 2026, after the owner reported the two halves offering different actions —\n * and the underlying shape was left alone. Two months later the right half was\n * missing six more things: the breadcrumb was a private 28-line computed\n * instead of `Breadcrumb.vue`, and there was no filter row, no view switcher,\n * no sort control, no per-folder column menu and no selection bar at all.\n *\n * So the rule this file enforces is not \"keep them in sync\". It is that there\n * is only one of them:\n *\n *     a feature added to a pane cannot miss the other pane,\n *     because there is only one pane.\n *\n * ⚠ THE THREE DIFFERENCES THAT ARE REAL. Everything else is identical by\n * construction:\n *\n *   1. **Which pane has the keyboard** — `focused`, drawn as the accent line\n *      (`.fe-pane--focus`). It is the only signal of where a shortcut lands,\n *      so it is a prop and never an internal guess.\n *   2. **Where the listing came from** — the main pane's rows are produced by\n *      the explorer's own loader, which also serves search, the trash, the\n *      panel's virtual views and encrypted folders; the split pane asks the\n *      backend for one folder. Expressed as `selfDriven`: false = the host\n *      hands over `rows` / `loading` / `error`, true = this pane runs\n *      `loadFolder()` below. Nothing else in the component branches on it.\n *   3. **Whether it can be closed** — `closable`. A window always has a main\n *      pane; the second one is the one you opened.\n *\n * ⚠ WHAT STAYS WITH THE HOST, and why none of it is pane state: the API\n * client, the clipboard, the context menu and `dispatchItemAction`, uploads,\n * quick look, the inspector, the onboarding tour's targets and the tab strip.\n * Those are properties of the WINDOW — there is one clipboard and one context\n * menu no matter how many panes are open — so a pane that owned any of them\n * would be a second window.\n *\n * ⚠ Selection is HOST-HELD and passed in, which is not a compromise: the\n * explorer routes cut/copy/paste, the inspector, the toolbar's count and every\n * keyboard shortcut through \"the active pane's selection\", so it needs to hold\n * both. It holds two instances of ONE composable (`useSelection`), which is\n * the same single-definition rule one level up. Same for the filters\n * (`lib/fileFilters`) and the sort (`lib/sortOrder`).\n *\n * ⚠⚠ THE SORT IS PER PANE and this component is what makes it so. It creates\n * its own `SortStore` and `provide()`s it, so the filter row's sort control\n * and the list view's column headers inside THIS pane drive THIS pane's order\n * — measured 2026-09-13: with the old module-level singleton, choosing\n * \"Size ↓\" in the right pane silently re-ordered the left one. The main pane\n * keeps the default store, because the explorer's per-folder view memory reads\n * and writes exactly that state.\n *\n * Unscoped styles (`fe-pane*`, and the `fe__primary` / `fe-subhead` / `fe__body`\n * classes the layout already owns) — webcomponent data-v rule.\n */\nimport { computed, inject, onBeforeUnmount, onMounted, provide, ref, watch } from 'vue';\nimport { E2E_NAME_VIEW } from '../composables/useE2eNames';\nimport { E2E_LOCK } from '../composables/useE2eLock';\nimport E2eLockScreen from './E2eLockScreen.vue';\n\nimport type { FileApi } from '../composables/useFileApi';\nimport type { ClickMod } from '../composables/useRowTouch';\nimport type { FileNode, ViewMode } from '../types/FileNode';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport {\n  filterListing,\n  injectTrashRow,\n  hydrateTrashRow,\n  isVirtualViewPath,\n} from '../lib/listing';\nimport { iconFamilyFor } from '../lib/fileIcons';\nimport { applyFilters, filtersActive, nameNeedle, type DriveFilters } from '../lib/fileFilters';\nimport { useServerNameFilter } from '../lib/nameFilter';\nimport {\n  SORT_STORE_KEY,\n  createSortStore,\n  useSortStore,\n  type ListingOrder,\n  type SortStore,\n} from '../lib/sortOrder';\nimport { hasInternalDrag, internalDragItems, internalDragOrigin } from '../lib/dragOut';\nimport Breadcrumb from './Breadcrumb.vue';\nimport FilterBar from './FilterBar.vue';\nimport ViewSwitcher from './ViewSwitcher.vue';\nimport ListView from './ListView.vue';\nimport GridView from './GridView.vue';\nimport GalleryView from './GalleryView.vue';\nimport FolderPeek from './FolderPeek.vue';\nimport { useFolderPeek } from '../composables/useFolderPeek';\n\n/** The same literals the view components hardcode for the internal DnD\n *  channel; `-src` carries the ORIGIN DIRECTORY so the host can move across\n *  panes and undo it afterwards. */\nconst FE_DND_MIME = 'application/x-brf-files';\nconst FE_DND_SRC_MIME = 'application/x-brf-files-src';\n\nexport type PaneId = 'main' | 'split';\n\nconst props = withDefaults(\n  defineProps<{\n    /** Which half this is. Also the `data-pane` hook every measurement uses. */\n    paneId: PaneId;\n    api: FileApi;\n    locale: LocaleCode;\n    /** Resolved theme — forwarded to the children whose popovers are teleported\n     *  out of `.fe`, where the token scope no longer reaches them. */\n    theme?: ThemeMode;\n    /** This pane owns the keyboard. The accent line, and nothing else. */\n    focused?: boolean;\n    /** Offer the × (the split pane). */\n    closable?: boolean;\n\n    // ── addressing ────────────────────────────────────────────────────\n    /** The pane's location, in the host's user-path form. With\n     *  `selfDriven` it is the OPENING location and this pane moves on from\n     *  there; otherwise it is the address, full stop. */\n    path: string;\n    /** true → this pane fetches its own folder (see difference 2 above). */\n    selfDriven?: boolean;\n    /** user path → wire `<adapter>://<rel>`. */\n    qualify: (p: string) => string;\n    /** wire → user path (multi-storage aware). */\n    toUser: (wire: string) => string;\n    /** rootFloor clamp — keeps the pane inside the confine. */\n    clamp: (p: string) => string;\n    /** Override for the storage crumb's label. ⚠ Optional, and normally\n     *  omitted: the pane derives it from its OWN wire path (`paneAdapter`), so\n     *  two panes sitting in two different storages each name their own. The\n     *  old right-hand pane was handed the window's label and printed \"/\" for a\n     *  folder called `thumbfix` — measured 2026-09-13, and the exact shape of\n     *  bug a second implementation produces. */\n    rootLabel?: string;\n    /** The confine in WIRE form, for `Breadcrumb`'s own floor handling. */\n    rootPath?: string;\n    /** rootFloor in user-path form ('' when unconfined). */\n    floor?: string;\n    /** Multi-storage mode: '' is the virtual drives root (no fetch). */\n    multiRoot?: boolean;\n    /** Synthesized storage rows for the virtual drives root. */\n    virtualRows?: () => FileNode[];\n    /** Mirror the virtual `.trash` row at a storage root. Defaults on. */\n    trashVisible?: boolean;\n    /** The navigation panel is already offering Trash, so no pane draws the\n     *  virtual row. Passed down rather than worked out here: the panel is a\n     *  sibling of BOTH panes, and a pane that guessed would list a row the\n     *  other one does not. */\n    navOffersTrash?: boolean;\n\n    // ── the rows, when the host drives them ───────────────────────────\n    rows?: FileNode[];\n    loading?: boolean;\n    error?: string;\n    /** Where these rows got their order (`lib/sortOrder`). A ranked answer\n     *  keeps the server's order and closes every sort control over it. */\n    order?: ListingOrder;\n\n    // ── chrome ────────────────────────────────────────────────────────\n    viewMode: ViewMode;\n    viewModes?: ViewMode[];\n    /** Draw the address row. Off for a host that supplies its own heading. */\n    showCrumbs?: boolean;\n    /** Draw the filter row (and with it the sort control). */\n    showFilterBar?: boolean;\n    /**\n     * surucu:d1-scope — `find` reduces the filter row to its name box (see\n     * `FilterBar`'s own note). The host asks for it where the BODY is not a\n     * listing of files at all — Home. It is NOT asked for at the multi-storage\n     * root: a pane knows perfectly well when it is showing the drive list\n     * (`atVirtualRoot`), and making the host say so for the main pane would\n     * leave the split pane's own drive list with four chips that narrow nothing.\n     */\n    filterMode?: 'full' | 'find';\n    /** What the name box says it narrows, already translated. Ignored at the\n     *  drive root, which names itself. */\n    findLabel?: string;\n    /** Draw the view switcher in the address row. */\n    showViewSwitcher?: boolean;\n    /** Override for what the last crumb's \"Subfolders\" chevron lists. ⚠\n     *  Optional, and normally omitted: the pane already HOLDS the folder's\n     *  listing, so it answers \"what is inside this folder\" from its own rows.\n     *  Passing it from the host is how only one pane ended up with the\n     *  chevron. */\n    crumbSubfolders?: { label: string; adapterPath: string }[];\n    /** Per-folder memory key, for the column menu's two folder rows. */\n    folderKey?: string;\n    /** Print each row's parent folder (a search, a cross-folder view). */\n    showParentPath?: boolean;\n    /** These rows are the Trash (ListView `trash`: deleted-on, deleted-from, time left). */\n    trash?: boolean;\n    /** Paths that were cut — dimmed, and never dragged. */\n    clipped?: Set<string>;\n    /** A second narrowing composed AFTER this pane's own filter row (the\n     *  advanced-search dialog's). Null when there is none. */\n    extraFilters?: DriveFilters | null;\n    /** The server already applied `extraFilters` to these rows (a search it\n     *  ran with the narrowing as parameters, task #207): the pane counts them\n     *  as on - the empty state, \"Clear\" - but does not narrow again. */\n    extraFiltersOnServer?: boolean;\n    canWrite?: boolean;\n    canPaste?: boolean;\n\n    // ── the listing's own state, held by the host ─────────────────────\n    selected: Set<string>;\n    filters: DriveFilters;\n\n    // ── forwarded to the view components ──────────────────────────────\n    thumbSrc?: (n: FileNode) => string | null;\n    /** Folder previews are on (capabilities `folder_previews`): the peek on\n     *  a resting pointer. Absent: on. The cards follow the listing, which\n     *  sends no `preview` while they are off. */\n    folderPreviews?: boolean;\n    keepBadgeFor?: (n: FileNode) => 'kept' | 'syncing' | 'cloud' | 'partial' | null;\n    starredIds?: Set<number>;\n    /** Stars the person just toggled (id -> starred), until the next answer\n     *  says it itself. The pane's own rows carry `starred` (task #207). */\n    starOverrides?: Map<number, boolean>;\n    starEnabled?: boolean;\n    apiBase?: string;\n    authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n    authCredentials?: RequestCredentials;\n    /** No reading file bytes for a card preview inside an encrypted folder. */\n    e2eActive?: boolean;\n\n    /** The host is drawing the body itself (Home, a dead deep link, the\n     *  encrypted lock screen) — those are WINDOW states with no listing\n     *  behind them, so the pane's own state chain must not also run. */\n    bodyOverride?: boolean;\n\n    /** Mouse open gesture — 'double' (single selects, double opens) or\n     *  'single' (first click opens). Touch always opens on tap; the checkbox\n     *  always selects. See onViewClick. */\n    openTrigger?: 'single' | 'double';\n  }>(),\n  {\n    showCrumbs: true,\n    showFilterBar: true,\n    showViewSwitcher: true,\n    trashVisible: true,\n    openTrigger: 'double',\n  },\n);\n\nconst emit = defineEmits<{\n  /** This pane was touched — it now owns the keyboard. */\n  (e: 'activate'): void;\n  (e: 'close'): void;\n  /** The pane's location changed (self-driven) or was asked to change. */\n  (e: 'navigate', path: string): void;\n  /** A row was double-clicked / activated. */\n  (e: 'open', node: FileNode): void;\n  /** The virtual `.trash` row was opened — the trash view carries the restore\n   *  actions and belongs to the main pane, so the host decides. */\n  (e: 'open-trash'): void;\n  (e: 'click-row', node: FileNode, mod: { ctrl: boolean; shift: boolean }): void;\n  /** Right-click. `null` = empty space (nothing selected → \"Paste\" only). */\n  (e: 'context', node: FileNode | null, ev: MouseEvent): void;\n  (e: 'clear-selection'): void;\n  (e: 'display-order', nodes: FileNode[]): void;\n  (e: 'item-drag-start', node: FileNode, ev: DragEvent): void;\n  (e: 'item-drop-into', target: FileNode, ev: DragEvent): void;\n  /** A drop on the pane background / a crumb: the host owns move-vs-copy. */\n  (e: 'transfer', p: { sources: string[]; targetWire: string; originWire?: string }): void;\n  (e: 'update:viewMode', v: ViewMode): void;\n  (e: 'update:filters', v: DriveFilters): void;\n  (e: 'crumb-context', payload: { x: number; y: number; adapterPath: string; label: string }): void;\n  (e: 'copy-path', adapterPath: string): void;\n  (e: 'crumb-drop', adapterPath: string, ev: DragEvent): void;\n  (e: 'new-folder'): void;\n  (e: 'upload'): void;\n  (e: 'paste'): void;\n  (e: 'select-all'): void;\n  (e: 'clear-filters'): void;\n  (e: 'star-change', node: FileNode, value: boolean): void;\n  /** The listing failed and the person asked for it again. */\n  (e: 'retry'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/* ── the pane's sort ───────────────────────────────────────────────────\n * ⚠⚠ The main pane keeps the DEFAULT store on purpose. The explorer's\n * per-folder view memory (`lib/viewPrefs`) restores and records through the\n * module-level `applySort` / `activeSortKey`, i.e. through that store; handing\n * the main pane a fresh one would leave the memory writing to a piece of state\n * nothing renders. The split pane gets its own, which is what makes two sort\n * controls two sorts. */\nconst sort: SortStore = props.paneId === 'main' ? useSortStore() : createSortStore();\nprovide(SORT_STORE_KEY, sort);\n\n/* ── self-driven listing (difference 2) ──────────────────────────────── */\n\nconst ownPath = ref<string>('');\nconst ownRows = ref<FileNode[]>([]);\nconst ownLoading = ref(false);\nconst ownError = ref('');\n/** koru:k1 — the folder's RBAC level as the last `index` reported it. Kept\n *  because the details panel asks the FOCUSED pane for it, and until now the\n *  split pane had no answer to give. */\nconst ownPerm = ref('');\n\nfunction isStorageRow(n: FileNode): boolean {\n  return iconFamilyFor(n) === 'storage';\n}\n\n/** THE location this pane is showing, whichever side is driving. */\n/* wiring:e2 names — provided by FileExplorer; absent when the pane is used alone. */\nconst e2eNameView = inject(E2E_NAME_VIEW, null);\n/* wiring:e2 — the explorer's lock: a self-driven pane standing inside a\n   locked encrypted folder draws the same lock screen the main pane does, and\n   the same unlock opens the folder for both (composables/useE2eLock). */\nconst e2eLock = inject(E2E_LOCK, null);\n/** The encrypted folder this pane's listing is inside ('' = none). */\nconst ownE2eRoot = ref('');\nconst paneUnlockBusy = ref(false);\nconst paneUnlockErr = ref('');\nconst paneLocked = computed(\n  () => props.selfDriven && !!e2eLock && !!ownE2eRoot.value && e2eLock.locked(ownE2eRoot.value),\n);\nasync function onPaneUnlock(password: string) {\n  if (!e2eLock || !ownE2eRoot.value || paneUnlockBusy.value) return;\n  paneUnlockBusy.value = true;\n  paneUnlockErr.value = '';\n  try {\n    const err = await e2eLock.unlock(ownE2eRoot.value, password);\n    if (err) paneUnlockErr.value = err;\n    else await loadFolder(ownPath.value);\n  } finally {\n    paneUnlockBusy.value = false;\n  }\n}\nconst panePath = computed(() => (props.selfDriven ? ownPath.value : (props.path ?? '')));\nconst paneRows = computed<FileNode[]>(() =>\n  props.selfDriven ? ownRows.value : (props.rows ?? []),\n);\nconst paneLoading = computed(() => (props.selfDriven ? ownLoading.value : !!props.loading));\nconst paneError = computed(() => (props.selfDriven ? ownError.value : (props.error ?? '')));\n\nconst atVirtualRoot = computed(\n  () => !!props.multiRoot && !(panePath.value ?? '').replace(/^\\/+|\\/+$/g, ''),\n);\n\n/**\n * One folder, through the SAME `api.index` + `lib/listing` helpers the host's\n * own loader uses — so the two panes cannot end up listing different rows for\n * the same folder (the internal-entry filter and the virtual `.trash` row are\n * both shared functions, not copies).\n */\nasync function loadFolder(target?: string): Promise<void> {\n  const requested = props.clamp(target ?? ownPath.value ?? '');\n  ownLoading.value = true;\n  ownError.value = '';\n  try {\n    // Multi-storage virtual root: synthesize the drives list, no backend call.\n    if (props.multiRoot && !requested) {\n      ownRows.value = props.virtualRows ? props.virtualRows() : [];\n      ownPerm.value = ''; /* the drive list is not a folder — no level to carry */\n      ownE2eRoot.value = '';\n      ownPath.value = '';\n      emit('navigate', '');\n      return;\n    }\n    const resp = await props.api.index(props.qualify(requested));\n    ownPerm.value = ((resp as { perm?: unknown }).perm as string) || '';\n    /* wiring:e2 names — the split pane names encrypted items the way the main\n       pane does (plaintext when unlocked, \"🔒 Encrypted item\" when not):\n       through the explorer's one name view, before the hidden-file filter. */\n    const e2eRootHere = typeof resp.e2e_root === 'string' ? resp.e2e_root : '';\n    if (e2eRootHere !== ownE2eRoot.value) paneUnlockErr.value = '';\n    ownE2eRoot.value = e2eRootHere;\n    const shown = e2eNameView ? await e2eNameView.decorate(resp.files, { root: e2eRootHere || null }) : resp.files;\n    ownRows.value = filterListing(shown);\n    if (\n      injectTrashRow(ownRows.value, resp.adapter, resp.dirname, props.trashVisible !== false, {\n        navOffersTrash: props.navOffersTrash,\n      })\n    ) {\n      void hydrateTrashRow(ownRows.value, resp.adapter, props.api);\n    }\n    ownPath.value = props.toUser(resp.dirname);\n    emit('navigate', ownPath.value);\n  } catch (err) {\n    ownError.value = err instanceof Error ? err.message : String(err);\n  } finally {\n    ownLoading.value = false;\n  }\n}\n\nif (props.selfDriven) void loadFolder(props.path ?? '');\n\n/** Navigate THIS pane. Self-driven panes fetch; a host-driven pane asks its\n *  host, which is the only thing that knows how to leave a search or a\n *  virtual view on the way. */\nfunction goTo(target: string) {\n  emit('activate');\n  if (props.selfDriven) void loadFolder(target);\n  else emit('navigate', target);\n}\n\n/* ── the address row ───────────────────────────────────────────────────\n * `Breadcrumb.vue`, not a private crumb computed. It already knows about the\n * multi-storage \"/\" crumb, the confined root, the virtual segments' labels,\n * the ✏ path editor and drops onto a crumb — all of which the old right-hand\n * pane either lacked or re-derived. */\n/**\n * ⚠⚠ A VIRTUAL VIEW IS NOT QUALIFIED, and this line is the whole of bug #1.\n *\n * `qualify()` turns a user path into `<adapter>://<rel>` for the backend, and\n * in multi-storage mode it does that by splitting the FIRST SEGMENT off as the\n * storage. Handed `.starred` it answers `.starred://` — perfectly reasonable\n * for `thumbfix`, catastrophic for a sentinel: from there the sentinel is the\n * ADAPTER, `Breadcrumb` draws it as the storage crumb, and a storage crumb is\n * never run through `virtualSegmentLabel`. The resolver was reached on every\n * render and could not possibly match. (Before tonight the host handed\n * `Breadcrumb` its own `dirname`/`adapter` refs, which the virtual views set to\n * `.starred` / `''` — unqualified — so this never arose until each pane began\n * deriving its own.)\n *\n * A view has no storage: `.recent` spans every one of them. So the wire form IS\n * the sentinel, `paneAdapter` below comes out empty, and the segment reaches\n * the resolver as a segment.\n */\nconst paneWire = computed(() =>\n  isVirtualViewPath(panePath.value) ? panePath.value : props.qualify(panePath.value),\n);\n/** The adapter THIS pane is inside. In multi-storage mode the two panes can\n *  be in different storages, so it is read off the pane's own wire path\n *  rather than taken from the window. */\nconst paneAdapter = computed(() => {\n  const w = paneWire.value;\n  const i = w.indexOf('://');\n  return i === -1 ? '' : w.slice(0, i);\n});\n\nfunction onCrumbNavigate(adapterPath: string) {\n  emit('activate');\n  if (!props.selfDriven) {\n    emit('navigate', adapterPath);\n    return;\n  }\n  // Multi-storage emits '' for the global \"/\" crumb — the virtual drives root.\n  if (props.multiRoot && !adapterPath) {\n    void loadFolder('');\n    return;\n  }\n  void loadFolder(props.toUser(adapterPath));\n}\n\n/* ── the rows this pane draws ──────────────────────────────────────────\n * The filter row's narrowing, then the host's extra one (the advanced-search\n * dialog composes with the chips rather than replacing them), then the order.\n *\n * ⚠ Sorted HERE, at the pane, and not inside each view: \"sorted by size\" is a\n * fact about the LISTING, and three components each sorting for themselves is\n * how the grid and the list drifted apart in the first place (filex #67). */\n/* Folder previews (0.50): what a folder holds, shown when the pointer rests\n   on it in the list or the grid (useFolderPeek, FolderPeek). Listed through\n   this pane's own `api.index`, so a peek shows what opening shows. */\nconst peek = useFolderPeek(\n  (path) => props.api.index(path),\n  () => props.folderPreviews !== false,\n);\nfunction peekSrc(n: FileNode): string | null {\n  return props.thumbSrc ? props.thumbSrc(n) : (n.thumb_url ?? null);\n}\nfunction peekEnd() {\n  peek.leave();\n}\n/* A new listing (a reload, a realtime change) can mean changed folders: the\n   next peek lists them again rather than answering from before. */\nwatch(paneRows, () => peek.forget());\nonMounted(() => {\n  window.addEventListener('scroll', peekEnd, true);\n  window.addEventListener('dragstart', peekEnd, true);\n  window.addEventListener('keydown', peekEnd, true);\n});\nonBeforeUnmount(() => {\n  window.removeEventListener('scroll', peekEnd, true);\n  window.removeEventListener('dragstart', peekEnd, true);\n  window.removeEventListener('keydown', peekEnd, true);\n  peek.leave();\n});\n\n/* #207 (audit D5) — \"Filter in this folder\": the server's name rule, asked\n   about the names this pane holds (lib/nameFilter: debounced, the question\n   typed past aborted, a decrypted name matched here and never sent). */\nconst nameFilter = useServerNameFilter<FileNode>(\n  () => nameNeedle(props.filters),\n  () => paneRows.value,\n  (n) => n.basename || '',\n  () => props.api.matchNames,\n);\nconst displayFiles = computed<FileNode[]>(() => {\n  const base = nameFilter.apply(applyFilters(paneRows.value, props.filters));\n  return sort.sortListing(\n    props.extraFilters && !props.extraFiltersOnServer ? applyFilters(base, props.extraFilters) : base,\n    props.order ?? 'sort',\n  );\n});\n\n/* #207 (audit D4) — which rows are starred: what each row says (`starred`,\n   the server's), what the host knows, and what the person just toggled. */\nconst paneStarredIds = computed(() => {\n  const out = new Set<number>(props.starredIds ?? []);\n  for (const n of paneRows.value) {\n    if (typeof n.id === 'number' && (n as Record<string, unknown>).starred === true) out.add(n.id);\n  }\n  for (const [id, on] of props.starOverrides ?? new Map<number, boolean>()) {\n    if (on) out.add(id);\n    else out.delete(id);\n  }\n  return out;\n});\nconst filtersOn = computed(() => filtersActive(props.filters) || !!props.extraFilters);\n\n/* surucu:d1-scope — the filter row's shape, decided HERE rather than by the\n * host, for the reason the `filterMode` prop documents: the drive list is a\n * state a pane is in, and both panes can be in it independently. */\nconst paneFilterMode = computed<'full' | 'find'>(() =>\n  atVirtualRoot.value ? 'find' : (props.filterMode ?? 'full'),\n);\nconst paneFindLabel = computed(() =>\n  atVirtualRoot.value ? t('filter.find.storages') : (props.findLabel ?? ''),\n);\n\n/* What the last crumb's chevron lists.\n *\n * ⚠ Off `paneRows`, not `displayFiles`: the chevron answers \"what is inside\n * this folder\", and a filter row that is hiding half the listing must not also\n * decide where you are allowed to navigate — a folder you cannot see is still a\n * folder you can walk into.\n * ⚠ An empty array rather than undefined when there are no subfolders: the\n * prop's presence is what draws the control, and a control that vanishes in\n * leaf folders is one nobody learns to look for. */\nconst paneSubfolders = computed(() =>\n  paneRows.value\n    .filter((f) => f.type === 'dir')\n    .map((f) => ({ label: f.basename, adapterPath: f.path })),\n);\n\n/* ── selection + activation ────────────────────────────────────────────\n * The pane never mutates the selection; it reports the gesture and the host's\n * `useSelection` instance for this pane answers. One set of Ctrl/Shift\n * semantics for both panes — the old right pane had a simplified copy in\n * which Shift behaved as Ctrl. */\n/* issue #26 — any click that is not on the checkbox OPENS, so the second click\n * of a habitual double-click lands on whatever the NEW listing put under the\n * pointer (the folder already opened on the first click). Without this guard\n * that click would open a row the user never aimed at — or tick its box — and\n * a file would open twice (two viewer tabs). */\nconst OPEN_GUARD_MS = 500;\nlet openedAt = 0;\n\nfunction withinOpenGuard(): boolean {\n  return Date.now() - openedAt < OPEN_GUARD_MS;\n}\n\nfunction onViewClick(n: FileNode, mod: ClickMod) {\n  if (withinOpenGuard()) return;\n  /* The checkbox is the one click that always reaches the selection — issue\n   * #26's rule, kept on every device and in either open mode. A shift-tick\n   * still extends the range; a plain tick toggles (ctrl: true). */\n  if (mod.check) {\n    emit('activate');\n    emit('click-row', n, { ctrl: true, shift: mod.shift });\n    return;\n  }\n  /* A finger tap always OPENS (the mobile convention — there is no\n   * hover-to-select on a touchscreen). For a mouse the host's `openTrigger`\n   * decides: 'single' opens on this click; 'double' (default) makes a single\n   * click SELECT and leaves opening to onViewDbl. issue #26's \"any click\n   * opens\" is `openTrigger: 'single'`. */\n  if (mod.touch || props.openTrigger === 'single') {\n    openedAt = Date.now();\n    onRowOpen(n);\n    return;\n  }\n  emit('activate');\n  emit('click-row', n, { ctrl: mod.ctrl, shift: mod.shift });\n}\n\nfunction onViewDbl(n: FileNode) {\n  if (withinOpenGuard()) return;\n  openedAt = Date.now();\n  onRowOpen(n);\n}\n\nfunction onViewContext(n: FileNode, ev: MouseEvent) {\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('activate');\n  emit('context', n, ev);\n}\n\n/** Right-click on genuinely empty space: a selection-less menu (\"Paste\"). The\n *  row menu calls stopPropagation, so this only fires on the background. */\nfunction onBgContext(ev: MouseEvent) {\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('activate');\n  emit('clear-selection');\n  emit('context', null, ev);\n}\n\nfunction onBgClick() {\n  emit('clear-selection');\n}\n\nfunction onRowOpen(n: FileNode) {\n  emit('activate');\n  if (n.basename === '.trash') {\n    emit('open-trash');\n    return;\n  }\n  if (n.type === 'dir' && props.selfDriven) {\n    void loadFolder(isStorageRow(n) ? n.path : props.toUser(n.path));\n    return;\n  }\n  emit('open', n);\n}\n\n/* ── drag source ───────────────────────────────────────────────────────\n * The pane writes the standard payload (the internal MIME, the ORIGIN\n * directory that makes a cross-pane move undoable, and a plain-text\n * fallback) and then hands the event on. The host can still take the drag\n * over — the desktop shell turns it into a real OS drag — which is why the\n * emit comes last and the host is free to `preventDefault`. */\nfunction onRowDragStart(n: FileNode, ev: DragEvent) {\n  if (!ev.dataTransfer) return;\n  if (isStorageRow(n) || atVirtualRoot.value || n.basename === '.trash') {\n    ev.preventDefault();\n    return;\n  }\n  const items = paneRows.value\n    .filter((f) => props.selected.has(f.path) && !isStorageRow(f))\n    .filter((f) => !props.clipped?.has(f.path))\n    .map((f) => ({ path: f.path, basename: f.basename, type: f.type }));\n  const payload = items.length > 0 ? items : [{ path: n.path, basename: n.basename, type: n.type }];\n  ev.dataTransfer.setData(FE_DND_MIME, JSON.stringify(payload));\n  ev.dataTransfer.setData(FE_DND_SRC_MIME, paneWire.value);\n  ev.dataTransfer.setData('text/plain', payload.map((i) => i.path).join('\\n'));\n  ev.dataTransfer.effectAllowed = 'move';\n  emit('item-drag-start', n, ev);\n}\n\n/* ── drop target (dir rows + the pane background) ─────────────────────── */\n\nconst dropBg = ref(false);\n\nfunction acceptDrag(ev: DragEvent): boolean {\n  return hasInternalDrag(ev);\n}\n\nfunction handleDropPayload(ev: DragEvent, targetWire: string) {\n  const items = internalDragItems(ev);\n  if (!items || !targetWire) return;\n  const origin = internalDragOrigin(ev);\n  const sources = items\n    .map((i) => i.path)\n    .filter((p) => p && p !== targetWire && !targetWire.startsWith(p + '/'));\n  if (sources.length === 0) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('transfer', { sources, targetWire, originWire: origin });\n}\n\nfunction onViewDropInto(target: FileNode, ev: DragEvent) {\n  dropBg.value = false;\n  if (target.type !== 'dir' || isStorageRow(target)) return;\n  if (!acceptDrag(ev)) return;\n  emit('item-drop-into', target, ev);\n}\n\nfunction onBgDragOver(ev: DragEvent) {\n  if (!acceptDrag(ev) || atVirtualRoot.value) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n  dropBg.value = true;\n}\n\nfunction onBgDragLeave() {\n  dropBg.value = false;\n}\n\nfunction onBgDrop(ev: DragEvent) {\n  dropBg.value = false;\n  if (!acceptDrag(ev) || atVirtualRoot.value) return;\n  handleDropPayload(ev, paneWire.value);\n}\n\n/* ── the host's handle on this pane ────────────────────────────────────\n * Keyboard routing, cut/copy/paste and the context menu all act on \"the\n * active pane\"; these are the four things the host cannot work out from its\n * own state. Both panes expose the SAME handle, so the routing in the host is\n * one branch on an id rather than two code paths. */\nfunction reload(): Promise<void> {\n  return props.selfDriven ? loadFolder() : Promise.resolve();\n}\n\nfunction goUp() {\n  const cur = (panePath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n  const floor = (props.floor || '').replace(/^\\/+|\\/+$/g, '');\n  if (!cur || cur === floor) return;\n  const idx = cur.lastIndexOf('/');\n  goTo(idx === -1 ? '' : cur.slice(0, idx));\n}\n\nfunction getPath(): string {\n  return panePath.value;\n}\n\n/** What is on screen, in the order it is drawn — the list a Select-all or a\n *  Shift-range has to be arithmetic over. */\nfunction visibleNodes(): FileNode[] {\n  return displayFiles.value.filter((n) => !isStorageRow(n));\n}\n\n/**\n * How many rows this pane's folder holds — BEFORE the filter row narrows them,\n * which is what \"12 items\" in the details panel means (`visibleNodes()` is the\n * other question: what is drawn right now).\n */\nfunction rowCount(): number {\n  return paneRows.value.length;\n}\n\n/**\n * The paths this pane's folder HOLDS — unfiltered, and that is the point.\n *\n * ⚠ Not `visibleNodes()`. The one caller asks \"does this row still exist?\", and\n * `visibleNodes()` answers \"is this row currently drawn?\" — two different\n * questions that only agree while the filter row is empty. Answering the first\n * with the second would make typing in the filter box look exactly like a\n * deletion to whoever is asking.\n */\nfunction rowPaths(): string[] {\n  return paneRows.value.map((n) => n.path);\n}\n\n/**\n * koru:k1 — the RBAC level of the folder this pane is in, '' when ACL is not\n * enforced (or when the host drives the rows: it answered the request, so it\n * is holding the `perm` this pane never saw).\n */\nfunction dirPerm(): string {\n  return props.selfDriven ? ownPerm.value : '';\n}\n\n/**\n * wiring:e2 - the encrypted folder this pane's listing is inside, '' for none\n * (or when the host drives the rows: the host knows its own). The details\n * panel asks it so its \"Create link\" follows the Share row (lib/e2eLinks).\n */\nfunction e2eRoot(): string {\n  return props.selfDriven ? ownE2eRoot.value : '';\n}\n\ndefineExpose({ reload, goUp, getPath, visibleNodes, loadFolder, rowCount, rowPaths, dirPerm, e2eRoot });\n\n/* A host-driven pane whose address moved (a tab switch, a search) has to drop\n * any drop-highlight it was showing; nothing else here is stateful across a\n * navigation. */\nwatch(panePath, () => {\n  dropBg.value = false;\n});\n</script>\n\n<template>\n  <section\n    class=\"fe__primary fe-pane\"\n    :class=\"{\n      'fe-pane--focus': focused,\n      'fe-pane--split': paneId === 'split',\n      'fe-pane--dropover': dropBg,\n    }\"\n    :data-pane=\"paneId\"\n    :data-testid=\"`pane-${paneId}`\"\n    role=\"region\"\n    :aria-label=\"paneId === 'split' ? t('split.pane') : t('toolbar.view_label')\"\n    @pointerdown.capture=\"emit('activate')\"\n  >\n    <!-- The address row. `Breadcrumb.vue` in BOTH panes — the right-hand half\n         used to draw a private crumb strip that knew nothing about the\n         multi-storage root, the confine, the ✏ editor or crumb drops.\n\n         ⚠ Not drawn when it would be EMPTY. Home asks for no crumbs (its cards\n         come from every folder in every storage, so a trail would have to name\n         one) and no view switcher, and as of 2026-09-13 it supplies no heading\n         either — so without this guard the page opened with a 38px bordered\n         strip containing nothing, which reads as a rendering fault rather than\n         as a design. -->\n    <div v-if=\"showCrumbs || !!$slots.heading || showViewSwitcher || closable\" class=\"fe-subhead\">\n      <slot name=\"heading\">\n        <Breadcrumb\n          v-if=\"showCrumbs\"\n          :dirname=\"paneWire\"\n          :adapter=\"paneAdapter\"\n          :root-label=\"rootLabel || paneAdapter\"\n          :locale=\"locale\"\n          :multi-storage-root=\"multiRoot\"\n          :root-path=\"rootPath\"\n          :subfolders=\"crumbSubfolders ?? paneSubfolders\"\n          @navigate=\"onCrumbNavigate\"\n          @copy-path=\"(p: string) => emit('copy-path', p)\"\n          @crumb-context=\"(p) => emit('crumb-context', p)\"\n          @crumb-drop=\"(p: string, ev: DragEvent) => emit('crumb-drop', p, ev)\"\n        />\n      </slot>\n      <div class=\"fe-subhead__actions\">\n        <ViewSwitcher\n          v-if=\"showViewSwitcher\"\n          :view-mode=\"viewMode\"\n          :locale=\"locale\"\n          :modes=\"viewModes\"\n          @update:view-mode=\"(v: ViewMode) => { emit('activate'); emit('update:viewMode', v); }\"\n        />\n        <button\n          v-if=\"closable\"\n          type=\"button\"\n          class=\"fe-btn fe-btn--icon-only fe-pane__close\"\n          :title=\"t('split.close')\"\n          :aria-label=\"t('split.close')\"\n          data-testid=\"pane-close\"\n          @click=\"emit('close')\"\n        >\n          <svg\n            class=\"fe-ficon\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"1.8\"\n            stroke-linecap=\"round\"\n            aria-hidden=\"true\"\n            focusable=\"false\"\n          >\n            <path d=\"M6 6l12 12M18 6L6 18\" />\n          </svg>\n        </button>\n      </div>\n    </div>\n\n    <!-- Where the selection bar lands. Rendered by the pane, declaratively and\n         in the right place, because the row above it only exists after the\n         first tab is seeded — a node inserted by script would end up above it\n         for the rest of the session. The filter row hides behind\n         `.fe-selbar-slot.is-active ~ .fe-filterbar`. -->\n    <div class=\"fe-selbar-slot\"></div>\n\n    <!-- ⚠ No `&& !atVirtualRoot` any more. The drive list KEEPS this row — it\n         is the one place a person can narrow a long list of storages by name —\n         but as the name box alone (`paneFilterMode`), because a drive answers\n         none of the four chips. -->\n    <FilterBar\n      v-if=\"showFilterBar\"\n      :value=\"filters\"\n      :locale=\"locale\"\n      :theme=\"theme\"\n      :mode=\"paneFilterMode\"\n      :find-label=\"paneFindLabel\"\n      :order=\"order\"\n      :shown=\"displayFiles.length\"\n      :total=\"paneRows.length\"\n      :files=\"paneRows\"\n      :can-paste=\"canPaste\"\n      :can-write=\"canWrite\"\n      @update:value=\"(v: DriveFilters) => { emit('activate'); emit('update:filters', v); }\"\n      @new-folder=\"emit('activate'); emit('new-folder')\"\n      @upload=\"emit('activate'); emit('upload')\"\n      @paste=\"emit('activate'); emit('paste')\"\n      @select-all=\"emit('activate'); emit('select-all')\"\n    />\n\n    <!-- Strips that belong to the WINDOW's state rather than to the listing\n         (live presence, the encrypted-folder banners, the trash banner). Only\n         the host can know about them, so it puts them here. -->\n    <slot name=\"banners\"></slot>\n\n    <div\n      class=\"fe__body\"\n      :class=\"{ 'is-dropover': dropBg }\"\n      @click.self=\"onBgClick\"\n      @contextmenu=\"onBgContext\"\n      @dragover=\"onBgDragOver\"\n      @dragleave=\"onBgDragLeave\"\n      @drop=\"onBgDrop\"\n    >\n      <!-- The host draws the body itself for the states that have no listing\n           behind them (Home, a dead deep link, the lock screen). -->\n      <slot v-if=\"bodyOverride\" name=\"body\"></slot>\n\n      <!-- wiring:e2 — inside a locked encrypted folder: its lock screen, not\n           rows of \"🔒 Encrypted item\". -->\n      <E2eLockScreen\n        v-else-if=\"paneLocked\"\n        compact\n        :locale=\"locale\"\n        :busy=\"paneUnlockBusy\"\n        :error=\"paneUnlockErr\"\n        @unlock=\"onPaneUnlock\"\n        @recovery=\"e2eLock?.recovery(ownE2eRoot)\"\n      />\n\n      <!-- Initial load: skeleton ghosts (view-mode aware) instead of an\n           empty/\"no files\" flash. Only when there is nothing yet — navigation\n           keeps the current list. -->\n      <div v-else-if=\"paneLoading && paneRows.length === 0\" class=\"fe__skeleton\" role=\"status\">\n        <span class=\"fe-sr-only\">{{ t('loading') }}</span>\n        <div v-if=\"viewMode !== 'list'\" class=\"fe-skel-grid\" aria-hidden=\"true\">\n          <div v-for=\"i in 8\" :key=\"i\" class=\"fe-skel-card\">\n            <div class=\"fe-skel fe-skel--thumb\"></div>\n            <div class=\"fe-skel fe-skel--label\"></div>\n          </div>\n        </div>\n        <div v-else class=\"fe-skel-list\" aria-hidden=\"true\">\n          <div v-for=\"i in 8\" :key=\"i\" class=\"fe-skel-row\">\n            <div class=\"fe-skel fe-skel--icon\"></div>\n            <div class=\"fe-skel fe-skel--name\"></div>\n            <div class=\"fe-skel fe-skel--size\"></div>\n            <div class=\"fe-skel fe-skel--date\"></div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Listing failed with nothing else to show: a retryable error state in\n           the same visual language, in BOTH panes. The right-hand half used to\n           print one unstyled line and a bare button. -->\n      <div v-else-if=\"paneError && paneRows.length === 0\" class=\"fe-state\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"110\"\n          height=\"92\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <circle cx=\"60\" cy=\"50\" r=\"28\" />\n          <path d=\"M60 36v18\" />\n          <circle cx=\"60\" cy=\"63\" r=\"1.8\" fill=\"currentColor\" stroke=\"none\" />\n          <path d=\"M24 88h72\" stroke-dasharray=\"3 5\" />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('error.title') }}</p>\n        <p class=\"fe-state__hint\">{{ t('error.hint') }}</p>\n        <div class=\"fe-state__actions\">\n          <button\n            type=\"button\"\n            class=\"fe-btn fe-btn--primary\"\n            @click=\"selfDriven ? loadFolder() : emit('retry')\"\n          >\n            {{ t('error.retry') }}\n          </button>\n        </div>\n        <details class=\"fe-state__details\">\n          <summary class=\"fe-state__details-summary\">{{ t('error.details') }}</summary>\n          <pre class=\"fe-state__details-pre\">{{ paneError }}</pre>\n        </details>\n      </div>\n\n      <!-- The folder HAS rows and the filters hid all of them. \"This folder is\n           empty\" would be false, and the way back is the chip row just above,\n           so the message names it and offers the button. -->\n      <div\n        v-else-if=\"!paneLoading && filtersOn && displayFiles.length === 0 && paneRows.length > 0\"\n        class=\"fe-state\"\n        data-testid=\"empty-filtered\"\n      >\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"110\"\n          height=\"92\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <path d=\"M26 28h68L68 58v24l-16 8V58z\" />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('filter.empty.title') }}</p>\n        <p class=\"fe-state__hint\">{{ t('filter.empty.hint') }}</p>\n        <div class=\"fe-state__actions\">\n          <button type=\"button\" class=\"fe-btn\" @click=\"emit('clear-filters')\">\n            {{ t('filter.clear') }}\n          </button>\n        </div>\n      </div>\n\n      <!-- Loaded, zero rows: the host's own empty state when it has one to\n           offer (an empty search, an empty panel view, an empty trash), this\n           pane's plain one otherwise. -->\n      <slot\n        v-else-if=\"!paneLoading && paneRows.length === 0\"\n        name=\"empty\"\n      >\n        <div class=\"fe-state\">\n          <svg\n            class=\"fe-state__art\"\n            viewBox=\"0 0 120 100\"\n            width=\"110\"\n            height=\"92\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"2\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n            aria-hidden=\"true\"\n          >\n            <path d=\"M18 36v42a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6V44a6 6 0 0 0-6-6H62l-9-10H24a6 6 0 0 0-6 6z\" />\n          </svg>\n          <p class=\"fe-state__title\">{{ t('empty.folder') }}</p>\n        </div>\n      </slot>\n\n      <ListView\n        v-else-if=\"viewMode === 'list'\"\n        :files=\"displayFiles\"\n        :order=\"order\"\n        :selected=\"selected\"\n        :clipped=\"clipped\"\n        :show-parent-path=\"showParentPath\"\n        :trash=\"trash\"\n        :locale=\"locale\"\n        :loading=\"paneLoading\"\n        :folder-key=\"folderKey\"\n        :theme=\"theme\"\n        :thumb-src=\"thumbSrc\"\n        :keep-badge-for=\"keepBadgeFor\"\n        :starred-ids=\"paneStarredIds\"\n        :star-enabled=\"starEnabled\"\n        :api-base=\"apiBase\"\n        :auth-headers=\"authHeaders\"\n        :auth-credentials=\"authCredentials\"\n        @click-row=\"onViewClick\"\n        @display-order=\"(nodes: FileNode[]) => emit('display-order', nodes)\"\n        @dbl-row=\"onViewDbl\"\n        @context-row=\"onViewContext\"\n        @item-drag-start=\"onRowDragStart\"\n        @item-drop-into=\"onViewDropInto\"\n        @star-change=\"(n: FileNode, v: boolean) => emit('star-change', n, v)\"\n        @peek=\"peek.enter\"\n        @peek-end=\"peekEnd\"\n      />\n      <GridView\n        v-else-if=\"viewMode === 'grid'\"\n        :files=\"displayFiles\"\n        :order=\"order\"\n        :sections=\"true\"\n        :selected=\"selected\"\n        :clipped=\"clipped\"\n        :show-parent-path=\"showParentPath\"\n        :locale=\"locale\"\n        :loading=\"paneLoading\"\n        :keep-badge-for=\"keepBadgeFor\"\n        :thumb-src=\"thumbSrc\"\n        :e2e-active=\"e2eActive\"\n        :starred-ids=\"paneStarredIds\"\n        :star-enabled=\"starEnabled\"\n        :api-base=\"apiBase\"\n        :auth-headers=\"authHeaders\"\n        :auth-credentials=\"authCredentials\"\n        @click-card=\"onViewClick\"\n        @display-order=\"(nodes: FileNode[]) => emit('display-order', nodes)\"\n        @dbl-card=\"onViewDbl\"\n        @context-card=\"onViewContext\"\n        @item-drag-start=\"onRowDragStart\"\n        @item-drop-into=\"onViewDropInto\"\n        @star-change=\"(n: FileNode, v: boolean) => emit('star-change', n, v)\"\n        @peek=\"peek.enter\"\n        @peek-end=\"peekEnd\"\n      />\n      <GalleryView\n        v-else\n        :files=\"displayFiles\"\n        :order=\"order\"\n        :selected=\"selected\"\n        :clipped=\"clipped\"\n        :show-parent-path=\"showParentPath\"\n        :locale=\"locale\"\n        :loading=\"paneLoading\"\n        :thumb-src=\"thumbSrc\"\n        :e2e-active=\"e2eActive\"\n        :starred-ids=\"paneStarredIds\"\n        :star-enabled=\"starEnabled\"\n        :api-base=\"apiBase\"\n        :auth-headers=\"authHeaders\"\n        :auth-credentials=\"authCredentials\"\n        @click-card=\"onViewClick\"\n        @dbl-card=\"onViewDbl\"\n        @context-card=\"onViewContext\"\n        @item-drag-start=\"onRowDragStart\"\n        @item-drop-into=\"onViewDropInto\"\n        @star-change=\"(n: FileNode, v: boolean) => emit('star-change', n, v)\"\n      />\n    </div>\n    <FolderPeek :state=\"peek.state.value\" :src-of=\"peekSrc\" :locale=\"locale\" />\n  </section>\n</template>\n","/**\n * useTabs — wiring:d1 tabs (the workspace tab strip).\n *\n * A LAYER ABOVE FileExplorer's location state, never a replacement for\n * it: each tab is a location snapshot `{ id, path, viewMode, split }`.\n * The composable performs no fetching and owns no navigation — the host\n * activates a tab by running its EXISTING `load(path)` pipeline and\n * reports navigations back through `syncActive()`, which keeps the\n * active snapshot glued to wherever the user actually is.\n *\n * `path` is stored in the SAME form as FileExplorer's `currentPath`\n * (virtual `<storage>/<rel>` in multi-storage mode, bare relative path\n * in single-storage mode) — i.e. the exact string `load(path)` accepts.\n * Storing the wire form (`adapter://rel`) instead would break the\n * rootPath-floor clamp inside load() (the floor is compared in user-path\n * form), so the user-path form is deliberate.\n *\n * Persistence: localStorage under a host-supplied key (the host derives\n * it from the pathPersist scope: disabled when `pathPersist: 'none'`,\n * suffixed with the rootPath confine so embedded instances with\n * different confines never clobber each other). Schema:\n *\n *   { \"v\": 1, \"active\": \"<id>\",\n *     \"tabs\": [ { \"id\", \"path\", \"viewMode\", \"split\": {\"path\"}|null } ] }\n */\n\nimport { computed, ref, watch, type Ref } from 'vue';\nimport type { ViewMode } from '../types/FileNode';\nimport { newId } from '../lib/uid';\n\n/** Per-tab split state — the secondary pane's own location. */\nexport interface TabSplit {\n  path: string;\n  /** ui-fix — the pane's OWN view mode (list/grid/gallery); undefined\n   *  inherits the main panel's mode at split time. */\n  viewMode?: ViewMode;\n}\n\nexport interface TabState {\n  id: string;\n  /** Location snapshot in `currentPath` form (see module docs). */\n  path: string;\n  viewMode: ViewMode;\n  split: TabSplit | null;\n}\n\nexport interface UseTabsOptions {\n  /** localStorage key; null disables persistence entirely. */\n  storageKey: string | null;\n}\n\nexport function useTabs(opts: UseTabsOptions) {\n  const tabs: Ref<TabState[]> = ref([]);\n  const activeId = ref<string>('');\n\n  const activeTab = computed<TabState | null>(\n    () => tabs.value.find((t) => t.id === activeId.value) ?? null,\n  );\n  const activeIndex = computed(() => tabs.value.findIndex((t) => t.id === activeId.value));\n  const hasMultiple = computed(() => tabs.value.length > 1);\n\n  // ------------------------------------------------------------------\n  // Persistence\n  // ------------------------------------------------------------------\n\n  /** Restore from storage. Returns true when at least one tab loaded. */\n  function restore(): boolean {\n    if (!opts.storageKey) return false;\n    try {\n      const raw = localStorage.getItem(opts.storageKey);\n      if (!raw) return false;\n      const parsed = JSON.parse(raw) as { v?: unknown; active?: unknown; tabs?: unknown };\n      if (!parsed || !Array.isArray(parsed.tabs) || parsed.tabs.length === 0) return false;\n      const clean: TabState[] = [];\n      for (const t of parsed.tabs as Array<Record<string, unknown>>) {\n        if (!t || typeof t.path !== 'string') continue;\n        // ViewMode is validated loosely on purpose: future modes (e.g. the\n        // gallery wave) must survive a round-trip through an older schema.\n        const vm =\n          typeof t.viewMode === 'string' && t.viewMode ? (t.viewMode as ViewMode) : 'list';\n        const rawSplit = t.split as { path?: unknown; viewMode?: unknown } | null | undefined;\n        const split =\n          rawSplit && typeof rawSplit === 'object' && typeof rawSplit.path === 'string'\n            ? {\n                path: rawSplit.path,\n                viewMode:\n                  typeof rawSplit.viewMode === 'string' && rawSplit.viewMode\n                    ? (rawSplit.viewMode as ViewMode)\n                    : undefined,\n              }\n            : null;\n        clean.push({\n          id: typeof t.id === 'string' && t.id ? t.id : newId(),\n          path: t.path,\n          viewMode: vm,\n          split,\n        });\n      }\n      if (clean.length === 0) return false;\n      tabs.value = clean;\n      activeId.value = clean.some((t) => t.id === parsed.active)\n        ? String(parsed.active)\n        : clean[0].id;\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  function persist(): void {\n    if (!opts.storageKey) return;\n    try {\n      localStorage.setItem(\n        opts.storageKey,\n        JSON.stringify({ v: 1, active: activeId.value, tabs: tabs.value }),\n      );\n    } catch {\n      /* private mode / quota */\n    }\n  }\n\n  watch([tabs, activeId], persist, { deep: true });\n\n  // ------------------------------------------------------------------\n  // Mutations\n  // ------------------------------------------------------------------\n\n  /** Create the first tab (no-op once any tab exists). */\n  function seed(path: string, viewMode: ViewMode): void {\n    if (tabs.value.length > 0) return;\n    const t: TabState = { id: newId(), path, viewMode, split: null };\n    tabs.value = [t];\n    activeId.value = t.id;\n  }\n\n  /** Update the ACTIVE tab's snapshot (navigation / view-mode change). */\n  function syncActive(patch: Partial<Pick<TabState, 'path' | 'viewMode'>>): void {\n    const t = activeTab.value;\n    if (!t) return;\n    if (patch.path !== undefined) t.path = patch.path;\n    if (patch.viewMode !== undefined) t.viewMode = patch.viewMode;\n  }\n\n  /** Open a new tab right after the active one (browser convention). */\n  function openTab(\n    path: string,\n    o: { viewMode: ViewMode; background?: boolean; split?: TabSplit | null },\n  ): TabState {\n    const t: TabState = { id: newId(), path, viewMode: o.viewMode, split: o.split ?? null };\n    const idx = activeIndex.value;\n    tabs.value.splice(idx === -1 ? tabs.value.length : idx + 1, 0, t);\n    if (!o.background) activeId.value = t.id;\n    return t;\n  }\n\n  /**\n   * Close a tab. The last remaining tab never closes. Returns the tab\n   * the host must ACTIVATE (right neighbour, else left) when the active\n   * one was closed; null when the visible location is unchanged.\n   */\n  function closeTab(id: string): TabState | null {\n    if (tabs.value.length <= 1) return null;\n    const idx = tabs.value.findIndex((t) => t.id === id);\n    if (idx === -1) return null;\n    const wasActive = tabs.value[idx].id === activeId.value;\n    tabs.value.splice(idx, 1);\n    if (!wasActive) return null;\n    const next = tabs.value[Math.min(idx, tabs.value.length - 1)];\n    activeId.value = next.id;\n    return next;\n  }\n\n  /** Make a tab active. Returns it when the active tab actually changed. */\n  function activate(id: string): TabState | null {\n    const t = tabs.value.find((x) => x.id === id);\n    if (!t || t.id === activeId.value) return null;\n    activeId.value = t.id;\n    return t;\n  }\n\n  /** Cycle: +1 = next, -1 = previous (wraps). */\n  function step(delta: number): TabState | null {\n    if (tabs.value.length < 2) return null;\n    const idx = activeIndex.value === -1 ? 0 : activeIndex.value;\n    const next = tabs.value[(idx + delta + tabs.value.length) % tabs.value.length];\n    return activate(next.id);\n  }\n\n  /** Drag-sort support: move the tab at `from` to position `to`. */\n  function move(from: number, to: number): void {\n    if (from === to) return;\n    if (from < 0 || to < 0 || from >= tabs.value.length || to >= tabs.value.length) return;\n    const list = [...tabs.value];\n    const [t] = list.splice(from, 1);\n    list.splice(to, 0, t);\n    tabs.value = list;\n  }\n\n  /** Set (or clear with null) the ACTIVE tab's split state. */\n  function setSplit(split: TabSplit | null): void {\n    const t = activeTab.value;\n    if (!t) return;\n    t.split = split;\n  }\n\n  return {\n    tabs,\n    activeId,\n    activeTab,\n    activeIndex,\n    hasMultiple,\n    restore,\n    seed,\n    syncActive,\n    openTab,\n    closeTab,\n    activate,\n    step,\n    move,\n    setSplit,\n  };\n}\n\nexport type TabsApi = ReturnType<typeof useTabs>;\n","/**\n * e2enamepass — give every entry of an encrypted-names folder the name it\n * should have (docs/E2E-ENCRYPTION.md → \"Encryption levels\").\n *\n * One pass does three jobs, because they are one job seen from the server:\n *\n *   - raising a folder from level 1 (contents) to level 2 (contents + names):\n *     every entry still has its plaintext name;\n *   - finishing that after an interruption: some entries do, some do not;\n *   - repairing what arrived from outside the browser: a name written over\n *     WebDAV (plaintext), or an entry MOVED over WebDAV into another folder\n *     of the same encrypted folder — its name is sealed for the folder it\n *     came from (lib/e2enames → folder ids), so here it does not open. The\n *     pass knows every folder id, tries them, and re-seals the name it finds\n *     for the folder the entry is in now.\n *\n * Renames only: no content is read or written. Idempotent: an entry whose\n * name opens where it is is left alone, and a plaintext-named folder's id is\n * derived (the same every time), so running the pass again after a stop\n * continues it. Folders go top-down to learn ids and bottom-up to rename, so\n * a folder's contents are sealed under its id before the folder itself is\n * renamed, and a queued folder rename never races its own contents.\n *\n * Pure over an `io` object, so it runs against a fake tree in the tests and\n * against the file API in the explorer.\n */\n\nimport { E2E_MARKER_NAME } from './e2ecrypto';\nimport {\n  classifyStoredName,\n  decryptEncoded,\n  decryptStoredName,\n  effectiveDirId,\n  encryptName,\n  namePlainProblem,\n  type E2eNameKey,\n} from './e2enames';\n\nexport interface NamePassRow {\n  path: string;\n  basename: string;\n  type: 'file' | 'dir';\n}\n\nexport interface NamePassIo {\n  /** The raw listing of a folder (stored names, not decorated). */\n  list(dirWire: string): Promise<NamePassRow[]>;\n  /** A sibling sidecar's content, or null when there is none. */\n  readSidecar(dirWire: string, sidecarName: string): Promise<string | null>;\n  writeSidecar(dirWire: string, sidecarName: string, content: string): Promise<void>;\n  /** Rename `row` (in `dirWire`) to the stored name `to`. */\n  rename(dirWire: string, row: NamePassRow, to: string): Promise<void>;\n  /** Asked between entries: stop as soon as this says so. */\n  stopped(): boolean;\n}\n\nexport interface NamePassProgress {\n  /** Entries renamed so far. */\n  renamed: number;\n  /** Entries that could not be renamed (no permission, a name a disk cannot\n   *  hold, a name that cannot be read at all). */\n  failed: number;\n  /** Entries found needing a name. */\n  seen: number;\n  /** Of `renamed`, entries that had been moved without being re-sealed. */\n  repaired?: number;\n}\n\n/** \"name (2).ext\" — a free plaintext name when the one we need is taken. */\nexport function numberedName(name: string, n: number): string {\n  const dot = name.lastIndexOf('.');\n  if (dot <= 0) return `${name} (${n})`;\n  return `${name.slice(0, dot)} (${n})${name.slice(dot)}`;\n}\n\nfunction sameId(a: Uint8Array, b: Uint8Array): boolean {\n  if (a.length !== b.length) return false;\n  for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n  return true;\n}\n\n/**\n * The plaintext of a name sealed for another folder of this encrypted folder\n * (an entry moved over WebDAV), or null. Tries every folder id the pass\n * knows; a name only ever opens under the one it was sealed for.\n */\nasync function recoverMoved(\n  nk: E2eNameKey,\n  encoded: string | null,\n  here: Uint8Array,\n  ids: Uint8Array[],\n): Promise<string | null> {\n  if (!encoded) return null;\n  for (const id of ids) {\n    if (sameId(id, here)) continue;\n    const plain = await decryptEncoded(nk, encoded, id);\n    if (plain !== null) return namePlainProblem(plain) ? null : plain;\n  }\n  return null;\n}\n\n/** The encoded ciphertext a stored name carries, through its sidecar for a long one. */\nasync function encodedOf(stored: string, dirWire: string, io: NamePassIo): Promise<string | null> {\n  const c = classifyStoredName(stored);\n  if (c.kind === 'file' || c.kind === 'dir') return c.encoded ?? null;\n  if (c.kind !== 'long' && c.kind !== 'longdir') return null;\n  const content = (await io.readSidecar(dirWire, `${c.hash}.fxl.name`))?.trim() ?? '';\n  return content || null;\n}\n\nexport async function runNamePass(\n  nk: E2eNameKey,\n  rootWire: string,\n  io: NamePassIo,\n  prog: NamePassProgress,\n): Promise<void> {\n  // 1. Every folder once, top-down, with the id its contents are sealed under.\n  const dirs: Array<{ wire: string; id: Uint8Array; rows: NamePassRow[] }> = [];\n  const queue: Array<{ wire: string; id: Uint8Array }> = [{ wire: rootWire, id: nk.rootId }];\n  while (queue.length) {\n    if (io.stopped()) return;\n    const d = queue.shift()!;\n    let rows: NamePassRow[];\n    try {\n      rows = await io.list(d.wire);\n    } catch {\n      prog.failed++;\n      continue;\n    }\n    dirs.push({ ...d, rows });\n    for (const r of rows) {\n      if (r.type !== 'dir') continue;\n      queue.push({ wire: r.path, id: await effectiveDirId(nk, d.id, r.basename) });\n    }\n  }\n  const ids = dirs.map((d) => d.id);\n\n  // 2. Deepest folders first (a breadth-first list, reversed).\n  for (const d of dirs.reverse()) {\n    const taken = new Set(d.rows.map((r) => r.basename));\n    for (const row of d.rows) {\n      if (io.stopped()) return;\n      const stored = row.basename;\n      if (stored === E2E_MARKER_NAME) continue;\n      const got = await decryptStoredName(nk, stored, d.id, (n) => io.readSidecar(d.wire, n));\n      if (got.state === 'enc' || got.state === 'sidecar') continue;\n      prog.seen++;\n      const moved = await recoverMoved(nk, await encodedOf(stored, d.wire, io), d.id, ids);\n      const plain = moved ?? (got.state === 'plain' ? stored : null);\n      if (plain === null || namePlainProblem(plain)) {\n        prog.failed++;\n        continue;\n      }\n      // A folder keeps the id its contents are already sealed under.\n      const opts = row.type === 'dir' ? { dirId: await effectiveDirId(nk, d.id, stored) } : {};\n      let enc = await encryptName(nk, plain, d.id, opts);\n      // Taken: something was written under this very name after the change\n      // began. Keep both, the way an upload conflict would be kept.\n      for (let i = 2; taken.has(enc.stored) && i < 100; i++) {\n        enc = await encryptName(nk, numberedName(plain, i), d.id, opts);\n      }\n      if (taken.has(enc.stored)) {\n        prog.failed++;\n        continue;\n      }\n      try {\n        if (enc.sidecar) await io.writeSidecar(d.wire, enc.sidecar.name, enc.sidecar.content);\n        await io.rename(d.wire, row, enc.stored);\n        taken.delete(stored);\n        taken.add(enc.stored);\n        prog.renamed++;\n        if (moved !== null) prog.repaired = (prog.repaired ?? 0) + 1;\n      } catch {\n        prog.failed++;\n      }\n    }\n  }\n}\n","/**\n * e2econvert — encrypt a folder that already exists, in place\n * (docs/E2E-ENCRYPTION.md → \"Encrypting a folder you already have\").\n *\n * The key file is written first (e2ecrypto `startConversion`: v3, `conv`\n * required and pending), which makes the folder an encrypted folder to the\n * server from that moment. Then this walks it: every file whose bytes do not\n * start with the `filexe2e` magic is read, encrypted under the folder key and\n * written back over itself as a CONVERSION WRITE — one the server keeps no\n * version of, because what it replaces is the plaintext being removed.\n *\n * A file over the one-shot limit (200 MB) is converted too, as a STREAM\n * (header 0x02) file read, encrypted and written as streams (`writeLarge`);\n * it is left as it is only where the server cannot take it from a browser.\n *\n * Idempotent and resumable by the magic: a file already converted is left\n * alone, so running this again after a stop, a reload or a failure continues\n * it. A large file stopped half-way is not half-converted: its write is one\n * upload that replaces the file only when it commits, so until then the\n * server still has the whole plaintext and the next run starts it over. A write is conditional on the file being the one that was listed\n * (`expect`), so a file changed meanwhile is not overwritten with an older\n * version of itself — it counts as failed, and the next run picks it up.\n *\n * Names are not touched here: at level 2 the name pass (lib/e2enamepass)\n * runs after it. Pure over an `io` object, like the name pass.\n */\n\nimport { E2E_MARKER_NAME, hasMagic } from './e2ecrypto';\nimport { classifyStoredName } from './e2enames';\n\nexport interface ConvertRow {\n  path: string;\n  basename: string;\n  type: 'file' | 'dir';\n  /** Bytes, as listed. */\n  size?: number;\n  /** Milliseconds, as listed — with the size, the write's precondition. */\n  last_modified?: number;\n}\n\nexport interface ConvertIo {\n  /** The raw listing of a folder. */\n  list(dirWire: string): Promise<ConvertRow[]>;\n  /** The first bytes of a file (at least 9 when it has them). */\n  head(wire: string): Promise<Uint8Array>;\n  /** The whole file. */\n  read(wire: string): Promise<ArrayBuffer>;\n  /**\n   * Write `data` over the file `row` in `dirWire` as a conversion write, on\n   * condition that it is still the file listed (`expect`: \"<size>:<ms>\").\n   * Throws when the server refuses (a changed file: 412).\n   */\n  write(dirWire: string, row: ConvertRow, data: Blob, expect: string | null): Promise<void>;\n  /** Encrypt one file's bytes under the folder key. */\n  encrypt(data: ArrayBuffer): Promise<ArrayBuffer>;\n  /**\n   * A file over `maxBytes` (the one-shot limit): read, encrypted as a STREAM\n   * (header 0x02) file and written over itself as a conversion write on the\n   * same condition as `write` - all as streams, so memory stays at a few\n   * chunks whatever the size. Resolves false when this server cannot take it\n   * from this browser (no staged upload, and too big to gather for a single\n   * POST); throws when it failed (changed meanwhile: 412, no permission, …).\n   * Absent: such files are left as they are and counted in `tooBig`.\n   */\n  writeLarge?(dir: string, row: ConvertRow, expect: string | null): Promise<boolean>;\n  /** Asked between files. */\n  stopped(): boolean;\n}\n\nexport interface ConvertProgress {\n  /** Files found (everything but the key file and name sidecars). */\n  total: number;\n  /** Converted by this run. */\n  done: number;\n  /** Already encrypted — converted earlier, or uploaded encrypted. */\n  skipped: number;\n  /**\n   * Over the one-shot limit and NOT converted: this server cannot take a file\n   * sent in pieces, and it is too big to gather for one POST (or the caller\n   * has no streamed write at all). Left as they are.\n   */\n  tooBig: number;\n  /** Of `done`, files over the one-shot limit, written as STREAM (0x02). */\n  large?: number;\n  /** Could not be read or written (changed meanwhile, no permission, …). */\n  failed: number;\n}\n\nexport interface ConvertOptions {\n  /** The one-shot limit: files larger than this go through `io.writeLarge`\n   *  (STREAM, 0x02), or are counted in `tooBig` when there is none. */\n  maxBytes: number;\n}\n\n/** \"<size>:<ms>\" — the listing's own signature of the file, or null. */\nexport function expectOf(row: ConvertRow): string | null {\n  if (typeof row.size !== 'number' || typeof row.last_modified !== 'number') return null;\n  return `${row.size}:${row.last_modified}`;\n}\n\nexport async function runConversion(\n  rootWire: string,\n  io: ConvertIo,\n  prog: ConvertProgress,\n  opts: ConvertOptions,\n): Promise<void> {\n  // 1. The files, all of them first: the progress has a total.\n  const files: Array<{ dir: string; row: ConvertRow }> = [];\n  const queue = [rootWire];\n  const isRoot = (dir: string) => dir.replace(/\\/+$/, '') === rootWire.replace(/\\/+$/, '');\n  while (queue.length) {\n    if (io.stopped()) return;\n    const dir = queue.shift()!;\n    let rows: ConvertRow[];\n    try {\n      rows = await io.list(dir);\n    } catch {\n      prog.failed++;\n      continue;\n    }\n    for (const r of rows) {\n      if (r.type === 'dir') {\n        queue.push(r.path);\n        continue;\n      }\n      if (isRoot(dir) && r.basename === E2E_MARKER_NAME) continue;\n      if (classifyStoredName(r.basename).kind === 'sidecar') continue;\n      files.push({ dir, row: r });\n    }\n  }\n  prog.total = files.length;\n\n  // 2. One file at a time: never more than one in memory (and a large one\n  //    never whole).\n  for (const { dir, row } of files) {\n    if (io.stopped()) return;\n    try {\n      if (hasMagic(await io.head(row.path))) {\n        prog.skipped++;\n        continue;\n      }\n      if (typeof row.size === 'number' && row.size > opts.maxBytes) {\n        // wiring:e2 convert - over the one-shot limit: STREAM (0x02), the\n        // format an upload of the same file gets (lib/e2estream).\n        if (io.writeLarge && (await io.writeLarge(dir, row, expectOf(row)))) {\n          prog.done++;\n          prog.large = (prog.large ?? 0) + 1;\n        } else {\n          prog.tooBig++;\n        }\n        continue;\n      }\n      const plain = await io.read(row.path);\n      if (plain.byteLength > opts.maxBytes) {\n        prog.tooBig++;\n        continue;\n      }\n      const ct = await io.encrypt(plain);\n      await io.write(dir, row, new Blob([ct], { type: 'application/octet-stream' }), expectOf(row));\n      prog.done++;\n    } catch {\n      prog.failed++;\n    }\n  }\n}\n","/**\n * e2eNameRegistry — how a surface OUTSIDE the explorer (the notification bell\n * and panel) names an item inside an encrypted folder.\n *\n * The names of a level-2 folder are ciphertext on the server; only an\n * explorer that has the folder unlocked holds the plaintext (its name view,\n * composables/useE2eNames). A mounted explorer registers a resolver here; the\n * bell asks it. Nothing is copied out of the explorer and nothing is kept:\n * locking the folder (or unmounting the explorer) makes the answer null\n * again, and the bell goes back to \"🔒 Encrypted item\".\n *\n * Reactive: `resolveE2eName` reads a version that changes when a resolver\n * comes or goes, and each resolver reads its name view's own version, so a\n * row rendered while a name was still being decrypted re-renders with it.\n */\nimport { ref } from 'vue';\n\nexport type E2eNameResolver = (wire: string, root: string) => { name: string; path: string } | null;\n\nconst resolvers = new Set<E2eNameResolver>();\nconst version = ref(0);\n\n/** Register a resolver; returns its unregister. */\nexport function registerE2eNameResolver(r: E2eNameResolver): () => void {\n  resolvers.add(r);\n  version.value++;\n  return () => {\n    if (resolvers.delete(r)) version.value++;\n  };\n}\n\n/** The plaintext of `wire` (inside the encrypted folder `root`), or null. */\nexport function resolveE2eName(wire: string, root: string): { name: string; path: string } | null {\n  void version.value;\n  for (const r of resolvers) {\n    const out = r(wire, root);\n    if (out) return out;\n  }\n  return null;\n}\n","<script setup lang=\"ts\">\n/**\n * E2eTooBigModal — a decrypted download this browser cannot hold.\n *\n * Firefox and Safari have no File System Access API, so a file decrypted in\n * the tab is gathered in memory and handed to the normal download — up to\n * E2E_BLOB_SAVE_LIMIT (lib/e2esave.ts). Past that, the download is refused\n * BEFORE anything is decrypted (or, for a zip whose size is not known up\n * front, the moment it outgrows the limit), and this dialog says so and gives\n * the way out: the encrypted bytes, as the server has them, and the one\n * command that decrypts them on the person's own computer (`filex decrypt`,\n * docs/CLI.md). Chrome, Edge and the desktop app save as a stream and never\n * get here.\n */\nimport { computed, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport type { FxeTooBig } from '../composables/useE2eFiles';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  info: FxeTooBig | null;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'download'): void;\n}>();\n\nconst { t, formatSize } = useLocale(() => props.locale);\nconst copied = ref(false);\n\nwatch(\n  () => props.open,\n  (v) => {\n    if (v) copied.value = false;\n  },\n);\n\nconst lead = computed(() => {\n  const i = props.info;\n  if (!i) return '';\n  const limit = formatSize(i.limit);\n  return i.size !== null\n    ? t('e2e.big.lead', { name: i.name, size: formatSize(i.size), limit })\n    : t('e2e.big.lead_grew', { name: i.name, limit });\n});\n\nasync function copy() {\n  const cmd = props.info?.command;\n  if (!cmd) return;\n  try {\n    await navigator.clipboard.writeText(cmd);\n    copied.value = true;\n  } catch {\n    /* no clipboard here: the command stays on screen to select */\n  }\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('e2e.big.title')\" size=\"sm\" @close=\"emit('close')\">\n    <div v-if=\"info\" class=\"fe-e2e-form\" data-testid=\"e2e-too-big\">\n      <p class=\"fe-e2e-rk__lead\">{{ lead }}</p>\n      <p>{{ t('e2e.big.instead') }}</p>\n      <ol class=\"fe-e2e-big__steps\">\n        <li>{{ info.encrypted.kind === 'file' ? t('e2e.big.step_file') : t('e2e.big.step_folder') }}</li>\n        <li>\n          {{ t('e2e.big.step_run') }}\n          <span class=\"fe-e2e-big__cmd\">\n            <code data-testid=\"e2e-too-big-command\">{{ info.command }}</code>\n            <button type=\"button\" class=\"fe-e2e-optlink\" data-testid=\"e2e-too-big-copy\" @click=\"copy\">\n              {{ copied ? t('e2e.big.copied') : t('e2e.big.copy') }}\n            </button>\n          </span>\n        </li>\n      </ol>\n      <p class=\"fe-e2e-names__hint\">{{ t('e2e.big.other_ways') }}</p>\n    </div>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">\n        {{ t('e2e.big.close') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn fe-btn--primary\" data-testid=\"e2e-too-big-download\" @click=\"emit('download')\">\n        {{ info?.encrypted.kind === 'folder' ? t('e2e.big.download_folder') : t('e2e.big.download_file') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n\n","/**\n * e2efile — a single end-to-end encrypted file, `.fxe`\n * (docs/E2E-ENCRYPTION.md → \"Single encrypted files\").\n *\n * Any file can be encrypted on its own, without an encrypted folder around\n * it. The result is ONE self-contained file: the key slots a folder keeps in\n * its marker travel in the file's own header, so it can be moved, shared,\n * backed up or taken off the server and still opened with its password or\n * its recovery key — by the browser or by `filex decrypt`.\n *\n * ── Layout ────────────────────────────────────────────────────────────\n *\n *   [0..8)    magic \"filexfxe\"\n *   [8]       version 0x01\n *   [9..13)   header length H, uint32 big-endian (1 … 65 536)\n *   [13..13+H) header, UTF-8 JSON (below)\n *   [13+H..)  STREAM body (lib/e2estream.ts) under the file's DEK\n *\n * ── Header ────────────────────────────────────────────────────────────\n *\n * The SAME slot shapes as a folder marker (lib/e2ecrypto.ts), so the same\n * code unlocks, changes the password of and reads the recovery key of both:\n *\n *   salt, iter, verify        the password slot (PBKDF2-SHA256, 600 000)\n *   fmk: \"wrapped\", fmk_pw    a random 32-byte key, sealed under the password\n *   rk: {salt, blob}          the recovery key slot (HKDF), shown once\n *   esc?: {kid, alg, blob}    the escrow slot, when the installation has one\n *   dek                       the file's DEK, sealed under that key\n *   name                      the original file name (UTF-8, NFC), sealed\n *   chunk                     STREAM chunk size, log2 (writers: 20)\n *   nonce                     STREAM nonce prefix, 7 bytes, base64\n *   size                      plaintext bytes\n *   req?                      required features; an unknown one refuses\n *\n * A program that rewrites the header (a password change) keeps every field it\n * does not understand. Changing the password rewrites the header only: the\n * body — every byte after the header — is carried over unread.\n */\n\nimport {\n  E2E_MAX_ITERATIONS,\n  E2E_MIN_PASSWORD_LEN,\n  E2eDecryptError,\n  b64ToBytes,\n  bytesToB64,\n  changePassword,\n  createEncryptedFolder,\n  openBlob,\n  sealBlob,\n  unlockWithEscrowKey,\n  unlockWithPasswordDetailed,\n  unlockWithRecoveryKey,\n  type E2eCredential,\n  type E2eEscrowSlot,\n  type E2eMarker,\n  type E2eRecoverySlot,\n} from './e2ecrypto';\nimport { namePlainProblem } from './e2enames';\nimport {\n  ByteStreamReader,\n  E2E_STREAM_CHUNK_LOG2,\n  E2E_STREAM_PREFIX_LEN,\n  createStreamDecryptor,\n  createStreamEncryptor,\n  importDek,\n  prependBytes,\n  randomDek,\n  randomStreamPrefix,\n  streamCiphertextSize,\n  validChunkLog2,\n} from './e2estream';\n\nexport const FXE_MAGIC = 'filexfxe';\nexport const FXE_VERSION = 1;\n/** What every single encrypted file's stored name ends with. */\nexport const FXE_EXTENSION = '.fxe';\n/** The largest header a reader accepts. */\nexport const FXE_MAX_HEADER_BYTES = 64 * 1024;\n/** Required features this build understands (none yet). */\nexport const FXE_KNOWN_FEATURES: readonly string[] = [];\n\nconst MAGIC_BYTES = new TextEncoder().encode(FXE_MAGIC);\n/** magic (8) + version (1) + header length (4). */\nexport const FXE_FIXED_LEN = 13;\nconst DEK_LEN = 32;\n\nexport interface FxeHeader {\n  salt: string;\n  iter: number;\n  verify: string;\n  fmk: 'wrapped';\n  fmk_pw: string;\n  rk?: E2eRecoverySlot;\n  esc?: E2eEscrowSlot;\n  dek: string;\n  name: string;\n  chunk: number;\n  nonce: string;\n  size: number;\n  req?: string[];\n  /** Anything a newer filex wrote; kept on rewrite. */\n  [k: string]: unknown;\n}\n\n/** True when a stored name is a single encrypted file's. */\nexport function isFxeName(name: string | null | undefined): boolean {\n  return typeof name === 'string' && name.length > FXE_EXTENSION.length && name.toLowerCase().endsWith(FXE_EXTENSION);\n}\n\n/** `encrypted-<8 hex>.fxe` — a stored name that says nothing about the file. */\nexport function hiddenFxeName(): string {\n  const b = crypto.getRandomValues(new Uint8Array(4));\n  return `encrypted-${Array.from(b, (x) => x.toString(16).padStart(2, '0')).join('')}${FXE_EXTENSION}`;\n}\n\n/** True for a name `hiddenFxeName` makes. */\nexport function isHiddenFxeName(name: string): boolean {\n  return /^encrypted-[0-9a-f]{8}\\.fxe$/i.test(name);\n}\n\n/** The stored name for an encrypted copy of `original`. */\nexport function fxeStoredName(original: string, hide: boolean): string {\n  return hide ? hiddenFxeName() : `${original}${FXE_EXTENSION}`;\n}\n\n/**\n * A marker-shaped view of a header's key slots, so the folder code\n * (`unlockWithPasswordDetailed`, `unlockWithRecoveryKey`,\n * `unlockWithEscrowKey`, `changePassword`) works on it unchanged.\n */\nexport function fxeSlots(h: FxeHeader): E2eMarker {\n  const m: E2eMarker = { v: 2, salt: h.salt, iter: h.iter, verify: h.verify, fmk: 'wrapped', fmk_pw: h.fmk_pw };\n  if (h.rk) m.rk = h.rk;\n  if (h.esc) m.esc = h.esc;\n  return m;\n}\n\nexport function fxeHasRecovery(h: FxeHeader): boolean {\n  return !!h.rk && typeof h.rk.salt === 'string' && typeof h.rk.blob === 'string';\n}\n\n// ---------------------------------------------------------------------\n// Header encode / parse\n// ---------------------------------------------------------------------\n\n/** The bytes a `.fxe` starts with: magic, version, length, header. */\nexport function encodeFxePrefix(h: FxeHeader): Uint8Array<ArrayBuffer> {\n  const json = new TextEncoder().encode(JSON.stringify(h));\n  if (json.length === 0 || json.length > FXE_MAX_HEADER_BYTES) throw new Error('e2e: the .fxe header is too large');\n  const out = new Uint8Array(FXE_FIXED_LEN + json.length);\n  out.set(MAGIC_BYTES, 0);\n  out[8] = FXE_VERSION;\n  new DataView(out.buffer).setUint32(9, json.length, false);\n  out.set(json, FXE_FIXED_LEN);\n  return out;\n}\n\n/** True when `b` starts with the `.fxe` magic. */\nexport function hasFxeMagic(b: Uint8Array): boolean {\n  if (b.length < MAGIC_BYTES.length) return false;\n  for (let i = 0; i < MAGIC_BYTES.length; i++) if (b[i] !== MAGIC_BYTES[i]) return false;\n  return true;\n}\n\n/** Why a `.fxe` could not be read, before any key is involved. */\nexport class FxeFormatError extends Error {\n  constructor(msg: string) {\n    super(msg);\n    this.name = 'FxeFormatError';\n  }\n}\n\n/** Header length from the first 13 bytes. Throws FxeFormatError. */\nexport function fxeHeaderLength(first: Uint8Array): number {\n  if (first.length < FXE_FIXED_LEN || !hasFxeMagic(first)) throw new FxeFormatError('e2e: not a filex encrypted file (.fxe)');\n  if (first[8] !== FXE_VERSION) throw new FxeFormatError(`e2e: unsupported .fxe version ${first[8]} - a newer filex wrote it`);\n  const n = new DataView(first.buffer, first.byteOffset, first.byteLength).getUint32(9, false);\n  if (n === 0 || n > FXE_MAX_HEADER_BYTES) throw new FxeFormatError('e2e: the .fxe header length is out of range');\n  return n;\n}\n\nexport interface ParsedFxe {\n  header: FxeHeader;\n  /** Required features this build does not know. Non-empty: do not open it. */\n  unsupported: string[];\n  /** Bytes before the body (13 + header length). */\n  prefixLength: number;\n}\n\nfunction isB64Of(s: unknown, len?: number): boolean {\n  if (typeof s !== 'string' || s.length === 0) return false;\n  try {\n    const b = b64ToBytes(s);\n    return len === undefined || b.length === len;\n  } catch {\n    return false;\n  }\n}\n\n/** Parse the JSON header. Throws FxeFormatError for anything malformed. */\nexport function parseFxeHeader(json: Uint8Array, prefixLength: number): ParsedFxe {\n  let h: FxeHeader;\n  try {\n    h = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(json)) as FxeHeader;\n  } catch {\n    throw new FxeFormatError('e2e: the .fxe header is not readable');\n  }\n  const bad = (what: string) => new FxeFormatError(`e2e: the .fxe header is damaged (${what})`);\n  if (!h || typeof h !== 'object' || Array.isArray(h)) throw bad('not an object');\n  if (!isB64Of(h.salt)) throw bad('salt');\n  if (typeof h.iter !== 'number' || !Number.isInteger(h.iter) || h.iter < 1 || h.iter > E2E_MAX_ITERATIONS) throw bad('iter');\n  if (typeof h.verify !== 'string') throw bad('verify');\n  if (h.fmk !== 'wrapped' || typeof h.fmk_pw !== 'string') throw bad('fmk');\n  if (h.rk !== undefined && (typeof h.rk !== 'object' || typeof h.rk?.salt !== 'string' || typeof h.rk?.blob !== 'string')) {\n    throw bad('rk');\n  }\n  if (\n    h.esc !== undefined &&\n    (typeof h.esc !== 'object' || typeof h.esc?.kid !== 'string' || typeof h.esc?.alg !== 'string' || typeof h.esc?.blob !== 'string')\n  ) {\n    throw bad('esc');\n  }\n  if (typeof h.dek !== 'string' || typeof h.name !== 'string') throw bad('dek/name');\n  if (!validChunkLog2(h.chunk)) throw bad('chunk');\n  if (!isB64Of(h.nonce, E2E_STREAM_PREFIX_LEN)) throw bad('nonce');\n  if (typeof h.size !== 'number' || !Number.isSafeInteger(h.size) || h.size < 0) throw bad('size');\n  const unsupported: string[] = [];\n  if (h.req !== undefined) {\n    if (!Array.isArray(h.req) || h.req.some((f) => typeof f !== 'string')) throw bad('req');\n    for (const f of h.req) if (!FXE_KNOWN_FEATURES.includes(f)) unsupported.push(f);\n  }\n  return { header: h, unsupported, prefixLength };\n}\n\n/** Parse a whole prefix held in memory (13 + H bytes, or more). */\nexport function parseFxePrefix(b: Uint8Array): ParsedFxe {\n  const n = fxeHeaderLength(b);\n  if (b.length < FXE_FIXED_LEN + n) throw new FxeFormatError('e2e: the .fxe file is truncated');\n  return parseFxeHeader(b.subarray(FXE_FIXED_LEN, FXE_FIXED_LEN + n), FXE_FIXED_LEN + n);\n}\n\n/** Total bytes of a `.fxe` with this header. */\nexport function fxeFileSize(h: FxeHeader, prefixLength: number): number {\n  return prefixLength + streamCiphertextSize(h.size, h.chunk);\n}\n\n/**\n * Read the prefix off the front of a `.fxe` stream. The rest of the stream —\n * the body — comes back unread.\n */\nexport async function readFxe(stream: ReadableStream<Uint8Array>): Promise<{ parsed: ParsedFxe; body: ReadableStream<Uint8Array> }> {\n  const r = new ByteStreamReader(stream);\n  try {\n    const first = await r.read(FXE_FIXED_LEN);\n    const n = fxeHeaderLength(first);\n    const json = await r.read(n);\n    if (json.length < n) throw new FxeFormatError('e2e: the .fxe file is truncated');\n    return { parsed: parseFxeHeader(json, FXE_FIXED_LEN + n), body: r.rest() };\n  } catch (err) {\n    await r.cancel().catch(() => undefined);\n    throw err;\n  }\n}\n\n// ---------------------------------------------------------------------\n// Keys\n// ---------------------------------------------------------------------\n\n/** What an unlock hands back: everything reading and naming the file needs. */\nexport interface FxeKey {\n  header: FxeHeader;\n  /** The file's own master key (what the slots wrap). */\n  fmk: CryptoKey;\n  /** The STREAM key. */\n  dek: CryptoKey;\n  /** The original name, NFC. */\n  name: string;\n}\n\n/** How the person opens a `.fxe`. */\nexport type FxeCredential = { password: string } | { recoveryKey: string } | { escrowKey: CryptoKey };\n\nexport type FxeUnlock = { key: FxeKey } | { error: 'wrong' | 'damaged' };\n\n/** The DEK and the name, from the file's master key. Null when damaged. */\nasync function keysFromFmk(h: FxeHeader, fmk: CryptoKey): Promise<FxeKey | null> {\n  const raw = await openBlob(fmk, h.dek);\n  if (!raw || raw.length !== DEK_LEN) return null;\n  let dek: CryptoKey;\n  try {\n    dek = await importDek(new Uint8Array(raw));\n  } finally {\n    raw.fill(0);\n  }\n  const nameBytes = await openBlob(fmk, h.name);\n  if (!nameBytes) return null;\n  let name: string;\n  try {\n    name = new TextDecoder('utf-8', { fatal: true }).decode(nameBytes);\n  } catch {\n    return null;\n  }\n  if (namePlainProblem(name)) return null;\n  return { header: h, fmk, dek, name: name.normalize('NFC') };\n}\n\n/**\n * Open a `.fxe` header with a password, its recovery key or the escrow key.\n * 'wrong': the credential does not open it. 'damaged': it did (or the header\n * gives no way to tell), and the file key or the name is unreadable.\n */\nexport async function unlockFxe(h: FxeHeader, cred: FxeCredential): Promise<FxeUnlock> {\n  const slots = fxeSlots(h);\n  let fmk: CryptoKey | null;\n  if ('password' in cred) {\n    const opened = await unlockWithPasswordDetailed(slots, cred.password);\n    if ('error' in opened) return { error: opened.error };\n    fmk = opened.fmk;\n  } else if ('recoveryKey' in cred) {\n    fmk = await unlockWithRecoveryKey(slots, cred.recoveryKey);\n    if (!fmk) return { error: 'wrong' };\n  } else {\n    fmk = await unlockWithEscrowKey(slots, cred.escrowKey);\n    if (!fmk) return { error: 'wrong' };\n  }\n  const key = await keysFromFmk(h, fmk);\n  return key ? { key } : { error: 'damaged' };\n}\n\n/** The same file with an updated header (a password change) keeps its keys. */\nexport function rekeyedFxeKey(key: FxeKey, header: FxeHeader): FxeKey {\n  return { ...key, header };\n}\n\n// ---------------------------------------------------------------------\n// Encrypt / decrypt\n// ---------------------------------------------------------------------\n\nexport interface CreateFxeOptions {\n  /** Base64 SPKI of the installation's escrow key, when it has one. */\n  escrowPublicKey?: string | null;\n  iterations?: number;\n  /** Chunk size, log2. Tests only: writers use E2E_STREAM_CHUNK_LOG2. */\n  chunkLog2?: number;\n  onProgress?: (plainBytes: number) => void;\n}\n\nexport interface CreatedFxe {\n  header: FxeHeader;\n  /** The whole `.fxe`: prefix, then the body as the source is read. */\n  stream: ReadableStream<Uint8Array>;\n  /** Bytes the stream will carry. */\n  size: number;\n  /** Show this ONCE. filex never stores it. */\n  recoveryKey: string;\n  /** Keys for this tab's ring, so the new file opens without a prompt. */\n  key: FxeKey;\n}\n\n/**\n * Encrypt `src` (exactly `plainSize` bytes, named `name`) into a `.fxe`.\n * The password slot, recovery key and escrow slot are made exactly as for a\n * new encrypted folder (`createEncryptedFolder`); the stream errors if the\n * source is not `plainSize` bytes long.\n */\nexport async function createFxe(\n  name: string,\n  plainSize: number,\n  src: ReadableStream<Uint8Array>,\n  password: string,\n  opts: CreateFxeOptions = {},\n): Promise<CreatedFxe> {\n  const nfc = (name ?? '').normalize('NFC');\n  const problem = namePlainProblem(nfc);\n  if (problem) throw new Error(`e2e: invalid name (${problem})`);\n  if ((password ?? '').length < E2E_MIN_PASSWORD_LEN) {\n    throw new Error(`e2e: the password must be at least ${E2E_MIN_PASSWORD_LEN} characters`);\n  }\n  if (!Number.isSafeInteger(plainSize) || plainSize < 0) throw new Error('e2e: bad file size');\n  const log2 = opts.chunkLog2 ?? E2E_STREAM_CHUNK_LOG2;\n  if (!validChunkLog2(log2)) throw new Error('e2e: bad chunk size');\n\n  const made = await createEncryptedFolder(password, {\n    escrowPublicKey: opts.escrowPublicKey ?? null,\n    iterations: opts.iterations,\n  });\n  const rawDek = randomDek();\n  let dekSealed: string;\n  let dek: CryptoKey;\n  try {\n    dekSealed = await sealBlob(made.fmk, rawDek);\n    dek = await importDek(rawDek);\n  } finally {\n    rawDek.fill(0);\n  }\n  const prefix = randomStreamPrefix();\n  const m = made.marker;\n  const header: FxeHeader = {\n    salt: m.salt,\n    iter: m.iter,\n    verify: m.verify,\n    fmk: 'wrapped',\n    fmk_pw: m.fmk_pw!,\n    ...(m.rk ? { rk: m.rk } : {}),\n    ...(m.esc ? { esc: m.esc } : {}),\n    dek: dekSealed,\n    name: await sealBlob(made.fmk, new TextEncoder().encode(nfc)),\n    chunk: log2,\n    nonce: bytesToB64(prefix),\n    size: plainSize,\n  };\n  const head = encodeFxePrefix(header);\n  const body = src.pipeThrough(\n    createStreamEncryptor(dek, prefix, log2, { expectSize: plainSize, onProgress: opts.onProgress }),\n  );\n  return {\n    header,\n    stream: prependBytes(head, body),\n    size: head.length + streamCiphertextSize(plainSize, log2),\n    recoveryKey: made.recoveryKey,\n    key: { header, fmk: made.fmk, dek, name: nfc },\n  };\n}\n\n/** The body (everything after the prefix) → the plaintext, checked end to end. */\nexport function decryptFxeBody(key: FxeKey, body: ReadableStream<Uint8Array>): ReadableStream<Uint8Array> {\n  const h = key.header;\n  return body.pipeThrough(createStreamDecryptor(key.dek, b64ToBytes(h.nonce), h.chunk, { expectSize: h.size }));\n}\n\n/**\n * A new password for a `.fxe`. Proof is the current password or the recovery\n * key. Only the password slot changes; the recovery key, the escrow slot, the\n * DEK — and so every byte of the body — stay as they are. Throws\n * E2eDecryptError for a wrong credential.\n */\nexport async function changeFxePassword(h: FxeHeader, cred: E2eCredential, newPassword: string): Promise<FxeHeader> {\n  const next = await changePassword(fxeSlots(h), cred, newPassword);\n  if (next.fmk !== 'wrapped' || !next.fmk_pw) throw new E2eDecryptError('e2e: the password slot did not re-seal');\n  return { ...h, salt: next.salt, iter: next.iter, verify: next.verify, fmk: 'wrapped', fmk_pw: next.fmk_pw };\n}\n\n/**\n * The same `.fxe` under a new header: new prefix, then the old body carried\n * over byte for byte. `oldBody` is the stream after the old prefix.\n */\nexport function replaceFxeHeader(\n  h: FxeHeader,\n  oldBody: ReadableStream<Uint8Array>,\n): { stream: ReadableStream<Uint8Array>; size: number } {\n  const head = encodeFxePrefix(h);\n  return { stream: prependBytes(head, oldBody), size: head.length + streamCiphertextSize(h.size, h.chunk) };\n}\n","/**\n * e2emime — the MIME type a decrypted blob is handed to the viewers with.\n *\n * The server knows an encrypted file as `application/octet-stream` (and a\n * `.fxe` by a name that says nothing of its type), so the type of the blob a\n * viewer mounts in `<img>`/`<video>`/`<object>` comes from the PLAINTEXT name,\n * here. One table for the folder files and the single encrypted files.\n */\nconst E2E_MIME: Record<string, string> = {\n  txt: 'text/plain', md: 'text/markdown', log: 'text/plain', csv: 'text/csv',\n  json: 'application/json', xml: 'application/xml', html: 'text/html',\n  jpg: 'image/jpeg', jpeg: 'image/jpeg', png: 'image/png', gif: 'image/gif',\n  webp: 'image/webp', bmp: 'image/bmp', avif: 'image/avif', svg: 'image/svg+xml',\n  pdf: 'application/pdf',\n  mp4: 'video/mp4', webm: 'video/webm', mov: 'video/quicktime', m4v: 'video/mp4',\n  mp3: 'audio/mpeg', wav: 'audio/wav', ogg: 'audio/ogg', flac: 'audio/flac',\n  m4a: 'audio/mp4', aac: 'audio/aac', opus: 'audio/opus',\n};\n\n/** MIME for a lower-case extension (no dot); octet-stream when unknown. */\nexport function e2eMimeForExt(ext: string | null | undefined): string {\n  return E2E_MIME[(ext || '').toLowerCase()] || 'application/octet-stream';\n}\n","/**\n * e2esave — where a file decrypted in this tab is saved to.\n *\n * A file decrypted in the browser has no URL the browser can download, so the\n * bytes have to be handed to the person some other way. Two sinks, best\n * first (docs/E2E-ENCRYPTION.md → \"Where a decrypted download goes\"):\n *\n *   'fsa'   the File System Access API (`showSaveFilePicker`): Chrome, Edge,\n *           Opera and the filex desktop app. The person picks where it goes,\n *           and the plaintext is written to disk AS IT IS DECRYPTED — nothing\n *           is held in memory, any size works. The browser writes into a\n *           temporary file and moves it into place only when the stream ends\n *           cleanly; a decryption error aborts it and nothing is left behind.\n *   'blob'  everywhere else (Firefox, Safari): the plaintext is gathered into\n *           a Blob and handed to the normal download. That holds the whole\n *           file in memory, so it is limited (E2E_BLOB_SAVE_LIMIT) and the\n *           limit is SAID, with where to go instead.\n *\n * A streaming service-worker download (the third option some web apps use)\n * is not offered: the web app's worker is scoped to `/admin/` and the\n * explorer runs at `/drive/`, in the desktop app and inside other sites'\n * pages, where there is no worker of ours to answer the request.\n */\n\n/** The most a Blob-sink save holds in memory. */\nexport const E2E_BLOB_SAVE_LIMIT = 1024 * 1024 * 1024;\n\nexport type SaveSinkKind = 'fsa' | 'blob';\n\n/** The sink the last save used — read by the end-to-end tests. */\nexport let lastSaveSink: SaveSinkKind | null = null;\n\ninterface FsWritable {\n  write(data: Uint8Array): Promise<void>;\n  close(): Promise<void>;\n  abort(reason?: unknown): Promise<void>;\n}\ninterface FsHandle {\n  createWritable(): Promise<FsWritable>;\n  /** Chromium: removes the (empty) file the picker created. */\n  remove?(): Promise<void>;\n}\ntype ShowSaveFilePicker = (opts?: { suggestedName?: string }) => Promise<FsHandle>;\n\nfunction picker(): ShowSaveFilePicker | null {\n  if (typeof window === 'undefined') return null;\n  const w = window as unknown as { showSaveFilePicker?: ShowSaveFilePicker; isSecureContext?: boolean };\n  return typeof w.showSaveFilePicker === 'function' && w.isSecureContext !== false ? w.showSaveFilePicker.bind(window) : null;\n}\n\n/** True when this browser saves decrypted files as a stream, any size. */\nexport function streamingSaveAvailable(): boolean {\n  return picker() !== null;\n}\n\n/** The person closed the save dialog. Not an error to report. */\nexport class SaveCancelled extends Error {\n  constructor() {\n    super('save cancelled');\n    this.name = 'SaveCancelled';\n  }\n}\n\n/** The browser wants a fresh click before it shows the save dialog. */\nexport class SaveNeedsGesture extends Error {\n  constructor() {\n    super('the save dialog needs a click');\n    this.name = 'SaveNeedsGesture';\n  }\n}\n\n/** Too big for this browser's in-memory save. */\nexport class SaveTooLarge extends Error {\n  constructor(\n    public size: number,\n    public limit: number,\n  ) {\n    super(`e2e: ${size} bytes is more than this browser can save from memory (${limit})`);\n    this.name = 'SaveTooLarge';\n  }\n}\n\nexport interface SaveTarget {\n  kind: SaveSinkKind;\n  name: string;\n  /** Write the stream to the target; rejects (and discards) on any error. */\n  write(stream: ReadableStream<Uint8Array>, opts?: { mime?: string }): Promise<void>;\n  /** Give up before writing: the chosen file is not created. */\n  discard(): Promise<void>;\n}\n\n/**\n * Pick where a decrypted file goes. Call it FIRST, in the click that asked\n * for the download: the browser only shows its save dialog from a click, and\n * the work can start once there is somewhere for it to go.\n *\n * `size` (when known) lets the Blob sink refuse before any byte is decrypted.\n */\nexport async function pickSaveTarget(name: string, size?: number): Promise<SaveTarget> {\n  const show = picker();\n  if (show) {\n    let handle: FsHandle;\n    try {\n      handle = await show({ suggestedName: name });\n    } catch (err) {\n      const n = (err as Error)?.name;\n      if (n === 'AbortError') throw new SaveCancelled();\n      if (n === 'SecurityError' || n === 'NotAllowedError') throw new SaveNeedsGesture();\n      throw err;\n    }\n    return fsaTarget(name, handle);\n  }\n  if (size !== undefined && size > E2E_BLOB_SAVE_LIMIT) throw new SaveTooLarge(size, E2E_BLOB_SAVE_LIMIT);\n  return blobTarget(name);\n}\n\nfunction fsaTarget(name: string, handle: FsHandle): SaveTarget {\n  let writable: FsWritable | null = null;\n  return {\n    kind: 'fsa',\n    name,\n    async write(stream) {\n      lastSaveSink = 'fsa';\n      writable = await handle.createWritable();\n      const w = writable;\n      const reader = stream.getReader();\n      try {\n        for (;;) {\n          const { done, value } = await reader.read();\n          if (done) break;\n          await w.write(value);\n        }\n        await w.close();\n      } catch (err) {\n        // Aborting throws the browser's temporary file away: nothing half\n        // decrypted is ever given the name the person chose.\n        await w.abort(err).catch(() => undefined);\n        await reader.cancel(err).catch(() => undefined);\n        // Chromium creates the chosen file, empty, when the dialog closes;\n        // an aborted write leaves that behind unless it is removed.\n        await handle.remove?.().catch(() => undefined);\n        throw err;\n      }\n    },\n    async discard() {\n      if (writable) await writable.abort().catch(() => undefined);\n      await handle.remove?.().catch(() => undefined);\n    },\n  };\n}\n\nfunction blobTarget(name: string): SaveTarget {\n  return {\n    kind: 'blob',\n    name,\n    async write(stream, opts) {\n      lastSaveSink = 'blob';\n      const parts: Blob[] = [];\n      let total = 0;\n      const reader = stream.getReader();\n      try {\n        for (;;) {\n          const { done, value } = await reader.read();\n          if (done) break;\n          total += value.length;\n          if (total > E2E_BLOB_SAVE_LIMIT) throw new SaveTooLarge(total, E2E_BLOB_SAVE_LIMIT);\n          // A Blob per piece: the browser may keep it outside the JS heap,\n          // and the piece itself can be collected.\n          parts.push(new Blob([value as Uint8Array<ArrayBuffer>]));\n        }\n      } catch (err) {\n        await reader.cancel(err).catch(() => undefined);\n        throw err;\n      }\n      // Only a stream that ended cleanly becomes a download.\n      const blob = new Blob(parts, { type: opts?.mime || 'application/octet-stream' });\n      const url = URL.createObjectURL(blob);\n      const a = document.createElement('a');\n      a.href = url;\n      a.download = name;\n      a.rel = 'noopener';\n      document.body.appendChild(a);\n      a.click();\n      a.remove();\n      setTimeout(() => URL.revokeObjectURL(url), 60_000);\n    },\n    async discard() {\n      /* nothing was created */\n    },\n  };\n}\n","/**\n * zipstream — a streaming ZIP writer: STORE only (no compression), sizes and\n * CRC-32 in a data descriptor after each entry, ZIP64 where a size or an\n * offset needs it, and UTF-8 names (general purpose bit 11).\n *\n * Built for the decrypted download of an encrypted folder\n * (docs/E2E-ENCRYPTION.md → \"Downloading a decrypted copy\"): the entries are\n * decrypted in this tab as the archive is written, so nothing is held but the\n * piece in flight, and the output goes straight to a save sink. No\n * dependency: the ZIP libraries that stream either compress (a waste on\n * photos and video, and CPU in the tab) or compute CRC-32 in WebAssembly,\n * which a strict Content-Security-Policy may refuse.\n *\n * Reference: PKWARE APPNOTE.TXT 6.3.10 — 4.3.7 (local header), 4.3.9 (data\n * descriptor), 4.3.12 (central directory), 4.3.14–16 (ZIP64 end records),\n * 4.5.3 (ZIP64 extra field).\n */\n\nexport interface ZipEntry {\n  /** Path inside the archive, `/`-separated. A folder ends with `/`. */\n  name: string;\n  /** The entry's bytes; absent for a folder. Opened when its turn comes. */\n  data?: ReadableStream<Uint8Array> | (() => Promise<ReadableStream<Uint8Array>>);\n  /**\n   * An UPPER BOUND on the entry's bytes, when one is known (the ciphertext\n   * size bounds the plaintext). It decides up front whether the entry needs\n   * ZIP64 records; unknown means \"assume it might\".\n   */\n  sizeHint?: number;\n  mtime?: Date;\n}\n\nexport interface ZipOptions {\n  /** Use ZIP64 records for every entry and at the end (tests). */\n  forceZip64?: boolean;\n  /** Bytes written so far. */\n  onProgress?: (bytes: number) => void;\n}\n\nconst U32 = 0xffffffff;\nconst U16 = 0xffff;\nconst enc = new TextEncoder();\n\n// ---------------------------------------------------------------------\n// CRC-32 (IEEE 802.3, reflected, table-driven)\n// ---------------------------------------------------------------------\n\nlet CRC_TABLE: Uint32Array | null = null;\nfunction crcTable(): Uint32Array {\n  if (CRC_TABLE) return CRC_TABLE;\n  const t = new Uint32Array(256);\n  for (let n = 0; n < 256; n++) {\n    let c = n;\n    for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n    t[n] = c >>> 0;\n  }\n  CRC_TABLE = t;\n  return t;\n}\n\n/** Continue a CRC-32 over `b`. Start with 0; the result is final as is. */\nexport function crc32(b: Uint8Array, crc = 0): number {\n  const t = crcTable();\n  let c = (crc ^ U32) >>> 0;\n  for (let i = 0; i < b.length; i++) c = t[(c ^ b[i]) & 0xff] ^ (c >>> 8);\n  return (c ^ U32) >>> 0;\n}\n\n// ---------------------------------------------------------------------\n// Records\n// ---------------------------------------------------------------------\n\n/** A little-endian record builder. */\nclass Rec {\n  private buf: Uint8Array;\n  private dv: DataView;\n  private o = 0;\n  constructor(n: number) {\n    this.buf = new Uint8Array(n);\n    this.dv = new DataView(this.buf.buffer);\n  }\n  u16(v: number) {\n    this.dv.setUint16(this.o, v, true);\n    this.o += 2;\n    return this;\n  }\n  u32(v: number) {\n    this.dv.setUint32(this.o, v >>> 0, true);\n    this.o += 4;\n    return this;\n  }\n  u64(v: number) {\n    this.dv.setUint32(this.o, v % 2 ** 32, true);\n    this.dv.setUint32(this.o + 4, Math.floor(v / 2 ** 32), true);\n    this.o += 8;\n    return this;\n  }\n  bytes(b: Uint8Array) {\n    this.buf.set(b, this.o);\n    this.o += b.length;\n    return this;\n  }\n  done(): Uint8Array {\n    if (this.o !== this.buf.length) throw new Error(`zip: record size ${this.o} != ${this.buf.length}`);\n    return this.buf;\n  }\n}\n\nfunction dosTime(d: Date): { time: number; date: number } {\n  const y = d.getFullYear();\n  if (y < 1980) return { time: 0, date: (1 << 5) | 1 };\n  return {\n    time: (d.getHours() << 11) | (d.getMinutes() << 5) | Math.floor(d.getSeconds() / 2),\n    date: ((Math.min(y, 2107) - 1980) << 9) | ((d.getMonth() + 1) << 5) | d.getDate(),\n  };\n}\n\ninterface CdEntry {\n  name: Uint8Array;\n  dir: boolean;\n  zip64Local: boolean;\n  crc: number;\n  size: number;\n  offset: number;\n  time: number;\n  date: number;\n}\n\nconst FLAG_UTF8 = 0x0800;\nconst FLAG_DESCRIPTOR = 0x0008;\nconst MADE_BY = (3 << 8) | 45; // UNIX, spec 4.5\nconst MODE_FILE = 0o100644;\nconst MODE_DIR = 0o40755;\n\nfunction localHeader(e: CdEntry): Uint8Array {\n  const extra = e.zip64Local ? 20 : 0;\n  const r = new Rec(30 + e.name.length + extra)\n    .u32(0x04034b50)\n    .u16(e.zip64Local ? 45 : 20)\n    .u16(FLAG_UTF8 | (e.dir ? 0 : FLAG_DESCRIPTOR))\n    .u16(0)\n    .u16(e.time)\n    .u16(e.date)\n    .u32(0)\n    .u32(e.zip64Local ? U32 : 0)\n    .u32(e.zip64Local ? U32 : 0)\n    .u16(e.name.length)\n    .u16(extra)\n    .bytes(e.name);\n  if (e.zip64Local) r.u16(0x0001).u16(16).u64(0).u64(0);\n  return r.done();\n}\n\nfunction dataDescriptor(e: CdEntry): Uint8Array {\n  if (e.zip64Local) {\n    return new Rec(24).u32(0x08074b50).u32(e.crc).u64(e.size).u64(e.size).done();\n  }\n  return new Rec(16).u32(0x08074b50).u32(e.crc).u32(e.size).u32(e.size).done();\n}\n\nfunction centralHeader(e: CdEntry, force64: boolean): Uint8Array {\n  const bigSize = force64 || e.size >= U32;\n  const bigOff = force64 || e.offset >= U32;\n  const extraLen = bigSize || bigOff ? 4 + (bigSize ? 16 : 0) + (bigOff ? 8 : 0) : 0;\n  const r = new Rec(46 + e.name.length + extraLen)\n    .u32(0x02014b50)\n    .u16(MADE_BY)\n    .u16(bigSize || bigOff || e.zip64Local ? 45 : 20)\n    .u16(FLAG_UTF8 | (e.dir ? 0 : FLAG_DESCRIPTOR))\n    .u16(0)\n    .u16(e.time)\n    .u16(e.date)\n    .u32(e.crc)\n    .u32(bigSize ? U32 : e.size)\n    .u32(bigSize ? U32 : e.size)\n    .u16(e.name.length)\n    .u16(extraLen)\n    .u16(0)\n    .u16(0)\n    .u16(0)\n    .u32(((e.dir ? MODE_DIR : MODE_FILE) * 65536 + (e.dir ? 0x10 : 0)) >>> 0)\n    .u32(bigOff ? U32 : e.offset)\n    .bytes(e.name);\n  if (extraLen) {\n    r.u16(0x0001).u16(extraLen - 4);\n    if (bigSize) r.u64(e.size).u64(e.size);\n    if (bigOff) r.u64(e.offset);\n  }\n  return r.done();\n}\n\nfunction endRecords(count: number, cdOffset: number, cdSize: number, force64: boolean): Uint8Array[] {\n  const out: Uint8Array[] = [];\n  const need64 = force64 || count >= U16 || cdOffset >= U32 || cdSize >= U32;\n  if (need64) {\n    const eocd64Offset = cdOffset + cdSize;\n    out.push(\n      new Rec(56)\n        .u32(0x06064b50)\n        .u64(44)\n        .u16(MADE_BY)\n        .u16(45)\n        .u32(0)\n        .u32(0)\n        .u64(count)\n        .u64(count)\n        .u64(cdSize)\n        .u64(cdOffset)\n        .done(),\n    );\n    out.push(new Rec(20).u32(0x07064b50).u32(0).u64(eocd64Offset).u32(1).done());\n  }\n  out.push(\n    new Rec(22)\n      .u32(0x06054b50)\n      .u16(0)\n      .u16(0)\n      .u16(need64 ? U16 : count)\n      .u16(need64 ? U16 : count)\n      .u32(need64 ? U32 : cdSize)\n      .u32(need64 ? U32 : cdOffset)\n      .u16(0)\n      .done(),\n  );\n  return out;\n}\n\n/** Normalise an entry name: `/` separators, no leading `/`, no `.`/`..` parts. */\nexport function zipEntryName(name: string, dir: boolean): string {\n  const parts = name\n    .replace(/\\\\/g, '/')\n    .split('/')\n    .filter((p) => p !== '' && p !== '.');\n  if (parts.length === 0 || parts.some((p) => p === '..')) throw new Error(`zip: unsafe entry name ${JSON.stringify(name)}`);\n  return parts.join('/') + (dir ? '/' : '');\n}\n\nasync function* zipChunks(\n  entries: AsyncIterable<ZipEntry> | Iterable<ZipEntry>,\n  opts: ZipOptions,\n): AsyncGenerator<Uint8Array> {\n  const force64 = !!opts.forceZip64;\n  const cd: CdEntry[] = [];\n  let offset = 0;\n  const emit = (b: Uint8Array) => {\n    offset += b.length;\n    opts.onProgress?.(offset);\n    return b;\n  };\n  for await (const entry of entries) {\n    const dir = entry.name.endsWith('/') && !entry.data;\n    const name = enc.encode(zipEntryName(entry.name, dir));\n    if (name.length > U16) throw new Error('zip: entry name too long');\n    const { time, date } = dosTime(entry.mtime ?? new Date());\n    const e: CdEntry = {\n      name,\n      dir,\n      zip64Local: !dir && (force64 || entry.sizeHint === undefined || entry.sizeHint >= U32),\n      crc: 0,\n      size: 0,\n      offset,\n      time,\n      date,\n    };\n    yield emit(localHeader(e));\n    if (!dir && entry.data) {\n      const stream = typeof entry.data === 'function' ? await entry.data() : entry.data;\n      const reader = stream.getReader();\n      try {\n        for (;;) {\n          const { done, value } = await reader.read();\n          if (done) break;\n          if (!value || value.length === 0) continue;\n          e.crc = crc32(value, e.crc);\n          e.size += value.length;\n          yield emit(value);\n        }\n      } catch (err) {\n        await reader.cancel(err).catch(() => undefined);\n        throw err;\n      } finally {\n        reader.releaseLock();\n      }\n      if (!e.zip64Local && e.size >= U32) throw new Error(`zip: ${entry.name} grew past its size hint and 4 GiB`);\n      yield emit(dataDescriptor(e));\n    }\n    cd.push(e);\n  }\n  const cdOffset = offset;\n  for (const e of cd) yield emit(centralHeader(e, force64));\n  const cdSize = offset - cdOffset;\n  for (const r of endRecords(cd.length, cdOffset, cdSize, force64)) yield emit(r);\n}\n\n/**\n * A ZIP of `entries`, as a stream. Entries are read one after another, each\n * only when the consumer pulls; an entry whose stream errors errors the\n * archive (a partial archive is never a finished one).\n */\nexport function createZipStream(\n  entries: AsyncIterable<ZipEntry> | Iterable<ZipEntry>,\n  opts: ZipOptions = {},\n): ReadableStream<Uint8Array> {\n  const gen = zipChunks(entries, opts);\n  return new ReadableStream<Uint8Array>({\n    async pull(ctl) {\n      const { value, done } = await gen.next();\n      if (done) ctl.close();\n      else ctl.enqueue(value);\n    },\n    async cancel() {\n      await gen.return(undefined);\n    },\n  });\n}\n","/**\n * uploadSource — bytes for a staged upload that are MADE as they are sent.\n *\n * A file encrypted in the browser (a single encrypted file, a large file in an\n * encrypted folder, a password change that re-sends a body) is a stream: its\n * size is known up front, its bytes are not, and building it as one Blob first\n * would hold the whole thing in memory. `useUploadChunked` takes a source\n * instead of a File for those, and asks it for one chunk at a time.\n *\n * A source is read FORWARD. The staged protocol may ask for the chunk it last\n * got again (a retry after a lost answer) or restart inside it (the server's\n * offset moved), so the last range handed out is kept; asking for anything\n * before it is an error — a stream cannot rewind. That is also why a sourced\n * upload is not bookmarked for a resume after a reload: the bytes it would\n * resume are gone with the tab (and, for an encrypted file, with its key).\n */\n\nimport { ByteStreamReader } from './e2estream';\n\nexport interface UploadSource {\n  /** Bytes the upload carries. */\n  size: number;\n  /** Bytes [start, end). Starts never go below the last range returned. */\n  read(start: number, end: number): Promise<Blob>;\n  /** Stop producing (the upload failed or was cancelled). */\n  cancel?(): void;\n}\n\n/**\n * A source over a stream of exactly `size` bytes. The stream is not touched\n * until the first read: an upload refused before any byte was asked for (a\n * server with no staged path) leaves it whole, for the caller to send some\n * other way.\n */\nexport function streamUploadSource(stream: ReadableStream<Uint8Array>, size: number): UploadSource {\n  let reader: ByteStreamReader | null = null;\n  const open = () => (reader ??= new ByteStreamReader(stream));\n  /** The retained window: bytes [winStart, winStart + win.length). */\n  let winStart = 0;\n  let win: Uint8Array<ArrayBuffer> = new Uint8Array(0);\n  let pos = 0;\n  let cancelled = false;\n  return {\n    size,\n    async read(start, end) {\n      if (cancelled) throw new Error('upload source cancelled');\n      if (start < winStart || start > pos || end < start || end > size) {\n        throw new Error(`upload source: cannot read [${start}, ${end}) after [${winStart}, ${pos})`);\n      }\n      // Whatever lies before `start` will not be asked for again.\n      const keep = win.subarray(start - winStart);\n      if (end > pos) {\n        const more = await open().read(end - pos);\n        if (more.length < end - pos) throw new Error('upload source: the stream ended early');\n        const next = new Uint8Array(keep.length + more.length);\n        next.set(keep, 0);\n        next.set(more, keep.length);\n        win = next;\n        pos = end;\n      } else {\n        win = keep.slice();\n      }\n      winStart = start;\n      return new Blob([win.subarray(0, end - start)]);\n    },\n    cancel() {\n      if (cancelled) return;\n      cancelled = true;\n      void (reader ? reader.cancel() : stream.cancel()).catch(() => undefined);\n    },\n  };\n}\n\n/** Gather a SMALL stream into a File, for the single-POST upload path. */\nexport async function streamToFile(\n  stream: ReadableStream<Uint8Array>,\n  name: string,\n  type = 'application/octet-stream',\n): Promise<File> {\n  const parts: Blob[] = [];\n  const reader = stream.getReader();\n  for (;;) {\n    const { done, value } = await reader.read();\n    if (done) break;\n    parts.push(new Blob([value as Uint8Array<ArrayBuffer>]));\n  }\n  return new File(parts, name, { type });\n}\n","/**\n * useE2eFiles — single encrypted files (`.fxe`) and the STREAMED paths of\n * encrypted folders (docs/E2E-ENCRYPTION.md → \"Single encrypted files\",\n * \"Streaming content\", \"Downloading a decrypted copy\").\n *\n * The crypto is lib/e2efile.ts + lib/e2estream.ts; the save sinks are\n * lib/e2esave.ts; the archive is lib/zipstream.ts. What lives here is the\n * ORDER of things — and every step of it happens in this tab:\n *\n *   encrypt   the plaintext is streamed from the server, encrypted here and\n *             uploaded (chunked, as it is made); only after the upload\n *             committed is the original moved to the trash;\n *   open      the header is read, the password (or the recovery key) opens it\n *             HERE, the body is decrypted into a blob for the viewers;\n *   download  decrypted as it arrives, into the save sink the browser has;\n *   remove    decrypted, uploaded under the original name, then the `.fxe`\n *             goes to the trash;\n *   password  a new header, and the body carried over byte for byte.\n *\n * Keys are held in memory only, in a ring keyed by the `.fxe`'s path: the\n * file's own key, its DEK and its original name. Nothing is written to any\n * storage, and a reload forgets everything.\n *\n * One instance per explorer (FileExplorer), so the web app, the desktop app\n * and every embed get the same behaviour.\n */\n\nimport { onBeforeUnmount, ref, type Ref } from 'vue';\n\nimport type { E2eAnswer, FileNode } from '../types/FileNode';\nimport type { FileApi, PendingOpDto } from './useFileApi';\nimport { isStagedUnsupported, type UploadJob, type UploadOptions, type UploadResult } from './useUploadChunked';\nimport { requestFailure } from '../lib/errorWords';\nimport {\n  E2E_MARKER_NAME,\n  E2eDecryptError,\n  b64ToBytes,\n  bytesToB64,\n  escrowAvailability,\n  hasMagic,\n  importEscrowPrivateKey,\n  rewrapFileKey,\n  type E2eCredential,\n  type EscrowAvailability,\n} from '../lib/e2ecrypto';\nimport {\n  FxeFormatError,\n  changeFxePassword,\n  createFxe,\n  decryptFxeBody,\n  fxeHasRecovery,\n  fxeSlots,\n  fxeStoredName,\n  isFxeName,\n  isHiddenFxeName,\n  readFxe,\n  rekeyedFxeKey,\n  replaceFxeHeader,\n  unlockFxe,\n  type FxeCredential,\n  type FxeHeader,\n  type FxeKey,\n} from '../lib/e2efile';\nimport {\n  ByteStreamReader,\n  E2E_FOLDER_HEADER_LEN,\n  decryptFolderFileStream,\n  encryptFolderFileStream,\n  prependBytes,\n} from '../lib/e2estream';\nimport { extensionOf, namePlainProblem } from '../lib/e2enames';\nimport { e2eMimeForExt } from '../lib/e2emime';\nimport {\n  E2E_BLOB_SAVE_LIMIT,\n  SaveCancelled,\n  SaveNeedsGesture,\n  SaveTooLarge,\n  pickSaveTarget,\n  streamingSaveAvailable,\n  type SaveTarget,\n} from '../lib/e2esave';\nimport { createZipStream, type ZipEntry } from '../lib/zipstream';\nimport { streamToFile, streamUploadSource, type UploadSource } from '../lib/uploadSource';\nimport { wireBaseName, wireJoinPath, wireParentPath } from './useE2eNames';\nimport { useLocale } from './useLocale';\n\n/** What the explorer lends this composable. */\nexport interface E2eFilesDeps {\n  api: FileApi;\n  chunked: {\n    uploadFile(opts: UploadOptions): Promise<UploadResult>;\n    threshold(): number;\n  };\n  locale: () => string | undefined;\n  t: (key: string, vars?: Record<string, string | number>) => string;\n  /** A short notice; `error` keeps it up longer. */\n  toast: (message: string, error?: boolean) => void;\n  emitError: (message: string, op: string) => void;\n  escrowPublicKey: () => string | null;\n  /** The short id of the installation's escrow key (capabilities), or null:\n   *  which files the escrow door opens (escrowAvailability). */\n  escrowKid?: () => string | null;\n  /** A queued job (a delete), so its end refreshes the listing. */\n  registerOp: (op: PendingOpDto) => void;\n  /** Read the listing on screen again. */\n  reload: () => Promise<void>;\n  /** Show a decrypted blob in the explorer's viewers, as `node`. */\n  openPreview: (node: FileNode, url: string) => void;\n  /** Show a recovery key once (RecoveryKeyModal), for the file called `name`. */\n  showRecoveryKey: (key: string, name: string) => void;\n  /** wiring:e2 policy — \"Request encryption…\" on a plain file: the host opens\n   *  its request dialog (FileExplorer → E2eRequestModal). Absent, the row does\n   *  nothing — and a host that never passes `encryptAnswer: 'request'` never\n   *  offers it. */\n  requestEncrypt?: (node: FileNode) => void;\n}\n\n/** Why the unlock dialog is open. */\nexport type FxeIntent = 'open' | 'download' | 'remove';\n\n/**\n * A decrypted download this browser cannot hold (Firefox, Safari: the\n * in-memory save, over E2E_BLOB_SAVE_LIMIT) — and the way out: the encrypted\n * bytes, and the `filex decrypt` command for them (E2eTooBigModal).\n */\nexport interface FxeTooBig {\n  /** What could not be saved, in the person's words. */\n  name: string;\n  /** Its size, when known before starting; null when a zip outgrew the limit. */\n  size: number | null;\n  limit: number;\n  /** What to download instead: a `.fxe` as it is, or the encrypted folder. */\n  encrypted: { kind: 'file' | 'folder'; path: string };\n  /** The command that decrypts that download where it is saved. */\n  command: string;\n}\n\n/** One row this composable adds to a context menu. Exported because the\n *  composable's return type names it (declaration output). */\nexport interface FxeMenuRow {\n  key: string;\n  label: string;\n  icon?: string;\n  hidden?: boolean;\n  danger?: boolean;\n  title?: string;\n}\n\n/** The context-menu keys this composable answers. */\nexport const FXE_ACTION_KEYS = [\n  'fxe-encrypt',\n  'fxe-request' /* wiring:e2 policy */,\n  'fxe-download-raw',\n  'fxe-remove',\n  'fxe-password',\n  'e2e-download-encrypted',\n] as const;\n\nexport function isFxeActionKey(key: string): boolean {\n  return (FXE_ACTION_KEYS as readonly string[]).includes(key);\n}\n\n/** A row that is a single encrypted file. */\nexport function isFxeRow(n: { type?: string; basename?: string; e2e_stored?: unknown } | null | undefined): boolean {\n  return !!n && n.type === 'file' && isFxeName(typeof n.e2e_stored === 'string' ? n.e2e_stored : n.basename);\n}\n\n/**\n * wiring:e2 policy — the plain file \"Encrypt with E2EE…\" would encrypt: one\n * file you may write, not a `.fxe` already, not inside an encrypted folder\n * (the folder encrypts it). The explorer asks the policy's answer for exactly\n * this file, so the menu and the question cannot disagree about which one.\n */\nexport function fxeEncryptTarget(sel: FileNode[], ctx: { canWrite: boolean; inEncrypted: boolean }): FileNode | null {\n  const n = sel.length === 1 ? sel[0] : null;\n  if (!n || n.type !== 'file' || isFxeRow(n) || ctx.inEncrypted || n.e2e_root || !ctx.canWrite) return null;\n  return n;\n}\n\n/** `name (2).ext` — a free name next to a taken one. */\nexport function numberedName(name: string, n: number): string {\n  const dot = name.lastIndexOf('.');\n  if (dot <= 0) return `${name} (${n})`;\n  return `${name.slice(0, dot)} (${n})${name.slice(dot)}`;\n}\n\nexport function useE2eFiles(deps: E2eFilesDeps) {\n  const { api, t } = deps;\n\n  /** path of a `.fxe` → its keys and original name (memory only). */\n  const ring = new Map<string, FxeKey>();\n  const ringVer = ref(0);\n  /** path → decrypted blob URL handed to a viewer. */\n  const urls = new Map<string, string>();\n\n  function revokeAll() {\n    for (const u of urls.values()) URL.revokeObjectURL(u);\n    urls.clear();\n  }\n  onBeforeUnmount(() => {\n    revokeAll();\n    ring.clear();\n  });\n\n  // ── state the dialogs render ──────────────────────────────────────────\n  const encryptTarget: Ref<FileNode | null> = ref(null);\n  const encryptBusy = ref(false);\n  const encryptError = ref<string | null>(null);\n  const encryptProgress = ref<number | null>(null);\n\n  const unlockTarget: Ref<FileNode | null> = ref(null);\n  const unlockIntent = ref<FxeIntent>('open');\n  const unlockBusy = ref(false);\n  const unlockError = ref<string | null>(null);\n  const unlockProgress = ref<number | null>(null);\n  /** The browser wants one more click before its save dialog (after an unlock). */\n  const unlockNeedsSave = ref(false);\n  /** The file has a recovery key slot (the dialog's \"use the recovery key\" link). */\n  const unlockHasRecovery = ref(true);\n  /** Whether the installation's escrow key opens this file — read from its\n   *  header when the dialog opens, as for a folder's lock screen. */\n  const unlockEscrow = ref<EscrowAvailability>('off');\n  /** The escrow key this file was sealed to, when it was. */\n  const unlockEscrowKid = ref<string | null>(null);\n\n  const pwTarget: Ref<FileNode | null> = ref(null);\n  const pwBusy = ref(false);\n  const pwError = ref<string | null>(null);\n\n  /** Set when a decrypted download is too big for this browser's memory. */\n  const tooBig: Ref<FxeTooBig | null> = ref(null);\n\n  // ── helpers ───────────────────────────────────────────────────────────\n\n  /** The body of a file on the server, as a stream. */\n  async function fetchBody(path: string): Promise<ReadableStream<Uint8Array>> {\n    const headers = await api.authHeaders();\n    const res = await fetch(api.previewUrl(path), {\n      headers,\n      credentials: api.credentialsMode(),\n      cache: 'no-store',\n    });\n    if (!res.ok) {\n      const text = await res.text().catch(() => '');\n      throw requestFailure(res.status, text, deps.locale());\n    }\n    if (!res.body) throw new Error('e2e: this browser cannot read a download as a stream');\n    return res.body;\n  }\n\n  /** The names taken in a folder, as the server stores them. */\n  async function takenIn(dir: string): Promise<Set<string>> {\n    const resp = await api.index(dir);\n    return new Set((resp.files ?? []).map((f) => f.basename));\n  }\n\n  /** The first of `name`, `name (2)`, … not in `taken`. */\n  function freeName(name: string, taken: Set<string>): string {\n    if (!taken.has(name)) return name;\n    for (let i = 2; i < 1000; i++) {\n      const n = numberedName(name, i);\n      if (!taken.has(n)) return n;\n    }\n    throw new Error('e2e: no free name');\n  }\n\n  /**\n   * Upload a stream of exactly `size` bytes as `dir/name`: the staged,\n   * chunked path reading the stream as it goes (nothing held but the chunk in\n   * flight); the single POST for what is below the chunk size, or when the\n   * server has no staged path — then gathered in memory, and refused past\n   * the in-memory limit rather than tried.\n   */\n  async function uploadStream(\n    dir: string,\n    name: string,\n    stream: ReadableStream<Uint8Array>,\n    size: number,\n    onProgress?: (bytes: number) => void,\n    /* wiring:e2 convert - `fields` go with the write wherever it lands: the\n       staged commit's query, or the single POST's form (`expect`,\n       `e2e_convert`). `signal` stops the upload in flight. */\n    extra: { fields?: Record<string, string>; signal?: AbortSignal } = {},\n  ): Promise<void> {\n    const file = new File([], name, { type: 'application/octet-stream' });\n    const { fields, signal } = extra;\n    if (signal?.aborted) {\n      await stream.cancel().catch(() => undefined);\n      throw new DOMException('Aborted by user', 'AbortError');\n    }\n    if (size > deps.chunked.threshold()) {\n      const source: UploadSource = streamUploadSource(stream, size);\n      let job: UploadJob | null = null;\n      const onAbort = () => job?.cancel();\n      signal?.addEventListener('abort', onAbort);\n      try {\n        await deps.chunked.uploadFile({\n          path: dir,\n          file,\n          source,\n          commitQuery: fields,\n          onProgress: (j) => {\n            job = j;\n            if (signal?.aborted) j.cancel();\n            onProgress?.(j.uploadedBytes);\n          },\n        });\n        return;\n      } catch (err) {\n        if (!isStagedUnsupported(err)) throw err;\n        if (size > E2E_BLOB_SAVE_LIMIT) {\n          // Nothing read yet (the source is lazy): let the download go.\n          await stream.cancel().catch(() => undefined);\n          throw new SaveTooLarge(size, E2E_BLOB_SAVE_LIMIT);\n        }\n      } finally {\n        signal?.removeEventListener('abort', onAbort);\n      }\n    }\n    const whole = await streamToFile(stream, name);\n    if (whole.size !== size) throw new Error('e2e: the upload came out a different size than it should');\n    if (signal?.aborted) throw new DOMException('Aborted by user', 'AbortError');\n    await api.uploadMultipart(dir, [whole], (p) => onProgress?.(Math.round((p / 100) * size)), fields);\n  }\n\n  /** Move one item to the trash, queued where the server queues. */\n  async function trash(path: string): Promise<void> {\n    const dir = wireParentPath(path);\n    if (api.endpoints.deleteAsync) {\n      const { op } = await api.deleteAsync([path], dir);\n      deps.registerOp(op);\n      return;\n    }\n    await api.deleteItems(dir, [path]);\n  }\n\n  function messageOf(err: unknown): string {\n    return err instanceof Error && err.message ? err.message : String(err);\n  }\n\n  /** A decrypt failure in words: a wrong key, or a damaged/tampered file. */\n  function decryptWords(err: unknown): string {\n    if (err instanceof FxeFormatError) return t('e2e.fxe.not_readable');\n    if (err instanceof E2eDecryptError) return t('e2e.fxe.damaged');\n    return messageOf(err);\n  }\n\n  /** The header and body of a `.fxe`, read from the server. */\n  async function readHeader(path: string): Promise<{ header: FxeHeader; unsupported: string[]; body: ReadableStream<Uint8Array> }> {\n    const { parsed, body } = await readFxe(await fetchBody(path));\n    return { header: parsed.header, unsupported: parsed.unsupported, body };\n  }\n\n  /** The ring's key for this file, if it still fits the header on the server. */\n  function keyFits(key: FxeKey, h: FxeHeader): boolean {\n    return key.header.dek === h.dek && key.header.nonce === h.nonce && key.header.size === h.size;\n  }\n\n  /** The label a `.fxe` row is shown with: its real name once opened here. */\n  function realName(path: string): string | undefined {\n    void ringVer.value;\n    return ring.get(path)?.name;\n  }\n\n  // ── context menu ──────────────────────────────────────────────────────\n\n  /**\n   * The rows this composable adds to a selection's menu.\n   *   canWrite     may write to the selection\n   *   inEncrypted  the selection is inside an encrypted folder (the folder\n   *                encrypts it already; a `.fxe` in there is not offered)\n   *   unlockedEncryptedCopy  the selection is (inside) an UNLOCKED encrypted\n   *                folder: \"Download\" decrypts, so the ciphertext copy is a\n   *                second verb\n   *   encryptAnswer  wiring:e2 policy — the server's answer for the file\n   *                \"Encrypt with E2EE…\" would encrypt (`fxeEncryptTarget`):\n   *                `request` offers \"Request encryption…\" in its place,\n   *                `denied` neither. Absent: `allowed`, the menu of before.\n   */\n  function menuRows(\n    sel: FileNode[],\n    ctx: { canWrite: boolean; inEncrypted: boolean; unlockedEncryptedCopy: boolean; encryptAnswer?: E2eAnswer },\n  ): FxeMenuRow[] {\n    const single = sel.length === 1 ? sel[0] : null;\n    const fxe = !!single && isFxeRow(single);\n    const encryptable = fxeEncryptTarget(sel, ctx) !== null;\n    const answer = ctx.encryptAnswer ?? 'allowed';\n    return [\n      {\n        key: 'fxe-encrypt',\n        label: t('e2e.fxe.ctx_encrypt'),\n        icon: 'lock',\n        hidden: !encryptable || answer !== 'allowed',\n      },\n      /* wiring:e2 policy — the same place, where encrypting needs an approval. */\n      {\n        key: 'fxe-request',\n        label: t('e2e.request.ctx'),\n        icon: 'lock',\n        hidden: !encryptable || answer !== 'request',\n      },\n      { key: 'fxe-download-raw', label: t('e2e.fxe.ctx_download_raw'), icon: 'download', hidden: !fxe },\n      {\n        key: 'e2e-download-encrypted',\n        label: t('e2e.dl.ctx_encrypted_copy'),\n        icon: 'download',\n        hidden: fxe || sel.length === 0 || !ctx.unlockedEncryptedCopy,\n      },\n      { key: 'fxe-password', label: t('e2e.fxe.ctx_password'), icon: 'lock', hidden: !fxe || !ctx.canWrite },\n      { key: 'fxe-remove', label: t('e2e.fxe.ctx_remove'), icon: 'restore', hidden: !fxe || !ctx.canWrite },\n    ];\n  }\n\n  // ── encrypt a plain file ──────────────────────────────────────────────\n\n  function startEncrypt(n: FileNode) {\n    encryptTarget.value = n;\n    encryptError.value = null;\n    encryptProgress.value = null;\n  }\n\n  function closeEncrypt() {\n    if (encryptBusy.value) return;\n    encryptTarget.value = null;\n  }\n\n  /**\n   * An administrator's \"delete the original for good\", once the encrypted copy\n   * is committed: every version the original kept (row and bytes), then the\n   * original itself — into the trash synchronously, so its entry exists — and\n   * that trash entry. The versions go first, while the file is still live and\n   * its history can be listed; a trash purge would drop their rows but not\n   * necessarily what they stored.\n   */\n  async function purgeOriginal(n: FileNode, nodeId: number): Promise<void> {\n    for (const v of await api.listVersions(nodeId)) await api.purgeVersion(v.id);\n    await api.deleteItems(wireParentPath(n.path), [n.path]);\n    try {\n      await api.purgeTrash(nodeId);\n    } catch (err) {\n      // No trash on this server: the delete above was already for good.\n      if ((err as { status?: number }).status !== 404) throw err;\n    }\n  }\n\n  async function submitEncrypt(payload: { password: string; hideName: boolean; purge?: boolean }) {\n    const n = encryptTarget.value;\n    if (!n || encryptBusy.value) return;\n    encryptBusy.value = true;\n    encryptError.value = null;\n    encryptProgress.value = 0;\n    try {\n      const dir = wireParentPath(n.path);\n      const size = typeof n.size === 'number' ? n.size : NaN;\n      if (!Number.isSafeInteger(size) || size < 0) throw new Error(t('e2e.fxe.size_unknown'));\n      const purge = payload.purge === true;\n      if (purge && typeof n.id !== 'number') throw new Error(t('e2e.fxe.purge_no_id'));\n      if (namePlainProblem(n.basename)) throw new Error(t('e2e.fxe.bad_name'));\n      const taken = await takenIn(dir);\n      let stored = fxeStoredName(n.basename, payload.hideName);\n      if (payload.hideName) {\n        for (let i = 0; taken.has(stored) && i < 20; i++) stored = fxeStoredName(n.basename, true);\n      } else {\n        stored = `${freeName(n.basename, new Set([...taken].filter(isFxeName).map((x) => x.slice(0, -4))))}.fxe`;\n      }\n      if (namePlainProblem(stored)) throw new Error(t('e2e.fxe.name_too_long'));\n      const created = await createFxe(n.basename, size, await fetchBody(n.path), payload.password, {\n        escrowPublicKey: deps.escrowPublicKey(),\n      });\n      await uploadStream(dir, stored, created.stream, created.size, (b) => {\n        encryptProgress.value = created.size > 0 ? Math.min(100, Math.round((b / created.size) * 100)) : 100;\n      });\n      const fxePath = wireJoinPath(dir, stored);\n      ring.set(fxePath, created.key);\n      ringVer.value++;\n      // Only now — the encrypted copy is committed — does the original go.\n      if (purge) {\n        try {\n          await purgeOriginal(n, n.id as number);\n        } catch (err) {\n          encryptTarget.value = null;\n          deps.emitError(messageOf(err), 'fxe-purge-original');\n          deps.toast(t('e2e.fxe.purge_failed', { name: n.basename, reason: messageOf(err) }), true);\n          deps.showRecoveryKey(created.recoveryKey, n.basename);\n          await deps.reload();\n          return;\n        }\n        encryptTarget.value = null;\n        deps.showRecoveryKey(created.recoveryKey, n.basename);\n        deps.toast(t('e2e.fxe.purged', { name: n.basename }));\n        await deps.reload();\n        return;\n      }\n      try {\n        await trash(n.path);\n      } catch (err) {\n        encryptTarget.value = null;\n        deps.emitError(messageOf(err), 'fxe-trash-original');\n        deps.toast(t('e2e.fxe.original_kept', { name: n.basename }), true);\n        deps.showRecoveryKey(created.recoveryKey, n.basename);\n        await deps.reload();\n        return;\n      }\n      encryptTarget.value = null;\n      deps.showRecoveryKey(created.recoveryKey, n.basename);\n      deps.toast(t('e2e.fxe.encrypted', { name: n.basename }));\n      await deps.reload();\n    } catch (err) {\n      encryptError.value = err instanceof SaveTooLarge ? t('e2e.fxe.upload_too_big') : messageOf(err);\n      deps.emitError(messageOf(err), 'fxe-encrypt');\n    } finally {\n      encryptBusy.value = false;\n      encryptProgress.value = null;\n    }\n  }\n\n  // ── open / download / remove: the unlock dialog ───────────────────────\n\n  function askUnlock(n: FileNode, intent: FxeIntent) {\n    unlockTarget.value = n;\n    unlockIntent.value = intent;\n    unlockError.value = null;\n    unlockNeedsSave.value = false;\n    unlockProgress.value = null;\n    unlockHasRecovery.value = true;\n    unlockEscrow.value = 'off';\n    unlockEscrowKid.value = null;\n    if (!ring.has(n.path)) void peekSlots(n);\n  }\n\n  /** Which doors this file has (recovery key, escrow), read from its header\n   *  so the dialog offers the right ones before anything is typed. */\n  async function peekSlots(n: FileNode) {\n    try {\n      const { header, body } = await readHeader(n.path);\n      await body.cancel().catch(() => undefined);\n      if (unlockTarget.value?.path !== n.path) return;\n      unlockHasRecovery.value = fxeHasRecovery(header);\n      unlockEscrow.value = escrowAvailability(fxeSlots(header), deps.escrowKid?.() ?? null);\n      unlockEscrowKid.value = header.esc?.kid ?? null;\n    } catch {\n      /* the submit reads the header again and says what is wrong */\n    }\n  }\n\n  /**\n   * The escrow key was used: prove it to the server (open its challenge with\n   * the private key) so the file's OWNER is told — BEFORE anything is\n   * decrypted, and a failure here opens nothing. The same rule, and the same\n   * two requests, as an encrypted folder's escrow unlock.\n   *\n   * ⚠ An announcement, not enforcement: whoever holds the private key can\n   * decrypt the file offline and never come here (docs/E2E-ENCRYPTION.md).\n   */\n  async function announceEscrow(path: string, priv: CryptoKey): Promise<void> {\n    const ch = await api.e2eEscrowChallenge(path);\n    const nonce = new Uint8Array(\n      await crypto.subtle.decrypt({ name: 'RSA-OAEP' }, priv, b64ToBytes(ch.challenge).buffer as ArrayBuffer),\n    );\n    await api.e2eEscrowUsed({ path, id: ch.id, nonce: bytesToB64(nonce) });\n  }\n\n  function closeUnlock() {\n    if (unlockBusy.value) return;\n    unlockTarget.value = null;\n    unlockNeedsSave.value = false;\n  }\n\n  /** Open a `.fxe` (double click, Enter, Preview). */\n  async function open(n: FileNode) {\n    const key = ring.get(n.path);\n    if (!key) {\n      askUnlock(n, 'open');\n      return;\n    }\n    try {\n      await previewWith(n, key);\n    } catch (err) {\n      failAndMaybeForget(n, err, 'fxe-open');\n    }\n  }\n\n  /** Download a `.fxe` decrypted, under its original name. */\n  async function download(n: FileNode) {\n    if (await refusedForSize(n)) return;\n    const key = ring.get(n.path);\n    if (!key) {\n      askUnlock(n, 'download');\n      return;\n    }\n    try {\n      await saveDecrypted(n, key);\n    } catch (err) {\n      if (err instanceof SaveNeedsGesture) {\n        askUnlock(n, 'download');\n        unlockNeedsSave.value = true;\n        return;\n      }\n      failAndMaybeForget(n, err, 'fxe-download');\n    }\n  }\n\n  /** \"Remove encryption…\": always through the dialog, which says what it means. */\n  function startRemove(n: FileNode) {\n    askUnlock(n, 'remove');\n  }\n\n  /** A command-line argument, quoted for a shell: the name as it is saved. */\n  function shellArg(name: string): string {\n    return `\"${name.replace(/([\"\\\\$`])/g, '\\\\$1')}\"`;\n  }\n\n  /** The dialog for a `.fxe` too big to decrypt in memory here. */\n  function tooBigFile(n: FileNode, size: number, limit: number) {\n    const stored = wireBaseName(n.path);\n    tooBig.value = {\n      name: ring.get(n.path)?.name ?? n.basename,\n      size,\n      limit,\n      encrypted: { kind: 'file', path: n.path },\n      command: `filex decrypt ${shellArg(stored)}`,\n    };\n  }\n\n  /** The dialog for a file (or a zip) of an encrypted folder: the way out is\n   *  the encrypted folder as a zip, which carries its key file. */\n  function tooBigFolder(name: string, root: string, size: number | null, limit: number) {\n    const folder = wireBaseName(root) || 'filex';\n    tooBig.value = {\n      name,\n      size,\n      limit,\n      encrypted: { kind: 'folder', path: root },\n      command: `filex decrypt ${shellArg(`${folder}.zip`)}`,\n    };\n  }\n\n  function closeTooBig() {\n    tooBig.value = null;\n  }\n\n  /**\n   * In a browser that saves from memory, a `.fxe` over the limit is refused\n   * BEFORE its password is asked for: the header (read without any key) says\n   * how big the plaintext is. True when the dialog was shown instead.\n   */\n  async function refusedForSize(n: FileNode): Promise<boolean> {\n    if (streamingSaveAvailable()) return false;\n    const known = ring.get(n.path)?.header.size;\n    let size = typeof known === 'number' ? known : null;\n    if (size === null) {\n      if (typeof n.size !== 'number' || n.size <= E2E_BLOB_SAVE_LIMIT) return false;\n      try {\n        const { header, body } = await readHeader(n.path);\n        await body.cancel().catch(() => undefined);\n        size = header.size;\n      } catch {\n        return false;\n      }\n    }\n    if (size <= E2E_BLOB_SAVE_LIMIT) return false;\n    tooBigFile(n, size, E2E_BLOB_SAVE_LIMIT);\n    return true;\n  }\n\n  /** A known key that no longer opens the file: forget it and ask again. */\n  function failAndMaybeForget(n: FileNode, err: unknown, op: string) {\n    if (err instanceof SaveCancelled) return;\n    if (err instanceof SaveTooLarge) {\n      tooBigFile(n, err.size, err.limit);\n      return;\n    }\n    if (err instanceof E2eDecryptError) {\n      ring.delete(n.path);\n      ringVer.value++;\n    }\n    deps.emitError(messageOf(err), op);\n    deps.toast(decryptWords(err), true);\n  }\n\n  async function previewWith(n: FileNode, key: FxeKey) {\n    const { header, body } = await readHeader(n.path);\n    if (!keyFits(key, header)) {\n      await body.cancel().catch(() => undefined);\n      throw new E2eDecryptError('e2e: the file changed since it was opened');\n    }\n    if (header.size > E2E_BLOB_SAVE_LIMIT) {\n      await body.cancel().catch(() => undefined);\n      throw new SaveTooLarge(header.size, E2E_BLOB_SAVE_LIMIT);\n    }\n    const ext = extensionOf(key.name);\n    const plain = await streamToFile(decryptFxeBody(key, body), key.name, e2eMimeForExt(ext));\n    const old = urls.get(n.path);\n    if (old) URL.revokeObjectURL(old);\n    const url = URL.createObjectURL(plain);\n    urls.set(n.path, url);\n    // The viewer describes the FILE it shows: its real name, type and size\n    // (the row's size is the .fxe's, header and tags included).\n    deps.openPreview(\n      { ...n, basename: key.name, extension: ext, mime_type: e2eMimeForExt(ext), size: header.size, fxe_name: key.name },\n      url,\n    );\n  }\n\n  async function saveDecrypted(n: FileNode, key: FxeKey, target?: SaveTarget) {\n    const into = target ?? (await pickSaveTarget(key.name, key.header.size));\n    let started = false;\n    try {\n      const { header, body } = await readHeader(n.path);\n      if (!keyFits(key, header)) {\n        await body.cancel().catch(() => undefined);\n        throw new E2eDecryptError('e2e: the file changed since it was opened');\n      }\n      started = true;\n      await into.write(decryptFxeBody(key, body), { mime: e2eMimeForExt(extensionOf(key.name)) });\n      deps.toast(t('e2e.fxe.downloaded', { name: key.name }));\n    } catch (err) {\n      if (!started) await into.discard();\n      throw err;\n    }\n  }\n\n  async function removeWith(n: FileNode, key: FxeKey) {\n    const dir = wireParentPath(n.path);\n    const { header, body } = await readHeader(n.path);\n    if (!keyFits(key, header)) {\n      await body.cancel().catch(() => undefined);\n      throw new E2eDecryptError('e2e: the file changed since it was opened');\n    }\n    const name = freeName(key.name, await takenIn(dir));\n    unlockProgress.value = 0;\n    await uploadStream(dir, name, decryptFxeBody(key, body), header.size, (b) => {\n      unlockProgress.value = header.size > 0 ? Math.min(100, Math.round((b / header.size) * 100)) : 100;\n    });\n    await trash(n.path);\n    ring.delete(n.path);\n    ringVer.value++;\n    deps.toast(t('e2e.fxe.removed', { name }));\n    await deps.reload();\n  }\n\n  /**\n   * The dialog's answer: a password or the recovery key, or — for a file\n   * already open in this tab — just \"go ahead\".\n   */\n  async function submitUnlock(payload: { password?: string; recoveryKey?: string; escrowKey?: string } = {}) {\n    const n = unlockTarget.value;\n    if (!n || unlockBusy.value) return;\n    unlockBusy.value = true;\n    unlockError.value = null;\n    try {\n      let key = ring.get(n.path);\n      if (!key || payload.password || payload.recoveryKey || payload.escrowKey) {\n        let cred: FxeCredential;\n        if (payload.escrowKey) {\n          try {\n            cred = { escrowKey: await importEscrowPrivateKey(payload.escrowKey) };\n          } catch {\n            unlockError.value = t('e2e.recover.bad_escrow_key');\n            return;\n          }\n        } else if (payload.recoveryKey) {\n          cred = { recoveryKey: payload.recoveryKey };\n        } else {\n          cred = { password: payload.password ?? '' };\n        }\n        const { header, unsupported, body } = await readHeader(n.path);\n        await body.cancel().catch(() => undefined);\n        unlockHasRecovery.value = fxeHasRecovery(header);\n        if (unsupported.length > 0) {\n          unlockError.value = t('e2e.fxe.unsupported', { features: unsupported.join(', ') });\n          return;\n        }\n        const u = await unlockFxe(header, cred);\n        if ('error' in u) {\n          unlockError.value =\n            u.error === 'damaged'\n              ? t('e2e.fxe.damaged')\n              : 'escrowKey' in cred\n                ? t('e2e.fxe.wrong_escrow')\n                : 'recoveryKey' in cred\n                  ? t('e2e.fxe.wrong_recovery')\n                  : t('e2e.fxe.wrong_password');\n          return;\n        }\n        if ('escrowKey' in cred) {\n          try {\n            await announceEscrow(n.path, cred.escrowKey);\n          } catch (err) {\n            unlockError.value = t('e2e.fxe.escrow_notify_failed');\n            deps.emitError(messageOf(err), 'fxe-escrow-notify');\n            return;\n          }\n          deps.toast(t('e2e.fxe.escrow_done'));\n        }\n        key = u.key;\n        ring.set(n.path, key);\n        ringVer.value++;\n      }\n      if (unlockIntent.value === 'open') {\n        await previewWith(n, key);\n        unlockTarget.value = null;\n      } else if (unlockIntent.value === 'download') {\n        try {\n          await saveDecrypted(n, key);\n        } catch (err) {\n          if (err instanceof SaveNeedsGesture) {\n            unlockNeedsSave.value = true;\n            return;\n          }\n          throw err;\n        }\n        unlockTarget.value = null;\n        unlockNeedsSave.value = false;\n      } else {\n        await removeWith(n, key);\n        unlockTarget.value = null;\n      }\n    } catch (err) {\n      if (err instanceof SaveCancelled) return;\n      if (err instanceof SaveTooLarge && unlockIntent.value === 'download') {\n        unlockTarget.value = null;\n        tooBigFile(n, err.size, err.limit);\n        return;\n      }\n      unlockError.value =\n        err instanceof SaveTooLarge\n          ? t('e2e.dl.too_big', { size: formatBytes(err.size), limit: formatBytes(err.limit) })\n          : decryptWords(err);\n      if (err instanceof E2eDecryptError) {\n        ring.delete(n.path);\n        ringVer.value++;\n      }\n      deps.emitError(messageOf(err), `fxe-${unlockIntent.value}`);\n    } finally {\n      unlockBusy.value = false;\n      unlockProgress.value = null;\n    }\n  }\n\n  // ── change the password ───────────────────────────────────────────────\n\n  function startPassword(n: FileNode) {\n    pwTarget.value = n;\n    pwError.value = null;\n  }\n\n  function closePassword() {\n    if (pwBusy.value) return;\n    pwTarget.value = null;\n  }\n\n  /**\n   * A new header; the body is re-sent unread (streamed). Nothing is\n   * announced: the server sees the header rewritten, records the change and\n   * tells the file's owner itself (backend e2e/fxewatch, e2e/slotchange).\n   */\n  async function submitPassword(payload: { proof: E2eCredential | null; newPassword: string }) {\n    const n = pwTarget.value;\n    if (!n || pwBusy.value) return;\n    if (!payload.proof) {\n      pwError.value = t('e2e.password.current_required');\n      return;\n    }\n    pwBusy.value = true;\n    pwError.value = null;\n    const via = 'recoveryKey' in payload.proof ? 'recovery_key' : 'password';\n    try {\n      const { header, unsupported, body } = await readHeader(n.path);\n      if (unsupported.length > 0) {\n        await body.cancel().catch(() => undefined);\n        pwError.value = t('e2e.fxe.unsupported', { features: unsupported.join(', ') });\n        return;\n      }\n      let next: FxeHeader;\n      try {\n        next = await changeFxePassword(header, payload.proof, payload.newPassword);\n      } catch (err) {\n        await body.cancel().catch(() => undefined);\n        if (err instanceof E2eDecryptError) {\n          pwError.value = via === 'recovery_key' ? t('e2e.password.wrong_recovery') : t('e2e.password.wrong_current');\n          return;\n        }\n        throw err;\n      }\n      const out = replaceFxeHeader(next, body);\n      await uploadStream(wireParentPath(n.path), wireBaseName(n.path), out.stream, out.size);\n      const known = ring.get(n.path);\n      if (known) ring.set(n.path, rekeyedFxeKey(known, next));\n      ringVer.value++;\n      pwTarget.value = null;\n      deps.toast(t('e2e.fxe.password_done'));\n      await deps.reload();\n    } catch (err) {\n      pwError.value = t('e2e.password.failed');\n      deps.emitError(messageOf(err), 'fxe-password');\n    } finally {\n      pwBusy.value = false;\n    }\n  }\n\n  // ── encrypted folders: streamed download, zip, large uploads ──────────\n\n  /**\n   * One file of an unlocked encrypted folder, decrypted as it arrives into\n   * the save sink (either header version; a file never encrypted comes down\n   * as it is).\n   */\n  async function downloadFolderFile(\n    n: FileNode,\n    fmk: CryptoKey,\n    previous: CryptoKey | null | undefined,\n    /** The encrypted folder it is in: what to download instead when it is too big here. */\n    root?: string | null,\n  ) {\n    const tooBigHere = (err: SaveTooLarge) => {\n      if (root) tooBigFolder(n.basename, root, err.size, err.limit);\n      else deps.toast(t('e2e.dl.too_big', { size: formatBytes(err.size), limit: formatBytes(err.limit) }), true);\n    };\n    let target: SaveTarget;\n    try {\n      target = await pickSaveTarget(n.basename, n.size);\n    } catch (err) {\n      if (err instanceof SaveTooLarge) tooBigHere(err);\n      else failAndMaybeForget(n, err, 'e2e-download');\n      return;\n    }\n    try {\n      const plain = decryptFolderFileStream(fmk, previous, await fetchBody(n.path), { passPlain: true });\n      await target.write(plain, { mime: e2eMimeForExt(n.extension) });\n    } catch (err) {\n      await target.discard();\n      if (err instanceof SaveCancelled) return;\n      if (err instanceof SaveTooLarge) {\n        tooBigHere(err);\n        return;\n      }\n      deps.emitError(messageOf(err), 'e2e-download');\n      deps.toast(t('e2e.download.failed'), true);\n    }\n  }\n\n  /**\n   * A zip of decrypted content with PLAINTEXT names, made in this tab: the\n   * selection inside an unlocked encrypted folder, or the encrypted folder\n   * itself. Names come from the name view (`decorate`), never re-derived\n   * here; the key file and long-name sidecars are left out.\n   */\n  async function downloadDecryptedZip(\n    targets: FileNode[],\n    ctx: {\n      root: string;\n      fmk: CryptoKey;\n      previous: CryptoKey | null | undefined;\n      decorate: (rows: FileNode[], opts: { root: string }) => Promise<FileNode[]>;\n      zipName: string;\n    },\n  ) {\n    let target: SaveTarget;\n    try {\n      target = await pickSaveTarget(ctx.zipName);\n    } catch (err) {\n      if (err instanceof SaveCancelled) return;\n      if (err instanceof SaveNeedsGesture) {\n        deps.toast(t('e2e.dl.click_again'), true);\n        return;\n      }\n      throw err;\n    }\n    let plainFiles = 0;\n    const fileEntry = (r: FileNode, name: string): ZipEntry => ({\n      name,\n      sizeHint: typeof r.size === 'number' ? r.size : undefined,\n      mtime: typeof r.last_modified === 'number' ? new Date(r.last_modified) : undefined,\n      data: async () =>\n        decryptFolderFileStream(ctx.fmk, ctx.previous, await fetchBody(r.path), {\n          passPlain: true,\n          onPlain: () => plainFiles++,\n        }),\n    });\n    const labelOf = (r: FileNode) =>\n      r.e2e_name_state === 'locked' || r.e2e_name_state === 'unreadable'\n        ? (typeof r.e2e_stored === 'string' ? r.e2e_stored : r.basename)\n        : r.basename;\n    async function* walk(dirNode: FileNode, prefix: string): AsyncGenerator<ZipEntry> {\n      yield { name: `${prefix}/` };\n      const resp = await api.index(dirNode.path);\n      const rows = await ctx.decorate(resp.files ?? [], { root: ctx.root });\n      const taken = new Set<string>();\n      for (const r of rows) {\n        if (r.basename === E2E_MARKER_NAME || (typeof r.e2e_stored !== 'string' && r.basename === E2E_MARKER_NAME)) continue;\n        const name = freeName(labelOf(r), taken);\n        taken.add(name);\n        if (r.type === 'dir') yield* walk(r, `${prefix}/${name}`);\n        else yield fileEntry(r, `${prefix}/${name}`);\n      }\n    }\n    async function* all(): AsyncGenerator<ZipEntry> {\n      const taken = new Set<string>();\n      for (const n of targets) {\n        const name = freeName(labelOf(n), taken);\n        taken.add(name);\n        if (n.type === 'dir') yield* walk(n, name);\n        else yield fileEntry(n, name);\n      }\n    }\n    deps.toast(t('e2e.dl.zip_started', { name: ctx.zipName }));\n    try {\n      await target.write(createZipStream(all()), { mime: 'application/zip' });\n      deps.toast(\n        plainFiles > 0 ? t('e2e.dl.zip_done_plain', { name: ctx.zipName, n: plainFiles }) : t('e2e.dl.zip_done', { name: ctx.zipName }),\n      );\n    } catch (err) {\n      await target.discard();\n      if (err instanceof SaveCancelled) return;\n      if (err instanceof SaveTooLarge) {\n        // A zip's size is not known up front: it outgrew the memory here.\n        tooBigFolder(ctx.zipName, ctx.root, null, err.limit);\n        return;\n      }\n      deps.emitError(messageOf(err), 'e2e-download-zip');\n      deps.toast(err instanceof E2eDecryptError ? t('e2e.dl.zip_damaged') : t('e2e.download.failed'), true);\n    }\n  }\n\n  /**\n   * A file over the one-shot limit, going into an encrypted folder: a 0x02\n   * STREAM file, encrypted as it is uploaded. Returns the upload source and\n   * its size; the caller names the upload.\n   */\n  async function folderUploadSource(file: File, fmk: CryptoKey): Promise<UploadSource> {\n    const enc = await encryptFolderFileStream(fmk, file.size, file.stream() as ReadableStream<Uint8Array>);\n    return streamUploadSource(enc.stream, enc.size);\n  }\n\n  /**\n   * wiring:e2 convert - a file over the one-shot limit, encrypted IN PLACE\n   * (docs/E2E-ENCRYPTION.md → \"Encrypting a folder you already have\"): read\n   * from the server as a stream, encrypted as a STREAM (0x02) file as it is\n   * read, and written over itself as a conversion write - on condition that\n   * it is still the file listed (`expect`). Nothing is held but the chunks in\n   * flight, whatever the size.\n   *\n   * Staged where the server has it. Where it has not, a single POST, which\n   * has to be gathered in memory first: up to E2E_BLOB_SAVE_LIMIT, and above\n   * that this resolves FALSE - this browser cannot convert it on this server,\n   * and the file is left as it is (the conversion says so and stays open).\n   */\n  async function convertLarge(\n    row: { path: string; basename: string; size?: number },\n    fmk: CryptoKey,\n    expect: string | null,\n    opts: { signal?: AbortSignal; onProgress?: (fraction: number) => void } = {},\n  ): Promise<boolean> {\n    const size = row.size;\n    if (typeof size !== 'number' || !Number.isSafeInteger(size) || size < 0) {\n      throw new Error('e2e: unknown file size');\n    }\n    const enc = await encryptFolderFileStream(fmk, size, await fetchBody(row.path));\n    const progress = opts.onProgress\n      ? (sent: number) => opts.onProgress!(enc.size > 0 ? Math.min(1, sent / enc.size) : 1)\n      : undefined;\n    try {\n      await uploadStream(wireParentPath(row.path), row.basename, enc.stream, enc.size, progress, {\n        fields: { e2e_convert: '1', ...(expect ? { expect } : {}) },\n        signal: opts.signal,\n      });\n    } catch (err) {\n      if (err instanceof SaveTooLarge) return false;\n      throw err;\n    }\n    return true;\n  }\n\n  /**\n   * Re-wrap a large folder file's key during a re-key without reading it into\n   * memory: the 97-byte header is re-wrapped, the body is re-sent unread.\n   * True for an encrypted file (re-wrapped now, or already under the new\n   * key); false for one that was never encrypted (written over WebDAV).\n   */\n  async function rewrapLarge(row: FileNode, previous: CryptoKey, fmk: CryptoKey): Promise<boolean> {\n    const reader = new ByteStreamReader(await fetchBody(row.path));\n    const head = await reader.read(E2E_FOLDER_HEADER_LEN);\n    if (!hasMagic(head)) {\n      await reader.cancel().catch(() => undefined);\n      return false;\n    }\n    const out = await rewrapFileKey(head.buffer, previous, fmk);\n    if (!out) {\n      await reader.cancel().catch(() => undefined);\n      return true;\n    }\n    const size = typeof row.size === 'number' ? row.size : NaN;\n    if (!Number.isSafeInteger(size)) {\n      await reader.cancel().catch(() => undefined);\n      throw new Error('e2e: unknown file size');\n    }\n    const stored = typeof row.e2e_stored === 'string' ? row.e2e_stored : row.basename;\n    await uploadStream(wireParentPath(row.path), stored, prependBytes(new Uint8Array(out), reader.rest()), size);\n    return true;\n  }\n\n  /** Sizes in words, the one way the explorer writes them (useLocale). */\n  const { formatSize: formatBytes } = useLocale(() => deps.locale() ?? 'en');\n\n  /** Answer a menu key. False when it is not ours. */\n  async function dispatch(key: string, targets: FileNode[], downloadEncryptedCopy: (t: FileNode[]) => Promise<void> | void): Promise<boolean> {\n    const n = targets[0];\n    switch (key) {\n      case 'fxe-encrypt':\n        if (n) startEncrypt(n);\n        return true;\n      case 'fxe-request':\n        if (n) deps.requestEncrypt?.(n);\n        return true;\n      case 'fxe-download-raw':\n        if (n) window.open(api.downloadUrl(n.path), '_blank');\n        return true;\n      case 'fxe-password':\n        if (n) startPassword(n);\n        return true;\n      case 'fxe-remove':\n        if (n) startRemove(n);\n        return true;\n      case 'e2e-download-encrypted':\n        await downloadEncryptedCopy(targets);\n        return true;\n    }\n    return false;\n  }\n\n  return {\n    ringVer,\n    realName,\n    isHiddenFxeName,\n    menuRows,\n    dispatch,\n    // encrypt\n    encryptTarget,\n    encryptBusy,\n    encryptError,\n    encryptProgress,\n    startEncrypt,\n    closeEncrypt,\n    submitEncrypt,\n    // open / download / remove\n    unlockTarget,\n    unlockIntent,\n    unlockBusy,\n    unlockError,\n    unlockProgress,\n    unlockNeedsSave,\n    unlockHasRecovery,\n    unlockEscrow,\n    unlockEscrowKid,\n    open,\n    download,\n    startRemove,\n    closeUnlock,\n    submitUnlock,\n    // password\n    pwTarget,\n    pwBusy,\n    pwError,\n    // too big for this browser\n    tooBig,\n    closeTooBig,\n    startPassword,\n    closePassword,\n    submitPassword,\n    // encrypted folders\n    downloadFolderFile,\n    downloadDecryptedZip,\n    folderUploadSource,\n    convertLarge,\n    rewrapLarge,\n    revokeAll,\n  };\n}\n\nexport type E2eFiles = ReturnType<typeof useE2eFiles>;\n","/**\n * useE2eVault — the explorer's vault mode (wiring:e2 vault;\n * docs/E2E-VAULT-FORMAT.md → \"Clients\", \"The write lock\", \"The idle lock\").\n *\n * A vault is one folder whose tree lives in an encrypted index: the server\n * stores only a key file, index files and packs of one size. Unlocked, the\n * explorer lists the vault from the index, read-only; the first action that\n * writes takes the server's write lock (one writer at a time), and the lock\n * ends by itself when its holder stays idle (the person's own setting, 1-10\n * minutes). Fifteen minutes after that - or after opening, for a vault that\n * never wrote - with nothing done in it at all, the vault locks itself: its\n * keys leave memory and the password is asked again.\n *\n * ONE composable for every surface that runs the explorer (the web app, the\n * desktop app, the embeds): nothing here is written for one of them. The\n * explorer hands in its HTTP client, its key ring's lock and its words.\n *\n * ⚠ This module is the light half, in the explorer's main chunk: the vault\n * folders this tab knows, the strips, and a loader. The work - the sessions,\n * the index, the write lock, every change - is the engine\n * (e2eVaultEngine.ts), loaded with `import()` on the first call that needs it\n * (opening or making a vault), and the rest of lib/e2evault comes with it.\n * Nothing is open before that, so until then the questions the explorer asks\n * on every listing (`rootOf`, `isOpen`, `rows`) are answered here. Only\n * `import type` from the engine and from lib/e2evault in this file\n * (web/tests/quality/vaultLazy.test.ts).\n *\n * Paths: a vault entry's wire path is the vault folder's wire path, `/`, and\n * its path in the tree (`docs://Kasa/Belgeler/not.txt`). Those paths exist\n * only in this tab; the server never sees them.\n */\nimport { reactive, ref, type Ref } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport type { VaultClientKind, VaultHttp } from '../lib/e2evault/api';\nimport type { Clock, LockEnd } from '../lib/e2evault/lock';\nimport type { VaultIndexState } from '../lib/e2evault/vindex';\nimport type { RandomSource } from '../lib/e2evault/writer';\nimport type { VaultEngine } from './e2eVaultEngine';\n\n/** Why a vault is read-only for this session, beyond \"nobody took the lock\". */\nexport type VaultReadOnly = '' | 'damaged' | 'rollback' | 'newer' | 'unreadable';\n\n/** What the vault strip draws (components/E2eVaultStrip.vue). Reactive. */\nexport interface VaultStripState {\n  root: string;\n  /** The vault folder's own name. */\n  name: string;\n  /** The generation on screen. */\n  generation: number;\n  /** 'write': this session holds the write lock. */\n  mode: 'read' | 'write';\n  /** A change is running. */\n  busy: boolean;\n  /** Plaintext bytes of the running change: done / total. */\n  progress: { done: number; total: number } | null;\n  /** Somebody else holds the write lock. */\n  holder: { name: string; client: string; label?: string; since: string } | null;\n  readOnly: VaultReadOnly;\n  /** The commit time of the generation shown, when an older one is shown. */\n  shownAt: number;\n  /** The vault against its limits. */\n  limit: 'ok' | 'warn' | 'full';\n  entries: number;\n  /** Why the write lock ended last, until the next change. */\n  lost: LockEnd | '';\n  /** The idle time that ended it, in minutes (for \"you did nothing for N minutes\"). */\n  lostMinutes: number;\n  /** Who took over writing, or broke the lock, when the server said (`taken`, `broken`). */\n  lostTo: string;\n  /** What was not saved when the lock was lost. */\n  unsaved: string[];\n  /** When the write lock ends for idleness (ms), or 0. */\n  idleDeadline: number;\n  /** The person's idle time, in minutes, while writing. */\n  idleMinutes: number;\n  /** When the vault locks itself (ms), or 0. */\n  lockDeadline: number;\n  /** The last thing that went wrong, said. */\n  error: string;\n}\n\nexport interface VaultHost {\n  http: VaultHttp;\n  /** Headers for the keepalive release (synchronous; the page is closing). */\n  headersNow(): Record<string, string>;\n  t(key: string, vars?: Record<string, string | number>): string;\n  toast(message: string, error?: boolean): void;\n  emitError?(message: string, op: string): void;\n  clientKind(): VaultClientKind;\n  /** Drop the vault's keys from the explorer's key ring (and what hangs on them). */\n  dropKeys(root: string): void;\n  /** The vault locked itself (15 minutes idle) or was locked: show the lock screen. */\n  onLocked(root: string, why: 'idle' | 'manual'): void;\n  /** The tree, or the strip, changed: draw it again. */\n  onChanged(root: string): void;\n  clock?: Clock;\n  random?: RandomSource;\n  /** A count in the person's language (\"212,400\" / \"212.400\"). Default: digits. */\n  formatCount?(n: number): string;\n  /**\n   * An upload's name is taken in the vault: may it go up as `suggested`\n   * instead? The explorer asks with its \"already there\" dialog (the drafts'\n   * one); false leaves that file out. Without it a taken name is numbered.\n   * Nothing in a vault is overwritten: it keeps no earlier version.\n   */\n  askName?(q: { name: string; folder: string; suggested: string }): Promise<boolean>;\n}\n\n/** How `open` starts a session (the engine reads it). */\nexport interface VaultOpenOptions {\n  /** The level the server gave this account at the vault folder. */\n  perm?: string;\n  /** The state to start from, nothing fetched (tests). */\n  initial?: VaultIndexState;\n  /** A vault this tab has just made: generation 1, the empty tree, nothing to fetch. */\n  justMade?: boolean;\n}\n\n/**\n * What the shell and the engine (e2eVaultEngine.ts) share: the strips and the\n * counter the explorer watches, and the vault folders this tab knows. Made by\n * the shell, so the explorer can read them before the engine is loaded.\n */\nexport interface VaultShared {\n  strips: Record<string, VaultStripState>;\n  version: Ref<number>;\n  /** The vault root `wire` is in (or is), among the open and the known ones. */\n  rootOf(wire: string): string | null;\n  /** A vault folder this browser has opened: remembered (see `known`). */\n  remember(root: string): void;\n}\n\n/** The path inside the vault ('' = its root). */\nexport function vaultRelOf(root: string, wire: string): string {\n  const w = String(wire ?? '').replace(/\\/+$/, '');\n  return w === root ? '' : w.slice(root.length + 1);\n}\n\nexport function useE2eVault(host: VaultHost) {\n  /**\n   * Vault folders this browser has opened. A path BELOW one exists only in a\n   * tab that holds the vault's keys, so a restored tab, a reload or a link\n   * that names such a path is sent to the vault folder itself - and the\n   * server never hears of the path below it. The folders' own paths are no\n   * secret (the server stores them), which is why they may be remembered.\n   */\n  const known = new Set<string>(readKnown());\n  /** Strips by root: what the vault strip draws. */\n  const strips = reactive<Record<string, VaultStripState>>({});\n  /** Bumped on every change a listing shows. */\n  const version = ref(0);\n\n  /** The engine, once loaded (the first vault opened or made in this tab). */\n  let engine: VaultEngine | null = null;\n  let loading: Promise<VaultEngine> | null = null;\n\n  /** A vault folder this browser has opened, remembered (see `known`). */\n  function remember(root: string): void {\n    if (known.has(root)) return;\n    known.add(root);\n    writeKnown([...known]);\n  }\n\n  /** The folder at `root` is not a vault (any more): forget it. */\n  function forget(root: string): void {\n    if (!known.delete(root)) return;\n    writeKnown([...known]);\n  }\n\n  /** The vault root `wire` is in (or is), among the open and the known ones. */\n  function rootOf(wire: string): string | null {\n    const w = String(wire ?? '').replace(/\\/+$/, '');\n    let best: string | null = null;\n    for (const r of [...(engine?.openRoots() ?? []), ...known]) {\n      if ((w === r || w.startsWith(r + '/')) && (!best || r.length > best.length)) best = r;\n    }\n    return best;\n  }\n\n  /** Every vault folder this tab knows: open here, or remembered. */\n  function roots(): string[] {\n    return [...new Set([...(engine?.openRoots() ?? []), ...known])];\n  }\n\n  const shared: VaultShared = { strips, version, rootOf, remember };\n\n  /** The engine: loaded once, on the first call that needs it. */\n  function load(): Promise<VaultEngine> {\n    if (engine) return Promise.resolve(engine);\n    if (!loading) {\n      loading = import('./e2eVaultEngine').then(\n        (m) => (engine = m.createVaultEngine(host, shared)),\n        (err) => {\n          // A failed download (offline, a deploy in between) is tried again\n          // by the next call, not remembered.\n          loading = null;\n          throw err;\n        },\n      );\n    }\n    return loading;\n  }\n\n  /** Is this row inside a vault this tab knows? */\n  function isVaultRow(n: FileNode | null | undefined): boolean {\n    return !!n && typeof n.vault_root === 'string' && !!n.vault_root;\n  }\n\n  /** \"Lock\": the keys leave memory, the lock screen comes back. */\n  function lock(root: string): void {\n    if (engine) {\n      engine.lock(root);\n      return;\n    }\n    host.dropKeys(root);\n    host.onLocked(root, 'manual');\n  }\n\n  /** The page is closing: release with keepalive, best effort. */\n  function onPageHide(): void {\n    engine?.onPageHide();\n  }\n\n  // What needs no engine answers from the state above; nothing is open\n  // before the engine is loaded, so the rest answers \"nothing\" until then.\n  // Every call that changes or reads a vault loads it.\n  return {\n    version,\n    strips,\n    rootOf,\n    roots,\n    isVaultRow,\n    forget,\n    relOf: vaultRelOf,\n    isOpen: (root: string | null | undefined): boolean => !!engine?.isOpen(root),\n    permOf: (root: string): string | undefined => engine?.permOf(root),\n    node: (...a: Parameters<VaultEngine['node']>) => engine?.node(...a) ?? null,\n    rows: (...a: Parameters<VaultEngine['rows']>) => engine?.rows(...a) ?? null,\n    search: (...a: Parameters<VaultEngine['search']>) => engine?.search(...a) ?? null,\n    close: (...a: Parameters<VaultEngine['close']>): void => engine?.close(...a),\n    closeAll: (...a: Parameters<VaultEngine['closeAll']>): void => engine?.closeAll(...a),\n    touch: (...a: Parameters<VaultEngine['touch']>): void => engine?.touch(...a),\n    onVisible: (): void => engine?.onVisible(),\n    onEvent: (...a: Parameters<VaultEngine['onEvent']>): void => engine?.onEvent(...a),\n    dismiss: (...a: Parameters<VaultEngine['dismiss']>): void => engine?.dismiss(...a),\n    lock,\n    onPageHide,\n    open: async (...a: Parameters<VaultEngine['open']>) => (await load()).open(...a),\n    create: async (...a: Parameters<VaultEngine['create']>) => (await load()).create(...a),\n    readBytes: async (...a: Parameters<VaultEngine['readBytes']>) => (await load()).readBytes(...a),\n    readUrl: async (...a: Parameters<VaultEngine['readUrl']>) => (await load()).readUrl(...a),\n    download: async (...a: Parameters<VaultEngine['download']>) => (await load()).download(...a),\n    upload: async (...a: Parameters<VaultEngine['upload']>) => (await load()).upload(...a),\n    mkdir: async (...a: Parameters<VaultEngine['mkdir']>) => (await load()).mkdir(...a),\n    rename: async (...a: Parameters<VaultEngine['rename']>) => (await load()).rename(...a),\n    move: async (...a: Parameters<VaultEngine['move']>) => (await load()).move(...a),\n    copy: async (...a: Parameters<VaultEngine['copy']>) => (await load()).copy(...a),\n    remove: async (...a: Parameters<VaultEngine['remove']>) => (await load()).remove(...a),\n    takeOver: async (...a: Parameters<VaultEngine['takeOver']>) => (await load()).takeOver(...a),\n    continueFromShown: async (...a: Parameters<VaultEngine['continueFromShown']>) => (await load()).continueFromShown(...a),\n    /** The person's idle time (minutes, 1-10), kept on the server. */\n    idlePrefs: {\n      get: async (): Promise<number> => (await load()).idlePrefs.get(),\n      set: async (minutes: number): Promise<number> => (await load()).idlePrefs.set(minutes),\n    },\n  };\n}\n\nconst KNOWN_KEY = 'filex.e2e.vaults';\nconst KNOWN_MAX = 200;\n\nfunction readKnown(): string[] {\n  try {\n    const raw = typeof localStorage === 'undefined' ? null : localStorage.getItem(KNOWN_KEY);\n    const list = raw ? (JSON.parse(raw) as unknown) : [];\n    return Array.isArray(list) ? list.filter((x): x is string => typeof x === 'string' && x.includes('://')).slice(-KNOWN_MAX) : [];\n  } catch {\n    return [];\n  }\n}\n\nfunction writeKnown(list: string[]): void {\n  try {\n    if (typeof localStorage !== 'undefined') localStorage.setItem(KNOWN_KEY, JSON.stringify(list.slice(-KNOWN_MAX)));\n  } catch {\n    /* private mode, quota: this tab still knows them */\n  }\n}\n\nexport type E2eVault = ReturnType<typeof useE2eVault>;\n","<script setup lang=\"ts\">\n/**\n * E2eRequestModal — \"Request encryption…\" (wiring:e2 policy). Where the\n * tenant's policy wants an administrator's approval before anything new is\n * encrypted (backend internal/e2epolicy, policy `approval`), the explorer\n * offers this instead of encrypting: from the New folder dialog (a new\n * encrypted folder in the folder on screen, kind `new_folder`), from a\n * folder's menu (that folder, where it is, kind `folder`) and from a file's\n * menu (kind `file`). One dialog for all three; what the approval opens is\n * said per kind, because it opens that and nothing else.\n *\n * It asks one thing — why — and sends `POST /api/files/e2e/requests`. The\n * tenant's administrators are told (`e2e.request_created`) and answer under\n * Admin → Encryption; the person hears the answer (`e2e.request_decided`). The\n * server keeps one waiting request per person and folder or file: asking again\n * answers with the one already there (`created: false`), which the host says\n * as such, not as a second request.\n *\n * ⚠ The reason field carries a visible <label>: a placeholder vanishes the\n * moment anything is typed (web/tests/components/fieldLabels.test.ts).\n * ⚠ A refusal is said HERE, in the reader's language (lib/errorWords): the\n * dialog is what is on screen, and a toast behind it is a toast nobody reads.\n */\nimport { computed, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { E2eRequestDto, E2eRequestKind } from '../types/FileNode';\nimport { useLocale } from '../composables/useLocale';\nimport { sayFailure } from '../lib/errorWords';\nimport { clipRunes, serverLimit } from '../lib/serverRules';\nimport Modal from '../modals/Modal.vue';\n\n/** The one call this dialog makes — `useFileApi().e2eRequest`, or a test's. */\ninterface RequestSender {\n  e2eRequest(body: {\n    path: string;\n    kind: E2eRequestKind;\n    reason: string;\n  }): Promise<{ request: E2eRequestDto; created: boolean }>;\n}\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  api: RequestSender;\n  /** Wire path (`<storage>://<rel>`): the folder, or the one file. */\n  path: string;\n  /** What is asked for (operator decision 2026-10-03: separate kinds, and the\n   *  approval opens only that): `new_folder` - a new encrypted folder inside\n   *  the folder; `folder` - the folder itself, where it is; `file` - the file. */\n  kind: E2eRequestKind;\n  /** What it is, as people read it — the dialog's title. */\n  name: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'sent', answer: { request: E2eRequestDto; created: boolean }): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/** What the approval opens, said before the person asks: one per kind. */\nconst leadText = computed(() =>\n  props.kind === 'file'\n    ? t('e2e.request.lead_file')\n    : props.kind === 'folder'\n      ? t('e2e.request.lead_folder')\n      : t('e2e.request.lead'),\n);\n\n/** The server cuts a reason at its length (`limits.e2e_request_reason_max_runes`,\n *  #211 audit B20); the box stops there instead, counting characters as the\n *  server does. A server that publishes no number cuts it alone. */\nconst reasonMax = computed(() => serverLimit('e2e_request_reason_max_runes'));\n\nconst reason = ref('');\nwatch(reason, (v) => {\n  const clipped = clipRunes(v, reasonMax.value);\n  if (clipped !== v) reason.value = clipped;\n});\nconst busy = ref(false);\nconst err = ref<string | null>(null);\n\nwatch(\n  () => props.open,\n  (v) => {\n    if (v) {\n      reason.value = '';\n      err.value = null;\n    }\n  },\n);\n\nasync function submit() {\n  if (busy.value) return;\n  const said = reason.value.trim();\n  if (!said) {\n    err.value = t('e2e.request.reason_required');\n    return;\n  }\n  busy.value = true;\n  err.value = null;\n  try {\n    const answer = await props.api.e2eRequest({ path: props.path, kind: props.kind, reason: said });\n    emit('sent', answer);\n  } catch (e) {\n    // The sentence only: an administrator's second line (the raw refusal) has\n    // no place in a dialog this small.\n    err.value = sayFailure(e, t('e2e.request.failed'), { t }).text;\n  } finally {\n    busy.value = false;\n  }\n}\n</script>\n\n<template>\n  <Modal\n    :open=\"open\"\n    :locale=\"locale\"\n    :title=\"t('e2e.request.title', { name })\"\n    size=\"sm\"\n    :busy=\"busy\"\n    @close=\"emit('close')\"\n  >\n    <form class=\"fe-e2e-form\" data-testid=\"e2e-request\" @submit.prevent=\"submit\">\n      <p class=\"fe-e2e-names__hint\" data-testid=\"e2e-request-lead\">{{ leadText }}</p>\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('e2e.request.reason') }}</span>\n        <textarea\n          v-model=\"reason\"\n          class=\"fe-input\"\n          rows=\"4\"\n          :placeholder=\"t('e2e.request.reason_placeholder')\"\n          :disabled=\"busy\"\n          data-testid=\"e2e-request-reason\"\n        ></textarea>\n      </label>\n      <p v-if=\"err\" class=\"fe-form__error\" role=\"alert\" data-testid=\"e2e-request-error\">{{ err }}</p>\n    </form>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">\n        {{ t('modal.newfolder.cancel') }}\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :disabled=\"busy\"\n        :aria-busy=\"busy ? 'true' : undefined\"\n        data-testid=\"e2e-request-send\"\n        @click=\"submit\"\n      >\n        {{ busy ? t('e2e.request.sending') : t('e2e.request.send') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","/**\n * nodeRow — the starred / recently-opened / tag endpoints answer with raw node\n * rows (relative `path`, numeric `storage_id`, RFC3339 stamps), not the\n * listing shape. This turns one row into the `FileNode` every view renders.\n *\n * Pure on purpose: the explorer wraps it with its own config, and the unit\n * test pins the two facts the context menu depends on — `perm` and\n * `read_only` — without mounting the component.\n */\nimport type { FileNode } from '../types';\n\n/** What the explorer knows about the install, as far as a row needs it. */\nexport interface NodeRowContext {\n  /** `config.storages` — names, and the host's read-only flag per storage. */\n  storages: ReadonlyArray<{ name: string; readOnly?: boolean }>;\n  /** Multi-storage root mode: a row that cannot be addressed by storage name\n   *  is dropped rather than guessed into somebody else's drive. */\n  multiStorageRoot: boolean;\n}\n\nconst PERM_LEVELS = new Set(['none', 'viewer', 'editor', 'owner']);\n\n/** tablo:t1 — an RFC3339 stamp from a node row as unix ms, or undefined. A\n *  string we cannot parse is left undefined rather than turned into `NaN`,\n *  which would print as \"Invalid Date\" and sort unpredictably. */\nexport function rowMillis(v: unknown): number | undefined {\n  if (typeof v !== 'string' || !v) return undefined;\n  const ms = Date.parse(v);\n  return Number.isFinite(ms) ? ms : undefined;\n}\n\n/**\n * The storage NAME is what a qualified path needs, and a node row does not\n * carry the id-to-name mapping. The backend fills `storage` for exactly this\n * (handlers/meta.go, `(*Meta).rows`); against an older server the only safe\n * fallback is the single-storage case — guessing in a multi-storage install\n * sends the user to a path in somebody else's drive.\n */\nexport function nodeRowToFileNode(\n  row: Record<string, unknown>,\n  ctx: NodeRowContext,\n): FileNode | null {\n  const rel = String(row?.path ?? '').replace(/^\\/+/, '');\n  if (!rel) return null;\n  const configured = ctx.storages ?? [];\n  const storageName =\n    typeof row.storage === 'string' && row.storage\n      ? row.storage\n      : configured.length === 1\n        ? configured[0].name\n        : '';\n  if (ctx.multiStorageRoot && !storageName) return null;\n  const name = String(row.name ?? rel.split('/').pop() ?? '');\n  const isDir = row.type === 'dir';\n  /* issue #34 — these endpoints answer with the raw node row, so `type` here\n     is `model.NodeType`: 'file', 'dir' OR 'symlink'. The listing projector\n     collapses that third value to 'file' and sets a `symlink` flag beside it;\n     `handlers/meta.go` does not, because it ships the node struct as it is.\n     Without this line a link the server will not follow appears on Recent,\n     Starred, a tag view or the Home tray as a plain file with no badge and no\n     explanation — the same fix reaching the folder listing and stopping at\n     the view beside it, which is the split lesson #174 was written about. */\n  const isSymlink = row.type === 'symlink';\n  const size = typeof row.size === 'number' ? row.size : 0;\n  const id = typeof row.id === 'number' ? row.id : undefined;\n  /* ⚠⚠ THE CONTEXT MENU MUST BE THE SAME EVERYWHERE (owner, 2026-09-19). The\n     menu gates Rename / Delete / Move to / Share on the row's own `perm` and\n     on the storage's `read_only` — a folder listing carries both, and until\n     these two lines a Recent / Starred / tag / Home row carried neither, so\n     the menu fell back to the folder opened LAST: nothing on the landing page\n     (every write verb gone), or a stale writable folder (every write verb\n     offered on a read-only mount). The row says for itself what may be done\n     to it, because in these views there is no folder to ask.\n     `read_only` prefers the server's word and falls back to the host's own\n     storage list for a server that predates the field. */\n  const perm =\n    typeof row.perm === 'string' && PERM_LEVELS.has(row.perm)\n      ? (row.perm as FileNode['perm'])\n      : undefined;\n  const hostReadOnly = configured.find((s) => s.name === storageName)?.readOnly === true;\n  const readOnly = typeof row.read_only === 'boolean' ? row.read_only : hostReadOnly;\n  return {\n    type: isDir ? 'dir' : 'file',\n    id,\n    /* tablo:t1 — ⚠⚠ THE DATE. A node row carries `backend_mtime` (what the\n       storage says) and `db_mtime` (what our last scan recorded) as RFC3339\n       strings; `FileNode.last_modified` is unix MILLISECONDS. Nothing mapped\n       between the two, so every row from Recent, Starred and a tag view\n       arrived with no date at all — measured on Recent: eleven rows, eleven em\n       dashes in the Modified column, and a Modified column header you could\n       click that then sorted nothing. It also made the date grouping this view\n       is supposed to show impossible, because every row fell in the \"No date\"\n       bucket. Storage first: `backend_mtime` is the file's own truth and\n       `db_mtime` only says when we last looked at it. */\n    last_modified: rowMillis(row.backend_mtime) ?? rowMillis(row.db_mtime),\n    path: storageName ? `${storageName}://${rel}` : rel,\n    basename: name,\n    extension: isDir\n      ? ''\n      : name.includes('.')\n        ? (name.split('.').pop() || '').toLowerCase()\n        : '',\n    storage: storageName,\n    visibility: 'private',\n    size,\n    file_size: size,\n    mime_type: typeof row.mime === 'string' ? row.mime : '',\n    ...(perm ? { perm } : {}),\n    read_only: readOnly,\n    /* #207 (0.54) — whether the row is starred is the row's own fact: the\n       server puts `starred: true` on every listing and view row it answers\n       (handlers/meta.go), and the explorer no longer fetches a star list of\n       its own to match ids against. Dropped here, every Starred / Recent /\n       tag / Home row read as unstarred, so the menu offered \"Star\" on a file\n       in Starred and the inline star was hollow. */\n    ...(row.starred === true ? { starred: true } : {}),\n    /* ...and WHY it will not open, under the folder listing's own name: the\n       node row carries the reason the sync recorded (`link_state`, migration\n       00098), so the badge here says \"Outside storage\" exactly where the\n       folder says it. A row without one reads as the general \"Link\". */\n    ...(isSymlink\n      ? {\n          symlink: true,\n          ...(typeof row.link_state === 'string' && row.link_state ? { link_state: row.link_state } : {}),\n        }\n      : {}),\n    /* issue #104 - an entry the storage could not answer for. The raw node\n       row carries the flag and the storage's answer under the same names the\n       folder listing uses, so Recent, Starred, a tag view and Home badge it\n       and refuse it exactly as the folder does (lib/unavailable). */\n    ...(row.unavailable === true\n      ? {\n          unavailable: true,\n          ...(typeof row.unavailable_reason === 'string' ? { unavailable_reason: row.unavailable_reason } : {}),\n        }\n      : {}),\n    // ⚠⚠ The SERVER's `thumb_url`, never one built here. It used to be\n    // `/api/files/thumb/<id>` for every file, and the endpoint answers\n    // `404 \"not ready\"` for everything it has not rendered — a docx, a\n    // markdown note, a diagram: opening Recent with ten such files fired ten\n    // requests and all ten 404'd (2026-09-21). The rows now carry the URL\n    // exactly when there is an image behind it (handlers/meta.go, the folder\n    // listing's rule), so a file with none is never asked about.\n    thumb_url: !isDir && typeof row.thumb_url === 'string' && row.thumb_url ? row.thumb_url : undefined,\n    /* wiring:e2 names — the encrypted folder the row sits in (the server\n       answers it for rows outside a folder listing). The explorer's name view\n       reads it to name the row, and openNode to open it in its folder. */\n    ...(typeof row.e2e_root === 'string' && row.e2e_root ? { e2e_root: row.e2e_root } : {}),\n    extra_metadata: {},\n  } as unknown as FileNode;\n}\n","/**\n * rowLevel - which access level a row on screen is judged by.\n *\n * ⚠⚠ #103. A row's level decides how a double-click opens it (the editor or\n * the read-only preview) and which write verbs its menu carries. A row that\n * carries no `perm` of its own used to be judged by the level of the folder\n * the explorer was showing AT THE MOMENT OF THE CLICK - `dirPerm`, which only\n * `load()` sets and which a virtual view forgets on entry. Between two\n * listings that is not the folder the rows came from: going from Starred to a\n * folder clears the view at once, the Starred rows stay on screen until the\n * folder's answer arrives, and in that gap `dirPerm` is `''`. `permCanEdit('')`\n * is false, so a file double-clicked then opened read-only although the\n * person could edit it (seen once in the app-platform measurement,\n * 2026-09-28; e2e/tests/190-open-while-relisting.spec.ts holds the answer\n * back and double-clicks into the gap).\n *\n * Two rules close it, and both are here so the explorer and its test read the\n * same ones:\n *\n *   1. a folder listing hands its level to every row that came with it\n *      (`withListingLevel`, applied where the listing is committed) - so the\n *      row keeps the level of the folder it was listed in, whatever the\n *      explorer is showing by the time it is clicked;\n *   2. a row with no level of its own, judged while no folder level is known\n *      (`''`: a view was just left, or the server enforces no ACL), is NOT\n *      judged by the empty string. It is ungated, as a row in a virtual view\n *      already is - the client only shapes the surface, the server enforces.\n *\n * A row that carries its own `perm` (every listing does on a server with ACL\n * on - handlers/meta.go, manager.go projectFileNodes) is always judged by it.\n */\nimport type { FileNode } from '../types';\n\nconst LEVELS = new Set(['none', 'viewer', 'editor', 'owner']);\n\ntype Level = NonNullable<FileNode['perm']>;\n\nfunction isLevel(v: unknown): v is Level {\n  return typeof v === 'string' && LEVELS.has(v);\n}\n\n/**\n * A folder listing's rows, each carrying a level: its own, else the level the\n * listing states for its folder. A listing that states none (ACL off, an older\n * host) is returned as it is. Rows are copied, never mutated.\n */\nexport function withListingLevel(rows: FileNode[], listingLevel: unknown): FileNode[] {\n  if (!isLevel(listingLevel)) return rows;\n  return rows.map((r) => (typeof r.perm === 'string' ? r : { ...r, perm: listingLevel }));\n}\n\n/**\n * The level a row with no `perm` of its own is judged by. `undefined` means\n * ungated (the write verbs are offered and the server decides).\n *\n * @param virtual    the explorer is in a view whose rows span every storage\n *                   (Recent, Starred, Shared, a tag, Home) - no folder.\n * @param folderLevel the level of the folder being listed; `''` when none is\n *                   known.\n */\nexport function fallbackRowLevel(virtual: boolean, folderLevel: string): string | undefined {\n  if (virtual) return undefined;\n  return folderLevel ? folderLevel : undefined;\n}\n","/**\n * Where a file the person asked to open goes: the host's own window, or the\n * in-page viewer.\n *\n * Host-owned open (the desktop app, `config.openInHost`): every file opens in\n * the host's window per document, so the explorer only emits `file-opened` and\n * stops. ⚠ ONE answer for every way a file gets opened — double-click, Enter,\n * the menu's Open and a document the person has just created. The last one\n * used to open the in-page viewer AND emit, so a new document came up twice on\n * the desktop: once over the explorer and once in its own window (found with\n * #56, 2026-09-26).\n */\nexport type OpenSurface = 'host' | 'page';\n\nexport function openSurface(config: { openInHost?: boolean }, node: { type?: string }): OpenSurface {\n  return config.openInHost && node.type === 'file' ? 'host' : 'page';\n}\n","/**\n * trashEmpty — \"empty the trash\" from the explorer's trash view, followed to\n * the end.\n *\n * ⚠⚠ POST /api/admin/trash/empty used to purge inside the request, so for a\n * large trash it never answered: nginx gave up with a 504 at sixty seconds and\n * the view reported \"504\". The endpoint now answers within seconds — 200 with\n * the final counts when the purge is done, 202 `{running: true, …}` while it\n * goes on in the background — and GET on the same path reports the run until\n * it ends. A 2xx is therefore not \"emptied\" any more; a status whose\n * `running` is false is.\n *\n * ⚠ What the run says is the SERVER's (0.54, finding A4): every status carries\n * `summary`, the server's sentence for where the run stands in the screen's\n * language, and the view shows it. A refusal is thrown as a RequestFailure:\n * the server's own sentence when it wrote one, else the status in the\n * reader's words — never the bare \"504\" a proxy's page used to become.\n */\nimport { requestFailure } from './errorWords';\n\n/** One run as the endpoint reports it. `{running: false}` alone (no\n *  `started_at`) is \"no run known\" — the server restarted under it. */\nexport interface TrashEmptyStatus {\n  /** The ops row behind the run (GET /api/files/ops/{id}, and its cancel). */\n  op_id?: number;\n  running: boolean;\n  /** Waiting its turn behind another purge; `running` is true meanwhile. */\n  queued?: boolean;\n  /** Somebody stopped it; what it had not reached is still in the trash. */\n  cancelled?: boolean;\n  total?: number;\n  scanned?: number;\n  purged?: number;\n  failed?: number;\n  bytes?: number;\n  error?: string;\n  started_at?: string;\n  finished_at?: string;\n  /** Where the run stands, said by the server in the screen's language:\n   *  \"Emptying the trash… 120 of 61,844\", \"Trash emptied: …\". */\n  summary?: string;\n}\n\nexport interface TrashEmptyIO {\n  /** POST /api/admin/trash/empty. */\n  start(): Promise<Response>;\n  /** GET /api/admin/trash/empty. */\n  status(): Promise<Response>;\n  /** The run the server started (or, on BUSY, the caller's own run it is\n   *  following) — once, whether or not it is still going. */\n  onStart?(st: TrashEmptyStatus): void;\n  /** Each look at a run that is still going. */\n  onProgress?(st: TrashEmptyStatus): void;\n  /** Another press had already started this caller's run; it is followed.\n   *  `said` is the server's sentence for it (\"The trash is already being\n   *  emptied.\"). */\n  onBusy?(said: string): void;\n  /** True once nobody is watching any more — the view went away. */\n  stopped?(): boolean;\n  /** The pause between looks (a seam for tests). */\n  sleep?(ms: number): Promise<void>;\n  /** The screen's language, for a refusal the server did not word itself. */\n  locale?: string;\n}\n\n/** A purge holds the trash and it is not one this caller may follow. */\nexport class TrashEmptyBusy extends Error {}\n\nexport const TRASH_EMPTY_POLL_MS = 1500;\n\ntype Json = Record<string, unknown>;\n\nfunction parse(text: string): Json {\n  try {\n    const parsed: unknown = JSON.parse(text);\n    return parsed && typeof parsed === 'object' ? (parsed as Json) : {};\n  } catch {\n    return {};\n  }\n}\n\nasync function body(res: Response): Promise<Json> {\n  return parse(await res.text().catch(() => ''));\n}\n\n/**\n * Starts the purge and resolves with its final status — or `null` once\n * `stopped()` says nobody is watching, which ends the watching, never the\n * purge. Throws TrashEmptyBusy (its message the server's sentence), or a\n * RequestFailure for any other refusal (lib/errorWords: say it with\n * `serverWords`).\n */\nexport async function emptyTrashAndFollow(\n  io: TrashEmptyIO,\n  pollMs = TRASH_EMPTY_POLL_MS,\n): Promise<TrashEmptyStatus | null> {\n  const sleep = io.sleep ?? ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));\n  const res = await io.start();\n  const text = await res.text().catch(() => '');\n  const first = parse(text);\n  let st: TrashEmptyStatus;\n  if (res.status === 409 && first.code === 'BUSY') {\n    // The server hands back the caller's own run when it is that one; a run\n    // it does not describe (another tenant's, the nightly sweep) cannot be\n    // followed from here, and must not be reported as this caller's ending.\n    const job = first.job as TrashEmptyStatus | undefined;\n    if (!job?.running) {\n      throw new TrashEmptyBusy(typeof first.message === 'string' && first.message ? first.message : String(first.error ?? 'busy'));\n    }\n    io.onBusy?.(typeof first.message === 'string' ? first.message : '');\n    st = job;\n  } else if (!res.ok) {\n    throw requestFailure(res.status, text, io.locale);\n  } else {\n    st = first as unknown as TrashEmptyStatus;\n  }\n  io.onStart?.(st);\n  while (st.running) {\n    io.onProgress?.(st);\n    await sleep(pollMs);\n    if (io.stopped?.()) return null;\n    try {\n      const look = await io.status();\n      const next = look.ok ? await body(look) : {};\n      // Only an answer that says whether it is running moves the state on;\n      // anything else is a look that failed.\n      if (typeof next.running === 'boolean') st = next as unknown as TrashEmptyStatus;\n    } catch {\n      // One look that failed is not the end of the run: look again.\n    }\n  }\n  return st;\n}\n","/**\n * What a transfer between two places actually means.\n *\n * Three gestures land on the same wire call — drag a row onto a folder, paste\n * after Ctrl+X, paste after Ctrl+C — and they do NOT mean the same thing once\n * the two ends live in different storages:\n *\n *   • Ctrl+C → paste is a copy, wherever it lands.\n *   • Ctrl+X → paste is a move, wherever it lands. Across storages the server\n *     streams the bytes over and then deletes the original; before v0.27.0 the\n *     explorer quietly downgraded this to a copy and the user was left with the\n *     file in both places, believing they had moved it.\n *   • Dragging is a move inside one storage and a COPY across two — the rule\n *     Explorer and Finder have taught everyone: a drag between drives copies.\n *\n * Kept as a pure function so both the pane path and the clipboard path ask the\n * same question, and so the answer is testable without a server.\n */\n\n/** `alpha://a/b` → `alpha`; a bare path → `''`. */\nexport function wireAdapterOf(p: string): string {\n  const i = String(p ?? '').indexOf('://');\n  return i === -1 ? '' : p.slice(0, i);\n}\n\n/** What the caller asked for. `auto` is a drag: let the storages decide. */\nexport type TransferIntent = 'auto' | 'copy' | 'move';\n\nexport interface TransferPlan {\n  /** What to actually ask the server for. */\n  kind: 'copy' | 'move';\n  /** True when at least one source lives in another storage than the target. */\n  cross: boolean;\n}\n\nexport function resolveTransfer(\n  sources: string[],\n  targetWire: string,\n  intent: TransferIntent = 'auto',\n): TransferPlan {\n  const target = wireAdapterOf(targetWire);\n  // A source with no prefix is a legacy embedder's bare path: it can only mean\n  // \"the same storage I am looking at\", so it never counts as crossing.\n  const cross = sources.some((p) => {\n    const a = wireAdapterOf(p);\n    return a !== '' && target !== '' && a !== target;\n  });\n  if (intent === 'copy') return { kind: 'copy', cross };\n  if (intent === 'move') return { kind: 'move', cross };\n  return { kind: cross ? 'copy' : 'move', cross };\n}\n","/**\n * downloadSelection — hand the browser ONE archive for a set of files.\n *\n * # What was there before\n *\n * `downloadFile(n)` is `window.open(api.downloadUrl(n.path), '_blank')` — one\n * tab, one body, one file. Five selected rows would have been five\n * `window.open` calls, and the browser stops the second one: they are popups\n * once the user gesture has been spent. That is the whole reason the selection\n * bar HID Download the moment a second row was selected, rather than doing\n * something bad with it.\n *\n * # Why two steps\n *\n * A download has to be a NAVIGATION. `fetch()` + `URL.createObjectURL(blob)`\n * buffers the entire archive in the tab before a single byte reaches disk,\n * which is exactly what a 4 GB selection cannot survive. Only a navigation\n * streams.\n *\n * But a navigation is a GET: it carries its arguments in the URL, where 300\n * selected paths do not fit, and it carries no `Authorization` header, which is\n * how the embedded hosts (work.example.com, fishapp) authenticate. So the server\n * splits it — an authenticated POST that resolves and authorizes the member\n * list and returns a short ticket URL, then a plain navigation to that URL.\n * `POST /api/files/archive/download` → `GET /z/<ticket>`.\n *\n * # Why an iframe and not window.open\n *\n * ⚠ The navigation happens AFTER an await. The user's gesture token is spent by\n * then, so `window.open` at that point is a popup and gets blocked — the same\n * failure the whole feature exists to avoid, moved one step later where it is\n * harder to notice. `location.href = url` is not blocked, but if the server\n * ever answers with a text error instead of an attachment the app navigates\n * away and the user loses their place. A hidden iframe is neither: an\n * attachment response is handed to the download manager, and an error body\n * lands somewhere invisible.\n */\n\nimport type { FileApi } from '../composables/useFileApi';\nimport { underApiBase } from './appBase';\n\n/** What the mint returns. Mirrors `archiveDownloadInfo` in the Go handler. */\nexport interface ArchiveTicket {\n  /** Path to navigate to. Server-relative, e.g. `/z/<token>`. */\n  url: string;\n  ticket: string;\n  /** Filename the browser will save, e.g. `Faturalar.zip`. */\n  name: string;\n  /** How many files the archive will contain, after the server expanded any\n   *  selected folders and dropped what the caller may not read. */\n  files: number;\n  /** Uncompressed total. NOT the archive's size — see the Go handler on why\n   *  there is no such number until the last member is deflated. */\n  bytes: number;\n  expires_at: string;\n}\n\n/**\n * The mint endpoint for a given manager URL.\n *\n * Derived by swapping the trailing `/manager` segment, which is how every\n * route outside the endpoint map is built in useFileApi (`/permissions`,\n * `/versions`, `/comments`, `/ws-ticket`). Doing it this way rather than\n * hardcoding `/api/files/...` is what keeps a cross-origin embed working: the\n * host configured `apiBase`, and the archive call has to land on the same\n * origin as the rest of the explorer.\n */\nexport function archiveTicketUrl(managerUrl: string): string {\n  const base = managerUrl.split('?')[0];\n  return base.replace(/\\/manager$/, '/archive/download');\n}\n\n/** The manager endpoint's tail when it was derived from `apiBase`. */\nconst MANAGER_TAIL = '/api/files/manager';\n\n/**\n * Where the ticket URL should be fetched from.\n *\n * The server answers `/z/<token>` RELATIVE TO ITS ROOT — it cannot know where\n * its reader sees it. The reader's server root is the manager URL minus\n * `/api/files/manager`, and it keeps its PATH: `/filex` for the admin app\n * under a sub-path (FILEX_BASE_PATH), `https://host.example/files-proxy` for an\n * embed whose host proxies filex under a path of its own. Keeping only the\n * origin (what this did before) sent both to the host's root, where the\n * ticket 404s — a multi-selection ZIP or a drag-out that silently fails.\n *\n * A manager endpoint the host named itself, not ending in\n * `/api/files/manager`, says nothing about the server root; the origin is the\n * best evidence left, as before.\n */\nexport function absoluteTicketUrl(managerUrl: string, ticketUrl: string): string {\n  if (/^https?:\\/\\//i.test(ticketUrl)) return ticketUrl;\n  const base = managerUrl.split('?')[0];\n  if (base.endsWith(MANAGER_TAIL)) return underApiBase(base.slice(0, -MANAGER_TAIL.length), ticketUrl);\n  const m = /^(https?:\\/\\/[^/]+)/i.exec(base);\n  return m ? m[1] + ticketUrl : ticketUrl;\n}\n\n/**\n * Ask the server to prepare an archive of `paths` and return the ticket.\n *\n * Throws the same shaped error every other call in useFileApi throws — a\n * localized `message` plus `status`/`detail` — so a caller can toast\n * `err.message` and branch on `err.status` (409 = nothing readable in the\n * selection, 413 = too many files).\n */\nexport async function requestArchive(\n  api: Pick<FileApi, 'jsonFetch' | 'endpoints'>,\n  paths: string[],\n  name?: string,\n): Promise<ArchiveTicket> {\n  const url = archiveTicketUrl(api.endpoints.manager);\n  return api.jsonFetch<ArchiveTicket>(url, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify(name ? { paths, name } : { paths }),\n  });\n}\n\n/**\n * #71 — a short-lived, single-use, credential-free link to ONE file: the\n * browser's drag-out (`DownloadURL`) for a session whose credential cannot\n * travel on its own (a bearer — the admin SPA). The same mint as an archive,\n * asked with `mode: \"file\"`, and the same `/z/<ticket>` redeem; the server\n * streams the file as itself and re-checks the minter's reach at the drop\n * (backend handlers/download_link.go).\n *\n * Resolves `null` for a server that does not know the mode. An older one\n * ignores the field and mints a ZIP of the one file, and a zip dropped on the\n * desktop under the file's own name is a broken file — worse than a drag that\n * carries nothing. `ttlMs` is the link's life as the server counted it, so the\n * caller never has to compare its clock with the server's.\n */\nexport async function requestFileLink(\n  api: Pick<FileApi, 'jsonFetch' | 'endpoints'>,\n  path: string,\n): Promise<{ url: string; ttlMs: number } | null> {\n  const ticket = await api.jsonFetch<ArchiveTicket & { mode?: string; ttl_seconds?: number }>(\n    archiveTicketUrl(api.endpoints.manager),\n    {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ paths: [path], mode: 'file' }),\n    },\n  );\n  if (!ticket || ticket.mode !== 'file' || typeof ticket.url !== 'string') return null;\n  const ttl = Number(ticket.ttl_seconds);\n  return {\n    url: absoluteTicketUrl(api.endpoints.manager, ticket.url),\n    ttlMs: Number.isFinite(ttl) && ttl > 0 ? ttl * 1000 : 60_000,\n  };\n}\n\n/**\n * How long a download iframe is left in the document.\n *\n * It only has to outlive the moment the browser reads the response headers and\n * hands the body to its download manager; the transfer itself continues after\n * the element is gone. Sixty seconds is slack for a storage that takes a while\n * to produce the first byte, and is short enough that a session of repeated\n * downloads does not accumulate frames.\n */\nexport const DOWNLOAD_FRAME_TTL_MS = 60_000;\n\n/**\n * Navigate to `url` in a way that saves a file instead of moving the page.\n *\n * Exported separately from `downloadArchive` so a caller that already has a\n * ticket (a retry, a test) can trigger it, and so the DOM half can be replaced\n * in an environment that has no document.\n */\nexport function triggerFileNavigation(url: string, doc: Document = document): void {\n  const frame = doc.createElement('iframe');\n  frame.hidden = true;\n  frame.setAttribute('aria-hidden', 'true');\n  frame.style.display = 'none';\n  frame.src = url;\n  doc.body.appendChild(frame);\n  setTimeout(() => frame.remove(), DOWNLOAD_FRAME_TTL_MS);\n}\n\n/**\n * Mint an archive for `paths` and start downloading it.\n *\n * Resolves with the ticket once the download has been STARTED — not once it has\n * finished, which the page cannot observe. A caller that wants to say \"12 files\"\n * in a toast reads it off the returned ticket.\n */\nexport async function downloadArchive(\n  api: Pick<FileApi, 'jsonFetch' | 'endpoints'>,\n  paths: string[],\n  opts: { name?: string; doc?: Document } = {},\n): Promise<ArchiveTicket> {\n  const ticket = await requestArchive(api, paths, opts.name);\n  triggerFileNavigation(\n    absoluteTicketUrl(api.endpoints.manager, ticket.url),\n    opts.doc ?? document,\n  );\n  return ticket;\n}\n","/**\n * A search hit, turned into the things the explorer can act on — task #47.\n *\n * `/api/files/search` answers with raw node rows, not listing rows: an\n * in-storage relative `path`, a numeric `storage_id` and (on current servers)\n * the drive's NAME in `storage`. Everything done with a hit — the advanced\n * search's result rows, and the ⌘K palette's open / download / drag-out —\n * needs the wire address a listing row carries (`name://rel`). One module\n * builds it, so those surfaces cannot disagree about where a file is: \"open\n * works, download 404s\" is what several inline copies of one rule turn into.\n *\n * The second half is the desktop's rail: several accounts searched at once,\n * each hit tagged with its account, one group per account.\n */\n\nimport type { GlobalSearchHit } from '../composables/useFileApi';\nimport type { SearchAccount } from '../types/ExplorerConfig';\nimport type { FileNode } from '../types/FileNode';\nimport type { DragItem } from './dragOut';\n\n/** What the explorer knows about drives when a hit does not say its own. */\nexport interface HitDriveContext {\n  /** Drive names the host configured (`config.storages`). */\n  configured: string[];\n  /** The drive the explorer has open right now. */\n  current: string;\n}\n\n/** The hit's path inside its drive, without leading or trailing slashes. */\nexport function hitRelPath(hit: GlobalSearchHit): string {\n  return String(hit.path ?? '').replace(/^\\/+|\\/+$/g, '');\n}\n\n/**\n * Which drive a hit lives on: the name the server sent > `storage_name`\n * (older servers) > the only configured drive > the drive that is open.\n * A wrong last-resort guess lands on the listing's \"folder not found\" state,\n * which is a graceful dead end — not a request against the wrong file.\n */\nexport function hitStorageName(hit: GlobalSearchHit, ctx: HitDriveContext): string {\n  if (typeof hit.storage === 'string' && hit.storage) return hit.storage;\n  if (typeof hit.storage_name === 'string' && hit.storage_name) return hit.storage_name;\n  if (ctx.configured.length === 1 && ctx.configured[0]) return ctx.configured[0];\n  return ctx.current || '';\n}\n\n/**\n * Map one raw search hit onto the listing shape.\n *\n * ⚠ The drive comes from the HIT (`describeHits` puts it there), not from the\n * pane we happen to be standing in — a content search spans storages, so the\n * open drive is only the right answer by accident. `storageName` stays as the\n * fallback for a backend older than that field.\n *\n * (Moved here from FileExplorer's `advHitToNode` for #47, unchanged: the\n * palette's download and drag-out need the same row the advanced search draws.)\n */\nexport function hitToNode(h: GlobalSearchHit, storageName: string): FileNode {\n  const rel = String(h.path ?? '').replace(/^\\/+/, '');\n  const drive = typeof h.storage === 'string' && h.storage ? h.storage : storageName;\n  const name = String(h.name ?? rel.split('/').pop() ?? '');\n  const dot = name.lastIndexOf('.');\n  const mtime = typeof h.backend_mtime === 'string' ? h.backend_mtime : h.updated_at;\n  const ms = typeof mtime === 'string' ? Date.parse(mtime) : NaN;\n  return {\n    id: typeof h.id === 'number' ? h.id : undefined,\n    path: drive ? `${drive}://${rel}` : rel,\n    basename: name,\n    relativePath: rel,\n    type: h.type === 'dir' ? 'dir' : 'file',\n    extension: dot > 0 ? name.slice(dot + 1).toLowerCase() : '',\n    size: typeof h.size === 'number' ? h.size : 0,\n    // ⚠ Left UNSET when the row carries no parseable timestamp rather than\n    // defaulted to 0 or to now: `matchesModified` treats a missing timestamp\n    // as \"unknown\" and drops the row from a date filter, which is the honest\n    // answer. Stamping it with `Date.now()` would file every such file under\n    // \"Today\".\n    last_modified: Number.isNaN(ms) ? undefined : ms,\n    mime_type: typeof h.mime === 'string' ? h.mime : '',\n    /* The content snippet the hit came with, so a content match can show why\n       it matched. Undefined on name-only hits, exactly as the backend sends. */\n    snippet: typeof h.snippet === 'string' && h.snippet ? h.snippet : undefined,\n    /* Owner, so the People filter and the Owner column mean the same thing in a\n       content result as they do in a folder listing. Undefined rather than\n       guessed when the backend does not send it. */\n    owner_id: typeof h.owner_id === 'number' ? h.owner_id : undefined,\n    owner_name: typeof h.owner_name === 'string' ? h.owner_name : undefined,\n    owner_self: h.owner_self === true ? true : undefined,\n    /* wiring:e2 names — the encrypted folder the hit sits in (the server\n       answers it); the explorer's name view reads it. */\n    ...(typeof h.e2e_root === 'string' && h.e2e_root ? { e2e_root: h.e2e_root } : {}),\n  };\n}\n\n/**\n * The hit as a drag-out / download item (`name://rel`, its name, its kind) —\n * or null when there is nothing to address: no path, or no drive to put it on.\n * The same `{path, basename, type}` a listing row hands the drag-out hook.\n */\nexport function hitItem(hit: GlobalSearchHit, ctx: HitDriveContext): DragItem | null {\n  const drive = hitStorageName(hit, ctx);\n  if (!hitRelPath(hit) || !drive) return null;\n  const n = hitToNode(hit, drive);\n  return { path: n.path, basename: n.basename, type: n.type };\n}\n\n/** One account's hits, in the server's order. `account` undefined = no rail. */\nexport interface HitGroup {\n  account?: SearchAccount;\n  hits: GlobalSearchHit[];\n}\n\n/**\n * Hits → one group per account, in the order accounts first appear (the\n * explorer lists its own account first), each capped at `limit` on its own —\n * a busy account must not push a quieter one off the list.\n */\nexport function groupHitsByAccount(hits: GlobalSearchHit[], limit: number): HitGroup[] {\n  const groups: HitGroup[] = [];\n  const byKey = new Map<string, HitGroup>();\n  for (const hit of hits) {\n    const key = hit.account?.id ?? '';\n    let group = byKey.get(key);\n    if (!group) {\n      group = { account: hit.account, hits: [] };\n      byKey.set(key, group);\n      groups.push(group);\n    }\n    if (group.hits.length < limit) group.hits.push(hit);\n  }\n  return groups;\n}\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { isInternalName } from '../lib/internalPaths';\nimport Modal from './Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /* wiring:e2 — the \"Create encrypted folder…\" line. ⚠ A host passes `true`\n   * to show it: Vue casts an absent boolean prop to `false`, so a host that\n   * says nothing gets no line (the old \"Default: shown\" here was never true).\n   * FileExplorer passes the policy's answer (wiring:e2 policy). */\n  encryptedOption?: boolean;\n  /* wiring:e2 policy — the tenant's policy wants an administrator's approval\n   * before an encrypted folder is made here: the same line offers to ask for\n   * one instead. Read only while `encryptedOption` is false — the two are one\n   * line, never both. */\n  encryptedRequest?: boolean;\n  /** The server's answer when it did not make the folder. It used to go to\n   *  the host's console only, and the dialog stayed open with nothing in it. */\n  error?: string | null;\n  /** The folder is being made; Create and Enter wait for the answer. */\n  busy?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'submit', name: string): void;\n  /* wiring:e2 — user picked \"Create encrypted folder…\" — the parent swaps\n   * this modal for EncryptedFolderModal. */\n  (e: 'encrypted'): void;\n  /* wiring:e2 policy — user picked \"Request an encrypted folder…\" — the\n   * parent swaps this modal for E2eRequestModal. */\n  (e: 'request-encrypted'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst name = ref('');\nconst err = ref<string | null>(null);\n\nwatch(() => props.open, (v) => {\n  if (v) {\n    name.value = '';\n    err.value = null;\n  }\n});\n\nwatch(\n  () => props.error,\n  (e) => {\n    if (e) err.value = e;\n  },\n);\n\nfunction submit() {\n  if (props.busy) return;\n  const clean = name.value.trim();\n  if (!clean) {\n    err.value = t('modal.newfolder.placeholder');\n    return;\n  }\n  if (/[\\\\/]/.test(clean) || clean === '.' || clean === '..') {\n    err.value = t('modal.newfolder.invalid');\n    return;\n  }\n  // The server refuses these (403 RESERVED_NAME, handlers/reserved_guard.go)\n  // in English; saying it here, in the reader's language, is the courtesy —\n  // the server is still the check.\n  if (isInternalName(clean)) {\n    err.value = t('names.reserved', { name: clean });\n    return;\n  }\n  emit('submit', clean);\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('modal.newfolder.title')\" size=\"sm\" :busy=\"busy\" @close=\"emit('close')\">\n    <form @submit.prevent=\"submit\">\n      <!-- A visible name, as in the encrypted-folder dialog this one opens. -->\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('modal.newfolder.placeholder') }}</span>\n        <input\n          v-model=\"name\"\n          type=\"text\"\n          class=\"fe-input\"\n          autocomplete=\"off\"\n          @keydown.enter.prevent=\"submit\"\n        />\n      </label>\n      <p v-if=\"err\" class=\"fe-form__error\" role=\"alert\">{{ err }}</p>\n      <!-- wiring:e2 — encrypted-folder entry point lives inside the normal\n           new-folder flow so every trigger (toolbar / context menu / palette)\n           reaches it without extra wiring. wiring:e2 policy — where encrypting\n           here needs an administrator's approval, the same line asks for one. -->\n      <button\n        v-if=\"encryptedOption !== false\"\n        type=\"button\"\n        class=\"fe-e2e-optlink\"\n        @click=\"emit('encrypted')\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-e2e-optlink__icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('lock')\"></span>\n        {{ t('e2e.create.option') }}\n      </button>\n      <button\n        v-else-if=\"encryptedRequest\"\n        type=\"button\"\n        class=\"fe-e2e-optlink\"\n        data-testid=\"e2e-request-option\"\n        @click=\"emit('request-encrypted')\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-e2e-optlink__icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('lock')\"></span>\n        {{ t('e2e.request.option') }}\n      </button>\n      <!-- /wiring:e2 -->\n    </form>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">\n        {{ t('modal.newfolder.cancel') }}\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :disabled=\"busy\"\n        :aria-busy=\"busy ? 'true' : undefined\"\n        @click=\"submit\"\n      >\n        {{ busy ? t('modal.newfolder.creating') : t('modal.newfolder.create') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from './Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  archiveName: string;\n  suggestedFolder: string;\n  busy?: boolean;\n  error?: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'submit', value: { folder: string }): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst folder = ref('');\nconst localError = ref('');\n\nwatch(() => props.open, (open) => {\n  if (!open) return;\n  folder.value = props.suggestedFolder;\n  localError.value = '';\n});\n\nfunction submit() {\n  /* ⚠ Enter in the box submits the form too, and the buttons' `disabled`\n   * does not reach it: while the server was still reading the archive, a\n   * second Enter sent it again — a second download, a second job. */\n  if (props.busy) return;\n  if (!folder.value.trim() || /[\\\\/]/.test(folder.value)) {\n    localError.value = t('archive.invalid_folder');\n    return;\n  }\n  emit('submit', { folder: folder.value.trim() });\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('archive.extract_title')\" size=\"sm\" :busy=\"busy\" @close=\"emit('close')\">\n    <form class=\"fe-form\" @submit.prevent=\"submit\">\n      <p class=\"fe-field__hint\">{{ archiveName }}</p>\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('archive.destination_folder') }}</span>\n        <input v-model=\"folder\" class=\"fe-input\" autocomplete=\"off\" :disabled=\"busy\" />\n      </label>\n      <p v-if=\"localError || error\" class=\"fe-form__error\">{{ localError || error }}</p>\n    </form>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">{{ t('archive.cancel') }}</button>\n      <button type=\"button\" class=\"fe-btn fe-btn--primary\" :disabled=\"busy\" :aria-busy=\"busy ? 'true' : undefined\" @click=\"submit\">\n        {{ busy ? t('archive.extracting') : t('archive.extract_to_folder') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from './Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  archiveName: string;\n  busy?: boolean;\n  error?: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'submit', password: string): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst password = ref('');\n\nwatch(() => props.open, (open) => {\n  if (open) password.value = '';\n});\n\nfunction submit() {\n  if (!password.value || props.busy) return;\n  emit('submit', password.value);\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('archive.password_title')\" size=\"sm\" :busy=\"busy\" @close=\"emit('close')\">\n    <form class=\"fe-form\" @submit.prevent=\"submit\">\n      <p class=\"fe-field__hint\">{{ archiveName }}</p>\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('archive.password_required') }}</span>\n        <input\n          v-model=\"password\"\n          class=\"fe-input\"\n          type=\"password\"\n          autocomplete=\"off\"\n          data-1p-ignore\n          data-bwignore=\"true\"\n          data-lpignore=\"true\"\n          autofocus\n          :disabled=\"busy\"\n        />\n      </label>\n      <p v-if=\"error\" class=\"fe-form__error\" role=\"alert\">{{ error }}</p>\n    </form>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">\n        {{ t('archive.cancel') }}\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :disabled=\"busy || !password\"\n        :aria-busy=\"busy ? 'true' : undefined\"\n        @click=\"submit\"\n      >\n        {{ busy ? t('archive.opening') : t('archive.continue') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * DraftConflictModal — \"a file with this name is already there\" (issue #71).\n *\n * Saving a draft never replaces anything. When its folder already holds a\n * file of its name, the server answers with the free name beside it —\n * `name (2).ext`, the numbering the New document dialog suggests — and saves\n * nothing until the person agrees to exactly that name. This is that\n * question, asked the same way from the editor's Save button, from its close\n * question and from the Drafts view.\n *\n * wiring:e2 vault — and the explorer's question for an upload into a vault\n * whose name is taken (`kind=\"upload\"`): a vault keeps no earlier version, so\n * nothing there is replaced; the file goes up under the free name, or not at\n * all. One \"already there\" dialog for both, not a second one.\n */\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from './Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /** The viewer's theme: these dialogs sit beside its card, not inside it. */\n  theme?: ThemeMode;\n  /** The draft's own name — what is already there. */\n  name: string;\n  /** The free name the server offered. */\n  suggested: string;\n  /** The folder, as a person reads it (`docs / Reports`). */\n  folder: string;\n  busy?: boolean;\n  error?: string | null;\n  /** What is being saved: a draft (the default) or an upload into a vault. */\n  kind?: 'draft' | 'upload';\n}>();\n\nconst emit = defineEmits<{\n  (e: 'cancel'): void;\n  (e: 'confirm'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst upload = () => props.kind === 'upload';\n</script>\n\n<template>\n  <Modal :open=\"open\" :locale=\"locale\" :theme=\"theme\" :title=\"t('draft.taken.title')\" size=\"sm\" :busy=\"busy\" @close=\"emit('cancel')\">\n    <div class=\"fe-draftq\" data-testid=\"draft-taken-dialog\">\n      <p class=\"fe-draftq__body\">{{ t(upload() ? 'upload.taken.body' : 'draft.taken.body', { name, folder, suggested }) }}</p>\n      <p v-if=\"error\" class=\"fe-form__error\" role=\"alert\">{{ error }}</p>\n    </div>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" data-testid=\"draft-taken-cancel\" @click=\"emit('cancel')\">\n        {{ t('modal.rename.cancel') }}\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :disabled=\"busy\"\n        :aria-busy=\"busy ? 'true' : undefined\"\n        data-testid=\"draft-taken-confirm\"\n        @click=\"emit('confirm')\"\n      >\n        {{ t(upload() ? 'upload.taken.confirm' : 'draft.taken.confirm', { name: suggested }) }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","/**\n * useDraftSave — \"save this draft where it belongs\", with its one question\n * (issue #71).\n *\n * Saving a draft never replaces a file. When the folder it is meant for\n * already holds a file of its name the server answers with the free name\n * beside it (`name (2).ext`) and moves nothing; the person is asked, and the\n * draft is saved under exactly that name only if they agree. The editor's\n * Save button, its close question and the Drafts view all ask it the same way\n * — this state, drawn by DraftConflictModal.\n *\n * `save(draft)` resolves with where the file went, or null when the person\n * declined; a refusal of the FIRST attempt (the folder is gone, no permission)\n * rejects, for the caller to say where it was pressed. A refusal while the\n * question is on screen is said inside it (`error`).\n */\nimport { ref } from 'vue';\nimport { draftFolderLabel, type DraftDto, type DraftsClient } from '../lib/drafts';\n\nexport interface SavedDraft {\n  path: string;\n  name: string;\n  targetDir: string;\n}\n\nexport interface DraftQuestion {\n  key: string;\n  name: string;\n  suggested: string;\n  folder: string;\n}\n\nexport function useDraftSave(client: () => DraftsClient | null, say: (err: unknown) => string) {\n  const busy = ref(false);\n  const error = ref<string | null>(null);\n  const question = ref<DraftQuestion | null>(null);\n  let pending: ((r: SavedDraft | null) => void) | null = null;\n\n  function settle(r: SavedDraft | null) {\n    question.value = null;\n    error.value = null;\n    const p = pending;\n    pending = null;\n    p?.(r);\n  }\n\n  async function save(d: Pick<DraftDto, 'key'>): Promise<SavedDraft | null> {\n    const api = client();\n    if (!api) return null;\n    busy.value = true;\n    try {\n      const out = await api.save(d.key);\n      if (out.saved) return { path: out.path, name: out.name, targetDir: out.targetDir };\n      question.value = {\n        key: d.key,\n        name: out.name,\n        suggested: out.suggested,\n        folder: draftFolderLabel(out.targetDir),\n      };\n      error.value = null;\n    } finally {\n      busy.value = false;\n    }\n    return new Promise<SavedDraft | null>((resolve) => {\n      pending = resolve;\n    });\n  }\n\n  /** The person agreed to the suggested name. */\n  async function confirm() {\n    const q = question.value;\n    const api = client();\n    if (!q || !api || busy.value) return;\n    busy.value = true;\n    error.value = null;\n    try {\n      const out = await api.save(q.key, q.suggested);\n      if (out.saved) {\n        settle({ path: out.path, name: out.name, targetDir: out.targetDir });\n        return;\n      }\n      // Taken in the meantime too: ask again, with the next free name.\n      question.value = { ...q, name: out.name || q.name, suggested: out.suggested };\n    } catch (err) {\n      error.value = say(err);\n    } finally {\n      busy.value = false;\n    }\n  }\n\n  /** The person declined: nothing moved, the draft stays a draft. */\n  function cancel() {\n    if (busy.value) return;\n    settle(null);\n  }\n\n  return { busy, error, question, save, confirm, cancel };\n}\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { isInternalName } from '../lib/internalPaths';\nimport Modal from './Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  currentName: string;\n  /** Why the last attempt did not happen — the host's answer from the server\n   *  (a taken name, a refusal, an outage). Shown under the field until the\n   *  name is edited. */\n  error?: string | null;\n  /** The rename is on its way. Renaming a folder on an object store copies\n   *  every object in it, so this can last; a second Save meanwhile met the\n   *  half-copied folder and was refused as \"already here\". */\n  busy?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'submit', name: string): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst name = ref('');\n// What the dialog is saying right now — ONE line, whoever said it: the host's\n// error, or the dialog's own refusal of a name that is not one (a slash, \".\"\n// or \"..\", a name filex keeps for itself). Either goes away once the person\n// edits the name.\nconst shownError = ref<string | null>(null);\n\nwatch(\n  () => [props.open, props.currentName] as const,\n  ([isOpen, cur]) => {\n    if (isOpen) {\n      name.value = cur;\n      shownError.value = props.error ?? null;\n    }\n  },\n);\n\nwatch(\n  () => props.error,\n  (err) => {\n    shownError.value = err ?? null;\n  },\n  { immediate: true },\n);\n\nfunction onInput() {\n  shownError.value = null;\n}\n\nfunction submit() {\n  if (props.busy) return;\n  const clean = name.value.trim();\n  if (!clean) return;\n  if (/[\\\\/]/.test(clean) || clean === '.' || clean === '..') {\n    // Refused here with a word, not by doing nothing: a Save button that\n    // silently ignores the click reads as a broken dialog.\n    shownError.value = t('modal.newfolder.invalid');\n    return;\n  }\n  // A document renamed to `.versions` would vanish from every view the\n  // moment it was renamed; the server refuses it, this says why.\n  if (isInternalName(clean)) {\n    shownError.value = t('names.reserved', { name: clean });\n    return;\n  }\n  emit('submit', clean);\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('modal.rename.title')\" size=\"sm\" :busy=\"busy\" @close=\"emit('close')\">\n    <form @submit.prevent=\"submit\">\n      <input\n        v-model=\"name\"\n        type=\"text\"\n        class=\"fe-input\"\n        autocomplete=\"off\"\n        @input=\"onInput\"\n        @keydown.enter.prevent=\"submit\"\n      />\n      <p v-if=\"shownError\" class=\"fe-form__error\" role=\"alert\" data-testid=\"rename-error\">{{ shownError }}</p>\n    </form>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">\n        {{ t('modal.rename.cancel') }}\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :disabled=\"busy\"\n        :aria-busy=\"busy ? 'true' : undefined\"\n        @click=\"submit\"\n      >\n        {{ busy ? t('modal.rename.saving') : t('modal.rename.save') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from './Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  count: number;\n  /** The server's answer when it did not take the delete. It used to go to\n   *  the host's console only, and the dialog stayed open with nothing in it. */\n  error?: string | null;\n  /** The delete is on its way; the button waits for the answer. */\n  busy?: boolean;\n  /** The items are in the trash already: this deletes them for good, and\n   *  the words say so. They said \"will be moved to trash\" about items that\n   *  were there. */\n  permanent?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'confirm'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nfunction confirm() {\n  if (props.busy) return;\n  emit('confirm');\n}\n</script>\n\n<template>\n  <Modal\n    :open=\"open\"\n    :title=\"permanent ? t('modal.delete.permanent_title') : t('modal.delete.title')\"\n    size=\"sm\"\n    :busy=\"busy\"\n    @close=\"emit('close')\"\n  >\n    <p>{{ permanent ? t('modal.delete.permanent_message', { count }) : t('modal.delete.message', { count }) }}</p>\n    <p v-if=\"error\" class=\"fe-form__error\" role=\"alert\">{{ error }}</p>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">\n        {{ t('modal.delete.cancel') }}\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--danger\"\n        :disabled=\"busy\"\n        :aria-busy=\"busy ? 'true' : undefined\"\n        @click=\"confirm\"\n      >\n        {{\n          busy\n            ? t(permanent ? 'modal.delete.permanent_working' : 'modal.delete.working')\n            : t(permanent ? 'modal.delete.permanent_confirm' : 'modal.delete.confirm')\n        }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","/**\n * What an Undo did, as the undo itself reports it.\n *\n * ⚠ The explorer said \"Undone\" whenever the undo's promise settled — about an\n * undo of a move that had only been QUEUED (the move back runs as a job,\n * minutes later on an object store), and about a restore that had brought\n * back two of five items. An undo now says which it was: nothing (it ran to\n * its end), `queued` (the operations centre follows it, and says when it\n * ends), or the server's own sentence for it (`summary`).\n *\n * ⚠ 0.54 (finding A15): the undo of a delete is one restore request, and the\n * server answers what came back and what did not and why — that sentence is\n * shown as it is. The \"{done} of {total}\" this file composed is gone.\n */\nexport type UndoOutcome = void | { queued?: boolean; summary?: string };\n\nexport function sayUndo(\n  out: UndoOutcome,\n  t: (key: string, vars?: Record<string, string | number>) => string,\n): string {\n  if (out && out.queued) return t('toast.undo_queued');\n  if (out && out.summary) return out.summary;\n  return t('toast.undone');\n}\n","/**\n * The explorer's ONE toast slot: whose line may replace whose, and what a\n * toast's action says once it is pressed.\n *\n * ⚠ The slot was built for Undo — `runToastAction` said \"Undoing…\", then\n * \"Undone\", and read the listing again — and #68 put a drag-out's \"Stop\"\n * into it: Stop said \"Undone\". A toast now says which kind its action is.\n *\n * ⚠ And the desktop app reports a drop being filled in once per file\n * written. Every report repainted the slot, so an 8 s Undo, a refusal,\n * anything else on screen vanished within milliseconds while a drop was\n * being filled in. A toast now says who put it up (`source`), and a drag\n * report takes the slot only when it is empty or holds the drag's own line.\n */\nimport { sayUndo, type UndoOutcome } from './undoWords';\n\n/** Who put a toast up, where it matters: the drag-out's progress line, and\n *  its \"Stopping…\" after Stop was pressed. Anything else leaves it unset. */\nexport type ToastSource = 'drag-out' | 'drag-out-stopping';\n\n/**\n * What pressing a toast's action is.\n *   - `undo` (the default): \"Undoing…\", then what the undo did (lib/undoWords),\n *     and the listing is read again;\n *   - `plain`: its own words while it runs and once it has, nothing read again.\n */\nexport type ToastAfter = { kind: 'undo' } | { kind: 'plain'; running: string; done: string };\n\n/**\n * May a report from `source` take the slot from what is on it?\n *\n * `hold` is a line that stays until the next report (the drag's progress),\n * `end` the last word (done, stopped, failed). Only an empty slot or the\n * source's own line is taken; a \"Stopping…\" is ended by the end, never\n * repainted by progress that was already on its way.\n */\nexport function slotTakenBy(\n  current: { source?: ToastSource } | null,\n  source: 'drag-out',\n  report: 'hold' | 'end',\n): boolean {\n  if (!current) return true;\n  if (current.source === source) return true;\n  if (current.source === 'drag-out-stopping') return report === 'end';\n  return false;\n}\n\n/** What a toast says while its pressed action runs, and once it has. */\nexport function afterActionWords(\n  after: ToastAfter | undefined,\n  phase: 'running' | 'done',\n  outcome: UndoOutcome,\n  t: (key: string, vars?: Record<string, string | number>) => string,\n): string {\n  if (after?.kind === 'plain') return phase === 'running' ? after.running : after.done;\n  return phase === 'running' ? t('toast.undoing') : sayUndo(outcome, t);\n}\n","/**\n * The request a dialog sends — Rename, New folder, Delete, Delete permanently —\n * from the press to the answer.\n *\n *   - `busy` while it is on its way: the dialog is Modal's `busy` (it cannot be\n *     closed under the request) and its button takes no second press;\n *   - a refusal goes INTO the dialog while that dialog is still the one on\n *     screen, and is said as a toast (`say`) once it is not (lesson #498: an\n *     error for a dialog that is not open must never go into its error ref,\n *     where nobody reads it);\n *   - every opening of the dialog is a new session: a request from an earlier\n *     one neither shows its busy state nor its refusal against the new target,\n *     and does not free the new one's button when it ends.\n *\n * ⚠ #59 kept one busy flag and one error ref per dialog, written by whichever\n * request answered last. A rename that succeeded closed its dialog and then\n * read the listing again with the flag still up, so a Rename opened on\n * another file in that time came up already saying \"Renaming…\".\n */\nimport { ref, watch, type Ref } from 'vue';\n\nexport interface DialogRequest {\n  /** The request of the dialog on screen is on its way. */\n  busy: Ref<boolean>;\n  /** Its refusal, shown in the dialog. */\n  error: Ref<string | null>;\n  /** Starts a request: its ticket, or null while one is already on its way. */\n  begin(): number | null;\n  /** The request `ticket` has its answer. */\n  end(ticket: number): void;\n  /**\n   * The request `ticket` was refused. Shown in its dialog while that dialog is\n   * the one on screen (true); otherwise handed to `say`, when there is one\n   * (false either way — the caller says it itself when it passed no `say`).\n   */\n  refuse(ticket: number, message: string): boolean;\n  /** Is the dialog that sent `ticket` still the one on screen? */\n  inDialog(ticket: number): boolean;\n}\n\nexport function useDialogRequest(open: Ref<boolean>, opts: { say?: (message: string) => void } = {}): DialogRequest {\n  const busy = ref(false);\n  const error = ref<string | null>(null);\n  let session = 0;\n\n  watch(open, (now, before) => {\n    if (!now || before) return;\n    session++;\n    busy.value = false;\n    error.value = null;\n  });\n\n  function inDialog(ticket: number): boolean {\n    return ticket === session && open.value;\n  }\n\n  return {\n    busy,\n    error,\n    begin() {\n      if (busy.value) return null;\n      busy.value = true;\n      error.value = null;\n      return session;\n    },\n    end(ticket) {\n      if (ticket === session) busy.value = false;\n    },\n    refuse(ticket, message) {\n      if (inDialog(ticket)) {\n        error.value = message;\n        return true;\n      }\n      opts.say?.(message);\n      return false;\n    },\n    inDialog,\n  };\n}\n","/**\n * Following a storage from the outside — a scan to its end, a deletion to the\n * storage leaving the list — for the admin panel's \"Sync now\" and delete\n * (web composables/useSyncNow, stores/storages) and the explorer's \"Catalog\n * everything\" (FileExplorer `catalogAll`): ONE follower, on ONE signal, with\n * ONE poll.\n *\n * The signal is the worker's own (#66): `GET /api/admin/storages` carries\n * `running` — a scan is walking the storage right now — and, once it drops,\n * `last_sync_state` / `last_sync_error` say how the scan ended. `POST\n * …/sync` answers only once the scan holds the storage (and answers\n * `status: \"running\"` when one already did), so following starts after that\n * answer, and `running` is true until the scan is over.\n *\n * ⚠⚠ It replaced two followers of the same scan: #66 read that list, and #69\n * (lib/catalogRun) read the storage's runs table instead, with heuristics to\n * tell the new run from older ones, and gave up after 60 s. And each storage\n * #66 followed read the WHOLE list again every 3 s on its own — five followed\n * storages, five lists every 3 s. Here every tick reads the list once, for\n * everything followed, and stops reading when nothing is.\n */\nimport { ref } from 'vue';\n\n/** The fields of a storage-list row this reads. */\nexport interface WatchedStorageRow {\n  id: number;\n  running?: boolean;\n  last_sync_state?: string | null;\n  last_sync_error?: string | null;\n}\n\n/**\n * How a followed scan ended: `ok`, `failed` (with the server's `error` when it\n * wrote one), `aborted` (stopped before it finished), `gone` (the storage\n * left the list), `unknown` (the list could not be read, many times over, or\n * named an end this does not know).\n */\nexport type ScanEnd = { status: 'ok' | 'failed' | 'aborted' | 'gone' | 'unknown'; error?: string };\n\nexport type StorageWatchKind = 'scan' | 'deletion';\n\nexport interface StorageWatch {\n  /** Follows the scan of storage `id` — call it once `POST …/sync` has\n   *  answered — to its end; null when the watch was stopped. A storage\n   *  already followed is joined, not followed twice. */\n  scan(id: number): Promise<ScanEnd | null>;\n  /** Follows a deletion the server is still doing: true once the storage has\n   *  left the list, false when the list could not be read (many times over),\n   *  null when the watch was stopped. */\n  deletion(id: number): Promise<boolean | null>;\n  /** What storage `id` is followed for, or null. Reactive. */\n  watching(id: number): StorageWatchKind | null;\n  /** Stops every follower (the page went away): each ends with null. */\n  stop(): void;\n}\n\n/** How often the list is read while anything is followed. */\nexport const STORAGE_WATCH_MS = 3000;\n/** Consecutive unreadable lists before a follower gives up. */\nexport const STORAGE_WATCH_GIVE_UP = 20;\n\nfunction scanEnd(row: WatchedStorageRow): ScanEnd {\n  const error = row.last_sync_error || undefined;\n  switch (row.last_sync_state) {\n    case 'ok':\n      return { status: 'ok' };\n    case 'failed':\n    case 'error':\n      return error ? { status: 'failed', error } : { status: 'failed' };\n    case 'aborted':\n      return { status: 'aborted' };\n    default:\n      return { status: 'unknown' };\n  }\n}\n\ntype Settle = (row: WatchedStorageRow | undefined, unreadable: boolean) => boolean;\n\nexport function createStorageWatch(io: {\n  /** GET /api/admin/storages. */\n  list(): Promise<WatchedStorageRow[]>;\n  pollMs?: number;\n  giveUpAfter?: number;\n}): StorageWatch {\n  const pollMs = io.pollMs ?? STORAGE_WATCH_MS;\n  const giveUpAfter = io.giveUpAfter ?? STORAGE_WATCH_GIVE_UP;\n  /** `${kind}:${id}` → the followers waiting on it. */\n  const followers = new Map<string, { id: number; kind: StorageWatchKind; settle: Settle[] }>();\n  /** Bumped when `followers` changes, so `watching` is reactive. */\n  const version = ref(0);\n  let timer: ReturnType<typeof setTimeout> | undefined;\n  let reading = false;\n  let stopped = false;\n  let unreadable = 0;\n  const pending = new Set<(v: null) => void>();\n\n  function schedule() {\n    if (stopped || timer !== undefined || reading || followers.size === 0) return;\n    timer = setTimeout(() => {\n      timer = undefined;\n      void tick();\n    }, pollMs);\n  }\n\n  async function tick() {\n    if (stopped || followers.size === 0) return;\n    reading = true;\n    let rows: WatchedStorageRow[] | null = null;\n    try {\n      rows = await io.list();\n      unreadable = 0;\n    } catch {\n      unreadable++;\n    } finally {\n      reading = false;\n    }\n    if (stopped) return;\n    const lost = rows === null && unreadable >= giveUpAfter;\n    if (rows !== null || lost) {\n      for (const [key, f] of followers) {\n        const row = rows?.find((r) => r.id === f.id);\n        const left = f.settle.filter((s) => !s(row, lost));\n        if (left.length === 0) followers.delete(key);\n        else f.settle = left;\n      }\n      version.value++;\n    }\n    schedule();\n  }\n\n  function follow<T>(id: number, kind: StorageWatchKind, decide: (row: WatchedStorageRow | undefined, lost: boolean) => T | undefined): Promise<T | null> {\n    if (stopped) return Promise.resolve(null);\n    return new Promise<T | null>((resolve) => {\n      const done = (v: T | null) => {\n        pending.delete(done as (v: null) => void);\n        resolve(v);\n      };\n      pending.add(done as (v: null) => void);\n      const key = `${kind}:${id}`;\n      const settle: Settle = (row, lost) => {\n        const end = decide(row, lost);\n        if (end === undefined) return false;\n        done(end);\n        return true;\n      };\n      const f = followers.get(key);\n      if (f) f.settle.push(settle);\n      else followers.set(key, { id, kind, settle: [settle] });\n      version.value++;\n      schedule();\n    });\n  }\n\n  return {\n    scan: (id) =>\n      follow<ScanEnd>(id, 'scan', (row, lost) => {\n        if (lost) return { status: 'unknown' };\n        if (!row) return { status: 'gone' };\n        return row.running ? undefined : scanEnd(row);\n      }),\n    deletion: (id) =>\n      follow<boolean>(id, 'deletion', (row, lost) => {\n        if (lost) return false;\n        return row ? undefined : true;\n      }),\n    watching(id) {\n      void version.value;\n      if (followers.has(`deletion:${id}`)) return 'deletion';\n      if (followers.has(`scan:${id}`)) return 'scan';\n      return null;\n    },\n    stop() {\n      stopped = true;\n      if (timer !== undefined) clearTimeout(timer);\n      timer = undefined;\n      followers.clear();\n      version.value++;\n      for (const done of [...pending]) done(null);\n    },\n  };\n}\n","<script setup lang=\"ts\">\n/**\n * SurfaceSections — a home page's menu: one entry per section the plugin\n * declared (`surface.sections`), the open one marked.\n *\n * ⚠⚠ Drawn by the FRAME, never by a node. The owner, 2026-09-21: the\n * Signatures screen should be \"its own page … each in a separate menu\",\n * with the browser's Back working and a notification landing on the right\n * section. A node can draw tabs, but only the frame owns the address bar,\n * so the frame keeps the open section in its URL and this component only\n * says which entry was chosen (`select`). Every frame that can show a home\n * view draws the same menu: the in-app page, the admin panel's Apps page,\n * and the dialog an embed without a page falls back to.\n *\n * The look is the product's own underlined tab strip (the Connections and\n * Plugins screens), scrolled sideways on a phone rather than wrapped.\n */\nimport { computed } from 'vue';\nimport type { LocaleCode } from '../../types/ExplorerConfig';\nimport type { SurfaceSection } from '../../types/Plugins';\nimport { labelOf } from '../../lib/pluginLabel';\n\nconst props = defineProps<{\n  sections: SurfaceSection[];\n  /** The section on screen. */\n  active?: string;\n  locale: LocaleCode | string;\n  /** A label for the menu itself — the page's title. */\n  label?: string;\n  disabled?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'select', id: string): void;\n}>();\n\nconst items = computed(() =>\n  props.sections\n    .filter((s) => s && typeof s.id === 'string' && s.id)\n    .map((s) => ({\n      id: s.id,\n      label: labelOf(s.label, props.locale as LocaleCode) || s.id,\n      count: typeof s.count === 'number' && Number.isFinite(s.count) ? s.count : null,\n    })),\n);\n\nfunction pick(id: string): void {\n  if (props.disabled || id === props.active) return;\n  emit('select', id);\n}\n\n/** Arrow keys move along the strip, as a tab list does. */\nfunction onKey(e: KeyboardEvent, index: number): void {\n  const keys = ['ArrowRight', 'ArrowLeft', 'Home', 'End'];\n  if (!keys.includes(e.key)) return;\n  e.preventDefault();\n  const n = items.value.length;\n  if (!n) return;\n  let next = index;\n  if (e.key === 'ArrowRight') next = (index + 1) % n;\n  else if (e.key === 'ArrowLeft') next = (index - 1 + n) % n;\n  else if (e.key === 'Home') next = 0;\n  else if (e.key === 'End') next = n - 1;\n  const buttons = (e.currentTarget as HTMLElement).parentElement?.querySelectorAll<HTMLElement>('[role=\"tab\"]');\n  buttons?.[next]?.focus();\n  pick(items.value[next].id);\n}\n</script>\n\n<template>\n  <nav class=\"fe-sections\" role=\"tablist\" :aria-label=\"label\" data-testid=\"surface-sections\">\n    <button\n      v-for=\"(s, i) in items\"\n      :key=\"s.id\"\n      type=\"button\"\n      role=\"tab\"\n      class=\"fe-sections__tab\"\n      :class=\"{ 'is-active': s.id === active }\"\n      :aria-selected=\"s.id === active ? 'true' : 'false'\"\n      :tabindex=\"s.id === active || (!active && i === 0) ? 0 : -1\"\n      :disabled=\"disabled\"\n      :data-testid=\"`surface-section-${s.id}`\"\n      :data-section=\"s.id\"\n      @click=\"pick(s.id)\"\n      @keydown=\"onKey($event, i)\"\n    >\n      <span class=\"fe-sections__label\">{{ s.label }}</span>\n      <span v-if=\"s.count !== null\" class=\"fe-sections__count\" :data-testid=\"`surface-section-count-${s.id}`\">{{ s.count }}</span>\n    </button>\n  </nav>\n</template>\n","<script setup lang=\"ts\">\n/**\n * PluginViewModal — the dialog an app plugin's `modal` view opens in (and\n * the frame a `home` view is drawn in, full-size).\n *\n * The explorer hands it the first surface (the answer to `run`, or the\n * `open` event of a view); from then on the conversation is\n * `usePluginSurface`'s — the same one the inspector section holds — and\n * this file is only the frame: title, size, the footer buttons, Close.\n * When the server answers `{op}` the row goes up (`op`) and the dialog\n * closes.\n *\n * ⚠ No iframe, no `v-html`, no script: SurfaceRenderer draws nodes with our\n * own components and shows an unknown type as unknown.\n *\n * ⚠ The body and the buttons are `SurfaceConversation` / `SurfaceFooterButtons`\n * — shared with the `page` frame and the public card, so a fix to any of the\n * five things a surface body draws reaches all three.\n */\nimport { computed, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../../types/ExplorerConfig';\nimport type { FileApi } from '../../composables/useFileApi';\nimport type { PluginSurface, SurfaceOpenRequest } from '../../types/Plugins';\nimport { useLocale } from '../../composables/useLocale';\nimport { usePluginSurface } from '../../composables/usePluginSurface';\nimport { labelOf } from '../../lib/pluginLabel';\nimport Modal from '../../modals/Modal.vue';\nimport SurfaceConversation from './SurfaceConversation.vue';\nimport SurfaceSections from './SurfaceSections.vue';\nimport SurfaceFooterButtons from './SurfaceFooterButtons.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  theme?: ThemeMode;\n  api: FileApi;\n  plugin: string;\n  view: string;\n  /** The first screen. */\n  surface: PluginSurface | null;\n  /** Adapter-qualified path of the row the view was opened on (echoed on every event). */\n  path?: string;\n  /**\n   * Every row of the selection the view was opened on (echoed on every\n   * event as `paths`). ⚠ Without it a screen opened on three files talks\n   * about the first one from its second event on (#64).\n   */\n  paths?: string[];\n  /** Storage names a file-chooser may span; where its picker opens. */\n  storages?: string[];\n  startAt?: string;\n  /** Forces the dialog size (a `home` view is drawn `xl`); else the surface's own. */\n  size?: 'sm' | 'md' | 'lg' | 'xl';\n  /** The action's name: the title while the first screen is on its way, and\n   *  whenever the screen names none of its own. */\n  label?: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  /** The server enqueued a job for this view; the raw ops row. */\n  (e: 'op', op: Record<string, unknown>): void;\n  (e: 'toast', message: string): void;\n  /**\n   * v3 §3.0 — the answer says \"go to this file\". Reported UP rather than\n   * acted on here: the explorer is what can show a file and start a screen\n   * on it (`openAppTarget`), and a dialog navigating the window under itself\n   * would throw away the folder the person was standing in.\n   */\n  (e: 'open', req: SurfaceOpenRequest): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst conv = usePluginSurface(\n  {\n    api: props.api,\n    plugin: props.plugin,\n    view: props.view,\n    path: () => props.path,\n    paths: () => props.paths,\n    locale: () => props.locale,\n    errorText: () => t('plugin.view.error'),\n  },\n  {\n    onOp: (op) => emit('op', op),\n    onDone: () => emit('close'),\n    onToast: (m) => emit('toast', m),\n    onOpen: (req) => emit('open', req),\n  },\n);\n\nwatch(\n  () => props.surface,\n  (s) => conv.setSurface(s),\n  { immediate: true },\n);\n\nconst current = conv.current;\nconst title = computed(() => labelOf(current.value?.title, props.locale) || props.label || props.view);\n\n/* ⚠⚠ Not closed while an answer is on its way — Modal's `busy`, the one rule\n * every explorer dialog follows (Escape and an outside click do nothing, ×\n * is shut, the dialog says aria-busy). Escape, a click outside and × all went\n * straight to `close`, and the frame's own Close button was the only one\n * that waited: a submit whose answer was a queued job then came back to a\n * dialog that no longer existed, and the job ran with no row in the\n * operations centre and no word on screen. The answer closes the dialog\n * itself (`onDone`); the app's run has its own time budget on the server, so\n * this cannot hold the dialog open for ever. */\n/**\n * A home page's menu, when a host with no page of its own draws one in this\n * dialog (the degraded frame — an embed without `pluginPageBase`). There is\n * no address to keep here, so a choice simply asks for that section.\n */\nconst sections = computed(() => current.value?.sections ?? []);\nasync function chooseSection(id: string): Promise<void> {\n  if (!id || id === current.value?.section) return;\n  try {\n    const res = await props.api.pluginView(props.plugin, props.view, props.path, id);\n    if (res?.surface) conv.setSurface(res.surface);\n  } catch (e) {\n    // ⚠ An app's own error text never met the catalogue — isolate it.\n    emit('toast', t.foreign?.(String((e as Error)?.message ?? '')) || t('plugin.view.error'));\n  }\n}\n\nconst size = computed<'sm' | 'md' | 'lg' | 'xl'>(() => {\n  if (props.size) return props.size;\n  const s = current.value?.size;\n  return s === 'sm' || s === 'lg' || s === 'xl' ? s : 'md';\n});\n</script>\n\n<template>\n  <Modal\n    :open=\"open\"\n    :title=\"title\"\n    :size=\"size\"\n    :theme=\"theme\"\n    :locale=\"locale\"\n    :busy=\"conv.busy.value\"\n    @close=\"emit('close')\"\n  >\n    <div class=\"fe-plugin-view\" data-testid=\"plugin-view\">\n      <!-- The explorer opens the dialog as soon as the action is chosen; until\n           the app answers there is no screen to draw, and a blank card read\n           as nothing happening. -->\n      <p v-if=\"!current\" class=\"fe-surface__text fe-surface__text--muted\" role=\"status\" data-testid=\"plugin-view-opening\">\n        {{ t('plugin.view.loading') }}\n      </p>\n      <SurfaceSections\n        v-if=\"sections.length\"\n        :sections=\"sections\"\n        :active=\"current?.section\"\n        :locale=\"locale\"\n        :label=\"title\"\n        :disabled=\"conv.busy.value\"\n        @select=\"chooseSection\"\n      />\n      <SurfaceConversation\n        :conv=\"conv\"\n        :locale=\"locale\"\n        :theme=\"theme\"\n        :api=\"api\"\n        :plugin=\"plugin\"\n        :storages=\"storages\"\n        :start-at=\"startAt\"\n      />\n    </div>\n    <!-- ⚠ The frame's own Close only when the screen brought no buttons of\n         its own. A plugin's footer already carries its way out (Cancel,\n         Back), the header has its ×, and Escape and an outside click close\n         the dialog — a \"Close\" beside the plugin's \"Cancel\" was two buttons\n         doing one thing (the converter's first step read \"Kapat · Vazgeç ·\n         İleri\", release-candidate sweep 2026-09-21). A screen with no\n         buttons at all — a result, a notice — still gets one, so no screen\n         is a dead end for a pointer. -->\n    <template #actions>\n      <button\n        v-if=\"!conv.footer.value.length\"\n        type=\"button\"\n        class=\"fe-btn\"\n        :disabled=\"conv.busy.value\"\n        data-testid=\"plugin-view-close\"\n        @click=\"emit('close')\"\n      >\n        {{ t('plugin.view.close') }}\n      </button>\n      <SurfaceFooterButtons :conv=\"conv\" :locale=\"locale\" testid-prefix=\"plugin-view\" />\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * AppFrameModal — the dialog an app's own interface opens in: a `modal`\n * action whose view has a `ui` file, or a `home` screen drawn in place. The\n * frame is AppFrame (the one frame of every placement); this is only the\n * dialog around it — the title, and a close that asks first when the\n * interface holds unsaved changes (AppFrame.confirmClose).\n */\nimport { ref } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../../types/ExplorerConfig';\nimport type { FileApi } from '../../composables/useFileApi';\nimport type { PluginUIRef } from '../../types/Plugins';\nimport Modal from '../../modals/Modal.vue';\nimport AppFrame, { type AppFrameFile } from './AppFrame.vue';\n\nconst props = defineProps<{\n  api: FileApi;\n  locale: LocaleCode;\n  theme?: ThemeMode;\n  plugin: string;\n  view: string;\n  placement: 'modal' | 'home';\n  ui: PluginUIRef;\n  label: string;\n  files: AppFrameFile[];\n  userName?: string;\n  /** Storage names an app's save-as may span, and where it opens without a\n   *  file (AppFrame `storages` / `startAt`). */\n  storages?: string[];\n  startAt?: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'toast', message: string): void;\n  (e: 'op', op: Record<string, unknown>): void;\n}>();\n\nconst frame = ref<InstanceType<typeof AppFrame> | null>(null);\n/** What the interface calls itself (`ui.title`), under the app's name. */\nconst subtitle = ref('');\n\nasync function close() {\n  if (frame.value && !(await frame.value.confirmClose())) return;\n  emit('close');\n}\n</script>\n\n<template>\n  <Modal\n    :open=\"true\"\n    :size=\"placement === 'home' ? 'xl' : 'lg'\"\n    :title=\"subtitle ? `${label} - ${subtitle}` : label\"\n    :locale=\"locale\"\n    :theme=\"theme\"\n    :close-on-backdrop=\"false\"\n    data-testid=\"app-frame-modal\"\n    @close=\"close\"\n  >\n    <div class=\"fe-appframe-modal__body\">\n      <AppFrame\n        ref=\"frame\"\n        :api=\"api\"\n        :app=\"plugin\"\n        :version=\"ui.version\"\n        :view=\"view\"\n        :placement=\"placement\"\n        :ui=\"ui\"\n        :files=\"files\"\n        :storages=\"storages\"\n        :start-at=\"startAt\"\n        :locale=\"locale\"\n        :theme=\"theme\"\n        :user-name=\"userName\"\n        :title=\"label\"\n        @title=\"(t) => (subtitle = t)\"\n        @toast=\"(m) => emit('toast', m.text)\"\n        @op=\"(op) => emit('op', op)\"\n        @close=\"close\"\n      />\n    </div>\n  </Modal>\n</template>\n\n<style>\n.fe-appframe-modal__body {\n  display: flex;\n  flex-direction: column;\n  height: min(75vh, 900px);\n  min-height: 0;\n}\n</style>\n","/**\n * appViewer - which handler opens a file, for every surface that opens files:\n * the explorer's preview, \"Open with\", and the standalone editor tab\n * (/files/edit). ONE rule, so a file opens in the same place wherever it is\n * opened (0.50: docs/APP-PLUGINS.md → Default apps):\n *\n *  - the handlers of a file are ONLYOFFICE (`onlyoffice`, filex 0.51) for a\n *    kind it opens as a choice (OFFICE_OPEN_KINDS: `.csv`) while it is\n *    configured, then the app interfaces that open it (`viewer` views with a\n *    `ui`, in the server's order: by app name, then the app's own order) and\n *    filex's own viewer, `builtin`, last - backend assoc.OpenDefault;\n *  - the administrator's rule for the file's kind (`open_rules[ext]`, from\n *    the server, backend internal/assoc) puts the handlers it names first, in\n *    its order, and leaves out the ones it switched off; the rest follow in\n *    the default order - exactly assoc.Apply;\n *  - the one that opens it: what \"Open with\" chose, else the person's own\n *    \"always open with\" choice (lib/openWith), else the first that is on -\n *    each only when it is on. With every handler off, filex's own viewer\n *    opens it: a file must open somewhere.\n */\nimport type { OpenRule, PluginViewRow } from '../types/Plugins';\nimport { appliesItemOf, appliesMatches, type AppliesNodeLike } from './pluginApplies';\n\n/** filex's own viewer, as a handler id (and \"Open with\"'s choice of it). */\nexport const BUILTIN_VIEWER = 'builtin';\n\n/** ONLYOFFICE's editor, as a handler id (filex 0.51, backend assoc.OnlyOffice). */\nexport const ONLYOFFICE_VIEWER = 'onlyoffice';\n\n/**\n * The kinds ONLYOFFICE opens as ONE choice among others: filex's own viewer\n * opens them too (a read-only table for a CSV), so \"Open with\" offers both.\n * ⚠ The twin of backend assoc `onlyOfficeOpenKinds`; a test holds the two\n * together. The office kinds (docx, xlsx...) are not here: ONLYOFFICE is the\n * only thing that opens them, there is nothing to choose.\n */\nexport const OFFICE_OPEN_KINDS: readonly string[] = ['csv'];\n\n/** ONLYOFFICE is an open handler of this kind (an extension, no dot). */\nexport function officeOpensKind(ext: string | null | undefined): boolean {\n  return OFFICE_OPEN_KINDS.includes(String(ext ?? '').toLowerCase());\n}\n\n/** What only the host knows about a file's handlers. */\nexport interface OpenHandlerOptions {\n  /**\n   * ONLYOFFICE is configured and answering here (the capabilities probe, the\n   * same answer the office documents' Open reads). Absent or false: it opens\n   * nothing, and a choice of it falls through to the next handler.\n   */\n  onlyOffice?: boolean;\n}\n\ntype NodeLike = (AppliesNodeLike & { type?: string }) | null | undefined;\n\n/** One handler that opens a file: an app's interface, or filex's own (view null). */\nexport interface OpenHandler {\n  id: string;\n  view: PluginViewRow | null;\n}\n\n/** The handler id of an app's interface. */\nexport function openHandlerId(v: Pick<PluginViewRow, 'plugin' | 'id'>): string {\n  return `app:${v.plugin}/${v.id}`;\n}\n\n/**\n * A choice as a handler id. Accepts the spelling before 0.50 too\n * (`plugin/view`, what \"Open in new tab\" put in `app=`).\n */\nexport function normalizeOpenChoice(choice: string | null | undefined): string | null {\n  if (!choice) return null;\n  if (choice === BUILTIN_VIEWER || choice === ONLYOFFICE_VIEWER || choice.startsWith('app:')) return choice;\n  return `app:${choice}`;\n}\n\n/** The handler is ONLYOFFICE's editor (not an app's interface, not filex's viewer). */\nexport function isOfficeHandler(h: Pick<OpenHandler, 'id'> | null | undefined): boolean {\n  return h?.id === ONLYOFFICE_VIEWER;\n}\n\n/** A file's kind: its extension, lower-case, no dot ('' for none). */\nexport function openKindOf(node: NodeLike): string {\n  if (!node) return '';\n  return String(appliesItemOf(node).ext ?? '').toLowerCase();\n}\n\n/** The `viewer` views that are an app's own interface. */\nexport function viewerViews(views: readonly PluginViewRow[]): PluginViewRow[] {\n  return views.filter((v) => v.placement === 'viewer' && !!v.ui);\n}\n\n/** The app interfaces that open this file, in the server's order. */\nexport function appViewersFor(views: readonly PluginViewRow[], node: NodeLike): PluginViewRow[] {\n  if (!node || node.type !== 'file') return [];\n  return viewerViews(views).filter((v) => appliesMatches(v.applies ?? {}, [appliesItemOf(node, v.plugin)]));\n}\n\n/** What the administrator's rule makes of a file's handlers. */\nexport interface OpenHandlers {\n  /** The handlers that are on, in the order they are offered. */\n  on: OpenHandler[];\n  /** The ones switched off for the file's kind. */\n  off: OpenHandler[];\n  /** An administrator's rule decided the order. */\n  custom: boolean;\n}\n\n/** The handlers of a file, ordered and switched off by the rule for its kind. */\nexport function openHandlersFor(\n  views: readonly PluginViewRow[],\n  node: NodeLike,\n  rules?: Readonly<Record<string, OpenRule>> | null,\n  opts?: OpenHandlerOptions | null,\n): OpenHandlers {\n  if (!node || node.type !== 'file') return { on: [], off: [], custom: false };\n  const avail: OpenHandler[] = [\n    ...(opts?.onlyOffice && officeOpensKind(openKindOf(node)) ? [{ id: ONLYOFFICE_VIEWER, view: null }] : []),\n    ...appViewersFor(views, node).map((v) => ({ id: openHandlerId(v), view: v })),\n    { id: BUILTIN_VIEWER, view: null },\n  ];\n  const rule = rules?.[openKindOf(node)];\n  if (!rule) return { on: avail, off: [], custom: false };\n  const isOff = new Set(rule.off ?? []);\n  const byId = new Map(avail.map((h) => [h.id, h]));\n  const placed = new Set<string>();\n  const on: OpenHandler[] = [];\n  for (const id of rule.order ?? []) {\n    const h = byId.get(id);\n    if (!h || isOff.has(id) || placed.has(id)) continue;\n    placed.add(id);\n    on.push(h);\n  }\n  const off: OpenHandler[] = [];\n  for (const h of avail) {\n    if (isOff.has(h.id)) off.push(h);\n    else if (!placed.has(h.id)) on.push(h);\n  }\n  return { on, off, custom: true };\n}\n\n/** The handler that opens the file (see the header for the rule). */\nexport function pickOpenHandler(\n  views: readonly PluginViewRow[],\n  node: NodeLike,\n  choice?: string | null,\n  rules?: Readonly<Record<string, OpenRule>> | null,\n  personal?: string | null,\n  opts?: OpenHandlerOptions | null,\n): OpenHandler | null {\n  if (!node || node.type !== 'file') return null;\n  const { on } = openHandlersFor(views, node, rules, opts);\n  const find = (id: string | null) => (id ? (on.find((h) => h.id === id) ?? null) : null);\n  return find(normalizeOpenChoice(choice)) ?? find(normalizeOpenChoice(personal)) ?? on[0] ?? null;\n}\n\n/** The app interface that opens the file; null is filex's own viewer, or\n *  ONLYOFFICE (pickOpenHandler tells the two apart). */\nexport function pickAppViewer(\n  views: readonly PluginViewRow[],\n  node: NodeLike,\n  choice?: string | null,\n  rules?: Readonly<Record<string, OpenRule>> | null,\n  personal?: string | null,\n  opts?: OpenHandlerOptions | null,\n): PluginViewRow | null {\n  return pickOpenHandler(views, node, choice, rules, personal, opts)?.view ?? null;\n}\n","/**\n * openWith - \"always open this kind with this app\", kept on the person's\n * ACCOUNT (0.50, docs/APP-PLUGINS.md → Default apps).\n *\n * ONE record per ACCOUNT (the maintainer, 2026-10-01): the browser, the desktop app\n * and every embed read and write the same choices. They arrive with the\n * surface's preference document (lib/prefs `openWith`, a JSON object\n * `{ext: handlerId}` the server puts in) and change one kind at a time\n * through `/api/me/open-with` (backend handlers/openwith.go) - never with the\n * surface document, whose whole-document PUT would let a copy read at boot\n * undo a choice made since on another surface. The handler is `builtin`\n * (filex's own viewer), `app:<plugin>/<view>`, or - for a kind ONLYOFFICE\n * opens as a choice (lib/appViewer OFFICE_OPEN_KINDS: `.csv`, filex 0.51) -\n * `onlyoffice`. A choice of ONLYOFFICE is kept while ONLYOFFICE is switched\n * off, and the kind opens in filex's own viewer meanwhile.\n *\n * ⚠ Where the chosen app cannot open the file - this surface does not offer\n * it, or the administrator switched it off for the kind - the next handler\n * that is on opens it (lib/appViewer), and the choice is kept for where it\n * can.\n *\n * ⚠ A choice is only ever USED among the handlers the administrator left on\n * for the kind (lib/appViewer `pickAppViewer`): one switched off since is\n * kept, not followed, and Settings → Preferences → Default apps says it is no longer\n * available. Nothing here decides what is on - the server's rules do.\n */\nimport { ref } from 'vue';\nimport { accountFetch, currentPrefs, onPrefs, setAccountPref } from './prefs';\nimport { ONLYOFFICE_VIEWER, officeOpensKind } from './appViewer';\n\n/** Bumped on every change this page makes, so computed readers re-run. */\nconst version = ref(0);\n\nfunction readAll(): Record<string, string> {\n  const raw = currentPrefs().openWith;\n  if (!raw) return {};\n  try {\n    const v = JSON.parse(raw);\n    if (!v || typeof v !== 'object' || Array.isArray(v)) return {};\n    const out: Record<string, string> = {};\n    for (const [k, id] of Object.entries(v as Record<string, unknown>)) {\n      if (typeof id === 'string' && validKind(k) && validHandler(id, k)) out[k] = id;\n    }\n    return out;\n  } catch {\n    return {};\n  }\n}\n\n/** A kind: a file name's extension, lower-case, no dot (backend assoc.ValidExt). */\nexport function validKind(ext: string): boolean {\n  return /^[a-z0-9][a-z0-9_+-]{0,31}$/.test(ext);\n}\n\n/**\n * A handler id the open capability knows: `builtin`, `app:<plugin>/<view>`,\n * or `onlyoffice` for a kind ONLYOFFICE opens as a choice (with `kind`\n * given, only for those; backend handlers/openwith.go validOpenChoice).\n */\nexport function validHandler(id: string, kind?: string): boolean {\n  if (id === ONLYOFFICE_VIEWER) return kind === undefined || officeOpensKind(kind);\n  return id === 'builtin' || /^app:[a-z0-9][a-z0-9_-]{0,31}\\/[a-z0-9][a-z0-9_.-]{0,63}$/.test(id);\n}\n\n/** Every choice this person made, by kind. Reactive. */\nexport function openWithChoices(): Record<string, string> {\n  void version.value;\n  return readAll();\n}\n\n/** The person's choice for a kind, null for none. Reactive. */\nexport function openWithChoice(ext: string | null | undefined): string | null {\n  if (!ext) return null;\n  return openWithChoices()[ext.toLowerCase()] ?? null;\n}\n\n/** The account's answer becomes this page's copy (what the server kept). */\nasync function send(path: string, init: { method: string; body?: string }): Promise<void> {\n  const res = await accountFetch(path, init);\n  if (!res || !res.ok) return;\n  try {\n    const body = (await res.json()) as { choices?: unknown };\n    if (!body || !body.choices || typeof body.choices !== 'object' || Array.isArray(body.choices)) return;\n    const out: Record<string, string> = {};\n    for (const [k, id] of Object.entries(body.choices as Record<string, unknown>)) {\n      if (typeof id === 'string' && validKind(k) && validHandler(id, k)) out[k] = id;\n    }\n    setAccountPref('openWith', JSON.stringify(out));\n    version.value++;\n  } catch {\n    /* the change is on screen already; the next boot reads the account */\n  }\n}\n\n/** Keep (or, with null, forget) the person's choice for a kind. */\nexport function setOpenWithChoice(ext: string, id: string | null): void {\n  const kind = ext.toLowerCase();\n  if (!validKind(kind) || (id !== null && !validHandler(id, kind))) return;\n  const all = readAll();\n  if (id === null) delete all[kind];\n  else all[kind] = id;\n  setAccountPref('openWith', JSON.stringify(all));\n  version.value++;\n  const path = `/api/me/open-with/${encodeURIComponent(kind)}`;\n  void send(path, id === null ? { method: 'DELETE' } : { method: 'PUT', body: JSON.stringify({ handler: id }) });\n}\n\n/** Forget every choice. */\nexport function clearOpenWithChoices(): void {\n  setAccountPref('openWith', '{}');\n  version.value++;\n  void send('/api/me/open-with', { method: 'DELETE' });\n}\n\n/**\n * Re-read the choices when the account's answer lands (another device changed\n * them). Call once from a component's setup; returns the unsubscribe.\n */\nexport function followOpenWithChoices(): () => void {\n  return onPrefs(() => {\n    version.value++;\n  });\n}\n","<script setup lang=\"ts\">\n/**\n * OpenWithDialog - \"Choose an app…\" from the file menu (0.50, docs/\n * APP-PLUGINS.md → Default apps), the way a desktop asks it: every handler the\n * administrator left on for this kind, the one that opens it now marked, and\n * \"Always use this app for .<ext> files\". Ticked, the choice is kept on the\n * person's account (lib/openWith) and every later opening of the kind uses it.\n *\n * The list is the explorer's (lib/appViewer `openHandlersFor`): this dialog\n * never offers a handler the administrator switched off.\n */\nimport { computed, ref, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { isOfficeHandler, type OpenHandler } from '../lib/appViewer';\nimport { useLocale } from '../composables/useLocale';\nimport { labelOf as pluginLabelOf } from '../lib/pluginLabel';\nimport Modal from './Modal.vue';\nimport ChoiceButtons, { type ChoiceOption } from '../components/ChoiceButtons.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  theme?: ThemeMode;\n  /** The file's name, as the person reads it. */\n  name: string;\n  /** Its kind: the extension, lower-case, no dot ('' for none). */\n  kind: string;\n  /** The handlers that are on for the kind, in the administrator's order. */\n  handlers: OpenHandler[];\n  /** The handler that opens it now. */\n  current: string | null;\n  /** The person already chose one for the kind (it is kept on the account). */\n  remembered: string | null;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'cancel'): void;\n  (e: 'open', id: string, always: boolean): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst picked = ref<string | null>(null);\nconst always = ref(false);\n\nwatch(\n  () => props.open,\n  (on) => {\n    if (!on) return;\n    picked.value = props.current ?? props.handlers[0]?.id ?? null;\n    always.value = !!props.remembered && props.remembered === picked.value;\n  },\n  { immediate: true },\n);\n\n/** A handler as the person reads it: the app's view by its label, filex's own\n *  and ONLYOFFICE (0.51, a .csv) by name. */\nfunction handlerLabel(h: OpenHandler): string {\n  if (isOfficeHandler(h)) return t('openWith.onlyoffice');\n  if (!h.view) return t('openWith.builtin');\n  return pluginLabelOf(h.view.label, props.locale) || h.view.plugin;\n}\n\nconst options = computed<ChoiceOption[]>(() =>\n  props.handlers.map((h) => ({\n    value: h.id,\n    label: handlerLabel(h),\n    help: h.id === props.current ? t('openWith.now') : undefined,\n  })),\n);\n\nfunction submit(): void {\n  if (!picked.value) return;\n  emit('open', picked.value, always.value && !!props.kind);\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :locale=\"locale\" :theme=\"theme\" :title=\"t('openWith.title')\" size=\"sm\" @close=\"emit('cancel')\">\n    <div class=\"fe-openwith\" data-testid=\"open-with-dialog\">\n      <p class=\"fe-openwith__lead\">{{ t('openWith.lead', { name }) }}</p>\n      <ChoiceButtons\n        :model-value=\"picked\"\n        @update:model-value=\"(v: string | string[]) => (picked = typeof v === 'string' ? v : null)\"\n        :options=\"options\"\n        :aria-label=\"t('openWith.title')\"\n        testid-prefix=\"open-with-choice\"\n      />\n      <label v-if=\"kind\" class=\"fe-openwith__always\">\n        <input v-model=\"always\" type=\"checkbox\" data-testid=\"open-with-always\" />\n        <span>{{ t('openWith.always', { ext: '.' + kind }) }}</span>\n      </label>\n      <p v-if=\"kind\" class=\"fe-openwith__hint\">{{ t('openWith.hint') }}</p>\n    </div>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" data-testid=\"open-with-cancel\" @click=\"emit('cancel')\">\n        {{ t('modal.rename.cancel') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn fe-btn--primary\" :disabled=\"!picked\" data-testid=\"open-with-open\" @click=\"submit\">\n        {{ t('openWith.open') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n\n<style>\n.fe-openwith {\n  display: flex;\n  flex-direction: column;\n  gap: 0.75rem;\n}\n.fe-openwith__lead {\n  margin: 0;\n  color: var(--fe-text);\n  overflow-wrap: anywhere;\n}\n.fe-openwith__always {\n  display: flex;\n  align-items: center;\n  gap: 0.5rem;\n  color: var(--fe-text);\n  cursor: pointer;\n}\n.fe-openwith__hint {\n  margin: 0;\n  font-size: 0.8125rem;\n  color: var(--fe-text-muted);\n}\n</style>\n","// Where a header dropdown goes once it is teleported to <body>.\n//\n// Two controls in the explorer's header open a panel — the avatar's account\n// menu and the notification bell — and both have to be TELEPORTED: `.fe`, the\n// explorer's root, carries `overflow: hidden`, so a panel positioned inside the\n// header is cut off at the header's bottom edge (measured when the account menu\n// was built: every row below the first was simply not on screen). A teleported\n// panel is `position: fixed`, so it needs coordinates, and the two controls were\n// about to carry two copies of the arithmetic that produces them.\n//\n// The rule, once: hang the panel 6px under the button, flush with the button's\n// END edge — its right edge in a left-to-right interface, its LEFT edge in a\n// right-to-left one (both controls sit at the end of the row, where a\n// start-edge anchor hangs the panel off the viewport) — and, when the caller\n// gives a width, keep the whole panel on screen. That last part is not\n// decoration: at 390px the bell sits a button's width left of the avatar, and a\n// 360px panel flush with its right edge started 20px off the left of the phone.\n//\n// ⚠ RTL: the arithmetic is the LTR arithmetic measured from the other side of\n// the viewport, so the answer carries `left` instead of `right`; bind both\n// (`{ right: pos.right, left: pos.left }`) and the absent one is simply not set.\n\nexport interface AnchoredPanelPosition {\n  top: string;\n  /** Distance from the viewport's right edge — left-to-right interfaces. */\n  right?: string;\n  /** Distance from the viewport's left edge — right-to-left interfaces. */\n  left?: string;\n  /** Present only when a width was asked for. */\n  width?: string;\n  /** Room left under the anchor, for a scrolling list inside the panel. */\n  maxHeight: string;\n}\n\nexport interface AnchorOptions {\n  /** The panel's preferred width in px; clamped to the viewport. */\n  width?: number;\n  /** Minimum distance from the viewport's edges. */\n  gutter?: number;\n  /** Gap between the button's bottom and the panel's top. */\n  gap?: number;\n  /** Ceiling for `maxHeight`. */\n  maxHeight?: number;\n  /** The direction the header is drawn in (core `dirOfElement(button)`). */\n  dir?: 'ltr' | 'rtl';\n}\n\n/** The DOM element behind a template ref that may be a component (Headless UI's buttons are). */\nexport function refElement(r: unknown): HTMLElement | null {\n  if (!r) return null;\n  if (typeof HTMLElement !== 'undefined' && r instanceof HTMLElement) return r;\n  const el = (r as { $el?: unknown }).$el;\n  return typeof HTMLElement !== 'undefined' && el instanceof HTMLElement ? el : null;\n}\n\n/**\n * The box a `position: fixed` panel is placed in: the window LESS a scrollbar\n * that takes room. Pass it as `anchorUnderEndEdge`'s viewport.\n *\n * ⚠ Not `window.innerWidth`. A fixed panel's `right` is measured from the\n * edge of the layout viewport, which stops where a classic scrollbar begins\n * (Windows, macOS set to \"always show\", WebKit on Linux), while innerWidth\n * counts the scrollbar too: every panel hung a scrollbar's width to the left\n * of its button's end edge there - 10px in the e2e image's WebKit (0.53\n * round), 15-17px in Chrome and Edge on Windows. Headless Chromium hides its\n * scrollbars, which is why the suite never saw it. `clientWidth` of the root\n * is that box; a document that reports none (no layout) falls back to the\n * window.\n */\nexport function fixedViewport(): { width: number; height: number } {\n  if (typeof window === 'undefined') return { width: 0, height: 0 };\n  const root = typeof document !== 'undefined' ? document.documentElement : null;\n  const width = root && root.clientWidth > 0 ? root.clientWidth : window.innerWidth;\n  const height = root && root.clientHeight > 0 ? root.clientHeight : window.innerHeight;\n  return { width, height };\n}\n\nexport function anchorUnderEndEdge(\n  rect: { bottom: number; right: number; left?: number },\n  viewport: { width: number; height: number },\n  opts: AnchorOptions = {},\n): AnchoredPanelPosition {\n  const rtl = opts.dir === 'rtl';\n  const side = rtl ? 'left' : 'right';\n  const gutter = opts.gutter ?? 8;\n  const top = Math.round(rect.bottom + (opts.gap ?? 6));\n  // The gap between the button's END edge and the viewport's end edge.\n  const flush = Math.round(rtl ? (rect.left ?? 0) : viewport.width - rect.right);\n  const room = Math.max(200, viewport.height - top - gutter);\n  const maxHeight = `${opts.maxHeight ? Math.min(opts.maxHeight, room) : room}px`;\n  if (!opts.width) return { top: `${top}px`, [side]: `${flush}px`, maxHeight };\n  const width = Math.max(0, Math.min(opts.width, viewport.width - gutter * 2));\n  const offset = Math.min(Math.max(flush, gutter), viewport.width - width - gutter);\n  return { top: `${top}px`, [side]: `${Math.round(offset)}px`, width: `${Math.round(width)}px`, maxHeight };\n}\n","/**\n * A notification's words, as the SERVER said them.\n *\n * ⚠⚠ The sentence is composed on the server, in Go, and nowhere else\n * (backend internal/notify say.go; the maintainers' decision, 2026-10-08:\n * \"the browser sends a key and its values; the server builds the sentence and\n * sends it where it goes\"). `GET /api/notifications` answers every row with\n * its `title` and `body` already said in the reader's language - a language\n * pack's included, right to left isolated - and the same code path says the\n * same row to a phone (Web Push), in an email and to a webhook. This module\n * composes NOTHING: there is no phrase table, no template and no plural rule\n * on this side any more (web/tests/quality/noClientNotificationText.test.ts\n * holds that).\n *\n * The one thing it does is the one thing the server cannot: the name of an\n * item inside an end-to-end encrypted folder, which the server only has\n * scrambled. Such a row says \"🔒 Encrypted item\" there, and carries `e2e` -\n * the same sentence cut at the names, and what each name is. A reader whose\n * explorer has that folder unlocked puts the real name in its place; every\n * other reader (the desktop app's toast, a push, an email) shows the server's\n * words as they are.\n *\n * ⚠ Plain TypeScript with no import and no framework: the bell (NotificationRow,\n * in the web and in the desktop app's window), the page's pop-up\n * (web useNotificationWatcher) and the admin history all read through it.\n */\n\n/** One notification as a screen shows it. */\nexport interface NotificationText {\n  title: string;\n  body: string;\n}\n\n/** One piece of a sentence: words, or the name at `names[name]`. */\nexport interface NotificationTextPart {\n  text?: string;\n  name?: number;\n}\n\n/** One name inside an encrypted folder (backend model.NotificationE2EName). */\nexport interface NotificationE2EName {\n  /** The item as listings address it, `<storage>://<path>`, as stored. */\n  wire: string;\n  /** The encrypted folder it is in, `<storage>://<root>`. */\n  root: string;\n  /** `name` - the item's own name; `path` - where it is. */\n  part: string;\n  /** What it reads as without the key: what `title`/`body` already say. */\n  locked: string;\n}\n\n/** Where the encrypted names of a sentence stand (backend model.NotificationE2E). */\nexport interface NotificationE2E {\n  title: NotificationTextPart[];\n  body: NotificationTextPart[];\n  names: NotificationE2EName[];\n}\n\n/** The shape this module reads - structural, so any row type passes. */\nexport interface NotificationLike {\n  event: string;\n  title?: string;\n  body?: string;\n  e2e?: NotificationE2E | null;\n}\n\n/** The plaintext of an item inside an encrypted folder, from a reader's\n *  explorer that has the folder unlocked; null when it does not. */\nexport type E2eNameResolver = (wire: string, root: string) => { name: string; path: string } | null;\n\nfunction str(v: unknown): string {\n  return typeof v === 'string' ? v : '';\n}\n\n/**\n * The words a screen shows for one row: the server's, with an encrypted\n * item's real name where this reader can name it.\n */\nexport function notificationText(row: NotificationLike, e2eName?: E2eNameResolver): NotificationText {\n  const said: NotificationText = { title: str(row.title), body: str(row.body) };\n  const e2e = row.e2e;\n  if (!e2e || typeof e2eName !== 'function' || !Array.isArray(e2e.names)) return said;\n  const names = e2e.names.map((n) => {\n    let known: { name: string; path: string } | null = null;\n    try {\n      known = e2eName(str(n?.wire), str(n?.root));\n    } catch {\n      known = null;\n    }\n    if (!known) return str(n?.locked);\n    return n.part === 'path' ? str(known.path) : str(known.name);\n  });\n  const join = (parts: unknown, fallback: string): string => {\n    if (!Array.isArray(parts)) return fallback;\n    return parts\n      .map((p: NotificationTextPart) => (typeof p?.name === 'number' ? (names[p.name] ?? '') : str(p?.text)))\n      .join('');\n  };\n  return { title: join(e2e.title, said.title), body: join(e2e.body, said.body) };\n}\n","/**\n * One notification row's words on a screen - the SERVER's sentence\n * (`GET /api/notifications` answers each row's `title` and `body` already said\n * in the reader's language, backend internal/notify say.go), with an encrypted\n * item's real name where this tab's explorer has its folder unlocked\n * (lib/notificationText.ts).\n *\n * ⚠ A composable rather than a helper each surface writes, because the surfaces\n * are the bell list, the full-list screen, the page's pop-up and the admin\n * history, and they describe the SAME row: one of them naming an encrypted\n * item another one locks is the kind of difference this exists to prevent.\n *\n * ⚠⚠ It composes no sentence and needs no language: the language is the\n * server's to apply (the request names the screen's, `lang=`). Nothing here may\n * build words from a row's event or meta again\n * (web/tests/quality/noClientNotificationText.test.ts).\n */\nimport { resolveE2eName } from '../lib/e2eNameRegistry';\nimport { notificationText as said, type NotificationLike, type NotificationText } from '../lib/notificationText';\n\nexport function useNotificationText() {\n  /** One row as this screen shows it. */\n  function notificationText(row: NotificationLike): NotificationText {\n    return said(row, resolveE2eName);\n  }\n  return { notificationText };\n}\n","// The ONE notification-click resolver.\n//\n// A notification is only useful if it takes you to the thing it is about, and\n// there are three places a click can start: the bell row, a browser\n// `Notification`, and the desktop app's native OS notification. Before this\n// module each of those would have had to work out \"where does this go\" for\n// itself, which is three implementations of one rule and therefore three\n// chances for them to disagree — the bell opening a folder while the toast for\n// the same row opened the notifications page.\n//\n// So the rule lives here, once, and every surface calls it:\n//\n//   backend notification row ──► resolveNotificationTarget() ──► destination\n//                                                               │\n//     bell click ─────────────────────────────────────────────► │\n//     browser Notification click ─────────────────────────────► │\n//     desktop native notification click ──────────────────────► ┘\n//\n// ⚠⚠ This file is imported by the DESKTOP MAIN PROCESS as well as by the web\n// bundle and the explorer (desktop/src/notifications.ts →\n// `../../packages/core/src/lib/notificationTarget`; it lived in web/src/lib\n// until the bell moved into this package on 2026-09-27), which is what makes\n// \"one resolver\" true rather than aspirational. Keep it free of\n// imports, of Vue, of `window` and of anything else that only exists in a\n// browser: an import added here is an import added to an Electron main process\n// that has no DOM.\n\n/**\n * What a notification is about. Mirrors `model.NotificationTargetKind` (Go).\n *\n * `trash` is the Trash view with the item that was deleted from `path` (its\n * ORIGINAL path, in `storage`) selected — what a soft delete and an antivirus\n * quarantine address. ⚠⚠ It exists because the only address those events used\n * to carry was the item's key inside the bin: `{kind: 'file', path:\n * '.filex-trash/<key>'}`, which opened the bin's raw folder — breadcrumb\n * `docs › .filex-trash`, nothing listed, nothing to restore (owner's report,\n * 2026-09-21). An older client that does not know this kind resolves it to\n * `none` below, which is honest: the row reads, and goes nowhere.\n *\n * `app` is one of an app plugin's HOME pages (`open.plugin` + `open.view`,\n * optionally `open.section`) — a notice about a list rather than a file.\n */\nexport type NotificationTargetKind = 'file' | 'dir' | 'share' | 'trash' | 'app' | 'none';\n\n/**\n * The typed target the backend puts on every notification row and every\n * webhook body (`docs/NOTIFICATIONS.md` → \"Click target\").\n *\n * `storage` is the storage NAME — the explorer addresses storages by name and\n * a numeric id is unreadable to a caller who cannot list them. `path` is\n * relative to that storage's root and never carries a `<storage>://` prefix.\n */\nexport interface NotificationTarget {\n  kind: NotificationTargetKind;\n  storage?: string;\n  path?: string;\n  id?: string;\n  /**\n   * An app plugin asked for one of ITS OWN screens to be opened on the file\n   * (`notify_send target.action|view`, docs/APP-PLUGINS-API.md → v2). The\n   * server validates that the named action/view belongs to the named plugin\n   * before storing this, so a client may act on it without re-checking.\n   *\n   * ⚠ This is the difference between \"a file you have nothing to do with\n   * changed\" and \"please sign this\": a `plugin.notice` that lands you in a\n   * folder has made you find the screen yourself, which for a signer is\n   * where the flow stops.\n   */\n  open?: { plugin: string; action?: string; view?: string; section?: string };\n}\n\n/**\n * Where a click actually goes. Deliberately NOT a URL: the desktop app has no\n * URLs to navigate — it hands the explorer component a path — so the shared\n * answer is the structured destination and each surface renders it its own way\n * (`notificationRoute` below for the web, IPC for the desktop).\n */\n/** What an app wants opened once the file is on screen. */\nexport interface NotificationOpen {\n  plugin: string;\n  action?: string;\n  view?: string;\n}\n\nexport type NotificationDestination =\n  | {\n      kind: 'folder';\n      /** Storage name — the first segment of every explorer path. */\n      storage: string;\n      /** Folder inside that storage, relative, '' for its root. */\n      folder: string;\n      /**\n       * The row to select once the folder is open, as `<storage>://<path>` —\n       * the exact string the explorer puts in `data-fe-path`. Absent when the\n       * target is the folder itself.\n       */\n      select?: string;\n      /**\n       * An app screen to open once the row is revealed. ⚠ It rides on the\n       * DESTINATION rather than being resolved separately so the two can never\n       * disagree about which file they mean — the row that is selected is the\n       * row the app screen runs on.\n       */\n      open?: NotificationOpen;\n    }\n  | {\n      /**\n       * The Trash view (the explorer's `.trash` sentinel), spanning every\n       * storage. `select` is the row to select there, as `<storage>://<path>`\n       * with the ORIGINAL path — the view lists items by where they came from.\n       * Absent when the event could not say which item it was.\n       */\n      kind: 'trash';\n      select?: string;\n    }\n  | { kind: 'share'; token: string }\n  /**\n   * An app's HOME page (`kind: \"app\"` — a notice about a list, not a file),\n   * optionally at one of its sections. The web opens its own page for it\n   * (the `app-home` route); a surface with no such page (the desktop app)\n   * brings its window forward and stops.\n   */\n  | { kind: 'app'; plugin: string; view: string; section?: string }\n  | { kind: 'none' };\n\n/** The explorer's address for the Trash view (lib/listing.ts VIRTUAL_SEGMENTS). */\nexport const TRASH_VIEW_PATH = '.trash';\n\n/**\n * Two ways of spelling one row's `data-fe-path`: `docs://Documents/a.txt` and\n * `docs:///Documents/a.txt`. The Trash view builds its rows as\n * `<storage>://<original path>`, and the original path is stored with a\n * leading slash — so a reveal that compared strings exactly found nothing to\n * select there (measured 2026-09-21: trash rows read `docs:///Documents/…`).\n * Every surface that looks a row up by path compares through this.\n */\nexport function sameRowPath(a: string | null | undefined, b: string | null | undefined): boolean {\n  const norm = (p: string | null | undefined) => {\n    const s = String(p ?? '');\n    const at = s.indexOf('://');\n    return at < 0 ? s : `${s.slice(0, at + 3)}${s.slice(at + 3).replace(/^\\/+/, '')}`;\n  };\n  return norm(a) === norm(b);\n}\n\n/** Strip a leading slash and any `<storage>://` prefix; normalise separators. */\nfunction cleanPath(p: string | undefined | null): string {\n  let out = String(p ?? '').trim().replace(/\\\\/g, '/');\n  const at = out.indexOf('://');\n  if (at >= 0) out = out.slice(at + 3);\n  return out.replace(/^\\/+/, '').replace(/\\/+$/, '');\n}\n\n/** The folder part of a path — '' when the path is a name at the root. */\nfunction parentOf(p: string): string {\n  const i = p.lastIndexOf('/');\n  return i < 0 ? '' : p.slice(0, i);\n}\n\n/**\n * Resolve a notification's target into the place a click should land.\n *\n * ⚠ A file target resolves to its FOLDER plus a selection, never to the file\n * as a path of its own. Opening \"the file\" would mean guessing whether to\n * preview it, edit it or download it — three different answers for three file\n * types — where showing it in its folder is the one answer that is right for\n * every type, and is also what \"reveal\" means in every file manager.\n *\n * ⚠ Anything incomplete resolves to `none`, never to a partial address: a file\n * target with no storage would otherwise open whichever storage the user\n * happened to have in front of them, which is worse than not moving at all.\n */\nexport function resolveNotificationTarget(\n  target: NotificationTarget | null | undefined,\n): NotificationDestination {\n  if (!target || !target.kind || target.kind === 'none') return { kind: 'none' };\n\n  if (target.kind === 'share') {\n    const token = String(target.id ?? '').trim();\n    return token ? { kind: 'share', token } : { kind: 'none' };\n  }\n\n  if (target.kind === 'app') {\n    const plugin = String(target.open?.plugin ?? '').trim();\n    const view = String(target.open?.view ?? '').trim();\n    const section = String(target.open?.section ?? '').trim();\n    if (!plugin || !view) return { kind: 'none' };\n    return { kind: 'app', plugin, view, ...(section ? { section } : {}) };\n  }\n\n  const storage = String(target.storage ?? '').trim();\n  const path = cleanPath(target.path);\n\n  // The Trash view is a destination on its own — it spans every storage — so\n  // a trash target with no storage still goes there; it just selects nothing.\n  if (target.kind === 'trash') {\n    return storage && path ? { kind: 'trash', select: `${storage}://${path}` } : { kind: 'trash' };\n  }\n\n  if (!storage) return { kind: 'none' };\n\n  const open = openOf(target);\n\n  if (target.kind === 'dir') return { kind: 'folder', storage, folder: path, ...(open ? { open } : {}) };\n  if (target.kind === 'file') {\n    // ⚠ A file target whose path is only the storage root names no file, so\n    // there is no row to select — but the app screen the notice asked for is\n    // still what it asked for, and dropping it here turns \"please sign this\"\n    // into \"here is a folder\". The backend downgrades this shape to `dir`\n    // before storing it (notify.resolveTarget), which is why nobody has seen\n    // it; a hand-built target, an older row or a new emitter would.\n    if (!path) return { kind: 'folder', storage, folder: '', ...(open ? { open } : {}) };\n    return {\n      kind: 'folder',\n      storage,\n      folder: parentOf(path),\n      select: `${storage}://${path}`,\n      ...(open ? { open } : {}),\n    };\n  }\n  return { kind: 'none' };\n}\n\n/**\n * The app screen a target asks for, or `undefined`.\n *\n * ⚠ A plugin name with NEITHER an action nor a view is dropped: \"open the\n * sign app\" with nothing to open is not half an instruction, it is none, and\n * carrying it would make a row look actionable that has nothing to do.\n */\nfunction openOf(target: NotificationTarget): NotificationOpen | undefined {\n  const o = target.open;\n  if (!o || typeof o !== 'object') return undefined;\n  const plugin = String(o.plugin ?? '').trim();\n  const action = String(o.action ?? '').trim();\n  const view = String(o.view ?? '').trim();\n  if (!plugin || (!action && !view)) return undefined;\n  return { plugin, ...(action ? { action } : {}), ...(view ? { view } : {}) };\n}\n\n/**\n * Is there anywhere for a click on this row to GO?\n *\n * ⚠⚠ The answer used to be \"yes, always\": a row with no target took the\n * person to the notifications page, which is the page they were most likely\n * already looking at — a click that shuffles the view and answers nothing.\n * Worse, that page is admin-gated, so for everybody else the same click threw\n * away the folder they were standing in (the guard bounced them) and the row\n * was STILL not about anything. A row that cannot go anywhere now takes no\n * cursor, no hover and no click; reading it is the whole interaction.\n */\nexport function isNotificationClickable(target: NotificationTarget | null | undefined): boolean {\n  return resolveNotificationTarget(target).kind !== 'none';\n}\n\n/**\n * Does a click on this ROW go somewhere? ⚠ The SERVER says so: every row of\n * `GET /api/notifications` carries `opens` (backend notify.Opens - the one\n * rule a push's `open` follows too), so the bell, the page's pop-up and a\n * phone agree. A row from a server before 0.54 has none and is judged by its\n * target, as it always was.\n */\nexport function rowOpens(row: { target?: NotificationTarget | null; opens?: boolean | null }): boolean {\n  return typeof row.opens === 'boolean' ? row.opens : isNotificationClickable(row.target);\n}\n\n/**\n * The explorer's own path form for a destination — what goes in the address\n * bar hash, e.g. `qldemo/Documents` (and just `qldemo` for a storage root).\n *\n * ⚠ Measured, not assumed: the explorer writes `#<storage>/<relative path>`\n * while its rows carry `data-fe-path=\"<storage>://<relative path>\"`. Two\n * different shapes of the same location, and mixing them up produces a hash\n * the explorer reads as a folder literally named `qldemo:`.\n */\nexport function explorerHashPath(dest: NotificationDestination): string {\n  if (dest.kind === 'trash') return TRASH_VIEW_PATH;\n  if (dest.kind !== 'folder') return '';\n  return dest.folder ? `${dest.storage}/${dest.folder}` : dest.storage;\n}\n\n/**\n * The explorer's own ADDRESS for a destination — what its `load()` and its\n * `initialPath` take: `qldemo://Documents`, `qldemo://` for a storage root,\n * `.trash` for the Trash view, `''` for anything the explorer does not open.\n *\n * ⚠ The qualified shape (`<storage>://<path>`), NOT the hash shape above. The\n * explorer navigating itself — its own bell, a desktop OS notification handed\n * to it — has no address bar to go through, so it takes the form its rows and\n * its listings speak.\n */\nexport function explorerPathOf(dest: NotificationDestination): string {\n  if (dest.kind === 'trash') return TRASH_VIEW_PATH;\n  if (dest.kind !== 'folder') return '';\n  return `${dest.storage}://${dest.folder}`;\n}\n\n/**\n * The inverse of `explorerHashPath`: `#qldemo/Documents` → `qldemo://Documents`.\n *\n * ⚠⚠ It lives HERE, beside its inverse, because the two path shapes are the\n * documented trap of this module: the address bar carries `#<storage>/<folder>`\n * while rows carry `data-fe-path=\"<storage>://<path>\"`, and hand-converting one\n * into the other is how a hash ends up naming a folder called `qldemo:`. A\n * surface that needs the qualified form of \"the folder currently open\" asks\n * for it rather than slicing a string.\n *\n * `''` for an empty hash. A hash naming only a storage yields `<storage>://`,\n * which is that storage's root — the shape the explorer uses for it.\n */\nexport function qualifiedFromHash(hash: string | undefined | null): string {\n  const raw = String(hash ?? '').replace(/^#/, '').replace(/^\\/+/, '');\n  if (!raw) return '';\n  // The hash is written by the browser, so it arrives percent-encoded.\n  let decoded = raw;\n  try {\n    decoded = decodeURI(raw);\n  } catch {\n    /* a malformed escape is not worth losing the navigation over */\n  }\n  const cut = decoded.indexOf('/');\n  if (cut < 0) return `${decoded}://`;\n  return `${decoded.slice(0, cut)}://${decoded.slice(cut + 1)}`;\n}\n\n/** A route the web SPA can push. `null` when the destination is not in-SPA. */\nexport function notificationRoute(\n  dest: NotificationDestination,\n): { name: string; params?: Record<string, string>; query: Record<string, string>; hash: string } | null {\n  if (dest.kind === 'app') {\n    return {\n      name: 'app-home',\n      params: { plugin: dest.plugin, view: dest.view },\n      query: dest.section ? { section: dest.section } : {},\n      hash: '',\n    };\n  }\n  if (dest.kind === 'folder') {\n    // ⚠ The app screen travels as QUERY PARAMETERS, not as router state: the\n    // same address has to work when it is pasted, reloaded or opened in a new\n    // tab, which is exactly what a notification link is for.\n    const query: Record<string, string> = dest.select ? { select: dest.select } : {};\n    if (dest.open) {\n      query.app = dest.open.plugin;\n      if (dest.open.action) query.appAction = dest.open.action;\n      else if (dest.open.view) query.appView = dest.open.view;\n    }\n    return {\n      name: 'explore',\n      query,\n      // vue-router wants the '#'; the explorer encodes segment-by-segment, so\n      // we hand over the readable form and let the browser escape it.\n      hash: `#${explorerHashPath(dest)}`,\n    };\n  }\n  if (dest.kind === 'trash') {\n    // The explorer opens `#.trash` as its Trash view (a sentinel, like\n    // `#.recent`), and Explore.vue's reveal selects `select` once the rows\n    // are drawn — the same two halves a file target uses.\n    return {\n      name: 'explore',\n      query: dest.select ? { select: dest.select } : {},\n      hash: `#${explorerHashPath(dest)}`,\n    };\n  }\n  // ⚠⚠ `none` is NOT a route any more — see `isNotificationClickable`. A row\n  // with nothing to open is drawn as plain text and nothing navigates; the\n  // notifications page it used to push was either the page already on screen\n  // or, for a non-admin, a guard bounce that threw away their folder.\n  return null; // a share link is outside the SPA; `none` goes nowhere at all\n}\n\n/**\n * The public URL of a share token. Outside the SPA — a real navigation.\n *\n * `root` is the base path the app is served under (FILEX_BASE_PATH; the web\n * passes the core's `appBase()`), `''` at the root. A parameter rather than an\n * import, because this module depends on nothing (see notificationHref).\n */\nexport function shareHref(token: string, root = ''): string {\n  return `${root.replace(/\\/+$/, '')}/s/${encodeURIComponent(token)}`;\n}\n\n/**\n * The destination as a plain ADDRESS, for the places that cannot push a\n * route: a service worker's `notificationclick` (which has no router, and may\n * run with no page open at all) and anything that wants a copyable link.\n *\n * `base` is the prefix the SPA is served from (`/admin/`, `/drive/`, under\n * the base path when there is one) — the same reason `pluginPageBase` exists\n * on the explorer's config: only those prefixes fall back to index.html on the\n * server. `root` is the base path alone, for a share link (shareHref).\n *\n * ⚠ Hand-rolled escaping rather than `URLSearchParams`: this module is\n * imported by the DESKTOP MAIN PROCESS and by a service worker, and its whole\n * discipline is to depend on nothing. `''` when there is nowhere to go — the\n * caller must not turn that into \"/\".\n */\nexport function notificationHref(dest: NotificationDestination, base = '/', root = ''): string {\n  if (dest.kind === 'share') return shareHref(dest.token, root);\n  const prefix = `${String(base || '/').replace(/\\/+$/, '')}/`;\n  if (dest.kind === 'app') {\n    const at = `${prefix}app/${encodeURIComponent(dest.plugin)}/${encodeURIComponent(dest.view)}`;\n    return dest.section ? `${at}?section=${encodeURIComponent(dest.section)}` : at;\n  }\n  if (dest.kind !== 'folder' && dest.kind !== 'trash') return '';\n  const q: string[] = [];\n  if (dest.select) q.push(`select=${encodeURIComponent(dest.select)}`);\n  if (dest.kind === 'folder' && dest.open) {\n    q.push(`app=${encodeURIComponent(dest.open.plugin)}`);\n    if (dest.open.action) q.push(`appAction=${encodeURIComponent(dest.open.action)}`);\n    else if (dest.open.view) q.push(`appView=${encodeURIComponent(dest.open.view)}`);\n  }\n  const hash = explorerHashPath(dest);\n  return `${prefix}explore${q.length ? `?${q.join('&')}` : ''}${hash ? `#${hash}` : ''}`;\n}\n","<script setup lang=\"ts\">\n/**\n * NotificationRow — one notification, wherever it is listed.\n *\n * ⚠⚠ THE row, not \"the bell's row\". It is drawn in the bell's popover and in\n * the full-list screen that \"see all\" opens — in the web app and, since\n * 2026-09-27, in the desktop app's explorer header too — and rule 1 of the\n * product rule (docs/NOTIFICATIONS.md → \"The bell, and who can reach it\") is a\n * fact about the ROW, not about the list it happens to be in: *a notification\n * is clickable exactly when it has somewhere to go*. Two copies of that markup\n * is two places for the `is-static` class to be forgotten, and a row that looks\n * clickable and is not is exactly the defect this rule exists to kill.\n *\n * ⚠ The verdict itself is not taken locally: the SERVER says it on every row\n * (`opens`, backend notify.Opens - the rule a push follows too), read through\n * `rowOpens` in `lib/notificationTarget.ts`, which the browser toast uses too.\n * This file decides how the answer LOOKS, never what it is.\n */\nimport { computed } from 'vue';\n\nimport { formatWhen, useLocale } from '../composables/useLocale';\nimport { useNotificationText } from '../composables/useNotificationText';\nimport { rowOpens } from '../lib/notificationTarget';\nimport type { NotificationRowData } from '../composables/useNotificationFeed';\n\nconst props = defineProps<{\n  item: NotificationRowData;\n  /** The language on screen — any offered code, a language pack's included. */\n  locale: string;\n}>();\nconst emit = defineEmits<{ (e: 'open', item: NotificationRowData): void }>();\n\nconst { t } = useLocale(() => props.locale);\n// ⚠ The SERVER's words: the row arrives with its title and body said in this\n// reader's language (backend notify say.go) - what the page's pop-up, the\n// desktop app's toast and a push to their phone say too. Nothing here\n// composes a sentence; an encrypted item is named where this tab can.\nconst { notificationText } = useNotificationText();\n\nconst text = computed(() => notificationText(props.item));\nconst clickable = computed(() => rowOpens(props.item));\nconst unread = computed(() => !props.item.read_at);\n/** THE date format of the product (core formatWhen), with the clock. */\nconst when = computed(() => formatWhen(props.item.created_at, props.locale, { time: true }) || '-');\n\n/**\n * gorunum:v2 — the severity in the reader's language, not the enum.\n *\n * It printed the raw value under a CSS `uppercase`, which in Turkish turns\n * `info` into `İNFO` — the locale's own uppercasing of a dotted i, applied to\n * a word that was never Turkish in the first place.\n */\nfunction severityLabel(sev: string): string {\n  const key = `notifications.severity.${sev}`;\n  const out = t(key);\n  return out === key ? sev : out;\n}\n\nfunction severityTone(s: string): 'danger' | 'warning' | 'info' {\n  if (s === 'critical' || s === 'error') return 'danger';\n  if (s === 'warning') return 'warning';\n  return 'info';\n}\n</script>\n\n<template>\n  <!-- ⚠⚠ A row with nothing to open is NOT a button. It used to be one, and it\n       took the person to the notifications page — the page they were most\n       likely already on, and for a non-admin a guard bounce that threw away\n       the folder they were standing in. A row that is only worth reading is\n       now only readable: no cursor, no hover, no focus stop, no click. -->\n  <component\n    :is=\"clickable ? 'button' : 'div'\"\n    :type=\"clickable ? 'button' : undefined\"\n    class=\"fx-nrow\"\n    :class=\"{ 'is-unread': unread, 'has-target': clickable, 'is-static': !clickable }\"\n    :title=\"clickable ? t('notifications.openTarget') : undefined\"\n    data-testid=\"notification-row\"\n    :data-clickable=\"clickable ? 'yes' : 'no'\"\n    :data-notification-id=\"item.id\"\n    @click=\"clickable ? emit('open', item) : undefined\"\n  >\n    <span\n      class=\"fx-nrow__dot\"\n      aria-hidden=\"true\"\n    ></span>\n    <span class=\"fx-nrow__body\">\n      <span class=\"fx-nrow__meta\">\n        <span\n          class=\"fx-nrow__sev\"\n          :class=\"`is-${severityTone(item.severity)}`\"\n        >{{\n          severityLabel(item.severity)\n        }}</span>\n        <span class=\"fx-nrow__when\">{{ when }}</span>\n      </span>\n      <span class=\"fx-nrow__title\">{{ text.title }}</span>\n      <span\n        v-if=\"text.body\"\n        class=\"fx-nrow__body-text\"\n      >{{ text.body }}</span>\n    </span>\n  </component>\n</template>\n\n<style>\n/* ⚠ NOT scoped. The bell's popover is TELEPORTED to <body>, outside this\n   component's subtree, so a `[data-v-…]` attribute selector would not reach\n   it. Every class is `fx-nrow`-prefixed instead.\n   ⚠ Declared `--fe-*` tokens only: the row is drawn inside the explorer,\n   under whatever palette the viewer chose.\n   ⚠⚠ It says its own HEIGHT and alignment. The row is teleported out of `.fe`\n   with the bell's panel, so the host page's rules reach it — and a host that\n   styles every <button> with a fixed height (the desktop app's own window does:\n   `button { height: var(--fe-h-md) }`) squeezed each two-line row into 34px,\n   drawing the rows over one another (measured 2026-09-27, the first time the\n   desktop drew this bell; desktop/scripts/notif-e2e.mjs measures it). */\n.fx-nrow {\n  display: flex;\n  align-items: flex-start;\n  justify-content: flex-start;\n  gap: var(--fe-gap-sm);\n  width: 100%;\n  height: auto;\n  min-height: 0;\n  padding: 8px;\n  border: 0;\n  border-radius: var(--fe-radius-sm);\n  background: transparent;\n  color: var(--fe-text);\n  font: inherit;\n  text-align: start;\n  cursor: default;\n}\n.fx-nrow.has-target {\n  cursor: pointer;\n}\n.fx-nrow:hover,\n.fx-nrow:focus-visible {\n  background: var(--fe-bg-hover);\n  outline: none;\n}\n/* ⚠ A row with nowhere to go keeps its words and loses every affordance —\n   including the hover tint, which is what says \"this does something\". */\n.fx-nrow.is-static:hover,\n.fx-nrow.is-static:focus-visible {\n  background: transparent;\n}\n/* Unread is the dot; read rows keep their words and lose only the weight. */\n.fx-nrow__dot {\n  flex: 0 0 auto;\n  width: 8px;\n  height: 8px;\n  margin-top: 5px;\n  border-radius: 50%;\n  background: var(--fe-border-strong);\n}\n.fx-nrow.is-unread .fx-nrow__dot {\n  background: var(--fe-primary);\n}\n.fx-nrow__body {\n  display: flex;\n  flex-direction: column;\n  gap: 2px;\n  min-width: 0;\n  flex: 1 1 auto;\n}\n.fx-nrow__meta {\n  display: flex;\n  align-items: baseline;\n  gap: var(--fe-gap-sm);\n  font-size: var(--fe-text-xs);\n  color: var(--fe-text-muted);\n}\n.fx-nrow__sev {\n  font-weight: 600;\n}\n.fx-nrow__sev.is-danger {\n  color: var(--fe-danger);\n}\n.fx-nrow__sev.is-warning {\n  color: var(--fe-warning);\n}\n.fx-nrow__sev.is-info {\n  color: var(--fe-primary-ink);\n}\n.fx-nrow__when {\n  margin-inline-start: auto;\n  white-space: nowrap;\n}\n.fx-nrow__title {\n  font-weight: 500;\n  overflow-wrap: anywhere;\n}\n.fx-nrow:not(.is-unread) .fx-nrow__title {\n  font-weight: 400;\n  color: var(--fe-text-muted);\n}\n.fx-nrow__body-text {\n  color: var(--fe-text-muted);\n  font-size: var(--fe-text-sm);\n  display: -webkit-box;\n  -webkit-line-clamp: 2;\n  -webkit-box-orient: vertical;\n  overflow: hidden;\n  overflow-wrap: anywhere;\n}\n</style>\n","// The unread count, as it is drawn — one rule, every surface.\n//\n// The count lives ON the bell icon (docs/NOTIFICATIONS.md → \"The bell, and who\n// can reach it\", rule 3). It reads the exact number up to 99 and `99+` above\n// that, never a raw three-digit number and never a bare dot.\n//\n// ⚠⚠ Why a module and not three `count > 99 ? '99+' : count` expressions. The\n// same number is drawn in the explorer's header, in the admin panel's top nav,\n// in the full list's own header, and on the desktop app's dock/taskbar badge.\n// A counter written four times is a counter that disagrees with itself — and\n// the disagreement is invisible until somebody has exactly 100 unread rows,\n// which is the one moment nobody tests by hand.\n//\n// ⚠ Keep this file free of imports, of Vue and of `window`: it is imported by\n// the DESKTOP MAIN PROCESS (desktop/src/main.ts), which has no DOM — the same\n// discipline `notificationTarget.ts` keeps, and for the same reason.\n\n/** Above this the badge stops counting and starts saying \"more than this\". */\nexport const UNREAD_BADGE_MAX = 99;\n\n/**\n * What the badge SAYS. `''` when there is nothing to show — a zero badge is\n * not a small badge, it is no badge, and the caller renders nothing.\n *\n * ⚠ Non-finite and negative counts read as nothing rather than as `NaN`: the\n * count arrives from a network response, and a badge is not the place to\n * discover that a server answered oddly.\n */\nexport function unreadBadgeLabel(count: number | null | undefined): string {\n  const n = Math.floor(Number(count ?? 0));\n  if (!Number.isFinite(n) || n <= 0) return '';\n  return n > UNREAD_BADGE_MAX ? `${UNREAD_BADGE_MAX}+` : String(n);\n}\n\n/**\n * The number an OS-level badge (dock, taskbar, tray) should carry.\n *\n * ⚠ NOT clamped to 99. macOS and Unity draw the number themselves and are\n * perfectly happy with 137; clamping it there would be this module inventing a\n * limit the platform does not have. The 99 ceiling is about how much room a\n * 16px circle has, which is a fact about the DOM badge and nothing else.\n */\nexport function unreadBadgeCount(count: number | null | undefined): number {\n  const n = Math.floor(Number(count ?? 0));\n  return Number.isFinite(n) && n > 0 ? n : 0;\n}\n","<script setup lang=\"ts\">\n/**\n * UnreadBadge — the count, drawn ON an icon. THE one of them.\n *\n * Owner's ruling, 2026-09-20, verbatim: *\"Uygulamada bildirim gelince köşe\n * ikonda bildirim sayısını gösterelim; mobilde de ikon üstünde; 99 üzeri\n * 99+.\"*\n *\n * ⚠⚠ It is a component rather than a `<span>` copied into each bell because\n * there is more than one bell: the admin panel's top nav draws one, the\n * explorer's header cluster draws one, the full-list screen draws one in its\n * own heading, and the desktop app draws the same number on its dock icon\n * (through `lib/unreadBadge.ts`, which this component is the DOM half of).\n * Four copies of \"99+\" is four chances for one of them to say `100`.\n *\n * ⚠ It renders NOTHING at zero. A badge showing `0` is a badge that says\n * \"there is news\" in the exact shape of the thing that says there is none.\n *\n * ⚠ `aria-hidden`: the count belongs in the host control's accessible NAME\n * (the bell button says \"Notifications — 7 unread\"), not as a second stray\n * number a screen reader meets on its own. The host owns the sentence; this\n * owns the picture.\n */\nimport { computed } from 'vue';\nimport { unreadBadgeLabel } from '../lib/unreadBadge';\n\nconst props = defineProps<{\n  /** The unread count as the server last reported it. */\n  count: number | null | undefined;\n}>();\n\nconst label = computed(() => unreadBadgeLabel(props.count));\n</script>\n\n<template>\n  <span\n    v-if=\"label\"\n    class=\"fx-badge\"\n    aria-hidden=\"true\"\n    data-testid=\"unread-badge\"\n  >{{ label }}</span>\n</template>\n\n<style>\n/* ⚠ NOT scoped, and every rule is `fx-badge`-prefixed. The badge is drawn\n   inside the explorer's header — teleported panels and custom-element\n   boundaries included — where a `[data-v-…]` attribute would not survive the\n   trip. Same decision, same reason, as NotificationBell's own styles.\n\n   ⚠ Declared `--fe-*` tokens only: the badge sits on controls the viewer may\n   have re-themed, so its ink has to be the pairing the theme contrast test\n   pins in every palette (primary on text-on-primary), and its ring has to be\n   the ground it happens to sit on. */\n.fx-badge {\n  position: absolute;\n  top: 2px;\n  inset-inline-end: 1px;\n  min-width: 16px;\n  height: 16px;\n  padding: 0 4px;\n  border-radius: 999px;\n  background: var(--fe-primary);\n  color: var(--fe-text-on-primary);\n  box-shadow: 0 0 0 2px var(--fe-bg);\n  font-family: var(--fe-font);\n  font-size: 10px;\n  font-weight: 600;\n  line-height: 16px;\n  text-align: center;\n  /* The badge is a picture of a number drawn over a control; a click on it is\n     a click on the control underneath, never on the badge. */\n  pointer-events: none;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * NotificationBell — the one bell, wherever a header has room for it.\n *\n * It lives in THREE headers and is the same component in all of them: the web\n * admin panel's top nav, the web explorer's own header cluster (Explore.vue,\n * beside the avatar), and — since 2026-09-27 — the desktop app's explorer\n * header, which the explorer draws itself when its host asks for it\n * (`config.notifications`, see FileExplorer). The second home is the owner's\n * ruling, 2026-09-14, verbatim: *\"üst bara zil koyalım.\"* The third is the\n * same complaint one surface over: the desktop app raised an OS notification\n * for every row and had nowhere inside it to read them, mark one read or\n * follow one to what it was about.\n *\n * ⚠ It moved here from web/src/components so the desktop could have it. What\n * a host still owns is only what a package cannot know: the FEED (the web's\n * pinia store, or the explorer's own), the LANGUAGE on screen, and where a\n * click GOES (`@open` — the web pushes a route, the explorer navigates itself).\n * Marking the row read on a click is behaviour, so it is done here, once.\n *\n * ⚠ The poll is NOT here. On the web it lives in App.vue\n * (composables/useNotificationWatcher) so every signed-in screen is covered by\n * one 15 s loop whether or not a bell is drawn on it; in the explorer it is the\n * explorer's own loop (or the desktop main process's, which hands the count\n * over). This component reads the feed that loop fills — `feed.feed`, refreshed\n * whenever the unread count moves, so a row that raises the badge also appears\n * in the list, open or closed.\n *\n * ⚠⚠ The panel is TELEPORTED to <body>, for the same measured reason the avatar\n * menu is: `.fe` — the explorer's root — carries `overflow: hidden`, so a panel\n * positioned inside the header is cut off at the header's bottom edge. Its\n * position is taken from the button's rectangle at the moment it opens,\n * anchored to the button's RIGHT edge and clamped into the viewport, because at\n * 390px the bell sits a little left of the avatar and a 360px panel hung from\n * its right edge would otherwise start off-screen.\n *\n * ⚠ Declared `--fe-*` tokens only, no Tailwind colours: in the explorer header\n * it sits four pixels from controls drawn in those tokens (and under a palette\n * the viewer may have chosen), and the glyph is the explorer's own\n * (`actionIconSvg('bell')`) for the same reason.\n */\nimport { computed, ref } from 'vue';\nimport { Popover, PopoverButton, PopoverPanel } from '@headlessui/vue';\n\nimport { useLocale } from '../composables/useLocale';\nimport type { NotificationFeed, NotificationRowData } from '../composables/useNotificationFeed';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport { anchorUnderEndEdge, fixedViewport, refElement } from '../lib/anchoredPanel';\nimport { dirOfElement } from '../lib/direction';\n// ⚠ The row and the badge are components, not markup written here: the same\n// row is drawn by the full-list screen and the same badge by that screen's\n// heading and by the desktop app's dock icon. Rule 1 and rule 3 of\n// docs/NOTIFICATIONS.md → \"The bell, and who can reach it\" are both rules\n// about \"the same everywhere\", which a second copy quietly ends.\nimport NotificationRow from './NotificationRow.vue';\nimport UnreadBadge from './UnreadBadge.vue';\n\nconst props = defineProps<{\n  /** The person's notifications (useNotificationFeed), refs unwrapped. */\n  feed: NotificationFeed;\n  /** The language on screen — any offered code, a language pack's included. */\n  locale: string;\n  /**\n   * Where the administrators' console for notifications is, when the reader\n   * may go there. Absent → the second door is not drawn at all.\n   */\n  manageHref?: string;\n}>();\n\nconst emit = defineEmits<{\n  /** A row with somewhere to go was clicked — already marked read. */\n  (e: 'open', item: NotificationRowData): void;\n  /** The admin door was clicked (its `href` is `manageHref`). */\n  (e: 'manage'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/* ── the count on the button ───────────────────────────────────────────── */\nconst unread = computed(() => Math.max(0, props.feed.unreadCount || 0));\n/** The accessible name carries the count too — a badge is a picture of a number. */\nconst buttonLabel = computed(() =>\n  unread.value > 0\n    ? `${t('notifications.bell')} - ${t('notifications.unreadCount', { n: unread.value })}`\n    : t('notifications.bell'),\n);\n\n/* ── where the teleported panel goes ───────────────────────────────────── */\nconst PANEL_W = 360;\nconst btnEl = ref<InstanceType<typeof PopoverButton> | null>(null);\nconst pos = ref<{ top: string; right?: string; left?: string; width: string; maxHeight: string }>({\n  top: '0px',\n  right: '0px',\n  width: `${PANEL_W}px`,\n  maxHeight: '420px',\n});\n\n/**\n * Recorded from the button, not the panel (the panel does not exist until it\n * opens), on BOTH click and keydown: Headless UI opens on Enter/Space without\n * a click, and a stale rectangle would hang the panel wherever the button used\n * to be. Neither handler intercepts the event.\n */\nfunction syncPos() {\n  const el = refElement(btnEl.value);\n  const r = el?.getBoundingClientRect();\n  if (!r) return;\n  const at = anchorUnderEndEdge(\n    r,\n    fixedViewport(),\n    // The list scrolls inside the panel; 520 keeps ~6 rows on a laptop and\n    // the head + foot visible on a phone. ⚠ RTL: flush with the bell's END\n    // edge — its left one in a right-to-left header.\n    { width: PANEL_W, maxHeight: 520, dir: dirOfElement(el) },\n  );\n  pos.value = { top: at.top, right: at.right, left: at.left, width: at.width ?? `${PANEL_W}px`, maxHeight: at.maxHeight };\n}\n\n/**\n * The panel just OPENED: place it and bring the rows up to date.\n *\n * ⚠⚠ Bound to the panel's CONTENT, not to `<PopoverPanel>` itself. Headless UI\n * keeps the panel component mounted for the life of the popover and only stops\n * rendering its children while closed, so a `vue:mounted` on the component\n * fired exactly once — on the first render, before anybody opened anything —\n * and every later open showed whatever that one fetch had returned. Its\n * children really do mount and unmount with each open, so the hook lives on\n * the first of them.\n */\nfunction onPanelOpen() {\n  syncPos();\n  void props.feed.refreshFeed();\n}\n\n/* ── the rows ──────────────────────────────────────────────────────────── */\n\n/**\n * Clicking a row marks it read AND goes to the thing it is about — through the\n * SAME resolver the browser and desktop notifications use, so the three can\n * never land in three different places. Owner's standing requirement:\n * *\"tıklandığında yollarına gitmesini istiyorum.\"*\n *\n * ⚠ Only a row that HAS somewhere to go ever gets here: `NotificationRow`\n * emits nothing for an inert one (it is not even a button).\n */\nasync function openItem(n: NotificationRowData, close: () => void) {\n  close();\n  if (!n.read_at) await props.feed.markRead(n.id).catch(() => {});\n  emit('open', n);\n}\n\n/**\n * \"See all\" — for EVERYBODY, and it does not leave the explorer.\n *\n * ⚠⚠ It used to be an admin-only link to the instance-wide audit page behind\n * `requiresAdmin`. Owner, 2026-09-20: *\"Tüm bildirimleri gör butonu explore'dan\n * dışarı çıkıyor; adam admin değilse göremez.\"* So a person who was not an\n * administrator could read the newest fifteen rows in this popover and had no\n * way to reach the sixteenth. The full list is a panel over the explorer\n * (NotificationsPanel.vue) reading the user-scoped endpoints, and the admin\n * page keeps its own, separate door below — for MANAGING the subsystem.\n */\nfunction seeAll(close: () => void) {\n  close();\n  props.feed.openPanel();\n}\n\nfunction manage(close: () => void) {\n  close();\n  emit('manage');\n}\n\n// The newest fifteen. The full list is one click further on.\nconst list = computed(() => props.feed.feed.slice(0, 15));\n</script>\n\n<template>\n  <Popover\n    v-slot=\"{ open, close }\"\n    class=\"fx-bell\"\n  >\n    <PopoverButton\n      ref=\"btnEl\"\n      class=\"fx-bell__btn\"\n      :class=\"{ 'is-open': open }\"\n      :title=\"buttonLabel\"\n      :aria-label=\"buttonLabel\"\n      data-testid=\"notification-bell\"\n      @click=\"syncPos\"\n      @keydown=\"syncPos\"\n    >\n      <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n      <span\n        class=\"fx-bell__icon\"\n        aria-hidden=\"true\"\n        v-html=\"actionIconSvg('bell')\"\n      ></span>\n      <!-- ⚠ THE badge component (rule 3): the count is drawn on the icon by\n           one thing, here, in the admin nav, in the full list's heading and —\n           through lib/unreadBadge.ts — on the desktop app's dock. -->\n      <UnreadBadge :count=\"unread\" />\n    </PopoverButton>\n\n    <Teleport to=\"body\">\n      <PopoverPanel\n        class=\"fx-bell__panel\"\n        :style=\"{ top: pos.top, right: pos.right, left: pos.left, width: pos.width }\"\n        data-testid=\"notification-panel\"\n      >\n        <div\n          class=\"fx-bell__head\"\n          @vue:mounted=\"onPanelOpen\"\n        >\n          <span class=\"fx-bell__heading\">{{ t('notifications.title') }}</span>\n          <button\n            v-if=\"feed.hasUnread\"\n            type=\"button\"\n            class=\"fx-bell__markall\"\n            data-testid=\"notification-mark-all\"\n            @click=\"feed.markAllRead()\"\n          >\n            <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n            <span\n              class=\"fx-bell__markall-icon\"\n              aria-hidden=\"true\"\n              v-html=\"actionIconSvg('check')\"\n            ></span>\n            {{ t('notifications.markAllRead') }}\n          </button>\n        </div>\n\n        <ul\n          class=\"fx-bell__list\"\n          :style=\"{ maxHeight: pos.maxHeight }\"\n          data-testid=\"notification-list\"\n        >\n          <li\n            v-if=\"!list.length && !feed.feedLoading\"\n            class=\"fx-bell__empty\"\n          >\n            {{ t('notifications.empty') }}\n          </li>\n          <li\n            v-for=\"n in list\"\n            :key=\"n.id\"\n          >\n            <!-- ⚠⚠ THE row component — the same one the full-list screen\n                 draws. Whether a row is clickable is a fact about the row\n                 (rule 1), so it is decided in one place and looks the same in\n                 every list it appears in. -->\n            <NotificationRow\n              :item=\"n\"\n              :locale=\"locale\"\n              @open=\"openItem($event, close)\"\n            />\n          </li>\n        </ul>\n\n        <div class=\"fx-bell__foot\">\n          <!-- ⚠⚠ For EVERYBODY. This was `v-if=\"auth.isAdmin\"` around a link\n               to the admin audit page, which meant a non-admin was shown no\n               way at all to read their own sixteenth notification. It now\n               opens the full list over the explorer, from the user-scoped\n               endpoints — no admin rights anywhere on the path. -->\n          <button\n            type=\"button\"\n            class=\"fx-bell__all\"\n            data-testid=\"notification-view-all\"\n            @click=\"seeAll(close)\"\n          >\n            {{ t('notifications.viewAll') }}\n          </button>\n          <!-- ⚠ The admin page is a SECOND, smaller door, and it is for\n               managing the subsystem (the webhook, everybody's rows) — not\n               for reading your own mail. An administrator walks to it\n               deliberately; nobody is sent there by a \"see all\". -->\n          <a\n            v-if=\"manageHref\"\n            :href=\"manageHref\"\n            class=\"fx-bell__manage\"\n            data-testid=\"notification-manage\"\n            @click.prevent=\"manage(close)\"\n          >\n            {{ t('notifications.manageAdmin') }}\n          </a>\n        </div>\n      </PopoverPanel>\n    </Teleport>\n  </Popover>\n</template>\n\n<style>\n/* ⚠ NOT scoped. The panel is teleported to <body>, outside this component's\n   subtree, and the button has to lose to the explorer header's own\n   `.fe-toolbar__tail` rules on equal footing rather than out-rank them with a\n   `[data-v-…]` attribute. Every class is `fx-bell`-prefixed. */\n.fx-bell {\n  position: relative;\n  display: inline-flex;\n}\n/* The same square as every other control in the explorer's trailing cluster\n   (`.fe-toolbar__tail .fe-btn`, base.css) — whoever rendered it. */\n.fx-bell__btn {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  height: var(--fe-h-md);\n  min-width: var(--fe-h-md);\n  padding: 0 var(--fe-gap-sm);\n  border: 1px solid transparent;\n  border-radius: var(--fe-radius-md);\n  background: transparent;\n  color: var(--fe-text-muted);\n  cursor: pointer;\n}\n.fx-bell__btn:hover,\n.fx-bell__btn.is-open {\n  background: var(--fe-bg-hover);\n  color: var(--fe-text);\n}\n.fx-bell__btn:focus-visible {\n  outline: 2px solid var(--fe-primary);\n  outline-offset: 1px;\n}\n/* ⚠ Not while open. Headless UI's Popover button re-focuses itself from script\n   on a MOUSE click, which Chrome answers with `:focus-visible` — so the app's\n   global `:focus-visible` ring (web/src styles) was drawn around the bell on\n   every click, while the avatar's Menu button one control to the right gets\n   none. Measured through CDP: the ring came from that global rule, not from\n   this file. While open, the panel and the pressed ground already say where\n   you are; the ring is for finding the button, and it is back once closed. */\n.fx-bell__btn.is-open {\n  outline: none;\n}\n.fx-bell__icon {\n  display: inline-flex;\n}\n.fx-bell__icon svg {\n  width: 16px;\n  height: 16px;\n  display: block;\n  color: inherit;\n}\n/* The unread count is UnreadBadge.vue now (rule 3: one badge, every\n   surface). The button keeps `position: relative` above, which is the\n   badge's positioning context and the only part of it that is about\n   THIS control. */\n\n.fx-bell__panel {\n  position: fixed;\n  /* Above the explorer's own overlays (context menus 90, tour 96) and level\n     with the avatar menu, which it can never be open at the same time as. */\n  z-index: 140;\n  display: flex;\n  flex-direction: column;\n  max-width: calc(100vw - 16px);\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius-md);\n  background: var(--fe-bg);\n  color: var(--fe-text);\n  box-shadow: var(--fe-shadow-sm);\n  font-family: var(--fe-font);\n  font-size: var(--fe-text-md);\n  outline: none;\n  overflow: hidden;\n}\n.fx-bell__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--fe-gap-sm);\n  padding: 8px 12px;\n  border-bottom: 1px solid var(--fe-border-soft);\n}\n.fx-bell__heading {\n  font-weight: 600;\n}\n/* ⚠ `height: auto` on the panel's own buttons: the panel is teleported out of\n   `.fe`, and a host's button rules reach it (NotificationRow.vue says how). */\n.fx-bell__markall {\n  height: auto;\n  display: inline-flex;\n  align-items: center;\n  gap: 4px;\n  padding: 2px 6px;\n  border: 0;\n  border-radius: var(--fe-radius-sm);\n  background: transparent;\n  color: var(--fe-text-muted);\n  font: inherit;\n  font-size: var(--fe-text-xs);\n  cursor: pointer;\n}\n.fx-bell__markall:hover {\n  background: var(--fe-bg-hover);\n  color: var(--fe-text);\n}\n.fx-bell__markall-icon svg {\n  width: 14px;\n  height: 14px;\n  display: block;\n  color: inherit;\n}\n.fx-bell__list {\n  margin: 0;\n  padding: 4px;\n  list-style: none;\n  overflow-y: auto;\n  overscroll-behavior: contain;\n}\n.fx-bell__empty {\n  padding: 24px 12px;\n  text-align: center;\n  color: var(--fe-text-muted);\n}\n/* The rows are NotificationRow.vue now — the same component the full-list\n   screen draws, so \"which rows are clickable\" cannot be answered\n   differently in the two places it is asked. */\n\n.fx-bell__foot {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: var(--fe-gap-sm);\n  padding: 8px 12px;\n  border-top: 1px solid var(--fe-border-soft);\n  text-align: center;\n  font-size: var(--fe-text-xs);\n}\n.fx-bell__all {\n  height: auto;\n  border: 0;\n  background: transparent;\n  padding: 0;\n  font: inherit;\n  color: var(--fe-primary-ink);\n  text-decoration: none;\n  cursor: pointer;\n}\n.fx-bell__all:hover {\n  text-decoration: underline;\n}\n/* ⚠ Visibly the lesser of the two. \"See all\" is where a person reads their\n   own notifications; this one goes to the operator's console, and drawing\n   them as equals is how the old bell sent everybody to the wrong one. */\n.fx-bell__manage {\n  color: var(--fe-text-muted);\n  text-decoration: none;\n}\n.fx-bell__manage::before {\n  content: '·';\n  margin-inline-end: var(--fe-gap-sm);\n  color: var(--fe-border-strong);\n}\n.fx-bell__manage:hover {\n  color: var(--fe-text);\n  text-decoration: underline;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * NotificationsPanel — ALL of a person's notifications, where they already are.\n *\n * Owner's ruling, 2026-09-20, verbatim: *\"Tüm bildirimleri gör butonu\n * explore'dan dışarı çıkıyor; adam admin değilse göremez.\"*\n *\n * ⚠⚠ What it replaces. \"See all\" pointed at `/notifications`, which is the\n * ADMIN panel's instance-wide audit page and sits behind `requiresAdmin`. So\n * the bell's footer was hidden from everybody who was not an administrator,\n * and an ordinary person — whose whole product is the explorer — could read\n * the newest fifteen rows in the popover and had no way to reach the\n * sixteenth. Their own mail, behind a permission they do not have.\n *\n * ⚠ So it is a PANEL OVER THE EXPLORER rather than a route. A route would\n * have to live outside the admin block to escape that guard, and it would\n * unmount the explorer to show a list — throwing away the folder the person\n * was standing in, which is the same complaint one layer down. This opens\n * over what they were doing and closes back onto it.\n *\n * ⚠ It reads the USER-scoped endpoints — `GET /api/notifications`, `POST\n * /api/notifications/{id}/read`, `POST /api/notifications/read-all` — every\n * one of which is authenticated-but-not-admin (docs/NOTIFICATIONS.md →\n * \"In-app bell (endpoints)\"). Nothing here touches `/api/admin`.\n *\n * ⚠ Rendered ONCE per feed and opened through it (`feed.openPanel()`): the web\n * draws it at its root (App.vue) because the bell is in two headers; the\n * explorer draws it beside its own bell when it draws one (the desktop app).\n * A panel per bell would be two panels, and the one that was not open would\n * still be fetching. Moved here from web/src/components on 2026-09-27 with the\n * bell, so the desktop app's \"See all\" opens this very screen.\n */\nimport { computed, onBeforeUnmount, watch } from 'vue';\n\nimport { useLocale } from '../composables/useLocale';\nimport type { NotificationFeed, NotificationRowData } from '../composables/useNotificationFeed';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport NotificationRow from './NotificationRow.vue';\nimport UnreadBadge from './UnreadBadge.vue';\n\nconst props = defineProps<{\n  /** The person's notifications (useNotificationFeed), refs unwrapped. */\n  feed: NotificationFeed;\n  /** The language on screen — any offered code, a language pack's included. */\n  locale: string;\n}>();\n\nconst emit = defineEmits<{\n  /** A row with somewhere to go was clicked — already marked read. */\n  (e: 'open', item: NotificationRowData): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst page = computed(() => Math.floor(props.feed.mineOffset / props.feed.mineLimit) + 1);\nconst pages = computed(() => Math.max(1, Math.ceil(props.feed.mineTotal / props.feed.mineLimit)));\n\nfunction go(p: number): void {\n  if (p < 1 || p > pages.value) return;\n  props.feed.setMinePage(p);\n  void props.feed.fetchMine();\n}\n\nfunction toggleUnread(): void {\n  props.feed.setMineUnreadFilter(!props.feed.mineUnreadOnly);\n  void props.feed.fetchMine();\n}\n\n/**\n * A row was clicked: mark it read and go where it points — the SAME resolver\n * the bell, the browser toast and the desktop shell use, so the four cannot\n * land in four different places. The panel closes first: the destination is\n * the explorer underneath it, and a list left open over it would be covering\n * the very file it just revealed.\n */\nasync function open(n: NotificationRowData): Promise<void> {\n  props.feed.closePanel();\n  if (!n.read_at) await props.feed.markRead(n.id).catch(() => {});\n  emit('open', n);\n}\n\n/** Mark one row read WITHOUT going anywhere — the only thing an inert row\n *  can be done with, and the thing a long list is mostly used for. */\nasync function markOne(n: NotificationRowData): Promise<void> {\n  if (n.read_at) return;\n  await props.feed.markRead(n.id).catch(() => {});\n}\n\n/**\n * ⚠ Escape closes it. The panel covers the whole viewport and the explorer\n * beneath it still has focus handlers; without this the only way out on a\n * keyboard would be to tab to the close button, which on a 25-row list is a\n * long walk.\n */\nfunction onKey(e: KeyboardEvent): void {\n  if (e.key === 'Escape') props.feed.closePanel();\n}\n\nwatch(\n  () => props.feed.panelOpen,\n  (open) => {\n    if (open) window.addEventListener('keydown', onKey);\n    else window.removeEventListener('keydown', onKey);\n  },\n  { immediate: true },\n);\nonBeforeUnmount(() => window.removeEventListener('keydown', onKey));\n</script>\n\n<template>\n  <Teleport to=\"body\">\n    <div\n      v-if=\"feed.panelOpen\"\n      class=\"fx-nall\"\n      role=\"dialog\"\n      aria-modal=\"true\"\n      :aria-label=\"t('notifications.title')\"\n      data-testid=\"notifications-screen\"\n    >\n      <!-- ⚠ The backdrop closes it. `.self` so a click that started inside the\n           sheet and ended on the backdrop (a drag over a long title) does not\n           close a list somebody is reading. -->\n      <div\n        class=\"fx-nall__scrim\"\n        @click.self=\"feed.closePanel()\"\n      ></div>\n\n      <section class=\"fx-nall__sheet\">\n        <header class=\"fx-nall__head\">\n          <span class=\"fx-nall__title\">\n            <span\n              class=\"fx-nall__title-icon\"\n              aria-hidden=\"true\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n              <span v-html=\"actionIconSvg('bell')\"></span>\n              <!-- ⚠ The same badge component as the bell's. Rule 3: a counter\n                   written twice is a counter that disagrees with itself. -->\n              <UnreadBadge :count=\"feed.unreadCount\" />\n            </span>\n            {{ t('notifications.title') }}\n          </span>\n          <div class=\"fx-nall__tools\">\n            <button\n              type=\"button\"\n              class=\"fx-nall__tool\"\n              :class=\"{ 'is-on': feed.mineUnreadOnly }\"\n              :aria-pressed=\"feed.mineUnreadOnly\"\n              data-testid=\"notifications-screen-unread\"\n              @click=\"toggleUnread\"\n            >\n              {{ t('notifications.unreadOnly') }}\n            </button>\n            <button\n              v-if=\"feed.hasUnread\"\n              type=\"button\"\n              class=\"fx-nall__tool\"\n              data-testid=\"notifications-screen-mark-all\"\n              @click=\"feed.markAllRead()\"\n            >\n              {{ t('notifications.markAllRead') }}\n            </button>\n            <button\n              type=\"button\"\n              class=\"fx-nall__close\"\n              :aria-label=\"t('modal.close')\"\n              data-testid=\"notifications-screen-close\"\n              @click=\"feed.closePanel()\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n              <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n            </button>\n          </div>\n        </header>\n\n        <p\n          v-if=\"feed.mineError\"\n          class=\"fx-nall__error\"\n          data-testid=\"notifications-screen-error\"\n        >\n          {{ feed.mineError }}\n        </p>\n\n        <ul\n          class=\"fx-nall__list\"\n          data-testid=\"notifications-screen-list\"\n        >\n          <li\n            v-if=\"!feed.mine.length && !feed.mineLoading\"\n            class=\"fx-nall__empty\"\n          >\n            {{ t('notifications.empty') }}\n          </li>\n          <li\n            v-for=\"n in feed.mine\"\n            :key=\"n.id\"\n            class=\"fx-nall__item\"\n          >\n            <NotificationRow\n              :item=\"n\"\n              :locale=\"locale\"\n              @open=\"open\"\n            />\n            <button\n              v-if=\"!n.read_at\"\n              type=\"button\"\n              class=\"fx-nall__read\"\n              :title=\"t('notifications.markRead')\"\n              :aria-label=\"t('notifications.markRead')\"\n              data-testid=\"notifications-screen-mark-one\"\n              @click=\"markOne(n)\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n              <span aria-hidden=\"true\" v-html=\"actionIconSvg('check')\"></span>\n            </button>\n          </li>\n        </ul>\n\n        <!-- ⚠ Shown whenever there is more than one page, including while a\n             page is loading: a pager that disappears between pages moves the\n             button out from under the cursor that is clicking it. -->\n        <footer\n          v-if=\"pages > 1\"\n          class=\"fx-nall__foot\"\n          data-testid=\"notifications-screen-pager\"\n        >\n          <button\n            type=\"button\"\n            class=\"fx-nall__page\"\n            :disabled=\"page <= 1\"\n            @click=\"go(page - 1)\"\n          >\n            {{ t('common.prev') }}\n          </button>\n          <span class=\"fx-nall__count\">{{ t('notifications.pageOf', { page, pages, total: feed.mineTotal }) }}</span>\n          <button\n            type=\"button\"\n            class=\"fx-nall__page\"\n            :disabled=\"page >= pages\"\n            @click=\"go(page + 1)\"\n          >\n            {{ t('common.next') }}\n          </button>\n        </footer>\n      </section>\n    </div>\n  </Teleport>\n</template>\n\n<style>\n/* ⚠ NOT scoped: the sheet is teleported to <body>, outside this component's\n   subtree. Every class is `fx-nall`-prefixed.\n   ⚠ Declared `--fe-*` tokens only — it opens over the explorer, under\n   whatever palette the viewer chose, and a Tailwind colour here would be the\n   one surface that ignores their theme. */\n.fx-nall {\n  position: fixed;\n  /* Short of the host's own strip (the desktop app's title bar) — core\n     base.css `.fe-modal__backdrop` says why. */\n  inset: var(--fe-overlay-top, 0px) 0 0;\n  /* Above the bell's own teleported popover (140) — it is opened FROM it. */\n  z-index: 150;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 24px 16px;\n  font-family: var(--fe-font);\n  font-size: var(--fe-text-md);\n}\n.fx-nall__scrim {\n  position: absolute;\n  inset: 0;\n  background: rgb(0 0 0 / 45%);\n}\n.fx-nall__sheet {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  width: min(720px, 100%);\n  max-height: min(80vh, 720px);\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius-md);\n  background: var(--fe-bg);\n  color: var(--fe-text);\n  box-shadow: var(--fe-shadow-sm);\n  overflow: hidden;\n}\n.fx-nall__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--fe-gap-sm);\n  padding: 12px 16px;\n  border-bottom: 1px solid var(--fe-border-soft);\n}\n.fx-nall__title {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--fe-gap-sm);\n  font-weight: 600;\n}\n/* The icon is the badge's positioning context — the badge is absolute. */\n.fx-nall__title-icon {\n  position: relative;\n  display: inline-flex;\n  color: var(--fe-text-muted);\n}\n.fx-nall__title-icon svg {\n  width: 18px;\n  height: 18px;\n  display: block;\n  color: inherit;\n}\n.fx-nall__tools {\n  display: inline-flex;\n  align-items: center;\n  gap: 4px;\n}\n/* ⚠ `height: auto` on every button here, for the reason the row gives\n   (NotificationRow.vue): a host's own button rules reach this sheet. */\n.fx-nall__tool {\n  height: auto;\n  padding: 4px 8px;\n  border: 1px solid transparent;\n  border-radius: var(--fe-radius-sm);\n  background: transparent;\n  color: var(--fe-text-muted);\n  font: inherit;\n  font-size: var(--fe-text-xs);\n  cursor: pointer;\n}\n.fx-nall__tool:hover {\n  background: var(--fe-bg-hover);\n  color: var(--fe-text);\n}\n.fx-nall__tool.is-on {\n  border-color: var(--fe-border-strong);\n  background: var(--fe-bg-hover);\n  color: var(--fe-text);\n}\n.fx-nall__close {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--fe-h-md);\n  height: var(--fe-h-md);\n  border: 0;\n  border-radius: var(--fe-radius-sm);\n  background: transparent;\n  color: var(--fe-text-muted);\n  cursor: pointer;\n}\n.fx-nall__close:hover {\n  background: var(--fe-bg-hover);\n  color: var(--fe-text);\n}\n.fx-nall__close svg {\n  width: 16px;\n  height: 16px;\n  display: block;\n}\n.fx-nall__error {\n  margin: 0;\n  padding: 8px 16px;\n  color: var(--fe-danger);\n  font-size: var(--fe-text-sm);\n}\n.fx-nall__list {\n  margin: 0;\n  padding: 6px;\n  list-style: none;\n  overflow-y: auto;\n  overscroll-behavior: contain;\n  flex: 1 1 auto;\n}\n.fx-nall__item {\n  display: flex;\n  align-items: flex-start;\n  gap: 4px;\n}\n.fx-nall__item > .fx-nrow {\n  flex: 1 1 auto;\n  min-width: 0;\n}\n.fx-nall__read {\n  flex: 0 0 auto;\n  margin-top: 8px;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: 28px;\n  height: 28px;\n  border: 0;\n  border-radius: var(--fe-radius-sm);\n  background: transparent;\n  color: var(--fe-text-muted);\n  cursor: pointer;\n}\n.fx-nall__read:hover {\n  background: var(--fe-bg-hover);\n  color: var(--fe-text);\n}\n.fx-nall__read svg {\n  width: 14px;\n  height: 14px;\n  display: block;\n}\n.fx-nall__empty {\n  padding: 32px 16px;\n  text-align: center;\n  color: var(--fe-text-muted);\n}\n.fx-nall__foot {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--fe-gap-sm);\n  padding: 8px 16px;\n  border-top: 1px solid var(--fe-border-soft);\n  font-size: var(--fe-text-xs);\n}\n.fx-nall__page {\n  height: auto;\n  padding: 4px 10px;\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius-sm);\n  background: transparent;\n  color: var(--fe-text);\n  font: inherit;\n  cursor: pointer;\n}\n.fx-nall__page:disabled {\n  opacity: 0.5;\n  cursor: default;\n}\n.fx-nall__count {\n  color: var(--fe-text-muted);\n}\n/* At phone width the sheet is the screen: a centred card with 24px of scrim\n   around it wastes the only axis a 390px viewport has. */\n@media (max-width: 560px) {\n  .fx-nall {\n    padding: 0;\n  }\n  .fx-nall__sheet {\n    width: 100%;\n    max-height: 100%;\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n}\n</style>\n","/**\n * productVersion — the one line that says which filex this is: `filex 0.43.0`.\n *\n * The maintainer, 2026-09-24: the version should be somewhere a PERSON can find it —\n * the account menu, or user settings. It was only on the sign-in page (twice,\n * each written out by hand) and on the administrators' About page, so anybody\n * who is not an administrator and is already signed in had no way to say\n * which version they were looking at.\n *\n * ⚠⚠ NO CATALOGUE KEY, on purpose. A product name and a version number need\n * no translation, and a new key would drop every language pack below 100%\n * and put \"99% translated\" into the README's picture of the Apps list\n * (lesson #417). `filex` is the SOFTWARE's name, not the operator's brand:\n * the line answers \"which filex is this\", which a renamed instance is too.\n *\n * ⚠ The SERVER's own release (`GET /api/files/capabilities` → `release`, the\n * release alone; 0.54, #211 audit A11 - the commit and the build time are\n * `commit` and `built` beside it, and nothing parses the one-line `version`\n * any more): a development build says `0.1.0-dev`, and that is the honest\n * answer. A server older than 0.54 sends no `release`, and the line is not\n * drawn: unknown is said by saying nothing. The\n * one value it will not print is the client's own placeholder, `0.0.0` —\n * the capabilities store holds it until the real\n * answer lands, and a menu opened in that moment would otherwise announce a\n * version that has never existed. Unknown is said by saying nothing.\n */\n\n/** The software's name, as every version line spells it. */\nexport const PRODUCT_NAME = 'filex';\n\n/** The client's \"not known yet\" — never a real server's answer. */\nconst PLACEHOLDER = '0.0.0';\n\n/** A commit hash as git shows it short: seven characters. */\nexport function shortCommit(commit: string): string {\n  return /^[0-9a-f]{8,}$/i.test(commit) ? commit.slice(0, 7) : commit;\n}\n\n/** `filex 0.43.0` from the server's `release`, or '' while it is not known. */\nexport function productVersionLine(release: string | null | undefined): string {\n  const r = String(release ?? '').trim();\n  if (!r || r === PLACEHOLDER) return '';\n  return `${PRODUCT_NAME} ${r}`;\n}\n","<script setup lang=\"ts\">\n/**\n * ProductVersion — `filex 0.43.0`, as a quiet line (lib/productVersion).\n *\n * The one piece every place that shows the version draws: the admin panel's\n * account menu, the explorer's avatar menu, the user settings dialog. Written\n * once here so the desktop shell (which draws the web app) and an embedding\n * host (which draws its own chrome and can mount this) print the same line.\n *\n * ⚠ `<bdi>`: a Latin name and a dotted number inside a right-to-left menu\n * must keep their own order, and the line still starts on the menu's start\n * side. `dir=\"ltr\"` on the element would flip its alignment as well.\n *\n * ⚠ Its rules are `.fe-version` in styles/base.css, not a `<style>` block\n * here: a component's own styles reach only a bundle that imports it, and\n * the two shipped stylesheets drift (lesson #416).\n */\nimport { computed } from 'vue';\nimport { productVersionLine } from '../lib/productVersion';\n\nconst props = defineProps<{\n  /** The server's release (`capabilities.release`, `v0.54.0`). Unknown →\n   *  nothing drawn. */\n  version?: string | null;\n}>();\n\nconst line = computed(() => productVersionLine(props.version));\n</script>\n\n<template>\n  <p v-if=\"line\" class=\"fe-version\" data-testid=\"product-version\"><bdi>{{ line }}</bdi></p>\n</template>\n","<script setup lang=\"ts\">\n/**\n * AccountMenu — one avatar, one menu, for this account.\n *\n * Owner's decision, 2026-09-13, verbatim: *\"Tek avatar, menü açılsın.\"* The\n * explorer's header used to end in three separate icon buttons — admin panel,\n * user settings, sign out. Three glyphs for one subject is three chances to\n * misread the row; the reference shell draws one round avatar with a chevron\n * and puts the verbs inside it. The admin entry is still the one extra thing an\n * administrator gets, as a menu row rather than a fourth icon.\n *\n * ⚠ Rows come from the HOST. This component knows who is signed in — that is\n * what an avatar is — and nothing about routes, modals or sessions. The web\n * page owns those (and a second copy of this control in its no-storages empty\n * state, so one list of rows feeds both); in the desktop app the explorer draws\n * this control itself from `config.account` and the rows come from the app.\n * Moved here from web/src/components on 2026-09-27 for exactly that reason:\n * the desktop's header had no account menu at all, and a second one written\n * for it would have been a second menu to keep in step.\n *\n * ⚠⚠ The panel is TELEPORTED, and that is not a style choice: `.fe` (the\n * explorer's root) carries `overflow: hidden`, so a menu positioned inside the\n * header is clipped at the header's own edge. Measured — without the teleport\n * the rows below the first are simply not on screen. Position is taken from the\n * button's rectangle when it is pressed, anchored to its RIGHT edge, because\n * this control sits at the end of the row and a left-edge anchor hangs it off\n * the viewport.\n *\n * ⚠ Headless UI's `Menu`, the same primitive the admin panel's account menu\n * uses: roving focus, Esc, click-outside and the `open` state all come from it,\n * and `open` is a state we can actually observe — the thing a menu button must\n * not lie about in `aria-expanded`.\n */\nimport { computed, ref } from 'vue';\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/vue';\n\nimport { localeTag } from '../composables/useLocale';\n/* gorunum:v4-hostmenu — the explorer's OWN action glyphs, not a second set.\n * Owner's decision, 2026-09-13, verbatim: *\"Bizim profil altındaki itemlere\n * ikon koymamız şart.\"* The rows in this menu include the explorer's settings\n * rows, which are drawn four pixels from the explorer's own toolbar — so they\n * are drawn from the explorer's own vocabulary (stroked, 24×24,\n * `currentColor`), and never from an emoji or a second icon library. */\nimport { actionIconSvg } from '../lib/actionIcons';\nimport { anchorUnderEndEdge, fixedViewport, refElement } from '../lib/anchoredPanel';\nimport type { AccountAction, AccountPerson } from '../lib/accountMenu';\nimport { dirOfElement } from '../lib/direction';\nimport { personName } from '../lib/personName';\nimport { productVersionLine } from '../lib/productVersion';\nimport ProductVersion from './ProductVersion.vue';\n\nconst props = defineProps<{\n  /** The rows, in order. */\n  actions: AccountAction[];\n  /** Who is signed in — a name, an address and a picture, any of them absent. */\n  user?: AccountPerson | null;\n  /** Which filex this is — the server's own answer (capabilities). */\n  version?: string | null;\n  /** The active language — any offered one, a language pack's included. */\n  locale: string;\n  /** Accessible name when this account has neither a name nor an address. */\n  fallbackLabel: string;\n}>();\n\nconst emit = defineEmits<{ (e: 'select', key: string): void }>();\n\n/** The account as every screen names a person (core personName). */\nconst displayName = computed(() => personName(props.user ?? null));\n\nconst avatarUrl = computed(() => (props.user?.avatar_url || '').trim());\n\n/**\n * The letter in the circle.\n *\n * ⚠⚠ The empty case is not rare and has to be measured: an account an operator\n * created with only a login, or a session whose `/api/auth/me` has not landed\n * yet, has no display name AND no address. A blank circle in the corner of\n * every screen is worse than the three icons it replaced, so '' here means the\n * template draws a person glyph — never nothing.\n *\n * ⚠ `[...s][0]`, not `s[0]`: a name beginning with an emoji or any astral\n * character is a surrogate PAIR, and one code unit of it prints as �.\n *\n * ⚠ `toLocaleUpperCase` with the real locale: in Turkish the capital of `i` is\n * `İ`, and `toUpperCase()` would put an `I` on İsmail's avatar — the exact\n * class of mistake this project's Turkish-character rule exists to stop.\n */\nconst initial = computed(() => {\n  const s = displayName.value;\n  if (!s) return '';\n  return [...s][0].toLocaleUpperCase(localeTag(props.locale));\n});\n\nconst label = computed(() => displayName.value || props.fallbackLabel);\n\n/* ── where the teleported panel goes ─────────────────────────────────── */\nconst btnEl = ref<InstanceType<typeof MenuButton> | null>(null);\nconst pos = ref<{ top: string; right?: string; left?: string }>({ top: '0px', right: '0px' });\n\n/**\n * Recorded from the button, not from the panel: the panel does not exist until\n * it opens. Bound to BOTH click and keydown because Headless UI opens on\n * ArrowDown/Enter without a click, and a stale rectangle would put the menu\n * wherever the button used to be. Neither handler intercepts the event.\n */\nfunction syncPos() {\n  const el = refElement(btnEl.value);\n  const r = el?.getBoundingClientRect();\n  if (!r) return;\n  // ⚠ RTL: flush with the avatar's END edge — its left one in RTL.\n  const { top, right, left } = anchorUnderEndEdge(\n    r,\n    fixedViewport(),\n    { dir: dirOfElement(el) },\n  );\n  pos.value = { top, right, left };\n}\n</script>\n\n<template>\n  <Menu v-slot=\"{ open }\" as=\"div\" class=\"fx-account\">\n    <MenuButton\n      ref=\"btnEl\"\n      class=\"fx-account__btn\"\n      :class=\"{ 'is-open': open }\"\n      :title=\"label\"\n      :aria-label=\"label\"\n      data-testid=\"explore-account\"\n      @click=\"syncPos\"\n      @keydown=\"syncPos\"\n    >\n      <span class=\"fx-account__face\" aria-hidden=\"true\">\n        <img v-if=\"avatarUrl\" class=\"fx-account__img\" :src=\"avatarUrl\" alt=\"\" />\n        <span v-else-if=\"initial\" class=\"fx-account__initial\">{{ initial }}</span>\n        <!-- Neither a picture nor a letter: a person, never an empty circle. -->\n        <svg\n          v-else\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"1.8\"\n          stroke-linecap=\"round\"\n          focusable=\"false\"\n        >\n          <circle cx=\"12\" cy=\"8.5\" r=\"3.5\" />\n          <path d=\"M5.5 19.5a6.5 6.5 0 0 1 13 0\" />\n        </svg>\n      </span>\n      <svg\n        class=\"fx-account__chev\"\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        stroke-width=\"2\"\n        stroke-linecap=\"round\"\n        stroke-linejoin=\"round\"\n        aria-hidden=\"true\"\n        focusable=\"false\"\n      >\n        <path d=\"M7 10l5 5 5-5\" />\n      </svg>\n    </MenuButton>\n\n    <Teleport to=\"body\">\n      <transition\n        enter-active-class=\"fx-acct-in\"\n        leave-active-class=\"fx-acct-out\"\n      >\n        <MenuItems\n          class=\"fx-acctmenu\"\n          :style=\"{ top: pos.top, right: pos.right, left: pos.left }\"\n          data-testid=\"explore-account-menu\"\n        >\n          <!-- The signed-in identity, as a heading rather than a row: it is\n               what the avatar stands for, and a menu whose first line is not\n               clickable is how you say \"this is who you are\" without offering\n               an action that does not exist. -->\n          <p class=\"fx-acctmenu__who\">{{ label }}</p>\n          <MenuItem v-for=\"a in actions\" :key=\"a.key\" v-slot=\"{ active }\">\n            <button\n              type=\"button\"\n              class=\"fx-acctmenu__item\"\n              :class=\"{ 'is-active': active, 'is-separated': a.separated }\"\n              :data-testid=\"`explore-${a.key}`\"\n              @click=\"emit('select', a.key)\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from\n                   lib/actionIcons, never user input -->\n              <span\n                class=\"fx-acctmenu__icon\"\n                aria-hidden=\"true\"\n                v-html=\"actionIconSvg(a.icon || a.key)\"\n              ></span>\n              <span class=\"fx-acctmenu__label\">{{ a.label }}</span>\n            </button>\n          </MenuItem>\n          <!-- Which filex this is, at the foot: a line, not a row — the same\n               piece the admin panel's account menu and user settings draw\n               (the maintainer, 2026-09-24: somewhere a person can find it). -->\n          <ProductVersion\n            v-if=\"productVersionLine(version)\"\n            :version=\"version\"\n            class=\"fx-acctmenu__version\"\n          />\n        </MenuItems>\n      </transition>\n    </Teleport>\n  </Menu>\n</template>\n\n<style>\n/* ⚠ NOT scoped — no scoped style block anywhere in this package: the\n   web-component build compiles the markup from source and takes its CSS from\n   the prebuilt bundle, so the two `data-v-…` hashes never meet and every\n   scoped rule is dead in every embed (web/tests/api/scopedStyles.test.ts).\n   Every class is `fx-account`-prefixed instead.\n   ⚠ Declared `--fe-*` tokens only — no Tailwind `brand-*`. This control sits\n   inside the explorer's header and has to answer to the same palette as\n   everything beside it (including the theme gallery and a host override); and\n   Vite reads tailwind.config.js once at startup, so a `brand-*` colour measured\n   on a long-running dev server can be a stale lie. */\n.fx-account {\n  display: inline-flex;\n  position: relative;\n}\n.fx-account__btn {\n  display: inline-flex;\n  align-items: center;\n  gap: 2px;\n  height: var(--fe-h-md);\n  padding-block: 0; padding-inline: 2px 4px;\n  border: 1px solid transparent;\n  border-radius: 999px;\n  background: transparent;\n  color: var(--fe-text-muted);\n  cursor: pointer;\n}\n.fx-account__btn:hover,\n.fx-account__btn.is-open {\n  background: var(--fe-bg-hover);\n  color: var(--fe-text);\n}\n.fx-account__btn:focus-visible {\n  outline: 2px solid var(--fe-primary);\n  outline-offset: 1px;\n}\n\n/* The circle: a tinted ground with the initial in the primary colour — the\n   shape every product draws for an account, in two theme-aware tokens. */\n.fx-account__face {\n  flex: 0 0 auto;\n  width: 26px;\n  height: 26px;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 50%;\n  overflow: hidden;\n  background: var(--fe-primary-soft);\n  color: var(--fe-primary);\n}\n.fx-account__img {\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n}\n.fx-account__initial {\n  font-size: var(--fe-text-sm);\n  font-weight: 600;\n  line-height: 1;\n}\n.fx-account__face svg {\n  width: 16px;\n  height: 16px;\n}\n.fx-account__chev {\n  width: 14px;\n  height: 14px;\n  opacity: 0.7;\n}\n</style>\n\n<style>\n/* ⚠ NOT scoped. The panel is teleported to <body>, which puts it outside this\n   component's DOM subtree — a scoped rule's `[data-v-…]` attribute is stamped\n   on the elements, but the whole block is easier to read as what it is: the\n   product's menu, drawn in the product's tokens, living under <body>. */\n.fx-acctmenu {\n  position: fixed;\n  /* Above the explorer's own overlays. Its context menus sit at 90 and its\n     tour card at 96 (both appended to <body>, both fixed), and an account menu\n     that opened underneath one of them would look like it had not opened. */\n  z-index: 140;\n  min-width: 210px;\n  max-width: 280px;\n  /* ⚠ The list is no longer three rows. Since gorunum:v4-hostmenu it also\n     carries whatever the explorer's \"⋯\" was carrying, which at 390px with a\n     selection standing is a dozen rows — and this panel is `position: fixed`\n     under <body>, so nothing else would ever clip it: it would simply run off\n     the bottom of the phone with the last rows unreachable. The cap is the\n     viewport minus the header it hangs from. */\n  max-height: calc(100vh - 76px);\n  overflow-y: auto;\n  overscroll-behavior: contain;\n  padding: 4px;\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius-md);\n  background: var(--fe-bg);\n  color: var(--fe-text);\n  box-shadow: var(--fe-shadow-sm);\n  font-family: var(--fe-font);\n  font-size: var(--fe-text-md);\n  outline: none;\n}\n/* The version line at the foot: the heading's own padding, mirrored, with a\n   hairline above it so it reads as the end of the menu, not as a row. */\n.fx-acctmenu__version {\n  margin-block-start: 4px;\n  padding: 8px 10px 6px;\n  border-block-start: 1px solid var(--fe-border);\n}\n.fx-acctmenu__who {\n  margin: 0;\n  padding: 6px 10px 8px;\n  font-size: var(--fe-text-xs);\n  color: var(--fe-text-muted);\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n/* ⚠ `height: auto`: the menu is teleported out of `.fe`, and a host's button\n   rules reach it (NotificationRow.vue says how). */\n.fx-acctmenu__item {\n  height: auto;\n  display: flex;\n  align-items: center;\n  gap: var(--fe-gap-sm);\n  width: 100%;\n  padding: 7px 10px;\n  border: 0;\n  border-radius: var(--fe-radius-sm);\n  background: transparent;\n  color: var(--fe-text);\n  font: inherit;\n  text-align: start;\n  cursor: pointer;\n}\n/* ⚠ A fixed box, drawn or not. The glyph column has to be a column: a row\n   whose key nothing is drawn for would otherwise slide its label 24px left and\n   the menu would read as two lists. `--fe-text-muted` so the labels stay the\n   loudest thing in the row — an icon is a landmark, not the message. */\n.fx-acctmenu__icon {\n  flex: 0 0 auto;\n  width: 16px;\n  height: 16px;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  color: var(--fe-text-muted);\n}\n/* ⚠ No deep-selector wrapper — this block is deliberately NOT scoped (the panel is\n   teleported to <body>), so a plain descendant selector is the right one; a\n   scoped-only wrapper here would be a selector the browser drops. */\n.fx-acctmenu__icon svg {\n  width: 16px;\n  height: 16px;\n  display: block;\n}\n.fx-acctmenu__item.is-active .fx-acctmenu__icon {\n  color: var(--fe-text);\n}\n.fx-acctmenu__label {\n  flex: 1 1 auto;\n  min-width: 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.fx-acctmenu__item.is-active {\n  background: var(--fe-bg-hover);\n}\n.fx-acctmenu__item.is-separated {\n  margin-top: 4px;\n  border-top: 1px solid var(--fe-border-soft);\n  border-start-start-radius: 0;\n  border-start-end-radius: 0;\n  padding-top: 11px;\n}\n.fx-acct-in {\n  transition: opacity 0.09s ease;\n}\n.fx-acct-out {\n  transition: opacity 0.07s ease;\n  opacity: 0;\n}\n</style>\n","/**\n * The user settings dialog's contract with whoever opens it.\n *\n * ⚠⚠ ONE dialog (components/UserSettingsDialog.vue) for every surface. It lived\n * in web/src until 2026-09-27, bound to the admin app's pinia stores, its axios\n * client and vue-i18n; the desktop app opened it in the browser because nothing\n * else could draw it (owner, the same day: *\"Kullanıcı ayarları uygulamanın\n * İÇİNDE açılsın\"*). It moved into this package, and what it needs from a host\n * is written down here instead of being imported from one.\n *\n * Two kinds of thing a host hands over:\n *\n *   1. What the dialog cannot know by itself — who is signed in, what the\n *      server can do, how to reach the account's endpoints, how to say \"saved\".\n *      Every host gives these.\n *   2. Rows that only make sense on SOME surfaces: the admin app's language\n *      switch and start page, the \"open files with one click\" preference, the\n *      desktop-app downloads, the browser-notification switch. A host that\n *      leaves one out gets no row for it — which is how the desktop app avoids\n *      drawing a second door to what its own Settings already carries\n *      (language, single/double click) or to what does not exist there (a\n *      start page, a download of itself, the browser's notification API).\n *\n * Pure types plus one transport; no Vue.\n */\nimport type { EventOff } from './serverRules';\nimport type { ExternalServiceStatus } from '../types/FileNode';\nimport type { PluginActionsResponse } from '../types/Plugins';\nimport type { WebPushController } from './webPush';\nimport type { AccountCheckAnswer, AccountCheckQuery } from './accountRules';\n\n/** The signed-in person, as the dialog reads and writes it. */\nexport interface SettingsUser {\n  id?: number;\n  email?: string | null;\n  username?: string | null;\n  display_name?: string | null;\n  avatar_url?: string | null;\n  totp_enabled?: boolean;\n  role?: string | null;\n  locale?: string | null;\n  timezone?: string | null;\n}\n\n/** `GET /api/files/quota/me`. */\nexport interface SettingsQuota {\n  used_bytes: number;\n  quota_bytes: number;\n  percent_used: number;\n  unlimited: boolean;\n}\n\n/** `GET/PATCH /api/notifications/settings` — the person's own switches. */\nexport interface SettingsNotificationPrefs {\n  in_app_enabled: boolean;\n  muted_events: string[];\n  /**\n   * The digest's urgent choices: kind -> told at once? A kind it does not name\n   * follows the administrator's default (`digest.default_urgent`). ⚠ Sent only\n   * when an urgent switch changes: a save without it keeps what is stored, and\n   * a save WITH it first tells what is held under the old choice (backend\n   * handlers/notifications.go UpdateSettings).\n   */\n  urgent_overrides?: Record<string, boolean>;\n  /** What the server says of the digest - read only; null when it is off. */\n  digest?: SettingsNotificationDigest | null;\n}\n\n/** The notification digest as the settings pane draws it (backend notify\n *  digest.go PersonDigestView). */\nexport interface SettingsNotificationDigest {\n  /** How long the kinds that are not urgent are held, in minutes. */\n  window_minutes: number;\n  /** The kinds told at once: the person's choices over the defaults. */\n  urgent_events: string[];\n  /** The administrator's urgent list. */\n  default_urgent: string[];\n  /** Every kind a choice can be made about. */\n  events: string[];\n  /** The administrator alerts among them - one switch in the pane. */\n  admin_events: string[];\n}\n\n/** What the server says it can do — the fields the dialog reads. */\nexport interface SettingsCapabilities {\n  version?: string;\n  /** The release alone (`v0.54.0`), for the version line (#211). */\n  release?: string;\n  /** The notification events that cannot happen here, by event: why, whether\n   *  this caller could change it, and the server's sentence (#211, audit B16). */\n  event_off?: Record<string, EventOff>;\n  caller_admin?: boolean;\n  demo_mode?: boolean;\n  /** 0.51 - the document server (Default apps: whether a choice of ONLYOFFICE\n   *  for a .csv is available, lib/serviceGate onlyOfficeUsable). */\n  onlyoffice_url?: string | null;\n  external?: { onlyoffice?: ExternalServiceStatus };\n  /** wiring:e2 vault - the server has the vault API (the idle-time row). */\n  e2e_vault?: boolean;\n}\n\n/** The account's own endpoints — every one of them open to every signed-in\n *  account (backend routes.go, \"authenticated user routes\"). */\nexport interface UserSettingsApi {\n  updateProfile(patch: Partial<SettingsUser>): Promise<SettingsUser>;\n  /** `POST /api/auth/account/check`: whether an address / a username would\n   *  be accepted, in the server's words (lib/accountRules). Optional: a host\n   *  without it checks on Save only. */\n  checkAccount?(q: AccountCheckQuery): Promise<AccountCheckAnswer>;\n  changePassword(current: string, next: string): Promise<void>;\n  enrollTotp(): Promise<{ secret: string; qr_svg: string; recovery_codes?: string[] }>;\n  verifyTotp(code: string): Promise<void>;\n  disableTotp(code: string): Promise<void>;\n  quota(): Promise<SettingsQuota>;\n  notificationSettings(): Promise<SettingsNotificationPrefs | null>;\n  updateNotificationSettings(prefs: SettingsNotificationPrefs): Promise<SettingsNotificationPrefs | null>;\n  /**\n   * 0.50 - `GET /api/files/plugins/actions`: the app interfaces that open\n   * files and the administrator's open rules, so Default apps can say which\n   * of the person's choices are still available. Absent: the pane lists the\n   * choices without judging them.\n   */\n  pluginActions?(): Promise<PluginActionsResponse>;\n  /**\n   * wiring:e2 vault - `GET / PUT /api/files/e2e/vault/prefs`: how long a\n   * vault this person writes to stays theirs while they do nothing, in\n   * minutes (1-10, 3 until set). Kept on the server for the person, not per\n   * browser. Absent: the row is not drawn.\n   */\n  vaultIdle?(): Promise<number>;\n  setVaultIdle?(minutes: number): Promise<number>;\n}\n\nexport type SettingsThemeMode = 'light' | 'auto' | 'dark';\nexport type BrowserNotifyPermission = 'granted' | 'denied' | 'default' | 'unsupported';\n\nexport interface UserSettingsHost {\n  /** The language on screen — any offered code, a language pack's included. */\n  readonly locale: string;\n  readonly user: SettingsUser | null;\n  /** The account's role is administrator — of its tenant, of the supertenant or\n   *  of a single-tenant install. ⚠ Not `capabilities.caller_admin`, which is\n   *  the narrower \"may set the INSTANCE up\" (the supertenant's alone on a\n   *  multi-tenant install). It draws the account's badge, and decides who is\n   *  offered the switch for a new encryption request (lib/webhookEvents). */\n  readonly isAdmin: boolean;\n  /** The demo account: nothing it changes may be saved. */\n  readonly demoReadOnly: boolean;\n  readonly capabilities: SettingsCapabilities | null;\n  readonly api: UserSettingsApi;\n  /** The server's answer after a profile write replaces the person. */\n  setUser(user: SettingsUser): void;\n  toast(kind: 'success' | 'error' | 'warn', message: string): void;\n  /** A failed request, said for a person. */\n  errorText(err: unknown, fallback: string): string;\n  /** This person's time zone on this surface (lib/timezone accountZoneControl). */\n  readonly zone: { get(): string; set(tz: string): void };\n  /** Light / automatic / dark — whichever store this surface paints from. */\n  readonly mode: { get(): SettingsThemeMode; set(mode: SettingsThemeMode): void };\n\n  /* ── rows only some surfaces have (absent → not drawn) ─────────────────── */\n\n  /** The interface language (the admin app). The dialog also writes it to the\n   *  account, so the next device opens in it. */\n  readonly language?: { pick(code: string): void };\n  /** Where the app lands after sign-in (the admin app's router). */\n  readonly startPage?: { readonly options: string[]; get(): string | null; set(page: string): void };\n  /** Whether one click or two opens a file. */\n  readonly openTrigger?: { get(): 'single' | 'double'; set(v: 'single' | 'double'): void };\n  /** Where to download the desktop app for this machine. */\n  readonly desktopApp?: {\n    readonly platform: string | null;\n    readonly platformLabel: string;\n    /** `other`: the same file for the other processor (x64 / arm64), drawn\n     *  beside the row. The host writes every word, this dialog none. */\n    readonly downloads: Array<{\n      href: string;\n      label: string;\n      hint: string;\n      arch?: string;\n      other?: { arch: string; label: string; href: string };\n    }>;\n    readonly releasesUrl: string;\n  };\n  /**\n   * Installing the web app itself on this device - a phone or a tablet in a\n   * browser (task #190). The permanent home of the offer the app's reminder\n   * makes once, as `desktopApp` is the desktop app's.\n   *\n   * `state`: `prompt` - the browser offers an install, `install()` opens its\n   * dialog; `ios` - Safari's Share → Add to Home Screen; `menu` - the\n   * browser's own menu; `null` - nothing to offer (already installed, or a PC,\n   * which is offered the desktop app). Absent or `null` → not drawn.\n   */\n  readonly installApp?: {\n    readonly state: 'prompt' | 'ios' | 'menu' | null;\n    install(): Promise<'accepted' | 'dismissed' | 'unavailable'>;\n  };\n  /** The browser's own notifications (the admin app in a browser tab). */\n  readonly browserNotifications?: {\n    readonly desktopShell: boolean;\n    permission(): BrowserNotifyPermission;\n    enabled(): boolean;\n    setEnabled(on: boolean): void;\n    ask(): Promise<BrowserNotifyPermission>;\n  };\n  /**\n   * Push notifications on this device (#191, lib/webPush): what the bell\n   * tells the person reaches this phone or browser while filex is closed.\n   * Given by a host that runs filex's own service worker (the web app, in a\n   * tab or installed); not by the desktop app, whose native notifications\n   * already reach a closed window, nor by an explorer embedded in another\n   * site, whose workers are that site's.\n   */\n  readonly webPush?: WebPushController;\n}\n\n/**\n * The account endpoints over the explorer's own client (`useFileApi(config)\n * .jsonFetch`): its credential, its language, its credentials mode — for a\n * host that hands the explorer a token rather than a session (the desktop app).\n * `base` is the server root (`connectionsBase(config)`).\n *\n * ⚠ The admin app does NOT use this: it passes its own axios client (the one\n * with its CSRF header and its 401 redirect), so a settings save there fails and\n * recovers exactly like every other request it makes.\n */\nexport function userSettingsApi(\n  jsonFetch: <R>(url: string, init?: RequestInit) => Promise<R>,\n  base: string,\n): UserSettingsApi {\n  const root = base.replace(/\\/+$/, '');\n  const json = (method: string, body?: unknown): RequestInit => ({\n    method,\n    headers: { 'Content-Type': 'application/json' },\n    ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n  });\n  return {\n    updateProfile: (patch) => jsonFetch<SettingsUser>(`${root}/api/auth/profile`, json('PATCH', patch)),\n    checkAccount: (q) => jsonFetch<AccountCheckAnswer>(`${root}/api/auth/account/check`, json('POST', q)),\n    changePassword: async (current, next) => {\n      await jsonFetch(`${root}/api/auth/password`, json('POST', { current_password: current, new_password: next }));\n    },\n    enrollTotp: () => jsonFetch(`${root}/api/auth/totp/enroll`, json('POST')),\n    verifyTotp: async (code) => {\n      await jsonFetch(`${root}/api/auth/totp/verify`, json('POST', { code }));\n    },\n    disableTotp: async (code) => {\n      await jsonFetch(`${root}/api/auth/totp/disable`, json('POST', { code }));\n    },\n    quota: () => jsonFetch<SettingsQuota>(`${root}/api/files/quota/me`),\n    notificationSettings: () => jsonFetch<SettingsNotificationPrefs>(`${root}/api/notifications/settings`),\n    updateNotificationSettings: (prefs) =>\n      jsonFetch<SettingsNotificationPrefs>(`${root}/api/notifications/settings`, json('PATCH', prefs)),\n    pluginActions: () => jsonFetch<PluginActionsResponse>(`${root}/api/files/plugins/actions`),\n    vaultIdle: async () => (await jsonFetch<{ idle_minutes: number }>(`${root}/api/files/e2e/vault/prefs`)).idle_minutes,\n    setVaultIdle: async (minutes) =>\n      (await jsonFetch<{ idle_minutes: number }>(`${root}/api/files/e2e/vault/prefs`, json('PUT', { idle_minutes: minutes }))).idle_minutes,\n  };\n}\n","/**\n * The signed-in person's notifications — the rows the bell lists, the count on\n * it, and the full list \"see all\" opens.\n *\n * ⚠⚠ ONE implementation for every surface that draws the bell. It lived in the\n * web app's pinia store (web/src/stores/notifications.ts) until 2026-09-27,\n * when the desktop app — which mounts `<filex-explorer>` and cannot reach that\n * store — was given the same bell (owner: *\"masaüstünde bildirimler geliyor ama\n * uygulamanın içinde onlara bakılacak bir panel yok\"*). Writing the desktop a\n * second feed would have been a second answer to \"is this row read yet\", so\n * the logic moved here and the web store now COMPOSES it (and keeps only the\n * admin half: the instance-wide audit list and the webhook settings).\n *\n * ⚠ Plain refs and functions, no framework store. The web wraps the result in\n * pinia (which unwraps the refs); the explorer wraps it in `reactive()` (which\n * does the same) — so the components read one shape, `NotificationFeed`, from\n * either host.\n */\nimport { computed, ref, type Ref } from 'vue';\nimport type { NotificationTarget } from '../lib/notificationTarget';\nimport type { NotificationE2E } from '../lib/notificationText';\n\n/** How many of the person's own rows the bell holds. It shows 15; the rest is\n *  headroom for the browser-notification diff, which reads the same list. */\nexport const FEED_LIMIT = 50;\n\n/** The bell's cadence, on every surface that polls (the web's watcher, the\n *  explorer's own loop). Do not lower it: a quiet instance costs one small\n *  request per tick, per open window. */\nexport const NOTIFY_POLL_MS = 15_000;\n\n/**\n * One notification, as far as the bell is concerned. The web's `NotificationItem`\n * carries more (the admin columns); every field here is one it has too.\n */\nexport interface NotificationRowData {\n  id: number;\n  event: string;\n  severity: string;\n  /** The sentence, said by the server in the reader's language (backend\n   *  notify say.go) - shown as it is. */\n  title?: string;\n  body?: string;\n  meta?: unknown;\n  target?: NotificationTarget | null;\n  /** Where an encrypted item's name stands in title/body, for a screen that\n   *  can name it (lib/notificationText). Absent on every other row. */\n  e2e?: NotificationE2E | null;\n  /** Whether a click on the row goes somewhere - the server's verdict\n   *  (backend notify.Opens; lib/notificationTarget rowOpens). */\n  opens?: boolean | null;\n  read_at?: string | null;\n  created_at: string;\n}\n\n/** The four user-scoped endpoints the feed reads (docs/NOTIFICATIONS.md →\n *  \"In-app bell (endpoints)\"). None of them needs administrator rights. */\nexport interface NotificationsTransport<T extends NotificationRowData = NotificationRowData> {\n  list(params: { unread?: boolean; limit?: number; offset?: number }): Promise<{ items?: T[] | null; total?: number }>;\n  unreadCount(): Promise<number>;\n  markRead(id: number): Promise<void>;\n  markAllRead(): Promise<void>;\n}\n\nexport interface NotificationFeedOptions<T extends NotificationRowData> {\n  transport: NotificationsTransport<T>;\n  /** What a failed page load says (the full-list screen prints it). */\n  errorText?: (err: unknown) => string;\n  /**\n   * Other lists on screen that hold the same rows and must stop looking unread\n   * the moment one is read here — the web's admin audit table.\n   */\n  alsoStamp?: () => Ref<T[]>[];\n  /**\n   * Told after a row (or every row) was marked read here — so a badge the host\n   * draws itself (the desktop app's dock and tray) moves at once instead of on\n   * its next poll.\n   */\n  onRead?: () => void;\n}\n\n/**\n * The feed's state and verbs. See the file note for why this is not a store.\n */\nexport function createNotificationFeed<T extends NotificationRowData>(opts: NotificationFeedOptions<T>) {\n  const api = opts.transport;\n  const errorText = opts.errorText ?? ((e: unknown) => (e instanceof Error ? e.message : String(e)));\n  const others = () => opts.alsoStamp?.() ?? [];\n\n  /**\n   * The signed-in person's OWN rows, newest first — what the bell lists and\n   * what the watcher diffs to raise browser notifications.\n   *\n   * ⚠⚠ ONE list, filled from ONE place (`refreshFeed`), for both readers. The\n   * bell used to fetch its rows once — on a vnode hook that fires when the\n   * popover is first rendered, not when it opens — while the watcher polled\n   * the count and fetched its own copy of the unread head. So the badge kept\n   * climbing and the list never moved: measured 2026-09-14, badge 9 over a\n   * list whose newest row predated the arrival, still so after closing and\n   * reopening, and still so with the panel left open while a tenth arrived.\n   */\n  const feed = ref([]) as Ref<T[]>;\n  const feedLoading = ref(false);\n  /**\n   * The person's OWN full list — what \"see all\" opens, paginated.\n   *\n   * ⚠⚠ A separate list, deliberately. `feed` is the bell's newest 50; this is\n   * \"page 4 of MY history\", which is a different question with a different\n   * answer. Writing it into `feed` would make the bell show page 4.\n   *\n   * ⚠ It reads `GET /api/notifications`, which is USER-scoped, and that is the\n   * whole point: \"see all\" used to point at the admin page, so somebody\n   * without admin rights could not read their own notifications at all.\n   */\n  const mine = ref([]) as Ref<T[]>;\n  const mineTotal = ref(0);\n  const mineLimit = ref(25);\n  const mineOffset = ref(0);\n  const mineUnreadOnly = ref(false);\n  const mineLoading = ref(false);\n  const mineError = ref<string | null>(null);\n  /** Only the newest fetch may write — paging fast must not let page 2 land after page 3. */\n  let mineSeq = 0;\n  /**\n   * Is the full-list screen open? Held HERE, not in the bell, because the web\n   * draws the bell in TWO headers (the admin nav and the explorer's own) while\n   * the screen is rendered once. A flag per bell would be two screens.\n   */\n  const panelOpen = ref(false);\n  /**\n   * The unread count the feed was fetched alongside. When the polled count\n   * stops matching it, something arrived (or was read elsewhere) and the list\n   * is behind the badge. `null` = never fetched.\n   */\n  let feedCount: number | null = null;\n  /** Only the newest refresh may write — an open racing a poll must not let the\n   *  slower, older answer land last. */\n  let feedSeq = 0;\n  const unreadCount = ref(0);\n  const hasUnread = computed(() => unreadCount.value > 0);\n\n  /**\n   * Fetch the person's rows AND the unread count together, so the badge and\n   * the list are read from the same moment. Resolves `false` when the fetch\n   * failed (the previous list is kept — a failed request is not \"no rows\").\n   */\n  async function refreshFeed(): Promise<boolean> {\n    const seq = ++feedSeq;\n    feedLoading.value = true;\n    try {\n      const [r, count] = await Promise.all([\n        api.list({ unread: false, limit: FEED_LIMIT, offset: 0 }),\n        api.unreadCount(),\n      ]);\n      if (seq !== feedSeq) return true;\n      feed.value = r.items ?? [];\n      unreadCount.value = count;\n      feedCount = count;\n      return true;\n    } catch {\n      return false;\n    } finally {\n      if (seq === feedSeq) feedLoading.value = false;\n    }\n  }\n\n  async function fetchUnread(): Promise<void> {\n    try {\n      unreadCount.value = await api.unreadCount();\n    } catch {\n      /* swallow — bell badge defaults to 0 */\n    }\n  }\n\n  /**\n   * The poll's one call: read the count, and bring the list up to date when\n   * the count no longer matches the one the list was fetched with. A quiet\n   * instance therefore costs one small request per tick.\n   */\n  async function syncUnread(): Promise<void> {\n    await fetchUnread();\n    if (feedCount !== unreadCount.value) await refreshFeed();\n  }\n\n  /**\n   * A count somebody ELSE already read from the server — the desktop app's main\n   * process polls the bell for its OS notifications and dock badge, and hands\n   * the number over instead of this window asking a second time every 15 s.\n   * Same rule as `syncUnread`: a count that disagrees with the list's means the\n   * list is behind.\n   */\n  async function acceptCount(count: number): Promise<void> {\n    const n = Math.max(0, Math.floor(Number(count) || 0));\n    unreadCount.value = n;\n    if (feedCount !== n) await refreshFeed();\n  }\n\n  /**\n   * One page of the person's OWN history — the full-list screen's only fetch.\n   *\n   * ⚠ A failure keeps the previous page on screen and SAYS so. Emptying the\n   * list on a dropped request would tell somebody with 133 notifications that\n   * they have none, which is the one answer the screen must never invent.\n   */\n  async function fetchMine(): Promise<void> {\n    const seq = ++mineSeq;\n    mineLoading.value = true;\n    mineError.value = null;\n    try {\n      const r = await api.list({\n        unread: mineUnreadOnly.value,\n        limit: mineLimit.value,\n        offset: mineOffset.value,\n      });\n      if (seq !== mineSeq) return;\n      mine.value = r.items ?? [];\n      mineTotal.value = r.total ?? 0;\n    } catch (e: unknown) {\n      if (seq !== mineSeq) return;\n      mineError.value = errorText(e);\n    } finally {\n      if (seq === mineSeq) mineLoading.value = false;\n    }\n  }\n\n  function setMinePage(p: number): void {\n    mineOffset.value = Math.max(0, (p - 1) * mineLimit.value);\n  }\n\n  function setMineUnreadFilter(u: boolean): void {\n    mineUnreadOnly.value = u;\n    mineOffset.value = 0;\n  }\n\n  /** Open the full-list screen and load its first page. */\n  function openPanel(): void {\n    panelOpen.value = true;\n    mineOffset.value = 0;\n    void fetchMine();\n  }\n\n  function closePanel(): void {\n    panelOpen.value = false;\n  }\n\n  /** Every list, and the count the feed agrees with, move together — a local\n   *  read must not look like news to the next poll. */\n  async function markRead(id: number): Promise<void> {\n    await api.markRead(id);\n    const at = new Date().toISOString();\n    const stamp = (n: T): T => (n.id === id && !n.read_at ? { ...n, read_at: at } : n);\n    // ⚠ Every list that can be on screen at once. The full-list screen sits\n    // OVER the explorer whose bell is still drawn behind it, so a row marked\n    // read in one has to stop looking unread in the other — a list left\n    // unstamped is the same row in two states, two inches apart.\n    const lists = [feed, mine, ...others()];\n    const wasUnread = lists.some((l) => l.value.some((n) => n.id === id && !n.read_at));\n    for (const l of lists) l.value = l.value.map(stamp);\n    if (wasUnread && unreadCount.value > 0) {\n      unreadCount.value -= 1;\n      if (feedCount !== null && feedCount > 0) feedCount -= 1;\n    }\n    opts.onRead?.();\n  }\n\n  async function markAllRead(): Promise<void> {\n    await api.markAllRead();\n    const at = new Date().toISOString();\n    const stamp = (n: T): T => ({ ...n, read_at: n.read_at ?? at });\n    for (const l of [feed, mine, ...others()]) l.value = l.value.map(stamp);\n    unreadCount.value = 0;\n    if (feedCount !== null) feedCount = 0;\n    opts.onRead?.();\n    // The unread-only view of a list where nothing is unread any more is an\n    // empty list, and that is the honest answer — but it has to be FETCHED,\n    // not guessed, because page 2 of it no longer exists either.\n    if (panelOpen.value && mineUnreadOnly.value) {\n      mineOffset.value = 0;\n      void fetchMine();\n    }\n  }\n\n  return {\n    feed,\n    feedLoading,\n    unreadCount,\n    hasUnread,\n    mine,\n    mineTotal,\n    mineLimit,\n    mineOffset,\n    mineUnreadOnly,\n    mineLoading,\n    mineError,\n    panelOpen,\n    refreshFeed,\n    fetchUnread,\n    syncUnread,\n    acceptCount,\n    fetchMine,\n    setMinePage,\n    setMineUnreadFilter,\n    openPanel,\n    closePanel,\n    markRead,\n    markAllRead,\n  };\n}\n\n/**\n * The feed as the components read it: refs unwrapped, the way a pinia store\n * and a `reactive()` both hand it over. The bell and the full-list screen take\n * this, never the raw refs, so one component works under either host.\n */\nexport interface NotificationFeed<T extends NotificationRowData = NotificationRowData> {\n  readonly feed: T[];\n  readonly feedLoading: boolean;\n  readonly unreadCount: number;\n  readonly hasUnread: boolean;\n  readonly mine: T[];\n  readonly mineTotal: number;\n  readonly mineLimit: number;\n  readonly mineOffset: number;\n  readonly mineUnreadOnly: boolean;\n  readonly mineLoading: boolean;\n  readonly mineError: string | null;\n  readonly panelOpen: boolean;\n  refreshFeed(): Promise<boolean>;\n  fetchUnread(): Promise<void>;\n  syncUnread(): Promise<void>;\n  acceptCount(count: number): Promise<void>;\n  fetchMine(): Promise<void>;\n  setMinePage(p: number): void;\n  setMineUnreadFilter(u: boolean): void;\n  openPanel(): void;\n  closePanel(): void;\n  markRead(id: number): Promise<void>;\n  markAllRead(): Promise<void>;\n}\n\n/**\n * The four endpoints over the explorer's own client — for a host that hands\n * the explorer a credential rather than a store (the desktop app, an embed).\n *\n * `jsonFetch` is `useFileApi(config).jsonFetch`, so the request carries the\n * explorer's auth, its language and its credentials mode, exactly like every\n * listing it makes. `base` is the server root (`connectionsBase(config)`).\n *\n * ⚠ No language is named: the server says each row in the language of the\n * reader's ACCOUNT (backend notify say.go, PersonLang) - the one setting the\n * bell, the push, the email and the desktop toast all read, whichever surface\n * set it. An embed whose host draws the explorer in another language still\n * gets its notifications in the account's (#191, translated at the last\n * stop: the person's).\n */\nexport function notificationsTransport(\n  jsonFetch: <R>(url: string, init?: RequestInit) => Promise<R>,\n  base: string,\n): NotificationsTransport {\n  const root = `${base.replace(/\\/+$/, '')}/api/notifications`;\n  return {\n    async list(p) {\n      const q: string[] = [];\n      if (p.unread) q.push('unread=true');\n      if (p.limit != null) q.push(`limit=${encodeURIComponent(String(p.limit))}`);\n      if (p.offset != null) q.push(`offset=${encodeURIComponent(String(p.offset))}`);\n      const body = await jsonFetch<{ items?: NotificationRowData[] | null; total?: number }>(\n        q.length ? `${root}?${q.join('&')}` : root,\n      );\n      return body ?? { items: [], total: 0 };\n    },\n    async unreadCount() {\n      const body = await jsonFetch<{ count?: number }>(`${root}/unread-count`);\n      return Math.max(0, Number(body?.count ?? 0) || 0);\n    },\n    async markRead(id) {\n      await jsonFetch(`${root}/${encodeURIComponent(String(id))}/read`, { method: 'POST' });\n    },\n    async markAllRead() {\n      await jsonFetch(`${root}/read-all`, { method: 'POST' });\n    },\n  };\n}\n","/**\n * The account menu's rows — the host's own, the explorer's settings rows, and\n * the exit — put in order by ONE rule, for every host that draws the avatar.\n *\n * ⚠⚠ Why this is a module. The web's explorer page folds the explorer's \"⋯\"\n * into its avatar menu (owner, 2026-09-13: *\"`...` bölgesini admin\n * dropdown'ının içine alacağız\"* — one menu in that corner, not two), and since\n * 2026-09-27 the desktop app's explorer does the same from `config.account`.\n * The order (the host's doors, then the explorer's settings, then Sign out),\n * the `fe:` prefix and the one hairline above each group are the same decision\n * in both places; written twice it would drift the first time either changed.\n *\n * Pure: no Vue, no DOM.\n */\n\n/** One row of the account menu. */\nexport interface AccountAction {\n  key: string;\n  label: string;\n  /** Draw a hairline above this row. */\n  separated?: boolean;\n  /**\n   * An `actionIcons` key. Absent → the row's own `key` is tried, which is why\n   * the explorer's rows (`refresh`, `theme`, `tour`, `shortcut-settings`, …)\n   * need no mapping at all: their key IS the glyph's name. A key nothing is\n   * drawn for renders an empty box of the same width, so a row with no glyph\n   * still lines its label up with the rows that have one.\n   */\n  icon?: string;\n}\n\n/** Who the avatar stands for — the fields `personName` reads, plus a picture. */\nexport interface AccountPerson {\n  name?: string | null;\n  display_name?: string | null;\n  username?: string | null;\n  email?: string | null;\n  /** Profile picture — a small data:image/… URI or a URL. */\n  avatar_url?: string | null;\n  /** `admin` for an administrator — what decides whether a host offers its\n   *  console door. Never a security boundary: the server checks again. */\n  role?: string | null;\n}\n\n/** A row the explorer's toolbar announces for its \"⋯\" (Toolbar `fe:header-menu`). */\nexport interface ExplorerMenuRow {\n  key: string;\n  label: string;\n  divider?: boolean;\n  disabled?: boolean;\n  icon?: string;\n}\n\n/**\n * The \"⋯\" rows whose control the explorer ALSO keeps on screen at every width:\n * the view switcher (list / grid / gallery) and the ⓘ at the end of the\n * breadcrumb row, and the panel toggle at the start of the top bar. An avatar\n * menu that repeated them would be two controls for one job — the owner's rule\n * (*\"aynı işlevi yapan iki buton olmaması lazım\"*), which the web page applied\n * first (Explore.vue ROWS_WITH_ANOTHER_DOOR) and the explorer applies to its own\n * avatar (FileExplorer `config.account`).\n *\n * ⚠ `inspector` only while the ⓘ is drawn — `config.showInfoPanel !== false`.\n */\nexport const EXPLORER_DRAWN_ROWS: readonly string[] = ['view-list', 'view-grid', 'view-gallery', 'inspector', 'nav'];\n\n/**\n * The prefix on an explorer row's key inside the account menu, so an explorer\n * row named `settings` one day cannot silently take over the host's own row.\n */\nexport const EXPLORER_ROW_PREFIX = 'fe:';\n\n/**\n * The menu, in order: `own` (this account's doors — settings, admin), the\n * explorer's settings rows minus the ones the host has another door for\n * (`omit`), then `tail` (Sign out).\n *\n * ⚠ `omit` is a DROP list, not a keep list: a settings row added to the\n * explorer tomorrow has to arrive in the menu by itself, or the menu silently\n * falls behind the product it belongs to.\n *\n * ⚠ The explorer's rows sit BETWEEN the account's doors and the exit: they are\n * neither \"who am I\" nor \"goodbye\", and burying them under Sign out would put\n * the one destructive row in the middle of the list.\n */\nexport function accountMenuRows(\n  own: AccountAction[],\n  explorer: ExplorerMenuRow[],\n  opts: { omit?: Iterable<string>; tail?: AccountAction[] } = {},\n): AccountAction[] {\n  const omit = new Set(opts.omit ?? []);\n  const rows: AccountAction[] = [...own];\n  explorer\n    .filter((r) => !r.divider && !omit.has(r.key))\n    .forEach((r, i) =>\n      rows.push({\n        key: `${EXPLORER_ROW_PREFIX}${r.key}`,\n        label: r.label,\n        icon: r.icon || r.key,\n        separated: i === 0,\n      }),\n    );\n  for (const r of opts.tail ?? []) rows.push({ ...r, separated: r.separated ?? true });\n  return rows;\n}\n\n/**\n * The explorer row a menu key names, or `null` when the key is the host's.\n */\nexport function explorerRowKey(key: string): string | null {\n  return key.startsWith(EXPLORER_ROW_PREFIX) ? key.slice(EXPLORER_ROW_PREFIX.length) : null;\n}\n","/**\n * A dialog or panel the explorer loads when it mounts it, not with itself.\n *\n * ⚠ The web app's main chunk carries the explorer and has to fit workbox's\n * 2 MiB precache limit (web/pwa.config.ts), or the build fails. The surfaces a\n * person opens - the viewer, sharing, settings, the encryption dialogs - are\n * not needed to draw the explorer, so FileExplorer.vue holds them through this\n * instead of an `import`: the component is the same, its code is a chunk of\n * its own, fetched when the explorer first mounts it. Which surfaces, and why\n * the library build needs a rule of its own for them, is\n * packages/core/lazySurfaces.ts; web/tests/quality/lazySurfaces.test.ts holds\n * the explorer to that list.\n *\n * The loader must be written at the call site as a literal\n * `() => import('./x.vue')`: that is what the bundlers split on.\n *\n * `suspensible: false`: a dialog that is still loading never makes a host's\n * `<Suspense>` hold back the whole explorer. Until it has loaded it draws\n * nothing, which for a closed dialog is what it drew anyway.\n */\nimport { defineAsyncComponent, type AsyncComponentLoader, type Component } from 'vue';\n\nexport function lazySurface<T extends Component>(loader: AsyncComponentLoader<T>): T {\n  return defineAsyncComponent<T>({ loader, suspensible: false });\n}\n","<script setup lang=\"ts\">\n/**\n * FileExplorer — the public Vue component, panel + PWA + standalone use.\n *\n * Orchestrates:\n *   - Directory listing (useFileApi)\n *   - Chunked multipart upload (useUploadChunked) + drag & drop\n *   - Selection + keyboard shortcuts\n *   - Context menu (Teleport-based) with per-target actions\n *   - Modal flows: newFolder / rename / delete / share / preview\n *   - Eager Monaco preload so the code-edit path is snappy\n *\n * All backend endpoints arrive via the `config` prop. Auth is bearer\n * (PWA / OIDC) / CSRF (panel) / basic / none — `useFileApi` swallows\n * the difference.\n */\nimport { computed, defineAsyncComponent, nextTick, onBeforeUnmount, onMounted, onScopeDispose, provide, reactive, ref, watch, watchEffect } from 'vue';\nimport type { ExplorerConfig, SearchAccount, ThemeMode } from './types/ExplorerConfig';\nimport type {\n  FileNode,\n  ShareInfo,\n  ViewMode,\n  ClipboardState,\n  Capabilities,\n  ArchiveCreateFormat,\n  E2eAnswer,\n  E2eRequestKind,\n  TrashEntry,\n} from './types/FileNode';\nimport { isExternalUsable } from './types/FileNode';\nimport { useFileApi, type GlobalSearchHit, type ManagerResponse, type PendingOpDto, type QuotaSnapshot, type TrashBatchAnswer, type TrashEmptyPreview } from './composables/useFileApi';\nimport {\n  useUploadChunked,\n  isStagedUnsupported,\n  type UploadJob,\n} from './composables/useUploadChunked';\nimport { useSelection } from './composables/useSelection';\nimport { useKeyboardShortcuts } from './composables/useKeyboardShortcuts';\nimport { EXPLORER_LOCALE, useLocale, localeTag } from './composables/useLocale';\nimport { useSystemDark } from './composables/useSystemDark';\nimport { usePendingOps, type PendingOp } from './composables/usePendingOps';\nimport { usePluginActions } from './composables/usePluginActions'; /* App plugins — docs/APP-PLUGINS-API.md */\nimport { useRealtime } from './composables/useRealtime';\nimport { useThumbs } from './composables/useThumbs';\nimport { preloadEditor } from './composables/useMonacoLoader';\nimport PresenceBar from './components/PresenceBar.vue';\n\nimport Toolbar, { type SelectionMode } from './components/Toolbar.vue';\nimport StarButton from './components/StarButton.vue';\nimport TagPicker from './components/TagPicker.vue';\nimport {\n  activeSortDir,\n  activeSortKey,\n  applySort,\n  defaultSort,\n  defaultSortDir,\n  setSortLocale,\n  type ListingOrder,\n} from './lib/sortOrder'; /* surucu:d1-sort */\nimport {\n  ROOT_FOLDER_KEY,\n  defaultFolderView,\n  folderIsRemembered,\n  folderKey as makeFolderKey,\n  folderPrefs,\n  onViewPrefsApplied,\n  rememberFolder,\n  resolveFolderView,\n  setPersonFolderDefault,\n  touchFolder,\n  viewPrefsReady,\n} from './lib/viewPrefs'; /* tablo:t1 */\nimport { attachViewPrefsHttp } from './lib/viewPrefsHttp';\nimport { underApiBase } from './lib/appBase';\nimport { provideTableEnv } from './lib/tableEnv';\nimport { gateOnService } from './lib/serviceGate';\nimport { isOfficeExt } from './lib/serverRules';\nimport { canShareAny, sharingHeld, type SharingHeld } from './lib/sharingHeld';\nimport { appStoreAsks, appStoreRowShown } from './lib/appStoreRow';\nimport { publicLinksOff } from './lib/e2eLinks';\nimport { opFailure, sayFailure, serverWords } from './lib/errorWords';\nimport { jobOpenOf } from './lib/jobOpen'; /* filex #78 - a finished job's `open` */\nimport { resolveUiProfile } from './lib/uiProfile';\nimport RecentlyOpened from './components/RecentlyOpened.vue';\nimport {\n  EMPTY_FILTERS,\n  applyFilters,\n  filtersActive,\n  nameMatches,\n  type DriveFilters,\n} from './lib/fileFilters' /* surucu:d1 */;\nimport ContextMenu, { type ContextAction } from './components/ContextMenu.vue';\nimport UploadProgress from './components/UploadProgress.vue';\nimport PendingOpsTray from './components/PendingOpsTray.vue';\nimport InspectorPanel from './components/InspectorPanel.vue'; /* koru:k1 */\nimport SideNav, { type NavDest } from './components/SideNav.vue'; /* gezinti:g1 */\nimport HomeView from './components/HomeView.vue'; /* gorunum:v3-shell */\nimport DraftsView from './components/DraftsView.vue'; /* Drafts, issue #71 */\nimport ConnectionsPanel from './components/ConnectionsPanel.vue'; /* gezinti:g1 */\nimport TokensPanel from './components/TokensPanel.vue'; /* gezinti:g1 */\n/* cila:c wiring */\nimport {\n  advFilterParams,\n  advQueryString,\n  advSearchTruncated,\n  type AdvCountResult,\n  type AdvScope,\n  type AdvSearchRequest,\n} from './lib/advSearch' /* gorunum:v1-advsearch */;\nimport ShortcutsHelp from './components/ShortcutsHelp.vue';\n/* /cila:c wiring */\nimport { coverageByStorage, coverageNotice, type CatalogCoverage } from './lib/catalogCoverage';\nimport { listingTickets } from './lib/listingTickets';\nimport { pendingAnswers } from './lib/pendingAnswers'; /* #196 — a row's menu opens on its answers */\nimport { menuAnswerStore, type MenuQuestion } from './lib/menuAnswers'; /* #196 — remembered before the menu opens */\nimport { needsMeasuredDrives, storageLine, type MeasuredDrive } from './lib/storageLine'; /* surucu:d1 — which number the storage line prints */\n/* wiring:c1 — tema galerisi */\nimport ThemeGallery from './components/ThemeGallery.vue';\nimport {\n  useThemeState,\n  useThemeModeState,\n  applyThemeToEl,\n  syncThemeStyle,\n  type ThemeModePref,\n} from './lib/themes';\n/* /wiring:c1 */\n/* zaman:z3 — the embed's own time-zone setting + this instance's tiers */\nimport { useExplorerTimeZone } from './composables/useExplorerTimeZone';\nimport { connectionsBase } from './composables/useConnections';\n/* wiring:c2 — shortcut settings modal + Space quick-look overlay */\n/* /wiring:c2 */\n/* wiring:c3 — unified operations center */\nimport OperationsCenter from './components/OperationsCenter.vue';\nimport { useOperations } from './composables/useOperations';\n/* /wiring:c3 */\n/* wiring:c4 */\nimport { markTourSeen, offerTourOnce } from './lib/tour'; /* the tour is offered to a person once */\nimport { orderStorages, saveStorageOrder, useStorageOrder } from './lib/storageOrder'; /* #57 — the person's storage order */\n/* /wiring:c4 */\n/* wiring:d1 — tabs + per-tab split */\nimport TabBar from './components/TabBar.vue';\nimport FilePane from './components/FilePane.vue';\nimport { useTabs, type TabState } from './composables/useTabs';\n/* /wiring:d1 */\n/* wiring:e2 — end-to-end encrypted folders (docs/E2E-ENCRYPTION.md) */\nimport type { E2eChangePasswordPayload } from './components/E2eChangePasswordModal.vue';\nimport E2eLockScreen from './components/E2eLockScreen.vue';\nimport { E2E_LOCK } from './composables/useE2eLock';\nimport {\n  createKeyRing,\n  createEncryptedFolder,\n  createVault /* wiring:e2 vault */,\n  markerIsVault /* wiring:e2 vault */,\n  upgradeMarkerV1,\n  addEscrowSlot,\n  declineEscrowSlot,\n  escrowOfferState,\n  parseMarker,\n  unlockWithPasswordDetailed,\n  unlockWithRecoveryKey,\n  unlockWithEscrowKey,\n  importEscrowPrivateKey,\n  markerHasRecovery,\n  escrowAvailability,\n  bytesToB64,\n  b64ToBytes,\n  encryptFile,\n  decryptFile,\n  hasMagic,\n  E2E_MARKER_NAME,\n  E2E_MAX_FILE_BYTES,\n  type E2eMarker,\n  parseMarkerDetailed,\n  markerHasNames,\n  unlockNameKey,\n  enableNames,\n  finishNames,\n  encryptionLevel,\n  canRaiseToNames,\n  conversionPending,\n  startConversion,\n  finishConversion,\n  type ChoosableLevel,\n  changePassword,\n  startRekey,\n  finishRekey,\n  rewrapFileKey,\n  rekeyPending,\n  unlockPrevious,\n  decryptFileAny,\n  passwordChangeNeedsRekey,\n  markerHasEscrow,\n  E2eDecryptError,\n  E2eRekeyEscrowError,\n  type E2eCredential,\n} from './lib/e2ecrypto';\nimport {\n  createE2eNameView,\n  storedName,\n  E2E_NAME_VIEW,\n  wireJoinPath,\n  wireParentPath,\n} from './composables/useE2eNames';\nimport { classifyStoredName, namePlainProblem } from './lib/e2enames';\nimport { numberedName, runNamePass, type NamePassProgress } from './lib/e2enamepass';\nimport { runConversion, type ConvertProgress } from './lib/e2econvert';\nimport { registerE2eNameResolver } from './lib/e2eNameRegistry';\n/* wiring:e2 fxe — single encrypted files, and the streamed paths of encrypted\n   folders (composables/useE2eFiles). */\nimport E2eTooBigModal from './components/E2eTooBigModal.vue';\nimport { useE2eFiles, isFxeActionKey, isFxeRow, fxeEncryptTarget } from './composables/useE2eFiles';\n/* wiring:e2 vault — level 3, the vault (docs/E2E-VAULT-FORMAT.md): its tree\n   lives in an encrypted index and exists only in this tab. ⚠ Only the light\n   half here: the vault's code (composables/e2eVaultEngine + lib/e2evault) and\n   its strip are loaded when a vault is opened or made, never with the\n   explorer (web/tests/quality/vaultLazy.test.ts). */\nimport { useE2eVault } from './composables/useE2eVault';\n/* wiring:e2 policy — asking an administrator to allow one encryption */\nimport E2eRequestModal from './components/E2eRequestModal.vue';\nimport { e2eMimeForExt } from './lib/e2emime';\nimport type { UploadSource } from './lib/uploadSource';\nimport { ownedByViewer, ownerNameOf } from './lib/fileFilters';\n/* /wiring:e2 fxe */\n/* /wiring:e2 */\n\n/* ui-fix — listing helpers shared with SecondaryPane (single source: the\n   internal-entry filter + virtual `.trash` row must be identical in both\n   panes or split view shows mismatched rows). */\nimport {\n  filterListing,\n  virtualSegmentLabel,\n  isVirtualViewPath,\n  makeTagSegment,\n  tagOfPath,\n  tagKindOfPath,\n  showHiddenFiles,\n  setShowHiddenFiles,\n  injectTrashRow,\n  hydrateTrashRow as hydrateTrashRowShared,\n} from './lib/listing';\nimport { nodeRowToFileNode as nodeRowToFileNodePure } from './lib/nodeRow'; /* Recent / Starred / tag / Home rows — one shape, with `perm` + `read_only` */\nimport { fallbackRowLevel, withListingLevel } from './lib/rowLevel'; /* #103 - a row keeps the level it was listed with */\nimport { iconFamilyFor, isStorageRow } from './lib/fileIcons'; /* pane:p1 — the storage-row predicate's one home */\nimport { openSurface } from './lib/openSurface';\nimport { actionIconSvg } from './lib/actionIcons'; /* inceleme:r1 — the drop overlay's mark, off the emoji font */\nimport { gatedNeedWords, isPluginActionKey, pluginActionKey, pluginMenuRows } from './lib/pluginMenu'; /* App plugins - the menu block, pure */\nimport { isPagePlacement, pluginPageUrl } from './lib/pluginPage'; /* App plugins — a `page` view opens in a new tab */\nimport { lockOf, lockWords, lockedRefusal } from './lib/appLock'; /* App plugins — an app's hold on a file */\nimport { linkWordsFor } from './lib/symlink'; /* issue #34 — a link the server will not follow */\nimport { isUnavailable, unavailableWordsFor } from './lib/unavailable'; /* issue #104 - an entry the storage could not answer for */\nimport { labelOf as pluginLabelOf } from './lib/pluginLabel';\nimport type { PluginActionRow, PluginSurface, PluginViewRow } from './types/Plugins';\nimport type { NavApp } from './components/SideNav.vue';\nimport { setNodeStarred } from './lib/star';\nimport { emptyTrashAndFollow, TrashEmptyBusy, type TrashEmptyStatus } from './lib/trashEmpty';\nimport { fetchAllTags, fetchTaggedPage, onTagsChanged, type TagItem, type TagKind } from './lib/tags';\nimport { resolveTransfer, type TransferIntent } from './lib/transfer';\nimport { downloadArchive, requestFileLink } from './lib/downloadSelection'; /* tasi:m1, #71 */\nimport { hitItem, hitRelPath, hitStorageName, hitToNode, type HitDriveContext } from './lib/searchHit'; /* #47 */\nimport { labelOfWire } from './lib/destinationTree'; /* tasi:m1 */\nimport {\n  activeNativeDrag,\n  beginNativeDrag,\n  canDownloadUrlDrag,\n  createDragLinks,\n  dragKey,\n  downloadUrlPayload,\n  endNativeDrag,\n  hasInternalDrag,\n  internalDragItems,\n  internalDragOrigin,\n  sayDragProgress,\n  type DragItem,\n} from './lib/dragOut';\n\nimport NewFolderModal from './modals/NewFolderModal.vue';\nimport ArchiveExtractModal from './modals/ArchiveExtractModal.vue';\nimport ArchivePasswordModal from './modals/ArchivePasswordModal.vue';\nimport DraftConflictModal from './modals/DraftConflictModal.vue'; /* Drafts, issue #71 */\nimport { draftFolderLabel, type DraftDto } from './lib/drafts';\nimport { draftKeyOf } from './lib/internalPaths';\nimport { useDraftSave, type SavedDraft } from './composables/useDraftSave';\nimport RenameModal from './modals/RenameModal.vue';\nimport DeleteConfirmModal from './modals/DeleteConfirmModal.vue';\nimport Modal from './modals/Modal.vue'; /* tablo:t1 — the empty-trash confirmation */\nimport { type UndoOutcome } from './lib/undoWords';\nimport { afterActionWords, slotTakenBy, type ToastAfter, type ToastSource } from './lib/toastSlot';\nimport { useDialogRequest, type DialogRequest } from './composables/useDialogRequest';\nimport { createStorageWatch, type StorageWatch, type WatchedStorageRow } from './lib/storageWatch';\nimport PluginViewModal from './components/plugin/PluginViewModal.vue'; /* App plugins */\nimport AppFrameModal from './components/plugin/AppFrameModal.vue'; /* App plugins — an app's own interface */\nimport { appliesItemOf, appliesMatches } from './lib/pluginApplies';\nimport {\n  isOfficeHandler,\n  officeOpensKind,\n  openHandlersFor,\n  openKindOf,\n  pickOpenHandler,\n  ONLYOFFICE_VIEWER,\n  type OpenHandler,\n  type OpenHandlerOptions,\n  type OpenHandlers,\n} from './lib/appViewer';\nimport { followOpenWithChoices, openWithChoice, setOpenWithChoice } from './lib/openWith';\nimport OpenWithDialog from './modals/OpenWithDialog.vue';\nimport PluginConfirmModal from './components/plugin/PluginConfirmModal.vue';\nimport DestinationPickerModal from './modals/DestinationPickerModal.vue'; /* tasi:m1 */\nimport { resolveLocale } from './locales/resolve';\n/* The bell, the full list and the avatar — the web's own components, drawn here\n   for a host that asks through `config.notifications` / `config.account`. */\nimport NotificationBell from './components/NotificationBell.vue';\nimport NotificationsPanel from './components/NotificationsPanel.vue';\nimport AccountMenu from './components/AccountMenu.vue';\nimport { accountZoneControl } from './lib/timezone';\nimport {\n  userSettingsApi,\n  type SettingsCapabilities,\n  type SettingsThemeMode,\n  type SettingsUser,\n  type UserSettingsHost,\n} from './lib/userSettingsHost';\nimport {\n  NOTIFY_POLL_MS,\n  createNotificationFeed,\n  notificationsTransport,\n  type NotificationFeed,\n  type NotificationRowData,\n} from './composables/useNotificationFeed';\nimport {\n  TRASH_VIEW_PATH,\n  explorerPathOf,\n  resolveNotificationTarget,\n  sameRowPath,\n  shareHref,\n  type NotificationDestination,\n} from './lib/notificationTarget';\nimport {\n  EXPLORER_DRAWN_ROWS,\n  accountMenuRows,\n  explorerRowKey,\n  type AccountAction,\n  type AccountPerson,\n  type ExplorerMenuRow,\n} from './lib/accountMenu';\nimport { newId } from './lib/uid';\nimport { lazySurface } from './lib/lazySurface';\n\n/* wiring:e2 vault — the vault strip, loaded with the vault (see the import\n   of useE2eVault above). */\nconst loadVaultStrip = () => import('./components/E2eVaultStrip.vue');\nconst E2eVaultStrip = defineAsyncComponent(loadVaultStrip);\n/* ⚠ The surfaces a person OPENS - the viewer, sharing, settings, search, the\n   encryption dialogs - load when the explorer mounts them, not with it: the\n   web app's main chunk carries the explorer and has to fit workbox's 2 MiB\n   precache limit (web/pwa.config.ts), or the build fails (0.54, lesson\n   #1276). Same components, same template; their code is a chunk of its own.\n   The list is packages/core/lazySurfaces.ts (the library build gives each\n   its own chunk there), and web/tests/quality/lazySurfaces.test.ts fails\n   when one of them is imported statically again. A new dialog of this kind\n   goes here, not into the imports above. */\nconst PreviewModal = lazySurface(() => import('./modals/PreviewModal.vue'));\nconst QuickLook = lazySurface(() => import('./components/QuickLook.vue'));\nconst UserSettingsDialog = lazySurface(() => import('./components/UserSettingsDialog.vue'));\nconst TimeZoneDialog = lazySurface(() => import('./components/TimeZoneDialog.vue'));\nconst PermissionsModal = lazySurface(() => import('./modals/PermissionsModal.vue'));\nconst AdvancedSearch = lazySurface(() => import('./components/AdvancedSearch.vue'));\nconst CommandPalette = lazySurface(() => import('./components/CommandPalette.vue'));\nconst NewDocumentModal = lazySurface(() => import('./modals/NewDocumentModal.vue'));\nconst ArchiveCreateModal = lazySurface(() => import('./modals/ArchiveCreateModal.vue'));\nconst OnboardingTour = lazySurface(() => import('./components/OnboardingTour.vue'));\nconst ShortcutSettings = lazySurface(() => import('./components/ShortcutSettings.vue'));\nconst EncryptedFolderModal = lazySurface(() => import('./components/EncryptedFolderModal.vue'));\nconst E2eSettingsModal = lazySurface(() => import('./components/E2eSettingsModal.vue'));\nconst E2eChangePasswordModal = lazySurface(() => import('./components/E2eChangePasswordModal.vue'));\nconst RecoveryKeyModal = lazySurface(() => import('./components/RecoveryKeyModal.vue'));\nconst E2eRecoveryUnlockModal = lazySurface(() => import('./components/E2eRecoveryUnlockModal.vue'));\nconst E2eFileEncryptModal = lazySurface(() => import('./components/E2eFileEncryptModal.vue'));\nconst E2eFileUnlockModal = lazySurface(() => import('./components/E2eFileUnlockModal.vue'));\n\nconst props = defineProps<{\n  config: ExplorerConfig;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'share-created', payload: { path: string; url: string; pin: string | null }): void;\n  (e: 'file-opened', file: { path: string; basename: string }): void;\n  (e: 'error', err: { message: string; context?: unknown }): void;\n  (e: 'upload-progress', p: { uploadId: string; percent: number; done: boolean }): void;\n  (\n    e: 'selection-change',\n    items: Array<{ path: string; basename: string; type: 'file' | 'dir' }>,\n  ): void;\n  // Fires whenever the viewed folder changes (virtual `<storage>/<rel>` form).\n  // Lets a host (e.g. the Explore page's realtime layer) track the current\n  // folder without reaching into internal state.\n  (e: 'navigate', p: { path: string }): void;\n  /**\n   * gorunum:v2-topbar — the user asked for a refresh (the header's button or\n   * the palette's command; both reach `refreshAll`).\n   *\n   * The explorer reloads the LISTING itself; this is for the half it cannot\n   * know about. `config.storages` is the host's answer to \"which drives may I\n   * show you\", computed before the explorer was mounted, and nothing inside\n   * here can recompute it — so a drive added from somewhere else stayed\n   * invisible until the whole page was reloaded. The Explore page used to\n   * paper over that with a Refresh button of its own in the page bar; the bar\n   * is gone, so the one Refresh has to mean both halves.\n   *\n   * ⚠ A notification, not a request: the explorer does not wait for the host\n   * and does not care whether it does anything. An embedder with a fixed\n   * storage list simply ignores it.\n   */\n  (e: 'refresh'): void;\n  /**\n   * paylas:m1 — the navigation panel's \"My shares\" row was pressed.\n   *\n   * ⚠ Passed through, not acted on. \"How to connect\" and \"API keys\" are\n   * surfaces this component OWNS, so it opens them itself; the list of links a\n   * person minted is a page of the host application (the SPA's `my-shares`\n   * route), and the explorer has no business deciding what a host's URLs look\n   * like.\n   *\n   * ⚠ Which is why the row is behind `config.mySharesVisible` and that flag is\n   * OFF by default: an embedder who does not listen would otherwise be given\n   * the one row in the panel that leads nowhere. Listening and setting the\n   * flag are the same decision, made once — see the note on the row itself in\n   * SideNav.vue.\n   */\n  (e: 'open-my-shares'): void;\n  /**\n   * #162 - the navigation panel's \"App store\" row was pressed. Passed\n   * through, like `open-my-shares`: the store screen is a page of the host\n   * (`config.appStorePage`).\n   */\n  (e: 'open-app-store'): void;\n  /**\n   * An \"Apps\" row was pressed and the host draws app home pages itself\n   * (`config.appHomePage`): the plugin and its `home` view. ⚠ Passed\n   * through, like `open-my-shares` — the page and its address are the\n   * host's.\n   */\n  (e: 'open-app-home', p: { plugin: string; view: string }): void;\n}>();\n\n// --------------------------------------------------------------------\n// State\n// --------------------------------------------------------------------\n\nconst api = useFileApi(props.config);\n\n/* The account's permissions (filex internal/perm). The host may pass them\n * (`config.permissions` / `permissionsByFolder` — the web app does); when it\n * passes none, the explorer reads them from `/api/auth/me` itself, so the\n * desktop app and the work / fishapp embeds hide exactly what the web app\n * hides without each host wiring it (one surface, one behaviour). An\n * administrator holds everything — the same as not narrowing — and a failed\n * or permission-less answer leaves it unknown: every action stays and the\n * server decides, as before. */\nconst fetchedPermissions = ref<{ permissions: string[]; byFolder: string[] } | null>(null);\nconst heldPermissions = computed<string[] | undefined>(\n  () => props.config.permissions ?? fetchedPermissions.value?.permissions,\n);\nconst heldByFolder = computed<string[] | undefined>(() =>\n  props.config.permissions ? props.config.permissionsByFolder : fetchedPermissions.value?.byFolder,\n);\n/* #196 - settled once the account's own permissions are in (or will not\n * come): the remembered menu answers are read under them (attachMenuAnswers). */\nlet ownPermissionsAsked: Promise<void> = Promise.resolve();\nfunction loadOwnPermissions(): void {\n  if (props.config.permissions) return;\n  ownPermissionsAsked = api.myPermissions().then(\n    (res) => {\n      fetchedPermissions.value = res && !res.admin ? { permissions: res.permissions, byFolder: res.byFolder } : null;\n    },\n    () => {\n      fetchedPermissions.value = null;\n    },\n  );\n}\nonMounted(loadOwnPermissions);\n\n// Locale up-front: the pendingOps onSettled callback below (and the undo-toast\n// helpers) need `t()` at runtime, so the catalogue must be constructed before\n// they are wired. Depends only on props and one ref — safe this early.\n//\n// ⚠⚠ #191 (the maintainers' rule, 2026-10-08): the explorer speaks the\n// language of the ACCOUNT behind its credential - the same one its\n// notifications, the person's phone and their emails speak. The host's\n// `locale` is what it draws until the account answers, what a page with\n// nobody signed in keeps (a public link), and the starting value an account\n// with no language of its own takes (`adoptAccountLocale`, below). A host that\n// changes its language while mounted (the web panel, the desktop app - both\n// write the account first) is followed.\nconst accountLocale = ref('');\nconst locale = computed(() => resolveLocale(accountLocale.value || props.config.locale));\n// Every dialog under this explorer speaks its language (EXPLORER_LOCALE).\nprovide(EXPLORER_LOCALE, () => locale.value);\n/* surucu:d1-sort — the alphabet the `type` key sorts in (lib/sortOrder sorts\n * by the word the Type column PRINTS, so \"Image\" and \"Görsel\" each fall in\n * their own order).\n * ⚠ Pushed from HERE as well as from FilterBar and ListView, and that is not a\n * third copy of a decision — it is one value, pushed by the component that\n * always exists. This file is now the one that sorts; the filter row is absent\n * at a virtual root and the list is absent in grid and gallery, so relying on\n * either would leave the comparator on a stale alphabet exactly when they are\n * not mounted. */\nwatch(locale, (l) => setSortLocale(l), { immediate: true });\nconst { t, formatDate, dir } = useLocale(locale); /* `formatDate` reads an app lock's end on the user's clock */\n// ⚠ RTL — `dir` goes on the root: the explorer's direction is its OWN locale's,\n// never the host page's (lib/direction has the rule and why).\n\n// Live collaboration (WebSocket file-change events + presence), bundled into the\n// core so every consumer — the native panel AND the embedded webcomponent —\n// gets it. Auth is a short-lived ticket fetched through the same API (works\n// same-origin and proxied cross-origin); it degrades to polling when no live\n// socket is available.\n/* wiring:e2 vault — the explorer's vault mode (composables/useE2eVault). Made\n   here, before the realtime layer that hands it `vault.*` events; everything\n   it calls back is read when it calls, not now. */\nconst vault = useE2eVault({\n  http: {\n    endpoints: api.endpoints,\n    authHeaders: (extra) => api.authHeaders(extra),\n    credentialsMode: () => api.credentialsMode(),\n    downloadUrl: (p) => api.downloadUrl(p),\n    acceptLanguage: () => localeTag(locale.value),\n  },\n  headersNow: () => api.authHeadersSync(),\n  t: (key, vars) => t(key, vars),\n  toast: (message, error) => showToast({ message }, error ? ERROR_TOAST_MS : FLASH_TOAST_MS),\n  emitError: (message, op) => emit('error', { message, context: { op } }),\n  // The lock's holder says which client: the desktop app is the explorer that\n  // was handed the shell's hooks.\n  clientKind: () => (props.config.desktopSync || props.config.dragOut ? 'desktop' : 'web'),\n  dropKeys: (root) => vaultDropKeys(root),\n  formatCount: (n) => new Intl.NumberFormat(localeTag(locale.value)).format(n),\n  onLocked: (root, why) => vaultLocked(root, why),\n  onChanged: (root) => vaultChanged(root),\n  askName: (q) => askVaultName(q),\n});\n/** wiring:e2 vault — an upload's name is taken in the vault: the explorer's\n *  \"already there\" dialog (DraftConflictModal, kind upload) asks whether it\n *  goes up under the free name. One question at a time, in order. */\nconst vaultNameQuestion = ref<{ name: string; folder: string; suggested: string; resolve: (ok: boolean) => void } | null>(null);\nfunction askVaultName(q: { name: string; folder: string; suggested: string }): Promise<boolean> {\n  return new Promise<boolean>((resolve) => {\n    vaultNameQuestion.value = { ...q, resolve };\n  });\n}\nfunction answerVaultName(ok: boolean): void {\n  const q = vaultNameQuestion.value;\n  vaultNameQuestion.value = null;\n  q?.resolve(ok);\n}\n/** wiring:e2 vault — a path inside a vault is asked about as the vault folder:\n *  the server never hears of a path below it (permissions, policy answers). */\nfunction vaultAskPath(wire: string): string {\n  return vault.rootOf(wire) ?? wire;\n}\n/** wiring:e2 vault — the rows of a folder inside an open vault, answered as a\n *  listing would be. Null when `wire` is not in an open vault. */\nfunction vaultListing(wire: string): ManagerResponse | null {\n  const w = String(wire ?? '').replace(/\\/+$/, '');\n  const root = vault.rootOf(w);\n  if (!root || !vault.isOpen(root)) return null;\n  const at = vault.rows(w) ? w : root;\n  const perm = vault.permOf(root) as ManagerResponse['perm'];\n  return {\n    adapter: at.slice(0, at.indexOf('://')),\n    storages: [],\n    dirname: at,\n    read_only: false,\n    ...(perm ? { perm } : {}),\n    e2e_root: root,\n    e2e_vault_root: root,\n    files: filterListing(vault.rows(at) ?? []),\n  };\n}\n/** wiring:e2 vault — a server listing of a folder in a vault (the server says\n *  so, `e2e_vault_root`, or this browser knows it) is the vault's own layout\n *  on the storage - `v/`, packs, index files - and nothing to show: no row of\n *  it is a folder a person opens or chooses. */\nfunction withoutVaultLayout(resp: ManagerResponse): ManagerResponse {\n  const dir = String(resp.dirname ?? '').replace(/\\/+$/, '');\n  const named = typeof resp.e2e_vault_root === 'string' && resp.e2e_vault_root ? resp.e2e_vault_root : vault.rootOf(dir);\n  return named ? { ...resp, e2e_vault_root: named, files: [] } : resp;\n}\n/** wiring:e2 vault — the panes list through this, the main one's folder\n *  previews included: a folder inside an open vault comes from its index, and\n *  one inside a vault that is locked here is its vault folder (the lock\n *  screen). */\nconst paneApi: typeof api = {\n  ...api,\n  index: async (path: string) => {\n    const listed = vaultListing(path);\n    if (listed) return listed;\n    const root = vault.rootOf(String(path ?? ''));\n    return withoutVaultLayout(await api.index(root ?? path));\n  },\n};\n/** wiring:e2 vault — the details panel asks the server about the item it\n *  shows (links, people); about an item inside a vault it asks nothing. */\nconst vaultRefused = () => Promise.reject(new Error('vault: not asked'));\nconst inspectorApi: typeof api = {\n  ...api,\n  listShares: (path: string) => (vault.rootOf(path) ? vaultRefused() : api.listShares(path)),\n  listPermissions: (path: string) => (vault.rootOf(path) ? vaultRefused() : api.listPermissions(path)),\n  createShare: (payload: Parameters<typeof api.createShare>[0]) => (vault.rootOf(payload.path) ? vaultRefused() : api.createShare(payload)),\n};\nfunction vaultOnVisible(): void {\n  if (typeof document !== 'undefined' && document.visibilityState === 'visible') vault.onVisible();\n}\nonMounted(() => {\n  if (typeof document !== 'undefined') document.addEventListener('visibilitychange', vaultOnVisible);\n  if (typeof window !== 'undefined') window.addEventListener('pagehide', vault.onPageHide);\n});\nonBeforeUnmount(() => {\n  if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', vaultOnVisible);\n  if (typeof window !== 'undefined') window.removeEventListener('pagehide', vault.onPageHide);\n  vault.closeAll('manual');\n});\n/* /wiring:e2 vault */\nconst realtime = useRealtime(api, {\n  reload: () => load(),\n  onVault: (m) => vault.onEvent(m) /* wiring:e2 vault */,\n  onAccess: (news) => onAccessChanged(news) /* #196 */,\n});\nconst presenceUsers = realtime.presenceUsers;\n// True while the live socket is unavailable and the explorer runs on the\n// polling fallback — drives the small \"no live connection\" badge. Healthy\n// connections show nothing.\nconst realtimeDegraded = realtime.degraded;\nfunction realtimeRoom(vp: string): string | null {\n  const p = (vp || '').replace(/^\\/+|\\/+$/g, '');\n  if (p === '.trash' || p.startsWith('.trash/')) return null;\n  // The wire form must go through the mode-aware qualify(), exactly like every\n  // API call: in single-storage mode currentPath is a BARE relative path\n  // (\"projeler/5\") — virtualToWire would mistake its first segment for an\n  // adapter (\"projeler://5\") and subscribe a nonexistent room, so presence and\n  // live changes silently missed the real folder. An empty p is the storage\n  // root — a real room (\"main://\") — not \"no room\"; only the multi-storage\n  // drives list (no adapter yet) has none.\n  const wire = qualify(p);\n  if (!wire || !wire.includes('://') || wire.startsWith('://')) return null;\n  // wiring:e2 vault — inside a vault, the vault folder's room: a path below\n  // it is never sent.\n  return vault.rootOf(wire) ?? wire;\n}\nonMounted(() => {\n  realtime.start();\n  realtime.subscribe(realtimeRoom(currentPath.value));\n});\nonBeforeUnmount(() => realtime.stop());\n\n// Authenticated thumbnails — raw thumb_url is root-relative + header-less,\n// which only ever worked for the native same-origin SPA (embedded hosts got\n// empty/broken <img>s). See useThumbs.\nconst thumbs = useThumbs(props.config.apiBase, api);\n\nconst chunked = useUploadChunked(props.config, api);\n\n// Undo registry for async pending ops: when a cleanly-invertible operation\n// (move → reverse move, trash-delete → restore) is queued, its inverse is\n// registered under the op id; once the op settles OK the toast grows a\n// \"Geri Al\" action. Ops without an entry keep the plain settled toast.\nconst opUndo = new Map<number, { message: string; fn: () => Promise<UndoOutcome> }>();\n\nconst pendingOps = usePendingOps(props.config, api, {\n  onSettled: (op: PendingOp) => {\n    const undo = opUndo.get(op.id);\n    opUndo.delete(op.id);\n    /* \"Empty the trash\" says how it ended itself (emptyTrash below), and a\n     * row somebody cancelled is not announced as done. */\n    if (op.op_type === 'trash-empty') {\n      void load();\n      return;\n    }\n    /* A permanent delete this explorer queued (one job per storage): its\n     * rows stop saying \"Deleting…\", the job's own summary — the server's\n     * sentence for what it deleted, what it did not and why (ops say.go) — is\n     * said once, and the trash is read once (#69, finding A15). */\n    const purgedRows = purgeJobRows.get(op.id);\n    if (purgedRows) {\n      purgeJobRows.delete(op.id);\n      markPurging(purgedRows, false);\n      const words = op.summary || (op.status === 'error' ? opFailure(op, t).text : '');\n      if (words && op.status !== 'cancelled') {\n        showToast({ message: words }, op.status === 'done' ? FLASH_TOAST_MS : ERROR_TOAST_MS);\n      }\n      if (trashMode.value) void loadTrash();\n      return;\n    }\n    if (op.status === 'cancelled') {\n      const message = op.op_type === 'archive-extract'\n        ? t('archive.extraction_cancelled', { count: op.progress_done })\n        : t('opc.status.aborted');\n      flashToast(message);\n    } else if (op.op_type === 'restore' && op.summary) {\n      // A restore job says how it ended: how many came back, how many did not\n      // and why — the server's sentence (ops say.go), not one built here.\n      showToast({ message: op.summary }, op.status === 'done' ? FLASH_TOAST_MS : ERROR_TOAST_MS);\n    } else if (op.status === 'error') {\n      // Said, not printed: the server's error text is English and sometimes\n      // plumbing (\"engine libreoffice is not installed on this host\").\n      flashToast(opFailure(op, t).text);\n    } else if (undo) {\n      // A rename is one item: no count after it.\n      undoToast(op.op_type === 'rename' ? undo.message : `${undo.message} (${op.progress_total})`, undo.fn);\n    } else if (op.op_type === 'plugin') {\n      /* App plugins — the job's own last words, else \"<label> finished\". */\n      flashToast(op.message || t('plugin.done', { label: pluginOpLabel(op) }));\n      /* ...and where the job's result sends the person who queued it: one of\n       * its outputs, with the app's screen on it (`surface.open`, filex #78 -\n       * a conversion carries its person on to what it wrote). The folder\n       * is opened by onSurfaceOpen, so the listing is not read twice. ⚠ Not\n       * over a screen the person has opened since: the job does not get to\n       * take that one away. */\n      const go = jobOpenOf(op, { busy: !!pluginView.value || !!appFrameView.value });\n      if (go) {\n        void onSurfaceOpen(go.plugin, go.open);\n        void splitPaneRef.value?.reload();\n        return;\n      }\n    } else if (op.op_type === 'rename') {\n      flashToast(t('toast.renamed'));\n    } else if (op.op_type === 'restore') {\n      flashToast(t('toast.restored', { n: op.progress_done }));\n    } else {\n      const verb =\n        op.op_type === 'archive-create'\n          ? t('archive.created')\n          : op.op_type === 'archive-extract'\n            ? t('archive.extraction_completed')\n            : op.op_type === 'copy'\n              ? t('toast.copied')\n              : op.op_type === 'move'\n                ? t('toast.moved')\n                : t('toast.deleted');\n      flashToast(op.op_type.startsWith('archive-') ? verb : `${verb} (${op.progress_total})`);\n    }\n    void load();\n    void splitPaneRef.value?.reload(); /* wiring:d1 — refresh the secondary pane too */\n  },\n});\n\nconst loading = ref(false);\n// rootPath confinement (UX): when set, the explorer treats this folder as its\n// floor — it opens there, never lists the drives root, and can't navigate\n// above it. Security is enforced server-side (X-Filex-Root / token root scope);\n// this is purely the clean-embed presentation. `rootFloor` is the virtual form\n// (`<storage>/<rel>`) used for path comparisons in multi-storage mode.\nconst rootPathProp = (props.config.rootPath || '').trim(); // qualified `<adapter>://<rel>`\nconst rootFloor = rootPathProp.replace('://', '/').replace(/^\\/+|\\/+$/g, '');\nconst initialFloorPath = rootFloor || props.config.initialPath || '';\nconst currentPath = ref<string>(initialFloorPath);\n/* ⚠⚠ One listing at a time is the one on screen: the NEWEST asked for, and\n * a reload with no path goes where the newest folder load is going\n * (lib/listingTickets - the measured case, a breadcrumb click undone by the\n * late reload of the folder being left, is written there). Declared beside\n * the address it guards, before anything in setup can call a loader. */\nconst tickets = listingTickets();\nconst isNewestLoad = (ticket: number) => tickets.isNewest(ticket);\nconst adapter = ref<string>(props.config.defaultAdapter || 'brf');\nconst dirname = ref<string>(initialFloorPath);\nconst files = ref<FileNode[]>([]);\n// RBAC effective level for the current directory ('' = ACL not enforced on\n// this storage → no gating). Drives which write/manage actions are offered.\nconst dirPerm = ref<string>('');\n/** The listed folder sits on a read-only storage (`read_only` on the index\n *  response). Folded into permCanEdit so every write affordance — toolbar,\n *  sidebar menu, context menu, drop zone, editor mode — reads the same fact. */\nconst dirReadOnly = ref(false);\n// The dead deep-link state: set to the requested path when a listing came\n// back 404 (folder doesn't exist) or 403 (RBAC-hidden — rendered identically\n// on purpose so a denied folder doesn't reveal that it exists). '' = none.\nconst notFoundPath = ref<string>('');\n// Listing failure that is NOT a dead link (network error, 5xx): remembered so\n// the body can render a retryable error state instead of a misleading \"this\n// folder is empty\". Only shown when no listing is visible — a failed\n// navigation away from a healthy listing keeps the current list + toast,\n// exactly as before.\nconst loadError = ref<string>('');\nlet loadErrorPath: string | undefined;\nfunction retryLoad() {\n  void load(loadErrorPath);\n}\n\n/**\n * The first-paint cache of the DEFAULT view mode (`lib/viewPrefs` writes it\n * from the person's or the instance's default). ⚠ Read here, never written:\n * see below.\n */\nconst VIEW_MODE_KEY = 'brf-file-explorer:view-mode';\n/**\n * The view mode on screen.\n *\n * ⚠⚠ Setting it writes NOTHING global, and that is the fix for the owner's\n * report of 2026-09-21 — \"Explore içindeki değişikliklerimiz o klasör özelinde\n * olmalı; tüm klasörlerde görünüm değişikliği geçerli oluyor.\" It used to\n * write `brf-file-explorer:view-mode` AND the account's global default on\n * every change, under the rule \"your last choice becomes the default for every\n * folder you have never set up\": switch folder A to grid and folder B, never\n * touched, came up as grid. A change is now recorded against the folder it was\n * made in (the recorder below) and nowhere else; the default is set on purpose\n * in the person's settings or by the operator.\n */\nconst viewMode = ref<ViewMode>(\n  (() => {\n    try {\n      const stored = localStorage.getItem(VIEW_MODE_KEY);\n      if (stored === 'list' || stored === 'grid' || stored === 'gallery') return stored; /* wiring:d2 */\n    } catch {\n      /* private mode */\n    }\n    return props.config.viewMode ?? 'list';\n  })(),\n);\n/* cila:a density — Toolbar owns the persisted preference (filex.density);\n   mirrored here only so the root `.fe` can carry fe--density-compact. */\nconst density = ref<'comfortable' | 'compact'>('comfortable');\nconst searchQuery = ref('');\n/** The search answer on screen was cut: more rows matched than came back\n *  (`truncated` on the response; lib/advSearch `advSearchTruncated`). Reset by\n *  every load(), so it can only ever describe the listing that is showing. */\nconst searchTruncated = ref(false);\n/** The manager's search action asks the index for this many hits\n *  (handlers.Manager, managerSearchPage) — the page an older server's full\n *  answer is recognised by. */\nconst MANAGER_SEARCH_PAGE = 250;\n/**\n * How much of each storage its catalog covers, from the last response that\n * said (`storage_info` on every listing and search — lib/catalogCoverage).\n * Kept across loads: the content search (`/api/files/search`) does not carry\n * it, and its banner still has to name a storage the catalog does not cover.\n */\nconst coverageMap = ref<Record<string, CatalogCoverage | null>>({});\n/** \"Catalog everything\" per storage, by name: `0` while its scan is being\n *  asked for, the storage's id while the scan is followed. ⚠ Per storage —\n *  one flag for all of them held every storage's button and banner. */\nconst catalogRuns = ref<Record<string, number>>({});\n/* The follower of those scans (lib/storageWatch), made on the first press\n * and stopped with the explorer. */\nlet catalogWatcher: StorageWatch | null = null;\nfunction catalogWatch(): StorageWatch {\n  if (!catalogWatcher) {\n    const base = connectionsBase(props.config);\n    catalogWatcher = createStorageWatch({\n      list: async () => {\n        const rows = await api.jsonFetch<WatchedStorageRow[]>(`${base}/api/admin/storages`);\n        return Array.isArray(rows) ? rows : [];\n      },\n    });\n  }\n  return catalogWatcher;\n}\n/** Is \"Catalog everything\" under way for this storage? */\nfunction catalogBusy(storage: string | undefined): boolean {\n  return !!storage && storage in catalogRuns.value;\n}\n// trashMode — true while viewing the filex trash (soft-deleted nodes from the\n// backend trash endpoint), entered by opening the virtual `.trash` row and\n// exited by any normal navigation (load() resets it). Replaces a brittle\n// `currentPath.startsWith('fileman/.trash')` check that never matched the\n// filex backend's storage layout, so trash always looked empty.\nconst trashMode = ref(false);\n// The storage the trash view was entered from, so \"up\" returns there (not the\n// global root). Set in loadTrash().\nconst trashOrigin = ref<string>('');\nconst trashActive = computed(() => trashMode.value);\n\n/* === gezinti:g1 — the navigation panel's virtual views ===================\n * Recent / Starred / Shared with me / Trash are listings with no folder behind\n * them: the rows come from a per-user endpoint and each carries its own\n * adapter-qualified path, so opening one navigates the ordinary way. The\n * pattern is trashMode's, generalised — including the part that matters most,\n * that load() clears the mode, or the view sticks and every later navigation\n * renders under the wrong heading. */\ntype NavView = '' | 'home' | 'recent' | 'starred' | 'shared' | 'drafts' | 'trash' | 'tag';\nconst navView = ref<NavView>('');\n/** Where the view was entered from, so \"up\" goes back there. */\nconst navViewOrigin = ref<string>('');\n\n/**\n * gorunum:v1 — when a row's NAME is not enough to know where it is.\n *\n * Recent, Starred, Shared with me and a tag view each draw rows gathered from\n * every folder in the storage, so two files called `report.pdf` are two\n * identical lines. The listing already knows how to print a row's folder — it\n * did it for search hits only. Trash is left out on purpose: a trashed row's\n * stored path is its trash key, not the folder it came from, so the column\n * would print an internal name.\n */\nconst crossFolderView = computed(\n  () => navView.value !== '' && navView.value !== 'trash' && navView.value !== 'home',\n);\n/**\n * #207 (audit D3) — Recent, Starred, Shared with me and a tag are in the\n * SERVER's order: the person's own time on each row (opened_at, starred_at,\n * shared_at) newest first, or the order they chose for that view, which is\n * sent to the server as `sort` (navSortParam) so it orders the whole set and\n * not the page in hand. The pane keeps the rows as they came (`relevance`).\n * Before 0.54 the pane re-sorted them, and Recent was seeded \"modified ↓\":\n * the files' modification order, which is not \"what I opened last\".\n */\nconst serverOrderedView = computed(\n  () => navView.value === 'recent' || navView.value === 'starred' || navView.value === 'shared' || navView.value === 'tag',\n);\n\n/* === tablo:t1 — per-folder view memory ==================================\n * \"x folder'ında son görünüm nasıl kaldı ise öyle görünümde göstermemiz\n * lazım.\" A folder opens the way you left it. The rule, the cap and the split\n * between what is per-folder and what is a global preference are all argued in\n * `lib/viewPrefs`; this is only the wiring — the two moments the explorer is\n * the one that knows something: a navigation ended, and a person changed a\n * view.\n */\n\n/** An embed's opt-out. A product mounting filex in a two-inch panel does not\n *  want a remembered gallery view arriving from somebody's main window. */\nconst folderMemoryOn = computed(() => props.config.rememberFolderView !== false);\n\n/**\n * The key the folder on screen is remembered under.\n *\n * `currentPath` is already the qualified `<storage>/<rel>` form, so the first\n * segment is the storage ref — and the ref is swapped for the storage's\n * immutable `uid` when the host supplies one (`config.storages[].uid`), which\n * is the difference between a memory that survives a rename and one that does\n * not. See the note on `folderKey` for what happens until it does.\n *\n * The virtual views (`.recent`, `.starred`, `.tag~x`) have no storage and so\n * key on their own sentinel — which is how Recent gets a remembered sort of\n * its own without a special case anywhere.\n */\nconst currentFolderKey = computed(() => {\n  if (!folderMemoryOn.value) return '';\n  const path = String(currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n  /* The listing of every storage is a place too: a person who sorts their\n     drives expects them to stay sorted, and `''` would mean \"no folder\", whose\n     changes land on the person's DEFAULT. */\n  if (!path) return ROOT_FOLDER_KEY;\n  const [first, ...rest] = path.split('/');\n  const st = (props.config.storages ?? []).find((s) => s.name === first);\n  return makeFolderKey(st?.uid || first, rest.join('/'));\n});\n\n/**\n * The DEFAULT view mode — what a folder nobody has configured opens as: the\n * person's default, else the instance's (`lib/viewPrefs.defaultFolderView`),\n * else this host's `config.viewMode`, else list. Until the account's document\n * has landed, this browser's cached copy of that answer stands in for it.\n */\nfunction defaultViewMode(): ViewMode {\n  const d = defaultFolderView().v;\n  if (d) return d;\n  if (!viewPrefsReady()) {\n    try {\n      const stored = localStorage.getItem(VIEW_MODE_KEY);\n      if (stored === 'list' || stored === 'grid' || stored === 'gallery') return stored;\n    } catch {\n      /* private mode */\n    }\n  }\n  return props.config.viewMode ?? 'list';\n}\n\n/**\n * The stored document landed — or another browser's newer one did when this\n * tab came back to the front, or the operator's default arrived with it.\n * Re-apply the folder on screen: its own memory wins, and a folder with none\n * follows whatever the default now is.\n *\n * ⚠ Unsubscribed with the component: the registry is module-level and two\n * explorers can be mounted at once.\n */\nonScopeDispose(\n  onViewPrefsApplied(() => {\n    if (!viewPrefsReady()) return;\n    applyFolderView(currentFolderKey.value);\n  }),\n);\n\n/**\n * What the folder on screen was last put into — by the applier, or by the\n * recorder after it wrote a change down. The recorder compares against it to\n * tell a person's change from a restore's echo, and to know WHICH field\n * changed.\n *\n * ⚠⚠ A record and not a `restoring = true … false` fence: Vue's watchers are\n * asynchronous, so a fence around an assignment is already back down by the\n * time the recorder runs, and every navigation would record itself as a\n * deliberate choice — walking through a folder would configure it.\n */\nlet applied: { key: string; v: ViewMode; k: string; d: string } | null = null;\n\n/** A navigation ended (or the defaults changed): put this folder back the way\n *  it was left — its own memory, else the default, field by field. */\nfunction applyFolderView(key: string) {\n  if (!key && folderMemoryOn.value) return;\n  touchFolder(key); // LRU clock — only bumps folders already remembered\n  const p = key ? resolveFolderView(key) : {};\n  /* ⚠ The `else` halves matter as much as the `if`s. Without them a folder\n   * with no memory of its own would inherit whatever the PREVIOUS folder was\n   * put into — walk from a remembered gallery into a plain folder and it\n   * comes up as a gallery, which is the leak wearing a different hat. */\n  const wantView = p.v ?? defaultViewMode();\n  if (wantView !== viewMode.value) viewMode.value = wantView;\n  if (p.k) applySort(p.k, p.d ?? defaultSortDir(p.k));\n  else {\n    const g = defaultSort();\n    applySort(g.key, g.dir);\n  }\n  applied = { key, v: viewMode.value, k: activeSortKey(), d: activeSortDir() };\n}\n\n/**\n * tablo:t1 — hand `lib/viewPrefs` its transport.\n *\n * The document lives on the user row (migration 00039), so this is the one\n * place that knows the base URL, the auth headers and the credentials mode.\n * Started in `onMounted`, i.e. in the same turn as the first listing — the\n * prefs are a single row and the listing has to walk a storage, so the prefs\n * land first in practice, and nothing is applied to a folder until they do.\n */\nonMounted(() => {\n  /* The one transport (`lib/viewPrefsHttp`), shared with the admin app. A\n   * no-op when the host already attached it — which the admin app does on\n   * sign-in, because its tables keep their columns in the same document. */\n  attachViewPrefsHttp({\n    apiBase: props.config.apiBase ?? '',\n    headers: buildAuthHeaders,\n    credentials: api.credentialsMode(),\n  });\n});\n\n/* ⚠ `flush: 'post'` so this is the LAST word in the tick. A tab switch sets\n * the path and the tab's own remembered view mode in the same turn; running\n * before it would apply the folder's memory and then have the tab overwrite\n * it, which is the one arrangement in which the feature silently does nothing\n * on exactly the gesture people use most.\n *\n * ⚠⚠ `viewPrefsReady()` is a DEPENDENCY, not a guard, and that is what stops\n * the flash the other way round: the first folder is usually open before the\n * document lands, so this has to re-run when it does. Reading it here means\n * the applier fires once more the moment the answer exists, and the folder\n * settles into its remembered view without anybody having navigated again. */\nwatch(\n  [currentFolderKey, () => viewPrefsReady()],\n  ([key, rdy]) => {\n    if (!rdy) return;\n    applyFolderView(key);\n  },\n  { immediate: true, flush: 'post' },\n);\n\n/**\n * A person changed a view. Record it against THE FOLDER — and only the field\n * that changed: switching to grid records the view mode and leaves the\n * folder's sort following the default, so a default sort chosen later still\n * reaches it.\n *\n * ⚠⚠ Nothing global is written here or anywhere else on a click. This is the\n * fix for \"tüm klasörlerde görünüm değişikliği geçerli oluyor\".\n *\n * ⚠ A host that switched the per-folder memory OFF (`rememberFolderView:\n * false`) has no folder to record against (`currentFolderKey` is ''), and asked\n * for one arrangement everywhere — so for it, and only for it, a change is the\n * person's default.\n */\nwatch(\n  () => [currentFolderKey.value, viewMode.value, activeSortKey(), activeSortDir()] as const,\n  ([key, v, k, d]) => {\n    /* ⚠ Nothing is recorded before the document has landed: until then the\n     * state on screen is this session's defaults, not the person's choices. */\n    if (!viewPrefsReady()) return;\n    if (!applied || applied.key !== key) return; // a navigation — the applier's turn\n    const patch: { v?: ViewMode; k?: typeof k; d?: typeof d } = {};\n    if (v !== applied.v) patch.v = v;\n    if (k !== applied.k || d !== applied.d) {\n      patch.k = k;\n      patch.d = d;\n    }\n    applied = { key, v, k, d };\n    if (!Object.keys(patch).length) return;\n    if (key) rememberFolder(key, patch);\n    else if (!folderMemoryOn.value) setPersonFolderDefault(patch);\n  },\n  /* ⚠⚠ `post`, and registered AFTER the applier: a navigation changes\n   * `currentFolderKey`, which both watchers depend on. Pre-flush this would\n   * run first, while the view state is still the folder you LEFT, and record\n   * that folder's setup against the one you arrived in. */\n  { flush: 'post' },\n);\n\n/* \"Forget this folder's view\" (the column menu): put the folder on screen\n * back onto the default straight away, rather than at the next navigation. */\nwatch(\n  () => folderIsRemembered(currentFolderKey.value),\n  (now, was) => {\n    if (was && !now && viewPrefsReady()) applyFolderView(currentFolderKey.value);\n  },\n);\n/** The tag being browsed while navView === 'tag' ('' otherwise). */\nconst navTag = ref<string>('');\n/** …and which KIND of it (etiket:k2, v0.43): 'personal', 'team', or '' for\n *  both — what a `#.tag~x` link from before kinds existed still opens. */\nconst navTagKind = ref<TagKind | ''>('');\n/** Sentinel parked in `dirname` so the breadcrumb can label the view. The tag\n *  view's sentinel is built per tag (`makeTagSegment`) — see lib/listing. */\nconst NAV_VIEW_DIRNAME: Record<Exclude<NavView, '' | 'trash' | 'tag'>, string> = {\n  home: '.home',\n  recent: '.recent',\n  starred: '.starred',\n  shared: '.shared',\n  drafts: '.drafts',\n};\n\n/**\n * A path that is a virtual view rather than a folder. Used by load() so a\n * sentinel reaching it — a restored tab, a pasted `#.tag~invoices`, a reload,\n * the breadcrumb's own crumb — opens the VIEW instead of asking the backend\n * for a folder called `.starred` and landing on \"not found\". (That was already\n * true of the four shipped views; the tag view would have inherited it.)\n */\nfunction virtualViewOf(\n  path: string,\n): { kind: Exclude<NavView, ''>; tag: string; tagKind: TagKind | '' } | null {\n  /* ⚠ The \"is this a sentinel at all?\" half is `lib/listing`'s\n     `isVirtualViewPath`, not a second reading of the map here: FilePane has to\n     answer the same question before it qualifies a path (a qualified sentinel\n     becomes an adapter and stops being translatable), and two answers to it is\n     how the breadcrumb ended up printing `.starred`. This function adds only\n     what the panel needs on top: WHICH view. */\n  if (!isVirtualViewPath(path)) return null;\n  const clean = String(path ?? '').replace(/^\\/+|\\/+$/g, '');\n  const tag = tagOfPath(clean);\n  if (tag) return { kind: 'tag', tag, tagKind: tagKindOfPath(clean) };\n  const kind = clean.slice(1) as Exclude<NavView, '' | 'tag'>;\n  return { kind, tag: '', tagKind: '' };\n}\n\n// When the caller can see exactly ONE storage, the multi-storage root is a\n// one-row list that carries no information — the user clicks through it every\n// single time. Treat that storage as the floor instead: open it directly and\n// stop offering an \"up\" that only leads back to the one row.\n//\n// Empty string means \"not in that situation\" (single-storage mode, or more\n// than one storage visible), which leaves every existing path untouched.\nconst soleStorageName = computed(() => {\n  if (!multiStorageRoot.value) return '';\n  const list = props.config.storages ?? [];\n  return list.length === 1 ? list[0].name : '';\n});\n\n// canGoUp/goUp — toolbar's \"↑ Up one level\" button. In single-storage\n// mode \"\" means the storage root; in multi-storage mode \"\" means\n// the global root (storage list). Both → no parent → button hidden.\nconst canGoUp = computed(() => {\n  const p = (currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n  if (rootFloor && p === rootFloor) return false; // at the confined floor — nowhere above\n  if (soleStorageName.value && p === soleStorageName.value) return false;\n  return p.length > 0;\n});\n\n// True when the explorer is showing the synthetic storage list and\n// there's no real backend folder to mutate. New Folder / Upload /\n// Paste are hidden in this state.\nconst atVirtualRoot = computed(() => {\n  // gezinti:g1 — a virtual view (Recent / Starred / Shared with me) has no\n  // backend folder behind it either. \"New folder\" there would have to invent a\n  // destination, and \"upload\" would have to guess one.\n  //\n  // ⚠ gorunum:v3-shell — Home is in that set, and it is now the LANDING view,\n  // so the \"+ New\" menu opens with its three rows disabled on the first screen\n  // a person sees. That is deliberate and it is not a bug to \"fix\" by picking\n  // a drive: with several storages there is no honest answer to \"upload where\",\n  // and an entry that silently chose one would put somebody's file in a place\n  // they did not name. (With exactly one visible storage the question does not\n  // arise — `soleStorageName` opens that storage as the root, so \"My files\" is\n  // a real folder.) The reference stand enables it because it has one drive.\n  if (navView.value && navView.value !== 'trash') return true;\n  if (!multiStorageRoot.value) return false;\n  return !((currentPath.value ?? '').replace(/^\\/+|\\/+$/g, ''));\n});\n\n/* surucu:d1-scope — WHERE THE FILTER ROW IS DRAWN, 2026-09-13.\n *\n * ⚠⚠ There is no longer a LIST of places. The row is drawn everywhere, and the\n * only question left is which SHAPE it takes — and that is answered by what the\n * rows are, not by which view you are in:\n *\n *     rows are files  → the whole row (Type · People · Modified · Size · find ·\n *                       sort · ⋮). A folder, the trash, Starred, Shared,\n *                       Recent, a tag — \"it is a listing like any other\"\n *                       (owner, on the tag view), and the four chips answer\n *                       from fields those rows carry.\n *     rows are not    → the name box alone. The drive list (each row is a\n *                       storage) and Home (three blocks of cards).\n *\n * ⚠ It used to be `!atVirtualRoot`, which is a different question altogether:\n * that flag answers \"is there a backend folder here to create in / upload to\".\n * Borrowing it cost the row its place in six views at once, including the two\n * the owner asked for it back in (\"root folder'da filtre barı kalsın … orada\n * adam isterse storage ismi aratabilir\" and \"Home sayfasında da filtreleme\n * barını getirelim\").\n */\n/** Home's body is three blocks of cards, not a listing — name box only. The\n *  drive root reaches the same shape through the pane's own `atVirtualRoot`,\n *  because a pane knows when it is showing drives and both panes can be. */\nconst filterRowMode = computed<'full' | 'find'>(() =>\n  navView.value === 'home' ? 'find' : 'full',\n);\n\nfunction goUp() {\n  // Leaving the trash view returns to the storage it was opened from, not the\n  // global storage-list root.\n  if (trashMode.value) {\n    void load(trashOrigin.value);\n    return;\n  }\n  /* gezinti:g1 — the other virtual views behave the same way. */\n  if (navView.value) {\n    void load(navViewOrigin.value);\n    return;\n  }\n  const cur = (currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n  if (!cur || cur === rootFloor) return;\n  // The button is hidden here, but Alt+↑ / Backspace still route through.\n  if (soleStorageName.value && cur === soleStorageName.value) return;\n  const idx = cur.lastIndexOf('/');\n  let parent = idx === -1 ? '' : cur.slice(0, idx);\n  // Never step above the confined floor.\n  if (rootFloor && !(parent === rootFloor || parent.startsWith(rootFloor + '/'))) parent = rootFloor;\n  void load(parent);\n}\n\n/**\n * gorunum:v1 — what the ACTIVE view is showing, in the order it shows it.\n *\n * A shift-range is arithmetic over a list, and this used to run it over\n * `files` — the backend's answer — while the user was looking at a sorted or\n * folder-hoisted one. Measured on a seeded storage: shift-clicking the first\n * and fourth visible rows selected eight, because the folder the view had\n * lifted to the top still sat last in `files`. The view now says what it drew\n * (`display-order`) and the range is computed over that; `files` remains the\n * fallback for the moment before the first paint and for surfaces that publish\n * nothing.\n */\nconst displayOrder = ref<FileNode[]>([]);\n\n/**\n * gorunum:v1 — where the previewed file sits in what the user is looking at.\n *\n * Counted over the DISPLAYED order, not over `files`: the viewer's \"3 of 9\"\n * and its chevrons have to agree with the listing behind them, and that order\n * is the view's, not the backend's. Directories are skipped — the viewer\n * cannot open one, so counting them would promise a step that does nothing.\n */\nconst previewables = computed<FileNode[]>(() =>\n  (displayOrder.value.length ? displayOrder.value : files.value).filter((n) => n.type !== 'dir'),\n);\nconst previewPosition = computed(() => {\n  const list = previewables.value;\n  const path = previewTarget.value?.path;\n  const i = path ? list.findIndex((n) => n.path === path) : -1;\n  return { index: i === -1 ? 0 : i + 1, total: i === -1 ? 0 : list.length };\n});\nasync function onPreviewNav(delta: number) {\n  const list = previewables.value;\n  const i = list.findIndex((n) => n.path === previewTarget.value?.path);\n  if (i === -1) return;\n  const next = list[i + delta];\n  if (!next) return;\n  /* wiring:e2 fxe — the next file is a single encrypted file: its unlock. */\n  if (isFxeRow(next) && !e2eActive.value && !next.e2e_root) {\n    showPreview.value = false;\n    void e2eFiles.open(next);\n    return;\n  }\n  /* wiring:e2 — inside an encrypted folder the next file is decrypted\n     BEFORE it becomes the preview target; switching first handed the viewer\n     the raw URL, i.e. ciphertext. */\n  if (e2eUnlocked.value && next.type === 'file') {\n    try {\n      await e2eFetchDecrypted(next);\n    } catch {\n      flashToast(t('e2e.decrypt_failed'));\n      return;\n    }\n  }\n  previewTarget.value = next;\n}\n/**\n * #110: the viewer saved the file in view (an app's interface, the code or\n * Markdown editor). Its row says the new size and time at once, here and in\n * the listing behind the viewer, instead of what the file was when it was\n * opened; the next listing of the folder brings the server's own numbers.\n */\nfunction onPreviewSaved(saved: { path: string; size?: number }): void {\n  const at = Date.now();\n  const rows = new Set<FileNode>([...files.value, ...displayOrder.value]);\n  if (previewTarget.value) rows.add(previewTarget.value);\n  for (const n of rows) {\n    if (n.path !== saved.path) continue;\n    if (typeof saved.size === 'number') n.size = saved.size;\n    n.last_modified = at;\n  }\n}\nconst selection = useSelection(() => (displayOrder.value.length ? displayOrder.value : files.value));\nwatch(\n  () => [...selection.selected.value],\n  () => {\n    emit(\n      'selection-change',\n      /* wiring:e2 names — `basename` stays what the server calls the item\n         (hosts pass it back to the API); an encrypted-names row adds its\n         plaintext as `display_name` for a host that draws it. */\n      selection.nodes.value.map((n) => ({\n        path: n.path,\n        basename: storedName(n),\n        type: n.type,\n        ...(n.e2e_stored ? { display_name: n.basename } : {}),\n      })),\n    );\n    // Presence focus: a single selected file is what the user is \"on\"; a\n    // multi-select or folder selection clears it.\n    // ⚠ wiring:e2 names — presence is broadcast by the SERVER to everyone in\n    // the folder: the stored name, never the plaintext one.\n    const focusFiles = selection.nodes.value.filter((n) => n.type === 'file');\n    // wiring:e2 vault — a vault's names never leave this tab.\n    realtime.setFocus(focusFiles.length === 1 && !vault.isVaultRow(focusFiles[0]) ? storedName(focusFiles[0]) : null);\n  },\n);\n\nconst clipboard = ref<ClipboardState>({ mode: null, items: [], sourcePath: null });\n\nconst capabilitiesData = ref<Capabilities | null>(null);\n\n/**\n * `GET /api/capabilities`, asked once — RETRIED, and AWAITABLE.\n *\n * ⚠⚠ This used to be a fire-and-forget `.then(…).catch(() => {})` in\n * `onMounted`, and that one swallowed catch was a silent, page-wide feature\n * kill. Everything gated on capabilities reads a ref that a failed or slow\n * call simply leaves null: app plugins (`pluginsEnabled` below), OnlyOffice,\n * draw.io, new-document types. Nothing retried, so ONE\n * unlucky request — a reload during a backend restart, a proxy hiccup — turned\n * every plugin deep link on that page load into a no-op, for the whole life of\n * the page, with nothing in the console to say why.\n *\n * ⚠⚠ And it was a RACE as well as a failure mode. A notification's deep link\n * arrives from the host (Explore.vue → `openAppTarget`) as soon as the row is\n * revealed, which can be before this answer lands; `openAppTarget` then read\n * `pluginsEnabled` as false and returned. Awaiting THIS PROMISE is the fix —\n * not a delay before trying, which would only move the coin toss.\n *\n * ⚠ `settled`, not `loaded`: a caller waits for the question to be ANSWERED,\n * including \"the server would not say\". Resolving only on success would hang\n * every awaiting caller on an instance that has no such endpoint.\n */\nconst CAPABILITIES_TRIES = 3;\nlet capabilitiesSettled: Promise<void> | null = null;\n\nfunction loadCapabilities(): Promise<void> {\n  if (capabilitiesSettled) return capabilitiesSettled;\n  if (!api.endpoints.capabilities) {\n    capabilitiesSettled = Promise.resolve();\n    return capabilitiesSettled;\n  }\n  capabilitiesSettled = (async () => {\n    for (let attempt = 1; attempt <= CAPABILITIES_TRIES; attempt++) {\n      try {\n        capabilitiesData.value = await api.capabilities();\n        return;\n      } catch (e) {\n        if (attempt === CAPABILITIES_TRIES) {\n          // ⚠ SAID, not swallowed. The host logs this (Explore.vue →\n          // onExplorerError) so \"my apps disappeared\" has an answer in the\n          // console instead of being indistinguishable from \"this instance\n          // has no apps\".\n          emit('error', {\n            message: `capabilities: ${(e as Error)?.message ?? String(e)}`,\n            context: { what: 'capabilities', attempts: attempt },\n          });\n          return;\n        }\n        await new Promise((r) => setTimeout(r, 200 * attempt));\n      }\n    }\n  })();\n  return capabilitiesSettled;\n}\n\n/* zaman:z3 — the two clock tiers only an explorer instance can know: the zone\n * its host configured, and the account behind its credential when that\n * credential is a person's. Ranked in lib/timezone, never here. */\nconst showTimeZone = ref(false);\n/** `/api/auth/me` once per mount — the account's time zone and the avatar ask\n *  the same question, and a second request for one answer is a cost for\n *  nothing. A failure is forgotten, so the next asker tries again. */\nlet meOnce: Promise<MeBody | undefined> | null = null;\ninterface MeBody {\n  user?: (AccountPerson & SettingsUser) | null;\n}\nfunction fetchMeOnce(): Promise<MeBody | undefined> {\n  if (!meOnce) {\n    meOnce = api.jsonFetch<MeBody | undefined>(`${connectionsBase(props.config)}/api/auth/me`);\n    meOnce.catch(() => {\n      meOnce = null;\n    });\n  }\n  return meOnce;\n}\n\nconst tzOwner = useExplorerTimeZone({\n  config: () => props.config,\n  capabilities: capabilitiesData,\n  fetchMe: () => fetchMeOnce(),\n});\n\n/* === The bell and the avatar, for a host that cannot fill the slot ========\n *\n * 2026-09-27, owner: the desktop app raised an OS notification for every row\n * and had nowhere inside its window to read one, and its header had no account\n * menu at all — while the web draws both. The desktop mounts\n * `<filex-explorer>`, which no slot reaches (see ExplorerConfig.brand), so the\n * explorer draws them itself when the host asks (`config.notifications`,\n * `config.account`). The components are the web's own, moved into this\n * package; only the transport (this explorer's credential) and the landing\n * (this explorer, navigated in place) are the explorer's.\n */\n\n/**\n * The feed the explorer's own bell reads — `null` unless the host asked.\n *\n * ⚠ Decided once, at setup, like `api` itself: a host that turns the bell on\n * or off re-mounts the explorer (the desktop swaps the whole element on an\n * account switch), and a feed created mid-life would start with no baseline.\n */\nconst notifFeed: NotificationFeed | null = props.config.notifications\n  ? (reactive(\n      createNotificationFeed({\n        // The server says each row in the language on screen (`lang=`).\n        transport: notificationsTransport(api.jsonFetch, connectionsBase(props.config)),\n        errorText: (e) => (e as Error)?.message || t('inspector.error'),\n        onRead: () => props.config.notifications?.onRead?.(),\n      }),\n    ) as NotificationFeed)\n  : null;\nlet notifTimer: ReturnType<typeof setInterval> | null = null;\nonMounted(() => {\n  const cfg = props.config.notifications;\n  if (!notifFeed || !cfg) return;\n  void notifFeed.refreshFeed();\n  // ⚠ One loop per explorer, and none at all when the host already polls\n  // (the desktop's main process does, for the OS notifications) — it hands\n  // the count over instead, and a count that disagrees with the list's\n  // refreshes the list (acceptCount).\n  if (cfg.poll !== false) notifTimer = setInterval(() => void notifFeed.syncUnread(), NOTIFY_POLL_MS);\n  cfg.onUnread?.((n) => void notifFeed.acceptCount(n));\n});\nonBeforeUnmount(() => {\n  if (notifTimer) clearInterval(notifTimer);\n  notifTimer = null;\n});\n// The words are the server's, said in the ACCOUNT's language: a host that\n// changes the language changes the account's (the web panel, the desktop app),\n// so another language on screen asks again and every row is said anew.\nwatch(locale, () => {\n  if (!notifFeed) return;\n  void notifFeed.refreshFeed();\n  if (notifFeed.panelOpen) void notifFeed.fetchMine();\n});\n\n/**\n * The administrators' door on the bell — when the host gave one AND the server\n * says this is an administrator: the capabilities' own verdict for this\n * credential, or the account's role when the avatar asked `/api/auth/me`. A\n * door drawn for everybody would send an ordinary person to a console that\n * bounces them.\n */\nconst notifManageHref = computed(() => {\n  const href = props.config.notifications?.manage?.href;\n  if (!href) return undefined;\n  const admin = callerAdmin.value || accountPerson.value?.role === 'admin';\n  return admin ? href : undefined;\n});\nfunction onNotifManage() {\n  props.config.notifications?.manage?.open();\n}\n\n/** Resolves once the first listing has landed — a reveal must not race it,\n *  or the mount's own `load()` would finish last and take the reader back. */\nlet markFirstLoad: () => void = () => {};\nconst firstLoad = new Promise<void>((resolve) => {\n  markFirstLoad = resolve;\n});\n\n/**\n * Take the reader to a notification's destination, IN THIS EXPLORER: the\n * folder with the row selected (and the app screen the notice asked for), the\n * Trash view with the deleted item selected, an app's home view, or — for a\n * share — the public page in a new window. `none` goes nowhere.\n *\n * ⚠⚠ The destination comes from `resolveNotificationTarget`, the ONE resolver\n * the web bell, the browser toast and the desktop OS toast all use; this only\n * carries it out. It is exposed (and forwarded by the web component) so the\n * desktop app hands a clicked OS notification to the same code its in-window\n * bell uses, instead of re-mounting the explorer and ticking checkboxes from\n * outside.\n *\n * ⚠ The row is selected through the explorer's own selection, after the\n * listing has finished — `onOpenOpOutput`'s shape. A host that ticked the\n * row's checkbox from outside had to retry for eight seconds, because the\n * listing clears the selection when it lands and the host could not see when.\n */\nasync function revealNotification(dest: NotificationDestination): Promise<boolean> {\n  await firstLoad;\n  if (dest.kind === 'none') return false;\n  if (dest.kind === 'share') {\n    // A public share page is an anonymous web page, not a place in this\n    // explorer — a new window (the desktop's window-open handler sends it to\n    // the system browser).\n    window.open(shareHref(dest.token, connectionsBase(props.config)), '_blank', 'noopener');\n    return true;\n  }\n  if (dest.kind === 'app') {\n    await loadCapabilities();\n    await pluginActions.refresh();\n    await openPluginHome(`${dest.plugin}/${dest.view}`);\n    return true;\n  }\n  const address = explorerPathOf(dest);\n  if (!address) return false;\n  // The explorer's own address forms: a view sentinel as it is, a folder as\n  // the breadcrumb hands it over (`onNavigate`).\n  if (address === TRASH_VIEW_PATH) await load(TRASH_VIEW_PATH);\n  else await load(multiStorageRoot.value ? wireToVirtual(address) : stripAdapter(address));\n  const pick = dest.select;\n  if (pick) {\n    const node = files.value.find((f) => sameRowPath(f.path, pick));\n    if (node) {\n      selection.click(node.path);\n      await nextTick();\n      const row = Array.from(rootEl.value?.querySelectorAll<HTMLElement>('[data-fe-path]') ?? []).find((el) =>\n        sameRowPath(el.getAttribute('data-fe-path'), pick),\n      );\n      row?.scrollIntoView({ block: 'center' });\n    }\n  }\n  if (dest.kind === 'folder' && dest.open) {\n    const path = dest.select || address;\n    await openAppTarget({ plugin: dest.open.plugin, action: dest.open.action, view: dest.open.view, path });\n  }\n  return true;\n}\n\n/** A bell row (or a full-list row) was clicked — already marked read. */\nfunction onNotificationOpen(item: NotificationRowData) {\n  void revealNotification(resolveNotificationTarget(item.target));\n}\n\n/* ── the avatar ─────────────────────────────────────────────────────────── */\n\n/* ── the account's language (#191) ─────────────────────────────────────── */\n\n/**\n * Takes the language of the account behind this credential (`users.locale`,\n * from `/api/auth/me`). Nobody signed in (a public link, a refused\n * credential): the host's stays. An account that holds NO language takes the\n * host's as its own - written to the account, so its notifications and every\n * other surface agree with what this explorer shows (the desktop's\n * pinToAdopt does the same; the web panel's sign-in has the server do it,\n * handlers/auth.go adoptSignInLanguage).\n */\nfunction adoptAccountLocale(): void {\n  fetchMeOnce()\n    .then((body) => {\n      const user = body?.user as { locale?: unknown } | null | undefined;\n      if (!user) return;\n      const own = typeof user.locale === 'string' ? user.locale.trim() : '';\n      if (own) {\n        accountLocale.value = own;\n        return;\n      }\n      const seed = String(props.config.locale ?? '').trim();\n      if (!seed) return;\n      userSettingsApi(api.jsonFetch, connectionsBase(props.config))\n        .updateProfile({ locale: seed })\n        .catch(() => {\n          /* an account that may not edit its profile keeps none; the host's\n             language stays on screen */\n        });\n    })\n    .catch(() => {\n      /* nobody signed in: the host's language */\n    });\n}\n// Only for a PERSON's credential - the same question the account's time zone\n// asks (useExplorerTimeZone): an app's token is nobody's account, and its\n// host's language stays.\nlet accountLocaleAsked = false;\nwatch(\n  () => (props.config.callerKind ?? capabilitiesData.value?.caller_kind) === 'user',\n  (person) => {\n    if (!person) {\n      accountLocale.value = '';\n      return;\n    }\n    if (accountLocaleAsked) return;\n    accountLocaleAsked = true;\n    adoptAccountLocale();\n  },\n  { immediate: true },\n);\n// The host moved to another language while mounted: follow it (a host that\n// binds its language to the account - the web panel, the desktop app - has\n// written the account already).\nwatch(\n  () => props.config.locale,\n  () => {\n    accountLocale.value = '';\n  },\n);\n\n/** Who is signed in — the host's word, or `/api/auth/me` with this credential. */\nconst accountPerson = ref<(AccountPerson & SettingsUser) | null>(props.config.account?.person ?? null);\nonMounted(() => {\n  if (!props.config.account || props.config.account.person) return;\n  fetchMeOnce()\n    .then((body) => {\n      accountPerson.value = body?.user ?? null;\n    })\n    .catch(() => {\n      /* the avatar draws its fallback glyph and label; nothing else waits on it */\n    });\n});\n\n/**\n * The toolbar's \"⋯\" rows, CLAIMED — the same contract the web page uses\n * (Toolbar `fe:header-menu`): setting `claimed` synchronously tells the\n * toolbar to stop drawing its own \"⋯\" for them, so the corner holds one menu.\n *\n * ⚠ Only when the host asked for the avatar. Without `config.account` this\n * explorer claims nothing and a listening page (the web's Explore.vue) keeps\n * the job it has always had. When it DOES claim, the event stops here, so a\n * page listener cannot fold the same rows into a second menu.\n */\nconst explorerMenuRows = ref<ExplorerMenuRow[]>([]);\nlet runExplorerMenuRow: ((key: string) => void) | null = null;\nfunction onOwnHeaderMenu(ev: Event) {\n  if (!props.config.account) return;\n  const detail = (ev as CustomEvent).detail as\n    | { items?: ExplorerMenuRow[]; run?: (key: string) => void; claimed?: boolean }\n    | undefined;\n  if (!detail || !Array.isArray(detail.items)) return;\n  detail.claimed = true;\n  ev.stopPropagation();\n  explorerMenuRows.value = detail.items;\n  runExplorerMenuRow = typeof detail.run === 'function' ? detail.run : null;\n}\nonMounted(() => rootEl.value?.addEventListener('fe:header-menu', onOwnHeaderMenu));\nonBeforeUnmount(() => rootEl.value?.removeEventListener('fe:header-menu', onOwnHeaderMenu));\n\nconst accountRows = computed<AccountAction[]>(() => {\n  const acc = props.config.account;\n  if (!acc) return [];\n  const person = accountPerson.value;\n  const hostRows = typeof acc.actions === 'function' ? acc.actions(person) : acc.actions ?? [];\n  // The person's own settings, first — opened HERE (below), not by the host.\n  const own = acc.settings\n    ? [{ key: SETTINGS_ROW, label: t('userSettings.open'), icon: 'account' }, ...hostRows]\n    : hostRows;\n  const tail = typeof acc.tail === 'function' ? acc.tail(person) : acc.tail ?? [];\n  // The rows whose control this explorer draws itself stay out of the menu\n  // (EXPLORER_DRAWN_ROWS) — measured in the desktop window: Grid, Gallery and\n  // Details sat in the avatar two inches from the view switcher and the ⓘ.\n  const drawn = EXPLORER_DRAWN_ROWS.filter((k) => k !== 'inspector' || props.config.showInfoPanel !== false);\n  // ⚠ With the settings dialog here, the three explorer rows whose control it\n  // carries leave the menu — the same trade the web page makes\n  // (Explore.vue ROWS_WITH_ANOTHER_DOOR): one door each.\n  const inDialog = acc.settings ? SETTINGS_DIALOG_ROWS : [];\n  return accountMenuRows(own, explorerMenuRows.value, {\n    omit: [...drawn, ...inDialog, ...(acc.omit ?? [])],\n    tail,\n  });\n});\n\n/** One place a row is acted on: the explorer's through its own handler (the\n *  SAME one its \"⋯\" uses), the host's through the host. */\nfunction onAccountSelect(key: string) {\n  const own = explorerRowKey(key);\n  if (own !== null) {\n    runExplorerMenuRow?.(own);\n    return;\n  }\n  if (key === SETTINGS_ROW && props.config.account?.settings) {\n    settingsOpen.value = true;\n    return;\n  }\n  props.config.account?.select(key, accountPerson.value);\n}\n\n/* ── the user settings dialog, in this window ───────────────────────────\n *\n * Owner, 2026-09-27: *\"Kullanıcı ayarları uygulamanın İÇİNDE açılsın\"* — the\n * desktop app used to send the person to the web app in their browser for it.\n * The dialog is the admin app's own (components/UserSettingsDialog.vue, moved\n * into this package); what it needs from a host is built here from this\n * explorer's own state: its credential for the account's endpoints, the person\n * `/api/auth/me` answered, its capabilities, its toast, the account zone it\n * registered (`tzOwner`) and its own theme mode.\n *\n * ⚠ The rows only some surfaces have — language, start page, one click or two,\n * the desktop-app downloads, browser notifications — are NOT given: an\n * explorer has no front door, and the desktop app keeps its language and its\n * click setting in its own Settings, so repeating them here would be two doors\n * to one switch.\n */\nconst SETTINGS_ROW = 'user-settings';\n/** The \"⋯\" rows whose control the dialog carries (Appearance, Compact list,\n *  Time zone). */\nconst SETTINGS_DIALOG_ROWS = ['theme', 'density', 'timezone'];\nconst settingsOpen = ref(false);\nconst settingsHost: UserSettingsHost = {\n  get locale() {\n    return String(locale.value);\n  },\n  get user() {\n    return accountPerson.value;\n  },\n  get isAdmin() {\n    return accountPerson.value?.role === 'admin';\n  },\n  get demoReadOnly() {\n    return capabilitiesData.value?.demo_mode === true;\n  },\n  get capabilities() {\n    return capabilitiesData.value as SettingsCapabilities | null;\n  },\n  api: userSettingsApi(api.jsonFetch, connectionsBase(props.config)),\n  setUser(u) {\n    accountPerson.value = { ...(accountPerson.value ?? {}), ...u };\n  },\n  toast(kind, message) {\n    showToast({ message }, kind === 'success' ? FLASH_TOAST_MS : ERROR_TOAST_MS);\n  },\n  errorText: (err, fallback) => (err as Error)?.message || fallback,\n  zone: accountZoneControl(tzOwner),\n  mode: {\n    get: (): SettingsThemeMode => {\n      const m = themeModePref.value === 'host' ? props.config.theme || 'auto' : themeModePref.value;\n      return m === 'light' || m === 'dark' ? m : 'auto';\n    },\n    set: (v) => setThemeModePref(v),\n  },\n};\n// Longest life a new share link may be given (server setting, days; 0 = no\n// ceiling). Both share dialogs derive their expiry choices from it.\n// THIS person's ceiling (the install's or their permission rules'); an older\n// server says only the install's.\nconst shareMaxTtlDays = computed(\n  () => capabilitiesData.value?.share_link_max_days ?? capabilitiesData.value?.share_max_ttl_days ?? 0,\n);\n\n/* === App plugins (docs/APP-PLUGINS-API.md) ==============================\n * Rows a WebAssembly plugin adds to the file menu, run as ops jobs. The\n * feature follows `capabilities.app_plugins.enabled` unless the host decides\n * (`config.plugins`); while it is off the explorer makes no plugin request.\n * The actions list is fetched once and shared across instances\n * (usePluginActions); the menu block is pure (lib/pluginMenu). */\nconst pluginsEnabled = computed<boolean>(() => {\n  if (typeof props.config.plugins === 'boolean') return props.config.plugins;\n  return capabilitiesData.value?.app_plugins?.enabled === true;\n});\nconst pluginActions = usePluginActions(api, () => pluginsEnabled.value);\n\n/** The open `modal` view: which plugin/view, its first surface, the row it was opened on. */\nconst pluginView = ref<{\n  plugin: string;\n  view: string;\n  /** null while the first screen is on its way (`openingPluginView`). */\n  surface: PluginSurface | null;\n  path?: string;\n  /** Every row the view was opened on — a menu action on a selection (#64). */\n  paths?: string[];\n  /** A `home` view is drawn full-size whatever the surface says. */\n  size?: 'xl';\n  /** The action's name, the dialog's title until the screen names itself. */\n  label?: string;\n  /** Which opening this dialog is, so a late answer can tell it is still wanted. */\n  ticket?: number;\n} | null>(null);\n\n/* ⚠ An action with a screen opens its dialog AT ONCE, saying it is loading.\n * The first screen is the app's answer to `run`, and until it came the menu\n * closed and nothing on the page moved. The ticket lets the answer know the\n * dialog it was for is still the one on screen: closed in the meantime, the\n * screen is dropped (a `run` that answers with a screen has queued nothing). */\nlet pluginViewTickets = 0;\n/**\n * How long an app's first screen may take before its dialog opens saying it\n * is loading. ⚠ #65 opened that dialog at once, at `md`, for every action\n * with a screen: an app that answered at once with a queued job flashed an\n * empty dialog, and one that answered with a larger screen opened at `md`\n * and jumped to its size. A prompt answer now opens the dialog on its own\n * screen at its own size — or, for a queued job, not at all.\n *\n * Measured (2026-09-26, the convert app's options screen on a local build):\n * `run` answered in ~430 ms, and a 400 ms grace still flashed \"Loading…\" for\n * one frame. 800 ms is past that and still under the ~1 s after which a\n * wait needs saying.\n */\nconst PLUGIN_OPENING_GRACE_MS = 800;\n/** The answer is late: the dialog says it is loading. */\nconst pluginOpeningLate = ref(false);\nlet pluginOpeningTimer: ReturnType<typeof setTimeout> | undefined;\nonBeforeUnmount(() => clearTimeout(pluginOpeningTimer));\nfunction openingPluginView(v: Omit<NonNullable<typeof pluginView.value>, 'surface' | 'ticket'>): number {\n  const ticket = ++pluginViewTickets;\n  pluginView.value = { ...v, surface: null, ticket };\n  pluginOpeningLate.value = false;\n  clearTimeout(pluginOpeningTimer);\n  pluginOpeningTimer = setTimeout(() => {\n    if (stillOpening(ticket)) pluginOpeningLate.value = true;\n  }, PLUGIN_OPENING_GRACE_MS);\n  return ticket;\n}\n/** The app's dialog is on screen: its screen has come, or it is late. */\nconst pluginViewShown = computed(\n  () => !!pluginView.value && (pluginView.value.surface !== null || pluginOpeningLate.value),\n);\nfunction stillOpening(ticket: number): boolean {\n  return ticket > 0 && pluginView.value?.ticket === ticket;\n}\n\n/**\n * v4 — an app's OWN interface opened as a dialog (a `modal` action whose view\n * has a `ui` file) or as a home screen: the frame, not a surface. One at a\n * time, like `pluginView`.\n */\nconst appFrameView = ref<{\n  plugin: string;\n  view: string;\n  placement: 'modal' | 'home';\n  ui: NonNullable<PluginViewRow['ui']>;\n  label: string;\n  files: { path: string; name: string; size?: number; mime?: string; readOnly?: boolean }[];\n} | null>(null);\n\n/** The file rows an interface is opened with (never more than it needs). */\nfunction appFrameFiles(targets: FileNode[]) {\n  return targets\n    .filter((n) => n.type === 'file')\n    .map((n) => ({\n      path: n.path,\n      name: n.basename,\n      size: n.size,\n      mime: n.mime_type,\n      readOnly: !!n.read_only || !nodeCanEdit(n),\n    }));\n}\n\n/** v4 — the views the server lists; `[]` while the feature is off. The rule\n *  for which app opens a file is lib/appViewer's, shared with the editor tab. */\nconst pluginViewList = computed<PluginViewRow[]>(() => (pluginsEnabled.value ? pluginActions.views.value : []));\n\n/** 0.50 - the administrator's open rules, by kind (Default apps). */\nconst pluginOpenRules = computed(() => (pluginsEnabled.value ? pluginActions.openRules.value : {}));\n\n/** What only this explorer knows about the handlers (lib/appViewer): 0.51 -\n *  ONLYOFFICE opens a .csv while it is configured and answering, the same\n *  answer an office document's Open reads (effectiveOnlyOfficeBase). */\nconst openOpts = computed<OpenHandlerOptions>(() => ({ onlyOffice: !!effectiveOnlyOfficeBase.value }));\n\n/** The handlers that open a file (lib/appViewer): on, in the administrator's\n *  order, and off. Inside an encrypted folder only filex's own (decrypting)\n *  viewer opens anything. */\n/** Only filex's own viewer opens it: an encrypted folder's file, a vault's. */\nfunction builtinOpenOnly(n: FileNode | null | undefined): OpenHandlers {\n  return { on: n && n.type === 'file' ? [{ id: 'builtin', view: null }] : [], off: [], custom: false };\n}\nfunction openHandlersOf(n: FileNode | null | undefined) {\n  if (e2eActive.value) return builtinOpenOnly(n);\n  /* wiring:e2 vault — a row of a vault (also seen from the other pane): the\n     same, only filex's own viewer, which reads it from the tab. */\n  if (vault.isVaultRow(n)) return builtinOpenOnly(n);\n  return openHandlersFor(pluginViewList.value, n, pluginOpenRules.value, openOpts.value);\n}\n\n/** The person's \"always open with\" choice for a file's kind (lib/openWith). */\nfunction personalOpenChoice(n: FileNode | null | undefined): string | null {\n  return n ? openWithChoice(openKindOf(n)) : null;\n}\n\n/**\n * Which app opens the file being previewed: what \"Open with\" chose, else the\n * person's own choice for the kind, else the first handler the administrator\n * left on (lib/appViewer) - each only while it is on. `builtin` is filex's\n * own viewer.\n */\nconst previewAppChoice = ref<string | null>(null);\nconst previewHandler = computed<OpenHandler | null>(() =>\n  e2eActive.value || vaultPreviewing.value /* wiring:e2 vault — an app would ask the server for the file by its path */\n    ? null\n    : pickOpenHandler(\n        pluginViewList.value,\n        previewTarget.value,\n        previewAppChoice.value,\n        pluginOpenRules.value,\n        personalOpenChoice(previewTarget.value),\n        openOpts.value,\n      ),\n);\nconst previewAppViewer = computed<PluginViewRow | null>(() => previewHandler.value?.view ?? null);\n/** 0.51 - the file being previewed opens in ONLYOFFICE (a .csv, by default\n *  while ONLYOFFICE is configured, or chosen in \"Open with\"). */\nconst previewInOffice = computed(() => isOfficeHandler(previewHandler.value));\n\n/** A handler as the file menu names it. */\nfunction openWithLabel(h: OpenHandler): string {\n  if (isOfficeHandler(h)) return t('ctx.open_with', { app: 'ONLYOFFICE' });\n  if (!h.view) return t('ctx.open_with_builtin');\n  return t('ctx.open_with', { app: pluginLabelOf(h.view.label, locale.value) || h.view.plugin });\n}\n\n/**\n * \"Open with\" rows for one file: every handler that is on for its kind, and\n * \"Choose an app…\" (the dialog that can make one the default) - only when\n * there is more than one way to open it.\n *\n * 0.51 - a kind ONLYOFFICE opens (a .csv) while ONLYOFFICE is not there: the\n * owner's rule for a missing service (lib/serviceGate) - an administrator\n * sees \"Open with ONLYOFFICE\" greyed with where to set it up, everybody else\n * nothing.\n */\nfunction openWithRows(sel: FileNode[]): ContextAction[] {\n  if (sel.length !== 1) return [];\n  const { on } = openHandlersOf(sel[0]);\n  const missing: ContextAction[] =\n    !e2eActive.value && sel[0]?.type === 'file' && officeOpensKind(openKindOf(sel[0])) && !openOpts.value.onlyOffice\n      ? [\n          {\n            key: `open-with:${ONLYOFFICE_VIEWER}`,\n            label: t('ctx.open_with', { app: 'ONLYOFFICE' }),\n            icon: 'open',\n            testid: `ctx-open-with-${ONLYOFFICE_VIEWER}`,\n            ...gateOnService(false, callerAdmin.value, t('ctx.needs_onlyoffice')),\n          },\n        ].filter((r) => !r.hidden)\n      : [];\n  if (on.length < 2 && missing.length === 0) return [];\n  return [\n    ...on.map((h) => ({ key: `open-with:${h.id}`, label: openWithLabel(h), icon: 'open', testid: `ctx-open-with-${h.id}` })),\n    ...missing,\n    ...(on.length < 2 ? [] : [{ key: 'open-with-choose', label: t('ctx.open_with_choose'), icon: 'open', testid: 'ctx-open-with-choose' }]),\n  ];\n}\n\n/* ── \"Choose an app…\" (OpenWithDialog) ───────────────────────────────── */\nconst openWithTarget = ref<FileNode | null>(null);\nconst openWithHandlers = computed<OpenHandler[]>(() => openHandlersOf(openWithTarget.value).on);\nconst openWithKind = computed(() => (openWithTarget.value ? openKindOf(openWithTarget.value) : ''));\nconst openWithCurrent = computed(() => {\n  const n = openWithTarget.value;\n  if (!n) return null;\n  return pickOpenHandler(pluginViewList.value, n, null, pluginOpenRules.value, personalOpenChoice(n), openOpts.value)?.id ?? null;\n});\n\n/** Open the file with the chosen handler; with `always`, keep it for the kind. */\nfunction openWithChosen(id: string, always: boolean): void {\n  const n = openWithTarget.value;\n  if (!n) return;\n  // ⚠ The kind is read off the FILE, not off openWithKind: that one is\n  // computed from openWithTarget, which is cleared on the next line, so it\n  // already answers '' here and \"Always\" would be dropped without a word.\n  const kind = openKindOf(n);\n  openWithTarget.value = null;\n  if (always && kind) setOpenWithChoice(kind, id);\n  previewNode(n);\n  previewAppChoice.value = id;\n  if (id !== 'builtin' && nodeCanEdit(n)) previewMode.value = 'edit';\n}\n\nconst stopFollowingOpenWith = followOpenWithChoices();\nonBeforeUnmount(stopFollowingOpenWith);\n\n/** The `inspector` views, for the details panel; `[]` while the feature is off. */\nconst pluginInspectorViews = computed<PluginViewRow[]>(() =>\n  pluginsEnabled.value ? pluginActions.views.value.filter((v) => v.placement === 'inspector') : [],\n);\n\n/** The `home` views, as the navigation panel's \"Apps\" rows. */\nconst pluginHomeApps = computed<NavApp[]>(() =>\n  pluginsEnabled.value\n    ? pluginActions.views.value\n        .filter((v) => v.placement === 'home')\n        .map((v) => ({ key: `${v.plugin}/${v.id}`, label: pluginLabelOf(v.label, locale.value) || v.id, icon: v.icon }))\n    : [],\n);\n\n/**\n * An \"Apps\" row: the host's own page for it when it has one (same tab, its\n * own address — `config.appHomePage`), else `GET …/views/{p}/{v}` with no\n * path, drawn full-size in a dialog.\n */\nasync function openPluginHome(key: string) {\n  const view = pluginActions.views.value.find((v) => `${v.plugin}/${v.id}` === key);\n  if (!view) return;\n  closeNavDrawer();\n  if (props.config.appHomePage === true) {\n    emit('open-app-home', { plugin: view.plugin, view: view.id });\n    return;\n  }\n  if (view.ui) {\n    appFrameView.value = {\n      plugin: view.plugin, view: view.id, placement: 'home', ui: view.ui,\n      label: pluginLabelOf(view.label, locale.value) || view.plugin, files: [],\n    };\n    return;\n  }\n  try {\n    const res = await api.pluginView(view.plugin, view.id);\n    if (!res?.surface) {\n      flashToast(t('plugin.view.error'));\n      return;\n    }\n    pluginView.value = { plugin: view.plugin, view: view.id, surface: res.surface, size: 'xl' };\n  } catch (e) {\n    flashToast((e as Error)?.message || t('plugin.view.error'));\n  }\n}\n/** An action whose manifest asks for confirmation, waiting for the answer. */\nconst pluginConfirm = ref<{ action: PluginActionRow; targets: FileNode[] } | null>(null);\n\n/** Menu rows for a selection — hidden in the trash, inside an encrypted\n *  folder and (through `selectionActionList`'s early return) on storage rows.\n *  On a read-only storage the actions the server says a click would be\n *  refused there (`read_only_ok: false`) are left out: the folder's own flag for rows listed in it, each\n *  row's storage for Recent / Starred / a tag / Home, where no folder is. */\nfunction pluginActionRows(sel: FileNode[]): ContextAction[] {\n  if (!pluginsEnabled.value) return [];\n  return pluginMenuRows(pluginActions.actions.value, sel, {\n    locale: locale.value,\n    trash: trashActive.value,\n    e2e: e2eActive.value,\n    readOnly: dirReadOnly.value || selReadOnly(sel),\n    // The level each row answers with — the same one the built-in verbs\n    // read — so an app's row a viewer could only be refused is not offered.\n    permOf: (n) => rowPerm(n as FileNode),\n    hasIcon: (name) => actionIconSvg(name) !== '',\n    // Greyed rows with the reason are an ADMINISTRATOR's (the server sends\n    // `gated` to them only; asked here too, so no other caller draws one).\n    needWords: callerAdmin.value ? (need) => gatedNeedWords(need, t) : undefined,\n  });\n}\n\n/** What a queued plugin job is called in a toast: its label, or the action id. */\nfunction pluginOpLabel(op: PendingOp): string {\n  return op.label || op.action || t('opc.kind.plugin');\n}\n\n/**\n * Where an app job's result lands — the tray's little \"new file\" / \"new\n * version\" chip.\n *\n * ⚠ Read from the CACHED ACTIONS LIST, because the ops row does not carry it:\n * the queue knows the plugin and the action, and the action's manifest output\n * is what the list already holds. Two consequences worth knowing rather than\n * discovering: a hidden action (never listed) and a surface that overrode the\n * output for that one job (`job.output`, which the browser never sees) both\n * answer `undefined`, and the chip is simply not drawn. A wrong chip would be\n * worse than none — it is the difference between \"your file was replaced\" and\n * \"a copy appeared\".\n */\nfunction pluginOutputModeOf(op: PendingOp): string | undefined {\n  if (!op.plugin || !op.action) return undefined;\n  return pluginActions.actions.value.find((a) => a.plugin === op.plugin && a.id === op.action)?.output_mode;\n}\n\n/** The menu row was chosen: confirm if the manifest asks, then run. */\nasync function onPluginAction(key: string, targets: FileNode[]) {\n  const action = pluginActions.byKey(key);\n  if (!action || targets.length === 0) return;\n  const confirm = pluginLabelOf(action.confirm, locale.value);\n  if (confirm) {\n    pluginConfirm.value = { action, targets };\n    return;\n  }\n  await runPluginAction(action, targets);\n}\n\nasync function onPluginConfirmed() {\n  const pending = pluginConfirm.value;\n  pluginConfirm.value = null;\n  if (pending) await runPluginAction(pending.action, pending.targets);\n}\n\n/**\n * A `page` action: open the view as a whole page in a new tab and DO NOT run\n * anything here. The tab asks for the surface itself (`GET …/views/…?path=`)\n * and the job is born from its own submit — the same `{surface}` conversation\n * a modal has, in a frame that has room for a document.\n *\n * ⚠ Returns false when the host has not said where its pages live\n * (`config.pluginPageBase`) or when the browser refused the tab; the caller\n * then falls back to the dialog. A `page` action that silently does nothing\n * because a pop-up blocker spoke is indistinguishable from a broken app.\n */\nfunction openPluginPage(action: PluginActionRow, targets: FileNode[]): boolean {\n  const view = action.view;\n  const base = props.config.pluginPageBase;\n  if (!view || base === undefined) return false;\n  const target = { plugin: action.plugin, view, path: targets[0]?.path };\n  const url = pluginPageUrl(base, target);\n  if (props.config.openPluginPage?.({ ...target, url }) === true) return true;\n  // ⚠⚠ `noopener` is NOT in the feature string, and that is not an oversight.\n  // Per the HTML spec a `window.open` that sets `noopener` returns **null**\n  // even when the tab opened perfectly — so a caller that reads the return as\n  // \"was it blocked?\" gets a false every single time. Measured: the wizard\n  // opened in its own tab AND a dialog appeared behind it, because this\n  // function answered false and the caller fell back to `…/run`. The opener\n  // is severed on the handle instead, which keeps the guarantee and leaves\n  // `null` meaning the one thing worth knowing: a pop-up blocker spoke.\n  const win = window.open(url, '_blank');\n  if (!win) {\n    flashToast(t('plugin.page_view.blocked'));\n    return false;\n  }\n  try {\n    win.opener = null;\n  } catch {\n    /* a browser that will not let us sever it still opened the page */\n  }\n  return true;\n}\n\n/**\n * POST run. `{op}` → the ops tray (same path a copy takes); `{surface}` → the\n * view dialog, whose submit will bring the `{op}` later.\n */\n/**\n * A mutation was refused. ⚠⚠ `423` is an APP LOCK, not a permission problem:\n * a named app is holding the file until a named date, and the person is\n * otherwise perfectly allowed to do what they just tried. Dropping it into\n * the generic path told them \"Error (423)\" and, once a caller mapped it onto\n * the permission text, \"you are not allowed to do this\" — a sentence they\n * can do nothing with. Every rename / move / delete catch goes through here\n * so there is exactly one place that decides.\n *\n * ⚠⚠ And every other refusal is SAID, on screen. It used to go out as\n * `emit('error')` only, and both first-party hosts write that event to the\n * console (web Explore.vue, desktop app.html): a paste, a drag-move, a\n * duplicate or a copy the server refused looked exactly like one that worked.\n * A dialog that shows the failure itself (rename, delete) passes `inDialog`,\n * so the sentence is not said twice; `words` is the sentence when the caller\n * has a more precise one than the failure's own (a rename's taken name).\n */\nfunction reportMutationError(\n  err: unknown,\n  context: Record<string, unknown>,\n  opts: { inDialog?: boolean; words?: string } = {},\n): void {\n  // A host that shows its own UI for `error` says so (`refusalToasts:\n  // false`); the event goes out either way, and a dialog still shows its own.\n  const toastIt = props.config.refusalToasts !== false;\n  const held = lockedRefusal(err);\n  if (held) {\n    if (toastIt) flashToast(lockWords(held, { t, formatDate, locale: locale.value }));\n  } else if (!opts.inDialog && toastIt) showToast({ message: opts.words ?? failureText(err) }, ERROR_TOAST_MS);\n  emit('error', { message: (err as Error)?.message ?? String(err), context });\n}\n\n/**\n * A dialog's request was refused: the words go INTO the dialog while it is the\n * one on screen, and are said as a toast once it is not — closed, or opened\n * again on another item, while the request was on its way (lesson #498). The\n * host hears it either way (`error`).\n */\nfunction refuseInDialog(\n  req: DialogRequest,\n  ticket: number,\n  err: unknown,\n  context: Record<string, unknown>,\n  words: string = failureText(err),\n): void {\n  reportMutationError(err, context, { inDialog: req.refuse(ticket, words), words });\n}\n\n/** A caught failure in the reader's words (lib/errorWords); `fallback` for\n *  a failure that carries none a person can read (default \"failed\"). */\nfunction failureText(err: unknown, fallback: string = t('toast.failed')): string {\n  return sayFailure(err, fallback, { t, callerAdmin: callerAdmin.value }).text;\n}\n\nasync function runPluginAction(action: PluginActionRow, targets: FileNode[]) {\n  const label = pluginLabelOf(action.label, locale.value);\n  if (isPagePlacement(action.view_placement) && openPluginPage(action, targets)) return;\n  // v4 — the action opens the app's own interface: the frame, nothing run.\n  if (action.ui) {\n    appFrameView.value = {\n      plugin: action.plugin, view: action.view || action.id, placement: 'modal', ui: action.ui,\n      label: label || action.plugin, files: appFrameFiles(targets),\n    };\n    return;\n  }\n  // ⚠ `paths` too: the screen's later events must name the same files the\n  // run did, or its second screen talks about targets[0] alone (#64).\n  const shell = {\n    plugin: action.plugin,\n    view: action.view || action.id,\n    path: targets[0]?.path,\n    paths: targets.map((n) => n.path),\n    label,\n  };\n  const ticket = action.view ? openingPluginView(shell) : 0;\n  try {\n    const res = await pluginActions.run(action, targets);\n    if (res.surface) {\n      if (action.view && !stillOpening(ticket)) return;\n      pluginView.value = { ...shell, surface: res.surface, ticket: ticket || ++pluginViewTickets };\n      return;\n    }\n    if (stillOpening(ticket)) pluginView.value = null;\n    if (res.op) onPluginOpQueued(res.op, label);\n  } catch (e) {\n    if (stillOpening(ticket)) pluginView.value = null;\n    const err = e as Error & { status?: number; detail?: string };\n    const detail = String(err?.detail ?? '');\n    const held = lockedRefusal(err);\n    if (held) flashToast(lockWords(held, { t, formatDate, locale: locale.value }));\n    else if (err?.status === 422 && detail.includes('not_applicable')) flashToast(t('plugin.not_applicable'));\n    else if (err?.status === 409 && detail.includes('read_only')) flashToast(t('plugin.read_only'));\n    // Said in the failure words (the server's sentence for a refusal a person\n    // can act on, the app's failure otherwise) — never a raw message.\n    else showToast({ message: failureText(err, t('plugin.failed', { label })) }, ERROR_TOAST_MS);\n  }\n}\n\n/** A job was enqueued (by `run` or by a view's submit): track it, say so. */\nfunction onPluginOpQueued(op: Record<string, unknown>, label?: string) {\n  pendingOps.register(op);\n  const name = label || (typeof op.label === 'string' ? op.label : '') || t('opc.kind.plugin');\n  flashToast(t('plugin.queued', { label: name }));\n}\n\n/**\n * A notification's deep link (`target.open`): show the file and open what the\n * app asked for on it — its action, or its view.\n *\n * ⚠⚠ Why this is exposed rather than a config prop. A bell click does not\n * remount anything: the person is already standing in the explorer, the hash\n * changes, the listing reloads. An `initialPluginAction` prop would fire once,\n * at mount, and every click after the first would land on the file and stop\n * there — which is the bug this whole field exists to fix (\"please sign\" that\n * drops you in a folder instead of in the signing screen).\n *\n * ⚠ The row may not be in the listing yet (a fresh tab, a folder still\n * loading), so a path that is not on screen is carried as a bare node. The\n * server re-checks `applies` and the ACL on every run, so the worst case is\n * an honest 422 rather than a wrong screen.\n *\n * ⚠⚠ It AWAITS the capability answer before reading `pluginsEnabled`. That\n * flag comes from `GET /api/capabilities`, which the explorer asks for in its\n * own `onMounted` — so whether this function found it filled was a matter of\n * which of two unrelated requests came back first. Measured as \"roughly one\n * opening in eight the signing screen does not come up\"; it was never the\n * plugin LIST (that was already awaited two lines down), it was the flag\n * gating it. Awaiting the promise removes the timing question instead of\n * betting on it.\n *\n * ⚠ Every refusal below now SAYS something. Four `return false`s in this path\n * were silent, and a deep link that silently does nothing is the hardest\n * possible bug to report: the person clicked a notification, the folder\n * opened, and the thing they were asked to do never appeared.\n */\nasync function openAppTarget(p: {\n  plugin: string;\n  action?: string;\n  view?: string;\n  path: string;\n}): Promise<boolean> {\n  if (!p.plugin || !p.path) return false;\n  await loadCapabilities();\n  if (!pluginsEnabled.value) {\n    emit('error', {\n      message: 'app plugins are off on this instance - deep link ignored',\n      context: { what: 'openAppTarget', plugin: p.plugin, path: p.path },\n    });\n    return false;\n  }\n  await pluginActions.refresh();\n  const node: FileNode =\n    files.value.find((f) => f.path === p.path) ??\n    ({ path: p.path, basename: p.path.split('/').pop() ?? p.path, type: 'file' } as FileNode);\n  if (p.action) {\n    const action = pluginActions.byKey(`plugin:${p.plugin}/${p.action}`);\n    if (!action) {\n      // The server validated this pair when it stored the target, so getting\n      // here means the app was removed, disabled, or is not visible to this\n      // account — all of which are worth a sentence.\n      flashToast(t('plugin.not_applicable'));\n      emit('error', {\n        message: `no such plugin action: ${p.plugin}/${p.action}`,\n        context: { what: 'openAppTarget', path: p.path },\n      });\n      return false;\n    }\n    await onPluginAction(pluginActionKey(action), [node]);\n    return true;\n  }\n  if (!p.view) return false;\n  // A `page` view is never listed in `views[]` (only inspector/home are), so\n  // its placement is learned from an action that opens it. Nothing else\n  // knows, and guessing \"page\" for everything would take a dialog-sized\n  // screen into a tab of its own.\n  const owner = pluginActions.actions.value.find((a) => a.plugin === p.plugin && a.view === p.view);\n  // ⚠ A page that could not get its tab - a host that keeps no page address\n  // (`pluginPageBase`), or a browser that blocked a tab nobody clicked for\n  // (a finished job's `open` arrives with no click behind it) - opens in the\n  // dialog below, as the \"new tab was blocked\" toast says it will and as a\n  // menu click already did (runPluginAction). It used to stop there.\n  if (owner && isPagePlacement(owner.view_placement) && openPluginPage(owner, [node])) {\n    return true;\n  }\n  try {\n    const res = await api.pluginView(p.plugin, p.view, p.path);\n    if (!res?.surface) {\n      flashToast(t('plugin.view.error'));\n      return false;\n    }\n    pluginView.value = { plugin: p.plugin, view: p.view, surface: res.surface, path: p.path };\n    return true;\n  } catch (e) {\n    flashToast((e as Error)?.message || t('plugin.view.error'));\n    return false;\n  }\n}\n\n/**\n * v3 §3.0 — a surface answered \"go to this file, and start that screen\".\n *\n * ⚠⚠ In-app, through `openAppTarget`, rather than by navigating the window\n * to the deep link: the person is already standing in the explorer, and a\n * reload would throw away the folder, the selection and the tab strip to\n * arrive at a screen the explorer can simply open. The deep-link ADDRESS is\n * the right answer for a frame with no explorer under it (a plugin `page`\n * view navigates); it is the wrong one here.\n *\n * ⚠ The screen that asked is closed first — an answer carrying `done` has\n * already closed it, and one that does not would otherwise sit over the\n * screen the person was sent to.\n *\n * ⚠ No permission check here, and that is deliberate: the host verified the\n * screen belongs to the plugin that answered, and the server re-checked the\n * path against THIS person's rights before the answer left, dropping the\n * request rather than refusing the screen. A second, weaker copy of that\n * rule in the browser would be the kind of check that drifts.\n */\nasync function onSurfaceOpen(plugin: string, req: { path: string; action?: string; view?: string }): Promise<void> {\n  if (!plugin || !req?.path) return;\n  pluginView.value = null;\n  // The folder first, so the person can SEE where they were taken — the same\n  // walk `onOpenOpOutput` makes for a job's output.\n  const sep = req.path.indexOf('://');\n  const storageName = sep === -1 ? '' : req.path.slice(0, sep);\n  const rel = stripAdapter(req.path).replace(/^\\/+|\\/+$/g, '');\n  const slash = rel.lastIndexOf('/');\n  const dirRel = slash === -1 ? '' : rel.slice(0, slash);\n  const target = multiStorageRoot.value && storageName ? (dirRel ? `${storageName}/${dirRel}` : storageName) : dirRel;\n  try {\n    await load(target);\n  } catch {\n    /* the folder may be gone; the screen below still tries the file */\n  }\n  await openAppTarget({ plugin, action: req.action, view: req.view, path: req.path });\n}\n\n/**\n * \"Open\" on a finished job: go to the output's folder and select it. The\n * output is an adapter-qualified path (`docs://reports/nda-signed.pdf`); the\n * folder is loaded the way a search hit's is, then the row is picked out of\n * the fresh listing by its exact path.\n */\nasync function onOpenOpOutput(_id: number, path: string) {\n  const sep = path.indexOf('://');\n  const storageName = sep === -1 ? '' : path.slice(0, sep);\n  const rel = stripAdapter(path).replace(/^\\/+|\\/+$/g, '');\n  const slash = rel.lastIndexOf('/');\n  const dirRel = slash === -1 ? '' : rel.slice(0, slash);\n  const target = multiStorageRoot.value && storageName ? (dirRel ? `${storageName}/${dirRel}` : storageName) : dirRel;\n  await load(target);\n  const node = files.value.find((f) => f.path === path);\n  if (node) {\n    selection.click(node.path);\n    return;\n  }\n  flashToast(t('plugin.output_missing'));\n}\n/* === /App plugins === */\n\n// Creative UI state: starred / tags / recently-opened. The component\n// helpers (StarButton, TagPicker, RecentlyOpened) handle their own\n// API calls — the explorer just tracks the cross-row state needed to\n// render inline stars and keep the recents tray in sync.\n//\n// ⚠⚠ 0.54 (task #207, audit D4): whether a row is starred is the ROW's own\n// fact - every listing and search row the server sends carries\n// `starred: true` (one query per answer on the server). The explorer used to\n// fetch `star/list?limit=500` once and match ids, so a person's 501st star\n// was never drawn and a star set on another device or by an agent appeared\n// only after a reload. What is left here is the optimistic part: a star the\n// person just toggled, until the next answer says it itself.\nconst starOverrides = ref(new Map<number, boolean>());\nconst showRecents = ref(false);\nconst showTagPicker = ref(false);\nconst tagPickerNode = ref<FileNode | null>(null);\nconst recentRefreshKey = ref(0);\n\n/** Starred, as the person last set it here, else as the row says. */\nfunction isStarred(n: FileNode): boolean {\n  if (typeof n.id !== 'number') return false;\n  const o = starOverrides.value.get(n.id);\n  return o ?? (n as Record<string, unknown>).starred === true;\n}\n\nfunction setStarOverride(id: number, value: boolean) {\n  const next = new Map(starOverrides.value);\n  next.set(id, value);\n  starOverrides.value = next;\n}\n\n/** The main pane's starred ids, for the views (FilePane adds its own rows'). */\nconst starredIds = computed(() => {\n  const out = new Set<number>();\n  for (const n of files.value) if (isStarred(n)) out.add(n.id as number);\n  for (const [id, on] of starOverrides.value) if (on) out.add(id);\n  return out;\n});\n\nfunction onStarChange(n: FileNode, value: boolean) {\n  if (typeof n.id !== 'number') return;\n  setStarOverride(n.id, value);\n}\n\n/* === yildiz:s1 — starring as an ACTION ================================\n * The star shipped as an indicator in ONE view: `StarButton` was rendered by\n * ListView and nowhere else, so a user in grid view (the mode the navigation\n * panel's own screenshots show) had a Starred view with no way to fill it.\n * It is a verb, like tagging — so it is a menu entry beside Tags, a chip on\n * every card, and a key.\n *\n * ⚠ ONE implementation of the request: `lib/star.ts`. StarButton calls it,\n * this calls it. A menu cannot render a component, but it must not grow its\n * own fetch either — that is the second path that drifts.\n */\n/** Which of `targets` can carry a star: files the server knows by id.\n *\n * Empty when the identity surfaces are suppressed, which is the one\n * chokepoint the context menu, the toolbar and the keyboard action all go\n * through — so the affordance disappears everywhere at once rather than in\n * the two places somebody remembered. Offering to star a file while the\n * Starred view is hidden would write into a list the person cannot open,\n * and under a shared app token that list belongs to everyone at once. */\nfunction starableNodes(targets: FileNode[]): FileNode[] {\n  if (!identitySurfaces.value) return [];\n  return targets.filter((n) => typeof n.id === 'number' && n.type === 'file');\n}\n\n/** True when EVERY starable target is starred — i.e. the action reads\n *  \"Unstar\". A mixed selection reads \"Star\" and stars the rest, which is the\n *  behaviour that needs no explanation. */\nfunction selectionAllStarred(targets: FileNode[]): boolean {\n  const list = starableNodes(targets);\n  return list.length > 0 && list.every((n) => isStarred(n));\n}\n\n/**\n * Toggle the star on a selection. Optimistic like the button, and rolled back\n * per node on failure — a partial failure must not leave the set lying about\n * what the server holds.\n */\nasync function toggleStar(targets: FileNode[]) {\n  const list = starableNodes(targets);\n  if (list.length === 0) return;\n  const next = !selectionAllStarred(list);\n  const opts = {\n    apiBase: props.config.apiBase ?? '',\n    authHeaders: () => buildAuthHeaders(),\n    authCredentials: api.credentialsMode(),\n  };\n  for (const n of list) setStarOverride(n.id as number, next);\n  let failed = 0;\n  await Promise.all(\n    list.map(async (n) => {\n      try {\n        await setNodeStarred(n.id as number, next, opts);\n      } catch {\n        failed += 1;\n        setStarOverride(n.id as number, !next);\n      }\n    }),\n  );\n  if (failed > 0) flashToast(t('star.failed'));\n  // Starring is what fills the Starred view; if that IS the view on screen,\n  // an unstar has to remove the row instead of leaving a listing that\n  // disagrees with its own heading.\n  if (navView.value === 'starred') await loadNavView('starred');\n}\n/* === /yildiz:s1 === */\n\nasync function markRecent(n: FileNode) {\n  if (typeof n.id !== 'number') return;\n  try {\n    const base = props.config.apiBase ?? '';\n    await fetch(`${base}/api/files/manager/recent`, {\n      method: 'POST',\n      headers: await buildAuthHeaders({ 'Content-Type': 'application/json' }),\n      credentials: api.credentialsMode(),\n      body: JSON.stringify({ node_id: n.id }),\n    });\n    recentRefreshKey.value += 1;\n  } catch {\n    // Silent — the open succeeds, recent tracking is best-effort.\n  }\n}\n\nfunction openTagPickerFor(n: FileNode) {\n  if (typeof n.id !== 'number') return;\n  tagPickerNode.value = n;\n  showTagPicker.value = true;\n}\n\n/* etiket:t1 — the user just changed a node's tags, so the cached \"every tag\n * that exists\" list is wrong RIGHT NOW, which is the only staleness anybody\n * notices. Drop it and re-ask; if a tag view is on screen, refresh it too —\n * removing a file's tag has to remove it from the listing that is named after\n * that tag. */\n/**\n * etiket:t1 — \"show me everything tagged this\", from a FILE.\n *\n * ⚠⚠ The missing half of the tag feature, reported 2026-09-13 (\"taglediğim\n * dosya klasör tag'ine gitmiyor\"): the view existed, the panel's Tags section\n * listed every tag, and from a file's own chip there was no way in — you had to\n * read the word off the chip and go find it again in the panel.\n *\n * ⚠ It is `loadTagView`, not a variant of it. The panel's Tags section, a\n * restored tab, a pasted `#.tag~invoices` and now a chip all land in the one\n * loader, so there is one definition of what a tag view IS.\n *\n * ⚠ The modal is closed on the way. It is opened over a listing to EDIT tags;\n * once the chip has navigated, leaving it up means a dialog about one file\n * covering the view of all the others that share its tag.\n */\nfunction openTagView(tag: string, kind: TagKind | '' = '') {\n  showTagPicker.value = false;\n  void loadTagView(tag, kind);\n}\n\nfunction onNodeTagsChanged() {\n  // The cache is already dropped (lib/tags `announceTagsChanged`), so this\n  // re-ask is real — and unforced, so every explorer on the page shares one.\n  void loadNavTags();\n  if (navView.value === 'tag' && navTag.value) void loadTagView(navTag.value, navTagKind.value);\n}\n/* etiket:k2 — the ONE path a tag write reaches the panel by: the module-level\n * announcement, which survives the picker being closed before the save\n * answered (a component emit does not) and reaches every explorer on the page.\n * The picker's own `change` / the details panel's `tags-changed` are no longer\n * wired here, or each save would reload the list twice. */\nconst offTagsChanged = onTagsChanged(onNodeTagsChanged);\nonBeforeUnmount(offTagsChanged);\n\nfunction onRecentOpen(entry: { id: number; storage_id?: number; path: string; name: string }) {\n  // RecentlyOpened emits the bare row. The same converter Recent / Starred /\n  // a tag / Home use gives openNode a row with its storage-qualified path AND\n  // its own `perm` + `read_only`, so the editor-vs-preview split reads the\n  // row's level, not the folder's. The bare synthesis stays as the fallback\n  // for a row the converter cannot address (no storage name at a\n  // multi-storage root) — it was the only shape until 2026-09-19.\n  const node =\n    nodeRowToFileNode(entry as unknown as Record<string, unknown>) ??\n    ({\n      type: 'file',\n      path: entry.path,\n      basename: entry.name,\n      extension: (entry.name.split('.').pop() || '').toLowerCase(),\n      id: entry.id,\n    } as unknown as FileNode);\n  showRecents.value = false;\n  openNode(node);\n}\n\n/**\n * Right-click on a row of the Recently-opened tray: the SAME menu a listing\n * row gets (owner: \"CONTEXT MENÜ HER YERDE AYNI OLMALI\"). The tray's row is\n * the raw node row the endpoint answers with, so it goes through\n * `nodeRowToFileNode` like Recent / Starred / a tag / Home do and arrives\n * with its own `perm` + `read_only`; `onContextTarget` then treats it like a\n * Home card — a target outside this pane's listing. The tray closes first,\n * as it does on open: it is a modal over the listing, and the verb the menu\n * runs (Rename, Move to…) opens a dialog of its own.\n */\nfunction onRecentContext(row: Record<string, unknown>, ev: MouseEvent) {\n  const node = nodeRowToFileNode(row);\n  if (!node) return;\n  showRecents.value = false;\n  void onContextTarget(node, ev);\n}\n\n// Resolution order for each external viewer: explicit config override → live\n// backend probe. The probe is the source of truth: an operator can flip the\n// service \"on\" but if last_check failed (state='error') we still hide the\n// entry so users don't get 503s on click. Explicit config wins because\n// embedders sometimes terminate TLS in front of filex and the backend can't\n// see the public URL.\nconst effectiveOnlyOfficeBase = computed<string | null>(() => {\n  if (props.config.onlyOfficeBase) return props.config.onlyOfficeBase;\n  const ext = capabilitiesData.value?.external?.onlyoffice;\n  if (ext && !isExternalUsable(ext)) return null;\n  return capabilitiesData.value?.onlyoffice_url || null;\n});\n\n/**\n * Could this caller SET UP a missing optional service? The server's answer\n * (`caller_admin` — an administrator who can reach the instance settings;\n * a tenant admin and an API token cannot), never a role guessed here. It picks\n * between the owner's two answers for an action that needs a service that is\n * not there: \"disabled with a reason for administrators, hidden for everybody\n * else\" (lib/serviceGate).\n */\nconst callerAdmin = computed(() => capabilitiesData.value?.caller_admin === true);\n\n/** Does the server run this change as a job of its operations queue when asked\n *  (`queued=1`)? A folder rename and a restore from the trash are one request\n *  per object on an object store; inside the request they outlasted the proxy\n *  with nothing on screen. An older server does not say, and is asked the old\n *  way. */\nfunction serverQueues(kind: 'rename' | 'restore' | 'purge'): boolean {\n  return capabilitiesData.value?.queued?.includes(kind) === true;\n}\n\nconst effectiveOnlyOfficeConfigEndpoint = computed<string | null>(() => {\n  if (!effectiveOnlyOfficeBase.value) return null;\n  return api.endpoints.onlyOfficeConfig || null;\n});\n\nconst effectiveDrawioUrl = computed<string | null>(() => {\n  const override = props.config.drawioUrl || props.config.drawioBase;\n  if (override) return override;\n  const ext = capabilitiesData.value?.external?.drawio;\n  if (ext && !isExternalUsable(ext)) return null;\n  return capabilitiesData.value?.drawio_url || null;\n});\n\n/* belge:n1 — what the SERVER can create, crossed with what WE could open.\n * `null` (a backend older than the feature) hides the entry entirely. */\nconst newDocTypes = computed(() => capabilitiesData.value?.newdoc_types ?? null);\nconst canNewDocument = computed(() => {\n  const list = newDocTypes.value;\n  if (!list || list.length === 0) return false;\n  return list.some((ty) =>\n    ty.requires === 'onlyoffice'\n      ? !!effectiveOnlyOfficeBase.value\n      : ty.requires === 'drawio'\n        ? !!effectiveDrawioUrl.value\n        : true,\n  );\n});\n\n/* === Drafts (issue #71) =================================================\n * A new document is a DRAFT until its first save: New document writes it\n * into the person's own drafts area of the storage they chose, the editor\n * opens on it, and nothing appears in the folder until it is saved. The\n * server says whether it keeps drafts for this caller (`capabilities.drafts`\n * — a person acting for themselves: not an app token, not a confined embed);\n * without that answer New document creates the file, as it always did.\n *\n * This holds the explorer's half: the count on the panel's \"Drafts\" row, the\n * Drafts view's rows and its three verbs. The editor's half (the Save bar,\n * the close question) is PreviewModal's, so every host that mounts a viewer\n * gets it — not only this explorer.\n */\nconst draftsEnabled = computed(() => !!capabilitiesData.value?.drafts);\n/** The panel row's badge — a count, never a notification. */\nconst draftCount = ref(0);\nconst draftRows = ref<DraftDto[]>([]);\nconst draftLimit = ref(0);\nconst draftsLoading = ref(false);\n/** A verb is running on this draft (its row's actions are greyed). */\nconst draftBusyKey = ref<string | null>(null);\n\nasync function refreshDraftCount(): Promise<void> {\n  if (!draftsEnabled.value) {\n    draftCount.value = 0;\n    return;\n  }\n  try {\n    const { count, limit } = await api.drafts.count();\n    draftCount.value = count;\n    draftLimit.value = limit;\n  } catch {\n    /* A badge that could not be read keeps what it last said. */\n  }\n}\n\nasync function loadDraftRows(): Promise<void> {\n  draftsLoading.value = true;\n  try {\n    const list = await api.drafts.list();\n    draftRows.value = list.drafts;\n    draftLimit.value = list.limit;\n    draftCount.value = list.count;\n  } catch (err) {\n    draftRows.value = [];\n    const msg = failureText(err);\n    emit('error', { message: msg, context: { op: 'nav-view:drafts' } });\n    flashToast(msg);\n  } finally {\n    draftsLoading.value = false;\n  }\n}\n\n/** After any change to a draft: the badge, and the view when it is open. */\nasync function afterDraftsChanged(): Promise<void> {\n  if (navView.value === 'drafts') await loadDraftRows();\n  else await refreshDraftCount();\n}\n\nwatch(draftsEnabled, (on) => void (on ? refreshDraftCount() : (draftCount.value = 0)), { immediate: true });\n\nfunction extOfName(name: string): string {\n  const dot = name.lastIndexOf('.');\n  return dot > 0 ? name.slice(dot + 1).toLowerCase() : '';\n}\n\n/**\n * Open a draft in its editor — the same viewer a file opens in, on the\n * draft's path; the viewer finds the draft by that path and draws its bar.\n * A host that opens files in windows of its own (the desktop app) gets it\n * the same way it gets any file.\n */\nfunction openDraft(d: DraftDto, appChoice: string | null = null): void {\n  const node = {\n    type: 'file',\n    path: d.path,\n    basename: d.name,\n    extension: extOfName(d.name),\n    storage: d.storage,\n    size: d.size,\n    file_size: d.size,\n    mime_type: d.mime ?? '',\n    visibility: 'private',\n    extra_metadata: {},\n  } as unknown as FileNode;\n  if (openSurface(props.config, node) === 'host') {\n    emit('file-opened', { path: node.path, basename: node.basename });\n    return;\n  }\n  // The type it was MADE as: `LICENSE` made as Plain text opens in the text\n  // editor (#56), as it did when it was created.\n  previewOpenAs.value = d.type ? { path: node.path, ext: d.type } : null;\n  previewAppChoice.value = appChoice;\n  previewTarget.value = node;\n  previewMode.value = 'edit';\n  showPreview.value = true;\n}\n\n/** \"Saved to …\" — the file is where it belongs now. */\nfunction sayDraftSaved(saved: SavedDraft): void {\n  flashToast(t('draft.saved_to', { name: saved.name, folder: draftFolderLabel(saved.targetDir) }));\n}\n\nconst draftListSave = useDraftSave(() => (draftsEnabled.value ? api.drafts : null), (err) => failureText(err));\n\nasync function saveDraftFromList(d: DraftDto): Promise<void> {\n  if (draftBusyKey.value) return;\n  draftBusyKey.value = d.key;\n  try {\n    const saved = await draftListSave.save(d);\n    if (saved) {\n      sayDraftSaved(saved);\n      await afterDraftsChanged();\n    }\n  } catch (err) {\n    showToast({ message: failureText(err) }, ERROR_TOAST_MS);\n  } finally {\n    draftBusyKey.value = null;\n  }\n}\n\n/** Delete from the Drafts view: to the trash, like any deleted file. */\nasync function discardDraftFromList(d: DraftDto): Promise<void> {\n  if (draftBusyKey.value) return;\n  draftBusyKey.value = d.key;\n  try {\n    await api.drafts.discard(d.key);\n    flashToast(t('draft.discarded', { name: d.name }));\n    await afterDraftsChanged();\n  } catch (err) {\n    showToast({ message: failureText(err) }, ERROR_TOAST_MS);\n  } finally {\n    draftBusyKey.value = null;\n  }\n}\n\nfunction onPreviewDraftSaved(saved: SavedDraft): void {\n  sayDraftSaved(saved);\n  void afterDraftsChanged();\n  // Standing in the folder it went to: show it there.\n  if (!navView.value && !trashMode.value) void load();\n}\n\nfunction onPreviewDraftDiscarded(): void {\n  const name = previewTarget.value?.basename ?? '';\n  flashToast(t('draft.discarded', { name }));\n  void afterDraftsChanged();\n}\n\n/** The New document dialog's \"Open Drafts\" (at the draft limit). */\nfunction openDraftsFromNewDocument(): void {\n  showNewDocument.value = false;\n  void loadNavView('drafts');\n}\n\n// Upload\nconst uploadJobs = ref<UploadJob[]>([]);\nconst fileInputEl = ref<HTMLInputElement | null>(null);\n\n// Modals\nconst showNewFolder = ref(false);\nconst showNewDocument = ref(false); /* belge:n1 */\nconst showRename = ref(false);\nconst showDelete = ref(false);\nconst showPreview = ref(false);\nconst showArchiveCreate = ref(false);\nconst showArchiveExtract = ref(false);\nconst showArchivePassword = ref(false);\nconst archiveTargets = ref<FileNode[]>([]);\nconst archiveTarget = ref<FileNode | null>(null);\nconst archiveDestinationDir = ref('');\n/** A \"Create archive\" request is on its way. */\nconst archiveCreateBusy = ref(false);\n/**\n * The archives an extraction is being prepared for (the server downloads and\n * inspects the whole archive before it can queue the job), by path. ⚠ Per\n * archive: #67 held one flag for creating AND extracting, so an \"Extract\n * here\" was dropped, silently, whenever an unrelated archive was being made.\n */\nconst archiveExtracting = ref<Set<string>>(new Set());\nconst archiveError = ref('');\nconst archiveInPane = ref(false);\nconst archivePasswordError = ref('');\nconst archivePasswordAction = ref<{\n  target: FileNode;\n  dest: string;\n  inPane: boolean;\n} | null>(null);\n\nconst archiveSuggestedName = computed(() => {\n  if (archiveTargets.value.length !== 1) return 'archive';\n  return archiveTargets.value[0]?.basename.replace(/\\.[^.]+$/, '') || 'archive';\n});\nconst ARCHIVE_CREATE_FORMATS: ArchiveCreateFormat[] = ['zip', '7z', 'tar', 'tar.gz', 'tar.bz2', 'tar.xz'];\n/* The formats THIS server can make (capabilities.archive): every one but a\n * plain ZIP needs 7-Zip there, so a server without it offers ZIP alone. A\n * server with no `archive` block predates archive creation: nothing is\n * offered, and \"Create archive…\" is not in the menu. */\nconst archiveAllowedFormats = computed<ArchiveCreateFormat[]>(() => {\n  const configured = capabilitiesData.value?.archive?.allowed_formats ?? [];\n  return configured.filter((format): format is ArchiveCreateFormat => ARCHIVE_CREATE_FORMATS.includes(format));\n});\nconst archiveDefaultFormat = computed<ArchiveCreateFormat>(() => {\n  const configured = capabilitiesData.value?.archive?.default_format;\n  if (configured && archiveAllowedFormats.value.includes(configured)) return configured;\n  return archiveAllowedFormats.value.includes('7z') ? '7z' : archiveAllowedFormats.value[0] ?? 'zip';\n});\nconst archiveEncryption = computed(() => capabilitiesData.value?.archive?.encryption !== false);\nconst archiveSuggestedFolder = computed(() =>\n  (archiveTarget.value?.basename || 'archive')\n    .replace(/\\.(tar\\.(gz|bz2|xz)|zip|7z|rar|tgz|gz|bz2|xz)$/i, '') || 'archive',\n);\nconst renameTarget = ref<FileNode | null>(null);\n/* The request each dialog sends (composables/useDialogRequest): busy while it\n * is on its way — the dialog cannot be closed under it (Modal `busy`) and a\n * second press sends nothing (a folder rename on an object store copies every\n * object inside the request; a second Save met the half-copied folder and was\n * refused as \"already here\") — and its refusal IN the dialog while that dialog\n * is on screen, a toast once it is not (lesson #498). Every opening is a new\n * session: an earlier request's busy state and refusal never show against a\n * new target.\n *\n * Why the dialog shows the refusal at all: a failure used to be only EMITTED,\n * which the stock web app logs to the console — the dialog stayed open and\n * silent, the one answer a person can act on (the name is taken) unseen. */\nconst renameReq = useDialogRequest(showRename);\nconst newFolderReq = useDialogRequest(showNewFolder);\nconst deleteReq = useDialogRequest(showDelete);\nconst { busy: renameBusy, error: renameError } = renameReq;\nconst { busy: newFolderBusy, error: newFolderError } = newFolderReq;\nconst { busy: deleteBusy, error: deleteError } = deleteReq;\n/* ui-fix — does the open rename/delete/new-folder modal belong to the side\n * pane? (the menu is identical to the main pane's; this routes the mutation\n * to the right one.) */\nconst mutationInPane = ref(false);\nconst previewTarget = ref<FileNode | null>(null);\nconst previewMode = ref<'edit' | 'view'>('edit');\n/* #56 — the type a document was just CREATED as, for the viewer's `openAs`:\n * `LICENSE` made as Plain text opens in the text editor although its name\n * picks no viewer. Tied to that one path (prev/next to another file drops it)\n * and forgotten when the viewer closes — a later open goes by the file itself,\n * like every other open. */\nconst previewOpenAs = ref<{ path: string; ext: string } | null>(null);\nconst previewOpenAsExt = computed(() =>\n  previewOpenAs.value && previewTarget.value?.path === previewOpenAs.value.path\n    ? previewOpenAs.value.ext\n    : null,\n);\nwatch(showPreview, (open) => {\n  if (!open) previewOpenAs.value = null;\n  // Drafts: a draft's editor closed — its row changed (and may be gone).\n  if (!open && draftsEnabled.value && previewTarget.value && draftKeyOf(previewTarget.value.path)) {\n    void afterDraftsChanged();\n  }\n});\nconst showPerm = ref(false);\nconst permTarget = ref<FileNode | null>(null);\n/* tasi:m1 — \"Move to…\" / \"Copy to…\" ask the SAME dialog where; only the mode\n * differs, so there is one piece of state and not two dialogs. */\nconst showDestPicker = ref(false);\nconst destPickerMode = ref<'move' | 'copy'>('move');\nconst destPickerTargets = ref<FileNode[]>([]);\n/* wiring:e2 vault — what the folder chooser knows of vaults: the ones this\n   tab knows, and the vault the chosen items are in (null: outside every\n   vault). Inside a vault only that vault is a destination; outside, none is. */\nconst destPickerVaultRoots = computed(() => {\n  void vault.version.value;\n  void showDestPicker.value;\n  return vault.roots();\n});\nconst destPickerVaultFrom = computed(() => {\n  const first = destPickerTargets.value[0];\n  return first ? vault.rootOf(first.path) : null;\n});\nconst destPickerBusy = ref(false);\n\n/* === koru:k1 — inspector (details) panel ===\n * Open/closed preference persists under `filex.inspector`; the panel itself\n * mounts with v-if so the closed state leaves zero DOM behind. */\nconst INSPECTOR_LS_KEY = 'filex.inspector';\nconst showInspector = ref<boolean>(\n  (() => {\n    try {\n      return localStorage.getItem(INSPECTOR_LS_KEY) === '1';\n    } catch {\n      return false;\n    }\n  })(),\n);\nfunction persistInspector(v: boolean) {\n  try {\n    localStorage.setItem(INSPECTOR_LS_KEY, v ? '1' : '0');\n  } catch {\n    /* quota / private mode */\n  }\n}\nfunction toggleInspector() {\n  showInspector.value = !showInspector.value;\n  persistInspector(showInspector.value);\n}\nfunction openInspector() {\n  if (!showInspector.value) {\n    showInspector.value = true;\n    persistInspector(true);\n  }\n}\nfunction closeInspector() {\n  if (showInspector.value) {\n    showInspector.value = false;\n    persistInspector(false);\n  }\n}\n\n/* === gezinti:g1 — navigation panel (SideNav) =============================\n * One explorer with the navigation everybody already knows, collapsible so the\n * existing UI keeps its width when somebody does not want it (GitHub #14).\n *\n * The panel is NOT gated on role or profile: administrators get it too, and\n * so is everything else the header and the panel draw. Gating any of it would\n * be exactly the \"one behaviour on one surface\" split this shared package\n * exists to prevent — which is precisely what a per-role profile in the web\n * app turned out to be. */\nconst uiProfile = computed(() => resolveUiProfile(props.config.uiProfile));\n/**\n * Is this the REDUCED explorer — one pane, one folder, list/grid only?\n *\n * ⚠⚠ This is the only question `uiProfile` still answers, and it is a question\n * about REDUCTION, never about LOOK. The shell (the header with its one search\n * field, the filter row, \"+ New\", the Folders/Files sections, the info panel's\n * tabs, the storage line) is what filex IS — it is not a profile anything can\n * be put into, so nothing below reads a profile to decide whether to draw it.\n * The day that distinction blurs again, the profiles become two products with\n * one name, which is exactly what this pass undid.\n *\n * ⚠ There are TWO values, and the rule for everything else — a typo, or the\n * profile removed after v0.40.0 — lives in `lib/uiProfile` together with the\n * argument for it. Nothing here branches on a retired name; this file asks one\n * question of a value that has already been resolved.\n */\nconst simpleUi = computed(() => uiProfile.value === 'simple');\n\n/**\n * ⚠ `showInfoPanel` is documented public API (\"whether the info panel toggle\n * is visible\") and until now nothing read it: an embedder who set it to false\n * got the toggle anyway. Default stays TRUE, so every existing embed —\n * including the admin SPA, which passes `showInfoPanel: true` — is unchanged.\n * It hides the TOGGLE, exactly as documented; the inspector itself stays\n * reachable from the context menu, which is what the option says.\n */\nconst infoPanelToggle = computed(() => props.config.showInfoPanel !== false);\n/* === surucu:d1 — the shell (GitHub #14, the reporter's mockups) ===========\n * There is no `driveShell` computed any more, and its absence is the point:\n * the filter row, \"+ New\", the info-panel tabs and the storage line are drawn\n * because this is filex, not because a caller passed a string. Grep for\n * `surucu:d1` to find them; every one of them is now unconditional or gated on\n * something real (a folder to filter, a person to have a quota).\n */\n\nconst SIDENAV_LS_KEY = 'filex.sidenav';\nconst sideNavExpanded = ref<boolean>(\n  (() => {\n    try {\n      const v = localStorage.getItem(SIDENAV_LS_KEY);\n      if (v === '1') return true;\n      if (v === '0') return false;\n    } catch {\n      /* private mode / embed with site data blocked */\n    }\n    // No stored choice: expanded. A collapsed default would ship a navigation\n    // panel most people never discover, which is the problem it was built for.\n    return true;\n  })(),\n);\nfunction persistSideNav(v: boolean) {\n  try {\n    localStorage.setItem(SIDENAV_LS_KEY, v ? '1' : '0');\n  } catch {\n    /* quota / private mode — the choice just will not survive the session */\n  }\n}\n/**\n * Narrow mode: the panel is a drawer over the listing, and this is its open\n * state. Deliberately NOT persisted and NOT the same ref as the desktop\n * collapse: at 390px a remembered \"expanded\" would reopen the drawer on top of\n * the files every single time the explorer mounts.\n */\nconst navDrawerOpen = ref(false);\n/**\n * Is the panel part of this deployment at all? On by default everywhere —\n * except under `rootPath`, where there is no storage list to show and the views\n * would list files from outside the folder the embed was confined to.\n */\nconst sideNavEnabled = computed(() => props.config.sideNav ?? !rootPathProp);\nconst navVisible = computed(\n  () => sideNavEnabled.value && (isNarrow.value ? navDrawerOpen.value : true),\n);\n/**\n * Is the navigation panel already offering Trash as a destination?\n *\n * ⚠ Keyed to `sideNavEnabled`, NOT to `navVisible`. Three cases decided here,\n * and each one is a judgement about whether the person has a way to the bin\n * that is not this row:\n *\n *   - collapsed to the icon rail → OFFERING. The entry is still rendered, still\n *     one click, still labelled for a screen reader; only its text is gone.\n *   - the drawer under 560px, closed → OFFERING. The toolbar's panel toggle is\n *     on screen at every width, so the destination is one tap away. Keying this\n *     to `navVisible` instead would add and remove a row from the LISTING every\n *     time somebody opened or closed the drawer — the folder changing under\n *     them for a reason that has nothing to do with the folder.\n *   - no panel at all (`sideNav: false`, or the default under `rootPath`) → NOT\n *     offering, and the row stays. That is the case it was invented for: a\n *     listing with no other door to the bin.\n *\n * `trashVisible: false` is handled inside the helper and outranks all of it —\n * it means no Trash anywhere, panel entry included.\n */\nconst navOffersTrash = computed(\n  () => sideNavEnabled.value && props.config.trashVisible !== false,\n);\n\n/** What the toolbar toggle reports as pressed. */\nconst navToggleOn = computed(() =>\n  isNarrow.value ? navDrawerOpen.value : sideNavExpanded.value,\n);\nfunction toggleSideNav() {\n  if (!sideNavEnabled.value) return;\n  if (isNarrow.value) {\n    navDrawerOpen.value = !navDrawerOpen.value;\n    return;\n  }\n  sideNavExpanded.value = !sideNavExpanded.value;\n  persistSideNav(sideNavExpanded.value);\n}\nfunction closeNavDrawer() {\n  navDrawerOpen.value = false;\n}\n\n/** Storages the caller reaches only through a grant — marked in the panel. */\nconst sharedStorageNames = ref<string[]>([]);\n\n/**\n * The Connections entries — \"How to connect\" and \"API keys\" — and the two\n * overlays they open. Both surfaces already lived in this package\n * (ConnectionsPanel, TokensPanel) and neither was reachable from inside the\n * explorer: our own web app wired the buttons in its page shell, so an\n * embedder's users had no path to a protocol guide or to the API token those\n * guides tell them to use.\n *\n * ⚠ Not gated on role. The backend decides — ConnectionsPanel is the protocol\n * guides and the credentials they need, which every caller may read, and\n * /api/tokens caps every scope against the caller's own role.\n */\nconst connectionsEnabled = computed(() => props.config.connections ?? !simpleUi.value);\n\n/**\n * paylas:m1 — may the panel draw its \"My shares\" row?\n *\n * ⚠ `=== true`, not `?? <default>`: the row's screen is the HOST's, this\n * component only announces the intent, and an embedder who has not said yes\n * has not built that screen. Silence therefore has to mean no — the inverse of\n * `connectionsEnabled` above, whose panel this component draws itself and can\n * always deliver on.\n */\nconst mySharesEnabled = computed(() => props.config.mySharesVisible === true);\n\n/**\n * Is this caller an integration rather than a person (backend migration 00030)?\n *\n * A filex API token authenticates AS its owner, so from here a shared embed\n * token and somebody's own token are indistinguishable — only the server knows\n * which kind it is, and it says so in `capabilities.caller_kind`. A host that\n * already knows can say so with `config.callerKind`, which wins — purely to\n * spare the flash of a Starred row that appears and then disappears when\n * capabilities land.\n *\n * ⚠ Defaults to \"person\" in every unknown state — no config, capabilities not\n * back yet, or a server too old to answer. The cost of guessing wrong that way\n * is one row too many for a moment; guessing the other way would hide Recent\n * and API keys from every ordinary user of every older server.\n */\nconst callerIsApp = computed(\n  () => (props.config.callerKind ?? capabilitiesData.value?.caller_kind) === 'app',\n);\n/**\n * The identity-bearing surfaces: API keys, Recent, Starred, Shared with me.\n * ⚠ Suppression is per token KIND, never per role — a viewer is still a person\n * with their own recents. And it is not the whole panel: Upload, the storages,\n * Trash and \"How to connect\" stay useful inside an embed.\n */\nconst identitySurfaces = computed(() => !callerIsApp.value);\n/**\n * #162 - may the panel draw its \"App store\" row? ONE rule for every host\n * (lib/appStoreRow): the host has the page (`config.appStorePage`), the caller\n * is a person, and the server shows this person the screen - asked here, once\n * per host decision and caller kind, never by the host. The web SPA and the\n * desktop app read the same answer from the same code.\n */\nconst appStoreVisible = ref(false);\nlet appStoreAsk = 0;\nwatch(\n  () => [props.config.appStorePage === true, callerIsApp.value] as const,\n  async ([hostHasPage, isApp]) => {\n    const seq = ++appStoreAsk;\n    if (!appStoreAsks(hostHasPage, isApp)) {\n      appStoreVisible.value = false;\n      return;\n    }\n    const status = await api.appStoreStatus();\n    // A newer question (the caller kind landed meanwhile) owns the answer.\n    if (seq === appStoreAsk) appStoreVisible.value = appStoreRowShown(hostHasPage, isApp, status);\n  },\n  { immediate: true },\n);\nconst appStoreEnabled = computed(() => appStoreRowShown(props.config.appStorePage === true, callerIsApp.value, { visible: appStoreVisible.value }));\nconst showConnections = ref(false);\nconst showTokens = ref(false);\nfunction openConnections() {\n  showTokens.value = false;\n  showConnections.value = true;\n}\nfunction openTokens() {\n  // Belt and braces: the panel entry is gone for an app token, but a host may\n  // also open this overlay from its own chrome, and /api/tokens would answer\n  // that caller with a 403 it has nowhere to show.\n  if (callerIsApp.value) return;\n  showConnections.value = false;\n  showTokens.value = true;\n}\nfunction closeOverlays() {\n  showConnections.value = false;\n  showTokens.value = false;\n}\nconst anyOverlayOpen = computed(() => showConnections.value || showTokens.value);\n/** ConnectionsPanel reports its own failures; surface them the way the\n *  explorer surfaces everything else rather than swallowing them. */\nfunction onConnectionsError(err: unknown) {\n  const msg = err instanceof Error ? err.message : String(err);\n  emit('error', { message: msg, context: { op: 'connections' } });\n  flashToast(msg);\n}\n\n/**\n * View modes the toolbar offers. `simple` drops gallery: a four-way switcher\n * is one of the things #14 named as power-user chrome, and gallery is the one\n * nobody outside a photo folder reaches for.\n */\nconst allowedViewModes = computed<ViewMode[] | undefined>(() =>\n  simpleUi.value ? ['list', 'grid'] : undefined,\n);\n// A stored 'gallery' outlives a switch to the simple profile, and the button\n// that would take the user back out of it is the one the profile hides.\nwatchEffect(() => {\n  if (simpleUi.value && viewMode.value === 'gallery') viewMode.value = 'grid';\n});\n\n/* === surucu:d1 — the filter row =========================================\n * Three chips over the listing in hand: Type · Modified · Size.\n *\n * ⚠ CLIENT-SIDE, and that is the honest place for them, not a shortcut. The\n * listing endpoint reads exactly six parameters (`action`, `path`, `filter`,\n * `storage`, `parent`, `cache`) and has no `limit`/`offset` either — so the\n * rows in hand ARE the folder, and filtering them here answers the whole\n * question rather than \"the first page of it\". Wiring a chip to a `min_size`\n * the server never reads would look identical and change nothing.\n *\n * ⚠ Reset on navigation. A filter that survives a folder change makes the next\n * folder look empty, and the reason is off-screen the moment you scroll.\n */\nconst driveFilters = ref<DriveFilters>({ ...EMPTY_FILTERS });\n/* gorunum:v1-advsearch — declared HERE, beside the row's own state, and not\n   down with the rest of the dialog's wiring: `filtersOn` and `displayFiles`\n   read them, and a ref declared after a computed that touches it is the exact\n   \"Cannot access X before initialization\" this file was taken down by once\n   before (see the navVisible watcher note in onMounted). */\nconst advFilters = ref<DriveFilters | null>(null);\nconst advScope = ref<AdvScope>('name');\n/**\n * surucu:d1-sort — WHERE THE ROWS IN HAND GOT THEIR ORDER, and the only place\n * in the bundle that knows. `files` is a search answer exactly when\n * `searchQuery` is set (`load()` picks `action=search` / `/api/files/search`\n * off that same ref), and a search answer is RANKED: the backend scores every\n * candidate (`internal/search/scorer.go`, ported from VS Code's Quick Open)\n * and returns best-first.\n *\n * ⚠⚠ Owner's ruling, 2026-09-12, verbatim (translated from Turkish): \"the\n * filter in advanced search should belong to it alone. The other, ordinary\n * search and the ⌘K side must stay in relevance order.\" Measured the next day\n * on qldemo with the query `s`: the server ranked `Documents/server.ts` first\n * and the list drew it FIFTEENTH of seventeen, because the active sort key was\n * applied to everything the listing shows. Nothing looked broken — the grid\n * and the list agreed with each other and every test was green — because\n * re-alphabetising a ranked list is indistinguishable from sorting a folder.\n *\n * ⚠ Both scopes, one answer: the advanced dialog's content search lands in\n * `files` through this same ref, so it is covered without a second rule. The\n * ⌘K palette never needed one — it renders its own hits straight from\n * `paletteGlobalSearch` and reaches for no comparator (verified, not assumed).\n *\n * ⚠ Declared HERE, above `displayFiles`, for the reason the `advFilters` note\n * above gives: a ref/computed declared after the computed that reads it is the\n * \"Cannot access X before initialization\" this file was taken down by once.\n *\n * ⚠ And NOT a module-level flag in `lib/sortOrder`: the split view's secondary\n * pane only ever lists (`SecondaryPane.loadPane` calls `index`), so a global\n * \"we are searching\" would silently unsort the pane that is not.\n */\nconst listingOrder = computed<ListingOrder>(() =>\n  searchQuery.value || serverOrderedView.value ? 'relevance' : 'sort',\n);\n/* pane:p1 — `filtersOn` and `displayFiles` USED TO LIVE HERE, and they are the\n * clearest example of what this refactor is for: they compose the filter row's\n * narrowing, the advanced dialog's narrowing and the sort into the rows a\n * listing draws — a PANE's job, done once in the host, which is why the split\n * view's right-hand half had no filter row for two months and would have had\n * to grow a second copy of this to get one. They are `FilePane`'s\n * `displayFiles` / `filtersOn` now, and every pane has them.\n *\n * ⚠ `advFilters` stays here, and it is not an exception: it belongs to the\n * advanced SEARCH, which is the window's (one search field, one dialog, one\n * set of results). It is handed to the main pane as `extra-filters`, which is\n * a narrowing composed AFTER the pane's own chips rather than instead of them.\n * ⚠ `listingOrder` stays here for the same reason and is passed as `order`:\n * whether the rows in hand were RANKED by the server is a fact about the\n * answer the host fetched, not a preference the pane holds. The split pane\n * only ever lists a folder, so it is never in relevance mode — which is\n * exactly why a global \"we are searching\" flag would have been wrong.\n */\n\n/* gorunum:v2-topbar / pane:p1 — the breadcrumb's \"Subfolders\" chevron used to\n * be fed from here, which is why only the left-hand pane had one: the host\n * knows ONE folder's listing and there are two panes. It is derived inside\n * `FilePane` now, from the rows that pane is holding. */\n\nfunction clearDriveFilters() {\n  advFilters.value = null /* gorunum:v1-advsearch — the escape hatch clears BOTH */;\n  setDriveFilters({ ...EMPTY_FILTERS });\n}\nfunction setDriveFilters(v: DriveFilters) {\n  driveFilters.value = v;\n  // A selection the filter just hid would still be what Delete acts on, with\n  // nothing on screen to say so.\n  selection.clear();\n}\nwatch(\n  () => `${currentPath.value}|${navView.value}`,\n  () => {\n    if (filtersActive(driveFilters.value)) driveFilters.value = { ...EMPTY_FILTERS };\n    /* gorunum:v1-advsearch — the advanced filters belong to the search that\n       set them, so they survive the rebase a search causes (a search moves\n       `currentPath` to the storage root, which is what fires this watcher) and\n       are dropped the moment there is no search left to belong to. */\n    if (!searchQuery.value) advFilters.value = null;\n  },\n);\n\n/* === gorunum:v1-advsearch — the Advanced search dialog ===================\n *\n * One results surface: whatever the dialog asks for lands in `files` through\n * the same `load()` a toolbar search lands in. There is no second list, no\n * \"search results\" page and no separate empty state — the dialog composes a\n * query, the explorer runs it, and the rows arrive where rows always arrive.\n *\n * Two things the dialog cannot do itself, and they live here because this is\n * where the API client is:\n *\n *  1. **Scope routing.** `name` is served by the manager's\n *     `?action=search&filter=…`, which is what the toolbar already uses and\n *     what returns adapter-qualified rows. `content`/`all` exist ONLY on\n *     `/api/files/search` (the manager's search action hardcodes\n *     `search.ScopeName`), whose rows are raw node rows — so they are mapped\n *     onto the listing shape below.\n *  2. **The live count**, which is a real query. See `advSearchCount`.\n */\nconst showAdvSearch = ref(false);\n/* etiket:k2 — the dialog offers the person's tags, each with its kind, as\n   picks under the Tags box. Asked for when it opens, through the same\n   module-level cache as the panel's list, so it costs nothing when the panel\n   already has them — and works in an embed that shows no panel at all. */\nconst advKnownTags = ref<TagItem[]>([]);\nwatch(showAdvSearch, async (open) => {\n  if (!open) return;\n  advKnownTags.value = await fetchAllTags({\n    apiBase: props.config.apiBase ?? '',\n    authHeaders: () => buildAuthHeaders(),\n    authCredentials: api.credentialsMode(),\n  });\n});\n/** The folder the dialog was opened from, frozen for its lifetime. */\nconst advPathBase = ref('');\n\n/**\n * Whether the content scopes may be offered at all.\n *\n * ⚠ This USED to be a capability check: `/api/files/search` answered with a\n * `storage_id` and no storage name, the explorer has no id→name map, and a row\n * wearing the wrong drive's name is worse than a scope we did not offer — so\n * the tabs were gated to single-storage installs, where the guess could not be\n * wrong. `handlers/search.go` now labels every hit with its drive's name (and\n * its owner) in `describeHits`, so there is nothing left to guess and the\n * scopes are offered everywhere. Kept as a computed rather than deleted: the\n * prop is public API, and an embedder pointed at an older backend still gets\n * hits with no `storage` — which `hitToNode` (lib/searchHit) falls back for,\n * row by row.\n */\nconst advContentAvailable = computed(() => true);\n\n/** How many hits we ask the content endpoint for. The manager's search action\n *  uses 250 internally; matching it keeps the two scopes comparable. */\nconst ADV_CONTENT_LIMIT = 250;\n\n/**\n * #207 (audit D6) — the narrowing that travels WITH a search: the advanced\n * dialog's choices (type, dates, sizes, folder, owner) and the \"show hidden\n * files\" choice, as the server's parameters (lib/advSearch advFilterParams).\n * The server applies them before it cuts its page, so the rows that come\n * back are already the answer; the browser narrows nothing after them.\n */\nfunction searchNarrow(f: DriveFilters | null = advFilters.value): Record<string, string> {\n  return advFilterParams(f ?? EMPTY_FILTERS, Date.now(), { showHidden: showHiddenFiles.value });\n}\n\n/** True while the rows on screen are a search the BROWSER ran (inside an\n *  encrypted-names folder the server cannot read the names): only then is\n *  the advanced narrowing still the pane's to apply. */\nconst searchRanLocally = ref(false);\n\n/** Run one advanced search and hand back the rows - narrowed by the server -\n *  and whether the answer was cut, in the server's own word (`truncated`). */\nasync function advFetchRows(\n  scope: AdvScope,\n  query: string,\n  target: string,\n  narrow: Record<string, string> = searchNarrow(),\n): Promise<{ rows: FileNode[]; truncated: boolean; local: boolean }> {\n  if (scope === 'name') {\n    /* wiring:e2 names — inside an encrypted-names folder the name search is\n       the browser's own (the server cannot read the names). */\n    const local = await e2eSearchInside(target, query);\n    const resp = local ?? (await api.search(target, query, narrow));\n    return {\n      rows: filterListing(await e2eNames.decorate(resp.files, { root: resp.e2e_root || null })),\n      truncated: advSearchTruncated(resp.files.length, MANAGER_SEARCH_PAGE, resp.truncated),\n      local: !!local,\n    };\n  }\n  const page = await api.globalSearchPage(query, { limit: ADV_CONTENT_LIMIT, scope, narrow });\n  const storageName = adapter.value || (props.config.storages ?? [])[0]?.name || '';\n  return {\n    rows: filterListing(await e2eNames.decorate(page.hits.map((h) => hitToNode(h, storageName)))),\n    truncated: advSearchTruncated(page.hits.length, ADV_CONTENT_LIMIT, page.truncated),\n    local: false,\n  };\n}\n\n/** The target `load()` would use for the current position. */\nfunction advTarget(): string {\n  const requested = currentPath.value ?? '';\n  return multiStorageRoot.value ? virtualToWire(requested) : qualify(requested);\n}\n\n/**\n * The dialog's live count — a REAL query, not an estimate.\n *\n * ⚠ It costs exactly what pressing Search costs: the same request, the same\n * rows, the same client-side narrowing. There is no cheaper way to answer it —\n * neither endpoint has a count mode — so the dialog prints that the number is\n * produced by running the search rather than letting it look free.\n *\n * `capped` is the other half of the honesty: when the server returned as many\n * hits as it was allowed to, the client-side filters narrowed a window and the\n * number describes the rows that came back, not the storage.\n */\nasync function advSearchCount(req: AdvSearchRequest): Promise<AdvCountResult> {\n  const query = advQueryString(req);\n  // The dialog's choices go to the server with the query (#207): the rows\n  // that come back ARE the count. Only a search the browser ran itself (an\n  // encrypted-names folder) is narrowed here, by the same choices.\n  const { rows, truncated, local } = await advFetchRows(req.scope, query, advTarget(), searchNarrow(req.filters));\n  const shown = local && filtersActive(req.filters) ? applyFilters(rows, req.filters) : rows;\n  return {\n    count: shown.length,\n    capped: truncated,\n  };\n}\n\nfunction openAdvancedSearch(seed: string) {\n  advPathBase.value = qualify(currentPath.value ?? '') || '';\n  advSearchSeed.value = seed;\n  showAdvSearch.value = true;\n}\nconst advSearchSeed = ref('');\n\nfunction applyAdvancedSearch(req: AdvSearchRequest) {\n  showAdvSearch.value = false;\n  advScope.value = req.scope;\n  advFilters.value = filtersActive(req.filters) ? { ...req.filters } : null;\n  const q = advQueryString(req);\n  // Same text as the box already holds → the `searchQuery` watcher will not\n  // fire, so the reload (which the new scope/filters need) is issued here.\n  if (q === searchQuery.value) void load();\n  else searchQuery.value = q;\n}\n\n/** Typing in the toolbar field is a plain search again — it replaces whatever\n *  the dialog set rather than silently inheriting filters the user cannot see\n *  from a box that shows only words. */\nfunction onToolbarSearch(v: string) {\n  advFilters.value = null;\n  advScope.value = 'name';\n  /* gorunum:v3-shell — Home has no listing behind it, and `searchQuery` is\n     watched by `load()`. Setting it here re-entered loadNavView('home') on\n     every keystroke — two fetches per pause, for a narrowing that could not\n     appear anywhere. The words are not lost: Enter hands them to the command\n     palette (Toolbar `searchEscalates`), which is the \"everywhere\" search the\n     field's own ⌘K chip advertises. */\n  if (navView.value === 'home') return;\n  searchQuery.value = v;\n}\n/* === /gorunum:v1-advsearch === */\n\n/**\n * surucu:d1 — what the header field says it will search: the folder you are\n * standing in, by name. At a storage root that is the storage; in a panel view\n * (\"Recent\", a tag) it is that view's own name, because searching from there\n * searches what is on screen.\n */\nconst driveScopeLabel = computed(() => {\n  /* ⚠ The field searches the WHOLE storage (`?action=search` filters by\n     storage id only — see handlers/manager.go vfSearch), and at the virtual\n     root every storage. Naming the open FOLDER here (\"Search in Photos\") was\n     a lie the user found: results came from the whole storage. The scope is\n     the storage; the folder-scoped box is FilterBar's \"Filter in this\n     folder…\". Home, the virtual root and the cross-storage views (Recent,\n     Starred, Shared, tags) have no single storage → the everywhere wording.\n     ⚠ `multiStorageRoot` is the MODE (the admin explorer is always in it), not\n     the place: inside a storage the scope is that storage. Gating on the mode\n     printed \"Search all storages\" on every admin folder (caught by\n     e2e/tests/107 on the v0.42.2 chain). */\n  if (navView.value || atVirtualRoot.value) return '';\n  const name = adapter.value;\n  if (!name) return '';\n  const st = (props.config.storages ?? []).find((s) => s.name === name);\n  return st?.label || name;\n});\n\n/**\n * surucu:d1 — the ⌘K escalation. The header field searches THIS folder (it\n * sets `searchQuery`, which the loader answers with `action=search`); this\n * hands the same words to the command palette, which is where \"everywhere\",\n * the saved searches and the commands live. One box, one shortcut, and the\n * hint printed on the box does what it says.\n */\nconst paletteSeed = ref('');\nfunction openPaletteWith(q: string) {\n  paletteSeed.value = q;\n  showPalette.value = true;\n}\n\n/**\n * surucu:d1 — \"Request files\" from the New menu: the access modal on the\n * CURRENT folder, opened on its file-drop tab. The modal already owns that\n * surface; this only gives it a target, since the folder you are standing in\n * is not a selected row and has no FileNode of its own.\n */\nconst permInitialTab = ref<'perms' | 'share' | 'drop' | undefined>(undefined);\nfunction openFileRequest() {\n  const path = qualify(currentPath.value);\n  if (!path || !requestFilesHeld.value) return;\n  const segs = currentPath.value.split('/').filter(Boolean);\n  permTarget.value = {\n    path,\n    basename: segs.length ? segs[segs.length - 1] : adapter.value,\n    type: 'dir',\n  };\n  permInitialTab.value = 'drop';\n  showPerm.value = true;\n}\n\n/** surucu:d1 — a link minted from the details panel; same event the share\n *  dialog emits, so a host listening for `share-created` hears both. */\nfunction onInspectorShareCreated(payload: { path: string; url: string }) {\n  emit('share-created', { path: payload.path, url: payload.url, pin: null });\n  flashToast(t('inspector.copied'));\n}\n\n/* === surucu:d1 — the storage line under the navigation ==================\n * Fetched once per mount. The gate is `identitySurfaces` and nothing else: a\n * quota is one PERSON's ceiling, so an app token has nobody to have one, but\n * every surface that has a person behind it draws the same line — this is the\n * shell, not a profile. `quotaMe()` answers null for a server without the\n * route, and null renders nothing at all.\n *\n * ⚠ WHICH number the line prints is `lib/storageLine`'s decision, not this\n * function's. It used to print `used_bytes` for everybody — the person's\n * upload counter (`SUM(nodes.size) WHERE owner_id = me`, and the upload path\n * is the only one that sets an owner) — under \"Storage\", in the sentence\n * Home's card uses for a drive's size. Measured on a production install\n * (2026-09-25): card 245.3 GB, line 523.5 MB. Now a person with a quota sees\n * their share of it; everybody else sees the drives the panel lists, from the\n * same `homeStorages` the Home cards are drawn from, and the server is asked\n * only for the drives the host sent no size for (the desktop app sends names\n * only).\n */\nconst quotaMine = ref<QuotaSnapshot | null>(null);\nconst quotaDrives = ref<MeasuredDrive[] | null>(null);\n/* ⚠ A lazy `computed`, and it has to stay one: `homeStorages` is declared\n   further down, so anything that reads it at setup time — a `watch` on this\n   line, say — throws \"Cannot access before initialization\" and takes the\n   explorer down (the `isNarrow` note in onMounted). */\nconst quotaSnapshot = computed(() => storageLine(quotaMine.value, homeStorages.value, quotaDrives.value));\nasync function loadQuota() {\n  if (!identitySurfaces.value) {\n    quotaMine.value = null;\n    return;\n  }\n  const q = await api.quotaMe();\n  quotaMine.value = q;\n  quotaDrives.value = needsMeasuredDrives(q, homeStorages.value) ? await api.storageUsage() : null;\n}\n\n/**\n * nodeRowToFileNode — the starred / recently-opened / tag endpoints answer\n * with raw node rows (relative `path`, numeric `storage_id`), not the listing\n * shape. The conversion itself lives in `lib/nodeRow` (pure, unit-tested);\n * this binds it to the explorer's config. Every view that lists such rows —\n * Recent, Starred, a tag, the Home cards, the Recently-opened tray — goes\n * through here, so they all carry the same `perm` + `read_only` the context\n * menu gates its write verbs on.\n */\nfunction nodeRowToFileNode(row: Record<string, unknown>): FileNode | null {\n  return nodeRowToFileNodePure(row, {\n    storages: props.config.storages ?? [],\n    multiStorageRoot: multiStorageRoot.value,\n  });\n}\n\n/** How many rows one page of a per-person view asks for. */\nconst NAV_PAGE = 100;\n\n/**\n * #207 — what the server said about the view on screen: how many rows it has\n * in all and whether more are left than were loaded. Null for every other\n * place. The strip under the listing reads it (`nav-more`).\n */\nconst navMore = ref<{\n  kind: 'recent' | 'starred' | 'shared' | 'tag';\n  total: number;\n  truncated: boolean;\n  /** The server offset of the next page (rows the browser drops - an\n   *  encrypted folder's key file - must not shift it). */\n  next: number;\n} | null>(null);\nconst navMoreBusy = ref(false);\n\n/** The order the person chose for the view on screen, as the server's\n *  `sort` (`-modified`, `name`...); '' = the server's own (their time,\n *  newest first). Read from the view's memory (lib/viewPrefs). */\nconst navSortParam = computed(() => {\n  if (!serverOrderedView.value) return '';\n  const key = currentFolderKey.value;\n  if (!key || !folderIsRemembered(key)) return '';\n  const p = folderPrefs(key);\n  if (!p?.k) return '';\n  return `${p.d === 'desc' ? '-' : ''}${p.k}`;\n});\nwatch(navSortParam, (now, before) => {\n  if (now === before || !serverOrderedView.value) return;\n  if (navView.value === 'tag' && navTag.value) void loadTagView(navTag.value, navTagKind.value);\n  else if (navView.value === 'recent' || navView.value === 'starred' || navView.value === 'shared') void loadNavView(navView.value);\n});\n\n/** GET one page of one of the view endpoints. Returns rows already in listing\n *  shape, with the server's total and whether more are left. */\nasync function fetchNavRows(\n  kind: 'recent' | 'starred' | 'shared',\n  offset = 0,\n): Promise<{ rows: FileNode[]; total: number; truncated: boolean }> {\n  const base = props.config.apiBase ?? '';\n  const params = new URLSearchParams({ limit: String(NAV_PAGE), offset: String(offset) });\n  if (navSortParam.value) params.set('sort', navSortParam.value);\n  const url =\n    kind === 'shared'\n      ? `${base}/api/files/manager/shared-with-me?${params}`\n      : kind === 'starred'\n        ? `${base}/api/files/manager/star/list?${params}`\n        : `${base}/api/files/manager/recent?${params}`;\n  // ⚠ await. `buildAuthHeaders` is async because a token may be a function the\n  // desktop shell resolves per call; spreading the un-awaited promise sends the\n  // request with no Authorization header and it fails silently with a 401.\n  const res = await fetch(url, {\n    headers: await buildAuthHeaders(),\n    // ⚠ NOT 'include' — with a bearer token this is cross-origin for every\n    // embedder serving the UI from another origin (the desktop app): a credentialed\n    // cross-origin request cannot be answered with `ACAO: *`.\n    credentials: api.credentialsMode(),\n  });\n  if (!res.ok) throw new Error(String(res.status));\n  const body = await res.json();\n  const page = (rows: FileNode[]) => ({\n    rows,\n    total: typeof body?.total === 'number' ? body.total : offset + rows.length,\n    truncated: body?.truncated === true,\n  });\n  if (kind === 'shared') {\n    // The shared endpoint already answers in the listing shape, and reports\n    // which storages are grant-only in the same call.\n    sharedStorageNames.value = Array.isArray(body?.storages) ? body.storages : [];\n    return page(await e2eNames.decorate((Array.isArray(body?.files) ? body.files : []) as FileNode[]));\n  }\n  const rows: Record<string, unknown>[] = Array.isArray(body?.nodes) ? body.nodes : [];\n  /* wiring:e2 names — Recent, Starred and Home name an item inside an\n     encrypted folder by its plaintext while that folder is unlocked, and as\n     \"🔒 Encrypted item\" while it is not (rows carry `e2e_root`). */\n  return page(await e2eNames.decorate(rows.map(nodeRowToFileNode).filter((n): n is FileNode => n !== null)));\n}\n\n/** #207 — the next page of the view on screen, appended in the server's\n *  order. The strip offers it while the server says more are left. */\nasync function loadMoreNav() {\n  const more = navMore.value;\n  if (!more || !more.truncated || navMoreBusy.value) return;\n  navMoreBusy.value = true;\n  const at = currentPath.value;\n  try {\n    const next =\n      more.kind === 'tag'\n        ? await fetchTagRows(navTag.value, navTagKind.value, more.next)\n        : await fetchNavRows(more.kind, more.next);\n    if (currentPath.value !== at) return;\n    files.value = [...files.value, ...next.rows];\n    navMore.value = { kind: more.kind, total: next.total, truncated: next.truncated, next: more.next + NAV_PAGE };\n  } catch (err) {\n    flashToast(err instanceof Error ? err.message : String(err));\n  } finally {\n    navMoreBusy.value = false;\n  }\n}\n\n/* === gorunum:v3-shell — the Home view's own state ========================\n * Two lists and a flag, and nothing else: the storages are already\n * `config.storages` (the host's list, kept current by its own Refresh) and the\n * cards come from GridView, so Home adds no third source of truth about what\n * exists — it only asks the two per-user endpoints the panel's Recent and\n * Starred rows already ask.\n *\n * ⚠ `files` stays EMPTY while Home is open. Home is not a listing: it renders\n * its own sections, and putting its rows in `files` would hand the selection,\n * the inspector, the keyboard range and every `files.length` in this file a\n * list nobody is standing in.\n */\nconst homeRecent = ref<FileNode[]>([]);\nconst homeStarred = ref<FileNode[]>([]);\nconst homeLoading = ref(false);\n\n/* === #57 — the order the person put their storages in ====================\n * `config.storages` is the HOST's order; the panel and Home draw the person's\n * (`lib/storageOrder`: none saved = the host's order, unchanged). The panel\n * announces a new order and it is stored here — on the account beside the\n * palette, with this browser's mirror for the first paint, or in the mirror\n * alone for an embed that wires no account document. */\nconst storageOrder = useStorageOrder();\nconst navStorages = computed(() => orderStorages(props.config.storages ?? [], storageOrder.saved.value));\nfunction onReorderStorages(keys: string[]) {\n  saveStorageOrder(keys, navStorages.value);\n}\n\n/**\n * The storages Home draws.\n *\n * ⚠ Straight from `config.storages`, NOT a second fetch. The host already\n * decided which drives this caller may see (RBAC on the server, then\n * `fetchVisibleStorages` in our own app) and the navigation panel two hundred\n * pixels to the left is rendering that same array — a Home that asked for its\n * own copy could show a drive the panel beside it hides.\n *\n * #57 — and in the SAME ORDER as that panel: the person's own\n * (`navStorages`), so a drive they moved to the top of the panel is not the\n * third card on Home.\n */\n/* A drive's figure is a lower bound while its catalog does not cover all of\n   it: the host says so (`usedPartial`, from the usage endpoint's `coverage`),\n   or else the last listing did (coverageMap). */\nconst homeStorages = computed(() =>\n  navStorages.value.map((s) =>\n    s.usedPartial !== undefined || !(s.name in coverageMap.value)\n      ? s\n      : { ...s, usedPartial: coverageMap.value[s.name] !== null },\n  ),\n);\n\nasync function loadHome() {\n  homeLoading.value = true;\n  try {\n    // ⚠ Both at once and neither fatal on its own: a server without the\n    // starred endpoint must still be able to show somebody their recents.\n    const [r, st] = await Promise.all([\n      fetchNavRows('recent').then((p) => p.rows).catch(() => [] as FileNode[]),\n      fetchNavRows('starred').then((p) => p.rows).catch(() => [] as FileNode[]),\n    ]);\n    homeRecent.value = r;\n    homeStarred.value = st;\n  } finally {\n    homeLoading.value = false;\n  }\n}\n\n/** Open one of the panel views in the main pane. */\nasync function loadNavView(kind: Exclude<NavView, ''>) {\n  closeNavDrawer();\n  // Every panel view supersedes a folder listing still out (the ticket note\n  // at load()): Home and Drafts draw their own state, the others their rows.\n  const ticket = tickets.view();\n  if (kind === 'home') {\n    // ⚠ The mode is set BEFORE the fetch, unlike the listing views below: Home\n    // renders its own sections with their own loading line, so there is\n    // nothing to hold back — and setting it afterwards would leave the\n    // previous folder's files on screen under the panel row that already reads\n    // as selected.\n    if (!navView.value) navViewOrigin.value = currentPath.value ?? '';\n    navView.value = 'home';\n    navTag.value = '';\n    navTagKind.value = '';\n    trashMode.value = false;\n    e2eRoot.value = '';\n    forgetFolderPerm();\n    selection.clear();\n    files.value = [];\n    dirname.value = NAV_VIEW_DIRNAME.home;\n    currentPath.value = NAV_VIEW_DIRNAME.home;\n    adapter.value = '';\n    await loadHome();\n    return;\n  }\n  if (kind === 'tag') {\n    // The tag view needs a name; the panel calls loadTagView directly.\n    if (navTag.value) await loadTagView(navTag.value, navTagKind.value);\n    return;\n  }\n  if (kind === 'drafts') {\n    // Drafts (issue #71) is drawn by its own view (DraftsView), like Home: the\n    // mode and the address move first (lesson #608 — a refresh in the gap\n    // must reload THIS view), then the rows come.\n    if (!navView.value) navViewOrigin.value = currentPath.value ?? '';\n    navView.value = 'drafts';\n    navTag.value = '';\n    navTagKind.value = '';\n    trashMode.value = false;\n    e2eRoot.value = '';\n    forgetFolderPerm();\n    selection.clear();\n    files.value = [];\n    dirname.value = NAV_VIEW_DIRNAME.drafts;\n    currentPath.value = NAV_VIEW_DIRNAME.drafts;\n    adapter.value = '';\n    await loadDraftRows();\n    return;\n  }\n  if (kind === 'trash') {\n    void probeTrashPolicy(); /* tablo:t1 — in parallel: the banner is above the\n                                listing and must not wait behind it */\n    await loadTrash();\n    // ⚠ After loadTrash, not before: loadTrash goes through load()-adjacent\n    // state and the mode has to be the last word, or the panel row for Trash\n    // never lights up.\n    navView.value = 'trash';\n    navTag.value = '';\n    navTagKind.value = '';\n    return;\n  }\n  loading.value = true;\n  // ⚠ Only when coming from a real folder. Stepping Starred → Recent used to\n  // record `.starred` as the origin, so \"up\" out of Recent landed in Starred\n  // and the user had to press it twice to get back to their files.\n  if (!navView.value) navViewOrigin.value = currentPath.value ?? '';\n  navView.value = kind;\n  navTag.value = '';\n  navTagKind.value = '';\n  trashMode.value = false;\n  e2eRoot.value = '';\n  forgetFolderPerm();\n  selection.clear();\n  // ⚠⚠ The view's address moves NOW, with `navView`, not when its rows\n  // arrive. A refresh re-reads `currentPath` (load() with no path: the\n  // realtime layer's reload, the Refresh button, the end of an action); in\n  // the gap it still said the view being LEFT, so a refresh landing there\n  // loaded that view again and, answering last, put it back on screen — the\n  // click was undone (Starred → Recent, v0.47.0 release gate, spec 106, two\n  // full runs in two). Home already sets its address first, for its own\n  // reason (its note above).\n  dirname.value = NAV_VIEW_DIRNAME[kind];\n  currentPath.value = NAV_VIEW_DIRNAME[kind];\n  navMore.value = null;\n  try {\n    const got = await fetchNavRows(kind);\n    if (!isNewestLoad(ticket)) return;\n    files.value = got.rows;\n    navMore.value = { kind, total: got.total, truncated: got.truncated, next: NAV_PAGE };\n    // These three span every storage, so the crumb reads \"/ > Starred\", not\n    // \"/ > My files > Starred\", which would name a storage half the rows are\n    // not in. Trash keeps its storage crumb: trash IS per-storage.\n    adapter.value = '';\n  } catch (err) {\n    if (!isNewestLoad(ticket)) return;\n    const msg = err instanceof Error ? err.message : String(err);\n    files.value = [];\n    emit('error', { message: msg, context: { op: `nav-view:${kind}` } });\n    flashToast(msg);\n  } finally {\n    if (isNewestLoad(ticket)) loading.value = false;\n  }\n}\n\n/** One page of a tag's rows, in the server's order (#207). */\nasync function fetchTagRows(\n  name: string,\n  kind: TagKind | '',\n  offset: number,\n): Promise<{ rows: FileNode[]; total: number; truncated: boolean }> {\n  const got = await fetchTaggedPage(\n    name,\n    {\n      apiBase: props.config.apiBase ?? '',\n      authHeaders: () => buildAuthHeaders(),\n      authCredentials: api.credentialsMode(),\n    },\n    { limit: NAV_PAGE, offset, kind, sort: navSortParam.value },\n  );\n  const rows = await e2eNames.decorate(got.rows.map(nodeRowToFileNode).filter((n): n is FileNode => n !== null));\n  return { rows, total: got.total, truncated: got.truncated };\n}\n\n/* === etiket:t1 — the tag view ==========================================\n * \"Tagged files should show up inside the tag.\" A tag is not a folder: its\n * files live all over the tree and in every storage, so this is the same\n * shape as Starred — a per-user endpoint answering with node rows, each\n * carrying its own qualified path, so opening one navigates normally.\n *\n * The sentinel is `.tag~<name>` (lib/listing). Every surface that renders a\n * path segment — tab strip, breadcrumb, inspector heading, the address-bar\n * hash — goes through `virtualSegmentLabel`, so none of them can print the\n * sentinel the way the strip once printed `.shared`.\n */\nasync function loadTagView(tag: string, kind: TagKind | '' = '') {\n  closeNavDrawer();\n  const name = String(tag ?? '').trim();\n  if (!name) return;\n  const ticket = tickets.view();\n  loading.value = true;\n  if (!navView.value) navViewOrigin.value = currentPath.value ?? '';\n  navView.value = 'tag';\n  navTag.value = name;\n  navTagKind.value = kind;\n  trashMode.value = false;\n  e2eRoot.value = '';\n  forgetFolderPerm();\n  selection.clear();\n  // etiket:k2 — the kind is part of the address (`.mytag~x` / `.teamtag~x`),\n  // so a reload or a copied link opens the same one of two same-named tags.\n  // Set before the rows arrive, like loadNavView: a refresh in the gap must\n  // reload THIS tag, not the view being left (its note).\n  const seg = makeTagSegment(name, kind);\n  dirname.value = seg;\n  currentPath.value = seg;\n  navMore.value = null;\n  try {\n    const got = await fetchTagRows(name, kind, 0);\n    if (!isNewestLoad(ticket)) return;\n    files.value = got.rows;\n    navMore.value = { kind: 'tag', total: got.total, truncated: got.truncated, next: NAV_PAGE };\n    // Spans every storage, like Starred/Recent/Shared — so no storage crumb.\n    adapter.value = '';\n  } catch (err) {\n    if (!isNewestLoad(ticket)) return;\n    const msg = err instanceof Error ? err.message : String(err);\n    files.value = [];\n    emit('error', { message: msg, context: { op: `nav-view:tag:${kind ? `${kind}:` : ''}${name}` } });\n    flashToast(msg);\n  } finally {\n    if (isNewestLoad(ticket)) loading.value = false;\n  }\n}\n\n/**\n * The tags that exist, for the panel's Tags section.\n *\n * ⚠ WHEN this loads was a deliberate decision, not a default: `tags/all` is a\n * distinct-scan and the panel renders in every mounted explorer (a page can\n * hold several). It is therefore NOT fetched during mount — it is asked for\n * once the first listing is on screen, through a module-level cache that\n * dedupes concurrent callers and reuses the answer for a minute\n * (lib/tags.ts). N explorers on a page cost ONE query; a navigation costs\n * none. The cache is dropped the instant the user edits tags, which is the\n * only staleness anybody can notice.\n */\nconst navTags = ref<TagItem[]>([]);\nconst navTagsLoaded = ref(false);\n\nasync function loadNavTags(force = false) {\n  if (!navVisible.value) return; // no panel → nobody can see the list\n  navTags.value = await fetchAllTags({\n    apiBase: props.config.apiBase ?? '',\n    authHeaders: () => buildAuthHeaders(),\n    authCredentials: api.credentialsMode(),\n    force,\n  });\n  navTagsLoaded.value = true;\n}\n\n/* === /etiket:t1 === */\n\n/**\n * gorunum:v3-shell — what the panel's first group does.\n *\n * ⚠ \"My files\" is answered with an ordinary navigation, not with a view. It\n * opens the ROOT — the storage list in a multi-storage install, the storage\n * root in a single-storage one, and the confined floor inside a `rootPath`\n * embed (load() clamps it, so the row cannot be used to climb out of a\n * confined explorer). `load('')` also clears `navView`, which is what takes\n * the panel's highlight off whichever view you were in.\n */\nfunction openNavDest(dest: NavDest) {\n  if (dest === 'myfiles') {\n    closeNavDrawer();\n    void load('');\n    return;\n  }\n  void loadNavView(dest);\n}\n\n/** Panel to a storage root. */\nfunction openNavStorage(name: string) {\n  closeNavDrawer();\n  void load(multiStorageRoot.value ? name : '');\n}\n\n/**\n * Which storages are grant-only, asked once at mount so the panel can mark them\n * before anybody opens the shared view. `limit=1` on purpose: the storage list\n * is built from every grant, the page size only bounds the item rows.\n */\nasync function loadSharedStorages() {\n  try {\n    const base = props.config.apiBase ?? '';\n    const res = await fetch(`${base}/api/files/manager/shared-with-me?limit=1`, {\n      headers: await buildAuthHeaders(),\n      credentials: api.credentialsMode(),\n    });\n    if (!res.ok) return;\n    const body = await res.json();\n    sharedStorageNames.value = Array.isArray(body?.storages) ? body.storages : [];\n  } catch {\n    // Silent — an older backend has no such endpoint, and the panel is still\n    // useful without the shared markers.\n  }\n}\n/* === /gezinti:g1 === */\n/**\n * What a user path READS AS — the folder's own name, or the view's.\n *\n * ⚠ Takes the path as an argument rather than reading `currentPath`, because\n * there are two panes and the details panel follows whichever one has the\n * keyboard (see `inspectorDirLabel`).\n *\n * ⚠ The `trashMode` special case it used to open with is gone, and that is a\n * removal, not an omission: the trash view parks `.trash` in `currentPath`, and\n * `virtualSegmentLabel('.trash')` is `t('node.trash')` — the same string, by\n * the same route as every other view. One of the two was going to be forgotten\n * the next time a view was added; it is the one that could be.\n */\nfunction folderLabelOf(path: string): string {\n  const p = (path ?? '').replace(/^\\/+|\\/+$/g, '');\n  /* No path = the top of the tree. In multi-storage that is the DRIVE LIST, so\n     naming it after `adapter` — whichever storage was loaded last — would head\n     the panel with a drive the person is not looking at. */\n  if (!p) return multiStorageRoot.value ? t('breadcrumb.root') : (adapter.value || t('breadcrumb.root'));\n  const seg = p.split('/').pop() || p;\n  /* etiket:t1 — a THIRD surface that renders a path segment, and it had the\n     same hole the tab strip did: in a virtual view the details panel headed\n     itself \".starred\". Same shared resolver, so it cannot drift again. */\n  const virtual = virtualSegmentLabel(seg, t);\n  if (virtual) return virtual;\n  /* wiring:e2 names — the plaintext of an encrypted folder's subfolder. */\n  const e2eLabel = e2eNames.segmentLabel(qualify(p));\n  return e2eLabel ?? seg;\n}\nfunction onInspectorManage(n: FileNode) {\n  permTarget.value = n;\n  showPerm.value = true;\n}\n/* === /koru:k1 === */\n\n// RBAC helpers. '' means ACL is not enforced on this storage → full access\n// (the pre-RBAC default). Otherwise 'editor'/'owner' may write; only 'owner'\n// manages permissions. Enforcement is server-side; this just shapes the menu.\nfunction permCanEdit(p: string | undefined): boolean {\n  // A read-only storage refuses every write on the server (403 \"storage is\n  // read-only\") whatever level the ACL grants — an owner of a read-only mount\n  // is an owner who cannot write. Say so here rather than after the click:\n  // until this line the toolbar offered New folder / Upload and the sidebar's\n  // \"+ New\" menu on a read-only mount, and the user found out from the error\n  // (issue #30). The level itself is left alone: 'owner' still opens the\n  // permissions panel, sharing a read-only file is still allowed.\n  if (dirReadOnly.value) return false;\n  // undefined = ACL not enforced (dev / unwired) → full access. In production\n  // the backend always sends a level; 'none'/'viewer' cannot write, only\n  // 'editor'/'owner' can.\n  return p === undefined || p === 'editor' || p === 'owner';\n}\nfunction permIsOwner(p: string | undefined): boolean {\n  return p === 'owner';\n}\n/* ⚠⚠ THE CONTEXT MENU MUST BE THE SAME EVERYWHERE (owner, 2026-09-19: \"son\n * kullanılanlar, ana sayfa gibi sayfalarda context menu eksik kalıyor.\n * CONTEXT MENÜ HER YERDE AYNI OLMALI\").\n *\n * `dirPerm` / `dirReadOnly` describe the FOLDER being listed, and only\n * `load()` sets them. Recent, Starred, Shared, a tag view and Home list rows\n * from every storage and have no folder — so whatever folder was open LAST\n * answered for them. On the landing page that is no folder at all\n * (`dirPerm === ''`), and `permCanEdit('')` is false, so the menu on a Home\n * card or a Recent row came up without Rename / Delete / Move to / Share.\n * After a writable folder had been visited the stale level said yes to\n * everything, including rows on a read-only mount. Intermittent, therefore\n * reported as \"eksik kalıyor\" rather than \"yok\".\n *\n * Three rules restore one menu:\n *   1. entering a virtual view forgets the folder (`forgetFolderPerm`), so\n *      nothing stale can leak into it;\n *   2. a row answers for itself — its own `perm` (every listing carries it\n *      now, `handlers/meta.go`) and its own storage's `read_only`;\n *   3. a multi-selection is as weak as its weakest row, because the server\n *      refuses the whole batch on the one row the caller may not touch.\n * What stays hidden in a virtual view is only what is structurally\n * impossible there — New folder, Upload, Paste need a destination folder\n * (`atVirtualRoot`).\n */\nfunction forgetFolderPerm() {\n  dirPerm.value = '';\n  dirReadOnly.value = false;\n}\n/** A view whose rows span every storage: no folder is behind it. */\nconst inVirtualView = computed(() => !!navView.value && navView.value !== 'trash');\n/** The row's own level; the folder's when the row has none. In a virtual view\n *  a row without a level (a server older than `handlers/meta.go`'s `perm`)\n *  is ungated — the server enforces, this only shapes the menu — rather than\n *  gated by an empty folder level that would hide every write verb.\n *  ⚠ #103: and so is such a row while NO folder level is known (`dirPerm`\n *  is `''` between leaving a view and the folder's answer). A folder's own\n *  rows never get here: `load()` hands them the folder's level when it\n *  commits them (lib/rowLevel). */\nfunction rowPerm(n: FileNode): string | undefined {\n  if (typeof n.perm === 'string') return n.perm;\n  return fallbackRowLevel(inVirtualView.value, dirPerm.value);\n}\n/** The row sits on a read-only storage: its own `read_only` (nav/tag rows),\n *  else the host's storage list — a folder listing's rows carry no flag of\n *  their own because `dirReadOnly` already answers for the whole folder. */\nfunction nodeReadOnly(n: FileNode): boolean {\n  if (n.read_only === true) return true;\n  const storage = typeof n.storage === 'string' ? n.storage : '';\n  if (!storage) return false;\n  return (props.config.storages ?? []).some((s) => s.name === storage && s.readOnly === true);\n}\n/** May the caller write THIS row — level and read-only mount folded together.\n *  The one predicate behind the editor/preview split and the menu's write\n *  verbs, so a Home card and a listing row cannot disagree. */\nfunction nodeCanEdit(n: FileNode): boolean {\n  return permCanEdit(rowPerm(n)) && !nodeReadOnly(n);\n}\nconst PERM_RANK: Record<string, number> = { none: 0, viewer: 1, editor: 2, owner: 3 };\n// Effective perm for a selection: a single entry's own perm, the WEAKEST of a\n// multi-selection's own perms, else the directory perm (background / rows\n// that carry no level).\nfunction selPerm(sel: FileNode[]): string | undefined {\n  if (sel.length === 0) return dirPerm.value;\n  let weakest: string | undefined;\n  let ungated = false;\n  for (const n of sel) {\n    const p = rowPerm(n);\n    if (p === undefined) {\n      ungated = true;\n      continue;\n    }\n    if (weakest === undefined || (PERM_RANK[p] ?? 0) < (PERM_RANK[weakest] ?? 0)) weakest = p;\n  }\n  // An ungated row (no level, unwired ACL) never strengthens a selection\n  // that also holds a gated one; alone, it stays ungated.\n  return weakest ?? (ungated ? undefined : dirPerm.value);\n}\n/** Any row of the selection on a read-only storage → the selection is. */\nfunction selReadOnly(sel: FileNode[]): boolean {\n  return sel.some(nodeReadOnly);\n}\n/* #196 — every question a menu row waits on (the folder permissions here, the\n * encryption answer below, the desktop's keep state) is counted, so a row's\n * menu opens once they are answered instead of drawing rows late under the\n * pointer (`openCtxMenu`). */\nconst rowAnswers = pendingAnswers();\n/* #196 - the answers themselves, asked BEFORE a menu opens and remembered per\n * person and storage (lib/menuAnswers): a listing asks every row's questions\n * in one batched request per question (prefetchMenuAnswers), the live socket\n * says when they went stale (`access.changed`, onAccessChanged), and a menu\n * reads them at once. Only a question nothing is known about yet holds a menu\n * that is about to open (rowAnswers, at most MENU_ANSWER_WAIT_MS). They only\n * shape the menu: the server decides every action again. */\nconst menuAnswers = menuAnswerStore();\nonBeforeUnmount(() => menuAnswers.dispose());\n/** The rule set each family of answers is asked under: a change drops that\n *  family's remembered answers (lib/menuAnswers `sign`). */\nfunction menuSig(): { p: string; e: string } {\n  const policy = capabilitiesData.value?.e2e_policy;\n  return {\n    p: [...(heldByFolder.value ?? [])].sort().join(','),\n    e: policy ? `${policy.available}|${policy.policy}` : '',\n  };\n}\n/** Whose remembered answers these are: this server, this account, its tenant\n *  and the root this explorer is confined to. Asked once there is something\n *  to remember (an encryption policy, or permissions that differ from folder\n *  to folder) and the rule sets are known. Until then, and when the account\n *  cannot be told, the answers live in memory for the page. */\nasync function attachMenuAnswers(): Promise<void> {\n  await Promise.all([loadCapabilities(), ownPermissionsAsked]);\n  if (!capabilitiesData.value?.e2e_policy && !heldByFolder.value?.length) return;\n  let who: { id?: unknown; provider_id?: unknown } | null | undefined;\n  try {\n    who = (await fetchMeOnce())?.user as { id?: unknown; provider_id?: unknown } | null | undefined;\n  } catch {\n    who = null;\n  }\n  const origin = connectionsBase(props.config) || (typeof location !== 'undefined' ? location.origin : '');\n  const scope = who && typeof who.id === 'number' ? [origin, who.id, who.provider_id ?? '', rootFloor].join('|') : null;\n  menuAnswers.attach(scope, menuSig());\n  prefetchMenuAnswers();\n}\nonMounted(() => void attachMenuAnswers());\n/* Permissions that differ from folder to folder (`config.permissionsByFolder`\n * — a role allowing Delete only in Scratch) are asked of the server per path\n * and remembered here: path → the permissions held there. Until a path is\n * answered its folder-dependent actions stay hidden; a failed question offers\n * them, and the server decides as before. */\nconst folderAllowed = ref<Record<string, string[]>>({});\nconst folderAsking = new Set<string>();\n// Bumped when the account's permissions change: an answer asked before is\n// dropped, not written into the fresh cache.\nlet folderGen = 0;\nwatch(\n  () => [heldPermissions.value, heldByFolder.value],\n  () => {\n    folderGen++;\n    folderAsking.clear();\n    folderAllowed.value = {};\n    menuAnswers.sign('p', menuSig().p); /* #196 */\n  },\n);\nfunction askFolderAllowed(paths: string[]): void {\n  const byFolder = heldByFolder.value;\n  if (!byFolder?.length) return;\n  // #196 - asked again when it is not fresh (another era, or old); a\n  // remembered answer is shown meanwhile (folderHeldAt).\n  const missing = paths.filter((p) => !menuAnswers.fresh('p', p) && !folderAsking.has(p));\n  if (!missing.length) return;\n  missing.forEach((p) => folderAsking.add(p));\n  const perms = [...byFolder];\n  const gen = folderGen;\n  const settle = (answers: string[][], ok: boolean) => {\n    if (gen !== folderGen) return;\n    const next = { ...folderAllowed.value };\n    missing.forEach((p, i) => {\n      next[p] = answers[i] ?? [];\n      // A failed question offers every action (the server decides), for this\n      // page only: it is not remembered as the answer.\n      menuAnswers.put('p', p, next[p], ok);\n      folderAsking.delete(p);\n    });\n    folderAllowed.value = next;\n  };\n  // #196 - only a question nothing is known about yet holds a menu that is\n  // about to open; one with a remembered answer is asked in the background.\n  const answered = missing.some((p) => folderHeldAt(p) === undefined) ? rowAnswers.start() : () => {};\n  api\n    .allowedAt(missing, perms)\n    .then(\n      (answers) => settle(answers, true),\n      () => settle(missing.map(() => perms), false),\n    )\n    .finally(answered);\n}\n/** The per-folder permissions held at `path`: this page's answer, else the\n *  remembered one (#196), else undefined (never answered). */\nfunction folderHeldAt(path: string): string[] | undefined {\n  return folderAllowed.value[path] ?? (menuAnswers.peek('p', path) as string[] | undefined);\n}\n/** permHeld for an action on `paths`: every one of them must allow it. */\nfunction permHeldAt(p: string, pathsIn: string[]): boolean {\n  /* wiring:e2 vault — asked as the vault folder (vaultAskPath). */\n  const paths = [...new Set(pathsIn.map(vaultAskPath))];\n  if (!heldPermissions.value || !paths.length || !heldByFolder.value?.includes(p)) {\n    return permHeld(p);\n  }\n  // ⚠ Starts a request from inside a computed; the answer lands later in\n  // `folderAllowed`, which re-runs it. Nothing reactive is written now.\n  askFolderAllowed(paths);\n  return paths.every((x) => folderHeldAt(x)?.includes(p) ?? false);\n}\n/* wiring:e2 policy — may this account START encrypting here? The server's\n * answer per path (`POST /api/files/e2e/allowed`, backend internal/e2epolicy):\n * the platform operator's switch for the tenant, the tenant's policy,\n * `files.encrypt` on that path and — under the `approval` policy — an\n * approval: `allowed`, `request` or `denied`.\n *\n * ⚠ Asked for administrators too: the policy `off` stops them as well, and\n * the per-folder permission question above is never asked for them.\n * ⚠ It only shapes the menu — every door that creates a key file or a `.fxe`\n * asks the same rule on the server. A question that fails answers `allowed`\n * (useFileApi e2eAllowedAt), and a server older than the policy says nothing\n * in its capabilities, which reads `allowed` too: the menu of before, and the\n * server decides.\n * ⚠ And it only ever OFFERS what the account may do anyway: \"allowed\" is\n * necessary, not sufficient. The answer does not look at `files.create`, at a\n * read-only storage or at what a key may write, so every caller also asks the\n * question that was already there — `canWriteHere`, the row's own `w`.\n *\n * Remembered per path until the listing is read again (`load` forgets them),\n * so an approval granted meanwhile shows at the next visit. */\nconst e2eAnswers = ref<Record<string, E2eAnswer>>({});\nconst e2eAsking = new Set<string>();\n// Bumped when the answers are forgotten: a question asked before is dropped,\n// not written into the fresh cache.\nlet e2eGen = 0;\nfunction forgetE2eAnswers(): void {\n  e2eGen++;\n  e2eAsking.clear();\n  e2eAnswers.value = {};\n  menuAnswers.sign('e', menuSig().e); /* #196 */\n}\nwatch(\n  () => [\n    heldPermissions.value,\n    heldByFolder.value,\n    capabilitiesData.value?.e2e_policy?.available,\n    capabilitiesData.value?.e2e_policy?.policy,\n  ],\n  forgetE2eAnswers,\n);\n/** The cache key of one question: the kind first (it holds no `:`), then the\n *  wire path. */\nfunction e2eAskKey(path: string, kind: E2eRequestKind): string {\n  return `${kind}:${path}`;\n}\nasync function askE2eAnswers(asks: { path: string; kind: E2eRequestKind }[]): Promise<void> {\n  // #196 - asked again when it is not fresh (another era, or old); the\n  // remembered answer is shown meanwhile (e2eAnswerAt).\n  const missing = asks.filter((a) => {\n    const k = e2eAskKey(a.path, a.kind);\n    return !menuAnswers.fresh(`e:${a.kind}`, a.path) && !e2eAsking.has(k);\n  });\n  if (!missing.length) return;\n  for (const a of missing) e2eAsking.add(e2eAskKey(a.path, a.kind));\n  const gen = e2eGen;\n  // #196 — counted until the answer is in the cache, and only when nothing is\n  // known about it yet: a menu waiting on it (`openCtxMenu`) then opens with\n  // the row already in its place. A question with a remembered answer holds\n  // no menu.\n  const unknown = missing.some((a) => e2eKnownAt(a.path, a.kind) === undefined);\n  const answered = unknown ? rowAnswers.start() : () => {};\n  let failed = false;\n  try {\n    const answers = await api.e2eAllowedAt(missing, {\n      onFailed: () => {\n        failed = true;\n      },\n    });\n    if (gen !== e2eGen) return;\n    const next = { ...e2eAnswers.value };\n    missing.forEach((a, i) => {\n      const k = e2eAskKey(a.path, a.kind);\n      next[k] = answers[i] ?? 'allowed';\n      // The fallback of a failed question (\"allowed\", the server decides) is\n      // this page's only: it is not remembered as the answer.\n      menuAnswers.put(`e:${a.kind}`, a.path, next[k], !failed);\n      e2eAsking.delete(k);\n    });\n    e2eAnswers.value = next;\n  } finally {\n    answered();\n  }\n}\n/** #196 - the encryption answer known for a path and kind: this page's, else\n *  the remembered one, else undefined (never answered). */\nfunction e2eKnownAt(path: string, kind: E2eRequestKind): E2eAnswer | undefined {\n  return e2eAnswers.value[e2eAskKey(path, kind)] ?? (menuAnswers.peek(`e:${kind}`, path) as E2eAnswer | undefined);\n}\n\n/* #196 - the hot tier. Rows asked for at once when a folder is listed: more\n * than the server takes in one question (1000) would be several requests,\n * and a menu on a row past these asks for itself. */\nconst MENU_PREFETCH_MAX = 500;\n/**\n * #196 - ask, before any menu opens, every question the rows of this folder's\n * menus depend on, in one batched request per question: the folder's own (New\n * folder, Upload: `new_folder`, its permissions) and each row's (`file` or\n * `folder`, its permissions); and, from what is remembered, the same questions\n * around it - the storage's root and its first level, the parent's level and\n * the level below (lib/menuAnswers `around`). Only what is not fresh goes out\n * (askFolderAllowed, askE2eAnswers). Nothing below a vault's folder: those\n * rows are asked about as the vault folder, by the menu itself.\n */\nfunction prefetchMenuAnswers(): void {\n  if (trashMode.value || navView.value || notFoundPath.value || loadError.value) return;\n  const here = qualify(currentPath.value ?? '');\n  if (!here.includes('://') || vault.rootOf(here)) return;\n  const e2eOn = !!capabilitiesData.value?.e2e_policy && !e2eActive.value;\n  const permsOn = !!heldPermissions.value && !!heldByFolder.value?.length;\n  if (!e2eOn && !permsOn) return;\n  const perms = new Set<string>();\n  const e2e = new Map<string, { path: string; kind: E2eRequestKind }>();\n  const add = (q: MenuQuestion, path: string) => {\n    if (q === 'p') {\n      if (permsOn) perms.add(path);\n    } else if (e2eOn) {\n      const kind = q.slice(2) as E2eRequestKind;\n      e2e.set(e2eAskKey(path, kind), { path, kind });\n    }\n  };\n  add('p', here);\n  add('e:new_folder', here);\n  for (const n of files.value.slice(0, MENU_PREFETCH_MAX)) {\n    if (!n || typeof n.path !== 'string' || !n.path.includes('://') || isStorageRow(n) || vault.isVaultRow(n)) continue;\n    add('p', n.path);\n    // The encryption rows show only on rows this person can write (`w`), and\n    // never on what is already encrypted.\n    if (!nodeCanEdit(n) || n.e2e || n.e2e_root) continue;\n    if (n.type === 'dir') add('e:folder', n.path);\n    else if (!isFxeRow(n)) add('e:file', n.path);\n  }\n  for (const a of menuAnswers.around(here)) add(a.q, a.path);\n  if (perms.size) askFolderAllowed([...perms].slice(0, 1000));\n  if (e2e.size) void askE2eAnswers([...e2e.values()].slice(0, 1000));\n}\n\n/* #196 - the server said what this person may do may have changed\n * (`access.changed`), or the socket was down long enough to miss it. Every\n * remembered answer becomes stale (still shown, asked again when hot), the\n * account's own permissions are read again, and the folder is listed again -\n * its rows carry their own level - which asks the hot tier again. A change\n * everybody connected heard is spread over ACCESS_SPREAD_MS so a role edit\n * does not make every open explorer ask in the same instant. */\nconst ACCESS_SPREAD_MS = 2_000;\nlet accessTimer: ReturnType<typeof setTimeout> | null = null;\nfunction onAccessChanged(news: { all: boolean; resync: boolean }): void {\n  menuAnswers.stale();\n  if (news.resync) {\n    prefetchMenuAnswers();\n    return;\n  }\n  if (accessTimer) return;\n  accessTimer = setTimeout(\n    () => {\n      accessTimer = null;\n      loadOwnPermissions();\n      void load();\n    },\n    news.all ? Math.random() * ACCESS_SPREAD_MS : 0,\n  );\n}\nonBeforeUnmount(() => {\n  if (accessTimer) clearTimeout(accessTimer);\n  accessTimer = null;\n});\n/** The encryption answer for one wire path and one kind of encryption:\n *  `new_folder` - a new encrypted folder made IN this folder (the New folder\n *  dialog); `folder` - this folder encrypted where it is; `file` - this file.\n *  ⚠ The kind is the server's too (operator decision 2026-10-03): an approval\n *  opens only the kind it was asked for, so asking without one would show\n *  \"allowed\" where the server then refuses. */\nfunction e2eAnswerAt(pathIn: string, kind: E2eRequestKind): E2eAnswer {\n  const path = vaultAskPath(pathIn); /* wiring:e2 vault */\n  const policy = capabilitiesData.value?.e2e_policy;\n  if (!policy) return 'allowed';\n  // ⚠ Nothing is answered from the capabilities' row itself — not even \"the\n  // operator switched it off\". It is the row of the CALLER'S OWN tenant; the\n  // platform operator looking at another tenant's storage is answered by THAT\n  // tenant's ceiling and policy, which can differ either way. Only the per-path\n  // answer hides a door.\n  // ⚠ Starts a request from inside a computed, as permHeldAt does; the answer\n  // lands in `e2eAnswers`, which re-runs it.\n  void askE2eAnswers([{ path, kind }]);\n  // The remembered answer while a fresh one is asked (#196); 'denied' while\n  // nothing is known: a row that appears a moment late is better than one\n  // that appears and is taken back. A row's menu waits, briefly, only for an\n  // answer nothing is known about (`openCtxMenu`).\n  return e2eKnownAt(path, kind) ?? 'denied';\n}\n// Can the current user write into the directory being viewed? Gates the\n// toolbar New Folder / Upload / Paste + drag-drop upload.\nconst canWriteHere = computed(\n  () => permCanEdit(dirPerm.value) && permHeldAt('files.create', currentPath.value ? [qualify(currentPath.value)] : []),\n);\n// Empty-state affordances: the \"drop files here\" hint + upload button only\n// make sense in a real writable folder (not the virtual drives root, not the\n// trash view).\nconst emptyCanUpload = computed(\n  () => canWriteHere.value && !atVirtualRoot.value && !trashMode.value,\n);\n/* The sharing kinds the account holds on the folder being viewed and on the\n * share dialog's item (lib/sharingHeld). \"+ New → Request files\" makes a file\n * request here and the dialog makes links there, so each asks the same\n * permissions the server will ask — per folder when the role says so. */\nconst requestFilesHeld = computed(\n  () => sharingAt(currentPath.value ? [qualify(currentPath.value)] : []).uploadLinks,\n);\nconst permTargetSharing = computed<SharingHeld | undefined>(() =>\n  permTarget.value && heldPermissions.value ? sharingAt([permTarget.value.path]) : undefined,\n);\n\n// Context menu\nconst ctxRef = ref<InstanceType<typeof ContextMenu> | null>(null);\nconst rootEl = ref<HTMLElement | null>(null);\nconst toolbarRef = ref<InstanceType<typeof Toolbar> | null>(null);\n\n/* bag:b4 — narrow/embed mini mode.\n * isNarrow: container width < 560px (ResizeObserver on the .fe root, so it\n * tracks the EMBED container, not the viewport) → root gets `fe--narrow`,\n * the toolbar collapses and the upload FAB appears.\n * isCoarse: touch-first device → context menus render as a bottom sheet. */\nconst isNarrow = ref(false);\nconst isCoarse = ref(false);\nlet narrowRO: ResizeObserver | undefined;\nlet coarseMq: MediaQueryList | undefined;\nfunction syncCoarsePointer(e?: MediaQueryListEvent | MediaQueryList) {\n  isCoarse.value = !!(e && 'matches' in e && e.matches);\n}\nonMounted(() => {\n  if (typeof ResizeObserver !== 'undefined' && rootEl.value) {\n    narrowRO = new ResizeObserver((entries) => {\n      const w = entries[0]?.contentRect?.width ?? rootEl.value?.clientWidth ?? 0;\n      isNarrow.value = w > 0 && w < 560;\n    });\n    narrowRO.observe(rootEl.value);\n  }\n  if (typeof window !== 'undefined' && window.matchMedia) {\n    coarseMq = window.matchMedia('(pointer: coarse)');\n    syncCoarsePointer(coarseMq);\n    coarseMq.addEventListener?.('change', syncCoarsePointer);\n  }\n});\nonBeforeUnmount(() => {\n  narrowRO?.disconnect();\n  narrowRO = undefined;\n  coarseMq?.removeEventListener?.('change', syncCoarsePointer);\n  coarseMq = undefined;\n});\n/* /bag:b4 */\n\n// Toast (tiny, no lib). Evolved into a snackbar: plain messages keep the old\n// 2.5s auto-hide; messages carrying an action (\"Geri Al\") stay 8s and can be\n// dismissed by click or Esc.\ninterface ToastState {\n  message: string;\n  actionLabel?: string;\n  action?: () => UndoOutcome | Promise<UndoOutcome>;\n  /** What pressing the action is (lib/toastSlot): an Undo (the default) or a\n   *  plain action with its own words — a drag-out's Stop is not an Undo. */\n  after?: ToastAfter;\n  /** Who put it up, where that matters (lib/toastSlot `slotTakenBy`). */\n  source?: ToastSource;\n}\nconst toast = ref<ToastState | null>(null);\nlet toastTimer: ReturnType<typeof setTimeout> | undefined;\n/** How long a plain message stays up. */\nconst FLASH_TOAST_MS = 2500;\n/** How long a failure stays up: long enough to read a sentence. */\nconst ERROR_TOAST_MS = 6000;\n/** A \"still working on it\" toast: up until the answer replaces it. */\nconst STICKY_TOAST_MS = 10 * 60 * 1000;\n/** A drag-out's last word that came while another toast held the slot: said\n *  when that toast goes, rather than over it or never. */\nlet dragEndWaiting: { message: string; ms: number } | null = null;\nfunction showToast(state: ToastState, ms: number) {\n  toast.value = state;\n  if (toastTimer) clearTimeout(toastTimer);\n  toastTimer = setTimeout(slotFreed, ms);\n}\nfunction flashToast(msg: string) {\n  showToast({ message: msg }, FLASH_TOAST_MS);\n}\n/** The slot's toast went (its time ran out, or it was clicked away). */\nfunction slotFreed() {\n  toastTimer = undefined;\n  toast.value = null;\n  const waiting = dragEndWaiting;\n  dragEndWaiting = null;\n  if (waiting) showToast({ message: waiting.message, source: 'drag-out' }, waiting.ms);\n}\n// The timer goes with the explorer: a sticky toast's is ten minutes.\nonBeforeUnmount(() => {\n  if (toastTimer) clearTimeout(toastTimer);\n  toastTimer = undefined;\n  dragEndWaiting = null;\n});\n\n/**\n * The catalog-coverage strip over a listing and over search results\n * (lib/catalogCoverage): what search, folder sizes and usage leave out, and\n * why. Not over a view that is not a storage's (Home, Recent, the trash) or a\n * dead link. A search typed at a storage's root spans every storage — the\n * server's own rule (handlers.Manager vfSearch) — so it names each one that is\n * not fully cataloged.\n */\nconst coverageShown = computed(() => {\n  if (navView.value || trashActive.value || notFoundPath.value) return null;\n  const searching = !!searchQuery.value;\n  const atStorageRoot = stripAdapter(dirname.value).replace(/^\\/+|\\/+$/g, '') === '';\n  return coverageNotice({\n    map: coverageMap.value,\n    adapter: adapter.value,\n    searching,\n    crossStorage: searching && atStorageRoot && Object.keys(coverageMap.value).length > 1,\n    admin: callerAdmin.value,\n  });\n});\n\n/**\n * \"Catalog everything\" (an administrator, a storage cataloged only on open):\n * the ordinary full sync of that storage, the one the admin panel's\n * \"Sync now\" starts. The storage's id is asked for at click time — the\n * listing carries names only, and nobody but an administrator needs the id.\n */\nasync function catalogAll(storage: string | undefined) {\n  if (!storage || catalogBusy(storage)) return;\n  catalogRuns.value = { ...catalogRuns.value, [storage]: 0 };\n  const forget = () => {\n    const { [storage]: _gone, ...rest } = catalogRuns.value;\n    catalogRuns.value = rest;\n  };\n  let id: number;\n  try {\n    const base = connectionsBase(props.config);\n    const rows = await api.jsonFetch<Array<{ id: number; name: string }>>(`${base}/api/admin/storages`);\n    const row = Array.isArray(rows) ? rows.find((r) => r.name === storage) : undefined;\n    if (!row) throw new Error('no such storage');\n    const res = await api.jsonFetch<{ status?: string }>(`${base}/api/admin/storages/${row.id}/sync`, { method: 'POST' });\n    id = row.id;\n    catalogRuns.value = { ...catalogRuns.value, [storage]: id };\n    // Said once the server has answered — never \"started\" over a refusal —\n    // and \"already running\" when a scan held the storage before the press\n    // (the server starts no second one and answers `status: \"running\"`).\n    flashToast(res?.status === 'running' ? t('coverage.catalog_joined', { storage }) : t('coverage.catalog_started'));\n  } catch (err) {\n    forget();\n    showToast({ message: failureText(err) }, ERROR_TOAST_MS);\n    return;\n  }\n  /* ⚠ Followed to its end, through the one follower the admin panel's \"Sync\n   * now\" uses too (lib/storageWatch: the storage list's `running` flag, one\n   * read of the list for every storage followed). It used to flash \"started\"\n   * and leave the banner and the button as they were for the hours a large\n   * storage takes, with no word of the end. */\n  const end = await catalogWatch().scan(id);\n  forget();\n  if (end === null) return;\n  // The ends stay up as long as a failure (ERROR_TOAST_MS): each is the only\n  // word about hours of work. Why a scan failed is the admin panel's to show\n  // (the storage's sync runs) — the run's raw error is the server's English.\n  if (end.status === 'ok') {\n    flashToast(t('coverage.catalog_done', { storage }));\n    await load();\n  } else if (end.status === 'failed') {\n    showToast({ message: t('coverage.catalog_failed', { storage }) }, ERROR_TOAST_MS);\n  } else if (end.status === 'aborted') {\n    showToast({ message: t('coverage.catalog_stopped', { storage }) }, ERROR_TOAST_MS);\n  } else if (end.status === 'gone') {\n    showToast({ message: t('coverage.catalog_gone', { storage }) }, ERROR_TOAST_MS);\n  } else {\n    showToast({ message: t('coverage.catalog_unfollowed', { storage }) }, ERROR_TOAST_MS);\n  }\n}\nfunction undoToast(message: string, undo: () => Promise<UndoOutcome>) {\n  showToast({ message, actionLabel: t('toast.undo'), action: undo, after: { kind: 'undo' } }, 8000);\n}\n/** A click on the toast: it goes, and a drag's last word waiting for the\n *  slot is said. */\nfunction dismissToast() {\n  if (toastTimer) clearTimeout(toastTimer);\n  slotFreed();\n}\nasync function runToastAction() {\n  const shown = toast.value;\n  const act = shown?.action;\n  if (toastTimer) clearTimeout(toastTimer);\n  toastTimer = undefined;\n  toast.value = null;\n  if (!shown || !act) return;\n  const after = shown.after ?? { kind: 'undo' as const };\n  // Said while it runs: undoing a large move or a restore takes a while, and\n  // nothing was on screen until it ended. A plain action (a drag-out's Stop)\n  // says its own words, and its \"Stopping…\" is not repainted by the drag's\n  // progress still on its way (lib/toastSlot).\n  const plain = after.kind === 'plain';\n  const source: ToastSource | undefined = plain && shown.source ? 'drag-out-stopping' : undefined;\n  showToast({ message: afterActionWords(after, 'running', undefined, t), source }, STICKY_TOAST_MS);\n  try {\n    const out = await act();\n    // Not \"Undone\" about an undo that was only queued, or brought back part —\n    // nor about anything that was not an undo.\n    showToast({ message: afterActionWords(after, 'done', out, t), source }, FLASH_TOAST_MS);\n    if (!plain) await load();\n  } catch (err) {\n    if (plain) showToast({ message: failureText(err) }, ERROR_TOAST_MS);\n    else flashToast(t('toast.undo_failed'));\n  }\n}\n\n// --------------------------------------------------------------------\n// Data loading\n// --------------------------------------------------------------------\n\n// multiStorageRoot — when on, \"/\" is a virtual folder listing every\n// configured storage as a clickable dir. Path semantics shift:\n//\n//   \"\"           → global root, list storages\n//   \"<storage>\"  → that storage's root (api: `<storage>://`)\n//   \"<storage>/<rel>\"  → deeper folder (api: `<storage>://<rel>`)\n//\n// `qualify()` is overridden inside this mode to translate the\n// slash-separated user path into the wire `<adapter>://<rel>` form.\nconst multiStorageRoot = computed(() => props.config.multiStorageRoot === true);\n\nfunction splitVirtualPath(p: string): { adapter: string; rel: string } {\n  const clean = p.replace(/^\\/+|\\/+$/g, '');\n  if (!clean) return { adapter: '', rel: '' };\n  const slash = clean.indexOf('/');\n  if (slash === -1) return { adapter: clean, rel: '' };\n  return { adapter: clean.slice(0, slash), rel: clean.slice(slash + 1) };\n}\n\nfunction virtualToWire(p: string): string {\n  // Convert `s3-test/example` → `s3-test://example`. Pass-through\n  // when the input already carries `://` (legacy callers).\n  if (p.includes('://')) return p;\n  const { adapter, rel } = splitVirtualPath(p);\n  if (!adapter) return ''; // global root — no wire form\n  return rel ? `${adapter}://${rel}` : `${adapter}://`;\n}\n\nfunction wireToVirtual(p: string): string {\n  // Convert `s3-test://example` → `s3-test/example`.\n  const idx = p.indexOf('://');\n  if (idx === -1) return p.replace(/^\\/+|\\/+$/g, '');\n  const adapter = p.slice(0, idx);\n  const rel = p.slice(idx + 3).replace(/^\\/+|\\/+$/g, '');\n  return rel ? `${adapter}/${rel}` : adapter;\n}\n\nfunction virtualStorageRows(): FileNode[] {\n  // Synthesize a FileNode for every configured storage. Used as the\n  // \"/\" listing in multi-storage mode.\n  const list = props.config.storages ?? [];\n  return list.map((s) => ({\n    type: 'dir',\n    path: s.name, // virtual path (no adapter prefix)\n    basename: s.label || s.name,\n    extension: '',\n    storage: s.name,\n    visibility: 'private',\n    file_size: 0,\n    mime_type: 'inode/storage',\n    extra_metadata: { driver: s.driver, readOnly: s.readOnly },\n  } as unknown as FileNode));\n}\n\n// Flip dot-file visibility. Both panes filter at load time rather than in a\n// computed, so the listings are re-fetched instead of re-filtered — that keeps\n// selection and the operations that read `files` working on exactly what is\n// on screen.\nfunction toggleHiddenFiles() {\n  setShowHiddenFiles(!showHiddenFiles.value);\n  void load();\n  void splitPaneRef.value?.reload();\n}\n\n/**\n * gorunum:v2-topbar — what the Refresh control actually means.\n *\n * ⚠ ONE function behind BOTH doors (the header's button and the palette's\n * `refresh` command). They used to be two separate `() => load()` arrow\n * functions in the template, which is how one of them would have quietly kept\n * reloading only half of what the other does.\n *\n * The listing is ours; the storage list is the host's (`config.storages`), so\n * the host is told and re-answers it in its own time. Nothing here waits on\n * that: the folder is on screen again either way.\n *\n * surucu:d1 — the storage line is read again too: the person's usage and the\n * drives' sizes both move, and a host that sends no sizes (the desktop app)\n * would otherwise keep the figure the panel mounted with.\n */\nfunction refreshAll() {\n  void load();\n  void loadQuota();\n  emit('refresh');\n}\n\n/**\n * Load a folder (or a view's sentinel) and resolve when the explorer shows the\n * newest listing asked for - this one, or one that overtook it on its way\n * (lib/listingTickets `follow`). A caller that awaits this and then reads the\n * rows or the address reads what is on screen.\n */\nfunction load(path?: string): Promise<void> {\n  return tickets.follow(() => loadListing(path));\n}\n\nasync function loadListing(path?: string) {\n  // Whatever an earlier search said about ITS answer, this listing has not\n  // answered yet (the \"more results than shown\" strip reads this).\n  searchTruncated.value = false;\n  const { ticket, want } = tickets.begin(path, currentPath.value ?? '');\n  // wiring:e2 policy — who may encrypt where, and the per-folder permissions,\n  // are not forgotten here any more (#196): they stay the menu's answers and\n  // this listing's rows are asked again once it is in (prefetchMenuAnswers)\n  // where they are stale. The live socket says when they went stale (an\n  // approval granted meanwhile, a grant, a role); without one nothing would,\n  // so every read starts a new era - the old \"asked again at every read\",\n  // without a menu that waits for it.\n  if (!realtime.connected.value) menuAnswers.stale();\n  /* === etiket:t1 — a sentinel is a VIEW, not a folder ===================\n   * A restored tab, a reload on `#.trash` / `#.starred` / `#.tag~invoices`,\n   * or the breadcrumb crumb for the view you are standing in all arrive here\n   * as a plain path. Without this they went to the backend as a FOLDER NAME\n   * and came back 404, so a view that exists and is merely empty greeted the\n   * user with \"Folder not found — this folder does not exist, was moved, or\n   * you do not have access to it\" (measured on `#.trash` and `#.starred`,\n   * v0.30.1). The trash is not missing; it is empty, and it has a state that\n   * says so.\n   *\n   * ⚠ Through `virtualViewOf` → the ONE map in lib/listing.ts, never a second\n   * list of names here: two copies of that mapping are what printed `.shared`\n   * in the tab strip two days ago, and the tag view adds a dynamic third kind.\n   *\n   * ⚠ Only a sentinel this build KNOWS is intercepted. Anything else keeps\n   * going — a user may genuinely own a folder called `.config`, and with\n   * hidden files shown they can open it.\n   *\n   * ⚠ And only when the view is actually REACHABLE here. Under `rootPath` the\n   * panel is off on purpose (the views span storages and would list files\n   * outside the folder the embed was confined to), so a stale hash from\n   * another deployment must not smuggle them in: it falls back to the root —\n   * which the floor clamp below then turns into the confined folder.\n   *\n   * ⚠ No recursion: neither loader calls load(), and the fallback passes '',\n   * which is not a sentinel.\n   */\n  const asView = virtualViewOf(want);\n  if (asView) {\n    const reachable =\n      asView.kind === 'trash' ? props.config.trashVisible !== false : sideNavEnabled.value;\n    if (!reachable) {\n      // Clear it explicitly: if the fallback lands on the path we are already\n      // on, watch(currentPath) never fires and the dead hash would survive to\n      // the next reload (the same trap leaveNotFound documents).\n      writePersistedPath('');\n      return await load('');\n    }\n    if (asView.kind === 'tag') await loadTagView(asView.tag, asView.tagKind);\n    else await loadNavView(asView.kind);\n    return;\n  }\n  /* A different folder is a different listing, and a selection belongs to the\n   * listing it was made in.\n   *\n   * ⚠⚠ Measured 2026-09-14 (v0.41.0 screenshot pass): double-clicking into an\n   * encrypted folder left \"1 selected\" — cut, copy, DELETE — hanging over its\n   * lock screen, and those actions were aimed at the folder the person was now\n   * standing INSIDE. Two stale things carried it: the selection itself, and\n   * `displayOrder`, the rows the view last drew. The lock screen (like the\n   * not-found state) draws no view, so nothing replaced the parent's rows, and\n   * `selection.nodes` kept resolving the double-clicked folder against them.\n   * A plain folder hid the bug only because its own view re-published its rows\n   * and the stale path stopped resolving — the selection was still there, and\n   * stepping back up brought it back to life.\n   *\n   * ⚠ Only when the FOLDER changes. A reload of the same folder (a realtime\n   * refresh, a mutation's re-render, a search rebased onto it) keeps what the\n   * person picked. Same rule the split pane applies in `onPaneNavigate`. */\n  const leaving = String(currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n  const arriveAt = (to: string) => {\n    if (String(to ?? '').replace(/^\\/+|\\/+$/g, '') === leaving) return;\n    selection.clear();\n    displayOrder.value = [];\n  };\n  loading.value = true;\n  // Any normal navigation exits trash mode (the trash view is entered only\n  // by opening the virtual `.trash` row, which calls loadTrash()).\n  trashMode.value = false;\n  /* gezinti:g1 — and every other virtual view, for the same reason: without\n     this the mode sticks and the breadcrumb keeps saying \"Starred\" over a\n     folder listing. */\n  navView.value = '';\n  navTag.value = '';\n  navTagKind.value = '';\n  let requested = want;\n  tickets.going(want);\n  try {\n    notFoundPath.value = '';\n    loadError.value = '';\n    // Clamp to the confined floor: an empty/above-floor request (incl. a stale\n    // persisted path or the drives root) snaps back to rootPath. This both\n    // suppresses the multi-storage drives list and blocks up-navigation.\n    if (rootFloor) {\n      const p = String(requested).replace(/^\\/+|\\/+$/g, '');\n      if (!p || !(p === rootFloor || p.startsWith(rootFloor + '/'))) requested = rootFloor;\n    }\n\n    // Multi-storage virtual root — synthesize a list of storages\n    // instead of calling the backend.\n    if (multiStorageRoot.value && !virtualToWire(requested)) {\n      // One visible storage → skip the one-row list and open it. Recursion is\n      // bounded: the recursive call carries a non-empty path, so\n      // virtualToWire() resolves and this branch is not re-entered.\n      if (soleStorageName.value) return await load(soleStorageName.value);\n      arriveAt('');\n      currentPath.value = '';\n      adapter.value = '';\n      dirname.value = '';\n      e2eRoot.value = ''; /* wiring:e2 — no lock screen at the virtual root */\n      files.value = virtualStorageRows();\n      return;\n    }\n\n    const target = multiStorageRoot.value\n      ? virtualToWire(requested)\n      : qualify(requested);\n\n    /* wiring:e2 vault — inside an open vault the listing is its index, read\n       in this tab (a search too: the index, by name). A folder below a vault\n       that is not open here is its vault folder, where the lock screen is:\n       the server never hears of a path below a vault. */\n    const vaultRoot = vault.rootOf(target);\n    if (vaultRoot) {\n      const tgt = String(target).replace(/\\/+$/, '');\n      if (vault.isOpen(vaultRoot)) {\n        const here = vault.rows(tgt) ? tgt : vaultRoot;\n        const rowsHere = searchQuery.value ? vault.search(here, searchQuery.value) : vault.rows(here);\n        if (!isNewestLoad(ticket)) return;\n        vault.touch(here);\n        searchTruncated.value = false;\n        adapter.value = here.slice(0, here.indexOf('://'));\n        dirname.value = here;\n        dirPerm.value = vault.permOf(vaultRoot) || '';\n        dirReadOnly.value = !!vault.strips[vaultRoot]?.readOnly;\n        e2eRoot.value = vaultRoot;\n        const arrivedVault = paneToUser(here);\n        arriveAt(arrivedVault);\n        files.value = filterListing(rowsHere ?? []);\n        currentPath.value = arrivedVault;\n        return;\n      }\n      if (tgt !== vaultRoot) return await load(paneToUser(vaultRoot));\n    }\n    /* /wiring:e2 vault */\n\n    /* gorunum:v1-advsearch — a content-scoped search cannot come from the\n       manager's search action (it hardcodes `search.ScopeName`), so it is\n       fetched from /api/files/search and projected onto the listing shape\n       here. Everything downstream — the views, the selection, the inspector —\n       sees ordinary rows, which is the point: one results surface. */\n    const advContent = !!searchQuery.value && advScope.value !== 'name';\n    const adv = advContent ? await advFetchRows(advScope.value, searchQuery.value, target) : null;\n    let ranLocally = false;\n    const resp: ManagerResponse = adv\n      ? {\n          adapter: adapter.value,\n          storages: (props.config.storages ?? []).map((s) => s.name),\n          dirname: dirname.value,\n          read_only: false,\n          files: adv.rows,\n          truncated: adv.truncated,\n        }\n      : searchQuery.value\n        ? await (async () => {\n            const local = await e2eSearchInside(target, searchQuery.value);\n            ranLocally = !!local;\n            return local ?? (await api.search(target, searchQuery.value, searchNarrow()));\n          })()\n        : await api.index(target);\n    /* wiring:e2 vault — the server says this folder is in a vault that is not\n       open in this tab (one this browser may never have opened): a folder\n       below it is its vault folder, where the lock screen is, and the vault\n       folder's own listing is its layout on the storage (`v/`), not rows. */\n    if (!adv && !searchQuery.value && typeof resp.e2e_vault_root === 'string' && resp.e2e_vault_root) {\n      const vr = resp.e2e_vault_root.replace(/\\/+$/, '');\n      if (String(resp.dirname ?? '').replace(/\\/+$/, '') !== vr) {\n        if (!isNewestLoad(ticket)) return;\n        return await load(paneToUser(vr));\n      }\n      resp.files = [];\n    }\n    /* wiring:e2 names — stored names become plaintext here, BEFORE the hidden\n       -file filter, which judges the plaintext (`.gitignore` is a dotfile,\n       its ciphertext is not). Content-only folders come back untouched.\n       ⚠ Before ANY of the listing's state is committed below, and with the\n       root read from the response, not from `e2eRoot`: everything after this\n       await is assigned in one synchronous run. Awaiting between `e2eRoot`\n       and `currentPath` opened a gap in which an upload read the NEW\n       folder's key and the OLD folder's path — a file encrypted for one\n       folder sent to another. e2e/shots/e2e-recovery.mjs, which uploads 1.2 s\n       after opening a folder, once found nothing in the folder it had opened. */\n    resp.files = await e2eNames.decorate(resp.files, {\n      root: typeof resp.e2e_root === 'string' && resp.e2e_root ? resp.e2e_root : null,\n    });\n    // A newer load was asked for while this one was out: its answer is the\n    // one to show, and this one touches nothing (the ticket note above).\n    if (!isNewestLoad(ticket)) return;\n    /* #103 - every row takes the folder's level now, with the rows, rather\n       than reading `dirPerm` whenever it is clicked: by then the explorer\n       may be showing (or loading) something else (lib/rowLevel). */\n    resp.files = withListingLevel(resp.files, resp.perm);\n    // A search that matched more than it returned says so (banner strip). The\n    // server's `truncated` is the answer; an older server that does not send\n    // it leaves the full-page guess the advanced search count always made.\n    searchTruncated.value =\n      !!searchQuery.value && advSearchTruncated(resp.files.length, MANAGER_SEARCH_PAGE, resp.truncated);\n    searchRanLocally.value = !!searchQuery.value && (adv ? adv.local : ranLocally);\n    if (Array.isArray(resp.storage_info)) coverageMap.value = coverageByStorage(resp.storage_info);\n    adapter.value = resp.adapter;\n    dirname.value = resp.dirname;\n    dirPerm.value = (resp.perm as string) || '';\n    dirReadOnly.value = resp.read_only === true;\n    /* wiring:e2 — backend tells us when this dir sits inside an encrypted\n       subtree; '' resets on every plain folder. Drives the lock screen. */\n    e2eRoot.value = typeof resp.e2e_root === 'string' ? resp.e2e_root : '';\n    /* wiring:e2 vault — a folder remembered as a vault that is not an\n       encrypted root any more (removed, replaced) is forgotten. */\n    {\n      const listedDir = String(resp.dirname ?? '').replace(/\\/+$/, '');\n      const listedRoot = typeof resp.e2e_root === 'string' ? resp.e2e_root.replace(/\\/+$/, '') : '';\n      if (vault.rootOf(listedDir) === listedDir && listedRoot !== listedDir) vault.forget(listedDir);\n    }\n    /* /wiring:e2 */\n    // currentPath is the user-facing form: `s3-test/example` in\n    // multi-storage mode, the bare relative path otherwise.\n    const arrived = multiStorageRoot.value ? wireToVirtual(resp.dirname) : stripAdapter(resp.dirname);\n    arriveAt(arrived);\n    files.value = filterListing(resp.files);\n    // Inject virtual `.trash` entry at root only — shared helper so the\n    // split-view secondary pane shows the exact same row (no row-offset).\n    // ⚠ …and NOT into a search result. The search response's `dirname` is the\n    // scope it searched, so it is the storage root exactly as an `index` of\n    // that folder would be; only this call site knows which of the two it just\n    // asked for.\n    if (\n      injectTrashRow(files.value, resp.adapter, resp.dirname, props.config.trashVisible !== false, {\n        isSearchResult: !!searchQuery.value,\n        navOffersTrash: navOffersTrash.value,\n      })\n    ) {\n      void hydrateTrashRowShared(files.value, resp.adapter, api);\n    }\n    currentPath.value = arrived;\n    // #196 - this folder's menu answers, before any menu is opened on it.\n    prefetchMenuAnswers();\n  } catch (err) {\n    // A failure of a superseded load is not the person's folder failing.\n    if (!isNewestLoad(ticket)) return;\n    const e = err instanceof Error ? err.message : String(err);\n    const status = (err as { status?: number }).status;\n    if (status === 404 || status === 403) {\n      // Dead deep link (deleted folder, phantom path or RBAC-hidden dir):\n      // show the dedicated not-found state instead of a toast over a stale\n      // listing that reads as \"this folder is empty\".\n      notFoundPath.value = String(requested);\n      arriveAt(String(requested));\n      e2eRoot.value = ''; /* wiring:e2 — no lock screen left over on a dead link */\n      files.value = [];\n      emit('error', { message: e, context: { path } });\n      return;\n    }\n    // Real failure (network, 5xx). Never swallowed: the error still emits, and\n    // it surfaces either as the retryable error state (nothing else on screen)\n    // or as the classic toast over the still-visible previous listing.\n    loadError.value = e;\n    loadErrorPath = typeof requested === 'string' ? requested : undefined;\n    emit('error', { message: e, context: { path } });\n    if (files.value.length > 0) flashToast(e);\n  } finally {\n    // Only the newest load ends the loading state: an older one finishing\n    // while a newer is out says nothing about the screen.\n    if (isNewestLoad(ticket)) loading.value = false;\n    tickets.end(ticket);\n  }\n}\n\nfunction stripAdapter(p: string): string {\n  const idx = p.indexOf('://');\n  return idx === -1 ? p : p.slice(idx + 3);\n}\n\n// \"Go to root\" escape hatch on the not-found state. load('') clamps to the\n// confined rootFloor on embeds, so this is safe everywhere.\nfunction leaveNotFound() {\n  notFoundPath.value = '';\n  // Cold-load on a dead deep link: currentPath is still '' (the 404 never\n  // committed it), so navigating to root doesn't change it and the\n  // watch(currentPath) persistence never fires — the dead hash would\n  // survive and a reload would land on the 404 again. Clear it explicitly;\n  // if load('') clamps to a confined floor path, the watch fires with the\n  // new path and rewrites the hash correctly anyway.\n  writePersistedPath('');\n  void load('');\n}\n\n// (hydrateTrashRow moved to lib/listing.ts — shared with SecondaryPane.)\n\n// loadTrash — show the backend trash (soft-deleted nodes) as a flat listing.\n// Entered by opening the virtual `.trash` row. Each row keeps its node `id`\n// so restore can target it. Permanent delete is admin-only / auto-purge, so\n// the only mutation offered here is Restore.\n/* === tablo:t1 — the trash banner ======================================\n *\n * The reference build draws, above the listing: what the trash IS, and the one\n * irreversible action. We had neither — and the second half is a real\n * regression rather than a missing decoration, because the only \"Empty trash\"\n * in the whole repo is on the admin page `web/src/views/Trash.vue`, reached\n * from the admin panel's own sidebar. An end user, who never sees the admin\n * panel, had no way to empty their own trash at all.\n *\n * ⚠⚠ RETENTION IS A CLAIM, NOT A DECORATION. The reference says \"30 days\";\n * ours must say what THIS deployment actually does, and `trash.retention_days`\n * is a setting an operator changes. A banner stating the wrong number is worse\n * than no banner, because people act on it — they leave something in the\n * trash believing they have a month. So the number is asked for, and when the\n * answer does not come the wording drops the period instead of guessing one.\n *\n * ⚠⚠ ONE PROBE ANSWERS BOTH QUESTIONS. `GET /api/admin/protection` carries\n * the real retention and is refused to anyone who is not an operator — and\n * `POST /api/admin/trash/empty` is gated on exactly the same thing. So its\n * status code tells us the number AND whether this caller may empty anything,\n * without a UI-side role check. That matters here: this file's own rule is\n * that the BACKEND decides what a caller may see (see the note on\n * `connections` in ExplorerConfig), and a client-side `role === \"admin\"` would\n * be us guessing at an answer the server is willing to give.\n */\nconst trashRetentionDays = ref<number | null>(null);\n/** True only when the server has confirmed this caller may purge. */\nconst trashCanEmpty = ref(false);\nconst trashEmptying = ref(false);\nconst showTrashConfirm = ref(false);\n/** The purge being followed, while the server reports it as running. */\nconst trashEmptyRun = ref<TrashEmptyStatus | null>(null);\n/* Set when the explorer is taken down: it stops the following — the purge\n * is the server's and carries on. */\nlet trashEmptyUnwatched = false;\nonBeforeUnmount(() => {\n  trashEmptyUnwatched = true;\n  catalogWatcher?.stop();\n});\n\n/* ⚠ What is known stays until the answer replaces it. The probe used to set\n * both back to \"not allowed\" first, so \"Delete permanently\" left every menu\n * for the length of each probe — and #69 probed once per purge job that\n * ended. */\nasync function probeTrashPolicy() {\n  try {\n    const res = await fetch(`${props.config.apiBase ?? ''}/api/admin/protection`, {\n      headers: await buildAuthHeaders(),\n      credentials: api.credentialsMode(),\n    });\n    /* ⚠ A 403 is the ANSWER \"you are not an operator\", not a failure: it is\n     * the ordinary case for every end user, and it must not reach the error\n     * emitter or the toast. */\n    if (!res.ok) {\n      trashRetentionDays.value = null;\n      trashCanEmpty.value = false;\n      return;\n    }\n    const body = (await res.json()) as { trash_retention_days?: unknown };\n    const d = body?.trash_retention_days;\n    trashRetentionDays.value = typeof d === 'number' && d > 0 ? d : null;\n    trashCanEmpty.value = true;\n  } catch {\n    /* offline / CORS — nothing is claimed that was not verified: a first\n     * probe leaves both at \"not allowed\", a later one keeps the last answer */\n  }\n}\n\n/** What the banner promises. Named the number, or explicitly not. */\nconst trashBannerText = computed(() =>\n  trashRetentionDays.value !== null\n    ? t('trash.retention', { days: trashRetentionDays.value })\n    : t('trash.retention_unknown'),\n);\n\n/* ⚠⚠ What \"Empty trash\" deletes is counted by the SERVER (finding D1, 0.54).\n * The confirmation said \"This permanently deletes 50 items (2 MB)\" — the rows\n * this view had loaded, the first page of the listing — and the purge took\n * every entry the caller reaches: other people's deletes and the desktop\n * app's swept working copies too, 61,844 items on one install. The dialog now\n * asks the purge's own dry run (GET /api/admin/trash/empty/preview) and shows\n * its sentence; the button waits for it. */\nconst trashPreview = ref<TrashEmptyPreview | null>(null);\nconst trashPreviewError = ref('');\nlet trashPreviewAsk = 0;\n\nasync function openTrashConfirm() {\n  trashPreview.value = null;\n  trashPreviewError.value = '';\n  showTrashConfirm.value = true;\n  const ask = ++trashPreviewAsk;\n  try {\n    const preview = await api.trashEmptyPreview();\n    if (ask === trashPreviewAsk) trashPreview.value = preview;\n  } catch (err) {\n    if (ask === trashPreviewAsk) trashPreviewError.value = serverWords(err, locale.value);\n  }\n}\n\n/** Where a followed purge stands — the server's own sentence\n *  (\"Emptying the trash… 120 of 61,844\"). */\nconst trashEmptyProgress = computed(() => {\n  const run = trashEmptyRun.value;\n  return run?.running ? run.summary ?? '' : '';\n});\n\n/* ⚠⚠ A 2xx is not \"emptied\" any more. The endpoint used to purge inside the\n * request, so a large trash never answered — nginx's 504 at sixty seconds\n * became a toast reading \"504\". It now answers within seconds: the final\n * counts, or 202 while the purge goes on in the background, which\n * lib/trashEmpty follows on GET until the run ends. How it ended is the\n * server's sentence (`summary`, finding A4): never a status code, never \"see\n * the server log\". */\nasync function emptyTrash() {\n  showTrashConfirm.value = false;\n  if (!trashCanEmpty.value || trashEmptying.value) return;\n  const url = api.endpoints.trashEmpty;\n  if (!url) return;\n  trashEmptying.value = true;\n  try {\n    const end = await emptyTrashAndFollow({\n      start: async () =>\n        fetch(api.withScreenLang(url), {\n          method: 'POST',\n          headers: await buildAuthHeaders(),\n          credentials: api.credentialsMode(),\n        }),\n      status: async () =>\n        fetch(api.withScreenLang(url), { headers: await buildAuthHeaders(), credentials: api.credentialsMode() }),\n      locale: locale.value,\n      /* The run is an ops row: it goes into the operations centre (progress,\n       * Cancel) the moment the server names it — a run done within the wait\n       * as well, like any other operation the person started. */\n      onStart: (run) => {\n        if (!run.op_id) return;\n        pendingOps.register({\n          id: run.op_id,\n          kind: 'trash-empty',\n          status: run.running ? (run.queued ? 'pending' : 'running') : run.cancelled ? 'cancelled' : 'ok',\n          total: run.total ?? 0,\n          done: run.scanned ?? 0,\n        });\n      },\n      onProgress: (run) => {\n        trashEmptyRun.value = run;\n      },\n      onBusy: (said) => {\n        if (said) flashToast(said);\n      },\n      stopped: () => trashEmptyUnwatched,\n    });\n    if (end === null) return;\n    /* Only the view that is still showing the trash is redrawn: somebody who\n     * went on to a folder while it ran is not pulled back into the trash. */\n    if (trashMode.value) await loadTrash();\n    /* `{running: false}` with no start is a run the server no longer knows —\n     * it restarted under it. The listing just reloaded says what is left, and\n     * nothing is claimed about the rest. */\n    if (!end.started_at || !end.summary) return;\n    showToast({ message: end.summary }, end.error || end.failed ? ERROR_TOAST_MS : FLASH_TOAST_MS);\n  } catch (err) {\n    if (err instanceof TrashEmptyBusy) {\n      flashToast(err.message);\n      return;\n    }\n    const msg = serverWords(err, locale.value);\n    emit('error', { message: (err as Error)?.message ?? String(err), context: { op: 'trash:empty' } });\n    flashToast(msg);\n  } finally {\n    trashEmptyRun.value = null;\n    trashEmptying.value = false;\n  }\n}\n\n/* ⚠⚠ The Trash view is paged (finding D1, 0.54). It read the listing once,\n * with no limit — the server's default page of 50 — and ignored the `total`\n * beside it: entries older than the newest 50 could not be seen or restored,\n * and sorting by name hid that the list was cut. A page of TRASH_PAGE now,\n * the server's count and size above it (`summary`), and \"Show more\" reads the\n * next page until every entry is on screen. */\nconst TRASH_PAGE = 200;\n/** The server's count of every entry the caller may see in the trash. */\nconst trashTotal = ref(0);\n/** Entries read so far (the pages on screen). */\nconst trashLoaded = ref(0);\n/** The server's sentence for the whole trash (\"61,844 items in the trash,\n *  12.3 GB in all\"). */\nconst trashSummary = ref('');\nconst trashMoreBusy = ref(false);\nconst trashShownText = computed(() => {\n  const nf = new Intl.NumberFormat(localeTag(locale.value));\n  return t('trash.shown_of', { shown: nf.format(trashLoaded.value), total: nf.format(trashTotal.value) });\n});\n\n/** Trash entries as explorer rows. Each row keeps its node `id` so restore\n *  and purge can target it. */\nfunction trashRowsOf(entries: TrashEntry[]): FileNode[] {\n  return entries.map(\n    (e) =>\n      ({\n        type: 'file',\n        id: e.id,\n        /* Which storage's trash it is in: a permanent delete is one job per\n           storage, and each job's rows are the ones it deletes. */\n        storage_id: e.storage_id,\n        /* ⚠ The ORIGINAL path, which the server sends with its leading\n           slash: `depo:///x.txt` put an empty segment in the Location\n           column (\"depo/\"), so it is dropped here. */\n        path: e.storage_name ? `${e.storage_name}://${e.path.replace(/^\\/+/, '')}` : e.path,\n        basename: e.name,\n        extension: e.name.includes('.') ? e.name.split('.').pop() || '' : '',\n        storage: e.storage_name || '',\n        visibility: 'private',\n        /* tablo:t1 — ⚠ BOTH. Every view reads `size` (the Size column, the\n           info panel); only the upload code reads `file_size`. Setting one of\n           the two left every trashed row with a blank Size cell. */\n        size: e.size,\n        file_size: e.size,\n        mime_type: e.mime || '',\n        /* The date the Trash's date column prints and sorts by — WHEN it was\n           deleted. A trashed row has no modification date to show, and the\n           column read \"—\" for every row. */\n        last_modified: Date.parse(e.deleted_at) || undefined,\n        extra_metadata: {\n          deleted_at: e.deleted_at,\n          ttl_days: e.ttl_days ?? null,\n          /* A permanent delete is on its way for it (purgeSelection). */\n          purging: trashPurging.value.has(e.id),\n          /* #71 — a discarded draft of the asker's: its Location reads\n             \"Drafts\" (ListView), which is where Restore puts it back. */\n          ...(e.draft ? { draft: true } : {}),\n        },\n        /* Who put it here — the Trash draws it where a folder draws the\n           owner. Keys absent when nobody is named, as the listing sends. */\n        ...(e.deleted_by_id !== undefined ? { deleted_by_id: e.deleted_by_id } : {}),\n        ...(e.deleted_by_name ? { deleted_by_name: e.deleted_by_name } : {}),\n        ...(e.deleted_by_self ? { deleted_by_self: true } : {}),\n        /* wiring:e2 names — the encrypted folder it was deleted from. */\n        ...((e as { e2e_root?: string }).e2e_root ? { e2e_root: (e as { e2e_root?: string }).e2e_root } : {}),\n      }) as unknown as FileNode,\n  );\n}\n\nasync function loadTrash() {\n  const ticket = tickets.view();\n  loading.value = true;\n  trashOrigin.value = adapter.value || '';\n  trashMode.value = true;\n  e2eRoot.value = ''; /* wiring:e2 — the trash view is outside the encrypted context */\n  selection.clear();\n  try {\n    const page = await api.listTrash(undefined, { limit: TRASH_PAGE });\n    /* wiring:e2 names — a trashed item keeps its stored name; decrypt it the\n       way its folder would, and keep the long-name sidecars out of sight. */\n    const shown = await e2eNames.decorate(trashRowsOf(page.entries));\n    if (!isNewestLoad(ticket)) return;\n    files.value = shown;\n    trashLoaded.value = page.entries.length;\n    trashTotal.value = page.total;\n    trashSummary.value = page.summary ?? '';\n    dirname.value = '.trash';\n    currentPath.value = '.trash';\n  } catch (err) {\n    if (!isNewestLoad(ticket)) return;\n    const msg = err instanceof Error ? err.message : String(err);\n    emit('error', { message: msg, context: { op: 'trash-list' } });\n    flashToast(msg);\n  } finally {\n    if (isNewestLoad(ticket)) loading.value = false;\n  }\n}\n\n/** The next page of the trash, appended under the ones on screen. A reload\n *  of the trash (or leaving it) meanwhile drops the answer. */\nasync function loadMoreTrash() {\n  if (trashMoreBusy.value || trashLoaded.value >= trashTotal.value) return;\n  const at = trashLoaded.value;\n  trashMoreBusy.value = true;\n  try {\n    const page = await api.listTrash(undefined, { limit: TRASH_PAGE, offset: at });\n    const shown = await e2eNames.decorate(trashRowsOf(page.entries));\n    if (!trashMode.value || trashLoaded.value !== at) return;\n    files.value = [...files.value, ...shown];\n    trashLoaded.value = at + page.entries.length;\n    trashTotal.value = page.total;\n    trashSummary.value = page.summary ?? '';\n  } catch (err) {\n    showToast({ message: failureText(err) }, ERROR_TOAST_MS);\n  } finally {\n    trashMoreBusy.value = false;\n  }\n}\n\n/**\n * qualify — return `<adapter>://<rel>` for backend calls.\n *\n * The backend's manager handler picks a storage by parsing the\n * adapter prefix. Without one it falls back to `storages[0]`,\n * which 404s on every non-default storage (S3/SFTP/WebDAV in a\n * multi-storage install). All API callers (rename/move/delete/\n * upload/preview/download/share/copy) must use a qualified path.\n *\n * In multi-storage mode `currentPath` is `<storage>/<rel>` (no\n * `://`), so qualify forwards through `virtualToWire` which\n * splits the first segment off as the adapter. In single-storage\n * mode the legacy bare-relative path is glued onto `adapter.value`.\n *\n * `stripAdapter()` stays for cosmetic display logic only\n * (breadcrumb root check, inRoot computation, openPageBase).\n */\nfunction qualify(p: string): string {\n  if (p && p.includes('://')) return p;\n  if (multiStorageRoot.value) {\n    const wire = virtualToWire(p ?? '');\n    if (wire) return wire;\n    return adapter.value ? `${adapter.value}://` : '';\n  }\n  if (!p) return `${adapter.value}://`;\n  return `${adapter.value}://${p.replace(/^\\/+/, '')}`;\n}\n\n// ----------------------------------------------------------------\n// Undo helpers — compute the inverse of cleanly-invertible operations\n// (move → reverse move, rename → rename back, trash → restore). All\n// paths here are wire form (`<adapter>://<rel>`).\n// ----------------------------------------------------------------\n\nfunction wireBasename(p: string): string {\n  const idx = p.indexOf('://');\n  const rel = (idx === -1 ? p : p.slice(idx + 3)).replace(/\\/+$/, '');\n  const slash = rel.lastIndexOf('/');\n  return slash === -1 ? rel : rel.slice(slash + 1);\n}\n\nfunction wireParent(p: string): string {\n  const idx = p.indexOf('://');\n  const prefix = idx === -1 ? '' : p.slice(0, idx + 3);\n  const rel = (idx === -1 ? p : p.slice(idx + 3)).replace(/\\/+$/, '');\n  const slash = rel.lastIndexOf('/');\n  return slash === -1 ? prefix : prefix + rel.slice(0, slash);\n}\n\n/* ui-fix — do two wire paths point at the SAME directory (safe against a\n * trailing slash and against the bare `adapter://` root)? Dropping an item\n * into the folder it is ALREADY in (source parent === target) must be a\n * no-op; otherwise the backend answers with a \"copy onto itself\" 400. */\nfunction sameDir(a: string, b: string): boolean {\n  const norm = (s: string) => {\n    const i = s.indexOf('://');\n    const pre = i === -1 ? '' : s.slice(0, i + 3);\n    const rel = (i === -1 ? s : s.slice(i + 3)).replace(/\\/+$/, '');\n    return pre + rel;\n  };\n  return norm(a) === norm(b);\n}\n\nfunction wireJoin(dir: string, name: string): string {\n  if (!dir) return name;\n  return dir.endsWith('://') || dir.endsWith('/') ? dir + name : `${dir}/${name}`;\n}\n\n/**\n * Does anything in `targetWire` already carry the name of one of `sources`?\n * Asked BEFORE a move is queued, because the answer decides whether the move\n * can be undone.\n *\n * ⚠ The server never moves onto a taken name — it keeps both, and the moved\n * item lands as `name-copy` (ops.MoveDest). The undo moves `target/<name>`\n * back, so after a collision it would move the item that WAS ALREADY THERE.\n * A colliding move is therefore offered no undo, and says so.\n *\n * Case-insensitive, and \"could not list\" counts as a collision: both err on\n * the side of withholding an undo rather than offering one that moves the\n * wrong file.\n */\nasync function movedNamesCollide(sources: string[], targetWire: string): Promise<boolean> {\n  try {\n    const res = await api.index(targetWire);\n    const taken = new Set((res.files ?? []).map((f) => String(f.basename ?? '').toLowerCase()));\n    return sources.some((s) => taken.has(wireBasename(s).toLowerCase()));\n  } catch {\n    return true;\n  }\n}\n\n// Register the inverse of a queued async move under its op id: once the op\n// settles OK, the toast offers \"Geri Al\" which queues the reverse move. The\n// inverse op deliberately gets NO undo entry of its own (no redo ping-pong).\nfunction registerMoveUndo(\n  opId: number,\n  sources: string[],\n  targetWire: string,\n  originWire: string | undefined,\n  collides: boolean,\n) {\n  if (!originWire || !targetWire || collides) return;\n  const movedPaths = sources.map((p) => wireJoin(targetWire, wireBasename(p)));\n  if (movedPaths.length === 0) return;\n  opUndo.set(opId, {\n    message: t('toast.moved'),\n    fn: async () => {\n      const { op } = await api.moveAsync(movedPaths, originWire, targetWire);\n      pendingOps.register(op);\n      return { queued: true };\n    },\n  });\n}\n\nwatch(\n  () => searchQuery.value,\n  () => void load(),\n);\n\n// ----------------------------------------------------------------\n// Path persistence\n// ----------------------------------------------------------------\nconst PATH_LS_KEY = 'brf-file-explorer:path';\n\nfunction persistMode(): 'hash' | 'localStorage' | 'hash+localStorage' | 'none' {\n  return props.config.pathPersist ?? 'hash';\n}\n\nfunction hashPersistEnabled(): boolean {\n  const m = persistMode();\n  return m === 'hash' || m === 'hash+localStorage';\n}\n\n// A pasted/hand-edited hash can carry a stray `%` (a folder literally named\n// \"100%\") that decodeURIComponent rejects — fall back to the raw text.\nfunction safeDecode(s: string): string {\n  try {\n    return decodeURIComponent(s);\n  } catch {\n    return s;\n  }\n}\n\nfunction readLsPath(): string {\n  try {\n    return localStorage.getItem(PATH_LS_KEY) || '';\n  } catch {\n    return '';\n  }\n}\n\nfunction readHashPath(): string {\n  const h = window.location.hash || '';\n  if (!h.startsWith('#')) return '';\n  return safeDecode(h.slice(1)).replace(/^\\/+|\\/+$/g, '');\n}\n\nfunction readPersistedPath(): string {\n  if (typeof window === 'undefined') return '';\n  const mode = persistMode();\n  if (mode === 'none') return '';\n  if (mode === 'localStorage') return readLsPath();\n  const fromHash = readHashPath();\n  if (fromHash || mode === 'hash') return fromHash;\n  // hash+localStorage with an empty hash: an explicit start path\n  // (?storage= deep link / rootPath floor) outranks the remembered folder.\n  if (initialFloorPath) return '';\n  return readLsPath();\n}\n\nfunction writePersistedPath(path: string) {\n  if (typeof window === 'undefined') return;\n  const mode = persistMode();\n  if (mode === 'none') return;\n  if (mode === 'localStorage' || mode === 'hash+localStorage') {\n    try {\n      if (path) localStorage.setItem(PATH_LS_KEY, path);\n      else localStorage.removeItem(PATH_LS_KEY);\n    } catch {\n      /* private mode / quota */\n    }\n    if (mode === 'localStorage') return;\n  }\n  // Encode per segment so folder names with `%`/`#`/`?` survive the URL\n  // round-trip while `/` separators stay readable.\n  const encoded = path ? path.split('/').map(encodeURIComponent).join('/') : '';\n  const target = encoded ? `#${encoded}` : '';\n  if ((window.location.hash || '') === target) return;\n  // replaceState never fires `hashchange`, so onHashChange only ever sees\n  // genuine external edits (paste, back/forward) — no self-echo to suppress.\n  //\n  // ⚠⚠ `history.state`, NEVER `null`. This mirrors the current folder into the\n  // hash, and it runs inside a host that may be a router-driven SPA: the admin\n  // app is vue-router, which keeps its own bookkeeping (scroll position, the\n  // position counter, `back`/`forward` links) in `history.state`. Passing\n  // `null` here erased it, vue-router warned\n  //   \"history.state seems to have been manually replaced without preserving\n  //    the necessary values\"\n  // and the NEXT navigation — into Home, or out to the admin panel — rendered\n  // a blank page. Measured 2026-09-13. Preserving the object costs nothing:\n  // the explorer has no state of its own to put there, only a URL to change.\n  history.replaceState(\n    history.state,\n    '',\n    target || window.location.pathname + window.location.search,\n  );\n}\n\nfunction onHashChange() {\n  if (!hashPersistEnabled()) return;\n  const p = readHashPath();\n  if (p && p !== currentPath.value) {\n    void load(p);\n  }\n}\n\nwatch(currentPath, (p) => {\n  /* wiring:e2 vault — a path inside a vault exists only in this tab: the\n     address kept (hash, local storage) and told to the host is the vault\n     folder, so a reload never sends a path below it. */\n  const kept = vault.rootOf(qualify(p)) ? paneToUser(vault.rootOf(qualify(p))!) : p;\n  writePersistedPath(kept);\n  emit('navigate', { path: kept });\n  realtime.subscribe(realtimeRoom(p));\n});\n\n// Let a host force a soft re-fetch of the current folder (reusing the existing\n// list-fetch) — used by the realtime layer to refresh on live change events\n// without a full component remount.\ndefineExpose({\n  reload: () => load(),\n  /* App plugins — a notification's `target.open` lands here (see the\n     function's own note for why this is a method and not a prop). */\n  openAppTarget,\n  /* A notification's destination, carried out in this explorer — the desktop\n     app hands a clicked OS notification here (see the function's note). */\n  revealNotification,\n});\n\nonMounted(async () => {\n  // Eagerly start fetching Monaco — the user doesn't pay for it\n  // perceptually; click-to-edit hits an in-memory cache.\n  preloadEditor();\n\n  const fromPersist = readPersistedPath();\n  try {\n    await load(fromPersist || undefined);\n  } finally {\n    // A reveal waits for this (revealNotification); a failed first listing\n    // must not leave it waiting forever.\n    markFirstLoad();\n  }\n  await nextTick();\n  rootEl.value?.focus();\n  // (0.54: no star list is fetched here any more - every row says `starred`.)\n  /* gezinti:g1 — which storages are grant-only, so the panel can mark them\n     before anybody opens the shared view. */\n  void loadSharedStorages();\n  /* etiket:t1 — the panel's tag list. AFTER the first listing has been\n     awaited above, never racing it: `tags/all` is a distinct-scan and the\n     folder the user asked for is the only thing on the critical path. The\n     module-level cache in lib/tags.ts means several explorers on one page\n     still cost a single query. */\n  void loadNavTags();\n  /* surucu:d1 — the storage line. After the listing, like the tag list: it is\n     a status, and the folder somebody asked for is the critical path. */\n  void loadQuota();\n  /* ⚠ The panel is not always on screen at mount. Below 560px it is a DRAWER\n     that starts closed, so `navVisible` is false and the call above returns\n     without asking for anything — measured at 390px: the drawer opened with\n     no Tags section at all. Ask again the first time the panel appears.\n     ⚠ Registered HERE and not beside loadNavTags: `watch` evaluates its\n     source immediately, `navVisible` reads `isNarrow`, and `isNarrow` is\n     declared further down the file — so a watcher created at setup time threw\n     \"Cannot access 'isNarrow' before initialization\" and took the whole\n     explorer down with it (measured: blank pane, two TDZ errors in the\n     console). In onMounted every ref exists. */\n  watch(navVisible, (visible) => {\n    if (visible && !navTagsLoaded.value) void loadNavTags();\n  });\n  if (hashPersistEnabled()) {\n    window.addEventListener('hashchange', onHashChange);\n  }\n  if (api.endpoints.opsList) {\n    pendingOps.startPolling();\n  }\n  // ⚠ Not awaited here — the listing must not wait on it — but tracked, so a\n  // caller that genuinely needs the answer (openAppTarget) can await the same\n  // promise instead of reading a ref that may not be filled yet.\n  void loadCapabilities();\n});\n\n// --------------------------------------------------------------------\n// Keyboard\n// --------------------------------------------------------------------\n\n/* cila:c wiring — command palette (Ctrl/Cmd+K) + shortcuts help (?) state */\nconst showPalette = ref(false);\nconst showShortcutsHelp = ref(false);\n/* /cila:c wiring */\n\n/* bul:s3 — palette \"everywhere\" search + open-hit navigation */\n\n/** What this mount knows about drives, for a hit that does not name its own. */\nfunction hitDrives(): HitDriveContext {\n  return { configured: (props.config.storages ?? []).map((s) => s.name), current: adapter.value };\n}\n\n/**\n * #47 — the account a hit belongs to when it is NOT this mount's own, else\n * null. Only a host that searches several accounts stamps hits at all.\n */\nfunction foreignAccountOf(hit: GlobalSearchHit): SearchAccount | null {\n  const hook = props.config.accountSearch;\n  const acc = hit.account;\n  if (!hook || !acc || acc.id === hook.self.id) return null;\n  return acc;\n}\n\n/** #47 — the hit as an item. Another account's hit is addressed by what the\n *  HIT says and nothing else: this mount's drives are not that server's. */\nfunction paletteHitItem(hit: GlobalSearchHit) {\n  return hitItem(hit, foreignAccountOf(hit) ? { configured: [], current: '' } : hitDrives());\n}\n\n// Debounce/min-chars live in the palette; this is the API call — and, when\n// the host holds several accounts (#47), one call per account through the\n// host's hook, each answer stamped with its account. One account failing\n// costs its own group, not the others'.\n/**\n * wiring:e2 names — search hits that sit inside an encrypted-names folder,\n * named the way every other view names them: plaintext while the folder is\n * unlocked, the locked placeholder while it is not. The key file and\n * long-name sidecars are dropped. Hits outside such folders pass untouched.\n */\nasync function e2eNameHits(hits: GlobalSearchHit[]): Promise<GlobalSearchHit[]> {\n  if (!hits.some((h) => typeof h.e2e_root === 'string' && h.e2e_root)) return hits;\n  const storageName = adapter.value || (props.config.storages ?? [])[0]?.name || '';\n  const named = await Promise.all(\n    hits.map((h) => e2eNames.decorate([hitToNode(h, storageName)]).then((r) => r[0] ?? null)),\n  );\n  const out: GlobalSearchHit[] = [];\n  hits.forEach((h, i) => {\n    const n = named[i];\n    if (!n) return;\n    out.push(n.e2e_stored ? { ...h, name: n.basename, e2e_display_dir: n.e2e_display_dir } : h);\n  });\n  return out;\n}\n\nasync function paletteGlobalSearch(q: string): Promise<GlobalSearchHit[]> {\n  const own = api.globalSearch(q, { limit: 8, scope: 'all' }).then(e2eNameHits);\n  const hook = props.config.accountSearch;\n  if (!hook) return own;\n  let others: SearchAccount[] = [];\n  try {\n    others = (await hook.others()) ?? [];\n  } catch {\n    others = [];\n  }\n  if (others.length === 0) return own;\n  const accounts = [hook.self, ...others];\n  const answers = await Promise.allSettled([\n    own,\n    ...others.map((a) => hook.search(a.id, q, { limit: 8, scope: 'all' })),\n  ]);\n  const out: GlobalSearchHit[] = [];\n  answers.forEach((r, i) => {\n    if (r.status !== 'fulfilled' || !Array.isArray(r.value)) return;\n    for (const h of r.value) out.push({ ...h, account: accounts[i] });\n  });\n  return out;\n}\n\n/**\n * Open a global-search hit: navigate to the file's folder, then select +\n * preview it through the existing openNode mechanics. Hits come back as raw\n * node rows (in-storage relative `path`, numeric `storage_id`), so the\n * storage segment for multi-storage mode is resolved by `hitStorageName`\n * (lib/searchHit): the name on the hit > the only configured storage > the\n * storage currently open. A wrong guess lands on the existing \"folder not\n * found\" state, which is already a graceful dead-end.\n */\nasync function openSearchHit(hit: GlobalSearchHit) {\n  const rel = hitRelPath(hit);\n  if (!rel) return;\n  const isDir = hit.type === 'dir';\n  const slash = rel.lastIndexOf('/');\n  const targetRel = isDir ? rel : slash === -1 ? '' : rel.slice(0, slash);\n  let target = targetRel;\n  if (multiStorageRoot.value) {\n    const storageName = hitStorageName(hit, hitDrives());\n    if (!storageName) return;\n    target = targetRel ? `${storageName}/${targetRel}` : storageName;\n  }\n  await load(target);\n  if (isDir) return;\n  const name = String(hit.name ?? rel.slice(slash + 1));\n  const node = files.value.find((f) => f.type === 'file' && f.basename === name);\n  if (node) {\n    selection.click(node.path);\n    openNode(node);\n  }\n}\n\n/* === #47 — the palette's hit verbs ====================================\n *\n * Open, download and drag out, each answered by what a LISTING row of the\n * same file already uses: `openSearchHit` → openNode, `downloadSelection`,\n * `handDragOut`. Another account's hit goes to the host's hook instead — the\n * explorer holds no credential for that server.\n */\n\nfunction reportHookFailure(op: string) {\n  return (err: unknown) => emit('error', { message: (err as Error)?.message ?? String(err), context: { op } });\n}\n\nfunction onPaletteOpenHit(hit: GlobalSearchHit) {\n  const acc = foreignAccountOf(hit);\n  const hook = props.config.accountSearch;\n  if (acc && hook) {\n    const item = paletteHitItem(hit);\n    if (item) void Promise.resolve(hook.open(acc.id, item)).catch(reportHookFailure('search-open'));\n    return;\n  }\n  void openSearchHit(hit);\n}\n\n/** Which verbs a hit row offers. Mirrors what a listing row of it would do. */\nfunction paletteHitCan(hit: GlobalSearchHit, action: 'download' | 'drag'): boolean {\n  const item = paletteHitItem(hit);\n  if (!item) return false;\n  if (foreignAccountOf(hit)) {\n    const hook = props.config.accountSearch;\n    return action === 'download' ? !!hook?.download : !!hook?.dragStart;\n  }\n  if (action === 'download') return true;\n  // The shell carries anything; the browser's own path carries ONE file — on\n  // the plain download URL where the session is a cookie, on a minted link\n  // where it is a bearer (#71, lib/dragOut createDragLinks), and not at all\n  // against a server too old to mint one.\n  return (\n    !!dragOut.value ||\n    (item.type === 'file' && (canDownloadUrlDrag(props.config.auth) || dragLinksSupported.value))\n  );\n}\n\n/** #71 — the pointer rests on / presses a hit: get its drag-out link ready. */\nfunction onPaletteWarmHit(hit: GlobalSearchHit) {\n  if (foreignAccountOf(hit)) return;\n  const item = paletteHitItem(hit);\n  if (item && item.type === 'file') warmDragLink(item.path);\n}\n\nfunction downloadSearchHit(hit: GlobalSearchHit) {\n  const item = paletteHitItem(hit);\n  if (!item) return;\n  const acc = foreignAccountOf(hit);\n  if (acc) {\n    const hook = props.config.accountSearch;\n    if (hook?.download) void Promise.resolve(hook.download(acc.id, item)).catch(reportHookFailure('search-download'));\n    return;\n  }\n  // The same row the advanced search draws for this hit, through the same\n  // download a selected listing row takes: a file is its own body, a folder\n  // one streaming archive.\n  void downloadSelection([hitToNode(hit, hitStorageName(hit, hitDrives()))]);\n}\n\nfunction onPaletteDragHit(hit: GlobalSearchHit, ev: DragEvent) {\n  const item = paletteHitItem(hit);\n  if (!item || !ev.dataTransfer) {\n    ev.preventDefault();\n    return;\n  }\n  ev.dataTransfer.effectAllowed = 'copy';\n  const acc = foreignAccountOf(hit);\n  if (acc) {\n    const hook = props.config.accountSearch;\n    // Always the OS drag: the browser's own path would fetch another\n    // server's file with THIS page's session.\n    ev.preventDefault();\n    if (hook?.dragStart) void Promise.resolve(hook.dragStart(acc.id, [item])).catch(reportHookFailure('drag-out'));\n    return;\n  }\n  // `null` origin: a hit is dragged OUT, never moved — the palette covers the\n  // listing, so there is no folder in this window for it to land on.\n  handDragOut(ev, [item], null, typeof hit.mime === 'string' ? hit.mime : undefined);\n}\n\n/** A hit drag let go inside the palette: the shell stops waiting for a drop. */\nfunction onPaletteDropInside() {\n  endNativeDrag();\n  cancelShellDrag();\n}\n/* /bul:s3 */\n\nuseKeyboardShortcuts(rootEl, {\n  onDelete: () => {\n    // In the trash, only someone the server lets purge is asked; everybody\n    // else is told how the trash empties itself.\n    if (trashMode.value && !paneIsActive.value && !trashCanEmpty.value) {\n      if (!selection.isEmpty.value) flashToast(t('toast.trash_retention'));\n      return;\n    }\n    /* ui-fix — the shortcut goes to the active pane too (consistent with the menu). */\n    if (paneIsActive.value) {\n      const psel = splitSelection.nodes.value;\n      if (psel.length) {\n        paneCtxTargets.value = psel;\n        mutationInPane.value = true;\n        showDelete.value = true;\n      }\n    } else if (!selection.isEmpty.value) {\n      mutationInPane.value = false;\n      showDelete.value = true;\n    }\n  },\n  onRename: () => {\n    if (paneIsActive.value) {\n      const psel = splitSelection.nodes.value;\n      if (psel.length === 1) {\n        renameTarget.value = psel[0];\n        mutationInPane.value = true;\n        showRename.value = true;\n      }\n    } else if (selection.nodes.value.length === 1) {\n      renameTarget.value = selection.nodes.value[0];\n      mutationInPane.value = false;\n      showRename.value = true;\n    }\n  },\n  onSelectAll: () => (paneIsActive.value ? splitSelection.selectAll() : selection.selectAll()) /* wiring:d1 pane-route */,\n  onOpen: () => {\n    /* wiring:d1 pane-route — one `openNode`, whichever pane asked. A folder\n       opens IN the pane that had the keyboard; a file opens in the preview,\n       which is the window's, so there is nothing to route. */\n    if (paneIsActive.value) {\n      const pn = splitSelection.nodes.value[0];\n      if (pn) onPaneOpen('split', pn);\n      return;\n    }\n    const n = selection.nodes.value[0];\n    if (n) openNode(n);\n  },\n  onClose: () => {\n    showNewFolder.value = false;\n    showRename.value = false;\n    showDelete.value = false;\n    /* #71 — a draft's editor is closed only through its own question (Save\n       to disk / Keep in Drafts / Discard). Its dialog answers Escape itself\n       (modals/Modal → PreviewModal.requestClose); closing it from here as\n       well dropped the editor behind the question the moment Escape was\n       pressed — measured in a real browser, question and editor both gone. */\n    if (!(previewTarget.value && draftKeyOf(previewTarget.value.path))) showPreview.value = false;\n    ctxRef.value?.hide();\n    dismissToast();\n    /* gezinti:g1 — an open Connections / API-keys overlay is the topmost thing\n       on screen, so Esc dismisses that before anything under it. */\n    if (anyOverlayOpen.value) {\n      closeOverlays();\n      return;\n    }\n    /* gezinti:g1 — Esc closes the navigation drawer first. It is the topmost\n       thing on a narrow screen, so dismissing something underneath it while it\n       covers the listing reads as Esc doing nothing. */\n    if (navDrawerOpen.value) {\n      closeNavDrawer();\n      return;\n    }\n    /* koru:k1 — Esc closes the narrow-mode inspector overlay only; the wide\n       side panel is a persistent surface toggled by `i` / the toolbar. */\n    if (isNarrow.value) closeInspector();\n  },\n  onFocusSearch: () => toolbarRef.value?.focusSearch(),\n  onCut: () => (paneIsActive.value ? paneCut() : cut()) /* wiring:d1 pane-route */,\n  onCopy: () => (paneIsActive.value ? paneCopy() : copyToClipboard()) /* wiring:d1 pane-route */,\n  onPaste: () => (paneIsActive.value ? void panePaste() : void paste()) /* wiring:d1 pane-route */,\n  onGoUp: () => (paneIsActive.value ? splitPaneRef.value?.goUp() : goUp()) /* wiring:d1 pane-route */,\n  /* cila:c wiring */\n  onPathJump: () => {\n    /* surucu:d1 — the shortcut from anywhere else opens a BLANK palette. The\n       seed belongs to the drive header's field; leaving the last one in place\n       would reopen the palette pre-filled with a query the user has since\n       moved on from. */\n    paletteSeed.value = '';\n    showPalette.value = true;\n  },\n  onShowHelp: () => {\n    showShortcutsHelp.value = true;\n  },\n  /* /cila:c wiring */\n  onQuickLook: () => quickLookToggle() /* wiring:c2 */,\n  onToggleHidden: () => toggleHiddenFiles(),\n  onStar: () => void toggleStar(selection.nodes.value) /* yildiz:s1 */,\n  onToggleInspector: () => toggleInspector() /* koru:k1 */,\n  /* wiring:d1 — tab actions (registry: tab-new/close/next/prev) */\n  onTabNew: () => newTabHere(),\n  onTabClose: () => closeTabById(tabsActiveId.value),\n  onTabNext: () => nextTab(),\n  onTabPrev: () => prevTab(),\n  /* /wiring:d1 */\n  /* tus:t1 — the menu verbs, routed through the SAME dispatcher the right-click\n   * menu and the toolbar use (dispatchItemAction), so a key and a click cannot\n   * drift apart. The ones that act on a selection do nothing without one, which\n   * is what the menu does too. */\n  onNewFolder: () => {\n    showNewFolder.value = true;\n  },\n  onUpload: () => triggerUpload(),\n  onRefresh: () => void load(),\n  onDownload: () => void dispatchItemAction('download', activeTargets()),\n  onPreview: () => void dispatchItemAction('preview', activeTargets()),\n  /* The share dialog is a door that makes links: the key opens it only where\n     the menu offers Share (a role without any sharing permission gets\n     nothing from the key either). */\n  onShare: () => {\n    const targets = activeTargets();\n    if (offeredOn('access', targets)) void dispatchItemAction('access', targets);\n  },\n  onTags: () => void dispatchItemAction('tags', activeTargets()),\n  onOpenTab: () => void dispatchItemAction('open-tab', activeTargets()),\n  onCopyPath: () => {\n    const n = activeTargets()[0];\n    if (n) void onCopyPath(n.path);\n  },\n  onCopyId: () => void dispatchItemAction('copy-id', activeTargets()),\n  onRestore: () => void dispatchItemAction('restore', activeTargets()),\n  /* /tus:t1 */\n  hasSelection: () => !selection.isEmpty.value,\n});\n\n/**\n * tus:t1 / pane:p1 — THE rows a verb acts on, whoever asked for it.\n *\n * The active pane's selection when the split pane has focus, otherwise the\n * main listing's. It began as the keyboard's rule (hence tus:t1) and it is now\n * everybody's: the keyboard shortcuts, the selection bar's count and mode, the\n * action list the bar renders and the handler it dispatches through all read\n * this one function.\n *\n * ⚠ Measured 2026-09-13, before that was true: the toolbar read\n * `selection.nodes` directly, so ticking rows in the RIGHT pane raised no bar\n * at all while the LEFT pane's bar went on describing a selection nobody was\n * touching. Two answers to \"what is selected\" is how that happens; there is\n * one now.\n */\nfunction activeTargets(): FileNode[] {\n  if (paneIsActive.value) return splitSelection.nodes.value;\n  return selection.nodes.value;\n}\n\n// --------------------------------------------------------------------\n// Actions\n// --------------------------------------------------------------------\n\n/* Which files are office documents is the server's answer (lib/serverRules,\n * `capabilities.edit_kinds`, #211): the second list that stood here, and an\n * unused list of text types beside it, are gone. */\n\nfunction openNode(n: FileNode) {\n  // The virtual `.trash` row opens the backend trash listing, not a real dir.\n  if (n.basename === '.trash') {\n    void loadTrash();\n    return;\n  }\n  /* ⚠⚠ issue #34 — A SYMLINK THE SERVER WILL NOT FOLLOW IS REFUSED HERE,\n     OUT LOUD, and this is the ONE funnel every way of opening a row passes\n     through (double-click, Enter, the menu's Open, the command palette, a\n     deep link's auto-open), so the answer is the same everywhere.\n\n     The reported bug was the silence: an out-of-root link arrived looking like\n     an ordinary 0-byte file, and clicking it did nothing at all. Letting the\n     request go instead is barely an improvement — the driver's containment\n     refusal surfaces as a generic failure, which reads as \"filex is broken\"\n     rather than \"this boundary is a setting somebody chose\". So: no request,\n     and a toast carrying the sentence from lib/symlink, which is the same\n     sentence the row's badge and the details panel already show. Nothing is\n     lost by not asking; the server would refuse it too, and only this side\n     knows the wording that names the setting. */\n  const link = linkWordsFor(n, { t });\n  if (link) {\n    /* ⚠ 8 seconds, not flashToast's 2.5: this is a two-clause explanation\n       that names a setting, and a sentence nobody finishes reading is the\n       silence again with extra steps. Same budget undoToast uses for the\n       other toast people are expected to act on. */\n    showToast({ message: link.why }, 8000);\n    return;\n  }\n  /* issue #104 - an entry the storage could not answer for: not opened, not\n     navigated into. Refused here, through the same funnel and the same toast,\n     because the server would refuse it too (409 ENTRY_UNAVAILABLE) and only\n     this side shows the sentence beside the storage's own answer. */\n  const gone = unavailableWordsFor(n, { t });\n  if (gone) {\n    showToast({ message: gone.full }, 8000);\n    return;\n  }\n  if (n.type === 'dir') {\n    // Multi-storage virtual rows have a bare path (`s3-test`); pass\n    // them straight to load() which will treat them as the wire form\n    // for that storage's root. Real backend rows still come back as\n    // `<adapter>://<rel>` and stripAdapter turns them into the user\n    // path semantics load() expects.\n    const target = multiStorageRoot.value\n      ? wireToVirtual(n.path)\n      : stripAdapter(n.path);\n    void load(target);\n    return;\n  }\n  /* wiring:e2 vault — a file of an open vault (from either pane): decrypted\n     here, from its packs, into the read-only preview. */\n  if (vault.isVaultRow(n) && n.type === 'file') {\n    void e2eOpenPreview(n);\n    return;\n  }\n  /* wiring:e2 fxe — a single encrypted file: its password, then the viewers. */\n  if (isFxeRow(n) && !e2eActive.value && !n.e2e_root) {\n    void e2eFiles.open(n);\n    return;\n  }\n  /* wiring:e2 — a file from Recent, Starred, a tag, search or Home that\n     lives inside an encrypted folder is opened IN its folder: the lock\n     screen when the folder is locked, the decrypted preview when it is not.\n     Opening it here handed the viewer ciphertext. */\n  if (n.type === 'file' && !e2eActive.value && typeof n.e2e_root === 'string' && n.e2e_root) {\n    const parent = wireParentPath(n.path);\n    void load(multiStorageRoot.value ? wireToVirtual(parent) : stripAdapter(parent));\n    return;\n  }\n  /* wiring:e2 — opening a file inside an encrypted folder: while unlocked,\n     decrypt + show a read-only preview (the blob URL feeds the existing\n     viewers); while locked nothing opens at all (the lock screen already\n     hides the listing). */\n  if (e2eUnlocked.value && n.type === 'file') {\n    void e2eOpenPreview(n);\n    return;\n  }\n  if (e2eLocked.value && n.type === 'file') return;\n  /* /wiring:e2 */\n  // Host-owned open (desktop app): a file opens in the host's OWN window per\n  // document, not in the in-page overlay. Emit and stop — the host listens on\n  // `file-opened` and spawns the window. Directories still navigate inline\n  // (handled above); Space quick-look still peeks in-page. E2E files fell into\n  // the decrypted in-page branch above, so a host window never gets ciphertext.\n  if (openSurface(props.config, n) === 'host') {\n    emit('file-opened', { path: n.path, basename: n.basename });\n    void markRecent(n);\n    return;\n  }\n  // \"Aç\" / double-click contract: open in a new tab against the\n  // standalone editor route, regardless of file type. The editor page\n  // picks the right viewer (OnlyOffice for office, Monaco for code/\n  // text, drawio iframe for .drawio, image/PDF/3D viewers otherwise)\n  // and wires save-on-change. This is the shape brf-mono ships and\n  // what users expect from a Files-style file manager.\n  //\n  // Capability gate: if we already know the required backend is offline\n  // (OnlyOffice for office docs, drawio for diagrams), don't launch a\n  // new tab that we'd just render a \"service not configured\" fallback\n  // inside — drop into the in-page preview instead, which is the same\n  // dead-end UI but without the tab-switching whiplash.\n  // Double-click contract: in-page modal preview. Office docs and\n  // other read-only kinds open in view mode so a quick peek doesn't\n  // mount an editing surface on top of the content. Code/markdown\n  // open in edit so the user gets the fast \"open, tweak, Ctrl+S\"\n  // loop. Modal's \"Yeni sekmede aç\" button still launches the\n  // standalone fullscreen editor route when richer editing is wanted.\n  const ext = (n.extension || '').toLowerCase();\n  // RBAC: viewers (no edit on this item) always get the read-only preview\n  // modal — never the editable surface. This is the \"view vs edit\" split.\n  previewMode.value = nodeCanEdit(n)\n    ? previewModeForExt(ext)\n    : 'view';\n  previewAppChoice.value = null;\n  // An app's interface for this type edits it (unless this person may not):\n  // the one the person's choice or the administrator's order opens it with.\n  // 0.51 - ONLYOFFICE opening a .csv is an office document's open: a look\n  // first (view), its Edit button to change it - as a .xlsx opens.\n  const handler = e2eActive.value\n    ? null\n    : pickOpenHandler(pluginViewList.value, n, null, pluginOpenRules.value, personalOpenChoice(n), openOpts.value);\n  if (handler?.view && nodeCanEdit(n)) {\n    previewMode.value = 'edit';\n  } else if (isOfficeHandler(handler)) {\n    previewMode.value = 'view';\n  }\n  previewTarget.value = n;\n  showPreview.value = true;\n  emit('file-opened', { path: n.path, basename: n.basename });\n  void markRecent(n);\n}\n\nconst VIEW_DEFAULT_EXTS = new Set<string>([\n  'drawio', 'dio',\n  'pdf', 'epub', 'ipynb', 'tiff', 'tif', 'psd',\n  'mmd', 'mermaid',\n  'glb', 'gltf', 'obj', 'stl', 'fbx', '3ds',\n  'zip', 'rar', '7z', 'tar', 'gz', 'tgz',\n  'jpg', 'jpeg', 'png', 'webp', 'gif', 'bmp', 'avif', 'svg', 'heic',\n  'mp4', 'webm', 'mov', 'mkv', 'm4v', 'ogv',\n  'mp3', 'wav', 'ogg', 'flac', 'm4a', 'aac', 'opus',\n]);\n\nfunction previewModeForExt(ext: string): 'view' | 'edit' {\n  if (isOfficeExt(ext) || VIEW_DEFAULT_EXTS.has(ext)) return 'view';\n  return 'edit';\n}\n\n/** A restore on its way. A folder is moved back object by object on an\n *  object store: minutes, and a second press met \"something already has that\n *  name\". */\nconst restoreBusy = ref(false);\n\nasync function restoreSelection(targets?: FileNode[]) {\n  if (restoreBusy.value) return;\n  const nodes = targets ?? selection.nodes.value;\n  if (nodes.length === 0) return;\n  restoreBusy.value = true;\n  try {\n    // filex trash: restore by node id, then refresh the trash listing.\n    if (trashMode.value) {\n      const ids = nodes\n        .map((n) => (n as { id?: number }).id)\n        .filter((x): x is number => typeof x === 'number');\n      if (serverQueues('restore')) {\n        // One request for the selection, answered at once with its jobs: the\n        // operations centre follows them, and the trash listing, with what did\n        // not come back and why, comes when each ends (onSettled).\n        const { ops, summary } = await api.restoreQueued(ids);\n        for (const op of ops) pendingOps.register(op);\n        if (summary) flashToast(summary);\n        selection.clear();\n        return;\n      }\n      // ⚠ One request for the selection (finding A15): it was one per item,\n      // tallied and worded here. The server restores each and says what came\n      // back, what did not and why.\n      const said = await api.restoreBatch(ids);\n      showToast({ message: said.summary }, said.failed ? ERROR_TOAST_MS : FLASH_TOAST_MS);\n      selection.clear();\n      await loadTrash();\n      return;\n    }\n    // Legacy path-based restore (brf-mono `.trash/` convention).\n    if (!api.endpoints.restore) return;\n    const items = nodes.map((n) => n.path); // qualified\n    const { restored } = await api.restore(items);\n    flashToast(t('toast.restored', { n: restored }));\n    selection.clear();\n    await load();\n  } catch (err) {\n    showToast({ message: failureText(err) }, ERROR_TOAST_MS);\n    emit('error', { message: (err as Error).message, context: { op: 'restore' } });\n  } finally {\n    restoreBusy.value = false;\n  }\n}\n\nfunction previewNode(n: FileNode) {\n  /* wiring:e2 vault */\n  if (vault.isVaultRow(n) && n.type === 'file') {\n    void e2eOpenPreview(n);\n    return;\n  }\n  /* wiring:e2 fxe */\n  if (isFxeRow(n) && !e2eActive.value && !n.e2e_root) {\n    void e2eFiles.open(n);\n    return;\n  }\n  /* wiring:e2 — the preview is fed from the decrypted blob as well */\n  if (e2eUnlocked.value && n.type === 'file') {\n    void e2eOpenPreview(n);\n    return;\n  }\n  /* /wiring:e2 */\n  previewMode.value = 'view';\n  previewAppChoice.value = null;\n  previewTarget.value = n;\n  showPreview.value = true;\n  void markRecent(n);\n}\n\n/**\n * openNodeInNewTab — launches the standalone /files/edit route in a\n * fresh tab. Used by the context-menu \"Aç\" action; double-click stays\n * on the in-page modal path. Dirs still navigate inline (no editor for\n * directories). Falls back to the modal if no `openPageBase` is wired\n * by the embedder.\n */\nfunction openNodeInNewTab(n: FileNode) {\n  if (n.type === 'dir') {\n    const target = multiStorageRoot.value\n      ? wireToVirtual(n.path)\n      : stripAdapter(n.path);\n    void load(target);\n    return;\n  }\n  /* wiring:e2 fxe — the standalone route would show ciphertext. */\n  if (isFxeRow(n) && !e2eActive.value && !n.e2e_root) {\n    void e2eFiles.open(n);\n    return;\n  }\n  /* wiring:e2 — the standalone editor route pulls the RAW (encrypted) bytes\n     from the server, so inside an encrypted folder every \"Aç\" falls back to\n     the in-page decrypted preview. */\n  if (e2eActive.value) {\n    if (e2eUnlocked.value) void e2eOpenPreview(n);\n    return;\n  }\n  /* /wiring:e2 */\n  // Host-owned open (desktop): the context-menu \"Aç\" opens the host window\n  // too, so Enter/double-click/\"Aç\" are ONE open path — not a window here and\n  // a system-browser tab there. openNode carries the `file-opened` emit.\n  if (props.config.openInHost) {\n    openNode(n);\n    return;\n  }\n  // RBAC: a viewer (no edit on this item) can't use the editable \"Aç\"\n  // surface — drop to the read-only in-page preview instead.\n  if (!nodeCanEdit(n)) {\n    previewNode(n);\n    return;\n  }\n  const ext = (n.extension || '').toLowerCase();\n  const base = props.config.openPageBase;\n  if (!base) {\n    // Embedder didn't supply a standalone editor route — keep the\n    // in-page modal as the only available affordance.\n    openNode(n);\n    return;\n  }\n  // Context-menu \"Aç\" is the intent-to-edit action — request edit\n  // mode so OnlyOffice / Monaco mount with write permissions.\n  // Read-only inspection lives on the \"Önizle\" entry + the dbl-click\n  // in-page modal.\n  const abs = absolutePageUrl(base);\n  const sep = abs.includes('?') ? '&' : '?';\n  const url =\n    `${abs}${sep}path=${encodeURIComponent(n.path)}` +\n    `&type=${encodeURIComponent(ext)}` +\n    `&mode=edit`;\n  window.open(url, '_blank', 'noopener');\n  emit('file-opened', { path: n.path, basename: n.basename });\n  void markRecent(n);\n}\n\ntype ContextMode = 'selection' | 'breadcrumb' | 'pane' /* ui-fix — side-pane right-click */;\nconst ctxMode = ref<ContextMode>('selection');\nconst breadcrumbCtxPath = ref<string>('');\n/* ui-fix — target nodes of the side pane's right-click menu (pane selection). */\nconst paneCtxTargets = ref<FileNode[]>([]);\nconst breadcrumbCtxLabel = ref<string>('');\n\n/* pane:p1 — `activeTargets()`, not `selection`: the bar describes the pane the\n * keyboard is in. See the function's own note for what reading `selection`\n * directly here used to cost. */\nconst selectionMode = computed<SelectionMode>(() => {\n  const sel = activeTargets();\n  if (sel.length === 0) return 'none';\n  if (sel.length === 1) return sel[0].type === 'dir' ? 'single-dir' : 'single-file';\n  return 'multi';\n});\n\nasync function onToolbarAction(key: string) {\n  const sel = activeTargets();\n  // The toolbar's \"Aç\" opens the in-page preview/editor modal (quick peek);\n  // everything else shares dispatchItemAction with the context menu so the two\n  // identical menus also behave identically.\n  if (key === 'open') {\n    if (sel[0]) openNode(sel[0]);\n    return;\n  }\n  await dispatchItemAction(key, sel);\n}\n\n// ─── desktop selective sync — \"keep on this computer\" ──────────────────\n// Present only when the desktop shell passes config.desktopSync; the web\n// admin and the embeds never see these entries. State is PULLED, not pushed:\n// the kept list is re-read as a menu opens, so the component needs no event\n// channel back to the shell and cannot go stale in a way that outlives one\n// right-click.\nconst desktopSync = computed(() => props.config.desktopSync ?? null);\nconst keptPairs = ref<Array<{ remote: string; local: string }>>([]);\n\n/* #196 - the shell has answered at least once. */\nlet keptKnown = false;\nasync function refreshKept(): Promise<void> {\n  if (!desktopSync.value) return;\n  // #196 — the menu's keep rows follow this answer. Only the FIRST one holds a\n  // menu that is about to open (`openCtxMenu`); after that the menu opens on\n  // the kept set it has and this refresh lands behind it.\n  const answered = keptKnown ? () => {} : rowAnswers.start();\n  try {\n    keptPairs.value = await desktopSync.value.kept();\n    keptKnown = true;\n  } catch {\n    // Shell went away mid-call; a stale entry only mislabels a menu item.\n  } finally {\n    answered();\n  }\n}\n\n/** The folder the engine is working on RIGHT NOW (null between runs). Drives\n *  the ⟳ row badges and the bottom progress strip. */\nconst keepActive = ref<{\n  remote: string;\n  phase: 'inventory' | 'plan' | 'transfer' | 'settling';\n  done: number;\n  total: number;\n} | null>(null);\n\nasync function refreshKeepStatus(): Promise<void> {\n  const ds = desktopSync.value;\n  if (!ds?.status) return;\n  try {\n    keepActive.value = (await ds.status()).active ?? null;\n  } catch {\n    keepActive.value = null;\n  }\n}\n\n// The shell pokes on every engine output line — during a transfer that can be\n// several a second, and each refresh is an IPC round-trip. Trailing-edge\n// throttle: at most one refresh per 300ms, and the FINAL poke always lands,\n// so the strip cannot get stuck showing a finished transfer.\nlet keepPokeTimer: ReturnType<typeof setTimeout> | null = null;\n// The shell holds the callback and only drops it on the NEXT mount, so a poke\n// can arrive after this instance is gone — pokes then set refs nothing reads.\n// Cheap to make explicit rather than rely on that being harmless.\nlet keepAlive = true;\nfunction onKeepPoke(): void {\n  if (keepPokeTimer || !keepAlive) return;\n  keepPokeTimer = setTimeout(() => {\n    keepPokeTimer = null;\n    if (!keepAlive) return;\n    void refreshKeepStatus();\n    void refreshKept();\n  }, 300);\n}\n\nonMounted(() => {\n  void refreshKept();\n  void refreshKeepStatus();\n  desktopSync.value?.onChange?.(onKeepPoke);\n});\nonBeforeUnmount(() => {\n  keepAlive = false;\n  if (keepPokeTimer) {\n    clearTimeout(keepPokeTimer);\n    keepPokeTimer = null;\n  }\n});\n\n/** Adapter-qualified remote for a row. Virtual storage rows carry a bare\n *  name (`docs`), real rows a wire path (`docs://reports`). */\nfunction keepRemoteOf(node: FileNode): string {\n  const p = String(node.path ?? '');\n  return p.includes('://') ? p.replace(/\\/+$/, '') : `${p}://`;\n}\n\ntype KeepState = 'none' | 'kept' | 'inherited' | 'partial';\n\n/** True when `child` lives strictly inside `parent` (both wire-form). */\nfunction remoteInside(child: string, parent: string): boolean {\n  if (parent.endsWith('://')) return child.startsWith(parent) && child !== parent;\n  return child === parent ? false : child.startsWith(parent + '/');\n}\n\n/** How `remote` relates to the kept set: exactly a pair, inside one\n *  (inherited), an ancestor of some (partial), or unrelated. */\nfunction keepStateOf(remote: string): KeepState {\n  if (keptPairs.value.some((p) => p.remote === remote)) return 'kept';\n  if (keptPairs.value.some((p) => remoteInside(remote, p.remote))) return 'inherited';\n  if (keptPairs.value.some((p) => remoteInside(p.remote, remote))) return 'partial';\n  return 'none';\n}\n\ntype KeepBadge = 'kept' | 'syncing' | 'cloud' | 'partial';\n\n/**\n * The availability badge for one row: on this computer, being synced right\n * now, holding kept items somewhere below (partial), or online-only. Every\n * row gets one — that is the OneDrive/Drive grammar people already read —\n * except the rows where it would be a lie or noise: trash, and the `.trash`\n * row itself. `partial` is what saves the user from drilling into every\n * folder to find out whether anything inside is on this computer.\n */\nfunction keepBadgeFor(n: FileNode): KeepBadge | null {\n  if (!desktopSync.value || trashActive.value) return null;\n  if (n.basename === '.trash') return null;\n  const r = keepRemoteOf(n);\n  const act = keepActive.value;\n  if (act && (r === act.remote || remoteInside(r, act.remote) || remoteInside(act.remote, r))) {\n    return 'syncing';\n  }\n  const st = keepStateOf(r);\n  if (st === 'kept' || st === 'inherited') return 'kept';\n  if (st === 'partial') return 'partial';\n  return 'cloud';\n}\n\n/** Bottom strip: what to say while the engine works. */\nconst keepStripLabel = computed<string>(() => {\n  const act = keepActive.value;\n  if (!act) return '';\n  const name = act.remote.endsWith('://')\n    ? act.remote.slice(0, -'://'.length)\n    : act.remote.slice(act.remote.lastIndexOf('/') + 1);\n  if (act.phase === 'transfer' && act.total > 0) {\n    return t('keep.strip_transfer', {\n      name,\n      done: String(act.done),\n      total: String(act.total),\n      pct: String(Math.min(100, Math.round((act.done * 100) / act.total))),\n    });\n  }\n  if (act.phase === 'settling') return t('keep.strip_settling', { name });\n  return t('keep.strip_inventory', { name });\n});\n\nconst keepStripPercent = computed<number | null>(() => {\n  const act = keepActive.value;\n  if (!act || act.phase !== 'transfer' || act.total <= 0) return null;\n  return Math.min(100, Math.round((act.done * 100) / act.total));\n});\n\n/** Menu entries for one selected folder OR file, by its keep state. Empty\n *  for multi-selections, trash, encrypted folders, or a web mount. */\nfunction keepActionsFor(sel: FileNode[]): ContextAction[] {\n  const ds = desktopSync.value;\n  const single = sel.length === 1 && (sel[0]?.type === 'dir' || sel[0]?.type === 'file');\n  if (!ds || !single || trashActive.value || e2eActive.value || sel[0]?.e2e === true) return [];\n  const st = keepStateOf(keepRemoteOf(sel[0]!));\n  return [\n    { divider: true, key: 'sep-keep', label: '' },\n    { key: 'keep-local', label: t('ctx.keep_local'), hidden: st === 'kept' || st === 'inherited' },\n    { key: 'keep-online', label: t('ctx.keep_online'), hidden: st !== 'kept' },\n    { key: 'keep-inherited', label: t('ctx.keep_inherited'), disabled: true, hidden: st !== 'inherited' },\n    { key: 'keep-reveal', label: t('ctx.keep_reveal'), hidden: st !== 'kept' && st !== 'inherited' },\n  ];\n}\n\n/**\n * The context target when it is NOT part of this pane's listing.\n *\n * Home's Recent and Starred cards are the only rows in the product that a\n * person can right-click without them being in `files` — they come from their\n * own endpoints. `selection.nodes` can never resolve them (it filters the\n * listing by selected path), so without this the menu is built from an empty\n * selection and renders the blank-canvas menu. Empty in every other case, so\n * the ordinary selection path is unaffected.\n */\nconst ctxUnlistedTargets = ref<FileNode[]>([]);\n\n/* #196 - how long a row's menu waits for an answer NOTHING is known about yet\n * before it opens anyway. Answers are asked when a folder is listed and\n * remembered (lib/menuAnswers), so a menu normally waits on nothing; this is\n * the first right-click in a folder faster than its listing's questions came\n * back. The maintainers' bound (2026-10-08): a menu that waits 400 ms is a\n * menu that does not open; about 40 ms is not seen. An answer slower than this\n * is added at the menu's end when it lands (lib/heldMenuRows), never in the\n * middle. */\nconst MENU_ANSWER_WAIT_MS = 40;\n/* #196 - the newest menu asked for. An opening still waiting is dropped when a\n * later one came first: another right-click, a press anywhere, Esc. */\nlet ctxOpenSeq = 0;\n\n/**\n * #196 - open the explorer's menu. A menu on rows first lists them, which asks\n * what some of them depend on (the encryption answer, a folder's permissions,\n * the desktop's keep state - `rowAnswers`). An answer asked before (the\n * listing asks them, lib/menuAnswers remembers them) is read at once; only one\n * nothing is known about holds the menu, at most MENU_ANSWER_WAIT_MS. The rows\n * are then in their places from the first frame. They used to be drawn when an\n * answer landed, with the menu already open: \"Encrypt with E2EE...\" pushed\n * every row below it down while the person was aiming, and in the 0.53 release\n * run (e2e 115, Firefox) a click pressed on \"Tags\" was released on \"Star\".\n * What lands after the menu is open moves nothing either (ContextMenu holds\n * its rows). A menu with nothing selected waits on nothing.\n */\nasync function openCtxMenu(at: { clientX: number; clientY: number }, targets: FileNode[]): Promise<void> {\n  const seq = ++ctxOpenSeq;\n  if (targets.length > 0) {\n    // Listing the rows is what asks their questions.\n    void contextActions.value;\n    if (rowAnswers.count > 0 && typeof window !== 'undefined') {\n      const drop = (e: Event) => {\n        if (e.type === 'keydown' && (e as KeyboardEvent).key !== 'Escape') return;\n        if (seq === ctxOpenSeq) ctxOpenSeq++;\n      };\n      window.addEventListener('pointerdown', drop, true);\n      window.addEventListener('keydown', drop, true);\n      try {\n        await rowAnswers.settled(MENU_ANSWER_WAIT_MS);\n      } finally {\n        window.removeEventListener('pointerdown', drop, true);\n        window.removeEventListener('keydown', drop, true);\n      }\n    }\n  }\n  if (seq !== ctxOpenSeq) return;\n  ctxRef.value?.show(at, targets);\n}\n\nasync function onContextTarget(node: FileNode, ev: MouseEvent) {\n  ctxMode.value = 'selection';\n  void refreshKept(); // menu labels react if the kept set changed since last look\n  if (!selection.has(node.path)) {\n    selection.click(node.path);\n    await nextTick();\n  }\n  // ⚠⚠ Fall back to the node that was actually clicked.\n  //\n  // `selection.nodes` is the CURRENT LISTING filtered by the selected paths\n  // (`useSelection(() => displayOrder ?? files)`), so it can only ever resolve\n  // a row that is in this pane's listing. Home is not a listing: its Recent\n  // and Starred cards come from their own endpoints and are absent from\n  // `files`, so selecting one left `selection.nodes` EMPTY and the menu opened\n  // with zero targets — which is the signature of a right-click on blank\n  // canvas. Measured 2026-09-13: the ⋮ and the right-click on every Home card\n  // opened a one-line \"Show hidden files\" menu instead of the fifteen-line\n  // file menu, in both Recent and Starred. HomeView's own header says these\n  // cards carry \"the same right-click menu as the listing\", so this is the\n  // contract being restored, not a new behaviour.\n  //\n  // In a real listing `selection.nodes` is non-empty by the line above, so\n  // multi-selection is untouched — this only rescues the case where the path\n  // cannot be resolved against the current pane.\n  //\n  // ⚠ BOTH halves are needed. `show()` decides what the chosen action RUNS on;\n  // `contextActions` decides what the menu LISTS, and it reads\n  // `selection.nodes` on its own. Setting only the first left the actions\n  // correct and the menu still empty, which looks identical to the bug.\n  ctxUnlistedTargets.value = selection.nodes.value.length ? [] : [node];\n  const targets = selection.nodes.value.length ? selection.nodes.value : [node];\n  await openCtxMenu({ clientX: ev.clientX, clientY: ev.clientY }, targets);\n}\n\nfunction onContextCanvas(ev: MouseEvent) {\n  ev.preventDefault();\n  ctxMode.value = 'selection';\n  selection.clear();\n  // Blank canvas has no target — drop any node left over from a card menu, or\n  // the next right-click on empty space would offer that file's actions.\n  ctxUnlistedTargets.value = [];\n  void openCtxMenu({ clientX: ev.clientX, clientY: ev.clientY }, []);\n}\n\nfunction onCrumbContext(payload: { x: number; y: number; adapterPath: string; label: string }) {\n  ctxMode.value = 'breadcrumb';\n  breadcrumbCtxPath.value = payload.adapterPath;\n  breadcrumbCtxLabel.value = payload.label;\n  void openCtxMenu({ clientX: payload.x, clientY: payload.y }, []);\n}\n\n/**\n * pane:p1 — right-click in EITHER pane, through one door.\n *\n * The menu itself was already single-source (`selectionActionList`); this is\n * the other half — the two panes no longer reach it through two different\n * handlers, so a change to how a right-click picks its targets cannot land in\n * one pane and miss the other. `node === null` is a right-click on empty\n * space: the selection-less menu (\"New folder\" + \"Paste\").\n */\nasync function onPaneMenu(pane: 'main' | 'split', node: FileNode | null, ev: MouseEvent) {\n  void refreshKept(); // menu labels react if the kept set changed since last look\n  if (pane === 'split') {\n    activePane.value = 'split';\n    const sel = splitSelection.nodes.value;\n    if (node && !splitSelection.has(node.path)) {\n      splitSelection.click(node.path);\n      await nextTick();\n    }\n    const after = splitSelection.nodes.value;\n    paneCtxTargets.value = node ? (after.length > 0 ? after : (sel.length > 0 ? sel : [node])) : [];\n    ctxMode.value = 'pane';\n    await openCtxMenu({ clientX: ev.clientX, clientY: ev.clientY }, paneCtxTargets.value);\n    return;\n  }\n  activePane.value = 'main';\n  ctxMode.value = 'selection';\n  if (!node) {\n    selection.clear();\n    void openCtxMenu({ clientX: ev.clientX, clientY: ev.clientY }, []);\n    return;\n  }\n  await onContextTarget(node, ev);\n}\n\nconst contextActions = computed<ContextAction[]>(() => {\n  if (ctxMode.value === 'breadcrumb') {\n    return [\n      { key: 'open', label: t('ctx.open') },\n      { key: 'copy-path', label: t('breadcrumb.copy_path') },\n    ];\n  }\n  if (ctxMode.value === 'pane' /* ui-fix — side-pane menu is EXACTLY the main pane's */) {\n    const psel = paneCtxTargets.value;\n    if (psel.length === 0) {\n      // Right-click on empty space: same as the main pane's canvas menu.\n      return [\n        { key: 'new-folder', label: t('toolbar.new_folder') },\n        { key: 'paste', label: t('ctx.paste'), disabled: !clipboard.value.mode },\n      ];\n    }\n    return selectionActionList(psel);\n  }\n\n  // `ctxUnlistedTargets` is non-empty only for a row that exists outside this\n  // pane's listing (Home's Recent / Starred cards) — see `onContextTarget`.\n  const sel = selection.nodes.value.length ? selection.nodes.value : ctxUnlistedTargets.value;\n  const any = sel.length > 0;\n  const single = sel.length === 1;\n\n  if (trashActive.value) {\n    if (!any) return [];\n    // \"Delete permanently\" only for someone the server lets purge\n    // (trashCanEmpty): offered to everyone, it did nothing for most.\n    return [\n      { key: 'restore', label: t('ctx.restore'), hidden: !permHeld('files.create') },\n      ...(trashCanEmpty.value\n        ? [\n            { divider: true, key: 'sep1', label: '' },\n            { key: 'delete', label: t('ctx.delete_perm'), danger: true, hidden: !permHeld('files.purge') },\n          ]\n        : []),\n    ];\n  }\n\n  // Storage roots (the virtual rows shown at the multi-storage \"/\"\n  // overview) aren't real filesystem entries — they're mount points.\n  // Hide every mutation entry (rename/delete/share/cut/copy/new-folder/\n  // paste) and only offer \"Aç\" so the menu doesn't surface actions\n  // that would 4xx on the backend.\n  //\n  // PRIOR BUG: this used `currentPath === '/'` but the load() branch\n  // for the virtual root sets currentPath to EMPTY string, not '/'.\n  // So the guard never fired and every mutation action leaked into\n  // the menu at the storage listing — including new-folder + paste,\n  // which Ada called out in the most direct possible terms. Use\n  // the same empty-after-trim test as `atVirtualRoot` above.\n  const trimmedPath = (currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n  const inStorageRoot = multiStorageRoot.value && trimmedPath === '';\n  if (inStorageRoot) {\n    if (!any) return [];\n    if (!single) return [];\n    return [\n      { key: 'open', label: t('ctx.open') },\n      { key: 'open-tab', label: t('ctx.open_new_tab') } /* wiring:d1 */,\n      // A whole storage can be kept too — that IS the \"sync everything\"\n      // shape, and it is one pair, not one per subfolder.\n      ...keepActionsFor(sel),\n    ];\n  }\n\n  // Empty background right-click: folder-level actions only. Viewers (no edit\n  // on this dir) get nothing here.\n  if (!any) {\n    // Showing hidden files is a VIEW preference, so it stays available to\n    // viewers too — the edit gate below only covers the mutating actions.\n    const view: ContextAction[] = [\n      {\n        key: 'toggle-hidden',\n        label: showHiddenFiles.value ? t('ctx.hide_hidden') : t('ctx.show_hidden'),\n      },\n    ];\n    if (!permCanEdit(dirPerm.value)) return view;\n    return [\n      { key: 'new-folder', label: t('toolbar.new_folder') },\n      { key: 'paste', label: t('ctx.paste'), disabled: !clipboard.value.mode },\n      ...view,\n    ];\n  }\n\n  return selectionActionList(sel);\n});\n\n// selectionActionList — the SINGLE source of truth for the actions offered on a\n// selection. BOTH the right-click context menu AND the top toolbar render this\n// exact list so they can never drift apart (Ada, translated from Turkish: \"the\n// right-click menu and the top menu don't match\"). The toolbar filters out\n// dividers/hidden; the context menu shows them. Action handling is unified in\n// dispatchItemAction().\n/* ── Per-user permissions (filex backend internal/perm) ──────────────────\n * The account's permissions — the host's `config.permissions`, or the list\n * the explorer read from `/api/auth/me` itself when the host passed none\n * (`heldPermissions`) — hide the actions the server would refuse with 403\n * `permission_denied`. One filter over the finished list, so the right-click\n * menu, the toolbar and the split pane — all built by selectionActionList —\n * agree. Only when neither is known (nothing passed, and nothing usable came\n * back) does every action stay and the server decide. */\nfunction permHeld(p: string): boolean {\n  const held = heldPermissions.value;\n  return !held || held.includes(p);\n}\nconst ACTION_PERMS: Record<string, string[]> = {\n  rename: ['files.rename'],\n  cut: ['files.move'],\n  'move-to': ['files.move'],\n  delete: ['files.delete'],\n  download: ['files.download'],\n  convert: ['files.create'],\n  'copy-to': ['files.create'],\n  paste: ['files.create', 'files.move'],\n  tags: ['files.tag'],\n  /* wiring:e2 policy — the four rows that START an encryption make something,\n     a key file or a `.fxe`, and the server asks files.create for that beside\n     files.encrypt (backend perm.FilesEncrypt: \"carved out of files.create,\n     which the same write needs as well\"). A place can allow the one and deny\n     the other; the row is then hidden, not offered to be refused. */\n  'fxe-encrypt': ['files.create'],\n  'fxe-request': ['files.create'],\n  'e2e-convert': ['files.create'],\n  'e2e-request': ['files.create'],\n};\n/** The sharing kinds held on `paths` (lib/sharingHeld) — the one answer the\n *  Share action, the share dialog, \"Request files\" and the details panel's\n *  \"Create link\" all read. */\nfunction sharingAt(paths: string[]): SharingHeld {\n  return sharingHeld((p) => permHeldAt(p, paths));\n}\nfunction gateByPermissions(list: ContextAction[], sel: FileNode[]): ContextAction[] {\n  if (!heldPermissions.value) return list;\n  /* wiring:e2 vault — a vault's rows are gated at the vault folder, the only\n     place the server knows (vaultActionList). */\n  if (sel.length > 0 && sel.every((n) => vault.isVaultRow(n))) return list;\n  const paths = sel.map((n) => n.path);\n  return list.map((a) => {\n    // Share opens a dialog with three kinds of sharing in it; it is offered\n    // when one of them can be used HERE — and a file takes no file request.\n    if (a.key === 'access') {\n      const dirs = sel.length > 0 && sel.every((n) => n.type === 'dir');\n      return canShareAny(sharingAt(paths), dirs) ? a : { ...a, hidden: true };\n    }\n    const needs = ACTION_PERMS[a.key];\n    // Any one of the listed permissions is enough (paste is a copy or a move).\n    return needs && !needs.some((p) => permHeldAt(p, paths)) ? { ...a, hidden: true } : a;\n  });\n}\n/** Does the selection's own list offer `key`? The keyboard asks this before\n *  it acts, so a shortcut cannot open what the menu hides. */\nfunction offeredOn(key: string, targets: FileNode[]): boolean {\n  return selectionActionList(targets).some((a) => a.key === key && !a.hidden && !a.disabled);\n}\n\nfunction selectionActionList(sel: FileNode[]): ContextAction[] {\n  const list = gateByPermissions(selectionActionListAll(sel), sel);\n  /* issue #104 - an entry the storage could not answer for: the server\n     refuses every operation on it (409 ENTRY_UNAVAILABLE), so the menu, the\n     toolbar and the keyboard (offeredOn) offer none, for a selection that\n     holds one. Its details stay: they say why. */\n  if (sel.some(isUnavailable)) {\n    return list.map((a) => (a.divider || a.key === 'details' ? a : { ...a, disabled: true }));\n  }\n  return list;\n}\n\n/**\n * wiring:e2 vault — the actions on rows of a vault: open (the decrypted\n * preview), download (decrypted), details, and the changes the vault makes\n * itself - rename, cut / copy / paste inside the vault, delete (for good: a\n * vault keeps no trash). Nothing that would hand the server a path or a\n * plaintext: no links, no tags, no versions, no apps, no \"open in a new tab\".\n * Writable as a whole or not at all: the vault folder's level, and not while\n * the vault is read-only for a reason (damaged, older than seen, newer filex).\n */\nfunction vaultActionList(sel: FileNode[]): ContextAction[] {\n  const root = String(sel[0].vault_root ?? '');\n  const single = sel.length === 1;\n  const isFile = single && sel[0].type === 'file';\n  const w =\n    permCanEdit(vault.permOf(root) as FileNode['perm']) &&\n    !vault.strips[root]?.readOnly &&\n    permHeldAt('files.create', [root]) &&\n    permHeldAt('files.delete', [root]);\n  return [\n    { key: 'preview', label: t('ctx.preview'), hidden: !single, disabled: !isFile },\n    { key: 'download', label: t('ctx.download'), disabled: sel.length === 0 },\n    { key: 'details', label: t('ctx.details') },\n    { divider: true, key: 'sep1', label: '', hidden: !w },\n    { key: 'rename', label: t('ctx.rename'), hidden: !single || !w },\n    { key: 'cut', label: t('ctx.cut'), hidden: !w },\n    { key: 'copy', label: t('ctx.copy') },\n    { key: 'paste', label: t('ctx.paste'), hidden: !w, disabled: !clipboard.value.mode },\n    { divider: true, key: 'sep2', label: '', hidden: !w },\n    { key: 'delete', label: t('ctx.delete'), danger: true, hidden: !w },\n  ];\n}\n\nfunction selectionActionListAll(sel: FileNode[]): ContextAction[] {\n  /* wiring:e2 vault — inside a vault only what a vault does. */\n  if (sel.length > 0 && sel.every((n) => vault.isVaultRow(n))) return vaultActionList(sel);\n  const any = sel.length > 0;\n  const single = sel.length === 1;\n  /* pane:p1 — a STORAGE row is a mount point, not a file: rename, delete, cut,\n   * copy and share all 4xx on it. The main listing answers this before it ever\n   * gets here (the `inStorageRoot` branch in `contextActions`), but the split\n   * pane lists the same virtual rows through no such branch — so its\n   * right-click menu has been offering \"Sil\" on a whole storage, and with the\n   * selection bar now reaching both panes it would be one click. Measured\n   * 2026-09-13: download/share/cut/copy/delete, all of them, on `depoB`.\n   * Answered HERE because this is the one list both surfaces render. */\n  if (sel.some(isStorageRow)) {\n    if (!single) return [];\n    return [\n      { key: 'open', label: t('ctx.open') },\n      { key: 'open-tab', label: t('ctx.open_new_tab') },\n      ...keepActionsFor(sel),\n    ];\n  }\n  const isFile = single && sel[0]?.type === 'file';\n  const tagsLabel = t('ctx.tags_menu');\n  const isArchive = single && isArchiveFile(sel[0]);\n  const singleHasId = single && typeof sel[0]?.id === 'number';\n  /* yildiz:s1 */\n  const canStar = starableNodes(sel).length > 0;\n  const allStarred = selectionAllStarred(sel);\n  // RBAC: gate mutating actions when the caller lacks edit on the target. The\n  // \"İzinler\" (permissions) action shows only for owners on RBAC-on storages.\n  const p = selPerm(sel);\n  // May write to the selection: the weakest row's level, and no row on a\n  // read-only mount — `selReadOnly` is what `dirReadOnly` cannot answer in a\n  // view whose rows come from several storages (Recent, Starred, a tag, Home).\n  const w = permCanEdit(p) && !selReadOnly(sel);\n  // Unified \"Paylaş / İzinler\" popup: public share link (editor+) + per-user\n  // permissions (owner-only, decided inside the modal).\n  // Unified \"Paylaş / İzinler\" popup carries the public share link, per-user\n  // permissions AND the folder-only \"Dosya İste\" (file-drop) tab — the user\n  // picks the action from inside the modal, so there's no separate button.\n  const accessLabel = t('shortcuts.share'); // the same words the shortcut list uses\n  /* ⚠ \"Open\" on an office document IS \"open in ONLYOFFICE\": every path it\n   * takes (the standalone editor tab, the desktop's host window, the in-page\n   * modal) ends at the document server. With none configured it used to open\n   * a tab that printed `Config fetch 503: {\"error\":\"onlyoffice not\n   * configured\"}`. The owner's rule (2026-09-21): an administrator sees it\n   * greyed with where to set it up; everybody else is not offered it. Preview\n   * stays — it says the same thing in words and offers the download. */\n  const openExt = String(sel[0]?.extension ?? '').toLowerCase();\n  const openGate = !isFile\n    ? {}\n    : isOfficeExt(openExt)\n      ? gateOnService(!!effectiveOnlyOfficeBase.value, callerAdmin.value, t('ctx.needs_onlyoffice'))\n      : openExt === 'drawio' || openExt === 'dio'\n        ? gateOnService(!!effectiveDrawioUrl.value, callerAdmin.value, t('ctx.needs_drawio'))\n        : {};\n  /* wiring:e2 policy — the plain file \"Encrypt with E2EE…\" would encrypt. */\n  const fxeTarget = fxeEncryptTarget(sel, { canWrite: w, inEncrypted: e2eActive.value });\n  return [\n    { key: 'open', label: t('ctx.open'), ...openGate, hidden: !single || openGate.hidden === true },\n    { key: 'open-tab', label: t('ctx.open_new_tab'), hidden: !single || sel[0]?.type !== 'dir' } /* wiring:d1 — open the folder in a new tab */,\n    { key: 'preview', label: t('ctx.preview'), hidden: !single, disabled: !isFile },\n    /* tasi:m1 — Download works on ANY selection now. It used to disappear the\n       moment a second row was ticked, because the only implementation was one\n       `window.open` per node and the browser blocks the second popup; there is\n       one streaming archive behind it now (lib/downloadSelection), and the\n       server expands a selected folder itself, so a lone folder is a zip too.\n       Inside an encrypted folder the server has no plaintext to zip: the zip\n       is made in this tab (below), and a LOCKED folder downloads one row at\n       a time. */\n    /* wiring:e2 fxe — inside an unlocked encrypted folder a selection of any\n       size downloads DECRYPTED now (a zip made in this tab); the ciphertext is\n       \"Download encrypted copy\" below. */\n    { key: 'download', label: t('ctx.download'), hidden: !any || (e2eLocked.value && !single), disabled: !any },\n    /* wiring:e2 fxe — single encrypted files, and the ciphertext copy.\n       wiring:e2 policy — \"Encrypt with E2EE…\" asks the answer for the file it\n       would encrypt, and becomes \"Request encryption…\" under the approval\n       policy (useE2eFiles menuRows). */\n    ...e2eFiles.menuRows(sel, {\n      canWrite: w,\n      inEncrypted: e2eActive.value,\n      unlockedEncryptedCopy: e2eUnlocked.value || (single && e2eUnlockedRootRow(sel[0]) !== null),\n      encryptAnswer: fxeTarget ? e2eAnswerAt(fxeTarget.path, 'file') : undefined,\n    }),\n    { key: 'archive-create', label: t('ctx.archive_create'), hidden: !any || (single && isArchive) || !w || e2eActive.value || archiveAllowedFormats.value.length === 0, disabled: !any },\n    { key: 'archive-extract', label: t('ctx.archive_extract'), hidden: !isArchive || !w || e2eActive.value, disabled: !isArchive },\n    { key: 'archive-extract-here', icon: 'archive-extract', label: t('archive.extract_here'), hidden: !isArchive || !w || e2eActive.value, disabled: !isArchive },\n    /* tasi:m1 — VISIBLE and grey above a multi-selection, not gone. Sharing\n       really is one item at a time (a share link addresses one node), and the\n       row now says so in its tooltip; vanishing taught the reader that filex\n       cannot share the thing they are looking at. */\n    {\n      key: 'access',\n      label: accessLabel,\n      hidden: !any || !w || publicLinksOff(sel, e2eActive.value) /* wiring:e2 - never for an encrypted folder or anything in it, the folder's own row included (lib/e2eLinks; the server answers 409 E2E_ENCRYPTED) */,\n      disabled: !single,\n      title: single ? undefined : t('ctx.access.one_only'),\n    },\n    { key: 'details', label: t('ctx.details'), hidden: !any } /* koru:k1 */,\n    /* wiring:e2 convert — encrypt a folder that already exists, in place.\n       wiring:e2 policy — offered where the policy lets this account encrypt\n       that folder; where it wants an approval, the menu asks for one. */\n    { key: 'e2e-convert', label: t('e2e.convert.ctx'), icon: 'lock', hidden: !e2eConvertAnswerIs(sel, w, 'allowed') },\n    { key: 'e2e-request', label: t('e2e.request.ctx'), icon: 'lock', hidden: !e2eConvertAnswerIs(sel, w, 'request') },\n    /* ⚠ \"Copy node id\" is NOT here any more (owner's call, 2026-09-13): it is a\n       developer's handle on a support ticket, not an everyday verb, and this\n       list is rendered by BOTH the right-click menu and the selection bar — so\n       one row put it in front of everyone, twice. It lives in the details\n       panel now, beside Path and ETag, which is where the other technical\n       facts about a file already are. The `copy-id` case below stays: the\n       panel dispatches it. */\n    { divider: true, key: 'sep1', label: '', hidden: !w },\n    { key: 'rename', label: t('ctx.rename'), hidden: !single || !w, disabled: !single },\n    { key: 'cut', label: t('ctx.cut'), hidden: !any || !w, disabled: !any },\n    { key: 'copy', label: t('ctx.copy'), hidden: !any, disabled: !any },\n    /* tasi:m1 — \"somewhere else\", without the clipboard. Cut+paste has always\n       been able to do this, but only by navigating away from the rows you had\n       just picked; these two ask WHERE in a dialog and leave the listing where\n       it is.\n       ⚠ `icon:` is not decoration here — `actionIconSvg` answers '' for a key\n       it does not know, and a bar button with no glyph is an empty 28px box.\n       They borrow the clipboard verbs' marks, which is what they are. */\n    { key: 'move-to', label: t('ctx.move_to'), icon: 'cut', hidden: !any || !w, disabled: !any },\n    { key: 'copy-to', label: t('ctx.copy_to'), icon: 'copy', hidden: !any, disabled: !any },\n    /* Paste needs a destination folder; a virtual view (Recent / Starred /\n       Shared / a tag / Home) has none, so it is the one write verb the row\n       menu does not carry there — every per-row verb above and below does. */\n    { key: 'paste', label: t('ctx.paste'), hidden: !w || atVirtualRoot.value, disabled: !clipboard.value.mode },\n    { divider: true, key: 'sep-meta', label: '', hidden: !singleHasId && !canStar },\n    /* yildiz:s1 — \"star must be an action, like a tag\" (owner, v0.30.0).\n       Beside Tags on purpose: they are the same kind of verb, and this is the\n       ONLY star a grid/gallery user reaches with the keyboard. Works on a\n       multi-selection; the label follows the selection's state. */\n    {\n      key: 'star',\n      label: allStarred ? t('ctx.unstar') : t('ctx.star'),\n      icon: allStarred ? 'unstar' : 'star' /* gorunum:v1-icons — names the glyph, not an emoji */,\n      hidden: !canStar,\n    },\n    { key: 'tags', label: tagsLabel, hidden: !singleHasId, disabled: !singleHasId },\n    /* App plugins — one row per action whose `applies` rule accepts the\n       selection, under its own `sep-plugins` divider; `[]` when the feature\n       is off, in the trash, or inside an encrypted folder (lib/pluginMenu). */\n    ...openWithRows(sel),\n    ...pluginActionRows(sel),\n    ...keepActionsFor(sel),\n    { divider: true, key: 'sep2', label: '', hidden: !w },\n    { key: 'delete', label: t('ctx.delete'), danger: true, hidden: !any || !w, disabled: !any },\n  ];\n}\n\nconst ARCHIVE_EXTENSIONS = new Set(['zip', '7z', 'rar', 'tar', 'gz', 'tgz', 'bz2', 'tbz2', 'xz', 'txz']);\n\nfunction isArchiveFile(node: FileNode | undefined): boolean {\n  return !!node && node.type === 'file' && ARCHIVE_EXTENSIONS.has((node.extension || '').toLowerCase());\n}\n\n// toolbarActions — what the top toolbar shows. Mirrors the context menu so the\n// two stay identical for a selection; the empty/trash/virtual-root cases match\n// the context menu's special branches.\nconst toolbarActions = computed<ContextAction[]>(() => {\n  const sel = activeTargets();\n  /* pane:p1 — the split pane's bar offers EXACTLY what its own right-click\n   * menu offers (`contextActions`, ctxMode 'pane'). The three special branches\n   * below describe the MAIN listing's state — the trash, the multi-storage\n   * root — and the split pane reaches neither through this computed. */\n  if (paneIsActive.value) return sel.length ? selectionActionList(sel).filter((a) => a.key !== 'archive-extract-here') : [];\n  if (trashActive.value) {\n    if (sel.length === 0) return [];\n    return [\n      { key: 'restore', label: t('ctx.restore'), hidden: !permHeld('files.create') },\n      ...(trashCanEmpty.value\n        ? [{ key: 'delete', label: t('ctx.delete_perm'), danger: true, hidden: !permHeld('files.purge') }]\n        : []),\n    ];\n  }\n  const trimmedPath = (currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n  if (multiStorageRoot.value && trimmedPath === '') {\n    return sel.length === 1 ? [{ key: 'open', label: t('ctx.open') }] : [];\n  }\n  if (sel.length === 0) return [];\n  return selectionActionList(sel).filter((a) => a.key !== 'archive-extract-here');\n});\n\nasync function onContextAction(action: ContextAction, targets: FileNode[]) {\n  if (ctxMode.value === 'breadcrumb') {\n    if (action.key === 'open') {\n      void load(stripAdapter(breadcrumbCtxPath.value));\n    } else if (action.key === 'copy-path') {\n      await onCopyPath(breadcrumbCtxPath.value);\n    }\n    return;\n  }\n  if (ctxMode.value === 'pane' /* ui-fix — side pane: same dispatch, pane-routed */) {\n    await dispatchItemAction(action.key, paneCtxTargets.value);\n    return;\n  }\n  await dispatchItemAction(action.key, targets);\n}\n\n// dispatchItemAction — unified handler for an action key on a target set. Both\n// the right-click menu (onContextAction) and the toolbar (onToolbarAction)\n// route here, so the two menus that now render the SAME list also behave the\n// same. (Toolbar \"Aç\" is the one deliberate exception — see onToolbarAction.)\n/**\n * pane:p1 — is this verb mutating the SPLIT pane?\n *\n * Two signals, and they agree in every case a menu produced: the pane menu\n * names itself (`ctxMode === 'pane'`), and every other door — the selection\n * bar, the keyboard — means \"the pane that has the keyboard\".\n *\n * ⚠ Reading only `ctxMode` was safe only while the toolbar acted on\n * `selection` no matter which pane had focus. It does not any more (see\n * `activeTargets`), so a Cut fired from the bar over the right-hand pane would\n * have taken the right pane's ROWS with the left pane's FOLDER as their\n * origin, and the paste would then have moved them out of a directory they\n * were never in.\n */\nfunction actingInPane(): boolean {\n  return ctxMode.value === 'pane' || paneIsActive.value;\n}\n\nasync function dispatchItemAction(key: string, targets: FileNode[]) {\n  /* App plugins — `plugin:<plugin>/<action>` rows are not in the switch: the\n     set is whatever the server listed, so they are resolved by prefix. */\n  if (isPluginActionKey(key)) {\n    await onPluginAction(key, targets);\n    return;\n  }\n  /* v4 - \"Open with <app>\": the preview, in that app's interface (or, with\n     `builtin`, filex's own viewer). 0.50: \"Choose an app…\" asks first. */\n  if (key === 'open-with-choose') {\n    if (targets[0]) openWithTarget.value = targets[0];\n    return;\n  }\n  if (key.startsWith('open-with:')) {\n    const n = targets[0];\n    if (n) {\n      const id = key.slice('open-with:'.length);\n      previewNode(n);\n      previewAppChoice.value = id;\n      if (id !== 'builtin' && nodeCanEdit(n)) previewMode.value = 'edit';\n    }\n    return;\n  }\n  /* wiring:e2 fxe */\n  if (isFxeActionKey(key)) {\n    await e2eFiles.dispatch(key, targets, (tg) => downloadSelection(tg, { encrypted: true }));\n    return;\n  }\n  switch (key) {\n    /* gorunum:v1 — the selection bar's × . It used to be delivered by\n     * synthesising a click on the listing's background, because nothing here\n     * answered the key; a gesture that works by imitating another gesture\n     * breaks the first time that other one changes. */\n    case 'clear-selection':\n      if (paneIsActive.value) splitSelection.clear();\n      else selection.clear();\n      return;\n    case 'open':\n      // Context-menu \"Aç\" launches the standalone fullscreen route\n      // in a new tab. Double-click (openNode) opens the in-page\n      // modal — two distinct affordances on purpose: quick peek vs\n      // dedicated editing surface.\n      if (targets[0]) openNodeInNewTab(targets[0]);\n      break;\n    case 'preview':\n      if (targets[0]) previewNode(targets[0]);\n      break;\n    case 'e2e-convert':\n      if (targets[0]) e2eOpenConvert(targets[0]);\n      break;\n    /* wiring:e2 policy — a folder whose encryption needs an approval. */\n    case 'e2e-request':\n      if (targets[0]) openE2eRequest(targets[0].path, 'folder', targets[0].basename);\n      break;\n    case 'download':\n      await downloadSelection(targets);\n      break;\n    case 'archive-create':\n      if (targets.length === 0) break;\n      archiveTargets.value = targets;\n      archiveInPane.value = actingInPane();\n      archiveDestinationDir.value = archiveInPane.value\n        ? qualify(splitPaneRef.value?.getPath() ?? '')\n        : qualify(currentPath.value);\n      archiveError.value = '';\n      showArchiveCreate.value = true;\n      break;\n    case 'archive-extract':\n      if (!targets[0] || !isArchiveFile(targets[0])) break;\n      archiveTarget.value = targets[0];\n      archiveInPane.value = actingInPane();\n      archiveDestinationDir.value = wireParent(targets[0].path);\n      archiveError.value = '';\n      showArchiveExtract.value = true;\n      break;\n    case 'archive-extract-here':\n      if (!targets[0] || !isArchiveFile(targets[0])) break;\n      archiveTarget.value = targets[0];\n      archiveInPane.value = actingInPane();\n      archiveDestinationDir.value = wireParent(targets[0].path);\n      archiveError.value = '';\n      await startArchiveExtraction(targets[0], archiveDestinationDir.value, archiveInPane.value);\n      break;\n    /* tasi:m1 — the same dialog, twice; only `mode` differs. */\n    case 'move-to':\n    case 'copy-to':\n      if (targets.length === 0) break;\n      destPickerMode.value = key === 'move-to' ? 'move' : 'copy';\n      destPickerTargets.value = targets;\n      destPickerBusy.value = false;\n      showDestPicker.value = true;\n      break;\n    case 'keep-local': {\n      const ds = desktopSync.value;\n      if (!ds || !targets[0]) break;\n      const remote = keepRemoteOf(targets[0]);\n      try {\n        await ds.keep(remote, targets[0].type === 'file' ? 'file' : 'dir');\n        await refreshKept();\n        // The shell may have shown its root-folder prompt and been cancelled —\n        // only claim success when the pair is really there now.\n        if (keepStateOf(remote) !== 'none') flashToast(t('keep.started'));\n      } catch (e) {\n        await refreshKept();\n        flashToast(`${t('keep.failed')}: ${String((e as Error)?.message ?? e)}`);\n      }\n      break;\n    }\n    case 'keep-online': {\n      const ds = desktopSync.value;\n      if (!ds || !targets[0]) break;\n      try {\n        await ds.unkeep(keepRemoteOf(targets[0]));\n      } catch {\n        // The shell owns the confirm dialog and reports its own failures.\n      }\n      await refreshKept();\n      break;\n    }\n    case 'keep-reveal': {\n      const ds = desktopSync.value;\n      if (ds && targets[0]) void ds.reveal(keepRemoteOf(targets[0]));\n      break;\n    }\n    case 'access':\n      if (targets[0]) {\n        permTarget.value = targets[0];\n        showPerm.value = true;\n      }\n      break;\n    case 'details' /* koru:k1 */:\n      openInspector();\n      break;\n    case 'copy-id':\n      if (targets[0] && typeof targets[0].id === 'number') {\n        const id = targets[0].id;\n        navigator.clipboard?.writeText(String(id)).then(\n          () => flashToast(t('toast.node_id_copied', { id })),\n          () => flashToast(`#${id}`),\n        );\n      }\n      break;\n    case 'star':\n      await toggleStar(targets);\n      break;\n    case 'tags':\n      if (targets[0]) openTagPickerFor(targets[0]);\n      break;\n    case 'rename':\n      if (targets[0]) {\n        renameTarget.value = targets[0];\n        mutationInPane.value = actingInPane(); /* ui-fix */\n        showRename.value = true;\n      }\n      break;\n    case 'cut':\n      /* ui-fix — in a pane context the clipboard source must be the pane's dir. */\n      if (actingInPane()) paneCut();\n      else {\n        clipboard.value = { mode: 'cut', items: targets, sourcePath: currentPath.value };\n        flashToast(t('toast.cut_ready'));\n      }\n      break;\n    case 'copy':\n      if (actingInPane()) paneCopy();\n      else {\n        clipboard.value = { mode: 'copy', items: targets, sourcePath: currentPath.value };\n        flashToast(t('toast.copy_ready'));\n      }\n      break;\n    case 'paste':\n      /* ui-fix — pasting from the right-click menu goes to the active pane too\n       * (the keyboard shortcut was already pane-routed; the menu was not). */\n      if (actingInPane()) await panePaste();\n      else await paste();\n      break;\n    case 'delete': {\n      /* ⚠ The confirm dialog reads `paneCtxTargets` in pane mode, and only the\n       * pane MENU used to fill it. Coming from the selection bar there is no\n       * menu, so the rows are handed over here or the dialog would delete\n       * whatever the last right-click left behind. */\n      const inPane = actingInPane(); /* ui-fix */\n      if (inPane) paneCtxTargets.value = targets;\n      mutationInPane.value = inPane;\n      showDelete.value = true;\n      break;\n    }\n    case 'restore':\n      if (targets.length > 0) await restoreSelection(targets);\n      break;\n    case 'toggle-hidden':\n      toggleHiddenFiles();\n      break;\n    case 'new-folder':\n      mutationInPane.value = actingInPane(); /* ui-fix */\n      showNewFolder.value = true;\n      break;\n    case 'duplicate':\n      if (targets[0]) await duplicate(targets[0]);\n      break;\n    /* wiring:d1 — right-click \"Yeni sekmede aç\" (open in new tab) */\n    case 'open-tab':\n      if (targets[0]) openNodeInTab(targets[0]);\n      break;\n    /* /wiring:d1 */\n  }\n}\n\nfunction cut() {\n  if (selection.isEmpty.value) return;\n  clipboard.value = { mode: 'cut', items: selection.nodes.value, sourcePath: currentPath.value };\n  flashToast(t('toast.cut'));\n}\n\nfunction copyToClipboard() {\n  if (selection.isEmpty.value) return;\n  clipboard.value = { mode: 'copy', items: selection.nodes.value, sourcePath: currentPath.value };\n  flashToast(t('toast.copied'));\n}\n\n/** A paste on its way. A cut paste lists the target folder before it queues\n *  (movedNamesCollide), and the clipboard is only emptied once it has: a second\n *  Ctrl+V meanwhile queued the same move twice. */\nlet pasting = false;\n\nasync function paste() {\n  const cb = clipboard.value;\n  if (!cb.mode || cb.items.length === 0 || pasting) return;\n  pasting = true;\n  try {\n    const items = cb.items.map((n) => n.path); // already qualified (adapter://rel)\n    const sourceDir = cb.sourcePath || '';\n    const sameDir = cb.mode === 'cut' && sourceDir === currentPath.value;\n    if (sameDir) {\n      flashToast(t('toast.same_folder_cut'));\n      return;\n    }\n\n    const targetWire = qualify(currentPath.value);\n    /* wiring:e2 vault — inside a vault, the vault moves and copies; between a\n       vault and anything outside it, nothing is moved on the server. */\n    const vk = vaultTransferKind(items, targetWire);\n    if (vk === 'cross') {\n      flashToast(t('e2e.vault.cross'));\n      return;\n    }\n    if (vk === 'inside') {\n      const ok = cb.mode === 'cut' ? await vault.move(items, targetWire) : await vault.copy(items, targetWire);\n      if (ok && cb.mode === 'cut') clipboard.value = { mode: null, items: [], sourcePath: null };\n      return;\n    }\n    // A different storage only changes the message: cut still CUTS\n    // and copy still COPIES, even when the target lives on another storage.\n    // The server does the transfer (the ops queue carries both the source\n    // and the target storage).\n    const plan = resolveTransfer(items, targetWire, cb.mode === 'cut' ? 'move' : 'copy');\n    /* wiring:e2 names — inside an encrypted-names folder every item moves\n       with its name re-sealed for the target folder (e2eTransferNamed). */\n    const named = await e2eTransferNamed(cb.mode === 'cut' ? 'move' : 'copy', items, targetWire, qualify(sourceDir) || undefined);\n    if (named) {\n      if (named.undo && named.ops.length) {\n        opUndo.set(named.ops[named.ops.length - 1].id, { message: t('toast.moved'), fn: named.undo });\n      }\n      if (named.ops.length) flashToast(cb.mode === 'cut' ? t('split.move_queued') : t('split.copy_queued'));\n      clipboard.value = { mode: null, items: [], sourcePath: null };\n      return;\n    }\n    if (cb.mode === 'cut') {\n      const originWire = qualify(sourceDir) || undefined;\n      const collides = await movedNamesCollide(items, targetWire);\n      const { op } = await api.moveAsync(items, targetWire, originWire);\n      registerMoveUndo(op.id, items, targetWire, originWire, collides);\n      pendingOps.register(op);\n      flashToast(\n        collides\n          ? t('toast.move_kept_both')\n          : plan.cross\n            ? t('split.cross_move')\n            : t('split.move_queued'),\n      );\n    } else {\n      const { op } = await api.copy(items, targetWire);\n      pendingOps.register(op);\n      flashToast(plan.cross ? t('split.cross_copy') : t('split.copy_queued'));\n    }\n    clipboard.value = { mode: null, items: [], sourcePath: null };\n  } catch (err) {\n    reportMutationError(err, { op: 'paste' });\n  } finally {\n    pasting = false;\n  }\n}\n\nasync function duplicate(n: FileNode) {\n  try {\n    const { op } = await api.copy([n.path], qualify(currentPath.value));\n    pendingOps.register(op);\n  } catch (err) {\n    reportMutationError(err, { op: 'duplicate' });\n  }\n}\n\nfunction downloadFile(n: FileNode) {\n  /* wiring:e2 vault */\n  if (vault.isVaultRow(n)) {\n    void vault.download([n]);\n    return;\n  }\n  /* wiring:e2 — downloading inside an encrypted folder: fetch the bytes,\n     decrypt them, save under the original name (handing the user raw\n     ciphertext would be pointless). */\n  if (e2eUnlocked.value) {\n    void e2eDownload(n);\n    return;\n  }\n  /* /wiring:e2 */\n  // Keep `<adapter>://<rel>` so backend resolves the right storage\n  // (stripping it would default to the first storage, which 404s for\n  // any non-default storage like S3/SFTP/WebDAV).\n  const url = api.downloadUrl(n.path);\n  window.open(url, '_blank');\n}\n\n/**\n * tasi:m1 — download WHATEVER is selected, as one thing.\n *\n * One file is still one navigation to its own body: it keeps the range\n * requests, the browser's own resume, and the encrypted-folder path that has\n * to decrypt in this tab. Anything else — several files, or a folder, whose\n * members the server expands itself — is one streaming archive behind a\n * single-use ticket (lib/downloadSelection explains why a POST then a\n * navigation, and why an iframe rather than `window.open`).\n *\n * ⚠ The old behaviour was not \"download each one\": the row HID itself above a\n * single selection, because the only implementation was one `window.open` per\n * node and the browser blocks the second as a popup.\n */\n/** An archive download being prepared: a second press meanwhile asked the\n *  server to walk the same folders again, for a second archive. */\nconst archivePreparing = ref(false);\n\nasync function downloadSelection(targets: FileNode[], opts: { encrypted?: boolean } = {}): Promise<void> {\n  if (targets.length === 0) return;\n  /* wiring:e2 fxe — decrypted in this tab where there is a key for it (a\n     `.fxe`, an unlocked encrypted folder or a selection inside one);\n     `encrypted` is \"Download encrypted copy\": the bytes the server has. */\n  /* wiring:e2 vault — decrypted in this tab: one file as itself, else a zip. */\n  if (targets.every((n) => vault.isVaultRow(n))) {\n    await vault.download(targets);\n    return;\n  }\n  if (!opts.encrypted && (await e2eDownloadDecrypted(targets))) return;\n  if (targets.length === 1 && targets[0].type === 'file') {\n    if (opts.encrypted) {\n      window.open(api.downloadUrl(targets[0].path), '_blank');\n      return;\n    }\n    downloadFile(targets[0]);\n    return;\n  }\n  if (archivePreparing.value) return;\n  archivePreparing.value = true;\n  /* ⚠ Not a courtesy: minting asks the server to resolve and authorize every\n   * member, which on a deep folder is not instant, and nothing else on screen\n   * moves until the browser is handed the response. It stays up until the\n   * answer replaces it — it used to be the 2.5 s toast, gone long before a\n   * walk of a folder on an object store is. */\n  showToast({ message: t('toast.archive.preparing') }, STICKY_TOAST_MS);\n  try {\n    const ticket = await downloadArchive(api, targets.map((n) => n.path));\n    /* wiring:e2 names — the server names the zip after what it stores (the\n       ciphertext of a folder inside an encrypted-names folder); the toast\n       says which folder in the person's words. The zip keeps the server's\n       name: sending the plaintext to name it would hand it to the server. */\n    const shownName =\n      targets.length === 1 && targets[0].e2e_stored ? `${targets[0].basename}.zip` : ticket.name;\n    flashToast(t('toast.archive.started', { name: shownName, count: String(ticket.files) }));\n  } catch (err) {\n    const e = err as Error & { status?: number };\n    /* 409 is the server saying the selection held nothing this account may\n     * read — a different sentence from \"it failed\", and the only one that\n     * tells the reader what to do next. */\n    showToast({ message: e.status === 409 ? t('toast.archive.empty') : failureText(err) }, ERROR_TOAST_MS);\n    emit('error', { message: e.message, context: { op: 'archive-download' } });\n  } finally {\n    archivePreparing.value = false;\n  }\n}\n\n/**\n * tasi:m1 — the destination dialog came back with a folder.\n *\n * Everything the verb needs already exists: `transferItems` is the one gate\n * that moves and copies (cross-storage included) and owns the undo\n * registration, so this only says WHICH rows, WHERE, and WHICH intent.\n *\n * ⚠ `originWire` is the folder the rows came FROM, and it has to follow the\n * pane the selection belongs to — the same rule `actingInPane` states for\n * every other mutation.\n */\nasync function onDestinationPicked(dest: string): Promise<void> {\n  const targets = destPickerTargets.value;\n  if (!dest || targets.length === 0) {\n    showDestPicker.value = false;\n    return;\n  }\n  const move = destPickerMode.value === 'move';\n  const originWire = actingInPane()\n    ? qualify(splitPaneRef.value?.getPath() ?? '')\n    : qualify(currentPath.value);\n  destPickerBusy.value = true;\n  try {\n    const outcome = await transferItems(targets.map((n) => n.path), dest, originWire || undefined, move ? 'move' : 'copy');\n    const name = e2eNames.segmentLabel(dest) ?? labelOfWire(dest, dest); /* wiring:e2 names */\n    /* ⚠ `transferItems` has already flashed \"queued\". This REPLACES it rather\n     * than stacking on it — there is one toast slot (`showToast`), and the\n     * useful half of the sentence is the destination, which \"queued\" does not\n     * carry. Do not add a second call expecting two messages; you would only\n     * be choosing which one nobody reads.\n     * ⚠⚠ Only when it WAS queued. This used to run whatever happened: a refused\n     * move said \"Moved to X\" over the refusal, and past tense besides — the\n     * job is only queued here; its own toast says when it is done. A move done\n     * inside the request (a host with no async move endpoint) keeps its Undo\n     * toast: \"queued\" over it was untrue, and lost the Undo. Sent where the\n     * items already are, nothing is sent — and that is said. */\n    if (outcome === 'queued') {\n      flashToast(move ? t('toast.moved_to', { name }) : t('toast.copied_to', { name }));\n    } else if (outcome === 'nothing') {\n      flashToast(t('toast.already_there', { name }));\n    }\n    if (move && (outcome === 'queued' || outcome === 'done')) {\n      if (actingInPane()) splitSelection.clear();\n      else selection.clear();\n    }\n  } finally {\n    destPickerBusy.value = false;\n    showDestPicker.value = false;\n  }\n}\n\n// ------- Modals -------\n\n/* belge:n1 — after creating it, OPEN it. Creating a file and leaving the\n * person looking at a listing is half the feature. */\nasync function onDocumentCreated(file: {\n  path: string;\n  name: string;\n  ext: string;\n  draft?: DraftDto;\n  app?: { plugin: string; view: string };\n}) {\n  showNewDocument.value = false;\n  // Made from an app's row (`new_documents`): it opens in the app's view the\n  // row names, whatever else opens that extension (\"Open with\", decided).\n  const appChoice = file.app ? `${file.app.plugin}/${file.app.view}` : null;\n  // Drafts (issue #71): nothing was created in the folder — the document is a\n  // draft, and its editor opens on it. The folder is not reloaded: there is\n  // nothing new in it yet.\n  if (file.draft) {\n    draftCount.value += 1;\n    openDraft(file.draft, appChoice);\n    void refreshDraftCount();\n    return;\n  }\n  const dir = file.path.slice(0, file.path.lastIndexOf('/'));\n  if (dir && dir !== qualify(currentPath.value)) await load(dir);\n  else await load();\n  /* `file.ext` is the TYPE the bytes were made from, not the name's extension\n   * (#56: a Plain text document may be `LICENSE`), so the stand-in row takes\n   * its extension from the name, and the type goes to the viewer as openAs. */\n  const dot = file.name.lastIndexOf('.');\n  const node =\n    files.value.find((n) => n.path === file.path) ??\n    ({\n      type: 'file',\n      path: file.path,\n      basename: file.name,\n      extension: dot > 0 ? file.name.slice(dot + 1).toLowerCase() : '',\n    } as unknown as FileNode);\n  // Host-owned open (desktop): the new document goes to its own window like\n  // any other open (lib/openSurface.ts) — not ALSO over the explorer.\n  if (openSurface(props.config, node) === 'host') {\n    emit('file-opened', { path: node.path, basename: node.basename });\n    void markRecent(node);\n    return;\n  }\n  previewOpenAs.value = file.ext ? { path: node.path, ext: file.ext } : null;\n  previewAppChoice.value = appChoice;\n  previewTarget.value = node;\n  // ⚠ NOT previewModeForExt: that sends office types to 'view', which is right\n  // for a peek at somebody else's file and wrong for the one you just made.\n  previewMode.value = nodeCanEdit(node) ? 'edit' : 'view';\n  showPreview.value = true;\n  emit('file-opened', { path: node.path, basename: node.basename });\n  void markRecent(node);\n}\n\nfunction archiveRequestCode(err: unknown): string | undefined {\n  const detail = (err as { detail?: string })?.detail;\n  if (!detail) return undefined;\n  try {\n    return (JSON.parse(detail) as { code?: string }).code;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction archiveRequestError(err: unknown): string {\n  const detail = (err as { detail?: string })?.detail;\n  if (detail) {\n    try {\n      const body = JSON.parse(detail) as { code?: string; error?: string };\n      const byCode: Record<string, string> = {\n        PASSWORD_REQUIRED: 'archive.password_required',\n        BAD_PASSWORD: 'archive.bad_password',\n        TARGET_EXISTS: 'archive.target_exists',\n        PASSWORD_CHARSET: 'archive.password_charset',\n        UNSUPPORTED_FORMAT: 'archive.error_unsupported',\n        ARCHIVE_LIMIT_EXCEEDED: 'archive.error_limit',\n        PROVIDER_UNAVAILABLE: 'archive.error_unavailable',\n      };\n      if (body.code && byCode[body.code]) return t(byCode[body.code]);\n      if (body.error) return body.error;\n    } catch {\n      // The common API wrapper still supplies a friendly status message.\n    }\n  }\n  return (err as Error)?.message || t('toast.failed');\n}\n\nasync function submitArchiveCreate(value: {\n  name: string;\n  format: ArchiveCreateFormat;\n  password?: string;\n  encrypt_filenames: boolean;\n  compression: number;\n  solid?: boolean;\n  dictionary_size_mb?: number;\n}) {\n  archiveCreateBusy.value = true;\n  archiveError.value = '';\n  try {\n    const { op } = await api.archiveCreate({\n      dest: wireJoin(archiveDestinationDir.value, value.name),\n      sources: archiveTargets.value.map((node) => node.path),\n      format: value.format,\n      password: value.password,\n      encrypt_filenames: value.encrypt_filenames,\n      compression: value.compression,\n      solid: value.solid,\n      dictionary_size_mb: value.dictionary_size_mb,\n    });\n    pendingOps.register(op);\n    showArchiveCreate.value = false;\n    /* The dialog has closed and the job may run for minutes: its row, not the\n     * corner badge alone, is what says it is under way (useOperations `reveal`). */\n    opsCenter.reveal();\n    flashToast(t('archive.queued'));\n  } catch (err) {\n    archiveError.value = archiveRequestError(err);\n    emit('error', { message: archiveError.value, context: { op: 'archive-create' } });\n  } finally {\n    archiveCreateBusy.value = false;\n  }\n}\n\nasync function startArchiveExtraction(\n  target: FileNode,\n  dest: string,\n  inPane: boolean,\n  password?: string,\n) {\n  /* ⚠ One at a time per archive. Before the server can queue an extraction it\n   * downloads the whole archive and inspects it (minutes for a large one on\n   * an object store), and \"Extract here\" — no dialog, no button to shut —\n   * could be chosen again meanwhile, starting a second download and a second\n   * job. The second choice is SAID now, not dropped without a word; another\n   * archive, or an archive being created, does not hold it. */\n  if (archiveExtracting.value.has(target.path)) {\n    flashToast(t('archive.already_preparing', { name: target.basename }));\n    return;\n  }\n  archiveExtracting.value = new Set(archiveExtracting.value).add(target.path);\n  archiveError.value = '';\n  /* The same wait, said: \"Extract here\" had nothing on screen until the job\n   * was queued. A dialog shows its own busy button, so only then. */\n  const preparing = t('archive.preparing_extract', { name: target.basename });\n  const sayPreparing = setTimeout(() => {\n    if (!showArchiveExtract.value && !showArchivePassword.value) showToast({ message: preparing }, STICKY_TOAST_MS);\n  }, 600);\n  try {\n    const result = await api.archiveExtract(target.path, {\n      dest,\n      password,\n    });\n    showArchiveExtract.value = false;\n    showArchivePassword.value = false;\n    archivePasswordAction.value = null;\n    archivePasswordError.value = '';\n    if (result.op) {\n      pendingOps.register(result.op);\n      opsCenter.reveal(); /* as for a new archive (submitArchiveCreate) */\n      flashToast(t('archive.extraction_queued'));\n      return;\n    }\n    if (inPane) await splitPaneRef.value?.reload();\n    else await load();\n    flashToast(t('archive.extracted', { count: result.count ?? 0 }));\n  } catch (err) {\n    const code = archiveRequestCode(err);\n    if (code === 'PASSWORD_REQUIRED' || code === 'BAD_PASSWORD') {\n      archivePasswordAction.value = { target, dest, inPane };\n      archivePasswordError.value = code === 'BAD_PASSWORD' ? t('archive.bad_password') : '';\n      showArchiveExtract.value = false;\n      showArchivePassword.value = true;\n      return;\n    }\n    const message = archiveRequestError(err);\n    if (showArchivePassword.value) archivePasswordError.value = message;\n    else if (showArchiveExtract.value) archiveError.value = message;\n    /* \"Extract here\" opens no dialog, so an error written into one was never\n     * seen: a refused archive (a link inside, too large, a format this server\n     * cannot read) looked like a click that did nothing. */\n    else showToast({ message }, 6000);\n  } finally {\n    clearTimeout(sayPreparing);\n    // Whatever was said next replaced it; if nothing was, it goes now.\n    if (toast.value?.message === preparing) toast.value = null;\n    const left = new Set(archiveExtracting.value);\n    left.delete(target.path);\n    archiveExtracting.value = left;\n  }\n}\n\nasync function submitArchiveExtract(value: { folder: string }) {\n  const target = archiveTarget.value;\n  if (!target) return;\n  await startArchiveExtraction(\n    target,\n    wireJoin(archiveDestinationDir.value, value.folder),\n    archiveInPane.value,\n  );\n}\n\nasync function submitArchivePassword(password: string) {\n  const action = archivePasswordAction.value;\n  if (!action) return;\n  archivePasswordError.value = '';\n  await startArchiveExtraction(action.target, action.dest, action.inPane, password);\n}\n\nfunction closeArchivePassword() {\n  showArchivePassword.value = false;\n  archivePasswordAction.value = null;\n  archivePasswordError.value = '';\n}\n\nasync function cancelPendingOp(id: number) {\n  try {\n    await api.opsCancel(id);\n    await pendingOps.poll();\n  } catch (err) {\n    const op = pendingOps.ops.value.find((candidate) => candidate.id === id);\n    const archive = op?.op_type === 'archive-create' || op?.op_type === 'archive-extract';\n    showToast({ message: archive ? archiveRequestError(err) : failureText(err, t('plugin.cancel_failed')) }, ERROR_TOAST_MS);\n  }\n}\n\nasync function submitNewFolder(name: string) {\n  // Busy until the answer, with the last refusal cleared first: the dialog\n  // shows it again when it CHANGES, and a retry refused with the same\n  // sentence would otherwise leave it untouched.\n  const ticket = newFolderReq.begin();\n  if (ticket === null) return;\n  const inPane = mutationInPane.value; /* ui-fix — new folder in the side pane */\n  try {\n    const dirWire = inPane ? qualify(splitPaneRef.value?.getPath() ?? '') : qualify(currentPath.value);\n    /* wiring:e2 vault — a folder in the vault's index, not on the server. */\n    if (vault.rootOf(dirWire)) {\n      if (await vault.mkdir(dirWire, name)) {\n        showNewFolder.value = false;\n        newFolderReq.end(ticket);\n      }\n      return;\n    }\n    /* wiring:e2 names — inside an encrypted-names folder the server gets the\n       stored name only (and a long name's sidecar first). */\n    const wireName = await e2eWireName(dirWire, name, { isDir: true });\n    await api.newFolder(dirWire, wireName);\n    showNewFolder.value = false;\n    // Free now, not after the listing below: a New folder opened meanwhile is\n    // a new dialog, not this one still busy.\n    newFolderReq.end(ticket);\n    if (inPane) await splitPaneRef.value?.reload();\n    else await load();\n  } catch (err) {\n    refuseInDialog(newFolderReq, ticket, err, { op: 'newfolder' });\n  } finally {\n    newFolderReq.end(ticket);\n  }\n}\n\nasync function submitRename(name: string) {\n  const target = renameTarget.value;\n  if (!target) return;\n  /* ⚠ The last refusal is cleared BEFORE the attempt (renameReq.begin), not\n   * only when the dialog opens. The dialog drops the line as soon as the name\n   * is edited and re-shows it when the ref CHANGES — so retrying the same\n   * taken name, which fails with the identical sentence, left the ref\n   * untouched, nothing re-rendered, and Save looked like it did nothing. */\n  const ticket = renameReq.begin();\n  if (ticket === null) return;\n  const inPane = mutationInPane.value; /* ui-fix — rename from the side pane */\n  try {\n    const dirWire = inPane ? qualify(splitPaneRef.value?.getPath() ?? '') : qualify(currentPath.value);\n    const oldPath = target.path; // qualified\n    /* wiring:e2 vault — renamed in the vault's index. */\n    if (vault.rootOf(oldPath)) {\n      if (await vault.rename(oldPath, name)) {\n        showRename.value = false;\n        renameTarget.value = null;\n        renameReq.end(ticket);\n      }\n      return;\n    }\n    /* wiring:e2 names — both ends of a rename, and its undo, travel as STORED\n       names: the plaintext never reaches the server. */\n    const oldName = storedName(target);\n    // A folder keeps its id (its contents are sealed under it).\n    const wireName = await e2eWireName(\n      wireParent(oldPath),\n      name,\n      target.type === 'dir' ? { keepIdOf: oldPath } : {},\n    );\n    // A folder is a job of the queue when the server runs it there: on an\n    // object store every object inside it is a request of its own, and inside\n    // this one the dialog outlasted the proxy with nothing on screen.\n    const queued = target.type === 'dir' && serverQueues('rename');\n    let job: PendingOpDto | undefined;\n    if (queued) job = (await api.renameQueued(dirWire, oldPath, wireName)).op;\n    else await api.rename(dirWire, oldPath, wireName);\n    showRename.value = false;\n    renameTarget.value = null;\n    renameReq.end(ticket);\n    // Clean inverse: rename the new path back to the old basename — as a job\n    // too, when this one was.\n    const newPath = wireJoin(wireParent(oldPath), wireName);\n    const undo =\n      wireName && wireName !== oldName\n        ? async () => {\n            if (!queued) {\n              await api.rename(dirWire, newPath, oldName);\n              return;\n            }\n            const back = (await api.renameQueued(dirWire, newPath, oldName)).op;\n            if (back) pendingOps.register(back);\n            return { queued: true };\n          }\n        : null;\n    if (job) {\n      // The operations centre follows the job; the listing, and the undo,\n      // come when it ends (onSettled).\n      if (undo) opUndo.set(job.id, { message: t('toast.renamed'), fn: undo });\n      pendingOps.register(job);\n      flashToast(t('toast.rename_queued', { name }));\n      return;\n    }\n    if (inPane) await splitPaneRef.value?.reload();\n    else await load();\n    if (undo) undoToast(t('toast.renamed'), undo);\n  } catch (err) {\n    const e = err as Error & { status?: number };\n    // 409 is the server refusing to replace what already has the name\n    // (NAME_TAKEN). Everything else still says what went wrong — in the\n    // dialog while it is on screen, as a toast once it is not.\n    // wiring:e2 names — said with the name the person typed, never the stored one.\n    const words =\n      err instanceof E2eNameRefused\n        ? t('e2e.names.bad_name', { name })\n        : e.status === 409\n          ? t('newdoc.err.exists', { name })\n          : failureText(err);\n    refuseInDialog(renameReq, ticket, err, { op: 'rename' }, words);\n  } finally {\n    renameReq.end(ticket);\n  }\n}\n\n/**\n * Trash entries (by node id) a permanent delete is on its way for — the\n * request, then its job of the queue. Their rows say \"Deleting permanently…\"\n * and are dimmed, and no second purge is sent for them.\n */\nconst trashPurging = ref<Set<number>>(new Set());\n/** A queued purge's job → the trash entries it deletes (one job per\n *  storage). */\nconst purgeJobRows = new Map<number, number[]>();\n\nfunction markPurging(ids: number[], on: boolean): void {\n  const next = new Set(trashPurging.value);\n  for (const id of ids) {\n    if (on) next.add(id);\n    else next.delete(id);\n  }\n  trashPurging.value = next;\n  // The row says it (ListView's time-left cell reads `purging`).\n  for (const n of files.value) {\n    const id = (n as { id?: number }).id;\n    const meta = (n as { extra_metadata?: Record<string, unknown> }).extra_metadata;\n    if (typeof id === 'number' && ids.includes(id) && meta) meta.purging = on;\n  }\n}\n\n/**\n * Purges the selected trash entries in ONE request (`api.purgeBatch`), as jobs\n * of the queue on a server that runs purges there (`capabilities.queued`): a\n * folder is purged object by object, which outlasts a request.\n *\n * ⚠ One request and the server's words (finding A15). It was one DELETE per\n * entry and a summary composed here (lib/purgeWords, gone); the answer now\n * says what was deleted (or is on its way) and what was not and why, and each\n * job's row says how it ended (onSettled).\n */\nasync function purgeSelection() {\n  const all = selection.nodes.value\n    .map((n) => (n as { id?: number }).id)\n    .filter((x): x is number => typeof x === 'number');\n  if (all.length === 0) {\n    showDelete.value = false;\n    return;\n  }\n  // A row whose purge is already on its way is not sent again: the second\n  // request met a job still deleting it.\n  const ids = all.filter((id) => !trashPurging.value.has(id));\n  if (ids.length === 0) {\n    showDelete.value = false;\n    flashToast(t('trash.row_busy'));\n    return;\n  }\n  const ticket = deleteReq.begin();\n  if (ticket === null) return;\n  const queued = serverQueues('purge');\n  markPurging(ids, true);\n  let said: TrashBatchAnswer;\n  try {\n    said = await api.purgeBatch(ids, { queued });\n  } catch (err) {\n    markPurging(ids, false);\n    deleteReq.end(ticket);\n    // In the dialog while it is on screen, a toast once it is not — and the\n    // host hears it, like every refused change (reportMutationError).\n    refuseInDialog(deleteReq, ticket, err, { op: 'purge' });\n    return;\n  }\n  deleteReq.end(ticket);\n  const jobs = said.ops ?? [];\n  if (jobs.length === 0) markPurging(ids, false);\n  const storageOf = (id: number) =>\n    (files.value.find((n) => (n as { id?: number }).id === id) as unknown as { storage_id?: number } | undefined)\n      ?.storage_id;\n  const handed = new Set<number>();\n  for (const op of jobs) {\n    pendingOps.register(op);\n    // Which rows a job deletes: its storage's (one job per storage).\n    const sid = (op as unknown as { storage_id?: number }).storage_id;\n    const rows = jobs.length === 1 ? ids : ids.filter((id) => storageOf(id) === sid);\n    for (const id of rows) handed.add(id);\n    purgeJobRows.set(op.id, rows);\n  }\n  // A row no job took (the server refused it) stops saying \"Deleting…\" now.\n  if (jobs.length > 1) markPurging(ids.filter((id) => !handed.has(id)), false);\n  if (said.done === 0) {\n    refuseInDialog(deleteReq, ticket, new Error(said.summary), { op: 'purge' }, said.summary);\n    return;\n  }\n  showDelete.value = false;\n  selection.clear();\n  showToast({ message: said.summary }, said.failed ? ERROR_TOAST_MS : FLASH_TOAST_MS);\n  if (jobs.length === 0 && trashMode.value) await loadTrash();\n}\n\nasync function confirmDelete() {\n  if (deleteReq.busy.value) return;\n  // In the trash view the items are already soft-deleted: \"Delete\n  // permanently\" purges them. ⚠ It used to show a retention notice and delete\n  // nothing, under a menu entry and a dialog that both promised a delete.\n  // Only someone the server lets purge is offered it (trashCanEmpty); anyone\n  // else reaching here is told how the trash empties itself.\n  if (trashMode.value) {\n    if (!trashCanEmpty.value) {\n      showDelete.value = false;\n      flashToast(t('toast.trash_retention'));\n      return;\n    }\n    await purgeSelection();\n    return;\n  }\n  /* ui-fix — yan panelden silme: hedefler + dizin + tazeleme pane'e ait. */\n  const inPane = mutationInPane.value;\n  const targets = inPane ? paneCtxTargets.value : selection.nodes.value;\n  const dirWire = inPane ? qualify(splitPaneRef.value?.getPath() ?? '') : qualify(currentPath.value);\n  const items = targets.map((n) => n.path);\n  if (items.length === 0) {\n    showDelete.value = false;\n    return;\n  }\n  /* wiring:e2 vault — deleted from the vault's index, for good (the dialog\n     says so: `permanent`). Its packs go when the collection runs. */\n  if (vault.rootOf(items[0])) {\n    const vt = deleteReq.begin();\n    if (vt === null) return;\n    try {\n      if (await vault.remove(items)) {\n        showDelete.value = false;\n        if (!inPane) selection.clear();\n      }\n    } finally {\n      deleteReq.end(vt);\n    }\n    return;\n  }\n  // Trash-delete is invertible via node-id restore — but only when EVERY\n  // selected node carries a backend id and the restore endpoint exists.\n  // A partial-undo offer would be a lie, so all-or-nothing.\n  const nodeIds = targets\n    .map((n) => (n as { id?: number }).id)\n    .filter((x): x is number => typeof x === 'number');\n  const restoreUndo =\n    api.endpoints.trashRestore && nodeIds.length === targets.length\n      ? async () => {\n          const said = await api.restoreBatch(nodeIds);\n          if (said.done === 0) throw new Error(said.summary);\n          return { summary: said.summary };\n        }\n      : null;\n  const ticket = deleteReq.begin();\n  if (ticket === null) return;\n  try {\n    if (api.endpoints.deleteAsync) {\n      const { op } = await api.deleteAsync(items, dirWire);\n      if (restoreUndo) {\n        opUndo.set(op.id, { message: t('toast.trashed'), fn: restoreUndo });\n      }\n      pendingOps.register(op);\n      flashToast(t('toast.delete_queued'));\n      showDelete.value = false;\n      deleteReq.end(ticket);\n    } else {\n      await api.deleteItems(dirWire, items);\n      // Closed and free before the listing is read again: a Delete opened\n      // meanwhile is a new dialog, not this one still busy.\n      showDelete.value = false;\n      deleteReq.end(ticket);\n      if (inPane) await splitPaneRef.value?.reload();\n      else await load();\n      if (restoreUndo) undoToast(t('toast.trashed'), restoreUndo);\n    }\n    if (inPane) void splitPaneRef.value?.reload();\n    else selection.clear();\n  } catch (err) {\n    // Said in the dialog, which stays open over what was not deleted — or as\n    // a toast when it is no longer the one on screen.\n    refuseInDialog(deleteReq, ticket, err, { op: 'delete' });\n  } finally {\n    deleteReq.end(ticket);\n  }\n}\n\n\n// ------- Upload -------\n\nfunction triggerUpload() {\n  if (!canWriteHere.value) {\n    flashToast(t('toast.read_only_here'));\n    return;\n  }\n  fileInputEl.value?.click();\n}\n\nfunction onFilePicked(ev: Event) {\n  const input = ev.target as HTMLInputElement;\n  const list = input.files ? Array.from(input.files) : [];\n  input.value = '';\n  void uploadFiles(list);\n}\n\nasync function uploadFiles(list: File[]) {\n  if (list.length === 0) return;\n  // ⚠ The folder the files were dropped into or picked for, read ONCE. The\n  // files go one after another, and each used to read the open folder again\n  // when its turn came — so browsing while the first file was on its way sent\n  // the rest of the batch into whatever folder was open by then.\n  const target = qualify(currentPath.value);\n  /* wiring:e2 vault — into the vault: encrypted here, file by file, into its\n     packs, and committed as one change. No 200 MB limit: the contents are\n     read and encrypted a chunk at a time. */\n  if (vault.rootOf(target)) {\n    if (!vault.isOpen(vault.rootOf(target))) {\n      flashToast(t('e2e.upload.locked'));\n      return;\n    }\n    await vault.upload(target, list);\n    return;\n  }\n  /* wiring:e2 - uploads into an encrypted folder are encrypted transparently.\n     No upload while locked (that would be a plaintext-leak door); a file over\n     200 MB is encrypted as a STREAM (0x02) while it is sent. */\n  if (e2eLocked.value) {\n    flashToast(t('e2e.upload.locked'));\n    return;\n  }\n  if (e2eUnlocked.value) {\n    const prepared = await e2eEncryptUploads(list, target);\n    list = prepared.files;\n    if (list.length === 0) return;\n    /* wiring:e2 names — a long name's sidecar goes up BEFORE its item, so\n       the item is never listed without the file that names it. */\n    if (prepared.sidecars.length > 0) {\n      try {\n        await api.uploadMultipart(target, prepared.sidecars);\n      } catch (err) {\n        emit('error', { message: (err as Error).message, context: { op: 'e2e-name-sidecar' } });\n        flashToast(t('e2e.names.write_failed'));\n        return;\n      }\n    }\n  }\n  /* /wiring:e2 */\n  for (const f of list) {\n    /* wiring:e2 stream — a file encrypted as it is sent only goes staged. */\n    const source = e2eUploadSources.get(f);\n    if (source) {\n      if (!(await chunkedUpload(f, target, source))) flashToast(t('e2e.upload.streaming_unsupported'));\n      continue;\n    }\n    // Anything above the chunk size goes on the STAGED path: chunked into\n    // filex's own staging area, resumable across a dropped connection and — via\n    // the bookmark in lib/uploadResume — across a reloaded tab. It works on\n    // every driver, unlike the S3-presigned path it replaced. Small files keep\n    // the single-POST fast path, and a server that has no staged path at all\n    // falls back to it too.\n    if (chunked.shouldChunk(f)) {\n      const pending = chunked.resumableFor(target, f);\n      if (pending) {\n        // Say so. An upload that silently starts over looks identical to one\n        // that never happened, which is precisely the complaint.\n        flashToast(\n          t('upload.resuming', {\n            name: e2eUploadNames.get(f) ?? f.name,\n            percent: f.size > 0 ? Math.round((pending.offset / f.size) * 100) : 0,\n          }),\n        );\n      }\n      if (await chunkedUpload(f, target)) continue;\n    }\n    await legacyUpload(f, target);\n  }\n  await load();\n}\n\nasync function legacyUpload(file: File, dest?: string) {\n  // Register a progress row so the corner badge tracks the upload — large files\n  // fall back here from the chunked path, and previously showed no progress at\n  // all (the chunked placeholder was removed on init failure and the legacy\n  // POST tracked nothing, so the badge vanished mid-upload).\n  const id = newId();\n  const target = dest ?? qualify(currentPath.value);\n  uploadJobs.value = [\n    ...uploadJobs.value,\n    { id, file, displayName: e2eUploadNames.get(file), path: target, totalBytes: file.size, uploadedBytes: 0, percent: 0, status: 'uploading', cancel() {} },\n  ];\n  const patch = (p: Partial<UploadJob>) => {\n    const idx = uploadJobs.value.findIndex((j) => j.id === id);\n    if (idx === -1) return;\n    const next = [...uploadJobs.value];\n    next[idx] = { ...next[idx], ...p };\n    uploadJobs.value = next;\n  };\n  try {\n    await api.uploadMultipart(target, [file], (percent) => {\n      patch({ percent, uploadedBytes: Math.round((percent / 100) * file.size) });\n      emit('upload-progress', { uploadId: id, percent, done: percent >= 100 });\n    });\n    patch({ percent: 100, uploadedBytes: file.size, status: 'done' });\n    emit('upload-progress', { uploadId: id, percent: 100, done: true });\n  } catch (err) {\n    // Tell the USER, not just the embedding app. `emit('error')` alone left a\n    // standalone deployment silent: the progress bar ran to 100% (the bytes\n    // do go out — the server rejects them afterwards), the row flipped to an\n    // error state carrying no message, and nothing else appeared. A multi-tenant deployment lost\n    // ten days of uploads to that silence (H2, 2026-08-05).\n    const message = (err as Error).message;\n    patch({ status: 'error', error: message });\n    flashToast(t('upload.failed', { name: file.name }));\n    emit('error', {\n      message,\n      context: { op: 'upload', file: file.name },\n    });\n  }\n}\n\n/**\n * Attempt a staged (chunked, resumable) upload. Returns `true` when it was\n * handled — including when it failed — and `false` ONLY when this server has no\n * staged path at all, so the caller may fall back to the single-POST upload.\n *\n * ⚠ The old version fell back on ANY error, which was harmless while the\n * chunked path was S3-only and failed at init. It is not harmless now: a staged\n * upload that dies at 90 % has bytes on the server and a bookmark to resume\n * from, and quietly re-POSTing the whole file would throw both away — the\n * \"starts from zero\" behaviour this change exists to remove. A real failure is\n * shown to the user instead, and picking the same file again continues it.\n */\nasync function chunkedUpload(file: File, dest?: string, source?: UploadSource /* wiring:e2 stream */): Promise<boolean> {\n  // Register the progress row LAZILY — only once `begin` succeeded and bytes are\n  // actually moving. A server with no staged path then shows no badge at all,\n  // so the fallback's own badge is the only one the user sees (no\n  // appear-then-vanish flicker).\n  const id = newId();\n  let registered = false;\n  const patch = (job: UploadJob) => {\n    if (!registered) {\n      uploadJobs.value = [...uploadJobs.value, { ...job, id, displayName: e2eUploadNames.get(file) } as UploadJob];\n      registered = true;\n      return;\n    }\n    const idx = uploadJobs.value.findIndex((j) => j.id === id);\n    if (idx !== -1) {\n      const next = [...uploadJobs.value];\n      next[idx] = { ...job, id, displayName: e2eUploadNames.get(file) } as UploadJob;\n      uploadJobs.value = next;\n    }\n  };\n  const target = dest ?? qualify(currentPath.value);\n  try {\n    await chunked.uploadFile({\n      path: target,\n      file,\n      source /* wiring:e2 stream */,\n      onProgress: (job) => {\n        if (!registered && job.status !== 'uploading' && job.uploadedBytes <= 0) return;\n        patch(job);\n        emit('upload-progress', {\n          uploadId: job.uploadId ?? id,\n          percent: job.percent,\n          done: job.status === 'done',\n        });\n      },\n    });\n    return true;\n  } catch (err) {\n    if (isStagedUnsupported(err)) {\n      if (registered) uploadJobs.value = uploadJobs.value.filter((j) => j.id !== id);\n      return false;\n    }\n    const message = (err as Error).message;\n    if (!registered) {\n      uploadJobs.value = [\n        ...uploadJobs.value,\n        {\n          id,\n          file,\n          displayName: e2eUploadNames.get(file),\n          path: target,\n          totalBytes: file.size,\n          uploadedBytes: 0,\n          percent: 0,\n          status: 'error',\n          error: message,\n          cancel() {},\n        } as UploadJob,\n      ];\n      registered = true;\n    }\n    flashToast(t('upload.failed', { name: e2eUploadNames.get(file) ?? file.name }));\n    emit('error', { message, context: { op: 'upload', file: file.name } });\n    return true;\n  }\n}\n\nconst dragCounter = ref(0);\nconst dragOver = ref(false);\n\n/**\n * isExternalFileDrag — `true` only when the user is dragging files\n * INTO the page from the OS (file picker, finder, etc.). Filters out:\n *   - internal row drags (FE_DND_MIME present)\n *   - browser image drags (`<img draggable=true>` on this page or\n *     across pages). HTML5 `Files` type is leaky — it appears when\n *     dragging any image element even though no real file is moving;\n *     `dataTransfer.items[*].kind === 'file'` is the canonical signal\n *     for an actual OS file.\n */\nfunction isExternalFileDrag(ev: DragEvent): boolean {\n  const dt = ev.dataTransfer;\n  if (!dt) return false;\n  if (dt.types && dt.types.includes(FE_DND_MIME)) return false;\n  /* wiring:f1 — an OS drag we started ourselves also carries 'Files', but it\n     is NOT an upload: it would mean downloading the same bytes from the\n     server and posting them straight back (a copy instead of a move, at\n     twice the traffic). */\n  if (activeNativeDrag()) return false;\n  // Some browsers expose `items` early in the drag, others only on\n  // drop. When `items` is available we use it as the authoritative\n  // signal — `kind === 'file'` means a real OS file. When unavailable\n  // (Firefox during dragover sometimes returns 0 items), fall back to\n  // the legacy `Files` type check.\n  if (dt.items && dt.items.length > 0) {\n    let hasFile = false;\n    for (const it of Array.from(dt.items)) {\n      if (it.kind === 'file') {\n        hasFile = true;\n        break;\n      }\n    }\n    return hasFile;\n  }\n  return dt.types ? dt.types.includes('Files') : false;\n}\n\nfunction onDragEnter(ev: DragEvent) {\n  if (!isExternalFileDrag(ev)) return;\n  ev.preventDefault();\n  dragCounter.value++;\n  dragOver.value = true;\n}\nfunction onDragLeave() {\n  dragCounter.value = Math.max(0, dragCounter.value - 1);\n  if (dragCounter.value === 0) dragOver.value = false;\n}\nfunction onDragOver(ev: DragEvent) {\n  /* wiring:d1 — internal drags must be droppable on the root body too, so that\n     dropping from the split pane onto the main pane's EMPTY SPACE works (the\n     origin can't be read during dragover — the decision is made at drop time;\n     a same-folder drop stays a no-op). */\n  if (hasInternalDrag(ev)) {\n    ev.preventDefault();\n    return;\n  }\n  /* /wiring:d1 */\n  if (isExternalFileDrag(ev)) {\n    ev.preventDefault();\n  }\n}\nfunction onDropUpload(ev: DragEvent) {\n  /* wiring:d1 — dropping from the split pane onto the main pane's empty space\n     = transfer into the current folder (items from the same folder stay a\n     no-op, so the old behaviour is preserved). */\n  if (hasInternalDrag(ev)) {\n    const d1Origin = internalDragOrigin(ev) || '';\n    const d1Here = qualify(currentPath.value);\n    const d1Items = internalDragItems(ev);\n    if (d1Items && d1Origin && d1Here && d1Origin !== d1Here && !trashMode.value && canWriteHere.value) {\n      ev.preventDefault();\n      dragCounter.value = 0;\n      dragOver.value = false;\n      endNativeDrag();\n      cancelShellDrag();\n      void transferItems(d1Items.map((i) => i.path), d1Here, d1Origin);\n      return;\n    }\n  }\n  /* /wiring:d1 */\n  // Internal row drag — nothing to do here, the row drop handler\n  // in GridView/ListView already resolved the move.\n  if (hasInternalDrag(ev)) {\n    dragCounter.value = 0;\n    dragOver.value = false;\n    endNativeDrag();\n    cancelShellDrag();\n    return;\n  }\n  // Browser-internal image drag without real files — bail before\n  // we accidentally synthesise an upload from a 0-length file list\n  // (some browsers populate `files` with zero-byte placeholders).\n  if (!isExternalFileDrag(ev)) {\n    dragCounter.value = 0;\n    dragOver.value = false;\n    return;\n  }\n  ev.preventDefault();\n  dragCounter.value = 0;\n  dragOver.value = false;\n  // RBAC: block drag-drop upload where the user can't write.\n  if (!canWriteHere.value) {\n    flashToast(t('toast.read_only_here'));\n    return;\n  }\n  const list = ev.dataTransfer?.files ? Array.from(ev.dataTransfer.files) : [];\n  if (list.length === 0) return;\n  void uploadFiles(list);\n}\n\nfunction onWindowDragOver(ev: DragEvent) {\n  if (ev.dataTransfer?.types.includes('Files')) ev.preventDefault();\n}\nfunction onWindowDrop(ev: DragEvent) {\n  const root = rootEl.value;\n  const target = ev.target as Node | null;\n  if (root && target && !root.contains(target)) {\n    ev.preventDefault();\n  }\n}\nonMounted(() => {\n  window.addEventListener('dragover', onWindowDragOver);\n  window.addEventListener('drop', onWindowDrop);\n  window.addEventListener('pointerup', onGlobalPointerUp);\n  window.addEventListener('blur', onGlobalPointerUp);\n  /* wiring:f1 — while the shell prepares, say \"preparing\" exactly once; a\n     toast per file would show noise rather than progress. The finish is\n     announced by the 'ready' toast (prepareDragOut). */\n  dragOut.value?.onProgress?.((p) => {\n    // Work that happens AFTER the drop (the placeholder path) is always\n    // announced — the user dropped a file into a folder and has a right to\n    // know what happened there. Silence only applies to the pre-preparation\n    // nobody asked for. What is said is lib/dragOut's sayDragProgress.\n    if (!p) return;\n    const say = sayDragProgress(p, { quiet: dragOutQuiet, stoppable: !!dragOut.value?.stop, t });\n    if (!say) return;\n    /* ⚠ The drag's line, and only when the slot is empty or holds that line\n     * (lib/toastSlot): the shell reports once per file written, and each\n     * report used to replace whatever was on screen — an 8 s Undo, a refusal\n     * — within milliseconds. Progress that finds the slot taken is dropped\n     * (the next report repaints it once the slot is free); the last word waits\n     * for the slot instead. */\n    if (say.kind === 'flash') {\n      // A failure stays up long enough to be read; \"Stopped\" is an answer.\n      const ms = p.error && p.error !== 'cancelled' ? ERROR_TOAST_MS : FLASH_TOAST_MS;\n      if (slotTakenBy(toast.value, 'drag-out', 'end')) {\n        dragEndWaiting = null;\n        showToast({ message: say.message, source: 'drag-out' }, ms);\n      } else {\n        dragEndWaiting = { message: say.message, ms };\n      }\n      return;\n    }\n    if (!slotTakenBy(toast.value, 'drag-out', 'hold')) return;\n    dragEndWaiting = null;\n    // Held until the next report replaces it — the filling-in is still going.\n    // Stop is a plain action: \"Stopping…\", then \"Stopped\", nothing read again.\n    showToast(\n      say.stoppable\n        ? {\n            message: say.message,\n            actionLabel: t('dragout.stop'),\n            action: () => dragOut.value?.stop?.(),\n            after: { kind: 'plain', running: t('dragout.stopping'), done: t('dragout.stopped') },\n            source: 'drag-out',\n          }\n        : { message: say.message, source: 'drag-out' },\n      STICKY_TOAST_MS,\n    );\n  });\n});\n/* wiring:f1 — an OS drag never fires 'dragend' for us (the HTML5 drag never\n   started). We drop the record when the mouse is released; otherwise the next\n   ordinary drag would think it was carrying the previous selection. */\nfunction onGlobalPointerUp() {\n  if (activeNativeDrag()) {\n    endNativeDrag();\n    // The drop MAY NOT have landed in our own window; only our own drop paths\n    // cancel the shell's watch (onDropUpload / onItemDropInto).\n  }\n}\n\n/** The drag ended inside the app: the shell should stop waiting for a drop. */\nfunction cancelShellDrag() {\n  if (dragOut.value?.cancel) void Promise.resolve(dragOut.value.cancel()).catch(() => undefined);\n}\n\nonBeforeUnmount(() => {\n  window.removeEventListener('dragover', onWindowDragOver);\n  window.removeEventListener('drop', onWindowDrop);\n  window.removeEventListener('hashchange', onHashChange);\n  window.removeEventListener('pointerup', onGlobalPointerUp);\n  window.removeEventListener('blur', onGlobalPointerUp);\n});\n\n/** Rows drawn dimmed, as not-there-for-long: a cut waiting for its paste,\n *  and a Trash entry a permanent delete is on its way for. */\nconst clippedPaths = computed<Set<string>>(() => {\n  const out = new Set<string>(clipboard.value.mode === 'cut' ? clipboard.value.items.map((n) => n.path) : []);\n  if (trashMode.value && trashPurging.value.size) {\n    for (const n of files.value) {\n      const id = (n as { id?: number }).id;\n      if (typeof id === 'number' && trashPurging.value.has(id)) out.add(n.path);\n    }\n  }\n  return out;\n});\n\n// --------------------------------------------------------------------\n// Item drag&drop move\n// --------------------------------------------------------------------\n\nconst FE_DND_MIME = 'application/x-brf-files';\n\n/**\n * pane:p1 — a drag started in one of the panes.\n *\n * `FilePane` has already written the payload both panes must agree on: the\n * internal MIME, the ORIGIN directory (which is what lets a cross-pane move be\n * undone) and the plain-text fallback. This is the part only the host knows —\n * the desktop shell's OS drag and the browser's own `DownloadURL` hand-off —\n * and wiring it for BOTH panes rather than only the left one is a capability\n * the right-hand pane gains simply by being the same pane.\n *\n * ⚠ `pane` decides two things and nothing else: whose selection is being\n * dragged, and which directory the drag says it came from. Everything below\n * that point is identical, which is the reason there is one function.\n */\n/**\n * pane:p1 — a row was clicked in one of the panes. Both panes reach the SAME\n * Ctrl/Shift semantics (`useSelection.click`), which is the point: the\n * right-hand pane used to keep a plain Set in which Shift behaved as Ctrl, so\n * a range-select worked on one side of the split and not the other.\n */\nfunction onPaneClickRow(\n  pane: 'main' | 'split',\n  n: FileNode,\n  mod: { ctrl: boolean; shift: boolean },\n) {\n  (pane === 'split' ? splitSelection : selection).click(n.path, mod);\n}\n\nfunction onPaneItemDragStart(pane: 'main' | 'split', node: FileNode, ev: DragEvent) {\n  if (!ev.dataTransfer) return;\n  if (node.basename === '.trash') {\n    ev.preventDefault();\n    return;\n  }\n  const sel = pane === 'split' ? splitSelection.nodes.value : selection.nodes.value;\n  const dirWire =\n    pane === 'split' ? qualify(splitPaneRef.value?.getPath() ?? '') : qualify(currentPath.value);\n  const chosen = sel.some((n) => n.path === node.path) ? sel : [node];\n  const items = chosen\n    .filter((n) => !clippedPaths.value.has(n.path))\n    .filter((n) => n.basename !== '.trash')\n    .map((n) => ({ path: n.path, basename: n.basename, type: n.type })); // qualified\n  if (items.length === 0) return;\n\n  handDragOut(ev, items, dirWire, node.mime_type);\n}\n\n/**\n * Hand a drag to whatever can carry it out of this window.\n *\n * #47 — ONE function for a listing row and a ⌘K search hit, so a hit drags\n * out exactly the way the same file's row does. `origin` is the folder the\n * rows came from: set, the drag is ALSO an internal one (dropped on a folder\n * inside filex it is a move); null, it only goes out (a palette hit — the\n * palette covers the listing, so there is nowhere inside to drop it).\n */\nfunction handDragOut(ev: DragEvent, items: DragItem[], origin: string | null, mime?: string): void {\n  /* wiring:f1 — drag-out (to the desktop / another application).\n     When a shell is present the drag is ALWAYS an OS drag: folders and\n     multi-selections land as REAL files, one by one, with NO SIZE LIMIT.\n     If the bytes are ready, real files are handed over; if not, the shell\n     hands over an empty \"placeholder\", finds out where it was dropped and\n     downloads THERE (see desktop/src/dropwatch.ts). If the drop lands INSIDE\n     the app the drag is still a server-side move — the payload stays with us —\n     and the shell is told to \"give up\" so it doesn't watch the drives for\n     nothing. */\n  /* wiring:e2 — a row inside an encrypted folder is never handed to the OS\n     as a file: the bytes behind its URL are ciphertext, and the OS would\n     save them under the plaintext name as if they were the document. The\n     in-app move still works (the payload is ours). */\n  if (e2eActive.value || items.some((it) => !!(it as { e2e_root?: string }).e2e_root)) return;\n  if (dragOut.value) {\n    ev.preventDefault();\n    if (origin !== null) beginNativeDrag(items, origin);\n    void Promise.resolve(dragOut.value.start(items)).catch((err) => {\n      endNativeDrag();\n      cancelShellDrag();\n      emit('error', { message: (err as Error).message, context: { op: 'drag-out' } });\n    });\n    void prepareDragOut(items);\n    return;\n  }\n\n  /* Single file, no shell: the browser's own download path (DownloadURL)\n     fetches the file onto the desktop at drop time. Which URL depends on the\n     credential. A cookie session hands over the plain download URL — the\n     cookie travels with it, and it rides whatever route the embed already\n     proxies. A bearer session (the admin SPA) cannot: the download stack\n     sends no Authorization header, so it hands over the short-lived link\n     minted while the pointer rested on the row (#71). None ready yet — the\n     drag simply carries no download; it never waits (see lib/dragOut). */\n  if (items.length === 1 && items[0] && ev.dataTransfer) {\n    const one = items[0];\n    const url = canDownloadUrlDrag(props.config.auth) ? api.downloadUrl(one.path) : dragLinks.take(one.path);\n    const payload = url ? downloadUrlPayload(one, url, mime) : null;\n    if (payload) ev.dataTransfer.setData('DownloadURL', payload);\n  }\n}\n\n/* === #71 — a drag-out link for a session the browser cannot sign ========\n *\n * `dragstart` fills the dataTransfer synchronously, and the link is a server\n * round trip, so it is asked for BEFORE the drag: when the pointer comes to\n * rest on a file row and again on the press (lib/dragOut createDragLinks has\n * the rules). One delegated listener pair on the root, the way the middle-\n * click delegation below reads `[data-fe-path]` — every view (list, grid,\n * gallery) and both panes, with nothing added to any of them; the palette's\n * hits say so themselves (`warm-hit`), because they are not listing rows.\n *\n * Only where it is needed: no shell (the desktop app drags through the OS)\n * and a credential the browser cannot carry (a cookie session has the plain\n * URL). Nowhere else does a hover cost a request.\n */\nconst dragLinksSupported = ref(true);\nconst dragLinks = createDragLinks((p) => requestFileLink(api, p), {\n  onUnsupported: () => {\n    dragLinksSupported.value = false;\n  },\n});\nconst dragNeedsLink = computed(() => !dragOut.value && !canDownloadUrlDrag(props.config.auth));\n\nfunction warmDragLink(path: string | null | undefined) {\n  if (!path || !dragNeedsLink.value || trashActive.value) return;\n  dragLinks.warm(path);\n}\n\nfunction onRowPointerWarm(ev: PointerEvent) {\n  if (ev.pointerType === 'touch' || !dragNeedsLink.value) return;\n  const host = ev.target as Element | null;\n  const el = host && typeof host.closest === 'function' ? host.closest('[data-fe-path]') : null;\n  const p = el?.getAttribute('data-fe-path');\n  if (!p) return;\n  const node = files.value.find((f) => f.path === p) ?? splitDisplayOrder.value.find((f) => f.path === p);\n  if (node && node.type === 'file' && node.basename !== '.trash') warmDragLink(node.path);\n}\nonMounted(() => {\n  rootEl.value?.addEventListener('pointerover', onRowPointerWarm, { passive: true });\n  rootEl.value?.addEventListener('pointerdown', onRowPointerWarm, { capture: true, passive: true });\n});\nonBeforeUnmount(() => {\n  rootEl.value?.removeEventListener('pointerover', onRowPointerWarm);\n  rootEl.value?.removeEventListener('pointerdown', onRowPointerWarm, { capture: true });\n});\n\n/* === wiring:f1 — drag-out preparation ===\n *\n * The bytes have to be on disk BEFORE the drag starts (the OS copies from the\n * path at drop time), so preparation is a separate step. When it finishes the\n * user is told \"ready\"; the second drag is now an OS drag and starts\n * instantly. For files kept on this computer (synced) preparation finishes\n * instantly on the first go too — the copy is already local.\n */\nconst dragOut = computed(() => props.config.dragOut ?? null);\nconst dragOutReadyKey = ref('');\nconst dragOutBusy = ref(false);\n/** True while a preparation nobody asked for is running. */\nlet dragOutQuiet = false;\n\n/* Small selections are prepared the moment they are SELECTED, because once\n   preparation is done the next drag is an OS drag: picking a document and\n   dragging it to the desktop therefore works on the FIRST try. The ceiling is\n   deliberately low — someone click-browsing shouldn't download a movie on\n   every row; anything above the limit is prepared on the first drag and the\n   second drag starts instantly. */\nconst DRAGOUT_PREFETCH_MAX_BYTES = 8 * 1024 * 1024;\nconst DRAGOUT_PREFETCH_MAX_ITEMS = 10;\nlet dragOutPrefetchTimer: ReturnType<typeof setTimeout> | undefined;\n\nwatch(\n  () => selection.selected.value,\n  () => {\n    if (!dragOut.value) return;\n    clearTimeout(dragOutPrefetchTimer);\n    const nodes = selection.nodes.value;\n    if (nodes.length === 0 || nodes.length > DRAGOUT_PREFETCH_MAX_ITEMS) return;\n    // A folder's size isn't known from the listing; rather than guess it, we\n    // leave it to the first drag.\n    if (nodes.some((n) => n.type !== 'file')) return;\n    // wiring:e2 vault — nothing in a vault is handed to the shell by path.\n    if (nodes.some((n) => vault.isVaultRow(n))) return;\n    const total = nodes.reduce((sum, n) => sum + (n.size ?? 0), 0);\n    if (total > DRAGOUT_PREFETCH_MAX_BYTES) return;\n    const items = nodes.map((n) => ({ path: n.path, basename: n.basename, type: n.type }));\n    dragOutPrefetchTimer = setTimeout(() => void prepareDragOut(items, true), 400);\n  },\n  { deep: true },\n);\n\nasync function prepareDragOut(items: DragItem[], quiet = false): Promise<void> {\n  const hook = dragOut.value;\n  if (!hook || dragOutBusy.value) return;\n  const key = dragKey(items);\n  if (key === dragOutReadyKey.value) return;\n  dragOutBusy.value = true;\n  dragOutQuiet = quiet;\n  try {\n    const res = await hook.prepare(items);\n    if (res?.ready) {\n      dragOutReadyKey.value = key;\n      // The quiet round is triggered by a selection; the user ASKED for\n      // nothing, so there's nothing to tell them either. A round that starts\n      // from an actual drag does speak up.\n      if (!quiet) flashToast(t('dragout.ready'));\n    } else if (res?.error && !quiet) {\n      flashToast(res.error);\n    }\n  } catch (err) {\n    emit('error', { message: (err as Error).message, context: { op: 'drag-out-prepare' } });\n  } finally {\n    dragOutBusy.value = false;\n    dragOutQuiet = false;\n  }\n}\n\n/** Moves `sources` into `targetDir`: `queued` (a job of the queue), `done`\n *  (inside the request, without the async endpoint — its Undo toast is up) or\n *  `refused` — the refusal is already said (reportMutationError). */\nasync function moveSourcesAsync(\n  sources: string[],\n  targetDir: string,\n  opLabel: string,\n  originOverride?: string,\n): Promise<'queued' | 'done' | 'refused'> {\n  try {\n    const originWire = originOverride ?? qualify(currentPath.value); /* wiring:d1 — the real source folder for a drag coming from the split pane */\n    /* wiring:e2 names — see e2eTransferNamed. */\n    const named = await e2eTransferNamed('move', sources, targetDir, originWire);\n    if (named) {\n      if (named.undo && named.ops.length) {\n        opUndo.set(named.ops[named.ops.length - 1].id, { message: t('toast.moved'), fn: named.undo });\n      }\n      if (named.ops.length) flashToast(t('split.move_queued'));\n      selection.clear();\n      return 'queued';\n    }\n    const collides = await movedNamesCollide(sources, targetDir);\n    if (api.endpoints.moveAsync) {\n      const { op } = await api.moveAsync(sources, targetDir, originWire);\n      registerMoveUndo(op.id, sources, targetDir, originWire, collides);\n      pendingOps.register(op);\n      flashToast(collides ? t('toast.move_kept_both') : t('split.move_queued'));\n    } else {\n      await api.move(originWire, sources, targetDir);\n      await load();\n      if (collides) {\n        flashToast(t('toast.move_kept_both'));\n      } else {\n        // Sync move (no async endpoint): offer the reverse move right away.\n        const movedPaths = sources.map((p) => wireJoin(targetDir, wireBasename(p)));\n        undoToast(t('toast.moved'), async () => {\n          await api.move(targetDir, movedPaths, originWire);\n        });\n      }\n    }\n    selection.clear();\n    return api.endpoints.moveAsync ? 'queued' : 'done';\n  } catch (err) {\n    reportMutationError(err, { op: opLabel, targetDir });\n    return 'refused';\n  }\n}\n\nasync function onItemDropInto(target: FileNode, ev: DragEvent) {\n  if (target.type !== 'dir') return;\n  const items = internalDragItems(ev);\n  if (!items || items.length === 0) return;\n  endNativeDrag();\n  cancelShellDrag();\n\n  const targetDir = target.path; // qualified\n  const sources = items\n    .map((i) => i.path)\n    // ui-fix — skip items already inside targetDir (parent===target): an\n    // in-place drop is a no-op and must not trigger the backend's \"copy onto\n    // itself\" 400.\n    .filter((p) => p && p !== targetDir && !targetDir.startsWith(p + '/') && !sameDir(wireParent(p), targetDir));\n  if (sources.length === 0) return; // silent no-op (in-place drop)\n  await transferItems(sources, targetDir, dndOrigin(ev)); /* wiring:d1 — storage-aware transfer */\n}\n\nasync function onCrumbDropInto(adapterPath: string, ev: DragEvent) {\n  const items = internalDragItems(ev);\n  if (!items || items.length === 0) return;\n  endNativeDrag();\n  cancelShellDrag();\n\n  const targetDir = adapterPath; // already qualified by breadcrumb\n  const sources = items\n    .map((i) => i.path)\n    // ui-fix — an in-place drop onto the breadcrumb (the same folder) is a no-op.\n    .filter((p) => p && p !== targetDir && !targetDir.startsWith(p + '/') && !sameDir(wireParent(p), targetDir));\n  if (sources.length === 0) return;\n  await transferItems(sources, targetDir, dndOrigin(ev)); /* wiring:d1 — storage-aware transfer */\n}\n\nfunction onCancelUpload(job: UploadJob) {\n  job.cancel();\n}\n\nfunction onDismissUpload(job: UploadJob) {\n  uploadJobs.value = uploadJobs.value.filter((j) => j.id !== job.id);\n}\n\n// ------- Breadcrumb -------\n\nfunction onNavigate(adapterPath: string) {\n  // Multi-storage emits empty string for the global \"/\" crumb. The\n  // load() function recognises that as the storage-list virtual root.\n  if (multiStorageRoot.value && !adapterPath) {\n    void load('');\n    return;\n  }\n  if (multiStorageRoot.value) {\n    void load(wireToVirtual(adapterPath));\n    return;\n  }\n  void load(stripAdapter(adapterPath));\n}\n\nasync function onCopyPath(adapterPath: string) {\n  try {\n    await navigator.clipboard.writeText(adapterPath);\n    flashToast(t('breadcrumb.copy_path'));\n  } catch {\n    /* no-op */\n  }\n}\n\n// Auth-headers builder handed to PreviewModal, QuickLook and every viewer.\n//\n// ⚠⚠ ASYNC on purpose. This used to call `authHeadersSync`, which drops the\n// bearer entirely when the embedder supplies a token FUNCTION rather than a\n// string — the shape the desktop app uses so the credential is fetched per\n// call instead of sitting in the page. The result was an Authorization-less\n// request and a 401 on the OnlyOffice config endpoint, the starred list, the\n// recently-opened POST and every viewer that fetches its own bytes. Consumers\n// must `await` this; the guard test in web/tests/api/authHeaders.test.ts fails\n// the build if one forgets.\nfunction buildAuthHeaders(extra: Record<string, string> = {}) {\n  return api.authHeaders({ ...extra });\n}\n\n/** The standalone viewer/editor route the backend serves next to the API. */\nconst STANDALONE_ROUTE = '/files/edit';\n\n/**\n * Makes a page route absolute against the API host.\n *\n * ⚠ A root-relative route like `/files/edit` is resolved by the browser\n * against the PAGE, not the API — which is right when the explorer is embedded\n * in the same app that serves the route, and wrong for every embed served from\n * a different origin. In the desktop app the page origin is `app://filex`, so\n * \"Open in new tab\" asked the OS to open `app://filex/files/edit?…`: no handler\n * for that scheme exists, so the click did nothing at all, silently. Measured\n * 2026-08-10.\n */\nfunction absolutePageUrl(base: string): string {\n  if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(base)) return base; // already absolute\n  const api = props.config.apiBase;\n  if (!api) return base; // same-origin embed — the browser resolves it correctly\n  try {\n    return new URL(base, api.endsWith('/') ? api : `${api}/`).toString();\n  } catch {\n    return base;\n  }\n}\n\n/**\n * Where the modal's \"Open in new tab\" / \"Edit\" buttons should land.\n *\n * ⚠ The DEFAULT route is relative to the server root, so it goes under the API\n * base with the base's path kept (lib/appBase `underApiBase`): the desktop app\n * pointed at `https://example.com/filex` and the admin app under a sub-path\n * (`apiBase: '/filex'`) both used to open `/files/edit` on the host's root.\n * A route the host configured is an address on the host's own terms and keeps\n * the rule above.\n */\nconst effectiveViewerBaseUrl = computed(() =>\n  props.config.viewerBaseUrl\n    ? absolutePageUrl(props.config.viewerBaseUrl)\n    : underApiBase(props.config.apiBase, STANDALONE_ROUTE),\n);\n\n/* === wiring:c1 — tema galerisi ===\n * Selected theme (shared module state, localStorage `filex.theme`) is applied\n * as inline `--fe-*` variables on the explorer root, resolved to the active\n * light/dark variant — plus a mirrored injected stylesheet for the surfaces\n * that re-declare tokens (teleported context menu, modal backdrops). Theme\n * selection is independent from the light/dark mode: the mode only picks\n * WHICH variant of the theme paints. */\nconst showThemeGallery = ref(false);\nconst { themeId: activeThemeId, setTheme: setActiveTheme } = useThemeState();\n// The light/dark MODE the person looking at it picked in the gallery. 'host'\n// (the default) defers to whatever the embedder passed, so no existing embed\n// changes appearance until someone actually chooses.\n//\n// ⚠ Everything that used to read `config.theme` reads `themeMode` instead — a\n// choice that only reached the token resolution would leave the root class, the\n// modals and the teleported menus painting the OLD mode, which is exactly the\n// half-dark UI that bug looks like.\nconst { themeMode: themeModePref, setThemeMode: setThemeModePref } = useThemeModeState();\nconst themeMode = computed<ThemeMode>(() =>\n  themeModePref.value === 'host' ? props.config.theme || 'auto' : themeModePref.value,\n);\n/* tablo:t3 — every table under the explorer (its own listing, the connection\n * panels, an archive's or a spreadsheet's preview, an app's list) is the one\n * DataTable, and its column menu and Actions menu teleport to <body>: they\n * learn the language and the mode here, once, instead of from a prop each\n * surface would have to remember to pass (lib/tableEnv). */\nprovideTableEnv({ locale, theme: themeMode });\n// Resolved mode: an explicit choice wins, otherwise the OS preference — the\n// same logic variables.css encodes in CSS. The inline root variables beat every\n// stylesheet rule, so they must track this resolution at runtime.\nconst themeOsDark = useSystemDark();\nconst themeResolvedDark = computed(\n  () => themeMode.value === 'dark' || (themeMode.value !== 'light' && themeOsDark.value),\n);\nwatch(\n  [activeThemeId, themeResolvedDark, rootEl],\n  () => {\n    syncThemeStyle(activeThemeId.value);\n    if (rootEl.value) applyThemeToEl(rootEl.value, activeThemeId.value, themeResolvedDark.value);\n  },\n  { immediate: true },\n);\n/* === /wiring:c1 === */\n/* === wiring:c2 — shortcut settings modal + Space quick-look ===\n * quickLookTarget follows the selection while the peek is open: arrow\n * keys emitted by QuickLook move the selection here, and the watcher\n * below syncs the previewed file. Space toggles (registry action\n * `quicklook`); Enter promotes the peek into the normal open flow. */\nconst showShortcutSettings = ref(false);\nconst quickLookOpen = ref(false);\nconst quickLookTarget = ref<FileNode | null>(null);\n\nfunction quickLookToggle() {\n  if (quickLookOpen.value) {\n    quickLookOpen.value = false;\n    return;\n  }\n  const sel = selection.nodes.value;\n  const n = sel.length === 1 ? sel[0] : null;\n  if (!n || n.type !== 'file' || n.basename === '.trash') return;\n  /* wiring:e2 fxe — a peek at a single encrypted file asks for its password. */\n  if (isFxeRow(n) && !e2eActive.value && !n.e2e_root) {\n    void e2eFiles.open(n);\n    return;\n  }\n  /* wiring:e2 — in an encrypted folder the Space peek decrypts first, then opens */\n  if (e2eActive.value) {\n    if (!e2eUnlocked.value) return;\n    void (async () => {\n      try {\n        await e2eFetchDecrypted(n);\n      } catch {\n        flashToast(t('e2e.decrypt_failed'));\n        return;\n      }\n      quickLookTarget.value = n;\n      quickLookOpen.value = true;\n      void markRecent(n);\n    })();\n    return;\n  }\n  /* /wiring:e2 */\n  quickLookTarget.value = n;\n  quickLookOpen.value = true;\n  void markRecent(n);\n}\n\nfunction quickLookNav(delta: number) {\n  const onlyFiles = files.value.filter((f) => f.type === 'file');\n  if (onlyFiles.length === 0) return;\n  const cur = quickLookTarget.value;\n  let idx = cur ? onlyFiles.findIndex((f) => f.path === cur.path) : -1;\n  idx = idx === -1 ? (delta > 0 ? 0 : onlyFiles.length - 1) : (idx + delta + onlyFiles.length) % onlyFiles.length;\n  const next = onlyFiles[idx];\n  if (!next || next.path === cur?.path) return;\n  selection.click(next.path);\n}\n\nfunction quickLookOpenFull() {\n  const n = quickLookTarget.value;\n  quickLookOpen.value = false;\n  if (n) openNode(n);\n}\n\nwatch(\n  () => selection.nodes.value,\n  (nodes) => {\n    if (!quickLookOpen.value) return;\n    const n = nodes.length === 1 && nodes[0].type === 'file' ? nodes[0] : null;\n    /* wiring:e2 — when arrowing through files, decrypt BEFORE assigning the\n       target as well, otherwise the viewer briefly gets the raw ciphertext URL. */\n    if (n && n.path !== quickLookTarget.value?.path && e2eUnlocked.value) {\n      void (async () => {\n        try {\n          await e2eFetchDecrypted(n);\n        } catch {\n          /* decryption failed — switch the target anyway, the viewer shows the error */\n        }\n        quickLookTarget.value = n;\n        void markRecent(n);\n      })();\n      return;\n    }\n    /* /wiring:e2 */\n    if (n && n.path !== quickLookTarget.value?.path) {\n      quickLookTarget.value = n;\n      void markRecent(n);\n    }\n  },\n);\n/* === /wiring:c2 === */\n/* wiring:c3 — operations center store + failed-upload retry */\nconst opsCenter = useOperations();\n\n/**\n * Retry a failed upload from the operations center. The failed row is already\n * retired by the store; re-run the upload against the job's ORIGINAL target\n * folder (the user may have navigated away since).\n *\n * ⚠ It goes back through the SAME decision a fresh upload makes, rather than\n * straight to the single-POST path as it used to. A retry is the moment resume\n * matters most: the staged session and its bookmark are still there, so this\n * continues from filex's offset instead of pushing the whole file again.\n */\nfunction retryUploadJob(job: UploadJob) {\n  uploadJobs.value = uploadJobs.value.filter((j) => j.id !== job.id);\n  const file = job.file;\n  const target = job.path || qualify(currentPath.value);\n  void (async () => {\n    if (chunked.shouldChunk(file)) {\n      if (await chunkedUpload(file, target)) {\n        await load();\n        return;\n      }\n    }\n    await legacyUpload(file, target);\n    await load();\n  })();\n}\n/* /wiring:c3 */\n/* === wiring:c4 — onboarding coach-mark tour ===\n * Offered to a PERSON once, never once per mount (lib/tour): the first mount\n * that finds neither this browser's flag nor the account's opens it a moment\n * later and records it right away, so a second tab, a remount or another\n * device does not open it again. \"Turu tekrar başlat\" re-opens it any time.\n * Restart arrives as a bubbled `fe:tour-restart` CustomEvent from the\n * Toolbar overflow menu, so no extra prop/emit threading through the\n * shared component tags is needed. */\nconst showTour = ref(false);\nlet cancelTourOffer: (() => void) | undefined;\n\nfunction startTour() {\n  showTour.value = true;\n}\n\nfunction onTourClose() {\n  showTour.value = false;\n  // Already recorded when it was offered; recorded again for a restart that\n  // somebody opened on a browser where it had never been offered.\n  markTourSeen();\n  rootEl.value?.focus();\n}\n\nfunction onTourRestartEvent() {\n  startTour();\n}\n\nonMounted(() => {\n  rootEl.value?.addEventListener('fe:tour-restart', onTourRestartEvent);\n  cancelTourOffer = offerTourOnce(() => {\n    if (!showTour.value) startTour();\n  });\n});\nonBeforeUnmount(() => {\n  cancelTourOffer?.();\n  rootEl.value?.removeEventListener('fe:tour-restart', onTourRestartEvent);\n});\n/* === /wiring:c4 === */\n\n/* === wiring:d1 — tabs (tab strip) + per-tab split ===\n *\n * useTabs is a layer ON TOP of the existing location state\n * (currentPath/viewMode): the active tab watches navigations and updates its\n * snapshot; switching tabs calls the existing load(path) path — no new fetch\n * logic. The strip is not rendered at all on a single tab (embeds stay\n * pixel-identical).\n *\n * Persist: `filex.tabs` — it follows the pathPersist scope logic: with mode\n * 'none' persistence is off; the rootPath confine is added to the key so that\n * embeds with different confines don't overwrite each other's tabs.\n */\nconst FE_DND_SRC_MIME = 'application/x-brf-files-src';\n\nconst TABS_LS_BASE = 'filex.tabs';\nfunction tabsStorageKey(): string | null {\n  if (persistMode() === 'none') return null;\n  return rootPathProp ? `${TABS_LS_BASE}:${rootPathProp}` : TABS_LS_BASE;\n}\nconst tabsApi = useTabs({ storageKey: tabsStorageKey() });\nconst tabsRestored = tabsApi.restore();\nconst tabsActiveId = tabsApi.activeId;\n\nconst activeSplit = computed(() => tabsApi.activeTab.value?.split ?? null);\n\n// Tab name is AUTOMATIC = the current folder name (root = storage name / root label).\nfunction tabLabel(path: string): string {\n  const p = (path || '').replace(/^\\/+|\\/+$/g, '');\n  // gezinti:g1 — the virtual views park a sentinel in the path. Translate via\n  // the SHARED map: this special-cased only '.trash' when recent/starred/shared\n  // arrived, so the strip read \".shared\" at users (reported 2026-09-04).\n  const virtualLabel = virtualSegmentLabel(p.split('/').pop() || p, t);\n  if (virtualLabel) return virtualLabel;\n  if (!p) return multiStorageRoot.value ? t('breadcrumb.root') : adapter.value || t('breadcrumb.root');\n  /* wiring:e2 names — a tab open inside an encrypted folder is named by the\n     plaintext (or the locked placeholder), never by the ciphertext. */\n  const e2eLabel = e2eNames.segmentLabel(qualify(p));\n  if (e2eLabel !== null) return e2eLabel;\n  return p.split('/').pop() || p;\n}\nconst tabItems = computed(() =>\n  tabsApi.tabs.value.map((tb) => ({ id: tb.id, label: tabLabel(tb.path), split: !!tb.split })),\n);\n\n// The strip is visible by DEFAULT, on every surface (see ExplorerConfig — the\n// default used to differ between the desktop app and the web, which is the one\n// thing a shared package must never do). `tabStrip: 'auto'` is the opt-out.\n// ⚠ Gated on there being a tab at all, not on the flag alone: tabs are seeded\n// in onMounted, so the strip would otherwise paint one frame empty — a lone\n// `+` floating above the toolbar.\nconst tabsVisible = computed(\n  () =>\n    /* gezinti:g1 — the simple profile has no tab strip at all, not even once a\n       second tab exists: tabs were the first thing #14 named as power-user\n       chrome. The tab STATE is untouched, so switching the profile back brings\n       the strip and its tabs straight back. */\n    !simpleUi.value &&\n    (tabsApi.hasMultiple.value ||\n      (props.config.tabStrip !== 'auto' && tabItems.value.length > 0)),\n);\n\n// The active tab follows the user: navigation + view changes go into the snapshot.\nwatch(currentPath, (p) => tabsApi.syncActive({ path: p }));\nwatch(viewMode, (v) => tabsApi.syncActive({ viewMode: v }));\n\n// The first tab is seeded as soon as the first location is known (don't touch\n// it if a restore happened — the active snapshot is already synced by the\n// currentPath watcher after the first load).\nonMounted(() => {\n  if (!tabsRestored) tabsApi.seed(currentPath.value ?? '', viewMode.value);\n});\n\nfunction applyTabLocation(tb: TabState) {\n  /* tablo:t1 — the tab's own remembered view mode is applied only while\n   * per-folder memory is OFF.\n   *\n   * ⚠⚠ Two things remembering the same fact is two things that disagree, and\n   * this pair disagreed in a way nothing would have caught: open one folder in\n   * two tabs, set it to grid in the first, switch to the second, and the second\n   * restores the LIST it happened to be showing — for the same folder, whose\n   * remembered view is grid. Measured, 2026-09-13. The applier below could not\n   * correct it either, because it fires on a change of FOLDER and the folder\n   * did not change; only the tab did.\n   *\n   * With the memory on, the folder is the authority and a tab is just a window\n   * onto one, so the tab's copy is redundant and is ignored. With it off,\n   * nothing here changes at all and tabs keep exactly the behaviour they had.\n   */\n  if (!folderMemoryOn.value && tb.viewMode && tb.viewMode !== viewMode.value) {\n    viewMode.value = tb.viewMode;\n  }\n  /* ⚠ AFTER the load, not before. `load()` is async, so `currentPath` — and\n   * with it `currentFolderKey` — only moves once it settles; re-asserting here\n   * is also what covers the case above, where the key never changes and the\n   * watcher therefore never runs. */\n  const settle = () => applyFolderView(currentFolderKey.value);\n  if (tb.path === '.trash') {\n    void loadTrash().then(settle, settle);\n    return;\n  }\n  void load(tb.path).then(settle, settle);\n}\nfunction activateTab(id: string) {\n  const tb = tabsApi.activate(id);\n  if (tb) applyTabLocation(tb);\n}\nfunction newTabHere() {\n  // Clones the current location; the view is already there, so no load needed.\n  tabsApi.openTab(currentPath.value ?? '', { viewMode: viewMode.value, background: false });\n}\nfunction closeTabById(id: string) {\n  const next = tabsApi.closeTab(id);\n  if (next) applyTabLocation(next);\n}\nfunction nextTab() {\n  const tb = tabsApi.step(1);\n  if (tb) applyTabLocation(tb);\n}\nfunction prevTab() {\n  const tb = tabsApi.step(-1);\n  if (tb) applyTabLocation(tb);\n}\n\n/** Open a folder in a new tab IN THE BACKGROUND (middle-click / right-click / palette). */\nfunction openNodeInTab(n: FileNode) {\n  if (n.type !== 'dir' || n.basename === '.trash') return;\n  const target = multiStorageRoot.value ? wireToVirtual(n.path) : stripAdapter(n.path);\n  tabsApi.openTab(target, { viewMode: viewMode.value, background: true });\n}\n\n// Middle-click delegation: ListView/GridView rows carry data-fe-path, so a\n// single auxclick listener at the root is enough instead of adding a\n// keydown/emit chain of our own. (SecondaryPane handles its own rows via\n// stopPropagation.)\nfunction onListAuxClick(ev: MouseEvent) {\n  if (ev.button !== 1) return;\n  const host = ev.target as HTMLElement | null;\n  const el = host && typeof host.closest === 'function' ? host.closest('[data-fe-path]') : null;\n  const p = el?.getAttribute('data-fe-path');\n  if (!p) return;\n  const node = files.value.find((f) => f.path === p);\n  if (!node || node.type !== 'dir' || node.basename === '.trash') return;\n  ev.preventDefault();\n  openNodeInTab(node);\n}\n// Cancel the middle-button mousedown over rows: in a scrollable body Chromium's\n// autoscroll kicks in and auxclick is NEVER produced (diagnosed live) —\n// preventDefault suppresses autoscroll and auxclick flows again.\nfunction onListMiddleDown(ev: MouseEvent) {\n  if (ev.button !== 1) return;\n  const host = ev.target as HTMLElement | null;\n  if (host && typeof host.closest === 'function' && host.closest('[data-fe-path]')) {\n    ev.preventDefault();\n  }\n}\nonMounted(() => {\n  rootEl.value?.addEventListener('auxclick', onListAuxClick);\n  rootEl.value?.addEventListener('mousedown', onListMiddleDown);\n});\nonBeforeUnmount(() => {\n  rootEl.value?.removeEventListener('auxclick', onListAuxClick);\n  rootEl.value?.removeEventListener('mousedown', onListMiddleDown);\n});\n\n// ---- split (per-tab secondary pane) --------------------------------\n\nconst mainPaneRef = ref<InstanceType<typeof FilePane> | null>(null);\nconst splitPaneRef = ref<InstanceType<typeof FilePane> | null>(null);\n\n/* pane:p1 — the split pane's half of the state the HOST has to hold.\n *\n * ⚠⚠ Two instances of ONE composable, not two implementations. The explorer\n * routes cut/copy/paste, the context menu, the inspector, the toolbar's count\n * and every keyboard shortcut through \"the active pane's selection\", so it has\n * to hold both — but `useSelection` is written once and this is the second\n * call to it, exactly as `lib/fileFilters` is written once and this is the\n * second filter object. What used to be here instead was a SECOND selection\n * model living inside `SecondaryPane`, in which Shift behaved as Ctrl because\n * it kept a plain Set with no range anchor. */\nconst splitDisplayOrder = ref<FileNode[]>([]);\nconst splitSelection = useSelection(() =>\n  splitDisplayOrder.value.length ? splitDisplayOrder.value : (splitPaneRef.value?.visibleNodes() ?? []),\n);\nconst splitFilters = ref<DriveFilters>({ ...EMPTY_FILTERS });\n\n/** The split pane's folder, in the key `lib/viewPrefs` remembers folders under\n *  — so the column menu's two per-folder rows tell the truth on the right as\n *  well as on the left.\n *\n * ⚠⚠ READ-ONLY on this side, and that is a decision. The memory answers \"how\n * did I leave this folder\", and a folder is left in ONE state; two panes both\n * writing it would be the stale-snapshot race that already bit the tab strip\n * once today, with a second racer. So: BOTH panes read a folder's arrangement\n * when they arrive in it (the split pane's sort store is seeded from the\n * global default and this key is what its column menu operates on), and only\n * the main pane — the one the window's tab is about, the one whose view mode\n * the tab records — writes it back. Nothing re-applies memory to a pane that\n * is sitting still, so a choice made in one pane can never yank the other\n * pane's view out from under it. */\nconst splitFolderKey = computed(() => {\n  if (!folderMemoryOn.value) return '';\n  const path = String(splitPaneRef.value?.getPath() ?? '').replace(/^\\/+|\\/+$/g, '');\n  if (!path) return '';\n  const [first, ...rest] = path.split('/');\n  const st = (props.config.storages ?? []).find((sto) => sto.name === first);\n  return makeFolderKey(st?.uid || first, rest.join('/'));\n});\n\n/* pane:p1 — the row above BOTH panes. It survives the tabs being switched off\n * (the `simple` profile) because the split and details toggles live in it too;\n * `hideTabs` empties it without removing it. */\nconst paneRowVisible = computed(\n  () => tabsVisible.value || infoPanelToggle.value || splitOffered.value,\n);\n\n/**\n * pane:p1 — the states the WINDOW draws INSTEAD of a listing.\n *\n * Home, a dead deep link and the encrypted lock screen are not things that can\n * happen to a pane — they are things that have happened to the explorer — so\n * they arrive in `FilePane`'s `body` slot and this says which. Everything else\n * in the old chain (the skeleton, the failed listing, the filtered-empty\n * state, the listing itself) IS pane state and now lives in the pane, once,\n * for both halves.\n *\n * ⚠ The two `return ''`s are load-bearing: they hand the turn back to the\n * pane's own skeleton and error states in exactly the order the chain had, so\n * a folder that is still loading does not flash its lock screen and a failed\n * listing still gets the retry state rather than \"not found\".\n */\nconst hostBodyState = computed<'' | 'home' | 'drafts' | 'notfound' | 'locked'>(() => {\n  if (navView.value === 'home') return 'home';\n  if (navView.value === 'drafts') return 'drafts';\n  if (loading.value && files.value.length === 0) return '';\n  if (notFoundPath.value) return 'notfound';\n  if (loadError.value && files.value.length === 0) return '';\n  if (e2eLocked.value) return 'locked';\n  return '';\n});\n/**\n * Can a second pane be OPENED here at all?\n *\n * ⚠⚠ One answer for every door to the split, and it is not `!isNarrow`. The\n * tab strip's toggle and the command palette's row were both handed\n * `!isNarrow` and nothing else, while the pane below was gated on the\n * `simple` profile as well — so under `ui-profile=\"simple\"` the button was\n * drawn, a click recorded a split on the tab and turned the button PRESSED,\n * and no pane ever appeared (measured 2026-09-14 at 1440: one pane before the\n * click, one after, `aria-pressed=\"true\"`). A control that lies about its own\n * state is worse than a missing one. The state it wrote is kept, so switching\n * the profile back would suddenly split a tab nobody remembers splitting —\n * which is why `toggleSplit` refuses to open one here too, not only the\n * button.\n *\n * Narrow mode keeps the state and brings it back on widen; the simple profile\n * offers no split at all (`lib/uiProfile`).\n */\nconst splitOffered = computed(() => !isNarrow.value && !simpleUi.value);\nconst splitVisible = computed(() => !!activeSplit.value && splitOffered.value /* gezinti:g1 */);\n\nfunction toggleSplit() {\n  if (activeSplit.value) {\n    tabsApi.setSplit(null);\n    activePane.value = 'main';\n    return;\n  }\n  if (!splitOffered.value) return;\n  tabsApi.setSplit({ path: currentPath.value ?? '', viewMode: viewMode.value });\n}\nfunction closeSplit() {\n  tabsApi.setSplit(null);\n  activePane.value = 'main';\n}\nfunction onPaneNavigate(p: string) {\n  tabsApi.setSplit({ ...(activeSplit.value ?? {}), path: p });\n  /* A navigation is a new folder: the chips the person set for the folder they\n     just left must not silently keep narrowing the one they arrived in. Same\n     rule the main pane's own watcher applies. */\n  if (filtersActive(splitFilters.value)) splitFilters.value = { ...EMPTY_FILTERS };\n  splitSelection.clear();\n  splitDisplayOrder.value = [];\n}\n\n/**\n * pane:p1 — a row was opened (double-click, Enter) in one of the panes.\n *\n * A FOLDER opens in the pane it was opened from — that is the whole point of a\n * second pane. Everything else is the window's business (the preview modal,\n * the encrypted-blob path, `markRecent`) and goes to the one `openNode` both\n * panes have always been entitled to. The right-hand pane used to have no path\n * to it at all, so double-clicking a file there did nothing.\n */\nfunction onPaneOpen(pane: 'main' | 'split', n: FileNode) {\n  if (pane === 'split' && n.type === 'dir' && n.basename !== '.trash') {\n    void splitPaneRef.value?.loadFolder(\n      /* A multi-storage drive row's path is already the wire form for that\n         storage's root; a real row needs converting. The predicate comes from\n         `lib/fileIcons`, which is that concept's one home. */\n      iconFamilyFor(n) === 'storage' ? n.path : paneToUser(n.path),\n    );\n    return;\n  }\n  openNode(n);\n}\n\n/* ui-fix — when the trash row is opened from the side pane: the trash view\n * (with its restore actions) belongs to the main pane → activate the main\n * pane and open it there. */\nfunction onPaneOpenTrash() {\n  activePane.value = 'main';\n  void loadTrash();\n}\n/* ui-fix — the pane's OWN view mode: it inherits the main pane's when the\n * split opens, and is independent afterwards. The toolbar's view switcher and\n * the palette toggle write to the ACTIVE pane (Ada, translated from Turkish:\n * \"if I say change the icon while B is focused, B is the one that has to\n * change\"). */\nconst paneViewMode = computed<ViewMode>(() => activeSplit.value?.viewMode ?? viewMode.value);\nfunction setPaneViewMode(v: ViewMode) {\n  if (!activeSplit.value) return;\n  tabsApi.setSplit({ ...activeSplit.value, viewMode: v });\n}\nconst displayedViewMode = computed<ViewMode>(() =>\n  paneIsActive.value ? paneViewMode.value : viewMode.value,\n);\nfunction setDisplayedViewMode(v: ViewMode) {\n  if (paneIsActive.value) setPaneViewMode(v);\n  else viewMode.value = v;\n}\n\n// Active pane: shortcuts go to the active pane; a pane is activated by clicking it.\nconst activePane = ref<'main' | 'split'>('main');\nfunction setPaneMain() {\n  activePane.value = 'main';\n}\nwatch(splitVisible, (v) => {\n  if (!v) activePane.value = 'main';\n});\nconst paneIsActive = computed(() => activePane.value === 'split' && splitVisible.value);\nconst mainPaneFocus = computed(() => splitVisible.value && activePane.value === 'main');\n/** The `data-pane` of the half that owns `activeTargets()`. The selection bar\n *  is teleported into THAT pane, so this is what tells the toolbar where. */\nconst activePaneId = computed(() => (paneIsActive.value ? 'split' : 'main'));\n\n/* === koru:k1 + pane:p1 — THE DETAILS PANEL FOLLOWS THE FOCUSED PANE =======\n *\n * ⚠⚠ It did not, and the owner reported it, 2026-09-13: \"Yanda açılan info\n * panele sadece ana pane üzerinde tıklanmış ya da bulunduğumuz yerin infosu\n * geliyor. Onun dışında öteki pane'de tıkladığımız yerlerin infosu hiç\n * gelmiyor.\" The panel read `selection.nodes` — the MAIN pane's selection —\n * so clicking a row in the right-hand half changed the highlight, changed the\n * selection bar (which had just been taught this rule) and left the panel\n * describing something in the other half entirely.\n *\n * ⚠ The same source as the selection bar, deliberately: `activeTargets()`.\n * That function is already the one answer to \"what is selected right now\", and\n * the whole reason it exists is that the toolbar used to have a second one.\n * A third, here, would be the same bug a month later.\n *\n * ⚠ WITH NO SELECTION the panel describes the focused pane's FOLDER, which is\n * the behaviour it already had for the main pane and the only honest one: the\n * head then reads the place you are standing in. So clicking into the split\n * pane's empty background moves the panel to that pane's folder rather than\n * leaving it on the other half's — which is the complaint, one level up.\n */\n/**\n * ⚠⚠ IT HOLDS THE LAST SELECTED THING. Owner's ruling, 2026-09-13, asked and\n * answered: \"son seçilen şeyi tutsun.\"\n *\n * So moving the keyboard to a pane with nothing ticked does NOT empty the panel\n * and does NOT fall back to that pane's folder — it goes on describing whatever\n * was selected last, until something else is selected. That is the difference\n * between a panel you can read while you work in the other half and a panel\n * that blanks the moment you click away from what you were reading about.\n *\n * ⚠ The two consequences of holding, handled below rather than left implicit:\n *   1. the held item can live in the pane you are NOT looking at, so the panel\n *      is TOLD it is holding and where the item is (`heldIn`), and says so;\n *   2. a held item can stop existing — deleted, moved, or its pane closed — and\n *      a panel describing a file that is gone is worse than an empty one, so\n *      `heldValid` drops it the moment its own pane's listing no longer has it.\n */\nconst heldSelection = ref<{ nodes: FileNode[]; pane: 'main' | 'split'; path: string; inEncrypted: boolean } | null>(null);\n\n/** wiring:e2 - is a pane's folder an end-to-end encrypted one (or inside one)?\n *  The main pane's answer is the explorer's own e2eActive; the split pane\n *  reads the `e2e_root` of its own listing. */\nfunction paneInEncrypted(pane: 'main' | 'split'): boolean {\n  return pane === 'split' ? !!splitPaneRef.value?.e2eRoot() : e2eActive.value;\n}\n\n/** The focused pane's location, user-path form. */\nconst activePanePath = computed(() =>\n  paneIsActive.value ? (splitPaneRef.value?.getPath() ?? '') : (currentPath.value ?? ''),\n);\nfunction panePathOf(pane: 'main' | 'split'): string {\n  return pane === 'split' ? (splitPaneRef.value?.getPath() ?? '') : (currentPath.value ?? '');\n}\n/** The paths a pane's folder HOLDS — before the filter row narrows them. ⚠ The\n *  unfiltered set on both sides: \"is this row still there\" and \"is this row\n *  currently drawn\" are different questions, and answering the first with the\n *  second would make typing in the filter box drop the held item as if the file\n *  had been deleted. */\nfunction panePathsOf(pane: 'main' | 'split'): string[] {\n  return pane === 'split'\n    ? (splitPaneRef.value?.rowPaths() ?? [])\n    : files.value.map((n) => n.path);\n}\n\n/* Capture: any non-empty selection, in either pane, becomes the held one. */\nwatch(\n  () => activeTargets(),\n  (nodes) => {\n    if (nodes.length) {\n      heldSelection.value = {\n        nodes,\n        pane: activePaneId.value as 'main' | 'split',\n        path: activePanePath.value,\n        // Where the item was when it was selected: a held item keeps the\n        // folder it came from, whatever folder the pane shows now.\n        inEncrypted: paneInEncrypted(activePaneId.value as 'main' | 'split'),\n      };\n    }\n  },\n  { deep: false },\n);\n\n/**\n * Is the held item still a real thing?\n *\n * ⚠ Only checked while its own pane is still showing the folder it was held\n * from. Walking away from a folder is not a deletion — \"last selected\" has to\n * survive a navigation or it is not a hold at all — but standing in the same\n * folder with the row gone IS one, and that is the case that must not be\n * described. A closed split pane takes its held item with it.\n */\nconst heldValid = computed<boolean>(() => {\n  const h = heldSelection.value;\n  if (!h || !h.nodes.length) return false;\n  if (h.pane === 'split' && !splitVisible.value) return false;\n  if (panePathOf(h.pane) !== h.path) return true; // navigated away — still held\n  const here = new Set(panePathsOf(h.pane));\n  return h.nodes.some((n) => here.has(n.path));\n});\nwatch(heldValid, (ok) => {\n  if (!ok) heldSelection.value = null;\n});\n\n/** True while the panel is describing the HELD item rather than a live\n *  selection — i.e. the focused pane has nothing ticked. */\nconst inspectorHeld = computed(() => activeTargets().length === 0 && heldValid.value);\nconst inspectorNodes = computed<FileNode[]>(() => {\n  const live = activeTargets();\n  if (live.length) return live;\n  return heldValid.value ? (heldSelection.value?.nodes ?? []) : [];\n});\n/** The sharing kinds held on the panel's one item — its \"Create link\" is a\n *  door that makes links like any other (lib/sharingHeld). */\nconst inspectorSharing = computed<SharingHeld | undefined>(() => {\n  const nodes = inspectorNodes.value;\n  return nodes.length === 1 && heldPermissions.value ? sharingAt([nodes[0].path]) : undefined;\n});\n/** wiring:e2 - is the panel's item inside an end-to-end encrypted folder? Its\n *  \"Create link\" asks the rule the Share row asks (lib/e2eLinks\n *  publicLinksOff): a live selection by its pane's folder, a held one by the\n *  folder it was selected in. */\nconst inspectorInEncrypted = computed(() =>\n  activeTargets().length\n    ? paneInEncrypted(activePaneId.value as 'main' | 'split')\n    : heldValid.value && heldSelection.value?.inEncrypted === true,\n);\n/** Where the held item lives — named, so \"this is not what is selected in front\n *  of you\" is never a guess. Empty while a live selection is shown. */\nconst inspectorHeldIn = computed(() =>\n  inspectorHeld.value ? folderLabelOf(heldSelection.value?.path ?? '') : '',\n);\n\n/** Folder summary label for the truly-empty state — of the FOCUSED pane. */\nconst inspectorDirLabel = computed(() => folderLabelOf(activePanePath.value));\n/** How many rows that folder holds. `files` IS the main pane's row array, so\n *  the two branches are the same quantity measured on the two panes. */\nconst inspectorDirCount = computed(() =>\n  paneIsActive.value ? (splitPaneRef.value?.rowCount() ?? 0) : files.value.length,\n);\n/** RBAC level of that folder. The main pane's comes off the host's own load;\n *  the split pane reads it from the response to its own `index`. */\nconst inspectorDirPerm = computed(() =>\n  paneIsActive.value ? (splitPaneRef.value?.dirPerm() ?? '') : dirPerm.value,\n);\n\n// Pane helpers — always wrap the main pane's existing converters.\nfunction paneToUser(wire: string): string {\n  return multiStorageRoot.value ? wireToVirtual(wire) : stripAdapter(wire);\n}\nfunction paneClamp(p: string): string {\n  const clean = String(p ?? '').replace(/^\\/+|\\/+$/g, '');\n  if (!rootFloor) return clean;\n  if (!clean || !(clean === rootFloor || clean.startsWith(rootFloor + '/'))) return rootFloor;\n  return clean;\n}\n\n// The clipboard follows the active pane: cut/copy is fed from the pane\n// selection and paste lands in the pane's folder. The state is SHARED with the\n// main pane's — so cut-and-paste between panes works for free.\nfunction paneCut() {\n  const nodes = splitSelection.nodes.value;\n  if (nodes.length === 0) return;\n  clipboard.value = { mode: 'cut', items: nodes, sourcePath: splitPaneRef.value?.getPath() ?? '' };\n  flashToast(t('toast.cut'));\n}\nfunction paneCopy() {\n  const nodes = splitSelection.nodes.value;\n  if (nodes.length === 0) return;\n  clipboard.value = { mode: 'copy', items: nodes, sourcePath: splitPaneRef.value?.getPath() ?? '' };\n  flashToast(t('toast.copied'));\n}\nasync function panePaste() {\n  const cb = clipboard.value;\n  const pane = splitPaneRef.value;\n  if (!cb.mode || cb.items.length === 0 || !pane) return;\n  const targetWire = qualify(pane.getPath() ?? '');\n  const originWire = qualify(cb.sourcePath || '') || undefined;\n  if (cb.mode === 'cut' && originWire === targetWire) {\n    flashToast(t('toast.same_folder_cut'));\n    return;\n  }\n  await transferItems(cb.items.map((n) => n.path), targetWire, originWire, cb.mode === 'copy' ? 'copy' : 'move');\n  clipboard.value = { mode: null, items: [], sourcePath: null };\n}\n\n// ---- cross-pane transfer -------------------------------------------\nfunction dndOrigin(ev: DragEvent): string | undefined {\n  return internalDragOrigin(ev);\n}\n\n/**\n * transferItems — the single gate for cross-pane / clipboard transfers.\n *\n * `resolveTransfer` decides what to do (lib/transfer.ts): a drag MOVES within\n * the same storage and COPIES across storages; a cut/copy coming from\n * the clipboard does exactly what it says — cut MOVES even when the target is\n * another storage (the server transfers the bytes and deletes the source).\n * ⚠ Cross-storage transfers used to silently fall back to a copy: the user\n * said \"cut\" and found the file in two places. When it's done the secondary\n * pane is refreshed too (the main pane is already refreshed via\n * moveSourcesAsync / pendingOps onSettled).\n */\n/**\n * What became of a transfer: `queued` (a job of the queue), `done` (moved\n * inside the request — a host with no async move endpoint; its Undo toast is\n * up), `refused` (said already, by reportMutationError) or `nothing` (every\n * item is already where it was sent).\n */\ntype TransferOutcome = 'queued' | 'done' | 'refused' | 'nothing';\n\nasync function transferItems(\n  sources: string[],\n  targetWire: string,\n  originWire?: string,\n  intent: TransferIntent = 'auto',\n): Promise<TransferOutcome> {\n  // ui-fix — an in-place drop (source parent === target) is a no-op: this\n  // avoids the backend's \"copy onto itself\" 400 (cross-pane + clipboard paths).\n  const list = sources.filter(\n    (p) => p && p !== targetWire && !targetWire.startsWith(p + '/') && !sameDir(wireParent(p), targetWire),\n  );\n  // Nothing to send is not a success: \"Move to…\" must not report one.\n  if (list.length === 0 || !targetWire) return 'nothing';\n  /* wiring:e2 vault — inside a vault, the vault moves and copies (a drop on a\n     folder, the other pane, a crumb); in or out of one, nothing is moved on\n     the server: that is an upload or a download. */\n  const vk = vaultTransferKind(list, targetWire);\n  if (vk === 'cross') {\n    flashToast(t('e2e.vault.cross'));\n    return 'refused';\n  }\n  if (vk === 'inside') {\n    const ok = intent === 'copy' ? await vault.copy(list, targetWire) : await vault.move(list, targetWire);\n    void splitPaneRef.value?.reload();\n    return ok ? 'done' : 'refused';\n  }\n  const plan = resolveTransfer(list, targetWire, intent);\n  let outcome: TransferOutcome;\n  if (plan.kind === 'copy') {\n    try {\n      /* wiring:e2 names — see e2eTransferNamed. */\n      const named = await e2eTransferNamed('copy', list, targetWire);\n      if (named) {\n        flashToast(t('split.copy_queued'));\n        void splitPaneRef.value?.reload();\n        return 'queued';\n      }\n      const { op } = await api.copy(list, targetWire);\n      pendingOps.register(op);\n      flashToast(plan.cross ? t('split.cross_copy') : t('split.copy_queued'));\n      outcome = 'queued';\n    } catch (err) {\n      // ⚠ Said in the reader's words by reportMutationError (the server's own\n      // sentence when it wrote one for a person — permissions, a read-only\n      // storage, a full quota — and the lock sentence for a 423). There used\n      // to be a hard-coded \"cross-storage is not supported\" here, and then the\n      // raw message.\n      reportMutationError(err, { op: 'transfer', targetWire });\n      return 'refused';\n    }\n  } else {\n    if (plan.cross) flashToast(t('split.cross_move'));\n    outcome = await moveSourcesAsync(list, targetWire, 'move-transfer', originWire);\n  }\n  void splitPaneRef.value?.reload();\n  return outcome;\n}\n\nfunction onPaneTransfer(p: { sources: string[]; targetWire: string; originWire?: string }) {\n  void transferItems(p.sources, p.targetWire, p.originWire);\n}\n/* === /wiring:d1 === */\n\n/* === wiring:e2 — end-to-end encrypted folders ===\n *\n * Crypto scheme + threat model: docs/E2E-ENCRYPTION.md and lib/e2ecrypto.ts.\n * Only the orchestration lives here: `e2e_root` in the backend listing\n * response drives the lock screen; the password is verified against the\n * marker IN THE BROWSER (nothing goes to the server); the derived folder key\n * (KEK) lives ONLY in memory (`e2eRing`) — it is never written to\n * localStorage/sessionStorage. Uploads are encrypted transparently and\n * previews/downloads decrypted transparently (a blob URL to the existing\n * viewers).\n */\nconst e2eRing = createKeyRing();\n// Maps aren't reactive — a version counter drives the computeds.\nconst e2eRingVer = ref(0);\n/* wiring:e2 fxe — single encrypted files (`.fxe`) and the streamed paths of\n * encrypted folders (composables/useE2eFiles; the rest of this block is near\n * the end of the script, `=== wiring:e2 fxe ===`). Made BEFORE the name view,\n * which asks it for the real names of the `.fxe` files opened in this tab. */\n/** Files made as they are uploaded (a STREAM file over the one-shot limit). */\nconst e2eUploadSources = new WeakMap<File, UploadSource>();\n\nconst e2eFiles = useE2eFiles({\n  api,\n  chunked,\n  locale: () => locale.value,\n  t: (key, vars) => t(key, vars),\n  toast: (message, error) => showToast({ message }, error ? ERROR_TOAST_MS : FLASH_TOAST_MS),\n  emitError: (message, op) => emit('error', { message, context: { op } }),\n  escrowPublicKey: () => e2eEscrowPub.value,\n  escrowKid: () => e2eEscrowKid.value,\n  registerOp: (op) => pendingOps.register(op),\n  reload: () => load(),\n  openPreview: (node, url) => {\n    e2eUrls.set(node.path, url);\n    previewMode.value = 'view';\n    previewTarget.value = node;\n    showPreview.value = true;\n    emit('file-opened', { path: node.path, basename: node.basename });\n    // The row on screen is named for what it is, now that this tab knows.\n    if (node.fxe_name) {\n      files.value = files.value.map((r) => (r.path === node.path ? { ...r, fxe_name: node.fxe_name } : r));\n    }\n  },\n  showRecoveryKey: (key, name) => {\n    recoveryKeyValue.value = key;\n    recoveryKeyFolder.value = name;\n    recoveryKeyVariant.value = 'file';\n    showRecoveryKey.value = true;\n  },\n  /* wiring:e2 policy — \"Request encryption…\" on a plain file. */\n  requestEncrypt: (n) => openE2eRequest(n.path, 'file', n.basename),\n});\n\n/** The preview on screen is a decrypted `.fxe`: nothing that would send its\n *  plaintext to the server (save, OnlyOffice, a new tab, share) is offered. */\nconst fxePreviewing = computed(() => !!previewTarget.value?.fxe_name);\n\n/* wiring:e2 names — the one place stored (ciphertext) names become the names\n * people see, shared with every pane, picker and tray this explorer hosts\n * (provide/inject), so they all decrypt the same way. See useE2eNames. */\nconst e2eNames = createE2eNameView({\n  api,\n  ring: e2eRing,\n  lockedLabel: () => t('e2e.names.locked_item'),\n  unreadableLabel: () => t('e2e.names.unreadable_item'),\n  fileName: (path) => e2eFiles.realName(path) /* wiring:e2 fxe */,\n});\nprovide(E2E_NAME_VIEW, e2eNames);\n/* wiring:e2 names — the notification bell and panel live outside this\n * component; they name an item inside a folder this explorer has unlocked\n * through the registry, and read \"🔒 Encrypted item\" otherwise. Read-only:\n * nothing leaves the name view, and a lock (or unmount) ends it. */\nconst e2eUnregisterNames = registerE2eNameResolver((wire, rootHint) => {\n  void e2eNames.version.value;\n  const root = e2eNames.rootOf(wire, rootHint);\n  if (!root || !e2eRing.names(root)) return null;\n  const name = e2eNames.segmentLabel(wire);\n  if (!name || name === '…') return null;\n  return { name, path: e2eNames.displayPath(wire) };\n});\nonBeforeUnmount(e2eUnregisterNames);\n/** Plaintext name of an encrypted upload, for its progress row and toasts. */\nconst e2eUploadNames = new WeakMap<File, string>();\n/** Features a newer filex put in this folder's marker that this build lacks. */\nconst e2eUnsupported = ref<string[]>([]);\n// Wire path of the encrypted root we are inside ('' = no encrypted context).\nconst e2eRoot = ref('');\n// path → decrypted blob objectURL (preview). Revoked on lock/unmount.\nconst e2eUrls = new Map<string, string>();\n\nconst e2eActive = computed(() => !!e2eRoot.value && !trashMode.value);\nconst e2eUnlocked = computed(() => {\n  void e2eRingVer.value;\n  return e2eActive.value && e2eRing.has(e2eRoot.value);\n});\nconst e2eLocked = computed(() => {\n  void e2eRingVer.value;\n  return e2eActive.value && !e2eRing.has(e2eRoot.value);\n});\n\n// Lock screen form.\nconst e2eUnlockBusy = ref(false);\nconst e2eUnlockErr = ref('');\n// Encrypted-folder creation modal.\nconst showEncFolder = ref(false);\nconst e2eCreateBusy = ref(false);\n/* wiring:e2 policy — what the New folder dialog offers for an encrypted\n * folder. It is created in the folder the main pane shows\n * (submitEncryptedFolder), so that folder is asked about — and only while the\n * dialog is open. Inside an encrypted folder nothing is offered: they do not\n * nest. And nothing where this account may not create a folder anyway\n * (`canWriteHere`: a read-only storage, `files.create`) — the dialog also\n * opens from a key, which the toolbar's buttons do not. */\nconst newFolderE2e = computed<E2eAnswer>(() =>\n  showNewFolder.value && !e2eActive.value && canWriteHere.value ? e2eAnswerAt(qualify(currentPath.value), 'new_folder') : 'denied',\n);\n/* wiring:e2 policy — \"Request encryption…\": what it is for, while its dialog\n * is open (E2eRequestModal). */\nconst e2eRequestFor = ref<{ path: string; kind: E2eRequestKind; name: string } | null>(null);\nfunction openE2eRequest(path: string, kind: E2eRequestKind, name: string): void {\n  e2eRequestFor.value = { path, kind, name };\n}\n/** The New folder dialog's \"Request an encrypted folder…\": the request is for\n *  the folder the encrypted one would be created in. */\nfunction requestEncryptedFolder(): void {\n  showNewFolder.value = false;\n  openE2eRequest(qualify(currentPath.value), 'new_folder', folderLabelOf(currentPath.value));\n}\nfunction onE2eRequestSent(answer: { created: boolean }): void {\n  e2eRequestFor.value = null;\n  flashToast(answer.created ? t('e2e.request.sent') : t('e2e.request.already'));\n}\n\n/* wiring:e2 recovery — recovery key + escrow.\n *\n * The marker of the folder we are looking at is cached here while the lock\n * screen is up: the recovery dialog needs to know which doors this folder\n * actually has (a pre-0.31 folder has none) before offering them. */\nconst e2eMarker = ref<E2eMarker | null>(null);\nconst showRecoveryUnlock = ref(false);\nconst e2eRecoverBusy = ref(false);\nconst e2eRecoverErr = ref<string | null>(null);\n// The shown-once key. Held only while its dialog is open.\nconst showRecoveryKey = ref(false);\nconst recoveryKeyValue = ref('');\nconst recoveryKeyVariant = ref<'created' | 'upgraded' | 'replaced' | 'file' /* wiring:e2 fxe */>('created');\nconst recoveryKeyFolder = ref('');\n// A v1 folder that just opened by password: offer to give it recovery now,\n// because this is the only moment filex holds the password.\nconst e2eUpgradeOffer = ref(false);\nconst e2eUpgradePw = ref('');\nconst e2eUpgradeBusy = ref(false);\n\n/* wiring:e2 escrow-offer — offering an EXISTING folder an escrow slot.\n *\n * Adoption covers folders created after it, which on an installation that\n * has been running for a while is nobody's folders: the ones that matter\n * already exist. The server cannot reach them — adding a slot needs the\n * folder master key. Its owner can, from inside, with the password, and the\n * one moment that password exists in the browser is an unlock. So this\n * lives exactly where the v1 recovery offer lives, in the same strip, with\n * the same shape.\n *\n * mode distinguishes the two ways in:\n *   'unlock'  right after a successful password unlock — we still hold the\n *             password, so Accept needs no typing, and Not now RECORDS a\n *             refusal so the question is not asked again.\n *   'manual'  the way back, from the unlocked strip, for somebody who said\n *             no earlier. The password is gone by then, so it is typed, and\n *             Cancel records nothing — they already answered once. */\nconst e2eEscrowOffer = ref(false);\nconst e2eEscrowOfferMode = ref<'unlock' | 'manual'>('unlock');\nconst e2eEscrowPw = ref('');\nconst e2eEscrowBusy = ref(false);\nconst e2eEscrowErr = ref('');\n\n/** The installation's escrow public key, or null when escrow is off.\n *  Published in /api/capabilities on purpose — see docs/E2E-ENCRYPTION.md. */\nconst e2eEscrowPub = computed<string | null>(\n  () => capabilitiesData.value?.e2e_escrow?.public_key || null,\n);\n/** Where the honest version of \"what escrow can and cannot do\" lives.\n *  ⚠ Linked from the offer on purpose: the notice says what accepting means,\n *  and the page says what the use-notification can and cannot promise — that\n *  an operator holding the private key can decrypt offline with no request,\n *  no notification and no audit row. Somebody being asked to hand over a key\n *  is entitled to read that before answering, not after. */\nconst e2eEscrowDocsUrl = 'https://docs.filex.sh/E2E-ENCRYPTION#what-escrow-can-and-cannot-do';\n\nconst e2eEscrowKid = computed<string | null>(\n  () => capabilitiesData.value?.e2e_escrow?.kid || null,\n);\n\nfunction e2eKek(): CryptoKey | null {\n  return e2eRing.get(e2eRoot.value) ?? null;\n}\n\nfunction e2eRevokeAll() {\n  for (const url of e2eUrls.values()) URL.revokeObjectURL(url);\n  e2eUrls.clear();\n}\nonBeforeUnmount(e2eRevokeAll);\n\n/**\n * Unlock the encrypted folder at `root` with its password — for the main\n * pane's lock screen and the split pane's (E2E_LOCK) alike: the ring is one\n * per tab, so a folder opened in one pane is open in the other. Returns null\n * when it opened, else the message to show.\n *\n * The offers that ride on an unlock — a pre-v0.31 folder's recovery upgrade,\n * an escrow slot — need the password in hand and the strip to show them in,\n * so they are made only when `root` is the folder the MAIN pane is in.\n */\nasync function e2eUnlockRoot(root: string, password: string): Promise<string | null> {\n  let markerText = '';\n  try {\n    const { blob, url } = await api.fetchBlob(wireJoin(root, E2E_MARKER_NAME), { fresh: true });\n    URL.revokeObjectURL(url);\n    markerText = await blob.text();\n  } catch {\n    return t('e2e.unlock.marker_missing');\n  }\n  const parsed = parseMarkerDetailed(markerText);\n  if (!parsed) return t('e2e.unlock.marker_missing');\n  const here = root === e2eRoot.value;\n  /* wiring:e2 names — a marker that REQUIRES a feature this build does not\n   * know is refused by name, not opened: opening it is how an older client\n   * writes plaintext into a folder that promised otherwise. */\n  if (parsed.unsupported.length > 0) {\n    if (here) e2eUnsupported.value = parsed.unsupported;\n    return t('e2e.unlock.unsupported', { features: parsed.unsupported.join(', ') });\n  }\n  const marker = parsed.marker;\n  if (here) e2eMarker.value = marker;\n  const opened = await unlockWithPasswordDetailed(marker, password);\n  if ('error' in opened) {\n    return opened.error === 'damaged' ? t('e2e.unlock.damaged') : t('e2e.unlock.wrong');\n  }\n  if (!(await e2eAdoptKeys(root, marker, opened.fmk))) {\n    return markerIsVault(marker) ? t('e2e.vault.open_failed') : t('e2e.names.key_failed');\n  }\n  if (here) {\n    /* wiring:e2 recovery — a folder from before recovery existed has no way\n     * back in but its password. This is the ONE moment we hold that password,\n     * so ask now. Asking is all we do: the folder keeps working untouched if\n     * the user says no, and saying yes is the only path that also hands the\n     * operator an escrow key (when the install has one), which is why the\n     * prompt says so rather than doing it quietly. */\n    if (marker.v === 1) {\n      e2eUpgradePw.value = password;\n      e2eUpgradeOffer.value = true;\n    } else if (escrowOfferState(marker, e2eEscrowKid.value) === 'offer') {\n      /* wiring:e2 escrow-offer — a v2 folder that predates escrow here.\n       * ⚠ Only after the unlock SUCCEEDED, and only by password: accepting\n       * gives the operator a key to this folder, so the person asked has to\n       * be the person who can already open it. A v1 folder is handled by the\n       * branch above, which seals an escrow slot as part of the upgrade and\n       * already discloses that — two offers on one unlock would be two\n       * chances to get the disclosure wrong. */\n      e2eEscrowPw.value = password;\n      e2eEscrowOfferMode.value = 'unlock';\n      e2eEscrowErr.value = '';\n      e2eEscrowOffer.value = true;\n    }\n  }\n  /* wiring:e2 names — the rows on screen still carry stored names; read the\n   * folder again so they come back decrypted, in both panes. */\n  if (here) await load();\n  void splitPaneRef.value?.reload();\n  return null;\n}\n\n/** The main pane's lock screen. */\nasync function e2eUnlock(password: string) {\n  if (!password || e2eUnlockBusy.value || !e2eRoot.value) return;\n  e2eUnlockBusy.value = true;\n  e2eUnlockErr.value = '';\n  try {\n    const err = await e2eUnlockRoot(e2eRoot.value, password);\n    if (err) e2eUnlockErr.value = err;\n  } finally {\n    e2eUnlockBusy.value = false;\n  }\n}\n\n/* The split pane's lock screen reaches the same unlock (composables/useE2eLock). */\nprovide(E2E_LOCK, {\n  locked: (root: string) => {\n    void e2eRingVer.value;\n    return !e2eRing.has(root);\n  },\n  unlock: e2eUnlockRoot,\n  recovery: (root: string) => {\n    // The recovery and escrow dialogs belong to the main pane: go there.\n    activePane.value = 'main';\n    void load(paneToUser(root)).then(() => {\n      if (e2eRoot.value === root) void openRecoveryUnlock();\n    });\n  },\n});\n\n/**\n * Put an unlocked folder's keys in the ring: the FMK, and — when its names\n * are encrypted — the name key sealed under it. False when the marker says\n * names are encrypted and the slot does not open under this FMK: the folder\n * would then show and write garbage names, so it is not opened at all.\n */\nasync function e2eAdoptKeys(root: string, marker: E2eMarker, fmk: CryptoKey): Promise<boolean> {\n  /* wiring:e2 vault — a vault's FMK is an HKDF key (it opens nothing itself);\n     the vault opens here: its state, its latest generation, its clocks. The\n     key stays in the ring only while the vault is open. */\n  if (markerIsVault(marker)) {\n    e2eRing.set(root, fmk, null, null);\n    e2eNames.setMarker(root, marker);\n    e2eRingVer.value++;\n    // The strip's code alongside the vault's (both loaded on first use).\n    void loadVaultStrip().catch(() => undefined);\n    try {\n      await vault.open(root, marker, fmk, { perm: root === e2eRoot.value ? dirPerm.value || undefined : undefined });\n    } catch (err) {\n      e2eRing.lock(root);\n      e2eRingVer.value++;\n      emit('error', { message: (err as Error)?.message ?? String(err), context: { op: 'e2e-vault-open' } });\n      return false;\n    }\n    return true;\n  }\n  let names = null;\n  if (markerHasNames(marker)) {\n    names = await unlockNameKey(marker, fmk);\n    if (!names) return false;\n  }\n  /* wiring:e2 password — mid re-key, the files not re-wrapped yet are under\n     the previous folder key, which the marker seals under the new one. */\n  let previous: CryptoKey | null = null;\n  if (rekeyPending(marker)) {\n    previous = await unlockPrevious(marker, fmk);\n    if (!previous) return false;\n  }\n  e2eRing.set(root, fmk, names, previous);\n  e2eNames.setMarker(root, marker);\n  e2eRingVer.value++;\n  return true;\n}\n\n/** \"Kilitle\" (Lock): drop the in-memory key and the decrypted blobs. */\nfunction e2eLock() {\n  if (!e2eRoot.value) return;\n  const root = e2eRoot.value;\n  /* wiring:e2 vault — the write lock goes back, the clocks stop. */\n  if (vault.isOpen(root)) vault.close(root, 'manual');\n  e2eRing.lock(root);\n  // Plaintext names leave memory with the key.\n  e2eNames.forget(root);\n  e2eRingVer.value++;\n  e2eRevokeAll();\n  showE2eSettings.value = false;\n  e2eRecoveryInHand = null;\n  showPwChange.value = false;\n  flashToast(t('e2e.locked_toast'));\n  void load();\n}\n\n// Extension → preview MIME: so the decrypted blob renders correctly in\n// <img>/<video>/<object> tags (the server knows the encrypted file as\n// octet-stream, so the type coming from there is useless). One table for\n// folder files and single encrypted files: lib/e2emime.\nfunction e2eMimeFor(n: FileNode): string {\n  return e2eMimeForExt(n.extension);\n}\n\n/**\n * Fetch the file + decrypt it + cache its objectURL. Returns null for a file\n * with no magic (e.g. written in the clear over DAV) — the caller then falls\n * back to the normal raw flow. A wrong key / corrupt data throws\n * E2eDecryptError (the caller toasts it).\n */\nasync function e2eFetchDecrypted(n: FileNode): Promise<string | null> {\n  const cached = e2eUrls.get(n.path);\n  if (cached) return cached;\n  /* wiring:e2 vault — from the vault's packs, by byte ranges. */\n  if (vault.isVaultRow(n)) {\n    const url = await vault.readUrl(n.path, e2eMimeFor(n));\n    e2eUrls.set(n.path, url);\n    return url;\n  }\n  const kek = e2eKek();\n  if (!kek) return null;\n  const buf = await api.fetchArrayBuffer(n.path);\n  if (!hasMagic(buf)) return null;\n  const plain = await decryptFileAny(kek, e2eRing.previous(e2eRoot.value), buf);\n  const url = URL.createObjectURL(new Blob([plain], { type: e2eMimeFor(n) }));\n  e2eUrls.set(n.path, url);\n  return url;\n}\n\n/** URL provider handed to PreviewModal/QuickLook: decrypted blob > raw URL. */\nfunction e2ePreviewSrc(p: string): string {\n  return e2eUrls.get(p) ?? api.previewUrl(p);\n}\n\n/** Decrypt + read-only in-page preview (openNode/previewNode land here). */\nasync function e2eOpenPreview(n: FileNode) {\n  try {\n    await e2eFetchDecrypted(n);\n  } catch {\n    flashToast(t('e2e.decrypt_failed'));\n    return;\n  }\n  previewMode.value = 'view';\n  previewTarget.value = n;\n  showPreview.value = true;\n  emit('file-opened', { path: n.path, basename: n.basename });\n  void markRecent(n);\n}\n\n/** Decrypt + download under the original name. A file with no magic comes down as-is.\n *  wiring:e2 stream — decrypted AS IT ARRIVES, into the save sink this\n *  browser has (lib/e2esave): either header version, any size where the\n *  browser can write a stream to disk. */\nasync function e2eDownload(n: FileNode) {\n  /* wiring:e2 vault */\n  if (vault.isVaultRow(n)) {\n    await vault.download([n]);\n    return;\n  }\n  const kek = e2eKek();\n  if (!kek) {\n    flashToast(t('e2e.download.failed'));\n    return;\n  }\n  await e2eFiles.downloadFolderFile(n, kek, e2eRing.previous(e2eRoot.value), e2eRoot.value);\n}\n\n/** Upload list → encrypted File list (anything over 200MB + the marker name is skipped).\n *\n *  wiring:e2 names — in a folder whose names are encrypted the File is also\n *  RENAMED to its stored (ciphertext) name here, the one place every upload\n *  path goes through, so neither the single POST nor the staged/chunked path\n *  can carry the plaintext name to the server. The plaintext stays in the\n *  browser for the progress row (`e2eUploadNames`). A long name comes back\n *  with a sidecar the caller uploads first. A name a disk could not hold is\n *  refused here rather than uploaded under a name `filex decrypt` could not\n *  write back. */\nasync function e2eEncryptUploads(\n  list: File[],\n  target: string,\n): Promise<{ files: File[]; sidecars: File[] }> {\n  const kek = e2eKek();\n  if (!kek) return { files: [], sidecars: [] };\n  const out: File[] = [];\n  const sidecars: File[] = [];\n  await e2eKnowRootOf(target);\n  const encNames = !!e2eNames.writesEncrypted(target);\n  for (const f of list) {\n    if (f.name === E2E_MARKER_NAME) continue;\n    if (encNames && namePlainProblem(f.name)) {\n      flashToast(t('e2e.names.bad_name', { name: f.name }));\n      continue;\n    }\n    try {\n      /* wiring:e2 stream — over the one-shot limit: a STREAM (0x02) file,\n         encrypted as it is uploaded (nothing held but the chunk in flight). */\n      const source = f.size > E2E_MAX_FILE_BYTES ? await e2eFiles.folderUploadSource(f, kek) : null;\n      const ct = source ? null : await encryptFile(kek, await f.arrayBuffer());\n      let name = f.name;\n      if (encNames) {\n        const enc = await e2eNames.nameForWrite(target, f.name);\n        if (!enc) throw new Error('e2e: the folder name key is missing');\n        name = enc.stored;\n        if (enc.sidecar) {\n          sidecars.push(new File([enc.sidecar.content], enc.sidecar.name, { type: 'text/plain' }));\n        }\n      }\n      const file = new File(ct ? [ct] : [], name, { type: 'application/octet-stream' });\n      if (source) e2eUploadSources.set(file, source);\n      if (encNames) e2eUploadNames.set(file, f.name);\n      out.push(file);\n    } catch (err) {\n      emit('error', { message: (err as Error).message, context: { op: 'e2e-encrypt' } });\n    }\n  }\n  return { files: out, sidecars };\n}\n\n/** EncryptedFolderModal submit: create the folder + upload the marker + leave it unlocked. */\nasync function submitEncryptedFolder(payload: { name: string; password: string; level?: ChoosableLevel; packLog2?: number }) {\n  if (e2eActive.value) {\n    // Nested encrypted folders blur root detection — not in the MVP.\n    flashToast(t('e2e.create.nested'));\n    return;\n  }\n  /* wiring:e2 vault — a vault is made whole by the server (`POST\n     .../vault/create`): the folder, its key file and generation 1, or\n     nothing. Offered only where the server has vaults. */\n  if (payload.level === 'vault') {\n    await submitVault(payload);\n    return;\n  }\n  e2eCreateBusy.value = true;\n  // The folder is made first and the key file goes into it, so a refusal at the\n  // second step (the policy switched, an approval spent or expired after the\n  // listing) leaves the plain folder behind.\n  let folderMade = false;\n  try {\n    const dirWire = qualify(currentPath.value);\n    await api.newFolder(dirWire, payload.name);\n    folderMade = true;\n    /* wiring:e2 recovery — the folder gets a recovery key at birth, and an\n     * escrow slot when the installation has one. Both are decided HERE and\n     * never again: the wrapped copies are written into the marker now, so a\n     * folder created without escrow can never be opened by an escrow key. */\n    /* wiring:e2 — the level chosen in the dialog. Level 1 (contents only,\n     * a v2 marker every filex since 0.31 opens) is the default; level 2 also\n     * encrypts the names (v3). */\n    const { marker, fmk, recoveryKey, names } = await createEncryptedFolder(payload.password, {\n      escrowPublicKey: e2eEscrowPub.value,\n      encryptNames: payload.level === 'names',\n    });\n    const markerFile = new File([JSON.stringify(marker)], E2E_MARKER_NAME, {\n      type: 'application/json',\n    });\n    const newDirWire = wireJoin(dirWire, payload.name);\n    await api.uploadMultipart(newDirWire, [markerFile]);\n    // It starts unlocked in the creating session (they just typed the password).\n    e2eRing.set(newDirWire, fmk, names ?? null);\n    e2eNames.setMarker(newDirWire, marker);\n    e2eRingVer.value++;\n    showEncFolder.value = false;\n    // ⚠ Show the key only after the marker is safely uploaded. Showing it\n    // first would promise recovery for a folder that failed to be created.\n    recoveryKeyValue.value = recoveryKey;\n    recoveryKeyFolder.value = payload.name;\n    recoveryKeyVariant.value = 'created';\n    showRecoveryKey.value = true;\n    await load();\n  } catch (err) {\n    emit('error', { message: (err as Error).message, context: { op: 'e2e-create' } });\n    // wiring:e2 policy — the server's refusal in words (\"your role does not\n    // allow encrypting here\"), not a bare \"could not create\".\n    showToast({ message: failureText(err, t('e2e.create.failed')) }, ERROR_TOAST_MS);\n    // The plain folder the first step made is there now, and stays — deleting\n    // it is not this dialog's to decide. Show what the folder holds instead of\n    // a listing that predates it.\n    if (folderMade) await load();\n  } finally {\n    e2eCreateBusy.value = false;\n  }\n}\n\n/* --- wiring:e2 vault ---------------------------------------------------- */\n\n/** EncryptedFolderModal submit at level 3: make the vault, leave it open. */\nasync function submitVault(payload: { name: string; password: string; packLog2?: number }) {\n  if (capabilitiesData.value?.e2e_vault !== true) {\n    showToast({ message: t('e2e.create.failed') }, ERROR_TOAST_MS);\n    return;\n  }\n  e2eCreateBusy.value = true;\n  try {\n    const dirWire = qualify(currentPath.value);\n    const vaultPath = wireJoin(dirWire, payload.name);\n    const made = await createVault(payload.password, {\n      escrowPublicKey: e2eEscrowPub.value,\n      packLog2: payload.packLog2,\n    });\n    await vault.create(vaultPath, made.marker, made.index);\n    // It starts unlocked in the creating session (they just typed the password).\n    e2eRing.set(vaultPath, made.fmk, null, null);\n    e2eNames.setMarker(vaultPath, made.marker);\n    e2eRingVer.value++;\n    void loadVaultStrip().catch(() => undefined);\n    await vault.open(vaultPath, made.marker, made.fmk, { justMade: true, perm: dirPerm.value || undefined });\n    showEncFolder.value = false;\n    // ⚠ The key only after the vault exists on the server (as for a folder).\n    recoveryKeyValue.value = made.recoveryKey;\n    recoveryKeyFolder.value = payload.name;\n    recoveryKeyVariant.value = 'created';\n    showRecoveryKey.value = true;\n    await load();\n  } catch (err) {\n    emit('error', { message: (err as Error).message, context: { op: 'e2e-vault-create' } });\n    showToast({ message: failureText(err, t('e2e.create.failed')) }, ERROR_TOAST_MS);\n  } finally {\n    e2eCreateBusy.value = false;\n  }\n}\n\n/** Where a transfer goes, as far as vaults are concerned. */\nfunction vaultTransferKind(sources: string[], targetWire: string): 'none' | 'inside' | 'cross' {\n  const to = vault.rootOf(targetWire);\n  const from = sources.map((p) => vault.rootOf(p));\n  if (!to && from.every((r) => !r)) return 'none';\n  if (to && vault.isOpen(to) && from.every((r) => r === to)) return 'inside';\n  return 'cross';\n}\n\n/** The strip of the vault the main pane is in, or null. */\nconst vaultStrip = computed(() => {\n  void vault.version.value;\n  const root = e2eRoot.value;\n  return root ? (vault.strips[root] ?? null) : null;\n});\n\n/** The preview shows a file of a vault: nothing goes back to the server. */\nconst vaultPreviewing = computed(() => !!previewTarget.value && vault.isVaultRow(previewTarget.value));\n\n/** The Delete dialog is about rows of a vault: deleted for good, no trash. */\nconst vaultDeleting = computed(() => [...selection.nodes.value, ...paneCtxTargets.value].some((n) => vault.isVaultRow(n)));\n\nfunction vaultUnder(path: string | undefined | null, root: string): boolean {\n  return !!path && (path === root || path.startsWith(root + '/'));\n}\n\n/** Decrypted blobs of a vault leave memory (all of them, or all but the one\n *  on screen, which a newer generation does not take away). */\nfunction vaultForgetUrls(root: string, all: boolean): void {\n  for (const [p, url] of [...e2eUrls]) {\n    if (!vaultUnder(p, root)) continue;\n    if (all || p !== previewTarget.value?.path) URL.revokeObjectURL(url);\n    e2eUrls.delete(p);\n  }\n}\n\n/** The vault locked (or was locked): its keys leave the ring, and what this\n *  explorer shows of it closes. */\nfunction vaultDropKeys(root: string): void {\n  e2eRing.lock(root);\n  e2eNames.forget(root);\n  e2eRingVer.value++;\n  if (vaultUnder(previewTarget.value?.path, root)) showPreview.value = false;\n  if (vaultUnder(quickLookTarget.value?.path, root)) quickLookOpen.value = false;\n  vaultForgetUrls(root, true);\n}\n\nfunction vaultLocked(root: string, why: 'idle' | 'manual'): void {\n  if (why === 'idle') {\n    showToast({ message: t('e2e.vault.locked_idle_toast', { name: wireBasename(root) }) }, 8000);\n  }\n  if (e2eRoot.value === root || vaultUnder(qualify(currentPath.value), root)) {\n    showE2eSettings.value = false;\n    void load(paneToUser(root));\n  }\n  void splitPaneRef.value?.reload();\n}\n\nfunction vaultChanged(root: string): void {\n  vaultForgetUrls(root, false);\n  if (e2eRoot.value === root) void load();\n  void splitPaneRef.value?.reload();\n}\n\n/* --- wiring:e2 recovery ------------------------------------------------\n *\n * Two more ways into a locked folder, and one way to give an old folder\n * those ways. The password path above is untouched, and nothing here runs\n * without an explicit user action.\n */\n\n/** Unlock without the password: user recovery key, or the operator's escrow\n *  key. The escrow branch announces itself to the server first. */\nasync function e2eRecoverUnlock(payload: { mode: 'recovery' | 'escrow'; value: string }) {\n  if (!e2eMarker.value || !e2eRoot.value) return;\n  e2eRecoverBusy.value = true;\n  e2eRecoverErr.value = null;\n  try {\n    let fmk: CryptoKey | null = null;\n    if (payload.mode === 'recovery') {\n      fmk = await unlockWithRecoveryKey(e2eMarker.value, payload.value);\n      if (!fmk) {\n        e2eRecoverErr.value = t('e2e.recover.wrong_recovery');\n        return;\n      }\n    } else {\n      let priv: CryptoKey;\n      try {\n        priv = await importEscrowPrivateKey(payload.value);\n      } catch {\n        e2eRecoverErr.value = t('e2e.recover.bad_escrow_key');\n        return;\n      }\n      fmk = await unlockWithEscrowKey(e2eMarker.value, priv);\n      if (!fmk) {\n        e2eRecoverErr.value = t('e2e.recover.wrong_escrow');\n        return;\n      }\n      /* ⚠ Announce BEFORE unlocking, and treat a failure to announce as a\n       * failure to unlock. The server hands out a nonce sealed to the escrow\n       * public key; returning it proves the key was really here, and that is\n       * what earns the owner their notification.\n       *\n       * ⚠⚠ This is not enforcement and must never be described as such. An\n       * operator holding the escrow private key can decrypt the same folder\n       * offline, with a script, and this code will never run. Refusing to\n       * unlock on a failed announcement only keeps the honest path honest. */\n      try {\n        const ch = await api.e2eEscrowChallenge(e2eRoot.value);\n        const nonce = new Uint8Array(\n          await crypto.subtle.decrypt(\n            { name: 'RSA-OAEP' },\n            priv,\n            b64ToBytes(ch.challenge).buffer as ArrayBuffer,\n          ),\n        );\n        await api.e2eEscrowUsed({\n          path: e2eRoot.value,\n          id: ch.id,\n          nonce: bytesToB64(nonce),\n        });\n      } catch (err) {\n        e2eRecoverErr.value = t('e2e.recover.notify_failed');\n        emit('error', {\n          message: (err as Error).message,\n          context: { op: 'e2e-escrow-notify' },\n        });\n        return;\n      }\n    }\n    if (!(await e2eAdoptKeys(e2eRoot.value, e2eMarker.value, fmk))) {\n      e2eRecoverErr.value = t('e2e.names.key_failed');\n      return;\n    }\n    showRecoveryUnlock.value = false;\n    flashToast(\n      payload.mode === 'escrow' ? t('e2e.recover.escrow_done') : t('e2e.recover.recovery_done'),\n    );\n    await load();\n    /* wiring:e2 password — a recovery key that was used is a password that\n       was lost (or leaked): a new one is set before the folder is used. The\n       key stays in this tab's memory only for that, and closing the dialog\n       locks the folder. Escrow is the operator's door and resets nothing. */\n    if (payload.mode === 'recovery') {\n      e2eRecoveryInHand = payload.value;\n      e2eOpenPasswordChange('reset');\n    }\n  } catch (err) {\n    e2eRecoverErr.value = (err as Error).message;\n  } finally {\n    e2eRecoverBusy.value = false;\n  }\n}\n\n/** Open the recovery dialog from the lock screen. The marker was cached by\n *  the last unlock attempt; fetch it if the user came straight here. */\nasync function openRecoveryUnlock() {\n  if (!e2eMarker.value && e2eRoot.value) {\n    try {\n      const { blob, url } = await api.fetchBlob(wireJoin(e2eRoot.value, E2E_MARKER_NAME), { fresh: true });\n      URL.revokeObjectURL(url);\n      const parsed = parseMarkerDetailed(await blob.text());\n      e2eMarker.value = parsed && parsed.unsupported.length === 0 ? parsed.marker : null;\n    } catch {\n      e2eMarker.value = null;\n    }\n  }\n  e2eRecoverErr.value = null;\n  showRecoveryUnlock.value = true;\n}\n\n/** Give a pre-0.31 folder a recovery key, in place, using the password the\n *  user just typed. The files are NOT rewritten — only the marker is. */\nasync function e2eDoUpgrade() {\n  if (!e2eMarker.value || !e2eRoot.value || !e2eUpgradePw.value) return;\n  e2eUpgradeBusy.value = true;\n  try {\n    const up = await upgradeMarkerV1(e2eMarker.value, e2eUpgradePw.value, {\n      escrowPublicKey: e2eEscrowPub.value,\n    });\n    const markerFile = new File([JSON.stringify(up.marker)], E2E_MARKER_NAME, {\n      type: 'application/json',\n    });\n    await api.uploadMultipart(e2eRoot.value, [markerFile]);\n    e2eMarker.value = up.marker;\n    e2eNames.setMarker(e2eRoot.value, up.marker);\n    e2eUpgradeOffer.value = false;\n    e2eUpgradePw.value = '';\n    recoveryKeyValue.value = up.recoveryKey;\n    recoveryKeyFolder.value = wireBasename(e2eRoot.value);\n    recoveryKeyVariant.value = 'upgraded';\n    showRecoveryKey.value = true;\n  } catch (err) {\n    emit('error', { message: (err as Error).message, context: { op: 'e2e-upgrade' } });\n    flashToast(t('e2e.upgrade.failed'));\n  } finally {\n    e2eUpgradeBusy.value = false;\n  }\n}\n\n/* wiring:e2 escrow-offer ------------------------------------------- */\n\n/** Whether this folder could be given an escrow slot, and whether its owner\n *  has already answered. Drives the way-back button in the unlocked strip. */\nconst e2eEscrowOfferState = computed(() => escrowOfferState(e2eMarker.value, e2eEscrowKid.value));\n\n/** The way back. Somebody who said no last month can say yes today without\n *  deleting and re-creating the folder — but the password is long gone from\n *  memory, so they type it. That is not friction to be smoothed away: it is\n *  the same proof of ownership the offer at unlock had, and handing the\n *  operator a key deserves it. */\nfunction e2eOpenEscrowOffer() {\n  e2eEscrowOfferMode.value = 'manual';\n  e2eEscrowPw.value = '';\n  e2eEscrowErr.value = '';\n  e2eEscrowOffer.value = true;\n}\n\n/** Write a marker back to the folder and adopt it as the one we are holding.\n *  Both escrow-offer answers change only `.filex-e2e.json`. */\nasync function e2eWriteMarker(next: E2eMarker) {\n  const file = new File([JSON.stringify(next)], E2E_MARKER_NAME, { type: 'application/json' });\n  await api.uploadMultipart(e2eRoot.value, [file]);\n  e2eMarker.value = next;\n  e2eNames.setMarker(e2eRoot.value, next);\n}\n\n/** Accept: seal this folder's master key to the installation's escrow key.\n *  No file is re-encrypted or moved — only the marker gains a slot. */\nasync function e2eAcceptEscrow() {\n  const marker = e2eMarker.value;\n  const pub = e2eEscrowPub.value;\n  if (!marker || !pub || !e2eRoot.value || e2eEscrowBusy.value) return;\n  if (!e2eEscrowPw.value) {\n    e2eEscrowErr.value = t('e2e.escrowoffer.password_required');\n    return;\n  }\n  e2eEscrowBusy.value = true;\n  e2eEscrowErr.value = '';\n  try {\n    // ⚠ The kid comes from the installation's CURRENT key, via the marker\n    // addEscrowSlot writes — never from anything the UI is displaying. The\n    // sibling bug went the other way (the dialog labelled a folder's slot\n    // with the installation's kid); writing the installation's kid into a\n    // slot sealed to some other key would be the same lie in reverse.\n    const next = await addEscrowSlot(marker, e2eEscrowPw.value, pub);\n    await e2eWriteMarker(next);\n    e2eEscrowOffer.value = false;\n    e2eEscrowPw.value = '';\n    flashToast(t('e2e.escrowoffer.done'));\n  } catch (err) {\n    // A wrong password is the ordinary case here and reads as a typo, not\n    // as a broken folder; anything else is worth reporting.\n    if ((err as Error)?.name === 'E2eDecryptError') {\n      e2eEscrowErr.value = t('e2e.escrowoffer.wrong_password');\n    } else {\n      e2eEscrowErr.value = t('e2e.escrowoffer.failed');\n      emit('error', { message: (err as Error).message, context: { op: 'e2e-escrow-offer' } });\n    }\n  } finally {\n    e2eEscrowBusy.value = false;\n  }\n}\n\n/** Not now. Recorded IN THE FOLDER, so the same person on another device is\n *  not asked again and the answer survives a cleared browser. A question\n *  that returns every single unlock is how people learn to click past\n *  security dialogs without reading them. */\nasync function e2eDeclineEscrow() {\n  const marker = e2eMarker.value;\n  if (!marker || !e2eRoot.value || e2eEscrowBusy.value) return;\n  e2eEscrowBusy.value = true;\n  try {\n    await e2eWriteMarker(declineEscrowSlot(marker, new Date().toISOString()));\n    e2eEscrowOffer.value = false;\n    e2eEscrowPw.value = '';\n    flashToast(t('e2e.escrowoffer.declined_toast'));\n  } catch (err) {\n    // ⚠ Fail towards asking again rather than towards silence: if the\n    // refusal could not be written, the honest state is \"not answered yet\".\n    e2eEscrowErr.value = t('e2e.escrowoffer.decline_failed');\n    emit('error', { message: (err as Error).message, context: { op: 'e2e-escrow-decline' } });\n  } finally {\n    e2eEscrowBusy.value = false;\n  }\n}\n\n/** Close the way-back panel without answering anything. Distinct from\n *  declining: they answered once already, and re-recording the same refusal\n *  would overwrite the date it was actually made. */\nfunction e2eCloseEscrowOffer() {\n  e2eEscrowOffer.value = false;\n  e2eEscrowPw.value = '';\n  e2eEscrowErr.value = '';\n}\n\n/** Decline the offer. The folder keeps working exactly as it did, and the\n *  prompt returns on the next unlock because the risk has not changed. */\nfunction e2eDeclineUpgrade() {\n  e2eUpgradeOffer.value = false;\n  e2eUpgradePw.value = '';\n}\n\n\n/* --- wiring:e2 names ----------------------------------------------------\n *\n * Encrypted file and folder names (docs/E2E-ENCRYPTION.md → \"Encrypted\n * names\"). The crypto is lib/e2enames.ts, the display side is the name view\n * (composables/useE2eNames). What lives here is the writing side and the\n * switch of an existing folder:\n *\n *   - every name this explorer SENDS into an encrypted-names folder goes\n *     through `e2eWireName` (new folder, rename) or `e2eEncryptUploads`\n *     (upload) — there is no other door, and none falls back to plaintext;\n *   - a name is sealed for the folder it is in (its folder id, lib/e2enames),\n *     so a move or copy between folders re-seals it: one queue step per item,\n *     move and rename together (`e2eTransferNamed`); a folder keeps its id,\n *     so nothing inside it is touched;\n *   - a long name's sidecar is written before the item; it is never deleted\n *     with the item, because it is a pure function of the name and a restore\n *     needs it;\n *   - searching inside such a folder is done here, in the browser\n *     (`e2eSearchInside`), because the server can no longer read the names;\n *   - raising a folder from level 1 to level 2 (its settings, never an offer)\n *     renames what is there, resumably (lib/e2enamepass, `e2eRaiseLevel`).\n */\n\n/** A name the folder cannot hold (see lib/e2enames `namePlainProblem`). */\nclass E2eNameRefused extends Error {\n  constructor(public problem: string) {\n    super(`e2e: invalid name (${problem})`);\n    this.name = 'E2eNameRefused';\n  }\n}\n\n/**\n * The name to SEND for a plaintext name written into `dirWire`: the stored\n * (ciphertext) name inside an encrypted-names folder, the name itself\n * anywhere else. A long name's sidecar is uploaded first. Throws when the\n * folder's names are encrypted but it is locked — never falls back to the\n * plaintext.\n */\nasync function e2eWireName(\n  dirWire: string,\n  plainName: string,\n  opts: { isDir?: boolean; keepIdOf?: string } = {},\n): Promise<string> {\n  await e2eKnowRootOf(dirWire);\n  if (!e2eNames.writesEncrypted(dirWire)) return plainName;\n  const problem = namePlainProblem(plainName);\n  if (problem) throw new E2eNameRefused(problem);\n  const enc = await e2eNames.nameForWrite(dirWire, plainName, opts);\n  if (!enc) return plainName;\n  if (enc.sidecar) {\n    await api.uploadMultipart(dirWire, [\n      new File([enc.sidecar.content], enc.sidecar.name, { type: 'text/plain' }),\n    ]);\n  }\n  return enc.stored;\n}\n\n/**\n * Make sure the name view knows whether `dirWire` sits in an encrypted-names\n * folder BEFORE a name is sent there. The listing on screen normally taught\n * it already; this closes the gap where it did not (a write racing the first\n * listing), because the fallback of a gap is sending a plaintext name.\n */\nasync function e2eKnowRootOf(dirWire: string): Promise<void> {\n  const root = e2eRoot.value;\n  if (!root) return;\n  const d = dirWire.replace(/\\/+$/, '');\n  const r = root.replace(/\\/+$/, '');\n  if (d === r || d.startsWith(r.endsWith('://') ? r : `${r}/`)) await e2eNames.markerFor(root);\n}\n\n/**\n * wiring:e2 names — a move or copy that crosses folders inside an\n * encrypted-names folder. A name is sealed for the folder it is in\n * (lib/e2enames → folder ids), so each item arrives under a name sealed for\n * its NEW folder: one queue step per item, the move and the rename together\n * (api.transferNamed — the server moves onto the literal new name, so nothing\n * stops half-way). A folder keeps its id, so nothing inside it is touched. A\n * long name's sidecar is written into the target first.\n *\n * Null when this is not such a transfer (the ordinary path applies): the\n * target is not inside an encrypted-names folder, or the sources are not all\n * inside the same one (the server's boundary guard refuses those anyway).\n */\nasync function e2eTransferNamed(\n  kind: 'copy' | 'move',\n  sources: string[],\n  targetWire: string,\n  originWire?: string,\n): Promise<{ ops: PendingOpDto[]; undo: (() => Promise<{ queued: boolean }>) | null } | null> {\n  await e2eKnowRootOf(targetWire);\n  const root = e2eNames.writesEncrypted(targetWire);\n  if (!root || !e2eRing.names(root)) return null;\n  if (!sources.every((src) => e2eNames.rootOf(src) === root)) return null;\n  const ops: PendingOpDto[] = [];\n  const back: Array<{ moved: string; origin: string; name: string }> = [];\n  const same = (a: string, b: string) => a.replace(/\\/+$/, '') === b.replace(/\\/+$/, '');\n  // The names already in the target: a copy next to its original (or onto a\n  // taken name) is numbered the way an upload conflict is — the server cannot\n  // invent a name there, only the browser can.\n  let taken = new Set<string>();\n  try {\n    taken = new Set(((await api.index(targetWire)).files ?? []).map((f) => f.basename));\n  } catch {\n    /* the server refuses a taken name anyway */\n  }\n  for (const src of sources) {\n    const origin = wireParent(src);\n    if (kind === 'move' && same(origin, targetWire)) continue;\n    const stored = wireBasename(src);\n    const dec = await e2eNames.plainNameOf(src);\n    if (!dec || dec.state === 'unreadable' || dec.name === null) {\n      throw new Error(t('e2e.names.move_unreadable'));\n    }\n    const isDir = await e2eIsDir(src);\n    const opts = isDir ? { keepIdOf: src } : {};\n    let enc = await e2eNames.nameForWrite(targetWire, dec.name, opts);\n    if (!enc) return null;\n    for (let i = 2; kind === 'copy' && taken.has(enc.stored) && i < 100; i++) {\n      enc = (await e2eNames.nameForWrite(targetWire, numberedName(dec.name, i), opts))!;\n    }\n    if (taken.has(enc.stored)) throw new Error(t('e2e.names.move_taken', { name: dec.name }));\n    taken.add(enc.stored);\n    if (enc.sidecar) {\n      await api.uploadMultipart(targetWire, [\n        new File([enc.sidecar.content], enc.sidecar.name, { type: 'text/plain' }),\n      ]);\n    }\n    const { op } = await api.transferNamed(kind, src, targetWire, enc.stored, originWire);\n    pendingOps.register(op);\n    ops.push(op);\n    back.push({ moved: wireJoin(targetWire, enc.stored), origin, name: stored });\n  }\n  const undo =\n    kind === 'move'\n      ? async () => {\n          for (const b of back) {\n            const { op } = await api.transferNamed('move', b.moved, b.origin, b.name);\n            pendingOps.register(op);\n          }\n          return { queued: true };\n        }\n      : null;\n  return { ops, undo };\n}\n\n/** Is the item at `wire` a folder? From a row on screen, else from its\n *  parent's listing (a stored name alone cannot say for a plaintext one). */\nasync function e2eIsDir(wire: string): Promise<boolean> {\n  const known =\n    files.value.find((f) => f.path === wire) ??\n    (splitPaneRef.value?.visibleNodes() ?? []).find((f: FileNode) => f.path === wire);\n  if (known) return known.type === 'dir';\n  const c = classifyStoredName(wireBasename(wire)).kind;\n  if (c === 'dir' || c === 'longdir') return true;\n  if (c === 'file' || c === 'long') return false;\n  try {\n    const res = await api.index(wireParent(wire));\n    return (res.files ?? []).some((f) => f.path === wire && f.type === 'dir');\n  } catch {\n    return false;\n  }\n}\n\n/** Folders visited, at most, by one in-browser search. */\nconst E2E_SEARCH_MAX_DIRS = 2000;\n\n/**\n * Search inside an encrypted-names folder, in the browser: the server stores\n * ciphertext names, so its index cannot match anything a person types. Walks\n * the folder breadth-first from `target`, decrypting each listing, and\n * matches with the same fold the name filter uses. Null when `target` is not\n * inside such a folder (the server search applies). A locked folder answers\n * with no rows and its root, so the lock screen shows.\n */\nasync function e2eSearchInside(target: string, q: string): Promise<ManagerResponse | null> {\n  const root = e2eNames.writesEncrypted(target);\n  if (!root) return null;\n  const idx = target.indexOf('://');\n  const adapterName = idx === -1 ? adapter.value : target.slice(0, idx);\n  const base: ManagerResponse = {\n    adapter: adapterName,\n    storages: (props.config.storages ?? []).map((st) => st.name),\n    dirname: target,\n    read_only: false,\n    files: [],\n    e2e_root: root,\n  };\n  if (!e2eRing.names(root)) return base;\n  const hits: FileNode[] = [];\n  const queue = [target];\n  let dirs = 0;\n  while (queue.length > 0 && hits.length < MANAGER_SEARCH_PAGE && dirs < E2E_SEARCH_MAX_DIRS) {\n    const dir = queue.shift()!;\n    dirs++;\n    let res: ManagerResponse;\n    try {\n      res = await api.index(dir);\n    } catch {\n      continue;\n    }\n    const rows = filterListing(await e2eNames.decorate(res.files ?? [], { root }));\n    for (const r of rows) {\n      if (r.type === 'dir') queue.push(r.path);\n      if (nameMatches(r.basename, q)) hits.push(r);\n      if (hits.length >= MANAGER_SEARCH_PAGE) break;\n    }\n  }\n  return { ...base, files: hits, truncated: queue.length > 0 } as ManagerResponse;\n}\n\n/* Encryption level (docs/E2E-ENCRYPTION.md → \"Encryption levels\"): a\n * property of the folder, shown in the strip and changed only in the\n * folder's encryption settings — never offered after an unlock. */\nconst showE2eSettings = ref(false);\n\n/* wiring:e2 names — the marker in hand is the marker of the folder we are IN.\n * It used to be whichever folder was unlocked last, so stepping from one\n * unlocked encrypted folder into another kept the first one's answers (and\n * its offers, and the password held for them) on screen over the second.\n * A different root drops every open offer and the password held for it. */\nwatch(e2eRoot, async (root, prev) => {\n  if (root === prev) return;\n  e2eUpgradeOffer.value = false;\n  e2eUpgradePw.value = '';\n  e2eEscrowOffer.value = false;\n  e2eEscrowPw.value = '';\n  showE2eSettings.value = false;\n  e2eNamesErr.value = '';\n  e2eNamesProgress.value = null;\n  e2eUnsupported.value = [];\n  if (!root) {\n    e2eMarker.value = null;\n    return;\n  }\n  const m = e2eNames.markerCached(root);\n  e2eMarker.value = m === undefined ? null : m;\n  if (m === undefined) {\n    const fetched = await e2eNames.markerFor(root);\n    if (e2eRoot.value === root) e2eMarker.value = fetched;\n  }\n});\nconst e2eNamesBusy = ref(false);\nconst e2eNamesErr = ref('');\nconst e2eNamesProgress = ref<NamePassProgress | null>(null);\nlet e2eNamesStop = false;\n\nconst e2eLevel = computed(() => {\n  void e2eRingVer.value;\n  return encryptionLevel(e2eMarker.value);\n});\nconst e2eNamesOn = computed(() => e2eLevel.value !== 'content');\nconst e2eCanRaise = computed(() => {\n  void e2eRingVer.value;\n  return canRaiseToNames(e2eMarker.value);\n});\n/** Rows in view whose names need the pass: never encrypted (a WebDAV\n *  write), or moved in over WebDAV and so sealed for another folder. Shown,\n *  flagged, and fixed from the settings by the same pass (lib/e2enamepass). */\nconst e2ePlainNamed = computed(() =>\n  e2eNamesOn.value\n    ? files.value.filter((f) => f.e2e_name_state === 'plain' || f.e2e_name_state === 'unreadable').length\n    : 0,\n);\n\n/**\n * Raise the folder from level 1 to level 2 (or resume that, or encrypt names\n * that arrived in the clear later). The marker is written FIRST — v3, a fresh\n * name key and root id, `pending` — and only then is a single entry renamed;\n * `pending` is cleared when the pass finishes with nothing left over. Contents\n * are not touched: this is renames only.\n */\nasync function e2eRaiseLevel(): Promise<boolean> {\n  const root = e2eRoot.value;\n  const fmk = root ? e2eRing.get(root) : undefined;\n  let marker = e2eMarker.value;\n  if (!root || !fmk || !marker || e2eNamesBusy.value) return false;\n  showE2eSettings.value = false;\n  e2eNamesBusy.value = true;\n  e2eNamesErr.value = '';\n  e2eNamesStop = false;\n  try {\n    if (!markerHasNames(marker)) {\n      const started = await enableNames(marker, fmk);\n      await e2eWriteMarker(started.marker);\n      e2eRing.setNames(root, started.names);\n      e2eRingVer.value++;\n      marker = started.marker;\n    }\n    const nk = e2eRing.names(root);\n    if (!nk) throw new Error('e2e: the folder name key is missing');\n    e2eNamesProgress.value = { renamed: 0, failed: 0, seen: 0 };\n    const prog = e2eNamesProgress.value;\n    await runNamePass(nk, root, {\n      list: async (dir) => (await api.index(dir)).files ?? [],\n      readSidecar: async (dir, name) => {\n        try {\n          return new TextDecoder().decode(await api.fetchArrayBuffer(wireJoinPath(dir, name)));\n        } catch {\n          return null;\n        }\n      },\n      writeSidecar: async (dir, name, content) => {\n        await api.uploadMultipart(dir, [new File([content], name, { type: 'text/plain' })]);\n      },\n      // A folder rename is a job of the queue where the server has one: the\n      // queue keeps order, so a folder is renamed after its contents.\n      rename: async (dir, row, to) => {\n        if (row.type === 'dir' && serverQueues('rename')) {\n          const job = (await api.renameQueued(dir, row.path, to)).op;\n          if (job) pendingOps.register(job);\n        } else {\n          await api.rename(dir, row.path, to);\n        }\n      },\n      stopped: () => e2eNamesStop,\n    }, prog);\n    if (e2eNamesStop) {\n      flashToast(t('e2e.names.stopped', { n: prog.renamed }));\n      return false;\n    }\n    if (prog.failed > 0) {\n      e2eNamesErr.value = t('e2e.names.partial', { n: prog.failed });\n      return false;\n    }\n    // The marker as it is NOW (a conversion may have written it meanwhile).\n    const current = e2eMarker.value ?? marker;\n    if (current.names?.pending) await e2eWriteMarker(finishNames(current));\n    e2eNamesProgress.value = null;\n    flashToast(t('e2e.names.done', { n: prog.renamed }));\n    return true;\n  } catch (err) {\n    e2eNamesErr.value = t('e2e.names.failed');\n    emit('error', { message: (err as Error).message, context: { op: 'e2e-names' } });\n    return false;\n  } finally {\n    e2eNamesBusy.value = false;\n    await load();\n  }\n}\n\n/* --- wiring:e2 convert --------------------------------------------------\n *\n * Encrypting a folder that already exists, in place (docs/E2E-ENCRYPTION.md →\n * \"Encrypting a folder you already have\"). The same dialog as creating one\n * (EncryptedFolderModal, `existing`), then:\n *\n *   1. the key file is written FIRST, conversion pending (`conv`, and at level\n *      2 the names pending too) — from then on the server treats the folder\n *      as encrypted, and the password opens it;\n *   2. every file is encrypted over itself (lib/e2econvert), each write one\n *      the server keeps no plaintext version of; resumable by the magic;\n *   3. at level 2 the names pass (e2eRaiseLevel) renames what is there;\n *   4. the key file drops `conv`, and what filex holds from before goes:\n *      thumbnails and extracted content always, versions and trash entries\n *      as chosen in the dialog (recorded in the key file, so a resumed run\n *      honours the same choice).\n */\nconst e2eConvTarget = ref<FileNode | null>(null);\nconst e2eConvRunning = ref(false);\nconst e2eConvErr = ref('');\nconst e2eConvProgress = ref<ConvertProgress | null>(null);\nlet e2eConvStop = false;\nlet e2eConvAbort: AbortController | null = null;\n/** The large file being converted right now, and how far its upload is. */\nconst e2eConvLarge = ref<{ name: string; percent: number } | null>(null);\nconst e2eConvPending = computed(() => {\n  void e2eRingVer.value;\n  return conversionPending(e2eMarker.value);\n});\n\n/** A plain folder this person can write, not inside or itself an encrypted one. */\nfunction e2eCanConvert(sel: FileNode[], writable: boolean): boolean {\n  const n = sel.length === 1 ? sel[0] : null;\n  return (\n    !!n &&\n    n.type === 'dir' &&\n    writable &&\n    !e2eActive.value &&\n    !n.e2e &&\n    !n.e2e_root &&\n    !trashActive.value &&\n    typeof crypto !== 'undefined' &&\n    !!crypto.subtle\n  );\n}\n\n/** wiring:e2 policy — a folder `e2eCanConvert` accepts, whose answer is `want`. */\nfunction e2eConvertAnswerIs(sel: FileNode[], writable: boolean, want: E2eAnswer): boolean {\n  return e2eCanConvert(sel, writable) && e2eAnswerAt(sel[0].path, 'folder') === want;\n}\n\nfunction e2eOpenConvert(n: FileNode) {\n  e2eConvTarget.value = n;\n  showEncFolder.value = true;\n}\n\n/** Any encrypted folder inside `root`? Encrypted folders do not nest. */\nasync function e2eConvFindNested(root: string): Promise<boolean> {\n  const queue = [root];\n  while (queue.length) {\n    const dir = queue.shift()!;\n    const res = await api.index(dir);\n    if (dir !== root && typeof res.e2e_root === 'string' && res.e2e_root) return true;\n    for (const f of res.files ?? []) {\n      if (f.type !== 'dir') continue;\n      if (f.e2e) return true;\n      queue.push(f.path);\n    }\n  }\n  return false;\n}\n\nasync function submitConvertFolder(payload: {\n  name: string;\n  password: string;\n  level?: ChoosableLevel;\n  cleanup?: { versions: boolean; trash: boolean };\n}) {\n  const target = e2eConvTarget.value;\n  if (!target) return;\n  const root = target.path;\n  e2eCreateBusy.value = true;\n  try {\n    if (await e2eConvFindNested(root)) {\n      flashToast(t('e2e.convert.nested'));\n      return;\n    }\n    const made = await createEncryptedFolder(payload.password, { escrowPublicKey: e2eEscrowPub.value });\n    let marker = made.marker;\n    let names = null;\n    if (payload.level === 'names') {\n      const started = await enableNames(marker, made.fmk);\n      marker = started.marker;\n      names = started.names;\n    }\n    marker = startConversion(marker, undefined, payload.cleanup ?? { versions: false, trash: false });\n    await api.uploadMultipart(root, [\n      new File([JSON.stringify(marker)], E2E_MARKER_NAME, { type: 'application/json' }),\n    ]);\n    // Unlocked in this tab from the start: they just typed the password.\n    e2eRing.set(root, made.fmk, names);\n    e2eNames.setMarker(root, marker);\n    e2eRingVer.value++;\n    showEncFolder.value = false;\n    e2eConvTarget.value = null;\n    // ⚠ The key after the key file is safely written, as when creating.\n    recoveryKeyValue.value = made.recoveryKey;\n    recoveryKeyFolder.value = payload.name;\n    recoveryKeyVariant.value = 'created';\n    showRecoveryKey.value = true;\n    await load(paneToUser(root));\n    await nextTick();\n    // The watch on e2eRoot fills the marker in its own tick; this run must not\n    // depend on which came first.\n    if (e2eRoot.value === root) {\n      e2eMarker.value = marker;\n      void e2eRunConversion();\n    }\n  } catch (err) {\n    emit('error', { message: (err as Error).message, context: { op: 'e2e-convert' } });\n    showToast({ message: failureText(err, t('e2e.convert.failed')) }, ERROR_TOAST_MS);\n  } finally {\n    e2eCreateBusy.value = false;\n  }\n}\n\n/** Steps 2–4, for the folder the main pane is in. Resumes where it stopped. */\nasync function e2eRunConversion() {\n  const root = e2eRoot.value;\n  const fmk = root ? e2eRing.get(root) : undefined;\n  const marker = e2eMarker.value;\n  if (!root || !fmk || !marker || !conversionPending(marker) || e2eConvRunning.value) return;\n  e2eConvRunning.value = true;\n  e2eConvErr.value = '';\n  e2eConvStop = false;\n  /* wiring:e2 convert - Stop also ends a large file's upload in flight; its\n     plaintext stays whole on the server until a write commits. */\n  const abort = new AbortController();\n  e2eConvAbort = abort;\n  e2eConvProgress.value = { total: 0, done: 0, skipped: 0, tooBig: 0, failed: 0 };\n  const prog = e2eConvProgress.value;\n  try {\n    await runConversion(\n      root,\n      {\n        list: async (dir) => (await api.index(dir)).files ?? [],\n        head: (wire) => api.fetchHead(wire, 16),\n        read: (wire) => api.fetchArrayBuffer(wire),\n        write: async (dir, row, data, expect) => {\n          await api.uploadMultipart(\n            dir,\n            [new File([data], row.basename, { type: 'application/octet-stream' })],\n            undefined,\n            { e2e_convert: '1', ...(expect ? { expect } : {}) },\n          );\n        },\n        encrypt: (data) => encryptFile(fmk, data),\n        /* wiring:e2 convert - over 200 MB: STREAM (0x02), streamed both ways. */\n        writeLarge: async (_dir, row, expect) => {\n          e2eConvLarge.value = { name: row.basename, percent: 0 };\n          try {\n            return await e2eFiles.convertLarge(row, fmk, expect, {\n              signal: abort.signal,\n              onProgress: (f) => {\n                e2eConvLarge.value = { name: row.basename, percent: Math.floor(f * 100) };\n              },\n            });\n          } finally {\n            e2eConvLarge.value = null;\n          }\n        },\n        stopped: () => e2eConvStop,\n      },\n      prog,\n      { maxBytes: E2E_MAX_FILE_BYTES },\n    );\n    if (e2eConvStop) {\n      flashToast(t('e2e.convert.stopped', { n: prog.done }));\n      return;\n    }\n    if (prog.tooBig > 0 && prog.failed === 0) {\n      e2eConvErr.value = t('e2e.convert.too_large_here', { n: prog.tooBig });\n      return;\n    }\n    if (prog.failed + prog.tooBig > 0) {\n      e2eConvErr.value = t('e2e.convert.partial', { n: prog.failed + prog.tooBig });\n      return;\n    }\n    // Level 2: the names, now that every file is ciphertext.\n    if (e2eMarker.value?.names?.pending && !(await e2eRaiseLevel())) return;\n    const current = e2eMarker.value ?? marker;\n    const cleanup = current.conv?.cleanup;\n    await e2eWriteMarker(finishConversion(current));\n    e2eConvProgress.value = null;\n    try {\n      const out = await api.e2eCleanup({ path: root, versions: !!cleanup?.versions, trash: !!cleanup?.trash });\n      flashToast(\n        t('e2e.convert.done', {\n          n: prog.done + prog.skipped,\n          versions: out.versions_deleted,\n          trash: out.trash_purged,\n        }),\n      );\n    } catch (err) {\n      flashToast(t('e2e.convert.cleanup_failed'));\n      emit('error', { message: (err as Error).message, context: { op: 'e2e-convert-cleanup' } });\n    }\n  } catch (err) {\n    e2eConvErr.value = failureText(err, t('e2e.convert.failed'));\n    emit('error', { message: (err as Error).message, context: { op: 'e2e-convert' } });\n  } finally {\n    e2eConvRunning.value = false;\n    e2eConvAbort = null;\n    await load();\n  }\n}\n\n/** The strip's Stop: between files, and a large file's upload in flight. */\nfunction e2eStopConversion() {\n  e2eConvStop = true;\n  e2eConvAbort?.abort();\n}\n\n/** From the settings: the password dialog, or the escrow way back. */\nfunction e2eSettingsPassword() {\n  showE2eSettings.value = false;\n  e2eOpenPasswordChange('change');\n}\nfunction e2eSettingsEscrow() {\n  showE2eSettings.value = false;\n  e2eOpenEscrowOffer();\n}\n\n/* --- wiring:e2 password -------------------------------------------------\n *\n * Changing an encrypted folder's password (docs/E2E-ENCRYPTION.md →\n * \"Changing the password\"). The crypto is lib/e2ecrypto (`changePassword`,\n * `startRekey`, `rewrapFileKey`, `finishRekey`); the dialog is\n * E2eChangePasswordModal. What lives here:\n *\n *   - the order of writes: the key file first, THEN the announcement (the\n *     server records it and tells the owner), THEN — for a re-key — the\n *     re-wrap of every file, which is resumable because the marker already\n *     holds the previous folder key;\n *   - the reset after a recovery-key unlock: the key used is kept in memory\n *     only for this, and closing the dialog locks the folder.\n */\nconst showPwChange = ref(false);\nconst pwMode = ref<'change' | 'reset'>('change');\nconst pwBusy = ref(false);\nconst pwErr = ref<string | null>(null);\n/** The recovery key that just unlocked the folder, for the forced reset. */\nlet e2eRecoveryInHand: string | null = null;\n/** Re-wrap in progress (a re-key), and what it has done so far. */\nconst e2eRekeyBusy = ref(false);\nconst e2eRekeyErr = ref('');\nconst e2eRekeyProgress = ref<{ done: number; failed: number } | null>(null);\n\nconst e2eRekeyPending = computed(() => {\n  void e2eRingVer.value;\n  return rekeyPending(e2eMarker.value);\n});\nconst e2ePwNeedsRekey = computed(() => !!e2eMarker.value && passwordChangeNeedsRekey(e2eMarker.value));\n\nfunction e2eOpenPasswordChange(mode: 'change' | 'reset') {\n  pwMode.value = mode;\n  pwErr.value = null;\n  showPwChange.value = true;\n}\n\n/** × on the dialog. In 'reset' mode that is \"lock the folder instead\". */\nfunction e2eClosePasswordChange() {\n  if (pwBusy.value) return;\n  if (pwMode.value === 'reset') {\n    e2eLock();\n    return;\n  }\n  showPwChange.value = false;\n}\n\nasync function e2eSubmitPassword(payload: E2eChangePasswordPayload) {\n  const root = e2eRoot.value;\n  const marker = e2eMarker.value;\n  if (!root || !marker || pwBusy.value) return;\n  const cred: E2eCredential | null =\n    payload.proof ?? (e2eRecoveryInHand ? { recoveryKey: e2eRecoveryInHand } : null);\n  if (!cred) {\n    pwErr.value = t('e2e.password.current_required');\n    return;\n  }\n  const via: 'password' | 'recovery_key' = 'recoveryKey' in cred ? 'recovery_key' : 'password';\n  pwBusy.value = true;\n  pwErr.value = null;\n  try {\n    if (!payload.rotate) {\n      const next = await changePassword(marker, cred, payload.newPassword);\n      await e2eWriteMarker(next);\n      e2eRecoveryInHand = null;\n      showPwChange.value = false;\n      /* Nothing to announce: the server sees the key file rewritten, records\n         the change and tells the folder's owner itself (e2e/slotchange). */\n      flashToast(t('e2e.password.done'));\n      return;\n    }\n    // A re-key: the key file first (new folder key, previous one sealed\n    // inside it), then the keys in memory, then the recovery key if a new\n    // one was issued, then the file keys.\n    const start = await startRekey(marker, cred, payload.newPassword, {\n      escrowPublicKey: e2eEscrowPub.value,\n    });\n    await e2eWriteMarker(start.marker);\n    // A pre-0.31 folder's \"add a recovery key\" offer is moot now: the re-key\n    // gave it a recovery key (and a folder key of its own).\n    e2eUpgradeOffer.value = false;\n    e2eUpgradePw.value = '';\n    e2eRing.set(root, start.fmk, start.names ?? e2eRing.names(root) ?? null, start.previous);\n    e2eRingVer.value++;\n    e2eRevokeAll();\n    e2eRecoveryInHand = null;\n    showPwChange.value = false;\n    if (start.recoveryKeyIsNew) {\n      recoveryKeyValue.value = start.recoveryKey;\n      recoveryKeyFolder.value = wireBasename(root);\n      recoveryKeyVariant.value = 'replaced';\n      showRecoveryKey.value = true;\n    }\n    await e2eRunRekey();\n  } catch (err) {\n    if (err instanceof E2eDecryptError) {\n      pwErr.value = via === 'recovery_key' ? t('e2e.password.wrong_recovery') : t('e2e.password.wrong_current');\n    } else if (err instanceof E2eRekeyEscrowError) {\n      pwErr.value = t('e2e.password.escrow_blocked');\n    } else {\n      pwErr.value = t('e2e.password.failed');\n      emit('error', { message: (err as Error).message, context: { op: 'e2e-password' } });\n    }\n  } finally {\n    pwBusy.value = false;\n  }\n}\n\n/** One file, back where it was, under the same stored name. */\nasync function e2eWriteBack(dir: string, name: string, bytes: ArrayBuffer): Promise<void> {\n  const file = new File([bytes], name, { type: 'application/octet-stream' });\n  if (chunked.shouldChunk(file)) {\n    await chunked.uploadFile({ path: dir, file });\n    return;\n  }\n  await api.uploadMultipart(dir, [file]);\n}\n\n/** The re-wrap pass: every encrypted file under `dir`, children first. A file\n *  already under the new key is skipped (rewrapFileKey answers null), so\n *  running it again after an interruption finishes the job. */\nasync function e2eRekeyPass(dir: string, previous: CryptoKey, fmk: CryptoKey): Promise<void> {\n  const prog = e2eRekeyProgress.value!;\n  let res: ManagerResponse;\n  try {\n    res = await api.index(dir);\n  } catch {\n    prog.failed++;\n    return;\n  }\n  for (const row of res.files ?? []) {\n    if (row.basename === E2E_MARKER_NAME) continue;\n    if (row.type === 'dir') {\n      await e2eRekeyPass(row.path, previous, fmk);\n      continue;\n    }\n    try {\n      /* wiring:e2 stream — a large file is re-wrapped from its header; its\n         body is re-sent unread instead of being held in memory. */\n      if ((row.size ?? 0) > E2E_MAX_FILE_BYTES) {\n        if (await e2eFiles.rewrapLarge(row, previous, fmk)) prog.done++;\n        continue;\n      }\n      const data = await api.fetchArrayBuffer(row.path);\n      if (!hasMagic(data)) continue; // never encrypted (a DAV write, a sidecar)\n      const out = await rewrapFileKey(data, previous, fmk);\n      if (out) await e2eWriteBack(dir, row.basename, out);\n      prog.done++;\n    } catch {\n      prog.failed++;\n    }\n  }\n}\n\n/** Run (or resume) the re-wrap; on success drop the previous key from the\n *  key file and from memory. */\nasync function e2eRunRekey() {\n  const root = e2eRoot.value;\n  const fmk = root ? e2eRing.get(root) : undefined;\n  const previous = root ? e2eRing.previous(root) : undefined;\n  if (!root || !fmk || !previous || e2eRekeyBusy.value) return;\n  e2eRekeyBusy.value = true;\n  e2eRekeyErr.value = '';\n  e2eRekeyProgress.value = { done: 0, failed: 0 };\n  try {\n    await e2eRekeyPass(root, previous, fmk);\n    const prog = e2eRekeyProgress.value;\n    if (prog.failed > 0) {\n      e2eRekeyErr.value = t('e2e.password.rekey_partial', { n: prog.failed });\n      return;\n    }\n    const marker = e2eMarker.value;\n    if (marker && rekeyPending(marker)) await e2eWriteMarker(finishRekey(marker));\n    e2eRing.dropPrevious(root);\n    e2eRingVer.value++;\n    flashToast(t('e2e.password.rekey_done', { n: prog.done }));\n  } catch (err) {\n    e2eRekeyErr.value = t('e2e.password.failed');\n    emit('error', { message: (err as Error).message, context: { op: 'e2e-rekey' } });\n  } finally {\n    e2eRekeyBusy.value = false;\n    await load();\n  }\n}\n\n/* --- wiring:e2 fxe ------------------------------------------------------\n *\n * Single encrypted files (`.fxe`) and the streamed paths of encrypted\n * folders — docs/E2E-ENCRYPTION.md → \"Single encrypted files\", \"Streaming\n * content\", \"Downloading a decrypted copy\". The work is in\n * composables/useE2eFiles; this block lends it the explorer.\n */\n\n\n/** `path` without trailing slashes, for comparing wire paths. */\nfunction e2eTrimWire(path: string): string {\n  return path.replace(/\\/+$/, '');\n}\n\n/** The ring's root for a row that IS an unlocked encrypted folder, or null. */\nfunction e2eUnlockedRootRow(n: FileNode | undefined): string | null {\n  if (!n || n.type !== 'dir' || n.e2e !== true) return null;\n  const want = e2eTrimWire(n.path);\n  return e2eRing.roots().find((r) => e2eTrimWire(r) === want) ?? null;\n}\n\n/**\n * \"Download\", when this tab holds the key: a `.fxe` decrypts, a file of an\n * unlocked encrypted folder streams decrypted, and folders or several items\n * become a zip of plaintext made here. False: not ours, the server's\n * download applies.\n */\nasync function e2eDownloadDecrypted(targets: FileNode[]): Promise<boolean> {\n  const single = targets.length === 1 ? targets[0] : null;\n  if (single && isFxeRow(single) && !e2eActive.value && !single.e2e_root) {\n    await e2eFiles.download(single);\n    return true;\n  }\n  let root: string | null = null;\n  if (e2eUnlocked.value) root = e2eRoot.value;\n  else if (single) root = e2eUnlockedRootRow(single);\n  if (!root && targets.length > 0) {\n    // Rows from the split pane, Recent or Starred: their own encrypted root,\n    // when every one of them sits in the same unlocked folder.\n    const roots = targets.map((n) => e2eNames.rootOf(n.path, n.e2e_root ?? null));\n    const first = roots[0];\n    if (first && roots.every((r) => r === first)) {\n      root = e2eRing.roots().find((r) => e2eTrimWire(r) === e2eTrimWire(first)) ?? null;\n    }\n  }\n  if (!root) return false;\n  const fmk = e2eRing.get(root);\n  if (!fmk) return false;\n  if (single && single.type === 'file') {\n    await e2eFiles.downloadFolderFile(single, fmk, e2eRing.previous(root), root);\n    return true;\n  }\n  const here = e2eNames.segmentLabel(qualify(currentPath.value)) ?? wireBasename(qualify(currentPath.value));\n  const zipName = `${single ? single.basename : here || 'filex'}.zip`;\n  await e2eFiles.downloadDecryptedZip(targets, {\n    root,\n    fmk,\n    previous: e2eRing.previous(root),\n    decorate: (rows, o) => e2eNames.decorate(rows, o),\n    zipName,\n  });\n  return true;\n}\n\n/** The too-big dialog's way out (E2eTooBigModal): the encrypted bytes as the\n *  server has them — the `.fxe` itself, or the encrypted folder as a zip,\n *  which carries its key file — for `filex decrypt` on the person's computer. */\nfunction e2eDownloadEncryptedInstead() {\n  const info = e2eFiles.tooBig.value;\n  e2eFiles.closeTooBig();\n  if (!info) return;\n  if (info.encrypted.kind === 'file') {\n    window.open(api.downloadUrl(info.encrypted.path), '_blank');\n    return;\n  }\n  const folder: FileNode = { path: info.encrypted.path, basename: wireBasename(info.encrypted.path), type: 'dir' };\n  void downloadSelection([folder], { encrypted: true });\n}\n/* === /wiring:e2 fxe === */\n\n/** Drop the shown-once key from memory the moment its dialog closes. */\nfunction closeRecoveryKey() {\n  showRecoveryKey.value = false;\n  recoveryKeyValue.value = '';\n  recoveryKeyFolder.value = '';\n}\n/* === /wiring:e2 === */\n</script>\n\n<template>\n  <div\n    ref=\"rootEl\"\n    class=\"fe\"\n    :dir=\"dir\"\n    :class=\"{\n      'fe--theme-light': themeMode === 'light',\n      'fe--theme-dark': themeMode === 'dark',\n      'fe--is-dragover': dragOver,\n      'fe--density-compact': density === 'compact' /* cila:a density */,\n      'fe--narrow': isNarrow /* bag:b4 */,\n    }\"\n    tabindex=\"-1\"\n    @dragenter=\"onDragEnter\"\n    @dragover=\"onDragOver\"\n    @dragleave=\"onDragLeave\"\n    @drop=\"onDropUpload\"\n    @contextmenu=\"onContextCanvas\"\n  >\n    <!-- wiring:d1 — the tab strip used to be the explorer's first row, above\n         the header and spanning the sidebar too.\n         gorunum:v2-topbar — it then moved under the breadcrumb, INSIDE the\n         left pane.\n         gorunum:v5-panestack — and it is out again, one level up: a tab is a\n         location the WINDOW is showing and the split happens within it, so the\n         strip spans both panes and each pane carries only its own address.\n         See `.fe__stack` below. -->\n    <Toolbar\n      ref=\"toolbarRef\"\n      :view-mode=\"displayedViewMode /* ui-fix — the active pane's mode */\"\n      :search-query=\"searchQuery\"\n      :trash-active=\"trashActive\"\n      :actions=\"toolbarActions\"\n      :selection-mode=\"selectionMode\"\n      :selection-count=\"activeTargets().length /* gorunum:v1 — the count the\n           selection bar prints. Without it the toolbar counted the ticked rows by\n           watching the DOM, which is a second source of truth for something the\n           parent already knows.\n           pane:p1 — and it is the ACTIVE pane's count, so the number and the\n           bar's position can never describe two different panes. */\"\n      :selection-pane=\"activePaneId /* pane:p1 — which half the bar mounts into */\"\n      :paste-enabled=\"!!clipboard.mode\"\n      :can-go-up=\"canGoUp\"\n      :at-virtual-root=\"atVirtualRoot\"\n      :can-write=\"canWriteHere\"\n      :locale=\"locale\"\n      :narrow=\"isNarrow /* bag:b4 */\"\n      :theme=\"themeMode /* bag:b4 */\"\n      :inspector-open=\"showInspector /* koru:k1 */\"\n      :nav-open=\"navToggleOn /* gezinti:g1 */\"\n      :nav-enabled=\"sideNavEnabled /* gezinti:g1 */\"\n      :view-modes=\"allowedViewModes /* gezinti:g1 */\"\n      :scope-label=\"driveScopeLabel /* surucu:d1 */\"\n      :brand-name=\"config.brand?.name /* gorunum:v3-shell */\"\n      :brand-mark-url=\"config.brand?.markUrl /* gorunum:v3-shell */\"\n      :search-escalates=\"navView === 'home' /* gorunum:v3-shell */\"\n      @open-palette=\"openPaletteWith /* surucu:d1 */\"\n      @toggle-inspector=\"toggleInspector /* koru:k1 */\"\n      @toggle-nav=\"toggleSideNav /* gezinti:g1 */\"\n      @open-theme=\"showThemeGallery = true /* wiring:c1 */\"\n      @update:view-mode=\"setDisplayedViewMode($event) /* ui-fix — to the active pane */\"\n      @update:search-query=\"onToolbarSearch /* gorunum:v1-advsearch */\"\n      @open-advanced-search=\"openAdvancedSearch /* gorunum:v1-advsearch */\"\n      @update:density=\"density = $event\"\n      @open-shortcut-settings=\"showShortcutSettings = true /* wiring:c2 */\"\n      @open-timezone=\"showTimeZone = true /* zaman:z3 */\"\n      @new-folder=\"showNewFolder = true\"\n      @upload=\"triggerUpload\"\n      @refresh=\"refreshAll /* gorunum:v2-topbar */\"\n      @go-up=\"goUp\"\n      @action=\"onToolbarAction\"\n      @open-recents=\"showRecents = true\"\n    >\n      <!-- gorunum:v3-shell — the host's product mark, at the far left of the\n           top bar beside the panel's collapse control. Passed straight\n           through: this package has no branding of its own and must not grow\n           any.\n           ⚠⚠ `v-if=\"$slots.brand\"` is load-bearing, not tidiness. Declaring\n           this template unconditionally would hand Toolbar a `brand` slot on\n           every mount — an EMPTY one for a host that filled nothing — and a\n           slot that exists always is a slot whose fallback content never\n           renders. That fallback is `config.brand`, and it is the only door a\n           `<filex-explorer>` host has (slots do not reach a Vue custom\n           element at all; see ExplorerConfig.brand for the measurement). So:\n           slot when there is one, config otherwise. -->\n      <template v-if=\"$slots.brand\" #brand><slot name=\"brand\"></slot></template>\n      <!-- gorunum:v2-topbar — the host's account-level doors (admin panel,\n           settings, sign out), passed straight through. The explorer knows\n           nothing about them and must not: they are the EMBEDDER's chrome,\n           and an embed with none renders an empty cluster. -->\n      <template #header-actions>\n        <!-- The bell and the avatar, for a host that cannot fill this slot\n             (config.notifications / config.account — the desktop app). The\n             web's components, not a copy; the bell sits to the LEFT of the\n             avatar, where the web page puts it. -->\n        <NotificationBell\n          v-if=\"notifFeed\"\n          :feed=\"notifFeed\"\n          :locale=\"locale\"\n          :manage-href=\"notifManageHref\"\n          @open=\"onNotificationOpen\"\n          @manage=\"onNotifManage\"\n        />\n        <AccountMenu\n          v-if=\"config.account\"\n          :actions=\"accountRows\"\n          :user=\"accountPerson\"\n          :version=\"capabilitiesData?.release\"\n          :locale=\"locale\"\n          :fallback-label=\"t('explore.account')\"\n          @select=\"onAccountSelect\"\n        />\n        <slot name=\"header-actions\"></slot>\n      </template>\n    </Toolbar>\n\n    <!-- koru:k1 — fe__main lays the listing body and the inspector panel out\n         as flex siblings (row). Without the inspector open it is visually\n         identical to the previous direct-child fe__body. -->\n    <div class=\"fe__main\" :class=\"{ 'fe__main--split': splitVisible } /* wiring:d1 */\">\n    <!-- gezinti:g1 — navigation panel. First child of fe__main, the mirror of\n         InspectorPanel on the right; .fe__primary already carries\n         `flex: 1 1 auto; min-width: 0` so it absorbs the width with no rule of\n         its own. Wide: a docked column (or a 56px icon rail when collapsed).\n         Narrow: a drawer over the listing, because a column at 390px leaves\n         the files 158px. -->\n    <SideNav\n      v-if=\"navVisible\"\n      :expanded=\"sideNavExpanded\"\n      :narrow=\"isNarrow\"\n      :active-view=\"navView\"\n      :active-tag=\"navTag\"\n      :active-tag-kind=\"navTagKind\"\n      :tags=\"navTags\"\n      :tags-loaded=\"navTagsLoaded\"\n      :active-storage=\"adapter\"\n      :storages=\"navStorages /* #57 — in the person's order */\"\n      :storage-order-custom=\"storageOrder.custom.value\"\n      @reorder-storages=\"onReorderStorages\"\n      :shared-storages=\"sharedStorageNames\"\n      :trash-visible=\"config.trashVisible !== false\"\n      :drafts-visible=\"draftsEnabled && identitySurfaces /* Drafts, issue #71 */\"\n      :draft-count=\"draftCount\"\n      :show-connections=\"connectionsEnabled\"\n      :show-my-shares=\"mySharesEnabled /* paylas:m1 — off unless the host has the page */\"\n      :show-identity-surfaces=\"identitySurfaces\"\n      :can-write=\"canWriteHere && !atVirtualRoot && !trashActive\"\n      :locale=\"locale\"\n      :can-request-files=\"canWriteHere && !atVirtualRoot && !trashActive && !navView && !e2eActive /* surucu:d1; wiring:e2 — a visitor's upload would land in the clear */\"\n      :request-files-allowed=\"requestFilesHeld /* share.upload_links — not offered at all without it */\"\n      :can-new-document=\"canNewDocument && !trashActive && !navView && !e2eActive /* belge:n1; wiring:e2 — the server writes the template in the clear */\"\n      @new-document=\"showNewDocument = true\"\n      :quota=\"quotaSnapshot /* surucu:d1 */\"\n      :theme=\"themeMode /* surucu:d1 — the teleported New menu leaves .fe */\"\n      @request-files=\"openFileRequest /* surucu:d1 */\"\n      @toggle=\"toggleSideNav\"\n      @close=\"closeNavDrawer\"\n      @open-view=\"openNavDest /* gorunum:v3-shell */\"\n      @open-tag=\"loadTagView\"\n      @open-storage=\"openNavStorage\"\n      @upload=\"triggerUpload\"\n      @new-folder=\"showNewFolder = true\"\n      @open-connections=\"openConnections\"\n      @open-tokens=\"openTokens\"\n      @open-my-shares=\"emit('open-my-shares') /* paylas:m1 — the host owns the page */\"\n      :show-app-store=\"appStoreEnabled /* #162 - off unless the host has the store screen */\"\n      @open-app-store=\"emit('open-app-store')\"\n      :apps=\"pluginHomeApps /* App plugins — the home views */\"\n      @open-app=\"openPluginHome\"\n    />\n    <!-- The drawer's scrim. A button, not a div: dismissing an overlay by\n         clicking beside it has to be reachable from the keyboard too. -->\n    <button\n      v-if=\"isNarrow && navDrawerOpen\"\n      type=\"button\"\n      class=\"fe-sidenav__scrim\"\n      :title=\"t('sidenav.close')\"\n      :aria-label=\"t('sidenav.close')\"\n      @click=\"closeNavDrawer\"\n    ></button>\n    <!-- gorunum:v5-panestack / pane:p1 — THE TAB STRIP BELONGS TO THE WINDOW,\n         and BOTH halves below it are the SAME component.\n\n         Owner's decision, 2026-09-13: *\"tab içinde split yapman lazım, dışında\n         yapıyorsun\"* — a tab is a location the window is showing, and the split\n         happens WITHIN that location. So: top bar, then the strip full width,\n         then the panes. The strip used to render inside the left half, which\n         made the left pane carry the window's chrome and the right one read as\n         an afterthought.\n\n         And the second half of the same ruling: *\"split pane ile gelen yeni\n         pane aslında yandaki pane ile birebir olması lazım\"*. There is now ONE\n         `FilePane`, rendered twice. Everything a listing has — the crumbs, the\n         filter row, the sort control, the view switcher, the selection-bar\n         slot, the states, the column menu — is defined once, in that file, so\n         a feature added to a pane cannot miss the other pane. -->\n    <div class=\"fe__stack\">\n    <TabBar\n      v-if=\"paneRowVisible\"\n      :tabs=\"tabItems\"\n      :active-id=\"tabsActiveId\"\n      :locale=\"locale\"\n      :hide-tabs=\"!tabsVisible /* gorunum:v5-panerow — the row stays for the\n             split and details toggles even where tabs are not offered */\"\n      :split-enabled=\"splitOffered /* the pane's own gate — see splitOffered */\"\n      :split-active=\"!!activeSplit\"\n      :inspector-enabled=\"infoPanelToggle\"\n      :inspector-open=\"showInspector\"\n      @select=\"activateTab\"\n      @close=\"closeTabById\"\n      @new=\"newTabHere\"\n      @reorder=\"(from: number, to: number) => tabsApi.move(from, to)\"\n      @toggle-split=\"toggleSplit\"\n      @toggle-inspector=\"toggleInspector\"\n    />\n    <div class=\"fe__panes\">\n\n    <!-- pane:p1 — the main pane. HOST-DRIVEN (`self-driven` absent): its rows\n         come from `load()`, which also answers a search, the trash, the\n         panel's virtual views and an encrypted folder. Those are states the\n         WINDOW is in, so the three of them that have no listing behind them\n         arrive through the `body` slot and the rest through `empty`. -->\n    <FilePane\n      pane-id=\"main\"\n      ref=\"mainPaneRef\"\n      :api=\"paneApi /* wiring:e2 vault — folder previews inside a vault come from its index */\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :focused=\"mainPaneFocus\"\n      :path=\"currentPath\"\n      :qualify=\"qualify\"\n      :to-user=\"paneToUser\"\n      :clamp=\"paneClamp\"\n      :root-path=\"rootPathProp\"\n      :floor=\"rootFloor\"\n      :multi-root=\"multiStorageRoot\"\n      :rows=\"files\"\n      :loading=\"loading\"\n      :error=\"loadError\"\n      :order=\"listingOrder\"\n      :view-mode=\"viewMode\"\n      :view-modes=\"allowedViewModes\"\n      :open-trigger=\"props.config.openTrigger\"\n      :show-crumbs=\"navView !== 'home' /* Home has no address: its cards come\n             from every folder in every storage, so a trail would have to name\n             one */\"\n      :filter-mode=\"filterRowMode /* `show-filter-bar` is NOT passed: the row is\n             drawn in every view now, so the default (true) is the answer and a\n             prop repeating it would be a second place to forget. */\"\n      :find-label=\"navView === 'home' ? t('filter.find.home') : ''\"\n      :show-view-switcher=\"navView !== 'home'\"\n      :folder-key=\"currentFolderKey\"\n      :show-parent-path=\"!!searchQuery || crossFolderView\"\n      :trash=\"trashActive\"\n      :clipped=\"clippedPaths\"\n      :extra-filters=\"advFilters\"\n      :extra-filters-on-server=\"!searchRanLocally\"\n      :can-write=\"canWriteHere && !trashActive\"\n      :can-paste=\"!!clipboard.mode\"\n      :selected=\"selection.selected.value\"\n      :filters=\"driveFilters\"\n      :thumb-src=\"thumbs.src\"\n      :folder-previews=\"capabilitiesData?.folder_previews !== false\"\n      :keep-badge-for=\"desktopSync ? keepBadgeFor : undefined\"\n      :starred-ids=\"starredIds\"\n      :star-overrides=\"starOverrides\"\n      :star-enabled=\"identitySurfaces\"\n      :api-base=\"props.config.apiBase ?? ''\"\n      :auth-headers=\"() => buildAuthHeaders()\"\n      :auth-credentials=\"api.credentialsMode()\"\n      :e2e-active=\"e2eActive\"\n      :body-override=\"hostBodyState !== ''\"\n      @activate=\"setPaneMain\"\n      @navigate=\"onNavigate\"\n      @open=\"openNode\"\n      @open-trash=\"() => loadTrash()\"\n      @click-row=\"(n, m) => onPaneClickRow('main', n, m)\"\n      @context=\"(n: FileNode | null, ev: MouseEvent) => onPaneMenu('main', n, ev)\"\n      @clear-selection=\"selection.clear()\"\n      @display-order=\"(nodes: FileNode[]) => (displayOrder = nodes)\"\n      @item-drag-start=\"(n: FileNode, ev: DragEvent) => onPaneItemDragStart('main', n, ev)\"\n      @item-drop-into=\"onItemDropInto\"\n      @transfer=\"onPaneTransfer\"\n      @update:view-mode=\"(v: ViewMode) => (viewMode = v)\"\n      @update:filters=\"setDriveFilters\"\n      @crumb-context=\"onCrumbContext\"\n      @copy-path=\"onCopyPath\"\n      @crumb-drop=\"onCrumbDropInto\"\n      @new-folder=\"showNewFolder = true\"\n      @upload=\"triggerUpload\"\n      @paste=\"onToolbarAction('paste') /* surucu:d1-actions — through the SAME\n             handler the right-click menu and the toolbar use */\"\n      @select-all=\"selection.selectAll()\"\n      @clear-filters=\"clearDriveFilters\"\n      @star-change=\"onStarChange\"\n      @retry=\"retryLoad\"\n    >\n      <!-- ⚠ NO `#heading` for Home, and the empty address row it used to live\n           on is not drawn either (FilePane's own guard). Owner, 2026-09-13:\n           \"ver sayfa içinde salak bir Home yazısı var, onu kaldıralım.\"\n           He is right and it is the same rule the tab strip already follows:\n           the panel's Home row is highlighted, the tab says Home and the\n           address bar says `#.home` — a fourth \"Home\", in 18px type, over\n           three sections that name themselves, was the page introducing itself\n           to somebody who had just clicked its name. The SECTION headings\n           (Storages / Recent / Starred) stay: those name the blocks, not the\n           page. `home.title` is still the tab's and the panel row's word. -->\n\n      <!-- Strips that describe the WINDOW's state rather than the listing. -->\n      <template #banners>\n    <!-- A search that matched more than it returned: the index filled its page,\n         or the index-less fallback filled its window of names. Without this a\n         cut list reads as the whole answer. No count — the number that came\n         back is the window's, not the matches'. -->\n    <div\n      v-if=\"searchQuery && searchTruncated && !navView && !trashActive\"\n      class=\"fe-search-cut\"\n      role=\"status\"\n    >{{ t('search.truncated') }}</div>\n    <!-- #207 — a per-person view (Recent, Starred, Shared, a tag) holds more\n         rows than the page loaded: said, with the server's total, and the\n         rest one press away instead of silently out of reach. -->\n    <div\n      v-if=\"navMore && navMore.truncated && serverOrderedView && !searchQuery\"\n      class=\"fe-search-cut fe-nav-more\"\n      role=\"status\"\n      data-testid=\"nav-more\"\n    >\n      <span>{{ t('nav.more_shown', { shown: files.length, total: navMore.total }) }}</span>\n      <button\n        type=\"button\"\n        class=\"fe-coverage__action\"\n        data-testid=\"nav-more-load\"\n        :disabled=\"navMoreBusy\"\n        :aria-busy=\"navMoreBusy ? 'true' : undefined\"\n        @click=\"loadMoreNav\"\n      >{{ t('nav.load_more') }}</button>\n    </div>\n\n    <!-- The catalog does not cover all of this storage yet (a first sync, a\n         lazily cataloged storage): search, folder sizes and usage leave part\n         of it out, and this says so and why (lib/catalogCoverage). -->\n    <div\n      v-if=\"coverageShown\"\n      class=\"fe-coverage\"\n      role=\"status\"\n      data-testid=\"catalog-coverage\"\n    >\n      <!-- While \"Catalog everything\" runs, the banner says so and the button\n           waits for it. -->\n      <span class=\"fe-coverage__text\">{{\n        catalogBusy(coverageShown.storage)\n          ? t('coverage.cataloging', { storage: coverageShown.storage ?? '' })\n          : t(coverageShown.key, coverageShown.vars)\n      }}</span>\n      <button\n        v-if=\"coverageShown.offerCatalogAll\"\n        type=\"button\"\n        class=\"fe-coverage__action\"\n        data-testid=\"catalog-coverage-all\"\n        :disabled=\"catalogBusy(coverageShown.storage)\"\n        :aria-busy=\"catalogBusy(coverageShown.storage) ? 'true' : undefined\"\n        @click=\"catalogAll(coverageShown.storage)\"\n      >{{ catalogBusy(coverageShown.storage) ? t('coverage.catalog_running') : t('coverage.catalog_all') }}</button>\n    </div>\n\n    <!-- Live presence: who else is viewing this folder (empty → nothing shown).\n         When the live socket is unavailable the same strip carries a small\n         degraded-connection badge instead (presence is empty in fallback);\n         a healthy connection shows nothing extra. -->\n    <div v-if=\"presenceUsers.length || realtimeDegraded\" class=\"fe__presence\">\n      <PresenceBar v-if=\"presenceUsers.length\" :users=\"presenceUsers\" :locale=\"locale\" />\n      <span\n        v-if=\"realtimeDegraded\"\n        class=\"fe-connbadge\"\n        role=\"status\"\n        :title=\"t('conn.tooltip')\"\n      >\n        <span class=\"fe-connbadge__dot\" aria-hidden=\"true\"></span>\n        {{ t('conn.offline') }}\n      </span>\n    </div>\n\n    <!-- wiring:e2 — unlocked strip: visible in an encrypted folder while the\n         key is in memory; \"Kilitle\" (Lock) drops the key and the decrypted\n         blobs. -->\n    <!-- wiring:e2 recovery — a v1 folder just opened by password. Offer it\n         recovery HERE, visibly, rather than doing anything silently: this is\n         the only moment filex holds the password, and (when the install has\n         escrow) accepting also gives the operator a key. -->\n    <div v-if=\"e2eUpgradeOffer\" class=\"fe-e2e-upgrade\" role=\"alert\">\n      <div class=\"fe-e2e-upgrade__text\">\n        <strong>{{ t('e2e.upgrade.title') }}</strong>\n        <p>{{ t('e2e.upgrade.body') }}</p>\n        <p v-if=\"e2eEscrowKid\" class=\"fe-e2e-upgrade__escrow\">\n          {{ t('e2e.upgrade.escrow_note') }}\n        </p>\n      </div>\n      <div class=\"fe-e2e-upgrade__actions\">\n        <button type=\"button\" class=\"fe-btn\" :disabled=\"e2eUpgradeBusy\" @click=\"e2eDeclineUpgrade\">\n          {{ t('e2e.upgrade.decline') }}\n        </button>\n        <button\n          type=\"button\"\n          class=\"fe-btn fe-btn--primary\"\n          :disabled=\"e2eUpgradeBusy\"\n          @click=\"e2eDoUpgrade\"\n        >\n          {{ e2eUpgradeBusy ? t('e2e.upgrade.busy') : t('e2e.upgrade.accept') }}\n        </button>\n      </div>\n    </div>\n<!-- wiring:e2 escrow-offer — an existing folder that predates escrow on\n         this installation. Shown only after an unlock SUCCEEDED, because\n         accepting hands the operator a permanent second key to this folder\n         and the only person entitled to do that is the one who can already\n         open it. Doing nothing leaves the folder exactly as it is. -->\n    <div v-if=\"e2eEscrowOffer\" class=\"fe-e2e-upgrade fe-e2e-upgrade--escrow\" role=\"alert\">\n      <div class=\"fe-e2e-upgrade__text\">\n        <strong>{{ t('e2e.escrowoffer.title') }}</strong>\n        <p>{{ t('e2e.escrowoffer.body') }}</p>\n        <p class=\"fe-e2e-upgrade__escrow\">\n          {{ t('e2e.escrowoffer.consequence') }}\n          <a :href=\"e2eEscrowDocsUrl\" target=\"_blank\" rel=\"noopener noreferrer\">\n            {{ t('e2e.escrowoffer.learn_more') }}\n          </a>\n        </p>\n        <p v-if=\"e2eEscrowKid\" class=\"fe-e2e-upgrade__escrow\">\n          {{ t('e2e.recover.escrow_kid') }}: <code>{{ e2eEscrowKid }}</code>\n        </p>\n        <!-- The way-back path has no password in memory any more, so it is\n             typed. The same proof of ownership the unlock path already had. -->\n        <label v-if=\"e2eEscrowOfferMode === 'manual'\" class=\"fe-e2e-upgrade__pw\">\n          <span>{{ t('e2e.escrowoffer.password_label') }}</span>\n          <input\n            v-model=\"e2eEscrowPw\"\n            type=\"password\"\n            class=\"fe-input\"\n            autocomplete=\"current-password\"\n            :disabled=\"e2eEscrowBusy\"\n            @keyup.enter=\"e2eAcceptEscrow\"\n          />\n        </label>\n        <p v-if=\"e2eEscrowErr\" class=\"fe-form__error\" role=\"alert\">{{ e2eEscrowErr }}</p>\n      </div>\n      <div class=\"fe-e2e-upgrade__actions\">\n        <button\n          type=\"button\"\n          class=\"fe-btn\"\n          :disabled=\"e2eEscrowBusy\"\n          @click=\"e2eEscrowOfferMode === 'manual' ? e2eCloseEscrowOffer() : e2eDeclineEscrow()\"\n        >\n          {{\n            e2eEscrowOfferMode === 'manual'\n              ? t('e2e.escrowoffer.cancel')\n              : t('e2e.escrowoffer.decline')\n          }}\n        </button>\n        <button\n          type=\"button\"\n          class=\"fe-btn fe-btn--primary\"\n          :disabled=\"e2eEscrowBusy\"\n          @click=\"e2eAcceptEscrow\"\n        >\n          {{ e2eEscrowBusy ? t('e2e.escrowoffer.busy') : t('e2e.escrowoffer.accept') }}\n        </button>\n      </div>\n    </div>\n    <!-- wiring:e2 convert — the folder is being encrypted in place, or that\n         stopped before every file was done. Files that are done open. -->\n    <div\n      v-if=\"e2eUnlocked && (e2eConvPending || e2eConvRunning || e2eConvErr)\"\n      class=\"fe-e2e-upgrade fe-e2e-upgrade--names\"\n      role=\"status\"\n      data-testid=\"e2e-convert-strip\"\n    >\n      <div class=\"fe-e2e-upgrade__text\">\n        <strong>{{ e2eConvRunning ? t('e2e.convert.busy') : t('e2e.convert.resume_title') }}</strong>\n        <p v-if=\"!e2eConvRunning\">{{ t('e2e.convert.resume_body') }}</p>\n        <p v-if=\"e2eConvProgress\" class=\"fe-e2e-upgrade__progress\" data-testid=\"e2e-convert-progress\">\n          {{\n            t('e2e.convert.progress', {\n              n: e2eConvProgress.done + e2eConvProgress.skipped,\n              total: e2eConvProgress.total,\n              failed: e2eConvProgress.failed + e2eConvProgress.tooBig,\n            })\n          }}\n        </p>\n        <p v-if=\"e2eConvLarge\" class=\"fe-e2e-upgrade__progress\" data-testid=\"e2e-convert-large\">\n          {{ t('e2e.convert.large_progress', { name: e2eConvLarge.name, percent: e2eConvLarge.percent }) }}\n        </p>\n        <p v-if=\"e2eConvErr\" class=\"fe-form__error\" role=\"alert\">{{ e2eConvErr }}</p>\n      </div>\n      <div class=\"fe-e2e-upgrade__actions\">\n        <button v-if=\"e2eConvRunning\" type=\"button\" class=\"fe-btn\" data-testid=\"e2e-convert-stop\" @click=\"e2eStopConversion\">\n          {{ t('e2e.names.stop') }}\n        </button>\n        <button\n          v-else\n          type=\"button\"\n          class=\"fe-btn fe-btn--primary\"\n          data-testid=\"e2e-convert-resume\"\n          @click=\"e2eRunConversion\"\n        >\n          {{ t('e2e.names.resume') }}\n        </button>\n      </div>\n    </div>\n    <!-- wiring:e2 names — a change from level 1 to level 2 that is under way\n         or did not finish (it was started in the folder's encryption\n         settings; nothing here is offered unasked). Files open throughout. -->\n    <div\n      v-if=\"e2eUnlocked && !e2eConvPending && !e2eConvRunning && (e2eLevel === 'pending' || e2eNamesBusy || e2eNamesErr)\"\n      class=\"fe-e2e-upgrade fe-e2e-upgrade--names\"\n      role=\"status\"\n      data-testid=\"e2e-names-progress-strip\"\n    >\n      <div class=\"fe-e2e-upgrade__text\">\n        <strong>{{ e2eNamesBusy ? t('e2e.names.busy') : t('e2e.names.resume_title') }}</strong>\n        <p v-if=\"!e2eNamesBusy\">{{ t('e2e.names.resume_body') }}</p>\n        <p v-if=\"e2eNamesProgress\" class=\"fe-e2e-upgrade__progress\" data-testid=\"e2e-names-progress\">\n          {{ t('e2e.names.progress', { n: e2eNamesProgress.renamed, failed: e2eNamesProgress.failed }) }}\n        </p>\n        <p v-if=\"e2eNamesErr\" class=\"fe-form__error\" role=\"alert\">{{ e2eNamesErr }}</p>\n      </div>\n      <div class=\"fe-e2e-upgrade__actions\">\n        <button\n          v-if=\"e2eNamesBusy\"\n          type=\"button\"\n          class=\"fe-btn\"\n          data-testid=\"e2e-names-stop\"\n          @click=\"e2eNamesStop = true\"\n        >\n          {{ t('e2e.names.stop') }}\n        </button>\n        <button\n          v-else\n          type=\"button\"\n          class=\"fe-btn fe-btn--primary\"\n          data-testid=\"e2e-names-resume\"\n          @click=\"e2eRaiseLevel\"\n        >\n          {{ t('e2e.names.resume') }}\n        </button>\n      </div>\n    </div>\n    <!-- wiring:e2 password — a re-key that has not finished: files open\n         either way (the previous key is sealed in the key file), and this\n         finishes re-wrapping them. -->\n    <div\n      v-if=\"e2eUnlocked && (e2eRekeyPending || e2eRekeyBusy)\"\n      class=\"fe-e2e-upgrade fe-e2e-upgrade--rekey\"\n      role=\"status\"\n      data-testid=\"e2e-rekey-offer\"\n    >\n      <div class=\"fe-e2e-upgrade__text\">\n        <strong>{{ t('e2e.password.resume_title') }}</strong>\n        <p>{{ t('e2e.password.resume_body') }}</p>\n        <p v-if=\"e2eRekeyProgress\" class=\"fe-e2e-upgrade__progress\" data-testid=\"e2e-rekey-progress\">\n          {{ t('e2e.password.progress', { n: e2eRekeyProgress.done, failed: e2eRekeyProgress.failed }) }}\n        </p>\n        <p v-if=\"e2eRekeyErr\" class=\"fe-form__error\" role=\"alert\">{{ e2eRekeyErr }}</p>\n      </div>\n      <div class=\"fe-e2e-upgrade__actions\">\n        <button\n          type=\"button\"\n          class=\"fe-btn fe-btn--primary\"\n          data-testid=\"e2e-rekey-resume\"\n          :disabled=\"e2eRekeyBusy\"\n          @click=\"e2eRunRekey\"\n        >\n          {{ e2eRekeyBusy ? t('e2e.password.busy') : t('e2e.names.resume') }}\n        </button>\n      </div>\n    </div>\n    <!-- wiring:e2 vault — an unlocked vault: who writes, and the two clocks\n         (the write lock's idle time, then the vault lock). -->\n    <E2eVaultStrip\n      v-if=\"e2eUnlocked && vaultStrip\"\n      :locale=\"locale\"\n      :state=\"vaultStrip\"\n      @settings=\"showE2eSettings = true\"\n      @lock=\"e2eLock\"\n      @take-over=\"vault.takeOver(e2eRoot)\"\n      @continue=\"vault.continueFromShown(e2eRoot)\"\n      @dismiss=\"vault.dismiss(e2eRoot)\"\n    />\n    <div v-if=\"e2eUnlocked && !vaultStrip\" class=\"fe-e2e-strip\" role=\"status\">\n      <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n      <span class=\"fe-e2e-strip__icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('lock')\"></span>\n      <span class=\"fe-e2e-strip__label\">{{ t('e2e.strip.label') }}</span>\n      <!-- wiring:e2 names — say which kind of folder this is: whether the\n           server can read the names is exactly what people ask. -->\n      <span class=\"fe-e2e-strip__names\" data-testid=\"e2e-names-status\">\n        {{ e2eNamesOn ? t('e2e.level.names') : t('e2e.level.content') }}\n      </span>\n      <!-- The folder's keys and its level live in one place. The escrow way\n           back (for somebody who declined) is in there too: quiet, but\n           present — a refusal that could not be reversed would be a trap. -->\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-e2e-strip__btn\"\n        data-testid=\"e2e-settings-open\"\n        :disabled=\"e2eRekeyBusy || e2eNamesBusy\"\n        @click=\"showE2eSettings = true\"\n      >\n        {{ t('e2e.settings.open') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn fe-e2e-strip__btn\" @click=\"e2eLock\">\n        {{ t('e2e.strip.lock') }}\n      </button>\n    </div>\n    <!-- /wiring:e2 -->\n\n    <!-- tablo:t1 — the trash banner: what the trash IS on the left, the one\n         irreversible action on the right. OUTSIDE `fe__body` so it sits above\n         the listing AND above the centred empty state, which is where the\n         reference draws it and the only place it reads as a property of the\n         view rather than of the rows. -->\n    <div v-if=\"trashMode && !loading\" class=\"fe-trashbar\">\n      <p class=\"fe-trashbar__text\">{{ trashBannerText }}</p>\n      <!-- The server's count and size of the WHOLE trash, and how much of it\n           is on screen (finding D1): the list is paged. -->\n      <p v-if=\"trashSummary\" class=\"fe-trashbar__count\" data-testid=\"trash-summary\">\n        {{ trashSummary }}<span v-if=\"trashLoaded < trashTotal\" class=\"fe-trashbar__shown\"> · {{ trashShownText }}</span>\n      </p>\n      <button\n        v-if=\"trashLoaded < trashTotal\"\n        type=\"button\"\n        class=\"fe-btn fe-trashbar__more\"\n        data-testid=\"trash-more\"\n        :disabled=\"trashMoreBusy\"\n        @click=\"loadMoreTrash\"\n      >\n        {{ t('trash.show_more') }}\n      </button>\n      <p v-if=\"trashEmptyProgress\" class=\"fe-trashbar__progress\" role=\"status\" aria-live=\"polite\">\n        {{ trashEmptyProgress }}\n      </p>\n      <!-- Offered only when the SERVER has said this caller may purge. The\n           backend refuses regardless of what we draw; this is so nobody is\n           handed a button that always fails. -->\n      <button\n        v-if=\"trashCanEmpty\"\n        type=\"button\"\n        class=\"fe-btn fe-btn--danger fe-trashbar__action\"\n        :disabled=\"files.length === 0 || trashEmptying\"\n        data-testid=\"trash-empty\"\n        @click=\"openTrashConfirm\"\n      >\n        {{ t('trash.empty_action') }}\n      </button>\n    </div>\n      </template>\n\n      <!-- The three states with no listing behind them. `hostBodyState` keeps\n           them in the order the old chain had — and, crucially, behind the\n           skeleton, so a folder that is still loading does not flash its lock\n           screen. -->\n      <template #body>\n      <!-- gorunum:v3-shell — Home. FIRST in the chain, and it short-circuits\n           every state below it on purpose: those all describe a LISTING (a\n           dead deep link, a failed fetch, a locked folder, an empty folder)\n           and Home has no listing behind it — `files` is deliberately empty\n           while it is open, which every one of them would read as \"nothing\n           here\". Its own three blocks each carry their own empty state. -->\n      <HomeView\n        v-if=\"hostBodyState === 'home'\"\n        :storages=\"homeStorages\"\n        :recent=\"homeRecent\"\n        :starred=\"homeStarred\"\n        :loading=\"homeLoading\"\n        :locale=\"locale\"\n        :match-names=\"api.matchNames\"\n        :name-filter=\"driveFilters.name ?? '' /* surucu:d1-scope — Home's filter\n               row is the name box alone, and this is what it narrows. The same\n               `DriveFilters.name` the listing's own box writes, so the value is\n               reset on navigation by the one watcher that already does that and\n               there is no second piece of filter state to keep in step. */\"\n        :thumb-src=\"thumbs.src\"\n        @open-storage=\"openNavStorage\"\n        @open-node=\"openNode\"\n        @context-node=\"onContextTarget\"\n      />\n      <!-- Drafts (issue #71): the person's drafts, across every storage — THE\n           table (DataTable), with Open / Save to disk / Delete per row. Like\n           Home it has no listing behind it, so it short-circuits the states\n           below. -->\n      <DraftsView\n        v-else-if=\"hostBodyState === 'drafts'\"\n        :drafts=\"draftRows\"\n        :loading=\"draftsLoading\"\n        :limit=\"draftLimit\"\n        :locale=\"locale\"\n        :name-filter=\"driveFilters.name ?? ''\"\n        :match-names=\"api.matchNames\"\n        :busy-key=\"draftBusyKey\"\n        @open=\"(d: DraftDto) => openDraft(d)\"\n        @save=\"saveDraftFromList\"\n        @delete=\"discardDraftFromList\"\n      />\n      <!-- Dead deep link (404) or RBAC-hidden dir (403, shown identically):\n           a dedicated state instead of a misleading \"this folder is empty\". -->\n      <div v-else-if=\"hostBodyState === 'notfound'\" class=\"fe-state\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"110\"\n          height=\"92\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <path d=\"M18 36v42a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6V44a6 6 0 0 0-6-6H62l-9-10H24a6 6 0 0 0-6 6z\" />\n          <path d=\"M52 55c0-4.6 3.6-8 8-8s8 3.4 8 8c0 5.5-8 4.8-8 11\" />\n          <circle cx=\"60\" cy=\"73\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\" />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('notFound.title') }}</p>\n        <p class=\"fe-state__path\">{{ notFoundPath }}</p>\n        <p class=\"fe-state__hint\">{{ t('notFound.desc') }}</p>\n        <div class=\"fe-state__actions\">\n          <button type=\"button\" class=\"fe-btn\" @click=\"leaveNotFound\">\n            {{ t('notFound.goRoot') }}\n          </button>\n        </div>\n      </div>\n      <!-- wiring:e2 — encrypted-folder lock screen: the listing is not\n           rendered until the correct password is entered. The password is\n           verified against the marker in the browser; it never reaches the\n           server. -->\n      <E2eLockScreen\n        v-else\n        :locale=\"locale\"\n        :busy=\"e2eUnlockBusy\"\n        :error=\"e2eUnlockErr\"\n        @unlock=\"e2eUnlock\"\n        @recovery=\"openRecoveryUnlock\"\n      />\n      <!-- /wiring:e2 -->\n      </template>\n\n      <!-- Loaded and empty: WHICH empty. The pane's own fallback (\"this folder\n           is empty\") is the last branch here, and it is the one the split pane\n           falls back to. -->\n      <template #empty>\n      <!-- Search with zero hits — its own message, not \"folder is empty\". -->\n      <div v-if=\"searchQuery\" class=\"fe-state\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"110\"\n          height=\"92\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <circle cx=\"52\" cy=\"44\" r=\"22\" />\n          <path d=\"M68 61l20 20\" />\n          <path d=\"M46 38l12 12M58 38l-12 12\" />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('empty.search.title') }}</p>\n        <p class=\"fe-state__hint\">{{ t('empty.search.hint') }}</p>\n      </div>\n      <!-- gezinti:g1 — empty panel views. Each says which list is empty and\n           how it fills up; \"This folder is empty\" would be wrong twice over,\n           because there is no folder and nothing to drop into it. -->\n      <div\n        v-else-if=\"navView && navView !== 'trash'\"\n        class=\"fe-state\"\n        :data-testid=\"`empty-${navView}`\"\n      >\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"110\"\n          height=\"92\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <template v-if=\"navView === 'recent'\">\n            <circle cx=\"60\" cy=\"50\" r=\"28\" />\n            <path d=\"M60 32v18l12 8\" />\n          </template>\n          <template v-else-if=\"navView === 'starred'\">\n            <path d=\"M60 26l9 18.6 20.4 3-14.8 14.4 3.5 20.4L60 72.8 41.9 82.4l3.5-20.4L30.6 47.6l20.4-3z\" />\n          </template>\n          <template v-else-if=\"navView === 'tag'\">\n            <path d=\"M30 30h24l32 32-24 24-32-32z\" />\n            <circle cx=\"43\" cy=\"43\" r=\"4.5\" />\n          </template>\n          <template v-else>\n            <circle cx=\"84\" cy=\"34\" r=\"9\" />\n            <circle cx=\"36\" cy=\"52\" r=\"9\" />\n            <circle cx=\"84\" cy=\"70\" r=\"9\" />\n            <path d=\"M44.5 47.5l31-9M44.5 56.5l31 9\" />\n          </template>\n        </svg>\n        <!-- etiket:t1 — the tag view's empty state names the TAG. \"Nothing\n             here\" would be the fourth identical sentence and would not say\n             which of the user's tags is the empty one. -->\n        <p class=\"fe-state__title\">\n          {{ navView === 'tag' ? t('empty.tag.title', { tag: navTag }) : t(`empty.${navView}.title`) }}\n        </p>\n        <p class=\"fe-state__hint\">\n          {{ navView === 'tag' ? t('empty.tag.hint') : t(`empty.${navView}.hint`) }}\n        </p>\n      </div>\n      <!-- Empty trash view. -->\n      <div v-else-if=\"trashMode\" class=\"fe-state\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"110\"\n          height=\"92\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <path d=\"M38 34l4 48a6 6 0 0 0 6 5.6h24a6 6 0 0 0 6-5.6l4-48\" />\n          <path d=\"M32 34h56\" />\n          <path d=\"M50 34v-6a6 6 0 0 1 6-6h8a6 6 0 0 1 6 6v6\" />\n          <path d=\"M52 44v32M60 44v32M68 44v32\" opacity=\"0.5\" />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('empty.trash.title') }}</p>\n        <!-- tablo:t1 — the second line the reference has and we did not. The\n             key did not exist in EITHER catalogue, so there was nothing to\n             show even if something had asked for it. -->\n        <p class=\"fe-state__hint\">{{ t('empty.trash.hint') }}</p>\n      </div>\n      <!-- Loaded, zero files, no search: the real empty-folder state. The\n           upload affordances follow write permission (RBAC viewers only get\n           the title). -->\n      <div v-else class=\"fe-state\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"110\"\n          height=\"92\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <path d=\"M18 36v42a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6V44a6 6 0 0 0-6-6H62l-9-10H24a6 6 0 0 0-6 6z\" />\n          <g v-if=\"emptyCanUpload\">\n            <path d=\"M60 50v14\" stroke-dasharray=\"3 4\" />\n            <path d=\"M53 59l7 8 7-8\" />\n          </g>\n        </svg>\n        <p class=\"fe-state__title\">{{ t('empty.folder') }}</p>\n        <p v-if=\"emptyCanUpload\" class=\"fe-state__hint\">{{ t('empty.hint') }}</p>\n        <div v-if=\"emptyCanUpload\" class=\"fe-state__actions\">\n          <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"triggerUpload\">\n            {{ t('empty.upload') }}\n          </button>\n        </div>\n      </div>\n      </template>\n    </FilePane>\n\n    <!-- pane:p1 — the split pane. The SAME component, SELF-DRIVEN: it asks the\n         backend for one folder through the same `api.index` + `lib/listing`\n         helpers. `:key` is bound to the tab id, so a tab switch remounts it\n         with its own location. -->\n    <FilePane\n      v-if=\"splitVisible && activeSplit\"\n      ref=\"splitPaneRef\"\n      :key=\"'split-' + tabsActiveId\"\n      pane-id=\"split\"\n      self-driven\n      closable\n      :api=\"paneApi /* wiring:e2 vault — a vault lists from its index in this pane too */\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :focused=\"paneIsActive\"\n      :path=\"activeSplit.path\"\n      :qualify=\"qualify\"\n      :to-user=\"paneToUser\"\n      :clamp=\"paneClamp\"\n      :root-path=\"rootPathProp\"\n      :floor=\"rootFloor\"\n      :multi-root=\"multiStorageRoot\"\n      :virtual-rows=\"virtualStorageRows\"\n      :trash-visible=\"config.trashVisible !== false\"\n      :nav-offers-trash=\"navOffersTrash\"\n      :view-mode=\"paneViewMode\"\n      :view-modes=\"allowedViewModes\"\n      :open-trigger=\"props.config.openTrigger\"\n      :clipped=\"clippedPaths\"\n      :can-write=\"canWriteHere\"\n      :can-paste=\"!!clipboard.mode\"\n      :selected=\"splitSelection.selected.value\"\n      :filters=\"splitFilters\"\n      :folder-key=\"splitFolderKey\"\n      :thumb-src=\"thumbs.src\"\n      :folder-previews=\"capabilitiesData?.folder_previews !== false\"\n      :keep-badge-for=\"desktopSync ? keepBadgeFor : undefined\"\n      :starred-ids=\"starredIds\"\n      :star-overrides=\"starOverrides\"\n      :star-enabled=\"identitySurfaces\"\n      :api-base=\"props.config.apiBase ?? ''\"\n      :auth-headers=\"() => buildAuthHeaders()\"\n      :auth-credentials=\"api.credentialsMode()\"\n      @activate=\"activePane = 'split'\"\n      @close=\"closeSplit\"\n      @navigate=\"onPaneNavigate\"\n      @open=\"openNode\"\n      @open-trash=\"onPaneOpenTrash\"\n      @click-row=\"(n, m) => onPaneClickRow('split', n, m)\"\n      @context=\"(n: FileNode | null, ev: MouseEvent) => onPaneMenu('split', n, ev)\"\n      @clear-selection=\"splitSelection.clear()\"\n      @display-order=\"(nodes: FileNode[]) => (splitDisplayOrder = nodes)\"\n      @item-drag-start=\"(n: FileNode, ev: DragEvent) => onPaneItemDragStart('split', n, ev)\"\n      @item-drop-into=\"onItemDropInto\"\n      @transfer=\"onPaneTransfer\"\n      @update:view-mode=\"setPaneViewMode\"\n      @update:filters=\"(v: DriveFilters) => (splitFilters = v)\"\n      @copy-path=\"onCopyPath\"\n      @crumb-drop=\"onCrumbDropInto\"\n      @new-folder=\"showNewFolder = true\"\n      @upload=\"triggerUpload\"\n      @paste=\"onToolbarAction('paste')\"\n      @select-all=\"splitSelection.selectAll()\"\n      @clear-filters=\"splitFilters = { ...EMPTY_FILTERS }\"\n      @star-change=\"onStarChange\"\n    />\n\n    </div><!-- /fe__panes -->\n    </div><!-- /fe__stack pane:p1 -->\n\n\n    <!-- koru:k1 — inspector (details) panel; v-if keeps the closed state\n         free of any DOM. Narrow mode renders it as a full-size overlay. -->\n    <InspectorPanel\n      v-if=\"showInspector\"\n      :api=\"inspectorApi /* wiring:e2 vault — asks nothing about an item in a vault */\"\n      :nodes=\"inspectorNodes /* pane:p1 — the FOCUSED pane's selection, through\n             the same `activeTargets()` the selection bar reads. It was\n             `selection.nodes` (the main pane's, always), which is why clicking\n             in the split pane changed nothing here. */\"\n      :dir-label=\"inspectorDirLabel\"\n      :dir-count=\"inspectorDirCount\"\n      :dir-perm=\"inspectorDirPerm\"\n      :held-in=\"inspectorHeldIn /* non-empty ⇒ this is the LAST selected thing,\n             not what is ticked in front of you, and it lives here. */\"\n      :locale=\"locale\"\n      :narrow=\"isNarrow\"\n      :caller-admin=\"callerAdmin /* the Node ID row is an administrator's (InspectorPanel) */\"\n      :sharing=\"inspectorSharing /* its Create link / Manage buttons (lib/sharingHeld) */\"\n      :in-encrypted=\"inspectorInEncrypted /* wiring:e2 - no Create link in an encrypted folder (lib/e2eLinks) */\"\n      :thumb-src=\"thumbs.src\"\n      :api-base=\"props.config.apiBase ?? '' /* etiket:t1 — the details panel's\n             Tags section mounts the same TagPicker the context menu opens, and\n             that component talks to `/api/files/tags/*` itself. These three are\n             the trio every self-fetching child in this package already takes\n             (StarButton, TagPicker, GridView's star column): the base, the\n             headers, and the credentials mode. ⚠ `authCredentials` is not\n             decoration — a credentialed cross-origin request cannot be answered\n             with `ACAO: *`, so an embed served from a different origin to the\n             API breaks without it. */\"\n      :auth-headers=\"() => buildAuthHeaders()\"\n      :auth-credentials=\"api.credentialsMode()\"\n      :plugin-views=\"pluginInspectorViews /* App plugins — inspector sections */\"\n      :theme=\"themeMode\"\n      :storages=\"(props.config.storages ?? []).map((st) => st.name)\"\n      @plugin-op=\"(op) => onPluginOpQueued(op)\"\n      @plugin-open=\"(p) => onSurfaceOpen(p.plugin, p.req)\"\n      @open-tag=\"openTagView /* etiket:t1 — a tag chip in this panel is a door to\n             that tag's view, the same door the navigation panel's Tags section\n             opens. */\"\n      @close=\"closeInspector\"\n      @share-created=\"onInspectorShareCreated /* surucu:d1 */\"\n      @manage-permissions=\"onInspectorManage\"\n      @toast=\"flashToast\"\n      @changed=\"() => (paneIsActive ? void splitPaneRef?.reload() : void load()) /* pane:p1 —\n             the panel now acts on the FOCUSED pane's selection, so the listing\n             it refreshes afterwards has to be that pane's. Reloading the main\n             one would leave a restored version, a deleted comment or a renamed\n             file on screen unchanged in the half it happened in. */\"\n    />\n    </div>\n    <!-- /koru:k1 fe__main -->\n\n    <!-- gezinti:g1 — the Connections / API-keys overlays, opened from the\n         navigation panel. ⚠ z-index 130, measured, not guessed: the explorer's\n         onboarding tour and its context menus are appended to <body> at 96 and\n         90 and are `fixed`, so anything in the normal stacking order is painted\n         over by them — the tour card landed on top of the same panel in the web\n         app and swallowed its clicks, which is why that page uses z-[120]. This\n         one has to clear the host's wrapper too, so it goes above it. -->\n    <div\n      v-if=\"showConnections || showTokens\"\n      class=\"fe-overlay\"\n      data-testid=\"explorer-overlay\"\n      @click.self=\"closeOverlays\"\n    >\n      <div class=\"fe-overlay__card\" @click.stop>\n        <ConnectionsPanel\n          v-if=\"showConnections\"\n          :config=\"config\"\n          closable\n          @close=\"closeOverlays\"\n          @error=\"onConnectionsError\"\n        />\n        <template v-else>\n          <header class=\"fe-overlay__head\">\n            <h2 class=\"fe-overlay__title\">{{ t('sidenav.apikeys') }}</h2>\n            <button\n              type=\"button\"\n              class=\"fe-overlay__close\"\n              :title=\"t('overlay.close')\"\n              :aria-label=\"t('overlay.close')\"\n              @click=\"closeOverlays\"\n            >\n              ×\n            </button>\n          </header>\n          <TokensPanel :config=\"config\" full />\n        </template>\n      </div>\n    </div>\n\n\n    <div v-if=\"dragOver\" class=\"fe__dragover\">\n      <div class=\"fe__dragover-card\">\n        <!-- ⚠ Was the `⬆` emoji: rendered by whatever emoji font the machine\n             has, so the one mark on the drop overlay came out as a blue arrow\n             on Windows, a grey one on Linux and nothing at all on a headless\n             Chromium with no emoji font — on the single screen whose whole job\n             is one glyph and one line. Same `upload` key the \"+ New\" menu and\n             the toolbar draw, so the three now agree. -->\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('upload')\"></span>\n        <p>{{ t('dropzone.hint') }}</p>\n      </div>\n    </div>\n\n    <!-- wiring:c3 — unified operations center. UploadProgress + PendingOpsTray\n         no longer draw their own corner UIs: they are renderless publishers\n         feeding the opsCenter store; the single visible surface is the\n         OperationsCenter badge + panel below. -->\n    <UploadProgress\n      :jobs=\"uploadJobs\"\n      :locale=\"locale\"\n      :center=\"opsCenter\"\n      @cancel=\"onCancelUpload\"\n      @dismiss=\"onDismissUpload\"\n      @retry=\"retryUploadJob\"\n    />\n\n    <PendingOpsTray\n      :ops=\"pendingOps.ops.value\"\n      :locale=\"locale\"\n      :center=\"opsCenter\"\n      :output-mode-of=\"pluginOutputModeOf\"\n      :caller-admin=\"callerAdmin\"\n      @cancel=\"cancelPendingOp\"\n      @dismiss=\"(id) => pendingOps.dismiss(id)\"\n      @open=\"onOpenOpOutput\"\n    />\n\n    <OperationsCenter\n      :center=\"opsCenter\"\n      :locale=\"locale\"\n      :narrow=\"isNarrow\"\n    />\n    <!-- /wiring:c3 -->\n\n    <!-- bag:b4 — narrow-mode upload FAB (hidden in trash / read-only /\n         virtual root; PendingOpsTray+UploadProgress shift up via CSS). -->\n    <button\n      v-if=\"isNarrow && emptyCanUpload\"\n      type=\"button\"\n      class=\"fe-fab\"\n      :title=\"t('toolbar.upload')\"\n      :aria-label=\"t('toolbar.upload')\"\n      @click=\"triggerUpload\"\n    >\n      <svg\n        class=\"fe-ficon\"\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        stroke-width=\"2.2\"\n        stroke-linecap=\"round\"\n        aria-hidden=\"true\"\n        focusable=\"false\"\n      >\n        <path d=\"M12 5v14M5 12h14\" />\n      </svg>\n    </button>\n\n    <!-- selective-sync progress: the folder the engine is moving RIGHT NOW.\n         Overlay, pointer-events none — status is never in the way of work. -->\n    <div v-if=\"keepActive\" class=\"fe-keep-strip\" role=\"status\" aria-live=\"polite\">\n      <span class=\"fe-keep-strip__icon\" aria-hidden=\"true\">⟳</span>\n      <span class=\"fe-keep-strip__label\">{{ keepStripLabel }}</span>\n      <div v-if=\"keepStripPercent !== null\" class=\"fe-keep-strip__bar\" aria-hidden=\"true\">\n        <div class=\"fe-keep-strip__fill\" :style=\"{ width: keepStripPercent + '%' }\"></div>\n      </div>\n    </div>\n\n    <ContextMenu\n      ref=\"ctxRef\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :sheet=\"isCoarse /* bag:b4 */\"\n      :actions=\"contextActions\"\n      @select=\"onContextAction\"\n    />\n\n    <!-- belge:n1 — New document: the types this deployment can actually create\n         AND open, then a name, then where it goes. -->\n    <NewDocumentModal\n      :open=\"showNewDocument\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :api=\"api\"\n      :types=\"newDocTypes\"\n      :current-path=\"qualify(currentPath)\"\n      :storages=\"(props.config.storages ?? []).map((st) => st.name) /* ⚠ the dialog\n                 takes NAMES; `config.storages` is objects, and passing them\n                 straight through (as the wiring note had it) does not\n                 typecheck. */\"\n      :only-office-ready=\"!!effectiveOnlyOfficeBase\"\n      :drawio-ready=\"!!effectiveDrawioUrl\"\n      :can-configure=\"callerAdmin\"\n      :drafts=\"draftsEnabled /* issue #71 — a new document is a draft until saved */\"\n      @close=\"showNewDocument = false\"\n      @open-drafts=\"openDraftsFromNewDocument\"\n      @created=\"onDocumentCreated\"\n      @error=\"emit('error', { message: $event.message, context: { op: 'newdoc' } })\"\n    />\n    <NewFolderModal\n      :open=\"showNewFolder\"\n      :locale=\"locale\"\n      :encrypted-option=\"newFolderE2e === 'allowed' /* wiring:e2 policy - never nested, and only where this account may encrypt */\"\n      :encrypted-request=\"newFolderE2e === 'request' /* wiring:e2 policy - an approval first */\"\n      :busy=\"newFolderBusy\"\n      :error=\"newFolderError\"\n      @close=\"showNewFolder = false\"\n      @submit=\"submitNewFolder\"\n      @encrypted=\"showNewFolder = false; showEncFolder = true /* wiring:e2 */\"\n      @request-encrypted=\"requestEncryptedFolder\"\n    />\n    <ArchiveCreateModal\n      :open=\"showArchiveCreate\"\n      :locale=\"locale\"\n      :count=\"archiveTargets.length\"\n      :suggested-name=\"archiveSuggestedName\"\n      :default-format=\"archiveDefaultFormat\"\n      :allowed-formats=\"archiveAllowedFormats\"\n      :encryption=\"archiveEncryption\"\n      :busy=\"archiveCreateBusy\"\n      :request-error=\"archiveError\"\n      @close=\"showArchiveCreate = false\"\n      @submit=\"submitArchiveCreate\"\n    />\n    <ArchiveExtractModal\n      :open=\"showArchiveExtract\"\n      :locale=\"locale\"\n      :archive-name=\"archiveTarget?.basename || ''\"\n      :suggested-folder=\"archiveSuggestedFolder\"\n      :busy=\"!!archiveTarget && archiveExtracting.has(archiveTarget.path)\"\n      :error=\"archiveError\"\n      @close=\"showArchiveExtract = false\"\n      @submit=\"submitArchiveExtract\"\n    />\n    <ArchivePasswordModal\n      :open=\"showArchivePassword\"\n      :locale=\"locale\"\n      :archive-name=\"archivePasswordAction?.target.basename || archiveTarget?.basename || ''\"\n      :busy=\"!!archivePasswordAction && archiveExtracting.has(archivePasswordAction.target.path)\"\n      :error=\"archivePasswordError\"\n      @close=\"closeArchivePassword\"\n      @submit=\"submitArchivePassword\"\n    />\n\n    <!-- tasi:m1 — \"Şuraya taşı…\" / \"Şuraya kopyala…\". ONE dialog for both, and\n         the same one anything else that has to ask for a folder mounts (the\n         new-document flow does): a second private folder browser is how two\n         choosers start disagreeing about what a writable folder is. -->\n    <DestinationPickerModal\n      :open=\"showDestPicker\"\n      :api=\"paneApi /* wiring:e2 vault — an open vault lists from its index */\"\n      :vault-roots=\"destPickerVaultRoots /* wiring:e2 vault */\"\n      :vault-from=\"destPickerVaultFrom /* wiring:e2 vault */\"\n      :locale=\"locale\"\n      :mode=\"destPickerMode\"\n      :busy=\"destPickerBusy\"\n      :storages=\"(props.config.storages ?? []).map((st) => st.name) /* NAMES, not\n                 the objects — same shape NewDocumentModal takes */\"\n      :start-at=\"qualify(paneIsActive ? (splitPaneRef?.getPath() ?? '') : currentPath) /* open\n                 where the selection lives, not at the drive list */\"\n      :moving=\"destPickerMode === 'move'\n        ? destPickerTargets.filter((n) => n.type === 'dir').map((n) => n.path)\n        : [] /* only a MOVE can eat itself; a copy into your own subfolder is legal */\"\n      @close=\"showDestPicker = false\"\n      @pick=\"onDestinationPicked\"\n    />\n    <!-- wiring:e2 — encrypted-folder creation modal -->\n    <EncryptedFolderModal\n      :open=\"showEncFolder\"\n      :locale=\"locale\"\n      :busy=\"e2eCreateBusy\"\n      :escrow-kid=\"e2eEscrowKid\"\n      :existing=\"e2eConvTarget ? e2eConvTarget.basename : null\"\n      :vault-available=\"capabilitiesData?.e2e_vault === true /* wiring:e2 vault — a new folder only (the modal checks) */\"\n      @close=\"showEncFolder = false; e2eConvTarget = null\"\n      @submit=\"(p) => (e2eConvTarget ? submitConvertFolder(p) : submitEncryptedFolder(p))\"\n    />\n    <!-- wiring:e2 policy — \"Request encryption…\": asking an administrator to\n         allow one encryption, where the tenant's policy wants that. -->\n    <E2eRequestModal\n      :open=\"!!e2eRequestFor\"\n      :locale=\"locale\"\n      :api=\"api\"\n      :path=\"e2eRequestFor?.path ?? ''\"\n      :kind=\"e2eRequestFor?.kind ?? 'folder'\"\n      :name=\"e2eRequestFor?.name ?? ''\"\n      @close=\"e2eRequestFor = null\"\n      @sent=\"onE2eRequestSent\"\n    />\n    <!-- wiring:e2 recovery — the key, shown exactly once. -->\n    <RecoveryKeyModal\n      :open=\"showRecoveryKey\"\n      :locale=\"locale\"\n      :recovery-key=\"recoveryKeyValue\"\n      :folder-name=\"recoveryKeyFolder\"\n      :escrow-kid=\"e2eEscrowKid\"\n      :variant=\"recoveryKeyVariant\"\n      @close=\"closeRecoveryKey\"\n    />\n    <!-- wiring:e2 — the folder's encryption settings: its level, its\n         password, the escrow way back. -->\n    <E2eSettingsModal\n      :open=\"showE2eSettings\"\n      :locale=\"locale\"\n      :level=\"e2eLevel\"\n      :can-raise=\"e2eCanRaise\"\n      :plain-named=\"e2ePlainNamed\"\n      :escrow-state=\"e2eEscrowOfferState === 'n/a' || e2eEscrowOffer ? 'n/a' : e2eEscrowOfferState\"\n      :busy=\"e2eNamesBusy\"\n      @close=\"showE2eSettings = false\"\n      @raise-level=\"e2eRaiseLevel\"\n      @fix-names=\"e2eRaiseLevel\"\n      @change-password=\"e2eSettingsPassword\"\n      @escrow=\"e2eSettingsEscrow\"\n    />\n    <!-- wiring:e2 password — change the folder password, or set a new one\n         after a recovery-key unlock ('reset': closing it locks the folder). -->\n    <E2eChangePasswordModal\n      :open=\"showPwChange\"\n      :locale=\"locale\"\n      :mode=\"pwMode\"\n      :needs-rekey=\"e2ePwNeedsRekey\"\n      :vault=\"e2eLevel === 'vault' /* wiring:e2 vault — never re-keyed */\"\n      :has-recovery=\"markerHasRecovery(e2eMarker)\"\n      :has-escrow=\"markerHasEscrow(e2eMarker)\"\n      :busy=\"pwBusy\"\n      :error=\"pwErr\"\n      @close=\"e2eClosePasswordChange\"\n      @submit=\"e2eSubmitPassword\"\n    />\n    <!-- wiring:e2 recovery — the way back in without the password. -->\n    <E2eRecoveryUnlockModal\n      :open=\"showRecoveryUnlock\"\n      :locale=\"locale\"\n      :has-recovery=\"markerHasRecovery(e2eMarker)\"\n      :escrow-state=\"escrowAvailability(e2eMarker, e2eEscrowKid)\"\n      :escrow-kid=\"e2eMarker?.esc?.kid || e2eEscrowKid\"\n      :busy=\"e2eRecoverBusy\"\n      :error=\"e2eRecoverErr\"\n      @close=\"showRecoveryUnlock = false\"\n      @submit=\"e2eRecoverUnlock\"\n    />\n    <!-- wiring:e2 fxe — single encrypted files: encrypt, open/download/remove,\n         and a new password (the folder dialog, told it is a file). -->\n    <E2eFileEncryptModal\n      :open=\"!!e2eFiles.encryptTarget.value\"\n      :locale=\"locale\"\n      :file-name=\"e2eFiles.encryptTarget.value?.basename ?? ''\"\n      :busy=\"e2eFiles.encryptBusy.value\"\n      :error=\"e2eFiles.encryptError.value\"\n      :progress=\"e2eFiles.encryptProgress.value\"\n      :escrow-kid=\"e2eEscrowKid\"\n      :can-purge=\"callerAdmin\"\n      :not-owner=\"!!e2eFiles.encryptTarget.value && !ownedByViewer(e2eFiles.encryptTarget.value)\"\n      :owner-name=\"e2eFiles.encryptTarget.value ? ownerNameOf(e2eFiles.encryptTarget.value) : ''\"\n      @close=\"e2eFiles.closeEncrypt()\"\n      @submit=\"(p) => e2eFiles.submitEncrypt(p)\"\n    />\n    <E2eFileUnlockModal\n      :open=\"!!e2eFiles.unlockTarget.value\"\n      :locale=\"locale\"\n      :intent=\"e2eFiles.unlockIntent.value\"\n      :file-name=\"e2eFiles.unlockTarget.value ? (e2eFiles.realName(e2eFiles.unlockTarget.value.path) ?? e2eFiles.unlockTarget.value.basename) : ''\"\n      :known=\"!!e2eFiles.unlockTarget.value && !!e2eFiles.realName(e2eFiles.unlockTarget.value.path)\"\n      :has-recovery=\"e2eFiles.unlockHasRecovery.value\"\n      :busy=\"e2eFiles.unlockBusy.value\"\n      :error=\"e2eFiles.unlockError.value\"\n      :progress=\"e2eFiles.unlockProgress.value\"\n      :needs-save=\"e2eFiles.unlockNeedsSave.value\"\n      :escrow-state=\"e2eFiles.unlockEscrow.value\"\n      :escrow-kid=\"e2eFiles.unlockEscrowKid.value || e2eEscrowKid\"\n      @close=\"e2eFiles.closeUnlock()\"\n      @submit=\"(p) => e2eFiles.submitUnlock(p)\"\n    />\n    <E2eTooBigModal\n      :open=\"!!e2eFiles.tooBig.value\"\n      :locale=\"locale\"\n      :info=\"e2eFiles.tooBig.value\"\n      @close=\"e2eFiles.closeTooBig()\"\n      @download=\"e2eDownloadEncryptedInstead\"\n    />\n    <E2eChangePasswordModal\n      :open=\"!!e2eFiles.pwTarget.value\"\n      :locale=\"locale\"\n      mode=\"change\"\n      subject=\"file\"\n      :needs-rekey=\"false\"\n      :has-recovery=\"true\"\n      :has-escrow=\"false\"\n      :busy=\"e2eFiles.pwBusy.value\"\n      :error=\"e2eFiles.pwError.value\"\n      @close=\"e2eFiles.closePassword()\"\n      @submit=\"(p) => e2eFiles.submitPassword(p)\"\n    />\n    <!-- /wiring:e2 fxe -->\n    <!-- /wiring:e2 -->\n    <RenameModal\n      :open=\"showRename\"\n      :locale=\"locale\"\n      :current-name=\"renameTarget?.basename || ''\"\n      :error=\"renameError\"\n      :busy=\"renameBusy\"\n      @close=\"showRename = false\"\n      @submit=\"submitRename\"\n    />\n    <!-- tablo:t1 — emptying the trash is irreversible and it is a BULK\n         delete, so the question names what is about to go: how many things and\n         how much space. \"Empty the trash?\" with no quantity is a question\n         nobody can actually answer, and this is the last screen before the\n         bytes are gone for good. -->\n    <Modal\n      :open=\"showTrashConfirm\"\n      :title=\"t('trash.empty_confirm_title')\"\n      size=\"sm\"\n      @close=\"showTrashConfirm = false\"\n    >\n      <!-- ⚠⚠ The last screen before an irreversible bulk delete names the\n           SERVER's count of what the purge takes (its dry run), never the\n           rows this view has loaded (finding D1). The button waits for it. -->\n      <p v-if=\"trashPreview\" data-testid=\"trash-empty-count\">{{ trashPreview.summary }}</p>\n      <p v-else-if=\"trashPreviewError\" class=\"fe-form__error\" role=\"alert\">{{ trashPreviewError }}</p>\n      <p v-else role=\"status\">{{ t('trash.empty_counting') }}</p>\n      <template #actions>\n        <button type=\"button\" class=\"fe-btn\" @click=\"showTrashConfirm = false\">\n          {{ t('modal.delete.cancel') }}\n        </button>\n        <button\n          type=\"button\"\n          class=\"fe-btn fe-btn--danger\"\n          data-testid=\"trash-empty-confirm\"\n          :disabled=\"!trashPreview || trashPreview.count === 0\"\n          @click=\"emptyTrash\"\n        >\n          {{ t('trash.empty_action') }}\n        </button>\n      </template>\n    </Modal>\n    <DeleteConfirmModal\n      :open=\"showDelete\"\n      :locale=\"locale\"\n      :count=\"selection.size.value\"\n      :permanent=\"trashMode || vaultDeleting /* wiring:e2 vault — a vault keeps no trash */\"\n      :busy=\"deleteBusy\"\n      :error=\"deleteError\"\n      @close=\"showDelete = false\"\n      @confirm=\"confirmDelete\"\n    />\n    <PreviewModal\n      :open=\"showPreview\"\n      :locale=\"locale\"\n      :file=\"previewTarget\"\n      :theme=\"themeMode\"\n      :preview-url=\"(p) => e2ePreviewSrc(p) /* wiring:e2 — decrypted blob > raw URL */\"\n      :download-url=\"(p) => (e2eUnlocked || fxePreviewing || !!vault.rootOf(p) ? e2ePreviewSrc(p) : api.downloadUrl(p)) /* wiring:e2 (+ fxe, vault) */\"\n      :only-office-base=\"e2eActive || fxePreviewing || vaultPreviewing ? null : effectiveOnlyOfficeBase /* wiring:e2 — OO cannot open ciphertext */\"\n      :only-office-config-endpoint=\"effectiveOnlyOfficeConfigEndpoint\"\n      :can-configure=\"callerAdmin\"\n      :new-tab-enabled=\"!e2eActive && !fxePreviewing && !vaultPreviewing /* wiring:e2 — the standalone route pulls raw bytes */\"\n      :save-text-endpoint=\"e2eActive || fxePreviewing || vaultPreviewing ? null : api.endpoints.saveText || null /* wiring:e2 — a plaintext save would be a leak */\"\n      :archive-list-endpoint=\"vaultPreviewing ? null : api.endpoints.archiveList || null /* wiring:e2 vault — the server cannot list a zip it cannot read */\"\n      :open-mode=\"previewMode\"\n      :open-as=\"previewOpenAsExt /* #56 — a New document opens as its type */\"\n      :auth-headers=\"() => buildAuthHeaders({ 'Content-Type': 'application/json' })\"\n      :auth-credentials=\"api.credentialsMode()\"\n      :drawio-url=\"effectiveDrawioUrl\"\n      :pdf-worker-url=\"props.config.pdfWorkerUrl || null\"\n      :pdf-save-url=\"props.config.pdfSaveUrl || null\"\n      :viewer-base-url=\"effectiveViewerBaseUrl\"\n      :index=\"previewPosition.index /* gorunum:v1 — the 3-of-9 counter */\"\n      :total=\"previewPosition.total\"\n      :nav-enabled=\"previewPosition.total > 1\"\n      :share-enabled=\"!e2eActive && !fxePreviewing && !vaultPreviewing /* gorunum:v2 — the viewer's share icon opens the\n           SAME dialog the menu opens. It shipped disabled because nothing was\n           listening; an icon that does nothing is worse than no icon. Off inside\n           an encrypted folder, where a link would serve ciphertext. */\"\n      @share=\"(f: FileNode) => {\n        /* #85: the viewer names the file it shows - after a draft's Save the\n           saved file, where previewTarget is still the draft it was opened on. */\n        const n = f ?? previewTarget;\n        if (n) { permTarget = n; permInitialTab = undefined; showPerm = true; }\n      }\"\n      :api-base=\"props.config.apiBase ?? ''\"\n      :drafts-endpoint=\"draftsEnabled ? api.draftsBase : null /* Drafts, issue #71 */\"\n      :app-viewer=\"previewAppViewer /* v4 — an app's own interface for this type */\"\n      :in-office=\"previewInOffice /* 0.51 - a .csv in ONLYOFFICE */\"\n      :api=\"api\"\n      :user-name=\"props.config.userName || ''\"\n      :storages=\"(props.config.storages ?? []).map((st) => st.name) /* #149 — an app's save-as\n                 offers the storages Move to… offers */\"\n      @toast=\"flashToast\"\n      @op=\"(op) => onPluginOpQueued(op)\"\n      @nav=\"onPreviewNav\"\n      @draft-saved=\"onPreviewDraftSaved\"\n      @draft-discarded=\"onPreviewDraftDiscarded\"\n      @saved=\"onPreviewSaved\"\n      @close=\"showPreview = false\"\n    />\n    <!-- 0.50 - \"Choose an app…\": the handlers the administrator left on, and\n         \"always use this one for the kind\" (lib/openWith). -->\n    <OpenWithDialog\n      :open=\"!!openWithTarget\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :name=\"openWithTarget?.basename ?? ''\"\n      :kind=\"openWithKind\"\n      :handlers=\"openWithHandlers\"\n      :current=\"openWithCurrent\"\n      :remembered=\"openWithTarget ? personalOpenChoice(openWithTarget) : null\"\n      @cancel=\"openWithTarget = null\"\n      @open=\"openWithChosen\"\n    />\n    <!-- wiring:e2 vault — an upload into a vault whose name is taken: the same\n         \"already there\" dialog, asked before anything is written. -->\n    <DraftConflictModal\n      :open=\"!!vaultNameQuestion\"\n      kind=\"upload\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :name=\"vaultNameQuestion?.name ?? ''\"\n      :suggested=\"vaultNameQuestion?.suggested ?? ''\"\n      :folder=\"vaultNameQuestion?.folder ?? ''\"\n      @cancel=\"answerVaultName(false)\"\n      @confirm=\"answerVaultName(true)\"\n    />\n    <!-- Drafts (issue #71): the Drafts view's Save, when the name is taken. -->\n    <DraftConflictModal\n      :open=\"!!draftListSave.question.value\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :name=\"draftListSave.question.value?.name ?? ''\"\n      :suggested=\"draftListSave.question.value?.suggested ?? ''\"\n      :folder=\"draftListSave.question.value?.folder ?? ''\"\n      :busy=\"draftListSave.busy.value\"\n      :error=\"draftListSave.error.value\"\n      @cancel=\"draftListSave.cancel\"\n      @confirm=\"draftListSave.confirm\"\n    />\n    <!-- App plugins — a `modal` view, and the manifest's confirm question. -->\n    <!-- v4 — an app's own interface, as a dialog or its home screen. -->\n    <AppFrameModal\n      v-if=\"appFrameView\"\n      :key=\"`${appFrameView.plugin}/${appFrameView.view}`\"\n      :api=\"api\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :plugin=\"appFrameView.plugin\"\n      :view=\"appFrameView.view\"\n      :placement=\"appFrameView.placement\"\n      :ui=\"appFrameView.ui\"\n      :label=\"appFrameView.label\"\n      :files=\"appFrameView.files\"\n      :user-name=\"props.config.userName || ''\"\n      :storages=\"(props.config.storages ?? []).map((st) => st.name)\"\n      :start-at=\"qualify(paneIsActive ? (splitPaneRef?.getPath() ?? '') : currentPath) /* #149 — a home\n                 screen's save-as opens where the person is */\"\n      @close=\"appFrameView = null\"\n      @toast=\"flashToast\"\n      @op=\"(op) => onPluginOpQueued(op)\"\n    />\n    <PluginViewModal\n      v-if=\"pluginView\"\n      :open=\"pluginViewShown\"\n      :api=\"api\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :plugin=\"pluginView.plugin\"\n      :view=\"pluginView.view\"\n      :surface=\"pluginView.surface\"\n      :path=\"pluginView.path\"\n      :paths=\"pluginView.paths\"\n      :size=\"pluginView.size\"\n      :label=\"pluginView.label\"\n      :storages=\"(props.config.storages ?? []).map((st) => st.name)\"\n      :start-at=\"qualify(paneIsActive ? (splitPaneRef?.getPath() ?? '') : currentPath)\"\n      @close=\"pluginView = null\"\n      @op=\"(op) => onPluginOpQueued(op)\"\n      @toast=\"flashToast\"\n      @open=\"(req) => onSurfaceOpen(pluginView?.plugin ?? '', req)\"\n    />\n    <PluginConfirmModal\n      :open=\"!!pluginConfirm\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :title=\"pluginConfirm ? pluginLabelOf(pluginConfirm.action.label, locale) : ''\"\n      :message=\"pluginConfirm ? pluginLabelOf(pluginConfirm.action.confirm, locale) : ''\"\n      :danger=\"pluginConfirm?.action.danger === true\"\n      @close=\"pluginConfirm = null\"\n      @confirm=\"onPluginConfirmed\"\n    />\n    <PermissionsModal\n      v-if=\"showPerm && permTarget\"\n      :api=\"api\"\n      :path=\"permTarget.path\"\n      :is-dir=\"permTarget.type === 'dir'\"\n      :locale=\"locale\"\n      :share-max-ttl-days=\"shareMaxTtlDays\"\n      :initial-tab=\"permInitialTab /* surucu:d1 */\"\n      :mail-ready=\"capabilitiesData?.mail?.ready\"\n      :can-configure=\"callerAdmin\"\n      :perm=\"permTarget.perm || dirPerm\"\n      :sharing=\"permTargetSharing /* which of its sections the account may use (lib/sharingHeld) */\"\n      @close=\"showPerm = false; permInitialTab = undefined\"\n    />\n\n    <!-- Recently-opened tray. Anchored to the toolbar trigger via fixed\n         position; click the backdrop or any entry to dismiss.\n         `.fe` + theme class keeps the dark/light cascade matching the\n         host shell — without them the popup floats outside the\n         FileExplorer root and falls back to :root light defaults. -->\n    <transition name=\"fe-modal\">\n      <div\n        v-if=\"showRecents\"\n        class=\"fe fe-modal__backdrop fe-recents__backdrop\"\n        :class=\"{\n          'fe--theme-light': themeMode === 'light',\n          'fe--theme-dark': themeMode === 'dark',\n        }\"\n        @click=\"showRecents = false\"\n      >\n        <div class=\"fe-recents__panel\" @click.stop>\n          <div class=\"fe-recents__header\">\n            <strong>{{ t('recents.title') }}</strong>\n            <button class=\"fe-recents__close\" :aria-label=\"t('recents.close')\" @click=\"showRecents = false\">×</button>\n          </div>\n          <RecentlyOpened\n            :locale=\"locale\"\n            :api-base=\"props.config.apiBase ?? ''\"\n            :auth-headers=\"() => buildAuthHeaders()\"\n            :auth-credentials=\"api.credentialsMode()\"\n            :limit=\"20\"\n            :refresh-key=\"recentRefreshKey\"\n            @open=\"onRecentOpen\"\n            @context=\"onRecentContext\"\n            @error=\"(msg: string) => emit('error', { message: msg, context: { op: 'recents' } })\"\n          />\n        </div>\n      </div>\n    </transition>\n\n    <!-- Tag editor — opened from the context menu via Etiketler. -->\n    <transition name=\"fe-modal\">\n      <div\n        v-if=\"showTagPicker && tagPickerNode && typeof tagPickerNode.id === 'number'\"\n        class=\"fe-modal__backdrop\"\n        @click=\"showTagPicker = false\"\n      >\n        <div class=\"fe-modal__card fe-modal__card--md\" @click.stop>\n          <header class=\"fe-modal__head\">\n            <h2 class=\"fe-modal__title\">\n              {{ t('tags.title') }} - {{ tagPickerNode.basename }}\n            </h2>\n            <button class=\"fe-modal__close\" :aria-label=\"t('tags.close')\" @click=\"showTagPicker = false\">×</button>\n          </header>\n          <div class=\"fe-modal__body\">\n            <TagPicker\n              :node-id=\"tagPickerNode.id\"\n              :locale=\"locale\"\n              :api-base=\"props.config.apiBase ?? ''\"\n              :auth-headers=\"() => buildAuthHeaders()\"\n              :auth-credentials=\"api.credentialsMode()\"\n              @open=\"openTagView /* etiket:t1 — the SAME door as in the details\n                     panel; `openTagView` closes this dialog on the way, because\n                     leaving a modal open over the view it just navigated to is\n                     a dialog nobody asked to keep. */\"\n              @error=\"(msg: string) => emit('error', { message: msg, context: { op: 'tags' } })\"\n            />\n          </div>\n        </div>\n      </div>\n    </transition>\n\n    <!-- gorunum:v1-advsearch — the advanced search dialog. Its result lands in\n         `files` through the same load() a toolbar search lands in, so there is\n         exactly one results surface and one empty state. -->\n    <AdvancedSearch\n      :open=\"showAdvSearch\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :initial-query=\"advSearchSeed\"\n      :folder-label=\"driveScopeLabel\"\n      :path-base=\"advPathBase\"\n      :content-search=\"advContentAvailable\"\n      :count=\"advSearchCount\"\n      :known-tags=\"advKnownTags\"\n      @close=\"showAdvSearch = false\"\n      @submit=\"applyAdvancedSearch\"\n    />\n\n    <!-- cila:c wiring — command palette (Ctrl/Cmd+K) + shortcuts help (?) -->\n    <CommandPalette\n      :initial-query=\"paletteSeed /* surucu:d1 */\"\n      :open=\"showPalette\"\n      :locale=\"locale\"\n      :files=\"files\"\n      :view-mode=\"viewMode\"\n      :can-write=\"canWriteHere && !atVirtualRoot && !trashActive\"\n      :can-go-up=\"canGoUp\"\n      :global-search=\"paletteGlobalSearch\"\n      :hit-can=\"paletteHitCan /* #47 */\"\n      @close=\"showPalette = false\"\n      @open-hit=\"onPaletteOpenHit /* #47 — another account's hit goes to the host */\"\n      @download-hit=\"downloadSearchHit /* #47 */\"\n      @drag-hit=\"onPaletteDragHit /* #47 */\"\n      @warm-hit=\"onPaletteWarmHit /* #71 */\"\n      @drop-inside=\"onPaletteDropInside /* #47 */\"\n      @open-node=\"openNode\"\n      @navigate=\"(p: string) => load(p)\"\n      @new-folder=\"showNewFolder = true\"\n      @upload=\"triggerUpload\"\n      @toggle-view=\"setDisplayedViewMode(displayedViewMode === 'list' ? 'grid' : displayedViewMode === 'grid' ? 'gallery' : 'list') /* wiring:d2 + ui-fix — 3-mode cycle, to the active pane */\"\n      @open-trash=\"loadTrash\"\n      @refresh=\"refreshAll /* gorunum:v2-topbar */\"\n      @go-up=\"goUp\"\n      @open-theme=\"showThemeGallery = true /* wiring:int */\"\n      @open-shortcut-settings=\"showShortcutSettings = true /* wiring:int */\"\n      @start-tour=\"startTour() /* wiring:int */\"\n      :split-enabled=\"splitOffered /* wiring:d1 — see splitOffered */\"\n      @tab-new=\"newTabHere() /* wiring:d1 */\"\n      @split-toggle=\"toggleSplit() /* wiring:d1 */\"\n    />\n    <ShortcutsHelp\n      :open=\"showShortcutsHelp\"\n      :locale=\"locale\"\n      @close=\"showShortcutsHelp = false\"\n      @customize=\"showShortcutsHelp = false; showShortcutSettings = true /* wiring:c2 */\"\n    />\n    <!-- /cila:c wiring -->\n\n    <!-- The person's own settings — the admin app's dialog, for a host that\n         asked (`config.account.settings`, the desktop app). -->\n    <UserSettingsDialog\n      v-if=\"settingsOpen\"\n      v-model=\"settingsOpen\"\n      :host=\"settingsHost\"\n    />\n\n    <!-- The full list \"See all\" opens — teleported to <body>, like the web's. -->\n    <NotificationsPanel\n      v-if=\"notifFeed\"\n      :feed=\"notifFeed\"\n      :locale=\"locale\"\n      @open=\"onNotificationOpen\"\n    />\n\n    <!-- wiring:c1 — tema galerisi -->\n    <ThemeGallery\n      :open=\"showThemeGallery\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :dark=\"themeResolvedDark\"\n      :current=\"activeThemeId\"\n      :mode=\"themeModePref\"\n      :host-mode=\"config.theme || 'auto'\"\n      @close=\"showThemeGallery = false\"\n      @select=\"setActiveTheme\"\n      @mode=\"(m: ThemeModePref) => setThemeModePref(m)\"\n    />\n    <!-- /wiring:c1 -->\n\n    <input\n      ref=\"fileInputEl\"\n      type=\"file\"\n      multiple\n      class=\"fe__file-input\"\n      @change=\"onFilePicked\"\n    />\n\n    <transition name=\"fe-toast\">\n      <div\n        v-if=\"toast\"\n        class=\"fe-toast\"\n        :class=\"{ 'fe-toast--action': !!toast.actionLabel }\"\n        role=\"status\"\n        @click=\"dismissToast\"\n      >\n        <span class=\"fe-toast__msg\">{{ toast.message }}</span>\n        <button\n          v-if=\"toast.actionLabel && toast.action\"\n          type=\"button\"\n          class=\"fe-toast__action\"\n          @click.stop=\"runToastAction\"\n        >{{ toast.actionLabel }}</button>\n      </div>\n    </transition>\n\n    <!-- zaman:z3 — the embed's own time-zone setting (kept in this browser) -->\n    <TimeZoneDialog\n      :open=\"showTimeZone\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      @close=\"showTimeZone = false\"\n    />\n\n    <!-- wiring:c2 — shortcut settings modal + Space quick-look overlay -->\n    <ShortcutSettings\n      :open=\"showShortcutSettings\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      @close=\"showShortcutSettings = false\"\n    />\n    <QuickLook\n      :open=\"quickLookOpen\"\n      :locale=\"locale\"\n      :file=\"quickLookTarget\"\n      :theme=\"themeMode\"\n      :preview-url=\"(p: string) => e2ePreviewSrc(p) /* wiring:e2 */\"\n      :download-url=\"(p: string) => (e2eUnlocked || !!vault.rootOf(p) ? e2ePreviewSrc(p) : api.downloadUrl(p)) /* wiring:e2 (+ vault) */\"\n      :only-office-base=\"e2eActive ? null : effectiveOnlyOfficeBase /* wiring:e2 */\"\n      :only-office-config-endpoint=\"effectiveOnlyOfficeConfigEndpoint\"\n      :can-configure=\"callerAdmin\"\n      :auth-headers=\"() => buildAuthHeaders({ 'Content-Type': 'application/json' })\"\n      :auth-credentials=\"api.credentialsMode()\"\n      :drawio-url=\"effectiveDrawioUrl\"\n      :pdf-worker-url=\"props.config.pdfWorkerUrl || null\"\n      :viewer-base-url=\"effectiveViewerBaseUrl\"\n      @close=\"quickLookOpen = false\"\n      @nav=\"quickLookNav\"\n      @open-full=\"quickLookOpenFull\"\n    />\n    <!-- /wiring:c2 -->\n    <!-- wiring:c4 — onboarding coach-mark tour (teleports itself to body) -->\n    <OnboardingTour\n      :open=\"showTour\"\n      :locale=\"locale\"\n      :root=\"rootEl\"\n      :theme=\"themeMode\"\n      @close=\"onTourClose\"\n    />\n    <!-- /wiring:c4 -->\n  </div>\n</template>\n\n<style src=\"./styles/variables.css\"></style>\n<style src=\"./styles/base.css\"></style>\n<!-- The five signing faces, self-hosted. Declared here so the ONE rolled-up\n     `style.css` every host already imports carries them; a browser fetches a\n     `.woff2` only when text is actually drawn in that family, so a host that\n     never opens a signing screen pays nothing. -->\n<style src=\"./styles/sign-fonts.css\"></style>\n","/*! @license DOMPurify 3.4.2 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.2/LICENSE */\n\nconst {\n  entries,\n  setPrototypeOf,\n  isFrozen,\n  getPrototypeOf,\n  getOwnPropertyDescriptor\n} = Object;\nlet {\n  freeze,\n  seal,\n  create\n} = Object; // eslint-disable-line import/no-mutable-exports\nlet {\n  apply,\n  construct\n} = typeof Reflect !== 'undefined' && Reflect;\nif (!freeze) {\n  freeze = function freeze(x) {\n    return x;\n  };\n}\nif (!seal) {\n  seal = function seal(x) {\n    return x;\n  };\n}\nif (!apply) {\n  apply = function apply(func, thisArg) {\n    for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n      args[_key - 2] = arguments[_key];\n    }\n    return func.apply(thisArg, args);\n  };\n}\nif (!construct) {\n  construct = function construct(Func) {\n    for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      args[_key2 - 1] = arguments[_key2];\n    }\n    return new Func(...args);\n  };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst arrayIsArray = Array.isArray;\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst numberToString = unapply(Number.prototype.toString);\nconst booleanToString = unapply(Boolean.prototype.toString);\nconst bigintToString = typeof BigInt === 'undefined' ? null : unapply(BigInt.prototype.toString);\nconst symbolToString = typeof Symbol === 'undefined' ? null : unapply(Symbol.prototype.toString);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst objectToString = unapply(Object.prototype.toString);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n  return function (thisArg) {\n    if (thisArg instanceof RegExp) {\n      thisArg.lastIndex = 0;\n    }\n    for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n      args[_key3 - 1] = arguments[_key3];\n    }\n    return apply(func, thisArg, args);\n  };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(Func) {\n  return function () {\n    for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n      args[_key4] = arguments[_key4];\n    }\n    return construct(Func, args);\n  };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n  let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n  if (setPrototypeOf) {\n    // Make 'in' and truthy checks like Boolean(set.constructor)\n    // independent of any properties defined on Object.prototype.\n    // Prevent prototype setters from intercepting set as a this value.\n    setPrototypeOf(set, null);\n  }\n  if (!arrayIsArray(array)) {\n    return set;\n  }\n  let l = array.length;\n  while (l--) {\n    let element = array[l];\n    if (typeof element === 'string') {\n      const lcElement = transformCaseFunc(element);\n      if (lcElement !== element) {\n        // Config presets (e.g. tags.js, attrs.js) are immutable.\n        if (!isFrozen(array)) {\n          array[l] = lcElement;\n        }\n        element = lcElement;\n      }\n    }\n    set[element] = true;\n  }\n  return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n  for (let index = 0; index < array.length; index++) {\n    const isPropertyExist = objectHasOwnProperty(array, index);\n    if (!isPropertyExist) {\n      array[index] = null;\n    }\n  }\n  return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n  const newObject = create(null);\n  for (const [property, value] of entries(object)) {\n    const isPropertyExist = objectHasOwnProperty(object, property);\n    if (isPropertyExist) {\n      if (arrayIsArray(value)) {\n        newObject[property] = cleanArray(value);\n      } else if (value && typeof value === 'object' && value.constructor === Object) {\n        newObject[property] = clone(value);\n      } else {\n        newObject[property] = value;\n      }\n    }\n  }\n  return newObject;\n}\n/**\n * Convert non-node values into strings without depending on direct property access.\n *\n * @param value - The value to stringify.\n * @returns A string representation of the provided value.\n */\nfunction stringifyValue(value) {\n  switch (typeof value) {\n    case 'string':\n      {\n        return value;\n      }\n    case 'number':\n      {\n        return numberToString(value);\n      }\n    case 'boolean':\n      {\n        return booleanToString(value);\n      }\n    case 'bigint':\n      {\n        return bigintToString ? bigintToString(value) : '0';\n      }\n    case 'symbol':\n      {\n        return symbolToString ? symbolToString(value) : 'Symbol()';\n      }\n    case 'undefined':\n      {\n        return objectToString(value);\n      }\n    case 'function':\n    case 'object':\n      {\n        if (value === null) {\n          return objectToString(value);\n        }\n        const valueAsRecord = value;\n        const valueToString = lookupGetter(valueAsRecord, 'toString');\n        if (typeof valueToString === 'function') {\n          const stringified = valueToString(valueAsRecord);\n          return typeof stringified === 'string' ? stringified : objectToString(stringified);\n        }\n        return objectToString(value);\n      }\n    default:\n      {\n        return objectToString(value);\n      }\n  }\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n  while (object !== null) {\n    const desc = getOwnPropertyDescriptor(object, prop);\n    if (desc) {\n      if (desc.get) {\n        return unapply(desc.get);\n      }\n      if (typeof desc.value === 'function') {\n        return unapply(desc.value);\n      }\n    }\n    object = getPrototypeOf(object);\n  }\n  function fallbackValue() {\n    return null;\n  }\n  return fallbackValue;\n}\nfunction isRegex(value) {\n  try {\n    regExpTest(value, '');\n    return true;\n  } catch (_unused) {\n    return false;\n  }\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'search', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'mask-type', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lquote', 'lspace', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n// eslint-disable-next-line unicorn/better-regex\nconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nconst TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\nvar EXPRESSIONS = /*#__PURE__*/Object.freeze({\n    __proto__: null,\n    ARIA_ATTR: ARIA_ATTR,\n    ATTR_WHITESPACE: ATTR_WHITESPACE,\n    CUSTOM_ELEMENT: CUSTOM_ELEMENT,\n    DATA_ATTR: DATA_ATTR,\n    DOCTYPE_NAME: DOCTYPE_NAME,\n    ERB_EXPR: ERB_EXPR,\n    IS_ALLOWED_URI: IS_ALLOWED_URI,\n    IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n    MUSTACHE_EXPR: MUSTACHE_EXPR,\n    TMPLIT_EXPR: TMPLIT_EXPR\n});\n\n/* eslint-disable @typescript-eslint/indent */\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n  element: 1,\n  text: 3,\n  // Deprecated\n  progressingInstruction: 7,\n  comment: 8,\n  document: 9};\nconst getGlobal = function getGlobal() {\n  return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n  if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n    return null;\n  }\n  // Allow the callers to control the unique policy name\n  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n  // Policy creation with duplicate names throws in Trusted Types.\n  let suffix = null;\n  const ATTR_NAME = 'data-tt-policy-suffix';\n  if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n    suffix = purifyHostElement.getAttribute(ATTR_NAME);\n  }\n  const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n  try {\n    return trustedTypes.createPolicy(policyName, {\n      createHTML(html) {\n        return html;\n      },\n      createScriptURL(scriptUrl) {\n        return scriptUrl;\n      }\n    });\n  } catch (_) {\n    // Policy creation failed (most likely another DOMPurify script has\n    // already run). Skip creating the policy, as this will only cause errors\n    // if TT are enforced.\n    console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n    return null;\n  }\n};\nconst _createHooksMap = function _createHooksMap() {\n  return {\n    afterSanitizeAttributes: [],\n    afterSanitizeElements: [],\n    afterSanitizeShadowDOM: [],\n    beforeSanitizeAttributes: [],\n    beforeSanitizeElements: [],\n    beforeSanitizeShadowDOM: [],\n    uponSanitizeAttribute: [],\n    uponSanitizeElement: [],\n    uponSanitizeShadowNode: []\n  };\n};\nfunction createDOMPurify() {\n  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n  const DOMPurify = root => createDOMPurify(root);\n  DOMPurify.version = '3.4.2';\n  DOMPurify.removed = [];\n  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n    // Not running in a browser, provide a factory function\n    // so that you can pass your own Window\n    DOMPurify.isSupported = false;\n    return DOMPurify;\n  }\n  let {\n    document\n  } = window;\n  const originalDocument = document;\n  const currentScript = originalDocument.currentScript;\n  const {\n    DocumentFragment,\n    HTMLTemplateElement,\n    Node,\n    Element,\n    NodeFilter,\n    NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n    HTMLFormElement,\n    DOMParser,\n    trustedTypes\n  } = window;\n  const ElementPrototype = Element.prototype;\n  const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n  const remove = lookupGetter(ElementPrototype, 'remove');\n  const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n  const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n  const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n  // As per issue #47, the web-components registry is inherited by a\n  // new document created via createHTMLDocument. As per the spec\n  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n  // a new empty registry is used when creating a template contents owner\n  // document, so we use that as our parent document to ensure nothing\n  // is inherited.\n  if (typeof HTMLTemplateElement === 'function') {\n    const template = document.createElement('template');\n    if (template.content && template.content.ownerDocument) {\n      document = template.content.ownerDocument;\n    }\n  }\n  let trustedTypesPolicy;\n  let emptyHTML = '';\n  const {\n    implementation,\n    createNodeIterator,\n    createDocumentFragment,\n    getElementsByTagName\n  } = document;\n  const {\n    importNode\n  } = originalDocument;\n  let hooks = _createHooksMap();\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n  const {\n    MUSTACHE_EXPR,\n    ERB_EXPR,\n    TMPLIT_EXPR,\n    DATA_ATTR,\n    ARIA_ATTR,\n    IS_SCRIPT_OR_DATA,\n    ATTR_WHITESPACE,\n    CUSTOM_ELEMENT\n  } = EXPRESSIONS;\n  let {\n    IS_ALLOWED_URI: IS_ALLOWED_URI$1\n  } = EXPRESSIONS;\n  /**\n   * We consider the elements and attributes below to be safe. Ideally\n   * don't add any new ones but feel free to remove unwanted ones.\n   */\n  /* allowed element names */\n  let ALLOWED_TAGS = null;\n  const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n  /* Allowed attribute names */\n  let ALLOWED_ATTR = null;\n  const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n  /*\n   * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n   */\n  let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    allowCustomizedBuiltInElements: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: false\n    }\n  }));\n  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n  let FORBID_TAGS = null;\n  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n  let FORBID_ATTR = null;\n  /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n  const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    }\n  }));\n  /* Decide if ARIA attributes are okay */\n  let ALLOW_ARIA_ATTR = true;\n  /* Decide if custom data attributes are okay */\n  let ALLOW_DATA_ATTR = true;\n  /* Decide if unknown protocols are okay */\n  let ALLOW_UNKNOWN_PROTOCOLS = false;\n  /* Decide if self-closing tags in attributes are allowed.\n   * Usually removed due to a mXSS issue in jQuery 3.0 */\n  let ALLOW_SELF_CLOSE_IN_ATTR = true;\n  /* Output should be safe for common template engines.\n   * This means, DOMPurify removes data attributes, mustaches and ERB\n   */\n  let SAFE_FOR_TEMPLATES = false;\n  /* Output should be safe even for XML used within HTML and alike.\n   * This means, DOMPurify removes comments when containing risky content.\n   */\n  let SAFE_FOR_XML = true;\n  /* Decide if document with <html>... should be returned */\n  let WHOLE_DOCUMENT = false;\n  /* Track whether config is already set on this instance of DOMPurify. */\n  let SET_CONFIG = false;\n  /* Decide if all elements (e.g. style, script) must be children of\n   * document.body. By default, browsers might move them to document.head */\n  let FORCE_BODY = false;\n  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n   * string (or a TrustedHTML object if Trusted Types are supported).\n   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n   */\n  let RETURN_DOM = false;\n  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n   * string  (or a TrustedHTML object if Trusted Types are supported) */\n  let RETURN_DOM_FRAGMENT = false;\n  /* Try to return a Trusted Type object instead of a string, return a string in\n   * case Trusted Types are not supported  */\n  let RETURN_TRUSTED_TYPE = false;\n  /* Output should be free from DOM clobbering attacks?\n   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n   */\n  let SANITIZE_DOM = true;\n  /* Achieve full DOM Clobbering protection by isolating the namespace of named\n   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n   *\n   * HTML/DOM spec rules that enable DOM Clobbering:\n   *   - Named Access on Window (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.2.10.2)\n   *\n   * Namespace isolation is implemented by prefixing `id` and `name` attributes\n   * with a constant string, i.e., `user-content-`\n   */\n  let SANITIZE_NAMED_PROPS = false;\n  const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n  /* Keep element content when removing element? */\n  let KEEP_CONTENT = true;\n  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n   * of importing it into a new Document and returning a sanitized copy */\n  let IN_PLACE = false;\n  /* Allow usage of profiles like html, svg and mathMl */\n  let USE_PROFILES = {};\n  /* Tags to ignore content of when KEEP_CONTENT is true */\n  let FORBID_CONTENTS = null;\n  const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n  /* Tags that are safe for data: URIs */\n  let DATA_URI_TAGS = null;\n  const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n  /* Attributes safe for values like \"javascript:\" */\n  let URI_SAFE_ATTRIBUTES = null;\n  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n  const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n  const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n  const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  /* Document namespace */\n  let NAMESPACE = HTML_NAMESPACE;\n  let IS_EMPTY_INPUT = false;\n  /* Allowed XHTML+XML namespaces */\n  let ALLOWED_NAMESPACES = null;\n  const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n  let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n  let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n  // Certain elements are allowed in both SVG and HTML\n  // namespace. We need to specify them explicitly\n  // so that they don't get erroneously deleted from\n  // HTML namespace.\n  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n  /* Parsing of strict XHTML documents */\n  let PARSER_MEDIA_TYPE = null;\n  const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n  const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n  let transformCaseFunc = null;\n  /* Keep a reference to config to pass to hooks */\n  let CONFIG = null;\n  /* Ideally, do not touch anything below this line */\n  /* ______________________________________________ */\n  const formElement = document.createElement('form');\n  const isRegexOrFunction = function isRegexOrFunction(testValue) {\n    return testValue instanceof RegExp || testValue instanceof Function;\n  };\n  /**\n   * _parseConfig\n   *\n   * @param cfg optional config literal\n   */\n  // eslint-disable-next-line complexity\n  const _parseConfig = function _parseConfig() {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    if (CONFIG && CONFIG === cfg) {\n      return;\n    }\n    /* Shield configuration object from tampering */\n    if (!cfg || typeof cfg !== 'object') {\n      cfg = {};\n    }\n    /* Shield configuration object from prototype pollution */\n    cfg = clone(cfg);\n    PARSER_MEDIA_TYPE =\n    // eslint-disable-next-line unicorn/prefer-includes\n    SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n    // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n    transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n    /* Set configuration parameters */\n    ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') && arrayIsArray(cfg.ALLOWED_TAGS) ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n    ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') && arrayIsArray(cfg.ALLOWED_ATTR) ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n    ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') && arrayIsArray(cfg.ALLOWED_NAMESPACES) ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n    URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') && arrayIsArray(cfg.ADD_URI_SAFE_ATTR) ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;\n    DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') && arrayIsArray(cfg.ADD_DATA_URI_TAGS) ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;\n    FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') && arrayIsArray(cfg.FORBID_CONTENTS) ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n    FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') && arrayIsArray(cfg.FORBID_TAGS) ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : clone({});\n    FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') && arrayIsArray(cfg.FORBID_ATTR) ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : clone({});\n    USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === 'object' ? clone(cfg.USE_PROFILES) : cfg.USE_PROFILES : false;\n    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n    SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n    RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n    FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n    IN_PLACE = cfg.IN_PLACE || false; // Default false\n    IS_ALLOWED_URI$1 = isRegex(cfg.ALLOWED_URI_REGEXP) ? cfg.ALLOWED_URI_REGEXP : IS_ALLOWED_URI; // Default regexp\n    NAMESPACE = typeof cfg.NAMESPACE === 'string' ? cfg.NAMESPACE : HTML_NAMESPACE; // Default HTML namespace\n    MATHML_TEXT_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'MATHML_TEXT_INTEGRATION_POINTS') && cfg.MATHML_TEXT_INTEGRATION_POINTS && typeof cfg.MATHML_TEXT_INTEGRATION_POINTS === 'object' ? clone(cfg.MATHML_TEXT_INTEGRATION_POINTS) : addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']); // Default built-in map\n    HTML_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'HTML_INTEGRATION_POINTS') && cfg.HTML_INTEGRATION_POINTS && typeof cfg.HTML_INTEGRATION_POINTS === 'object' ? clone(cfg.HTML_INTEGRATION_POINTS) : addToSet({}, ['annotation-xml']); // Default built-in map\n    const customElementHandling = objectHasOwnProperty(cfg, 'CUSTOM_ELEMENT_HANDLING') && cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING === 'object' ? clone(cfg.CUSTOM_ELEMENT_HANDLING) : create(null);\n    CUSTOM_ELEMENT_HANDLING = create(null);\n    if (objectHasOwnProperty(customElementHandling, 'tagNameCheck') && isRegexOrFunction(customElementHandling.tagNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck; // Default undefined\n    }\n    if (objectHasOwnProperty(customElementHandling, 'attributeNameCheck') && isRegexOrFunction(customElementHandling.attributeNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.attributeNameCheck = customElementHandling.attributeNameCheck; // Default undefined\n    }\n    if (objectHasOwnProperty(customElementHandling, 'allowCustomizedBuiltInElements') && typeof customElementHandling.allowCustomizedBuiltInElements === 'boolean') {\n      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = customElementHandling.allowCustomizedBuiltInElements; // Default undefined\n    }\n    if (SAFE_FOR_TEMPLATES) {\n      ALLOW_DATA_ATTR = false;\n    }\n    if (RETURN_DOM_FRAGMENT) {\n      RETURN_DOM = true;\n    }\n    /* Parse profile info */\n    if (USE_PROFILES) {\n      ALLOWED_TAGS = addToSet({}, text);\n      ALLOWED_ATTR = create(null);\n      if (USE_PROFILES.html === true) {\n        addToSet(ALLOWED_TAGS, html$1);\n        addToSet(ALLOWED_ATTR, html);\n      }\n      if (USE_PROFILES.svg === true) {\n        addToSet(ALLOWED_TAGS, svg$1);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.svgFilters === true) {\n        addToSet(ALLOWED_TAGS, svgFilters);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.mathMl === true) {\n        addToSet(ALLOWED_TAGS, mathMl$1);\n        addToSet(ALLOWED_ATTR, mathMl);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n    }\n    /* Always reset function-based ADD_TAGS / ADD_ATTR checks to prevent\n     * leaking across calls when switching from function to array config */\n    EXTRA_ELEMENT_HANDLING.tagCheck = null;\n    EXTRA_ELEMENT_HANDLING.attributeCheck = null;\n    /* Merge configuration parameters */\n    if (objectHasOwnProperty(cfg, 'ADD_TAGS')) {\n      if (typeof cfg.ADD_TAGS === 'function') {\n        EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n      } else if (arrayIsArray(cfg.ADD_TAGS)) {\n        if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n          ALLOWED_TAGS = clone(ALLOWED_TAGS);\n        }\n        addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n      }\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_ATTR')) {\n      if (typeof cfg.ADD_ATTR === 'function') {\n        EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n      } else if (arrayIsArray(cfg.ADD_ATTR)) {\n        if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n          ALLOWED_ATTR = clone(ALLOWED_ATTR);\n        }\n        addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n      }\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') && arrayIsArray(cfg.ADD_URI_SAFE_ATTR)) {\n      addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n    }\n    if (objectHasOwnProperty(cfg, 'FORBID_CONTENTS') && arrayIsArray(cfg.FORBID_CONTENTS)) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_FORBID_CONTENTS') && arrayIsArray(cfg.ADD_FORBID_CONTENTS)) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n    }\n    /* Add #text in case KEEP_CONTENT is set to true */\n    if (KEEP_CONTENT) {\n      ALLOWED_TAGS['#text'] = true;\n    }\n    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n    if (WHOLE_DOCUMENT) {\n      addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n    }\n    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n    if (ALLOWED_TAGS.table) {\n      addToSet(ALLOWED_TAGS, ['tbody']);\n      delete FORBID_TAGS.tbody;\n    }\n    if (cfg.TRUSTED_TYPES_POLICY) {\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n      }\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n      }\n      // Overwrite existing TrustedTypes policy.\n      trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n      // Sign local variables required by `sanitize`.\n      emptyHTML = trustedTypesPolicy.createHTML('');\n    } else {\n      // Uninitialized policy, attempt to initialize the internal dompurify policy.\n      if (trustedTypesPolicy === undefined) {\n        trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n      }\n      // If creating the internal policy succeeded sign internal variables.\n      if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n        emptyHTML = trustedTypesPolicy.createHTML('');\n      }\n    }\n    // Prevent further manipulation of configuration.\n    // Not available in IE8, Safari 5, etc.\n    if (freeze) {\n      freeze(cfg);\n    }\n    CONFIG = cfg;\n  };\n  /* Keep track of all possible SVG and MathML tags\n   * so that we can perform the namespace checks\n   * correctly. */\n  const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n  const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n  /**\n   * @param element a DOM element whose namespace is being checked\n   * @returns Return false if the element has a\n   *  namespace that a spec-compliant parser would never\n   *  return. Return true otherwise.\n   */\n  const _checkValidNamespace = function _checkValidNamespace(element) {\n    let parent = getParentNode(element);\n    // In JSDOM, if we're inside shadow DOM, then parentNode\n    // can be null. We just simulate parent in this case.\n    if (!parent || !parent.tagName) {\n      parent = {\n        namespaceURI: NAMESPACE,\n        tagName: 'template'\n      };\n    }\n    const tagName = stringToLowerCase(element.tagName);\n    const parentTagName = stringToLowerCase(parent.tagName);\n    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return false;\n    }\n    if (element.namespaceURI === SVG_NAMESPACE) {\n      // The only way to switch from HTML namespace to SVG\n      // is via <svg>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === 'svg';\n      }\n      // The only way to switch from MathML to SVG is via`\n      // svg if parent is either <annotation-xml> or MathML\n      // text integration points.\n      if (parent.namespaceURI === MATHML_NAMESPACE) {\n        return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n      }\n      // We only allow elements that are defined in SVG\n      // spec. All others are disallowed in SVG namespace.\n      return Boolean(ALL_SVG_TAGS[tagName]);\n    }\n    if (element.namespaceURI === MATHML_NAMESPACE) {\n      // The only way to switch from HTML namespace to MathML\n      // is via <math>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === 'math';\n      }\n      // The only way to switch from SVG to MathML is via\n      // <math> and HTML integration points\n      if (parent.namespaceURI === SVG_NAMESPACE) {\n        return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n      }\n      // We only allow elements that are defined in MathML\n      // spec. All others are disallowed in MathML namespace.\n      return Boolean(ALL_MATHML_TAGS[tagName]);\n    }\n    if (element.namespaceURI === HTML_NAMESPACE) {\n      // The only way to switch from SVG to HTML is via\n      // HTML integration points, and from MathML to HTML\n      // is via MathML text integration points\n      if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n        return false;\n      }\n      if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n        return false;\n      }\n      // We disallow tags that are specific for MathML\n      // or SVG and should never appear in HTML namespace\n      return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n    }\n    // For XHTML and XML documents that support custom namespaces\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return true;\n    }\n    // The code should never reach this place (this means\n    // that the element somehow got namespace that is not\n    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n    // Return false just in case.\n    return false;\n  };\n  /**\n   * _forceRemove\n   *\n   * @param node a DOM node\n   */\n  const _forceRemove = function _forceRemove(node) {\n    arrayPush(DOMPurify.removed, {\n      element: node\n    });\n    try {\n      // eslint-disable-next-line unicorn/prefer-dom-node-remove\n      getParentNode(node).removeChild(node);\n    } catch (_) {\n      remove(node);\n    }\n  };\n  /**\n   * _removeAttribute\n   *\n   * @param name an Attribute name\n   * @param element a DOM node\n   */\n  const _removeAttribute = function _removeAttribute(name, element) {\n    try {\n      arrayPush(DOMPurify.removed, {\n        attribute: element.getAttributeNode(name),\n        from: element\n      });\n    } catch (_) {\n      arrayPush(DOMPurify.removed, {\n        attribute: null,\n        from: element\n      });\n    }\n    element.removeAttribute(name);\n    // We void attribute values for unremovable \"is\" attributes\n    if (name === 'is') {\n      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n        try {\n          _forceRemove(element);\n        } catch (_) {}\n      } else {\n        try {\n          element.setAttribute(name, '');\n        } catch (_) {}\n      }\n    }\n  };\n  /**\n   * _initDocument\n   *\n   * @param dirty - a string of dirty markup\n   * @return a DOM, filled with the dirty markup\n   */\n  const _initDocument = function _initDocument(dirty) {\n    /* Create a HTML document */\n    let doc = null;\n    let leadingWhitespace = null;\n    if (FORCE_BODY) {\n      dirty = '<remove></remove>' + dirty;\n    } else {\n      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n      const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n      leadingWhitespace = matches && matches[0];\n    }\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n      dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n    }\n    const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n    /*\n     * Use the DOMParser API by default, fallback later if needs be\n     * DOMParser not work for svg when has multiple root element.\n     */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      try {\n        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n      } catch (_) {}\n    }\n    /* Use createHTMLDocument in case DOMParser is not available */\n    if (!doc || !doc.documentElement) {\n      doc = implementation.createDocument(NAMESPACE, 'template', null);\n      try {\n        doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n      } catch (_) {\n        // Syntax error if dirtyPayload is invalid xml\n      }\n    }\n    const body = doc.body || doc.documentElement;\n    if (dirty && leadingWhitespace) {\n      body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n    }\n    /* Work on whole document or just its body */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n    }\n    return WHOLE_DOCUMENT ? doc.documentElement : body;\n  };\n  /**\n   * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n   *\n   * @param root The root element or node to start traversing on.\n   * @return The created NodeIterator\n   */\n  const _createNodeIterator = function _createNodeIterator(root) {\n    return createNodeIterator.call(root.ownerDocument || root, root,\n    // eslint-disable-next-line no-bitwise\n    NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n  };\n  /**\n   * _isClobbered\n   *\n   * @param element element to check for clobbering attacks\n   * @return true if clobbered, false if safe\n   */\n  const _isClobbered = function _isClobbered(element) {\n    return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function');\n  };\n  /**\n   * Checks whether the given object is a DOM node.\n   *\n   * @param value object to check whether it's a DOM node\n   * @return true is object is a DOM node\n   */\n  const _isNode = function _isNode(value) {\n    return typeof Node === 'function' && value instanceof Node;\n  };\n  function _executeHooks(hooks, currentNode, data) {\n    arrayForEach(hooks, hook => {\n      hook.call(DOMPurify, currentNode, data, CONFIG);\n    });\n  }\n  /**\n   * _sanitizeElements\n   *\n   * @protect nodeName\n   * @protect textContent\n   * @protect removeChild\n   * @param currentNode to check for permission to exist\n   * @return true if node was killed, false if left alive\n   */\n  const _sanitizeElements = function _sanitizeElements(currentNode) {\n    let content = null;\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n    /* Check if element is clobbered or can clobber */\n    if (_isClobbered(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Now let's check the element's type and name */\n    const tagName = transformCaseFunc(currentNode.nodeName);\n    /* Execute a hook if present */\n    _executeHooks(hooks.uponSanitizeElement, currentNode, {\n      tagName,\n      allowedTags: ALLOWED_TAGS\n    });\n    /* Detect mXSS attempts abusing namespace confusion */\n    if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w!]/g, currentNode.innerHTML) && regExpTest(/<[/\\w!]/g, currentNode.textContent)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove risky CSS construction leading to mXSS */\n    if (SAFE_FOR_XML && currentNode.namespaceURI === HTML_NAMESPACE && tagName === 'style' && _isNode(currentNode.firstElementChild)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any occurrence of processing instructions */\n    if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any kind of possibly harmful comments */\n    if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove element if anything forbids its presence */\n    if (FORBID_TAGS[tagName] || !(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && !ALLOWED_TAGS[tagName]) {\n      /* Check if we have a custom element to handle */\n      if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n          return false;\n        }\n        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n          return false;\n        }\n      }\n      /* Keep content except for bad-listed elements */\n      if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n        const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n        const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n        if (childNodes && parentNode) {\n          const childCount = childNodes.length;\n          for (let i = childCount - 1; i >= 0; --i) {\n            const childClone = cloneNode(childNodes[i], true);\n            parentNode.insertBefore(childClone, getNextSibling(currentNode));\n          }\n        }\n      }\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Check whether element has a valid namespace */\n    if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Make sure that older browsers don't get fallback-tag mXSS */\n    if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Sanitize element content to be template-safe */\n    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n      /* Get the element's text content */\n      content = currentNode.textContent;\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n        content = stringReplace(content, expr, ' ');\n      });\n      if (currentNode.textContent !== content) {\n        arrayPush(DOMPurify.removed, {\n          element: currentNode.cloneNode()\n        });\n        currentNode.textContent = content;\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n    return false;\n  };\n  /**\n   * _isValidAttribute\n   *\n   * @param lcTag Lowercase tag name of containing element.\n   * @param lcName Lowercase attribute name.\n   * @param value Attribute value.\n   * @return Returns true if `value` is valid, otherwise false.\n   */\n  // eslint-disable-next-line complexity\n  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n    /* FORBID_ATTR must always win, even if ADD_ATTR predicate would allow it */\n    if (FORBID_ATTR[lcName]) {\n      return false;\n    }\n    /* Make sure attribute cannot clobber */\n    if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n      return false;\n    }\n    const nameIsPermitted = ALLOWED_ATTR[lcName] || EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag);\n    /* Allow valid data-* attributes: At least one character after \"-\"\n        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n        We don't need to check the value; it's always URI safe. */\n    if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!nameIsPermitted || FORBID_ATTR[lcName]) {\n      if (\n      // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n      // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n      _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) ||\n      // Alternative, second condition checks if it's an `is`-attribute, AND\n      // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n        return false;\n      }\n      /* Check value is safe. First, is attr inert? If so, is safe */\n    } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n      return false;\n    } else ;\n    return true;\n  };\n  /* Names the HTML spec reserves from valid-custom-element-name; these must\n   * never be treated as basic custom elements even when a permissive\n   * CUSTOM_ELEMENT_HANDLING.tagNameCheck is configured. */\n  const RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, ['annotation-xml', 'color-profile', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'missing-glyph']);\n  /**\n   * _isBasicCustomElement\n   * checks if at least one dash is included in tagName, and it's not the first char\n   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n   *\n   * @param tagName name of the tag of the node to sanitize\n   * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n   */\n  const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n    return !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] && regExpTest(CUSTOM_ELEMENT, tagName);\n  };\n  /**\n   * _sanitizeAttributes\n   *\n   * @protect attributes\n   * @protect nodeName\n   * @protect removeAttribute\n   * @protect setAttribute\n   *\n   * @param currentNode to sanitize\n   */\n  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n    const {\n      attributes\n    } = currentNode;\n    /* Check if we have attributes; if not we might have a text node */\n    if (!attributes || _isClobbered(currentNode)) {\n      return;\n    }\n    const hookEvent = {\n      attrName: '',\n      attrValue: '',\n      keepAttr: true,\n      allowedAttributes: ALLOWED_ATTR,\n      forceKeepAttr: undefined\n    };\n    let l = attributes.length;\n    /* Go backwards over all attributes; safely remove bad ones */\n    while (l--) {\n      const attr = attributes[l];\n      const {\n        name,\n        namespaceURI,\n        value: attrValue\n      } = attr;\n      const lcName = transformCaseFunc(name);\n      const initValue = attrValue;\n      let value = name === 'value' ? initValue : stringTrim(initValue);\n      /* Execute a hook if present */\n      hookEvent.attrName = lcName;\n      hookEvent.attrValue = value;\n      hookEvent.keepAttr = true;\n      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n      _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n      value = hookEvent.attrValue;\n      /* Full DOM Clobbering protection via namespace isolation,\n       * Prefix id and name attributes with `user-content-`\n       */\n      if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name') && stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0) {\n        // Remove the attribute with this value\n        _removeAttribute(name, currentNode);\n        // Prefix the value and later re-create the attribute with the sanitized value\n        value = SANITIZE_NAMED_PROPS_PREFIX + value;\n      }\n      // Else: already prefixed, leave the attribute alone — the prefix is\n      // itself the clobbering protection, and re-applying it is incorrect.\n      /* Work around a security issue with comments inside attributes */\n      if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Make sure we cannot easily use animated hrefs, even if animations are allowed */\n      if (lcName === 'attributename' && stringMatch(value, 'href')) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Did the hooks approve of the attribute? */\n      if (hookEvent.forceKeepAttr) {\n        continue;\n      }\n      /* Did the hooks approve of the attribute? */\n      if (!hookEvent.keepAttr) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Work around a security issue in jQuery 3.0 */\n      if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Sanitize attribute content to be template-safe */\n      if (SAFE_FOR_TEMPLATES) {\n        arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n          value = stringReplace(value, expr, ' ');\n        });\n      }\n      /* Is `value` valid for this attribute? */\n      const lcTag = transformCaseFunc(currentNode.nodeName);\n      if (!_isValidAttribute(lcTag, lcName, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Handle attributes that require Trusted Types */\n      if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n        if (namespaceURI) ; else {\n          switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n            case 'TrustedHTML':\n              {\n                value = trustedTypesPolicy.createHTML(value);\n                break;\n              }\n            case 'TrustedScriptURL':\n              {\n                value = trustedTypesPolicy.createScriptURL(value);\n                break;\n              }\n          }\n        }\n      }\n      /* Handle invalid data-* attribute set by try-catching it */\n      if (value !== initValue) {\n        try {\n          if (namespaceURI) {\n            currentNode.setAttributeNS(namespaceURI, name, value);\n          } else {\n            /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n            currentNode.setAttribute(name, value);\n          }\n          if (_isClobbered(currentNode)) {\n            _forceRemove(currentNode);\n          } else {\n            arrayPop(DOMPurify.removed);\n          }\n        } catch (_) {\n          _removeAttribute(name, currentNode);\n        }\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n  };\n  /**\n   * _sanitizeShadowDOM\n   *\n   * @param fragment to iterate over recursively\n   */\n  const _sanitizeShadowDOM2 = function _sanitizeShadowDOM(fragment) {\n    let shadowNode = null;\n    const shadowIterator = _createNodeIterator(fragment);\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n    while (shadowNode = shadowIterator.nextNode()) {\n      /* Execute a hook if present */\n      _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n      /* Sanitize tags and elements */\n      _sanitizeElements(shadowNode);\n      /* Check attributes next */\n      _sanitizeAttributes(shadowNode);\n      /* Deep shadow DOM detected */\n      if (shadowNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM2(shadowNode.content);\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n  };\n  // eslint-disable-next-line complexity\n  DOMPurify.sanitize = function (dirty) {\n    let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let body = null;\n    let importedNode = null;\n    let currentNode = null;\n    let returnNode = null;\n    /* Make sure we have a string to sanitize.\n      DO NOT return early, as this will return the wrong type if\n      the user has requested a DOM object rather than a string */\n    IS_EMPTY_INPUT = !dirty;\n    if (IS_EMPTY_INPUT) {\n      dirty = '<!-->';\n    }\n    /* Stringify, in case dirty is an object */\n    if (typeof dirty !== 'string' && !_isNode(dirty)) {\n      dirty = stringifyValue(dirty);\n      if (typeof dirty !== 'string') {\n        throw typeErrorCreate('dirty is not a string, aborting');\n      }\n    }\n    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\n      return dirty;\n    }\n    /* Assign config vars */\n    if (!SET_CONFIG) {\n      _parseConfig(cfg);\n    }\n    /* Clean up removed elements */\n    DOMPurify.removed = [];\n    /* Check if dirty is correctly typed for IN_PLACE */\n    if (typeof dirty === 'string') {\n      IN_PLACE = false;\n    }\n    if (IN_PLACE) {\n      /* Do some early pre-sanitization to avoid unsafe root nodes */\n      const nn = dirty.nodeName;\n      if (typeof nn === 'string') {\n        const tagName = transformCaseFunc(nn);\n        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n          throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n        }\n      }\n    } else if (dirty instanceof Node) {\n      /* If dirty is a DOM element, append to an empty document to avoid\n         elements being stripped by the parser */\n      body = _initDocument('<!---->');\n      importedNode = body.ownerDocument.importNode(dirty, true);\n      if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n        /* Node is already a body, use as is */\n        body = importedNode;\n      } else if (importedNode.nodeName === 'HTML') {\n        body = importedNode;\n      } else {\n        // eslint-disable-next-line unicorn/prefer-dom-node-append\n        body.appendChild(importedNode);\n      }\n    } else {\n      /* Exit directly if we have nothing to do */\n      if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n      // eslint-disable-next-line unicorn/prefer-includes\n      dirty.indexOf('<') === -1) {\n        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n      }\n      /* Initialize the document to work on */\n      body = _initDocument(dirty);\n      /* Check we have a DOM node from the data */\n      if (!body) {\n        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n      }\n    }\n    /* Remove first element node (ours) if FORCE_BODY is set */\n    if (body && FORCE_BODY) {\n      _forceRemove(body.firstChild);\n    }\n    /* Get node iterator */\n    const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n    /* Now start iterating over the created document */\n    while (currentNode = nodeIterator.nextNode()) {\n      /* Sanitize tags and elements */\n      _sanitizeElements(currentNode);\n      /* Check attributes next */\n      _sanitizeAttributes(currentNode);\n      /* Shadow DOM detected, sanitize it */\n      if (currentNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM2(currentNode.content);\n      }\n    }\n    /* If we sanitized `dirty` in-place, return it. */\n    if (IN_PLACE) {\n      return dirty;\n    }\n    /* Return sanitized string or DOM */\n    if (RETURN_DOM) {\n      if (SAFE_FOR_TEMPLATES) {\n        body.normalize();\n        let html = body.innerHTML;\n        arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n          html = stringReplace(html, expr, ' ');\n        });\n        body.innerHTML = html;\n      }\n      if (RETURN_DOM_FRAGMENT) {\n        returnNode = createDocumentFragment.call(body.ownerDocument);\n        while (body.firstChild) {\n          // eslint-disable-next-line unicorn/prefer-dom-node-append\n          returnNode.appendChild(body.firstChild);\n        }\n      } else {\n        returnNode = body;\n      }\n      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n        /*\n          AdoptNode() is not used because internal state is not reset\n          (e.g. the past names map of a HTMLFormElement), this is safe\n          in theory but we would rather not risk another attack vector.\n          The state that is cloned by importNode() is explicitly defined\n          by the specs.\n        */\n        returnNode = importNode.call(originalDocument, returnNode, true);\n      }\n      return returnNode;\n    }\n    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n    /* Serialize doctype if allowed */\n    if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n      serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n    }\n    /* Sanitize final string template-safe */\n    if (SAFE_FOR_TEMPLATES) {\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n        serializedHTML = stringReplace(serializedHTML, expr, ' ');\n      });\n    }\n    return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n  };\n  DOMPurify.setConfig = function () {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    _parseConfig(cfg);\n    SET_CONFIG = true;\n  };\n  DOMPurify.clearConfig = function () {\n    CONFIG = null;\n    SET_CONFIG = false;\n  };\n  DOMPurify.isValidAttribute = function (tag, attr, value) {\n    /* Initialize shared config vars if necessary. */\n    if (!CONFIG) {\n      _parseConfig({});\n    }\n    const lcTag = transformCaseFunc(tag);\n    const lcName = transformCaseFunc(attr);\n    return _isValidAttribute(lcTag, lcName, value);\n  };\n  DOMPurify.addHook = function (entryPoint, hookFunction) {\n    if (typeof hookFunction !== 'function') {\n      return;\n    }\n    arrayPush(hooks[entryPoint], hookFunction);\n  };\n  DOMPurify.removeHook = function (entryPoint, hookFunction) {\n    if (hookFunction !== undefined) {\n      const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n      return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n    }\n    return arrayPop(hooks[entryPoint]);\n  };\n  DOMPurify.removeHooks = function (entryPoint) {\n    hooks[entryPoint] = [];\n  };\n  DOMPurify.removeAllHooks = function () {\n    hooks = _createHooksMap();\n  };\n  return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n","/**\n * sanitizeHtml — the ONE door every piece of markup a preview draws passes\n * through before it reaches the page.\n *\n * A preview turns somebody's file into HTML inside filex's own page: a\n * Markdown document (markdown-it with inline HTML, the GitHub/GitLab\n * contract), a notebook's cells and its `text/html` outputs, highlighted code,\n * a Mermaid diagram, a KaTeX formula. That markup lands in `v-html` or\n * `innerHTML` of a page that holds the person's session, so it goes through\n * DOMPurify here, with an allow-list narrow enough to keep a README looking\n * like a README (headings, tables, code blocks, pictures, links, <details>)\n * and nothing that runs or submits: no script, no event attribute, no\n * `javascript:`/`data:` link, no form, frame, object or embed, no `url()` in a\n * style. The explorer on the web, the desktop app and every embed (the web\n * component, the React adapter) draw previews from this package, so they all\n * sanitize with this one function — never a local copy.\n *\n * DOMPurify: https://github.com/cure53/DOMPurify, dual-licensed Apache-2.0 OR\n * MPL-2.0, bundled unmodified in @brftech/filex-core.\n *\n * ⚠ Kinds, not options: a caller says WHAT it is drawing and this file owns\n * the policy for it. A new preview surface picks one of the kinds; it does\n * not pass DOMPurify flags of its own.\n */\nimport DOMPurify, { type Config, type DOMPurify as Purifier } from 'dompurify';\n\n/**\n * What is being drawn:\n *  - `document`: a Markdown rendering or a notebook's HTML output — the\n *    narrow document allow-list below;\n *  - `code`: syntax-highlighted source (spans with classes, nothing else);\n *  - `diagram`: a Mermaid SVG (SVG with its own style sheet and HTML labels);\n *  - `math`: a KaTeX rendering (HTML spans plus the MathML twin for screen\n *    readers).\n */\nexport type SanitizeKind = 'document' | 'code' | 'diagram' | 'math';\n\nconst DOCUMENT_TAGS = [\n  'a', 'abbr', 'b', 'bdi', 'bdo', 'blockquote', 'br', 'caption', 'cite', 'code', 'col', 'colgroup',\n  'dd', 'del', 'details', 'dfn', 'div', 'dl', 'dt', 'em', 'figcaption', 'figure', 'h1', 'h2', 'h3',\n  'h4', 'h5', 'h6', 'hr', 'i', 'img', 'ins', 'kbd', 'li', 'mark', 'ol', 'p', 'picture', 'pre', 'q',\n  'rp', 'rt', 'ruby', 's', 'samp', 'small', 'source', 'span', 'strike', 'strong', 'sub', 'summary',\n  'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'time', 'tr', 'tt', 'u', 'ul', 'var', 'wbr',\n];\n\nconst DOCUMENT_ATTRS = [\n  'abbr', 'align', 'alt', 'cite', 'class', 'colspan', 'datetime', 'dir', 'height', 'href', 'id',\n  'lang', 'loading', 'media', 'open', 'rel', 'reversed', 'rowspan', 'scope', 'span', 'src', 'srcset',\n  'start', 'style', 'target', 'title', 'valign', 'width',\n];\n\n/** Never, in any kind — whatever a profile would otherwise allow. */\nconst FORBID_TAGS = [\n  'script', 'iframe', 'frame', 'frameset', 'object', 'embed', 'applet', 'form',\n  'input', 'button', 'select', 'option', 'textarea', 'base', 'meta', 'link', 'noscript',\n  'template', 'portal', 'dialog',\n];\nconst FORBID_ATTR = ['action', 'formaction', 'srcdoc', 'ping', 'background', 'poster'];\n\nconst POLICY: Record<SanitizeKind, Config> = {\n  document: {\n    ALLOWED_TAGS: DOCUMENT_TAGS,\n    ALLOWED_ATTR: DOCUMENT_ATTRS,\n    // Ids a document brings are prefixed (`user-content-…`) so they can never\n    // shadow a global the page reads (DOM clobbering).\n    SANITIZE_NAMED_PROPS: true,\n  },\n  code: {\n    ALLOWED_TAGS: ['span', 'br'],\n    ALLOWED_ATTR: ['class'],\n  },\n  diagram: {\n    USE_PROFILES: { svg: true, svgFilters: true, html: true },\n    // What Mermaid itself keeps when it sanitizes its output: HTML labels\n    // live in <foreignObject> (an HTML integration point for them), and text\n    // anchoring needs dominant-baseline.\n    ADD_TAGS: ['foreignobject'],\n    ADD_ATTR: ['dominant-baseline'],\n    HTML_INTEGRATION_POINTS: { foreignobject: true },\n  },\n  math: {\n    USE_PROFILES: { html: true, mathMl: true },\n  },\n};\n\nlet purifier: Purifier | null = null;\n\n/** A private DOMPurify instance with filex's hooks; null outside a browser. */\nfunction instance(): Purifier | null {\n  if (purifier) return purifier;\n  if (typeof window === 'undefined') return null;\n  const p = DOMPurify(window);\n  if (!p.isSupported) return null;\n  p.addHook('uponSanitizeAttribute', (_node, data) => {\n    if (data.attrName === 'style') {\n      const clean = cleanStyle(data.attrValue);\n      if (clean === '') data.keepAttr = false;\n      else data.attrValue = clean;\n    }\n  });\n  p.addHook('uponSanitizeElement', (node, data) => {\n    if (data.tagName === 'style' && node.textContent) {\n      node.textContent = cleanStyleSheet(node.textContent);\n    }\n  });\n  p.addHook('afterSanitizeAttributes', (node) => {\n    if (node.tagName === 'A') {\n      const target = node.getAttribute('target');\n      if (target && target !== '_blank') node.removeAttribute('target');\n      if (node.getAttribute('target') === '_blank') node.setAttribute('rel', 'noopener noreferrer');\n    }\n  });\n  purifier = p;\n  return p;\n}\n\n/**\n * A declaration list with every declaration that could fetch or run\n * something removed: `url()` other than a same-document `#fragment`,\n * `image-set()`, `expression()`, `@import`, legacy `behavior`/`-moz-binding`.\n * CSS escapes (`\\75 rl(`) can spell any of those, so a declaration with a\n * backslash is dropped as well.\n */\nexport function cleanStyle(style: string): string {\n  return style\n    .split(';')\n    .map((d) => d.trim())\n    .filter((d) => d !== '' && !unsafeCss(d))\n    .join('; ');\n}\n\nfunction cleanStyleSheet(css: string): string {\n  if (/\\\\/.test(css)) return '';\n  return css\n    .replace(/@import[^;]*;?/gi, '')\n    .replace(/url\\s*\\(\\s*(['\"]?)(?!#)[^)]*\\)/gi, 'none')\n    .replace(/image-set\\s*\\([^)]*\\)/gi, 'none')\n    .replace(/expression\\s*\\(/gi, 'x(');\n}\n\nfunction unsafeCss(declaration: string): boolean {\n  if (/\\\\/.test(declaration)) return true;\n  if (/expression\\s*\\(|@import|behavior\\s*:|-moz-binding|image-set\\s*\\(|javascript:/i.test(declaration)) return true;\n  const urls = declaration.match(/url\\s*\\(\\s*(['\"]?)([^)'\"]*)/gi) ?? [];\n  return urls.some((u) => !/url\\s*\\(\\s*['\"]?#/i.test(u));\n}\n\nfunction escapeText(s: string): string {\n  return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\n/**\n * Markup safe to hand to `v-html` / `innerHTML`, for `kind`. Outside a\n * browser (no DOM to parse with) the input comes back as escaped TEXT —\n * never as the markup it was.\n */\nexport function sanitizeHtml(html: string, kind: SanitizeKind = 'document'): string {\n  const p = instance();\n  if (!p) return escapeText(html);\n  const cfg: Config = {\n    ...POLICY[kind],\n    FORBID_TAGS,\n    FORBID_ATTR,\n    ALLOW_UNKNOWN_PROTOCOLS: false,\n    RETURN_TRUSTED_TYPE: false,\n  };\n  return String(p.sanitize(html, cfg));\n}\n","/**\n * Markdown as markup that is safe to draw: the ONE pipeline every surface that\n * shows somebody's Markdown uses - the explorer's preview, and an app's release\n * notes on the admin panel's update review (#122).\n *\n * markdown-it with inline HTML (the GitHub/GitLab contract: `<img>`, tables,\n * `<details>` work), then the preview sanitizer's `document` policy\n * (lib/sanitizeHtml.ts, DOMPurify): nothing that runs or submits survives.\n *\n * ⚠ markdown-it is an optional peer of this package, loaded when first needed.\n * When it cannot be loaded the answer is `null` - the caller shows the text as\n * text, never the raw string as markup.\n */\nimport { sanitizeHtml } from './sanitizeHtml';\n\ntype MarkdownIt = { render(src: string): string };\ntype MarkdownItCtor = new (opts: Record<string, unknown>) => MarkdownIt;\n\nlet renderer: Promise<MarkdownIt | null> | null = null;\n\nfunction load(): Promise<MarkdownIt | null> {\n  if (!renderer) {\n    renderer = (import(/* @vite-ignore */ 'markdown-it') as Promise<unknown>)\n      .then((mod) => {\n        const m = mod as { default?: MarkdownItCtor } & MarkdownItCtor;\n        const Md = (m.default ?? m) as MarkdownItCtor;\n        return new Md({ html: true, linkify: true, breaks: true, typographer: true });\n      })\n      .catch(() => {\n        // Not installed (an embed without the peer): ask again next time, it\n        // may be a transient chunk-load failure.\n        renderer = null;\n        return null;\n      });\n  }\n  return renderer;\n}\n\n/** `text` rendered as Markdown and sanitized; null when markdown-it is unavailable. */\nexport async function markdownToSafeHtml(text: string): Promise<string | null> {\n  const md = await load();\n  if (!md) return null;\n  return sanitizeHtml(md.render(text), 'document');\n}\n","/**\n * externalReach — \"can THIS browser reach the external service?\"\n *\n * # Why this exists\n *\n * Three machines must reach three addresses before the Office editor works,\n * and until now only one of them was ever checked:\n *\n * | address                | who must reach it                     | who checked it   |\n * | ---------------------- | ------------------------------------- | ---------------- |\n * | the Document Server URL| the **browser** (loads the editor JS) | nobody           |\n * | the Document Server URL| the filex process                     | the Test button  |\n * | `FILEX_PUBLIC_URL`     | the **document server** (fetch + save)| nobody           |\n *\n * So an operator on podman types `http://onlyoffice`, filex reaches it, Test\n * goes green, and the browser cannot resolve that name at all. The editor then\n * fails with the same message as a missing configuration — issue #17, twice.\n *\n * The admin page runs **in the browser that will actually open the editor**,\n * so it can answer the first row directly instead of disclaiming it. That is\n * what this module does.\n *\n * # Mechanism, and why not `fetch`\n *\n * ⚠ A plain `fetch()` is the obvious choice and the wrong one: a document\n * server that works perfectly will usually answer without CORS headers, the\n * promise rejects, and a naive `catch` reports failure for a healthy service.\n *\n * Instead each service is probed **the same way the real viewer loads it**:\n *\n * - **onlyoffice** — a `<script>` pointing at\n *   `<base>/web-apps/apps/api/documents/api.js`. Script `load`/`error` is not\n *   subject to CORS for load detection, and a successful load leaves\n *   `window.DocsAPI.DocEditor` defined, which proves the thing that answered\n *   really is a Document Server. (Verified against a live OnlyOffice Docs\n *   instance: `load` + `DocsAPI` in ~0.5 s.)\n * - **drawio** — a hidden `<iframe>` at `<base>/?embed=1&proto=json`, which\n *   posts `{\"event\":\"init\"}` to its parent when the editor is ready. Same\n *   handshake `DrawioViewer.vue` uses. (Verified against a live drawio.)\n *\n * Both distinguish **\"could not reach\"** from **\"reached, wrong thing\"** with\n * a second signal: a `no-cors` `fetch`, whose promise resolves for any HTTP\n * status and rejects only on a network-level failure. Reached + no editor =\n * `wrong-content`; not reached at all = `unreachable`.\n *\n * Every probe is bounded by a timeout and reports the timeout as its own\n * state, so a black-holed address stops the spinner instead of hanging.\n */\n\n/** The result of one probe. Each value is a different sentence to the operator. */\nexport type BrowserProbeState =\n  /** Loaded, and it really is the service it claims to be. */\n  | 'ok'\n  /** Something answered at that address, but it is not this service. */\n  | 'wrong-content'\n  /** Nothing answered: DNS failure, connection refused, blocked. */\n  | 'unreachable'\n  /** Nothing answered and nothing refused either — a black hole. */\n  | 'timeout'\n  /** The admin page is HTTPS and the service URL is HTTP; the browser will refuse. */\n  | 'blocked-mixed-content'\n  /** No URL configured, or a service with no browser-side entry point to probe. */\n  | 'skipped';\n\nexport interface BrowserProbeResult {\n  service: string;\n  state: BrowserProbeState;\n  /** The exact URL attempted — the same one the real viewer loads. */\n  url: string;\n  /** Milliseconds elapsed. Worth showing: a 6 s \"unreachable\" is a DNS story. */\n  ms: number;\n  mechanism: 'script' | 'iframe' | 'none';\n}\n\n/**\n * Injection seam. The defaults touch the DOM and the network; tests replace\n * them so the classification logic can be asserted without either.\n */\nexport interface BrowserProbeDeps {\n  loadScript(url: string, timeoutMs: number): Promise<'load' | 'error' | 'timeout'>;\n  loadFramed(url: string, timeoutMs: number): Promise<'ready' | 'timeout'>;\n  reachable(url: string): Promise<boolean>;\n  hasDocsAPI(): boolean;\n  pageProtocol(): string;\n  now(): number;\n}\n\nconst ONLYOFFICE_API_PATH = '/web-apps/apps/api/documents/api.js';\nconst DRAWIO_EMBED_QUERY = '/?embed=1&proto=json';\n\n/**\n * Default timeout. ⚠ Measured, not guessed: a browser takes ~5 s to give up on\n * a DNS name that does not exist (`http://onlyoffice`), and that case must\n * report `unreachable`, not `timeout`. 10 s leaves room and still bounds a\n * black hole.\n */\nexport const DEFAULT_PROBE_TIMEOUT_MS = 10_000;\n\nfunction trimBase(base: string): string {\n  return base.trim().replace(/\\/+$/, '');\n}\n\nfunction domLoadScript(url: string, timeoutMs: number): Promise<'load' | 'error' | 'timeout'> {\n  return new Promise((resolve) => {\n    const el = document.createElement('script');\n    let done = false;\n    const finish = (r: 'load' | 'error' | 'timeout') => {\n      if (done) return;\n      done = true;\n      clearTimeout(tid);\n      el.remove();\n      resolve(r);\n    };\n    const tid = setTimeout(() => finish('timeout'), timeoutMs);\n    el.async = true;\n    el.src = url;\n    el.onload = () => finish('load');\n    el.onerror = () => finish('error');\n    document.head.appendChild(el);\n  });\n}\n\nfunction domLoadFramed(url: string, timeoutMs: number): Promise<'ready' | 'timeout'> {\n  return new Promise((resolve) => {\n    let origin: string | null = null;\n    try {\n      origin = new URL(url, window.location.href).origin;\n    } catch {\n      origin = null;\n    }\n    const frame = document.createElement('iframe');\n    frame.setAttribute('aria-hidden', 'true');\n    // ⚠ RTL: parked off the START edge (`inset-inline-start`), never `left`:\n    // in a right-to-left page the left edge is the END, where overflow is\n    // scrollable — `left:-9999px` there hangs a 10 000px scrollbar under the\n    // page for as long as the probe runs.\n    frame.style.cssText = 'position:absolute;inset-inline-start:-9999px;width:1px;height:1px;border:0';\n    let done = false;\n    const finish = (r: 'ready' | 'timeout') => {\n      if (done) return;\n      done = true;\n      clearTimeout(tid);\n      window.removeEventListener('message', onMessage);\n      frame.remove();\n      resolve(r);\n    };\n    const onMessage = (e: MessageEvent) => {\n      // ⚠ Origin check first: any page may postMessage to us, and a probe that\n      // accepts an unfiltered message would report a healthy drawio because\n      // something else on the page said so.\n      if (origin && e.origin !== origin) return;\n      let data: unknown = e.data;\n      if (typeof data === 'string') {\n        try {\n          data = JSON.parse(data);\n        } catch {\n          return;\n        }\n      }\n      if (data && typeof data === 'object' && (data as { event?: string }).event === 'init') {\n        finish('ready');\n      }\n    };\n    window.addEventListener('message', onMessage);\n    const tid = setTimeout(() => finish('timeout'), timeoutMs);\n    frame.src = url;\n    document.body.appendChild(frame);\n  });\n}\n\nasync function domReachable(url: string): Promise<boolean> {\n  try {\n    // `no-cors` gives an opaque response we cannot read — which is fine, the\n    // only question is whether the request completed at all. It resolves for\n    // any HTTP status (including 404) and rejects on a network failure, which\n    // is exactly the \"reached, wrong thing\" vs \"could not reach\" split.\n    await fetch(url, { mode: 'no-cors', cache: 'no-store' });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nconst domDeps: BrowserProbeDeps = {\n  loadScript: domLoadScript,\n  loadFramed: domLoadFramed,\n  reachable: domReachable,\n  hasDocsAPI: () =>\n    !!(window as unknown as { DocsAPI?: { DocEditor?: unknown } }).DocsAPI?.DocEditor,\n  pageProtocol: () => window.location.protocol,\n  now: () => (typeof performance !== 'undefined' ? performance.now() : Date.now()),\n};\n\n/** The URL each service is probed at — the same one its viewer loads. */\nexport function browserProbeURL(service: string, base: string): string {\n  const b = trimBase(base);\n  if (!b) return '';\n  if (service === 'onlyoffice') return b + ONLYOFFICE_API_PATH;\n  if (service === 'drawio') return b + DRAWIO_EMBED_QUERY;\n  return '';\n}\n\n/**\n * Probe one external service from the browser running this page.\n *\n * Returns `skipped` — never a failure — for a service with no URL and for a\n * service filex does not load in the browser at all (the converter), because\n * reporting \"unreachable\" for something the browser never fetches would be a\n * new lie in place of the old one.\n */\nexport async function probeExternalFromBrowser(\n  service: string,\n  base: string | null | undefined,\n  opts: { timeoutMs?: number; deps?: Partial<BrowserProbeDeps> } = {},\n): Promise<BrowserProbeResult> {\n  const deps: BrowserProbeDeps = { ...domDeps, ...(opts.deps ?? {}) };\n  const timeoutMs = opts.timeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS;\n  const url = browserProbeURL(service, base ?? '');\n  const mechanism: BrowserProbeResult['mechanism'] =\n    service === 'onlyoffice' ? 'script' : service === 'drawio' ? 'iframe' : 'none';\n  if (!url) {\n    return { service, state: 'skipped', url: '', ms: 0, mechanism };\n  }\n\n  // ⚠ Pre-empt mixed content rather than reporting it as \"unreachable\". The\n  // browser blocks an http:// subresource on an https:// page before a packet\n  // leaves, and \"unreachable\" would send the operator to check firewalls.\n  if (deps.pageProtocol() === 'https:' && url.startsWith('http://')) {\n    return { service, state: 'blocked-mixed-content', url, ms: 0, mechanism };\n  }\n\n  const t0 = deps.now();\n  const elapsed = () => Math.round(deps.now() - t0);\n\n  if (mechanism === 'script') {\n    const ev = await deps.loadScript(url, timeoutMs);\n    if (ev === 'timeout') return { service, state: 'timeout', url, ms: elapsed(), mechanism };\n    if (ev === 'load') {\n      // Loaded AND it defined the global only a Document Server defines.\n      return {\n        service,\n        state: deps.hasDocsAPI() ? 'ok' : 'wrong-content',\n        url,\n        ms: elapsed(),\n        mechanism,\n      };\n    }\n    const reached = await deps.reachable(url);\n    return {\n      service,\n      state: reached ? 'wrong-content' : 'unreachable',\n      url,\n      ms: elapsed(),\n      mechanism,\n    };\n  }\n\n  if (mechanism === 'iframe') {\n    const ev = await deps.loadFramed(url, timeoutMs);\n    if (ev === 'ready') return { service, state: 'ok', url, ms: elapsed(), mechanism };\n    // No handshake. An iframe fires `load` for error pages too, so the frame\n    // itself cannot tell us why — ask the network instead.\n    const reached = await deps.reachable(url);\n    return {\n      service,\n      state: reached ? 'wrong-content' : 'unreachable',\n      url,\n      ms: elapsed(),\n      mechanism,\n    };\n  }\n\n  return { service, state: 'skipped', url: '', ms: 0, mechanism };\n}\n","/**\n * officeDiagnosis - what the editor says after ONLYOFFICE's \"Download failed\"\n * (issue #80).\n *\n * \"Download failed.\" is the document server's one sentence for two different\n * failures, and its error code (-4) does not tell them apart:\n *\n * 1. the document server could not download the document from filex, or\n * 2. the browser could not load the converted copy back from the document\n *    server (`<document-server>/cache/files/.../Editor.bin`, an address the\n *    document server builds from the X-Forwarded-Proto / -Host headers the\n *    proxy in front of it passes).\n *\n * filex knows which: its fetch endpoint saw the document server's request, or\n * did not, and knows what it answered. The server keeps that per document\n * (`GET /api/files/onlyoffice/diagnose`, for whoever may open the document),\n * and the editor asks right after the error and says one of three sentences.\n *\n * ⚠ Shared by every surface that opens the editor (the explorer, the\n * standalone editor tab, the desktop's document windows) through PreviewModal:\n * one rule, written once.\n */\n\n/** ONLYOFFICE's `errorCode` for \"Download failed\" (c_oAscError.ID.DownloadError). */\nexport const OFFICE_DOWNLOAD_ERROR = -4;\n\n/** The two channels ONLYOFFICE tells its host about trouble on. */\nexport type OfficeEventChannel = 'onError' | 'onWarning';\n\n/**\n * Does this ONLYOFFICE event leave an editor nobody can use?\n *\n * ⚠⚠ THE ONE PLACE this is decided, and the document server decides it: its\n * editor (web-apps `controller/Main.js` onError) reports an error of level\n * Critical through the host's `onError`, and every other one through\n * `onWarning` (`common/Gateway.js` reportError / reportWarning). A critical\n * one is drawn in a dialog that cannot be closed and the editor under it is\n * dead: \"Download failed\" (-4), a bad or expired token (-20, -21), access\n * denied (-23), a document it cannot open or convert, its database, too\n * many users, an unsupported browser. A warning is drawn in a dialog that\n * closes, and the editor goes on. Read from ONLYOFFICE Docs 9.4.0 and\n * measured with it (issue #80, the 0.50 final run).\n *\n * So the channel is the rule, not a list of codes: a code list would be a\n * copy of the document server's own decision, and go stale with its next\n * release.\n */\nexport function officeEventEndsTheEditor(channel: OfficeEventChannel): boolean {\n  return channel === 'onError';\n}\n\nexport type OfficeFetchVerdict = 'served' | 'not_requested' | 'refused';\n\n/** The server's answer (onlyoffice.Diagnosis). */\nexport interface OfficeDiagnosis {\n  verdict: OfficeFetchVerdict;\n  opened_at?: string;\n  fetch?: { at: string; status: number; reason_code?: string; reason?: string };\n  /** Whose memory: `this_process` (one replica's, see docs/ONLYOFFICE.md). */\n  scope?: string;\n}\n\n/**\n * The error code in ONLYOFFICE's `onError` event (`{ data: { errorCode,\n * errorDescription } }`), or null when it carries none.\n */\nexport function officeErrorCode(err: unknown): number | null {\n  const d = (err as { data?: unknown } | null)?.data;\n  if (d && typeof d === 'object') {\n    const code = (d as { errorCode?: unknown }).errorCode;\n    if (typeof code === 'number') return code;\n    if (typeof code === 'string' && /^-?\\d+$/.test(code)) return Number(code);\n  }\n  return null;\n}\n\nconst XML_ENTITIES: Record<string, string> = { amp: '&', lt: '<', gt: '>', quot: '\"', apos: \"'\", '#39': \"'\" };\n\n/**\n * The document server's error description as the text the page shows.\n * ONLYOFFICE writes some of them with markup: Docs 9.4 says \"The document\n * security token is not correctly formed.<br>Please contact your Document\n * Server administrator.\" (measured in e2e/realenv, issue #80 S2 and S5), and\n * the fallback, which shows text, showed the `<br>` as words. A line break\n * becomes a space, any other tag goes, the XML entities are read.\n */\nexport function officeErrorText(description: string): string {\n  return description\n    .replace(/<br\\s*\\/?>/gi, ' ')\n    .replace(/<[^>]*>/g, '')\n    .replace(/&(amp|lt|gt|quot|apos|#39);/g, (_m, name: string) => XML_ENTITIES[name] ?? '')\n    .replace(/\\s+/g, ' ')\n    .trim();\n}\n\n/**\n * The diagnosis endpoint, beside the editor configuration endpoint every host\n * already hands the viewer (`…/api/files/onlyoffice/config` →\n * `…/api/files/onlyoffice/diagnose`). Deriving it keeps every host - and every\n * embedder's proxy prefix - working without a second setting. A configuration\n * endpoint that does not end in `/onlyoffice/config` (an embedder's own\n * route) has no known sibling: null, and the editor shows the document\n * server's own sentence as before.\n */\nexport function officeDiagnoseEndpoint(configEndpoint: string | null | undefined): string | null {\n  if (!configEndpoint) return null;\n  const m = /^(.*\\/onlyoffice\\/)config(\\?.*)?$/.exec(configEndpoint);\n  return m ? `${m[1]}diagnose` : null;\n}\n\n/** The refusal reasons the editor words itself; anything else reads the server's English. */\nconst REASON_KEYS: Record<string, string> = {\n  bad_link: 'viewer.office_fetch_reason.bad_link',\n  signature_expired: 'viewer.office_fetch_reason.signature_expired',\n  signature_bad: 'viewer.office_fetch_reason.signature_bad',\n  not_found: 'viewer.office_fetch_reason.not_found',\n  storage_unavailable: 'viewer.office_fetch_reason.storage_unavailable',\n  body_unavailable: 'viewer.office_fetch_reason.body_unavailable',\n  object_missing: 'viewer.office_fetch_reason.object_missing',\n  read_failed: 'viewer.office_fetch_reason.read_failed',\n};\n\ntype Translate = (key: string, vars?: Record<string, string | number>) => string;\n\n/**\n * The sentence for a diagnosis, in the reader's language. Null for an answer\n * this build does not know (a newer server's verdict): the editor then keeps\n * the document server's own sentence rather than guessing.\n */\nexport function officeDiagnosisText(d: OfficeDiagnosis | null | undefined, t: Translate): string | null {\n  if (!d) return null;\n  switch (d.verdict) {\n    case 'served':\n      return t('viewer.office_download_served');\n    case 'not_requested':\n      return t('viewer.office_download_not_requested');\n    case 'refused': {\n      const code = d.fetch?.reason_code ?? '';\n      const key = REASON_KEYS[code];\n      const reason = key ? t(key) : (d.fetch?.reason ?? '').trim() || String(d.fetch?.status ?? '');\n      return t('viewer.office_download_refused', { reason });\n    }\n    default:\n      return null;\n  }\n}\n\n/**\n * Ask the server what it saw for `path`. Null when it could not say (no\n * endpoint, an error, a non-JSON answer): the caller keeps the document\n * server's sentence.\n */\nexport async function fetchOfficeDiagnosis(\n  endpoint: string | null,\n  path: string,\n  init: { headers?: Record<string, string>; credentials?: RequestCredentials } = {},\n): Promise<OfficeDiagnosis | null> {\n  if (!endpoint || !path) return null;\n  const sep = endpoint.includes('?') ? '&' : '?';\n  try {\n    const res = await fetch(`${endpoint}${sep}path=${encodeURIComponent(path)}`, {\n      method: 'GET',\n      headers: init.headers,\n      credentials: init.credentials ?? 'same-origin',\n    });\n    if (!res.ok) return null;\n    const body = (await res.json()) as OfficeDiagnosis;\n    return body && typeof body.verdict === 'string' ? body : null;\n  } catch {\n    return null;\n  }\n}\n","export interface CachedArchiveEntry {\n  name: string;\n  size: number;\n  mtime?: string;\n  is_dir?: boolean;\n}\n\nexport interface ArchivePreviewCache {\n  recall(path: string): CachedArchiveEntry[] | undefined;\n  remember(path: string, entries: CachedArchiveEntry[]): void;\n  forget(path: string): void;\n  clear(): void;\n}\n\nexport const ARCHIVE_PREVIEW_CACHE_TTL_MS = 2 * 60 * 1000;\n\nexport function createArchivePreviewCache(\n  ttlMs = ARCHIVE_PREVIEW_CACHE_TTL_MS,\n  now: () => number = Date.now,\n): ArchivePreviewCache {\n  type Cached = {\n    entries: CachedArchiveEntry[];\n    expiresAt: number;\n    timer: ReturnType<typeof setTimeout>;\n  };\n  const values = new Map<string, Cached>();\n\n  function forget(path: string): void {\n    const cached = values.get(path);\n    if (cached) clearTimeout(cached.timer);\n    values.delete(path);\n  }\n\n  return {\n    recall(path) {\n      const cached = values.get(path);\n      if (!cached) return undefined;\n      if (cached.expiresAt <= now()) {\n        forget(path);\n        return undefined;\n      }\n      return cached.entries.map((entry) => ({ ...entry }));\n    },\n    remember(path, entries) {\n      forget(path);\n      const cached: Cached = {\n        entries: entries.map((entry) => ({ ...entry })),\n        expiresAt: now() + ttlMs,\n        timer: setTimeout(() => {\n          if (values.get(path) === cached) values.delete(path);\n        }, ttlMs),\n      };\n      values.set(path, cached);\n    },\n    forget,\n    clear() {\n      for (const cached of values.values()) clearTimeout(cached.timer);\n      values.clear();\n    },\n  };\n}\n","<script setup lang=\"ts\">\n/**\n * DraftCloseModal — what closing a draft's editor asks (issue #71).\n *\n * A draft is a new document that has not been saved where it is meant to go.\n * Its content is already safe — the editor autosaves into the draft — so\n * closing loses nothing; the question is only what should BECOME of it:\n *\n *   Save to disk     it goes to its folder now (with the same \"name (2).ext?\"\n *                    question the editor's Save button asks);\n *   Keep in Drafts   the default: it stays in Drafts, to finish later;\n *   Discard          it goes to the trash, which deletes it after the\n *                    retention period (restorable until then).\n *\n * ⚠ Escape and a click outside cancel — back to the editor — never one of the\n * three: a key that throws a document away, or puts it somewhere, is a key\n * nobody pressed on purpose. Enter takes the default, \"Keep in Drafts\", which\n * is the one answer that changes nothing.\n */\nimport { nextTick, ref, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from './Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /** The viewer's theme: these dialogs sit beside its card, not inside it. */\n  theme?: ThemeMode;\n  /** The draft's name. */\n  name: string;\n  /** Where it is meant to go, as a person reads it (`docs / Reports`). */\n  folder: string;\n  /** A verb is on its way — the buttons wait for the answer. */\n  busy?: boolean;\n  /** What went wrong with the last answer, said. */\n  error?: string | null;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'cancel'): void;\n  (e: 'save'): void;\n  (e: 'keep'): void;\n  (e: 'discard'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst keepBtn = ref<HTMLButtonElement | null>(null);\n// Keep has the focus the moment the question opens, not after Modal's 30 ms\n// timer (Modal keeps a focus that is already inside). `immediate` covers a\n// host that mounts the question already open; PreviewModal keeps it mounted\n// and flips `open`.\n//\n// ⚠ previewDraft's \"Keep is the default\" failures on CI (v0.48.0 release run,\n// then again with this watch immediate) were not this watch: the viewer's own\n// Modal timer, BEHIND the question, pulled the focus back into the viewer.\n// Modal now takes the focus only while it is the dialog in front.\nwatch(\n  () => props.open,\n  (open) => {\n    if (open) void nextTick(() => keepBtn.value?.focus());\n  },\n  { immediate: true },\n);\n</script>\n\n<template>\n  <Modal :open=\"open\" :locale=\"locale\" :theme=\"theme\" :title=\"t('draft.close.title')\" size=\"sm\" :busy=\"busy\" @close=\"emit('cancel')\">\n    <div class=\"fe-draftq\" data-testid=\"draft-close-dialog\">\n      <p class=\"fe-draftq__body\">{{ t('draft.close.body', { name, folder }) }}</p>\n      <p class=\"fe-draftq__hint\">{{ t('draft.close.hint') }}</p>\n      <p v-if=\"error\" class=\"fe-form__error\" role=\"alert\">{{ error }}</p>\n    </div>\n    <template #actions>\n      <div class=\"fe-draftq__actions\">\n        <button\n          type=\"button\"\n          class=\"fe-btn fe-btn--danger-quiet\"\n          :disabled=\"busy\"\n          data-testid=\"draft-close-discard\"\n          @click=\"emit('discard')\"\n        >\n          {{ t('draft.close.discard') }}\n        </button>\n        <span class=\"fe-draftq__gap\" aria-hidden=\"true\"></span>\n        <button\n          type=\"button\"\n          class=\"fe-btn\"\n          :disabled=\"busy\"\n          data-testid=\"draft-close-save\"\n          @click=\"emit('save')\"\n        >\n          {{ t('draft.close.save') }}\n        </button>\n        <button\n          ref=\"keepBtn\"\n          type=\"button\"\n          class=\"fe-btn fe-btn--primary\"\n          :disabled=\"busy\"\n          data-fe-autofocus\n          data-testid=\"draft-close-keep\"\n          @click=\"emit('keep')\"\n        >\n          {{ t('draft.close.keep') }}\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * OutsideChangeModal — the document changed outside this editor while the\n * editor has changes of its own (issue #184). Which version stays?\n *\n *   Keep the outside version  this editor's changes are dropped and the new\n *                             version is loaded;\n *   Write mine                this editor's version replaces it when saved;\n *   Keep both                 the outside version stays, this editor's is\n *                             saved beside it as a conflict copy.\n *\n * ⚠ Escape and a click outside put the question AWAY, they answer nothing:\n * the viewer keeps a line under its bar to bring it back (PreviewModal), and\n * until an answer comes nothing is written over either version. Enter takes\n * \"Keep both\", the one answer that loses nothing.\n */\nimport { nextTick, ref, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport type { OutsideChoice } from '../lib/outsideChange';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from './Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /** The viewer's theme: this dialog sits beside its card, not inside it. */\n  theme?: ThemeMode;\n  /** The document's name. */\n  name: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'dismiss'): void;\n  (e: 'choose', choice: Exclude<OutsideChoice, 'reloaded'>): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst bothBtn = ref<HTMLButtonElement | null>(null);\nwatch(\n  () => props.open,\n  (open) => {\n    if (open) void nextTick(() => bothBtn.value?.focus());\n  },\n  { immediate: true },\n);\n</script>\n\n<template>\n  <Modal :open=\"open\" :locale=\"locale\" :theme=\"theme\" :title=\"t('outside.title')\" size=\"sm\" @close=\"emit('dismiss')\">\n    <div class=\"fe-draftq\" data-testid=\"outside-change-dialog\">\n      <p class=\"fe-draftq__body\">{{ t('outside.body', { name }) }}</p>\n      <ul class=\"fe-outsideq__list\">\n        <li><strong>{{ t('outside.theirs') }}</strong> - {{ t('outside.theirs_hint') }}</li>\n        <li><strong>{{ t('outside.mine') }}</strong> - {{ t('outside.mine_hint') }}</li>\n        <li><strong>{{ t('outside.both') }}</strong> - {{ t('outside.both_hint') }}</li>\n      </ul>\n      <p class=\"fe-draftq__hint\">{{ t('outside.hint') }}</p>\n    </div>\n    <template #actions>\n      <div class=\"fe-draftq__actions\">\n        <button\n          type=\"button\"\n          class=\"fe-btn fe-btn--danger-quiet\"\n          data-testid=\"outside-keep-theirs\"\n          @click=\"emit('choose', 'theirs')\"\n        >\n          {{ t('outside.theirs') }}\n        </button>\n        <span class=\"fe-draftq__gap\" aria-hidden=\"true\"></span>\n        <button\n          type=\"button\"\n          class=\"fe-btn\"\n          data-testid=\"outside-write-mine\"\n          @click=\"emit('choose', 'mine')\"\n        >\n          {{ t('outside.mine') }}\n        </button>\n        <button\n          ref=\"bothBtn\"\n          type=\"button\"\n          class=\"fe-btn fe-btn--primary\"\n          data-fe-autofocus\n          data-testid=\"outside-keep-both\"\n          @click=\"emit('choose', 'both')\"\n        >\n          {{ t('outside.both') }}\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n","// A document open in the office editor that changed OUTSIDE it (issue #184).\n//\n// The same rule on every surface — the desktop's \"Open with filex\" window, the\n// web explorer, the standalone editor tab, the embeds — because the editor is\n// the same component on all of them (PreviewModal). What differs is only who\n// NOTICES the change: the desktop app watches the document on the computer,\n// the web hears it from the server's realtime feed. Either hands the viewer\n// an OutsideChange; the viewer decides, says, and answers.\n//\n//   · nothing of this editor's is unsaved → the new version is loaded, and a\n//     short note says so (\"updated outside filex, the new version is loaded\");\n//   · there IS something of this editor's (an edit made here, or a save the\n//     host holds) → the person is asked which one stays:\n//       Keep theirs  — this editor's edits are dropped, the new version loads;\n//       Keep mine    — this editor's version replaces it when saved;\n//       Keep both    — the outside version stays, this editor's is saved\n//                      beside it as a conflict copy.\n//     Until they answer nothing is written over anything.\n\n/** One change, handed to the viewer by its host. */\nexport interface OutsideChange {\n  /** Rises with every change the host sees: the same change delivered twice\n   *  is one change, and an answer names the change it answers. */\n  seq: number;\n  /**\n   * Where the new version is, when it is not where the open document is. The\n   * desktop app puts each outside version on the server as a NEW working copy\n   * (so a late save of the old editor session can never land on it); the web\n   * reloads the same path and leaves this out.\n   */\n  path?: string | null;\n  /** The host holds a save of this editor's that is not written yet: the\n   *  question is asked even when the editor has no unsaved edit of its own. */\n  pending?: boolean;\n}\n\n/** What became of a change. 'reloaded' = it was taken in without a question. */\nexport type OutsideChoice = 'reloaded' | 'theirs' | 'mine' | 'both';\n\n/** The viewer's answer to its host. */\nexport interface OutsideAnswer {\n  seq: number;\n  choice: OutsideChoice;\n  /** The path the document is open at now (the new one after a reload). */\n  path: string;\n  /** The office session the answer is about (ONLYOFFICE `document.key`), when\n   *  there was one: the server needs it to know which save to keep where. */\n  key?: string | null;\n  /**\n   * Who noticed the change: the host (its `outsideChange` prop - the desktop\n   * app) or the viewer itself, from the server's realtime feed. Only a host's\n   * change is the host's to act on; the viewer tells the server about its\n   * own (officeSession).\n   */\n  origin?: 'host' | 'server';\n}\n\n/** What the server says about an editing session (POST\n *  /api/files/onlyoffice/session): `stale` - a save of it would be kept beside\n *  the document, not written over it. */\nexport interface OfficeSessionState {\n  stale: boolean;\n  known: boolean;\n}\n\n/** The diagnosis endpoint's sibling: `/…/onlyoffice/diagnose` (lib/\n *  officeDiagnosis officeDiagnoseEndpoint, from the config endpoint) →\n *  `/…/onlyoffice/session`. */\nexport function officeSessionEndpoint(diagnoseEndpoint: string | null): string | null {\n  return diagnoseEndpoint ? diagnoseEndpoint.replace(/diagnose$/, 'session') : null;\n}\n\n/**\n * Asks the server about the session (`state`), or gives it the person's answer\n * (`mine`: write my version over the outside one; `theirs`: drop my session's\n * save). null when the server could not say (an older server, no permission):\n * the caller then does nothing, and the server keeps a stale save beside the\n * document, which loses nothing.\n *\n * An answer carries `token`, the signed editor configuration's own token: the\n * server takes an answer only from somebody it handed an editing session of\n * that key, and the token is how any of its instances can tell (0.54).\n */\nexport async function officeSession(\n  request: (url: string, init: RequestInit) => Promise<Response>,\n  endpoint: string,\n  body: { path: string; key: string; action?: 'state' | 'mine' | 'theirs'; token?: string },\n): Promise<OfficeSessionState | null> {\n  try {\n    const res = await request(endpoint, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ action: 'state', ...body }),\n    });\n    if (!res.ok) return null;\n    const j = (await res.json()) as Partial<OfficeSessionState>;\n    return { stale: j.stale === true, known: j.known === true };\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Reload without asking only when nothing of this editor's would be lost.\n *\n * ⚠ \"Edited\" is sticky for the life of one editor: ONLYOFFICE's\n * onDocumentStateChange says `true` while the person types and `false` once\n * the edits have reached the DOCUMENT SERVER — not the file. The file gets\n * them only when the session ends (or on a forced save), so `false` must not\n * be read as \"saved\".\n */\nexport function outsideAction(edited: boolean, change: Pick<OutsideChange, 'pending'>): 'reload' | 'ask' {\n  return edited || change.pending ? 'ask' : 'reload';\n}\n\n/**\n * The document's name as its owner knows it, for the question. The desktop\n * app's working copies are `<12 hex>-<name>` inside `.filex-open`\n * (desktop/src/openwith.ts scratchBasename); the prefix is machinery.\n */\nexport function outsideDocumentName(path: string, basename: string): string {\n  if (/(^|\\/|:\\/\\/)\\.filex-open\\//.test(path)) return basename.replace(/^[0-9a-f]{12}-/, '');\n  return basename;\n}\n","// #184, the web half: an office document open in the viewer hears that it\n// changed outside the editor (another person's save over WebDAV, a sync\n// client, an agent on a mounted folder, a second editing session).\n//\n// The viewer joins its document's FOLDER on the realtime feed, the way the\n// explorer joins the folder it shows (lib/realtime RealtimeClient, a folder\n// room - not a recursive watch, which would catalogue a whole lazy subtree),\n// and says which file it is on (presence, like the explorer's focus). A\n// change frame naming the document is only \"something happened to it\": the\n// caller asks the server whether its editing session is still on the current\n// version (POST /api/files/onlyoffice/session) before it tells anybody,\n// because the editor's OWN save announces itself the same way.\n//\n// The desktop app's working copies are not watched: nothing but the desktop\n// app writes them, and it watches the person's file itself (desktop/src\n// openwith.ts LocalDocMonitor).\n\nimport { RealtimeClient, type ChangeMessage, type WsTicket } from '../lib/realtime';\nimport { isInternalPath } from '../lib/internalPaths';\n\n/** `<storage>://a/b.docx` → { dir: `<storage>://a`, name: `b.docx` }. */\nexport function documentFolderOf(path: string): { dir: string; name: string } | null {\n  const idx = path.indexOf('://');\n  if (idx < 0) return null;\n  const storage = path.slice(0, idx + 3);\n  const rel = path.slice(idx + 3).replace(/\\/+$/, '');\n  const cut = rel.lastIndexOf('/');\n  const name = cut >= 0 ? rel.slice(cut + 1) : rel;\n  if (!name) return null;\n  return { dir: storage + (cut >= 0 ? rel.slice(0, cut) : ''), name };\n}\n\n/** Does this change frame (maybe) touch the file called `name`? A frame that\n *  names nothing (a merged burst) might. */\nexport function changeTouches(m: Pick<ChangeMessage, 'name' | 'new_name' | 'action'>, name: string): boolean {\n  if (!m.name && !m.new_name) return true;\n  return m.name === name || m.new_name === name;\n}\n\nexport interface DocumentWatch {\n  /** Watch the document at `path` (null, or an internal path: stop). */\n  watch(path: string | null): void;\n  stop(): void;\n}\n\n/**\n * `onMaybeChanged` is called, debounced, after a change frame that may be\n * about the document. No ticket (an old server, an embed without the realtime\n * endpoint) means no watch: the editor simply keeps the version it opened.\n */\nexport function useDocumentWatch(opts: {\n  ticket: () => Promise<WsTicket | null>;\n  onMaybeChanged: () => void;\n  debounceMs?: number;\n}): DocumentWatch {\n  let client: RealtimeClient | null = null;\n  let current: { dir: string; name: string } | null = null;\n  let timer: ReturnType<typeof setTimeout> | undefined;\n\n  function onChange(m: ChangeMessage): void {\n    if (!current) return;\n    if (m.path && m.path.replace(/\\/+$/, '') !== current.dir.replace(/\\/+$/, '')) return;\n    if (!changeTouches(m, current.name)) return;\n    if (timer) clearTimeout(timer);\n    timer = setTimeout(() => {\n      timer = undefined;\n      opts.onMaybeChanged();\n    }, opts.debounceMs ?? 400);\n  }\n\n  function stop(): void {\n    if (timer) clearTimeout(timer);\n    timer = undefined;\n    current = null;\n    client?.close();\n    client = null;\n  }\n\n  function watch(path: string | null): void {\n    const where = path && !isInternalPath(path) ? documentFolderOf(path) : null;\n    if (!where) {\n      stop();\n      return;\n    }\n    current = where;\n    if (!client) {\n      client = new RealtimeClient({ getTicket: opts.ticket, handlers: { onChange } });\n    }\n    client.subscribe(where.dir);\n    client.setFocus(where.name);\n  }\n\n  return { watch, stop };\n}\n","/**\n * officeFrame - the page's half of the ONLYOFFICE frame (task #92).\n *\n * ONLYOFFICE's editor API is a script, api.js, that an integrator loads into\n * its own page. Loaded into filex's page it runs with everything that page\n * can do - the bearer the web client keeps in sessionStorage, filex's API in\n * the signed-in person's name, the page itself. When the server serves a\n * page for it on another origin - the document server's own\n * (FILEX_ONLYOFFICE_FRAME_ORIGIN), or the app-interface origin\n * (FILEX_APP_UI_ORIGIN) - the editor config names that page (`frame`), and\n * the viewer frames it instead: api.js runs on another ORIGIN, out of reach\n * of all three. Another origin is enough, the same site included: browsers\n * keep session storage, local storage, pages and windows apart per origin.\n *\n * The protocol, `filex-oo` version 1 (the frame's half is\n * backend/internal/onlyoffice/frame/frame.js):\n *\n *   1. the frame -> here: {proto, v, type: 'hello', session}. Taken ONLY when\n *      the event's source is the frame element this page drew, its origin is\n *      the frame's address's origin, and the session is the one this page put\n *      in that address's fragment; once per element, and never after the\n *      element loaded a second document.\n *   2. here -> the frame: {proto, v, type: 'open', session, config} with one\n *      MessagePort, posted to the frame's origin by name (a frame that went\n *      elsewhere does not get it). `config` is the server's answer as it came:\n *      signed, untouched. This page adds nothing to it.\n *   3. the frame -> here, over the port only: 'started', 'ready',\n *      'state' {dirty}, 'error' {channel, code, description},\n *      'failed' {reason}. Anything else is dropped. Nothing goes the other\n *      way: closing the editor is removing the frame.\n *\n * The frame element is built with its sandbox, its permissions and its\n * referrer policy BEFORE its address and before it is in the document\n * (lesson #635): a sandbox set afterwards applies from the next navigation\n * only. `allow-same-origin` is safe here and needed - the frame's origin is\n * another origin than filex's, and the document server's editor wants storage\n * of its own. The sandbox attribute also takes `document.domain` away from the\n * frame and everything in it, so a sibling host cannot relax its way back to\n * filex's origin (filex's pages never set it either).\n */\nimport type { OfficeEventChannel } from './officeDiagnosis';\nimport { b64urlEncode } from './e2enames';\n\nexport const OFFICE_FRAME_PROTOCOL = 'filex-oo';\nexport const OFFICE_FRAME_VERSION = 1;\n\n/**\n * The frame's sandbox. Scripts and its own origin (the editor), forms (its\n * dialogs), popups (help, a print preview, an \"open in a new tab\"), downloads\n * (\"Download as\") and modals (print, its leave-page question). Not\n * allow-top-navigation: the editor never takes the page away.\n */\nexport const OFFICE_FRAME_SANDBOX =\n  'allow-scripts allow-same-origin allow-forms allow-popups allow-downloads allow-modals';\n\n/**\n * What the frame may pass on to the editor's own frame: the clipboard (its\n * paste and copy buttons), full screen (a slideshow) and autoplay (media in a\n * presentation). Nothing else - no camera, no microphone, no screen.\n */\nexport const OFFICE_FRAME_ALLOW = 'clipboard-read; clipboard-write; fullscreen; autoplay';\n\n/** How long the frame has to say hello before the editor is called unreachable. */\nexport const OFFICE_FRAME_HELLO_MS = 20_000;\n\nexport type OfficeFrameEvent =\n  | { type: 'started' }\n  | { type: 'ready' }\n  | { type: 'state'; dirty: boolean }\n  | { type: 'error'; channel: OfficeEventChannel; code: number | null; description: string }\n  | { type: 'failed'; reason: 'script' | 'api' };\n\nconst SESSION_RE = /^[A-Za-z0-9_-]{16,128}$/;\n\nfunction envelope(data: unknown): Record<string, unknown> | null {\n  if (!data || typeof data !== 'object' || Array.isArray(data)) return null;\n  const m = data as Record<string, unknown>;\n  if (m.proto !== OFFICE_FRAME_PROTOCOL || m.v !== OFFICE_FRAME_VERSION || typeof m.type !== 'string') return null;\n  return m;\n}\n\n/** The frame's hello, or null for anything that is not exactly one. */\nexport function parseFrameHello(data: unknown): { session: string } | null {\n  const m = envelope(data);\n  if (!m || m.type !== 'hello') return null;\n  const session = m.session;\n  if (typeof session !== 'string' || !SESSION_RE.test(session)) return null;\n  return { session };\n}\n\n/** One of the frame's events, or null for anything the protocol does not name. */\nexport function parseFrameEvent(data: unknown): OfficeFrameEvent | null {\n  const m = envelope(data);\n  if (!m) return null;\n  const type = m.type as string;\n  if (type === 'started') return { type: 'started' };\n  if (type === 'ready') return { type: 'ready' };\n  if (type === 'state') {\n    const dirty = m.dirty;\n    return typeof dirty === 'boolean' ? { type: 'state', dirty } : null;\n  }\n  if (type === 'error') {\n    const channel: OfficeEventChannel | null =\n      m.channel === 'onError' ? 'onError' : m.channel === 'onWarning' ? 'onWarning' : null;\n    if (!channel) return null;\n    const rawCode = m.code;\n    const code = typeof rawCode === 'number' && Number.isFinite(rawCode) ? rawCode : null;\n    const rawText = m.description;\n    const description = typeof rawText === 'string' ? rawText.slice(0, 1000) : '';\n    return { type: 'error', channel, code, description };\n  }\n  if (type === 'failed') {\n    if (m.reason === 'script') return { type: 'failed', reason: 'script' };\n    if (m.reason === 'api') return { type: 'failed', reason: 'api' };\n    return null;\n  }\n  return null;\n}\n\nlet warnedInPage = false;\n\n/**\n * Said once per page, in the console, when the server named no frame: api.js\n * runs in this page, with this page's session. The operator reads it at boot\n * and on the ONLYOFFICE card (editor_same_origin); this is for whoever opens\n * the console of an embed. Returns whether it was said now.\n */\nexport function warnEditorInPage(): boolean {\n  if (warnedInPage) return false;\n  warnedInPage = true;\n  console.warn(\n    \"[filex] ONLYOFFICE's api.js runs in this page, with this page's session. \" +\n      \"Set FILEX_ONLYOFFICE_FRAME_ORIGIN (the document server's origin) on the server to run it in a frame of its own (docs/ONLYOFFICE.md).\",\n  );\n  return true;\n}\n\n/** Tests only: the next warnEditorInPage() speaks again. */\nexport function resetEditorInPageWarning(): void {\n  warnedInPage = false;\n}\n\n/** The origin a frame address is on: an absolute http(s) address, else null. */\nexport function frameOriginOf(address: string | null | undefined): string | null {\n  if (!address) return null;\n  try {\n    const u = new URL(address);\n    if (u.protocol !== 'https:' && u.protocol !== 'http:') return null;\n    if (u.username || u.password) return null;\n    return u.origin;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * The setting that put a frame where it is, for the sentence an administrator\n * reads when it does not load: the interface route is FILEX_APP_UI_ORIGIN's,\n * anything else FILEX_ONLYOFFICE_FRAME_ORIGIN's (`/filex-frame/editor`).\n */\nexport function frameSetting(address: string): string {\n  try {\n    return new URL(address).pathname.includes('/_appui/') ? 'FILEX_APP_UI_ORIGIN' : 'FILEX_ONLYOFFICE_FRAME_ORIGIN';\n  } catch {\n    return 'FILEX_ONLYOFFICE_FRAME_ORIGIN';\n  }\n}\n\n/** A fresh session for one frame: 16 random bytes, base64url (22 characters). */\nexport function newFrameSession(): string {\n  return b64urlEncode(crypto.getRandomValues(new Uint8Array(16)));\n}\n\n/**\n * The frame element, ready to go into the document. The ORDER is the\n * security: sandbox, permissions and referrer policy first, the address last\n * (tests read the order back).\n */\nexport function buildOfficeFrame(address: string, session: string, title: string): HTMLIFrameElement {\n  const f = document.createElement('iframe');\n  f.setAttribute('sandbox', OFFICE_FRAME_SANDBOX);\n  f.setAttribute('allow', OFFICE_FRAME_ALLOW);\n  f.setAttribute('referrerpolicy', 'no-referrer');\n  f.setAttribute('title', title);\n  f.className = 'fe-preview__officeframe';\n  f.dataset.testid = 'office-frame';\n  const u = new URL(address);\n  u.hash = session;\n  f.setAttribute('src', u.toString());\n  return f;\n}\n\nexport interface OfficeFrameOptions {\n  /** The window the frame lives in (default: the global one). */\n  win?: Window;\n  /** The frame element this page drew. */\n  frame: () => HTMLIFrameElement | null;\n  /** frameOriginOf(the frame's address). */\n  origin: string;\n  /** The session in the frame's address. */\n  session: string;\n  /** The editor config, exactly as the server answered it. */\n  config: unknown;\n  onEvent: (e: OfficeFrameEvent) => void;\n  /** The frame said hello and was handed the config. */\n  onOpen?: () => void;\n  /** No hello within `helloMs`: the frame did not load, or is not ours. */\n  onSilent?: () => void;\n  helloMs?: number;\n}\n\nexport interface OfficeFrameLink {\n  /** Call from the frame element's `load` listener. */\n  frameLoaded(): void;\n  /** Stop listening and close the port. */\n  close(): void;\n  readonly opened: () => boolean;\n}\n\n/** Listen for the frame's hello and, on it, open the editor in it (step 2). */\nexport function linkOfficeFrame(opts: OfficeFrameOptions): OfficeFrameLink {\n  const win = opts.win ?? window;\n  let port: MessagePort | null = null;\n  let helloTaken = false;\n  let documents = 0;\n  let closed = false;\n  let timer: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n    timer = null;\n    if (!helloTaken && !closed) opts.onSilent?.();\n  }, opts.helloMs ?? OFFICE_FRAME_HELLO_MS);\n\n  const stopTimer = () => {\n    if (timer !== null) clearTimeout(timer);\n    timer = null;\n  };\n\n  const shutPort = () => {\n    if (!port) return;\n    port.onmessage = null;\n    try {\n      port.close();\n    } catch {\n      /* gone already */\n    }\n    port = null;\n  };\n\n  const onMessage = (ev: MessageEvent) => {\n    if (closed || helloTaken || documents > 1) return;\n    const el = opts.frame();\n    const target = el?.contentWindow ?? null;\n    // ⚠ All three, every time: the element this page drew (another frame on\n    // the page can say anything), the origin its address names (the frame\n    // has a real origin, unlike an app's opaque one), and the session this\n    // page put in that address.\n    if (!target || ev.source !== target) return;\n    if (ev.origin !== opts.origin) return;\n    const hello = parseFrameHello(ev.data);\n    if (!hello || hello.session !== opts.session) return;\n    helloTaken = true;\n    stopTimer();\n    const channel = new MessageChannel();\n    port = channel.port1;\n    port.onmessage = (m: MessageEvent) => {\n      if (closed) return;\n      const e = parseFrameEvent(m.data);\n      if (e) opts.onEvent(e);\n    };\n    target.postMessage(\n      {\n        proto: OFFICE_FRAME_PROTOCOL,\n        v: OFFICE_FRAME_VERSION,\n        type: 'open',\n        session: opts.session,\n        config: opts.config,\n      },\n      opts.origin,\n      [channel.port2],\n    );\n    opts.onOpen?.();\n  };\n\n  win.addEventListener('message', onMessage);\n\n  return {\n    frameLoaded() {\n      documents++;\n      // A second document in the element is not the page the server served\n      // for this session (it navigated itself): it hears nothing more.\n      if (documents > 1) shutPort();\n    },\n    close() {\n      closed = true;\n      stopTimer();\n      win.removeEventListener('message', onMessage);\n      shutPort();\n    },\n    opened: () => port !== null,\n  };\n}\n","<script setup lang=\"ts\">\n/**\n * PreviewModal — inline file preview.\n *\n * Strategy by extension:\n *   image / video / audio / pdf  → native browser elements\n *   md / markdown                 → markdown-it (lazy) → rendered HTML\n *   code (js/ts/php/py/json/...)  → Monaco when ready, highlight.js\n *                                    fallback while it's still loading,\n *                                    plain `<pre>` when neither is\n *                                    installed\n *   office (docx/xlsx/pptx)       → OnlyOffice iframe (config.onlyOfficeBase)\n *   plain text (txt/log/conf)     → CodeMirror when saveText is set,\n *                                    `<pre>` otherwise\n *   no telling extension          → as `openAs` says (a New document's\n *     (LICENSE, notes.custom)       type), else as plain text when the\n *                                    server's mime says text (#56)\n *   anything else                 → \"Download\" fallback\n *\n * Monaco is dynamic-imported at FileExplorer onMounted; by the time the\n * user clicks an editable code file the chunk is usually already cached.\n * We probe `getMonaco()` synchronously when the modal opens — if it's\n * not yet loaded we render the highlight.js read-only view immediately,\n * then upgrade to Monaco once the import resolves.\n */\nimport { sanitizeHtml } from '../lib/sanitizeHtml';\nimport { markdownToSafeHtml } from '../lib/markdownHtml';\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue';\nimport type { Component } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport Modal from './Modal.vue';\nimport StarButton from '../components/StarButton.vue';\nimport { ensureMonaco, getMonaco, ensureHighlight } from '../composables/useMonacoLoader';\nimport { localeTag, useLocale } from '../composables/useLocale';\nimport { resolveLocale } from '../locales/resolve';\nimport { browserProbeURL } from '../lib/externalReach';\nimport {\n  OFFICE_DOWNLOAD_ERROR,\n  fetchOfficeDiagnosis,\n  officeDiagnoseEndpoint,\n  officeDiagnosisText,\n  officeErrorCode,\n  officeErrorText,\n  officeEventEndsTheEditor,\n  type OfficeEventChannel,\n} from '../lib/officeDiagnosis';\nimport { fileIconTile } from '../lib/fileIcons';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport { requestFailure, sayFailure } from '../lib/errorWords';\nimport { createArchivePreviewCache } from '../lib/archivePreviewCache';\nimport { isOfficeExt, isTextEditable, isTextualMime } from '../lib/serverRules';\nimport { withAppBase } from '../lib/appBase';\nimport { draftKeyOf } from '../lib/internalPaths';\nimport { draftFolderLabel, draftsClient, type DraftDto } from '../lib/drafts';\nimport { useDraftSave, type SavedDraft } from '../composables/useDraftSave';\nimport DraftCloseModal from './DraftCloseModal.vue';\nimport AppFrame from '../components/plugin/AppFrame.vue';\nimport type { PluginViewRow } from '../types/Plugins';\nimport type { FileApi } from '../composables/useFileApi';\nimport { labelOf as pluginLabelOf } from '../lib/pluginLabel';\nimport DraftConflictModal from './DraftConflictModal.vue';\nimport OutsideChangeModal from './OutsideChangeModal.vue';\nimport {\n  officeSession,\n  officeSessionEndpoint,\n  outsideAction,\n  outsideDocumentName,\n  type OutsideAnswer,\n  type OutsideChange,\n  type OutsideChoice,\n} from '../lib/outsideChange';\nimport { useDocumentWatch } from '../composables/useDocumentWatch';\nimport {\n  buildOfficeFrame,\n  frameOriginOf,\n  frameSetting,\n  linkOfficeFrame,\n  newFrameSession,\n  warnEditorInPage,\n  type OfficeFrameEvent,\n  type OfficeFrameLink,\n} from '../lib/officeFrame';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  file: FileNode | null;\n  previewUrl: (path: string) => string;\n  downloadUrl: (path: string) => string;\n  onlyOfficeBase?: string | null;\n  onlyOfficeConfigEndpoint?: string | null;\n  /**\n   * Could this person set up a missing service (`capabilities.caller_admin`)?\n   * Only changes WHICH sentence a missing document server gets: an\n   * administrator is told where to set it up, everybody else that it is not\n   * available here and how to get the file anyway.\n   */\n  canConfigure?: boolean;\n  saveTextEndpoint?: string | null;\n  /** Endpoint for the archive (zip/rar/7z/tar) member list. Forwarded to\n   *  ArchiveViewer, which otherwise assumes a same-origin path. */\n  archiveListEndpoint?: string | null;\n  openMode?: 'edit' | 'view';\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  /** New rich-viewer config (forwarded by FileExplorer from ExplorerConfig). */\n  drawioUrl?: string | null;\n  pdfWorkerUrl?: string | null;\n  pdfSaveUrl?: string | null;\n  /** Standalone full-screen viewer route — `?path=…&storage=…&type=…`. */\n  viewerBaseUrl?: string | null;\n  /* wiring:e2 — false hides the \"Edit\" / \"Open in New Tab\" buttons.\n   * The standalone route fetches RAW server bytes, which inside an\n   * E2E-encrypted folder is ciphertext (and its save path could clobber\n   * the encrypted blob) — the host disables the escape hatches there. */\n  newTabEnabled?: boolean;\n  /** Drop the dialog chrome (backdrop tint, header bar, footer actions)\n   *  so the viewer fills the full viewport. Used by the standalone\n   *  /files/edit route where the browser tab IS the container — a\n   *  modal frame on top of the editor just steals real estate. */\n  chromeless?: boolean;\n  /** When the dynamic-viewer chunk fails to load, fall back to the\n   *  legacy native renderer (e.g. native `<object>` for PDFs). */\n  /** Explicit theme. Forwarded to the underlying Modal (which tags\n   *  its backdrop with `.fe--theme-{light,dark}` so the CSS variable\n   *  override matches the host admin shell) and to Monaco (vs vs\n   *  vs-dark). When unset Monaco falls back to `prefers-color-scheme`\n   *  and the modal cascade follows whatever `.fe` parent it gets. */\n  theme?: 'light' | 'dark' | 'auto';\n  /* === gorunum:v1-viewer — the full-bleed overlay's own contract ===\n   * Everything below is OPTIONAL and answered by the host, because the\n   * modal cannot invent any of it: it is handed ONE file and has no idea\n   * what list that file came out of, nor where the API lives. */\n  /** 1-based position of `file` in the host's current file list. */\n  index?: number;\n  /** How many files that list holds. `index` + `total` draw \"1 of 9\";\n   *  with either missing the counter is simply absent — a counter that\n   *  guesses is worse than no counter. */\n  total?: number;\n  /** Draw the prev/next chevrons even when index/total are unknown.\n   *  QuickLook sets it because its host already answers `nav`. */\n  navEnabled?: boolean;\n  /** API origin for the star toggle — same meaning as ExplorerConfig.apiBase.\n   *  Omitted = same origin, which is what the admin UI wants. */\n  apiBase?: string;\n  /** Draw the share action. Off by default on purpose: a share button with\n   *  no host listening to `@share` is a control that lies. */\n  shareEnabled?: boolean;\n  /**\n   * Open `file` AS this type — an extension, no dot — instead of by its name\n   * (#56). The New document dialog made `LICENSE` as Plain text, so it opens\n   * in the text editor although its name picks no viewer at all; `README`\n   * made as Markdown opens in the markdown editor. Unset: the name decides,\n   * as it always has. The host passes it for the one file it applies to.\n   */\n  openAs?: string | null;\n  /**\n   * Drafts (issue #71): the drafts API, `<api>/api/files/drafts`. With it, a\n   * file whose path is a draft's (`<storage>://.filex-drafts/…`, lib/\n   * internalPaths `draftKeyOf`) is edited AS a draft: the bar across the top\n   * says where it will be saved and carries the Save that puts it there,\n   * closing asks what should become of it (DraftCloseModal), and leaving the\n   * page with edits in it asks the browser's own question. Every host passes\n   * it — the explorer, the standalone editor tab, the desktop's document\n   * windows (which load that tab) — so a draft behaves the same wherever it\n   * is opened. Absent: nothing here changes.\n   */\n  draftsEndpoint?: string | null;\n  /**\n   * v4 — an app's own interface that opens this file (a `viewer` view the\n   * host matched to it, docs/APP-PLUGINS-API.md → An app's own interface).\n   * It takes the built-in viewer's place: the same bar, the same draft\n   * behaviour, the same close question. Needs `api`.\n   */\n  appViewer?: PluginViewRow | null;\n  /**\n   * 0.51 - the host opens this file in ONLYOFFICE although its extension picks\n   * another viewer: a .csv, whose handler (lib/appViewer) is ONLYOFFICE by\n   * default while it is configured, or \"Open with\" chose it. The office editor\n   * takes the built-in viewer's place, with an office document's Edit button.\n   */\n  inOffice?: boolean;\n  /** The explorer's API — what an app's interface reads and saves through. */\n  api?: FileApi | null;\n  /** The person's display name, for an app's interface. */\n  userName?: string;\n  /** Storage names an app's save-as may span (AppFrame `storages`); absent,\n   *  the frame asks the server's listing. */\n  storages?: string[];\n  /**\n   * #184 - the document open in the office editor changed OUTSIDE it. The\n   * host says so (the desktop app watches the file on the computer, the web\n   * hears the server's realtime feed); the viewer decides: nothing of this\n   * editor's unsaved, the new version is loaded with a note; otherwise the\n   * person is asked which version stays (OutsideChangeModal), and the answer\n   * goes back as `outside-resolved`. lib/outsideChange has the rule.\n   */\n  outsideChange?: OutsideChange | null;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  /** Previous / next file. −1 and +1, the SAME contract QuickLook already\n   *  emits upward — the chevrons are a second trigger for it, not a second\n   *  navigation mechanism. The host keeps the `file` prop in sync. */\n  (e: 'nav', delta: number): void;\n  /** The host opens its own share dialog for `file`: the one in view, which\n   *  after a draft's Save is the saved file, not the draft the viewer was\n   *  opened on (#85). Only reachable when `shareEnabled`. */\n  (e: 'share', file: FileNode): void;\n  /** The star toggle succeeded — so the host can update its listing row. */\n  (e: 'starred', value: boolean): void;\n  /** Drafts (issue #71): the draft was saved — it is a file at `path` now.\n   *  The viewer keeps editing it there; the host refreshes what it shows. */\n  (e: 'draft-saved', saved: SavedDraft): void;\n  /** Drafts: the draft was discarded (it is in the trash). Followed by `close`. */\n  (e: 'draft-discarded'): void;\n  /** v4 — an app's interface asked for a line to be said (`ui.toast`). */\n  (e: 'toast', message: string): void;\n  /** v4 — an app's interface queued a job (`job.submit`); the raw ops row. */\n  (e: 'op', op: Record<string, unknown>): void;\n  /** #110: the file in view was saved from here (an app's interface, the\n   *  code or Markdown editor): its new size, so the host's row catches up. */\n  (e: 'saved', saved: { path: string; size?: number }): void;\n  /** #184: whether the office editor holds an edit of this session's (sticky\n   *  from the first keystroke until the editor is reloaded). The desktop app\n   *  reads it; nothing else has to. */\n  (e: 'office-edited', edited: boolean): void;\n  /** #184: what became of an `outsideChange` - taken in without a question\n   *  ('reloaded'), or the person's answer. */\n  (e: 'outside-resolved', answer: OutsideAnswer): void;\n}>();\n\nconst { t, formatSize, formatDate, nodeDisplayName } = useLocale(() => props.locale);\nconst archivePreviewCache = createArchivePreviewCache();\n\n/**\n * The extension that picks the viewer.\n *\n * Normally the file's own. Two exceptions, both for a file whose name does not\n * say what it is (#56): the host's `openAs` (the type a New document was made\n * as), and — for a name that picks NO viewer, like `LICENSE` or\n * `example.custom` — the server's mime: bytes it calls text open as the plain\n * text they are, instead of the \"Download\" fallback. A name that does pick a\n * viewer keeps it whatever the mime says.\n */\nfunction ext(f: FileNode | null): string {\n  if (!f) return '';\n  if (props.openAs && f === props.file) return props.openAs.toLowerCase();\n  const own = (f.extension || '').toLowerCase();\n  if (!picksViewer(own) && isTextualMime(f.mime_type)) return 'txt';\n  return own;\n}\n\nconst IMAGE = ['jpg', 'jpeg', 'png', 'webp', 'gif', 'bmp', 'avif', 'svg', 'heic'];\nconst VIDEO = ['mp4', 'webm', 'mov', 'mkv', 'm4v', 'ogv'];\nconst AUDIO = ['mp3', 'wav', 'ogg', 'flac', 'm4a', 'aac', 'opus'];\n\nconst CODE_LANGS: Record<string, string> = {\n  md: 'markdown', markdown: 'markdown',\n  txt: 'plaintext', log: 'plaintext',\n  js: 'javascript', mjs: 'javascript', cjs: 'javascript',\n  ts: 'typescript', tsx: 'typescript', jsx: 'javascript',\n  vue: 'xml', svelte: 'xml', html: 'xml', htm: 'xml', xml: 'xml', svg: 'xml',\n  css: 'css', scss: 'scss', sass: 'scss', less: 'less',\n  json: 'json', jsonc: 'json',\n  yml: 'yaml', yaml: 'yaml',\n  php: 'php', py: 'python', rb: 'ruby', go: 'go', rs: 'rust',\n  java: 'java', kt: 'kotlin', swift: 'swift', cpp: 'cpp', c: 'c',\n  h: 'cpp', hpp: 'cpp', cs: 'csharp', dart: 'dart',\n  sh: 'bash', bash: 'bash', zsh: 'bash', fish: 'bash',\n  sql: 'sql',\n  toml: 'ini', ini: 'ini', conf: 'ini', env: 'bash', cfg: 'ini',\n  dockerfile: 'dockerfile',\n  graphql: 'graphql', gql: 'graphql',\n  diff: 'diff', patch: 'diff',\n};\n// CSV/TSV land in the rich viewer (`csv` kind below) instead of the\n// legacy plain-text path so the user gets a proper table preview.\nconst TEXT_PLAIN = ['txt', 'log'];\n/* The document server's formats are the SERVER's answer (lib/serverRules\n * `isOfficeExt`, `capabilities.edit_kinds`, #211) - the one the explorer's\n * menu reads too, so a type previewed as \"office\" is exactly a type whose\n * Open needs ONLYOFFICE. */\n\n/**\n * Lazy viewer map — extension → component loader. Each loader is a\n * dynamic import so the viewer chunk only ships when the file type\n * is actually opened. The PreviewModal mounts the resolved component\n * via `<component :is=\"ViewerCmp\" />` once the dynamic import settles.\n */\nconst VIEWER_MAP: Record<string, () => Promise<Component>> = {\n  glb: () => import('../viewers/Viewer3D.vue'),\n  gltf: () => import('../viewers/Viewer3D.vue'),\n  obj: () => import('../viewers/Viewer3D.vue'),\n  stl: () => import('../viewers/Viewer3D.vue'),\n  fbx: () => import('../viewers/Viewer3D.vue'),\n  '3ds': () => import('../viewers/Viewer3D.vue'),\n\n  epub: () => import('../viewers/EpubViewer.vue'),\n\n  mmd: () => import('../viewers/MermaidViewer.vue'),\n  mermaid: () => import('../viewers/MermaidViewer.vue'),\n\n  drawio: () => import('../viewers/DrawioViewer.vue'),\n  dio: () => import('../viewers/DrawioViewer.vue'),\n\n  tif: () => import('../viewers/TiffViewer.vue'),\n  tiff: () => import('../viewers/TiffViewer.vue'),\n\n  psd: () => import('../viewers/PsdViewer.vue'),\n\n  // PDF deliberately uses the native browser viewer (`kind === 'pdf'`\n  // branch in the template). PdfViewer.vue still exists for callers\n  // that want the rich custom UI but the SFC default keeps things\n  // minimal — the browser already paints search/zoom/page UI for free.\n\n  ipynb: () => import('../viewers/IpynbViewer.vue'),\n\n  csv: () => import('../viewers/CsvViewer.vue'),\n  tsv: () => import('../viewers/CsvViewer.vue'),\n\n  zip: () => import('../viewers/ArchiveViewer.vue'),\n  '7z': () => import('../viewers/ArchiveViewer.vue'),\n  rar: () => import('../viewers/ArchiveViewer.vue'),\n  tar: () => import('../viewers/ArchiveViewer.vue'),\n  gz: () => import('../viewers/ArchiveViewer.vue'),\n  tgz: () => import('../viewers/ArchiveViewer.vue'),\n  bz2: () => import('../viewers/ArchiveViewer.vue'),\n  tbz2: () => import('../viewers/ArchiveViewer.vue'),\n  xz: () => import('../viewers/ArchiveViewer.vue'),\n  txz: () => import('../viewers/ArchiveViewer.vue'),\n};\n\ntype PreviewKind =\n  | 'image' | 'video' | 'audio' | 'pdf' | 'markdown' | 'code'\n  | 'office' | 'text' | 'viewer' | 'app' | 'other';\n\n/** Does this extension, on its own, pick a surface? The same lists `kind`\n *  reads below — an extension that falls through all of them is 'other'. */\nfunction picksViewer(e: string): boolean {\n  if (!e) return false;\n  return (\n    IMAGE.includes(e) || VIDEO.includes(e) || AUDIO.includes(e) || e === 'pdf' ||\n    e === 'md' || e === 'markdown' || e in CODE_LANGS || e in VIEWER_MAP ||\n    isOfficeExt(e) || TEXT_PLAIN.includes(e) || isTextEditable({ extension: e })\n  );\n}\n\n/** The app interface this file opens in, when the host matched one. */\nconst appView = computed(() => (props.appViewer?.ui && props.api ? props.appViewer : null));\nconst appFrameRef = ref<InstanceType<typeof AppFrame> | null>(null);\n/** The app's interface holds changes it has not saved (`ui.dirty`). */\nconst appDirty = ref(false);\nconst appLabel = computed(() => (appView.value ? pluginLabelOf(appView.value.label, props.locale) || appView.value.plugin : ''));\n/** The file as the app's interface is handed it: its name, never storage paths beyond the one it may save. */\nconst appFiles = computed(() =>\n  props.file\n    ? [{\n        path: props.file.path,\n        name: props.file.basename,\n        size: props.file.size ?? undefined,\n        mime: props.file.mime_type ?? undefined,\n        // The storage takes no writes, or this person may only look: the\n        // interface is told it cannot save, and a save is refused here too.\n        readOnly: !!props.file.read_only || props.file.perm === 'viewer' || props.file.perm === 'none',\n      }]\n    : [],\n);\n/** An app's interface saved: the file in view when it saved the first of its\n *  files (`index` 0), and the header and the host learn its new size. */\nfunction onAppSaved(r: { path: string; size: number; index: number }): void {\n  draftTouched.value = true;\n  if (r.index === 0) noteSaved(livePath.value, r.size);\n}\nfunction onAppDirty(v: boolean): void {\n  appDirty.value = v;\n  if (v) draftTouched.value = true;\n}\n\nconst kind = computed<PreviewKind>(() => {\n  // An app the administrator installed for this type takes the built-in\n  // viewer's place (the host decided it matches: its `applies` rule).\n  if (appView.value) return 'app';\n  const e = ext(props.file);\n  // A name that is text on its own (`Makefile`, `Dockerfile`) - the server's\n  // list (#211) - opens in the text editor; anything else nameless is 'other'.\n  if (!e) {\n    if (!isTextEditable({ basename: props.file?.basename, extension: '' })) return 'other';\n    return props.openMode !== 'view' ? 'code' : 'text';\n  }\n  // 0.51 - ONLYOFFICE, when the host opens the file there (a .csv).\n  if (props.inOffice) return 'office';\n  if (IMAGE.includes(e)) return 'image';\n  if (VIDEO.includes(e)) return 'video';\n  if (AUDIO.includes(e)) return 'audio';\n  // PDF always uses the native browser <object> renderer. The\n  // PdfViewer SFC is no longer wired into the default map — the\n  // browser-bundled toolbar is enough and removes a 600 KB pdfjs\n  // worker chunk + a custom toolbar layer for parity with the rest\n  // of the read-only viewers.\n  if (e === 'pdf') return 'pdf';\n  // Markdown stays in its own branch (gets the split view in edit mode);\n  // plain text → code editor in edit mode, raw <pre> in view mode.\n  const wantEdit = props.openMode !== 'view';\n  if (e === 'md' || e === 'markdown') return 'markdown';\n  if (e in CODE_LANGS) return 'code';\n  if (e in VIEWER_MAP) return 'viewer';\n  if (isOfficeExt(e)) return 'office';\n  if (TEXT_PLAIN.includes(e)) return wantEdit ? 'code' : 'text';\n  // Text the server saves (`.properties`, `.lua`, a `Makefile`) that has no\n  // highlighter of its own here: the plain editor, not \"Download\".\n  if (isTextEditable({ basename: props.file?.basename, extension: e })) return wantEdit ? 'code' : 'text';\n  return 'other';\n});\n\n// --- Rich viewer plumbing ---\n//\n// `viewerCmp` holds the dynamically-imported component once the load\n// resolves. Stored in a `shallowRef` because the component itself\n// shouldn't be deep-watched.\nconst viewerCmp = shallowRef<Component | null>(null);\nconst viewerLoadError = ref<string | null>(null);\nconst pdfFallbackToNative = ref(false);\n\nasync function loadViewerFor(extension: string): Promise<void> {\n  viewerCmp.value = null;\n  viewerLoadError.value = null;\n  const loader = VIEWER_MAP[extension];\n  if (!loader) return;\n  try {\n    const mod = (await loader()) as { default?: Component };\n    viewerCmp.value = mod.default ?? (mod as unknown as Component);\n  } catch (err) {\n    viewerLoadError.value = said(err, 'err.viewer_failed').text;\n    if (extension === 'pdf') pdfFallbackToNative.value = true;\n  }\n}\n\nfunction onPdfFallback(): void {\n  pdfFallbackToNative.value = true;\n}\n\n/** Build the props bundle pushed into the active viewer component. */\nconst viewerProps = computed(() => {\n  const e = ext(props.file);\n  const base: Record<string, unknown> = {\n    url: src.value,\n    ext: e,\n    mime: props.file?.mime_type,\n    t,\n    /* The viewer's language as a code, for the one thing `t` cannot give it:\n       how a NUMBER is written (a size in the archive list). */\n    locale: props.locale,\n    authHeaders: props.authHeaders,\n    authCredentials: props.authCredentials,\n  };\n  if (props.file) {\n    base.filePath = stripAdapter(props.file.path);\n    // Archive viewer needs the adapter-qualified path because the\n    // /api/files/archive/list handler falls back to storages[0] when\n    // no adapter prefix is present — on multi-storage instances that\n    // 500s for every non-default storage (sample.zip on fm s3-test).\n    if (['zip', 'rar', '7z', 'tar', 'gz', 'tgz', 'bz2', 'tbz2', 'xz', 'txz'].includes(e)) {\n      base.filePath = props.file.path;\n      if (props.archiveListEndpoint) base.archiveListUrl = props.archiveListEndpoint;\n      base.archivePreviewCache = archivePreviewCache;\n    }\n  }\n  if (e === 'drawio' || e === 'dio') {\n    // ⚠ The adapter-qualified path: the diagram is saved through save-text,\n    // which resolves a bare path against the first storage (see saveMarkdown).\n    base.filePath = livePath.value;\n    base.drawioUrl = props.drawioUrl ?? undefined;\n    base.canConfigure = props.canConfigure === true;\n    base.saveUrl = props.saveTextEndpoint ?? undefined;\n    base.readOnly = props.openMode === 'view';\n  }\n  if (e === 'pdf') {\n    base.pdfWorkerUrl = props.pdfWorkerUrl ?? undefined;\n    base.pdfSaveUrl = props.pdfSaveUrl ?? undefined;\n  }\n  return base;\n});\n\nfunction openInNewTab(): void {\n  buildAndOpenStandalone(props.openMode || 'edit');\n}\n\nfunction openEditInNewTab(): void {\n  buildAndOpenStandalone('edit');\n}\n\nfunction buildAndOpenStandalone(mode: 'view' | 'edit'): void {\n  if (!props.file) return;\n  const e = ext(props.file);\n  // Keep the adapter-qualified path intact so the editor route\n  // resolves the storage from the URL (stripping it falls back to\n  // storages[0] and 404s for any non-default adapter). Default base\n  // is the SFC's standalone /files/edit route — under the base path this\n  // document was served from (lib/appBase), '' everywhere but the admin app\n  // under a sub-path; embedders override via viewerBaseUrl when they mount us\n  // elsewhere.\n  const base = props.viewerBaseUrl || withAppBase('/files/edit');\n  const sep = base.includes('?') ? '&' : '?';\n  // The app's interface it is open in goes along (`app=plugin/view`): the\n  // tab opens it in the same app, whatever else opens the type. So does\n  // ONLYOFFICE (0.51, `app=onlyoffice`).\n  const app = appView.value\n    ? `&app=${encodeURIComponent(`${appView.value.plugin}/${appView.value.id}`)}`\n    : props.inOffice\n      ? '&app=onlyoffice'\n      : '';\n  const url =\n    `${base}${sep}path=${encodeURIComponent(props.file.path)}` +\n    `&type=${encodeURIComponent(e)}` +\n    `&mode=${encodeURIComponent(mode)}` +\n    app;\n  window.open(url, '_blank', 'noopener');\n}\n\n/**\n * Whether this file has an \"edit\" surface here: an office document (the\n * document server), or text the built-in editor opens and save-text saves -\n * a draw.io or Mermaid diagram included, which their viewers save as text.\n * Both are the server's answer (lib/serverRules, #211): the list that stood\n * here offered Edit on `.graphql` and `.mmd`, which save-text then refused\n * with a 415, and none on `.properties`, `.lua` or a `Makefile`, which it\n * saves. Read-only kinds (image, video, audio, 3D, archive) have none.\n */\n/* The viewers here that EDIT what they show (and save it as text): a diagram's.\n * Any other viewer only shows its file (the table a .csv is drawn as), so text\n * the server saves but this client has no editor for in that viewer is not\n * offered Edit. Which components exist is this client's own knowledge, not a\n * rule of the server's. */\nconst EDITING_VIEWERS = new Set(['drawio', 'dio', 'mmd', 'mermaid']);\n\nconst canEditKind = computed<boolean>(() => {\n  const f = props.file;\n  if (!f) return false;\n  if (props.inOffice === true) return true;\n  const e = ext(f);\n  if (isOfficeExt(e)) return true;\n  if (!isTextEditable({ basename: f.basename, extension: e, mime_type: f.mime_type })) return false;\n  return kind.value !== 'viewer' || EDITING_VIEWERS.has(e);\n});\n\n/**\n * 0.51 - a .csv being edited in ONLYOFFICE is saved as a CSV: what that keeps\n * and what it does not, before anything is saved. ONLYOFFICE says it too, in\n * English only and under its own tips (measured on Docs 9.4).\n */\nconst csvOfficeNote = computed(() => kind.value === 'office' && ext(props.file) === 'csv' && props.openMode !== 'view');\n\n/**\n * The Edit button of a document whose editor is an optional service that is\n * not there — ONLYOFFICE for office files, draw.io for diagrams. It led to a\n * tab that could only say so. The owner's rule (lib/serviceGate): greyed with\n * where to set it up for someone who can, not offered to anybody else.\n */\nconst editNeeds = computed<'' | 'onlyoffice' | 'drawio'>(() => {\n  const e = ext(props.file);\n  if ((isOfficeExt(e) || props.inOffice) && !props.onlyOfficeBase) return 'onlyoffice';\n  if ((e === 'drawio' || e === 'dio') && !props.drawioUrl) return 'drawio';\n  return '';\n});\nconst editTitle = computed(() =>\n  editNeeds.value === 'onlyoffice'\n    ? t('ctx.needs_onlyoffice')\n    : editNeeds.value === 'drawio'\n      ? t('ctx.needs_drawio')\n      : t('viewer.edit'),\n);\n\n// Keep adapter prefix so backend resolves the right storage — stripping\n// it defaults to storages[0] and 404s on any non-default adapter.\nconst src = computed(() => (props.file ? props.previewUrl(props.file.path) : ''));\n/* Drafts: after its Save the draft is a file somewhere else — the download\n   is of THAT file (livePath); the preview source is left alone, because\n   changing it would reload the editor that is still open on the document. */\nconst download = computed(() => (props.file ? props.downloadUrl(livePath.value) : ''));\n\nfunction stripAdapter(p: string): string {\n  const idx = p.indexOf('://');\n  return idx === -1 ? p : p.slice(idx + 3);\n}\n\n/* === gorunum:v1-viewer — full-bleed overlay chrome ===\n *\n * The card modal (title bar + Download/Close footer) is gone; what replaces\n * it is one bar across the top, a chevron on each screen edge and a floating\n * zoom pill. `chromeless` is untouched: the standalone /files/edit route still\n * gets the bare viewer with no chrome at all, which is the whole point of that\n * flag — the browser tab is its container.\n */\n\n/** Chrome is drawn for the in-page overlay only. */\nconst showChrome = computed(() => !props.chromeless);\n\nconst viewerEl = ref<HTMLElement | null>(null);\n\nconst tileHtml = computed(() => (props.file ? fileIconTile(props.file) : ''));\nconst displayName = computed(() => (props.file ? nodeDisplayName(props.file) : ''));\n\n/** \"1 of 9\" — only when the host answered BOTH halves. */\nconst counterText = computed(() => {\n  const i = props.index;\n  const n = props.total;\n  if (!i || !n || n < 1 || i < 1) return '';\n  return t('viewer.counter', { i, n });\n});\n\n/**\n * #110: what a save made in this viewer changed, until the host's row says\n * it too. The header read the size and date the file had when it was opened,\n * after any number of saves: filextext re-keyed its workspace after a password\n * reset (a new version on the storage) and the header still said 1.92 KB.\n * Only the file in view (`livePath`); another file shown resets it.\n */\nconst savedMeta = ref<{ path: string; size?: number; at: number } | null>(null);\nwatch(\n  () => props.file?.path,\n  () => {\n    savedMeta.value = null;\n  },\n);\nfunction noteSaved(path: string, size?: number): void {\n  savedMeta.value = { path, size, at: Date.now() };\n  emit('saved', { path, size });\n}\n/** The bytes a text save puts on the storage. */\nfunction utf8Size(text: string): number {\n  return new TextEncoder().encode(text).length;\n}\n\n/** `246.3 KB • Sep 9, 2026 • 1 of 9`, with any unknown part left out\n *  rather than printed as a placeholder.\n *  ⚠ A draft's size is unknown here, so it is left out: the draft is being\n *  written while it is open (the editors and an app save into it, and its\n *  Save moves it), and the row it was opened with carries the size it had\n *  when it was made - \"0 B\" for every New document, kept on screen through\n *  every save (measured with filextext, 0.48.0: \"0 B\" after the app had\n *  written 4.47 KB). `draftKey` is the path's answer, so it holds from the\n *  first frame, before the server has said whose draft it is. */\nconst metaLine = computed(() => {\n  const f = props.file;\n  if (!f) return '';\n  const parts: string[] = [];\n  const saved = savedMeta.value && savedMeta.value.path === livePath.value ? savedMeta.value : null;\n  // A save made in this viewer reports what it wrote (noteSaved): that figure\n  // is shown, a draft's included. The row's own size never is for a draft.\n  const size = typeof saved?.size === 'number' ? saved.size : draftKey.value ? undefined : f.size;\n  if (typeof size === 'number' && f.type === 'file') parts.push(formatSize(size));\n  const when = formatDate(saved ? saved.at : f.last_modified);\n  if (when) parts.push(when);\n  if (counterText.value) parts.push(counterText.value);\n  return parts.join(' • ');\n});\n\n/** The chevrons appear only where prev/next actually goes somewhere. */\nconst canNav = computed(\n  () => showChrome.value && (props.navEnabled === true || (props.total ?? 0) > 1),\n);\n\n/**\n * #110: the chevrons stand BESIDE a surface that fills the stage, never on it.\n * They are drawn at the screen's edges, over the stage. A photo has ground\n * around it there; an app's own interface, an editor or a document viewer\n * reaches the edge, and the chevrons covered it: filextext's page list and its\n * scroll bar, measured in Firefox and WebKit with two files in the folder.\n * Such a stage keeps a gutter on each side for them (`fe-viewer__stage--gutter`).\n * Which surfaces fill the stage is FILL_KINDS alone: a kind added there gets\n * its gutter with nothing else to remember.\n */\nconst chevGutter = computed(() => canNav.value && FILL_KINDS.has(kind.value));\n\n/** Starring is the real thing, not a second implementation: StarButton +\n *  lib/star.ts, the same pair the listing rows use. It needs the DB node id,\n *  which client-synthesized rows do not carry — no id, no button. */\nconst starNodeId = computed(() =>\n  typeof props.file?.id === 'number' ? (props.file.id as number) : null,\n);\n\n/**\n * Which kinds get the stage stretched instead of centred. Editors and\n * document surfaces want every pixel; a photo wants to sit in the middle\n * of the ground with room around it. An app's own interface (`app`) is an\n * editor too. The ONE list: the chevrons' gutter (chevGutter) reads it.\n */\nconst FILL_KINDS = new Set(['pdf', 'markdown', 'code', 'text', 'office', 'viewer', 'app']);\nconst stageModifier = computed(() =>\n  FILL_KINDS.has(kind.value) ? 'fe-preview--fill' : 'fe-preview--center',\n);\n\n/* --- Zoom (image only) ----------------------------------------------\n *\n * ⚠ The pill is hidden for pdf / office / drawio. Those three paint their\n * OWN zoom control inside their surface, and a second one wired to nothing\n * is a control that lies — worse than no control, because the user reads a\n * percentage that the thing on screen does not obey.\n */\nconst ZOOM_STEPS = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4];\nconst zoom = ref(1);\nconst imgEl = ref<HTMLImageElement | null>(null);\n/** The width the image settles at when it is fit to the stage (zoom = 1).\n *  Everything else is a multiple of it, which is what makes \"100%\" mean\n *  \"the size you first saw\" rather than \"the pixel size of the file\". */\nconst fitWidth = ref(0);\n\nconst canZoom = computed(() => showChrome.value && kind.value === 'image');\n\nfunction measureFit(): void {\n  if (zoom.value !== 1 || !imgEl.value) return;\n  const w = imgEl.value.getBoundingClientRect().width;\n  if (w > 0) fitWidth.value = w;\n}\n\nconst imageStyle = computed(() => {\n  if (zoom.value === 1 || !fitWidth.value) return undefined;\n  return {\n    width: `${Math.round(fitWidth.value * zoom.value)}px`,\n    height: 'auto',\n    maxWidth: 'none',\n    maxHeight: 'none',\n  } as Record<string, string>;\n});\n\nfunction stepZoom(dir: 1 | -1): void {\n  const cur = zoom.value;\n  if (dir > 0) {\n    zoom.value = ZOOM_STEPS.find((s) => s > cur + 1e-6) ?? ZOOM_STEPS[ZOOM_STEPS.length - 1];\n  } else {\n    const lower = ZOOM_STEPS.filter((s) => s < cur - 1e-6);\n    zoom.value = lower.length ? lower[lower.length - 1] : ZOOM_STEPS[0];\n  }\n}\n\nfunction resetZoom(): void {\n  zoom.value = 1;\n  void nextTick(measureFit);\n}\n\nconst zoomLabel = computed(() => `${Math.round(zoom.value * 100)}%`);\nconst canZoomIn = computed(() => zoom.value < ZOOM_STEPS[ZOOM_STEPS.length - 1] - 1e-6);\nconst canZoomOut = computed(() => zoom.value > ZOOM_STEPS[0] + 1e-6);\n\n/* --- Fullscreen ------------------------------------------------------ */\nconst isFullscreen = ref(false);\n\nfunction onFullscreenChange(): void {\n  isFullscreen.value = !!document.fullscreenElement;\n}\n\nfunction toggleFullscreen(): void {\n  try {\n    if (document.fullscreenElement) {\n      void document.exitFullscreen?.();\n    } else {\n      void viewerEl.value?.requestFullscreen?.();\n    }\n  } catch {\n    /* a browser that refuses fullscreen just leaves the overlay as it is */\n  }\n}\n\n/**\n * The overlay has no backdrop ring to click — the card IS the viewport — so\n * the ground around the content takes that job. `.self` is what keeps it\n * honest: it only fires when the click landed on the ground itself, never on\n * an editor, an iframe or the image.\n */\nfunction onGroundClick(): void {\n  if (!showChrome.value) return;\n  requestClose();\n}\n\nconst loading = ref(false);\nconst fetchError = ref<string | null>(null);\n/** An administrator's second line under `fetchError` (lib/errorWords). */\nconst fetchErrorDetail = ref<string | null>(null);\n\n/**\n * A failure, said (lib/errorWords): the sentence for everybody, the raw words\n * as a second line only for a caller who can administer the instance.\n *\n * ⚠⚠ This modal used to print what it caught: \"save failed: 500 {…}\",\n * \"404 Not Found\", \"Monaco mount fail: …\" — a status code, a JSON body and a\n * library's message, to whoever was editing (QA, 2026-09-21).\n */\nfunction said(err: unknown, fallbackKey: string) {\n  return sayFailure(err, t(fallbackKey), { callerAdmin: props.canConfigure === true });\n}\nfunction showFetchError(f: { text: string; detail?: string }): void {\n  fetchError.value = f.text;\n  fetchErrorDetail.value = f.detail ?? null;\n}\nconst rawText = ref<string>('');\nconst MAX_TEXT_BYTES = 1_000_000;\nconst tooLarge = ref(false);\n\n// Markdown split-edit state — drives the side-by-side textarea+preview\n// layout inside the `kind === 'markdown'` template when openMode='edit'.\nconst mdDirty = ref(false);\nconst mdSaving = ref(false);\nlet mdReRenderTimer: ReturnType<typeof setTimeout> | undefined;\nlet mdAutosaveTimer: ReturnType<typeof setTimeout> | undefined;\nfunction onMdInput() {\n  mdDirty.value = true;\n  draftTouched.value = true;\n  if (mdReRenderTimer) clearTimeout(mdReRenderTimer);\n  mdReRenderTimer = setTimeout(() => {\n    renderMarkdown(rawText.value);\n  }, 250);\n  // Autosave 1.5s after last keystroke — the manual Save button + Ctrl+S\n  // still work; saveMarkdown() guards against overlap.\n  if (mdAutosaveTimer) clearTimeout(mdAutosaveTimer);\n  mdAutosaveTimer = setTimeout(() => {\n    void saveMarkdown();\n  }, 1500);\n}\nasync function saveMarkdown() {\n  if (!props.saveTextEndpoint || !props.file || mdSaving.value) return;\n  mdSaving.value = true;\n  const sent = rawText.value;\n  fetchError.value = null;\n  fetchErrorDetail.value = null;\n  try {\n    const headers = {\n      'Content-Type': 'application/json',\n      ...(await (props.authHeaders ?? (() => ({})))()),\n    };\n    const res = await fetch(props.saveTextEndpoint, {\n      method: 'POST',\n      headers,\n      credentials: props.authCredentials || 'same-origin',\n      // ⚠ The adapter-qualified path. It was sent stripped since v0.1, and\n      // save-text then resolved the bare path against the FIRST storage — an\n      // edit to a file on any other storage was written to the first one\n      // (found with drafts, issue #71, which live on every storage).\n      body: JSON.stringify({ path: livePath.value, content: rawText.value }),\n    });\n    if (!res.ok) {\n      throw requestFailure(res.status, await res.text().catch(() => ''), props.locale);\n    }\n    noteSaved(livePath.value, utf8Size(sent));\n    if (sent === rawText.value) mdDirty.value = false;\n  } catch (err) {\n    showFetchError(said(err, 'err.save_failed'));\n  } finally {\n    mdSaving.value = false;\n  }\n}\n\nasync function fetchText(url: string): Promise<void> {\n  loading.value = true;\n  fetchError.value = null;\n  fetchErrorDetail.value = null;\n  rawText.value = '';\n  tooLarge.value = false;\n  try {\n    const headers: Record<string, string> = {};\n    if (props.authHeaders) Object.assign(headers, await props.authHeaders());\n    const res = await fetch(url, {\n      credentials: props.authCredentials || 'same-origin',\n      headers,\n    });\n    if (!res.ok) {\n      throw requestFailure(res.status, await res.text().catch(() => ''), props.locale);\n    }\n    const len = Number(res.headers.get('content-length') || '0');\n    if (len > MAX_TEXT_BYTES) {\n      tooLarge.value = true;\n      return;\n    }\n    const text = await res.text();\n    if (text.length > MAX_TEXT_BYTES) {\n      tooLarge.value = true;\n      rawText.value = text.slice(0, MAX_TEXT_BYTES);\n    } else {\n      rawText.value = text;\n    }\n  } catch (err) {\n    showFetchError(said(err, 'err.load_failed'));\n  } finally {\n    loading.value = false;\n  }\n}\n\n// --- Markdown rendering (lazy markdown-it) ---\n//\n// Beyond the base markdown render we walk the resulting DOM for two\n// enrichments:\n//   - ```mermaid``` fences → swap the `<pre>` for a rendered SVG via\n//     the `mermaid` peer (when installed).\n//   - ```math``` / `$$ … $$` blocks → render with `katex` (peer).\n// Both enrichments degrade gracefully when the peer isn't available\n// (the original `<pre>` stays in place).\n\nconst markdownHtml = ref<string>('');\nconst markdownEl = ref<HTMLDivElement | null>(null);\n/**\n * The renderer could not be loaded at all.\n *\n * ⚠ Tracked separately from \"nothing to render\". In view mode a missing\n * renderer falls through to the raw source, which is honest; in the split\n * editor the preview pane simply stayed BLANK — a white half-window with no\n * explanation, measured in the desktop app on 2026-08-10.\n */\nconst markdownUnavailable = ref(false);\n\nasync function renderMarkdown(text: string): Promise<void> {\n  try {\n    // Inline HTML renders (the GitHub / GitLab contract: operators expect\n    // `<img>`, tables, `<details>`, etc. to work), and the output goes through\n    // the one preview sanitizer before it reaches v-html: lib/markdownHtml.ts,\n    // the pipeline the update review's release notes use too.\n    const html = await markdownToSafeHtml(text);\n    if (html === null) {\n      markdownHtml.value = '';\n      markdownUnavailable.value = true;\n      return;\n    }\n    markdownUnavailable.value = false;\n    markdownHtml.value = html;\n    // Wait for Vue to flush the v-html into the DOM before walking it.\n    await new Promise<void>((r) => setTimeout(r, 0));\n    await enrichMarkdown();\n  } catch (err) {\n    markdownHtml.value = '';\n    showFetchError(said(err, 'err.load_failed'));\n  }\n}\n\nasync function enrichMarkdown(): Promise<void> {\n  if (!markdownEl.value) return;\n  const root = markdownEl.value;\n  const blocks = Array.from(root.querySelectorAll('pre > code')) as HTMLElement[];\n  if (blocks.length === 0) return;\n\n  let mermaid: any = undefined;\n  let katex: any = undefined;\n\n  for (const block of blocks) {\n    const cls = block.className || '';\n    const isMermaid =\n      /\\blanguage-mermaid\\b/.test(cls) || /\\blanguage-mmd\\b/.test(cls);\n    const isMath =\n      /\\blanguage-math\\b/.test(cls) ||\n      /\\blanguage-latex\\b/.test(cls) ||\n      /\\blanguage-tex\\b/.test(cls);\n\n    if (isMermaid) {\n      if (mermaid === undefined) {\n        try {\n          const m = await import(/* @vite-ignore */ 'mermaid');\n          mermaid = m.default ?? m;\n          mermaid.initialize?.({\n            startOnLoad: false,\n            securityLevel: 'strict',\n          });\n        } catch {\n          mermaid = null;\n        }\n      }\n      if (!mermaid) continue;\n      try {\n        const id = `filex-md-mermaid-${Math.random().toString(36).slice(2)}`;\n        const { svg } = await mermaid.render(id, block.textContent || '');\n        const wrap = document.createElement('div');\n        wrap.className = 'fe-preview__md-mermaid';\n        wrap.innerHTML = sanitizeHtml(svg, 'diagram');\n        block.parentElement?.replaceWith(wrap);\n      } catch {\n        /* leave fenced block */\n      }\n    } else if (isMath) {\n      if (katex === undefined) {\n        try {\n          const m = await import(/* @vite-ignore */ 'katex');\n          katex = m.default ?? m;\n        } catch {\n          katex = null;\n        }\n      }\n      if (!katex) continue;\n      try {\n        const html = katex.renderToString(block.textContent || '', {\n          displayMode: true,\n          throwOnError: false,\n        });\n        const wrap = document.createElement('div');\n        wrap.className = 'fe-preview__md-math';\n        wrap.innerHTML = sanitizeHtml(html, 'math');\n        block.parentElement?.replaceWith(wrap);\n      } catch {\n        /* leave fenced block */\n      }\n    }\n  }\n}\n\n// --- Code highlight (highlight.js fallback) ---\n//\n// Used as the placeholder render until Monaco resolves, AND as the\n// permanent renderer when Monaco isn't installed at all (peer missing).\n\nconst codeHtml = ref<string>('');\n\nasync function highlightCode(text: string, language: string): Promise<void> {\n  try {\n    const mod = (await ensureHighlight()) as any;\n    if (!mod) {\n      codeHtml.value = '';\n      return;\n    }\n    const hljs = mod.default ?? mod;\n    if (hljs.getLanguage(language)) {\n      const result = hljs.highlight(text, { language, ignoreIllegals: true });\n      codeHtml.value = sanitizeHtml(result.value, 'code');\n    } else {\n      const result = hljs.highlightAuto(text);\n      codeHtml.value = sanitizeHtml(result.value, 'code');\n    }\n  } catch (err) {\n    codeHtml.value = '';\n    showFetchError(said(err, 'err.load_failed'));\n  }\n}\n\n// --- Monaco editor (lazy) ---\n//\n// We attempt to instantiate Monaco when the modal opens for a code/text\n// file. If the module isn't loaded yet, the highlight.js placeholder\n// renders first, and the editor mounts in-place once Monaco resolves.\n// Save endpoint required for editing — read-only Monaco still loads if\n// the user just wants the IDE-grade syntax/colour view.\n\nconst monacoEl = ref<HTMLDivElement | null>(null);\nlet monacoEditor: any = null;\nlet codeAutosaveTimer: ReturnType<typeof setTimeout> | undefined;\nconst monacoReady = ref(false);\n/** Monaco resolved to nothing — the peer is not in this build at all. */\nconst monacoUnavailable = ref(false);\nconst saving = ref(false);\nconst saveOk = ref(false);\nconst saveError = ref<string | null>(null);\n/** Typed into the editor and not yet written (a draft's leave-page question). */\nconst codeDirty = ref(false);\n\nfunction disposeMonaco(): void {\n  if (monacoEditor) {\n    try {\n      monacoEditor.dispose();\n    } catch {\n      /* ignore */\n    }\n    monacoEditor = null;\n  }\n  monacoReady.value = false;\n  saveOk.value = false;\n  saveError.value = null;\n}\n\n/**\n * Map an extension to a Monaco language id. Anything not in the map\n * just becomes 'plaintext' — Monaco still gives line numbers + Ctrl+S.\n */\nfunction monacoLanguageFor(extension: string): string {\n  const map: Record<string, string> = {\n    js: 'javascript', mjs: 'javascript', cjs: 'javascript',\n    ts: 'typescript', tsx: 'typescript', jsx: 'javascript',\n    json: 'json', jsonc: 'json',\n    css: 'css', scss: 'scss', sass: 'scss', less: 'less',\n    html: 'html', htm: 'html', vue: 'html', svelte: 'html',\n    xml: 'xml', svg: 'xml',\n    md: 'markdown', markdown: 'markdown',\n    php: 'php', py: 'python',\n    yml: 'yaml', yaml: 'yaml',\n    go: 'go', rs: 'rust', sql: 'sql',\n    cpp: 'cpp', c: 'c', h: 'cpp', hpp: 'cpp',\n    sh: 'shell', bash: 'shell',\n    dockerfile: 'dockerfile',\n    toml: 'ini', ini: 'ini', conf: 'ini', cfg: 'ini',\n  };\n  return map[extension] ?? 'plaintext';\n}\n\nasync function tryMountMonaco(text: string, extension: string): Promise<boolean> {\n  const monaco = (await ensureMonaco()) as any;\n  // ⚠ \"Not installed\" is not \"still loading\". Monaco is an optional peer that\n  // most embeds do not ship, and the toolbar label was gated only on \"not ready\n  // yet\" — so a bundle without it showed \"Editor loading…\" forever, over a\n  // perfectly good read-only view. Measured in the desktop app once syntax\n  // highlighting started working and that label finally had something to sit on.\n  if (!monaco) monacoUnavailable.value = true;\n  if (!monaco || !monacoEl.value) return false;\n  try {\n    disposeMonaco();\n    const editable = !!props.saveTextEndpoint && props.openMode !== 'view';\n    // Honour the explicit theme prop when set; fall back to the OS\n    // preference otherwise. Without this the Monaco editor stays on\n    // vs-dark on OS-dark systems even when the host admin shell is\n    // light, producing a jarring light-card + dark-code combo inside\n    // the in-page preview modal.\n    const dark = props.theme === 'dark'\n      ? true\n      : props.theme === 'light'\n        ? false\n        : window.matchMedia?.('(prefers-color-scheme: dark)').matches;\n    monacoEditor = monaco.editor.create(monacoEl.value, {\n      value: text,\n      language: monacoLanguageFor(extension),\n      readOnly: !editable,\n      theme: dark ? 'vs-dark' : 'vs',\n      automaticLayout: true,\n      minimap: { enabled: false },\n      fontSize: 13,\n    });\n    if (editable) {\n      monacoEditor.addCommand(\n        monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS,\n        () => void saveCode(),\n      );\n      // Autosave: 1.5s after the last keystroke we POST the buffer.\n      // Ctrl+S still works for the impatient — saveCode() guards against\n      // overlap, so a manual save during the debounce window just wins\n      // and the queued autosave becomes a no-op.\n      monacoEditor.onDidChangeModelContent(() => {\n        codeDirty.value = true;\n        draftTouched.value = true;\n        if (codeAutosaveTimer) clearTimeout(codeAutosaveTimer);\n        codeAutosaveTimer = setTimeout(() => {\n          void saveCode();\n        }, 1500);\n      });\n    }\n    monacoReady.value = true;\n    return true;\n  } catch (err) {\n    showFetchError(said(err, 'err.viewer_failed'));\n    return false;\n  }\n}\n\nasync function saveCode(): Promise<void> {\n  if (!props.saveTextEndpoint || !props.file) return;\n  if (props.openMode === 'view') return;\n  if (saving.value) return;\n  saving.value = true;\n  saveOk.value = false;\n  saveError.value = null;\n  try {\n    const text = monacoEditor ? monacoEditor.getValue() : '';\n    const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n    if (props.authHeaders) Object.assign(headers, await props.authHeaders());\n    const res = await fetch(props.saveTextEndpoint, {\n      method: 'POST',\n      headers,\n      credentials: props.authCredentials || 'same-origin',\n      // ⚠ Adapter-qualified — see saveMarkdown.\n      body: JSON.stringify({\n        path: livePath.value,\n        content: text,\n      }),\n    });\n    if (!res.ok) {\n      throw requestFailure(res.status, await res.text().catch(() => ''), props.locale);\n    }\n    noteSaved(livePath.value, utf8Size(text));\n    if (!monacoEditor || monacoEditor.getValue() === text) codeDirty.value = false;\n    saveOk.value = true;\n    setTimeout(() => {\n      saveOk.value = false;\n    }, 2500);\n  } catch (err) {\n    const f = said(err, 'err.save_failed');\n    saveError.value = f.detail ? `${f.text}\\n${f.detail}` : f.text;\n  } finally {\n    saving.value = false;\n  }\n}\n\n// --- Orchestration: fetch + render when modal opens ---\n\nasync function runOrchestration(open: boolean, url: string, k: string): Promise<void> {\n  rawText.value = '';\n  markdownHtml.value = '';\n  codeHtml.value = '';\n  fetchError.value = null;\n  fetchErrorDetail.value = null;\n  officeError.value = null;\n  officeDiagnosis.value = null;\n  // A diagnosis still on its way belongs to the file that was open.\n  officeGen++;\n  viewerCmp.value = null;\n  viewerLoadError.value = null;\n  pdfFallbackToNative.value = false;\n  /* gorunum:v1-viewer — a new file starts at 100%. Carrying 400% over from\n   * the previous photo means the next one opens mid-crop with no hint why. */\n  zoom.value = 1;\n  fitWidth.value = 0;\n  disposeOnlyOfficeEditor();\n  disposeMonaco();\n  if (!open || !url) return;\n  if (k === 'viewer') {\n    await loadViewerFor(ext(props.file));\n    return;\n  }\n  if (k === 'markdown' || k === 'code' || k === 'text') {\n    await fetchText(url);\n    if (tooLarge.value) return;\n    if (k === 'markdown') {\n      await renderMarkdown(rawText.value);\n      return;\n    }\n    // For code/text — try Monaco first when the cached module is\n    // already in memory. If not, render the highlight.js placeholder\n    // immediately, then attempt to upgrade to Monaco when the import\n    // settles.\n    const lang = CODE_LANGS[ext(props.file)] || '';\n    const monacoCached = getMonaco();\n    if (monacoCached) {\n      await new Promise<void>((r) => setTimeout(r, 0));\n      const ok = await tryMountMonaco(rawText.value, ext(props.file));\n      if (!ok) await highlightCode(rawText.value, lang);\n    } else {\n      // Render highlight.js immediately for read-only colour. Then\n      // kick off the Monaco load and swap it in once ready.\n      if (k === 'code') await highlightCode(rawText.value, lang);\n      ensureMonaco().then(async (m) => {\n        // ⚠ Record the \"never coming\" case here too. This branch returns early\n        // without ever reaching tryMountMonaco, so a build with no Monaco left\n        // the toolbar saying \"Editor loading…\" indefinitely.\n        if (!m) { monacoUnavailable.value = true; return; }\n        if (!props.open) return;\n        // Wait one tick so the placeholder DOM exists before swapping.\n        await new Promise<void>((r) => setTimeout(r, 0));\n        await tryMountMonaco(rawText.value, ext(props.file));\n      });\n    }\n  } else if (k === 'office') {\n    await new Promise<void>((r) => setTimeout(r, 0));\n    await mountOnlyOfficeEditor();\n  }\n}\n\nwatch(\n  () => [props.open, src.value, kind.value, props.openMode] as const,\n  ([open, url, k]) => {\n    void runOrchestration(open, url, k);\n  },\n);\n\n// Hand-fire on mount so the standalone Editor.vue route (which mounts\n// us with `open` already true) actually runs the orchestration. The\n// watcher itself is non-immediate because `immediate: true` would fire\n// before the rest of <script setup> finishes, hitting the TDZ on\n// `officeEditor`/Monaco state below. Doing this in onMounted+nextTick\n// guarantees every `let`/`function` in the file has been hoisted.\nonMounted(() => {\n  document.addEventListener('fullscreenchange', onFullscreenChange);\n  void nextTick(() => {\n    if (!props.open) return;\n    void runOrchestration(props.open, src.value, kind.value);\n  });\n});\n\nconst codeLanguage = computed(() => CODE_LANGS[ext(props.file)] || 'plaintext');\n\n// --- OnlyOffice DocEditor (real, JWT-signed) ---\n\nconst officeEl = ref<HTMLDivElement | null>(null);\nconst officeError = ref<string | null>(null);\n/**\n * After \"Download failed\" (-4): which of its two failures it was, as filex saw\n * it - the document server downloaded the file and the browser could not load\n * the converted copy, it never asked, or filex refused it (lib/officeDiagnosis,\n * issue #80). Shown under the document server's own sentence.\n */\nconst officeDiagnosis = ref<string | null>(null);\n/** Bumped per opened file, so a late diagnosis never lands on the next one. */\nlet officeGen = 0;\nlet officeEditor: any = null;\n\n/** Ask filex what it saw of the document server's download of this file. */\nasync function diagnoseOfficeDownload(gen: number): Promise<void> {\n  const file = props.file;\n  const endpoint = officeDiagnoseEndpoint(props.onlyOfficeConfigEndpoint);\n  if (!file || !endpoint) return;\n  const headers: Record<string, string> = {};\n  try {\n    if (props.authHeaders) Object.assign(headers, await props.authHeaders());\n  } catch {\n    return;\n  }\n  const d = await fetchOfficeDiagnosis(endpoint, livePath.value || file.path, {\n    headers,\n    credentials: props.authCredentials || 'same-origin',\n  });\n  if (gen !== officeGen) return;\n  officeDiagnosis.value = officeDiagnosisText(d, t);\n}\n\n/** \"No document server here\", in the sentence this person can act on. */\nfunction officeUnconfigured(): string {\n  return t(props.canConfigure ? 'viewer.office_unconfigured_admin' : 'viewer.office_unconfigured');\n}\n\n/**\n * ⚠⚠ Every failure below becomes a SENTENCE, never the HTTP layer. This\n * function used to throw `Config fetch ${status}: ${body}` and put it on\n * screen, which is how a person clicking \"Open\" on a .docx read\n * `Config fetch 503: {\"error\":\"onlyoffice not configured\"}` (owner,\n * 2026-09-21: \"böyle hata vermek yerine … düzgün hata mesajı vermemiz\n * lazım\"). The status still reaches the console for whoever is debugging it.\n */\nasync function officeConfigError(res: Response): Promise<string> {\n  let body = '';\n  try {\n    body = (await res.text()).slice(0, 200);\n  } catch {\n    /* nothing to read */\n  }\n  console.warn('[filex] ONLYOFFICE config request failed', res.status, body);\n  if (res.status === 503 && /not configured/i.test(body)) return officeUnconfigured();\n  if (res.status === 403) return t('viewer.office_forbidden');\n  return t('viewer.office_failed');\n}\n\nasync function mountOnlyOfficeEditor(): Promise<void> {\n  officeError.value = null;\n  officeDiagnosis.value = null;\n  const gen = officeGen;\n  // A new editor has no edits of its own (#184).\n  setOfficeEdited(false);\n  officeKey = null;\n  officeToken = null;\n  if (!props.file || kind.value !== 'office') return;\n  /* ⚠ BOTH halves. The standalone /files/edit route always handed over the\n   * config ENDPOINT and left the base null when the capabilities probe said\n   * the service was off — so this check, reading the endpoint alone, let the\n   * request go out and put the server's 503 on screen. No base means no\n   * document server, whatever else is configured. */\n  if (!props.onlyOfficeConfigEndpoint || !props.onlyOfficeBase) {\n    officeError.value = officeUnconfigured();\n    return;\n  }\n  if (!officeEl.value) return;\n\n  try {\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n      // ⚠ The language on SCREEN (useFileApi rawRequest says why the\n      // browser's own is not it). The server chooses the editor's language\n      // with it, after the administrator's fixed one (backend\n      // onlyoffice/lang.go, GitHub Discussion #93): ONLYOFFICE was English\n      // whatever this screen spoke.\n      'Accept-Language': localeTag(resolveLocale(props.locale)),\n    };\n    if (props.authHeaders) Object.assign(headers, await props.authHeaders());\n    const res = await fetch(props.onlyOfficeConfigEndpoint, {\n      method: 'POST',\n      headers,\n      credentials: props.authCredentials || 'same-origin',\n      body: JSON.stringify({\n        // Send the FULL adapter-qualified path. The backend resolves\n        // `<adapter>://<rel>` against ListEnabledStorages; passing the\n        // bare relative path falls back to storages[0] which 404s for\n        // anything sitting on a non-primary storage (e.g. s3-test).\n        // ⚠ The LIVE path: after a draft's Save, or after an outside change\n        // the desktop app put on a new working copy (#184), the document is\n        // there and no longer where the viewer was opened.\n        path: livePath.value || props.file.path,\n        mode: props.openMode || 'edit',\n      }),\n    });\n    if (!res.ok) {\n      officeError.value = await officeConfigError(res);\n      return;\n    }\n    const { config, documentServerUrl, frame } = (await res.json()) as {\n      config: any;\n      documentServerUrl: string;\n      /** Task #92: the editor's frame on another origin, when the server\n       *  has one (FILEX_ONLYOFFICE_FRAME_ORIGIN, else FILEX_APP_UI_ORIGIN). */\n      frame?: string;\n    };\n\n    // Task #92: the server named a frame on another origin - api.js runs\n    // there, never in this page. Every host (the explorer, the editor tab,\n    // the desktop's document windows, the embeds) takes this one path.\n    if (frame) {\n      if (gen === officeGen) mountOfficeFrame(frame, config, gen);\n      return;\n    }\n    warnEditorInPage();\n\n    await loadOnlyOfficeScript(documentServerUrl);\n    // Another opening started while this one waited (an outside change came\n    // in twice): the newer one mounts, not this.\n    if (gen !== officeGen) return;\n    disposeOnlyOfficeEditor();\n\n    const mountId = OFFICE_MOUNT_ID;\n    officeEl.value.id = mountId;\n    // ⚠ After a reload in place (#184) the element this component rendered\n    // is no longer in the page: api.js replaced it with its frame, and\n    // destroyEditor() put a placeholder of its own there, with the same id.\n    // That placeholder is where the next editor goes, and its parent is the\n    // host the dead-editor cleanup looks in.\n    officeHostEl = (document.getElementById(mountId) ?? officeEl.value).parentElement;\n    officeKey = typeof config?.document?.key === 'string' ? config.document.key : null;\n    officeToken = typeof config?.token === 'string' ? config.token : null;\n\n    config.events = {\n      onError: (err: any) => onOfficeEvent('onError', err, gen),\n      onWarning: (err: any) => onOfficeEvent('onWarning', err, gen),\n      // Drafts: the document server keeps the edits until the session ends\n      // and then saves them into the draft itself; this only tells the page\n      // there ARE edits (the leave-page question).\n      //\n      // #184: the same event says this editor holds an edit, for the\n      // outside-change rule. ⚠ Sticky: `data: false` means the edits reached\n      // the DOCUMENT SERVER, not the file (lib/outsideChange outsideAction).\n      onDocumentStateChange: (ev: any) => onOfficeEdited(!!ev?.data, gen),\n    };\n\n    const W = window as any;\n    if (!W.DocsAPI || !W.DocsAPI.DocEditor) {\n      throw new Error('DocsAPI not available after script load');\n    }\n    officeEditor = new W.DocsAPI.DocEditor(mountId, config);\n    // #184: from here on a change to the document outside this editor is\n    // heard (the server's realtime feed; the desktop app's own working\n    // copies excepted - it watches the person's file itself).\n    docWatch.watch(props.open && props.api?.wsTicket ? livePath.value : null);\n  } catch (err) {\n    /* The document server's script did not load, or did not define its API:\n       the server is configured but not answering. The detail is for the\n       console, the sentence for the person. */\n    console.warn('[filex] ONLYOFFICE did not start', err);\n    officeError.value = t(props.canConfigure ? 'viewer.office_unreachable_admin' : 'viewer.office_unreachable');\n  }\n}\n\n/* ⚠⚠ The screen is never split. A trouble the editor cannot go on from\n   (lib/officeDiagnosis officeEventEndsTheEditor) closes the editor BEFORE the\n   fallback is drawn: api.js put its iframe where the mount was, so the\n   fallback replacing the mount left the dead editor, its own \"Download\n   failed\" dialog and all, standing beside it (measured against ONLYOFFICE\n   Docs 9.4 in the 0.50 final run). Anything else is the document server's to\n   show, in its own closable dialog, over an editor that goes on - no\n   fallback. The same for an editor in its own frame (task #92), whose events\n   arrive over the frame's port. */\nfunction onOfficeEvent(channel: OfficeEventChannel, err: any, gen: number): void {\n  if (!officeEventEndsTheEditor(channel)) {\n    console.info('[filex] ONLYOFFICE warning', officeErrorCode(err), formatOnlyOfficeError(err));\n    return;\n  }\n  closeDeadOfficeEditor();\n  officeError.value = formatOnlyOfficeError(err);\n  // \"Download failed\" is two failures in one sentence; filex knows which\n  // (issue #80). The code, not the localised description, says it is that one.\n  if (officeErrorCode(err) === OFFICE_DOWNLOAD_ERROR) void diagnoseOfficeDownload(gen);\n}\n\n/** ONLYOFFICE's onDocumentStateChange, in the page or from the frame. */\nfunction onOfficeEdited(dirty: boolean, gen: number): void {\n  if (!dirty || gen !== officeGen) return;\n  draftTouched.value = true;\n  setOfficeEdited(true);\n}\n\n/* === Task #92: the editor in a frame of its own ===========================\n *\n * The server named a page on another origin (the document server's own,\n * FILEX_ONLYOFFICE_FRAME_ORIGIN, or the interface origin); the\n * frame goes INSIDE the mount (api.js, which used to replace the mount, now\n * runs in the frame), and the config goes to it as the server signed it\n * (lib/officeFrame has the protocol and its checks). Everything else is the\n * same as in the page: the events say \"edited\" and \"the editor cannot go on\",\n * a reload (#184) is this frame taken away and a new one on a new config,\n * and saving is the document server's, server to server.\n */\nlet officeFrameEl: HTMLIFrameElement | null = null;\nlet officeFrameLink: OfficeFrameLink | null = null;\n\nfunction mountOfficeFrame(address: string, config: unknown, gen: number): void {\n  const origin = frameOriginOf(address);\n  const host = officeEl.value;\n  if (!origin || !host) {\n    console.warn('[filex] ONLYOFFICE frame address is not an http(s) address', address);\n    officeError.value = t(props.canConfigure ? 'viewer.office_unreachable_admin' : 'viewer.office_unreachable');\n    return;\n  }\n  disposeOnlyOfficeEditor();\n  const key = (config as { document?: { key?: unknown } } | null)?.document?.key;\n  officeKey = typeof key === 'string' ? key : null;\n  const token = (config as { token?: unknown } | null)?.token;\n  officeToken = typeof token === 'string' ? token : null;\n  const session = newFrameSession();\n  const el = buildOfficeFrame(address, session, props.file?.basename || 'ONLYOFFICE');\n  const link = linkOfficeFrame({\n    frame: () => el,\n    origin,\n    session,\n    config,\n    onEvent: (e) => onFrameEvent(e, gen, el),\n    onSilent: () => {\n      if (gen !== officeGen || officeFrameEl !== el) return;\n      // The page on the interface origin never answered: that host does not\n      // reach this filex (DNS, the proxy, TLS), or it served something else.\n      console.warn('[filex] the ONLYOFFICE frame did not answer', origin);\n      closeDeadOfficeEditor();\n      officeError.value = props.canConfigure\n        ? t('viewer.office_frame_unreachable_admin', { origin, env: frameSetting(address) })\n        : t('viewer.office_unreachable');\n    },\n  });\n  el.addEventListener('load', () => link.frameLoaded());\n  officeFrameEl = el;\n  officeFrameLink = link;\n  host.appendChild(el);\n  // #184: from here on a change to the document outside this editor is heard.\n  docWatch.watch(props.open && props.api?.wsTicket ? livePath.value : null);\n}\n\nfunction onFrameEvent(e: OfficeFrameEvent, gen: number, el: HTMLIFrameElement): void {\n  if (gen !== officeGen || officeFrameEl !== el) return;\n  switch (e.type) {\n    case 'started':\n    case 'ready':\n      // For a person measuring it (and an end-to-end test): how far it got.\n      el.dataset.state = e.type;\n      return;\n    case 'state':\n      onOfficeEdited(e.dirty, gen);\n      return;\n    case 'error':\n      // ONLYOFFICE's own event shape, so the one function reads both.\n      onOfficeEvent(\n        e.channel,\n        { data: { errorCode: e.code ?? undefined, errorDescription: e.description || undefined } },\n        gen,\n      );\n      return;\n    case 'failed':\n      // api.js did not load in the frame, or did not define its API: the\n      // document server is configured but not answering.\n      console.warn('[filex] ONLYOFFICE did not start in its frame', e.reason);\n      closeDeadOfficeEditor();\n      officeError.value = t(props.canConfigure ? 'viewer.office_unreachable_admin' : 'viewer.office_unreachable');\n      return;\n  }\n}\n\nfunction disposeOnlyOfficeEditor(): void {\n  try {\n    officeEditor?.destroyEditor?.();\n  } catch {\n    /* ignore */\n  }\n  officeEditor = null;\n  officeFrameLink?.close();\n  officeFrameLink = null;\n  officeFrameEl?.remove();\n  officeFrameEl = null;\n}\n\n/** Where api.js is told to put its editor (it REPLACES this element). */\nconst OFFICE_MOUNT_ID = 'fe-onlyoffice-mount';\n/** The element the editor's frame went into (the mount's parent). */\nlet officeHostEl: HTMLElement | null = null;\n\n/**\n * Close an editor the document server has given up on, and take away what it\n * leaves: destroyEditor() swaps the iframe for a fresh placeholder of its\n * own, which is not the element this component renders and would stand\n * beside the fallback.\n */\nfunction closeDeadOfficeEditor(): void {\n  disposeOnlyOfficeEditor();\n  const left = typeof document === 'undefined' ? null : document.getElementById(OFFICE_MOUNT_ID);\n  if (left && left !== officeEl.value) left.remove();\n  // A destroyEditor that threw leaves the frame itself: it goes too, from\n  // where this editor was put and nowhere else.\n  for (const frame of Array.from(officeHostEl?.querySelectorAll('iframe[name^=\"frameEditor\"]') ?? [])) frame.remove();\n  officeHostEl = null;\n}\n\n/* === #184: the document changed OUTSIDE this editor =========================\n *\n * The host says so (`outsideChange`); this decides, on every surface alike\n * (lib/outsideChange): nothing of this editor's unsaved, the new version is\n * loaded in place and a note says so; otherwise the person is asked which\n * version stays (OutsideChangeModal). The answer goes back to the host\n * (`outside-resolved`), which writes nothing over anything until it has one.\n *\n * ⚠ The reload is destroyEditor() and a new editor on a fresh config, not\n * ONLYOFFICE's refreshFile(): that method is for the document server's own\n * onRequestRefreshFile (Docs 8.3+, a key already saved, or a reconnect) and\n * only with no unsaved changes - it is not an integrator's \"reload now\". A\n * fresh config carries a new key, because the file it names has changed (the\n * server's key covers its mtime and size; the desktop's new working copy is a\n * new file altogether).\n */\n\n/** This editor holds an edit of its session's (sticky, see outsideAction). */\nconst officeEdited = ref(false);\n/** The ONLYOFFICE `document.key` the editor on screen was opened with. */\nlet officeKey: string | null = null;\n/** That editor configuration's signed `token`: sent with an answer, it shows\n *  the server this person was handed the editing session (0.54). */\nlet officeToken: string | null = null;\n/** The change waiting for an answer, and whether its question is on screen\n *  (Escape puts it away; the line under the bar brings it back). */\nconst outsideAsk = ref<OutsideChange | null>(null);\nconst outsideAskOpen = ref(false);\n/** What the last change came to, said for a moment under the bar. */\nconst outsideNote = ref<OutsideChoice | null>(null);\nlet outsideNoteTimer: ReturnType<typeof setTimeout> | undefined;\n/** The highest change already handled: one change is handled once. */\nlet outsideSeen = 0;\n/** Who noticed the change waiting for an answer (OutsideAnswer.origin). */\nlet outsideOrigin: 'host' | 'server' = 'host';\n/** The viewer's own count of the changes it heard from the server. */\nlet serverSeq = 0;\n\n/** POST /api/files/onlyoffice/session, next to the config endpoint. */\nconst sessionEndpoint = computed(() =>\n  officeSessionEndpoint(officeDiagnoseEndpoint(props.onlyOfficeConfigEndpoint)),\n);\n\n/**\n * The document's folder on the realtime feed (composables/useDocumentWatch).\n * A frame naming the document is only \"something happened to it\": the\n * server says whether this editor's session is still on the current version,\n * because the editor's own save announces itself the same way.\n */\nconst docWatch = useDocumentWatch({\n  ticket: async () => (props.api?.wsTicket ? props.api.wsTicket() : null),\n  onMaybeChanged: () => void checkOutsideOnServer(),\n});\n\nasync function checkOutsideOnServer(): Promise<void> {\n  const key = officeKey;\n  const path = livePath.value;\n  const endpoint = sessionEndpoint.value;\n  if (!key || !path || !endpoint || !props.open || kind.value !== 'office') return;\n  const state = await officeSession(authedFetch, endpoint, { path, key, action: 'state' });\n  // Another editor on screen by now (a reload, another file): not its news.\n  if (!state?.stale || key !== officeKey) return;\n  // The same version heard twice is one question.\n  if (outsideAsk.value && outsideOrigin === 'server') return;\n  takeChange({ seq: ++serverSeq }, 'server');\n}\n\n/** The person's answer to a change the viewer heard itself: the server keeps\n *  or drops the session's save accordingly ('both' is its default). */\nfunction tellServer(choice: OutsideChoice, key: string | null, path: string): void {\n  const endpoint = sessionEndpoint.value;\n  if (!endpoint || !key || (choice !== 'mine' && choice !== 'theirs')) return;\n  const token = key === officeKey && officeToken ? officeToken : undefined;\n  void officeSession(authedFetch, endpoint, { path, key, action: choice, token });\n}\n\nfunction setOfficeEdited(v: boolean): void {\n  if (officeEdited.value === v) return;\n  officeEdited.value = v;\n  emit('office-edited', v);\n}\n\nconst outsideName = computed(() =>\n  props.file ? outsideDocumentName(livePath.value || props.file.path, props.file.basename) : '',\n);\n\nconst outsideNoteText = computed(() => {\n  switch (outsideNote.value) {\n    case 'reloaded':\n      return t('outside.note.reloaded');\n    case 'theirs':\n      return t('outside.note.theirs');\n    case 'mine':\n      return t('outside.note.mine');\n    case 'both':\n      return t('outside.note.both');\n    default:\n      return '';\n  }\n});\n\nfunction sayOutside(choice: OutsideChoice): void {\n  outsideNote.value = choice;\n  if (outsideNoteTimer) clearTimeout(outsideNoteTimer);\n  outsideNoteTimer = setTimeout(() => {\n    outsideNote.value = null;\n  }, 8000);\n}\n\n/** The new version, in place: the editor on screen goes (its session's edits\n *  with it - the host keeps or drops those as the answer says) and a new one\n *  opens on the version the change names. */\nasync function takeOutside(c: OutsideChange, choice: 'reloaded' | 'theirs', origin: 'host' | 'server'): Promise<void> {\n  const key = officeKey;\n  const before = livePath.value;\n  outsideAsk.value = null;\n  outsideAskOpen.value = false;\n  if (origin === 'server') tellServer(choice, key, before);\n  if (c.path) outsidePath.value = c.path;\n  officeGen++;\n  // ⚠ disposeOnlyOfficeEditor, not closeDeadOfficeEditor: destroyEditor()\n  // leaves api.js's own placeholder where the frame was, and that is where\n  // the next editor goes. Taking it away would leave the new editor nowhere\n  // to mount.\n  disposeOnlyOfficeEditor();\n  officeError.value = null;\n  officeDiagnosis.value = null;\n  emit('outside-resolved', { seq: c.seq, choice, path: livePath.value, key, origin });\n  sayOutside(choice);\n  await nextTick();\n  if (!props.open || kind.value !== 'office') return;\n  await mountOnlyOfficeEditor();\n}\n\nfunction onOutsideChoose(choice: Exclude<OutsideChoice, 'reloaded'>): void {\n  const c = outsideAsk.value;\n  if (!c) return;\n  const origin = outsideOrigin;\n  if (choice === 'theirs') {\n    void takeOutside(c, 'theirs', origin);\n    return;\n  }\n  outsideAsk.value = null;\n  outsideAskOpen.value = false;\n  if (origin === 'server') tellServer(choice, officeKey, livePath.value);\n  sayOutside(choice);\n  emit('outside-resolved', { seq: c.seq, choice, path: livePath.value, key: officeKey, origin });\n}\n\n/** One change, from either side: reloaded without a question when nothing of\n *  this editor's would be lost, else asked. */\nfunction takeChange(c: OutsideChange, origin: 'host' | 'server'): void {\n  // Only the office editor follows a change (the case #184 is about: the\n  // text editors save on every pause, and an app's interface owns its\n  // document). Anything else keeps what it shows.\n  if (kind.value !== 'office') return;\n  // A question still open is not answered by the next change: it is asked\n  // again, about the newest version.\n  if (!outsideAsk.value && outsideAction(officeEdited.value, c) === 'reload') {\n    void takeOutside(c, 'reloaded', origin);\n    return;\n  }\n  outsideAsk.value = c;\n  outsideOrigin = origin;\n  outsideAskOpen.value = true;\n}\n\nwatch(\n  () => props.outsideChange,\n  (c) => {\n    if (!c || !props.open || !props.file) return;\n    if (!(c.seq > outsideSeen)) return;\n    outsideSeen = c.seq;\n    takeChange(c, 'host');\n  },\n);\n\nwatch(\n  () => props.open,\n  (open) => {\n    if (!open) docWatch.stop();\n  },\n);\n\n// Another file in view: what was asked about the last one is not about it.\nwatch(\n  () => props.file?.path,\n  () => {\n    docWatch.stop();\n    outsidePath.value = null;\n    outsideAsk.value = null;\n    outsideAskOpen.value = false;\n    outsideNote.value = null;\n  },\n);\n\nonBeforeUnmount(() => {\n  document.removeEventListener('fullscreenchange', onFullscreenChange);\n  disposeOnlyOfficeEditor();\n  disposeMonaco();\n  archivePreviewCache.clear();\n});\n\n/**\n * OnlyOffice fires onError with an event-like object:\n *   { type:'error', data:{ errorCode, errorDescription, ... } }\n * The legacy stringification produced \"[object Object]\" for objects\n * whose `data` was itself an object. Walk one level deeper so the\n * user sees the actual error description instead of a useless cast.\n */\nfunction formatOnlyOfficeError(err: unknown): string {\n  if (typeof err === 'string') return err;\n  const e = err as { data?: unknown; message?: unknown; errorDescription?: unknown };\n  if (e?.data && typeof e.data === 'object') {\n    const d = e.data as { errorDescription?: unknown; errorCode?: unknown; message?: unknown };\n    if (typeof d.errorDescription === 'string') return officeErrorText(d.errorDescription);\n    if (typeof d.message === 'string') return d.message;\n    if (d.errorCode !== undefined) return `OnlyOffice error ${d.errorCode}`;\n  }\n  if (typeof e?.data === 'string') return e.data;\n  if (typeof e?.errorDescription === 'string') return officeErrorText(e.errorDescription);\n  if (typeof e?.message === 'string') return e.message;\n  try {\n    return JSON.stringify(err);\n  } catch {\n    return 'OnlyOffice error';\n  }\n}\n\nconst ONLYOFFICE_SCRIPT_ID = 'fe-onlyoffice-api-js';\nfunction loadOnlyOfficeScript(base: string): Promise<void> {\n  return new Promise((resolve, reject) => {\n    if ((window as any).DocsAPI?.DocEditor) {\n      resolve();\n      return;\n    }\n    const existing = document.getElementById(ONLYOFFICE_SCRIPT_ID) as HTMLScriptElement | null;\n    if (existing) {\n      existing.addEventListener('load', () => resolve());\n      existing.addEventListener('error', () => reject(new Error('OnlyOffice api.js load failed')));\n      return;\n    }\n    const script = document.createElement('script');\n    script.id = ONLYOFFICE_SCRIPT_ID;\n    // Same URL the admin page's browser probe attempts, from the same\n    // helper — a probe that tested a different address than the editor loads\n    // would be the old lie wearing a new badge.\n    script.src = browserProbeURL('onlyoffice', base);\n    script.async = true;\n    script.onload = () => resolve();\n    script.onerror = () => reject(new Error('OnlyOffice api.js load failed'));\n    document.head.appendChild(script);\n  });\n}\n\n/* === Drafts (issue #71) ===================================================\n *\n * A new document is a DRAFT until its first save: a real file in the\n * person's own drafts area, which this viewer opens and saves like any other\n * file (the text editor, draw.io, ONLYOFFICE). What a draft adds is here, and\n * nowhere in the editors themselves:\n *\n *   · the bar across the top — where it will be saved, and the Save that\n *     puts it there (the \"name (2).ext?\" question when that name is taken);\n *   · closing asks what should become of it — Save to disk, Keep in Drafts\n *     (the default), Discard (to the trash);\n *   · leaving the PAGE with edits in it asks the browser's own question, and\n *     whatever the text editors still hold is sent on the way out.\n *\n * ⚠ The draft is found by its PATH (`draftKeyOf`), not handed over by the\n * host: the explorer, the standalone editor tab and the desktop's document\n * windows all open a viewer on a path and nothing else, so the path is the\n * one thing they agree on.\n */\n\n/** The request every draft call goes out on: this viewer's credentials. */\nasync function authedFetch(url: string, init: RequestInit = {}): Promise<Response> {\n  const headers: Record<string, string> = { ...((init.headers as Record<string, string>) ?? {}) };\n  if (props.authHeaders) Object.assign(headers, await props.authHeaders());\n  return fetch(url, { ...init, headers, credentials: props.authCredentials || 'same-origin' });\n}\n\nconst draftsApi = computed(() =>\n  props.draftsEndpoint\n    ? draftsClient(props.draftsEndpoint, { request: authedFetch, locale: props.locale })\n    : null,\n);\nconst draftKey = computed(() => (props.draftsEndpoint && props.file ? draftKeyOf(props.file.path) : ''));\nconst draft = ref<DraftDto | null>(null);\n/** Where the draft went when it was saved — it is a file there now. */\nconst draftSaved = ref<SavedDraft | null>(null);\n/** Edits were made to the draft in this editor (the leave-page question). */\nconst draftTouched = ref(false);\nconst draftActive = computed(() => !!draft.value && !draftSaved.value);\nconst draftFolder = computed(() => (draft.value ? draftFolderLabel(draft.value.target_dir) : ''));\nconst savedFolder = computed(() => (draftSaved.value ? draftFolderLabel(draftSaved.value.targetDir) : ''));\n/** \"Saved to …\" stays on the bar for a moment after the Save. */\nconst draftSavedNote = ref(false);\nlet draftNoteTimer: ReturnType<typeof setTimeout> | undefined;\nconst draftBusy = ref(false);\nconst draftError = ref<string | null>(null);\nconst showDraftClose = ref(false);\n\n/**\n * #184: where the desktop app put the version of the document the office\n * editor now shows, after an outside change it took in (a new working copy\n * each time). null: where it was opened.\n */\nconst outsidePath = ref<string | null>(null);\n/** The path the file is at NOW: the draft's, where its Save put it, or the\n *  working copy an outside change moved the editor to (#184). */\nconst livePath = computed(() => draftSaved.value?.path ?? outsidePath.value ?? props.file?.path ?? '');\n/** Still a draft: opened on a draft's path and not saved yet. Share and the\n *  star are a file's, not a draft's - and after the Save it IS a file, at\n *  `livePath`, the same row (the Save moves it), so they come back (#85).\n *  ⚠ Not `draftKey`, which stays the opening path's answer after the Save. */\nconst onDraft = computed(() => !!draftKey.value && !draftSaved.value);\n/** The file in view as a row: the host's, moved to where a draft's Save put it. */\nconst liveFile = computed<FileNode | null>(() => {\n  const f = props.file;\n  const saved = draftSaved.value;\n  if (!f || !saved) return f;\n  return { ...f, path: saved.path, basename: saved.name || f.basename };\n});\n\nfunction sayDraft(err: unknown): string {\n  return said(err, 'err.save_failed').text;\n}\nconst draftSave = useDraftSave(() => draftsApi.value, sayDraft);\n\nwatch(\n  () => [props.open, draftKey.value] as const,\n  async ([open, key]) => {\n    draft.value = null;\n    draftSaved.value = null;\n    draftTouched.value = false;\n    draftSavedNote.value = false;\n    draftError.value = null;\n    showDraftClose.value = false;\n    if (!open || !key || !draftsApi.value) return;\n    try {\n      const d = await draftsApi.value.get(key);\n      // Still the same draft on screen when the answer came back.\n      if (draftKey.value === key && props.open) draft.value = d;\n    } catch {\n      // Not a draft of this person's (or a server without drafts): the file\n      // is edited as the file it is, which is all anybody else could do.\n      draft.value = null;\n    }\n  },\n  { immediate: true },\n);\n\n/**\n * Write whatever the built-in editors still hold into the draft, and wait for\n * a save already on its way — before the draft is saved elsewhere or its tab\n * goes away. (ONLYOFFICE saves on its own once its session ends; draw.io\n * saves on every change.)\n */\nasync function flushEditors(): Promise<void> {\n  if (mdAutosaveTimer) {\n    clearTimeout(mdAutosaveTimer);\n    mdAutosaveTimer = undefined;\n  }\n  if (codeAutosaveTimer) {\n    clearTimeout(codeAutosaveTimer);\n    codeAutosaveTimer = undefined;\n  }\n  for (let i = 0; i < 100 && (saving.value || mdSaving.value); i++) {\n    await new Promise<void>((r) => setTimeout(r, 50));\n  }\n  if (mdDirty.value && kind.value === 'markdown') await saveMarkdown();\n  if (codeDirty.value && monacoEditor) await saveCode();\n  // An app's interface keeps its document to itself until it saves: ask it\n  // to save into the draft (it does not know it is one) before the draft is\n  // saved where it belongs or kept.\n  if (appDirty.value && appFrameRef.value) await appFrameRef.value.requestSave();\n}\n\n/** Every close goes through here: a draft asks first (DraftCloseModal); an\n *  app's interface with unsaved changes asks its own question (AppFrame). */\nasync function requestClose(): Promise<void> {\n  if (draftActive.value) {\n    draftError.value = null;\n    showDraftClose.value = true;\n    return;\n  }\n  if (kind.value === 'app' && appFrameRef.value && !(await appFrameRef.value.confirmClose())) return;\n  emit('close');\n}\n\nfunction afterSave(saved: SavedDraft): void {\n  draftSaved.value = saved;\n  draftSavedNote.value = true;\n  if (draftNoteTimer) clearTimeout(draftNoteTimer);\n  draftNoteTimer = setTimeout(() => {\n    draftSavedNote.value = false;\n  }, 5000);\n  emit('draft-saved', saved);\n}\n\n/** The bar's Save (and the close question's \"Save to disk\"). */\nasync function saveDraftToDisk(): Promise<boolean> {\n  const d = draft.value;\n  if (!d || draftBusy.value) return false;\n  draftBusy.value = true;\n  draftError.value = null;\n  try {\n    await flushEditors();\n    const saved = await draftSave.save(d);\n    if (!saved) return false;\n    afterSave(saved);\n    return true;\n  } catch (err) {\n    draftError.value = sayDraft(err);\n    return false;\n  } finally {\n    draftBusy.value = false;\n  }\n}\n\nasync function onCloseSave(): Promise<void> {\n  if (await saveDraftToDisk()) {\n    showDraftClose.value = false;\n    emit('close');\n  }\n}\n\nasync function onCloseKeep(): Promise<void> {\n  draftBusy.value = true;\n  try {\n    await flushEditors();\n  } finally {\n    draftBusy.value = false;\n  }\n  showDraftClose.value = false;\n  emit('close');\n}\n\nasync function onCloseDiscard(): Promise<void> {\n  const d = draft.value;\n  const api = draftsApi.value;\n  if (!d || !api || draftBusy.value) return;\n  draftBusy.value = true;\n  draftError.value = null;\n  // Nothing more goes into a draft that is on its way to the trash.\n  if (mdAutosaveTimer) clearTimeout(mdAutosaveTimer);\n  if (codeAutosaveTimer) clearTimeout(codeAutosaveTimer);\n  try {\n    await api.discard(d.key);\n    showDraftClose.value = false;\n    draft.value = null;\n    emit('draft-discarded');\n    emit('close');\n  } catch (err) {\n    draftError.value = sayDraft(err);\n  } finally {\n    draftBusy.value = false;\n  }\n}\n\n/**\n * The browser's own \"leave this page?\" — while a draft has edits in it that\n * were not saved where it belongs. (Its content is kept either way: the text\n * editors send what they hold on the way out, below, and the document server\n * saves its session when it ends.)\n */\nfunction onBeforeUnload(e: BeforeUnloadEvent): void {\n  if (!props.open) return;\n  // An app's interface with unsaved changes asks too, draft or not: its\n  // document is nowhere but in the frame.\n  if (appDirty.value && kind.value === 'app') {\n    e.preventDefault();\n    e.returnValue = '';\n    return;\n  }\n  if (!draftActive.value) return;\n  const edited = draftTouched.value || mdDirty.value || codeDirty.value || saving.value || mdSaving.value || appDirty.value;\n  if (!edited) return;\n  e.preventDefault();\n  // Chrome and Edge still want the legacy field set to show the question.\n  e.returnValue = '';\n}\n\n/** On the way out: what the text editors hold, sent with `keepalive` so the\n *  request outlives the page. */\nfunction onPageHide(): void {\n  if (!props.open || !props.saveTextEndpoint || !props.file) return;\n  let content: string | null = null;\n  if (codeDirty.value && monacoEditor) content = monacoEditor.getValue();\n  else if (mdDirty.value && kind.value === 'markdown') content = rawText.value;\n  if (content === null) return;\n  const endpoint = props.saveTextEndpoint;\n  const body = JSON.stringify({ path: livePath.value, content });\n  const send = (h: Record<string, string>) => {\n    try {\n      void fetch(endpoint, {\n        method: 'POST',\n        keepalive: true,\n        credentials: props.authCredentials || 'same-origin',\n        headers: { 'Content-Type': 'application/json', ...h },\n        body,\n      });\n    } catch {\n      /* the page is going away; nothing is left to tell */\n    }\n  };\n  // Awaited like every other call of it (a function token resolves\n  // asynchronously); the send still happens in the microtask right after this\n  // handler, while the page is still here to send it.\n  void (async () => send(props.authHeaders ? await props.authHeaders() : {}))();\n}\n\nonMounted(() => {\n  window.addEventListener('beforeunload', onBeforeUnload);\n  window.addEventListener('pagehide', onPageHide);\n});\nonBeforeUnmount(() => {\n  window.removeEventListener('beforeunload', onBeforeUnload);\n  window.removeEventListener('pagehide', onPageHide);\n  if (draftNoteTimer) clearTimeout(draftNoteTimer);\n  if (outsideNoteTimer) clearTimeout(outsideNoteTimer);\n  docWatch.stop();\n});\n\n</script>\n\n<template>\n  <Modal\n    :open=\"open\"\n    size=\"xl\"\n    :title=\"file?.basename || ''\"\n    :chromeless=\"chromeless\"\n    :fullbleed=\"!chromeless\"\n    :theme=\"theme\"\n    @close=\"requestClose\"\n  >\n    <!-- === gorunum:v1-viewer ===\n         A full-bleed overlay, not a card: one bar across the top, a chevron on\n         each screen edge, a floating zoom pill at the bottom. `chromeless`\n         renders the viewer BARE (no bar, no chevrons, no pill) because the\n         standalone /files/edit route's container is the browser tab itself. -->\n    <div ref=\"viewerEl\" class=\"fe-viewer\" :class=\"{ 'fe-viewer--bare': chromeless }\">\n      <header v-if=\"showChrome && file\" class=\"fe-viewer__bar\">\n        <div class=\"fe-viewer__ident\">\n          <span class=\"fe-viewer__tile\" aria-hidden=\"true\" v-html=\"tileHtml\"></span>\n          <span class=\"fe-viewer__idcol\">\n            <span class=\"fe-viewer__name\" :title=\"file.path\">{{ displayName }}</span>\n            <span v-if=\"metaLine\" class=\"fe-viewer__meta\">{{ metaLine }}</span>\n          </span>\n        </div>\n\n        <div class=\"fe-viewer__acts\">\n          <a\n            :href=\"download\"\n            class=\"fe-viewer__act\"\n            :title=\"t('viewer.download')\"\n            :aria-label=\"t('viewer.download')\"\n          ><span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('download')\"></span></a>\n          <button\n            v-if=\"shareEnabled && !onDraft\"\n            type=\"button\"\n            class=\"fe-viewer__act\"\n            :title=\"t('viewer.share')\"\n            :aria-label=\"t('viewer.share')\"\n            data-testid=\"viewer-share\"\n            @click=\"liveFile && emit('share', liveFile)\"\n          ><span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('access')\"></span></button>\n          <!-- The listing's StarButton, not a copy of it: same component, same\n               lib/star.ts request, same optimistic rollback. -->\n          <StarButton\n            v-if=\"starNodeId !== null && !onDraft\"\n            class=\"fe-viewer__act fe-viewer__act--star\"\n            :starred=\"file.starred === true\"\n            :node-id=\"starNodeId\"\n            :api-base=\"apiBase\"\n            :auth-headers=\"authHeaders\"\n            :auth-credentials=\"authCredentials\"\n            :locale=\"locale\"\n            compact\n            @change=\"(v: boolean) => emit('starred', v)\"\n          />\n          <button\n            v-if=\"openMode === 'view' && canEditKind && newTabEnabled !== false /* wiring:e2 */ && (!editNeeds || canConfigure)\"\n            type=\"button\"\n            class=\"fe-viewer__act\"\n            :disabled=\"!!editNeeds\"\n            :title=\"editTitle\"\n            :aria-label=\"editTitle\"\n            @click=\"openEditInNewTab\"\n          ><span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('rename')\"></span></button>\n          <button\n            v-if=\"newTabEnabled !== false /* wiring:e2 */\"\n            type=\"button\"\n            class=\"fe-viewer__act\"\n            :title=\"t('viewer.open_in_new_tab')\"\n            :aria-label=\"t('viewer.open_in_new_tab')\"\n            @click=\"openInNewTab\"\n          ><span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('open-tab')\"></span></button>\n        </div>\n\n        <div class=\"fe-viewer__tail\">\n          <button\n            type=\"button\"\n            class=\"fe-viewer__act fe-viewer__close\"\n            :title=\"t('viewer.close')\"\n            :aria-label=\"t('viewer.close')\"\n            data-testid=\"viewer-close\"\n            @click=\"requestClose\"\n          ><span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span></button>\n        </div>\n      </header>\n\n      <!-- Drafts (issue #71): the bar a draft's editor carries — what it is,\n           where it will be saved, and the Save that puts it there. The same\n           bar with or without the overlay's chrome: on the standalone tab\n           (chromeless) it is the only bar, so it carries Close too. -->\n      <div\n        v-if=\"file && (draftActive || draftSavedNote)\"\n        class=\"fe-draftbar\"\n        :class=\"{ 'fe-draftbar--saved': !draftActive }\"\n        role=\"region\"\n        :aria-label=\"t('draft.badge')\"\n        data-testid=\"draft-bar\"\n      >\n        <template v-if=\"draftActive && draft\">\n          <span class=\"fe-draftbar__pill\">{{ t('draft.badge') }}</span>\n          <span class=\"fe-draftbar__text\">\n            <bdi>{{ draft.name }}</bdi>\n            <span class=\"fe-draftbar__target\" data-testid=\"draft-bar-target\">{{ t('draft.bar.target', { folder: draftFolder }) }}</span>\n          </span>\n          <span v-if=\"draftError\" class=\"fe-draftbar__error\" role=\"alert\" data-testid=\"draft-bar-error\">{{ draftError }}</span>\n          <span class=\"fe-draftbar__gap\" aria-hidden=\"true\"></span>\n          <button\n            type=\"button\"\n            class=\"fe-btn fe-btn--primary fe-btn--sm\"\n            :disabled=\"draftBusy\"\n            :aria-busy=\"draftBusy ? 'true' : undefined\"\n            data-testid=\"draft-save\"\n            @click=\"saveDraftToDisk\"\n          >{{ t('draft.save') }}</button>\n          <button\n            v-if=\"chromeless\"\n            type=\"button\"\n            class=\"fe-btn fe-btn--sm\"\n            :disabled=\"draftBusy\"\n            data-testid=\"draft-close\"\n            @click=\"requestClose\"\n          >{{ t('viewer.close') }}</button>\n        </template>\n        <span v-else class=\"fe-draftbar__done\" role=\"status\" data-testid=\"draft-saved-note\">\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('check')\"></span>\n          {{ t('draft.saved_to', { name: draftSaved?.name ?? '', folder: savedFolder }) }}\n        </span>\n      </div>\n      <p v-if=\"file && csvOfficeNote\" class=\"fe-officenote\" role=\"note\" data-testid=\"office-csv-note\">\n        {{ t('viewer.csv_office_note') }}\n      </p>\n      <!-- #184: the document changed outside the editor - a question put\n           away and still open, or what the last change came to. -->\n      <p\n        v-if=\"file && outsideAsk && !outsideAskOpen\"\n        class=\"fe-officenote fe-officenote--outside\"\n        role=\"status\"\n        data-testid=\"outside-pending\"\n      >\n        <span>{{ t('outside.pending') }}</span>\n        <button type=\"button\" class=\"fe-btn fe-btn--sm\" data-testid=\"outside-choose\" @click=\"outsideAskOpen = true\">\n          {{ t('outside.choose') }}\n        </button>\n      </p>\n      <p v-else-if=\"file && outsideNoteText\" class=\"fe-officenote\" role=\"status\" data-testid=\"outside-note\">\n        {{ outsideNoteText }}\n      </p>\n\n      <div\n        class=\"fe-viewer__stage\"\n        :class=\"{ 'fe-viewer__stage--gutter': chevGutter }\"\n        data-testid=\"viewer-stage\"\n        @click.self=\"onGroundClick\"\n      >\n        <div v-if=\"file\" class=\"fe-preview\" :class=\"stageModifier\" @click.self=\"onGroundClick\">\n          <template v-if=\"kind === 'image'\">\n            <img\n              ref=\"imgEl\"\n              :src=\"src\"\n              :alt=\"file.basename\"\n              class=\"fe-preview__image\"\n              :style=\"imageStyle\"\n              @load=\"measureFit\"\n            />\n          </template>\n          <template v-else-if=\"kind === 'video'\">\n            <video :src=\"src\" controls preload=\"metadata\" class=\"fe-preview__video\" />\n          </template>\n          <template v-else-if=\"kind === 'audio'\">\n            <audio :src=\"src\" controls class=\"fe-preview__audio\" />\n          </template>\n          <template v-else-if=\"kind === 'pdf'\">\n            <object :data=\"src\" type=\"application/pdf\" class=\"fe-preview__iframe\">\n              <div class=\"fe-preview__fallback\">\n                <!-- ikon:emoji — the file's own tile, the one the row behind\n                     this overlay is wearing. -->\n                <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons -->\n                <span class=\"fe-preview__fallback-icon\" aria-hidden=\"true\" v-html=\"tileHtml\"></span>\n                <p>{{ t('viewer.pdf_inline_failed') }}</p>\n                <a :href=\"download\" class=\"fe-btn fe-btn--primary\" target=\"_blank\" rel=\"noopener\">{{ t('viewer.open_in_new_tab') }}</a>\n              </div>\n            </object>\n          </template>\n\n          <template v-else-if=\"kind === 'markdown'\">\n            <div v-if=\"loading\" class=\"fe-preview__fallback\">{{ t('viewer.loading') }}</div>\n            <div v-else-if=\"tooLarge\" class=\"fe-preview__fallback\">\n              {{ t('viewer.too_large') }} <a :href=\"download\" class=\"fe-btn\">{{ t('viewer.download') }}</a>\n            </div>\n            <div\n              v-else-if=\"openMode === 'edit' && saveTextEndpoint\"\n              class=\"fe-preview__md-split\"\n            >\n              <div class=\"fe-preview__md-split-bar\">\n                <span class=\"fe-preview__md-split-label\">MARKDOWN</span>\n                <span v-if=\"fetchError\" class=\"fe-preview__md-split-error\">{{ fetchError }}</span>\n                <!-- A draft is written as it is typed; its one Save is the\n                     bar's, which puts it where it belongs. Two \"Save\" buttons\n                     meaning two different things is one too many. -->\n                <span v-if=\"draftActive\" class=\"fe-preview__code-status\" data-testid=\"draft-autosave\">\n                  {{ mdSaving ? t('viewer.saving') : (mdDirty ? t('draft.editing') : t('draft.kept')) }}\n                </span>\n                <button\n                  v-else\n                  type=\"button\"\n                  class=\"fe-btn fe-btn--primary\"\n                  :disabled=\"!mdDirty || mdSaving\"\n                  @click=\"saveMarkdown\"\n                >\n                  {{ mdSaving ? t('viewer.saving') : (mdDirty ? t('viewer.save') : t('viewer.saved')) }}\n                </button>\n              </div>\n              <div class=\"fe-preview__md-split-body\">\n                <textarea\n                  class=\"fe-preview__md-split-input\"\n                  v-model=\"rawText\"\n                  @input=\"onMdInput\"\n                  @keydown.ctrl.s.prevent=\"saveMarkdown\"\n                  @keydown.meta.s.prevent=\"saveMarkdown\"\n                  spellcheck=\"false\"\n                  :placeholder=\"t('viewer.md_placeholder')\"\n                />\n                <div\n                  v-if=\"markdownUnavailable\"\n                  class=\"fe-preview__md-split-output fe-preview__md\"\n                >{{ t('viewer.peer_not_installed') }}</div>\n                <div\n                  v-else\n                  ref=\"markdownEl\"\n                  class=\"fe-preview__md-split-output fe-preview__md\"\n                  dir=\"auto\"\n                  v-html=\"markdownHtml\"\n                ></div>\n              </div>\n            </div>\n            <div v-else-if=\"fetchError\" class=\"fe-preview__fallback\">\n              <p>{{ fetchError }}</p>\n              <p v-if=\"fetchErrorDetail\" class=\"fe-preview__error-detail\" data-testid=\"preview-error-detail\">{{ fetchErrorDetail }}</p>\n              <a :href=\"download\" class=\"fe-btn fe-btn--primary\">{{ t('viewer.download') }}</a>\n            </div>\n            <!-- ⚠ RTL: a document reads in ITS direction, not the interface's —\n                 `auto` lets an English README stay left to right in Arabic. -->\n            <div v-else-if=\"markdownHtml\" ref=\"markdownEl\" class=\"fe-preview__md\" dir=\"auto\" v-html=\"markdownHtml\"></div>\n            <pre v-else class=\"fe-preview__pre\">{{ rawText }}</pre>\n          </template>\n\n          <template v-else-if=\"kind === 'app' && appView && appView.ui && api\">\n            <AppFrame\n              ref=\"appFrameRef\"\n              :key=\"`${appView.plugin}/${appView.id}/${file.path}`\"\n              class=\"fe-preview__viewer\"\n              :api=\"api\"\n              :app=\"appView.plugin\"\n              :version=\"appView.ui.version\"\n              :view=\"appView.id\"\n              placement=\"viewer\"\n              :ui=\"appView.ui\"\n              :files=\"appFiles\"\n              :storages=\"storages\"\n              :start-at=\"draft?.target_dir || undefined /* a draft's save-as opens where it will go */\"\n              :save-path=\"livePath\"\n              :read-only=\"openMode === 'view'\"\n              :locale=\"locale\"\n              :theme=\"theme\"\n              :user-name=\"userName\"\n              :title=\"appLabel\"\n              @dirty=\"onAppDirty\"\n              @saved=\"onAppSaved\"\n              @toast=\"(m) => emit('toast', m.text)\"\n              @op=\"(op) => emit('op', op)\"\n              @close=\"requestClose\"\n            />\n          </template>\n\n          <template v-else-if=\"kind === 'viewer'\">\n            <div v-if=\"viewerLoadError && !pdfFallbackToNative\" class=\"fe-preview__fallback\">\n              <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n              <span\n                class=\"fe-preview__fallback-icon fe-preview__fallback-icon--alert\"\n                aria-hidden=\"true\"\n                v-html=\"actionIconSvg('alert')\"\n              ></span>\n              <p>{{ viewerLoadError }}</p>\n              <a :href=\"download\" class=\"fe-btn fe-btn--primary\">{{ t('viewer.download') }}</a>\n            </div>\n            <div v-else-if=\"!viewerCmp\" class=\"fe-preview__fallback\">\n              <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n              <span\n                class=\"fe-preview__fallback-icon fe-preview__fallback-icon--spin\"\n                aria-hidden=\"true\"\n                v-html=\"actionIconSvg('progress')\"\n              ></span>\n              <p>{{ t('viewer.loading') }}</p>\n            </div>\n            <component\n              v-else\n              :is=\"viewerCmp\"\n              v-bind=\"viewerProps\"\n              class=\"fe-preview__viewer\"\n              @fallback=\"onPdfFallback\"\n              @change=\"draftTouched = true\"\n              @close=\"requestClose\"\n            />\n          </template>\n\n          <template v-else-if=\"kind === 'code' || kind === 'text'\">\n            <div v-if=\"loading\" class=\"fe-preview__fallback\">{{ t('viewer.loading') }}</div>\n            <div v-else-if=\"tooLarge\" class=\"fe-preview__fallback\">\n              {{ t('viewer.too_large') }} <a :href=\"download\" class=\"fe-btn\">{{ t('viewer.download') }}</a>\n            </div>\n            <div v-else-if=\"fetchError\" class=\"fe-preview__fallback\">\n              <p>{{ fetchError }}</p>\n              <p v-if=\"fetchErrorDetail\" class=\"fe-preview__error-detail\" data-testid=\"preview-error-detail\">{{ fetchErrorDetail }}</p>\n              <a :href=\"download\" class=\"fe-btn fe-btn--primary\">{{ t('viewer.download') }}</a>\n            </div>\n            <div v-else class=\"fe-preview__code-wrap\">\n              <div class=\"fe-preview__code-toolbar\">\n                <!-- ⚠ lang=\"en\". This badge holds a highlight.js language ID\n                     (\"typescript\", \"ini\", \"nginx\") — a technical token, never\n                     translated prose — and the CSS uppercases it. CSS\n                     text-transform is LOCALE-AWARE: under the Turkish UI the\n                     document is lang=\"tr\", so \"typescript\" uppercased to\n                     \"TYPESCRİPT\" with a dotted İ (measured 2026-09-13). The\n                     sibling uppercase labels (.fe-sidenav__heading and friends)\n                     hold real Turkish words where \"ETİKETLER\" is exactly right,\n                     so the transform stays and only this one token opts out. -->\n                <span class=\"fe-preview__code-lang\" lang=\"en\">{{ codeLanguage }}</span>\n                <span v-if=\"!monacoReady && codeHtml\" class=\"fe-preview__code-status\">\n                  {{ saveTextEndpoint && !monacoUnavailable ? t('viewer.editor_loading') : t('viewer.read_only') }}\n                </span>\n                <span v-if=\"saveOk\" class=\"fe-preview__code-status fe-preview__code-status--ok\">\n                  <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n                  <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('check')\"></span>\n                  {{ draftActive ? t('draft.kept') : t('viewer.saved') }}\n                </span>\n                <span v-if=\"saveError\" class=\"fe-preview__code-status fe-preview__code-status--err\" :title=\"saveError\">\n                  <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n                  <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n                  {{ t('viewer.save_error') }}\n                </span>\n                <span v-if=\"openMode === 'view'\" class=\"fe-preview__code-status\">{{ t('viewer.read_only') }}</span>\n                <button\n                  v-else-if=\"saveTextEndpoint && monacoReady && !draftActive\"\n                  type=\"button\"\n                  class=\"fe-btn fe-btn--primary\"\n                  :disabled=\"saving\"\n                  @click=\"saveCode\"\n                >{{ saving ? t('viewer.saving') : t('viewer.save') }}</button>\n              </div>\n              <!-- Monaco target — hidden until ready, then occupies the slot. -->\n              <div ref=\"monacoEl\" class=\"fe-preview__code-editor\" :class=\"{ 'is-hidden': !monacoReady }\" />\n              <!-- Highlight.js read-only fallback — visible until Monaco mounts. -->\n              <pre\n                v-if=\"!monacoReady && codeHtml\"\n                class=\"fe-preview__pre fe-preview__code hljs\"\n              ><code :class=\"`language-${codeLanguage}`\" v-html=\"codeHtml\"></code></pre>\n              <pre\n                v-else-if=\"!monacoReady && !codeHtml\"\n                class=\"fe-preview__pre\"\n                :data-lang=\"codeLanguage\"\n              >{{ rawText }}</pre>\n            </div>\n          </template>\n\n          <template v-else-if=\"kind === 'office'\">\n            <div v-if=\"officeError\" class=\"fe-preview__fallback\" data-testid=\"office-fallback\">\n              <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons -->\n              <span class=\"fe-preview__fallback-icon\" aria-hidden=\"true\" v-html=\"tileHtml\"></span>\n              <p>{{ officeError }}</p>\n              <p v-if=\"officeDiagnosis\" data-testid=\"office-diagnosis\">{{ officeDiagnosis }}</p>\n              <a :href=\"download\" class=\"fe-btn fe-btn--primary\">{{ t('viewer.download') }}</a>\n            </div>\n            <div v-else ref=\"officeEl\" class=\"fe-preview__office\" />\n          </template>\n\n          <template v-else>\n            <div class=\"fe-preview__fallback\">\n              <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons -->\n              <span class=\"fe-preview__fallback-icon\" aria-hidden=\"true\" v-html=\"tileHtml\"></span>\n              <p>{{ t('viewer.no_preview') }}</p>\n              <a :href=\"download\" class=\"fe-btn fe-btn--primary\">{{ t('viewer.download') }}</a>\n            </div>\n          </template>\n        </div>\n      </div>\n\n      <button\n        v-if=\"canNav\"\n        type=\"button\"\n        class=\"fe-viewer__chev fe-viewer__chev--prev\"\n        :title=\"t('viewer.nav_prev')\"\n        :aria-label=\"t('viewer.nav_prev')\"\n        @click=\"emit('nav', -1)\"\n      >\n        <svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" stroke=\"currentColor\"\n             stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n             aria-hidden=\"true\" focusable=\"false\"><path d=\"M15 4.5L7.5 12 15 19.5\" /></svg>\n      </button>\n      <button\n        v-if=\"canNav\"\n        type=\"button\"\n        class=\"fe-viewer__chev fe-viewer__chev--next\"\n        :title=\"t('viewer.nav_next')\"\n        :aria-label=\"t('viewer.nav_next')\"\n        @click=\"emit('nav', 1)\"\n      >\n        <svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" stroke=\"currentColor\"\n             stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n             aria-hidden=\"true\" focusable=\"false\"><path d=\"M9 4.5L16.5 12 9 19.5\" /></svg>\n      </button>\n\n      <!-- Zoom pill. Shown for the image viewer only - pdf, office and drawio\n           paint their own zoom inside their surface, and a second percentage\n           that the content does not obey is a control that lies. -->\n      <div v-if=\"canZoom\" class=\"fe-viewer__zoom\">\n        <button\n          type=\"button\"\n          class=\"fe-viewer__zoom-btn\"\n          :disabled=\"!canZoomOut\"\n          :title=\"t('viewer.zoom_out')\"\n          :aria-label=\"t('viewer.zoom_out')\"\n          @click=\"stepZoom(-1)\"\n        >&#8722;</button>\n        <button\n          type=\"button\"\n          class=\"fe-viewer__zoom-level\"\n          :title=\"t('viewer.zoom_reset')\"\n          :aria-label=\"t('viewer.zoom_reset')\"\n          @click=\"resetZoom\"\n        >{{ zoomLabel }}</button>\n        <button\n          type=\"button\"\n          class=\"fe-viewer__zoom-btn\"\n          :disabled=\"!canZoomIn\"\n          :title=\"t('viewer.zoom_in')\"\n          :aria-label=\"t('viewer.zoom_in')\"\n          @click=\"stepZoom(1)\"\n        >+</button>\n        <span class=\"fe-viewer__zoom-sep\" aria-hidden=\"true\"></span>\n        <button\n          type=\"button\"\n          class=\"fe-viewer__zoom-btn\"\n          :title=\"isFullscreen ? t('viewer.exit_fullscreen') : t('viewer.fullscreen')\"\n          :aria-label=\"isFullscreen ? t('viewer.exit_fullscreen') : t('viewer.fullscreen')\"\n          @click=\"toggleFullscreen\"\n        >\n          <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\"\n               stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n               aria-hidden=\"true\" focusable=\"false\">\n            <template v-if=\"isFullscreen\">\n              <path d=\"M9.5 4.5v5h-5\" /><path d=\"M14.5 4.5v5h5\" />\n              <path d=\"M9.5 19.5v-5h-5\" /><path d=\"M14.5 19.5v-5h5\" />\n            </template>\n            <template v-else>\n              <path d=\"M4.5 9.5v-5h5\" /><path d=\"M19.5 9.5v-5h-5\" />\n              <path d=\"M4.5 14.5v5h5\" /><path d=\"M19.5 14.5v5h-5\" />\n            </template>\n          </svg>\n        </button>\n      </div>\n\n    </div>\n  </Modal>\n\n  <!-- Drafts (issue #71): what closing a draft's editor asks, and the\n       question a Save beside a taken name asks. SIBLINGS of the viewer's\n       dialog, not children: Modal is not teleported, and a fixed overlay\n       inside the viewer's card would sit in its box (NewDocumentModal\n       keeps its folder picker beside it for the same reason). -->\n  <DraftCloseModal\n    :open=\"showDraftClose\"\n    :locale=\"locale\"\n    :theme=\"theme\"\n    :name=\"draft?.name ?? ''\"\n    :folder=\"draftFolder\"\n    :busy=\"draftBusy && !draftSave.question.value\"\n    :error=\"draftError\"\n    @cancel=\"showDraftClose = false\"\n    @save=\"onCloseSave\"\n    @keep=\"onCloseKeep\"\n    @discard=\"onCloseDiscard\"\n  />\n  <OutsideChangeModal\n    :open=\"!!outsideAsk && outsideAskOpen\"\n    :locale=\"locale\"\n    :theme=\"theme\"\n    :name=\"outsideName\"\n    @dismiss=\"outsideAskOpen = false\"\n    @choose=\"onOutsideChoose\"\n  />\n  <DraftConflictModal\n    :open=\"!!draftSave.question.value\"\n    :locale=\"locale\"\n    :theme=\"theme\"\n    :name=\"draftSave.question.value?.name ?? ''\"\n    :suggested=\"draftSave.question.value?.suggested ?? ''\"\n    :folder=\"draftSave.question.value?.folder ?? ''\"\n    :busy=\"draftSave.busy.value\"\n    :error=\"draftSave.error.value\"\n    @cancel=\"draftSave.cancel\"\n    @confirm=\"draftSave.confirm\"\n  />\n</template>\n\n<style>\n.fe-preview__code-editor.is-hidden {\n  display: none;\n}\n/* Wrapper for the dynamic viewers — they render their own toolbars\n * inside the wrapper, so we just give them the full pane height. */\n.fe-preview__viewer {\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  display: flex;\n  flex-direction: column;\n}\n.fe-preview .fe-preview__viewer {\n  align-self: stretch;\n}\n.fe-preview__md-mermaid {\n  display: flex;\n  justify-content: center;\n  margin: 16px 0;\n}\n.fe-preview__md-mermaid svg {\n  max-width: 100%;\n  height: auto;\n}\n.fe-preview__md-math {\n  margin: 16px 0;\n  text-align: center;\n  overflow-x: auto;\n}\n</style>\n","<script setup lang=\"ts\">\n// The filex mark — the ONE copy of it in the product's own code.\n//\n// A tiny folder + checkmark: recognisable as a file manager, inline SVG so it\n// needs no asset pipeline. `class` falls through to the root element, so a\n// caller sizes it.\n//\n// ⚠⚠ It lives in `packages/core` and not in `web/` because the public shell\n// (`components/public/PublicShell.vue`) draws it too, and `packages/core`\n// cannot import out of the web app. `web/src/components/LogoMark.vue` is a\n// re-export of this file; every existing call site keeps working.\n// `scripts/dup-scan.mjs` names THIS path as the concept's home\n// (`brand-mark`), and `web/tests/quality/duplication.test.ts` fails on a\n// second hand-typed copy — for a reason with a date on it: the public share\n// page carried the pre-rebrand indigo for a whole release because its mark\n// was re-typed in Go rather than generated from here.\n//\n// gorunum:v1 — flat product blue, not the old indigo→violet gradient (\"maviye\n// çekelim\"). The fill is the palette's own `--fe-primary`, so the mark is\n// #2f6ceb on a light page and #5b8cff on a dark one, and it follows any theme\n// the product ever ships rather than being a colour no theme can reach. On a\n// public link with an instance accent set the same token carries the\n// operator's colour (`accentStyleOf`), which is the behaviour a brandable\n// mark should have.\n//\n// ⚠ The literal is a floor, not the value in use: `fill` has no inherited\n// value to fall back to, so an unstyled context (core's stylesheet missing)\n// would paint the mark BLACK rather than blue. Measured in the browser on\n// /admin/login, /admin/dashboard and /admin/about: the computed fill is the\n// token in all three, in both variants — the literal never renders today.\n//\n// The same blue is written out by hand in three static files that have no\n// token scope at all: web/public/favicon.svg, web/public/icons/icon.svg and\n// the `theme-color` meta in web/index.html (plus the PWA manifest's\n// theme_color in web/pwa.config.ts). Change one, change all four.\n</script>\n\n<template>\n  <svg viewBox=\"0 0 32 32\" aria-hidden=\"true\">\n    <rect width=\"32\" height=\"32\" rx=\"7\" fill=\"var(--fe-primary, #2f6ceb)\" />\n    <path\n      d=\"M7 11a2 2 0 0 1 2-2h5l2 2h7a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2V11z\"\n      fill=\"none\"\n      stroke=\"#fff\"\n      stroke-width=\"1.8\"\n      stroke-linejoin=\"round\"\n    />\n    <path\n      d=\"M11.5 17.5l3 2.5 5.5-6\"\n      fill=\"none\"\n      stroke=\"#fff\"\n      stroke-width=\"1.8\"\n      stroke-linecap=\"round\"\n      stroke-linejoin=\"round\"\n    />\n  </svg>\n</template>\n","<script setup lang=\"ts\">\n/**\n * TimeZonePicker — a search box that opens a ranked list of zones.\n *\n * ⚠⚠ ONE picker, two hosts. It was written inside the web app's user-settings\n * dialog (`components/UserSettingsDialog.vue`), and then the embed\n * needed the same control — an embed has no settings dialog, so its \"⋯\" menu\n * opens `TimeZoneDialog`, which mounts this. `packages/core` cannot import from\n * `web/`, so the picker moved here and both surfaces render it from this one\n * definition. A second copy would be the duplication the owner has ruled out\n * (*\"tekrar eden şeyler tek yerden eklenmeli\"*) and the first thing the two\n * would disagree about is which zones they find.\n *\n * Presentational: `modelValue` is `''` or an IANA id, a pick emits\n * `update:modelValue`, and the HOST decides what a pick writes — the web app\n * writes the account, the embed writes this browser's own choice\n * (`lib/timezone`, tier `viewer`). What `''` stands for differs between them,\n * so the host says it through `fallback` and the first row names it.\n *\n * ⚠ A half-typed string never becomes the value: `query` (what you typed) and\n * `modelValue` (what is in force) are separate, and only `commit` crosses\n * between them.\n */\nimport { computed, nextTick, onBeforeUnmount, ref } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { localeTag, useLocale } from '../composables/useLocale';\nimport {\n  deviceTimeZone,\n  supportedTimeZones,\n  type ResolvedTimeZone,\n} from '../lib/timezone';\n\nconst props = defineProps<{\n  locale: LocaleCode;\n  /** `''` = the default row; otherwise an IANA id. */\n  modelValue: string;\n  /** What `''` resolves to on this surface — the zone and the tier. */\n  fallback: ResolvedTimeZone;\n  disabled?: boolean;\n  /** Id for the input, so the host's own `<label for>` names the control. */\n  inputId?: string;\n  /** Accessible name for the list (the host's visible label, usually). */\n  label?: string;\n  /** `data-testid` prefix: `-filter`, `-list`, `-opt-<zone|device>`. */\n  testid?: string;\n}>();\n\nconst emit = defineEmits<{ (e: 'update:modelValue', v: string): void }>();\n\nconst { t } = useLocale(() => props.locale);\nconst tag = computed(() => localeTag(props.locale));\nconst tid = computed(() => props.testid || 'fe-tz');\n\nlet seq = 0;\nconst uid = `fe-tz-${++seq}-${Math.random().toString(36).slice(2, 7)}`;\nconst inputDomId = computed(() => props.inputId || `${uid}-input`);\nconst listId = `${uid}-list`;\n\n/* ── the zone index ──────────────────────────────────────────────────────\n *\n * ⚠⚠ NOT a hand-written list of zones. The ids come from the platform\n * (`Intl.supportedValuesOf('timeZone')`, wrapped by `supportedTimeZones()`,\n * which falls back to a small canonical set on an engine that answers\n * nothing — so a person on such a browser still gets a usable list and, above\n * all, KEEPS the zone they already have).\n *\n * Everything a row shows or is searched by is derived from `Intl`:\n *\n *   • the offset  — `timeZoneName: 'shortOffset'` → \"GMT+03:00\";\n *   • the region name — `timeZoneName: 'longGeneric'` → \"Turkey Time\", built\n *     in BOTH English and the interface language, so \"turkey\" and \"Türkiye\"\n *     both find `Europe/Istanbul` whichever catalogue is loaded. That one line\n *     is why the alias table below is eight entries and not four hundred;\n *   • the city — the id's own last segment.\n *\n * Built lazily, the first time the field is opened: ~420 zones × two\n * formatters is work worth doing zero times for the people who never touch\n * this control. Re-built when the language or the default row changes.\n */\ninterface TzRow {\n  /** The value that gets emitted. `''` = the default row. */\n  value: string;\n  /** The city, or the default sentence. What the eye lands on. */\n  label: string;\n  /** \"Europe\" — drawn muted beside the city. */\n  region: string;\n  /** \"GMT+03:00\". */\n  offset: string;\n  /** Folded text the query is matched against. */\n  haystack: string;\n  /** The city alone, folded — the strongest thing a query can hit. */\n  cityFold: string;\n  /** Every word of the haystack, folded — for \"starts a word\" matches. */\n  words: string[];\n  /** Clock for this zone, or null when the engine refuses the id. */\n  fmt: Intl.DateTimeFormat | null;\n}\n\n/**\n * Fold a string down to something a person's typing can be compared against:\n * case, Turkish letters, accents and the id's punctuation all removed.\n *\n * ⚠ The Turkish map is explicit and comes FIRST. `'İ'.toLowerCase()` is\n * \"i̇\" (an i plus a combining dot) in every locale-independent lowercase,\n * and `'I'.toLowerCase()` is \"i\" — so a person typing İstanbul on a Turkish\n * keyboard and the id `Europe/Istanbul` do not meet unless the dot is dealt\n * with by hand. Stripping combining marks afterwards catches the rest.\n */\nfunction fold(input: string): string {\n  return input\n    .replace(/[\\u0130\\u0131]/g, 'i')\n    .replace(/[\\u015e\\u015f]/g, 's')\n    .replace(/[\\u011e\\u011f]/g, 'g')\n    .replace(/[\\u00dc\\u00fc]/g, 'u')\n    .replace(/[\\u00d6\\u00f6]/g, 'o')\n    .replace(/[\\u00c7\\u00e7]/g, 'c')\n    .toLowerCase()\n    .normalize('NFD')\n    .replace(/[\\u0300-\\u036f]/g, '')\n    .replace(/[_/\\-.]+/g, ' ')\n    .replace(/\\s+/g, ' ')\n    .trim();\n}\n\n/**\n * The handful of names `Intl` does not say.\n *\n * ⚠ Deliberately tiny, and deliberately not a zone list: the generic names\n * already carry the country for every zone that has one. These are the words\n * people type that are not a city, a country or an offset — mostly the\n * abbreviations a support ticket arrives written in.\n */\nconst ALIASES: Record<string, string> = {\n  UTC: 'utc gmt zulu z greenwich universal',\n  'Etc/UTC': 'utc gmt zulu greenwich universal',\n  'Etc/GMT': 'utc gmt greenwich',\n  'Europe/Istanbul': 'turkey turkiye ist constantinople',\n  'Europe/London': 'uk britain england gmt bst',\n  'America/New_York': 'usa united states eastern est edt nyc',\n  'America/Los_Angeles': 'usa united states pacific pst pdt la',\n  'Asia/Kolkata': 'india calcutta ist',\n};\n\n/**\n * A zone's offset from UTC in minutes, or null when the engine will not say.\n *\n * ⚠⚠ Read in ONE fixed shape — `en-US` — and parsed as a NUMBER. The offset\n * the row DISPLAYS is in the interface language, and that is not \"GMT…\"\n * everywhere: Arabic prints \"غرينتش+3\", other languages print their own word\n * or their own digits. The search aliases used to be parsed out of that\n * localised text with a `GMT` pattern, so under Arabic not one zone could be\n * found by typing \"+3\" or \"UTC+3\" (translator finding, v0.43.0).\n */\nfunction offsetMinutes(zone: string): number | null {\n  const m = /^GMT(?:([+-])(\\d{1,2})(?::(\\d{2}))?)?$/.exec(namePart(zone, 'en-US', 'shortOffset').trim());\n  if (!m) return null;\n  if (!m[1]) return 0;\n  const minutes = Number(m[2]) * 60 + Number(m[3] ?? 0);\n  return m[1] === '-' ? -minutes : minutes;\n}\n\n/** Every way a person might type an offset — \"+3\", \"+03\", \"+03:00\", \"gmt+3\", \"utc+0300\". */\nfunction offsetAliases(minutes: number | null): string {\n  if (minutes === null) return '';\n  if (minutes === 0) return 'gmt utc';\n  const sign = minutes < 0 ? '-' : '+';\n  const abs = Math.abs(minutes);\n  const h = String(Math.floor(abs / 60));\n  const hh = h.padStart(2, '0');\n  const mm = String(abs % 60).padStart(2, '0');\n  const forms = [`${sign}${h}`, `${sign}${hh}`, `${sign}${hh}:${mm}`, `${sign}${hh}${mm}`];\n  return [...forms.map((f) => `gmt${f}`), ...forms.map((f) => `utc${f}`), ...forms].join(' ');\n}\n\n/** The `timeZoneName` part alone, e.g. \"GMT+03:00\" or \"Turkey Time\". */\nfunction namePart(zone: string, locale: string, style: 'shortOffset' | 'longGeneric'): string {\n  try {\n    const parts = new Intl.DateTimeFormat(locale, {\n      timeZone: zone,\n      timeZoneName: style,\n    }).formatToParts(new Date());\n    return parts.find((x) => x.type === 'timeZoneName')?.value ?? '';\n  } catch {\n    return '';\n  }\n}\n\nfunction clockFor(zone: string): Intl.DateTimeFormat | null {\n  try {\n    return new Intl.DateTimeFormat(tag.value, { timeZone: zone, hour: '2-digit', minute: '2-digit' });\n  } catch {\n    return null;\n  }\n}\n\n/** The zone `''` stands for, spelled out (the device's name when it is the device). */\nconst fallbackZone = computed(() => props.fallback.zone ?? deviceTimeZone());\n\n/**\n * The first row's sentence. It names the TIER as well as the zone, because\n * \"use the default\" is a promise about what happens next and the person\n * choosing it should not have to guess whose default that is.\n */\nconst defaultLabel = computed(() => {\n  const zone = fallbackZone.value;\n  if (props.fallback.tier === 'host') return t('tz.default.host', { zone });\n  if (props.fallback.tier === 'account') return t('tz.default.account', { zone });\n  return t('tz.default.device', { zone });\n});\n\nconst index = ref<TzRow[] | null>(null);\nlet indexKey = '';\n\nfunction buildIndex(): TzRow[] {\n  const loc = tag.value;\n  const fz = fallbackZone.value;\n  const defaultHay = fold(\n    `${fz} ${defaultLabel.value} default automatic device local system account site`,\n  );\n  const rows: TzRow[] = [\n    {\n      value: '',\n      label: defaultLabel.value,\n      region: '',\n      offset: namePart(fz, loc, 'shortOffset'),\n      haystack: defaultHay,\n      cityFold: fold(fz.split('/').pop() ?? ''),\n      words: defaultHay.split(' ').filter(Boolean),\n      fmt: clockFor(fz),\n    },\n  ];\n  /* ⚠ The zone in force is guaranteed a row even when the platform's list\n     does not contain it — an engine without `Intl.supportedValuesOf` falls\n     back to the small canonical set, and somebody whose zone is outside it\n     must still see it, find it highlighted, and be able to land back on it\n     after wandering the list. Nothing is rewritten either way: only `commit`\n     emits. */\n  const ids = supportedTimeZones();\n  if (props.modelValue && !ids.includes(props.modelValue)) ids.unshift(props.modelValue);\n  for (const zone of ids) {\n    const segs = zone.split('/');\n    const city = (segs[segs.length - 1] ?? zone).replace(/_/g, ' ');\n    const region = segs.length > 1 ? segs[0].replace(/_/g, ' ') : '';\n    const offset = namePart(zone, loc, 'shortOffset');\n    const genericLocal = namePart(zone, loc, 'longGeneric');\n    const genericEn = loc === 'en-US' ? '' : namePart(zone, 'en-US', 'longGeneric');\n    const haystack = fold(\n      [zone, city, region, genericLocal, genericEn, ALIASES[zone] ?? '', offset, offsetAliases(offsetMinutes(zone))]\n        .filter(Boolean)\n        .join(' '),\n    );\n    rows.push({\n      value: zone,\n      label: city,\n      region,\n      offset,\n      haystack,\n      cityFold: fold(city),\n      words: haystack.split(' ').filter(Boolean),\n      fmt: clockFor(zone),\n    });\n  }\n  return rows;\n}\n\nfunction ensureIndex(): void {\n  const key = `${props.locale}|${props.fallback.tier}|${fallbackZone.value}|${props.modelValue}`;\n  if (index.value && indexKey === key) return;\n  indexKey = key;\n  index.value = buildIndex();\n}\n\n/* ── the combobox ──────────────────────────────────────────────────────── */\n\nconst open = ref(false);\nconst query = ref('');\nconst active = ref(0);\nconst inputEl = ref<HTMLInputElement | null>(null);\nconst listEl = ref<HTMLElement | null>(null);\n\n/** The instant every row's clock is formatted from — one shared tick rather\n *  than 50 rows each calling `new Date()` and disagreeing by a millisecond. */\nconst tick = ref(new Date());\nlet timer: ReturnType<typeof setInterval> | undefined;\nfunction startTick(): void {\n  tick.value = new Date();\n  if (!timer) timer = setInterval(() => (tick.value = new Date()), 1000);\n}\nfunction stopTick(): void {\n  if (timer) clearInterval(timer);\n  timer = undefined;\n}\nonBeforeUnmount(stopTick);\n\n/**\n * Where the list goes and how tall it may be — MEASURED, not assumed.\n *\n * ⚠ The host usually scrolls (a settings pane, a dialog body), so the list\n * cannot escape it: a fixed 264px drop opened straight through the settings\n * modal's footer and the bottom rows were cut off mid-word (measured at\n * 1280×900 with the field near the bottom of Preferences). So the drop takes\n * whichever side of the field has room inside its nearest scrolling ancestor\n * — the viewport when there is none — and never asks for more than that.\n */\nconst drop = ref<{ maxHeight: string; above: boolean }>({ maxHeight: '264px', above: false });\n\nfunction scrollBox(el: HTMLElement): { top: number; bottom: number } {\n  let p = el.parentElement;\n  while (p) {\n    const oy = getComputedStyle(p).overflowY;\n    if (oy === 'auto' || oy === 'scroll') {\n      const r = p.getBoundingClientRect();\n      return { top: r.top, bottom: r.bottom };\n    }\n    p = p.parentElement;\n  }\n  return { top: 0, bottom: window.innerHeight };\n}\n\nfunction measureDrop(): void {\n  const input = inputEl.value;\n  if (!input) return;\n  const ir = input.getBoundingClientRect();\n  const box = scrollBox(input);\n  const gap = 12;\n  const below = box.bottom - ir.bottom - gap;\n  const above = ir.top - box.top - gap;\n  /* A floor, because a two-row list is worse than one that overlaps the field\n     it belongs to; and a ceiling, because past ~7 rows people type instead of\n     scrolling. */\n  const MIN = 132;\n  const MAX = 264;\n  const useAbove = below < MIN && above > below;\n  const room = useAbove ? above : below;\n  drop.value = {\n    maxHeight: `${Math.round(Math.max(MIN, Math.min(MAX, room)))}px`,\n    above: useAbove,\n  };\n}\n\n/** How many rows are drawn. Unfiltered this list is ~420 long and every row\n *  carries a live clock; past the first screenful nobody is reading, they are\n *  typing. The count that was left out is SAID, so a short list is never\n *  mistaken for the whole answer. */\nconst LIMIT = 50;\n\n/**\n * How well one row answers one query — `-1` when it does not.\n *\n * ⚠⚠ RANKED, not merely filtered. A plain substring match over the haystack\n * is what this had first, and typing \"ist\" returned Boa V*ist*a, Ashgabat\n * (Turkmen*ist*an Time) and Dushanbe — with Istanbul nowhere in the visible\n * rows. Measured in a real browser before the fix:\n *\n *   the city, exactly       → it IS the answer\n *   the city, as a prefix   → \"ist\" → Istanbul\n *   the start of any word   → \"new y\" → New York, \"gmt+3\" → the +3 zones\n *   anywhere at all         → kept, but last\n *\n * Every term has to hit something, so two words narrow instead of widening.\n */\nfunction score(row: TzRow, terms: string[]): number {\n  let total = 0;\n  for (const term of terms) {\n    let best = 0;\n    if (row.cityFold === term) best = 120;\n    else if (row.cityFold.startsWith(term)) best = 100;\n    else if (row.words.some((w) => w.startsWith(term))) best = 70;\n    else if (row.haystack.includes(term)) best = 30;\n    if (best === 0) return -1;\n    total += best;\n  }\n  return total;\n}\n\nconst matches = computed<TzRow[]>(() => {\n  const all = index.value ?? [];\n  const q = fold(query.value);\n  if (!q) {\n    /* ⚠ The zone in force is PINNED to the top of the unfiltered list. Only\n       the first `LIMIT` rows are rendered, so a zone at index 338 of 420 could\n       not be highlighted on open, and `aria-activedescendant` pointed at an id\n       that was not in the document. Measured with Europe/London stored. */\n    const cur = all.find((r) => r.value === props.modelValue);\n    if (!cur || cur === all[0]) return all;\n    return [all[0], cur, ...all.slice(1).filter((r) => r !== cur)];\n  }\n  const terms = q.split(' ').filter(Boolean);\n  const scored: Array<{ row: TzRow; score: number; i: number }> = [];\n  all.forEach((row, i) => {\n    const s = score(row, terms);\n    if (s >= 0) scored.push({ row, score: s, i });\n  });\n  // Ties keep the platform's own order, which is alphabetical by id — so a\n  // list of equally-good answers does not reshuffle itself between keystrokes.\n  scored.sort((a, b) => b.score - a.score || a.i - b.i);\n  return scored.map((x) => x.row);\n});\n\nconst visible = computed(() => matches.value.slice(0, LIMIT));\nconst hidden = computed(() => Math.max(0, matches.value.length - visible.value.length));\n\n/** The closed field's text. Never a query: a control that keeps your typing\n *  on screen after you walk away looks like it saved it.\n *\n *  ⚠ It reads correctly BEFORE the index exists — the field is drawn the\n *  moment its pane is, and the index is only built when it is focused. */\nconst display = computed(() => {\n  if (!props.modelValue) return defaultLabel.value;\n  const zone = props.modelValue;\n  const city = (zone.split('/').pop() ?? zone).replace(/_/g, ' ');\n  const off = namePart(zone, tag.value, 'shortOffset');\n  return off ? `${city} - ${off}` : city;\n});\n\nfunction rowTime(row: TzRow): string {\n  try {\n    return row.fmt ? row.fmt.format(tick.value) : '';\n  } catch {\n    return '';\n  }\n}\n\nfunction openList(): void {\n  ensureIndex();\n  open.value = true;\n  query.value = '';\n  startTick();\n  const idx = visible.value.findIndex((r) => r.value === props.modelValue);\n  active.value = idx >= 0 ? idx : 0;\n  void nextTick(() => {\n    measureDrop();\n    scrollActiveIntoView();\n  });\n}\n\n/** Close WITHOUT choosing: the field goes back to saying what is in force. */\nfunction closeList(): void {\n  open.value = false;\n  query.value = '';\n  active.value = 0;\n  stopTick();\n}\n\nfunction onInput(ev: Event): void {\n  ensureIndex();\n  if (!open.value) startTick();\n  open.value = true;\n  query.value = (ev.target as HTMLInputElement).value;\n  active.value = 0;\n}\n\nfunction commit(row: TzRow): void {\n  closeList();\n  inputEl.value?.blur();\n  if (row.value === props.modelValue) return;\n  emit('update:modelValue', row.value);\n}\n\nfunction scrollActiveIntoView(): void {\n  const el = listEl.value?.querySelector<HTMLElement>('[data-tz-active=\"1\"]');\n  el?.scrollIntoView({ block: 'nearest' });\n}\n\nfunction moveActive(delta: number): void {\n  const n = visible.value.length;\n  if (n === 0) return;\n  // Clamp first: a filter that shrank the list can leave the cursor past its\n  // end, and `aria-activedescendant` would then name a row nobody can see.\n  const from = Math.min(active.value, n - 1);\n  active.value = (from + delta + n) % n;\n  void nextTick(() => scrollActiveIntoView());\n}\n\nfunction onKeydown(ev: KeyboardEvent): void {\n  switch (ev.key) {\n    case 'ArrowDown':\n      ev.preventDefault();\n      if (!open.value) openList();\n      else moveActive(1);\n      break;\n    case 'ArrowUp':\n      ev.preventDefault();\n      if (!open.value) openList();\n      else moveActive(-1);\n      break;\n    case 'Home':\n      if (!open.value) return;\n      ev.preventDefault();\n      active.value = 0;\n      void nextTick(() => scrollActiveIntoView());\n      break;\n    case 'End':\n      if (!open.value) return;\n      ev.preventDefault();\n      active.value = Math.max(0, visible.value.length - 1);\n      void nextTick(() => scrollActiveIntoView());\n      break;\n    case 'Enter': {\n      if (!open.value) return;\n      ev.preventDefault();\n      const row = visible.value[active.value];\n      if (row) commit(row);\n      break;\n    }\n    case 'Escape':\n      if (!open.value) return;\n      // ⚠ Stopped here. Both hosts are dialogs that close on Escape, and the\n      // first Escape belongs to the list that is open on top of them.\n      ev.preventDefault();\n      ev.stopPropagation();\n      closeList();\n      break;\n    case 'Tab':\n      closeList();\n      break;\n  }\n}\n</script>\n\n<template>\n  <!-- A real combobox (`role=\"combobox\"` + `aria-expanded` + `aria-controls`\n       + `aria-activedescendant`), not a div that listens for clicks: the list\n       is reachable by arrow keys and announced to a screen reader as what it\n       is. -->\n  <div class=\"fe-tzpick\">\n    <input\n      :id=\"inputDomId\"\n      ref=\"inputEl\"\n      class=\"fe-tzpick__input\"\n      type=\"text\"\n      role=\"combobox\"\n      autocomplete=\"off\"\n      spellcheck=\"false\"\n      aria-autocomplete=\"list\"\n      :aria-expanded=\"open\"\n      :aria-controls=\"listId\"\n      :aria-activedescendant=\"open && visible.length ? `${listId}-opt-${active}` : undefined\"\n      :disabled=\"disabled\"\n      :data-testid=\"`${tid}-filter`\"\n      :placeholder=\"t('tz.search')\"\n      :value=\"open ? query : display\"\n      @focus=\"openList\"\n      @input=\"onInput\"\n      @keydown=\"onKeydown\"\n      @blur=\"closeList\"\n    />\n    <ul\n      v-if=\"open\"\n      :id=\"listId\"\n      ref=\"listEl\"\n      class=\"fe-tzpick__list\"\n      :class=\"{ 'is-above': drop.above }\"\n      :style=\"{ maxHeight: drop.maxHeight }\"\n      role=\"listbox\"\n      :aria-label=\"label || t('tz.title')\"\n      :data-testid=\"`${tid}-list`\"\n    >\n      <li\n        v-for=\"(row, i) in visible\"\n        :id=\"`${listId}-opt-${i}`\"\n        :key=\"row.value || '__default'\"\n        class=\"fe-tzpick__opt\"\n        :class=\"{ 'is-active': i === active, 'is-current': row.value === modelValue }\"\n        :data-tz-active=\"i === active ? '1' : '0'\"\n        :data-testid=\"`${tid}-opt-${row.value || 'device'}`\"\n        role=\"option\"\n        :aria-selected=\"row.value === modelValue\"\n        :title=\"row.value || fallbackZone\"\n        @mousedown.prevent=\"commit(row)\"\n        @mousemove=\"active = i\"\n      >\n        <span class=\"fe-tzpick__main\">\n          <span class=\"fe-tzpick__city\">{{ row.label }}</span>\n          <span v-if=\"row.region\" class=\"fe-tzpick__region\">{{ row.region }}</span>\n        </span>\n        <span class=\"fe-tzpick__meta\">\n          <span v-if=\"rowTime(row)\" class=\"fe-tzpick__time\">{{ rowTime(row) }}</span>\n          <span class=\"fe-tzpick__offset\">{{ row.offset }}</span>\n        </span>\n      </li>\n      <li v-if=\"visible.length === 0\" class=\"fe-tzpick__empty\" role=\"presentation\">\n        {{ t('tz.no_match', { query }) }}\n      </li>\n      <li v-else-if=\"hidden > 0\" class=\"fe-tzpick__empty\" role=\"presentation\">\n        {{ t('tz.more', { n: hidden }) }}\n      </li>\n    </ul>\n  </div>\n</template>\n\n<!-- Deliberately NOT scoped: the webcomponent injects the CORE package's built\n     style.css, whose data-v scope ids do not match the ids the webcomponent's\n     own compile assigns, so scoped rules would silently not apply in embeds.\n     Class names are fe-* namespaced (same approach as ThemePalette). -->\n<style>\n/* The list is absolutely positioned so it OVERLAYS what is under it instead of\n   pushing the rest of the pane down: opening a zone list must not move the\n   next control out from under the pointer. */\n.fe-tzpick {\n  position: relative;\n  z-index: 2;\n}\n.fe-tzpick__input {\n  box-sizing: border-box;\n  width: 100%;\n  height: var(--fe-h-md);\n  padding: 0 10px;\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius);\n  background: var(--fe-bg);\n  color: var(--fe-text);\n  font: inherit;\n  font-size: var(--fe-text-sm);\n}\n.fe-tzpick__input:focus {\n  outline: none;\n  border-color: var(--fe-primary);\n}\n.fe-tzpick__input:disabled {\n  background: var(--fe-bg-elev);\n  color: var(--fe-text-muted);\n}\n.fe-tzpick__list {\n  position: absolute;\n  top: calc(100% + 4px);\n  inset-inline-start: 0;\n  inset-inline-end: 0;\n  z-index: 5;\n  box-sizing: border-box;\n  margin: 0;\n  padding: var(--fe-gap-xs);\n  list-style: none;\n  overflow-y: auto;\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius);\n  background: var(--fe-bg);\n  box-shadow: var(--fe-shadow-sm);\n}\n.fe-tzpick__list.is-above {\n  top: auto;\n  bottom: calc(100% + 4px);\n}\n.fe-tzpick__opt {\n  display: flex;\n  align-items: center;\n  gap: var(--fe-gap-sm);\n  min-height: var(--fe-h-md);\n  padding: 0 var(--fe-gap-sm);\n  border-radius: var(--fe-radius-sm);\n  color: var(--fe-text);\n  cursor: pointer;\n}\n/* Two separate states, and they are different things: `is-active` is where\n   the keyboard is, `is-current` is what is actually in force. A list that\n   painted only one of them cannot answer \"which one am I on?\" and \"which one\n   did I choose?\" at the same time. */\n.fe-tzpick__opt.is-active {\n  background: var(--fe-bg-hover);\n}\n.fe-tzpick__opt.is-current {\n  color: var(--fe-primary);\n  font-weight: 600;\n}\n.fe-tzpick__opt.is-current.is-active {\n  background: var(--fe-primary-soft);\n}\n.fe-tzpick__main {\n  display: flex;\n  align-items: baseline;\n  gap: var(--fe-gap-sm);\n  flex: 1 1 auto;\n  min-width: 0;\n}\n.fe-tzpick__city {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  font-size: var(--fe-text-sm);\n}\n.fe-tzpick__region {\n  flex: 0 0 auto;\n  font-size: var(--fe-text-xs);\n  font-weight: 400;\n  color: var(--fe-text-muted);\n}\n/* The offset, and the clock beside it, are the reason a row is readable\n   without knowing IANA ids. Tabular figures so the column does not jitter as\n   the minutes tick. */\n.fe-tzpick__meta {\n  flex: 0 0 auto;\n  display: flex;\n  align-items: baseline;\n  gap: var(--fe-gap-sm);\n  font-size: var(--fe-text-xs);\n  color: var(--fe-text-muted);\n  font-variant-numeric: tabular-nums;\n}\n.fe-tzpick__time {\n  color: var(--fe-text);\n}\n.fe-tzpick__empty {\n  padding: var(--fe-gap-sm);\n  font-size: var(--fe-text-xs);\n  line-height: 1.45;\n  color: var(--fe-text-muted);\n}\n/* On a phone the offset stays and the clock goes: 390px minus a pane's\n   padding leaves a city column too narrow to truncate politely otherwise. */\n@media (max-width: 480px) {\n  .fe-tzpick__time {\n    display: none;\n  }\n}\n</style>\n","/**\n * accountRules — what an account's e-mail address and username may be,\n * checked WHILE the person types, by the SERVER.\n *\n * ⚠⚠ The server is the only authority and the only author (0.54 audit B15 +\n * A12). This file used to be a mirror of its rules (backend identity.Check,\n * handlers/account_rules.go) with a copy of their sentences in two\n * catalogues beside the server's own `server.account.*`: three copies of\n * every sentence, and the e-mail rule had already drifted - the browser let\n * `a,b@x` and `ada.@x` through and the save refused them. Now a form asks\n * `POST /api/auth/account/check` while it is typed and shows what the server\n * says, in the reader's language; the save refuses the same things in the\n * same words.\n *\n * Why the check exists at all (release-candidate sweep, 2026-09-21): the\n * profile saved \"bu-bir-eposta-degil\" as an address and answered \"Profil\n * kaydedildi\", and a username with \"ş\" came back, after Save, as the server's\n * raw English. A form says the problem under the box while it is typed.\n */\n\n/** identity.Normalize: trimmed, lower-case — what the server will store. */\nexport function normalizeUsername(raw: string): string {\n  return raw.trim().toLowerCase();\n}\n\n/** One field the server would refuse: its code and its sentence. */\nexport interface AccountFieldRefusal {\n  error: string;\n  message: string;\n}\n\n/** The check's answer: a field is present only when it would be refused. */\nexport interface AccountCheckAnswer {\n  email?: AccountFieldRefusal;\n  username?: AccountFieldRefusal;\n}\n\n/** What a form asks about: only the fields sent are checked. `for` is whose\n *  account the values are meant for - the caller's own (the default), or an\n *  account an administrator is about to create. */\nexport interface AccountCheckQuery {\n  email?: string;\n  username?: string;\n  for?: 'self' | 'new';\n}\n\n/** How long typing must pause before the server is asked. */\nexport const ACCOUNT_CHECK_DELAY_MS = 250;\n\n/**\n * A checker for one form: call it with the values in the boxes after every\n * change; it waits until the typing pauses, asks the server once\n * (`ask` - POST /api/auth/account/check through the form's own client) and\n * resolves with the answer. A call a newer one replaced resolves with null,\n * and so does a request that failed: the save still judges, so a check that\n * could not be made says nothing rather than something wrong.\n */\nexport function accountChecker(\n  ask: (q: AccountCheckQuery) => Promise<AccountCheckAnswer>,\n  delayMs = ACCOUNT_CHECK_DELAY_MS,\n): (q: AccountCheckQuery) => Promise<AccountCheckAnswer | null> {\n  let seq = 0;\n  let pending: { timer: ReturnType<typeof setTimeout>; resolve: (a: AccountCheckAnswer | null) => void } | null = null;\n  return (q) => {\n    const mine = ++seq;\n    if (pending) {\n      clearTimeout(pending.timer);\n      pending.resolve(null);\n      pending = null;\n    }\n    return new Promise((resolve) => {\n      const timer = setTimeout(() => {\n        pending = null;\n        ask(q).then(\n          (ans) => resolve(mine === seq ? (ans ?? {}) : null),\n          () => resolve(null),\n        );\n      }, delayMs);\n      pending = { timer, resolve };\n    });\n  };\n}\n\n/**\n * The field a server refusal is about (`{error, message, field}` from\n * handlers/account_rules.go), so a form can put the server's sentence — it\n * is already in the reader's language — under the right box.\n */\nexport function refusalField(err: unknown): { field: string; message: string } | null {\n  // Two carriers of the same body: an axios error (the admin app's client:\n  // `response.data`) and core's own `jsonFetch` refusal (lib/errorWords\n  // `requestFailure`: the raw body, clipped, in `detail`) — the desktop app's\n  // settings dialog talks through the second.\n  let data = (err as { response?: { data?: { field?: unknown; message?: unknown } } })?.response?.data;\n  if (!data) {\n    const detail = (err as { detail?: unknown })?.detail;\n    if (typeof detail === 'string' && detail.trim().startsWith('{')) {\n      try {\n        data = JSON.parse(detail) as { field?: unknown; message?: unknown };\n      } catch {\n        data = undefined;\n      }\n    }\n  }\n  if (!data || typeof data.field !== 'string' || typeof data.message !== 'string') return null;\n  return { field: data.field, message: data.message };\n}\n","// The file list's row density — \"comfortable\" or \"compact\".\n//\n// ⚠ This module does NOT own the preference. `packages/core`'s Toolbar does:\n// it declares `DENSITY_LS_KEY = 'filex.density'`, reads it at setup and emits\n// the value up so both views mirror it onto a root class. Everything here is a\n// SECOND WRITER of that same key, which is the only honest way for a settings\n// modal outside the explorer to move a preference the explorer owns.\n//\n// Because it is a second writer, the key is the whole contract, and a rename\n// on core's side would leave this switch writing to a key nobody reads — the\n// exact \"saves, reads back, does nothing\" shape this surface exists to avoid.\n// `web/tests/lib/density.test.ts` parses Toolbar.vue and fails when the two\n// names drift.\n//\n// It applies immediately: core's Toolbar now listens for the `storage` event\n// (another tab) and for the `filex:density` event this module fires (same tab,\n// where the browser sends no storage event to the window that wrote).\n\nimport { savePref, setLocalPref } from './prefs';\n\nexport const DENSITY_KEY = 'filex.density';\n\nexport type Density = 'comfortable' | 'compact';\n\n/**\n * The account's density has arrived: apply it, without sending it back.\n *\n * Fires the same `filex:density` event a click would, so an explorer already\n * on screen re-lays-out instead of waiting for a navigation.\n */\nexport function applyAccountDensity(d: string | undefined | null): void {\n  if (d !== 'comfortable' && d !== 'compact') return;\n  setLocalPref('density', d);\n  try {\n    window.dispatchEvent(new CustomEvent('filex:density', { detail: d }));\n  } catch {\n    /* older engine without CustomEvent constructor */\n  }\n}\n\nexport function getDensity(): Density {\n  try {\n    return localStorage.getItem(DENSITY_KEY) === 'compact' ? 'compact' : 'comfortable';\n  } catch {\n    // private mode / blocked site data — the explorer's own read falls back\n    // the same way, so \"comfortable\" is what it will show too.\n    return 'comfortable';\n  }\n}\n\nexport function setDensity(d: Density): void {\n  try {\n    localStorage.setItem(DENSITY_KEY, d);\n  } catch {\n    /* a display preference is never worth taking the page down for */\n  }\n  // ⚠ v3 — and on the ACCOUNT, so the next browser opens the same list\n  // (`@brftech/filex-core` → lib/prefs). localStorage above is now the\n  // first-paint cache, not the preference.\n  savePref('density', d);\n  // A tab does not receive its own `storage` event, so say it out loud. The\n  // explorer may not be mounted, and nobody has to be listening.\n  try {\n    window.dispatchEvent(new CustomEvent('filex:density', { detail: d }));\n  } catch {\n    /* older engine without CustomEvent constructor */\n  }\n}\n","// Turning a photo somebody picked off their disk into something small enough\n// to live in a database row and travel inside a WebSocket frame.\n//\n// A profile picture is drawn at ~24 CSS pixels in the collaboration strip, and\n// the server caps what it will store at 48 KB — a phone snapshot is 3-6 MB, so\n// uploading the original would fail for reasons the user cannot see or fix.\n// Downscaling in the browser makes the cap something they never meet.\n\nexport interface DownscaleOptions {\n  /** Longest edge of the result, in pixels. */\n  maxPx: number;\n  /** Hard ceiling for the encoded data URI. Quality is stepped down until the\n   *  result fits — a picture that arrives slightly softer beats one rejected. */\n  maxBytes: number;\n}\n\n/**\n * downscaleImageToDataURL renders `file` into a square-cropped, downscaled\n * JPEG data URI no larger than `maxBytes`.\n *\n * Square-cropped on purpose: the strip draws circles, and a portrait squeezed\n * into a circle looks like a mistake. We take the centre square, which is where\n * a face is in practically every photo anyone picks as an avatar.\n */\nexport async function downscaleImageToDataURL(\n  file: File,\n  { maxPx, maxBytes }: DownscaleOptions,\n): Promise<string> {\n  const bitmap = await loadImage(file);\n  const side = Math.min(bitmap.width, bitmap.height);\n  const size = Math.min(maxPx, side);\n\n  const canvas = document.createElement('canvas');\n  canvas.width = size;\n  canvas.height = size;\n  const ctx = canvas.getContext('2d');\n  if (!ctx) throw new Error('canvas unavailable');\n  // White underneath: a transparent PNG encoded as JPEG would otherwise get a\n  // black background, which is not what anyone expects of their own photo.\n  ctx.fillStyle = '#ffffff';\n  ctx.fillRect(0, 0, size, size);\n  ctx.drawImage(\n    bitmap as CanvasImageSource,\n    (bitmap.width - side) / 2,\n    (bitmap.height - side) / 2,\n    side,\n    side,\n    0,\n    0,\n    size,\n    size,\n  );\n\n  for (const quality of [0.85, 0.7, 0.55, 0.4]) {\n    const uri = canvas.toDataURL('image/jpeg', quality);\n    if (uri.length <= maxBytes) return uri;\n  }\n  // Last resort: shrink the pixels rather than hand back something the server\n  // will refuse.\n  if (size > 64) {\n    return downscaleImageToDataURL(file, { maxPx: Math.floor(size / 2), maxBytes });\n  }\n  throw new Error('image too large');\n}\n\n// createImageBitmap where available (fast, off the main thread), <img> as the\n// fallback for browsers/jsdom that lack it.\nasync function loadImage(file: File): Promise<ImageBitmap | HTMLImageElement> {\n  if (typeof createImageBitmap === 'function') {\n    return createImageBitmap(file);\n  }\n  const url = URL.createObjectURL(file);\n  try {\n    return await new Promise<HTMLImageElement>((resolve, reject) => {\n      const img = new Image();\n      img.onload = () => resolve(img);\n      img.onerror = () => reject(new Error('decode failed'));\n      img.src = url;\n    });\n  } finally {\n    URL.revokeObjectURL(url);\n  }\n}\n","// The webhook-v2 event catalogue the admin UI offers for subscription.\n//\n// ⚠ This list is a deliberate hand-maintained mirror of the dotted EventType\n// constants in `backend/internal/notify/event.go`, and\n// `web/tests/webhooks/eventCatalog.test.ts` fails the build the moment the two\n// diverge or an entry loses its en/tr label.\n//\n// Why a mirror rather than an endpoint that lists them: the admin UI is\n// compiled INTO the server binary (`backend/embed`, `//go:embed all:admin\n// all:web`), so the two ship as one artifact and can never disagree at\n// runtime. An endpoint would add a request and a real failure mode — a\n// checkbox list that renders empty when the call fails, i.e. an operator who\n// cannot subscribe to anything — to buy freshness that is impossible to lose.\n// The drift is a build-time problem, so it gets a build-time gate.\n//\n// The order here is the order of the checkboxes: the write path first, then\n// the things that go wrong, then the sharing surfaces.\nexport const WEBHOOK_EVENTS = [\n  'file.uploaded',\n  'file.updated',\n  'file.upload_failed',\n  'file.infected',\n  'file.deleted',\n  'file.trashed',\n  'file.moved',\n  'archive.created',\n  'archive.extracted',\n  'share.created',\n  'drop.received',\n  'comment.added',\n  'e2e.escrow_used',\n  'e2e.password_changed',\n  'e2e.request_created',\n  'e2e.request_decided',\n  'plugin.notice',\n  // One person's held notifications, told together (backend notify/digest.go).\n  // A target receives it only when it ticks it; the person's own switch mutes\n  // their digests, and it has no \"urgent\" switch of its own (DIGEST_EVENT).\n  'notification.digest',\n] as const;\n\n/** The digest's own event: it is what tells the held ones, so it is never held\n *  itself, and the settings pane offers it no \"urgent\" switch. */\nexport const DIGEST_EVENT = 'notification.digest';\n\nexport type WebhookEvent = (typeof WEBHOOK_EVENTS)[number];\n\n/**\n * The event name as an i18n key SEGMENT.\n *\n * vue-i18n reads `.` as a path separator, so the event name cannot be a key on\n * its own: `webhooks.events.file.uploaded` would look for a nested `file`\n * object. The dots become underscores instead.\n */\nexport function eventSlug(event: string): string {\n  return event.replace(/\\./g, '_');\n}\n\n/**\n * i18n key for an event's OPERATOR label — the admin webhook screen.\n *\n * These read like the log line they describe (\"File updated — a write replaced\n * the bytes of an existing file\"), because the person ticking the box is\n * wiring a delivery and needs to know exactly which write fires it.\n */\nexport function webhookEventKey(event: string): string {\n  return `webhooks.events.${eventSlug(event)}`;\n}\n\n/**\n * i18n key for an event's END-USER label — the per-event switches in the user\n * settings dialog.\n *\n * ⚠ A separate catalogue on purpose, not a second spelling of the same one.\n * The switches borrowed the operator sentences for a release, and the result\n * was a list of rows explaining write semantics to somebody who had opened\n * \"What to tell me about\" to stop being pinged about comments. The two\n * audiences want different sentences about the same event, and one string\n * cannot be both — so the difference is stored rather than negotiated, and\n * `web/tests/webhooks/eventCatalog.test.ts` fails when an event arrives\n * without either of them.\n */\nexport function userEventKey(event: string): string {\n  return `userSettings.notifications.events.${eventSlug(event)}`;\n}\n\n/*\n * Whether an event can happen on THIS instance, why not, and who could switch\n * on what it waits for is the SERVER's answer: `capabilities.event_off`\n * (backend capabilities_rules.go `eventsOff`, #211 audit B16), each entry with\n * its reason, `fixable` and the sentence in the reader's language. The copy of\n * that rule that stood here (eventOffReason, eventFixableBy, eventPossible)\n * re-derived it from the scanning, escrow, apps and encryption-policy facts and\n * the account's role, with no test holding the two sides together.\n *\n * What a screen does with the answer is unchanged (the owner's rule for a\n * missing service, lib/serviceGate `gateOnService`): the person who can switch\n * it on sees the switch greyed with the sentence; everybody else is not\n * offered it. The Webhooks screen keeps every event subscribable and prints\n * the sentence beside the box.\n */\n","<script setup lang=\"ts\">\n/**\n * User settings — one dialog for the things that belong to the PERSON, opened\n * from the account menu on every front door: the admin panel's top nav, the\n * web explorer's avatar, and (since 2026-09-27) the desktop app's avatar.\n *\n * Why it exists at all: a user's own settings were scattered across pages of\n * the admin panel, and the whole panel is admin-only (`router/index.ts` →\n * `meta: { requiresAdmin: true }`). The notification switches were the sharp\n * edge — `GET/PATCH /api/notifications/settings` is a per-USER endpoint open\n * to every account, and its only screen sat behind the admin gate, so the\n * people who receive notifications were the exact people who could not turn\n * them off.\n *\n * ⚠⚠ ONE dialog. It lived in web/src/components/UserSettingsModal.vue until\n * 2026-09-27, when it moved into this package so the desktop app could open it\n * inside its own window instead of in a browser (owner: *\"Kullanıcı ayarları\n * uygulamanın İÇİNDE açılsın\"*). Everything it cannot know by itself comes in\n * through `host` (lib/userSettingsHost.ts): who is signed in, the account's\n * endpoints, how to say \"saved\" — and the rows only some surfaces have, which a\n * host leaves out to leave the row out. The admin app's file is now a thin\n * binding to its stores, its axios client and vue-i18n; the explorer builds a\n * host from its own credential when its host asks (`config.account.settings`).\n *\n * ⚠⚠ EVERY CONTROL HERE HAS A READER. A switch that saves, reads back and\n * changes nothing is worse than a missing one: it answers a question the\n * product never asks again. Each field below names the endpoint or the store\n * that reads it.\n *\n * zaman:z1 — the time zone used to be listed BELOW as a control we refused to\n * draw, because `users.timezone` was written by the profile endpoint and read\n * by nothing at all: every date in the product came out in the browser's own\n * zone. It has a reader now — `lib/timezone`, which `useLocale.formatDate`\n * (the explorer) and the admin app's `lib/format.ts` both format against — so\n * the control is here, and it is the whole point of the feature rather than a\n * decoration: an instant is stored once and every person reads it on their own\n * clock.\n *\n * What the reference shell has and we do NOT draw, and why:\n *\n *   • Default upload folder, auto-open preview, upload conflict behaviour,\n *     job title — no column, no endpoint, no reader anywhere.\n *   • Active sessions — there is no session list endpoint. `/api/auth/*`\n *     offers me / profile / password / totp and nothing else; sessions are\n *     cookies the server does not enumerate.\n *   • AI assistant — the per-user half of that surface does not exist; the\n *     AI settings that do exist are instance-wide and admin-only. The rail\n *     DOES carry the item (the reference shell has five, and a missing one is\n *     read as a missing feature rather than as a deliberate absence), and the\n *     pane behind it says exactly the sentence above instead of drawing a\n *     switch. It promises nothing and offers nothing to press.\n */\n\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { Bell, ShieldCheck, SlidersHorizontal, Sparkles, User as UserIcon, X } from 'lucide-vue-next';\nimport ChoiceButtons, { type ChoiceOption } from './ChoiceButtons.vue';\nimport ChoiceSelect, { type SelectOption } from './ChoiceSelect.vue';\nimport { ONLYOFFICE_VIEWER, openHandlersFor, type OpenHandler } from '../lib/appViewer';\nimport { onlyOfficeUsable } from '../lib/serviceGate';\nimport { clearOpenWithChoices, followOpenWithChoices, openWithChoices, setOpenWithChoice } from '../lib/openWith';\nimport { labelOf as pluginLabelOf } from '../lib/pluginLabel';\nimport type { OpenRule, PluginViewRow } from '../types/Plugins';\n\nimport Modal from '../modals/Modal.vue';\nimport ProductVersion from './ProductVersion.vue';\nimport ThemePalette from './ThemePalette.vue';\nimport TimeZonePicker from './TimeZonePicker.vue';\nimport { formatInstant, localeTag, useLocale } from '../composables/useLocale';\nimport { useSystemDark } from '../composables/useSystemDark';\nimport { accountChecker, refusalField, type AccountCheckAnswer } from '../lib/accountRules';\nimport { foreignText } from '../lib/direction';\nimport { availableLocales } from '../lib/uiLocales';\nimport { gateOnService } from '../lib/serviceGate';\n// tablo:t3 — the DEFAULT FOLDER VIEW: what a folder the person has never\n// changed opens as. ⚠ It replaced the \"remember each folder's view\" switch,\n// which was off by default — and off, every change in any folder became the\n// view of every folder (owner, 2026-09-21: \"tüm klasörlerde görünüm\n// değişikliği geçerli oluyor\"). A change now always belongs to its folder, and\n// this is where the person says what an untouched one opens as. The state\n// lives in the server-side document core keeps, so it follows the person\n// between browsers and machines; an unset field follows the operator's\n// instance default, and filex's own after that.\nimport {\n  forgetAllFolders,\n  instanceFolderDefault,\n  personFolderDefault,\n  rememberedCount,\n  setPersonFolderDefault,\n  type ViewMode,\n} from '../lib/viewPrefs';\n// gorunum — the palette grid is this package's component. Not a copy: see\n// ThemePalette.vue's header for why it had to be split out of the explorer's\n// own gallery modal (a modal cannot be a settings pane).\nimport { useThemeState, setTheme as setCorePalette } from '../lib/themes';\n// zaman:z3 — the zone picker is this package's component; the embed's own\n// \"⋯ → Time zone\" dialog mounts the very same one.\nimport { deviceTimeZone, resolvedTimeZone } from '../lib/timezone';\nimport { personInitial, personName } from '../lib/personName';\nimport { getDensity, setDensity, type Density } from '../lib/density';\nimport { downscaleImageToDataURL } from '../lib/imageDownscale';\nimport { DIGEST_EVENT, WEBHOOK_EVENTS, userEventKey } from '../lib/webhookEvents';\nimport type {\n  BrowserNotifyPermission,\n  SettingsNotificationPrefs,\n  SettingsQuota,\n  SettingsThemeMode,\n  UserSettingsHost,\n} from '../lib/userSettingsHost';\nimport type { WebPushDevice, WebPushState } from '../lib/webPush';\n\nconst props = defineProps<{\n  modelValue: boolean;\n  /** Everything this dialog cannot know by itself (lib/userSettingsHost). */\n  host: UserSettingsHost;\n  /** The pane to open on (the admin Notifications page opens `notifications`). */\n  initialSection?: 'profile' | 'preferences' | 'notifications' | 'security' | 'ai';\n}>();\nconst emit = defineEmits<{ (e: 'update:modelValue', v: boolean): void }>();\n\nconst currentLocale = computed(() => props.host.locale);\nconst { t, formatSize } = useLocale(() => props.host.locale);\n\ntype Section = 'profile' | 'preferences' | 'notifications' | 'security' | 'ai';\n\nconst section = ref<Section>(props.initialSection ?? 'profile');\n/**\n * ⚠ `ai` is listed, and it is listed as NOT HERE YET — the rail carries it so\n * the shape matches the reference shell, and the pane behind it says in one\n * sentence that there is nothing to set, because there is not: the AI settings\n * this server has are instance-wide and admin-only (see the header). Owner's\n * call, 2026-09-12: it shows as coming soon rather than as a feature, and it\n * promises nothing. The moment a per-user assistant setting exists, the\n * `soon` flag comes off and the pane fills; until then a rail item that\n * pretended to have controls would be the worse half of both options.\n */\nconst sections: { key: Section; icon: typeof UserIcon; soon?: boolean }[] = [\n  { key: 'profile', icon: UserIcon },\n  { key: 'preferences', icon: SlidersHorizontal },\n  { key: 'notifications', icon: Bell },\n  { key: 'security', icon: ShieldCheck },\n  { key: 'ai', icon: Sparkles, soon: true },\n];\n\n/** The heading that names the dialog (Modal `labelledby`). */\nconst headingId = `fx-us-title-${Math.random().toString(36).slice(2, 9)}`;\n\n/* ── Default apps (0.50, lib/openWith) ─────────────────────────────────\n * A part of Preferences, not a rail entry of its own (the maintainer, 2026-10-01: the\n * rail stays at five). The kinds this person chose an app for, with \"Open\n * with → Choose an app… → Always use this app\" - one record for the whole\n * account, the same on every surface. Each choice is judged against what the\n * administrator left on for the kind (the server's own list and rules,\n * lib/appViewer): one switched off since, or whose app was removed, is kept\n * and NOT used, and the row says so and what the kind opens with instead. */\nconst appViews = ref<PluginViewRow[]>([]);\nconst appRules = ref<Record<string, OpenRule>>({});\nconst appsKnown = ref(false);\nconst appsLoading = ref(false);\n\nasync function loadAppHandlers(): Promise<void> {\n  const fetchIt = props.host.api.pluginActions;\n  if (!fetchIt || appsLoading.value) return;\n  appsLoading.value = true;\n  try {\n    const ans = await fetchIt();\n    appViews.value = ans.views ?? [];\n    appRules.value = ans.open_rules ?? {};\n    appsKnown.value = true;\n  } catch {\n    // Apps are off, or the list is out of reach: the rows still show what\n    // the person chose, without judging it.\n    appsKnown.value = false;\n  } finally {\n    appsLoading.value = false;\n  }\n}\n\nwatch(\n  () => [props.modelValue, section.value] as const,\n  ([open, s]) => {\n    if (open && s === 'preferences') void loadAppHandlers();\n  },\n  { immediate: true },\n);\nconst stopFollowingChoices = followOpenWithChoices();\nonBeforeUnmount(stopFollowingChoices);\n\n/** A handler as the person reads it. */\nfunction handlerName(h: OpenHandler | null, id: string): string {\n  if (id === 'builtin') return t('openWith.builtin');\n  if (id === ONLYOFFICE_VIEWER) return t('openWith.onlyoffice');\n  if (h?.view) return pluginLabelOf(h.view.label, props.host.locale) || h.view.plugin;\n  // Gone (the app was removed): its name from the id.\n  return id.replace(/^app:/, '').split('/')[0] || id;\n}\n\ninterface AppChoiceRow {\n  ext: string;\n  id: string;\n  name: string;\n  /** The choice is among the handlers that are on. */\n  available: boolean;\n  /** What the kind opens with instead, when it is not. */\n  instead: string;\n  options: ChoiceOption[];\n}\n\nconst appChoiceRows = computed<AppChoiceRow[]>(() =>\n  Object.entries(openWithChoices())\n    .sort(([a], [b]) => a.localeCompare(b))\n    .map(([ext, id]) => {\n      const node = { type: 'file', basename: `file.${ext}`, extension: ext, mime_type: '' };\n      const { on, off } = openHandlersFor(appViews.value, node, appRules.value, {\n        onlyOffice: onlyOfficeUsable(props.host.capabilities),\n      });\n      const all = [...on, ...off];\n      const mine = all.find((h) => h.id === id) ?? null;\n      const available = !appsKnown.value || on.some((h) => h.id === id);\n      return {\n        ext,\n        id,\n        name: handlerName(mine, id),\n        available,\n        instead: on[0] ? handlerName(on[0], on[0].id) : t('openWith.builtin'),\n        options: on.map((h) => ({ value: h.id, label: handlerName(h, h.id) })),\n      };\n    }),\n);\n\nfunction changeAppChoice(ext: string, v: string | string[]): void {\n  if (typeof v === 'string' && v) setOpenWithChoice(ext, v);\n}\n\nfunction close() {\n  emit('update:modelValue', false);\n}\n\n/* ── profile ─────────────────────────────────────────────────────────────\n * Reader: PATCH /api/auth/profile (backend auth_self.go → profileReq), whose\n * response replaces the host's person; GET /api/auth/me reads the same row\n * back on every cold load.\n *\n * ⚠ This pane sends the four identity fields and nothing else. The other two\n * the endpoint accepts, `locale` and `timezone`, are written from Preferences\n * — by the control that changes them, the moment it is used, because both take\n * effect on screen immediately and a person who has watched the UI switch\n * language does not then go looking for a Save button. */\n\nconst email = ref('');\nconst username = ref('');\nconst displayName = ref('');\nconst avatarUrl = ref('');\nconst avatarError = ref('');\nconst avatarInput = ref<HTMLInputElement | null>(null);\nconst savingProfile = ref(false);\n\n/*\n * ⚠⚠ The e-mail and the username are checked WHILE they are typed - by the\n * SERVER (POST /api/auth/account/check, lib/accountRules `accountChecker`),\n * which says what it would refuse in the reader's language, the save's own\n * rules and words (0.54 audit B15/A12: this dialog used to judge with a\n * mirror of the rules and its own copy of the sentences). A refusal the save\n * still makes lands under the box it is about too. Before (release-candidate\n * sweep, 2026-09-21): \"bu-bir-eposta-degil\" saved with \"Profil kaydedildi\",\n * another account's address answered \"saved\" and changed nothing, and\n * \"Ayşe Yılmaz!\" as a username came back as raw English in a toast.\n */\nconst serverRefusal = ref<{ field: string; message: string } | null>(null);\nconst checked = ref<AccountCheckAnswer>({});\nconst checkAccount = accountChecker((q) => props.host.api.checkAccount?.(q) ?? Promise.resolve({}));\nwatch([email, username], ([e, u]) => {\n  serverRefusal.value = null;\n  void checkAccount({ email: e, username: u }).then((ans) => {\n    if (ans) checked.value = ans;\n  });\n});\n/** The server's sentence, isolated for the reader's direction. */\nconst said = (text: string | undefined): string => (text ? foreignText(currentLocale.value, text) : '');\nconst emailError = computed(() => {\n  if (serverRefusal.value?.field === 'email') return said(serverRefusal.value.message);\n  return said(checked.value.email?.message);\n});\nconst usernameError = computed(() => {\n  if (serverRefusal.value?.field === 'username') return said(serverRefusal.value.message);\n  return said(checked.value.username?.message);\n});\nconst profileInvalid = computed(() => !!emailError.value || !!usernameError.value);\n\n// Mirrors the server's cap (handlers.avatarMaxBytes) so a picture is resized\n// to fit rather than 400-ing after the fact.\nconst AVATAR_MAX_BYTES = 48 * 1024;\nconst AVATAR_MAX_PX = 160;\n\nconst avatarInitial = computed(\n  () =>\n    personInitial(\n      { display_name: displayName.value, username: username.value, email: email.value },\n      localeTag(currentLocale.value),\n    ) || '?',\n);\n\nfunction hydrateProfile() {\n  const u = props.host.user;\n  if (!u) return;\n  email.value = u.email ?? '';\n  username.value = u.username ?? '';\n  displayName.value = u.display_name ?? '';\n  avatarUrl.value = u.avatar_url ?? '';\n}\n\nasync function onAvatarFile(e: Event) {\n  const file = (e.target as HTMLInputElement).files?.[0];\n  if (!file) return;\n  avatarError.value = '';\n  if (!file.type.startsWith('image/')) {\n    avatarError.value = t('profile.avatar.notImage');\n    return;\n  }\n  try {\n    avatarUrl.value = await downscaleImageToDataURL(file, {\n      maxPx: AVATAR_MAX_PX,\n      maxBytes: AVATAR_MAX_BYTES,\n    });\n  } catch {\n    avatarError.value = t('profile.avatar.failed');\n  } finally {\n    if (avatarInput.value) avatarInput.value.value = '';\n  }\n}\n\nasync function saveProfile() {\n  // Nothing goes to the server while a box says what is wrong with it.\n  if (profileInvalid.value) return;\n  savingProfile.value = true;\n  try {\n    const u = await props.host.api.updateProfile({\n      email: email.value.trim(),\n      username: username.value.trim().toLowerCase(),\n      display_name: displayName.value.trim(),\n      avatar_url: avatarUrl.value,\n    });\n    props.host.setUser(u);\n    props.host.toast('success', t('profile.saved'));\n  } catch (e: unknown) {\n    const refusal = refusalField(e);\n    if (refusal) serverRefusal.value = refusal;\n    else props.host.toast('error', props.host.errorText(e, t('errors.generic')));\n  } finally {\n    savingProfile.value = false;\n  }\n}\n\n/* ── preferences ─────────────────────────────────────────────────────────\n * Language  → the host (the admin app: localStorage `filex.locale`, read by\n *             i18n/applyStoredLocale on every boot) AND `users.locale` via\n *             PATCH /api/auth/profile, which the next device reads when it\n *             has not chosen for itself.\n * Time zone → the host's account tier (lib/timezone accountZoneControl) AND\n *             `users.timezone` via PATCH /api/auth/profile.\n * Mode      → the host's own store (the admin app: `filex.theme` + core's\n *             `filex.thememode` pin; the explorer: `filex.thememode`).\n * Palette   → localStorage `filex.palette`, read by lib/themes.\n * Density   → localStorage `filex.density`, read by the explorer's Toolbar.\n * Storage   → GET /api/files/quota/me, read-only. */\n\n/*\n * ⚠⚠ The OFFERED languages (lib/uiLocales `availableLocales`), not a pair\n * written here. This used to be `[en, tr]`, so a language pack's language could\n * not be chosen, and once chosen elsewhere this dialog claimed the person was\n * reading English. Reactive: a pack installed while the dialog is open adds its\n * button.\n */\nconst localeOptions = computed<{ value: string; label: string }[]>(() =>\n  availableLocales().map((o) => ({ value: o.code, label: o.label || o.code })),\n);\n\nasync function pickLocale(v: string) {\n  const lang = props.host.language;\n  if (!lang) return;\n  // The host decides and applies (the admin app's i18n settle) — including a\n  // pack's language, whose strings it fetches.\n  lang.pick(v);\n  // Also on the account, so the next browser this person signs in from opens\n  // in the language they chose here instead of the instance default.\n  if (props.host.demoReadOnly) return;\n  try {\n    props.host.setUser(await props.host.api.updateProfile({ locale: v }));\n  } catch {\n    /* the device-local choice above already took effect; a failed account\n       write is not worth a toast over a language the user can see changed */\n  }\n}\n\n/* ── appearance: two axes, one pane ──────────────────────────────────────\n *\n * MODE is whether the light or the dark variant paints. PALETTE is which set\n * of colours that variant is made of. They are drawn as two clearly separate\n * rows under one heading because they compose — Night Blue has a light variant\n * and a dark one — and a reader who thinks the second control replaces the\n * first will \"turn on dark mode\" by clicking a palette and get the light\n * variant of a bluer theme. */\n\nconst theme = ref<SettingsThemeMode>('auto');\nconst themeOptions: { value: SettingsThemeMode; label: string }[] = [\n  { value: 'light', label: 'nav.themeLight' },\n  { value: 'auto', label: 'nav.themeAuto' },\n  { value: 'dark', label: 'nav.themeDark' },\n];\n\nconst openTriggerOptions: { value: 'single' | 'double'; label: string }[] = [\n  { value: 'double', label: 'userSettings.prefs.openTriggerDouble' },\n  { value: 'single', label: 'userSettings.prefs.openTriggerSingle' },\n];\n\n// System-dark, watched — so the palette previews repaint when the OS flips\n// while the dialog is open on 'auto'. composables/useSystemDark, the one\n// listener every core surface shares (#74).\nconst systemDark = useSystemDark();\n\n/** Which variant the previews should paint. */\nconst resolvedDark = computed(() =>\n  theme.value === 'auto' ? systemDark.value : theme.value === 'dark',\n);\n\nfunction pickTheme(v: SettingsThemeMode) {\n  theme.value = v;\n  props.host.mode.set(v);\n}\n\n/* Palette — this package owns the list, the selection and the persistence\n * (lib/themes.ts). This reads its reactive handle; it does not keep a copy. */\nconst { themeId: paletteId } = useThemeState();\n\nfunction pickPalette(id: string) {\n  setCorePalette(id);\n}\n\n/* ── time zone ───────────────────────────────────────────────────────────\n *\n * The owner's requirement, verbatim (translated from Turkish): \"the time zone\n * is a very important thing. I uploaded a video at 03:00; the person on GMT+0\n * will see that video's upload time in their OWN time zone.\"\n *\n * So the stored instant never moves and the READER picks the clock. The select\n * writes both halves in one handler: the host's local tier (so the very first\n * paint after a reload is already right, before /api/auth/me lands) and\n * `users.timezone` on the account (so the next device agrees). */\n\nconst timeZone = ref<string>('');\nconst savingTz = ref(false);\n\nconst deviceZone = computed(() => deviceTimeZone());\n\n/* Stable per-instance id, so the field's own `<label for>` names the\n * combobox (two settings dialogs can be mounted on one page). */\nconst tzInputId = `fx-us-tz-${Math.random().toString(36).slice(2, 9)}`;\n\n/* ⚠ The picker's first row is \"use this device's zone\": what an EMPTY account\n * zone resolves to for this person. */\nconst tzFallback = { zone: undefined, tier: 'device' } as const;\n\n/** The zone every date on this page is drawn in right now — from the ONE\n *  resolver, not from this dialog's copy of the account's value. */\nconst tzInForce = computed(() => resolvedTimeZone().zone ?? deviceZone.value);\n\n/** \"Right now it is 03:14 there\" — the one readout that makes a zone name\n *  concrete, and the fastest way for a person to tell they picked wrong. */\nconst tzNow = ref('');\nlet tzTimer: ReturnType<typeof setInterval> | undefined;\n\nfunction refreshTzNow() {\n  // Through the formatter that reads the RESOLVED zone — the readout says\n  // what the page is actually drawn in.\n  tzNow.value = formatInstant(new Date(), currentLocale.value, {\n    hour: '2-digit',\n    minute: '2-digit',\n    second: '2-digit',\n  });\n}\n\nasync function pickTimeZone(v: string) {\n  timeZone.value = v;\n  // Local first: the dates on screen repaint on this line, and they must do so\n  // whether or not the network is there.\n  props.host.zone.set(v);\n  refreshTzNow();\n  if (props.host.demoReadOnly) return;\n  savingTz.value = true;\n  try {\n    props.host.setUser(await props.host.api.updateProfile({ timezone: v }));\n  } catch (e: unknown) {\n    // ⚠ Surfaced, unlike the language above. A language you can SEE is wrong;\n    // a zone that failed to reach the account looks perfect on this device and\n    // is simply absent on the next one.\n    props.host.toast('error', props.host.errorText(e, t('errors.generic')));\n  } finally {\n    savingTz.value = false;\n  }\n}\n\nconst density = ref<Density>('comfortable');\n\n/* ── the default folder view ─────────────────────────────────────────── */\n\ntype FvSort = 'name' | 'type' | 'modified' | 'size';\nconst FV_VIEWS: ViewMode[] = ['list', 'grid', 'gallery'];\nconst FV_SORTS: FvSort[] = ['name', 'type', 'modified', 'size'];\n\n/* Read straight from the reactive state — the dialog holds no copy, so it\n   cannot show a default the explorer is not using. */\nconst fvPerson = computed(() => personFolderDefault());\nconst fvInstance = computed(() => instanceFolderDefault());\nconst fvFoldersKept = computed(() => rememberedCount());\n\n/** What \"follow the server\" resolves to right now, so the choice that says\n *  \"inherit\" also says WHAT it inherits — a default nobody can read is a\n *  default nobody can predict. */\nconst fvInheritView = computed<ViewMode>(() => fvInstance.value.v ?? 'list');\nconst fvInheritSort = computed(() => {\n  const k: FvSort = fvInstance.value.k ?? 'name';\n  const d = fvInstance.value.d ?? (k === 'modified' ? 'desc' : 'asc');\n  return `${t(`userSettings.prefs.fvSort_${k}`)} ${d === 'asc' ? '↑' : '↓'}`;\n});\n\nfunction pickFolderView(v: ViewMode | '') {\n  setPersonFolderDefault({ v: v || undefined });\n}\nfunction pickFolderSort(k: FvSort | '') {\n  /* A new key arrives in its own natural direction (dates newest first), the\n     same rule a column header follows. */\n  setPersonFolderDefault({ k: k || undefined, d: k ? (k === 'modified' ? 'desc' : 'asc') : undefined });\n}\nfunction pickFolderDir(d: 'asc' | 'desc') {\n  if (!fvPerson.value.k) return;\n  setPersonFolderDefault({ d });\n}\nfunction resetDefaultColumns() {\n  setPersonFolderDefault({ c: undefined });\n}\n\nfunction pickDensity(compact: boolean) {\n  density.value = compact ? 'compact' : 'comfortable';\n  setDensity(density.value);\n}\n\n// How a mouse opens a file: 'double' (single click selects, double opens) or\n// 'single' (first click opens). Touch always taps-to-open regardless. The HOST\n// owns where that lives — absent (the desktop app, whose own Settings carries\n// the same switch), and the row is not drawn.\nconst openTrigger = ref<'single' | 'double'>('double');\nfunction pickOpenTrigger(value: 'single' | 'double') {\n  openTrigger.value = value;\n  props.host.openTrigger?.set(value);\n}\n\n/* wiring:e2 vault - how long a vault this person writes to stays theirs\n * while they do nothing (1-10 minutes, kept on the server for the person;\n * docs/E2E-VAULT-FORMAT.md → \"The idle lock\"). Drawn only where the server\n * has vaults and the host can reach the setting. Fifteen minutes after it\n * the vault locks itself; that clock is fixed and not offered here. */\nconst vaultIdle = ref<number | null>(null);\nconst vaultIdleBusy = ref(false);\nconst vaultIdleShown = computed(\n  () => props.host.capabilities?.e2e_vault === true && !!props.host.api.vaultIdle && !!props.host.api.setVaultIdle,\n);\nconst vaultIdleOptions = computed<SelectOption[]>(() =>\n  Array.from({ length: 10 }, (_, i) => ({ value: i + 1, label: t('userSettings.vault.minutes', { n: i + 1 }) })),\n);\nfunction loadVaultIdle(): void {\n  const get = props.host.api.vaultIdle;\n  if (!vaultIdleShown.value || !get) return;\n  get()\n    .then((m) => (vaultIdle.value = m))\n    .catch(() => (vaultIdle.value = null));\n}\nasync function pickVaultIdle(minutes: number): Promise<void> {\n  const set = props.host.api.setVaultIdle;\n  if (!set || vaultIdleBusy.value || !Number.isInteger(minutes) || minutes < 1 || minutes > 10) return;\n  const was = vaultIdle.value;\n  vaultIdle.value = minutes;\n  vaultIdleBusy.value = true;\n  try {\n    vaultIdle.value = await set(minutes);\n    props.host.toast('success', t('userSettings.vault.saved'));\n  } catch (err) {\n    vaultIdle.value = was;\n    props.host.toast('error', props.host.errorText(err, t('userSettings.vault.failed')));\n  } finally {\n    vaultIdleBusy.value = false;\n  }\n}\n\nconst quota = ref<SettingsQuota | null>(null);\n\nconst quotaLine = computed(() => {\n  const q = quota.value;\n  if (!q) return '';\n  const used = formatSize(q.used_bytes);\n  if (q.unlimited || !q.quota_bytes) {\n    return t('quota.unlimitedTooltip', { used });\n  }\n  return t('quota.tooltip', {\n    used,\n    limit: formatSize(q.quota_bytes),\n    percent: `${Math.round(q.percent_used)}%`,\n  });\n});\n\n/* ── start page ──────────────────────────────────────────────────────────\n * Reader: the admin app's router — the `/` front door and the already-signed-in\n * /login bounce both ask its lib/startPage which route to open. Owner's\n * decision, 2026-09-12: selectable rather than one landing forced on everyone.\n * A surface with no front door (the desktop app) passes no `startPage`. */\n\nconst startPage = ref<string | null>(null);\n\nfunction pickStartPage(v: string) {\n  startPage.value = v;\n  props.host.startPage?.set(v);\n}\n\n/* ── notifications ───────────────────────────────────────────────────────\n * In-app + per-event mutes → GET/PATCH /api/notifications/settings, a\n * per-user endpoint every account may call (routes.go, outside the admin\n * block). The mutes gate the READ: notify/service.go bellPrefs feeds them to\n * ListNotifications and UnreadNotificationCount.\n * Browser notifications → the host (the admin app's lib/browserNotify, the\n * same module the bell's watcher calls before it raises a toast). */\n\nconst permission = ref<BrowserNotifyPermission>('unsupported');\nconst browserOn = ref(true);\nconst savingNotif = ref(false);\nconst notifPrefs = ref<SettingsNotificationPrefs | null>(null);\n\nconst inAppOn = computed(() => notifPrefs.value?.in_app_enabled !== false);\nconst mutedEvents = computed<string[]>(() => notifPrefs.value?.muted_events ?? []);\n// The events that can happen on this instance: the SERVER's answer\n// (`capabilities.event_off`, #211 audit B16) - a switch for virus hits with\n// scanning off, for the escrow key where there is none, or for encryption\n// requests where the policy asks for no approval, is a promise the product\n// cannot keep. ⚠ The same split as every \"needs a service\" entry\n// (lib/serviceGate): whoever could switch it on (`fixable`, the server's\n// verdict on THIS caller - the instance's administrator for a service, the\n// tenant's own for the encryption policy) sees it greyed with the server's\n// sentence (QA #39); everybody else is not offered it at all.\nconst offeredEvents = computed(() => {\n  const offs = props.host.capabilities?.event_off ?? {};\n  return WEBHOOK_EVENTS.map((ev) => {\n    const off = offs[ev] ?? null;\n    const gate = gateOnService(off === null, off?.fixable === true, off?.text ?? '');\n    return { ev, off, gate };\n  }).filter((row) => !row.gate.hidden);\n});\n\nasync function patchSettings(inApp: boolean, muted: string[], urgent?: Record<string, boolean>) {\n  savingNotif.value = true;\n  try {\n    // ⚠ PATCH replaces the WHOLE preference — sending one half clears the\n    // other (docs/NOTIFICATIONS.md → Per-user settings). The urgent choices\n    // are the exception: left out, they are kept, and they are sent only when\n    // one of them changes (lib/userSettingsHost SettingsNotificationPrefs).\n    const prefs = urgent\n      ? { in_app_enabled: inApp, muted_events: muted, urgent_overrides: urgent }\n      : { in_app_enabled: inApp, muted_events: muted };\n    const next = await props.host.api.updateNotificationSettings(prefs);\n    notifPrefs.value = next ?? { ...(notifPrefs.value ?? {}), ...prefs };\n    props.host.toast('success', t('notifications.prefs.saved'));\n  } catch (e: unknown) {\n    props.host.toast('error', props.host.errorText(e, t('errors.generic')));\n  } finally {\n    savingNotif.value = false;\n  }\n}\n\n/* ── the digest (backend notify/digest.go) ─────────────────────────────\n * A kind marked URGENT reaches the person at once; every other kind is held\n * for the window an administrator set and arrives in one summary, folder by\n * folder. The server says which kinds are urgent for this person (their own\n * choices over the administrator's defaults); a switch moved back to the\n * default drops the person's own choice, so a later change of the default\n * reaches them. No digest (an older server, or the digest off): no switches. */\nconst digest = computed(() => notifPrefs.value?.digest ?? null);\nconst urgentSet = computed(() => new Set(digest.value?.urgent_events ?? []));\nconst adminEvents = computed(() => digest.value?.admin_events ?? []);\nconst adminUrgent = computed(\n  () => adminEvents.value.length > 0 && adminEvents.value.every((e) => urgentSet.value.has(e)),\n);\n/** Is any kind held for this person? Out of the box none is - every kind is\n *  urgent - and then the pane says how to hold one rather than how long a\n *  held one waits. */\nconst anyHeld = computed(() => {\n  const d = digest.value;\n  return !!d && d.events.some((e) => !urgentSet.value.has(e));\n});\n\n/** Does this kind get an urgent switch? Not the digest itself: it is what\n *  tells the held ones. */\nfunction hasUrgentSwitch(event: string): boolean {\n  return !!digest.value && event !== DIGEST_EVENT && digest.value.events.includes(event);\n}\n\nfunction setUrgent(events: string[], on: boolean) {\n  const d = digest.value;\n  if (!d) return;\n  const defaults = new Set(d.default_urgent);\n  const next: Record<string, boolean> = { ...(notifPrefs.value?.urgent_overrides ?? {}) };\n  for (const ev of events) {\n    if (defaults.has(ev) === on) delete next[ev];\n    else next[ev] = on;\n  }\n  void patchSettings(inAppOn.value, mutedEvents.value, next);\n}\n\nfunction setInApp(v: boolean) {\n  void patchSettings(v, mutedEvents.value);\n}\n\n/** A switch per event, ON meaning \"tell me\". Muting is the stored half. */\nfunction setEventOn(event: string, on: boolean) {\n  const next = new Set(mutedEvents.value);\n  if (on) next.delete(event);\n  else next.add(event);\n  void patchSettings(inAppOn.value, [...next]);\n}\n\nfunction setBrowser(v: boolean) {\n  browserOn.value = v;\n  props.host.browserNotifications?.setEnabled(v);\n}\n\n/** ⚠ From a click and from nowhere else — see the admin app's lib/browserNotify. */\nasync function askPermission() {\n  const b = props.host.browserNotifications;\n  if (!b) return;\n  permission.value = await b.ask();\n  if (permission.value === 'granted') setBrowser(true);\n}\n\n/* ── push notifications on this device (#191, lib/webPush) ─────────────\n * The host's row: the web app, which runs filex's own service worker. What a\n * push says and when is the server's (it reads the person's bell); this row\n * only turns THIS browser on or off, lists the person's devices and sends a\n * test. ⚠ `togglePush` is the click handler and calls `enable()` with nothing\n * awaited before it: iOS asks for the permission only from the tap itself. */\nconst pushState = ref<WebPushState | null>(null);\nconst pushBusy = ref(false);\nconst pushOn = computed(() => pushState.value?.on === true);\nconst pushDevices = computed<WebPushDevice[]>(() => pushState.value?.status?.devices ?? []);\n/** The switch moves only where this browser can be turned on or off here. */\nconst pushCanSwitch = computed(() => {\n  const st = pushState.value;\n  if (!st || !st.supported || !st.status?.available) return false;\n  return st.permission !== 'denied' || pushOn.value;\n});\n/** The chip beside the switch: why it cannot move, or that it is on. */\nconst pushChip = computed<{ text: string; tone: '' | 'ok' | 'bad' } | null>(() => {\n  const st = pushState.value;\n  if (!st) return null;\n  if (!st.supported) return { text: t('notifications.prefs.pushUnsupported'), tone: '' };\n  if (!st.status?.available) return { text: t('notifications.prefs.pushUnavailable'), tone: '' };\n  if (st.on) return { text: t('notifications.prefs.pushOn'), tone: 'ok' };\n  if (st.permission === 'denied') return { text: t('notifications.prefs.permDenied'), tone: 'bad' };\n  return null;\n});\n/** The line under it: what to do about it, for the one who can. */\nconst pushWhy = computed(() => {\n  const st = pushState.value;\n  if (!st) return '';\n  if (!st.supported) return props.host.installApp?.state === 'ios' ? t('notifications.prefs.iosHomeScreen') : '';\n  if (!st.status?.available) {\n    if (!props.host.isAdmin) return '';\n    if (st.status?.reason === 'no_secret_key') return t('notifications.prefs.pushNoSecretKey');\n    if (st.status?.reason === 'key_unreadable') return t('notifications.prefs.pushKeyUnreadable');\n    if (st.status?.reason === 'disabled') return t('notifications.prefs.pushDisabled');\n    return '';\n  }\n  if (st.permission === 'denied' && !st.on) return t('notifications.prefs.permDeniedHint');\n  return '';\n});\n\nasync function loadPush() {\n  const p = props.host.webPush;\n  if (!p) return;\n  try {\n    pushState.value = await p.state();\n  } catch {\n    pushState.value = null;\n  }\n}\n\n/** ⚠ From the click and from nowhere else (see the note above). */\nasync function togglePush() {\n  const p = props.host.webPush;\n  if (!p || pushBusy.value) return;\n  const want = !pushOn.value;\n  pushBusy.value = true;\n  try {\n    pushState.value = want ? await p.enable() : await p.disable();\n    if (want && !pushState.value.on && pushState.value.permission === 'granted') {\n      props.host.toast('error', t('notifications.prefs.pushFailed'));\n    }\n  } catch {\n    props.host.toast('error', t('notifications.prefs.pushFailed'));\n    await loadPush();\n  } finally {\n    pushBusy.value = false;\n  }\n}\n\nasync function testPush() {\n  const p = props.host.webPush;\n  if (!p || pushBusy.value) return;\n  pushBusy.value = true;\n  try {\n    const res = await p.test();\n    if (res.sent > 0) props.host.toast('success', t('notifications.prefs.pushTestSent', { count: res.sent }));\n    else props.host.toast('warn', t('notifications.prefs.pushTestNone'));\n  } catch (e: unknown) {\n    props.host.toast('error', props.host.errorText(e, t('errors.generic')));\n  } finally {\n    pushBusy.value = false;\n  }\n}\n\nasync function removePushDevice(id: number) {\n  const p = props.host.webPush;\n  if (!p || pushBusy.value) return;\n  pushBusy.value = true;\n  try {\n    pushState.value = await p.remove(id);\n  } catch (e: unknown) {\n    props.host.toast('error', props.host.errorText(e, t('errors.generic')));\n  } finally {\n    pushBusy.value = false;\n  }\n}\n\n/** When a device subscribed, in the reader's language. */\nfunction pushAdded(d: WebPushDevice): string {\n  const at = new Date(d.created_at);\n  if (Number.isNaN(at.getTime())) return '';\n  return t('notifications.prefs.pushAdded', { date: formatInstant(at, currentLocale.value, { dateStyle: 'medium' }) });\n}\n\n/* ── installing the web app (task #190) ─────────────────────────────────\n * The host's row: a phone or a tablet in a browser (lib/userSettingsHost\n * `installApp`). The reminder on the file list says it once; this is where it\n * stays after that reminder is closed for good. */\nconst installingApp = ref(false);\n\n/** The browser's own install dialog. ⚠ From the click and from nowhere else:\n *  a browser opens it only in answer to a gesture. */\nasync function installApp() {\n  const a = props.host.installApp;\n  if (!a || installingApp.value) return;\n  installingApp.value = true;\n  try {\n    await a.install();\n  } finally {\n    installingApp.value = false;\n  }\n}\n\n/* ── security ────────────────────────────────────────────────────────────\n * Password → POST /api/auth/password. TOTP → POST /api/auth/totp/{enroll,\n * verify,disable}. Nothing else on this pane, because nothing else has an\n * endpoint (see the header note on active sessions). */\n\nconst currentPassword = ref('');\nconst newPassword = ref('');\nconst newPasswordConfirm = ref('');\nconst savingPassword = ref(false);\n\nasync function changePassword() {\n  if (newPassword.value !== newPasswordConfirm.value) {\n    props.host.toast('warn', t('errors.validationFailed'));\n    return;\n  }\n  savingPassword.value = true;\n  try {\n    await props.host.api.changePassword(currentPassword.value, newPassword.value);\n    currentPassword.value = '';\n    newPassword.value = '';\n    newPasswordConfirm.value = '';\n    props.host.toast('success', t('profile.passwordChanged'));\n  } catch (e: unknown) {\n    props.host.toast('error', props.host.errorText(e, t('errors.generic')));\n  } finally {\n    savingPassword.value = false;\n  }\n}\n\nconst totpEnabled = computed(() => props.host.user?.totp_enabled ?? false);\nconst totpStage = ref<'idle' | 'enroll' | 'disable'>('idle');\nconst totpQr = ref('');\nconst totpSecret = ref('');\n// The server generates ten codes, stores them against the pending secret and\n// returns them ONCE. Not rendering them means the user has ten valid codes\n// nobody ever showed them.\nconst totpRecoveryCodes = ref<string[]>([]);\nconst totpCode = ref('');\nconst totpBusy = ref(false);\n\nfunction setTotpEnabled(on: boolean) {\n  const u = props.host.user;\n  if (u) props.host.setUser({ ...u, totp_enabled: on });\n}\n\nasync function startTotp() {\n  totpBusy.value = true;\n  try {\n    const res = await props.host.api.enrollTotp();\n    totpSecret.value = res.secret;\n    totpQr.value = res.qr_svg;\n    totpRecoveryCodes.value = res.recovery_codes ?? [];\n    totpStage.value = 'enroll';\n  } catch (e: unknown) {\n    props.host.toast('error', props.host.errorText(e, t('errors.generic')));\n  } finally {\n    totpBusy.value = false;\n  }\n}\n\nasync function verifyTotp() {\n  totpBusy.value = true;\n  try {\n    await props.host.api.verifyTotp(totpCode.value);\n    setTotpEnabled(true);\n    resetTotp();\n    props.host.toast('success', t('userSettings.security.totpEnabled'));\n  } catch (e: unknown) {\n    props.host.toast('error', props.host.errorText(e, t('errors.generic')));\n  } finally {\n    totpBusy.value = false;\n  }\n}\n\nasync function disableTotp() {\n  totpBusy.value = true;\n  try {\n    await props.host.api.disableTotp(totpCode.value);\n    setTotpEnabled(false);\n    resetTotp();\n    props.host.toast('success', t('userSettings.security.totpDisabled'));\n  } catch (e: unknown) {\n    props.host.toast('error', props.host.errorText(e, t('errors.generic')));\n  } finally {\n    totpBusy.value = false;\n  }\n}\n\nfunction resetTotp() {\n  totpStage.value = 'idle';\n  totpQr.value = '';\n  totpSecret.value = '';\n  totpRecoveryCodes.value = [];\n  totpCode.value = '';\n}\n\n/* ── open / close ────────────────────────────────────────────────────── */\n\nfunction sync(open: boolean) {\n  if (open) {\n    const h = props.host;\n    hydrateProfile();\n    theme.value = h.mode.get();\n    density.value = getDensity();\n    openTrigger.value = h.openTrigger?.get() ?? 'double';\n    timeZone.value = h.zone.get();\n    startPage.value = h.startPage?.get() ?? null;\n    refreshTzNow();\n    permission.value = h.browserNotifications?.permission() ?? 'unsupported';\n    browserOn.value = h.browserNotifications?.enabled() ?? false;\n    void loadPush();\n    resetTotp();\n    // Both are best-effort: a dialog that will not open because one GET\n    // failed is worse than a pane that says nothing.\n    h.api\n      .notificationSettings()\n      .then((p) => (notifPrefs.value = p))\n      .catch(() => {});\n    h.api\n      .quota()\n      .then((q) => (quota.value = q))\n      .catch(() => (quota.value = null));\n    loadVaultIdle();\n  }\n}\n\n// `onMounted` AND the watch: the hosts mount this lazily (`v-if`), so the very\n// first value the component ever sees is already `true`, and it has to load\n// then as it does on every later opening.\nonMounted(() => {\n  sync(props.modelValue);\n  // The zone readout is a clock; a clock that does not move is a screenshot.\n  // One second is the unit it prints, so one second is what it ticks on.\n  refreshTzNow();\n  tzTimer = setInterval(refreshTzNow, 1000);\n});\nwatch(() => props.modelValue, sync, { flush: 'post' });\n\nonBeforeUnmount(() => {\n  if (tzTimer) clearInterval(tzTimer);\n});\n\n/** Whether the footer shows Cancel + Save rather than a single way out.\n *  Profile is the only tab that stages anything, and the demo account cannot\n *  save at all — on both of those \"Cancel\" would name a discard that is not\n *  happening. */\nconst profileSaveVisible = computed(() => section.value === 'profile' && !props.host.demoReadOnly);\n\n</script>\n\n<template>\n  <!-- ⚠⚠ Core's Modal (bare), NOT a native <dialog>. showModal() put this\n       dialog in the browser's top layer, above every z-index, and made the\n       rest of the page inert: in the desktop app — a frameless window whose\n       title bar is page content — minimise, maximise and close lay under the\n       backdrop, and their first click closed the dialog (owner, 2026-09-27:\n       the title bar works ALWAYS). Modal draws its backdrop from\n       `--fe-overlay-top` down, and brings Escape, a click outside, the focus\n       trap, the focus going home and `aria-modal` — the same frame every\n       other dialog of the explorer has. -->\n  <Modal\n    :open=\"modelValue\"\n    bare\n    :labelledby=\"headingId\"\n    :locale=\"host.locale\"\n    @close=\"close\"\n  >\n    <div class=\"fe fx-us\" role=\"document\" data-testid=\"user-settings-dialog\">\n      <!-- ── the modal's own head ─────────────────────────────────────\n           One bar across the FULL width — who you are, what this dialog is,\n           and the way out — with the rail starting underneath it. The rail\n           used to carry a \"SETTINGS\" caption of its own and the close button\n           sat inside the right-hand pane, which read as two dialogs side by\n           side rather than one. -->\n      <header class=\"fx-us__head\">\n        <img v-if=\"avatarUrl\" :src=\"avatarUrl\" alt=\"\" class=\"fx-us__head-avatar\" />\n        <span v-else class=\"fx-us__head-avatar fx-us__head-avatar--initial\" aria-hidden=\"true\">\n          {{ avatarInitial }}\n        </span>\n        <div class=\"fx-us__head-text\">\n          <h2 :id=\"headingId\" class=\"fx-us__title\">{{ t('userSettings.heading') }}</h2>\n          <p class=\"fx-us__subtitle\">{{ t('userSettings.headingSub') }}</p>\n        </div>\n        <!-- Which filex this is — at the end of the head, before the way out,\n             quiet: the same piece the account menus draw (the maintainer, 2026-09-24).\n             Nothing is drawn while the server's answer is not in. -->\n        <ProductVersion :version=\"host.capabilities?.release\" class=\"fx-us__version\" />\n        <button\n          type=\"button\"\n          class=\"fx-us__icon-btn\"\n          :aria-label=\"t('common.close')\"\n          data-testid=\"user-settings-close\"\n          @click=\"close\"\n        >\n          <X class=\"fx-us__rail-icon\" aria-hidden=\"true\" />\n        </button>\n      </header>\n\n      <!-- ── rail ─────────────────────────────────────────────────── -->\n      <nav class=\"fx-us__rail\" :aria-label=\"t('userSettings.title')\">\n        <button\n          v-for=\"s in sections\"\n          :key=\"s.key\"\n          type=\"button\"\n          class=\"fx-us__rail-item\"\n          :class=\"{ 'is-active': section === s.key }\"\n          :aria-current=\"section === s.key ? 'page' : undefined\"\n          :data-testid=\"`user-settings-tab-${s.key}`\"\n          @click=\"section = s.key\"\n        >\n          <component :is=\"s.icon\" class=\"fx-us__rail-icon\" aria-hidden=\"true\" />\n          <span class=\"fx-us__rail-label\">{{ t(`userSettings.tabs.${s.key}`) }}</span>\n          <span v-if=\"s.soon\" class=\"fx-us__rail-soon\">{{ t('userSettings.ai.soon') }}</span>\n        </button>\n      </nav>\n\n      <!-- ── pane ─────────────────────────────────────────────────── -->\n      <div class=\"fx-us__main\">\n        <div class=\"fx-us__body\">\n          <div class=\"fx-us__panehead\">\n            <h3 class=\"fx-us__panetitle\">{{ t(`userSettings.tabs.${section}`) }}</h3>\n            <p class=\"fx-us__subtitle\">{{ t(`userSettings.subtitle.${section}`) }}</p>\n          </div>\n          <!-- ── Profile ────────────────────────────────────────── -->\n          <section v-if=\"section === 'profile'\" class=\"fx-us__pane\" data-testid=\"user-settings-profile\">\n            <!-- Who this account IS, in one row: the picture, the identity\n                 the rest of the product shows you by, whether you are an\n                 admin, and the one button that changes the picture. The\n                 badge is read off `host.isAdmin` (the account's real role),\n                 not decoration. -->\n            <div class=\"fx-us__identity\">\n              <img v-if=\"avatarUrl\" :src=\"avatarUrl\" :alt=\"t('profile.avatar.label')\" class=\"fx-us__avatar\" />\n              <span v-else class=\"fx-us__avatar fx-us__avatar--initial\" aria-hidden=\"true\">\n                {{ avatarInitial }}\n              </span>\n              <div class=\"fx-us__identity-text\">\n                <p class=\"fx-us__identity-name\">\n                  <span class=\"fx-us__identity-who\">{{ personName({ display_name: displayName, username, email }) }}</span>\n                  <span v-if=\"host.isAdmin\" class=\"fx-us__badge\">{{ t('userSettings.adminBadge') }}</span>\n                </p>\n                <p class=\"fx-us__identity-sub\">{{ email }}</p>\n              </div>\n              <button\n                type=\"button\"\n                class=\"fx-us__btn fx-us__identity-change\"\n                :disabled=\"host.demoReadOnly\"\n                @click=\"avatarInput?.click()\"\n              >\n                {{ t('profile.avatar.change') }}\n              </button>\n              <button\n                v-if=\"avatarUrl\"\n                type=\"button\"\n                class=\"fx-us__btn fx-us__btn--quiet\"\n                :disabled=\"host.demoReadOnly\"\n                @click=\"avatarUrl = ''\"\n              >\n                {{ t('common.remove') }}\n              </button>\n              <input\n                ref=\"avatarInput\"\n                type=\"file\"\n                accept=\"image/*\"\n                class=\"fx-us__file\"\n                @change=\"onAvatarFile\"\n              />\n            </div>\n            <p class=\"fx-us__hint\">{{ t('profile.avatar.help') }}</p>\n            <p v-if=\"avatarError\" class=\"fx-us__hint fx-us__hint--bad\">{{ avatarError }}</p>\n\n            <div class=\"fx-us__grid\">\n              <label class=\"fx-us__field\">\n                <span class=\"fx-us__label\">{{ t('users.fields.displayName') }}</span>\n                <input v-model=\"displayName\" class=\"fx-us__input\" :disabled=\"host.demoReadOnly\" />\n              </label>\n              <label class=\"fx-us__field\">\n                <span class=\"fx-us__label\">\n                  {{ t('common.email') }}\n                  <span class=\"fx-us__required\" aria-hidden=\"true\">*</span>\n                </span>\n                <input\n                  v-model=\"email\"\n                  type=\"email\"\n                  class=\"fx-us__input\"\n                  :class=\"{ 'is-invalid': emailError }\"\n                  autocomplete=\"email\"\n                  required\n                  :aria-invalid=\"emailError ? 'true' : undefined\"\n                  :disabled=\"host.demoReadOnly\"\n                  data-testid=\"profile-email\"\n                />\n                <span v-if=\"emailError\" class=\"fx-us__hint fx-us__hint--bad\" role=\"alert\" data-testid=\"profile-email-error\">\n                  {{ emailError }}\n                </span>\n              </label>\n            </div>\n\n            <label class=\"fx-us__field\">\n              <span class=\"fx-us__label\">\n                {{ t('profile.username.label') }}\n                <span class=\"fx-us__required\" aria-hidden=\"true\">*</span>\n              </span>\n              <input\n                v-model=\"username\"\n                class=\"fx-us__input\"\n                :class=\"{ 'is-invalid': usernameError }\"\n                autocomplete=\"username\"\n                required\n                :aria-invalid=\"usernameError ? 'true' : undefined\"\n                :disabled=\"host.demoReadOnly\"\n                data-testid=\"profile-username\"\n              />\n              <span v-if=\"usernameError\" class=\"fx-us__hint fx-us__hint--bad\" role=\"alert\" data-testid=\"profile-username-error\">\n                {{ usernameError }}\n              </span>\n              <span v-else class=\"fx-us__hint\">{{ t('profile.username.helpText') }}</span>\n            </label>\n\n            <p v-if=\"host.demoReadOnly\" class=\"fx-us__note\">{{ t('userSettings.demoReadOnly') }}</p>\n          </section>\n\n          <!-- ── Preferences ────────────────────────────────────── -->\n          <section\n            v-else-if=\"section === 'preferences'\"\n            class=\"fx-us__pane\"\n            data-testid=\"user-settings-preferences\"\n          >\n            <!-- ⚠ A segmented strip, not a select — the owner's call, and the\n                 shape already used by Start page and Appearance below. Two\n                 options do not earn a dropdown: a select hides half the answer\n                 behind a click and then asks for a second one. ⚠ If a third\n                 language ever ships, measure the strip before adding a fourth\n                 button — a segmented control stops being readable somewhere\n                 around four, and that is the point to go back to a select. -->\n            <div v-if=\"host.language\" class=\"fx-us__field\">\n              <span class=\"fx-us__label\">{{ t('profile.locale') }}</span>\n              <div\n                class=\"fx-us__segmented\"\n                role=\"group\"\n                :aria-label=\"t('profile.locale')\"\n                data-testid=\"user-settings-locale\"\n              >\n                <button\n                  v-for=\"o in localeOptions\"\n                  :key=\"o.value\"\n                  type=\"button\"\n                  class=\"fx-us__seg\"\n                  :class=\"{ 'is-active': currentLocale === o.value }\"\n                  :aria-pressed=\"currentLocale === o.value\"\n                  :data-testid=\"`user-settings-locale-${o.value}`\"\n                  @click=\"pickLocale(o.value)\"\n                >\n                  {{ o.label }}\n                </button>\n              </div>\n              <span class=\"fx-us__hint\">{{ t('userSettings.prefs.languageHint') }}</span>\n            </div>\n\n            <!-- ── time zone ─────────────────────────────\n                 core's TimeZonePicker — the same combobox the embed's own\n                 \"⋯ → Time zone\" dialog mounts. What a pick WRITES is this\n                 modal's business (`pickTimeZone`: the account, and this\n                 browser's copy of it); the control is shared. -->\n            <div class=\"fx-us__field\">\n              <label class=\"fx-us__label\" :for=\"tzInputId\">\n                {{ t('userSettings.prefs.timezone') }}\n              </label>\n              <TimeZonePicker\n                data-testid=\"user-settings-timezone\"\n                testid=\"user-settings-tz\"\n                :input-id=\"tzInputId\"\n                :locale=\"currentLocale\"\n                :model-value=\"timeZone\"\n                :fallback=\"tzFallback\"\n                :label=\"t('userSettings.prefs.timezone')\"\n                :disabled=\"savingTz\"\n                @update:model-value=\"pickTimeZone\"\n              />\n              <span class=\"fx-us__hint\">\n                {{ t('userSettings.prefs.timezoneHint') }}\n              </span>\n              <span class=\"fx-us__readout\" data-testid=\"user-settings-tz-now\">\n                {{ t('userSettings.prefs.timezoneNow', { zone: tzInForce, time: tzNow }) }}\n              </span>\n            </div>\n\n            <div v-if=\"host.startPage\" class=\"fx-us__field\">\n              <span class=\"fx-us__label\">{{ t('userSettings.prefs.startPage') }}</span>\n              <div\n                class=\"fx-us__segmented\"\n                role=\"group\"\n                :aria-label=\"t('userSettings.prefs.startPage')\"\n              >\n                <button\n                  v-for=\"o in host.startPage.options\"\n                  :key=\"o\"\n                  type=\"button\"\n                  class=\"fx-us__seg\"\n                  :class=\"{ 'is-active': startPage === o }\"\n                  :aria-pressed=\"startPage === o\"\n                  :data-testid=\"`user-settings-start-${o}`\"\n                  @click=\"pickStartPage(o)\"\n                >\n                  {{ t(`userSettings.prefs.startPage_${o}`) }}\n                </button>\n              </div>\n              <span class=\"fx-us__hint\">{{ t('userSettings.prefs.startPageHint') }}</span>\n            </div>\n\n            <!-- Appearance: two axes, one heading. The strip answers WHICH\n                 VARIANT paints, the grid answers WHICH COLOURS it is made of,\n                 and they compose — so they are drawn as two labelled rows of\n                 one group rather than as two controls that look alike. -->\n            <div class=\"fx-us__group\" data-testid=\"user-settings-appearance\">\n              <span class=\"fx-us__group-title\">{{ t('userSettings.prefs.appearance') }}</span>\n\n              <div class=\"fx-us__field\">\n                <span class=\"fx-us__label\">{{ t('userSettings.prefs.mode') }}</span>\n                <div class=\"fx-us__segmented\" role=\"group\" :aria-label=\"t('userSettings.prefs.mode')\">\n                  <button\n                    v-for=\"o in themeOptions\"\n                    :key=\"o.value\"\n                    type=\"button\"\n                    class=\"fx-us__seg\"\n                    :class=\"{ 'is-active': theme === o.value }\"\n                    :aria-pressed=\"theme === o.value\"\n                    :data-testid=\"`user-settings-theme-${o.value}`\"\n                    @click=\"pickTheme(o.value)\"\n                  >\n                    {{ t(o.label) }}\n                  </button>\n                </div>\n                <span class=\"fx-us__hint\">{{ t('userSettings.prefs.modeHint') }}</span>\n              </div>\n\n              <div class=\"fx-us__field\">\n                <span class=\"fx-us__label\">{{ t('userSettings.prefs.palette') }}</span>\n                <ThemePalette\n                  :locale=\"currentLocale\"\n                  :dark=\"resolvedDark\"\n                  :current=\"paletteId\"\n                  :hint=\"false\"\n                  @select=\"pickPalette\"\n                />\n                <span class=\"fx-us__hint\">{{ t('userSettings.prefs.paletteHint') }}</span>\n              </div>\n            </div>\n\n            <div class=\"fx-us__switch-row\">\n              <button\n                type=\"button\"\n                role=\"switch\"\n                class=\"fx-us__switch\"\n                :class=\"{ 'is-on': density === 'compact' }\"\n                :aria-checked=\"density === 'compact'\"\n                data-testid=\"user-settings-density\"\n                @click=\"pickDensity(density !== 'compact')\"\n              >\n                <span class=\"fx-us__switch-knob\" />\n              </button>\n              <div class=\"fx-us__switch-text\">\n                <span class=\"fx-us__label\">{{ t('userSettings.prefs.compact') }}</span>\n                <span class=\"fx-us__hint\">{{ t('userSettings.prefs.compactHint') }}</span>\n              </div>\n            </div>\n\n            <!-- tablo:t3 — the default folder view. Every choice has an\n                 \"inherit\" option that NAMES what it inherits, because the\n                 operator's default can change underneath a person who never\n                 picked one, and they should be able to see that it did. -->\n            <div class=\"fx-us__field\" data-testid=\"user-settings-folder-view\">\n              <span class=\"fx-us__label\">{{ t('userSettings.prefs.folderView') }}</span>\n              <span class=\"fx-us__hint\">{{ t('userSettings.prefs.folderViewHint') }}</span>\n\n              <span class=\"fx-us__label fx-us__label--sub\">{{ t('userSettings.prefs.fvMode') }}</span>\n              <div class=\"fx-us__segmented\" role=\"group\" :aria-label=\"t('userSettings.prefs.fvMode')\">\n                <button\n                  type=\"button\"\n                  class=\"fx-us__seg\"\n                  :class=\"{ 'is-active': !fvPerson.v }\"\n                  :aria-pressed=\"!fvPerson.v\"\n                  data-testid=\"user-settings-fv-view-inherit\"\n                  @click=\"pickFolderView('')\"\n                >\n                  {{ t('userSettings.prefs.fvInherit', { value: t(`userSettings.prefs.fvView_${fvInheritView}`) }) }}\n                </button>\n                <button\n                  v-for=\"v in FV_VIEWS\"\n                  :key=\"v\"\n                  type=\"button\"\n                  class=\"fx-us__seg\"\n                  :class=\"{ 'is-active': fvPerson.v === v }\"\n                  :aria-pressed=\"fvPerson.v === v\"\n                  :data-testid=\"`user-settings-fv-view-${v}`\"\n                  @click=\"pickFolderView(v)\"\n                >\n                  {{ t(`userSettings.prefs.fvView_${v}`) }}\n                </button>\n              </div>\n\n              <span class=\"fx-us__label fx-us__label--sub\">{{ t('userSettings.prefs.fvSort') }}</span>\n              <div class=\"fx-us__segmented\" role=\"group\" :aria-label=\"t('userSettings.prefs.fvSort')\">\n                <button\n                  type=\"button\"\n                  class=\"fx-us__seg\"\n                  :class=\"{ 'is-active': !fvPerson.k }\"\n                  :aria-pressed=\"!fvPerson.k\"\n                  data-testid=\"user-settings-fv-sort-inherit\"\n                  @click=\"pickFolderSort('')\"\n                >\n                  {{ t('userSettings.prefs.fvInherit', { value: fvInheritSort }) }}\n                </button>\n                <button\n                  v-for=\"k in FV_SORTS\"\n                  :key=\"k\"\n                  type=\"button\"\n                  class=\"fx-us__seg\"\n                  :class=\"{ 'is-active': fvPerson.k === k }\"\n                  :aria-pressed=\"fvPerson.k === k\"\n                  :data-testid=\"`user-settings-fv-sort-${k}`\"\n                  @click=\"pickFolderSort(k)\"\n                >\n                  {{ t(`userSettings.prefs.fvSort_${k}`) }}\n                </button>\n              </div>\n              <div\n                v-if=\"fvPerson.k\"\n                class=\"fx-us__segmented\"\n                role=\"group\"\n                :aria-label=\"t('userSettings.prefs.fvDir')\"\n              >\n                <button\n                  v-for=\"d in (['asc', 'desc'] as const)\"\n                  :key=\"d\"\n                  type=\"button\"\n                  class=\"fx-us__seg\"\n                  :class=\"{ 'is-active': (fvPerson.d ?? (fvPerson.k === 'modified' ? 'desc' : 'asc')) === d }\"\n                  :aria-pressed=\"(fvPerson.d ?? (fvPerson.k === 'modified' ? 'desc' : 'asc')) === d\"\n                  :data-testid=\"`user-settings-fv-dir-${d}`\"\n                  @click=\"pickFolderDir(d)\"\n                >\n                  {{ t(`userSettings.prefs.fvDir_${d}`) }}\n                </button>\n              </div>\n\n              <span v-if=\"fvPerson.c\" class=\"fx-us__hint\">\n                {{ t('userSettings.prefs.fvColumns') }}\n                <button type=\"button\" class=\"fx-us__link\" data-testid=\"user-settings-fv-columns-reset\" @click=\"resetDefaultColumns\">\n                  {{ t('userSettings.prefs.fvColumnsReset') }}\n                </button>\n              </span>\n              <span v-if=\"fvFoldersKept > 0\" class=\"fx-us__hint\">\n                {{ t('userSettings.prefs.fvKeptCount', { count: fvFoldersKept }) }}\n                <button type=\"button\" class=\"fx-us__link\" data-testid=\"user-settings-fv-forget\" @click=\"forgetAllFolders()\">\n                  {{ t('userSettings.prefs.fvForget') }}\n                </button>\n              </span>\n            </div>\n\n            <div v-if=\"host.openTrigger\" class=\"fx-us__field\">\n              <span class=\"fx-us__label\">{{ t('userSettings.prefs.openTrigger') }}</span>\n              <div class=\"fx-us__segmented\" role=\"group\" :aria-label=\"t('userSettings.prefs.openTrigger')\">\n                <button\n                  v-for=\"o in openTriggerOptions\"\n                  :key=\"o.value\"\n                  type=\"button\"\n                  class=\"fx-us__seg\"\n                  :class=\"{ 'is-active': openTrigger === o.value }\"\n                  :aria-pressed=\"openTrigger === o.value\"\n                  :data-testid=\"`user-settings-opentrigger-${o.value}`\"\n                  @click=\"pickOpenTrigger(o.value)\"\n                >\n                  {{ t(o.label) }}\n                </button>\n              </div>\n              <span class=\"fx-us__hint\">{{ t('userSettings.prefs.openTriggerHint') }}</span>\n            </div>\n\n            <!-- wiring:e2 vault - the person's idle time for a vault's write\n                 lock (1-10 minutes): ten answers, so a list, not a strip. -->\n            <div v-if=\"vaultIdleShown\" class=\"fx-us__field\" data-testid=\"user-settings-vault-idle\">\n              <span id=\"fx-us-vault-idle-label\" class=\"fx-us__label\">{{ t('userSettings.vault.idle') }}</span>\n              <ChoiceSelect\n                :model-value=\"vaultIdle\"\n                :options=\"vaultIdleOptions\"\n                :disabled=\"vaultIdleBusy || host.demoReadOnly\"\n                aria-labelledby=\"fx-us-vault-idle-label\"\n                testid=\"user-settings-vault-idle-select\"\n                @update:model-value=\"(v) => pickVaultIdle(Number(v))\"\n              />\n              <span class=\"fx-us__hint\">{{ t('userSettings.vault.idle_help') }}</span>\n            </div>\n\n            <!-- The downloads, permanently. The corner reminder is dismissible\n                 for good; this is where it goes on living. -->\n            <div\n              v-if=\"host.desktopApp?.platform\"\n              class=\"fx-us__group\"\n              data-testid=\"user-settings-desktop-app\"\n            >\n              <span class=\"fx-us__group-title\">{{ t('userSettings.prefs.desktopApp') }}</span>\n              <p class=\"fx-us__readout\">\n                {{ t('install.desktopSubtitle', { platform: host.desktopApp.platformLabel }) }}\n              </p>\n              <div class=\"fx-us__dl-list\">\n                <!-- The file for this machine's processor, and under it the\n                     same file for the other one: two links, so the row is a\n                     box holding both (a link inside a link is not HTML). -->\n                <div\n                  v-for=\"d in host.desktopApp.downloads\"\n                  :key=\"d.href\"\n                  class=\"fx-us__dl\"\n                  :data-arch=\"d.arch\"\n                >\n                  <a\n                    :href=\"d.href\"\n                    class=\"fx-us__dl-main\"\n                    data-testid=\"user-settings-desktop-download\"\n                  >\n                    <span class=\"fx-us__dl-text\">\n                      <span class=\"fx-us__label\">{{ d.label }}</span>\n                      <span class=\"fx-us__hint\">{{ d.hint }}</span>\n                    </span>\n                    <span aria-hidden=\"true\" class=\"fx-us__dl-arrow\">↓</span>\n                  </a>\n                  <a\n                    v-if=\"d.other\"\n                    :href=\"d.other.href\"\n                    class=\"fx-us__dl-other\"\n                    :data-arch=\"d.other.arch\"\n                    data-testid=\"user-settings-desktop-download-other\"\n                  >\n                    {{ d.other.label }}\n                  </a>\n                </div>\n              </div>\n              <a\n                :href=\"host.desktopApp.releasesUrl\"\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n                class=\"fx-us__dl-all\"\n              >\n                {{ t('install.desktopAllDownloads') }}\n              </a>\n              <span class=\"fx-us__hint\">{{ t('userSettings.prefs.desktopAppHint') }}</span>\n            </div>\n\n            <!-- The web app itself, installed on a phone or a tablet (#190) -\n                 the same permanent home the desktop downloads have above. -->\n            <div\n              v-if=\"host.installApp?.state\"\n              class=\"fx-us__group\"\n              data-testid=\"user-settings-install-app\"\n              :data-state=\"host.installApp.state\"\n            >\n              <span class=\"fx-us__group-title\">{{ t('userSettings.prefs.installApp') }}</span>\n              <p class=\"fx-us__readout\">{{ t('userSettings.prefs.installAppLead') }}</p>\n              <div v-if=\"host.installApp.state === 'prompt'\" class=\"fx-us__install-foot\">\n                <button\n                  type=\"button\"\n                  class=\"fx-us__btn fx-us__btn--primary\"\n                  data-testid=\"user-settings-install-app-button\"\n                  :disabled=\"installingApp\"\n                  @click=\"installApp\"\n                >\n                  {{ t('install.install') }}\n                </button>\n              </div>\n              <p\n                v-else-if=\"host.installApp.state === 'ios'\"\n                class=\"fx-us__hint\"\n                data-testid=\"user-settings-install-app-ios\"\n              >\n                {{ t('install.iosInstructions') }}\n              </p>\n              <p v-else class=\"fx-us__hint\" data-testid=\"user-settings-install-app-menu\">\n                {{ t('install.menuInstructions') }}\n              </p>\n            </div>\n\n            <div class=\"fx-us__field\">\n              <span class=\"fx-us__label\">{{ t('quota.title') }}</span>\n              <p class=\"fx-us__readout\" data-testid=\"user-settings-quota\">\n                {{ quotaLine || t('common.loading') }}\n              </p>\n            </div>\n\n            <!-- ── Default apps (0.50): a part of Preferences ── -->\n            <div class=\"fx-us__field fx-us__apps-part\" data-testid=\"user-settings-apps\">\n              <span class=\"fx-us__label\">{{ t('userSettings.apps.title') }}</span>\n              <p class=\"fx-us__hint\">{{ t('userSettings.apps.lead') }}</p>\n              <p v-if=\"!appChoiceRows.length\" class=\"fx-us__apps-empty\" data-testid=\"user-settings-apps-empty\">\n                {{ t('userSettings.apps.empty') }}\n              </p>\n              <ul v-else class=\"fx-us__apps\" data-testid=\"user-settings-apps-list\">\n                <li\n                  v-for=\"row in appChoiceRows\"\n                  :key=\"row.ext\"\n                  class=\"fx-us__app\"\n                  :class=\"{ 'is-gone': !row.available }\"\n                  :data-testid=\"`user-settings-app-${row.ext}`\"\n                >\n                  <div class=\"fx-us__app-head\">\n                    <span class=\"fx-us__app-kind\" dir=\"ltr\">.{{ row.ext }}</span>\n                    <span class=\"fx-us__app-name\">{{ row.name }}</span>\n                    <button\n                      type=\"button\"\n                      class=\"fx-us__btn fx-us__btn--quiet\"\n                      :data-testid=\"`user-settings-app-reset-${row.ext}`\"\n                      @click=\"setOpenWithChoice(row.ext, null)\"\n                    >\n                      {{ t('userSettings.apps.reset') }}\n                    </button>\n                  </div>\n                  <p\n                    v-if=\"!row.available\"\n                    class=\"fx-us__app-gone\"\n                    role=\"status\"\n                    :data-testid=\"`user-settings-app-gone-${row.ext}`\"\n                  >\n                    {{ t('userSettings.apps.unavailable', { app: row.instead }) }}\n                  </p>\n                  <ChoiceButtons\n                    v-if=\"appsKnown && row.options.length > 1\"\n                    :model-value=\"row.available ? row.id : null\"\n                    :options=\"row.options\"\n                    :aria-label=\"t('userSettings.apps.change', { ext: '.' + row.ext })\"\n                    :testid-prefix=\"`user-settings-app-choice-${row.ext}`\"\n                    @update:model-value=\"(v: string | string[]) => changeAppChoice(row.ext, v)\"\n                  />\n                </li>\n              </ul>\n              <div v-if=\"appChoiceRows.length > 1\" class=\"fx-us__apps-foot\">\n                <button\n                  type=\"button\"\n                  class=\"fx-us__btn fx-us__btn--quiet\"\n                  data-testid=\"user-settings-apps-reset-all\"\n                  @click=\"clearOpenWithChoices()\"\n                >\n                  {{ t('userSettings.apps.resetAll') }}\n                </button>\n              </div>\n            </div>\n          </section>\n\n          <!-- ── Notifications ──────────────────────────────────── -->\n          <section\n            v-else-if=\"section === 'notifications'\"\n            class=\"fx-us__pane\"\n            data-testid=\"user-settings-notifications\"\n          >\n            <div class=\"fx-us__switch-row\">\n              <button\n                type=\"button\"\n                role=\"switch\"\n                class=\"fx-us__switch\"\n                :class=\"{ 'is-on': inAppOn }\"\n                :aria-checked=\"inAppOn\"\n                :disabled=\"savingNotif\"\n                data-testid=\"user-settings-inapp\"\n                @click=\"setInApp(!inAppOn)\"\n              >\n                <span class=\"fx-us__switch-knob\" />\n              </button>\n              <div class=\"fx-us__switch-text\">\n                <span class=\"fx-us__label\">{{ t('notifications.prefs.inApp') }}</span>\n                <span class=\"fx-us__hint\">{{ t('notifications.prefs.inAppHint') }}</span>\n              </div>\n            </div>\n\n            <div v-if=\"host.browserNotifications\" class=\"fx-us__switch-row\">\n              <button\n                type=\"button\"\n                role=\"switch\"\n                class=\"fx-us__switch\"\n                :class=\"{ 'is-on': browserOn }\"\n                :aria-checked=\"browserOn\"\n                :disabled=\"host.browserNotifications.desktopShell || permission === 'unsupported'\"\n                data-testid=\"user-settings-browser\"\n                @click=\"setBrowser(!browserOn)\"\n              >\n                <span class=\"fx-us__switch-knob\" />\n              </button>\n              <div class=\"fx-us__switch-text\">\n                <span class=\"fx-us__label\">{{ t('notifications.prefs.browser') }}</span>\n                <span class=\"fx-us__hint\">{{ t('notifications.prefs.browserHint') }}</span>\n                <div class=\"fx-us__chips\">\n                  <span v-if=\"host.browserNotifications.desktopShell\" class=\"fx-us__chip\">\n                    {{ t('notifications.prefs.desktopHandled') }}\n                  </span>\n                  <template v-else>\n                    <span v-if=\"permission === 'granted'\" class=\"fx-us__chip fx-us__chip--ok\">\n                      {{ t('notifications.prefs.permGranted') }}\n                    </span>\n                    <span v-else-if=\"permission === 'denied'\" class=\"fx-us__chip fx-us__chip--bad\">\n                      {{ t('notifications.prefs.permDenied') }}\n                    </span>\n                    <span v-else-if=\"permission === 'unsupported'\" class=\"fx-us__chip\">\n                      {{ t('notifications.prefs.permUnsupported') }}\n                    </span>\n                    <span v-else class=\"fx-us__chip\">{{ t('notifications.prefs.permDefault') }}</span>\n                    <button\n                      v-if=\"permission === 'default'\"\n                      type=\"button\"\n                      class=\"fx-us__btn fx-us__btn--sm\"\n                      data-testid=\"user-settings-browser-ask\"\n                      @click=\"askPermission\"\n                    >\n                      {{ t('notifications.prefs.enableBrowser') }}\n                    </button>\n                    <span v-if=\"permission === 'denied'\" class=\"fx-us__hint\">\n                      {{ t('notifications.prefs.permDeniedHint') }}\n                    </span>\n                    <!-- #190 - an iPhone's browser tab has no notifications at\n                         all; the app added to the Home Screen has them (iOS\n                         16.4+). Said here, because \"this browser cannot\" reads\n                         as \"never\" otherwise. -->\n                    <span\n                      v-if=\"permission === 'unsupported' && host.installApp?.state === 'ios'\"\n                      class=\"fx-us__hint\"\n                      data-testid=\"user-settings-browser-ios\"\n                    >\n                      {{ t('notifications.prefs.iosHomeScreen') }}\n                    </span>\n                  </template>\n                </div>\n              </div>\n            </div>\n\n            <!-- #191 - push notifications on THIS device: what the bell tells\n                 the person reaches this phone or browser while filex is\n                 closed. The host's row (lib/webPush); the server decides what\n                 is pushed, by the person's bell. -->\n            <div v-if=\"host.webPush\" class=\"fx-us__switch-row\" data-testid=\"user-settings-push-row\">\n              <button\n                type=\"button\"\n                role=\"switch\"\n                class=\"fx-us__switch\"\n                :class=\"{ 'is-on': pushOn }\"\n                :aria-checked=\"pushOn\"\n                :disabled=\"pushBusy || !pushCanSwitch\"\n                data-testid=\"user-settings-push\"\n                @click=\"togglePush\"\n              >\n                <span class=\"fx-us__switch-knob\" />\n              </button>\n              <div class=\"fx-us__switch-text\">\n                <span class=\"fx-us__label\">{{ t('notifications.prefs.push') }}</span>\n                <span class=\"fx-us__hint\">{{ t('notifications.prefs.pushHint') }}</span>\n                <div v-if=\"pushChip || pushOn\" class=\"fx-us__chips\">\n                  <span\n                    v-if=\"pushChip\"\n                    class=\"fx-us__chip\"\n                    :class=\"{ 'fx-us__chip--ok': pushChip.tone === 'ok', 'fx-us__chip--bad': pushChip.tone === 'bad' }\"\n                    data-testid=\"user-settings-push-state\"\n                  >\n                    {{ pushChip.text }}\n                  </span>\n                  <button\n                    v-if=\"pushOn\"\n                    type=\"button\"\n                    class=\"fx-us__btn fx-us__btn--sm\"\n                    :disabled=\"pushBusy\"\n                    data-testid=\"user-settings-push-test\"\n                    @click=\"testPush\"\n                  >\n                    {{ t('notifications.prefs.pushTest') }}\n                  </button>\n                </div>\n                <span v-if=\"pushWhy\" class=\"fx-us__hint\" data-testid=\"user-settings-push-why\">{{ pushWhy }}</span>\n                <div v-if=\"pushDevices.length\" class=\"fx-us__devices\" data-testid=\"user-settings-push-devices\">\n                  <span class=\"fx-us__hint\">{{ t('notifications.prefs.pushDevices') }}</span>\n                  <ul class=\"fx-us__device-list\">\n                    <li\n                      v-for=\"d in pushDevices\"\n                      :key=\"d.id\"\n                      class=\"fx-us__device\"\n                      :data-testid=\"`user-settings-push-device-${d.id}`\"\n                    >\n                      <span class=\"fx-us__device-text\">\n                        <span class=\"fx-us__device-name\">{{ d.label || d.service || t('notifications.prefs.pushUnnamed') }}</span>\n                        <span class=\"fx-us__hint\">{{ pushAdded(d) }}</span>\n                      </span>\n                      <span v-if=\"d.id === pushState?.thisDevice\" class=\"fx-us__chip fx-us__chip--ok\">\n                        {{ t('notifications.prefs.pushThisDevice') }}\n                      </span>\n                      <button\n                        type=\"button\"\n                        class=\"fx-us__btn fx-us__btn--sm\"\n                        :disabled=\"pushBusy\"\n                        :aria-label=\"t('notifications.prefs.pushRemoveLabel', { device: d.label || d.service || '' })\"\n                        :data-testid=\"`user-settings-push-remove-${d.id}`\"\n                        @click=\"removePushDevice(d.id)\"\n                      >\n                        {{ t('notifications.prefs.pushRemove') }}\n                      </button>\n                    </li>\n                  </ul>\n                </div>\n              </div>\n            </div>\n\n            <div class=\"fx-us__field\">\n              <span class=\"fx-us__label\">{{ t('userSettings.notifications.eventsTitle') }}</span>\n              <span class=\"fx-us__hint\">{{ t('userSettings.notifications.eventsHint') }}</span>\n              <span v-if=\"digest && anyHeld\" class=\"fx-us__hint\" data-testid=\"user-settings-digest-hint\">{{\n                t('userSettings.notifications.digestHint', { minutes: digest.window_minutes })\n              }}</span>\n              <span v-else-if=\"digest\" class=\"fx-us__hint\" data-testid=\"user-settings-digest-off-hint\">{{\n                t('userSettings.notifications.digestOffHint')\n              }}</span>\n              <div class=\"fx-us__events\">\n                <div\n                  v-for=\"row in offeredEvents\"\n                  :key=\"row.ev\"\n                  class=\"fx-us__switch-row\"\n                  :class=\"{ 'is-off': row.gate.disabled }\"\n                  :title=\"row.gate.title\"\n                >\n                  <button\n                    type=\"button\"\n                    role=\"switch\"\n                    class=\"fx-us__switch\"\n                    :class=\"{ 'is-on': !row.gate.disabled && !mutedEvents.includes(row.ev) }\"\n                    :aria-checked=\"!row.gate.disabled && !mutedEvents.includes(row.ev)\"\n                    :disabled=\"savingNotif || row.gate.disabled\"\n                    :data-testid=\"`user-settings-event-${row.ev}`\"\n                    @click=\"setEventOn(row.ev, mutedEvents.includes(row.ev))\"\n                  >\n                    <span class=\"fx-us__switch-knob\" />\n                  </button>\n                  <span class=\"fx-us__event-label\">\n                    {{ t(userEventKey(row.ev)) }}\n                    <span\n                      v-if=\"row.gate.disabled\"\n                      class=\"fx-us__event-off\"\n                      :data-testid=\"`user-settings-event-off-${row.ev}`\"\n                    >{{ row.gate.title }}</span>\n                  </span>\n                  <!-- The digest: told at once, or held for the summary. A\n                       muted kind is told never, so it has nothing to choose. -->\n                  <span v-if=\"hasUrgentSwitch(row.ev)\" class=\"fx-us__urgent\">\n                    <button\n                      type=\"button\"\n                      role=\"switch\"\n                      class=\"fx-us__switch\"\n                      :class=\"{ 'is-on': urgentSet.has(row.ev) }\"\n                      :aria-checked=\"urgentSet.has(row.ev)\"\n                      :aria-label=\"t('userSettings.notifications.urgentFor', { event: t(userEventKey(row.ev)) })\"\n                      :title=\"t('userSettings.notifications.urgentFor', { event: t(userEventKey(row.ev)) })\"\n                      :disabled=\"savingNotif || row.gate.disabled || mutedEvents.includes(row.ev)\"\n                      :data-testid=\"`user-settings-urgent-${row.ev}`\"\n                      @click=\"setUrgent([row.ev], !urgentSet.has(row.ev))\"\n                    >\n                      <span class=\"fx-us__switch-knob\" />\n                    </button>\n                    <span class=\"fx-us__urgent-label\" aria-hidden=\"true\">{{ t('userSettings.notifications.urgent') }}</span>\n                  </span>\n                </div>\n                <!-- The administrator alerts, one switch: an administrator's\n                     bell is the only one they reach. -->\n                <div\n                  v-if=\"digest && host.isAdmin && adminEvents.length\"\n                  class=\"fx-us__switch-row\"\n                  data-testid=\"user-settings-urgent-admin-row\"\n                >\n                  <span class=\"fx-us__switch-spacer\" aria-hidden=\"true\" />\n                  <span class=\"fx-us__event-label\">\n                    {{ t('userSettings.notifications.adminAlerts') }}\n                    <span class=\"fx-us__event-off\">{{ t('userSettings.notifications.adminAlertsHint') }}</span>\n                  </span>\n                  <span class=\"fx-us__urgent\">\n                    <button\n                      type=\"button\"\n                      role=\"switch\"\n                      class=\"fx-us__switch\"\n                      :class=\"{ 'is-on': adminUrgent }\"\n                      :aria-checked=\"adminUrgent\"\n                      :aria-label=\"t('userSettings.notifications.urgentFor', { event: t('userSettings.notifications.adminAlerts') })\"\n                      :title=\"t('userSettings.notifications.urgentFor', { event: t('userSettings.notifications.adminAlerts') })\"\n                      :disabled=\"savingNotif\"\n                      data-testid=\"user-settings-urgent-admin\"\n                      @click=\"setUrgent(adminEvents, !adminUrgent)\"\n                    >\n                      <span class=\"fx-us__switch-knob\" />\n                    </button>\n                    <span class=\"fx-us__urgent-label\" aria-hidden=\"true\">{{ t('userSettings.notifications.urgent') }}</span>\n                  </span>\n                </div>\n              </div>\n            </div>\n          </section>\n\n          <!-- ── Security ───────────────────────────────────────── -->\n          <!-- ⚠ Named, not `v-else`. This used to be the chain's fallback,\n               which is why adding a pane after it would not compile at all\n               (\"v-else-if has no adjacent v-if\"): nothing may follow a\n               `v-else`. The last branch is now the one that genuinely has\n               nothing left to test for. -->\n          <section\n            v-else-if=\"section === 'security'\"\n            class=\"fx-us__pane\"\n            data-testid=\"user-settings-security\"\n          >\n            <p v-if=\"host.demoReadOnly\" class=\"fx-us__note\">{{ t('userSettings.demoReadOnly') }}</p>\n\n            <form v-else class=\"fx-us__pane\" @submit.prevent=\"changePassword\">\n              <span class=\"fx-us__label\">{{ t('userSettings.security.passwordTitle') }}</span>\n              <label class=\"fx-us__field\">\n                <span class=\"fx-us__label\">{{ t('common.currentPassword') }}</span>\n                <input\n                  v-model=\"currentPassword\"\n                  type=\"password\"\n                  class=\"fx-us__input\"\n                  autocomplete=\"current-password\"\n                  required\n                />\n              </label>\n              <div class=\"fx-us__grid\">\n                <label class=\"fx-us__field\">\n                  <span class=\"fx-us__label\">{{ t('common.newPassword') }}</span>\n                  <input\n                    v-model=\"newPassword\"\n                    type=\"password\"\n                    class=\"fx-us__input\"\n                    autocomplete=\"new-password\"\n                    required\n                  />\n                </label>\n                <label class=\"fx-us__field\">\n                  <span class=\"fx-us__label\">{{ t('common.confirm') }}</span>\n                  <input\n                    v-model=\"newPasswordConfirm\"\n                    type=\"password\"\n                    class=\"fx-us__input\"\n                    autocomplete=\"new-password\"\n                    required\n                  />\n                </label>\n              </div>\n              <div class=\"fx-us__actions\">\n                <button type=\"submit\" class=\"fx-us__btn fx-us__btn--primary\" :disabled=\"savingPassword\">\n                  {{ savingPassword ? t('common.saving') : t('common.save') }}\n                </button>\n              </div>\n            </form>\n\n            <div v-if=\"!host.demoReadOnly\" class=\"fx-us__field\">\n              <span class=\"fx-us__label\">{{ t('profile.totp.title') }}</span>\n              <div v-if=\"totpStage === 'idle'\" class=\"fx-us__switch-row\">\n                <span class=\"fx-us__chip\" :class=\"totpEnabled ? 'fx-us__chip--ok' : ''\">\n                  {{ totpEnabled ? t('profile.totp.enabled') : t('profile.totp.disabled') }}\n                </span>\n                <button\n                  v-if=\"!totpEnabled\"\n                  type=\"button\"\n                  class=\"fx-us__btn\"\n                  :disabled=\"totpBusy\"\n                  data-testid=\"user-settings-totp-enable\"\n                  @click=\"startTotp\"\n                >\n                  {{ t('profile.totp.enable') }}\n                </button>\n                <button\n                  v-else\n                  type=\"button\"\n                  class=\"fx-us__btn\"\n                  data-testid=\"user-settings-totp-disable\"\n                  @click=\"totpStage = 'disable'\"\n                >\n                  {{ t('profile.totp.disable') }}\n                </button>\n              </div>\n\n              <div v-else-if=\"totpStage === 'enroll'\" class=\"fx-us__pane\">\n                <p class=\"fx-us__hint\">{{ t('profile.totp.scanHint') }}</p>\n                <div v-if=\"totpQr\" class=\"fx-us__qr\" data-testid=\"user-settings-totp-qr\" v-html=\"totpQr\" />\n                <code v-if=\"totpSecret\" class=\"fx-us__code\">{{ totpSecret }}</code>\n                <div v-if=\"totpRecoveryCodes.length\" class=\"fx-us__recovery\">\n                  <p class=\"fx-us__label\">{{ t('profile.totp.recoveryTitle') }}</p>\n                  <p class=\"fx-us__hint\">{{ t('profile.totp.recoveryHint') }}</p>\n                  <ul class=\"fx-us__recovery-list\">\n                    <li v-for=\"c in totpRecoveryCodes\" :key=\"c\">{{ c }}</li>\n                  </ul>\n                </div>\n                <label class=\"fx-us__field\">\n                  <span class=\"fx-us__label\">{{ t('profile.totp.code') }}</span>\n                  <input\n                    v-model=\"totpCode\"\n                    class=\"fx-us__input\"\n                    inputmode=\"numeric\"\n                    autocomplete=\"one-time-code\"\n                  />\n                </label>\n                <div class=\"fx-us__actions\">\n                  <button type=\"button\" class=\"fx-us__btn fx-us__btn--quiet\" @click=\"resetTotp\">\n                    {{ t('common.cancel') }}\n                  </button>\n                  <button\n                    type=\"button\"\n                    class=\"fx-us__btn fx-us__btn--primary\"\n                    :disabled=\"totpBusy\"\n                    @click=\"verifyTotp\"\n                  >\n                    {{ t('common.confirm') }}\n                  </button>\n                </div>\n              </div>\n\n              <div v-else class=\"fx-us__pane\">\n                <label class=\"fx-us__field\">\n                  <span class=\"fx-us__label\">{{ t('profile.totp.code') }}</span>\n                  <input\n                    v-model=\"totpCode\"\n                    class=\"fx-us__input\"\n                    inputmode=\"numeric\"\n                    autocomplete=\"one-time-code\"\n                  />\n                </label>\n                <div class=\"fx-us__actions\">\n                  <button type=\"button\" class=\"fx-us__btn fx-us__btn--quiet\" @click=\"resetTotp\">\n                    {{ t('common.cancel') }}\n                  </button>\n                  <button\n                    type=\"button\"\n                    class=\"fx-us__btn fx-us__btn--danger\"\n                    :disabled=\"totpBusy\"\n                    @click=\"disableTotp\"\n                  >\n                    {{ t('common.confirm') }}\n                  </button>\n                </div>\n              </div>\n            </div>\n\n            <!-- ⚠ No \"Active sessions\" block. There is no endpoint that lists\n                 or revokes a session; drawing \"2 sessions\" would be a number\n                 with nothing behind it. -->\n          </section>\n          <!-- ── AI assistant ───────────────────────── -->\n          <!-- Deliberately empty. One sentence saying there is nothing to set\n               and why; no switch, no field, no \"enable\" nobody reads. -->\n          <section v-else class=\"fx-us__pane\" data-testid=\"user-settings-ai\">\n            <div class=\"fx-us__soon\">\n              <Sparkles class=\"fx-us__soon-icon\" aria-hidden=\"true\" />\n              <p class=\"fx-us__soon-title\">{{ t('userSettings.ai.soon') }}</p>\n              <p class=\"fx-us__soon-body\">{{ t('userSettings.ai.body') }}</p>\n            </div>\n          </section>\n        </div>\n\n        <footer class=\"fx-us__foot\">\n          <!-- ⚠ Only Profile carries a Save, so only Profile carries a\n               Cancel: on that tab, closing really does drop what you typed.\n               Preferences and Notifications apply on the click that made\n               them — a staged \"Save changes\" over controls that have visibly\n               already taken effect is a lie about what the button does — so\n               those tabs get the sentence that says so, and one way out. -->\n          <span v-if=\"!profileSaveVisible\" class=\"fx-us__foot-note\">\n            {{ t(`userSettings.footNote.${section}`) }}\n          </span>\n          <button type=\"button\" class=\"fx-us__btn fx-us__btn--quiet\" @click=\"close\">\n            {{ profileSaveVisible ? t('common.cancel') : t('common.close') }}\n          </button>\n          <button\n            v-if=\"profileSaveVisible\"\n            type=\"button\"\n            class=\"fx-us__btn fx-us__btn--primary\"\n            :disabled=\"savingProfile || profileInvalid\"\n            data-testid=\"user-settings-save-profile\"\n            @click=\"saveProfile\"\n          >\n            {{ savingProfile ? t('common.saving') : t('userSettings.saveChanges') }}\n          </button>\n        </footer>\n      </div>\n    </div>\n  </Modal>\n</template>\n\n<style>\n/* ⚠ NOT scoped — no scoped style block anywhere in this package (the\n   web-component build compiles the markup from source and its CSS from the\n   prebuilt bundle, so the two hashes never meet: web/tests/api/\n   scopedStyles.test.ts). Every class here is `fx-us`-prefixed. */\n/* Only declared --fe-* tokens (packages/core/src/styles/variables.css): a raw\n   value here cannot be reached by a theme, and the heights and the type scale\n   are the shell's measured ones — 28/34/40px controls, 12/12.5/13px text. */\n\n/* The frame is core's Modal (bare) — see the template. The tint is this\n   dialog's own, as it was on the native <dialog>'s ::backdrop. `:has`, the\n   way base.css already tunes the search dialog's frame (a class handed to\n   Modal does not reach its backdrop: Modal's root is a <transition>). */\n.fe-modal__backdrop:has(> .fe-modal__card--bare > .fe-modal__body > .fx-us) {\n  background: rgba(17, 24, 39, 0.55);\n}\n\n/* `.fe` brings the palette, the font and the 13px base; the sizing is this\n   dialog's own.\n\n   A GRID, not a row of two columns: the head spans the whole width and the\n   rail starts under it. The rail used to begin at the very top with a\n   \"SETTINGS\" caption of its own while the title and the close button sat\n   inside the right-hand pane — two dialogs standing side by side rather than\n   one dialog with a rail.\n\n   ⚠ `.fe.fx-us`, not `.fx-us`: the root also carries `.fe` for the palette,\n   and base.css's `.fe` (display:flex, height:100%, min-height:420px, a\n   border) comes AFTER this block in the package's one stylesheet. At equal\n   weight the later rule won — the rail stretched across the top and the pane\n   fell under it, on the web page as well as in the desktop app (measured\n   2026-09-27, the day the dialog moved here from web/src, whose own\n   stylesheet used to load after core's). */\n.fe.fx-us {\n  display: grid;\n  /* 224, not 208: the assistant row carries a \"coming soon\" chip beside its\n     label and at 208 the label truncated to \"AI assist…\" — a rail item whose\n     own name is cut is worse than the extra 16px. */\n  grid-template-columns: 224px minmax(0, 1fr);\n  grid-template-rows: auto minmax(0, 1fr);\n  width: min(800px, calc(100vw - 32px));\n  height: min(620px, calc(100vh - 32px - var(--fe-overlay-top, 0px)));\n  min-height: 0;\n  border-radius: var(--fe-radius-lg);\n  box-shadow: var(--fe-shadow);\n  overflow: hidden;\n}\n\n/* ── rail ─────────────────────────────────────────────────────────── */\n.fx-us__rail {\n  grid-column: 1;\n  grid-row: 2;\n  display: flex;\n  flex-direction: column;\n  gap: var(--fe-gap-xs);\n  padding: var(--fe-gap) var(--fe-gap-sm);\n  background: var(--fe-bg-elev);\n  border-inline-end: 1px solid var(--fe-border);\n  overflow-y: auto;\n}\n.fx-us__rail-item {\n  display: flex;\n  align-items: center;\n  gap: var(--fe-gap-sm);\n  height: var(--fe-h-md);\n  padding: 0 var(--fe-gap);\n  border: 0;\n  border-radius: var(--fe-radius-md);\n  background: transparent;\n  color: var(--fe-text);\n  font: inherit;\n  font-size: var(--fe-text-md);\n  font-weight: 500;\n  text-align: start;\n  /* The host's own rules reach this dialog (it lives in the host's document):\n     the desktop window centres every <button>'s content. */\n  justify-content: flex-start;\n  cursor: pointer;\n}\n.fx-us__rail-item:hover {\n  background: var(--fe-bg-hover);\n}\n.fx-us__rail-item.is-active {\n  background: var(--fe-primary-soft);\n  color: var(--fe-primary);\n}\n.fx-us__rail-icon {\n  width: 16px;\n  height: 16px;\n  flex: 0 0 auto;\n}\n.fx-us__rail-label {\n  min-width: 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n/* The rail says \"coming soon\" before you click it. A row that looked like the\n   other four and then opened onto an apology is the thing this avoids. */\n.fx-us__rail-soon {\n  flex: 0 0 auto;\n  margin-inline-start: auto;\n  letter-spacing: 0.01em;\n  padding: 0 6px;\n  border-radius: 999px;\n  background: var(--fe-bg-hover);\n  color: var(--fe-text-muted);\n  font-size: 10px;\n  font-weight: 600;\n  line-height: 16px;\n  white-space: nowrap;\n}\n\n/* ── pane ─────────────────────────────────────────────────────────── */\n.fx-us__main {\n  grid-column: 2;\n  grid-row: 2;\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n  min-height: 0;\n}\n.fx-us__head {\n  grid-column: 1 / -1;\n  grid-row: 1;\n  display: flex;\n  align-items: center;\n  gap: var(--fe-gap);\n  padding: var(--fe-gap-lg);\n  border-bottom: 1px solid var(--fe-border);\n  background: var(--fe-bg);\n}\n.fx-us__head-avatar {\n  flex: 0 0 auto;\n  width: 40px;\n  height: 40px;\n  border-radius: 999px;\n  object-fit: cover;\n}\n.fx-us__head-avatar--initial {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  background: var(--fe-primary-soft);\n  color: var(--fe-primary);\n  font-size: var(--fe-text-md);\n  font-weight: 600;\n  text-transform: uppercase;\n}\n.fx-us__head-text {\n  min-width: 0;\n  flex: 1 1 auto;\n}\n/* The version sits between the heading and the close button and never pushes\n   either: it keeps its own width, and the heading is what gives way. */\n.fx-us__version {\n  flex: 0 0 auto;\n}\n.fx-us__title {\n  margin: 0;\n  font-size: 16px;\n  font-weight: 600;\n  line-height: 1.25;\n  color: var(--fe-text);\n  /* ⚠ The desktop window's own `h2` is an upper-case caption; a host's\n     heading rule must not turn this dialog's title into one. */\n  text-transform: none;\n  letter-spacing: normal;\n}\n/* The pane's own heading — which section you are in, under the dialog's. */\n.fx-us__panehead {\n  margin-bottom: var(--fe-gap-lg);\n}\n.fx-us__panetitle {\n  margin: 0;\n  font-size: var(--fe-text-md);\n  font-weight: 600;\n  color: var(--fe-text);\n}\n.fx-us__subtitle {\n  margin: 2px 0 0;\n  font-size: var(--fe-text-xs);\n  color: var(--fe-text-muted);\n}\n.fx-us__icon-btn {\n  flex: 0 0 auto;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--fe-h-sm);\n  height: var(--fe-h-sm);\n  border: 0;\n  border-radius: var(--fe-radius-md);\n  background: transparent;\n  color: var(--fe-text-muted);\n  cursor: pointer;\n}\n.fx-us__icon-btn:hover {\n  background: var(--fe-bg-hover);\n}\n.fx-us__body {\n  flex: 1 1 auto;\n  min-height: 0;\n  overflow-y: auto;\n  padding: var(--fe-gap-lg);\n}\n.fx-us__pane {\n  display: flex;\n  flex-direction: column;\n  gap: var(--fe-gap-lg);\n}\n.fx-us__grid {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: var(--fe-gap);\n}\n/* On a phone the rail stops being a rail and becomes a scrolling row of\n   chips under the head; the pane takes the rest. Measured at 390: five items\n   do not fit across, so the row scrolls sideways rather than wrapping into\n   three lines of buttons above a two-line pane. */\n@media (max-width: 640px) {\n  .fe.fx-us {\n    grid-template-columns: minmax(0, 1fr);\n    grid-template-rows: auto auto minmax(0, 1fr);\n  }\n  .fx-us__head {\n    grid-column: 1;\n    grid-row: 1;\n    padding: var(--fe-gap);\n  }\n  .fx-us__rail {\n    grid-column: 1;\n    grid-row: 2;\n    flex-direction: row;\n    gap: var(--fe-gap-xs);\n    padding: var(--fe-gap-sm);\n    border-inline-end: 0;\n    border-bottom: 1px solid var(--fe-border);\n    overflow-x: auto;\n    overflow-y: hidden;\n  }\n  .fx-us__rail-item {\n    flex: 0 0 auto;\n  }\n  .fx-us__rail-soon {\n    margin-inline-start: var(--fe-gap-xs);\n  }\n  .fx-us__main {\n    grid-column: 1;\n    grid-row: 3;\n  }\n  .fx-us__body {\n    padding: var(--fe-gap);\n  }\n  .fx-us__grid {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  /* The identity row wraps instead of squeezing the e-mail to three letters:\n     picture and name on one line, the button under them. */\n  .fx-us__identity {\n    flex-wrap: wrap;\n  }\n  .fx-us__identity-text {\n    flex: 1 1 60%;\n  }\n  .fx-us__identity-change {\n    margin-inline-start: 0;\n  }\n  .fx-us__foot {\n    padding: var(--fe-gap-sm) var(--fe-gap);\n  }\n}\n\n/* ── controls ─────────────────────────────────────────────────────── */\n\n/* A titled cluster of related fields. Appearance uses it to say out loud that\n   the mode strip and the palette grid are two answers to ONE question\n   (\"how should this look\") rather than two unrelated switches that happen to\n   sit together. */\n.fx-us__group {\n  display: flex;\n  flex-direction: column;\n  gap: var(--fe-gap);\n  padding: var(--fe-gap);\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius);\n  background: var(--fe-bg-elev);\n  min-width: 0;\n}\n.fx-us__group-title {\n  font-size: var(--fe-text-xs);\n  font-weight: 700;\n  letter-spacing: 0.04em;\n  text-transform: uppercase;\n  color: var(--fe-text-muted);\n}\n\n\n.fx-us__field {\n  display: flex;\n  flex-direction: column;\n  gap: var(--fe-gap-xs);\n  min-width: 0;\n}\n.fx-us__label {\n  font-size: var(--fe-text-sm);\n  font-weight: 500;\n  color: var(--fe-text);\n}\n.fx-us__hint {\n  font-size: var(--fe-text-xs);\n  font-weight: 400;\n  color: var(--fe-text-muted);\n}\n.fx-us__hint--bad {\n  color: var(--fe-danger);\n}\n/* The default folder view's three rows sit under ONE heading, so their own\n   labels step down a size rather than reading as three separate settings. */\n.fx-us__label--sub {\n  margin-top: var(--fe-gap-xs);\n  font-size: var(--fe-text-xs);\n  color: var(--fe-text-muted);\n}\n/* An inline action inside a hint (\"Reset them\", \"Forget them all\"): a link,\n   not a button — the hint is the sentence and this is its verb. */\n.fx-us__link {\n  padding: 0;\n  border: 0;\n  background: none;\n  color: var(--fe-primary);\n  font: inherit;\n  text-decoration: underline;\n  cursor: pointer;\n}\n.fx-us__required {\n  color: var(--fe-danger);\n}\n.fx-us__input.is-invalid {\n  border-color: var(--fe-danger);\n}\n.fx-us__note {\n  margin: 0;\n  padding: var(--fe-gap-sm) var(--fe-gap);\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius);\n  background: var(--fe-bg-elev);\n  font-size: var(--fe-text-xs);\n  color: var(--fe-text-muted);\n}\n/* Default apps (0.50): one card per kind the person chose an app for. */\n.fx-us__apps {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n  display: flex;\n  flex-direction: column;\n  gap: 0.625rem;\n}\n.fx-us__app {\n  border: 1px solid var(--fe-border);\n  border-radius: 0.5rem;\n  padding: 0.625rem 0.75rem;\n  display: flex;\n  flex-direction: column;\n  gap: 0.5rem;\n}\n.fx-us__app.is-gone {\n  border-color: var(--fe-warning, #d97706);\n}\n.fx-us__app-head {\n  display: flex;\n  align-items: center;\n  gap: 0.625rem;\n  min-width: 0;\n}\n.fx-us__app-kind {\n  font-family: var(--fe-font-mono, ui-monospace, monospace);\n  font-weight: 600;\n  color: var(--fe-text);\n}\n.fx-us__app-name {\n  flex: 1 1 auto;\n  min-width: 0;\n  overflow-wrap: anywhere;\n  color: var(--fe-text);\n}\n.fx-us__app.is-gone .fx-us__app-name {\n  text-decoration: line-through;\n  color: var(--fe-text-muted);\n}\n.fx-us__app-gone {\n  margin: 0;\n  font-size: 0.8125rem;\n  color: var(--fe-text);\n}\n.fx-us__apps-empty {\n  margin: 0;\n  color: var(--fe-text-muted);\n}\n.fx-us__apps-foot {\n  display: flex;\n  justify-content: flex-end;\n}\n.fx-us__readout {\n  margin: 0;\n  font-size: var(--fe-text-sm);\n  color: var(--fe-text-muted);\n}\n/* The install row's one button, at its own width rather than the group's. */\n.fx-us__install-foot {\n  display: flex;\n}\n\n/* Desktop-app downloads. The ROWS are drawn in this pane's own idiom rather\n   than borrowed from the reminder's stylesheet — a scoped style cannot cross\n   components anyway, and the two live in different furniture. What is shared\n   is the thing that would actually rot if it were copied: which file, what it\n   does, how big it is (`useDesktopDownloads`). */\n.fx-us__dl-list {\n  display: flex;\n  flex-direction: column;\n  gap: var(--fe-gap-xs);\n  min-width: 0;\n}\n.fx-us__dl {\n  display: flex;\n  flex-direction: column;\n  gap: 2px;\n  padding: var(--fe-gap-sm) var(--fe-gap);\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius);\n  background: var(--fe-bg);\n  min-width: 0;\n}\n.fx-us__dl:hover {\n  border-color: var(--fe-primary);\n}\n.fx-us__dl-main {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--fe-gap-sm);\n  text-decoration: none;\n  min-width: 0;\n}\n/* The other processor's file: small, under the row's hint, plainly a link. */\n.fx-us__dl-other {\n  align-self: flex-start;\n  font-size: var(--fe-text-xs);\n  color: var(--fe-text-muted);\n  text-decoration: underline;\n}\n.fx-us__dl-other:hover {\n  color: var(--fe-text);\n}\n.fx-us__dl-text {\n  display: flex;\n  flex-direction: column;\n  gap: 2px;\n  min-width: 0;\n}\n.fx-us__dl-arrow {\n  flex: 0 0 auto;\n  color: var(--fe-primary);\n}\n.fx-us__dl-all {\n  font-size: var(--fe-text-xs);\n  color: var(--fe-text-muted);\n  text-decoration: underline;\n}\n.fx-us__dl-all:hover {\n  color: var(--fe-text);\n}\n.fx-us__input {\n  height: var(--fe-h-md);\n  padding: 0 10px;\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius);\n  background: var(--fe-bg);\n  color: var(--fe-text);\n  font: inherit;\n  font-size: var(--fe-text-sm);\n  width: 100%;\n}\n\n\n.fx-us__input:focus {\n  outline: none;\n  border-color: var(--fe-primary);\n}\n/* The time-zone combobox is core's TimeZonePicker and carries its own\n   stylesheet (.fe-tzpick*), shared with the embed's dialog. */\n\n.fx-us__input:disabled {\n  background: var(--fe-bg-elev);\n  color: var(--fe-text-muted);\n}\nselect.fx-us__input {\n  padding-inline-end: 6px;\n}\n.fx-us__btn {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  gap: var(--fe-gap-xs);\n  height: var(--fe-h-md);\n  padding: 0 var(--fe-gap);\n  border: 1px solid var(--fe-border-strong);\n  border-radius: var(--fe-radius);\n  background: var(--fe-bg);\n  color: var(--fe-text);\n  font: inherit;\n  font-size: var(--fe-text-sm);\n  font-weight: 500;\n  cursor: pointer;\n  white-space: nowrap;\n}\n.fx-us__btn:hover:not(:disabled) {\n  background: var(--fe-bg-hover);\n}\n.fx-us__btn:disabled {\n  opacity: 0.55;\n  cursor: not-allowed;\n}\n.fx-us__btn--sm {\n  height: var(--fe-h-sm);\n  padding: 0 var(--fe-gap-sm);\n  font-size: var(--fe-text-xs);\n}\n.fx-us__btn--quiet {\n  border-color: transparent;\n  background: transparent;\n  color: var(--fe-text-muted);\n}\n.fx-us__btn--primary {\n  border-color: var(--fe-primary);\n  background: var(--fe-primary);\n  color: var(--fe-text-on-primary);\n}\n.fx-us__btn--primary:hover:not(:disabled) {\n  background: var(--fe-primary-hover);\n}\n.fx-us__btn--danger {\n  border-color: var(--fe-danger);\n  background: var(--fe-danger);\n  color: var(--fe-text-on-primary);\n}\n.fx-us__actions {\n  display: flex;\n  justify-content: flex-end;\n  gap: var(--fe-gap-sm);\n}\n.fx-us__file {\n  display: none;\n}\n\n/* ── segmented (theme) ────────────────────────────────────────────── */\n.fx-us__segmented {\n  display: inline-flex;\n  align-self: flex-start;\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius);\n  overflow: hidden;\n}\n.fx-us__seg {\n  height: var(--fe-h-md);\n  padding: 0 var(--fe-gap);\n  border: 0;\n  border-inline-end: 1px solid var(--fe-border);\n  background: var(--fe-bg);\n  color: var(--fe-text-muted);\n  font: inherit;\n  font-size: var(--fe-text-sm);\n  font-weight: 500;\n  cursor: pointer;\n}\n.fx-us__seg:last-child {\n  border-inline-end: 0;\n}\n.fx-us__seg:hover {\n  background: var(--fe-bg-hover);\n}\n.fx-us__seg.is-active {\n  background: var(--fe-primary-soft);\n  color: var(--fe-primary);\n}\n\n/* ── switch ───────────────────────────────────────────────────────── */\n.fx-us__switch-row {\n  display: flex;\n  align-items: flex-start;\n  gap: var(--fe-gap);\n}\n.fx-us__switch {\n  flex: 0 0 auto;\n  position: relative;\n  width: 34px;\n  height: 20px;\n  margin-top: 1px;\n  padding: 0;\n  border: 0;\n  border-radius: 999px;\n  background: var(--fe-border-strong);\n  cursor: pointer;\n  transition: background 120ms ease;\n}\n.fx-us__switch.is-on {\n  background: var(--fe-primary);\n}\n.fx-us__switch:disabled {\n  opacity: 0.55;\n  cursor: not-allowed;\n}\n.fx-us__switch-knob {\n  position: absolute;\n  top: 2px;\n  inset-inline-start: 2px;\n  width: 16px;\n  height: 16px;\n  border-radius: 999px;\n  background: var(--fe-bg);\n  transition: transform 120ms ease;\n}\n.fx-us__switch.is-on .fx-us__switch-knob {\n  /* ⚠ RTL: toward \"on\" = toward the inline end (--filex-dir-x, core base.css). */\n  transform: translateX(calc(14px * var(--filex-dir-x, 1)));\n}\n.fx-us__switch-text {\n  display: flex;\n  flex-direction: column;\n  gap: 2px;\n  min-width: 0;\n}\n.fx-us__event-label {\n  font-size: var(--fe-text-sm);\n  color: var(--fe-text);\n  display: flex;\n  flex-direction: column;\n  gap: 2px;\n  min-width: 0;\n}\n/* An event whose service is off: greyed, with the reason under it (the\n   administrator's view — everybody else is not offered it). */\n.fx-us__switch-row.is-off .fx-us__event-label {\n  color: var(--fe-text-muted);\n}\n.fx-us__event-off {\n  font-size: var(--fe-text-xs);\n  color: var(--fe-text-muted);\n}\n.fx-us__events {\n  display: flex;\n  flex-direction: column;\n  gap: var(--fe-gap-sm);\n  margin-top: var(--fe-gap-xs);\n}\n/* The digest's urgent switch, at the inline end of an event's row. */\n.fx-us__urgent {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--fe-gap-xs);\n  margin-inline-start: auto;\n  flex: 0 0 auto;\n}\n.fx-us__urgent-label {\n  font-size: var(--fe-text-xs);\n  color: var(--fe-text-muted);\n}\n/* Where a row has no mute switch (the administrator alerts), the space of one,\n   so the labels line up. */\n.fx-us__switch-spacer {\n  flex: 0 0 auto;\n  width: 34px;\n}\n\n/* ── push devices (#191) ──────────────────────────────────────────── */\n/* A list, not a table: a name, when it was added and one action per row. */\n.fx-us__devices {\n  display: flex;\n  flex-direction: column;\n  gap: var(--fe-gap-xs);\n  margin-top: var(--fe-gap-sm);\n}\n.fx-us__device-list {\n  display: flex;\n  flex-direction: column;\n  gap: var(--fe-gap-xs);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.fx-us__device {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--fe-gap-sm);\n  padding: var(--fe-gap-xs) var(--fe-gap-sm);\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius-sm);\n}\n.fx-us__device-text {\n  display: flex;\n  flex-direction: column;\n  gap: 2px;\n  flex: 1 1 10rem;\n  min-width: 0;\n}\n.fx-us__device-name {\n  font-size: var(--fe-text-sm);\n  color: var(--fe-text);\n  overflow-wrap: anywhere;\n}\n\n/* ── chips ────────────────────────────────────────────────────────── */\n.fx-us__chips {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--fe-gap-sm);\n  margin-top: var(--fe-gap-xs);\n}\n.fx-us__chip {\n  display: inline-flex;\n  align-items: center;\n  height: 22px;\n  padding: 0 var(--fe-gap-sm);\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius-sm);\n  background: var(--fe-bg-elev);\n  color: var(--fe-text-muted);\n  font-size: var(--fe-text-xs);\n  white-space: nowrap;\n}\n.fx-us__chip--ok {\n  border-color: var(--fe-keep-ok);\n  color: var(--fe-keep-ok);\n}\n.fx-us__chip--bad {\n  border-color: var(--fe-danger);\n  color: var(--fe-danger);\n}\n\n/* ── identity row ─────────────────────────────────────────────────── */\n/* Picture, who you are, whether you are an admin — and the one button that\n   changes the picture, pushed to the far edge so the row reads left-to-right\n   as a statement with an action at the end of it. */\n.fx-us__identity {\n  display: flex;\n  align-items: center;\n  gap: var(--fe-gap);\n}\n.fx-us__identity-text {\n  flex: 1 1 auto;\n  min-width: 0;\n}\n.fx-us__identity-name {\n  display: flex;\n  align-items: center;\n  gap: var(--fe-gap-sm);\n  margin: 0;\n  font-size: var(--fe-text-md);\n  font-weight: 600;\n  color: var(--fe-text);\n}\n.fx-us__identity-who {\n  min-width: 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.fx-us__identity-sub {\n  margin: 3px 0 0;\n  font-size: var(--fe-text-xs);\n  color: var(--fe-text-muted);\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.fx-us__badge {\n  flex: 0 0 auto;\n  padding: 0 8px;\n  border-radius: 999px;\n  background: var(--fe-primary-soft);\n  color: var(--fe-primary);\n  font-size: var(--fe-text-xs);\n  font-weight: 600;\n  line-height: 20px;\n}\n.fx-us__identity-change {\n  margin-inline-start: auto;\n}\n\n/* ── the assistant pane, which has nothing in it on purpose ───────── */\n.fx-us__soon {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: var(--fe-gap-sm);\n  padding: var(--fe-gap-lg);\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius-md);\n  background: var(--fe-bg-elev);\n}\n.fx-us__soon-icon {\n  width: 20px;\n  height: 20px;\n  color: var(--fe-text-muted);\n}\n.fx-us__soon-title {\n  margin: 0;\n  font-size: var(--fe-text-md);\n  font-weight: 600;\n  color: var(--fe-text);\n}\n.fx-us__soon-body {\n  margin: 0;\n  max-width: 52ch;\n  font-size: var(--fe-text-sm);\n  line-height: 1.55;\n  color: var(--fe-text-muted);\n}\n\n/* ── avatar ───────────────────────────────────────────────────────── */\n.fx-us__avatar-row {\n  display: flex;\n  align-items: center;\n  gap: var(--fe-gap-sm);\n}\n.fx-us__avatar {\n  width: 48px;\n  height: 48px;\n  border-radius: 999px;\n  border: 1px solid var(--fe-border);\n  object-fit: cover;\n}\n.fx-us__avatar--initial {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  background: var(--fe-bg-elev);\n  color: var(--fe-text-muted);\n  font-size: 18px;\n  font-weight: 600;\n}\n\n/* ── TOTP ─────────────────────────────────────────────────────────── */\n.fx-us__qr {\n  align-self: flex-start;\n  padding: var(--fe-gap-sm);\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius);\n  background: #ffffff;\n}\n.fx-us__qr svg {\n  width: 148px;\n  height: 148px;\n  display: block;\n}\n.fx-us__code {\n  align-self: flex-start;\n  padding: 6px var(--fe-gap-sm);\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius-sm);\n  background: var(--fe-bg-elev);\n  font-family: var(--fe-font-mono);\n  font-size: var(--fe-text-xs);\n  user-select: all;\n}\n.fx-us__recovery {\n  display: flex;\n  flex-direction: column;\n  gap: var(--fe-gap-xs);\n  padding: var(--fe-gap);\n  border: 1px solid var(--fe-border-strong);\n  border-radius: var(--fe-radius);\n  background: var(--fe-bg-elev);\n}\n.fx-us__recovery-list {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: 2px var(--fe-gap);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-family: var(--fe-font-mono);\n  font-size: var(--fe-text-xs);\n  user-select: all;\n}\n\n/* ── footer ───────────────────────────────────────────────────────── */\n.fx-us__foot {\n  flex: 0 0 auto;\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n  gap: var(--fe-gap-sm);\n  padding: var(--fe-gap) var(--fe-gap-lg);\n  border-top: 1px solid var(--fe-border);\n  background: var(--fe-bg);\n}\n.fx-us__foot-note {\n  flex: 1 1 auto;\n  min-width: 0;\n  font-size: var(--fe-text-xs);\n  color: var(--fe-text-muted);\n}\n</style>\n","/**\n * Web Push on this device (task #191) - the switch \"Push notifications on this\n * device\" in the user settings dialog, and what keeps it true afterwards.\n *\n * ⚠⚠ ONE flow, here, for every surface that runs filex's own service worker:\n * asking the browser's permission (from the tap), subscribing with the\n * server's key, telling the server, finding this device in the person's list,\n * turning it off, re-subscribing when the server's key was rotated or the\n * browser dropped the subscription, and forgetting the device when the person\n * signs out. A host hands over the two things only it has - its service\n * worker and its transport (`WebPushEnv`, `WebPushApi`) - and nothing else.\n * Where there is no filex worker (an explorer embedded in another site, whose\n * workers are that site's) or the platform notifies on its own (the desktop\n * app raises native notifications from its tray even with the window closed),\n * the host gives no `webPush` row and the dialog draws none.\n *\n * What is pushed, and when, is the server's: a push is one more reader of the\n * person's bell (backend internal/notify push.go) - the same kinds, the same\n * mutes, the same digest. Nothing about it is decided here.\n *\n * ⚠ iPhone and iPad: only the web app added to the Home Screen (iOS / iPadOS\n * 16.4 and later) has `PushManager`; a Safari tab has none, and the dialog\n * says where to look instead. The permission is asked FIRST in `enable()`,\n * before anything is awaited, because Safari asks only from the tap itself.\n * Every push shows a notification (`userVisibleOnly`) - the worker always\n * raises one (web/public/notify-sw.js), which iOS requires.\n *\n * Pure TypeScript, no Vue: the dialog drives it, and the web app calls it on\n * start (reconcile) and on sign-out (forgetDevice).\n */\n\n/** One of the person's devices, as GET /api/notifications/push lists it. */\nexport interface WebPushDevice {\n  id: number;\n  label: string;\n  /** Hex SHA-256 of the device's endpoint - how this browser finds itself. */\n  endpoint_hash: string;\n  /** The push service's host (fcm.googleapis.com, web.push.apple.com …). */\n  service?: string;\n  created_at: string;\n  last_ok_at?: string | null;\n}\n\n/** GET /api/notifications/push. */\nexport interface WebPushStatus {\n  available: boolean;\n  /** Why not: `disabled`, `no_secret_key`, `key_unreadable`, `error`. */\n  reason?: string;\n  /** The server's key (base64url): what a browser subscribes with. */\n  public_key?: string;\n  devices: WebPushDevice[];\n}\n\n/** What a browser hands the server: PushSubscription.toJSON() and a name. */\nexport interface WebPushSubscriptionBody {\n  endpoint: string;\n  keys: { p256dh: string; auth: string };\n  label: string;\n}\n\n/** The account's push endpoints (backend handlers/notification_push.go). */\nexport interface WebPushApi {\n  status(): Promise<WebPushStatus>;\n  subscribe(body: WebPushSubscriptionBody): Promise<WebPushDevice>;\n  /** This browser, by its endpoint: push turned off on it, or signing out. */\n  forget(endpoint: string): Promise<void>;\n  /** One of the person's devices, by id. */\n  remove(id: number): Promise<void>;\n  test(): Promise<{ sent: number; failed: number }>;\n}\n\nexport type WebPushPermission = 'granted' | 'denied' | 'default' | 'unsupported';\n\n/** What the browser's Notification API gives (`window.Notification`). */\nexport interface WebPushNotificationApi {\n  readonly permission: NotificationPermission;\n  requestPermission(): Promise<NotificationPermission> | void;\n}\n\n/** What only the host has. */\nexport interface WebPushEnv {\n  /** The person signed in (the \"on for this device\" note is kept per person). */\n  userId: number | null;\n  /** The host's own service worker, the one the pushes arrive at. */\n  registration(): Promise<ServiceWorkerRegistration | null>;\n  /** The browser's Notification API. Default: `window.Notification`. */\n  notification?: WebPushNotificationApi | null;\n  /** Whether this browser has Web Push at all. Default: `PushManager` exists. */\n  supported?: () => boolean;\n  /** Where the note is kept. Default: localStorage. */\n  storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'> | null;\n  /** The browser, for the device's label. Default: navigator.userAgent. */\n  userAgent?: string;\n  /** Hex SHA-256 of a text. Default: crypto.subtle. */\n  sha256?: (text: string) => Promise<string>;\n}\n\n/** What the dialog draws. */\nexport interface WebPushState {\n  /** This browser can receive pushes at all. */\n  supported: boolean;\n  permission: WebPushPermission;\n  /** The server's answer; null when it could not be asked. */\n  status: WebPushStatus | null;\n  /** This browser receives pushes for this person. */\n  on: boolean;\n  /** This browser in `status.devices`, by id. */\n  thisDevice: number | null;\n}\n\nexport interface WebPushController {\n  state(): Promise<WebPushState>;\n  /** ⚠ From the tap and from nowhere else: it may ask for the permission. */\n  enable(): Promise<WebPushState>;\n  disable(): Promise<WebPushState>;\n  remove(id: number): Promise<WebPushState>;\n  test(): Promise<{ sent: number; failed: number }>;\n  /** On every start of the app: keep this device's subscription true. */\n  reconcile(): Promise<void>;\n  /** Before signing out: this browser stops receiving the person's pushes. */\n  forgetDevice(): Promise<void>;\n}\n\n/** The note that the person turned push on for this browser, per person. */\nexport const WEB_PUSH_NOTE_KEY = 'filex.notify.push';\n\n/** base64url (padded or not) to bytes - what `applicationServerKey` takes. */\nexport function base64UrlToBytes(s: string): Uint8Array<ArrayBuffer> {\n  const b64 = s.replace(/-/g, '+').replace(/_/g, '/').replace(/=+$/, '');\n  const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4);\n  const bin = atob(padded);\n  const out = new Uint8Array(bin.length);\n  for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n  return out;\n}\n\n/** The browsers and systems a label names, the more specific first. */\nconst BROWSERS: Array<[RegExp, string]> = [\n  [/Edg(e|A|iOS)?\\//, 'Edge'],\n  [/OPR\\/|Opera/, 'Opera'],\n  [/SamsungBrowser\\//, 'Samsung Internet'],\n  [/Firefox\\/|FxiOS\\//, 'Firefox'],\n  [/Chrome\\/|CriOS\\//, 'Chrome'],\n  [/Safari\\//, 'Safari'],\n];\nconst SYSTEMS: Array<[RegExp, string]> = [\n  [/iPhone/, 'iPhone'],\n  [/iPad/, 'iPad'],\n  [/Android/, 'Android'],\n  [/CrOS/, 'ChromeOS'],\n  [/Windows/, 'Windows'],\n  [/Mac OS X|Macintosh/, 'macOS'],\n  [/Linux/, 'Linux'],\n];\n\n/**\n * What this device is called in the person's list: \"Chrome · Android\",\n * \"Safari · iPhone\" - names, so the same in every language. The person sees it\n * beside a Remove button, so it only has to tell their own devices apart.\n */\nexport function deviceLabel(ua: string): string {\n  const first = (list: Array<[RegExp, string]>) => list.find(([re]) => re.test(ua))?.[1] ?? '';\n  return [first(BROWSERS), first(SYSTEMS)].filter(Boolean).join(' · ');\n}\n\nasync function subtleSha256(text: string): Promise<string> {\n  const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(text));\n  return Array.from(new Uint8Array(digest), (b) => b.toString(16).padStart(2, '0')).join('');\n}\n\nfunction defaultStorage(): Pick<Storage, 'getItem' | 'setItem' | 'removeItem'> | null {\n  try {\n    return typeof localStorage === 'undefined' ? null : localStorage;\n  } catch {\n    return null;\n  }\n}\n\n/** Is the subscription made with this key? */\nfunction sameKey(sub: PushSubscription, key: Uint8Array<ArrayBuffer>): boolean {\n  const k = sub.options?.applicationServerKey;\n  if (!k) return false;\n  const have = new Uint8Array(k as ArrayBuffer);\n  if (have.length !== key.length) return false;\n  for (let i = 0; i < key.length; i++) if (have[i] !== key[i]) return false;\n  return true;\n}\n\nfunction bodyOf(sub: PushSubscription, label: string): WebPushSubscriptionBody {\n  const json = sub.toJSON();\n  return {\n    endpoint: json.endpoint ?? sub.endpoint,\n    keys: { p256dh: json.keys?.p256dh ?? '', auth: json.keys?.auth ?? '' },\n    label,\n  };\n}\n\n/** The worker, once it is active: a subscription needs an active one. */\nasync function activeWorker(reg: ServiceWorkerRegistration | null): Promise<ServiceWorkerRegistration | null> {\n  if (!reg || !reg.pushManager) return null;\n  if (reg.active) return reg;\n  const w = reg.installing ?? reg.waiting;\n  if (!w) return null;\n  await new Promise<void>((resolve) => {\n    const done = setTimeout(resolve, 10_000);\n    w.addEventListener('statechange', () => {\n      if (w.state === 'activated') {\n        clearTimeout(done);\n        resolve();\n      }\n    });\n  });\n  return reg.active ? reg : null;\n}\n\nexport function createWebPush(api: WebPushApi, env: WebPushEnv): WebPushController {\n  const storage = env.storage === undefined ? defaultStorage() : env.storage;\n  const noteKey = env.userId ? `${WEB_PUSH_NOTE_KEY}.${env.userId}` : '';\n  const sha256 = env.sha256 ?? subtleSha256;\n  const ua = env.userAgent ?? (typeof navigator === 'undefined' ? '' : navigator.userAgent ?? '');\n  let lastStatus: WebPushStatus | null = null;\n\n  const notificationApi = (): WebPushNotificationApi | null => {\n    if (env.notification !== undefined) return env.notification;\n    return typeof window !== 'undefined' && 'Notification' in window ? window.Notification : null;\n  };\n  const supported = (): boolean => {\n    if (env.supported) return env.supported();\n    return (\n      typeof window !== 'undefined' &&\n      'PushManager' in window &&\n      typeof navigator !== 'undefined' &&\n      'serviceWorker' in navigator &&\n      notificationApi() !== null\n    );\n  };\n  const permission = (): WebPushPermission => {\n    const n = notificationApi();\n    if (!n || !supported()) return 'unsupported';\n    return (n.permission as WebPushPermission) ?? 'default';\n  };\n  const noted = (): boolean => {\n    if (!noteKey || !storage) return false;\n    try {\n      return storage.getItem(noteKey) === '1';\n    } catch {\n      return false;\n    }\n  };\n  const note = (on: boolean): void => {\n    if (!noteKey || !storage) return;\n    try {\n      if (on) storage.setItem(noteKey, '1');\n      else storage.removeItem(noteKey);\n    } catch {\n      /* a convenience: never let storage break the switch */\n    }\n  };\n  const fetchStatus = async (): Promise<WebPushStatus | null> => {\n    try {\n      lastStatus = await api.status();\n    } catch {\n      lastStatus = null;\n    }\n    return lastStatus;\n  };\n  const currentSubscription = async (): Promise<PushSubscription | null> => {\n    if (!supported()) return null;\n    try {\n      const reg = await env.registration();\n      return reg?.pushManager ? await reg.pushManager.getSubscription() : null;\n    } catch {\n      return null;\n    }\n  };\n  /** Subscribe (or keep the subscription that has the right key) and tell the server. */\n  const subscribeWith = async (publicKey: string): Promise<void> => {\n    const reg = await activeWorker(await env.registration());\n    if (!reg) throw new Error('no service worker');\n    const key = base64UrlToBytes(publicKey);\n    let sub = await reg.pushManager.getSubscription();\n    if (sub && !sameKey(sub, key)) {\n      await sub.unsubscribe().catch(() => false);\n      sub = null;\n    }\n    if (!sub) sub = await reg.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: key });\n    await api.subscribe(bodyOf(sub, deviceLabel(ua)));\n  };\n\n  async function state(): Promise<WebPushState> {\n    const status = await fetchStatus();\n    let thisDevice: number | null = null;\n    const sub = status ? await currentSubscription() : null;\n    if (sub && status) {\n      try {\n        const hash = await sha256(sub.endpoint);\n        thisDevice = status.devices.find((d) => d.endpoint_hash === hash)?.id ?? null;\n      } catch {\n        thisDevice = null;\n      }\n    }\n    const perm = permission();\n    return { supported: supported(), permission: perm, status, on: thisDevice !== null && perm === 'granted', thisDevice };\n  }\n\n  async function enable(): Promise<WebPushState> {\n    const n = notificationApi();\n    if (!n || !supported()) return state();\n    // ⚠ FIRST, before anything is awaited: Safari asks only from the tap.\n    let perm = n.permission as WebPushPermission;\n    if (perm === 'default') {\n      // Safari before 16 answers through a callback and returns nothing;\n      // the permission is read back then.\n      const asked: unknown = await Promise.resolve(n.requestPermission());\n      perm = (typeof asked === 'string' ? asked : n.permission) as WebPushPermission;\n    }\n    if (perm !== 'granted') return state();\n    const status = lastStatus ?? (await fetchStatus());\n    if (!status?.available || !status.public_key) return state();\n    await subscribeWith(status.public_key);\n    note(true);\n    return state();\n  }\n\n  async function disable(): Promise<WebPushState> {\n    note(false);\n    const sub = await currentSubscription();\n    if (sub) {\n      await api.forget(sub.endpoint).catch(() => undefined);\n      await sub.unsubscribe().catch(() => false);\n    }\n    return state();\n  }\n\n  async function remove(id: number): Promise<WebPushState> {\n    const before = await state();\n    await api.remove(id);\n    if (before.thisDevice === id) {\n      note(false);\n      const sub = await currentSubscription();\n      await sub?.unsubscribe().catch(() => false);\n    }\n    return state();\n  }\n\n  async function reconcile(): Promise<void> {\n    if (!noted() || permission() !== 'granted') return;\n    const status = await fetchStatus();\n    if (!status?.available || !status.public_key) return;\n    try {\n      const sub = await currentSubscription();\n      if (sub && sameKey(sub, base64UrlToBytes(status.public_key))) {\n        const hash = await sha256(sub.endpoint);\n        if (status.devices.some((d) => d.endpoint_hash === hash)) return;\n      }\n      // The browser dropped it, the server forgot it (a rotation, a push\n      // service that said it is gone), or the key changed: subscribe again.\n      await subscribeWith(status.public_key);\n    } catch {\n      /* the next start tries again */\n    }\n  }\n\n  async function forgetDevice(): Promise<void> {\n    const sub = await currentSubscription();\n    if (!sub) return;\n    await api.forget(sub.endpoint).catch(() => undefined);\n    await sub.unsubscribe().catch(() => false);\n  }\n\n  return {\n    state,\n    enable,\n    disable,\n    remove,\n    test: () => api.test(),\n    reconcile,\n    forgetDevice,\n  };\n}\n","/**\n * The mega menu's model - what a host hands `MegaMenu.vue`, and the rules that\n * do not depend on how it is drawn.\n *\n * GitHub #82 (0.51.0): the admin panel's flat sidebar of 37 pages became a\n * mega menu - a few top entries, each opening a panel whose pages sit in\n * named sections, with a short line under each page. The owner chose the\n * shape (2026-10-03): three top entries with the sections as columns, the\n * dashboard as a plain link before them, a headed list per entry on a phone.\n *\n * ⚠ The menu knows nothing about routes or permissions. The HOST decides\n * which pages a person may open and passes only those; this module's one\n * rule about visibility is the one every host would otherwise write again:\n * a section with no page left is not drawn, and neither is an entry with no\n * section left (a heading over nothing is a promise the deployment cannot\n * keep - the old sidebar's own rule for its Apps heading).\n *\n * Pure: no DOM, and Vue only for the type of a host's icon component.\n */\nimport type { Component } from 'vue';\n\nimport { inlineKeyStep, type TextDirection } from './direction';\n\n/** One page of a section. */\nexport interface MegaMenuItem {\n  /** Stable key and test hook (`nav-<id>`); the admin panel uses the route name. */\n  id: string;\n  label: string;\n  /** The short line under the label. */\n  hint?: string;\n  /** Where the item goes. A real address, so a middle click opens a tab. */\n  href: string;\n  /** The page being looked at (or one of its own sub-pages). */\n  active?: boolean;\n  /** A glyph from the HOST's icon set, drawn as a component. */\n  icon?: Component;\n  /**\n   * Or a glyph from the core icon library, by NAME (`lib/actionIcons`). Only\n   * the name crosses this boundary - never markup - so the menu draws static\n   * SVG this package wrote, whoever the host is.\n   */\n  iconName?: string;\n}\n\n/** A named group of pages inside an entry's panel (a column on a wide screen). */\nexport interface MegaMenuSection {\n  id: string;\n  label: string;\n  items: MegaMenuItem[];\n}\n\n/**\n * A top entry: either a panel of sections, or - with `href` and no sections -\n * a plain link (the dashboard).\n */\nexport interface MegaMenuEntry {\n  id: string;\n  label: string;\n  sections?: MegaMenuSection[];\n  href?: string;\n  active?: boolean;\n  icon?: Component;\n}\n\n/** True for an entry drawn as a plain link rather than a panel. */\nexport function isLinkEntry(entry: MegaMenuEntry): boolean {\n  return !entry.sections && typeof entry.href === 'string';\n}\n\n/**\n * The entries as they are drawn: sections with no item dropped, then entries\n * with no section dropped. A plain-link entry stays as it is.\n */\nexport function pruneMegaMenu(entries: MegaMenuEntry[]): MegaMenuEntry[] {\n  const out: MegaMenuEntry[] = [];\n  for (const entry of entries) {\n    if (isLinkEntry(entry)) {\n      out.push(entry);\n      continue;\n    }\n    const sections = (entry.sections ?? []).filter((s) => s.items.length > 0);\n    if (sections.length > 0) out.push({ ...entry, sections });\n  }\n  return out;\n}\n\n/** Does this entry hold the page being looked at? */\nexport function entryIsCurrent(entry: MegaMenuEntry): boolean {\n  if (isLinkEntry(entry)) return entry.active === true;\n  return (entry.sections ?? []).some((s) => s.items.some((i) => i.active === true));\n}\n\n/**\n * Where a key press inside a run of links moves focus: the next or previous\n * one, the first or the last. `null` for a key this does not handle. The\n * run does not wrap - Down on the last link stays there - which is how a\n * reader knows they reached the end.\n */\nexport function stepFocus(key: string, index: number, count: number): number | null {\n  if (count <= 0) return null;\n  switch (key) {\n    case 'ArrowDown':\n      return Math.min(index + 1, count - 1);\n    case 'ArrowUp':\n      return Math.max(index - 1, 0);\n    case 'Home':\n      return 0;\n    case 'End':\n      return count - 1;\n    default:\n      return null;\n  }\n}\n\n/**\n * Left and right along the top entries, in the direction the interface is\n * drawn: in a right-to-left interface the right arrow goes to the PREVIOUS\n * entry. Wraps, as a menu bar does. `null` for any other key.\n */\nexport function stepAlongBar(key: string, index: number, count: number, dir: TextDirection = 'ltr'): number | null {\n  if (count <= 0) return null;\n  const step = inlineKeyStep(key, dir);\n  if (step !== 0) return (index + step + count) % count;\n  if (key === 'Home') return 0;\n  if (key === 'End') return count - 1;\n  return null;\n}\n\n/**\n * A plain left click that the HOST should turn into an in-app navigation. A\n * click with a modifier (new tab, new window, download) or another button is\n * left to the browser, which is what makes the items real links.\n */\nexport function isPlainClick(ev: Pick<MouseEvent, 'button' | 'metaKey' | 'ctrlKey' | 'shiftKey' | 'altKey' | 'defaultPrevented'>): boolean {\n  return ev.button === 0 && !ev.metaKey && !ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.defaultPrevented;\n}\n","<script setup lang=\"ts\">\n/**\n * MegaMenu - a few top entries, each opening a panel of named sections, each\n * section a list of pages with a short line under each (GitHub #82, 0.51.0).\n *\n * Drawn by the admin panel's top bar (web/src/components/AdminNav.vue), and\n * written here rather than there because it is a navigation PATTERN, not the\n * admin panel's: the host passes the entries, already filtered to what the\n * reader may open, and gets `navigate` back. Nothing in this file names a\n * route, a permission or a page.\n *\n * Two ways to draw the same entries:\n *\n *   bar   a wide screen. Each entry is a button that opens its panel under\n *         the bar; a plain-link entry (the dashboard) is a link. One panel\n *         open at a time; the sections are its columns.\n *   list  a phone's drawer. Every entry as a heading with its sections under\n *         it, all open: the menu button and the page are the only two taps.\n *         The short lines are left out there - on a phone the list is long\n *         enough with the labels alone.\n *\n * ⚠ Keyboard and screen reader: the WAI-ARIA \"disclosure navigation\" pattern,\n * NOT `role=\"menu\"`. These are links to pages, and a `menu` role would take\n * away the link semantics (no \"open in new tab\", a screen reader announcing\n * menu items instead of links). Each top button carries `aria-expanded` and\n * `aria-controls`; each section's list is labelled by its heading; the page\n * being looked at carries `aria-current=\"page\"`.\n *   ← / →        along the top entries (mirrored in a right-to-left interface)\n *   Home / End   first / last top entry, or first / last page in a panel\n *   ↓            on a top button: open its panel and go to its first page;\n *                in a panel: the next page\n *   ↑            in a panel: the previous page, from the first one back to\n *                the panel's button\n *   Esc          close the panel and give focus back to its button\n * Tab moves through everything in document order; focus leaving the menu, a\n * click outside it and a navigation all close the open panel.\n *\n * ⚠ Opens on a click, never on hover (owner's choice, 2026-10-03): a panel\n * that opens when the pointer crosses the bar on its way to the page is a\n * panel in the way, and a touch screen has no hover to agree with.\n *\n * ⚠ Not `position: fixed; inset: 0` anywhere (web/tests/api/overlayTop.test.ts):\n * the panel hangs under the bar inside the menu's own box, so nothing here\n * covers the window.\n *\n * ⚠⚠ Its rules are in styles/base.css (`.fx-mega`), NOT in a `<style>` block\n * here. A single-file component's styles reach only a bundle that imports it,\n * and the web-component distribution does not import this one - so the two\n * shipped stylesheets drifted while they lived here\n * (web/tests/deploy/packageLook.test.ts, 2026-10-03; ConnectionNotice learned\n * the same on 2026-09-24).\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\n\nimport { actionIconSvg } from '../lib/actionIcons';\nimport { dirOfElement } from '../lib/direction';\nimport {\n  entryIsCurrent,\n  isLinkEntry,\n  isPlainClick,\n  pruneMegaMenu,\n  stepAlongBar,\n  stepFocus,\n  type MegaMenuEntry,\n} from '../lib/megaMenu';\n\nconst props = withDefaults(\n  defineProps<{\n    /** The entries, already limited to what the reader may open. */\n    entries: MegaMenuEntry[];\n    /** The navigation's accessible name. */\n    label: string;\n    mode?: 'bar' | 'list';\n  }>(),\n  { mode: 'bar' },\n);\n\nconst emit = defineEmits<{\n  /** A plain click on a page: the host navigates (a modified click is the browser's). */\n  (e: 'navigate', target: { id: string; href: string }): void;\n}>();\n\n/* The ids that tie a button to its panel and a list to its heading. Random,\n   not a counter: two menus on one page (a test, a host drawing both modes)\n   must not share them, and `useId` is Vue 3.5 while the package asks 3.4. */\nconst uid = `fx-mega-${Math.random().toString(36).slice(2, 10)}`;\n\nconst shown = computed(() => pruneMegaMenu(props.entries));\n\nconst root = ref<HTMLElement | null>(null);\nconst openId = ref<string | null>(null);\n\nconst panelId = (entry: MegaMenuEntry) => `${uid}-${entry.id}`;\nconst headingId = (entry: MegaMenuEntry, sectionId: string) => `${uid}-${entry.id}-${sectionId}`;\n\nfunction close(): void {\n  openId.value = null;\n}\n\nfunction toggle(id: string): void {\n  openId.value = openId.value === id ? null : id;\n}\n\n/* ── Focus helpers ──────────────────────────────────────────────────────── */\n\nfunction topControls(): HTMLElement[] {\n  return Array.from(root.value?.querySelectorAll<HTMLElement>('[data-mega-top]') ?? []);\n}\n\nfunction panelLinks(entryId: string): HTMLElement[] {\n  const panel = root.value?.querySelector<HTMLElement>(`[data-mega-panel=\"${entryId}\"]`);\n  return Array.from(panel?.querySelectorAll<HTMLElement>('a.fx-mega__item') ?? []);\n}\n\nfunction topButton(entryId: string): HTMLElement | null {\n  return root.value?.querySelector<HTMLElement>(`[data-mega-top=\"${entryId}\"]`) ?? null;\n}\n\nasync function openAndFocus(entryId: string, which: 'first' | 'last'): Promise<void> {\n  openId.value = entryId;\n  await nextTick();\n  const links = panelLinks(entryId);\n  (which === 'first' ? links[0] : links[links.length - 1])?.focus();\n}\n\n/* ── Keyboard ───────────────────────────────────────────────────────────── */\n\nfunction onTopKey(ev: KeyboardEvent, index: number, entry: MegaMenuEntry): void {\n  const controls = topControls();\n  const next = stepAlongBar(ev.key, index, controls.length, dirOfElement(root.value));\n  if (next !== null) {\n    ev.preventDefault();\n    close();\n    controls[next]?.focus();\n    return;\n  }\n  if (isLinkEntry(entry)) return;\n  if (ev.key === 'ArrowDown') {\n    ev.preventDefault();\n    void openAndFocus(entry.id, 'first');\n  } else if (ev.key === 'ArrowUp') {\n    ev.preventDefault();\n    void openAndFocus(entry.id, 'last');\n  } else if (ev.key === 'Escape' && openId.value === entry.id) {\n    ev.preventDefault();\n    close();\n  }\n}\n\nfunction onPanelKey(ev: KeyboardEvent, entry: MegaMenuEntry): void {\n  if (ev.key === 'Escape') {\n    ev.preventDefault();\n    ev.stopPropagation();\n    close();\n    topButton(entry.id)?.focus();\n    return;\n  }\n  const links = panelLinks(entry.id);\n  const at = links.indexOf(document.activeElement as HTMLElement);\n  if (at < 0) return;\n  if (ev.key === 'ArrowUp' && at === 0) {\n    ev.preventDefault();\n    topButton(entry.id)?.focus();\n    return;\n  }\n  const next = stepFocus(ev.key, at, links.length);\n  if (next === null) return;\n  ev.preventDefault();\n  links[next]?.focus();\n}\n\n/* ── Pointer and focus leaving ──────────────────────────────────────────── */\n\nfunction onItemClick(ev: MouseEvent, target: { id: string; href?: string }): void {\n  if (!target.href || !isPlainClick(ev)) return;\n  ev.preventDefault();\n  close();\n  emit('navigate', { id: target.id, href: target.href });\n}\n\nfunction onFocusOut(ev: FocusEvent): void {\n  const to = ev.relatedTarget as Node | null;\n  // ⚠ A null `relatedTarget` is focus going nowhere in particular - the page\n  // body after a click on empty space, or the window losing focus. The click\n  // case is the document listener's; closing here too would close a panel\n  // the moment its own button is clicked in a browser that blurs first.\n  if (to && root.value && !root.value.contains(to)) close();\n}\n\nfunction onDocPointer(ev: PointerEvent): void {\n  if (openId.value === null) return;\n  const t = ev.target as Node | null;\n  if (t && root.value && !root.value.contains(t)) close();\n}\n\nonMounted(() => document.addEventListener('pointerdown', onDocPointer, true));\nonBeforeUnmount(() => document.removeEventListener('pointerdown', onDocPointer, true));\n\n/* A navigation the menu did not make (Back, a link on the page) still closes it. */\nconst currentKey = computed(() =>\n  shown.value\n    .flatMap((e) =>\n      isLinkEntry(e) ? (e.active ? [e.id] : []) : (e.sections ?? []).flatMap((s) => s.items.filter((i) => i.active).map((i) => i.id)),\n    )\n    .join('|'),\n);\nwatch(currentKey, close);\n</script>\n\n<template>\n  <nav\n    ref=\"root\"\n    :class=\"['fx-mega', `fx-mega--${mode}`]\"\n    :aria-label=\"label\"\n    data-testid=\"mega-menu\"\n    @focusout=\"onFocusOut\"\n  >\n    <!-- ── Wide screen: the bar ─────────────────────────────────────────── -->\n    <ul v-if=\"mode === 'bar'\" class=\"fx-mega__bar\">\n      <li\n        v-for=\"(entry, i) in shown\"\n        :key=\"entry.id\"\n        class=\"fx-mega__top\"\n      >\n        <a\n          v-if=\"isLinkEntry(entry)\"\n          :href=\"entry.href\"\n          :class=\"['fx-mega__toplink', entry.active && 'is-current']\"\n          :aria-current=\"entry.active ? 'page' : undefined\"\n          :data-mega-top=\"entry.id\"\n          :data-testid=\"`nav-${entry.id}`\"\n          @click=\"onItemClick($event, entry)\"\n          @keydown=\"onTopKey($event, i, entry)\"\n        >{{ entry.label }}</a>\n        <template v-else>\n          <button\n            type=\"button\"\n            :class=\"['fx-mega__topbtn', openId === entry.id && 'is-open', entryIsCurrent(entry) && 'is-current']\"\n            :aria-expanded=\"openId === entry.id ? 'true' : 'false'\"\n            :aria-controls=\"panelId(entry)\"\n            :data-mega-top=\"entry.id\"\n            :data-testid=\"`nav-top-${entry.id}`\"\n            @click=\"toggle(entry.id)\"\n            @keydown=\"onTopKey($event, i, entry)\"\n          >\n            <span>{{ entry.label }}</span>\n            <svg\n              class=\"fx-mega__chev\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              stroke-width=\"2\"\n              stroke-linecap=\"round\"\n              stroke-linejoin=\"round\"\n              aria-hidden=\"true\"\n            ><path d=\"m6 9 6 6 6-6\" /></svg>\n          </button>\n          <div\n            v-show=\"openId === entry.id\"\n            :id=\"panelId(entry)\"\n            class=\"fx-mega__panel\"\n            :data-mega-panel=\"entry.id\"\n            :data-testid=\"`nav-panel-${entry.id}`\"\n            @keydown=\"onPanelKey($event, entry)\"\n          >\n            <div\n              v-for=\"section in entry.sections\"\n              :key=\"section.id\"\n              class=\"fx-mega__section\"\n              :data-testid=\"`nav-group-${section.id}`\"\n            >\n              <p :id=\"headingId(entry, section.id)\" class=\"fx-mega__heading\">{{ section.label }}</p>\n              <ul class=\"fx-mega__items\" :aria-labelledby=\"headingId(entry, section.id)\">\n                <li v-for=\"item in section.items\" :key=\"item.id\">\n                  <a\n                    :href=\"item.href\"\n                    :class=\"['fx-mega__item', item.active && 'is-current']\"\n                    :aria-current=\"item.active ? 'page' : undefined\"\n                    :data-testid=\"`nav-${item.id}`\"\n                    @click=\"onItemClick($event, item)\"\n                  >\n                    <span class=\"fx-mega__icon\" aria-hidden=\"true\">\n                      <!-- eslint-disable-next-line vue/no-v-html -- static SVG from lib/actionIcons, chosen by name -->\n                      <span v-if=\"item.iconName\" class=\"fx-mega__glyph\" v-html=\"actionIconSvg(item.iconName)\"></span>\n                      <component :is=\"item.icon\" v-else-if=\"item.icon\" class=\"fx-mega__glyph\" />\n                    </span>\n                    <span class=\"fx-mega__text\">\n                      <span class=\"fx-mega__label\">{{ item.label }}</span>\n                      <span v-if=\"item.hint\" class=\"fx-mega__hint\">{{ item.hint }}</span>\n                    </span>\n                  </a>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </template>\n      </li>\n    </ul>\n\n    <!-- ── Phone: every entry as a headed list, all open ────────────────── -->\n    <div v-else class=\"fx-mega__list\">\n      <template v-for=\"entry in shown\" :key=\"entry.id\">\n        <a\n          v-if=\"isLinkEntry(entry)\"\n          :href=\"entry.href\"\n          :class=\"['fx-mega__item', 'fx-mega__item--top', entry.active && 'is-current']\"\n          :aria-current=\"entry.active ? 'page' : undefined\"\n          :data-testid=\"`nav-${entry.id}`\"\n          @click=\"onItemClick($event, entry)\"\n        >\n          <span class=\"fx-mega__icon\" aria-hidden=\"true\">\n            <component :is=\"entry.icon\" v-if=\"entry.icon\" class=\"fx-mega__glyph\" />\n          </span>\n          <span class=\"fx-mega__text\"><span class=\"fx-mega__label\">{{ entry.label }}</span></span>\n        </a>\n        <section\n          v-else\n          class=\"fx-mega__group\"\n          :aria-labelledby=\"panelId(entry)\"\n          :data-testid=\"`nav-top-${entry.id}`\"\n        >\n          <p :id=\"panelId(entry)\" class=\"fx-mega__grouphead\">{{ entry.label }}</p>\n          <div\n            v-for=\"section in entry.sections\"\n            :key=\"section.id\"\n            class=\"fx-mega__section\"\n            :data-testid=\"`nav-group-${section.id}`\"\n          >\n            <p :id=\"headingId(entry, section.id)\" class=\"fx-mega__heading\">{{ section.label }}</p>\n            <ul class=\"fx-mega__items\" :aria-labelledby=\"headingId(entry, section.id)\">\n              <li v-for=\"item in section.items\" :key=\"item.id\">\n                <a\n                  :href=\"item.href\"\n                  :class=\"['fx-mega__item', item.active && 'is-current']\"\n                  :aria-current=\"item.active ? 'page' : undefined\"\n                  :data-testid=\"`nav-${item.id}`\"\n                  @click=\"onItemClick($event, item)\"\n                >\n                  <span class=\"fx-mega__icon\" aria-hidden=\"true\">\n                    <!-- eslint-disable-next-line vue/no-v-html -- static SVG from lib/actionIcons, chosen by name -->\n                    <span v-if=\"item.iconName\" class=\"fx-mega__glyph\" v-html=\"actionIconSvg(item.iconName)\"></span>\n                    <component :is=\"item.icon\" v-else-if=\"item.icon\" class=\"fx-mega__glyph\" />\n                  </span>\n                  <span class=\"fx-mega__text\"><span class=\"fx-mega__label\">{{ item.label }}</span></span>\n                </a>\n              </li>\n            </ul>\n          </div>\n        </section>\n      </template>\n    </div>\n  </nav>\n</template>\n","/**\n * The admin panel's search, as data and rules (task #168, docs/ADMIN-PANEL.md\n * → Search): what a typed query means, which items answer it and in what\n * order they are drawn. `components/PanelSearch.vue` draws it; the host (the\n * admin panel's top bar, web/src/components/AdminSearch.vue) hands over the\n * items and gets the chosen one back.\n *\n * ⚠ It knows nothing about routes, permissions or the server. The host passes\n * only what the reader may open: the menu's own pages and settings (the menu's\n * visibility rule, never a second one), the server's hits (each from a list\n * the reader's role already lets them read) and the file index's hits.\n *\n * The owner's decisions (2026-10-06):\n *   - files are searched only on demand: without a prefix at most the first\n *     three, and a row that turns the search into `file:<words>`;\n *   - a prefix narrows to one kind: `file:`, `user:`, `app:`, `key:`,\n *     `group:`, `storage:`, `setting:`;\n *   - a label answers in the interface's language AND in English, and to its\n *     synonyms (\"LDAP\" finds Identity providers), with Turkish letters and\n *     case folded (`foldText`, the rule a file name is found by).\n *\n * Pure: no DOM, and Vue only for the type of a host's icon component.\n */\nimport type { Component } from 'vue';\n\nimport { foldText } from './fileFilters';\n\n/** What an item is, and the group it is drawn under. */\nexport type PanelSearchKind = 'page' | 'setting' | 'app' | 'user' | 'group' | 'key' | 'storage' | 'share' | 'file';\n\n/**\n * The order the groups are drawn in. Fixed rather than by best score: a\n * person learns where to look, and the panel's own places come before the\n * records in it. One exception: a group whose best row is NAMED what was\n * typed comes first (`panelSearchGroups`).\n */\nexport const PANEL_SEARCH_KINDS: readonly PanelSearchKind[] = [\n  'page',\n  'setting',\n  'app',\n  'user',\n  'group',\n  'key',\n  'storage',\n  'share',\n  'file',\n];\n\n/**\n * The prefixes, and the kind each narrows to. English words in every\n * language, like the explorer's `tag:`: a prefix is a command, and one\n * spelling is what a guide and a colleague can say.\n */\nexport const PANEL_SEARCH_PREFIXES: Readonly<Record<string, PanelSearchKind>> = {\n  file: 'file',\n  user: 'user',\n  app: 'app',\n  key: 'key',\n  group: 'group',\n  storage: 'storage',\n  setting: 'setting',\n};\n\n/** The prefixes in the order the hint line shows them. */\nexport const PANEL_SEARCH_PREFIX_ORDER: readonly string[] = ['file', 'user', 'app', 'key', 'group', 'storage', 'setting'];\n\n/** How many rows a group shows without a prefix, and with one. */\nexport const PANEL_SEARCH_GROUP_CAP = 6;\nexport const PANEL_SEARCH_FILES_CAP = 3;\nexport const PANEL_SEARCH_PREFIXED_CAP = 25;\n\n/** One row the search can offer. */\nexport interface PanelSearchItem {\n  /** Unique across every kind (`page:users`, `user:12`, `file:3:/a.txt`). */\n  id: string;\n  kind: PanelSearchKind;\n  /** What the row says, in the interface's language. */\n  label: string;\n  /** The second line: where it lives, an address, an owner. */\n  detail?: string;\n  /**\n   * Other names it answers to and does not show: its English label, another\n   * language's name of an app, a person's username.\n   */\n  terms?: readonly string[];\n  /**\n   * Synonyms (\"LDAP\" for Identity providers): weaker than a name, so a row\n   * NAMED what was typed comes before a row that is only LIKE it.\n   */\n  aliases?: readonly string[];\n  /** A glyph from the HOST's icon set, drawn as a component (the menu's own). */\n  icon?: Component;\n  /** Or a glyph from the core icon library, by name (`lib/actionIcons`). */\n  iconName?: string;\n  /** A file row's folder-ness: a file row wears the listing's own tile. */\n  isDir?: boolean;\n  /**\n   * Found by a search that already matched it (the server's, the file\n   * index's): drawn even when the words are not in what the row SAYS - a\n   * file found by its content, a person found by an address the row does not\n   * print. Ranked by the same rule as every other row.\n   */\n  found?: boolean;\n  /** Whatever the host needs to go there; handed back untouched. */\n  target?: unknown;\n}\n\n/** One of a person's recent searches, as the host's store keeps it. */\nexport interface PanelRecentSearch {\n  id: number | string;\n  query: string;\n}\n\n/**\n * Where the recent searches live - the server, per person (migration 00090):\n * the host wires these to its API. Every call may fail; the panel then shows\n * the list it had.\n */\nexport interface PanelRecentStore {\n  list(): Promise<PanelRecentSearch[]>;\n  add(query: string): Promise<void>;\n  remove(id: PanelRecentSearch['id']): Promise<void>;\n  clear(): Promise<void>;\n}\n\n/** A typed query, taken apart. */\nexport interface PanelSearchQuery {\n  /** The kind a prefix narrows to, or null for none. */\n  kind: PanelSearchKind | null;\n  /** The prefix as a word (`file`), '' for none. */\n  prefix: string;\n  /** What is searched for, the prefix taken off, trimmed. */\n  text: string;\n  /** `text` folded and split into words. */\n  words: string[];\n}\n\n/** One group as it is drawn. */\nexport interface PanelSearchGroup {\n  kind: PanelSearchKind;\n  items: PanelSearchItem[];\n  /** How many matched before the group was cut to its cap. */\n  total: number;\n}\n\n/** `text` folded (`foldText`) and split into words. */\nexport function panelWords(text: string): string[] {\n  return foldText(text ?? '')\n    .split(/\\s+/)\n    .filter((w) => w.length > 0);\n}\n\n/**\n * The query taken apart. A prefix counts only as one of the known words\n * followed by a colon at the very start (`file:rapor`, `User: ada`); any\n * other `word:` is searched for as it is, so `C:` or `12:30` is not lost.\n */\nexport function parsePanelQuery(raw: string): PanelSearchQuery {\n  const s = (raw ?? '').replace(/^\\s+/, '');\n  const m = /^([A-Za-z]+)\\s*:/.exec(s);\n  if (m) {\n    const word = m[1].toLowerCase();\n    const kind = PANEL_SEARCH_PREFIXES[word];\n    if (kind) {\n      const text = s.slice(m[0].length).trim();\n      return { kind, prefix: word, text, words: panelWords(text) };\n    }\n  }\n  const text = s.trim();\n  return { kind: null, prefix: '', text, words: panelWords(text) };\n}\n\n/** `raw` with its prefix replaced by `prefix` ('' takes it off). */\nexport function withPanelPrefix(raw: string, prefix: string): string {\n  const q = parsePanelQuery(raw);\n  return prefix ? `${prefix}:${q.text}` : q.text;\n}\n\n/** Is the character before position `i` a word boundary? */\nfunction startsWord(hay: string, i: number): boolean {\n  if (i === 0) return true;\n  return !/[\\p{L}\\p{N}]/u.test(hay[i - 1]);\n}\n\n/** How well one folded word answers one folded text, scaled by `weight`. */\nfunction wordScore(hay: string, word: string, weight: number): number {\n  if (!hay) return 0;\n  const i = hay.indexOf(word);\n  if (i < 0) return 0;\n  if (i === 0) return weight;\n  // A later word of the text: \"security\" in \"Sign-in security\".\n  if (startsWord(hay, i)) return Math.round(weight * 0.8);\n  return Math.round(weight * 0.5);\n}\n\n/**\n * How well an item answers the words: -1 for not at all, higher for better.\n *\n * Every word has to be somewhere - the label, a term, an alias or the detail\n * line - and each counts for where it was found: the start of the label most,\n * a term less, an alias less again, the detail line least. The whole query\n * being the label (or a term, or an alias) outright wins over everything, so\n * \"Uygulamalar\", \"apps\" and \"uygulama\" put the Apps page first.\n *\n * A row the server or the file index already matched (`found`) is never -1:\n * what it was found by may not be on the row.\n */\nexport function panelScore(item: PanelSearchItem, words: readonly string[]): number {\n  if (words.length === 0) return 0;\n  const label = foldText(item.label ?? '');\n  const terms = (item.terms ?? []).map((x) => foldText(x));\n  const aliases = (item.aliases ?? []).map((x) => foldText(x));\n  const detail = foldText(item.detail ?? '');\n  let score = 0;\n  for (const w of words) {\n    let best = wordScore(label, w, 100);\n    for (const term of terms) best = Math.max(best, wordScore(term, w, 70));\n    for (const alias of aliases) best = Math.max(best, wordScore(alias, w, 50));\n    best = Math.max(best, wordScore(detail, w, 25));\n    if (best <= 0) return item.found ? 1 : -1;\n    score += best;\n  }\n  const phrase = words.join(' ');\n  if (label === phrase) score += 300;\n  else if (terms.includes(phrase)) score += 200;\n  else if (aliases.includes(phrase)) score += 150;\n  else if (label.startsWith(phrase)) score += 80;\n  // A shorter label is the closer match of two that start alike.\n  score -= Math.min(label.length, 60) / 10;\n  return score;\n}\n\n/**\n * Is the whole query this item's name - its label or one of its terms (not\n * a synonym)? \"Çöp kutusu saklama\" is the setting's name, not a page's.\n */\nexport function panelExact(item: PanelSearchItem, words: readonly string[]): boolean {\n  if (words.length === 0) return false;\n  const phrase = words.join(' ');\n  if (foldText(item.label ?? '') === phrase) return true;\n  return (item.terms ?? []).some((x) => foldText(x) === phrase);\n}\n\n/**\n * The groups for a query, each sorted by score and cut to its cap. A group\n * whose best row is NAMED what was typed (`panelExact`) comes first - the\n * setting \"Trash retention\" before the Trash page that merely mentions\n * retention - and the rest follow in `PANEL_SEARCH_KINDS` order. A prefix\n * keeps its own kind alone. An empty query has no groups (the panel shows the\n * recent searches instead).\n */\nexport function panelSearchGroups(\n  items: readonly PanelSearchItem[],\n  query: PanelSearchQuery,\n  caps: Partial<Record<PanelSearchKind, number>> = {},\n): PanelSearchGroup[] {\n  if (query.words.length === 0) return [];\n  const byKind = new Map<PanelSearchKind, Array<{ item: PanelSearchItem; score: number }>>();\n  for (const item of items) {\n    if (query.kind && item.kind !== query.kind) continue;\n    const score = panelScore(item, query.words);\n    if (score < 0) continue;\n    const list = byKind.get(item.kind) ?? [];\n    list.push({ item, score });\n    byKind.set(item.kind, list);\n  }\n  const named: PanelSearchGroup[] = [];\n  const rest: PanelSearchGroup[] = [];\n  for (const kind of PANEL_SEARCH_KINDS) {\n    const list = byKind.get(kind);\n    if (!list || list.length === 0) continue;\n    // Stable: equal scores keep the order the host gave (the menu's order).\n    list.sort((a, b) => b.score - a.score);\n    const cap = caps[kind] ?? (query.kind ? PANEL_SEARCH_PREFIXED_CAP : kind === 'file' ? PANEL_SEARCH_FILES_CAP : PANEL_SEARCH_GROUP_CAP);\n    const group = { kind, items: list.slice(0, cap).map((x) => x.item), total: list.length };\n    (panelExact(list[0].item, query.words) ? named : rest).push(group);\n  }\n  return [...named, ...rest];\n}\n\n/** Every row of the groups, in the order they are drawn (the keyboard's order). */\nexport function panelSearchRows(groups: readonly PanelSearchGroup[]): PanelSearchItem[] {\n  return groups.flatMap((g) => g.items);\n}\n","<script setup lang=\"ts\">\n/**\n * PanelSearch - the admin panel's search (task #168, docs/ADMIN-PANEL.md →\n * Search): one box that finds a page, a setting, a person, a group, an API\n * key, an app, a storage, a share and - on demand - a file.\n *\n * Drawn by the admin panel's top bar (web/src/components/AdminSearch.vue),\n * and written here rather than there for the reason MegaMenu is: it is a\n * search PATTERN, not the admin panel's. The host passes what may be found\n * (`items`, already limited to what the reader may open), how to ask the\n * server (`remote`) and the file index (`files`), and where the recent\n * searches live (`recent`); it gets `choose` back and does the navigating.\n * Nothing in this file names a route, a permission or an endpoint.\n *\n * Two shapes, one component (the host says which; the admin panel's own\n * breakpoint decides):\n *\n *   box      a wide screen. A box in the top bar; pressing it (or the\n *            palette key, Ctrl+K by default) opens a panel under it with the\n *            field and the results, flush with the box's end edge.\n *   compact  a phone. A search button in the top bar; it opens a layer over\n *            the whole window, the field at its top and a back button.\n *\n * Both are teleported to <body>: the top bar is `backdrop-filter`ed, which\n * makes it the containing block of every `position: fixed` inside it - a\n * full-window layer drawn in place would have been 56 pixels tall.\n *\n * ⚠ Keyboard and screen reader: the WAI-ARIA combobox pattern with a listbox\n * popup. The field is the combobox; the results are options in groups, each\n * group labelled by its heading; the option under the arrow keys is the\n * field's `aria-activedescendant`, so focus stays in the field while typing.\n *   ↓ / ↑      the next / previous row (wraps)\n *   Enter      opens the row (the first one when none is picked)\n *   Esc        closes the panel and gives focus back to the box\n *   Delete     on a recent search (an empty field), removes it\n * The palette key works wherever the explorer's does: anywhere but inside a\n * field or a code editor somebody is typing in (lib/typingTarget).\n * A polite live region says how many rows there are.\n *\n * ⚠⚠ Its rules are in styles/base.css (`.fx-psearch`), not in a <style>\n * block here - MegaMenu's lesson (web/tests/deploy/packageLook.test.ts).\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\n\nimport { eventMatchesShortcut, shortcutHint } from '../composables/useKeyboardShortcuts';\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport { anchorUnderEndEdge, fixedViewport, type AnchoredPanelPosition } from '../lib/anchoredPanel';\nimport { dirOfElement } from '../lib/direction';\nimport { fileIconTile } from '../lib/fileIcons';\nimport {\n  PANEL_SEARCH_FILES_CAP,\n  PANEL_SEARCH_PREFIXED_CAP,\n  PANEL_SEARCH_PREFIX_ORDER,\n  panelSearchGroups,\n  parsePanelQuery,\n  withPanelPrefix,\n  type PanelRecentSearch,\n  type PanelRecentStore,\n  type PanelSearchItem,\n  type PanelSearchKind,\n  type PanelSearchQuery,\n} from '../lib/panelSearch';\nimport { popupLayer } from '../lib/popupLayer';\nimport { isTypingTarget } from '../lib/typingTarget';\n\nconst props = withDefaults(\n  defineProps<{\n    locale: string;\n    /** A phone: a button and a layer over the window, instead of the box. */\n    compact?: boolean;\n    /** What the host can find by itself (pages, settings), already limited to what the reader may open. */\n    items: PanelSearchItem[];\n    /** The server's hits for a query (people, keys, apps…), already limited by the reader's role. */\n    remote?: (query: PanelSearchQuery) => Promise<PanelSearchItem[]>;\n    /** File hits for words, at most `limit`. */\n    files?: (text: string, limit: number) => Promise<PanelSearchItem[]>;\n    /** Where the recent searches live. */\n    recent?: PanelRecentStore;\n    /** The palette key opens this search (only one search on a page should say yes). */\n    shortcut?: boolean;\n  }>(),\n  { compact: false, remote: undefined, files: undefined, recent: undefined, shortcut: true },\n);\n\nconst emit = defineEmits<{\n  /** A row was chosen: the host goes there. */\n  (e: 'choose', item: PanelSearchItem): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/* Random ids (MegaMenu's reasoning: two searches on one page must not share\n   them, and `useId` is Vue 3.5 while the package asks 3.4). */\nconst uid = `fx-psearch-${Math.random().toString(36).slice(2, 10)}`;\nconst listId = `${uid}-list`;\n\nconst trigger = ref<HTMLButtonElement | null>(null);\nconst layer = ref<HTMLElement | null>(null);\nconst inputEl = ref<HTMLInputElement | null>(null);\nconst listEl = ref<HTMLElement | null>(null);\n\nconst open = ref(false);\nconst query = ref('');\nconst active = ref(0);\nconst pos = ref<AnchoredPanelPosition | null>(null);\nconst z = ref(80);\n\nconst parsed = computed(() => parsePanelQuery(query.value));\n\n/* ── What the server and the file index found ───────────────────────────── */\n\n/** Under this many characters nothing is asked of the server. */\nconst REMOTE_MIN = 2;\nconst DEBOUNCE_MS = 200;\n\nconst remoteItems = ref<PanelSearchItem[]>([]);\nconst fileItems = ref<PanelSearchItem[]>([]);\nconst loading = ref(false);\nconst failed = ref(false);\nlet timer: ReturnType<typeof setTimeout> | undefined;\nlet seq = 0;\n\nfunction schedule(q: PanelSearchQuery): void {\n  if (timer) clearTimeout(timer);\n  const mine = ++seq;\n  if (q.text.length < REMOTE_MIN || (!props.remote && !props.files)) {\n    remoteItems.value = [];\n    fileItems.value = [];\n    loading.value = false;\n    failed.value = false;\n    return;\n  }\n  loading.value = true;\n  timer = setTimeout(() => void ask(q, mine), DEBOUNCE_MS);\n}\n\nasync function ask(q: PanelSearchQuery, mine: number): Promise<void> {\n  const wantsRemote = !!props.remote && q.kind !== 'file' && q.kind !== 'page' && q.kind !== 'setting';\n  // Files only on demand: the first few without a prefix, a full page with `file:`.\n  const wantsFiles = !!props.files && (q.kind === null || q.kind === 'file');\n  const limit = q.kind === 'file' ? PANEL_SEARCH_PREFIXED_CAP : PANEL_SEARCH_FILES_CAP;\n  const [r, f] = await Promise.allSettled([\n    wantsRemote && props.remote ? props.remote(q) : Promise.resolve([] as PanelSearchItem[]),\n    wantsFiles && props.files ? props.files(q.text, limit) : Promise.resolve([] as PanelSearchItem[]),\n  ]);\n  if (mine !== seq) return; // a newer query won\n  remoteItems.value = r.status === 'fulfilled' ? r.value.map((x) => ({ ...x, found: true })) : [];\n  fileItems.value = f.status === 'fulfilled' ? f.value.map((x) => ({ ...x, kind: 'file' as const, found: true })) : [];\n  // ⚠ Said, not swallowed: a failure drawn as an empty answer is a person\n  // believing the user or the file is not there (CommandPalette's lesson).\n  failed.value = r.status === 'rejected' || f.status === 'rejected';\n  loading.value = false;\n}\n\nwatch(query, () => {\n  active.value = 0;\n  schedule(parsed.value);\n});\n\n/* ── Recent searches ────────────────────────────────────────────────────── */\n\nconst recentList = ref<PanelRecentSearch[]>([]);\n\nasync function loadRecent(): Promise<void> {\n  if (!props.recent) return;\n  try {\n    recentList.value = await props.recent.list();\n  } catch {\n    /* keep the list we had */\n  }\n}\n\nfunction remember(raw: string): void {\n  const q = raw.trim();\n  if (!q || !props.recent) return;\n  recentList.value = [{ id: `local-${q}`, query: q }, ...recentList.value.filter((r) => r.query !== q)];\n  void props.recent.add(q).then(loadRecent, () => undefined);\n}\n\nasync function forget(entry: PanelRecentSearch): Promise<void> {\n  recentList.value = recentList.value.filter((r) => r.id !== entry.id);\n  if (active.value >= rows.value.length) active.value = Math.max(0, rows.value.length - 1);\n  try {\n    await props.recent?.remove(entry.id);\n  } catch {\n    await loadRecent();\n  }\n}\n\nasync function forgetAll(): Promise<void> {\n  recentList.value = [];\n  active.value = 0;\n  try {\n    await props.recent?.clear();\n  } catch {\n    await loadRecent();\n  }\n  inputEl.value?.focus();\n}\n\n/* ── The rows ───────────────────────────────────────────────────────────── */\n\ntype Row =\n  | { type: 'item'; id: string; index: number; item: PanelSearchItem }\n  | { type: 'files-all'; id: string; index: number }\n  | { type: 'recent'; id: string; index: number; entry: PanelRecentSearch };\n\ninterface Section {\n  key: PanelSearchKind | 'recent';\n  heading: string;\n  rows: Row[];\n}\n\nconst GROUP_KEYS: Record<PanelSearchKind, string> = {\n  page: 'panelsearch.group.page',\n  setting: 'panelsearch.group.setting',\n  app: 'panelsearch.group.app',\n  user: 'panelsearch.group.user',\n  group: 'panelsearch.group.group',\n  key: 'panelsearch.group.key',\n  storage: 'panelsearch.group.storage',\n  share: 'panelsearch.group.share',\n  file: 'panelsearch.group.file',\n};\n\n/** May the \"search files\" row be offered for this query? */\nconst offersAllFiles = computed(() => !!props.files && parsed.value.kind === null && parsed.value.text.length >= REMOTE_MIN);\n\nconst sections = computed<Section[]>(() => {\n  let index = 0;\n  const out: Section[] = [];\n  const q = parsed.value;\n  if (q.words.length === 0) {\n    if (q.kind === null && recentList.value.length) {\n      out.push({\n        key: 'recent',\n        heading: t('panelsearch.group.recent'),\n        rows: recentList.value.map((entry) => ({ type: 'recent' as const, id: `recent:${entry.id}`, index: index++, entry })),\n      });\n    }\n    return out;\n  }\n  const groups = panelSearchGroups([...props.items, ...remoteItems.value, ...fileItems.value], q);\n  for (const g of groups) {\n    out.push({\n      key: g.kind,\n      heading: t(GROUP_KEYS[g.kind]),\n      rows: g.items.map((item) => ({ type: 'item' as const, id: `item:${item.id}`, index: index++, item })),\n    });\n  }\n  if (offersAllFiles.value) {\n    const files = out.find((s) => s.key === 'file');\n    const row: Row = { type: 'files-all', id: 'files-all', index: index++ };\n    if (files) files.rows.push(row);\n    else out.push({ key: 'file', heading: t(GROUP_KEYS.file), rows: [row] });\n  }\n  return out;\n});\n\nconst rows = computed<Row[]>(() => sections.value.flatMap((s) => s.rows));\n\nconst optionId = (index: number) => `${uid}-opt-${index}`;\nconst activeId = computed(() => (rows.value.length && active.value < rows.value.length ? optionId(active.value) : undefined));\n\n/** What the live region says once the rows settle. */\nconst liveText = computed(() => {\n  if (!open.value || parsed.value.words.length === 0) return '';\n  if (loading.value) return t('panelsearch.searching');\n  const n = rows.value.filter((r) => r.type === 'item').length;\n  return n === 0 ? t('panelsearch.empty', { q: parsed.value.text }) : t('panelsearch.count', { n });\n});\n\nconst showEmpty = computed(\n  () => parsed.value.words.length > 0 && !loading.value && rows.value.every((r) => r.type !== 'item'),\n);\n\nfunction rowIcon(item: PanelSearchItem): string {\n  if (item.kind === 'file') {\n    const name = item.label ?? '';\n    const dot = name.lastIndexOf('.');\n    return fileIconTile({\n      type: item.isDir ? 'dir' : 'file',\n      basename: name,\n      extension: !item.isDir && dot > 0 ? name.slice(dot + 1) : '',\n    });\n  }\n  return actionIconSvg(item.iconName ?? KIND_ICONS[item.kind]);\n}\n\n/** The mark of a row that brings no glyph of its own. */\nconst KIND_ICONS: Record<PanelSearchKind, string> = {\n  page: 'goto',\n  setting: 'admin',\n  app: 'plugin',\n  user: 'account',\n  group: 'account',\n  key: 'lock',\n  storage: 'connect',\n  share: 'link',\n  file: 'open',\n};\n\n/* ── Opening and closing ────────────────────────────────────────────────── */\n\nfunction place(): void {\n  const el = trigger.value;\n  if (!el || typeof window === 'undefined') return;\n  z.value = popupLayer([el]);\n  if (props.compact) {\n    pos.value = null;\n    return;\n  }\n  pos.value = anchorUnderEndEdge(\n    el.getBoundingClientRect(),\n    fixedViewport(),\n    { width: 560, gutter: 16, gap: 6, maxHeight: 620, dir: dirOfElement(el) },\n  );\n}\n\nconst layerStyle = computed<Record<string, string | undefined>>(() => {\n  const style: Record<string, string | undefined> = { zIndex: String(z.value) };\n  if (pos.value) {\n    style.top = pos.value.top;\n    style.right = pos.value.right;\n    style.left = pos.value.left;\n    style.width = pos.value.width;\n    style.maxHeight = pos.value.maxHeight;\n  }\n  return style;\n});\n\nasync function openPanel(seed?: string): Promise<void> {\n  if (!open.value) {\n    place();\n    open.value = true;\n    void loadRecent();\n  }\n  if (typeof seed === 'string') query.value = seed;\n  await nextTick();\n  inputEl.value?.focus();\n  if (typeof seed !== 'string') inputEl.value?.select();\n}\n\nfunction close(returnFocus: boolean): void {\n  if (!open.value) return;\n  open.value = false;\n  if (timer) clearTimeout(timer);\n  loading.value = false;\n  if (returnFocus) void nextTick(() => trigger.value?.focus());\n}\n\nfunction onTriggerKey(ev: KeyboardEvent): void {\n  // Typing on the box starts the search with that letter.\n  if (ev.key.length === 1 && !ev.ctrlKey && !ev.metaKey && !ev.altKey && ev.key !== ' ') {\n    ev.preventDefault();\n    void openPanel(ev.key);\n  } else if (ev.key === 'ArrowDown') {\n    ev.preventDefault();\n    void openPanel();\n  }\n}\n\n/* ── Choosing ───────────────────────────────────────────────────────────── */\n\nfunction choose(row: Row | undefined): void {\n  if (!row) return;\n  if (row.type === 'recent') {\n    query.value = row.entry.query;\n    void nextTick(() => inputEl.value?.focus());\n    return;\n  }\n  if (row.type === 'files-all') {\n    // The owner's \"all\": the same words, as a file search.\n    query.value = withPanelPrefix(query.value, 'file');\n    void nextTick(() => inputEl.value?.focus());\n    return;\n  }\n  remember(query.value);\n  close(false);\n  emit('choose', row.item);\n}\n\nfunction setPrefix(prefix: string): void {\n  query.value = withPanelPrefix(query.value, prefix);\n  void nextTick(() => inputEl.value?.focus());\n}\n\nfunction clearQuery(): void {\n  query.value = '';\n  void nextTick(() => inputEl.value?.focus());\n}\n\nfunction move(delta: number): void {\n  const n = rows.value.length;\n  if (!n) return;\n  active.value = (active.value + delta + n) % n;\n  void nextTick(() => {\n    const row = listEl.value?.querySelector<HTMLElement>(`#${optionId(active.value)}`);\n    if (row && typeof row.scrollIntoView === 'function') row.scrollIntoView({ block: 'nearest' });\n  });\n}\n\nfunction onInputKey(ev: KeyboardEvent): void {\n  switch (ev.key) {\n    case 'ArrowDown':\n      ev.preventDefault();\n      move(1);\n      break;\n    case 'ArrowUp':\n      ev.preventDefault();\n      move(-1);\n      break;\n    case 'Enter':\n      if (ev.isComposing) return;\n      ev.preventDefault();\n      choose(rows.value[active.value] ?? rows.value[0]);\n      break;\n    case 'Escape':\n      ev.preventDefault();\n      ev.stopPropagation();\n      close(true);\n      break;\n    case 'Delete': {\n      const row = rows.value[active.value];\n      if (query.value === '' && row?.type === 'recent') {\n        ev.preventDefault();\n        void forget(row.entry);\n      }\n      break;\n    }\n  }\n}\n\n/* ── Leaving ────────────────────────────────────────────────────────────── */\n\nfunction inside(node: Node | null): boolean {\n  if (!node) return false;\n  return !!(layer.value?.contains(node) || trigger.value?.contains(node));\n}\n\nfunction onFocusOut(ev: FocusEvent): void {\n  // The phone's layer covers the window: focus leaves it only by its own\n  // buttons. The box's panel closes when focus goes elsewhere on the page.\n  if (props.compact) return;\n  const to = ev.relatedTarget as Node | null;\n  if (to && !inside(to)) close(false);\n}\n\nfunction onDocPointer(ev: PointerEvent): void {\n  if (!open.value || props.compact) return;\n  if (!inside(ev.target as Node | null)) close(false);\n}\n\nfunction onDocKey(ev: KeyboardEvent): void {\n  if (!props.shortcut || ev.defaultPrevented) return;\n  if (!eventMatchesShortcut(ev, 'palette')) return;\n  // The explorer's rule for the same key (useKeyboardShortcuts): typing in a\n  // field or a code editor is typing, and the key is the editor's there.\n  if (isTypingTarget(ev.target) && !inside(ev.target as Node | null)) return;\n  ev.preventDefault();\n  if (open.value) {\n    inputEl.value?.focus();\n    inputEl.value?.select();\n  } else {\n    void openPanel();\n  }\n}\n\nfunction onResize(): void {\n  if (open.value) place();\n}\n\nonMounted(() => {\n  document.addEventListener('keydown', onDocKey);\n  document.addEventListener('pointerdown', onDocPointer, true);\n  window.addEventListener('resize', onResize);\n});\n\nonBeforeUnmount(() => {\n  if (timer) clearTimeout(timer);\n  document.removeEventListener('keydown', onDocKey);\n  document.removeEventListener('pointerdown', onDocPointer, true);\n  window.removeEventListener('resize', onResize);\n});\n\n/** The palette key as this person has it bound, for the box's key cap ('' = none). */\nconst keyHint = computed(() => (props.shortcut ? shortcutHint('palette') : ''));\n\ndefineExpose({ openPanel, close });\n</script>\n\n<template>\n  <div :class=\"['fx-psearch', compact ? 'fx-psearch--compact' : 'fx-psearch--box']\">\n    <button\n      ref=\"trigger\"\n      type=\"button\"\n      class=\"fx-psearch__trigger\"\n      :aria-label=\"t('panelsearch.label')\"\n      aria-haspopup=\"dialog\"\n      :aria-expanded=\"open ? 'true' : 'false'\"\n      data-testid=\"panel-search-open\"\n      @click=\"open ? close(true) : openPanel()\"\n      @keydown=\"onTriggerKey\"\n    >\n      <!-- eslint-disable-next-line vue/no-v-html -- static SVG from lib/actionIcons -->\n      <span class=\"fx-psearch__glyph\" aria-hidden=\"true\" v-html=\"actionIconSvg('search')\"></span>\n      <span v-if=\"!compact\" class=\"fx-psearch__trigger-text\">{{ t('panelsearch.trigger') }}</span>\n      <kbd v-if=\"!compact && keyHint\" class=\"fx-psearch__kbd\">{{ keyHint }}</kbd>\n    </button>\n\n    <Teleport to=\"body\">\n      <div\n        v-if=\"open\"\n        ref=\"layer\"\n        :class=\"['fx-psearch__layer', compact ? 'fx-psearch__layer--full' : 'fx-psearch__layer--drop']\"\n        :style=\"layerStyle\"\n        role=\"dialog\"\n        :aria-modal=\"compact ? 'true' : undefined\"\n        :aria-label=\"t('panelsearch.label')\"\n        data-testid=\"panel-search\"\n        @focusout=\"onFocusOut\"\n      >\n        <div class=\"fx-psearch__field\">\n          <button\n            v-if=\"compact\"\n            type=\"button\"\n            class=\"fx-psearch__iconbtn\"\n            :aria-label=\"t('panelsearch.close')\"\n            data-testid=\"panel-search-close\"\n            @click=\"close(true)\"\n          >\n            <!-- eslint-disable-next-line vue/no-v-html -- static SVG from lib/actionIcons -->\n            <span class=\"fx-psearch__glyph\" aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n          </button>\n          <!-- eslint-disable-next-line vue/no-v-html -- static SVG from lib/actionIcons -->\n          <span v-else class=\"fx-psearch__glyph fx-psearch__glyph--field\" aria-hidden=\"true\" v-html=\"actionIconSvg('search')\"></span>\n          <input\n            ref=\"inputEl\"\n            v-model=\"query\"\n            type=\"text\"\n            class=\"fx-psearch__input\"\n            role=\"combobox\"\n            :aria-label=\"t('panelsearch.label')\"\n            aria-autocomplete=\"list\"\n            :aria-expanded=\"rows.length > 0 ? 'true' : 'false'\"\n            :aria-controls=\"listId\"\n            :aria-activedescendant=\"activeId\"\n            :placeholder=\"t('panelsearch.placeholder')\"\n            autocomplete=\"off\"\n            autocapitalize=\"off\"\n            spellcheck=\"false\"\n            enterkeyhint=\"search\"\n            data-testid=\"panel-search-input\"\n            @keydown=\"onInputKey\"\n          />\n          <button\n            v-if=\"query\"\n            type=\"button\"\n            class=\"fx-psearch__iconbtn\"\n            :aria-label=\"t('panelsearch.clear')\"\n            data-testid=\"panel-search-clear\"\n            @click=\"clearQuery\"\n          >\n            <!-- eslint-disable-next-line vue/no-v-html -- static SVG from lib/actionIcons -->\n            <span class=\"fx-psearch__glyph\" aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n          </button>\n        </div>\n\n        <div :id=\"listId\" ref=\"listEl\" class=\"fx-psearch__list\" role=\"listbox\" :aria-label=\"t('panelsearch.results')\">\n          <div\n            v-for=\"section in sections\"\n            :key=\"section.key\"\n            class=\"fx-psearch__group\"\n            role=\"group\"\n            :aria-labelledby=\"`${uid}-h-${section.key}`\"\n            :data-testid=\"`panel-search-group-${section.key}`\"\n          >\n            <div :id=\"`${uid}-h-${section.key}`\" class=\"fx-psearch__heading\" role=\"presentation\">{{ section.heading }}</div>\n            <div\n              v-for=\"row in section.rows\"\n              :id=\"optionId(row.index)\"\n              :key=\"row.id\"\n              :class=\"['fx-psearch__row', row.index === active && 'is-active']\"\n              role=\"option\"\n              :aria-selected=\"row.index === active ? 'true' : 'false'\"\n              :data-testid=\"row.type === 'item' ? `panel-search-row-${row.item.kind}` : `panel-search-${row.type}`\"\n              :data-id=\"row.type === 'item' ? row.item.id : undefined\"\n              @mousedown.prevent\n              @mouseenter=\"active = row.index\"\n              @click=\"choose(row)\"\n            >\n              <template v-if=\"row.type === 'item'\">\n                <span class=\"fx-psearch__icon\" aria-hidden=\"true\">\n                  <component :is=\"row.item.icon\" v-if=\"row.item.icon && row.item.kind !== 'file'\" class=\"fx-psearch__svg\" />\n                  <!-- eslint-disable-next-line vue/no-v-html -- static SVG from lib/actionIcons + lib/fileIcons -->\n                  <span v-else class=\"fx-psearch__svg\" v-html=\"rowIcon(row.item)\"></span>\n                </span>\n                <span class=\"fx-psearch__text\">\n                  <span class=\"fx-psearch__label\"><bdi>{{ row.item.label }}</bdi></span>\n                  <span v-if=\"row.item.detail\" class=\"fx-psearch__detail\"><bdi>{{ row.item.detail }}</bdi></span>\n                </span>\n              </template>\n              <template v-else-if=\"row.type === 'files-all'\">\n                <!-- eslint-disable-next-line vue/no-v-html -- static SVG from lib/actionIcons -->\n                <span class=\"fx-psearch__icon\" aria-hidden=\"true\"><span class=\"fx-psearch__svg\" v-html=\"actionIconSvg('search')\"></span></span>\n                <span class=\"fx-psearch__text\">\n                  <span class=\"fx-psearch__label\">{{ t('panelsearch.files_all', { q: parsed.text }) }}</span>\n                </span>\n              </template>\n              <template v-else>\n                <!-- eslint-disable-next-line vue/no-v-html -- static SVG from lib/actionIcons -->\n                <span class=\"fx-psearch__icon\" aria-hidden=\"true\"><span class=\"fx-psearch__svg\" v-html=\"actionIconSvg('search')\"></span></span>\n                <span class=\"fx-psearch__text\">\n                  <span class=\"fx-psearch__label\"><bdi>{{ row.entry.query }}</bdi></span>\n                </span>\n                <button\n                  type=\"button\"\n                  class=\"fx-psearch__iconbtn fx-psearch__remove\"\n                  tabindex=\"-1\"\n                  :aria-label=\"t('panelsearch.recent_remove')\"\n                  :title=\"t('panelsearch.recent_remove')\"\n                  data-testid=\"panel-search-recent-remove\"\n                  @click.stop=\"forget(row.entry)\"\n                >\n                  <!-- eslint-disable-next-line vue/no-v-html -- static SVG from lib/actionIcons -->\n                  <span class=\"fx-psearch__glyph\" aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n                </button>\n              </template>\n            </div>\n          </div>\n\n          <p v-if=\"loading && rows.length === 0\" class=\"fx-psearch__note\">{{ t('panelsearch.searching') }}</p>\n          <p v-else-if=\"showEmpty\" class=\"fx-psearch__note\" data-testid=\"panel-search-empty\">\n            {{ t('panelsearch.empty', { q: parsed.text }) }}\n          </p>\n          <p v-if=\"failed\" class=\"fx-psearch__note fx-psearch__note--warn\" role=\"alert\" data-testid=\"panel-search-failed\">\n            {{ t('panelsearch.failed') }}\n          </p>\n        </div>\n\n        <div class=\"fx-psearch__foot\">\n          <span class=\"fx-psearch__foot-label\">{{ t('panelsearch.prefixes') }}</span>\n          <button\n            v-for=\"p in PANEL_SEARCH_PREFIX_ORDER\"\n            :key=\"p\"\n            type=\"button\"\n            :class=\"['fx-psearch__chip', parsed.prefix === p && 'is-on']\"\n            :aria-pressed=\"parsed.prefix === p ? 'true' : 'false'\"\n            :data-testid=\"`panel-search-prefix-${p}`\"\n            @mousedown.prevent\n            @click=\"setPrefix(parsed.prefix === p ? '' : p)\"\n          >{{ p }}:</button>\n          <button\n            v-if=\"parsed.words.length === 0 && parsed.kind === null && recentList.length\"\n            type=\"button\"\n            class=\"fx-psearch__clearall\"\n            data-testid=\"panel-search-recent-clear\"\n            @mousedown.prevent\n            @click=\"forgetAll\"\n          >{{ t('panelsearch.recent_clear') }}</button>\n        </div>\n\n        <p class=\"fe-sr-only\" role=\"status\" aria-live=\"polite\">{{ liveText }}</p>\n      </div>\n    </Teleport>\n  </div>\n</template>\n","/**\n * The New document dialog's name (#56).\n *\n * The field holds the WHOLE file name. The chosen type decides the bytes the\n * server writes and the editor the file opens in; it only PREFILLS the name\n * (`Untitled.txt`), and the person may change the extension or remove it —\n * `LICENSE`, `Makefile`, `test.conf` and `example.custom` are all Plain text.\n *\n * ⚠ Except where the editor needs it. An office document or a diagram is a\n * container its editor finds by extension (OnlyOffice picks Word/Excel/\n * PowerPoint from it; \"report\" with no extension is a ZIP nothing opens), so\n * those types keep theirs: the server appends it when it is missing and the\n * dialog says so before Create, rather than locking the field. Which types\n * those are is the server's answer (`ext_required`), not a list kept here.\n *\n * Pure functions, so the rules can be read and tested without a DOM\n * (tests/lib/newDocName.test.ts); NewDocumentModal only wires them.\n */\nimport type { NewDocType } from '../types/FileNode';\nimport { isInternalName } from './internalPaths';\n\n/**\n * Must a file of this type carry its extension?\n *\n * ⚠ `undefined` counts as yes. A server from before #56 publishes no\n * `ext_required` and appends the extension to EVERY type, so a dialog that\n * promised it `LICENSE` would hand back `LICENSE.txt`. Treating that server's\n * types as locked makes the dialog tell the truth (\"will be created as\n * LICENSE.txt\") instead.\n */\nexport function extLocked(ty: Pick<NewDocType, 'ext_required'>): boolean {\n  return ty.ext_required !== false;\n}\n\n/** The extension of a name the way the server reads it (Go's `path.Ext`):\n *  after the last dot, a leading dot included — `.docx` is an extension. */\nfunction extOf(name: string): string {\n  const dot = name.lastIndexOf('.');\n  return dot >= 0 ? name.slice(dot + 1).toLowerCase() : '';\n}\n\nfunction endsWithExt(name: string, ext: string): boolean {\n  return name.toLowerCase().endsWith('.' + ext.toLowerCase());\n}\n\n/**\n * Where the stem ends — the selection a rename makes, so typing replaces the\n * name and keeps the extension. A dot at position 0 starts the NAME of a\n * dotfile (`.gitignore`), not an extension, so it selects everything.\n */\nexport function stemEnd(name: string): number {\n  const dot = name.lastIndexOf('.');\n  return dot > 0 ? dot : name.length;\n}\n\n/*\n * The free name a taken one is offered instead (`Untitled (2).txt`) is the\n * SERVER's: the New document dialog asks the create's dry run, which answers\n * with the existence check the create makes and ops.UniqueDestNumbered's\n * numbering (#211, audit B18). The copy that stood here compared lower-cased\n * names, so a case-sensitive store's free \"Report.docx\" read as taken.\n */\n\n/**\n * The name, carried across a change of type.\n *\n * The extension is swapped only while it is still the PREVIOUS type's default\n * — `notes.txt` → `notes.md` — because that is the part the dialog put there.\n * A name with no extension or one the person chose (`LICENSE`, `test.conf`)\n * is theirs and stays. Switching to a type whose editor needs its extension\n * adds it, since the server would.\n */\nexport function retypeDocName(name: string, prev: NewDocType | null, next: NewDocType): string {\n  if (!name.trim()) return name;\n  if (prev && endsWithExt(name, prev.ext) && name.length > prev.ext.length + 1) {\n    return name.slice(0, name.length - prev.ext.length - 1) + '.' + next.ext;\n  }\n  if (extLocked(next) && !endsWithExt(name, next.ext)) return `${name}.${next.ext}`;\n  return name;\n}\n\n/** The name the server will write — what the collision check and the\n *  \"will be created as\" line quote. */\nexport function finalDocName(name: string, ty: NewDocType): string {\n  const n = name.trim();\n  if (!n || !extLocked(ty) || endsWithExt(n, ty.ext)) return n;\n  return `${n}.${ty.ext}`;\n}\n\nexport type DocNameProblem =\n  | { kind: 'slash' }\n  | { kind: 'dots' }\n  | { kind: 'bare_ext' }\n  | { kind: 'reserved'; name: string }\n  | { kind: 'ext_needs_type'; ext: string };\n\n/**\n * Why this name cannot be created, or null. The same refusals the server\n * makes (manager_newdoc.go resolveNewDocName + the reserved-name gate), said\n * before the click; the server still makes them.\n *\n * `all` is every type the server can create — withheld ones included, because\n * an empty `x.docx` made as Plain text is refused whether or not this install\n * can open Word documents.\n */\nexport function docNameProblem(name: string, ty: NewDocType, all: NewDocType[]): DocNameProblem | null {\n  const n = name.trim();\n  if (!n) return null;\n  if (/[\\\\/]/.test(n)) return { kind: 'slash' };\n  if (/^\\.+$/.test(n)) return { kind: 'dots' };\n  const final = finalDocName(n, ty);\n  if (final.toLowerCase() === '.' + ty.ext.toLowerCase()) return { kind: 'bare_ext' };\n  if (isInternalName(final)) return { kind: 'reserved', name: final };\n  if (!extLocked(ty)) {\n    const ext = extOf(n);\n    if (ext && ext !== ty.ext && all.some((o) => o.ext === ext && extLocked(o))) {\n      return { kind: 'ext_needs_type', ext };\n    }\n  }\n  return null;\n}\n","<script setup lang=\"ts\">\n/**\n * NewDocumentModal — \"New document\": pick a type, name it, choose where it\n * goes, get an empty file of that type back.\n *\n * ## Why the type list is not in this file\n *\n * The obvious implementation is a constant array of extensions right here.\n * It would be wrong in two directions at once.\n *\n * Downwards: the server is the only party that knows whether it can PRODUCE\n * the bytes. An empty `.md` is an empty file, but an empty `.docx` is a ZIP of\n * XML parts, and if this deployment's binary holds no template for a format\n * then offering it creates a file no program will open. That answer arrives in\n * `capabilities.newdoc_types` (internal/newdoc), and it is the `types` prop.\n *\n * Upwards: the server does NOT know whether this browser can OPEN the result.\n * OnlyOffice may be unconfigured, may be configured but failing its probe, or\n * may be overridden by the embedder to a URL the backend cannot see. So each\n * row names the service its editor needs (`requires`) and the host answers\n * with `onlyOfficeReady` / `drawioReady` — the same resolution the explorer\n * already does for the viewers themselves.\n *\n * ⚠ The rule that falls out of this: **a type nobody here can open is not\n * offered**. Creating `report.docx` on an install with no document server\n * hands somebody a file and then refuses to open it, which is a worse outcome\n * than the entry not being there. When a whole family is withheld this way the\n * dialog says so in one quiet line, because \"why is Word missing\" should not\n * require reading the source.\n *\n * ## Where \"where\" is asked\n *\n * ⚠ Not here. This dialog grew its own one-level folder browser — an Up\n * button, a row list, a \"Save here\" — and `modals/DestinationPickerModal.vue`\n * was then written for Move to / Copy to, which is the same question with the\n * same rules (what counts as writable, whether an unwritable folder is hidden\n * or greyed, what sits above a storage root). Two choosers is how those rules\n * start disagreeing, so there is one: this mounts the picker and keeps only\n * the answer.\n *\n * ## Where the write is checked\n *\n * In three places, and only the last one counts. The browser hides folders the\n * person cannot write to; the dialog refuses to submit into one; the SERVER\n * checks ACL and read-only state and refuses regardless of what arrived. The\n * first two are courtesies that keep somebody from typing a name for thirty\n * seconds before being told no.\n *\n * Name collisions are the same shape, with one difference: whether a name is\n * taken, and which free name to offer instead, is asked of the SERVER\n * (`newFileCheck`, the create's own dry run - #211 audit B18), which answers\n * with the existence check the create makes and its own \" (2)\" numbering. The\n * dialog used to lower-case the listing itself, and so refused \"Report.docx\"\n * beside \"report.docx\" on a store where the two are different files. The\n * create endpoint answers 409 anyway.\n *\n * ## The name is the whole name (#56)\n *\n * The field holds the file name, extension and all. The TYPE decides the\n * bytes the server writes and the editor the file opens in; it only prefills\n * the name (`Untitled.txt`). It used to draw the extension as a read-only\n * suffix beside the field, which made `LICENSE`, `Makefile`, `test.conf` and\n * `example.custom` impossible to create. A type whose editor finds it BY\n * extension (office documents, diagrams — `ext_required`) still keeps it: the\n * dialog says \"will be created as report.docx\" instead of locking the field.\n * The rules are lib/newDocName; this file wires them.\n *\n * ## It makes a DRAFT (issue #71)\n *\n * On a server that keeps drafts for this person (`drafts`, from\n * `capabilities.drafts`) Create no longer writes the file where it was asked\n * for: it writes a draft — the same bytes, in the person's own drafts area of\n * that storage — and the editor opens on it. Nothing appears in the folder\n * until the draft is saved; a person who changes their mind leaves nothing\n * behind. At the draft limit Create is refused and the dialog says so, with\n * the way to Drafts; it never falls back to creating the file instead.\n */\nimport { computed, nextTick, ref, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport type { NewDocType } from '../types/FileNode';\nimport type { FileApi, ManagerResponse, NewFileCheck, NewFileResponse } from '../composables/useFileApi';\nimport { useLocale } from '../composables/useLocale';\nimport { iconTile, iconFamilyFor, typeLabelFor } from '../lib/fileIcons';\nimport { crumbsOfWire, permAllowsWrite, splitWire } from '../lib/destinationTree';\nimport Modal from './Modal.vue';\nimport DestinationPickerModal from './DestinationPickerModal.vue';\nimport { draftLimitOf, isDraftLimit } from '../lib/drafts';\nimport { inlineKeyStep } from '../lib/direction';\nimport { labelOf } from '../lib/pluginLabel';\nimport {\n  docNameProblem,\n  extLocked,\n  finalDocName,\n  retypeDocName,\n  stemEnd,\n} from '../lib/newDocName';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  theme?: ThemeMode;\n  /** The host's API wrapper — the dialog does its own listing + create. */\n  api: FileApi;\n  /**\n   * `capabilities.newdoc_types`. Undefined/null on a server that predates the\n   * feature; the host should not offer the entry at all in that case, and if\n   * it does anyway the dialog degrades to its empty state rather than guessing.\n   */\n  types?: NewDocType[] | null;\n  /** Adapter-qualified folder in view, e.g. `main://docs`. Empty at the root. */\n  currentPath: string;\n  /** Storage names, for the destination browser's top level. */\n  storages?: string[];\n  /** Resolved by the host: is there a usable OnlyOffice / drawio? */\n  onlyOfficeReady?: boolean;\n  drawioReady?: boolean;\n  /** Could this person set a missing service up (`capabilities.caller_admin`)?\n   *  Adds WHERE to the line that says which families are missing. */\n  canConfigure?: boolean;\n  /** Make a DRAFT rather than the file (issue #71): the server keeps drafts\n   *  for this person (`capabilities.drafts`). Absent: the file is created. */\n  drafts?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'created', file: NewFileResponse): void;\n  (e: 'error', payload: { message: string }): void;\n  /** Drafts: the person asked to see their drafts (from the limit message). */\n  (e: 'open-drafts'): void;\n}>();\n\nconst { t, dir } = useLocale(() => props.locale);\n\n/* ================================================================== types */\n\n/** A row's identity: its key (an app's row), else its extension. */\nfunction keyOf(ty: NewDocType): string {\n  return ty.key || ty.ext;\n}\n\nfunction satisfied(ty: NewDocType): boolean {\n  if (ty.requires === 'onlyoffice') return !!props.onlyOfficeReady;\n  if (ty.requires === 'drawio') return !!props.drawioReady;\n  return true;\n}\n\nconst offered = computed(() => (props.types ?? []).filter(satisfied));\n\n/** Services that are holding a type back, so the dialog can say which.\n *  A kind an app's row makes anyway (draw.io's app for `.drawio`) is not\n *  missing: saying \"Diagrams need draw.io\" beside the app's own .drawio row\n *  would contradict the row. */\nconst withheld = computed(() => {\n  const madeByApps = new Set(offered.value.filter((ty) => ty.app).map((ty) => ty.ext));\n  const out: string[] = [];\n  for (const ty of props.types ?? []) {\n    if (satisfied(ty) || !ty.requires || ty.requires === 'app' || madeByApps.has(ty.ext)) continue;\n    if (!out.includes(ty.requires)) out.push(ty.requires);\n  }\n  return out;\n});\n\n/**\n * The withheld services as one sentence.\n *\n * ⚠ Joined in script rather than looped in the template with a `<span> </span>`\n * separator: Vue's compiler drops a whitespace-only text node between\n * elements, so the two sentences rendered welded together\n * (\"...here.Diagrams need...\") — measured in a browser, invisible in a unit\n * test that asserts on textContent.\n */\nconst withheldText = computed(() => {\n  const parts = withheld.value.map((svc) => t('newdoc.withheld.' + svc));\n  /* Someone who can fix it is told where (the owner's rule for a missing\n     service, lib/serviceGate); everybody else reads only what is missing. */\n  if (parts.length && props.canConfigure) parts.push(t('newdoc.withheld_admin'));\n  return parts.join(' ');\n});\n\n/** Sections, in the order the server listed them. */\nconst groups = computed(() => {\n  const order: string[] = [];\n  const bucket = new Map<string, NewDocType[]>();\n  for (const ty of offered.value) {\n    if (!bucket.has(ty.group)) {\n      bucket.set(ty.group, []);\n      order.push(ty.group);\n    }\n    bucket.get(ty.group)!.push(ty);\n  }\n  return order.map((g) => ({ group: g, types: bucket.get(g)! }));\n});\n\nconst selected = ref<string>('');\nconst selectedType = computed(() => offered.value.find((ty) => keyOf(ty) === selected.value) ?? null);\n\n/**\n * The words for a type come from `typeLabelFor` — the same table the listing's\n * Type column reads. A second table here would be a second answer to \"what is\n * a .csv\", and the two would disagree the first week somebody edited one.\n */\nfunction labelFor(ty: NewDocType): string {\n  // An app's row is said in the app's own words (its manifest's label).\n  if (ty.app) return labelOf(ty.app.label, props.locale) || ty.ext;\n  return typeLabelFor({ type: 'file', extension: ty.ext }, t);\n}\nfunction tileFor(ext: string): string {\n  return iconTile(iconFamilyFor({ type: 'file', extension: ext, basename: 'x.' + ext }));\n}\n\n/* =========================================================== destinations */\n\nconst dest = ref('');\n/** The picker is up. Also gates Create: a half-answered \"where\" is not a where. */\nconst pickingDest = ref(false);\n\n/** Listing cache for the name check. The picker keeps its own for its rows. */\nconst dirCache = new Map<string, ManagerResponse>();\n\nfunction canWrite(resp: ManagerResponse | undefined): boolean {\n  if (!resp) return false;\n  if (resp.read_only) return false;\n  return permAllowsWrite(resp.perm as string | undefined);\n}\n\nasync function loadDir(p: string): Promise<ManagerResponse | undefined> {\n  if (dirCache.has(p)) return dirCache.get(p);\n  try {\n    const resp = await props.api.index(p);\n    dirCache.set(p, resp);\n    return resp;\n  } catch {\n    // A folder that cannot be listed is a folder we cannot offer. Silence is\n    // right here: the caller renders \"you cannot write here\" / \"no subfolders\",\n    // and a listing failure inside a picker is not an error the host should toast.\n    return undefined;\n  }\n}\n\n/** `main://a/b` → `main / a / b` — the trail, from the one place that\n *  decomposes a wire path (lib/destinationTree). */\nconst destLabel = computed(() =>\n  dest.value ? crumbsOfWire(dest.value).map((c) => c.label).join(' / ') : '',\n);\n\nconst destWritable = ref(true);\nconst destChecked = ref(false);\n\n/* ================================================================== naming */\n\nconst name = ref('');\nconst nameTouched = ref(false);\nconst collision = ref(false);\nconst busy = ref(false);\nconst failure = ref<string | null>(null);\n/** Drafts: the person already keeps as many drafts as the server allows —\n *  the number, for the sentence. Null: not refused for that. */\nconst draftLimitHit = ref<number | null>(null);\n\n/** The name the server will write: what the collision check and the\n *  \"will be created as\" line quote. */\nconst finalName = computed(() =>\n  selectedType.value ? finalDocName(name.value, selectedType.value) : name.value.trim(),\n);\n\n/** Why the typed name cannot be created — the server's own refusals, said\n *  before the click (lib/newDocName). */\nconst nameProblem = computed(() =>\n  selectedType.value ? docNameProblem(name.value, selectedType.value, props.types ?? []) : null,\n);\n\nconst nameError = computed(() => {\n  const p = nameProblem.value;\n  if (!p) return '';\n  switch (p.kind) {\n    case 'slash':\n      return t('newdoc.err.slash');\n    case 'dots':\n      return t('modal.newfolder.invalid');\n    case 'bare_ext':\n      return t('newdoc.err.bare_ext');\n    case 'reserved':\n      return t('names.reserved', { name: p.name });\n    case 'ext_needs_type':\n      return t('newdoc.err.ext_needs_type', { ext: p.ext });\n  }\n  return '';\n});\n\n/**\n * A type whose editor needs its extension, and a name without it: the server\n * will add it, and the person reads that BEFORE Create rather than finding\n * `report.docx` afterwards. Also what a server from before #56 gets for every\n * type (lib/newDocName `extLocked`).\n */\nconst extHint = computed(() => {\n  const ty = selectedType.value;\n  const typed = name.value.trim();\n  if (!ty || !typed || nameProblem.value || !extLocked(ty)) return '';\n  return finalName.value === typed ? '' : t('newdoc.hint.ext_added', { name: finalName.value });\n});\n\n/**\n * The server's answer for a name in a folder (NewFileCheck), or null when it\n * cannot be asked - a host api without the dry run, a name it would refuse\n * anyway (said by `nameProblem`), a folder that cannot be written. Null is\n * \"not known to be taken\": the create still answers 409.\n */\nasync function checkName(dir: string, typed: string, ty: NewDocType): Promise<NewFileCheck | null> {\n  const check = props.api.newFileCheck;\n  if (typeof check !== 'function' || !typed.trim()) return null;\n  try {\n    return await check(dir, typed.trim(), keyOf(ty));\n  } catch {\n    return null;\n  }\n}\n\nlet checkSeq = 0;\nlet checkTimer: ReturnType<typeof setTimeout> | null = null;\n\n/**\n * Ask the destination whether it may be written (its listing) and the server\n * whether the name is free there (a dry run of the create). Debounced\n * because it runs on every keystroke. An untouched name is the server's\n * first free `Untitled (n).<ext>`.\n */\nasync function refreshDestination(opts: { suggest?: boolean } = {}) {\n  const seq = ++checkSeq;\n  const target = dest.value;\n  if (!target) {\n    destChecked.value = false;\n    collision.value = false;\n    return;\n  }\n  const resp = await loadDir(target);\n  if (seq !== checkSeq || target !== dest.value) return;\n  destWritable.value = canWrite(resp);\n  destChecked.value = true;\n  const ty = selectedType.value;\n  if (!ty) {\n    collision.value = false;\n    return;\n  }\n  if (opts.suggest && !nameTouched.value) {\n    const first = `${t('newdoc.untitled')}.${ty.ext}`;\n    const answer = await checkName(target, first, ty);\n    if (seq !== checkSeq || target !== dest.value) return;\n    name.value = answer?.taken && answer.suggested ? answer.suggested : first;\n  }\n  if (!finalName.value || nameProblem.value) {\n    collision.value = false;\n    return;\n  }\n  const answer = await checkName(target, name.value, ty);\n  if (seq !== checkSeq || target !== dest.value) return;\n  collision.value = answer?.taken === true;\n}\n\nfunction scheduleCheck() {\n  if (checkTimer) clearTimeout(checkTimer);\n  checkTimer = setTimeout(() => void refreshDestination(), 220);\n}\n\n/* ================================================================ lifecycle */\n\nfunction defaultDestination(): string {\n  const cur = (props.currentPath || '').trim();\n  const [adapter] = splitWire(cur);\n  // Standing in a real folder: that folder. Making somebody navigate to where\n  // they already are is the small insult that makes a feature feel unfinished.\n  if (adapter) return cur;\n  const names = props.storages ?? [];\n  if (names.length === 1) return names[0] + '://';\n  return '';\n}\n\nwatch(\n  () => props.open,\n  async (isOpen) => {\n    if (!isOpen) return;\n    dirCache.clear();\n    failure.value = null;\n    draftLimitHit.value = null;\n    collision.value = false;\n    nameTouched.value = false;\n    busy.value = false;\n    name.value = '';\n    selected.value = offered.value[0] ? keyOf(offered.value[0]) : '';\n    dest.value = defaultDestination();\n    destChecked.value = false;\n    destWritable.value = true;\n    /* Nowhere to write yet (several storages and no folder in view): ask\n     * first, because a name typed against no destination is a name typed\n     * twice. */\n    pickingDest.value = !dest.value;\n    await refreshDestination({ suggest: true });\n  },\n);\n\n// A different type means a different default extension. What the person typed\n// is kept — only the previous type's default is swapped (lib/newDocName\n// retypeDocName) — and an untouched suggestion is re-asked against the\n// destination (Untitled.md may be free where Untitled.docx is not).\nwatch(selected, (next, prev) => {\n  const nextType = offered.value.find((ty) => keyOf(ty) === next);\n  const prevType = offered.value.find((ty) => keyOf(ty) === prev) ?? null;\n  if (nextType && name.value) name.value = retypeDocName(name.value, prevType, nextType);\n  void refreshDestination({ suggest: true });\n});\nwatch(name, () => {\n  collision.value = false;\n  scheduleCheck();\n});\nwatch(dest, () => {\n  void refreshDestination({ suggest: true });\n});\n\n/* ================================================================== actions */\n\nfunction pick(key: string) {\n  selected.value = key;\n}\n\n/** Roving focus across the tiles — a radiogroup is expected to move on arrows. */\nfunction onTileKey(e: KeyboardEvent, key: string) {\n  const list = offered.value.map(keyOf);\n  const i = list.indexOf(key);\n  let next = -1;\n  // ⚠ RTL: ← / → move the way they point — in a right-to-left grid the next\n  // tile is to the LEFT (lib/direction).\n  const step = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : inlineKeyStep(e.key, dir.value);\n  if (step) next = (i + step + list.length) % list.length;\n  else if (e.key === 'Home') next = 0;\n  else if (e.key === 'End') next = list.length - 1;\n  if (next < 0) return;\n  e.preventDefault();\n  selected.value = list[next];\n  void nextTick(() => {\n    const el = document.querySelector<HTMLElement>(`[data-newdoc-key=\"${list[next]}\"]`);\n    el?.focus();\n  });\n}\n\nfunction onDestinationPicked(path: string) {\n  dest.value = path;\n  pickingDest.value = false;\n}\n\n/**\n * ⚠ Escape with the picker open must close the PICKER, not this dialog.\n *\n * `Modal` listens for Escape on `document`, and there are two of them on\n * screen; the outer one registered first, so it hears it first. Swallowing\n * that first close here is what stops one keypress from throwing away a name\n * somebody just typed. (The picker's own Modal then fires, closes the picker,\n * and the flag is already down — the second close is a no-op.)\n */\nfunction onOuterClose() {\n  if (pickingDest.value) {\n    pickingDest.value = false;\n    return;\n  }\n  emit('close');\n}\n\nconst canCreate = computed(\n  () =>\n    !busy.value &&\n    !!selectedType.value &&\n    !!dest.value &&\n    !pickingDest.value &&\n    !!name.value.trim() &&\n    !nameProblem.value &&\n    !collision.value &&\n    (!destChecked.value || destWritable.value),\n);\n\n/* ================================================================ the field */\n\n/**\n * Focusing the name selects the STEM, the way a rename does: typing replaces\n * `Untitled` and keeps `.txt`. A name with no extension (`LICENSE`) selects\n * whole.\n *\n * ⚠ A mouse click focuses on mousedown and then places the caret on mouseup,\n * which would undo the selection; the first click's mouseup is therefore\n * swallowed and the stem re-selected. A click into an already-focused field\n * is the person placing the caret, and is left alone.\n */\nlet reselectOnMouseUp = false;\nfunction selectStem(el: HTMLInputElement) {\n  try {\n    el.setSelectionRange(0, stemEnd(el.value));\n  } catch {\n    /* an input type without a selection — nothing to select */\n  }\n}\nfunction onNameFocus(e: FocusEvent) {\n  selectStem(e.target as HTMLInputElement);\n}\nfunction onNameMouseDown(e: MouseEvent) {\n  reselectOnMouseUp = document.activeElement !== e.target;\n}\nfunction onNameMouseUp(e: MouseEvent) {\n  if (!reselectOnMouseUp) return;\n  reselectOnMouseUp = false;\n  e.preventDefault();\n  selectStem(e.target as HTMLInputElement);\n}\n\nasync function create() {\n  if (!canCreate.value || !selectedType.value) return;\n  busy.value = true;\n  failure.value = null;\n  draftLimitHit.value = null;\n  try {\n    // exactName: the field IS the file name (#56). The server still adds the\n    // extension a type's editor needs, which extHint has already said.\n    const ty = selectedType.value;\n    const res = props.drafts\n      ? await props.api.drafts.create(dest.value, name.value.trim(), keyOf(ty), { exactName: true })\n      : await props.api.newFile(dest.value, name.value.trim(), keyOf(ty), {\n          exactName: true,\n        });\n    // An app's row opens in the app's view it names, whatever else opens\n    // that extension.\n    emit('created', ty.app ? { ...res, app: { plugin: ty.app.plugin, view: ty.app.view } } : res);\n  } catch (e) {\n    const err = e as Error & { status?: number };\n    if (isDraftLimit(err)) {\n      // ⚠ Said here, where it was pressed, with the way to Drafts — and\n      // nothing else is created in its place (the owner's rule, issue #71).\n      draftLimitHit.value = draftLimitOf(err) ?? 0;\n    } else if (err.status === 409) {\n      // The server refused for the reason the dialog warns about. Say it in\n      // the same place rather than throwing a toast over the form.\n      collision.value = true;\n    } else {\n      failure.value = err.message || String(e);\n      emit('error', { message: failure.value });\n    }\n  } finally {\n    busy.value = false;\n  }\n}\n</script>\n\n<template>\n  <Modal\n    :open=\"open\"\n    :title=\"t('newdoc.title')\"\n    size=\"lg\"\n    :theme=\"theme\"\n    @close=\"onOuterClose\"\n  >\n    <div class=\"fe-newdoc\" data-testid=\"newdoc-modal\">\n      <!-- Nothing to offer. Either the server sent no types (too old) or every\n           one of them needs a service this install has not got. -->\n      <div v-if=\"!offered.length\" class=\"fe-newdoc__empty\" data-testid=\"newdoc-empty\">\n        <p class=\"fe-newdoc__empty-title\">{{ t('newdoc.empty.title') }}</p>\n        <p class=\"fe-newdoc__empty-body\">\n          {{ withheld.length ? t('newdoc.empty.blocked') : t('newdoc.empty.body') }}\n        </p>\n      </div>\n\n      <template v-else>\n        <div\n          class=\"fe-newdoc__types\"\n          role=\"radiogroup\"\n          :aria-label=\"t('newdoc.type.label')\"\n        >\n          <section v-for=\"g in groups\" :key=\"g.group\" class=\"fe-newdoc__group\">\n            <h3 class=\"fe-newdoc__grouplabel\">{{ t('newdoc.group.' + g.group) }}</h3>\n            <div class=\"fe-newdoc__grid\">\n              <button\n                v-for=\"ty in g.types\"\n                :key=\"keyOf(ty)\"\n                type=\"button\"\n                role=\"radio\"\n                class=\"fe-newdoc__type\"\n                :class=\"{ 'is-selected': selected === keyOf(ty) }\"\n                :aria-checked=\"selected === keyOf(ty)\"\n                :tabindex=\"selected === keyOf(ty) ? 0 : -1\"\n                :data-newdoc-ext=\"ty.ext\"\n                :data-newdoc-key=\"keyOf(ty)\"\n                :data-testid=\"`newdoc-type-${keyOf(ty)}`\"\n                @click=\"pick(keyOf(ty))\"\n                @keydown=\"onTileKey($event, keyOf(ty))\"\n              >\n                <span class=\"fe-newdoc__tile\" aria-hidden=\"true\" v-html=\"tileFor(ty.ext)\"></span>\n                <span class=\"fe-newdoc__ext\">.{{ ty.ext }}</span>\n                <span class=\"fe-newdoc__kind\">{{ labelFor(ty) }}</span>\n              </button>\n            </div>\n          </section>\n\n          <!-- Why a family is missing. One quiet line, only when something was\n               actually withheld — an operator reading \"Office documents need a\n               document server\" knows what to do; an empty space teaches nobody. -->\n          <p v-if=\"withheldText\" class=\"fe-newdoc__withheld\" data-testid=\"newdoc-withheld\">\n            {{ withheldText }}\n          </p>\n        </div>\n\n        <div class=\"fe-newdoc__field\">\n          <label class=\"fe-newdoc__label\" for=\"fe-newdoc-name\">{{ t('newdoc.name') }}</label>\n          <!-- #56 — the whole file name, extension included. There used to be\n               a read-only \".txt\" beside the field, which is why LICENSE could\n               not be made. -->\n          <input\n            id=\"fe-newdoc-name\"\n            v-model=\"name\"\n            type=\"text\"\n            class=\"fe-input fe-newdoc__name\"\n            autocomplete=\"off\"\n            spellcheck=\"false\"\n            data-testid=\"newdoc-name\"\n            :placeholder=\"t('newdoc.name.placeholder')\"\n            :aria-describedby=\"nameError || extHint ? 'fe-newdoc-name-note' : undefined\"\n            @input=\"nameTouched = true\"\n            @focus=\"onNameFocus\"\n            @mousedown=\"onNameMouseDown\"\n            @mouseup=\"onNameMouseUp\"\n            @keydown.enter.prevent=\"create\"\n          />\n          <p\n            v-if=\"nameError\"\n            id=\"fe-newdoc-name-note\"\n            class=\"fe-form__error\"\n            data-testid=\"newdoc-name-error\"\n          >\n            {{ nameError }}\n          </p>\n          <p v-else-if=\"collision\" class=\"fe-form__error\" data-testid=\"newdoc-collision\">\n            {{ t('newdoc.err.exists', { name: finalName }) }}\n          </p>\n          <p\n            v-else-if=\"extHint\"\n            id=\"fe-newdoc-name-note\"\n            class=\"fe-newdoc__hint\"\n            data-testid=\"newdoc-ext-hint\"\n          >\n            {{ extHint }}\n          </p>\n        </div>\n\n        <div class=\"fe-newdoc__field\">\n          <span class=\"fe-newdoc__label\">{{ t('newdoc.location') }}</span>\n          <div class=\"fe-newdoc__dest\">\n            <span class=\"fe-newdoc__destpath\" data-testid=\"newdoc-dest\">\n              {{ dest ? destLabel : t('newdoc.location.none') }}\n            </span>\n            <button\n              type=\"button\"\n              class=\"fe-newdoc__changebtn\"\n              data-testid=\"newdoc-change\"\n              @click=\"pickingDest = true\"\n            >\n              {{ t('newdoc.location.change') }}\n            </button>\n          </div>\n          <p\n            v-if=\"destChecked && !destWritable\"\n            class=\"fe-form__error\"\n            data-testid=\"newdoc-noaccess\"\n          >\n            {{ t('newdoc.location.noaccess') }}\n          </p>\n        </div>\n\n        <p v-if=\"drafts && !draftLimitHit\" class=\"fe-newdoc__hint\" data-testid=\"newdoc-draft-hint\">\n          {{ t('newdoc.hint.draft') }}\n        </p>\n        <div v-if=\"draftLimitHit !== null\" class=\"fe-newdoc__limit\" role=\"alert\" data-testid=\"newdoc-draft-limit\">\n          <p class=\"fe-form__error\">\n            {{ draftLimitHit ? t('newdoc.err.draft_limit', { limit: draftLimitHit }) : t('newdoc.err.draft_limit_any') }}\n          </p>\n          <button type=\"button\" class=\"fe-btn fe-btn--sm\" data-testid=\"newdoc-open-drafts\" @click=\"emit('open-drafts')\">\n            {{ t('newdoc.open_drafts') }}\n          </button>\n        </div>\n        <p v-if=\"failure\" class=\"fe-form__error\" data-testid=\"newdoc-failure\">{{ failure }}</p>\n      </template>\n    </div>\n\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" @click=\"onOuterClose\">\n        {{ t('newdoc.cancel') }}\n      </button>\n      <button\n        v-if=\"offered.length\"\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :disabled=\"!canCreate\"\n        data-testid=\"newdoc-create\"\n        @click=\"create\"\n      >\n        {{ busy ? t('newdoc.creating') : t('newdoc.create') }}\n      </button>\n    </template>\n  </Modal>\n\n  <!-- tasi:m1 — THE folder chooser, the same component Move to / Copy to\n       mount. A SIBLING of the dialog above rather than a child of it: `Modal`\n       is not teleported, so nesting would put a `position: fixed` overlay\n       inside a card that clips its overflow, and a backdrop click meant for\n       the picker would bubble into the dialog's own dismiss. -->\n  <DestinationPickerModal\n    :open=\"pickingDest\"\n    :api=\"api\"\n    :locale=\"locale\"\n    mode=\"choose\"\n    :storages=\"storages\"\n    :start-at=\"dest || currentPath\"\n    @close=\"pickingDest = false\"\n    @pick=\"onDestinationPicked\"\n  />\n</template>\n","/**\n * How much room an outward-facing body needs.\n *\n * ⚠ The public page has ONE look and three widths — the three the Go-rendered\n * pages had until v0.42.2 (`.card` 400px centred, the drop card 520px, and\n * `.card--folder` 880px). Which one a link gets is decided HERE, from the\n * kind the server answered with, so the page that renders a link and the\n * preview an operator is shown on the Corporate identity page cannot come to\n * different conclusions — and so that no body carries a layout of its own\n * (the whole reason the three pages drifted apart the first time).\n *\n * ⚠ Every state that is not `ready` is drawn as a `gate` whatever this says:\n * a PIN box, \"this link is not available\" and \"thank you\" are short, and the\n * shell forces it (`PublicShell.layout`).\n */\nexport type PublicLayout = 'gate' | 'form' | 'wide';\n\n/**\n * `app` gets the wide card (a wizard with a document in it) and so does a\n * folder that has a LISTING to show; a file request gets the middle one,\n * because it is a form with labels; a single document — and anything\n * unrecognised — gets the narrow centred card, which is the one the\n * reference screen is.\n *\n * ⚠ `list` is why a folder is not simply wide. The server does not send a\n * listing for every folder share yet, and an 880px card holding a heading\n * and two buttons is a worse page than a 520px one holding the same thing.\n * It widens the moment entries arrive, which is what the old `.card--folder`\n * was for.\n */\nexport function publicLayoutFor(\n  kind: string | null | undefined,\n  opts: { list?: boolean } = {},\n): PublicLayout {\n  if (kind === 'app') return 'wide';\n  if (kind === 'folder') return opts.list ? 'wide' : 'form';\n  if (kind === 'drop') return 'form';\n  return 'gate';\n}\n","/**\n * dropLimits — what a file request (`/d/<token>`) will take, decided BEFORE a\n * byte is sent.\n *\n * ⚠⚠ Why this exists (QA, 2026-09-21): the page sent every file it was given\n * and let the server refuse it. A PDF-only link handed a .txt uploaded it\n * anyway, got `415 ext_not_allowed` back, and printed the only fallback it had\n * — the app-plugin runtime's \"The app returned an error\". A person who is not\n * a filex user, sent a link by somebody who asked them for a document, should\n * learn \"that type is not accepted\" before a transfer starts, not after.\n *\n * The rules are the SERVER's, restated — `handlers/drop.go` stays the\n * authority and refuses whatever gets past this:\n *   · the extension, lower-cased, without its dot, must be in the list\n *     (`extAllowed`; an empty list allows every type);\n *   · a file may be at most `max_file_size_mb` MiB (`MaxFileSizeMB << 20` —\n *     binary megabytes, which is why this is not `formatSize`'s decimal MB);\n *   · one submission carries at most `max_files` files, and never more than\n *     the link has left (`uploads_left`).\n */\nimport type { PublicDropLimits } from '../types/Public';\n\n/** Why one file is not sent. `too_many` carries how many the submission could take. */\nexport type DropRefusal =\n  | { code: 'ext'; name: string }\n  | { code: 'too_large'; name: string; mb: number }\n  | { code: 'too_many'; count: number };\n\nexport interface DropCheck<F> {\n  accepted: F[];\n  refused: Array<{ file: F; reason: DropRefusal }>;\n}\n\n/** The server's extension test (`extAllowed`). */\nexport function dropExtAllowed(name: string, allow: readonly string[] | undefined): boolean {\n  const list = (allow ?? []).map((e) => e.trim().replace(/^\\./, '').toLowerCase()).filter(Boolean);\n  if (!list.length) return true;\n  const dot = name.lastIndexOf('.');\n  const ext = dot > 0 || (dot === 0 && name.length > 1) ? name.slice(dot + 1).toLowerCase() : '';\n  return list.includes(ext);\n}\n\n/**\n * Split what a person picked into what will be sent and what will not, with\n * the reason for each refusal. The order is kept: the first files that fit are\n * the ones that go, exactly as the no-JavaScript page picks them.\n */\nexport function checkDropFiles<F extends { name: string; size: number }>(\n  files: readonly F[],\n  limits: PublicDropLimits | undefined,\n  uploadsLeft?: number | null,\n): DropCheck<F> {\n  const out: DropCheck<F> = { accepted: [], refused: [] };\n  const maxMb = limits?.max_file_size_mb ?? 0;\n  let room = limits?.max_files && limits.max_files > 0 ? limits.max_files : Infinity;\n  if (typeof uploadsLeft === 'number' && Number.isFinite(uploadsLeft)) room = Math.min(room, Math.max(0, uploadsLeft));\n  for (const f of files) {\n    if (!dropExtAllowed(f.name, limits?.allowed_ext)) {\n      out.refused.push({ file: f, reason: { code: 'ext', name: f.name } });\n    } else if (maxMb > 0 && f.size > maxMb * 1024 * 1024) {\n      out.refused.push({ file: f, reason: { code: 'too_large', name: f.name, mb: maxMb } });\n    } else if (out.accepted.length >= room) {\n      out.refused.push({ file: f, reason: { code: 'too_many', count: room } });\n    } else {\n      out.accepted.push(f);\n    }\n  }\n  return out;\n}\n","/**\n * usePublicLink — a visitor with a link and no account, whatever the link is.\n *\n * ⚠⚠ v3 §1: \"one public surface, not three\". A share (`/s/<token>`), a file\n * request (`/d/<token>`) and an app plugin's page (a share carrying a\n * `page_id`) used to be two rendering stacks and three layouts, so the PIN\n * box of a signature request looked nothing like the PIN box of a download\n * and neither carried the instance's own colours. They are the same walk:\n *\n *     info → (PIN when required) → the body → the states it can end in\n *\n * Only the BODY differs, and only the caller decides that. Everything here —\n * the fetch, the 401/404/410 reading, the PIN attempt and its lock, the\n * plugin conversation when the link carries one — is shared, because every\n * one of those is a place the three used to disagree.\n *\n * ⚠ Nothing is stored on this side: no session, no token copy, no PIN. The\n * unlock cookie is the server's and HttpOnly.\n *\n * ⚠ The endpoints are `/api/public/s/{token}` and `/api/public/d/{token}`;\n * the app-page walk (`/api/p/{token}`) is the same shape at a different\n * root, which is why the root is an argument. That is what lets `/p/*` be\n * retired without a second implementation living on for the transition.\n */\nimport { ref, type Ref } from 'vue';\nimport type { PluginRunResult, PluginSurface, PluginViewEventBody } from '../types/Plugins';\nimport type { PublicFailure, PublicRequestInfo, PublicShareInfo } from '../types/Public';\nimport { usePluginSurface, type PluginSurfaceStore } from './usePluginSurface';\nimport { foreignText } from '../lib/direction';\nimport { checkDropFiles, type DropRefusal } from '../lib/dropLimits';\n\nexport type PublicStatus =\n  | 'loading'\n  | 'pin'\n  /** The body may be drawn (a file, a folder, an upload box, a surface). */\n  | 'ready'\n  /** A surface answered `202` — the job is queued and the visitor is done. */\n  | 'accepted'\n  | 'done'\n  | 'not_found'\n  | 'gone'\n  | 'error';\n\nexport type PinFailure = '' | 'wrong' | 'locked';\n\n/** A refused answer: the HTTP status and the server's `error` code. */\nexport class PublicLinkError extends Error {\n  constructor(\n    public status: number,\n    public code: string,\n    message?: string,\n  ) {\n    super(message || code || String(status));\n    this.name = 'PublicLinkError';\n  }\n}\n\n/** Builds the addresses of one link's walk. */\nexport type PublicRoot = (tail: string) => string;\n\nfunction root(base: string | undefined, prefix: string, token: string): PublicRoot {\n  const origin = (base ?? '').replace(/\\/+$/, '');\n  return (tail = '') => `${origin}${prefix}${encodeURIComponent(token)}${tail}`;\n}\n\n/** `/api/public/s/{token}` — a share (download, folder, or an app's page). */\nexport function shareRoot(base: string | undefined, token: string): PublicRoot {\n  return root(base, '/api/public/s/', token);\n}\n\n/** `/api/public/d/{token}` — a file request. */\nexport function requestRoot(base: string | undefined, token: string): PublicRoot {\n  return root(base, '/api/public/d/', token);\n}\n\n/**\n * `/api/p/{token}` — an app plugin's page.\n *\n * ⚠ Retired by v3 (§1: \"`/p/*` — retired, 301 to the share\"). Kept because\n * links already in people's mailboxes point at it and a 301 only helps a\n * browser that follows one; nothing new should be built on it.\n */\nexport function pageRoot(base: string | undefined, token: string): PublicRoot {\n  return root(base, '/api/p/', token);\n}\n\nexport interface PublicLinkOptions {\n  /** API origin; empty = same origin. */\n  base?: string;\n  /** The visitor's language, sent as `Accept-Language` so a plugin answers in it. */\n  locale: () => string;\n  /** The words for an answer that carries nothing to show. */\n  errorText: () => string;\n  /**\n   * The words for a drop that arrived but whose answer did not (a proxy gave\n   * up, the connection dropped): it may well be saved. Absent: `errorText`.\n   */\n  unansweredText?: () => string;\n  fetchImpl?: typeof fetch;\n}\n\nexport function publicLinkClient<TInfo>(url: PublicRoot, opts: PublicLinkOptions) {\n  const doFetch = (...args: Parameters<typeof fetch>) => (opts.fetchImpl ?? fetch)(...args);\n\n  async function call<T>(tail: string, init: { method?: string; body?: unknown } = {}): Promise<{ status: number; body: T }> {\n    const headers: Record<string, string> = { Accept: 'application/json', 'Accept-Language': opts.locale() };\n    if (init.body !== undefined) headers['Content-Type'] = 'application/json';\n    const res = await doFetch(url(tail), {\n      method: init.method ?? 'GET',\n      headers,\n      credentials: 'same-origin',\n      cache: 'no-store',\n      body: init.body !== undefined ? JSON.stringify(init.body) : undefined,\n    });\n    let body: unknown = null;\n    try {\n      body = await res.json();\n    } catch {\n      body = null;\n    }\n    if (!res.ok) {\n      const b = (body ?? {}) as { error?: string; message?: string };\n      throw new PublicLinkError(res.status, b.error ?? '', b.message);\n    }\n    return { status: res.status, body: body as T };\n  }\n\n  return {\n    /** What the link is and what the visitor may see of it. */\n    info: (query = '') => call<TInfo>(query).then((r) => r.body),\n    pin: (pin: string) => call<TInfo>('/pin', { method: 'POST', body: { pin } }).then((r) => r.body),\n    /**\n     * The app's opening screen.\n     *\n     * ⚠ There is no `/view` route: an open is `POST /event\n     * {\"event\":\"open\"}`, because the opening surface and every later one are\n     * the same call to the app. One endpoint, one code path in the plugin.\n     */\n    open: () =>\n      call<{ surface?: PluginSurface }>('/event', { method: 'POST', body: { event: 'open', state: {}, data: {} } }).then(\n        (r) => r.body,\n      ),\n    /** `{surface}`, or `{op}` when the server queued a job (202). */\n    event: async (body: Omit<PluginViewEventBody, 'path' | 'storage_id'>): Promise<PluginRunResult> => {\n      const r = await call<{ surface?: PluginSurface; accepted?: boolean; job_id?: string }>('/event', {\n        method: 'POST',\n        body,\n      });\n      if (r.status === 202 || r.body?.accepted) {\n        return { op: { accepted: true, job_id: r.body?.job_id }, job_id: r.body?.job_id };\n      }\n      return { surface: r.body.surface as PluginSurface };\n    },\n    /** Where the browser loads an exposed copy from (`pub:N`). */\n    fileUrl: (ref: string) => url(`/file/${encodeURIComponent(ref)}`),\n    /**\n     * The same copy, asked for as a DOWNLOAD — the Download button's link.\n     * ⚠ Kept apart from `fileUrl` because only this one counts as a download\n     * (handlers/public_api.go serveExposed): the page's own viewer loads the\n     * document to SHOW it, and the owner ruled on 2026-09-21 that looking at\n     * a signing link is not downloading it.\n     */\n    fileDownloadUrl: (ref: string) => url(`/file/${encodeURIComponent(ref)}?download=1`),\n    url,\n  };\n}\n\nexport type PublicLinkClient<T> = ReturnType<typeof publicLinkClient<T>>;\n\n/**\n * The walk itself.\n *\n * `TInfo` is the shape the body needs (`PublicShareInfo`,\n * `PublicRequestInfo`); this composable only reads the four facts every\n * public link has — does it want a PIN, is it unlocked, has it a surface,\n * and is it still alive.\n */\n/**\n * What `usePublicLink` hands back.\n *\n * ⚠⚠ Written out rather than inferred (`ReturnType<typeof …>`). The returned\n * object carries the surface conversation, whose own type names Vue's\n * internal ref helpers, and an inferred declaration cannot name them from\n * outside this package: `vue-tsc` failed the package build with TS2742 — \"the\n * inferred type cannot be named without a reference to @vue/shared\" — and the\n * published `.d.ts` was built anyway, with a type consumers could not use.\n * A written type is also the contract: adding a field here is a decision.\n */\nexport interface PublicLinkStore<\n  TInfo extends { needs_pin?: boolean; unlocked?: boolean; expired?: boolean; revoked?: boolean; locked?: boolean },\n> {\n  status: Ref<PublicStatus>;\n  info: Ref<TInfo | null>;\n  reason: Ref<PublicFailure>;\n  pinFailure: Ref<PinFailure>;\n  lockMessage: Ref<string>;\n  pinBusy: Ref<boolean>;\n  failure: Ref<string>;\n  toast: Ref<string>;\n  jobId: Ref<string>;\n  /** The plugin surface on this link, when it carries one. */\n  conv: PluginSurfaceStore;\n  /** (Re-)read the link. `query` is appended verbatim (`?path=…`). */\n  load: (query?: string) => Promise<void>;\n  submitPin: (pin: string) => Promise<void>;\n  /** Where the browser loads an exposed copy from (`pub:N`). */\n  fileUrl: (ref: string) => string;\n  /** The same copy as a download — the only fetch that counts as one. */\n  fileDownloadUrl: (ref: string) => string;\n  resolveFile: (ref: string) => { url: string; name?: string; mime?: string };\n  url: PublicRoot;\n}\n\nexport function usePublicLink<\n  TInfo extends { needs_pin?: boolean; unlocked?: boolean; expired?: boolean; revoked?: boolean; locked?: boolean },\n>(\n  url: PublicRoot,\n  opts: PublicLinkOptions & {\n    /** True when this link's body is an app plugin's surface. */\n    hasSurface?: (info: TInfo) => boolean;\n  },\n): PublicLinkStore<TInfo> {\n  const client = publicLinkClient<TInfo>(url, opts);\n\n  const status = ref<PublicStatus>('loading');\n  // ⚠ Annotated, not inferred: `ref<TInfo|null>` of a GENERIC unwraps to a\n  // type that cannot be written down outside this package (TS2742), and\n  // the store's declared shape has to match what callers actually get.\n  const info = ref(null) as Ref<TInfo | null>;\n  const pinFailure = ref<PinFailure>('');\n  /** The server's own words for a lock (`429 locked`), when it sends any. */\n  const lockMessage = ref('');\n  const jobId = ref('');\n  const toast = ref('');\n  /** A failure outside the conversation (network, 5xx). */\n  const failure = ref('');\n  /** Why there is nothing to show, for a caller that wants to say more. */\n  const reason = ref<PublicFailure>('');\n\n  const conv = usePluginSurface(\n    {\n      api: { pluginViewEvent: (_plugin, _view, body) => client.event(body) },\n      plugin: '',\n      view: '',\n      locale: opts.locale,\n      errorText: opts.errorText,\n    },\n    {\n      onOp: (op) => {\n        jobId.value = String((op as { job_id?: string }).job_id ?? '');\n        status.value = 'accepted';\n      },\n      onDone: () => {\n        if (status.value !== 'accepted') status.value = 'done';\n      },\n      onToast: (m) => {\n        toast.value = m;\n      },\n    },\n  );\n\n  /**\n   * ⚠ 404 and 410 both land on \"this link is not available\", and the two\n   * states are kept apart only for the caller's own logging. A visitor is\n   * never told WHICH — \"expired\" confirms that the link existed, which is\n   * one bit more than somebody guessing tokens should get.\n   */\n  function fail(e: unknown): void {\n    const err = e as PublicLinkError;\n    if (err?.status === 404) {\n      status.value = 'not_found';\n      reason.value = 'not_found';\n    } else if (err?.status === 410) {\n      status.value = 'gone';\n      reason.value = 'gone';\n    } else {\n      status.value = 'error';\n      reason.value = 'error';\n      // ⚠ An app's own error text never met the catalogue — isolate it.\n      failure.value = foreignText(opts.locale(), String((e as Error)?.message ?? e)) || opts.errorText();\n    }\n  }\n\n  async function openSurface(): Promise<void> {\n    try {\n      const res = await client.open();\n      const s = res?.surface;\n      if (!s) {\n        status.value = 'error';\n        failure.value = opts.errorText();\n        return;\n      }\n      conv.setSurface(s);\n      status.value = s.done ? 'done' : 'ready';\n    } catch (e) {\n      if ((e as PublicLinkError)?.status === 401) {\n        status.value = 'pin';\n        return;\n      }\n      fail(e);\n    }\n  }\n\n/**\n   * Is this link dead?\n   *\n   * ⚠⚠ A link that ran out answers 200 with the ordinary shape and\n   * `expired` / `revoked` set — NOT a 410. That is deliberate on the server\n   * side (a visitor who was given a link is entitled to be told it is over),\n   * and it means a client that only checks the status code renders an empty\n   * download page instead of an explanation. Both flags mean the same thing\n   * to the person reading the page, which is why they collapse here and are\n   * kept apart in the payload.\n   */\n  function dead(i: TInfo | null): boolean {\n    return i?.expired === true || i?.revoked === true;\n  }\n\n  /** The first call: the facts, then the PIN form or the body. */\n  async function load(query = ''): Promise<void> {\n    status.value = 'loading';\n    failure.value = '';\n    reason.value = '';\n    try {\n      info.value = await client.info(query);\n    } catch (e) {\n      fail(e);\n      return;\n    }\n    if (dead(info.value as TInfo)) {\n      status.value = 'gone';\n      reason.value = 'gone';\n      return;\n    }\n    if (info.value?.needs_pin && !info.value?.unlocked) {\n      status.value = 'pin';\n      // A gate shut by too many wrong answers says so before the first try,\n      // rather than letting somebody spend an attempt finding out.\n      pinFailure.value = info.value?.locked === true ? 'locked' : '';\n      return;\n    }\n    if (opts.hasSurface?.(info.value as TInfo)) {\n      await openSurface();\n      return;\n    }\n    status.value = 'ready';\n  }\n\n  const pinBusy = ref(false);\n\n  /** `401 pin_wrong` → `wrong`, `429 locked` → `locked`; on success straight to the body. */\n  async function submitPin(pin: string): Promise<void> {\n    if (pinBusy.value) return;\n    pinFailure.value = '';\n    lockMessage.value = '';\n    pinBusy.value = true;\n    try {\n      // ⚠ Trimmed. A PIN is usually pasted out of a message, and a trailing\n      // space is not a wrong code — refusing it spends one of the attempts\n      // before the lockout on something the person cannot even see.\n      info.value = await client.pin(pin.trim());\n      if (dead(info.value as TInfo)) {\n        status.value = 'gone';\n        reason.value = 'gone';\n      } else if (opts.hasSurface?.(info.value as TInfo)) {\n        await openSurface();\n      } else {\n        status.value = 'ready';\n      }\n    } catch (e) {\n      const err = e as PublicLinkError;\n      if (err?.status === 429) {\n        pinFailure.value = 'locked';\n        // ⚠ The server's own rate-limit sentence — isolate it.\n        lockMessage.value = foreignText(opts.locale(), err.message ?? '');\n      } else if (err?.status === 401 || err?.status === 403) {\n        pinFailure.value = 'wrong';\n      } else {\n        fail(e);\n      }\n    } finally {\n      pinBusy.value = false;\n    }\n  }\n\n  return {\n    status,\n    info,\n    reason,\n    pinFailure,\n    lockMessage,\n    pinBusy,\n    failure,\n    toast,\n    jobId,\n    conv,\n    load,\n    submitPin,\n    fileUrl: client.fileUrl,\n    fileDownloadUrl: client.fileDownloadUrl,\n    /**\n     * A `FileRefResolver` for the surface renderer: the URL, plus the name\n     * and type the link's own `files[]` already told us.\n     *\n     * ⚠ The renderer needs the mime to decide how to draw the thing (a\n     * picture, an embedded PDF, a link). Handing it a bare URL makes every\n     * exposed copy render as \"something to download\", which is what a\n     * `preview` node is specifically not for.\n     */\n    resolveFile: (ref: string) => {\n      const files = (info.value as { app?: { files?: Array<{ ref: string; name?: string; mime?: string }> } } | null)\n        ?.app?.files;\n      const f = files?.find((x) => x.ref === ref);\n      return { url: client.fileUrl(ref), name: f?.name, mime: f?.mime };\n    },\n    url: client.url,\n  };\n}\n\n\n\n/**\n * Where the BYTES of a share live.\n *\n * ⚠ Not under `/api/`. `/s/<token>` is the address that has always served\n * the file, and it still does — the SPA shell is what a JavaScript browser\n * gets when it NAVIGATES there (`handlers/public_shell.go`), while\n * `?download=1` and `?zip=1` are among the escapes that mean \"I am asking for\n * the thing, not for a page\". Building a second download route under `/api/`\n * would be a second thing to keep working.\n */\nexport function shareDownloadUrl(base: string | undefined, token: string, opts: { zip?: boolean; path?: string } = {}): string {\n  const origin = (base ?? '').replace(/\\/+$/, '');\n  const t = encodeURIComponent(token);\n  if (opts.path) return `${origin}/s/${t}/f/${opts.path.split('/').map(encodeURIComponent).join('/')}?download=1`;\n  return `${origin}/s/${t}?${opts.zip ? 'zip=1' : 'download=1'}`;\n}\n\n/** The no-JS page, for whatever the shell cannot draw yet (a folder walk). */\nexport function shareNoJsUrl(base: string | undefined, token: string): string {\n  return `${(base ?? '').replace(/\\/+$/, '')}/s/${encodeURIComponent(token)}?nojs=1`;\n}\n\n/** A share: a file, a folder, or an app plugin's page. */\nexport function usePublicShare(token: string, opts: PublicLinkOptions) {\n  const link = usePublicLink<PublicShareInfo>(shareRoot(opts.base, token), {\n    ...opts,\n    hasSurface: (i) => i?.kind === 'app',\n  });\n  return {\n    ...link,\n    downloadUrl: (o: { zip?: boolean; path?: string } = {}) => shareDownloadUrl(opts.base, token, o),\n    noJsUrl: () => shareNoJsUrl(opts.base, token),\n  };\n}\n\n/** One file on its way up, as the drop box shows it. */\nexport interface PublicUpload {\n  name: string;\n  size: number;\n  /** 0..100, or -1 while the browser has not said anything yet. */\n  percent: number;\n  /**\n   * `refused` — never sent: the link does not take it (its type, its size, one\n   * file too many). Said before the transfer, not after it.\n   * `saving` — every byte is sent and the server is writing it to the storage.\n   * `unconfirmed` — every byte was sent, but the answer never came (a proxy\n   * gave up, the connection dropped): it may well be saved.\n   */\n  state: 'sending' | 'saving' | 'done' | 'failed' | 'unconfirmed' | 'refused';\n  error?: string;\n}\n\n/** What the person on the drop page adds to the files. */\nexport interface PublicUploadOptions {\n  /** Their name, when the link asks for it (`limits.ask_name`). */\n  name?: string;\n  /**\n   * The words for a file this page will not send. Handed in by the page\n   * because the page has the catalogue; the rule that decides lives in\n   * `lib/dropLimits`.\n   */\n  refusedText?: (reason: DropRefusal) => string;\n}\n\n/**\n * A file request: the drop box an outsider uploads into.\n *\n * The upload is XHR and not `fetch` for one reason: `fetch` has no upload\n * progress. A stranger sending a 300 MB file to somebody else's server with\n * no indication that anything is happening will reload the page, and the\n * transfer starts over.\n *\n * ⚠⚠ ONE request per drop, carrying every file of it. The server makes ONE\n * submission folder per request (`<date>_<name>`, drop.go) and counts\n * `max_files` per request; sending the files one by one made three folders out\n * of one drop of three files, and let a person past the per-submission cap by\n * simply sending them separately. The no-JavaScript page always sent them\n * together.\n */\n/** A proxy's own answer for a request it stopped WAITING on: 504 from nginx,\n *  524 from Cloudflare — filex had the drop and may well have saved it.\n *  ⚠ Not 502 / 520: nginx buffers the request body, so a filex that is down\n *  is answered 502 (Cloudflare 520) only after every byte was sent — the drop\n *  never reached it, and \"it may still be saving, check before sending it\n *  again\" made the visitor lose it. filex's own refusals carry a `message`. */\nconst GATEWAY_GAVE_UP = new Set([504, 524]);\n\nexport function usePublicRequest(token: string, opts: PublicLinkOptions) {\n  const link = usePublicLink<PublicRequestInfo>(requestRoot(opts.base, token), opts);\n  const uploads = ref<PublicUpload[]>([]);\n\n  function patchRange(from: number, to: number, p: Partial<PublicUpload>): void {\n    uploads.value = uploads.value.map((u, n) => (n >= from && n < to ? { ...u, ...p } : u));\n  }\n\n  function send(files: File[], from: number, name: string): Promise<void> {\n    const to = from + files.length;\n    return new Promise<void>((resolve) => {\n      let xhr: XMLHttpRequest;\n      try {\n        xhr = new XMLHttpRequest();\n      } catch {\n        patchRange(from, to, { state: 'failed', error: opts.errorText() });\n        resolve();\n        return;\n      }\n      xhr.open('POST', link.url('/upload'));\n      xhr.withCredentials = true;\n      xhr.setRequestHeader('Accept', 'application/json');\n      xhr.setRequestHeader('Accept-Language', opts.locale());\n      xhr.upload.onprogress = (e) => {\n        if (e.lengthComputable && e.total > 0) patchRange(from, to, { percent: Math.round((e.loaded / e.total) * 100) });\n      };\n      /* ⚠ Every byte is sent: the bar reached 100% here and stayed there while\n       * the server wrote the files to its storage, one after another — minutes\n       * for a large drop into an object store. The rows say that instead. */\n      let sentAll = false;\n      xhr.upload.onload = () => {\n        sentAll = true;\n        patchRange(from, to, { state: 'saving', percent: 100 });\n      };\n      /* ⚠⚠ A drop whose bytes all arrived and whose answer did not is not\n       * \"could not be sent\". A proxy that gives up (Cloudflare at 100 s, nginx\n       * at 60 s) answers with its own page, and the server finishes writing\n       * the drop regardless (drop.go); telling the visitor it failed invited\n       * a second submission of the same files. */\n      const unconfirmed = () =>\n        patchRange(from, to, { state: 'unconfirmed', error: (opts.unansweredText ?? opts.errorText)() });\n      xhr.onload = () => {\n        if (xhr.status >= 200 && xhr.status < 300) {\n          patchRange(from, to, { state: 'done', percent: 100 });\n        } else {\n          // ⚠ The server says why, in the visitor's language (`message`,\n          // drop.go `refuse`). An older server sends only the code; the\n          // page's own \"could not be sent\" is then the honest fallback.\n          let msg = '';\n          try {\n            msg = String((JSON.parse(xhr.responseText) as { message?: string })?.message ?? '');\n          } catch {\n            msg = '';\n          }\n          if (!msg && sentAll && GATEWAY_GAVE_UP.has(xhr.status)) unconfirmed();\n          else patchRange(from, to, { state: 'failed', error: msg || opts.errorText() });\n        }\n        resolve();\n      };\n      xhr.onerror = () => {\n        if (sentAll) unconfirmed();\n        else patchRange(from, to, { state: 'failed', error: opts.errorText() });\n        resolve();\n      };\n      const form = new FormData();\n      for (const f of files) form.append('file', f, f.name);\n      if (name) form.append('uploader_name', name);\n      xhr.send(form);\n    });\n  }\n\n  /** Everything the person dropped: what the link takes goes up in one request, the rest is said. */\n  async function upload(files: File[] | FileList, o: PublicUploadOptions = {}): Promise<void> {\n    const info = link.info.value;\n    const { accepted, refused } = checkDropFiles(Array.from(files), info?.limits, info?.uploads_left ?? null);\n    const said = o.refusedText ?? (() => opts.errorText());\n    uploads.value = [\n      ...uploads.value,\n      ...refused.map(({ file, reason }) => ({\n        name: file.name,\n        size: file.size,\n        percent: -1,\n        state: 'refused' as const,\n        error: said(reason),\n      })),\n    ];\n    if (!accepted.length) return;\n    const from = uploads.value.length;\n    uploads.value = [\n      ...uploads.value,\n      ...accepted.map((f) => ({ name: f.name, size: f.size, percent: -1, state: 'sending' as const })),\n    ];\n    await send(accepted, from, (o.name ?? '').trim());\n    await link.load();\n  }\n\n  return { ...link, uploads, upload };\n}\n","/**\n * usePublicPage — the `/p/<token>` walk, kept as a NAME.\n *\n * ⚠⚠ v3 §1 retired `/p/*`: an app plugin's public page is a real share now\n * (`/s/<token>` carrying a `page_id`), so the administrator revokes it in\n * **Shares** like every other link and there is one PIN implementation, one\n * expiry policy and one visit counter instead of two.\n *\n * ⚠ So this file holds no implementation any more, and that is the point.\n * The walk it used to own — info → PIN → view → events — turned out to be\n * the SAME walk a share and a file request make, and `usePublicLink` is that\n * one walk at whichever root the link lives under. Keeping a second copy\n * here \"for the transition\" is exactly how two public pages came to disagree\n * about their own PIN box in the first place.\n *\n * The exports survive because a host may be importing them from the package:\n * they are the old names pointed at the shared machinery, and nothing new\n * should reach for them.\n */\nimport type { PublicPageInfo } from '../types/Plugins';\nimport {\n  PublicLinkError,\n  pageRoot,\n  publicLinkClient,\n  usePublicLink,\n  type PublicLinkOptions,\n  type PublicStatus,\n} from './usePublicLink';\n\nexport type { PinFailure } from './usePublicLink';\n\n/** @deprecated The old name of {@link PublicLinkError}. */\nexport { PublicLinkError as PublicPageError };\n\n/**\n * @deprecated `/p/` is retired (v3 §1). The status names moved with the\n * walk: what used to be `'surface'` is `'ready'`, because a share's body is a\n * document or a folder at least as often as it is a plugin's screen.\n */\nexport type PublicPageStatus = PublicStatus;\n\nexport type PublicPageClientOptions = PublicLinkOptions;\n\n/** `/api/p/{token}` and its children. */\nexport function publicPageUrl(base: string | undefined, token: string, tail = ''): string {\n  return pageRoot(base, token)(tail);\n}\n\n/** @deprecated Use `publicLinkClient(shareRoot(base, token), …)`. */\nexport function publicPageClient(token: string, opts: PublicPageClientOptions) {\n  return publicLinkClient<PublicPageInfo>(pageRoot(opts.base, token), opts);\n}\n\nexport type PublicPageClient = ReturnType<typeof publicPageClient>;\n\n/** @deprecated Use `usePublicShare` — an app's public page IS a share (v3 §1.1). */\nexport function usePublicPage(token: string, opts: PublicPageClientOptions & { errorText: () => string }) {\n  return usePublicLink<PublicPageInfo>(pageRoot(opts.base, token), { ...opts, hasSurface: () => true });\n}\n\nexport type PublicPageStore = ReturnType<typeof usePublicPage>;\n","/**\n * usePublicText — the words a public page says, in the SERVER's catalogue.\n *\n * ⚠⚠ The pages a stranger opens (`/s/<token>`, `/d/<token>`) are said by the\n * server: its no-JavaScript pages, its refusals (a file request's `message`)\n * and these JavaScript pages all read ONE table, `server.public.*`, from\n * `GET /api/public/strings?lang=` (handlers/public_api.go `Strings`). This\n * package used to carry a second copy of those words (`public.*` in\n * locales/en.ts), so the same limit was said two ways on the two pages - \"Not\n * sent - larger than 5 MB.\" here, \"a.pdf is too big (max 5 MB).\" there - and\n * a language pack had to translate both. There is no client copy any more: a\n * key the table does not have reads as nothing, never as a client sentence.\n *\n * The table is fetched by the page that owns the visitor's language\n * (`PublicLinkPage`, and the admin's `PublicLinkPreview`) and handed down\n * with `providePublicText`; the shell and its bodies read it with\n * `usePublicText`. A counted sentence picks its form the way the server's\n * own page script does: `strings[key + \"_\" + category] || strings[key]`.\n */\nimport { computed, inject, provide, ref, watch, type InjectionKey, type Ref } from 'vue';\nimport { pluralCategory } from '../lib/plural';\nimport { apiRootOr } from '../lib/appBase';\nimport { foreignText } from '../lib/direction';\n\n/** `GET /api/public/strings`. */\nexport interface PublicStringsAnswer {\n  lang: string;\n  dir?: string;\n  strings: Record<string, string>;\n}\n\n/** What a page that owns the language hands down. */\nexport interface PublicTextSource {\n  /** The table, keys without `server.public.`; empty until it arrives. */\n  table: Readonly<Ref<Readonly<Record<string, string>>>>;\n  /** The language the server answered the table in. */\n  lang: Readonly<Ref<string>>;\n  /** True once an answer (or a failure) has come back for the current language. */\n  ready: Readonly<Ref<boolean>>;\n}\n\nexport const PUBLIC_TEXT: InjectionKey<PublicTextSource> = Symbol('filex-public-text');\n\nexport interface PublicTextOptions {\n  /** API origin; empty = same origin. */\n  base?: string;\n  /** The visitor's language, as the page resolved it. */\n  locale: () => string;\n  fetchImpl?: typeof fetch;\n}\n\n/**\n * Fetch the server's public sentences for the page's language, and again\n * whenever the language changes. A failed fetch leaves the table empty and\n * `ready` true: the page still opens (its controls carry no words of their\n * own), and nothing invents a sentence in the server's place.\n */\nexport function loadPublicText(opts: PublicTextOptions): PublicTextSource {\n  const table = ref<Record<string, string>>({});\n  const lang = ref('');\n  const ready = ref(false);\n  let asked = 0;\n\n  async function load(code: string): Promise<void> {\n    const mine = ++asked;\n    ready.value = false;\n    const doFetch = opts.fetchImpl ?? (typeof fetch === 'function' ? fetch : null);\n    try {\n      if (!doFetch) return;\n      const res = await doFetch(`${apiRootOr(opts.base)}/api/public/strings?lang=${encodeURIComponent(code)}`, {\n        method: 'GET',\n        headers: { Accept: 'application/json' },\n        credentials: 'same-origin',\n      });\n      if (!res.ok) return;\n      const body = (await res.json()) as PublicStringsAnswer;\n      if (mine !== asked) return; // a newer language was asked for meanwhile\n      table.value = body?.strings && typeof body.strings === 'object' ? body.strings : {};\n      lang.value = body?.lang || code;\n    } catch {\n      /* the page opens without the words rather than not at all */\n    } finally {\n      if (mine === asked) ready.value = true;\n    }\n  }\n\n  watch(opts.locale, (code) => void load(code), { immediate: true });\n  return { table, lang, ready };\n}\n\n/** Hand the table to the shell and its bodies. */\nexport function providePublicText(src: PublicTextSource): void {\n  provide(PUBLIC_TEXT, src);\n}\n\n/** The variables a counted sentence picks its form on, in this order. */\nconst COUNTERS = ['count', 'n'] as const;\n\n/**\n * One server sentence, filled: `{name}` placeholders replaced, the plural form\n * picked on the count. Exported for tests and for a caller outside a\n * component; components use `usePublicText().pt`.\n */\nexport function publicSentence(\n  table: Readonly<Record<string, string>>,\n  lang: string,\n  key: string,\n  vars: Record<string, string | number> = {},\n): string {\n  let raw: string | undefined;\n  const counter = COUNTERS.find((c) => c in vars);\n  if (counter !== undefined) {\n    const cat = pluralCategory(lang || 'en', Number(vars[counter]));\n    if (cat !== 'other') raw = table[`${key}_${cat}`];\n  }\n  raw = raw || table[key] || '';\n  return Object.entries(vars).reduce((acc, [k, v]) => acc.replaceAll(`{${k}}`, String(v)), raw);\n}\n\n/**\n * The shell's and the bodies' reader. Outside a provider (a component mounted\n * on its own) the table is empty and every sentence reads as nothing.\n */\nexport function usePublicText(locale?: () => string) {\n  const src = inject(PUBLIC_TEXT, null);\n  const table = computed(() => src?.table.value ?? {});\n  const lang = computed(() => src?.lang.value || (locale ? locale() : '') || 'en');\n  const ready = computed(() => src?.ready.value ?? true);\n  /**\n   * The server's sentence for `key` (no `server.public.` prefix). ⚠ It is\n   * not this package's text, so a right-to-left page isolates it the way it\n   * isolates every other server sentence (lib/direction `foreignText`).\n   */\n  function pt(key: string, vars: Record<string, string | number> = {}): string {\n    const said = publicSentence(table.value, lang.value, key, vars);\n    return said ? foreignText(lang.value, said) : '';\n  }\n  return { pt, ready };\n}\n","<script setup lang=\"ts\">\n/**\n * PublicPinGate — the code a protected link asks for.\n *\n * ⚠⚠ ONE gate for all three public links (v3 §1). There used to be two: the\n * Go-rendered form on `/s/` and `/d/`, and this one on an app's page. They\n * disagreed about everything a person notices — the wording, the keyboard\n * the phone opened, what a wrong code said, whether the box was cleared and\n * refocused, and whether being locked out said so or just kept refusing.\n *\n * ⚠ The PIN is never stored, never logged and never put in a URL. What the\n * server returns is an HttpOnly cookie this code cannot read; the box is\n * cleared on a wrong answer so the next attempt starts from empty.\n */\nimport { nextTick, onMounted, ref, watch } from 'vue';\nimport type { LocaleCode } from '../../types/ExplorerConfig';\nimport { useLocale } from '../../composables/useLocale';\n\nconst props = defineProps<{\n  locale: LocaleCode | string;\n  busy?: boolean;\n  /** `wrong` | `locked` | '' — from the composable, not from a status code here. */\n  failure?: '' | 'wrong' | 'locked';\n  /** The server's own words for a lock, when it sends any. */\n  lockMessage?: string;\n  /**\n   * The longest PIN any link may carry, as the SERVER says it (`pin_max`,\n   * internal/share CheckPINLength). ⚠ Not a number of this box's own: it\n   * used to stop at a hard-coded 12 while the server took a PIN of any length\n   * through the API, so such a link could not be opened from this page.\n   * Absent = the box does not cut what is typed; the server answers.\n   */\n  maxLength?: number;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'submit', pin: string): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst pin = ref('');\nconst input = ref<HTMLInputElement | null>(null);\n\nconst message = () => {\n  if (props.failure === 'wrong') return t('plugin.page.pin_wrong');\n  if (props.failure === 'locked') return t('plugin.page.pin_locked');\n  return '';\n};\n\n// A wrong code empties the box and puts the caret back in it: a form that\n// keeps the rejected digits makes the person select-all before retyping.\nwatch(\n  () => props.failure,\n  async (f) => {\n    if (f === 'wrong') {\n      pin.value = '';\n      await nextTick();\n      input.value?.focus();\n    }\n  },\n);\n\nonMounted(() => input.value?.focus());\n\nfunction submit(): void {\n  if (props.busy || props.failure === 'locked') return;\n  // ⚠ An empty box is not an error to announce, it is a caret to move. The\n  // button stays live — a greyed-out primary is the whole page's one act\n  // looking broken before the person has done anything wrong.\n  if (!pin.value.trim()) {\n    input.value?.focus();\n    return;\n  }\n  emit('submit', pin.value);\n}\n</script>\n\n<template>\n  <form class=\"fe-ppage__pin\" data-testid=\"public-page-pin\" @submit.prevent=\"submit\">\n    <div class=\"fe-ppage__state\">\n      <h2 class=\"fe-ppage__state-title\">{{ t('plugin.page.pin_title') }}</h2>\n      <p class=\"fe-surface__text fe-surface__text--muted\">{{ t('plugin.page.pin_hint') }}</p>\n    </div>\n    <!-- ⚠ The label is for a screen reader only. The heading right above it\n         already says the box is for a code, and a visible \"PIN\" caption over\n         a PIN box is furniture — the old gate had none. -->\n    <label class=\"fe-ppage__srlabel\" for=\"fe-ppage-pin\">{{ t('plugin.pin.label') }}</label>\n    <input\n      id=\"fe-ppage-pin\"\n      ref=\"input\"\n      v-model=\"pin\"\n      class=\"fe-cfield__input fe-ppage__pinput\"\n      :class=\"{ 'is-invalid': !!message() }\"\n      type=\"text\"\n      inputmode=\"numeric\"\n      autocomplete=\"one-time-code\"\n      spellcheck=\"false\"\n      :maxlength=\"maxLength && maxLength > 0 ? maxLength : undefined\"\n      :disabled=\"busy || failure === 'locked'\"\n      :aria-invalid=\"message() ? 'true' : undefined\"\n      data-testid=\"public-page-pin-input\"\n    />\n    <p v-if=\"message()\" class=\"fe-ppage__error\" role=\"alert\" data-testid=\"public-page-pin-error\">\n      {{ message() }}<template v-if=\"lockMessage\"> ({{ lockMessage }})</template>\n    </p>\n    <button\n      type=\"submit\"\n      class=\"fe-btn fe-btn--primary\"\n      :disabled=\"busy || failure === 'locked'\"\n      data-testid=\"public-page-pin-submit\"\n    >\n      {{ t('plugin.page.pin_submit') }}\n    </button>\n  </form>\n</template>\n","<script setup lang=\"ts\">\n/**\n * PublicLanguagePicker — the language a stranger reads the page in.\n *\n * ⚠ A share link is opened by somebody who has no account here, so there is\n * no saved preference to read and the server's guess (`Accept-Language`) is\n * all there was. This is how they correct it — and the correction is kept on\n * the DEVICE only, because there is nobody to keep it for.\n *\n * ⚠⚠ The list is NOT hardcoded (v3 §5). It is whatever `lib/uiLocales` says\n * the instance offers, which includes a language an app plugin shipped —\n * marked with the app it came from, so nobody wonders why \"العربية\" appeared\n * on a filex install. Buttons, not a dropdown, for the same reason the rest\n * of this round is: with two or three languages the answer should be\n * readable without opening anything.\n */\nimport { computed } from 'vue';\nimport { availableLocales, localesVersion } from '../../lib/uiLocales';\n\nconst props = defineProps<{\n  modelValue: string;\n  /** Shown beside a language an app added (\"from <app>\"). */\n  pluginNote?: (plugin: string) => string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'update:modelValue', v: string): void;\n}>();\n\nconst options = computed(() => {\n  void localesVersion.value;\n  return availableLocales();\n});\n\n/** One language is not a choice — the picker draws nothing rather than a stub. */\nconst show = computed(() => options.value.length > 1);\n</script>\n\n<template>\n  <div v-if=\"show\" class=\"fe-plang\" role=\"group\" data-testid=\"public-language\">\n    <button\n      v-for=\"o in options\"\n      :key=\"o.code\"\n      type=\"button\"\n      class=\"fe-plang__btn\"\n      :class=\"{ 'is-on': o.code === props.modelValue }\"\n      :lang=\"o.code\"\n      :aria-pressed=\"o.code === props.modelValue ? 'true' : 'false'\"\n      :title=\"o.source === 'plugin' && o.plugin && pluginNote ? pluginNote(o.plugin) : undefined\"\n      :data-testid=\"`public-language-${o.code}`\"\n      @click=\"emit('update:modelValue', o.code)\"\n    >\n      {{ o.label }}\n      <small v-if=\"o.source === 'plugin' && o.plugin\" class=\"fe-plang__src\">{{ o.plugin }}</small>\n    </button>\n  </div>\n</template>\n\n","<script setup lang=\"ts\">\n/**\n * PublicShell — the frame every public link is drawn in.\n *\n * ⚠⚠ v3 §1, and the whole point of the round: a share, a file request and an\n * app plugin's page are ONE page with three bodies, not three pages. What\n * the shell owns is exactly what they used to each get wrong on their own —\n *\n *   · the instance's name, logo and colour (§1.2: whitelabel means\n *     whitelabel — a signature request from a renamed instance does not say\n *     \"filex\");\n *   · the PIN gate, once, with one wording and one lockout behaviour;\n *   · expiry and the visit counter, said out loud rather than discovered;\n *   · \"this link is not available\", identical for expired, used up and\n *     withdrawn, because a visitor must not be told which;\n *   · the language picker, including a language an app plugin added.\n *\n * The BODY is a slot. Nothing in here knows whether it is showing a document,\n * a folder, a drop box or a plugin's screen, and that is what keeps the\n * three from drifting apart again.\n *\n * ⚠⚠ Unifying them had to level them UP and did not (owner, 2026-09-23:\n * \"böyle güzel bir ekranımız vardı share katmanında … iki sayfa aynı olsun\n * dediğim için ikisini de kötü hale çevirmişsin\"). The look is the one the\n * Go-rendered gate had until v0.42.2 and it is the shell's, not a page's:\n * the mark centred ABOVE the card, a round tinted badge, a heading, a quiet\n * line, and — on a gate — a full-width field and a full-width accent button\n * on a card that is 400px and centred in the viewport. A body that wants\n * room asks for it through `layout`, which is the only thing that varies\n * (`gate` 400 · `form` 520 · `wide` 880 — the old stylesheet's three cards).\n *\n * ⚠ It lives in `packages/core`, not in the web app, so the desktop app and\n * an embed draw the same public page. `web/` only binds the routes.\n *\n * ⚠ The accent is applied to THIS element, never to `:root` — the shell can\n * be mounted inside another page, and a link must not repaint its host.\n */\nimport { computed } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../../types/ExplorerConfig';\nimport type { PublicStatus } from '../../composables/usePublicLink';\nimport type { PublicLayout } from '../../lib/publicLayout';\nimport { useLocale } from '../../composables/useLocale';\nimport { usePublicText } from '../../composables/usePublicText';\nimport { DEFAULT_BRAND_NAME } from '../../composables/usePublicBranding';\nimport LogoMark from '../LogoMark.vue';\nimport PublicPinGate from './PublicPinGate.vue';\nimport PublicLanguagePicker from './PublicLanguagePicker.vue';\n\nconst props = defineProps<{\n  status: PublicStatus;\n  locale: LocaleCode | string;\n  /** `light` | `dark` — already resolved; `auto` is the caller's to answer. */\n  theme?: 'light' | 'dark' | ThemeMode;\n  /** The instance's name (branding, or the product's own). */\n  brandName: string;\n  logoUrl?: string;\n  /** `--fe-*` overrides from the instance's accent colour. */\n  accentStyle?: Record<string, string>;\n  footerText?: string;\n  hidePoweredBy?: boolean;\n  /**\n   * How much room the body needs (`lib/publicLayout`). Every state that is\n   * NOT `ready` overrides it to `gate`: a PIN box, \"this link is not\n   * available\" and \"thank you\" are the same short, centred card whatever\n   * was going to be behind them.\n   */\n  layout?: PublicLayout;\n  /**\n   * The round badge a READY body opens with — `file` or `folder`. Every\n   * other badge is a state of the shell's own (a padlock, a tick, a warning\n   * sign, a spinner) and is not the caller's to pick.\n   */\n  badge?: 'file' | 'folder' | '';\n  /** The heading: a file name, a folder, a plugin page's title. */\n  title?: string;\n  /** The line under it — a share message, a signature request's subject. */\n  subject?: string;\n  /** RFC 3339, or null for \"does not expire\". */\n  expiresAt?: string | null;\n  /** Visits left before the link stops answering; null = uncounted. */\n  visitsLeft?: number | null;\n  /**\n   * The longest PIN the server lets any link carry (`pin_max`, the one PIN\n   * rule in internal/share). The PIN box stops there; absent = no cap of the\n   * box's own.\n   */\n  pinMax?: number | null;\n  pinBusy?: boolean;\n  pinFailure?: '' | 'wrong' | 'locked';\n  lockMessage?: string;\n  /** A failure outside the conversation, in the server's words. */\n  failure?: string;\n  /**\n   * Drawn INSIDE another page that has a main region of its own - the\n   * admin's Corporate identity preview (PublicLinkPreview), or an embedder's\n   * page. The card is then a plain block, not a `<main>`: a document has one\n   * main landmark, and a `<main>` inside another is not valid HTML (the\n   * panel's page and the preview's card were two of them, e2e 204). The link\n   * page itself, which IS the whole page, keeps its `<main>`.\n   */\n  embedded?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'pin', pin: string): void;\n  (e: 'retry'): void;\n  (e: 'update:locale', v: string): void;\n}>();\n\n// ⚠ RTL: `dir` on the page's own root too — the shell is the whole page when\n// the admin app mounts it, but an embedder may mount it in a page of its own.\nconst { t, formatDate, dir } = useLocale(() => props.locale);\n/* The page's own sentences are the SERVER's (server.public.*), handed down\n   by the page that fetched them (composables/usePublicText). */\nconst { pt } = usePublicText(() => String(props.locale));\n\n/** The body is drawn for these; everything else is a state of the shell's own. */\nconst showBody = computed(() => props.status === 'ready');\n\n/** A state of the shell's own is always the narrow, centred card. */\nconst layout = computed<PublicLayout>(() => (showBody.value ? (props.layout ?? 'form') : 'gate'));\n\nconst themeClass = computed(() =>\n  props.theme === 'dark' ? 'fe--theme-dark' : props.theme === 'light' ? 'fe--theme-light' : '',\n);\n\nconst expiry = computed(() => {\n  if (!props.expiresAt) return '';\n  const ms = Date.parse(props.expiresAt);\n  if (!Number.isFinite(ms)) return '';\n  return pt('expires', { when: formatDate(ms, { time: true }) });\n});\n\nconst visits = computed(() => {\n  const n = props.visitsLeft;\n  if (n === null || n === undefined || !Number.isFinite(n)) return '';\n  return pt('visits_left', { count: n });\n});\n\n/**\n * Which badge the card opens with. ONE decision, so a state and a body can\n * never both draw one, and a body cannot invent a shape of its own.\n */\nconst badgeKind = computed(() => {\n  if (props.status === 'pin') return 'lock';\n  if (props.status === 'accepted' || props.status === 'done') return 'check';\n  if (props.status === 'loading') return 'loading';\n  if (!showBody.value) return 'alert';\n  return props.badge ?? '';\n});\nconst badgeTone = computed(() =>\n  badgeKind.value === 'check'\n    ? 'fe-ppage__badge--ok'\n    : badgeKind.value === 'alert'\n      ? 'fe-ppage__badge--err'\n      : '',\n);\n\n/**\n * Whether the PRODUCT's own mark may be drawn beside the attribution line.\n *\n * ⚠ Only when the instance has neither a logo nor a name of its own — that\n * is, when the line under it reads \"Served by filex\" and the folder-and-tick\n * is what it is talking about. An operator who has renamed the instance gets\n * their own logo, or their name and nothing else: putting our mark next to\n * \"Served by Acme Files\" is the whitelabel leak v3 §1.2 exists to stop, and\n * the shell's own test asserts a renamed page never says \"filex\".\n *\n * ⚠ The mark is `@brftech/filex-core`'s LogoMark — the ONE copy in the\n * product (dup-scan: `brand-mark`). It was hand-typed here for about an hour\n * on 2026-09-23 and the duplicate gate caught it, which is exactly the\n * failure that once shipped the pre-rebrand indigo on the page strangers see.\n */\nconst ownMark = computed(() => !props.logoUrl && props.brandName === DEFAULT_BRAND_NAME);\n\nfunction pluginNote(plugin: string): string {\n  return pt('language_from', { app: plugin });\n}\n</script>\n\n<template>\n  <div\n    class=\"fe fe-ppage\"\n    :dir=\"dir\"\n    :class=\"[themeClass, `fe-ppage--${layout}`]\"\n    :style=\"accentStyle\"\n    data-testid=\"public-page\"\n    :data-state=\"status\"\n    :data-layout=\"layout\"\n  >\n    <!-- ⚠ ABOVE the card and centred on it. Inside the card it read as a\n         caption on somebody else's document; above it, it says whose page\n         this is — which is the first thing a stranger needs.\n         ⚠ The mark is the INSTANCE's logo, or — only while the instance is\n         still called by the product's name — the product's own (`ownMark`).\n         It is DRAWN, never re-typed: LogoMark is the one home of that path\n         data (dup-scan `brand-mark`), and a second hand copy is how the page\n         strangers see shipped the pre-rebrand indigo for a whole wave. -->\n    <header class=\"fe-ppage__brand\" data-testid=\"public-brand\">\n      <img v-if=\"logoUrl\" class=\"fe-ppage__logo\" :src=\"logoUrl\" :alt=\"brandName\" />\n      <LogoMark v-else-if=\"ownMark\" class=\"fe-ppage__logo\" />\n      <span class=\"fe-ppage__brandname\">{{ brandName }}</span>\n    </header>\n\n    <component :is=\"embedded ? 'div' : 'main'\" class=\"fe-ppage__card\">\n      <!-- The badge the card opens with. The shell draws the one its state\n           calls for; a READY body names `file` or `folder` and gets the same\n           circle in the same place, so a document, a folder and a locked\n           link are one family rather than three drawings. -->\n      <div\n        v-if=\"badgeKind\"\n        class=\"fe-ppage__badge\"\n        :class=\"badgeTone\"\n        data-testid=\"public-page-badge\"\n        :data-badge=\"badgeKind\"\n        aria-hidden=\"true\"\n      >\n        <span v-if=\"badgeKind === 'loading'\" class=\"fe-ppage__spinner\"></span>\n        <svg\n          v-else\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          :stroke-width=\"badgeKind === 'check' ? 2 : 1.8\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n        >\n          <template v-if=\"badgeKind === 'lock'\">\n            <rect x=\"4.5\" y=\"10.5\" width=\"15\" height=\"9.5\" rx=\"2\" />\n            <path d=\"M8 10.5V7a4 4 0 0 1 8 0v3.5\" />\n            <path d=\"M12 14.5v2\" />\n          </template>\n          <template v-else-if=\"badgeKind === 'check'\">\n            <path d=\"M4.5 12.5l5 5 10-11\" />\n          </template>\n          <template v-else-if=\"badgeKind === 'alert'\">\n            <path d=\"M10.3 4.2 2.6 17.9a2 2 0 0 0 1.7 3h15.4a2 2 0 0 0 1.7-3L13.7 4.2a2 2 0 0 0-3.4 0z\" />\n            <path d=\"M12 9.5v4.5\" />\n            <path d=\"M12 17.4h.01\" />\n          </template>\n          <template v-else-if=\"badgeKind === 'folder'\">\n            <path d=\"M3.5 7a2 2 0 0 1 2-2h4l2 2h7a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-13a2 2 0 0 1-2-2V7z\" />\n            <path d=\"M12 10.5V16\" />\n            <path d=\"M9.5 13.5 12 16l2.5-2.5\" />\n          </template>\n          <template v-else>\n            <path d=\"M7 3.5h7l4 4V20a1.5 1.5 0 0 1-1.5 1.5h-9A1.5 1.5 0 0 1 6 20V5A1.5 1.5 0 0 1 7.5 3.5z\" />\n            <path d=\"M13.5 3.5V8H18\" />\n            <path d=\"M12 11.5V17\" />\n            <path d=\"M9.5 14.5 12 17l2.5-2.5\" />\n          </template>\n        </svg>\n      </div>\n\n      <!-- ⚠⚠ `&& showBody`, on purpose and confirmed 2026-09-23: the heading\n           is drawn only once the link has OPENED. A locked gate used to print\n           the file's name above the PIN box, which tells somebody who cannot\n           get in what is behind it — and a stranger typing at a token they\n           were not given learns the name of a real document. It is the same\n           reasoning as the one sentence for expired / used up / withdrawn\n           below: the page says nothing about what it is guarding until it is\n           satisfied the person may see it. Do not \"restore\" the heading here;\n           if a gate ever needs to name its subject, that is a decision about\n           what the SERVER sends before an unlock, not a template change. -->\n      <header v-if=\"(title || subject) && showBody\" class=\"fe-ppage__head\">\n        <h1 v-if=\"title\" class=\"fe-ppage__title\" data-testid=\"public-page-title\"><bdi>{{ title }}</bdi></h1>\n        <p v-if=\"subject\" class=\"fe-ppage__subject\" data-testid=\"public-page-subject\">{{ subject }}</p>\n      </header>\n\n      <!-- ⚠ Said out loud, not discovered. A link that stops working\n           tomorrow, or after one more visit, is a fact the person holding it\n           needs BEFORE they put it aside for the weekend. -->\n      <p v-if=\"(expiry || visits) && showBody\" class=\"fe-ppage__meta\" data-testid=\"public-page-meta\">\n        <span v-if=\"expiry\">{{ expiry }}</span>\n        <span v-if=\"expiry && visits\" aria-hidden=\"true\">·</span>\n        <span v-if=\"visits\">{{ visits }}</span>\n      </p>\n\n      <p\n        v-if=\"status === 'loading'\"\n        class=\"fe-surface__text fe-surface__text--muted\"\n        data-testid=\"public-page-loading\"\n      >\n        {{ t('plugin.page.loading') }}\n      </p>\n\n      <PublicPinGate\n        v-else-if=\"status === 'pin'\"\n        :locale=\"locale\"\n        :busy=\"pinBusy\"\n        :failure=\"pinFailure\"\n        :lock-message=\"lockMessage\"\n        :max-length=\"pinMax ?? undefined\"\n        @submit=\"(p: string) => emit('pin', p)\"\n      />\n\n      <slot v-else-if=\"showBody\" />\n\n      <div\n        v-else-if=\"status === 'accepted'\"\n        class=\"fe-ppage__state fe-ppage__state--ok\"\n        data-testid=\"public-page-accepted\"\n      >\n        <slot name=\"accepted\">\n          <h2 class=\"fe-ppage__state-title\">{{ t('plugin.page.accepted_title') }}</h2>\n          <p class=\"fe-surface__text\">{{ t('plugin.page.accepted_text') }}</p>\n        </slot>\n      </div>\n\n      <div v-else-if=\"status === 'done'\" class=\"fe-ppage__state fe-ppage__state--ok\" data-testid=\"public-page-done\">\n        <slot name=\"done\">\n          <h2 class=\"fe-ppage__state-title\">{{ t('plugin.page.done_title') }}</h2>\n          <p class=\"fe-surface__text\">{{ t('plugin.page.done_text') }}</p>\n        </slot>\n      </div>\n\n      <div v-else-if=\"status === 'error'\" class=\"fe-ppage__state\" data-testid=\"public-page-error\">\n        <h2 class=\"fe-ppage__state-title\">{{ t('plugin.page.error_title') }}</h2>\n        <p v-if=\"failure\" class=\"fe-ppage__error\">{{ failure }}</p>\n        <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"emit('retry')\">\n          {{ t('plugin.page.retry') }}\n        </button>\n      </div>\n\n      <!-- ⚠ ONE sentence for expired, used up and withdrawn. Telling a\n           visitor WHICH confirms that the link existed, which is more than\n           somebody guessing tokens should learn. -->\n      <div v-else class=\"fe-ppage__state\" data-testid=\"public-page-unavailable\">\n        <h2 class=\"fe-ppage__state-title\">{{ t('plugin.page.unavailable_title') }}</h2>\n        <p class=\"fe-surface__text fe-surface__text--muted\">{{ t('plugin.page.unavailable_text') }}</p>\n      </div>\n\n      <slot name=\"extra\" />\n    </component>\n\n    <footer class=\"fe-ppage__foot\">\n      <PublicLanguagePicker\n        :model-value=\"String(locale)\"\n        :plugin-note=\"pluginNote\"\n        @update:model-value=\"(v: string) => emit('update:locale', v)\"\n      />\n      <p v-if=\"footerText\" class=\"fe-ppage__footline\" data-testid=\"public-footer-text\">{{ footerText }}</p>\n      <!-- The modest brand line the old page ended on: a small mark and one\n           sentence, centred under the card. -->\n      <span v-if=\"!hidePoweredBy\" class=\"fe-ppage__footmark\" data-testid=\"public-footer-powered\">\n        <img v-if=\"logoUrl\" :src=\"logoUrl\" alt=\"\" />\n        <LogoMark v-else-if=\"ownMark\" />\n        {{ pt('served_by', { name: brandName }) }}\n      </span>\n    </footer>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * PublicShareBody — what a share actually contains.\n *\n * Three bodies, one shell (`PublicShell`): a document to download, a folder,\n * or an app plugin's screen when the link carries one (v3 §1.1 — \"an app's\n * public page IS a share\"). The chrome around all three — branding, the PIN\n * gate, expiry, the language picker — is the shell's and is not repeated\n * here.\n *\n * ⚠ The surface is drawn by the SAME `SurfaceConversation` the explorer's\n * dialog and an app's page use. A visitor and a signed-in user must see one\n * surface rendered one way, or every plugin has to be tested twice.\n *\n * ⚠⚠ The bytes are NOT fetched through `/api/`. `/s/<token>` has always been\n * the address that serves the file and still is: the SPA is what a\n * JavaScript browser gets when it NAVIGATES there, and `?download=1` /\n * `?zip=1` are the escapes that mean \"the thing, not the page\"\n * (`handlers/public_shell.go`). A second download route under `/api/` would\n * be a second thing to keep working.\n */\nimport { computed } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../../types/ExplorerConfig';\nimport type { PublicEntry, PublicShareInfo } from '../../types/Public';\nimport type { PublicLinkStore } from '../../composables/usePublicLink';\nimport { useLocale } from '../../composables/useLocale';\nimport { usePublicText } from '../../composables/usePublicText';\nimport SurfaceConversation from '../plugin/SurfaceConversation.vue';\nimport SurfaceFooterButtons from '../plugin/SurfaceFooterButtons.vue';\n\nconst props = defineProps<{\n  link: PublicLinkStore<PublicShareInfo> & {\n    downloadUrl: (o?: { zip?: boolean; path?: string }) => string;\n    noJsUrl: () => string;\n  };\n  locale: LocaleCode | string;\n  theme?: ThemeMode;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'navigate', path: string): void;\n}>();\n\nconst { t, formatSize, formatDate } = useLocale(() => props.locale);\n/* The link page's own sentences are the server's (server.public.*), the same\n   ones its no-JavaScript page says (composables/usePublicText). */\nconst { pt } = usePublicText(() => String(props.locale));\n\nconst info = computed(() => props.link.info.value);\nconst kind = computed(() => info.value?.kind ?? 'file');\nconst node = computed(() => info.value?.node ?? null);\nconst app = computed(() => info.value?.app ?? null);\nconst entries = computed<PublicEntry[]>(() => info.value?.entries ?? []);\n/** #104: the storage could not answer for the item - nothing to download. */\nconst unavailable = computed(() => info.value?.unavailable === true);\n\n/**\n * A picture is shown, everything else is offered.\n *\n * ⚠ Deliberately narrow. A public page renders bytes a stranger was sent by\n * a stranger; an <img> is a decode the browser does every day, while an\n * inline frame of arbitrary content on our origin is not something a share\n * link should be able to ask for.\n */\nconst isImage = computed(() => (node.value?.mime ?? '').startsWith('image/'));\n\n/** The path back up, or null at the share's root. */\nconst parent = computed(() => {\n  const p = (info.value?.path ?? '').replace(/\\/+$/, '');\n  if (!p) return null;\n  const i = p.lastIndexOf('/');\n  return i <= 0 ? '' : p.slice(0, i);\n});\n</script>\n\n<template>\n  <!-- ── an app plugin's screen ─────────────────────────────────────── -->\n  <template v-if=\"kind === 'app'\">\n    <!-- ⚠⚠ A document in an app's screen (a signing link's \"see and\n         approve\" step) is fitted to the WINDOW, as the in-app page fits it —\n         never drawn at the card's full width inside a fixed-height pane.\n         Measured on a signing link, 2026-09-21: the page was 676px wide in a\n         615px-tall pane, the signer saw the top 60% of it and none of their\n         own boxes, which sat at the bottom — the owner's \"arayüz berbat\". -->\n    <SurfaceConversation\n      :conv=\"link.conv\"\n      :locale=\"locale as LocaleCode\"\n      :theme=\"theme\"\n      :file-url=\"link.resolveFile\"\n      :toast=\"link.toast.value\"\n      layout=\"page\"\n      page-height=\"min(80vh, 1000px)\"\n    />\n    <div v-if=\"link.conv.footer.value.length\" class=\"fe-ppage__actions\">\n      <SurfaceFooterButtons :conv=\"link.conv\" :locale=\"locale as LocaleCode\" testid-prefix=\"public-page\" />\n    </div>\n    <!-- ⚠ The files an app exposes are drawn the way a SHARED FILE is —\n         its name and size, and a Download button — because to the person\n         holding the link that is what they are: a signer's copy of the\n         document is a file somebody shared with them. It used to be a\n         \"Documents\" heading over a bare link, a second way of saying the\n         same thing on what should be the same page. -->\n    <section v-if=\"app?.files?.length\" class=\"fe-ppage__appfiles\" data-testid=\"public-page-files\">\n      <div v-for=\"f in app?.files ?? []\" :key=\"f.ref\" class=\"fe-ppage__file-one fe-ppage__appfile\">\n        <p class=\"fe-surface__text\">\n          <strong>{{ f.name }}</strong>\n          <span v-if=\"f.size\" class=\"fe-ppage__filesize\"> · {{ formatSize(f.size) }}</span>\n        </p>\n        <a\n          class=\"fe-btn\"\n          :href=\"link.fileDownloadUrl(f.ref)\"\n          download\n          :title=\"t('plugin.page.open_file', { name: f.name })\"\n          :data-testid=\"`public-page-file-${f.ref}`\"\n        >\n          {{ t('ctx.download') }}\n        </a>\n      </div>\n    </section>\n  </template>\n\n  <!-- ── #104: the storage could not answer for it ─────────────────────── -->\n  <template v-else-if=\"unavailable\">\n    <div class=\"fe-ppage__file-one\" data-testid=\"public-share-unavailable\">\n      <p v-if=\"!node?.name\" class=\"fe-surface__text\">\n        <strong>{{ info?.subject }}</strong>\n      </p>\n      <p class=\"fe-surface__text fe-surface__text--muted\" role=\"status\">{{ pt('err_unavailable_body') }}</p>\n    </div>\n  </template>\n\n  <!-- ── a folder ───────────────────────────────────────────────────── -->\n  <template v-else-if=\"kind === 'folder'\">\n    <div class=\"fe-ppage__file-one\" data-testid=\"public-share-folder\">\n      <!-- Same rule as a document: the heading is the folder's name already. -->\n      <p v-if=\"!node?.name\" class=\"fe-surface__text\">\n        <strong>{{ info?.subject }}</strong>\n      </p>\n      <nav v-if=\"info?.path\" class=\"fe-ppage__crumbs\" data-testid=\"public-share-crumbs\">\n        <button type=\"button\" class=\"fe-btn fe-btn--sm\" @click=\"emit('navigate', parent ?? '')\">\n          {{ pt('folder_up') }}\n        </button>\n        <span class=\"fe-ppage__crumb\">{{ info?.path }}</span>\n      </nav>\n\n      <!-- ⚠ The server does not send a listing for a folder share yet: it\n           answers the folder's NAME and leaves the walking to the no-JS page.\n           The listing is drawn the moment one arrives; until then the two\n           things a visitor actually came for are here, and the third is one\n           link away. Writing a SECOND browse implementation against a\n           different endpoint is what v3 exists to stop. -->\n      <ul v-if=\"entries.length\" class=\"fe-ppage__files\" data-testid=\"public-share-entries\">\n        <li v-for=\"e in entries\" :key=\"e.path\" class=\"fe-ppage__file\" :data-dir=\"e.is_dir ? '1' : undefined\">\n          <button\n            v-if=\"e.is_dir\"\n            type=\"button\"\n            class=\"fe-ppage__entry\"\n            :data-testid=\"`public-entry-${e.name}`\"\n            @click=\"emit('navigate', e.path)\"\n          >\n            <bdi>{{ e.name }}</bdi>\n          </button>\n          <a\n            v-else\n            :href=\"e.url || link.downloadUrl({ path: e.path })\"\n            class=\"fe-ppage__entry\"\n            :data-testid=\"`public-entry-${e.name}`\"\n            download\n          ><bdi>{{ e.name }}</bdi></a>\n          <span v-if=\"!e.is_dir && e.size !== undefined\" class=\"fe-ppage__filesize\">{{ formatSize(e.size) }}</span>\n          <span v-if=\"e.modified\" class=\"fe-ppage__filesize\">{{ formatDate(e.modified) }}</span>\n        </li>\n      </ul>\n\n      <div class=\"fe-ppage__actions\">\n        <a class=\"fe-btn fe-btn--primary\" :href=\"link.downloadUrl({ zip: true })\" data-testid=\"public-share-zip\">\n          {{ pt('folder_zip') }}\n        </a>\n        <a v-if=\"!entries.length\" class=\"fe-btn\" :href=\"link.noJsUrl()\" data-testid=\"public-share-browse\">\n          {{ pt('browse') }}\n        </a>\n      </div>\n    </div>\n  </template>\n\n  <!-- ── one document ───────────────────────────────────────────────── -->\n  <template v-else>\n    <div class=\"fe-ppage__file-one\" data-testid=\"public-share-file\">\n      <img v-if=\"isImage\" class=\"fe-ppage__shot\" :src=\"link.downloadUrl()\" :alt=\"node?.name ?? ''\" />\n      <!-- ⚠ The name is NOT repeated here. The shell's heading is already the\n           file's own name (`PublicLinkPage.title`), and printing it again\n           under itself — \"brand-guidelines.pdf\" over \"brand-guidelines.pdf ·\n           791 B\" — is the stutter the levelled-down page shipped with. Only\n           the size, and the name as a fallback for a link that has none. -->\n      <p class=\"fe-surface__text fe-surface__text--muted\" data-testid=\"public-share-fileline\">\n        <strong v-if=\"!node?.name\">{{ info?.subject }}</strong>\n        <span v-if=\"node?.size !== undefined\" class=\"fe-ppage__filesize\">{{ formatSize(node?.size) }}</span>\n      </p>\n      <a class=\"fe-btn fe-btn--primary\" :href=\"link.downloadUrl()\" data-testid=\"public-share-download\">\n        {{ t('ctx.download') }}\n      </a>\n    </div>\n  </template>\n</template>\n","<script setup lang=\"ts\">\n/**\n * PublicRequestBody — the drop box a file request opens (`/d/<token>`).\n *\n * The person on this page is usually not a filex user and will never be one:\n * they were asked for a document and sent a link. So the body is one thing —\n * a place to put files — with the limits stated BEFORE they pick (what may\n * be sent, how big, how many are left), because a rejection after a two\n * minute upload is the version of this screen that gets abandoned.\n *\n * ⚠ Progress is real progress, from the upload itself (`usePublicRequest`\n * uses XHR for exactly this). A spinner that does not move is what makes\n * somebody reload the page halfway through a transfer.\n *\n * ⚠ \"Blind drop\": the server never tells this page what is already in the\n * folder, and this page never asks. A file request is permission to ADD.\n */\nimport { computed, ref } from 'vue';\nimport type { LocaleCode } from '../../types/ExplorerConfig';\nimport type { PublicRequestInfo } from '../../types/Public';\nimport { useLocale } from '../../composables/useLocale';\nimport { usePublicText } from '../../composables/usePublicText';\n\nconst props = defineProps<{\n  info: PublicRequestInfo | null;\n  uploads: Array<{ name: string; size: number; percent: number; state: string; error?: string }>;\n  locale: LocaleCode | string;\n  disabled?: boolean;\n  /**\n   * Leave the folder's name out of the body. The public page's heading is\n   * already that name (`PublicLinkPage` titles a request by its folder), and\n   * printing it again under itself read as a stutter.\n   */\n  hideFolder?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  /** The files, and the name the person gave (`''` when the link does not ask). */\n  (e: 'files', files: File[], name: string): void;\n}>();\n\n/**\n * The uploader's name, when the link asks for it (`limits.ask_name`).\n *\n * ⚠⚠ The owner's \"Ask uploader name\" is ON by default, and this page never\n * asked (QA, 2026-09-21): the setting did nothing, and every submission folder\n * arrived as `<date>_anon`. Optional, as on the no-JavaScript page — a name\n * nobody wants to give is not a reason to refuse their document — and ABOVE\n * the drop area, because dropping a file sends it.\n */\nconst uploaderName = ref('');\nconst askName = computed(() => props.info?.limits?.ask_name === true);\nfunction sendFiles(files: File[]): void {\n  emit('files', files, askName.value ? uploaderName.value.trim() : '');\n}\n\nconst { formatSize } = useLocale(() => props.locale);\n/* Every sentence on this body is the SERVER's (server.public.*): the same\n   words its no-JavaScript drop page and its refusals say, in every language a\n   pack gives it (composables/usePublicText). */\nconst { pt } = usePublicText(() => String(props.locale));\n\n/**\n * The longest name the server keeps (`limits.name_max`). ⚠ The server's\n * number, not this box's: the box used to stop at 60 while the server cut\n * the name to 40 without a word; now the box stops where the server does and\n * the server refuses anything longer.\n */\nconst nameMax = computed(() => {\n  const n = props.info?.limits?.name_max;\n  return typeof n === 'number' && n > 0 ? n : undefined;\n});\n\nconst input = ref<HTMLInputElement | null>(null);\nconst over = ref(false);\n\nconst limitsOf = computed(() => props.info?.limits ?? {});\n\nconst accept = computed(() => {\n  const list = limitsOf.value.allowed_ext ?? [];\n  return list.length ? list.map((e) => `.${e.replace(/^\\./, '')}`).join(',') : undefined;\n});\n\nconst limits = computed(() => {\n  const out: string[] = [];\n  const mb = limitsOf.value.max_file_size_mb;\n  // ⚠ The server states MEGABYTES; the screen says it in the same units the\n  // rest of the product uses, so \"5 MB\" here and \"5 MB\" in the explorer are\n  // the same number rather than two roundings of it.\n  if (mb && mb > 0) out.push(pt('drop_limit_size', { mb }));\n  const ext = limitsOf.value.allowed_ext ?? [];\n  if (ext.length) out.push(pt('drop_limit_ext', { types: ext.map((e) => e.toUpperCase()).join(', ') }));\n  const left = props.info?.uploads_left;\n  if (left !== null && left !== undefined && Number.isFinite(left)) out.push(pt('files_left', { count: left }));\n  return out;\n});\n\n/** No room left: the box says so instead of taking a file the server will refuse. */\nconst full = computed(() => {\n  const left = props.info?.uploads_left;\n  return left !== null && left !== undefined && Number.isFinite(left) && left <= 0;\n});\n\nfunction pick(): void {\n  if (props.disabled || full.value) return;\n  input.value?.click();\n}\n\nfunction onPicked(e: Event): void {\n  const el = e.target as HTMLInputElement;\n  const files = Array.from(el.files ?? []);\n  if (files.length) sendFiles(files);\n  // Cleared so choosing the SAME file twice still fires a change event.\n  el.value = '';\n}\n\nfunction onDrop(e: DragEvent): void {\n  over.value = false;\n  if (props.disabled || full.value) return;\n  const files = Array.from(e.dataTransfer?.files ?? []);\n  if (files.length) sendFiles(files);\n}\n</script>\n\n<template>\n  <div class=\"fe-pdrop\" data-testid=\"public-request\">\n    <p v-if=\"info?.folder && !hideFolder\" class=\"fe-surface__text\" data-testid=\"public-request-folder\">\n      <strong>{{ info?.folder }}</strong>\n    </p>\n\n    <!-- ⚠ What this page IS, said before anything is asked of the person.\n         The Go-rendered drop page opened on this sentence and the unified\n         shell dropped it, so a stranger arrived at a dashed rectangle with no\n         statement of what happens to what they put in it — and none of the\n         reassurance that they are not being shown somebody's folder. -->\n    <p class=\"fe-surface__text fe-surface__text--muted\" data-testid=\"public-request-lead\">\n      {{ pt('drop_sub') }}\n    </p>\n\n    <label v-if=\"askName && !full\" class=\"fe-pdrop__who\" data-testid=\"public-request-name\">\n      <span class=\"fe-pdrop__wholabel\">{{ pt('drop_name_label') }}</span>\n      <input\n        v-model=\"uploaderName\"\n        class=\"fe-pdrop__whoinput\"\n        type=\"text\"\n        :maxlength=\"nameMax\"\n        autocomplete=\"name\"\n        :placeholder=\"pt('drop_name_ph')\"\n        :disabled=\"disabled\"\n        data-testid=\"public-request-name-input\"\n      />\n    </label>\n\n    <div\n      class=\"fe-pdrop__zone\"\n      :class=\"{ 'is-over': over, 'is-disabled': disabled || full }\"\n      role=\"button\"\n      tabindex=\"0\"\n      data-testid=\"public-request-drop\"\n      @click=\"pick\"\n      @keydown.enter.prevent=\"pick\"\n      @keydown.space.prevent=\"pick\"\n      @dragover.prevent=\"over = true\"\n      @dragleave=\"over = false\"\n      @drop.prevent=\"onDrop\"\n    >\n      <svg\n        class=\"fe-pdrop__icon\"\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        stroke-width=\"1.7\"\n        stroke-linecap=\"round\"\n        stroke-linejoin=\"round\"\n        aria-hidden=\"true\"\n      >\n        <path d=\"M4 14.9A7 7 0 1 1 15.7 8h1.8a4.5 4.5 0 0 1 2.5 8.2\" />\n        <path d=\"M12 12v9\" />\n        <path d=\"m16 16-4-4-4 4\" />\n      </svg>\n      <p class=\"fe-pdrop__lead\">{{ full ? pt('request_full') : pt('drop_zone_big') }}</p>\n      <p v-if=\"!full\" class=\"fe-surface__text fe-surface__text--muted\">{{ pt('drop_zone_hint') }}</p>\n      <input\n        ref=\"input\"\n        class=\"fe-pdrop__input\"\n        type=\"file\"\n        multiple\n        :accept=\"accept\"\n        :disabled=\"disabled || full\"\n        data-testid=\"public-request-input\"\n        @change=\"onPicked\"\n      />\n    </div>\n\n    <!-- ⚠ The limits are separated by a dot, as every other list of facts on\n         this page is. Butted against each other they read as one sentence:\n         \"At most 20 MB per file Accepted: PDF, PNG\". -->\n    <p v-if=\"limits.length\" class=\"fe-ppage__meta\" data-testid=\"public-request-limits\">\n      <template v-for=\"(l, i) in limits\" :key=\"i\">\n        <span v-if=\"i\" aria-hidden=\"true\">·</span>\n        <span>{{ l }}</span>\n      </template>\n    </p>\n\n    <ul v-if=\"uploads.length\" class=\"fe-pdrop__list\" data-testid=\"public-request-uploads\">\n      <li v-for=\"(u, i) in uploads\" :key=\"`${u.name}-${i}`\" class=\"fe-pdrop__item\" :data-state=\"u.state\">\n        <span class=\"fe-pdrop__name\"><bdi>{{ u.name }}</bdi></span>\n        <span class=\"fe-ppage__filesize\">{{ formatSize(u.size) }}</span>\n        <progress\n          v-if=\"u.state === 'sending'\"\n          class=\"fe-pdrop__bar\"\n          :max=\"100\"\n          :value=\"u.percent >= 0 ? u.percent : undefined\"\n        ></progress>\n        <!-- Every byte is sent; the server is writing it to the storage. The\n             bar runs without a value: it is not stuck at 100%. -->\n        <template v-else-if=\"u.state === 'saving'\">\n          <progress class=\"fe-pdrop__bar\" :max=\"100\"></progress>\n          <span class=\"fe-pdrop__saving\" role=\"status\">{{ pt('upload_saving') }}</span>\n        </template>\n        <span v-else-if=\"u.state === 'done'\" class=\"fe-pdrop__ok\">{{ pt('upload_done') }}</span>\n        <span v-else-if=\"u.state === 'unconfirmed'\" class=\"fe-pdrop__unconfirmed\" role=\"status\">{{\n          u.error || pt('upload_unanswered')\n        }}</span>\n        <span v-else class=\"fe-surface__error\">{{ u.error || pt('drop_err_generic') }}</span>\n      </li>\n    </ul>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * PublicLinkPage — the whole public page, for whichever link was followed.\n *\n * ⚠⚠ This is the component `web/` mounts for `/s/:token` and `/d/:token`,\n * and it is the ONLY thing the routes do (v3 §1: one public shell, in\n * `packages/core`, so the desktop app and an embed draw the same page). The\n * web app binds addresses; it does not own a public surface.\n *\n * What happens here and nowhere else:\n *   · the visitor's language, which has no account to be read from — the\n *     browser's, or a choice made on this device, over a list that now\n *     includes whatever an app plugin added (`lib/uiLocales`);\n *   · the light/dark answer: the instance's default (branding) unless this\n *     device has chosen otherwise;\n *   · the instance's identity, applied to the shell rather than to `:root`.\n *\n * ⚠ Nothing about the visitor is stored beyond the two display choices\n * above: no session, no token copy, no PIN (the unlock cookie is the\n * server's and HttpOnly).\n */\nimport { computed, onMounted, ref, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../../types/ExplorerConfig';\nimport type { PublicRequestInfo, PublicShareInfo } from '../../types/Public';\nimport { useLocale } from '../../composables/useLocale';\nimport { usePublicBranding } from '../../composables/usePublicBranding';\nimport { useSystemDark } from '../../composables/useSystemDark';\nimport { usePublicRequest, usePublicShare } from '../../composables/usePublicLink';\nimport { loadPublicText, providePublicText, publicSentence } from '../../composables/usePublicText';\nimport { hasLocale, normalizeLocaleCode } from '../../lib/uiLocales';\nimport { localPref, setLocalPref } from '../../lib/prefs';\nimport { detectLocale } from '../../locales/resolve';\nimport { labelOf } from '../../lib/pluginLabel';\nimport { publicLayoutFor } from '../../lib/publicLayout';\nimport PublicShell from './PublicShell.vue';\nimport PublicShareBody from './PublicShareBody.vue';\nimport PublicRequestBody from './PublicRequestBody.vue';\nimport { appBase } from '../../lib/appBase';\nimport type { DropRefusal } from '../../lib/dropLimits';\n\nconst props = defineProps<{\n/**\n   * `share` → `/s/<token>`; `request` → `/d/<token>`.\n   *\n   * ⚠ `/p/<token>` is RETIRED (v3 §1: an app's public page is a share now)\n   * and the server 301s it to the share, so there is no third kind here and\n   * no second code path for the transition.\n   */\n  kind: 'share' | 'request';\n  /** From the route. Empty (a URL that is not a token) draws \"not available\". */\n  token?: string;\n  /**\n   * API origin; empty = same origin. Unset: the base path this document was\n   * served under (lib/appBase) — `/filex` for the admin app under a sub-path,\n   * `''` everywhere else.\n   */\n  base?: string;\n  /** Forced by the host; otherwise the device's choice, then the browser's. */\n  locale?: LocaleCode | string;\n  /** Forced by the host; otherwise the instance's default, then the device's. */\n  theme?: ThemeMode;\n}>();\n\n/* ── the visitor's language ───────────────────────────────────────────── */\n\nconst chosen = ref<string>('');\nconst locale = computed<string>(() => {\n  if (props.locale) return String(props.locale);\n  if (chosen.value) return chosen.value;\n  const stored = normalizeLocaleCode(localPref('locale'));\n  if (stored && hasLocale(stored)) return stored;\n  return detectLocale();\n});\n\nfunction chooseLocale(v: string): void {\n  const code = normalizeLocaleCode(v);\n  if (!code || !hasLocale(code)) return;\n  chosen.value = code;\n  // ⚠ localStorage and nothing else. There is no account behind a share\n  // link, so this is the only place a stranger's choice can live — and it is\n  // a display preference, not a fact about them.\n  setLocalPref('locale', code);\n}\n\nconst { t } = useLocale(() => locale.value);\n\n/* ── the server's words ───────────────────────────────────────────────── */\n\n/**\n * ⚠⚠ What this page says is the SERVER's (`server.public.*`, the table its\n * no-JavaScript pages render): fetched for the visitor's language and handed\n * to the shell and the bodies (composables/usePublicText). A second copy in\n * this package's catalogue said the same limits in other words.\n */\nconst words = loadPublicText({ base: props.base ?? appBase(), locale: () => locale.value });\nprovidePublicText(words);\n/**\n * The page waits for the words ONCE, on its first paint: a card drawn before\n * they land would show its buttons blank. ⚠ Not again when the visitor picks\n * another language - the table is swapped under the open page, so somebody\n * three steps into an app's wizard is not sent back through \"loading\".\n */\nconst wordsArrived = ref(false);\nwatch(\n  () => words.ready.value,\n  (v) => {\n    if (v) wordsArrived.value = true;\n  },\n  { immediate: true },\n);\n/** One server sentence, for the callbacks below (not a component's render). */\nfunction said(key: string, vars: Record<string, string | number> = {}): string {\n  return publicSentence(words.table.value, words.lang.value || locale.value, key, vars);\n}\n\n/* ── the instance's identity ──────────────────────────────────────────── */\n\n/** Where this page's API lives — see the `base` prop. */\nconst apiRoot = props.base ?? appBase();\n\nconst brand = usePublicBranding({ base: apiRoot });\n\n/* ⚠ The system's answer as a LIVE ref (#57): read inside the computed below\n   it was read once, and an open page kept the mode it was opened in. */\nconst systemDark = useSystemDark();\n\n/**\n * Light or dark.\n *\n * Order: what the host forced, then what this device chose, then the\n * instance's own default, then the system. ⚠ The instance's default is\n * BELOW the device's choice deliberately — an operator picks the default\n * their visitors start from, not the one they are held to.\n */\nconst resolvedTheme = computed<'light' | 'dark'>(() => {\n  const want = props.theme && props.theme !== 'auto' ? props.theme : localPref('theme') || brand.themeDefault.value;\n  if (want === 'light' || want === 'dark') return want;\n  return systemDark.value ? 'dark' : 'light';\n});\n\n/* ── the link itself ──────────────────────────────────────────────────── */\n\nconst opts = {\n  base: apiRoot,\n  locale: () => locale.value,\n  errorText: () => t('plugin.view.error'),\n};\n\nconst share = props.kind === 'share' ? usePublicShare(props.token ?? '', opts) : null;\n/* ⚠ A file request has no app behind it: its failure is \"could not be sent\",\n   never the app runtime's \"The app returned an error\" (QA, 2026-09-21). */\nconst request =\n  props.kind === 'request'\n    ? usePublicRequest(props.token ?? '', {\n        ...opts,\n        errorText: () => said('drop_err_generic'),\n        unansweredText: () => said('upload_unanswered'),\n      })\n    : null;\n\n/**\n * The words for a file the drop page will not send (lib/dropLimits) - the\n * server's own refusal sentences (`drop_err_*`), the ones it answers the same\n * file with, so the page says \"a.pdf is too big (max 5 MB).\" whether the\n * check ran here or there.\n */\nfunction refusedText(r: DropRefusal): string {\n  if (r.code === 'ext') return said('drop_err_ext', { name: r.name });\n  if (r.code === 'too_large') return said('drop_err_too_large', { name: r.name, mb: r.mb });\n  if (r.count <= 0) return said('request_full');\n  return said('drop_err_too_many', { count: r.count });\n}\nconst link = (share ?? request)!;\n\nconst shareInfo = computed(() => (share?.info.value ?? null) as PublicShareInfo | null);\nconst requestInfo = computed(() => (request?.info.value ?? null) as PublicRequestInfo | null);\n\n/**\n * The heading.\n *\n * An app link is titled by the app (its manifest page, then the surface it\n * answered with); a file or folder link by the thing behind it; a file\n * request by the folder it drops into. ⚠ The app's title is read from the\n * SURFACE as well, because a wizard renames the screen as it walks (\"Who\n * signs\" → \"Place the boxes\") and a heading frozen at the manifest's page\n * label would contradict the step under it.\n */\nconst title = computed(() => {\n  const app = shareInfo.value?.app;\n  const fromSurface = labelOf(share?.conv.current.value?.title, locale.value);\n  if (app) return fromSurface || labelOf(app.title, locale.value) || '';\n  return shareInfo.value?.node?.name || requestInfo.value?.folder || '';\n});\n\nconst subject = computed(() => {\n  const s = link.info.value?.subject ?? '';\n  // Not twice: a file share's subject defaults to the file's own name on the\n  // server, and printing it again under the heading is noise.\n  return s && s !== title.value ? s : '';\n});\n\n/**\n * How wide the card is, and which badge it opens with — both from the kind\n * the server answered with, through the one helper the admin preview uses\n * too (`lib/publicLayout`). ⚠ A file request is titled by its folder, so its\n * badge is a folder rather than a document.\n */\nconst layout = computed(() =>\n  publicLayoutFor(shareInfo.value?.kind ?? (request ? 'drop' : ''), {\n    list: (shareInfo.value?.entries?.length ?? 0) > 0,\n  }),\n);\nconst badge = computed<'file' | 'folder' | ''>(() => {\n  if (request) return '';\n  const kind = shareInfo.value?.kind;\n  if (kind === 'folder') return 'folder';\n  if (kind === 'app') return '';\n  return 'file';\n});\n\n/** Walking into a folder is a reload of the same link at another path. */\nfunction navigate(path: string): void {\n  void link.load(path ? `?path=${encodeURIComponent(path)}` : '');\n}\n\nwatch(title, (v) => {\n  if (v && typeof document !== 'undefined') document.title = v;\n});\n\n/**\n * THE DOCUMENT ELEMENT follows the language — both halves of it.\n *\n * ⚠⚠ The shell puts `dir` on its own wrapper, which turns the page around\n * visually, and that is what every eye test sees. `<html>` kept the values\n * the SERVER rendered: a stranger who pressed العربية on a share page was\n * reading Arabic inside `<html lang=\"en\" dir=\"ltr\">` (v0.43.0). Nothing on\n * screen says so, and everything that does not look at pixels is misled — a\n * screen reader announces the language it is told, hyphenation and quotation\n * marks follow `lang`, and `dir` on the root is what a printed page and any\n * unwrapped portal inherit.\n *\n * One watcher, `immediate`, so the first paint and every later change agree;\n * `chooseLocale` does not touch the document at all any more, because a\n * language can also arrive from the host (`props.locale`) or from what this\n * device chose last time.\n *\n * ⚠ `lang` only. `dir` is DERIVED from it by the one rule that owns\n * direction (`lib/direction` → `syncDocumentDir`, installed by the host that\n * owns the page), which also re-applies when the language LIST arrives — a\n * pack's language can be on `<html lang>` before the answer saying it is\n * written right to left has landed. Setting `dir` here as well produced\n * exactly that race: the page wrote `ltr` from a list it did not have yet.\n */\nwatch(\n  locale,\n  (code) => {\n    if (typeof document !== 'undefined') document.documentElement.lang = code;\n  },\n  { immediate: true },\n);\n\n// A language chosen mid-visit has to reach the PLUGIN too: its strings come\n// from the server, which reads `Accept-Language` on every call, so the screen\n// has to be asked for again in the new language.\n//\n// ⚠⚠ Asked AGAIN, not started again. Reloading the link re-opens the surface\n// at its first screen: somebody three steps into signing, with their title\n// typed and their signature drawn, lost all of it by pressing \"English\" —\n// and the language picker sits right next to the wizard. A `change` carries\n// the state and the values that are already on screen, so the same step\n// comes back in the other language with the answers still in it.\nwatch(locale, () => {\n  if (link.status.value === 'ready' && shareInfo.value?.kind === 'app') {\n    if (link.conv.current.value) void link.conv.post('change');\n    else void link.load();\n  }\n});\n\nonMounted(() => {\n  // ⚠ One fetch, not two: the branding answer CARRIES the language list\n  // (`locales`), and `usePublicBranding` folds it into the registry. A\n  // separate call would be a second unauthenticated round trip on every\n  // public page for half of what this one already says.\n  void brand.load();\n  if (!props.token) {\n    link.status.value = 'not_found';\n    return;\n  }\n  void link.load();\n});\n</script>\n\n<template>\n  <PublicShell\n    :status=\"wordsArrived ? link.status.value : 'loading'\"\n    :locale=\"locale\"\n    :theme=\"resolvedTheme\"\n    :brand-name=\"brand.name.value\"\n    :logo-url=\"brand.logo.value\"\n    :accent-style=\"brand.accentStyle.value\"\n    :footer-text=\"brand.footerText.value\"\n    :hide-powered-by=\"brand.hidePoweredBy.value\"\n    :layout=\"layout\"\n    :badge=\"badge\"\n    :title=\"title\"\n    :subject=\"subject\"\n    :expires-at=\"link.info.value?.expires_at ?? null\"\n    :visits-left=\"shareInfo?.visits_left ?? requestInfo?.uploads_left ?? null\"\n    :pin-max=\"link.info.value?.pin_max ?? null\"\n    :pin-busy=\"link.pinBusy.value\"\n    :pin-failure=\"link.pinFailure.value\"\n    :lock-message=\"link.lockMessage.value\"\n    :failure=\"link.failure.value\"\n    @pin=\"(p: string) => link.submitPin(p)\"\n    @retry=\"() => link.load()\"\n    @update:locale=\"chooseLocale\"\n  >\n    <PublicShareBody\n      v-if=\"share\"\n      :link=\"share\"\n      :locale=\"locale\"\n      :theme=\"resolvedTheme\"\n      @navigate=\"navigate\"\n    />\n    <PublicRequestBody\n      v-else-if=\"request\"\n      :info=\"requestInfo\"\n      :uploads=\"request.uploads.value\"\n      :locale=\"locale\"\n      hide-folder\n      @files=\"(f: File[], name: string) => request!.upload(f, { name, refusedText })\"\n    />\n  </PublicShell>\n</template>\n","<script setup lang=\"ts\">\n/**\n * PublicLinkPreview — the public share page, drawn with values that are not\n * saved yet, for the admin's Corporate identity page.\n *\n * ⚠⚠ It is the REAL page's components — PublicShell and PublicShareBody, the\n * ones `/s/<token>` mounts — not a picture of them. The admin page had a\n * hand-drawn mock (a centred card with an icon and a full-width button) while\n * the page it previewed is left-aligned and plain (release-candidate sweep,\n * 2026-09-21, QA #25): the preview taught the operator a page that does not\n * exist. Anything the public page changes, this changes with it.\n *\n * The \"link\" handed to the body is a fixed one-file share (only the fields\n * the one-document branch reads), and the accent goes through the same\n * derivation the page uses (accentStyleOf). The one thing fetched is what the\n * page SAYS - the server's public sentences in the previewed language\n * (composables/usePublicText) - because the page has no words of its own.\n *\n * ⚠ Inert: a preview is looked at, not used. The page's controls (the\n * download button, the language picker) must not act from inside the admin\n * panel.\n *\n * ⚠ `embedded`: the admin page around it already has the document's <main>,\n * so the shell's card is a plain block here, not a second one.\n */\nimport { computed, ref } from 'vue';\nimport type { LocaleCode } from '../../types/ExplorerConfig';\nimport type { PublicShareInfo } from '../../types/Public';\nimport type { PublicLinkStore } from '../../composables/usePublicLink';\nimport { accentStyleOf, DEFAULT_BRAND_NAME } from '../../composables/usePublicBranding';\nimport { publicLayoutFor } from '../../lib/publicLayout';\nimport { appBase } from '../../lib/appBase';\nimport { loadPublicText, providePublicText } from '../../composables/usePublicText';\nimport PublicShell from './PublicShell.vue';\nimport PublicShareBody from './PublicShareBody.vue';\n\nconst props = defineProps<{\n  brandName?: string;\n  logoUrl?: string;\n  /** A hex colour, as the operator typed it; anything else means \"none\". */\n  accent?: string;\n  footerText?: string;\n  hidePoweredBy?: boolean;\n  locale: LocaleCode | string;\n  theme?: 'light' | 'dark';\n  /** The file the sample link shares. */\n  sample?: { name: string; size: number; mime?: string };\n}>();\n\nconst file = computed(() => props.sample ?? { name: 'report-2026.pdf', size: 1_240_000, mime: 'application/pdf' });\n\nconst info = computed<PublicShareInfo>(() => ({\n  kind: 'file',\n  node: { name: file.value.name, size: file.value.size, mime: file.value.mime ?? 'application/pdf' },\n}) as PublicShareInfo);\n\n/* The body reads `info` and, for a single document, `downloadUrl()`; it\n   touches nothing else of a link on that branch. */\nconst link = computed(\n  () =>\n    ({\n      info: ref(info.value),\n      downloadUrl: () => '#',\n      noJsUrl: () => '#',\n    }) as unknown as PublicLinkStore<PublicShareInfo> & {\n      downloadUrl: (o?: { zip?: boolean; path?: string }) => string;\n      noJsUrl: () => string;\n    },\n);\n\nconst name = computed(() => props.brandName?.trim() || DEFAULT_BRAND_NAME);\n\n/* The page's words are the server's, as on the real page (PublicLinkPage). */\nprovidePublicText(loadPublicText({ base: appBase(), locale: () => String(props.locale) }));\n</script>\n\n<template>\n  <div class=\"fe-ppreview\" inert data-testid=\"public-link-preview\">\n    <PublicShell\n      status=\"ready\"\n      :locale=\"locale\"\n      :theme=\"theme ?? 'light'\"\n      :brand-name=\"name\"\n      :logo-url=\"logoUrl?.trim() || ''\"\n      :accent-style=\"accentStyleOf(accent)\"\n      :footer-text=\"footerText?.trim() || ''\"\n      :hide-powered-by=\"hidePoweredBy === true\"\n      :layout=\"publicLayoutFor('file')\"\n      badge=\"file\"\n      :title=\"file.name\"\n      embedded\n    >\n      <PublicShareBody :link=\"link\" :locale=\"locale\" :theme=\"theme ?? 'light'\" />\n    </PublicShell>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * PluginPageView — an app plugin's `page` view, drawn as a whole page.\n *\n * ⚠⚠ The SAME conversation a `modal` view has. `usePluginSurface` is the\n * shared half (the surface, the values, the debounced `change`, the footer\n * press, the `{op}` answer) and this file is only the frame: a title bar of\n * its own, one column at reading width, the footer buttons at the bottom,\n * and no dialog scroll inside a dialog. Writing a second conversation here\n * is how a `page` wizard and a `modal` wizard start disagreeing about what\n * `submit` sends.\n *\n * Its own two states, which a modal has no use for:\n *   • QUEUED — a `page` action never goes through `…/run`, so the job is\n *     born from this screen's submit. A tab that just closed itself would\n *     leave the person with no idea whether anything happened; instead the\n *     page says the job is queued, FOLLOWS it, and says how it ended - or,\n *     when the job's result names a screen on what it made (`surface.open`),\n *     goes there in this tab (filex #78: a job carries its person on to\n *     what it made).\n *   • DONE — the plugin ended the conversation (`done`), with nothing queued.\n *\n * ⚠ It is in the package, not in the admin SPA: fm.example.com, the desktop shell\n * and the embeds all reach `page` views through the same explorer, so a copy\n * per host would be a copy per host to keep in step.\n *\n * v4 — a view that is the app's OWN interface (its row carries `ui`) is drawn\n * by AppFrame instead of a conversation: this file asks the actions list\n * which it is, so every host (the new-tab page, the app's home page, the\n * admin panel's Apps section) gets the frame without knowing about it.\n */\nimport { computed, onMounted, ref, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../../types/ExplorerConfig';\nimport type { FileApi } from '../../composables/useFileApi';\nimport { useLocale } from '../../composables/useLocale';\nimport { usePluginSurface } from '../../composables/usePluginSurface';\nimport { labelOf } from '../../lib/pluginLabel';\nimport SurfaceConversation from './SurfaceConversation.vue';\nimport SurfaceFooterButtons from './SurfaceFooterButtons.vue';\nimport SurfaceSections from './SurfaceSections.vue';\nimport { walkNodes } from '../../lib/surfaceValues';\nimport { openTargetFor } from '../../lib/surfaceOpen';\nimport { isPagePlacement } from '../../lib/pluginPage';\nimport { opFailure } from '../../lib/errorWords';\nimport { jobOpenOf } from '../../lib/jobOpen';\nimport { usePendingOps, type PendingOp } from '../../composables/usePendingOps';\nimport AppFrame from './AppFrame.vue';\nimport type { PluginUIRef, SurfaceOpenRequest } from '../../types/Plugins';\nimport type { ExplorerConfig } from '../../types/ExplorerConfig';\n\nconst props = defineProps<{\n  locale: LocaleCode;\n  theme?: ThemeMode;\n  api: FileApi;\n  plugin: string;\n  view: string;\n  /** Adapter-qualified path the page was opened on; echoed on every event. */\n  path?: string;\n  /** Storage names a file-chooser may span; where its picker opens. */\n  storages?: string[];\n  startAt?: string;\n  /** Where \"back to the files\" goes. Absent: the button is not drawn. */\n  backHref?: string;\n  /** Where the operations tray lives, for the queued state. */\n  opsHref?: string;\n  /**\n   * The prefix the SPA is served from (`/admin/`, `/drive/`) — what a\n   * `Surface.open` address is built against (v3 §3.0). Absent: the request\n   * is dropped, because a wrong address is worse than none.\n   */\n  mountBase?: string;\n  /**\n   * The CHROME around the conversation; the conversation itself is the same\n   * either way.\n   *\n   * `page` (the default) is a browser tab of its own: a title bar, one column\n   * at reading width, the viewport's height, a footer stuck to its bottom.\n   * `embedded` is the same screen drawn INSIDE a host's page — the admin\n   * panel's Apps section, an embed that already has a header — and brings\n   * none of those three, because the host has already said where the screen\n   * begins, how wide it is and what it is called.\n   *\n   * ⚠ A step carrying a document keeps the INLINE layout when embedded. The\n   * `page` rule fits a PDF to the VIEWPORT (v3 §3.2); inside a host's page\n   * the viewport is not this frame's box, so the same rule would fit the\n   * document to a height the frame does not have.\n   */\n  frame?: 'page' | 'embedded';\n  /**\n   * The section of a home page to open (`surface.sections`), as the host's\n   * address says. ⚠ The HOST owns it: choosing a section emits `section`\n   * and the host puts it in its URL, which comes back here — so Back walks\n   * the sections, and a link names one.\n   */\n  section?: string;\n}>();\n\nconst emit = defineEmits<{\n  /** The server enqueued a job for this page; the raw ops row. */\n  (e: 'op', op: Record<string, unknown>): void;\n  /**\n   * The person chose another section of a home page — or, with\n   * `{replace: true}`, a page opened with NO section learned which one the\n   * plugin shows first: the address should name it without adding a step\n   * to history.\n   */\n  (e: 'section', id: string, how?: { replace?: boolean }): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/** Drawn inside a host's page rather than in a tab of its own. */\nconst embedded = computed(() => props.frame === 'embedded');\n\n/**\n * The body's element: the page's `<main>` in a tab of its own, a plain block\n * inside a host's page - the host already has the main region (the admin\n * panel's layout), and a document has one; a `<main>` inside another is not\n * valid HTML (the same rule as PublicShell's `embedded`).\n */\nconst bodyTag = computed(() => (embedded.value ? 'div' : 'main'));\n\ntype PageState = 'loading' | 'surface' | 'queued' | 'done' | 'error';\nconst state = ref<PageState>('loading');\nconst loadError = ref('');\nconst toast = ref('');\n\n/**\n * Where the job this page queued has got to. `running` until it ends; then\n * `done`, `failed`, or `opening` (the job asked for a screen on what it\n * made, and the page is on its way there).\n *\n * ⚠⚠ The page FOLLOWS its own job (filex #78). It used to stop at \"the job\n * is queued … you will be told when it lands\", and nothing told anybody: the\n * explorer in the other tab announces only the jobs IT queued, so a job born\n * here ended in silence. The signing app's \"Convert to PDF\" (filex-sign 0.2;\n * the app signs PDFs only since 0.3) was the case that read as a broken\n * wizard: the PDF landed, the page still said \"queued\", and the person had to\n * find the PDF and ask for signatures again. Now the page\n * says how the job ended in the person's words, and when the job's result\n * names a screen on one of its outputs (`surface.open`), it goes there.\n *\n * ⚠ The card keeps its `plugin-page-queued` place for the job's whole life:\n * it is the card about THE job, whose title and words change as the job does.\n */\ntype JobPhase = 'running' | 'done' | 'failed' | 'opening';\nconst jobPhase = ref<JobPhase>('running');\nconst jobWords = ref('');\n\n/** The views of this app that are whole pages, learned from the actions list\n *  (a `page` view is listed only through an action that opens it). */\nconst pageViews = ref<Set<string>>(new Set());\n\n/**\n * Go where a finished job sent the person - in THIS tab. The page's work is\n * done, and a tab opened by a job's end rather than by a click is a pop-up\n * the browser blocks.\n */\nfunction followJobOpen(req: SurfaceOpenRequest): boolean {\n  const target = openTargetFor(req, {\n    plugin: props.plugin,\n    base: props.mountBase,\n    placementOf: (id) => (pageViews.value.has(id) ? 'page' : undefined),\n  });\n  if (!target.href) return false;\n  try {\n    window.location.assign(target.href);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nfunction onJobSettled(op: PendingOp): void {\n  if (op.status === 'done') {\n    jobWords.value = op.message ?? '';\n    const go = jobOpenOf(op);\n    if (go && followJobOpen(go.open)) {\n      jobPhase.value = 'opening';\n      return;\n    }\n    jobPhase.value = 'done';\n    return;\n  }\n  jobWords.value = opFailure(op, t).text;\n  jobPhase.value = 'failed';\n}\n\n// The same follower the explorer's tray uses: one poll of `/api/files/ops`,\n// announcing only what was registered here.\nconst jobs = usePendingOps({} as ExplorerConfig, props.api, { onSettled: onJobSettled });\n\n/** Follow the job this page queued, where the client can ask the queue. */\nfunction followJob(op: Record<string, unknown>): void {\n  jobPhase.value = 'running';\n  jobWords.value = '';\n  if (!props.api.endpoints?.opsList) return;\n  jobs.register(op);\n}\n\nconst jobTitle = computed(() => {\n  switch (jobPhase.value) {\n    case 'done':\n      return t('plugin.page_view.finished_title');\n    case 'failed':\n      return t('plugin.page_view.failed_title');\n    case 'opening':\n      return t('plugin.page_view.opening_title');\n    default:\n      return t('plugin.page_view.queued_title');\n  }\n});\nconst jobText = computed(() => {\n  if (jobPhase.value === 'running') return t('plugin.page_view.queued_text');\n  if (jobPhase.value === 'done') return jobWords.value || t('plugin.page_view.finished_text');\n  return jobWords.value;\n});\n\nconst conv = usePluginSurface(\n  {\n    api: props.api,\n    plugin: props.plugin,\n    view: props.view,\n    path: () => props.path,\n    locale: () => props.locale,\n    errorText: () => t('plugin.view.error'),\n  },\n  {\n    // ⚠ `onOp` fires BEFORE `onDone` (usePluginSurface posts them in that\n    // order), so the queued state has to be set after both — otherwise\n    // `onDone` would overwrite it with \"finished\" and the person would never\n    // see that a job is running.\n    /**\n     * v3 §3.0 — \"go to this file, and start that screen on it\".\n     *\n     * ⚠ A real navigation, not a tab: this IS a whole page, and the person\n     * asked to be taken to a document. The address is the explorer deep link\n     * a notification already uses, so the placement question is answered\n     * where it is answerable — the explorer knows which of the plugin's\n     * views is a `page` and opens that one in its own tab.\n     */\n    onOpen: (req) => {\n      const target = openTargetFor(req, { plugin: props.plugin, base: props.mountBase });\n      if (!target.href) return;\n      try {\n        if (target.newTab) {\n          const win = window.open(target.href, '_blank');\n          if (win) win.opener = null;\n          else window.location.assign(target.href);\n        } else {\n          window.location.assign(target.href);\n        }\n      } catch {\n        /* a blocked navigation leaves the screen as it is */\n      }\n    },\n    onOp: (op) => {\n      emit('op', op);\n      state.value = 'queued';\n      followJob(op);\n    },\n    onDone: () => {\n      if (state.value !== 'queued') state.value = 'done';\n    },\n    onToast: (m) => (toast.value = m),\n  },\n);\n\nconst current = conv.current;\nconst title = computed(() => labelOf(current.value?.title, props.locale) || props.view);\n\n/**\n * The section being shown. It starts from the host's address and follows\n * it; a choice made here moves it at once (so the menu answers the click\n * even in a host that does not keep an address), then tells the host.\n */\nconst wanted = ref(props.section ?? '');\nconst sections = computed(() => current.value?.sections ?? []);\n/** Which entry is lit: what the plugin says it drew, else what was asked. */\nconst activeSection = computed(() => current.value?.section || wanted.value);\n\nfunction chooseSection(id: string): void {\n  if (!id || id === activeSection.value) return;\n  wanted.value = id;\n  emit('section', id);\n  void load();\n}\n\nwatch(\n  () => props.section,\n  (s) => {\n    const next = s ?? '';\n    // The host echoing the choice made above is not a new request.\n    if (next === wanted.value) return;\n    wanted.value = next;\n    void load();\n  },\n);\n\nasync function load(): Promise<void> {\n  // ⚠ A section change keeps the page standing (menu and all) while the\n  // next table is fetched: a switch that blanked the screen to \"Loading…\"\n  // made the menu itself flash away under the pointer that chose it.\n  if (!current.value) state.value = 'loading';\n  loadError.value = '';\n  try {\n    // The section only when there is one: a page that has no menu asks the\n    // same question it always asked.\n    const res = wanted.value\n      ? await props.api.pluginView(props.plugin, props.view, props.path, wanted.value)\n      : await props.api.pluginView(props.plugin, props.view, props.path);\n    if (!res?.surface) {\n      loadError.value = t('plugin.view.error');\n      state.value = 'error';\n      return;\n    }\n    conv.setSurface(res.surface);\n    state.value = 'surface';\n    // ⚠ Opened without a section, the page shows the plugin's first choice\n    // — and the address has to say which, or choosing that same entry from\n    // the menu changes nothing (measured in the e2e round: a click on the\n    // lit \"requested\" left the URL bare), and a copied link opens wherever\n    // the plugin's default happens to be that day.\n    const shown = res.surface.section ?? '';\n    if (!wanted.value && shown) {\n      wanted.value = shown;\n      emit('section', shown, { replace: true });\n    }\n  } catch (e) {\n    // ⚠ An app's own error text never met the catalogue — isolate it.\n    loadError.value = t.foreign?.(String((e as Error)?.message ?? '')) || t('plugin.view.error');\n    state.value = 'error';\n  }\n}\n\n/**\n * v4 — the app's own interface for this view, when it is one: found in the\n * actions list (a `home`/`viewer` row, or an action whose view it is).\n */\nconst uiRef = ref<PluginUIRef | null>(null);\nconst uiPlacement = ref<'page' | 'home'>('page');\nconst uiChecked = ref(false);\nconst uiFiles = computed(() =>\n  props.path ? [{ path: props.path, name: props.path.split('/').pop() || props.path }] : [],\n);\n\nasync function findUI(): Promise<void> {\n  try {\n    const list = await props.api.pluginActions();\n    // Which of this app's screens are whole pages: where a finished job's\n    // `open` lands on its own address rather than through the explorer.\n    pageViews.value = new Set(\n      (list.actions ?? [])\n        .filter((a) => a.plugin === props.plugin && a.view && isPagePlacement(a.view_placement))\n        .map((a) => a.view as string),\n    );\n    const row = list.views.find((v) => v.plugin === props.plugin && v.id === props.view && v.ui);\n    if (row?.ui) {\n      uiRef.value = row.ui;\n      uiPlacement.value = row.placement === 'home' ? 'home' : 'page';\n      return;\n    }\n    const act = list.actions.find((a) => a.plugin === props.plugin && a.view === props.view && a.ui);\n    if (act?.ui) uiRef.value = act.ui;\n  } catch {\n    /* no list: the conversation below says what the server says */\n  } finally {\n    uiChecked.value = true;\n  }\n}\n\nonMounted(async () => {\n  await findUI();\n  if (!uiRef.value) void load();\n});\ndefineExpose({ reload: load });\n/**\n * Is this step showing a DOCUMENT?\n *\n * ⚠⚠ v3 §3.2 — \"in `page` placement the node takes the whole viewport\n * minus the step header and footer, and fits the page to it\". The complaint\n * that started the round was a signature page you had to scroll in two\n * directions: the document was fitted to a 960px text column inside a page\n * that scrolled, so a portrait page ran off the bottom and the boxes were\n * found by hunting.\n *\n * So the FRAME changes shape when the surface carries one: the header and\n * the footer keep their size, the body becomes the remainder, and the node\n * fits the page into it (`SurfacePdfFields.fitWidth`). Only then — an\n * ordinary form step is still a readable column, and locking every step to\n * the viewport would turn a four-field form into a tall empty screen.\n */\n/**\n * ⚠⚠ ...and only the step that REALLY shows one. A `pdf-fields` node in\n * `define` mode draws no document at all — it is a column of cards, one per\n * box — so shaping the frame to the window for it locked a growing list\n * inside `height: 100vh; overflow: hidden` with no scroller of its own: the\n * fourth box and everything after it sat below the fold, unreachable (the\n * owner, 2026-09-23: \"kutucukları oluşturduğumuz sayfada overflow hidden\n * olduğu için aşağıda kalan ekstra kutucuklara kaydırarak gidemiyoruz\").\n * `place` and `edit` do carry the document and keep the window shape.\n */\nconst showsDocument = computed(() => {\n  let found = false;\n  walkNodes(conv.current.value?.nodes, (n) => {\n    if (n.type !== 'pdf-fields') return;\n    if ((n.props as { mode?: unknown } | undefined)?.mode === 'define') return;\n    found = true;\n  });\n  return found;\n});\n\n</script>\n\n<template>\n  <div\n    class=\"fe fe-apppage\"\n    :class=\"[\n      theme === 'dark' ? 'fe--theme-dark' : theme === 'light' ? 'fe--theme-light' : '',\n      { 'is-doc': showsDocument && !embedded, 'fe-apppage--embedded': embedded },\n    ]\"\n    data-testid=\"plugin-page\"\n  >\n    <header v-if=\"!embedded\" class=\"fe-apppage__bar\">\n      <h1 class=\"fe-apppage__title\" data-testid=\"plugin-page-title\">{{ title }}</h1>\n      <p v-if=\"path\" class=\"fe-apppage__path\" :title=\"path\">{{ path }}</p>\n      <a v-if=\"backHref\" class=\"fe-btn fe-apppage__back\" :href=\"backHref\" data-testid=\"plugin-page-back\">\n        {{ t('plugin.page_view.back') }}\n      </a>\n    </header>\n\n    <component :is=\"bodyTag\" v-if=\"uiRef\" class=\"fe-apppage__body fe-apppage__body--ui\">\n      <AppFrame\n        :api=\"api\"\n        :app=\"plugin\"\n        :version=\"uiRef.version\"\n        :view=\"view\"\n        :placement=\"uiPlacement\"\n        :ui=\"uiRef\"\n        :files=\"uiFiles\"\n        :storages=\"storages\"\n        :start-at=\"startAt\"\n        :locale=\"locale\"\n        :theme=\"theme\"\n        :title=\"title\"\n        @toast=\"(m) => (toast = m.text)\"\n        @op=\"(op) => emit('op', op)\"\n      />\n      <p v-if=\"toast\" class=\"fe-surface__text\" role=\"status\">{{ toast }}</p>\n    </component>\n    <component :is=\"bodyTag\" v-else-if=\"!uiChecked\" class=\"fe-apppage__body\">\n      <p class=\"fe-surface__text fe-surface__text--muted\" data-testid=\"plugin-page-loading\">\n        {{ t('plugin.view.loading') }}\n      </p>\n    </component>\n    <component :is=\"bodyTag\" v-else class=\"fe-apppage__body\">\n      <SurfaceSections\n        v-if=\"state === 'surface' && sections.length\"\n        :sections=\"sections\"\n        :active=\"activeSection\"\n        :locale=\"locale\"\n        :label=\"title\"\n        :disabled=\"conv.busy.value\"\n        @select=\"chooseSection\"\n      />\n      <p v-if=\"state === 'loading'\" class=\"fe-surface__text fe-surface__text--muted\" data-testid=\"plugin-page-loading\">\n        {{ t('plugin.view.loading') }}\n      </p>\n\n      <SurfaceConversation\n        v-else-if=\"state === 'surface'\"\n        :conv=\"conv\"\n        :locale=\"locale\"\n        :theme=\"theme\"\n        :api=\"api\"\n        :plugin=\"plugin\"\n        :storages=\"storages\"\n        :start-at=\"startAt\"\n        :toast=\"toast\"\n        :layout=\"embedded ? 'inline' : 'page'\"\n      />\n\n      <div\n        v-else-if=\"state === 'queued'\"\n        class=\"fe-apppage__state\"\n        data-testid=\"plugin-page-queued\"\n        :data-job=\"jobPhase\"\n      >\n        <h2 class=\"fe-apppage__state-title\" data-testid=\"plugin-page-job-title\">{{ jobTitle }}</h2>\n        <p\n          :class=\"jobPhase === 'failed' ? 'fe-surface__error' : 'fe-surface__text'\"\n          :role=\"jobPhase === 'failed' ? 'alert' : 'status'\"\n          data-testid=\"plugin-page-job-text\"\n        >\n          {{ jobText }}\n        </p>\n        <div class=\"fe-apppage__state-actions\">\n          <a v-if=\"opsHref\" class=\"fe-btn fe-btn--primary\" :href=\"opsHref\" data-testid=\"plugin-page-ops\">\n            {{ t('plugin.page_view.open_ops') }}\n          </a>\n          <a v-if=\"backHref\" class=\"fe-btn\" :href=\"backHref\">{{ t('plugin.page_view.back') }}</a>\n        </div>\n      </div>\n\n      <div v-else-if=\"state === 'done'\" class=\"fe-apppage__state\" data-testid=\"plugin-page-done\">\n        <h2 class=\"fe-apppage__state-title\">{{ t('plugin.page_view.done_title') }}</h2>\n        <p class=\"fe-surface__text\">{{ t('plugin.page_view.done_text') }}</p>\n        <div class=\"fe-apppage__state-actions\">\n          <a v-if=\"backHref\" class=\"fe-btn fe-btn--primary\" :href=\"backHref\">{{ t('plugin.page_view.back') }}</a>\n        </div>\n      </div>\n\n      <div v-else class=\"fe-apppage__state\" data-testid=\"plugin-page-error\">\n        <h2 class=\"fe-apppage__state-title\">{{ t('plugin.page_view.error_title') }}</h2>\n        <p v-if=\"loadError\" class=\"fe-surface__error\">{{ loadError }}</p>\n        <div class=\"fe-apppage__state-actions\">\n          <button type=\"button\" class=\"fe-btn\" @click=\"load()\">{{ t('plugin.page_view.retry') }}</button>\n          <a v-if=\"backHref\" class=\"fe-btn\" :href=\"backHref\">{{ t('plugin.page_view.back') }}</a>\n        </div>\n      </div>\n    </component>\n\n    <footer v-if=\"state === 'surface' && conv.footer.value.length\" class=\"fe-apppage__foot\">\n      <SurfaceFooterButtons :conv=\"conv\" :locale=\"locale\" testid-prefix=\"plugin-page\" />\n    </footer>\n  </div>\n</template>\n","/**\n * archiveFormatLabel — how an archive format is written wherever a person\n * reads it: the create dialog, the admin Archives page, its provider cards.\n *\n * Upper case (ZIP, TAR.GZ, RAR), except 7z, which its own project writes in\n * lower case. One rule in one place: the dialog wrote \"7z\" while the admin\n * page wrote \"7Z\" for the same format (measured, 0.44.0 integration of #48).\n */\nexport function archiveFormatLabel(format: string): string {\n  const f = format.trim().toLowerCase();\n  return f === '7z' ? '7z' : f.toUpperCase();\n}\n","<script setup lang=\"ts\">\n/**\n * ConnectionNotice — the one line a page shows while the server cannot be\n * reached, in place of a toast per failed request (lib/connection).\n *\n * ⚠⚠ A STRIP, not a toast, and that is the point rather than a preference. A\n * toast is an event (\"this just happened\") with a timer on it; being offline\n * is a STATE that lasts. Said as a toast it has to be re-armed to stay true,\n * which is how one dropped connection became a corner full of copies — and\n * when the connection came back the person was still left with a stack of\n * stale ones to dismiss. A strip is drawn while the state holds and is gone\n * the moment it does not, with nothing to dismiss.\n *\n * It appears at the TOP of the window, not in the toast corner: it must not\n * cover, or be covered by, the individual message a failed upload or rename\n * still raises down there.\n *\n * ⚠ No string of its own. It says `err.network` — the very sentence the toast\n * said — so a language pack that already translates the product translates\n * this too, and the release's packs stay at 100%.\n *\n * ⚠ The FOLDING is the fix and it lives in lib/connection, which every\n * request layer feeds whether or not this component is on screen. Drawing the\n * strip is a separate, opt-in decision: a host page that embeds an explorer\n * may not want a page-wide bar over its own chrome, and it keeps the quiet\n * corner either way.\n *\n * ⚠⚠ Its rules are in styles/base.css (`.fe-connlost`), NOT in a `<style>`\n * block here. A single-file component's styles reach only a bundle that\n * imports it, and the web-component distribution does not import this one —\n * so the two shipped stylesheets drifted the moment they lived here\n * (web/tests/deploy/packageLook.test.ts caught it, 2026-09-24).\n */\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { connectionDown } from '../lib/connection';\n\nconst props = defineProps<{\n  /** The reader's language. Defaults to English, as every core surface does. */\n  locale?: LocaleCode | string;\n}>();\n\nconst { t } = useLocale(() => props.locale ?? 'en');\n</script>\n\n<template>\n  <!-- `role=\"status\"` + `aria-live=\"polite\"`: announced once when it appears,\n       and never re-announced, because the element is never replaced. -->\n  <div\n    v-if=\"connectionDown\"\n    class=\"fe-connlost\"\n    role=\"status\"\n    aria-live=\"polite\"\n    data-testid=\"connection-notice\"\n  >\n    <span class=\"fe-connlost__dot\" aria-hidden=\"true\"></span>\n    <span class=\"fe-connlost__text\">{{ t('err.network') }}</span>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * ShortcutSettings — wiring:c2 keyboard-shortcut customization modal.\n *\n * Category-grouped rows from the shortcut registry; each row shows the\n * action label + current combo badge(s) + \"Change\" (press-to-capture:\n * the next key combination is recorded, Esc cancels) + a per-row\n * \"reset to default\" and a header \"reset all\".\n *\n * Conflicts: assigning a combo that another action already uses turns\n * the row into a red warning with two choices — unbind the old action\n * and take the combo, or cancel. Combos reserved by fixed shortcuts\n * (Backspace, Esc) can never be taken.\n *\n * While the modal is open a window-level CAPTURE listener swallows\n * keydowns (except Esc/Tab) so experimenting with keys can't trigger\n * explorer actions behind the modal; native button activation (Enter/\n * Space on a focused button) is a default action and still works.\n */\nimport { computed, onBeforeUnmount, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport {\n  comboFromEvent,\n  effectiveCombo,\n  findShortcutConflict,\n  isReservedCombo,\n  resetAllShortcuts,\n  resetShortcut,\n  setShortcutOverride,\n  useShortcutList,\n  SHORTCUT_ACTIONS,\n  type ShortcutView,\n} from '../composables/useKeyboardShortcuts';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  theme?: 'light' | 'dark' | 'auto';\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst list = useShortcutList();\n\nconst groups = computed(() => {\n  const order: string[] = [];\n  const map = new Map<string, ShortcutView[]>();\n  for (const s of list.value) {\n    if (!map.has(s.groupKey)) {\n      map.set(s.groupKey, []);\n      order.push(s.groupKey);\n    }\n    map.get(s.groupKey)!.push(s);\n  }\n  return order.map((key) => ({ key, items: map.get(key)! }));\n});\n\nconst anyOverridden = computed(() => list.value.some((s) => s.overridden));\n\n// --- capture / conflict state ---\n\nconst capturingId = ref<string | null>(null);\nconst conflict = ref<{ id: string; combo: string; conflictId: string; fixed: boolean } | null>(null);\n/* tus:t1 — the user pressed something the browser keeps for itself. */\nconst reserved = ref<{ id: string; combo: string } | null>(null);\n\nfunction labelOf(id: string): string {\n  const def = SHORTCUT_ACTIONS.find((a) => a.id === id);\n  return def ? t(def.labelKey) : id;\n}\n\nfunction beginCapture(id: string) {\n  conflict.value = null;\n  reserved.value = null;\n  capturingId.value = id;\n}\n\nfunction cancelCapture() {\n  capturingId.value = null;\n}\n\nfunction attemptAssign(id: string, combo: string) {\n  capturingId.value = null;\n  if (combo === effectiveCombo(id)) return; // unchanged\n  /* tus:t1 — a combo the browser takes before the page sees it would be a key\n   * that does nothing where the user is standing. Refuse it and say why,\n   * rather than storing a binding that never fires. */\n  if (isReservedCombo(combo)) {\n    reserved.value = { id, combo };\n    return;\n  }\n  const clash = findShortcutConflict(combo, id);\n  if (clash) {\n    conflict.value = { id, combo, conflictId: clash.id, fixed: clash.fixed };\n    return;\n  }\n  setShortcutOverride(id, combo);\n}\n\nfunction confirmConflictTake() {\n  const c = conflict.value;\n  if (!c || c.fixed) return;\n  setShortcutOverride(c.conflictId, ''); // unbind the old owner\n  setShortcutOverride(c.id, c.combo);\n  conflict.value = null;\n}\n\nfunction dismissConflict() {\n  conflict.value = null;\n}\n\nfunction dismissReserved() {\n  reserved.value = null;\n}\n\nfunction onReset(id: string) {\n  conflict.value = null;\n  reserved.value = null;\n  resetShortcut(id);\n}\n\nfunction onResetAll() {\n  conflict.value = null;\n  reserved.value = null;\n  capturingId.value = null;\n  resetAllShortcuts();\n}\n\n// --- window capture listener (only while open) ---\n\nfunction onWindowKeydown(e: KeyboardEvent) {\n  if (capturingId.value) {\n    e.preventDefault();\n    e.stopPropagation();\n    if (e.key === 'Escape') {\n      cancelCapture();\n      return;\n    }\n    const combo = comboFromEvent(e);\n    if (!combo) return; // bare modifier — keep listening\n    attemptAssign(capturingId.value, combo);\n    return;\n  }\n  // Modal open but idle: let Esc (close) and Tab (focus nav) through,\n  // swallow everything else so explorer shortcuts can't fire behind us.\n  if (e.key === 'Escape' || e.key === 'Tab') return;\n  e.stopPropagation();\n}\n\nwatch(\n  () => props.open,\n  (open) => {\n    if (open) {\n      window.addEventListener('keydown', onWindowKeydown, true);\n    } else {\n      window.removeEventListener('keydown', onWindowKeydown, true);\n      capturingId.value = null;\n      conflict.value = null;\n      reserved.value = null;\n    }\n  },\n);\n\nonBeforeUnmount(() => window.removeEventListener('keydown', onWindowKeydown, true));\n\nfunction onClose() {\n  if (capturingId.value) {\n    cancelCapture();\n    return;\n  }\n  emit('close');\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('shortcuts.settings.title')\" size=\"lg\" :theme=\"theme\" @close=\"onClose\">\n    <div class=\"fe-shortset\">\n      <div class=\"fe-shortset__topbar\">\n        <p class=\"fe-shortset__hint\">{{ t('shortcuts.settings.hint') }}</p>\n        <button\n          type=\"button\"\n          class=\"fe-btn fe-shortset__reset-all\"\n          :disabled=\"!anyOverridden\"\n          @click=\"onResetAll\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('restore')\"></span>\n          {{ t('shortcuts.settings.reset_all') }}\n        </button>\n      </div>\n\n      <section v-for=\"g in groups\" :key=\"g.key\" class=\"fe-shortset__group\">\n        <h3 class=\"fe-shortcuts__heading\">{{ t(g.key) }}</h3>\n        <div\n          v-for=\"s in g.items\"\n          :key=\"s.id\"\n          class=\"fe-shortset__item\"\n          :class=\"{\n            'is-capturing': capturingId === s.id,\n            'is-conflict': conflict?.id === s.id,\n          }\"\n        >\n          <div class=\"fe-shortset__row\">\n            <span class=\"fe-shortset__label\">\n              {{ t(s.labelKey) }}\n              <span v-if=\"s.overridden\" class=\"fe-shortcuts__custom\" :title=\"t('shortcuts.settings.customized')\">●</span>\n            </span>\n            <span class=\"fe-shortset__keys\">\n              <span v-if=\"capturingId === s.id\" class=\"fe-shortset__capture\" role=\"status\">\n                {{ t('shortcuts.settings.capture') }}\n              </span>\n              <template v-else>\n                <span v-if=\"s.keys.length === 0\" class=\"fe-shortcuts__unbound\">\n                  {{ t('shortcuts.settings.unbound') }}\n                </span>\n                <template v-for=\"(combo, i) in s.keys\" v-else :key=\"combo\">\n                  <kbd class=\"fe-kbd\">{{ combo }}</kbd>\n                  <!-- tus:t1 — this combo never reaches a browser tab. Say so\n                       on the row rather than letting the user discover it by\n                       pressing the key and watching nothing happen. -->\n                  <span\n                    v-if=\"isReservedCombo(combo)\"\n                    class=\"fe-shortset__reserved\"\n                    :title=\"t('shortcuts.settings.reserved_title')\"\n                  >{{ t('shortcuts.settings.reserved_badge') }}</span>\n                  <span v-if=\"i < s.keys.length - 1\" class=\"fe-shortcuts__or\" aria-hidden=\"true\">/</span>\n                </template>\n              </template>\n            </span>\n            <span class=\"fe-shortset__actions\">\n              <template v-if=\"s.customizable\">\n                <button\n                  v-if=\"capturingId !== s.id\"\n                  type=\"button\"\n                  class=\"fe-btn fe-shortset__btn\"\n                  @click=\"beginCapture(s.id)\"\n                >\n                  {{ t('shortcuts.settings.change') }}\n                </button>\n                <button\n                  v-else\n                  type=\"button\"\n                  class=\"fe-btn fe-shortset__btn\"\n                  @click=\"cancelCapture\"\n                >\n                  {{ t('shortcuts.settings.conflict_cancel') }}\n                </button>\n                <button\n                  v-if=\"s.overridden\"\n                  type=\"button\"\n                  class=\"fe-btn fe-btn--icon-only fe-shortset__btn\"\n                  :title=\"t('shortcuts.settings.reset')\"\n                  :aria-label=\"t('shortcuts.settings.reset')\"\n                  @click=\"onReset(s.id)\"\n                >\n                  <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n                  <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('restore')\"></span>\n                </button>\n              </template>\n              <span v-else class=\"fe-shortset__fixed\">{{ t('shortcuts.settings.fixed') }}</span>\n            </span>\n          </div>\n          <div v-if=\"conflict && conflict.id === s.id\" class=\"fe-shortset__conflict\" role=\"alert\">\n            <span class=\"fe-shortset__conflict-msg\">\n              <kbd class=\"fe-kbd\">{{ conflict.combo }}</kbd>\n              {{\n                conflict.fixed\n                  ? t('shortcuts.settings.conflict_fixed', { name: labelOf(conflict.conflictId) })\n                  : t('shortcuts.settings.conflict', { name: labelOf(conflict.conflictId) })\n              }}\n            </span>\n            <span class=\"fe-shortset__conflict-actions\">\n              <button\n                v-if=\"!conflict.fixed\"\n                type=\"button\"\n                class=\"fe-btn fe-btn--danger fe-shortset__btn\"\n                @click=\"confirmConflictTake\"\n              >\n                {{ t('shortcuts.settings.conflict_take') }}\n              </button>\n              <button type=\"button\" class=\"fe-btn fe-shortset__btn\" @click=\"dismissConflict\">\n                {{ t('shortcuts.settings.conflict_cancel') }}\n              </button>\n            </span>\n          </div>\n          <div v-if=\"reserved && reserved.id === s.id\" class=\"fe-shortset__conflict\" role=\"alert\">\n            <span class=\"fe-shortset__conflict-msg\">\n              <kbd class=\"fe-kbd\">{{ reserved.combo }}</kbd>\n              {{ t('shortcuts.settings.reserved') }}\n            </span>\n            <span class=\"fe-shortset__conflict-actions\">\n              <button type=\"button\" class=\"fe-btn fe-shortset__btn\" @click=\"dismissReserved\">\n                {{ t('shortcuts.settings.conflict_cancel') }}\n              </button>\n            </span>\n          </div>\n        </div>\n      </section>\n    </div>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" @click=\"onClose\">{{ t('viewer.close') }}</button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * QuickLook — wiring:c2 Space quick-look overlay.\n *\n * A thin behavioural wrapper over the existing PreviewModal (view\n * mode), so every viewer the modal knows (image/video/pdf/office/code/\n * 3D/archive/…) works in quick-look for free. What this layer adds:\n *\n *   - the quick-look key closes the peek again (Space by default — macOS\n *     Quick Look convention), and the open key promotes it into the full\n *     open flow (Enter by default, emit 'open-full'). Both come from the\n *     shortcut registry rather than from a comparison against the default\n *     key, so a remap reaches the overlay too\n *   - ← ↑ / → ↓ ask the host to move the selection; the host keeps the\n *     `file` prop in sync so the preview follows the selection. These are\n *     the peek's own arrows, not registry actions\n *   - a small floating hint bar naming those keys, read from the registry\n *\n * Keys are handled in window CAPTURE phase with stopPropagation so the\n * global shortcut registry never double-handles them; events that\n * originate in a form control inside a viewer (e.g. the CSV filter\n * input) are left alone. Esc is untouched — PreviewModal's own Modal\n * already closes on it.\n */\nimport { computed, onBeforeUnmount, watch } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { inlineKeyStep } from '../lib/direction';\nimport { eventMatchesShortcut, shortcutHint } from '../composables/useKeyboardShortcuts';\nimport PreviewModal from '../modals/PreviewModal.vue';\nimport { isTypingTarget } from '../lib/typingTarget';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  file: FileNode | null;\n  previewUrl: (path: string) => string;\n  downloadUrl: (path: string) => string;\n  onlyOfficeBase?: string | null;\n  onlyOfficeConfigEndpoint?: string | null;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  drawioUrl?: string | null;\n  pdfWorkerUrl?: string | null;\n  viewerBaseUrl?: string | null;\n  theme?: 'light' | 'dark' | 'auto';\n  /* === gorunum:v1-viewer — passed straight through to PreviewModal ===\n   * The peek knows nothing about the listing either; the host that answers\n   * `nav` is the one that can say \"1 of 9\". */\n  /** 1-based position of `file` in the host's file list. */\n  index?: number;\n  /** How many files that list holds. */\n  total?: number;\n  /** API origin for the star toggle. */\n  apiBase?: string;\n  /** Draw the share action (the host must listen to `@share`). */\n  shareEnabled?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  /** Arrow navigation: -1 = previous file, +1 = next file. Now raised by the\n   *  overlay's edge chevrons as well as by the arrow keys — ONE contract, two\n   *  triggers, because a second navigation path would drift from this one. */\n  (e: 'nav', delta: number): void;\n  /** Enter — close the peek and open the file for real. */\n  (e: 'open-full'): void;\n  /** The viewer's share action (only reachable when `shareEnabled`). */\n  (e: 'share'): void;\n  /** The viewer's star toggle succeeded. */\n  (e: 'starred', value: boolean): void;\n}>();\n\n// ⚠ RTL: `dir` on the teleported hint, and ← is \"next\" in a right-to-left\n// interface (the next file's chevron is on the left there).\nconst { t, dir } = useLocale(() => props.locale);\n\n/**\n * The peek's own arrows. These are NOT registry actions — they only\n * mean anything while the overlay is up — so they are declared once\n * here and the hint bar prints this same constant. Two copies of a key\n * name is how a legend starts lying about the key it names.\n */\nconst NAV_KEYS = ['↑', '↓'] as const;\n\nfunction onKeydown(e: KeyboardEvent) {\n  if (!props.open) return;\n  // The code editor is typing too, not only form controls (lib/typingTarget).\n  if (isTypingTarget(e.target)) return;\n\n  // ⚠ The registry first, and BEFORE the modifier bail-out: the user may\n  // have remapped quick-look onto a combo that carries Ctrl or Alt. The\n  // old version compared `e.key` to a hardcoded ' ' / 'Enter', so after a\n  // remap the peek opened on the new key and still closed on the old one\n  // — and the hint bar named the old one.\n  if (eventMatchesShortcut(e, 'quicklook')) {\n    e.preventDefault();\n    e.stopPropagation();\n    emit('close');\n    return;\n  }\n  if (eventMatchesShortcut(e, 'open')) {\n    e.preventDefault();\n    e.stopPropagation();\n    emit('open-full');\n    return;\n  }\n\n  if (e.ctrlKey || e.metaKey || e.altKey) return;\n  const step = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : inlineKeyStep(e.key, dir.value);\n  if (step) {\n    e.preventDefault();\n    e.stopPropagation();\n    emit('nav', step);\n  }\n}\n\n/**\n * The legend, read from the live registry. A segment whose action the\n * user has unbound disappears rather than printing an empty key cap.\n */\nconst hintSegments = computed(() => {\n  const segs: Array<{ id: string; keys: string[]; label: string }> = [];\n  const close = shortcutHint('quicklook');\n  if (close) segs.push({ id: 'quicklook', keys: [close], label: t('quicklook.hint_close') });\n  segs.push({ id: 'nav', keys: [...NAV_KEYS], label: t('quicklook.hint_nav') });\n  const open = shortcutHint('open');\n  if (open) segs.push({ id: 'open', keys: [open], label: t('quicklook.hint_open') });\n  return segs;\n});\n\nwatch(\n  () => props.open,\n  (open) => {\n    if (open) window.addEventListener('keydown', onKeydown, true);\n    else window.removeEventListener('keydown', onKeydown, true);\n  },\n  { immediate: true },\n);\n\nonBeforeUnmount(() => window.removeEventListener('keydown', onKeydown, true));\n</script>\n\n<template>\n  <PreviewModal\n    class=\"fe-quicklook\"\n    :open=\"open\"\n    :locale=\"locale\"\n    :file=\"file\"\n    :theme=\"theme\"\n    :preview-url=\"previewUrl\"\n    :download-url=\"downloadUrl\"\n    :only-office-base=\"onlyOfficeBase\"\n    :only-office-config-endpoint=\"onlyOfficeConfigEndpoint\"\n    open-mode=\"view\"\n    :auth-headers=\"authHeaders\"\n    :auth-credentials=\"authCredentials\"\n    :drawio-url=\"drawioUrl\"\n    :pdf-worker-url=\"pdfWorkerUrl\"\n    :viewer-base-url=\"viewerBaseUrl\"\n    :index=\"index\"\n    :total=\"total\"\n    :api-base=\"apiBase\"\n    :share-enabled=\"shareEnabled\"\n    :nav-enabled=\"true\"\n    @close=\"emit('close')\"\n    @nav=\"(d: number) => emit('nav', d)\"\n    @share=\"emit('share')\"\n    @starred=\"(v: boolean) => emit('starred', v)\"\n  />\n  <!--\n    Teleported under <body> for the same reason as ContextMenu and\n    OnboardingTour: the hint carries the `fe` root class (that is how it\n    reaches the `--fe-*` theme variables), so while it sits inside the\n    explorer tree ANY host rule that reaches `.fe` by descendant also\n    reaches the hint — and a host selector is always more specific than\n    our own single class. web/src/views/Explore.vue sizes the embedded\n    explorer with `.explore-host[data-v-…] .fe { height: 100% }`; that\n    stretched the hint pill to the full viewport height (issue #22).\n    Teleporting takes it out of every host container, so only the\n    package's own rules can reach it.\n  -->\n  <Teleport to=\"body\">\n    <transition name=\"fe-toast\">\n      <div\n        v-if=\"open\"\n        class=\"fe fe-ql-hint\"\n        :dir=\"dir\"\n        :class=\"{\n          'fe--theme-light': theme === 'light',\n          'fe--theme-dark': theme === 'dark',\n        }\"\n        aria-hidden=\"true\"\n      >\n        <template v-for=\"(seg, i) in hintSegments\" :key=\"seg.id\">\n          <span v-if=\"i > 0\" class=\"fe-ql-hint__sep\">·</span>\n          <span class=\"fe-ql-hint__seg\">\n            <kbd v-for=\"k in seg.keys\" :key=\"k\" class=\"fe-kbd\">{{ k }}</kbd>\n            {{ seg.label }}\n          </span>\n        </template>\n      </div>\n    </transition>\n  </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * E2eLevelPicker — choose a folder's encryption level (wiring:e2).\n *\n * One picker for every place a level is chosen: creating an encrypted\n * folder, and encrypting a folder that already exists. The list comes from\n * lib/e2ecrypto `choosableLevels`. Level 1, contents only, is the default: it\n * keeps WebDAV, the command line and desktop sync working with the names.\n *\n * wiring:e2 vault — level 3, the vault, is drawn only when `vault` is set:\n * the server has its API (`capabilities.e2e_vault`) AND the folder is a new\n * one (an existing folder is never converted to a vault). A choice that does\n * not work is not offered. Its card says what it costs before anyone picks\n * it: one writer at a time, and nothing but filex reads it.\n */\nimport { computed } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { choosableLevels, type ChoosableLevel } from '../lib/e2ecrypto';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = defineProps<{\n  locale: LocaleCode;\n  modelValue: ChoosableLevel;\n  disabled?: boolean;\n  /** Offer the vault (level 3): a new folder on a server that has it. */\n  vault?: boolean;\n}>();\nconst emit = defineEmits<{ (e: 'update:modelValue', v: ChoosableLevel): void }>();\nconst { t } = useLocale(() => props.locale);\n\nconst levels = computed(() => choosableLevels({ vault: props.vault === true }));\n\nconst LABEL: Record<ChoosableLevel, string> = {\n  content: 'e2e.level.content',\n  names: 'e2e.level.names',\n  vault: 'e2e.level.vault',\n};\nconst HINT: Record<ChoosableLevel, string> = {\n  content: 'e2e.level.content_hint',\n  names: 'e2e.level.names_hint',\n  vault: 'e2e.level.vault_hint',\n};\n</script>\n\n<template>\n  <fieldset class=\"fe-e2e-levels\" data-testid=\"e2e-level-picker\" :disabled=\"disabled\">\n    <legend class=\"fe-field__label\">{{ t('e2e.settings.level') }}</legend>\n    <label\n      v-for=\"(lv, i) in levels\"\n      :key=\"lv\"\n      class=\"fe-e2e-level\"\n      :class=\"{ 'fe-e2e-level--on': modelValue === lv }\"\n    >\n      <input\n        type=\"radio\"\n        name=\"fe-e2e-level\"\n        :value=\"lv\"\n        :checked=\"modelValue === lv\"\n        :data-testid=\"`e2e-level-${lv}`\"\n        @change=\"emit('update:modelValue', lv)\"\n      />\n      <span class=\"fe-e2e-level__text\">\n        <span class=\"fe-e2e-level__name\">{{ i + 1 }} · {{ t(LABEL[lv]) }}</span>\n        <span class=\"fe-e2e-level__hint\">{{ t(HINT[lv]) }}</span>\n        <!-- wiring:e2 vault — what the vault costs, on its card. -->\n        <span v-if=\"lv === 'vault'\" class=\"fe-e2e-level__cost\" data-testid=\"e2e-level-vault-cost\">\n          {{ t('e2e.level.vault_cost') }}\n        </span>\n      </span>\n    </label>\n  </fieldset>\n</template>\n","<script setup lang=\"ts\">\n/**\n * EncryptedFolderModal — create an E2E-encrypted folder (wiring:e2), or\n * encrypt one that already exists (`existing`: its name; wiring:e2 convert).\n *\n * One dialog for both, because they ask the same things — a password, the\n * level, the acknowledgement — and the second only adds what encrypting in\n * place cannot undo: the plaintext copies filex already holds, and whether to\n * remove them (docs/E2E-ENCRYPTION.md → \"Encrypting a folder you already\n * have\").\n *\n * Collects folder name + password ×2 and an explicit \"I understand there\n * is NO recovery\" acknowledgement. The parent (FileExplorer) performs the\n * actual newfolder + marker-upload dance; this modal never touches the\n * network and never stores the password anywhere.\n *\n * Crypto scheme + threat model: docs/E2E-ENCRYPTION.md.\n */\nimport { computed, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { E2E_DEFAULT_LEVEL, E2E_MIN_PASSWORD_LEN, type ChoosableLevel } from '../lib/e2ecrypto';\nimport { VAULT_DEFAULT_PACK_LOG2, VAULT_LARGE_PACK_LOG2 } from '../lib/e2evault/consts';\nimport Modal from '../modals/Modal.vue';\nimport E2eLevelPicker from './E2eLevelPicker.vue';\nimport ChoiceButtons, { type ChoiceOption } from './ChoiceButtons.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /** True while the parent is creating the folder + uploading the marker. */\n  busy?: boolean;\n  /** Short id of this installation's E2E escrow key, when one is configured.\n   *  Shown BEFORE the folder is created: escrow means the operator can open\n   *  it without the password, and that is not a detail to discover later. */\n  escrowKid?: string | null;\n  /** Encrypt this existing folder in place (its name as people read it). */\n  existing?: string | null;\n  /** wiring:e2 vault — the server has the vault (`capabilities.e2e_vault`).\n   *  Offered for a NEW folder only: an existing one is never converted. */\n  vaultAvailable?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (\n    e: 'submit',\n    payload: {\n      name: string;\n      password: string;\n      level: ChoosableLevel;\n      /** `existing` only: remove the versions / trash entries filex holds. */\n      cleanup?: { versions: boolean; trash: boolean };\n      /** wiring:e2 vault — level 'vault' only: the pack size, log2 (22 or 24). */\n      packLog2?: number;\n    },\n  ): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst name = ref('');\nconst password = ref('');\nconst password2 = ref('');\nconst ack = ref(false);\n/* wiring:e2 — the folder's encryption level. Level 1 (contents only) is the\n * default: names stay readable to WebDAV, the CLI and desktop sync, and every\n * filex since 0.31 opens the folder. Level 2 also encrypts the names; each\n * option says what it costs before anyone chooses (E2eLevelPicker). */\nconst level = ref<ChoosableLevel>(E2E_DEFAULT_LEVEL);\nconst err = ref<string | null>(null);\n/* wiring:e2 convert — on by default: they are plaintext copies of what is\n * being encrypted. Off is a choice, and it is said what it leaves behind. */\nconst dropVersions = ref(true);\nconst dropTrash = ref(true);\n/* wiring:e2 vault — the pack size, chosen when the vault is made and never\n * again: 4 MiB (the default) or 16 MiB. Every pack is that large on the\n * server, filled up with random bytes, so the choice is what the smallest\n * change costs against how many files the server sees. */\nconst packLog2 = ref<number>(VAULT_DEFAULT_PACK_LOG2);\nconst offerVault = computed(() => props.vaultAvailable === true && !props.existing);\nconst packOptions = computed<ChoiceOption[]>(() => [\n  { value: String(VAULT_DEFAULT_PACK_LOG2), label: t('e2e.vault.pack_4'), help: t('e2e.vault.pack_4_help') },\n  { value: String(VAULT_LARGE_PACK_LOG2), label: t('e2e.vault.pack_16'), help: t('e2e.vault.pack_16_help') },\n]);\n\nwatch(\n  () => props.open,\n  (v) => {\n    if (v) {\n      name.value = '';\n      password.value = '';\n      password2.value = '';\n      ack.value = false;\n      level.value = E2E_DEFAULT_LEVEL;\n      packLog2.value = VAULT_DEFAULT_PACK_LOG2;\n      dropVersions.value = true;\n      dropTrash.value = true;\n      err.value = null;\n    }\n  },\n);\n\nfunction submit() {\n  if (props.busy) return;\n  const clean = props.existing ? props.existing : name.value.trim();\n  if (!clean) {\n    err.value = t('modal.newfolder.placeholder');\n    return;\n  }\n  if (!props.existing && (/[\\\\/]/.test(clean) || clean === '.' || clean === '..' || clean.startsWith('.filex'))) {\n    err.value = t('e2e.create.bad_name');\n    return;\n  }\n  if (password.value.length < E2E_MIN_PASSWORD_LEN) {\n    err.value = t('e2e.create.pw_short');\n    return;\n  }\n  if (password.value !== password2.value) {\n    err.value = t('e2e.create.pw_mismatch');\n    return;\n  }\n  if (!ack.value) {\n    err.value = t('e2e.create.ack_required');\n    return;\n  }\n  err.value = null;\n  // An existing folder is never made a vault, whatever the picker held.\n  const chosen: ChoosableLevel = props.existing && level.value === 'vault' ? E2E_DEFAULT_LEVEL : level.value;\n  emit('submit', {\n    name: clean,\n    password: password.value,\n    level: chosen,\n    ...(props.existing ? { cleanup: { versions: dropVersions.value, trash: dropTrash.value } } : {}),\n    ...(chosen === 'vault' ? { packLog2: packLog2.value } : {}),\n  });\n}\n</script>\n\n<template>\n  <Modal\n    :open=\"open\"\n    :title=\"existing ? t('e2e.convert.title', { name: existing }) : t('e2e.create.title')\"\n    size=\"sm\"\n    @close=\"emit('close')\"\n  >\n    <!-- ⚠ Every field carries a visible <label>. They had placeholders only\n         (v0.41.0 screenshot pass): the name of a field vanished the moment\n         anything was typed into it, and on the two password fields — where\n         what is typed is dots — nothing on screen said which box was which.\n         A placeholder is a hint, not a name; the length rule stays one. -->\n    <form class=\"fe-e2e-form\" @submit.prevent=\"submit\">\n      <label v-if=\"!existing\" class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('modal.newfolder.placeholder') }}</span>\n        <input v-model=\"name\" type=\"text\" class=\"fe-input\" autocomplete=\"off\" :disabled=\"busy\" />\n      </label>\n      <p v-else class=\"fe-e2e-names__hint\" data-testid=\"e2e-convert-lead\">{{ t('e2e.convert.lead') }}</p>\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('e2e.create.pw_label') }}</span>\n        <input\n          v-model=\"password\"\n          type=\"password\"\n          class=\"fe-input\"\n          :placeholder=\"t('e2e.create.pw_placeholder')\"\n          autocomplete=\"new-password\"\n          :disabled=\"busy\"\n        />\n      </label>\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('e2e.create.pw2_label') }}</span>\n        <input\n          v-model=\"password2\"\n          type=\"password\"\n          class=\"fe-input\"\n          autocomplete=\"new-password\"\n          :disabled=\"busy\"\n          @keydown.enter.prevent=\"submit\"\n        />\n      </label>\n      <!-- wiring:e2 — the level: what the server will and will not see. -->\n      <div class=\"fe-e2e-names\" data-testid=\"e2e-create-names\">\n        <E2eLevelPicker v-model=\"level\" :locale=\"locale\" :disabled=\"busy\" :vault=\"offerVault\" />\n        <p v-if=\"level !== 'vault'\" class=\"fe-e2e-names__hint\">{{ t('e2e.create.names_root_hint') }}</p>\n      </div>\n      <!-- wiring:e2 vault — the pack size, only for a vault. -->\n      <div v-if=\"offerVault && level === 'vault'\" class=\"fe-field\" data-testid=\"e2e-vault-pack\">\n        <span class=\"fe-field__label\" id=\"fe-e2e-vault-pack-label\">{{ t('e2e.vault.pack_label') }}</span>\n        <ChoiceButtons\n          segmented\n          :options=\"packOptions\"\n          :model-value=\"String(packLog2)\"\n          :disabled=\"busy\"\n          aria-labelledby=\"fe-e2e-vault-pack-label\"\n          testid-prefix=\"e2e-vault-pack\"\n          @update:model-value=\"(v) => (packLog2 = Number(v))\"\n        />\n        <p class=\"fe-e2e-names__hint\">{{ t('e2e.vault.pack_hint') }}</p>\n      </div>\n      <!-- wiring:e2 convert — what encrypting now cannot reach, said before. -->\n      <div v-if=\"existing\" class=\"fe-e2e-convert-past\" data-testid=\"e2e-convert-past\">\n        <strong>{{ t('e2e.convert.past_title') }}</strong>\n        <p>{{ t('e2e.convert.past_body') }}</p>\n        <label class=\"fe-e2e-ack\">\n          <input v-model=\"dropVersions\" type=\"checkbox\" :disabled=\"busy\" data-testid=\"e2e-convert-versions\" />\n          <span>{{ t('e2e.convert.drop_versions') }}</span>\n        </label>\n        <label class=\"fe-e2e-ack\">\n          <input v-model=\"dropTrash\" type=\"checkbox\" :disabled=\"busy\" data-testid=\"e2e-convert-trash\" />\n          <span>{{ t('e2e.convert.drop_trash') }}</span>\n        </label>\n        <p class=\"fe-e2e-names__hint\">{{ t('e2e.convert.past_outside') }}</p>\n      </div>\n      <div class=\"fe-e2e-warn\" role=\"alert\">\n        <strong>{{ t('e2e.create.warn_title') }}</strong>\n        <p>{{ t('e2e.create.warn_body') }}</p>\n      </div>\n      <!-- wiring:e2 recovery — disclosure, not a setting. The user cannot\n           turn escrow off for their folder; they can only know about it. -->\n      <div v-if=\"escrowKid\" class=\"fe-e2e-rk__escrow\" role=\"note\">\n        <strong>{{ t('e2e.create.escrow_title') }}</strong>\n        <p>{{ t('e2e.create.escrow_body') }}</p>\n      </div>\n      <label class=\"fe-e2e-ack\">\n        <input v-model=\"ack\" type=\"checkbox\" :disabled=\"busy\" data-testid=\"e2e-create-ack\" />\n        <span>{{ t('e2e.create.ack') }}</span>\n      </label>\n      <p v-if=\"err\" class=\"fe-form__error\">{{ err }}</p>\n    </form>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">\n        {{ t('modal.newfolder.cancel') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn fe-btn--primary\" :disabled=\"busy\" @click=\"submit\">\n        {{ busy ? t('e2e.create.busy') : existing ? t('e2e.convert.submit') : t('e2e.create.create') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * RecoveryKeyModal — shows a folder recovery key, exactly once (wiring:e2).\n *\n * This is the only moment the key exists anywhere outside the user's own\n * records. filex does not store it, cannot recompute it, and will never be\n * able to show it again — so the dialog is deliberately hard to dismiss by\n * accident: no backdrop close, no cancel button, and an acknowledgement the\n * user has to tick.\n *\n * ⚠ The key must not leave this component. No logging, no analytics, no\n * emit carrying its value. Copy and download are both local.\n *\n * Crypto scheme: docs/E2E-ENCRYPTION.md and lib/e2ecrypto.ts.\n */\nimport { computed, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /** The key itself. Shown, copied, downloaded — never emitted or stored. */\n  recoveryKey: string;\n  /** Folder name, for the downloaded file and the dialog copy. */\n  folderName?: string;\n  /** Set when this installation holds an escrow key for the folder too. */\n  escrowKid?: string | null;\n  /** 'created' = a new folder; 'upgraded' = an existing folder gained recovery;\n   *  'replaced' = a re-key issued a new one and the old one stopped working;\n   *  'file' = a single encrypted file (.fxe) was just made (wiring:e2 fxe). */\n  variant?: 'created' | 'upgraded' | 'replaced' | 'file';\n}>();\n\nconst emit = defineEmits<{ (e: 'close'): void }>();\n\nconst { t } = useLocale(() => props.locale);\nconst ack = ref(false);\nconst copied = ref(false);\n\nwatch(\n  () => props.open,\n  (v) => {\n    if (v) {\n      ack.value = false;\n      copied.value = false;\n    }\n  },\n);\n\nconst title = computed(() =>\n  props.variant === 'upgraded' || props.variant === 'replaced'\n    ? t('e2e.recovery.title_upgraded')\n    : t('e2e.recovery.title'),\n);\nconst lead = computed(() =>\n  props.variant === 'upgraded'\n    ? t('e2e.recovery.lead_upgraded')\n    : props.variant === 'replaced'\n      ? t('e2e.recovery.lead_replaced')\n      : props.variant === 'file'\n        ? t('e2e.recovery.lead_file')\n        : t('e2e.recovery.lead'),\n);\n\nasync function copy() {\n  try {\n    await navigator.clipboard.writeText(props.recoveryKey);\n    copied.value = true;\n    window.setTimeout(() => (copied.value = false), 2000);\n  } catch {\n    // Clipboard permission denied (or a non-secure origin). The key is on\n    // screen and selectable, so this is a convenience, not the only route.\n    copied.value = false;\n  }\n}\n\nfunction download() {\n  /* wiring:e2 fxe — the same card for a single encrypted file. */\n  const what = props.variant === 'file' ? 'file' : 'folder';\n  const name = props.folderName || what;\n  const body =\n    `filex recovery key\\n` +\n    `${what}: ${name}\\n` +\n    `\\n${props.recoveryKey}\\n\\n` +\n    `This key opens the encrypted ${what} without its password.\\n` +\n    `Anyone holding it can read the ${what}. Store it like a password.\\n` +\n    `filex does not keep a copy and cannot show it again.\\n`;\n  const url = URL.createObjectURL(new Blob([body], { type: 'text/plain' }));\n  const a = document.createElement('a');\n  a.href = url;\n  a.download = `filex-recovery-${name}.txt`;\n  document.body.appendChild(a);\n  a.click();\n  a.remove();\n  window.setTimeout(() => URL.revokeObjectURL(url), 30_000);\n}\n\nfunction done() {\n  if (!ack.value) return;\n  emit('close');\n}\n</script>\n\n<template>\n  <!-- No backdrop close, and ESC only lands once the box is ticked: the key\n       cannot be shown again, so an accidental dismissal is data loss. -->\n  <Modal :open=\"open\" :title=\"title\" size=\"sm\" :close-on-backdrop=\"false\" @close=\"done\">\n    <div class=\"fe-e2e-rk\">\n      <p class=\"fe-e2e-rk__lead\">\n        {{ lead }}\n      </p>\n\n      <output class=\"fe-e2e-rk__key\" :aria-label=\"t('e2e.recovery_key_aria')\">{{ recoveryKey }}</output>\n\n      <div class=\"fe-e2e-rk__actions\">\n        <button type=\"button\" class=\"fe-btn\" @click=\"copy\">\n          {{ copied ? t('e2e.recovery.copied') : t('e2e.recovery.copy') }}\n        </button>\n        <button type=\"button\" class=\"fe-btn\" @click=\"download\">\n          {{ t('e2e.recovery.download') }}\n        </button>\n      </div>\n\n      <div class=\"fe-e2e-warn\" role=\"alert\">\n        <strong>{{ t('e2e.recovery.warn_title') }}</strong>\n        <p>{{ variant === 'file' ? t('e2e.recovery.warn_body_file') : t('e2e.recovery.warn_body') }}</p>\n      </div>\n\n      <div v-if=\"escrowKid\" class=\"fe-e2e-rk__escrow\" role=\"note\">\n        <strong>{{ t('e2e.recovery.escrow_title') }}</strong>\n        <p>{{ variant === 'file' ? t('e2e.fxe.escrow_body') : t('e2e.recovery.escrow_body') }}</p>\n        <p class=\"fe-e2e-rk__kid\">{{ t('e2e.recovery.escrow_kid') }}: <code>{{ escrowKid }}</code></p>\n      </div>\n\n      <label class=\"fe-e2e-ack\">\n        <input v-model=\"ack\" type=\"checkbox\" />\n        <span>{{ t('e2e.recovery.ack') }}</span>\n      </label>\n    </div>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn fe-btn--primary\" :disabled=\"!ack\" @click=\"done\">\n        {{ t('e2e.recovery.done') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * E2eRecoveryUnlockModal — open an encrypted folder without its password.\n *\n * Two doors, and the dialog is explicit about which one you are using\n * because they are not equivalent:\n *\n *   - the USER RECOVERY KEY, shown once when the folder was created. Opens\n *     the folder and nobody is told, because it is your key.\n *   - the ESCROW KEY, held by the operator of this installation. Opening a\n *     folder with it NOTIFIES the folder's owner. The dialog says so before\n *     the key is typed, not after.\n *\n * The component collects input and validates its shape. All crypto and all\n * network calls happen in the parent (FileExplorer), which owns the marker\n * and the key ring — same division as the password lock screen.\n */\nimport { computed, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { parseRecoveryKey } from '../lib/e2ecrypto';\nimport type { EscrowAvailability } from '../lib/e2ecrypto';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /** The folder has a user recovery key slot (v2 markers created since 0.31). */\n  hasRecovery: boolean;\n  /**\n   * Whether the escrow door applies to THIS folder — see escrowAvailability.\n   * 'predates' and 'other-key' are not \"no escrow tab\"; they are two\n   * different facts the dialog has to state, because an admin who knows the\n   * installation has escrow reads a missing tab as a bug and tries the key\n   * anyway.\n   */\n  escrowState: EscrowAvailability;\n  /** Short id of the escrow key THIS FOLDER was sealed to, when it has one. */\n  escrowKid?: string | null;\n  busy?: boolean;\n  /** Set by the parent after a failed attempt. */\n  error?: string | null;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'submit', payload: { mode: 'recovery' | 'escrow'; value: string }): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n/** The escrow tab is offered only when the key can actually open this\n *  folder. Every other state is explained in words instead. */\nconst hasEscrow = computed(() => props.escrowState === 'available');\n/** The installation has an escrow key that does NOT apply here. Saying so\n *  is the whole point: silence reads as \"not enabled\". */\nconst escrowUnavailableReason = computed(() => {\n  if (props.escrowState === 'predates') return t('e2e.recover.escrow_predates');\n  if (props.escrowState === 'other-key') return t('e2e.recover.escrow_other_key');\n  return null;\n});\nconst mode = ref<'recovery' | 'escrow'>('recovery');\nconst recoveryValue = ref('');\nconst escrowValue = ref('');\nconst localErr = ref<string | null>(null);\n\nwatch(\n  () => props.open,\n  (v) => {\n    if (v) {\n      mode.value = props.hasRecovery ? 'recovery' : 'escrow';\n      recoveryValue.value = '';\n      escrowValue.value = '';\n      localErr.value = null;\n    }\n  },\n);\n\n/** A folder with neither slot is a pre-0.31 folder: the password is the\n *  only way in, and saying so is more useful than an empty dialog. */\nconst nothingAvailable = computed(() => !props.hasRecovery && !hasEscrow.value);\n\nconst shownError = computed(() => localErr.value || props.error || null);\n\nfunction submit() {\n  if (props.busy || nothingAvailable.value) return;\n  localErr.value = null;\n  if (mode.value === 'recovery') {\n    // Check the shape locally so a typo reads as a typo rather than as a\n    // wrong key — the two failures call for different next steps.\n    if (!parseRecoveryKey(recoveryValue.value)) {\n      localErr.value = t('e2e.recover.bad_format');\n      return;\n    }\n    emit('submit', { mode: 'recovery', value: recoveryValue.value });\n    return;\n  }\n  if (!escrowValue.value.trim()) {\n    localErr.value = t('e2e.recover.escrow_required');\n    return;\n  }\n  emit('submit', { mode: 'escrow', value: escrowValue.value });\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('e2e.recover.title')\" size=\"sm\" @close=\"emit('close')\">\n    <div class=\"fe-e2e-recover\">\n      <p v-if=\"nothingAvailable\" class=\"fe-e2e-recover__none\">\n        {{ t('e2e.recover.none') }}\n      </p>\n\n      <template v-else>\n        <div v-if=\"hasRecovery && hasEscrow\" class=\"fe-e2e-recover__tabs\" role=\"tablist\">\n          <button\n            type=\"button\"\n            role=\"tab\"\n            class=\"fe-e2e-recover__tab\"\n            :class=\"{ 'fe-e2e-recover__tab--on': mode === 'recovery' }\"\n            :aria-selected=\"mode === 'recovery'\"\n            @click=\"mode = 'recovery'\"\n          >\n            {{ t('e2e.recover.tab_recovery') }}\n          </button>\n          <button\n            type=\"button\"\n            role=\"tab\"\n            class=\"fe-e2e-recover__tab\"\n            :class=\"{ 'fe-e2e-recover__tab--on': mode === 'escrow' }\"\n            :aria-selected=\"mode === 'escrow'\"\n            @click=\"mode = 'escrow'\"\n          >\n            {{ t('e2e.recover.tab_escrow') }}\n          </button>\n        </div>\n\n        <form v-if=\"mode === 'recovery'\" class=\"fe-e2e-form\" @submit.prevent=\"submit\">\n          <p class=\"fe-e2e-recover__hint\">{{ t('e2e.recover.recovery_hint') }}</p>\n          <input\n            v-model=\"recoveryValue\"\n            type=\"text\"\n            class=\"fe-input fe-e2e-recover__key\"\n            :placeholder=\"t('e2e.recover.recovery_placeholder')\"\n            autocomplete=\"off\"\n            spellcheck=\"false\"\n            :disabled=\"busy\"\n          />\n        </form>\n\n        <form v-else class=\"fe-e2e-form\" @submit.prevent=\"submit\">\n          <div class=\"fe-e2e-warn\" role=\"alert\">\n            <strong>{{ t('e2e.recover.escrow_warn_title') }}</strong>\n            <p>{{ t('e2e.recover.escrow_warn_body') }}</p>\n          </div>\n          <p v-if=\"escrowKid\" class=\"fe-e2e-recover__hint\">\n            {{ t('e2e.recover.escrow_kid') }}: <code>{{ escrowKid }}</code>\n          </p>\n          <textarea\n            v-model=\"escrowValue\"\n            class=\"fe-input fe-e2e-recover__escrow\"\n            rows=\"5\"\n            :placeholder=\"t('e2e.recover.escrow_placeholder')\"\n            autocomplete=\"off\"\n            spellcheck=\"false\"\n            :disabled=\"busy\"\n          ></textarea>\n        </form>\n      </template>\n\n      <!-- ⚠ Shown whenever the installation has an escrow key that cannot\n           open THIS folder. A folder created before escrow was adopted must\n           not merely lack a tab; it must say why, or the absence reads as a\n           bug and the operator burns an afternoon on it. -->\n      <p v-if=\"escrowUnavailableReason\" class=\"fe-e2e-recover__note\">\n        {{ escrowUnavailableReason }}\n      </p>\n\n      <p v-if=\"shownError\" class=\"fe-form__error\">{{ shownError }}</p>\n    </div>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">\n        {{ t('modal.newfolder.cancel') }}\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :disabled=\"busy || nothingAvailable\"\n        @click=\"submit\"\n      >\n        {{ busy ? t('e2e.recover.busy') : t('e2e.recover.unlock') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","/* eslint-disable no-multi-assign */\n\nfunction deepFreeze(obj) {\n  if (obj instanceof Map) {\n    obj.clear =\n      obj.delete =\n      obj.set =\n        function () {\n          throw new Error('map is read-only');\n        };\n  } else if (obj instanceof Set) {\n    obj.add =\n      obj.clear =\n      obj.delete =\n        function () {\n          throw new Error('set is read-only');\n        };\n  }\n\n  // Freeze self\n  Object.freeze(obj);\n\n  Object.getOwnPropertyNames(obj).forEach((name) => {\n    const prop = obj[name];\n    const type = typeof prop;\n\n    // Freeze prop if it is an object or function and also not already frozen\n    if ((type === 'object' || type === 'function') && !Object.isFrozen(prop)) {\n      deepFreeze(prop);\n    }\n  });\n\n  return obj;\n}\n\n/** @typedef {import('highlight.js').CallbackResponse} CallbackResponse */\n/** @typedef {import('highlight.js').CompiledMode} CompiledMode */\n/** @implements CallbackResponse */\n\nclass Response {\n  /**\n   * @param {CompiledMode} mode\n   */\n  constructor(mode) {\n    // eslint-disable-next-line no-undefined\n    if (mode.data === undefined) mode.data = {};\n\n    this.data = mode.data;\n    this.isMatchIgnored = false;\n  }\n\n  ignoreMatch() {\n    this.isMatchIgnored = true;\n  }\n}\n\n/**\n * @param {string} value\n * @returns {string}\n */\nfunction escapeHTML(value) {\n  return value\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#x27;');\n}\n\n/**\n * performs a shallow merge of multiple objects into one\n *\n * @template T\n * @param {T} original\n * @param {Record<string,any>[]} objects\n * @returns {T} a single new object\n */\nfunction inherit$1(original, ...objects) {\n  /** @type Record<string,any> */\n  const result = Object.create(null);\n\n  for (const key in original) {\n    result[key] = original[key];\n  }\n  objects.forEach(function(obj) {\n    for (const key in obj) {\n      result[key] = obj[key];\n    }\n  });\n  return /** @type {T} */ (result);\n}\n\n/**\n * @typedef {object} Renderer\n * @property {(text: string) => void} addText\n * @property {(node: Node) => void} openNode\n * @property {(node: Node) => void} closeNode\n * @property {() => string} value\n */\n\n/** @typedef {{scope?: string, language?: string, sublanguage?: boolean}} Node */\n/** @typedef {{walk: (r: Renderer) => void}} Tree */\n/** */\n\nconst SPAN_CLOSE = '</span>';\n\n/**\n * Determines if a node needs to be wrapped in <span>\n *\n * @param {Node} node */\nconst emitsWrappingTags = (node) => {\n  // rarely we can have a sublanguage where language is undefined\n  // TODO: track down why\n  return !!node.scope;\n};\n\n/**\n *\n * @param {string} name\n * @param {{prefix:string}} options\n */\nconst scopeToCSSClass = (name, { prefix }) => {\n  // sub-language\n  if (name.startsWith(\"language:\")) {\n    return name.replace(\"language:\", \"language-\");\n  }\n  // tiered scope: comment.line\n  if (name.includes(\".\")) {\n    const pieces = name.split(\".\");\n    return [\n      `${prefix}${pieces.shift()}`,\n      ...(pieces.map((x, i) => `${x}${\"_\".repeat(i + 1)}`))\n    ].join(\" \");\n  }\n  // simple scope\n  return `${prefix}${name}`;\n};\n\n/** @type {Renderer} */\nclass HTMLRenderer {\n  /**\n   * Creates a new HTMLRenderer\n   *\n   * @param {Tree} parseTree - the parse tree (must support `walk` API)\n   * @param {{classPrefix: string}} options\n   */\n  constructor(parseTree, options) {\n    this.buffer = \"\";\n    this.classPrefix = options.classPrefix;\n    parseTree.walk(this);\n  }\n\n  /**\n   * Adds texts to the output stream\n   *\n   * @param {string} text */\n  addText(text) {\n    this.buffer += escapeHTML(text);\n  }\n\n  /**\n   * Adds a node open to the output stream (if needed)\n   *\n   * @param {Node} node */\n  openNode(node) {\n    if (!emitsWrappingTags(node)) return;\n\n    const className = scopeToCSSClass(node.scope,\n      { prefix: this.classPrefix });\n    this.span(className);\n  }\n\n  /**\n   * Adds a node close to the output stream (if needed)\n   *\n   * @param {Node} node */\n  closeNode(node) {\n    if (!emitsWrappingTags(node)) return;\n\n    this.buffer += SPAN_CLOSE;\n  }\n\n  /**\n   * returns the accumulated buffer\n  */\n  value() {\n    return this.buffer;\n  }\n\n  // helpers\n\n  /**\n   * Builds a span element\n   *\n   * @param {string} className */\n  span(className) {\n    this.buffer += `<span class=\"${className}\">`;\n  }\n}\n\n/** @typedef {{scope?: string, language?: string, children: Node[]} | string} Node */\n/** @typedef {{scope?: string, language?: string, children: Node[]} } DataNode */\n/** @typedef {import('highlight.js').Emitter} Emitter */\n/**  */\n\n/** @returns {DataNode} */\nconst newNode = (opts = {}) => {\n  /** @type DataNode */\n  const result = { children: [] };\n  Object.assign(result, opts);\n  return result;\n};\n\nclass TokenTree {\n  constructor() {\n    /** @type DataNode */\n    this.rootNode = newNode();\n    this.stack = [this.rootNode];\n  }\n\n  get top() {\n    return this.stack[this.stack.length - 1];\n  }\n\n  get root() { return this.rootNode; }\n\n  /** @param {Node} node */\n  add(node) {\n    this.top.children.push(node);\n  }\n\n  /** @param {string} scope */\n  openNode(scope) {\n    /** @type Node */\n    const node = newNode({ scope });\n    this.add(node);\n    this.stack.push(node);\n  }\n\n  closeNode() {\n    if (this.stack.length > 1) {\n      return this.stack.pop();\n    }\n    // eslint-disable-next-line no-undefined\n    return undefined;\n  }\n\n  closeAllNodes() {\n    while (this.closeNode());\n  }\n\n  toJSON() {\n    return JSON.stringify(this.rootNode, null, 4);\n  }\n\n  /**\n   * @typedef { import(\"./html_renderer\").Renderer } Renderer\n   * @param {Renderer} builder\n   */\n  walk(builder) {\n    // this does not\n    return this.constructor._walk(builder, this.rootNode);\n    // this works\n    // return TokenTree._walk(builder, this.rootNode);\n  }\n\n  /**\n   * @param {Renderer} builder\n   * @param {Node} node\n   */\n  static _walk(builder, node) {\n    if (typeof node === \"string\") {\n      builder.addText(node);\n    } else if (node.children) {\n      builder.openNode(node);\n      node.children.forEach((child) => this._walk(builder, child));\n      builder.closeNode(node);\n    }\n    return builder;\n  }\n\n  /**\n   * @param {Node} node\n   */\n  static _collapse(node) {\n    if (typeof node === \"string\") return;\n    if (!node.children) return;\n\n    if (node.children.every(el => typeof el === \"string\")) {\n      // node.text = node.children.join(\"\");\n      // delete node.children;\n      node.children = [node.children.join(\"\")];\n    } else {\n      node.children.forEach((child) => {\n        TokenTree._collapse(child);\n      });\n    }\n  }\n}\n\n/**\n  Currently this is all private API, but this is the minimal API necessary\n  that an Emitter must implement to fully support the parser.\n\n  Minimal interface:\n\n  - addText(text)\n  - __addSublanguage(emitter, subLanguageName)\n  - startScope(scope)\n  - endScope()\n  - finalize()\n  - toHTML()\n\n*/\n\n/**\n * @implements {Emitter}\n */\nclass TokenTreeEmitter extends TokenTree {\n  /**\n   * @param {*} options\n   */\n  constructor(options) {\n    super();\n    this.options = options;\n  }\n\n  /**\n   * @param {string} text\n   */\n  addText(text) {\n    if (text === \"\") { return; }\n\n    this.add(text);\n  }\n\n  /** @param {string} scope */\n  startScope(scope) {\n    this.openNode(scope);\n  }\n\n  endScope() {\n    this.closeNode();\n  }\n\n  /**\n   * @param {Emitter & {root: DataNode}} emitter\n   * @param {string} name\n   */\n  __addSublanguage(emitter, name) {\n    /** @type DataNode */\n    const node = emitter.root;\n    if (name) node.scope = `language:${name}`;\n\n    this.add(node);\n  }\n\n  toHTML() {\n    const renderer = new HTMLRenderer(this, this.options);\n    return renderer.value();\n  }\n\n  finalize() {\n    this.closeAllNodes();\n    return true;\n  }\n}\n\n/**\n * @param {string} value\n * @returns {RegExp}\n * */\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction source(re) {\n  if (!re) return null;\n  if (typeof re === \"string\") return re;\n\n  return re.source;\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction lookahead(re) {\n  return concat('(?=', re, ')');\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction anyNumberOfTimes(re) {\n  return concat('(?:', re, ')*');\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction optional(re) {\n  return concat('(?:', re, ')?');\n}\n\n/**\n * @param {...(RegExp | string) } args\n * @returns {string}\n */\nfunction concat(...args) {\n  const joined = args.map((x) => source(x)).join(\"\");\n  return joined;\n}\n\n/**\n * @param { Array<string | RegExp | Object> } args\n * @returns {object}\n */\nfunction stripOptionsFromArgs(args) {\n  const opts = args[args.length - 1];\n\n  if (typeof opts === 'object' && opts.constructor === Object) {\n    args.splice(args.length - 1, 1);\n    return opts;\n  } else {\n    return {};\n  }\n}\n\n/** @typedef { {capture?: boolean} } RegexEitherOptions */\n\n/**\n * Any of the passed expresssions may match\n *\n * Creates a huge this | this | that | that match\n * @param {(RegExp | string)[] | [...(RegExp | string)[], RegexEitherOptions]} args\n * @returns {string}\n */\nfunction either(...args) {\n  /** @type { object & {capture?: boolean} }  */\n  const opts = stripOptionsFromArgs(args);\n  const joined = '('\n    + (opts.capture ? \"\" : \"?:\")\n    + args.map((x) => source(x)).join(\"|\") + \")\";\n  return joined;\n}\n\n/**\n * @param {RegExp | string} re\n * @returns {number}\n */\nfunction countMatchGroups(re) {\n  return (new RegExp(re.toString() + '|')).exec('').length - 1;\n}\n\n/**\n * Does lexeme start with a regular expression match at the beginning\n * @param {RegExp} re\n * @param {string} lexeme\n */\nfunction startsWith(re, lexeme) {\n  const match = re && re.exec(lexeme);\n  return match && match.index === 0;\n}\n\n// BACKREF_RE matches an open parenthesis or backreference. To avoid\n// an incorrect parse, it additionally matches the following:\n// - [...] elements, where the meaning of parentheses and escapes change\n// - other escape sequences, so we do not misparse escape sequences as\n//   interesting elements\n// - non-matching or lookahead parentheses, which do not capture. These\n//   follow the '(' with a '?'.\nconst BACKREF_RE = /\\[(?:[^\\\\\\]]|\\\\.)*\\]|\\(\\??|\\\\([1-9][0-9]*)|\\\\./;\n\n// **INTERNAL** Not intended for outside usage\n// join logically computes regexps.join(separator), but fixes the\n// backreferences so they continue to match.\n// it also places each individual regular expression into it's own\n// match group, keeping track of the sequencing of those match groups\n// is currently an exercise for the caller. :-)\n/**\n * @param {(string | RegExp)[]} regexps\n * @param {{joinWith: string}} opts\n * @returns {string}\n */\nfunction _rewriteBackreferences(regexps, { joinWith }) {\n  let numCaptures = 0;\n\n  return regexps.map((regex) => {\n    numCaptures += 1;\n    const offset = numCaptures;\n    let re = source(regex);\n    let out = '';\n\n    while (re.length > 0) {\n      const match = BACKREF_RE.exec(re);\n      if (!match) {\n        out += re;\n        break;\n      }\n      out += re.substring(0, match.index);\n      re = re.substring(match.index + match[0].length);\n      if (match[0][0] === '\\\\' && match[1]) {\n        // Adjust the backreference.\n        out += '\\\\' + String(Number(match[1]) + offset);\n      } else {\n        out += match[0];\n        if (match[0] === '(') {\n          numCaptures++;\n        }\n      }\n    }\n    return out;\n  }).map(re => `(${re})`).join(joinWith);\n}\n\n/** @typedef {import('highlight.js').Mode} Mode */\n/** @typedef {import('highlight.js').ModeCallback} ModeCallback */\n\n// Common regexps\nconst MATCH_NOTHING_RE = /\\b\\B/;\nconst IDENT_RE = '[a-zA-Z]\\\\w*';\nconst UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\\\w*';\nconst NUMBER_RE = '\\\\b\\\\d+(\\\\.\\\\d+)?';\nconst C_NUMBER_RE = '(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)'; // 0x..., 0..., decimal, float\nconst BINARY_NUMBER_RE = '\\\\b(0b[01]+)'; // 0b...\nconst RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~';\n\n/**\n* @param { Partial<Mode> & {binary?: string | RegExp} } opts\n*/\nconst SHEBANG = (opts = {}) => {\n  const beginShebang = /^#![ ]*\\//;\n  if (opts.binary) {\n    opts.begin = concat(\n      beginShebang,\n      /.*\\b/,\n      opts.binary,\n      /\\b.*/);\n  }\n  return inherit$1({\n    scope: 'meta',\n    begin: beginShebang,\n    end: /$/,\n    relevance: 0,\n    /** @type {ModeCallback} */\n    \"on:begin\": (m, resp) => {\n      if (m.index !== 0) resp.ignoreMatch();\n    }\n  }, opts);\n};\n\n// Common modes\nconst BACKSLASH_ESCAPE = {\n  begin: '\\\\\\\\[\\\\s\\\\S]', relevance: 0\n};\nconst APOS_STRING_MODE = {\n  scope: 'string',\n  begin: '\\'',\n  end: '\\'',\n  illegal: '\\\\n',\n  contains: [BACKSLASH_ESCAPE]\n};\nconst QUOTE_STRING_MODE = {\n  scope: 'string',\n  begin: '\"',\n  end: '\"',\n  illegal: '\\\\n',\n  contains: [BACKSLASH_ESCAPE]\n};\nconst PHRASAL_WORDS_MODE = {\n  begin: /\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/\n};\n/**\n * Creates a comment mode\n *\n * @param {string | RegExp} begin\n * @param {string | RegExp} end\n * @param {Mode | {}} [modeOptions]\n * @returns {Partial<Mode>}\n */\nconst COMMENT = function(begin, end, modeOptions = {}) {\n  const mode = inherit$1(\n    {\n      scope: 'comment',\n      begin,\n      end,\n      contains: []\n    },\n    modeOptions\n  );\n  mode.contains.push({\n    scope: 'doctag',\n    // hack to avoid the space from being included. the space is necessary to\n    // match here to prevent the plain text rule below from gobbling up doctags\n    begin: '[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)',\n    end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,\n    excludeBegin: true,\n    relevance: 0\n  });\n  const ENGLISH_WORD = either(\n    // list of common 1 and 2 letter words in English\n    \"I\",\n    \"a\",\n    \"is\",\n    \"so\",\n    \"us\",\n    \"to\",\n    \"at\",\n    \"if\",\n    \"in\",\n    \"it\",\n    \"on\",\n    // note: this is not an exhaustive list of contractions, just popular ones\n    /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, // contractions - can't we'd they're let's, etc\n    /[A-Za-z]+[-][a-z]+/, // `no-way`, etc.\n    /[A-Za-z][a-z]{2,}/ // allow capitalized words at beginning of sentences\n  );\n  // looking like plain text, more likely to be a comment\n  mode.contains.push(\n    {\n      // TODO: how to include \", (, ) without breaking grammars that use these for\n      // comment delimiters?\n      // begin: /[ ]+([()\"]?([A-Za-z'-]{3,}|is|a|I|so|us|[tT][oO]|at|if|in|it|on)[.]?[()\":]?([.][ ]|[ ]|\\))){3}/\n      // ---\n\n      // this tries to find sequences of 3 english words in a row (without any\n      // \"programming\" type syntax) this gives us a strong signal that we've\n      // TRULY found a comment - vs perhaps scanning with the wrong language.\n      // It's possible to find something that LOOKS like the start of the\n      // comment - but then if there is no readable text - good chance it is a\n      // false match and not a comment.\n      //\n      // for a visual example please see:\n      // https://github.com/highlightjs/highlight.js/issues/2827\n\n      begin: concat(\n        /[ ]+/, // necessary to prevent us gobbling up doctags like /* @author Bob Mcgill */\n        '(',\n        ENGLISH_WORD,\n        /[.]?[:]?([.][ ]|[ ])/,\n        '){3}') // look for 3 words in a row\n    }\n  );\n  return mode;\n};\nconst C_LINE_COMMENT_MODE = COMMENT('//', '$');\nconst C_BLOCK_COMMENT_MODE = COMMENT('/\\\\*', '\\\\*/');\nconst HASH_COMMENT_MODE = COMMENT('#', '$');\nconst NUMBER_MODE = {\n  scope: 'number',\n  begin: NUMBER_RE,\n  relevance: 0\n};\nconst C_NUMBER_MODE = {\n  scope: 'number',\n  begin: C_NUMBER_RE,\n  relevance: 0\n};\nconst BINARY_NUMBER_MODE = {\n  scope: 'number',\n  begin: BINARY_NUMBER_RE,\n  relevance: 0\n};\nconst REGEXP_MODE = {\n  scope: \"regexp\",\n  begin: /\\/(?=[^/\\n]*\\/)/,\n  end: /\\/[gimuy]*/,\n  contains: [\n    BACKSLASH_ESCAPE,\n    {\n      begin: /\\[/,\n      end: /\\]/,\n      relevance: 0,\n      contains: [BACKSLASH_ESCAPE]\n    }\n  ]\n};\nconst TITLE_MODE = {\n  scope: 'title',\n  begin: IDENT_RE,\n  relevance: 0\n};\nconst UNDERSCORE_TITLE_MODE = {\n  scope: 'title',\n  begin: UNDERSCORE_IDENT_RE,\n  relevance: 0\n};\nconst METHOD_GUARD = {\n  // excludes method names from keyword processing\n  begin: '\\\\.\\\\s*' + UNDERSCORE_IDENT_RE,\n  relevance: 0\n};\n\n/**\n * Adds end same as begin mechanics to a mode\n *\n * Your mode must include at least a single () match group as that first match\n * group is what is used for comparison\n * @param {Partial<Mode>} mode\n */\nconst END_SAME_AS_BEGIN = function(mode) {\n  return Object.assign(mode,\n    {\n      /** @type {ModeCallback} */\n      'on:begin': (m, resp) => { resp.data._beginMatch = m[1]; },\n      /** @type {ModeCallback} */\n      'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); }\n    });\n};\n\nvar MODES = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  APOS_STRING_MODE: APOS_STRING_MODE,\n  BACKSLASH_ESCAPE: BACKSLASH_ESCAPE,\n  BINARY_NUMBER_MODE: BINARY_NUMBER_MODE,\n  BINARY_NUMBER_RE: BINARY_NUMBER_RE,\n  COMMENT: COMMENT,\n  C_BLOCK_COMMENT_MODE: C_BLOCK_COMMENT_MODE,\n  C_LINE_COMMENT_MODE: C_LINE_COMMENT_MODE,\n  C_NUMBER_MODE: C_NUMBER_MODE,\n  C_NUMBER_RE: C_NUMBER_RE,\n  END_SAME_AS_BEGIN: END_SAME_AS_BEGIN,\n  HASH_COMMENT_MODE: HASH_COMMENT_MODE,\n  IDENT_RE: IDENT_RE,\n  MATCH_NOTHING_RE: MATCH_NOTHING_RE,\n  METHOD_GUARD: METHOD_GUARD,\n  NUMBER_MODE: NUMBER_MODE,\n  NUMBER_RE: NUMBER_RE,\n  PHRASAL_WORDS_MODE: PHRASAL_WORDS_MODE,\n  QUOTE_STRING_MODE: QUOTE_STRING_MODE,\n  REGEXP_MODE: REGEXP_MODE,\n  RE_STARTERS_RE: RE_STARTERS_RE,\n  SHEBANG: SHEBANG,\n  TITLE_MODE: TITLE_MODE,\n  UNDERSCORE_IDENT_RE: UNDERSCORE_IDENT_RE,\n  UNDERSCORE_TITLE_MODE: UNDERSCORE_TITLE_MODE\n});\n\n/**\n@typedef {import('highlight.js').CallbackResponse} CallbackResponse\n@typedef {import('highlight.js').CompilerExt} CompilerExt\n*/\n\n// Grammar extensions / plugins\n// See: https://github.com/highlightjs/highlight.js/issues/2833\n\n// Grammar extensions allow \"syntactic sugar\" to be added to the grammar modes\n// without requiring any underlying changes to the compiler internals.\n\n// `compileMatch` being the perfect small example of now allowing a grammar\n// author to write `match` when they desire to match a single expression rather\n// than being forced to use `begin`.  The extension then just moves `match` into\n// `begin` when it runs.  Ie, no features have been added, but we've just made\n// the experience of writing (and reading grammars) a little bit nicer.\n\n// ------\n\n// TODO: We need negative look-behind support to do this properly\n/**\n * Skip a match if it has a preceding dot\n *\n * This is used for `beginKeywords` to prevent matching expressions such as\n * `bob.keyword.do()`. The mode compiler automatically wires this up as a\n * special _internal_ 'on:begin' callback for modes with `beginKeywords`\n * @param {RegExpMatchArray} match\n * @param {CallbackResponse} response\n */\nfunction skipIfHasPrecedingDot(match, response) {\n  const before = match.input[match.index - 1];\n  if (before === \".\") {\n    response.ignoreMatch();\n  }\n}\n\n/**\n *\n * @type {CompilerExt}\n */\nfunction scopeClassName(mode, _parent) {\n  // eslint-disable-next-line no-undefined\n  if (mode.className !== undefined) {\n    mode.scope = mode.className;\n    delete mode.className;\n  }\n}\n\n/**\n * `beginKeywords` syntactic sugar\n * @type {CompilerExt}\n */\nfunction beginKeywords(mode, parent) {\n  if (!parent) return;\n  if (!mode.beginKeywords) return;\n\n  // for languages with keywords that include non-word characters checking for\n  // a word boundary is not sufficient, so instead we check for a word boundary\n  // or whitespace - this does no harm in any case since our keyword engine\n  // doesn't allow spaces in keywords anyways and we still check for the boundary\n  // first\n  mode.begin = '\\\\b(' + mode.beginKeywords.split(' ').join('|') + ')(?!\\\\.)(?=\\\\b|\\\\s)';\n  mode.__beforeBegin = skipIfHasPrecedingDot;\n  mode.keywords = mode.keywords || mode.beginKeywords;\n  delete mode.beginKeywords;\n\n  // prevents double relevance, the keywords themselves provide\n  // relevance, the mode doesn't need to double it\n  // eslint-disable-next-line no-undefined\n  if (mode.relevance === undefined) mode.relevance = 0;\n}\n\n/**\n * Allow `illegal` to contain an array of illegal values\n * @type {CompilerExt}\n */\nfunction compileIllegal(mode, _parent) {\n  if (!Array.isArray(mode.illegal)) return;\n\n  mode.illegal = either(...mode.illegal);\n}\n\n/**\n * `match` to match a single expression for readability\n * @type {CompilerExt}\n */\nfunction compileMatch(mode, _parent) {\n  if (!mode.match) return;\n  if (mode.begin || mode.end) throw new Error(\"begin & end are not supported with match\");\n\n  mode.begin = mode.match;\n  delete mode.match;\n}\n\n/**\n * provides the default 1 relevance to all modes\n * @type {CompilerExt}\n */\nfunction compileRelevance(mode, _parent) {\n  // eslint-disable-next-line no-undefined\n  if (mode.relevance === undefined) mode.relevance = 1;\n}\n\n// allow beforeMatch to act as a \"qualifier\" for the match\n// the full match begin must be [beforeMatch][begin]\nconst beforeMatchExt = (mode, parent) => {\n  if (!mode.beforeMatch) return;\n  // starts conflicts with endsParent which we need to make sure the child\n  // rule is not matched multiple times\n  if (mode.starts) throw new Error(\"beforeMatch cannot be used with starts\");\n\n  const originalMode = Object.assign({}, mode);\n  Object.keys(mode).forEach((key) => { delete mode[key]; });\n\n  mode.keywords = originalMode.keywords;\n  mode.begin = concat(originalMode.beforeMatch, lookahead(originalMode.begin));\n  mode.starts = {\n    relevance: 0,\n    contains: [\n      Object.assign(originalMode, { endsParent: true })\n    ]\n  };\n  mode.relevance = 0;\n\n  delete originalMode.beforeMatch;\n};\n\n// keywords that should have no default relevance value\nconst COMMON_KEYWORDS = [\n  'of',\n  'and',\n  'for',\n  'in',\n  'not',\n  'or',\n  'if',\n  'then',\n  'parent', // common variable name\n  'list', // common variable name\n  'value' // common variable name\n];\n\nconst DEFAULT_KEYWORD_SCOPE = \"keyword\";\n\n/**\n * Given raw keywords from a language definition, compile them.\n *\n * @param {string | Record<string,string|string[]> | Array<string>} rawKeywords\n * @param {boolean} caseInsensitive\n */\nfunction compileKeywords(rawKeywords, caseInsensitive, scopeName = DEFAULT_KEYWORD_SCOPE) {\n  /** @type {import(\"highlight.js/private\").KeywordDict} */\n  const compiledKeywords = Object.create(null);\n\n  // input can be a string of keywords, an array of keywords, or a object with\n  // named keys representing scopeName (which can then point to a string or array)\n  if (typeof rawKeywords === 'string') {\n    compileList(scopeName, rawKeywords.split(\" \"));\n  } else if (Array.isArray(rawKeywords)) {\n    compileList(scopeName, rawKeywords);\n  } else {\n    Object.keys(rawKeywords).forEach(function(scopeName) {\n      // collapse all our objects back into the parent object\n      Object.assign(\n        compiledKeywords,\n        compileKeywords(rawKeywords[scopeName], caseInsensitive, scopeName)\n      );\n    });\n  }\n  return compiledKeywords;\n\n  // ---\n\n  /**\n   * Compiles an individual list of keywords\n   *\n   * Ex: \"for if when while|5\"\n   *\n   * @param {string} scopeName\n   * @param {Array<string>} keywordList\n   */\n  function compileList(scopeName, keywordList) {\n    if (caseInsensitive) {\n      keywordList = keywordList.map(x => x.toLowerCase());\n    }\n    keywordList.forEach(function(keyword) {\n      const pair = keyword.split('|');\n      compiledKeywords[pair[0]] = [scopeName, scoreForKeyword(pair[0], pair[1])];\n    });\n  }\n}\n\n/**\n * Returns the proper score for a given keyword\n *\n * Also takes into account comment keywords, which will be scored 0 UNLESS\n * another score has been manually assigned.\n * @param {string} keyword\n * @param {string} [providedScore]\n */\nfunction scoreForKeyword(keyword, providedScore) {\n  // manual scores always win over common keywords\n  // so you can force a score of 1 if you really insist\n  if (providedScore) {\n    return Number(providedScore);\n  }\n\n  return commonKeyword(keyword) ? 0 : 1;\n}\n\n/**\n * Determines if a given keyword is common or not\n *\n * @param {string} keyword */\nfunction commonKeyword(keyword) {\n  return COMMON_KEYWORDS.includes(keyword.toLowerCase());\n}\n\n/*\n\nFor the reasoning behind this please see:\nhttps://github.com/highlightjs/highlight.js/issues/2880#issuecomment-747275419\n\n*/\n\n/**\n * @type {Record<string, boolean>}\n */\nconst seenDeprecations = {};\n\n/**\n * @param {string} message\n */\nconst error = (message) => {\n  console.error(message);\n};\n\n/**\n * @param {string} message\n * @param {any} args\n */\nconst warn = (message, ...args) => {\n  console.log(`WARN: ${message}`, ...args);\n};\n\n/**\n * @param {string} version\n * @param {string} message\n */\nconst deprecated = (version, message) => {\n  if (seenDeprecations[`${version}/${message}`]) return;\n\n  console.log(`Deprecated as of ${version}. ${message}`);\n  seenDeprecations[`${version}/${message}`] = true;\n};\n\n/* eslint-disable no-throw-literal */\n\n/**\n@typedef {import('highlight.js').CompiledMode} CompiledMode\n*/\n\nconst MultiClassError = new Error();\n\n/**\n * Renumbers labeled scope names to account for additional inner match\n * groups that otherwise would break everything.\n *\n * Lets say we 3 match scopes:\n *\n *   { 1 => ..., 2 => ..., 3 => ... }\n *\n * So what we need is a clean match like this:\n *\n *   (a)(b)(c) => [ \"a\", \"b\", \"c\" ]\n *\n * But this falls apart with inner match groups:\n *\n * (a)(((b)))(c) => [\"a\", \"b\", \"b\", \"b\", \"c\" ]\n *\n * Our scopes are now \"out of alignment\" and we're repeating `b` 3 times.\n * What needs to happen is the numbers are remapped:\n *\n *   { 1 => ..., 2 => ..., 5 => ... }\n *\n * We also need to know that the ONLY groups that should be output\n * are 1, 2, and 5.  This function handles this behavior.\n *\n * @param {CompiledMode} mode\n * @param {Array<RegExp | string>} regexes\n * @param {{key: \"beginScope\"|\"endScope\"}} opts\n */\nfunction remapScopeNames(mode, regexes, { key }) {\n  let offset = 0;\n  const scopeNames = mode[key];\n  /** @type Record<number,boolean> */\n  const emit = {};\n  /** @type Record<number,string> */\n  const positions = {};\n\n  for (let i = 1; i <= regexes.length; i++) {\n    positions[i + offset] = scopeNames[i];\n    emit[i + offset] = true;\n    offset += countMatchGroups(regexes[i - 1]);\n  }\n  // we use _emit to keep track of which match groups are \"top-level\" to avoid double\n  // output from inside match groups\n  mode[key] = positions;\n  mode[key]._emit = emit;\n  mode[key]._multi = true;\n}\n\n/**\n * @param {CompiledMode} mode\n */\nfunction beginMultiClass(mode) {\n  if (!Array.isArray(mode.begin)) return;\n\n  if (mode.skip || mode.excludeBegin || mode.returnBegin) {\n    error(\"skip, excludeBegin, returnBegin not compatible with beginScope: {}\");\n    throw MultiClassError;\n  }\n\n  if (typeof mode.beginScope !== \"object\" || mode.beginScope === null) {\n    error(\"beginScope must be object\");\n    throw MultiClassError;\n  }\n\n  remapScopeNames(mode, mode.begin, { key: \"beginScope\" });\n  mode.begin = _rewriteBackreferences(mode.begin, { joinWith: \"\" });\n}\n\n/**\n * @param {CompiledMode} mode\n */\nfunction endMultiClass(mode) {\n  if (!Array.isArray(mode.end)) return;\n\n  if (mode.skip || mode.excludeEnd || mode.returnEnd) {\n    error(\"skip, excludeEnd, returnEnd not compatible with endScope: {}\");\n    throw MultiClassError;\n  }\n\n  if (typeof mode.endScope !== \"object\" || mode.endScope === null) {\n    error(\"endScope must be object\");\n    throw MultiClassError;\n  }\n\n  remapScopeNames(mode, mode.end, { key: \"endScope\" });\n  mode.end = _rewriteBackreferences(mode.end, { joinWith: \"\" });\n}\n\n/**\n * this exists only to allow `scope: {}` to be used beside `match:`\n * Otherwise `beginScope` would necessary and that would look weird\n\n  {\n    match: [ /def/, /\\w+/ ]\n    scope: { 1: \"keyword\" , 2: \"title\" }\n  }\n\n * @param {CompiledMode} mode\n */\nfunction scopeSugar(mode) {\n  if (mode.scope && typeof mode.scope === \"object\" && mode.scope !== null) {\n    mode.beginScope = mode.scope;\n    delete mode.scope;\n  }\n}\n\n/**\n * @param {CompiledMode} mode\n */\nfunction MultiClass(mode) {\n  scopeSugar(mode);\n\n  if (typeof mode.beginScope === \"string\") {\n    mode.beginScope = { _wrap: mode.beginScope };\n  }\n  if (typeof mode.endScope === \"string\") {\n    mode.endScope = { _wrap: mode.endScope };\n  }\n\n  beginMultiClass(mode);\n  endMultiClass(mode);\n}\n\n/**\n@typedef {import('highlight.js').Mode} Mode\n@typedef {import('highlight.js').CompiledMode} CompiledMode\n@typedef {import('highlight.js').Language} Language\n@typedef {import('highlight.js').HLJSPlugin} HLJSPlugin\n@typedef {import('highlight.js').CompiledLanguage} CompiledLanguage\n*/\n\n// compilation\n\n/**\n * Compiles a language definition result\n *\n * Given the raw result of a language definition (Language), compiles this so\n * that it is ready for highlighting code.\n * @param {Language} language\n * @returns {CompiledLanguage}\n */\nfunction compileLanguage(language) {\n  /**\n   * Builds a regex with the case sensitivity of the current language\n   *\n   * @param {RegExp | string} value\n   * @param {boolean} [global]\n   */\n  function langRe(value, global) {\n    return new RegExp(\n      source(value),\n      'm'\n      + (language.case_insensitive ? 'i' : '')\n      + (language.unicodeRegex ? 'u' : '')\n      + (global ? 'g' : '')\n    );\n  }\n\n  /**\n    Stores multiple regular expressions and allows you to quickly search for\n    them all in a string simultaneously - returning the first match.  It does\n    this by creating a huge (a|b|c) regex - each individual item wrapped with ()\n    and joined by `|` - using match groups to track position.  When a match is\n    found checking which position in the array has content allows us to figure\n    out which of the original regexes / match groups triggered the match.\n\n    The match object itself (the result of `Regex.exec`) is returned but also\n    enhanced by merging in any meta-data that was registered with the regex.\n    This is how we keep track of which mode matched, and what type of rule\n    (`illegal`, `begin`, end, etc).\n  */\n  class MultiRegex {\n    constructor() {\n      this.matchIndexes = {};\n      // @ts-ignore\n      this.regexes = [];\n      this.matchAt = 1;\n      this.position = 0;\n    }\n\n    // @ts-ignore\n    addRule(re, opts) {\n      opts.position = this.position++;\n      // @ts-ignore\n      this.matchIndexes[this.matchAt] = opts;\n      this.regexes.push([opts, re]);\n      this.matchAt += countMatchGroups(re) + 1;\n    }\n\n    compile() {\n      if (this.regexes.length === 0) {\n        // avoids the need to check length every time exec is called\n        // @ts-ignore\n        this.exec = () => null;\n      }\n      const terminators = this.regexes.map(el => el[1]);\n      this.matcherRe = langRe(_rewriteBackreferences(terminators, { joinWith: '|' }), true);\n      this.lastIndex = 0;\n    }\n\n    /** @param {string} s */\n    exec(s) {\n      this.matcherRe.lastIndex = this.lastIndex;\n      const match = this.matcherRe.exec(s);\n      if (!match) { return null; }\n\n      // eslint-disable-next-line no-undefined\n      const i = match.findIndex((el, i) => i > 0 && el !== undefined);\n      // @ts-ignore\n      const matchData = this.matchIndexes[i];\n      // trim off any earlier non-relevant match groups (ie, the other regex\n      // match groups that make up the multi-matcher)\n      match.splice(0, i);\n\n      return Object.assign(match, matchData);\n    }\n  }\n\n  /*\n    Created to solve the key deficiently with MultiRegex - there is no way to\n    test for multiple matches at a single location.  Why would we need to do\n    that?  In the future a more dynamic engine will allow certain matches to be\n    ignored.  An example: if we matched say the 3rd regex in a large group but\n    decided to ignore it - we'd need to started testing again at the 4th\n    regex... but MultiRegex itself gives us no real way to do that.\n\n    So what this class creates MultiRegexs on the fly for whatever search\n    position they are needed.\n\n    NOTE: These additional MultiRegex objects are created dynamically.  For most\n    grammars most of the time we will never actually need anything more than the\n    first MultiRegex - so this shouldn't have too much overhead.\n\n    Say this is our search group, and we match regex3, but wish to ignore it.\n\n      regex1 | regex2 | regex3 | regex4 | regex5    ' ie, startAt = 0\n\n    What we need is a new MultiRegex that only includes the remaining\n    possibilities:\n\n      regex4 | regex5                               ' ie, startAt = 3\n\n    This class wraps all that complexity up in a simple API... `startAt` decides\n    where in the array of expressions to start doing the matching. It\n    auto-increments, so if a match is found at position 2, then startAt will be\n    set to 3.  If the end is reached startAt will return to 0.\n\n    MOST of the time the parser will be setting startAt manually to 0.\n  */\n  class ResumableMultiRegex {\n    constructor() {\n      // @ts-ignore\n      this.rules = [];\n      // @ts-ignore\n      this.multiRegexes = [];\n      this.count = 0;\n\n      this.lastIndex = 0;\n      this.regexIndex = 0;\n    }\n\n    // @ts-ignore\n    getMatcher(index) {\n      if (this.multiRegexes[index]) return this.multiRegexes[index];\n\n      const matcher = new MultiRegex();\n      this.rules.slice(index).forEach(([re, opts]) => matcher.addRule(re, opts));\n      matcher.compile();\n      this.multiRegexes[index] = matcher;\n      return matcher;\n    }\n\n    resumingScanAtSamePosition() {\n      return this.regexIndex !== 0;\n    }\n\n    considerAll() {\n      this.regexIndex = 0;\n    }\n\n    // @ts-ignore\n    addRule(re, opts) {\n      this.rules.push([re, opts]);\n      if (opts.type === \"begin\") this.count++;\n    }\n\n    /** @param {string} s */\n    exec(s) {\n      const m = this.getMatcher(this.regexIndex);\n      m.lastIndex = this.lastIndex;\n      let result = m.exec(s);\n\n      // The following is because we have no easy way to say \"resume scanning at the\n      // existing position but also skip the current rule ONLY\". What happens is\n      // all prior rules are also skipped which can result in matching the wrong\n      // thing. Example of matching \"booger\":\n\n      // our matcher is [string, \"booger\", number]\n      //\n      // ....booger....\n\n      // if \"booger\" is ignored then we'd really need a regex to scan from the\n      // SAME position for only: [string, number] but ignoring \"booger\" (if it\n      // was the first match), a simple resume would scan ahead who knows how\n      // far looking only for \"number\", ignoring potential string matches (or\n      // future \"booger\" matches that might be valid.)\n\n      // So what we do: We execute two matchers, one resuming at the same\n      // position, but the second full matcher starting at the position after:\n\n      //     /--- resume first regex match here (for [number])\n      //     |/---- full match here for [string, \"booger\", number]\n      //     vv\n      // ....booger....\n\n      // Which ever results in a match first is then used. So this 3-4 step\n      // process essentially allows us to say \"match at this position, excluding\n      // a prior rule that was ignored\".\n      //\n      // 1. Match \"booger\" first, ignore. Also proves that [string] does non match.\n      // 2. Resume matching for [number]\n      // 3. Match at index + 1 for [string, \"booger\", number]\n      // 4. If #2 and #3 result in matches, which came first?\n      if (this.resumingScanAtSamePosition()) {\n        if (result && result.index === this.lastIndex) ; else { // use the second matcher result\n          const m2 = this.getMatcher(0);\n          m2.lastIndex = this.lastIndex + 1;\n          result = m2.exec(s);\n        }\n      }\n\n      if (result) {\n        this.regexIndex += result.position + 1;\n        if (this.regexIndex === this.count) {\n          // wrap-around to considering all matches again\n          this.considerAll();\n        }\n      }\n\n      return result;\n    }\n  }\n\n  /**\n   * Given a mode, builds a huge ResumableMultiRegex that can be used to walk\n   * the content and find matches.\n   *\n   * @param {CompiledMode} mode\n   * @returns {ResumableMultiRegex}\n   */\n  function buildModeRegex(mode) {\n    const mm = new ResumableMultiRegex();\n\n    mode.contains.forEach(term => mm.addRule(term.begin, { rule: term, type: \"begin\" }));\n\n    if (mode.terminatorEnd) {\n      mm.addRule(mode.terminatorEnd, { type: \"end\" });\n    }\n    if (mode.illegal) {\n      mm.addRule(mode.illegal, { type: \"illegal\" });\n    }\n\n    return mm;\n  }\n\n  /** skip vs abort vs ignore\n   *\n   * @skip   - The mode is still entered and exited normally (and contains rules apply),\n   *           but all content is held and added to the parent buffer rather than being\n   *           output when the mode ends.  Mostly used with `sublanguage` to build up\n   *           a single large buffer than can be parsed by sublanguage.\n   *\n   *             - The mode begin ands ends normally.\n   *             - Content matched is added to the parent mode buffer.\n   *             - The parser cursor is moved forward normally.\n   *\n   * @abort  - A hack placeholder until we have ignore.  Aborts the mode (as if it\n   *           never matched) but DOES NOT continue to match subsequent `contains`\n   *           modes.  Abort is bad/suboptimal because it can result in modes\n   *           farther down not getting applied because an earlier rule eats the\n   *           content but then aborts.\n   *\n   *             - The mode does not begin.\n   *             - Content matched by `begin` is added to the mode buffer.\n   *             - The parser cursor is moved forward accordingly.\n   *\n   * @ignore - Ignores the mode (as if it never matched) and continues to match any\n   *           subsequent `contains` modes.  Ignore isn't technically possible with\n   *           the current parser implementation.\n   *\n   *             - The mode does not begin.\n   *             - Content matched by `begin` is ignored.\n   *             - The parser cursor is not moved forward.\n   */\n\n  /**\n   * Compiles an individual mode\n   *\n   * This can raise an error if the mode contains certain detectable known logic\n   * issues.\n   * @param {Mode} mode\n   * @param {CompiledMode | null} [parent]\n   * @returns {CompiledMode | never}\n   */\n  function compileMode(mode, parent) {\n    const cmode = /** @type CompiledMode */ (mode);\n    if (mode.isCompiled) return cmode;\n\n    [\n      scopeClassName,\n      // do this early so compiler extensions generally don't have to worry about\n      // the distinction between match/begin\n      compileMatch,\n      MultiClass,\n      beforeMatchExt\n    ].forEach(ext => ext(mode, parent));\n\n    language.compilerExtensions.forEach(ext => ext(mode, parent));\n\n    // __beforeBegin is considered private API, internal use only\n    mode.__beforeBegin = null;\n\n    [\n      beginKeywords,\n      // do this later so compiler extensions that come earlier have access to the\n      // raw array if they wanted to perhaps manipulate it, etc.\n      compileIllegal,\n      // default to 1 relevance if not specified\n      compileRelevance\n    ].forEach(ext => ext(mode, parent));\n\n    mode.isCompiled = true;\n\n    let keywordPattern = null;\n    if (typeof mode.keywords === \"object\" && mode.keywords.$pattern) {\n      // we need a copy because keywords might be compiled multiple times\n      // so we can't go deleting $pattern from the original on the first\n      // pass\n      mode.keywords = Object.assign({}, mode.keywords);\n      keywordPattern = mode.keywords.$pattern;\n      delete mode.keywords.$pattern;\n    }\n    keywordPattern = keywordPattern || /\\w+/;\n\n    if (mode.keywords) {\n      mode.keywords = compileKeywords(mode.keywords, language.case_insensitive);\n    }\n\n    cmode.keywordPatternRe = langRe(keywordPattern, true);\n\n    if (parent) {\n      if (!mode.begin) mode.begin = /\\B|\\b/;\n      cmode.beginRe = langRe(cmode.begin);\n      if (!mode.end && !mode.endsWithParent) mode.end = /\\B|\\b/;\n      if (mode.end) cmode.endRe = langRe(cmode.end);\n      cmode.terminatorEnd = source(cmode.end) || '';\n      if (mode.endsWithParent && parent.terminatorEnd) {\n        cmode.terminatorEnd += (mode.end ? '|' : '') + parent.terminatorEnd;\n      }\n    }\n    if (mode.illegal) cmode.illegalRe = langRe(/** @type {RegExp | string} */ (mode.illegal));\n    if (!mode.contains) mode.contains = [];\n\n    mode.contains = [].concat(...mode.contains.map(function(c) {\n      return expandOrCloneMode(c === 'self' ? mode : c);\n    }));\n    mode.contains.forEach(function(c) { compileMode(/** @type Mode */ (c), cmode); });\n\n    if (mode.starts) {\n      compileMode(mode.starts, parent);\n    }\n\n    cmode.matcher = buildModeRegex(cmode);\n    return cmode;\n  }\n\n  if (!language.compilerExtensions) language.compilerExtensions = [];\n\n  // self is not valid at the top-level\n  if (language.contains && language.contains.includes('self')) {\n    throw new Error(\"ERR: contains `self` is not supported at the top-level of a language.  See documentation.\");\n  }\n\n  // we need a null object, which inherit will guarantee\n  language.classNameAliases = inherit$1(language.classNameAliases || {});\n\n  return compileMode(/** @type Mode */ (language));\n}\n\n/**\n * Determines if a mode has a dependency on it's parent or not\n *\n * If a mode does have a parent dependency then often we need to clone it if\n * it's used in multiple places so that each copy points to the correct parent,\n * where-as modes without a parent can often safely be re-used at the bottom of\n * a mode chain.\n *\n * @param {Mode | null} mode\n * @returns {boolean} - is there a dependency on the parent?\n * */\nfunction dependencyOnParent(mode) {\n  if (!mode) return false;\n\n  return mode.endsWithParent || dependencyOnParent(mode.starts);\n}\n\n/**\n * Expands a mode or clones it if necessary\n *\n * This is necessary for modes with parental dependenceis (see notes on\n * `dependencyOnParent`) and for nodes that have `variants` - which must then be\n * exploded into their own individual modes at compile time.\n *\n * @param {Mode} mode\n * @returns {Mode | Mode[]}\n * */\nfunction expandOrCloneMode(mode) {\n  if (mode.variants && !mode.cachedVariants) {\n    mode.cachedVariants = mode.variants.map(function(variant) {\n      return inherit$1(mode, { variants: null }, variant);\n    });\n  }\n\n  // EXPAND\n  // if we have variants then essentially \"replace\" the mode with the variants\n  // this happens in compileMode, where this function is called from\n  if (mode.cachedVariants) {\n    return mode.cachedVariants;\n  }\n\n  // CLONE\n  // if we have dependencies on parents then we need a unique\n  // instance of ourselves, so we can be reused with many\n  // different parents without issue\n  if (dependencyOnParent(mode)) {\n    return inherit$1(mode, { starts: mode.starts ? inherit$1(mode.starts) : null });\n  }\n\n  if (Object.isFrozen(mode)) {\n    return inherit$1(mode);\n  }\n\n  // no special dependency issues, just return ourselves\n  return mode;\n}\n\nvar version = \"11.11.1\";\n\nclass HTMLInjectionError extends Error {\n  constructor(reason, html) {\n    super(reason);\n    this.name = \"HTMLInjectionError\";\n    this.html = html;\n  }\n}\n\n/*\nSyntax highlighting with language autodetection.\nhttps://highlightjs.org/\n*/\n\n\n\n/**\n@typedef {import('highlight.js').Mode} Mode\n@typedef {import('highlight.js').CompiledMode} CompiledMode\n@typedef {import('highlight.js').CompiledScope} CompiledScope\n@typedef {import('highlight.js').Language} Language\n@typedef {import('highlight.js').HLJSApi} HLJSApi\n@typedef {import('highlight.js').HLJSPlugin} HLJSPlugin\n@typedef {import('highlight.js').PluginEvent} PluginEvent\n@typedef {import('highlight.js').HLJSOptions} HLJSOptions\n@typedef {import('highlight.js').LanguageFn} LanguageFn\n@typedef {import('highlight.js').HighlightedHTMLElement} HighlightedHTMLElement\n@typedef {import('highlight.js').BeforeHighlightContext} BeforeHighlightContext\n@typedef {import('highlight.js/private').MatchType} MatchType\n@typedef {import('highlight.js/private').KeywordData} KeywordData\n@typedef {import('highlight.js/private').EnhancedMatch} EnhancedMatch\n@typedef {import('highlight.js/private').AnnotatedError} AnnotatedError\n@typedef {import('highlight.js').AutoHighlightResult} AutoHighlightResult\n@typedef {import('highlight.js').HighlightOptions} HighlightOptions\n@typedef {import('highlight.js').HighlightResult} HighlightResult\n*/\n\n\nconst escape = escapeHTML;\nconst inherit = inherit$1;\nconst NO_MATCH = Symbol(\"nomatch\");\nconst MAX_KEYWORD_HITS = 7;\n\n/**\n * @param {any} hljs - object that is extended (legacy)\n * @returns {HLJSApi}\n */\nconst HLJS = function(hljs) {\n  // Global internal variables used within the highlight.js library.\n  /** @type {Record<string, Language>} */\n  const languages = Object.create(null);\n  /** @type {Record<string, string>} */\n  const aliases = Object.create(null);\n  /** @type {HLJSPlugin[]} */\n  const plugins = [];\n\n  // safe/production mode - swallows more errors, tries to keep running\n  // even if a single syntax or parse hits a fatal error\n  let SAFE_MODE = true;\n  const LANGUAGE_NOT_FOUND = \"Could not find the language '{}', did you forget to load/include a language module?\";\n  /** @type {Language} */\n  const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: 'Plain text', contains: [] };\n\n  // Global options used when within external APIs. This is modified when\n  // calling the `hljs.configure` function.\n  /** @type HLJSOptions */\n  let options = {\n    ignoreUnescapedHTML: false,\n    throwUnescapedHTML: false,\n    noHighlightRe: /^(no-?highlight)$/i,\n    languageDetectRe: /\\blang(?:uage)?-([\\w-]+)\\b/i,\n    classPrefix: 'hljs-',\n    cssSelector: 'pre code',\n    languages: null,\n    // beta configuration options, subject to change, welcome to discuss\n    // https://github.com/highlightjs/highlight.js/issues/1086\n    __emitter: TokenTreeEmitter\n  };\n\n  /* Utility functions */\n\n  /**\n   * Tests a language name to see if highlighting should be skipped\n   * @param {string} languageName\n   */\n  function shouldNotHighlight(languageName) {\n    return options.noHighlightRe.test(languageName);\n  }\n\n  /**\n   * @param {HighlightedHTMLElement} block - the HTML element to determine language for\n   */\n  function blockLanguage(block) {\n    let classes = block.className + ' ';\n\n    classes += block.parentNode ? block.parentNode.className : '';\n\n    // language-* takes precedence over non-prefixed class names.\n    const match = options.languageDetectRe.exec(classes);\n    if (match) {\n      const language = getLanguage(match[1]);\n      if (!language) {\n        warn(LANGUAGE_NOT_FOUND.replace(\"{}\", match[1]));\n        warn(\"Falling back to no-highlight mode for this block.\", block);\n      }\n      return language ? match[1] : 'no-highlight';\n    }\n\n    return classes\n      .split(/\\s+/)\n      .find((_class) => shouldNotHighlight(_class) || getLanguage(_class));\n  }\n\n  /**\n   * Core highlighting function.\n   *\n   * OLD API\n   * highlight(lang, code, ignoreIllegals, continuation)\n   *\n   * NEW API\n   * highlight(code, {lang, ignoreIllegals})\n   *\n   * @param {string} codeOrLanguageName - the language to use for highlighting\n   * @param {string | HighlightOptions} optionsOrCode - the code to highlight\n   * @param {boolean} [ignoreIllegals] - whether to ignore illegal matches, default is to bail\n   *\n   * @returns {HighlightResult} Result - an object that represents the result\n   * @property {string} language - the language name\n   * @property {number} relevance - the relevance score\n   * @property {string} value - the highlighted HTML code\n   * @property {string} code - the original raw code\n   * @property {CompiledMode} top - top of the current mode stack\n   * @property {boolean} illegal - indicates whether any illegal matches were found\n  */\n  function highlight(codeOrLanguageName, optionsOrCode, ignoreIllegals) {\n    let code = \"\";\n    let languageName = \"\";\n    if (typeof optionsOrCode === \"object\") {\n      code = codeOrLanguageName;\n      ignoreIllegals = optionsOrCode.ignoreIllegals;\n      languageName = optionsOrCode.language;\n    } else {\n      // old API\n      deprecated(\"10.7.0\", \"highlight(lang, code, ...args) has been deprecated.\");\n      deprecated(\"10.7.0\", \"Please use highlight(code, options) instead.\\nhttps://github.com/highlightjs/highlight.js/issues/2277\");\n      languageName = codeOrLanguageName;\n      code = optionsOrCode;\n    }\n\n    // https://github.com/highlightjs/highlight.js/issues/3149\n    // eslint-disable-next-line no-undefined\n    if (ignoreIllegals === undefined) { ignoreIllegals = true; }\n\n    /** @type {BeforeHighlightContext} */\n    const context = {\n      code,\n      language: languageName\n    };\n    // the plugin can change the desired language or the code to be highlighted\n    // just be changing the object it was passed\n    fire(\"before:highlight\", context);\n\n    // a before plugin can usurp the result completely by providing it's own\n    // in which case we don't even need to call highlight\n    const result = context.result\n      ? context.result\n      : _highlight(context.language, context.code, ignoreIllegals);\n\n    result.code = context.code;\n    // the plugin can change anything in result to suite it\n    fire(\"after:highlight\", result);\n\n    return result;\n  }\n\n  /**\n   * private highlight that's used internally and does not fire callbacks\n   *\n   * @param {string} languageName - the language to use for highlighting\n   * @param {string} codeToHighlight - the code to highlight\n   * @param {boolean?} [ignoreIllegals] - whether to ignore illegal matches, default is to bail\n   * @param {CompiledMode?} [continuation] - current continuation mode, if any\n   * @returns {HighlightResult} - result of the highlight operation\n  */\n  function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) {\n    const keywordHits = Object.create(null);\n\n    /**\n     * Return keyword data if a match is a keyword\n     * @param {CompiledMode} mode - current mode\n     * @param {string} matchText - the textual match\n     * @returns {KeywordData | false}\n     */\n    function keywordData(mode, matchText) {\n      return mode.keywords[matchText];\n    }\n\n    function processKeywords() {\n      if (!top.keywords) {\n        emitter.addText(modeBuffer);\n        return;\n      }\n\n      let lastIndex = 0;\n      top.keywordPatternRe.lastIndex = 0;\n      let match = top.keywordPatternRe.exec(modeBuffer);\n      let buf = \"\";\n\n      while (match) {\n        buf += modeBuffer.substring(lastIndex, match.index);\n        const word = language.case_insensitive ? match[0].toLowerCase() : match[0];\n        const data = keywordData(top, word);\n        if (data) {\n          const [kind, keywordRelevance] = data;\n          emitter.addText(buf);\n          buf = \"\";\n\n          keywordHits[word] = (keywordHits[word] || 0) + 1;\n          if (keywordHits[word] <= MAX_KEYWORD_HITS) relevance += keywordRelevance;\n          if (kind.startsWith(\"_\")) {\n            // _ implied for relevance only, do not highlight\n            // by applying a class name\n            buf += match[0];\n          } else {\n            const cssClass = language.classNameAliases[kind] || kind;\n            emitKeyword(match[0], cssClass);\n          }\n        } else {\n          buf += match[0];\n        }\n        lastIndex = top.keywordPatternRe.lastIndex;\n        match = top.keywordPatternRe.exec(modeBuffer);\n      }\n      buf += modeBuffer.substring(lastIndex);\n      emitter.addText(buf);\n    }\n\n    function processSubLanguage() {\n      if (modeBuffer === \"\") return;\n      /** @type HighlightResult */\n      let result = null;\n\n      if (typeof top.subLanguage === 'string') {\n        if (!languages[top.subLanguage]) {\n          emitter.addText(modeBuffer);\n          return;\n        }\n        result = _highlight(top.subLanguage, modeBuffer, true, continuations[top.subLanguage]);\n        continuations[top.subLanguage] = /** @type {CompiledMode} */ (result._top);\n      } else {\n        result = highlightAuto(modeBuffer, top.subLanguage.length ? top.subLanguage : null);\n      }\n\n      // Counting embedded language score towards the host language may be disabled\n      // with zeroing the containing mode relevance. Use case in point is Markdown that\n      // allows XML everywhere and makes every XML snippet to have a much larger Markdown\n      // score.\n      if (top.relevance > 0) {\n        relevance += result.relevance;\n      }\n      emitter.__addSublanguage(result._emitter, result.language);\n    }\n\n    function processBuffer() {\n      if (top.subLanguage != null) {\n        processSubLanguage();\n      } else {\n        processKeywords();\n      }\n      modeBuffer = '';\n    }\n\n    /**\n     * @param {string} text\n     * @param {string} scope\n     */\n    function emitKeyword(keyword, scope) {\n      if (keyword === \"\") return;\n\n      emitter.startScope(scope);\n      emitter.addText(keyword);\n      emitter.endScope();\n    }\n\n    /**\n     * @param {CompiledScope} scope\n     * @param {RegExpMatchArray} match\n     */\n    function emitMultiClass(scope, match) {\n      let i = 1;\n      const max = match.length - 1;\n      while (i <= max) {\n        if (!scope._emit[i]) { i++; continue; }\n        const klass = language.classNameAliases[scope[i]] || scope[i];\n        const text = match[i];\n        if (klass) {\n          emitKeyword(text, klass);\n        } else {\n          modeBuffer = text;\n          processKeywords();\n          modeBuffer = \"\";\n        }\n        i++;\n      }\n    }\n\n    /**\n     * @param {CompiledMode} mode - new mode to start\n     * @param {RegExpMatchArray} match\n     */\n    function startNewMode(mode, match) {\n      if (mode.scope && typeof mode.scope === \"string\") {\n        emitter.openNode(language.classNameAliases[mode.scope] || mode.scope);\n      }\n      if (mode.beginScope) {\n        // beginScope just wraps the begin match itself in a scope\n        if (mode.beginScope._wrap) {\n          emitKeyword(modeBuffer, language.classNameAliases[mode.beginScope._wrap] || mode.beginScope._wrap);\n          modeBuffer = \"\";\n        } else if (mode.beginScope._multi) {\n          // at this point modeBuffer should just be the match\n          emitMultiClass(mode.beginScope, match);\n          modeBuffer = \"\";\n        }\n      }\n\n      top = Object.create(mode, { parent: { value: top } });\n      return top;\n    }\n\n    /**\n     * @param {CompiledMode } mode - the mode to potentially end\n     * @param {RegExpMatchArray} match - the latest match\n     * @param {string} matchPlusRemainder - match plus remainder of content\n     * @returns {CompiledMode | void} - the next mode, or if void continue on in current mode\n     */\n    function endOfMode(mode, match, matchPlusRemainder) {\n      let matched = startsWith(mode.endRe, matchPlusRemainder);\n\n      if (matched) {\n        if (mode[\"on:end\"]) {\n          const resp = new Response(mode);\n          mode[\"on:end\"](match, resp);\n          if (resp.isMatchIgnored) matched = false;\n        }\n\n        if (matched) {\n          while (mode.endsParent && mode.parent) {\n            mode = mode.parent;\n          }\n          return mode;\n        }\n      }\n      // even if on:end fires an `ignore` it's still possible\n      // that we might trigger the end node because of a parent mode\n      if (mode.endsWithParent) {\n        return endOfMode(mode.parent, match, matchPlusRemainder);\n      }\n    }\n\n    /**\n     * Handle matching but then ignoring a sequence of text\n     *\n     * @param {string} lexeme - string containing full match text\n     */\n    function doIgnore(lexeme) {\n      if (top.matcher.regexIndex === 0) {\n        // no more regexes to potentially match here, so we move the cursor forward one\n        // space\n        modeBuffer += lexeme[0];\n        return 1;\n      } else {\n        // no need to move the cursor, we still have additional regexes to try and\n        // match at this very spot\n        resumeScanAtSamePosition = true;\n        return 0;\n      }\n    }\n\n    /**\n     * Handle the start of a new potential mode match\n     *\n     * @param {EnhancedMatch} match - the current match\n     * @returns {number} how far to advance the parse cursor\n     */\n    function doBeginMatch(match) {\n      const lexeme = match[0];\n      const newMode = match.rule;\n\n      const resp = new Response(newMode);\n      // first internal before callbacks, then the public ones\n      const beforeCallbacks = [newMode.__beforeBegin, newMode[\"on:begin\"]];\n      for (const cb of beforeCallbacks) {\n        if (!cb) continue;\n        cb(match, resp);\n        if (resp.isMatchIgnored) return doIgnore(lexeme);\n      }\n\n      if (newMode.skip) {\n        modeBuffer += lexeme;\n      } else {\n        if (newMode.excludeBegin) {\n          modeBuffer += lexeme;\n        }\n        processBuffer();\n        if (!newMode.returnBegin && !newMode.excludeBegin) {\n          modeBuffer = lexeme;\n        }\n      }\n      startNewMode(newMode, match);\n      return newMode.returnBegin ? 0 : lexeme.length;\n    }\n\n    /**\n     * Handle the potential end of mode\n     *\n     * @param {RegExpMatchArray} match - the current match\n     */\n    function doEndMatch(match) {\n      const lexeme = match[0];\n      const matchPlusRemainder = codeToHighlight.substring(match.index);\n\n      const endMode = endOfMode(top, match, matchPlusRemainder);\n      if (!endMode) { return NO_MATCH; }\n\n      const origin = top;\n      if (top.endScope && top.endScope._wrap) {\n        processBuffer();\n        emitKeyword(lexeme, top.endScope._wrap);\n      } else if (top.endScope && top.endScope._multi) {\n        processBuffer();\n        emitMultiClass(top.endScope, match);\n      } else if (origin.skip) {\n        modeBuffer += lexeme;\n      } else {\n        if (!(origin.returnEnd || origin.excludeEnd)) {\n          modeBuffer += lexeme;\n        }\n        processBuffer();\n        if (origin.excludeEnd) {\n          modeBuffer = lexeme;\n        }\n      }\n      do {\n        if (top.scope) {\n          emitter.closeNode();\n        }\n        if (!top.skip && !top.subLanguage) {\n          relevance += top.relevance;\n        }\n        top = top.parent;\n      } while (top !== endMode.parent);\n      if (endMode.starts) {\n        startNewMode(endMode.starts, match);\n      }\n      return origin.returnEnd ? 0 : lexeme.length;\n    }\n\n    function processContinuations() {\n      const list = [];\n      for (let current = top; current !== language; current = current.parent) {\n        if (current.scope) {\n          list.unshift(current.scope);\n        }\n      }\n      list.forEach(item => emitter.openNode(item));\n    }\n\n    /** @type {{type?: MatchType, index?: number, rule?: Mode}}} */\n    let lastMatch = {};\n\n    /**\n     *  Process an individual match\n     *\n     * @param {string} textBeforeMatch - text preceding the match (since the last match)\n     * @param {EnhancedMatch} [match] - the match itself\n     */\n    function processLexeme(textBeforeMatch, match) {\n      const lexeme = match && match[0];\n\n      // add non-matched text to the current mode buffer\n      modeBuffer += textBeforeMatch;\n\n      if (lexeme == null) {\n        processBuffer();\n        return 0;\n      }\n\n      // we've found a 0 width match and we're stuck, so we need to advance\n      // this happens when we have badly behaved rules that have optional matchers to the degree that\n      // sometimes they can end up matching nothing at all\n      // Ref: https://github.com/highlightjs/highlight.js/issues/2140\n      if (lastMatch.type === \"begin\" && match.type === \"end\" && lastMatch.index === match.index && lexeme === \"\") {\n        // spit the \"skipped\" character that our regex choked on back into the output sequence\n        modeBuffer += codeToHighlight.slice(match.index, match.index + 1);\n        if (!SAFE_MODE) {\n          /** @type {AnnotatedError} */\n          const err = new Error(`0 width match regex (${languageName})`);\n          err.languageName = languageName;\n          err.badRule = lastMatch.rule;\n          throw err;\n        }\n        return 1;\n      }\n      lastMatch = match;\n\n      if (match.type === \"begin\") {\n        return doBeginMatch(match);\n      } else if (match.type === \"illegal\" && !ignoreIllegals) {\n        // illegal match, we do not continue processing\n        /** @type {AnnotatedError} */\n        const err = new Error('Illegal lexeme \"' + lexeme + '\" for mode \"' + (top.scope || '<unnamed>') + '\"');\n        err.mode = top;\n        throw err;\n      } else if (match.type === \"end\") {\n        const processed = doEndMatch(match);\n        if (processed !== NO_MATCH) {\n          return processed;\n        }\n      }\n\n      // edge case for when illegal matches $ (end of line) which is technically\n      // a 0 width match but not a begin/end match so it's not caught by the\n      // first handler (when ignoreIllegals is true)\n      if (match.type === \"illegal\" && lexeme === \"\") {\n        // advance so we aren't stuck in an infinite loop\n        modeBuffer += \"\\n\";\n        return 1;\n      }\n\n      // infinite loops are BAD, this is a last ditch catch all. if we have a\n      // decent number of iterations yet our index (cursor position in our\n      // parsing) still 3x behind our index then something is very wrong\n      // so we bail\n      if (iterations > 100000 && iterations > match.index * 3) {\n        const err = new Error('potential infinite loop, way more iterations than matches');\n        throw err;\n      }\n\n      /*\n      Why might be find ourselves here?  An potential end match that was\n      triggered but could not be completed.  IE, `doEndMatch` returned NO_MATCH.\n      (this could be because a callback requests the match be ignored, etc)\n\n      This causes no real harm other than stopping a few times too many.\n      */\n\n      modeBuffer += lexeme;\n      return lexeme.length;\n    }\n\n    const language = getLanguage(languageName);\n    if (!language) {\n      error(LANGUAGE_NOT_FOUND.replace(\"{}\", languageName));\n      throw new Error('Unknown language: \"' + languageName + '\"');\n    }\n\n    const md = compileLanguage(language);\n    let result = '';\n    /** @type {CompiledMode} */\n    let top = continuation || md;\n    /** @type Record<string,CompiledMode> */\n    const continuations = {}; // keep continuations for sub-languages\n    const emitter = new options.__emitter(options);\n    processContinuations();\n    let modeBuffer = '';\n    let relevance = 0;\n    let index = 0;\n    let iterations = 0;\n    let resumeScanAtSamePosition = false;\n\n    try {\n      if (!language.__emitTokens) {\n        top.matcher.considerAll();\n\n        for (;;) {\n          iterations++;\n          if (resumeScanAtSamePosition) {\n            // only regexes not matched previously will now be\n            // considered for a potential match\n            resumeScanAtSamePosition = false;\n          } else {\n            top.matcher.considerAll();\n          }\n          top.matcher.lastIndex = index;\n\n          const match = top.matcher.exec(codeToHighlight);\n          // console.log(\"match\", match[0], match.rule && match.rule.begin)\n\n          if (!match) break;\n\n          const beforeMatch = codeToHighlight.substring(index, match.index);\n          const processedCount = processLexeme(beforeMatch, match);\n          index = match.index + processedCount;\n        }\n        processLexeme(codeToHighlight.substring(index));\n      } else {\n        language.__emitTokens(codeToHighlight, emitter);\n      }\n\n      emitter.finalize();\n      result = emitter.toHTML();\n\n      return {\n        language: languageName,\n        value: result,\n        relevance,\n        illegal: false,\n        _emitter: emitter,\n        _top: top\n      };\n    } catch (err) {\n      if (err.message && err.message.includes('Illegal')) {\n        return {\n          language: languageName,\n          value: escape(codeToHighlight),\n          illegal: true,\n          relevance: 0,\n          _illegalBy: {\n            message: err.message,\n            index,\n            context: codeToHighlight.slice(index - 100, index + 100),\n            mode: err.mode,\n            resultSoFar: result\n          },\n          _emitter: emitter\n        };\n      } else if (SAFE_MODE) {\n        return {\n          language: languageName,\n          value: escape(codeToHighlight),\n          illegal: false,\n          relevance: 0,\n          errorRaised: err,\n          _emitter: emitter,\n          _top: top\n        };\n      } else {\n        throw err;\n      }\n    }\n  }\n\n  /**\n   * returns a valid highlight result, without actually doing any actual work,\n   * auto highlight starts with this and it's possible for small snippets that\n   * auto-detection may not find a better match\n   * @param {string} code\n   * @returns {HighlightResult}\n   */\n  function justTextHighlightResult(code) {\n    const result = {\n      value: escape(code),\n      illegal: false,\n      relevance: 0,\n      _top: PLAINTEXT_LANGUAGE,\n      _emitter: new options.__emitter(options)\n    };\n    result._emitter.addText(code);\n    return result;\n  }\n\n  /**\n  Highlighting with language detection. Accepts a string with the code to\n  highlight. Returns an object with the following properties:\n\n  - language (detected language)\n  - relevance (int)\n  - value (an HTML string with highlighting markup)\n  - secondBest (object with the same structure for second-best heuristically\n    detected language, may be absent)\n\n    @param {string} code\n    @param {Array<string>} [languageSubset]\n    @returns {AutoHighlightResult}\n  */\n  function highlightAuto(code, languageSubset) {\n    languageSubset = languageSubset || options.languages || Object.keys(languages);\n    const plaintext = justTextHighlightResult(code);\n\n    const results = languageSubset.filter(getLanguage).filter(autoDetection).map(name =>\n      _highlight(name, code, false)\n    );\n    results.unshift(plaintext); // plaintext is always an option\n\n    const sorted = results.sort((a, b) => {\n      // sort base on relevance\n      if (a.relevance !== b.relevance) return b.relevance - a.relevance;\n\n      // always award the tie to the base language\n      // ie if C++ and Arduino are tied, it's more likely to be C++\n      if (a.language && b.language) {\n        if (getLanguage(a.language).supersetOf === b.language) {\n          return 1;\n        } else if (getLanguage(b.language).supersetOf === a.language) {\n          return -1;\n        }\n      }\n\n      // otherwise say they are equal, which has the effect of sorting on\n      // relevance while preserving the original ordering - which is how ties\n      // have historically been settled, ie the language that comes first always\n      // wins in the case of a tie\n      return 0;\n    });\n\n    const [best, secondBest] = sorted;\n\n    /** @type {AutoHighlightResult} */\n    const result = best;\n    result.secondBest = secondBest;\n\n    return result;\n  }\n\n  /**\n   * Builds new class name for block given the language name\n   *\n   * @param {HTMLElement} element\n   * @param {string} [currentLang]\n   * @param {string} [resultLang]\n   */\n  function updateClassName(element, currentLang, resultLang) {\n    const language = (currentLang && aliases[currentLang]) || resultLang;\n\n    element.classList.add(\"hljs\");\n    element.classList.add(`language-${language}`);\n  }\n\n  /**\n   * Applies highlighting to a DOM node containing code.\n   *\n   * @param {HighlightedHTMLElement} element - the HTML element to highlight\n  */\n  function highlightElement(element) {\n    /** @type HTMLElement */\n    let node = null;\n    const language = blockLanguage(element);\n\n    if (shouldNotHighlight(language)) return;\n\n    fire(\"before:highlightElement\",\n      { el: element, language });\n\n    if (element.dataset.highlighted) {\n      console.log(\"Element previously highlighted. To highlight again, first unset `dataset.highlighted`.\", element);\n      return;\n    }\n\n    // we should be all text, no child nodes (unescaped HTML) - this is possibly\n    // an HTML injection attack - it's likely too late if this is already in\n    // production (the code has likely already done its damage by the time\n    // we're seeing it)... but we yell loudly about this so that hopefully it's\n    // more likely to be caught in development before making it to production\n    if (element.children.length > 0) {\n      if (!options.ignoreUnescapedHTML) {\n        console.warn(\"One of your code blocks includes unescaped HTML. This is a potentially serious security risk.\");\n        console.warn(\"https://github.com/highlightjs/highlight.js/wiki/security\");\n        console.warn(\"The element with unescaped HTML:\");\n        console.warn(element);\n      }\n      if (options.throwUnescapedHTML) {\n        const err = new HTMLInjectionError(\n          \"One of your code blocks includes unescaped HTML.\",\n          element.innerHTML\n        );\n        throw err;\n      }\n    }\n\n    node = element;\n    const text = node.textContent;\n    const result = language ? highlight(text, { language, ignoreIllegals: true }) : highlightAuto(text);\n\n    element.innerHTML = result.value;\n    element.dataset.highlighted = \"yes\";\n    updateClassName(element, language, result.language);\n    element.result = {\n      language: result.language,\n      // TODO: remove with version 11.0\n      re: result.relevance,\n      relevance: result.relevance\n    };\n    if (result.secondBest) {\n      element.secondBest = {\n        language: result.secondBest.language,\n        relevance: result.secondBest.relevance\n      };\n    }\n\n    fire(\"after:highlightElement\", { el: element, result, text });\n  }\n\n  /**\n   * Updates highlight.js global options with the passed options\n   *\n   * @param {Partial<HLJSOptions>} userOptions\n   */\n  function configure(userOptions) {\n    options = inherit(options, userOptions);\n  }\n\n  // TODO: remove v12, deprecated\n  const initHighlighting = () => {\n    highlightAll();\n    deprecated(\"10.6.0\", \"initHighlighting() deprecated.  Use highlightAll() now.\");\n  };\n\n  // TODO: remove v12, deprecated\n  function initHighlightingOnLoad() {\n    highlightAll();\n    deprecated(\"10.6.0\", \"initHighlightingOnLoad() deprecated.  Use highlightAll() now.\");\n  }\n\n  let wantsHighlight = false;\n\n  /**\n   * auto-highlights all pre>code elements on the page\n   */\n  function highlightAll() {\n    function boot() {\n      // if a highlight was requested before DOM was loaded, do now\n      highlightAll();\n    }\n\n    // if we are called too early in the loading process\n    if (document.readyState === \"loading\") {\n      // make sure the event listener is only added once\n      if (!wantsHighlight) {\n        window.addEventListener('DOMContentLoaded', boot, false);\n      }\n      wantsHighlight = true;\n      return;\n    }\n\n    const blocks = document.querySelectorAll(options.cssSelector);\n    blocks.forEach(highlightElement);\n  }\n\n  /**\n   * Register a language grammar module\n   *\n   * @param {string} languageName\n   * @param {LanguageFn} languageDefinition\n   */\n  function registerLanguage(languageName, languageDefinition) {\n    let lang = null;\n    try {\n      lang = languageDefinition(hljs);\n    } catch (error$1) {\n      error(\"Language definition for '{}' could not be registered.\".replace(\"{}\", languageName));\n      // hard or soft error\n      if (!SAFE_MODE) { throw error$1; } else { error(error$1); }\n      // languages that have serious errors are replaced with essentially a\n      // \"plaintext\" stand-in so that the code blocks will still get normal\n      // css classes applied to them - and one bad language won't break the\n      // entire highlighter\n      lang = PLAINTEXT_LANGUAGE;\n    }\n    // give it a temporary name if it doesn't have one in the meta-data\n    if (!lang.name) lang.name = languageName;\n    languages[languageName] = lang;\n    lang.rawDefinition = languageDefinition.bind(null, hljs);\n\n    if (lang.aliases) {\n      registerAliases(lang.aliases, { languageName });\n    }\n  }\n\n  /**\n   * Remove a language grammar module\n   *\n   * @param {string} languageName\n   */\n  function unregisterLanguage(languageName) {\n    delete languages[languageName];\n    for (const alias of Object.keys(aliases)) {\n      if (aliases[alias] === languageName) {\n        delete aliases[alias];\n      }\n    }\n  }\n\n  /**\n   * @returns {string[]} List of language internal names\n   */\n  function listLanguages() {\n    return Object.keys(languages);\n  }\n\n  /**\n   * @param {string} name - name of the language to retrieve\n   * @returns {Language | undefined}\n   */\n  function getLanguage(name) {\n    name = (name || '').toLowerCase();\n    return languages[name] || languages[aliases[name]];\n  }\n\n  /**\n   *\n   * @param {string|string[]} aliasList - single alias or list of aliases\n   * @param {{languageName: string}} opts\n   */\n  function registerAliases(aliasList, { languageName }) {\n    if (typeof aliasList === 'string') {\n      aliasList = [aliasList];\n    }\n    aliasList.forEach(alias => { aliases[alias.toLowerCase()] = languageName; });\n  }\n\n  /**\n   * Determines if a given language has auto-detection enabled\n   * @param {string} name - name of the language\n   */\n  function autoDetection(name) {\n    const lang = getLanguage(name);\n    return lang && !lang.disableAutodetect;\n  }\n\n  /**\n   * Upgrades the old highlightBlock plugins to the new\n   * highlightElement API\n   * @param {HLJSPlugin} plugin\n   */\n  function upgradePluginAPI(plugin) {\n    // TODO: remove with v12\n    if (plugin[\"before:highlightBlock\"] && !plugin[\"before:highlightElement\"]) {\n      plugin[\"before:highlightElement\"] = (data) => {\n        plugin[\"before:highlightBlock\"](\n          Object.assign({ block: data.el }, data)\n        );\n      };\n    }\n    if (plugin[\"after:highlightBlock\"] && !plugin[\"after:highlightElement\"]) {\n      plugin[\"after:highlightElement\"] = (data) => {\n        plugin[\"after:highlightBlock\"](\n          Object.assign({ block: data.el }, data)\n        );\n      };\n    }\n  }\n\n  /**\n   * @param {HLJSPlugin} plugin\n   */\n  function addPlugin(plugin) {\n    upgradePluginAPI(plugin);\n    plugins.push(plugin);\n  }\n\n  /**\n   * @param {HLJSPlugin} plugin\n   */\n  function removePlugin(plugin) {\n    const index = plugins.indexOf(plugin);\n    if (index !== -1) {\n      plugins.splice(index, 1);\n    }\n  }\n\n  /**\n   *\n   * @param {PluginEvent} event\n   * @param {any} args\n   */\n  function fire(event, args) {\n    const cb = event;\n    plugins.forEach(function(plugin) {\n      if (plugin[cb]) {\n        plugin[cb](args);\n      }\n    });\n  }\n\n  /**\n   * DEPRECATED\n   * @param {HighlightedHTMLElement} el\n   */\n  function deprecateHighlightBlock(el) {\n    deprecated(\"10.7.0\", \"highlightBlock will be removed entirely in v12.0\");\n    deprecated(\"10.7.0\", \"Please use highlightElement now.\");\n\n    return highlightElement(el);\n  }\n\n  /* Interface definition */\n  Object.assign(hljs, {\n    highlight,\n    highlightAuto,\n    highlightAll,\n    highlightElement,\n    // TODO: Remove with v12 API\n    highlightBlock: deprecateHighlightBlock,\n    configure,\n    initHighlighting,\n    initHighlightingOnLoad,\n    registerLanguage,\n    unregisterLanguage,\n    listLanguages,\n    getLanguage,\n    registerAliases,\n    autoDetection,\n    inherit,\n    addPlugin,\n    removePlugin\n  });\n\n  hljs.debugMode = function() { SAFE_MODE = false; };\n  hljs.safeMode = function() { SAFE_MODE = true; };\n  hljs.versionString = version;\n\n  hljs.regex = {\n    concat: concat,\n    lookahead: lookahead,\n    either: either,\n    optional: optional,\n    anyNumberOfTimes: anyNumberOfTimes\n  };\n\n  for (const key in MODES) {\n    // @ts-ignore\n    if (typeof MODES[key] === \"object\") {\n      // @ts-ignore\n      deepFreeze(MODES[key]);\n    }\n  }\n\n  // merge all the modes/regexes into our main object\n  Object.assign(hljs, MODES);\n\n  return hljs;\n};\n\n// Other names for the variable may break build script\nconst highlight = HLJS({});\n\n// returns a new instance of the highlighter to be used for extensions\n// check https://github.com/wooorm/lowlight/issues/47\nhighlight.newInstance = () => HLJS({});\n\nmodule.exports = highlight;\nhighlight.HighlightJS = highlight;\nhighlight.default = highlight;\n","/*\nLanguage: HTML, XML\nWebsite: https://www.w3.org/XML/\nCategory: common, web\nAudit: 2020\n*/\n\n/** @type LanguageFn */\nfunction xml(hljs) {\n  const regex = hljs.regex;\n  // XML names can have the following additional letters: https://www.w3.org/TR/xml/#NT-NameChar\n  // OTHER_NAME_CHARS = /[:\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]/;\n  // Element names start with NAME_START_CHAR followed by optional other Unicode letters, ASCII digits, hyphens, underscores, and periods\n  // const TAG_NAME_RE = regex.concat(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/, regex.optional(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*:/), /[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*/);;\n  // const XML_IDENT_RE = /[A-Z_a-z:\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]+/;\n  // const TAG_NAME_RE = regex.concat(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/, regex.optional(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*:/), /[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*/);\n  // however, to cater for performance and more Unicode support rely simply on the Unicode letter class\n  const TAG_NAME_RE = regex.concat(/[\\p{L}_]/u, regex.optional(/[\\p{L}0-9_.-]*:/u), /[\\p{L}0-9_.-]*/u);\n  const XML_IDENT_RE = /[\\p{L}0-9._:-]+/u;\n  const XML_ENTITIES = {\n    className: 'symbol',\n    begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/\n  };\n  const XML_META_KEYWORDS = {\n    begin: /\\s/,\n    contains: [\n      {\n        className: 'keyword',\n        begin: /#?[a-z_][a-z1-9_-]+/,\n        illegal: /\\n/\n      }\n    ]\n  };\n  const XML_META_PAR_KEYWORDS = hljs.inherit(XML_META_KEYWORDS, {\n    begin: /\\(/,\n    end: /\\)/\n  });\n  const APOS_META_STRING_MODE = hljs.inherit(hljs.APOS_STRING_MODE, { className: 'string' });\n  const QUOTE_META_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, { className: 'string' });\n  const TAG_INTERNALS = {\n    endsWithParent: true,\n    illegal: /</,\n    relevance: 0,\n    contains: [\n      {\n        className: 'attr',\n        begin: XML_IDENT_RE,\n        relevance: 0\n      },\n      {\n        begin: /=\\s*/,\n        relevance: 0,\n        contains: [\n          {\n            className: 'string',\n            endsParent: true,\n            variants: [\n              {\n                begin: /\"/,\n                end: /\"/,\n                contains: [ XML_ENTITIES ]\n              },\n              {\n                begin: /'/,\n                end: /'/,\n                contains: [ XML_ENTITIES ]\n              },\n              { begin: /[^\\s\"'=<>`]+/ }\n            ]\n          }\n        ]\n      }\n    ]\n  };\n  return {\n    name: 'HTML, XML',\n    aliases: [\n      'html',\n      'xhtml',\n      'rss',\n      'atom',\n      'xjb',\n      'xsd',\n      'xsl',\n      'plist',\n      'wsf',\n      'svg'\n    ],\n    case_insensitive: true,\n    unicodeRegex: true,\n    contains: [\n      {\n        className: 'meta',\n        begin: /<![a-z]/,\n        end: />/,\n        relevance: 10,\n        contains: [\n          XML_META_KEYWORDS,\n          QUOTE_META_STRING_MODE,\n          APOS_META_STRING_MODE,\n          XML_META_PAR_KEYWORDS,\n          {\n            begin: /\\[/,\n            end: /\\]/,\n            contains: [\n              {\n                className: 'meta',\n                begin: /<![a-z]/,\n                end: />/,\n                contains: [\n                  XML_META_KEYWORDS,\n                  XML_META_PAR_KEYWORDS,\n                  QUOTE_META_STRING_MODE,\n                  APOS_META_STRING_MODE\n                ]\n              }\n            ]\n          }\n        ]\n      },\n      hljs.COMMENT(\n        /<!--/,\n        /-->/,\n        { relevance: 10 }\n      ),\n      {\n        begin: /<!\\[CDATA\\[/,\n        end: /\\]\\]>/,\n        relevance: 10\n      },\n      XML_ENTITIES,\n      // xml processing instructions\n      {\n        className: 'meta',\n        end: /\\?>/,\n        variants: [\n          {\n            begin: /<\\?xml/,\n            relevance: 10,\n            contains: [\n              QUOTE_META_STRING_MODE\n            ]\n          },\n          {\n            begin: /<\\?[a-z][a-z0-9]+/,\n          }\n        ]\n\n      },\n      {\n        className: 'tag',\n        /*\n        The lookahead pattern (?=...) ensures that 'begin' only matches\n        '<style' as a single word, followed by a whitespace or an\n        ending bracket.\n        */\n        begin: /<style(?=\\s|>)/,\n        end: />/,\n        keywords: { name: 'style' },\n        contains: [ TAG_INTERNALS ],\n        starts: {\n          end: /<\\/style>/,\n          returnEnd: true,\n          subLanguage: [\n            'css',\n            'xml'\n          ]\n        }\n      },\n      {\n        className: 'tag',\n        // See the comment in the <style tag about the lookahead pattern\n        begin: /<script(?=\\s|>)/,\n        end: />/,\n        keywords: { name: 'script' },\n        contains: [ TAG_INTERNALS ],\n        starts: {\n          end: /<\\/script>/,\n          returnEnd: true,\n          subLanguage: [\n            'javascript',\n            'handlebars',\n            'xml'\n          ]\n        }\n      },\n      // we need this for now for jSX\n      {\n        className: 'tag',\n        begin: /<>|<\\/>/\n      },\n      // open tag\n      {\n        className: 'tag',\n        begin: regex.concat(\n          /</,\n          regex.lookahead(regex.concat(\n            TAG_NAME_RE,\n            // <tag/>\n            // <tag>\n            // <tag ...\n            regex.either(/\\/>/, />/, /\\s/)\n          ))\n        ),\n        end: /\\/?>/,\n        contains: [\n          {\n            className: 'name',\n            begin: TAG_NAME_RE,\n            relevance: 0,\n            starts: TAG_INTERNALS\n          }\n        ]\n      },\n      // close tag\n      {\n        className: 'tag',\n        begin: regex.concat(\n          /<\\//,\n          regex.lookahead(regex.concat(\n            TAG_NAME_RE, />/\n          ))\n        ),\n        contains: [\n          {\n            className: 'name',\n            begin: TAG_NAME_RE,\n            relevance: 0\n          },\n          {\n            begin: />/,\n            relevance: 0,\n            endsParent: true\n          }\n        ]\n      }\n    ]\n  };\n}\n\nmodule.exports = xml;\n","/*\nLanguage: Bash\nAuthor: vah <vahtenberg@gmail.com>\nContributrors: Benjamin Pannell <contact@sierrasoftworks.com>\nWebsite: https://www.gnu.org/software/bash/\nCategory: common, scripting\n*/\n\n/** @type LanguageFn */\nfunction bash(hljs) {\n  const regex = hljs.regex;\n  const VAR = {};\n  const BRACED_VAR = {\n    begin: /\\$\\{/,\n    end: /\\}/,\n    contains: [\n      \"self\",\n      {\n        begin: /:-/,\n        contains: [ VAR ]\n      } // default values\n    ]\n  };\n  Object.assign(VAR, {\n    className: 'variable',\n    variants: [\n      { begin: regex.concat(/\\$[\\w\\d#@][\\w\\d_]*/,\n        // negative look-ahead tries to avoid matching patterns that are not\n        // Perl at all like $ident$, @ident@, etc.\n        `(?![\\\\w\\\\d])(?![$])`) },\n      BRACED_VAR\n    ]\n  });\n\n  const SUBST = {\n    className: 'subst',\n    begin: /\\$\\(/,\n    end: /\\)/,\n    contains: [ hljs.BACKSLASH_ESCAPE ]\n  };\n  const COMMENT = hljs.inherit(\n    hljs.COMMENT(),\n    {\n      match: [\n        /(^|\\s)/,\n        /#.*$/\n      ],\n      scope: {\n        2: 'comment'\n      }\n    }\n  );\n  const HERE_DOC = {\n    begin: /<<-?\\s*(?=\\w+)/,\n    starts: { contains: [\n      hljs.END_SAME_AS_BEGIN({\n        begin: /(\\w+)/,\n        end: /(\\w+)/,\n        className: 'string'\n      })\n    ] }\n  };\n  const QUOTE_STRING = {\n    className: 'string',\n    begin: /\"/,\n    end: /\"/,\n    contains: [\n      hljs.BACKSLASH_ESCAPE,\n      VAR,\n      SUBST\n    ]\n  };\n  SUBST.contains.push(QUOTE_STRING);\n  const ESCAPED_QUOTE = {\n    match: /\\\\\"/\n  };\n  const APOS_STRING = {\n    className: 'string',\n    begin: /'/,\n    end: /'/\n  };\n  const ESCAPED_APOS = {\n    match: /\\\\'/\n  };\n  const ARITHMETIC = {\n    begin: /\\$?\\(\\(/,\n    end: /\\)\\)/,\n    contains: [\n      {\n        begin: /\\d+#[0-9a-f]+/,\n        className: \"number\"\n      },\n      hljs.NUMBER_MODE,\n      VAR\n    ]\n  };\n  const SH_LIKE_SHELLS = [\n    \"fish\",\n    \"bash\",\n    \"zsh\",\n    \"sh\",\n    \"csh\",\n    \"ksh\",\n    \"tcsh\",\n    \"dash\",\n    \"scsh\",\n  ];\n  const KNOWN_SHEBANG = hljs.SHEBANG({\n    binary: `(${SH_LIKE_SHELLS.join(\"|\")})`,\n    relevance: 10\n  });\n  const FUNCTION = {\n    className: 'function',\n    begin: /\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,\n    returnBegin: true,\n    contains: [ hljs.inherit(hljs.TITLE_MODE, { begin: /\\w[\\w\\d_]*/ }) ],\n    relevance: 0\n  };\n\n  const KEYWORDS = [\n    \"if\",\n    \"then\",\n    \"else\",\n    \"elif\",\n    \"fi\",\n    \"time\",\n    \"for\",\n    \"while\",\n    \"until\",\n    \"in\",\n    \"do\",\n    \"done\",\n    \"case\",\n    \"esac\",\n    \"coproc\",\n    \"function\",\n    \"select\"\n  ];\n\n  const LITERALS = [\n    \"true\",\n    \"false\"\n  ];\n\n  // to consume paths to prevent keyword matches inside them\n  const PATH_MODE = { match: /(\\/[a-z._-]+)+/ };\n\n  // http://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html\n  const SHELL_BUILT_INS = [\n    \"break\",\n    \"cd\",\n    \"continue\",\n    \"eval\",\n    \"exec\",\n    \"exit\",\n    \"export\",\n    \"getopts\",\n    \"hash\",\n    \"pwd\",\n    \"readonly\",\n    \"return\",\n    \"shift\",\n    \"test\",\n    \"times\",\n    \"trap\",\n    \"umask\",\n    \"unset\"\n  ];\n\n  const BASH_BUILT_INS = [\n    \"alias\",\n    \"bind\",\n    \"builtin\",\n    \"caller\",\n    \"command\",\n    \"declare\",\n    \"echo\",\n    \"enable\",\n    \"help\",\n    \"let\",\n    \"local\",\n    \"logout\",\n    \"mapfile\",\n    \"printf\",\n    \"read\",\n    \"readarray\",\n    \"source\",\n    \"sudo\",\n    \"type\",\n    \"typeset\",\n    \"ulimit\",\n    \"unalias\"\n  ];\n\n  const ZSH_BUILT_INS = [\n    \"autoload\",\n    \"bg\",\n    \"bindkey\",\n    \"bye\",\n    \"cap\",\n    \"chdir\",\n    \"clone\",\n    \"comparguments\",\n    \"compcall\",\n    \"compctl\",\n    \"compdescribe\",\n    \"compfiles\",\n    \"compgroups\",\n    \"compquote\",\n    \"comptags\",\n    \"comptry\",\n    \"compvalues\",\n    \"dirs\",\n    \"disable\",\n    \"disown\",\n    \"echotc\",\n    \"echoti\",\n    \"emulate\",\n    \"fc\",\n    \"fg\",\n    \"float\",\n    \"functions\",\n    \"getcap\",\n    \"getln\",\n    \"history\",\n    \"integer\",\n    \"jobs\",\n    \"kill\",\n    \"limit\",\n    \"log\",\n    \"noglob\",\n    \"popd\",\n    \"print\",\n    \"pushd\",\n    \"pushln\",\n    \"rehash\",\n    \"sched\",\n    \"setcap\",\n    \"setopt\",\n    \"stat\",\n    \"suspend\",\n    \"ttyctl\",\n    \"unfunction\",\n    \"unhash\",\n    \"unlimit\",\n    \"unsetopt\",\n    \"vared\",\n    \"wait\",\n    \"whence\",\n    \"where\",\n    \"which\",\n    \"zcompile\",\n    \"zformat\",\n    \"zftp\",\n    \"zle\",\n    \"zmodload\",\n    \"zparseopts\",\n    \"zprof\",\n    \"zpty\",\n    \"zregexparse\",\n    \"zsocket\",\n    \"zstyle\",\n    \"ztcp\"\n  ];\n\n  const GNU_CORE_UTILS = [\n    \"chcon\",\n    \"chgrp\",\n    \"chown\",\n    \"chmod\",\n    \"cp\",\n    \"dd\",\n    \"df\",\n    \"dir\",\n    \"dircolors\",\n    \"ln\",\n    \"ls\",\n    \"mkdir\",\n    \"mkfifo\",\n    \"mknod\",\n    \"mktemp\",\n    \"mv\",\n    \"realpath\",\n    \"rm\",\n    \"rmdir\",\n    \"shred\",\n    \"sync\",\n    \"touch\",\n    \"truncate\",\n    \"vdir\",\n    \"b2sum\",\n    \"base32\",\n    \"base64\",\n    \"cat\",\n    \"cksum\",\n    \"comm\",\n    \"csplit\",\n    \"cut\",\n    \"expand\",\n    \"fmt\",\n    \"fold\",\n    \"head\",\n    \"join\",\n    \"md5sum\",\n    \"nl\",\n    \"numfmt\",\n    \"od\",\n    \"paste\",\n    \"ptx\",\n    \"pr\",\n    \"sha1sum\",\n    \"sha224sum\",\n    \"sha256sum\",\n    \"sha384sum\",\n    \"sha512sum\",\n    \"shuf\",\n    \"sort\",\n    \"split\",\n    \"sum\",\n    \"tac\",\n    \"tail\",\n    \"tr\",\n    \"tsort\",\n    \"unexpand\",\n    \"uniq\",\n    \"wc\",\n    \"arch\",\n    \"basename\",\n    \"chroot\",\n    \"date\",\n    \"dirname\",\n    \"du\",\n    \"echo\",\n    \"env\",\n    \"expr\",\n    \"factor\",\n    // \"false\", // keyword literal already\n    \"groups\",\n    \"hostid\",\n    \"id\",\n    \"link\",\n    \"logname\",\n    \"nice\",\n    \"nohup\",\n    \"nproc\",\n    \"pathchk\",\n    \"pinky\",\n    \"printenv\",\n    \"printf\",\n    \"pwd\",\n    \"readlink\",\n    \"runcon\",\n    \"seq\",\n    \"sleep\",\n    \"stat\",\n    \"stdbuf\",\n    \"stty\",\n    \"tee\",\n    \"test\",\n    \"timeout\",\n    // \"true\", // keyword literal already\n    \"tty\",\n    \"uname\",\n    \"unlink\",\n    \"uptime\",\n    \"users\",\n    \"who\",\n    \"whoami\",\n    \"yes\"\n  ];\n\n  return {\n    name: 'Bash',\n    aliases: [\n      'sh',\n      'zsh'\n    ],\n    keywords: {\n      $pattern: /\\b[a-z][a-z0-9._-]+\\b/,\n      keyword: KEYWORDS,\n      literal: LITERALS,\n      built_in: [\n        ...SHELL_BUILT_INS,\n        ...BASH_BUILT_INS,\n        // Shell modifiers\n        \"set\",\n        \"shopt\",\n        ...ZSH_BUILT_INS,\n        ...GNU_CORE_UTILS\n      ]\n    },\n    contains: [\n      KNOWN_SHEBANG, // to catch known shells and boost relevancy\n      hljs.SHEBANG(), // to catch unknown shells but still highlight the shebang\n      FUNCTION,\n      ARITHMETIC,\n      COMMENT,\n      HERE_DOC,\n      PATH_MODE,\n      QUOTE_STRING,\n      ESCAPED_QUOTE,\n      APOS_STRING,\n      ESCAPED_APOS,\n      VAR\n    ]\n  };\n}\n\nmodule.exports = bash;\n","/*\nLanguage: C\nCategory: common, system\nWebsite: https://en.wikipedia.org/wiki/C_(programming_language)\n*/\n\n/** @type LanguageFn */\nfunction c(hljs) {\n  const regex = hljs.regex;\n  // added for historic reasons because `hljs.C_LINE_COMMENT_MODE` does\n  // not include such support nor can we be sure all the grammars depending\n  // on it would desire this behavior\n  const C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$', { contains: [ { begin: /\\\\\\n/ } ] });\n  const DECLTYPE_AUTO_RE = 'decltype\\\\(auto\\\\)';\n  const NAMESPACE_RE = '[a-zA-Z_]\\\\w*::';\n  const TEMPLATE_ARGUMENT_RE = '<[^<>]+>';\n  const FUNCTION_TYPE_RE = '('\n    + DECLTYPE_AUTO_RE + '|'\n    + regex.optional(NAMESPACE_RE)\n    + '[a-zA-Z_]\\\\w*' + regex.optional(TEMPLATE_ARGUMENT_RE)\n  + ')';\n\n\n  const TYPES = {\n    className: 'type',\n    variants: [\n      { begin: '\\\\b[a-z\\\\d_]*_t\\\\b' },\n      { match: /\\batomic_[a-z]{3,6}\\b/ }\n    ]\n\n  };\n\n  // https://en.cppreference.com/w/cpp/language/escape\n  // \\\\ \\x \\xFF \\u2837 \\u00323747 \\374\n  const CHARACTER_ESCAPES = '\\\\\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\\\S)';\n  const STRINGS = {\n    className: 'string',\n    variants: [\n      {\n        begin: '(u8?|U|L)?\"',\n        end: '\"',\n        illegal: '\\\\n',\n        contains: [ hljs.BACKSLASH_ESCAPE ]\n      },\n      {\n        begin: '(u8?|U|L)?\\'(' + CHARACTER_ESCAPES + \"|.)\",\n        end: '\\'',\n        illegal: '.'\n      },\n      hljs.END_SAME_AS_BEGIN({\n        begin: /(?:u8?|U|L)?R\"([^()\\\\ ]{0,16})\\(/,\n        end: /\\)([^()\\\\ ]{0,16})\"/\n      })\n    ]\n  };\n\n  const NUMBERS = {\n    className: 'number',\n    variants: [\n      { match: /\\b(0b[01']+)/ },  \n      { match: /(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)/ },  \n      { match: /(-?)\\b(0[xX][a-fA-F0-9]+(?:'[a-fA-F0-9]+)*(?:\\.[a-fA-F0-9]*(?:'[a-fA-F0-9]*)*)?(?:[pP][-+]?[0-9]+)?(l|L)?(u|U)?)/ },  \n      { match: /(-?)\\b\\d+(?:'\\d+)*(?:\\.\\d*(?:'\\d*)*)?(?:[eE][-+]?\\d+)?/ }  \n  ],\n    relevance: 0\n  };  \n  \n  const PREPROCESSOR = {\n    className: 'meta',\n    begin: /#\\s*[a-z]+\\b/,\n    end: /$/,\n    keywords: { keyword:\n        'if else elif endif define undef warning error line '\n        + 'pragma _Pragma ifdef ifndef elifdef elifndef include' },\n    contains: [\n      {\n        begin: /\\\\\\n/,\n        relevance: 0\n      },\n      hljs.inherit(STRINGS, { className: 'string' }),\n      {\n        className: 'string',\n        begin: /<.*?>/\n      },\n      C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE\n    ]\n  };\n\n  const TITLE_MODE = {\n    className: 'title',\n    begin: regex.optional(NAMESPACE_RE) + hljs.IDENT_RE,\n    relevance: 0\n  };\n\n  const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs.IDENT_RE + '\\\\s*\\\\(';\n\n  const C_KEYWORDS = [\n    \"asm\",\n    \"auto\",\n    \"break\",\n    \"case\",\n    \"continue\",\n    \"default\",\n    \"do\",\n    \"else\",\n    \"enum\",\n    \"extern\",\n    \"for\",\n    \"fortran\",\n    \"goto\",\n    \"if\",\n    \"inline\",\n    \"register\",\n    \"restrict\",\n    \"return\",\n    \"sizeof\",\n    \"typeof\",\n    \"typeof_unqual\",\n    \"struct\",\n    \"switch\",\n    \"typedef\",\n    \"union\",\n    \"volatile\",\n    \"while\",\n    \"_Alignas\",\n    \"_Alignof\",\n    \"_Atomic\",\n    \"_Generic\",\n    \"_Noreturn\",\n    \"_Static_assert\",\n    \"_Thread_local\",\n    // aliases\n    \"alignas\",\n    \"alignof\",\n    \"noreturn\",\n    \"static_assert\",\n    \"thread_local\",\n    // not a C keyword but is, for all intents and purposes, treated exactly like one.\n    \"_Pragma\"\n  ];\n\n  const C_TYPES = [\n    \"float\",\n    \"double\",\n    \"signed\",\n    \"unsigned\",\n    \"int\",\n    \"short\",\n    \"long\",\n    \"char\",\n    \"void\",\n    \"_Bool\",\n    \"_BitInt\",\n    \"_Complex\",\n    \"_Imaginary\",\n    \"_Decimal32\",\n    \"_Decimal64\",\n    \"_Decimal96\",\n    \"_Decimal128\",\n    \"_Decimal64x\",\n    \"_Decimal128x\",\n    \"_Float16\",\n    \"_Float32\",\n    \"_Float64\",\n    \"_Float128\",\n    \"_Float32x\",\n    \"_Float64x\",\n    \"_Float128x\",\n    // modifiers\n    \"const\",\n    \"static\",\n    \"constexpr\",\n    // aliases\n    \"complex\",\n    \"bool\",\n    \"imaginary\"\n  ];\n\n  const KEYWORDS = {\n    keyword: C_KEYWORDS,\n    type: C_TYPES,\n    literal: 'true false NULL',\n    // TODO: apply hinting work similar to what was done in cpp.js\n    built_in: 'std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream '\n      + 'auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set '\n      + 'unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos '\n      + 'asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp '\n      + 'fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper '\n      + 'isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow '\n      + 'printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp '\n      + 'strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan '\n      + 'vfprintf vprintf vsprintf endl initializer_list unique_ptr',\n  };\n\n  const EXPRESSION_CONTAINS = [\n    PREPROCESSOR,\n    TYPES,\n    C_LINE_COMMENT_MODE,\n    hljs.C_BLOCK_COMMENT_MODE,\n    NUMBERS,\n    STRINGS\n  ];\n\n  const EXPRESSION_CONTEXT = {\n    // This mode covers expression context where we can't expect a function\n    // definition and shouldn't highlight anything that looks like one:\n    // `return some()`, `else if()`, `(x*sum(1, 2))`\n    variants: [\n      {\n        begin: /=/,\n        end: /;/\n      },\n      {\n        begin: /\\(/,\n        end: /\\)/\n      },\n      {\n        beginKeywords: 'new throw return else',\n        end: /;/\n      }\n    ],\n    keywords: KEYWORDS,\n    contains: EXPRESSION_CONTAINS.concat([\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        keywords: KEYWORDS,\n        contains: EXPRESSION_CONTAINS.concat([ 'self' ]),\n        relevance: 0\n      }\n    ]),\n    relevance: 0\n  };\n\n  const FUNCTION_DECLARATION = {\n    begin: '(' + FUNCTION_TYPE_RE + '[\\\\*&\\\\s]+)+' + FUNCTION_TITLE,\n    returnBegin: true,\n    end: /[{;=]/,\n    excludeEnd: true,\n    keywords: KEYWORDS,\n    illegal: /[^\\w\\s\\*&:<>.]/,\n    contains: [\n      { // to prevent it from being confused as the function title\n        begin: DECLTYPE_AUTO_RE,\n        keywords: KEYWORDS,\n        relevance: 0\n      },\n      {\n        begin: FUNCTION_TITLE,\n        returnBegin: true,\n        contains: [ hljs.inherit(TITLE_MODE, { className: \"title.function\" }) ],\n        relevance: 0\n      },\n      // allow for multiple declarations, e.g.:\n      // extern void f(int), g(char);\n      {\n        relevance: 0,\n        match: /,/\n      },\n      {\n        className: 'params',\n        begin: /\\(/,\n        end: /\\)/,\n        keywords: KEYWORDS,\n        relevance: 0,\n        contains: [\n          C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE,\n          STRINGS,\n          NUMBERS,\n          TYPES,\n          // Count matching parentheses.\n          {\n            begin: /\\(/,\n            end: /\\)/,\n            keywords: KEYWORDS,\n            relevance: 0,\n            contains: [\n              'self',\n              C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE,\n              STRINGS,\n              NUMBERS,\n              TYPES\n            ]\n          }\n        ]\n      },\n      TYPES,\n      C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      PREPROCESSOR\n    ]\n  };\n\n  return {\n    name: \"C\",\n    aliases: [ 'h' ],\n    keywords: KEYWORDS,\n    // Until differentiations are added between `c` and `cpp`, `c` will\n    // not be auto-detected to avoid auto-detect conflicts between C and C++\n    disableAutodetect: true,\n    illegal: '</',\n    contains: [].concat(\n      EXPRESSION_CONTEXT,\n      FUNCTION_DECLARATION,\n      EXPRESSION_CONTAINS,\n      [\n        PREPROCESSOR,\n        {\n          begin: hljs.IDENT_RE + '::',\n          keywords: KEYWORDS\n        },\n        {\n          className: 'class',\n          beginKeywords: 'enum class struct union',\n          end: /[{;:<>=]/,\n          contains: [\n            { beginKeywords: \"final class struct\" },\n            hljs.TITLE_MODE\n          ]\n        }\n      ]),\n    exports: {\n      preprocessor: PREPROCESSOR,\n      strings: STRINGS,\n      keywords: KEYWORDS\n    }\n  };\n}\n\nmodule.exports = c;\n","/*\nLanguage: C++\nCategory: common, system\nWebsite: https://isocpp.org\n*/\n\n/** @type LanguageFn */\nfunction cpp(hljs) {\n  const regex = hljs.regex;\n  // added for historic reasons because `hljs.C_LINE_COMMENT_MODE` does\n  // not include such support nor can we be sure all the grammars depending\n  // on it would desire this behavior\n  const C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$', { contains: [ { begin: /\\\\\\n/ } ] });\n  const DECLTYPE_AUTO_RE = 'decltype\\\\(auto\\\\)';\n  const NAMESPACE_RE = '[a-zA-Z_]\\\\w*::';\n  const TEMPLATE_ARGUMENT_RE = '<[^<>]+>';\n  const FUNCTION_TYPE_RE = '(?!struct)('\n    + DECLTYPE_AUTO_RE + '|'\n    + regex.optional(NAMESPACE_RE)\n    + '[a-zA-Z_]\\\\w*' + regex.optional(TEMPLATE_ARGUMENT_RE)\n  + ')';\n\n  const CPP_PRIMITIVE_TYPES = {\n    className: 'type',\n    begin: '\\\\b[a-z\\\\d_]*_t\\\\b'\n  };\n\n  // https://en.cppreference.com/w/cpp/language/escape\n  // \\\\ \\x \\xFF \\u2837 \\u00323747 \\374\n  const CHARACTER_ESCAPES = '\\\\\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\\\S)';\n  const STRINGS = {\n    className: 'string',\n    variants: [\n      {\n        begin: '(u8?|U|L)?\"',\n        end: '\"',\n        illegal: '\\\\n',\n        contains: [ hljs.BACKSLASH_ESCAPE ]\n      },\n      {\n        begin: '(u8?|U|L)?\\'(' + CHARACTER_ESCAPES + '|.)',\n        end: '\\'',\n        illegal: '.'\n      },\n      hljs.END_SAME_AS_BEGIN({\n        begin: /(?:u8?|U|L)?R\"([^()\\\\ ]{0,16})\\(/,\n        end: /\\)([^()\\\\ ]{0,16})\"/\n      })\n    ]\n  };\n\n  const NUMBERS = {\n    className: 'number',\n    variants: [\n      // Floating-point literal.\n      { begin:\n        \"[+-]?(?:\" // Leading sign.\n          // Decimal.\n          + \"(?:\"\n            +\"[0-9](?:'?[0-9])*\\\\.(?:[0-9](?:'?[0-9])*)?\"\n            + \"|\\\\.[0-9](?:'?[0-9])*\"\n          + \")(?:[Ee][+-]?[0-9](?:'?[0-9])*)?\"\n          + \"|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*\"\n          // Hexadecimal.\n          + \"|0[Xx](?:\"\n            +\"[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?\"\n            + \"|\\\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*\"\n          + \")[Pp][+-]?[0-9](?:'?[0-9])*\"\n        + \")(?:\" // Literal suffixes.\n          + \"[Ff](?:16|32|64|128)?\"\n          + \"|(BF|bf)16\"\n          + \"|[Ll]\"\n          + \"|\" // Literal suffix is optional.\n        + \")\"\n      },\n      // Integer literal.\n      { begin:\n        \"[+-]?\\\\b(?:\" // Leading sign.\n          + \"0[Bb][01](?:'?[01])*\" // Binary.\n          + \"|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*\" // Hexadecimal.\n          + \"|0(?:'?[0-7])*\" // Octal or just a lone zero.\n          + \"|[1-9](?:'?[0-9])*\" // Decimal.\n        + \")(?:\" // Literal suffixes.\n          + \"[Uu](?:LL?|ll?)\"\n          + \"|[Uu][Zz]?\"\n          + \"|(?:LL?|ll?)[Uu]?\"\n          + \"|[Zz][Uu]\"\n          + \"|\" // Literal suffix is optional.\n        + \")\"\n        // Note: there are user-defined literal suffixes too, but perhaps having the custom suffix not part of the\n        // literal highlight actually makes it stand out more.\n      }\n    ],\n    relevance: 0\n  };\n\n  const PREPROCESSOR = {\n    className: 'meta',\n    begin: /#\\s*[a-z]+\\b/,\n    end: /$/,\n    keywords: { keyword:\n        'if else elif endif define undef warning error line '\n        + 'pragma _Pragma ifdef ifndef include' },\n    contains: [\n      {\n        begin: /\\\\\\n/,\n        relevance: 0\n      },\n      hljs.inherit(STRINGS, { className: 'string' }),\n      {\n        className: 'string',\n        begin: /<.*?>/\n      },\n      C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE\n    ]\n  };\n\n  const TITLE_MODE = {\n    className: 'title',\n    begin: regex.optional(NAMESPACE_RE) + hljs.IDENT_RE,\n    relevance: 0\n  };\n\n  const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs.IDENT_RE + '\\\\s*\\\\(';\n\n  // https://en.cppreference.com/w/cpp/keyword\n  const RESERVED_KEYWORDS = [\n    'alignas',\n    'alignof',\n    'and',\n    'and_eq',\n    'asm',\n    'atomic_cancel',\n    'atomic_commit',\n    'atomic_noexcept',\n    'auto',\n    'bitand',\n    'bitor',\n    'break',\n    'case',\n    'catch',\n    'class',\n    'co_await',\n    'co_return',\n    'co_yield',\n    'compl',\n    'concept',\n    'const_cast|10',\n    'consteval',\n    'constexpr',\n    'constinit',\n    'continue',\n    'decltype',\n    'default',\n    'delete',\n    'do',\n    'dynamic_cast|10',\n    'else',\n    'enum',\n    'explicit',\n    'export',\n    'extern',\n    'false',\n    'final',\n    'for',\n    'friend',\n    'goto',\n    'if',\n    'import',\n    'inline',\n    'module',\n    'mutable',\n    'namespace',\n    'new',\n    'noexcept',\n    'not',\n    'not_eq',\n    'nullptr',\n    'operator',\n    'or',\n    'or_eq',\n    'override',\n    'private',\n    'protected',\n    'public',\n    'reflexpr',\n    'register',\n    'reinterpret_cast|10',\n    'requires',\n    'return',\n    'sizeof',\n    'static_assert',\n    'static_cast|10',\n    'struct',\n    'switch',\n    'synchronized',\n    'template',\n    'this',\n    'thread_local',\n    'throw',\n    'transaction_safe',\n    'transaction_safe_dynamic',\n    'true',\n    'try',\n    'typedef',\n    'typeid',\n    'typename',\n    'union',\n    'using',\n    'virtual',\n    'volatile',\n    'while',\n    'xor',\n    'xor_eq'\n  ];\n\n  // https://en.cppreference.com/w/cpp/keyword\n  const RESERVED_TYPES = [\n    'bool',\n    'char',\n    'char16_t',\n    'char32_t',\n    'char8_t',\n    'double',\n    'float',\n    'int',\n    'long',\n    'short',\n    'void',\n    'wchar_t',\n    'unsigned',\n    'signed',\n    'const',\n    'static'\n  ];\n\n  const TYPE_HINTS = [\n    'any',\n    'auto_ptr',\n    'barrier',\n    'binary_semaphore',\n    'bitset',\n    'complex',\n    'condition_variable',\n    'condition_variable_any',\n    'counting_semaphore',\n    'deque',\n    'false_type',\n    'flat_map',\n    'flat_set',\n    'future',\n    'imaginary',\n    'initializer_list',\n    'istringstream',\n    'jthread',\n    'latch',\n    'lock_guard',\n    'multimap',\n    'multiset',\n    'mutex',\n    'optional',\n    'ostringstream',\n    'packaged_task',\n    'pair',\n    'promise',\n    'priority_queue',\n    'queue',\n    'recursive_mutex',\n    'recursive_timed_mutex',\n    'scoped_lock',\n    'set',\n    'shared_future',\n    'shared_lock',\n    'shared_mutex',\n    'shared_timed_mutex',\n    'shared_ptr',\n    'stack',\n    'string_view',\n    'stringstream',\n    'timed_mutex',\n    'thread',\n    'true_type',\n    'tuple',\n    'unique_lock',\n    'unique_ptr',\n    'unordered_map',\n    'unordered_multimap',\n    'unordered_multiset',\n    'unordered_set',\n    'variant',\n    'vector',\n    'weak_ptr',\n    'wstring',\n    'wstring_view'\n  ];\n\n  const FUNCTION_HINTS = [\n    'abort',\n    'abs',\n    'acos',\n    'apply',\n    'as_const',\n    'asin',\n    'atan',\n    'atan2',\n    'calloc',\n    'ceil',\n    'cerr',\n    'cin',\n    'clog',\n    'cos',\n    'cosh',\n    'cout',\n    'declval',\n    'endl',\n    'exchange',\n    'exit',\n    'exp',\n    'fabs',\n    'floor',\n    'fmod',\n    'forward',\n    'fprintf',\n    'fputs',\n    'free',\n    'frexp',\n    'fscanf',\n    'future',\n    'invoke',\n    'isalnum',\n    'isalpha',\n    'iscntrl',\n    'isdigit',\n    'isgraph',\n    'islower',\n    'isprint',\n    'ispunct',\n    'isspace',\n    'isupper',\n    'isxdigit',\n    'labs',\n    'launder',\n    'ldexp',\n    'log',\n    'log10',\n    'make_pair',\n    'make_shared',\n    'make_shared_for_overwrite',\n    'make_tuple',\n    'make_unique',\n    'malloc',\n    'memchr',\n    'memcmp',\n    'memcpy',\n    'memset',\n    'modf',\n    'move',\n    'pow',\n    'printf',\n    'putchar',\n    'puts',\n    'realloc',\n    'scanf',\n    'sin',\n    'sinh',\n    'snprintf',\n    'sprintf',\n    'sqrt',\n    'sscanf',\n    'std',\n    'stderr',\n    'stdin',\n    'stdout',\n    'strcat',\n    'strchr',\n    'strcmp',\n    'strcpy',\n    'strcspn',\n    'strlen',\n    'strncat',\n    'strncmp',\n    'strncpy',\n    'strpbrk',\n    'strrchr',\n    'strspn',\n    'strstr',\n    'swap',\n    'tan',\n    'tanh',\n    'terminate',\n    'to_underlying',\n    'tolower',\n    'toupper',\n    'vfprintf',\n    'visit',\n    'vprintf',\n    'vsprintf'\n  ];\n\n  const LITERALS = [\n    'NULL',\n    'false',\n    'nullopt',\n    'nullptr',\n    'true'\n  ];\n\n  // https://en.cppreference.com/w/cpp/keyword\n  const BUILT_IN = [ '_Pragma' ];\n\n  const CPP_KEYWORDS = {\n    type: RESERVED_TYPES,\n    keyword: RESERVED_KEYWORDS,\n    literal: LITERALS,\n    built_in: BUILT_IN,\n    _type_hints: TYPE_HINTS\n  };\n\n  const FUNCTION_DISPATCH = {\n    className: 'function.dispatch',\n    relevance: 0,\n    keywords: {\n      // Only for relevance, not highlighting.\n      _hint: FUNCTION_HINTS },\n    begin: regex.concat(\n      /\\b/,\n      /(?!decltype)/,\n      /(?!if)/,\n      /(?!for)/,\n      /(?!switch)/,\n      /(?!while)/,\n      hljs.IDENT_RE,\n      regex.lookahead(/(<[^<>]+>|)\\s*\\(/))\n  };\n\n  const EXPRESSION_CONTAINS = [\n    FUNCTION_DISPATCH,\n    PREPROCESSOR,\n    CPP_PRIMITIVE_TYPES,\n    C_LINE_COMMENT_MODE,\n    hljs.C_BLOCK_COMMENT_MODE,\n    NUMBERS,\n    STRINGS\n  ];\n\n  const EXPRESSION_CONTEXT = {\n    // This mode covers expression context where we can't expect a function\n    // definition and shouldn't highlight anything that looks like one:\n    // `return some()`, `else if()`, `(x*sum(1, 2))`\n    variants: [\n      {\n        begin: /=/,\n        end: /;/\n      },\n      {\n        begin: /\\(/,\n        end: /\\)/\n      },\n      {\n        beginKeywords: 'new throw return else',\n        end: /;/\n      }\n    ],\n    keywords: CPP_KEYWORDS,\n    contains: EXPRESSION_CONTAINS.concat([\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        keywords: CPP_KEYWORDS,\n        contains: EXPRESSION_CONTAINS.concat([ 'self' ]),\n        relevance: 0\n      }\n    ]),\n    relevance: 0\n  };\n\n  const FUNCTION_DECLARATION = {\n    className: 'function',\n    begin: '(' + FUNCTION_TYPE_RE + '[\\\\*&\\\\s]+)+' + FUNCTION_TITLE,\n    returnBegin: true,\n    end: /[{;=]/,\n    excludeEnd: true,\n    keywords: CPP_KEYWORDS,\n    illegal: /[^\\w\\s\\*&:<>.]/,\n    contains: [\n      { // to prevent it from being confused as the function title\n        begin: DECLTYPE_AUTO_RE,\n        keywords: CPP_KEYWORDS,\n        relevance: 0\n      },\n      {\n        begin: FUNCTION_TITLE,\n        returnBegin: true,\n        contains: [ TITLE_MODE ],\n        relevance: 0\n      },\n      // needed because we do not have look-behind on the below rule\n      // to prevent it from grabbing the final : in a :: pair\n      {\n        begin: /::/,\n        relevance: 0\n      },\n      // initializers\n      {\n        begin: /:/,\n        endsWithParent: true,\n        contains: [\n          STRINGS,\n          NUMBERS\n        ]\n      },\n      // allow for multiple declarations, e.g.:\n      // extern void f(int), g(char);\n      {\n        relevance: 0,\n        match: /,/\n      },\n      {\n        className: 'params',\n        begin: /\\(/,\n        end: /\\)/,\n        keywords: CPP_KEYWORDS,\n        relevance: 0,\n        contains: [\n          C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE,\n          STRINGS,\n          NUMBERS,\n          CPP_PRIMITIVE_TYPES,\n          // Count matching parentheses.\n          {\n            begin: /\\(/,\n            end: /\\)/,\n            keywords: CPP_KEYWORDS,\n            relevance: 0,\n            contains: [\n              'self',\n              C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE,\n              STRINGS,\n              NUMBERS,\n              CPP_PRIMITIVE_TYPES\n            ]\n          }\n        ]\n      },\n      CPP_PRIMITIVE_TYPES,\n      C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      PREPROCESSOR\n    ]\n  };\n\n  return {\n    name: 'C++',\n    aliases: [\n      'cc',\n      'c++',\n      'h++',\n      'hpp',\n      'hh',\n      'hxx',\n      'cxx'\n    ],\n    keywords: CPP_KEYWORDS,\n    illegal: '</',\n    classNameAliases: { 'function.dispatch': 'built_in' },\n    contains: [].concat(\n      EXPRESSION_CONTEXT,\n      FUNCTION_DECLARATION,\n      FUNCTION_DISPATCH,\n      EXPRESSION_CONTAINS,\n      [\n        PREPROCESSOR,\n        { // containers: ie, `vector <int> rooms (9);`\n          begin: '\\\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array|tuple|optional|variant|function|flat_map|flat_set)\\\\s*<(?!<)',\n          end: '>',\n          keywords: CPP_KEYWORDS,\n          contains: [\n            'self',\n            CPP_PRIMITIVE_TYPES\n          ]\n        },\n        {\n          begin: hljs.IDENT_RE + '::',\n          keywords: CPP_KEYWORDS\n        },\n        {\n          match: [\n            // extra complexity to deal with `enum class` and `enum struct`\n            /\\b(?:enum(?:\\s+(?:class|struct))?|class|struct|union)/,\n            /\\s+/,\n            /\\w+/\n          ],\n          className: {\n            1: 'keyword',\n            3: 'title.class'\n          }\n        }\n      ])\n  };\n}\n\nmodule.exports = cpp;\n","/*\nLanguage: C#\nAuthor: Jason Diamond <jason@diamond.name>\nContributor: Nicolas LLOBERA <nllobera@gmail.com>, Pieter Vantorre <pietervantorre@gmail.com>, David Pine <david.pine@microsoft.com>\nWebsite: https://docs.microsoft.com/dotnet/csharp/\nCategory: common\n*/\n\n/** @type LanguageFn */\nfunction csharp(hljs) {\n  const BUILT_IN_KEYWORDS = [\n    'bool',\n    'byte',\n    'char',\n    'decimal',\n    'delegate',\n    'double',\n    'dynamic',\n    'enum',\n    'float',\n    'int',\n    'long',\n    'nint',\n    'nuint',\n    'object',\n    'sbyte',\n    'short',\n    'string',\n    'ulong',\n    'uint',\n    'ushort'\n  ];\n  const FUNCTION_MODIFIERS = [\n    'public',\n    'private',\n    'protected',\n    'static',\n    'internal',\n    'protected',\n    'abstract',\n    'async',\n    'extern',\n    'override',\n    'unsafe',\n    'virtual',\n    'new',\n    'sealed',\n    'partial'\n  ];\n  const LITERAL_KEYWORDS = [\n    'default',\n    'false',\n    'null',\n    'true'\n  ];\n  const NORMAL_KEYWORDS = [\n    'abstract',\n    'as',\n    'base',\n    'break',\n    'case',\n    'catch',\n    'class',\n    'const',\n    'continue',\n    'do',\n    'else',\n    'event',\n    'explicit',\n    'extern',\n    'finally',\n    'fixed',\n    'for',\n    'foreach',\n    'goto',\n    'if',\n    'implicit',\n    'in',\n    'interface',\n    'internal',\n    'is',\n    'lock',\n    'namespace',\n    'new',\n    'operator',\n    'out',\n    'override',\n    'params',\n    'private',\n    'protected',\n    'public',\n    'readonly',\n    'record',\n    'ref',\n    'return',\n    'scoped',\n    'sealed',\n    'sizeof',\n    'stackalloc',\n    'static',\n    'struct',\n    'switch',\n    'this',\n    'throw',\n    'try',\n    'typeof',\n    'unchecked',\n    'unsafe',\n    'using',\n    'virtual',\n    'void',\n    'volatile',\n    'while'\n  ];\n  const CONTEXTUAL_KEYWORDS = [\n    'add',\n    'alias',\n    'and',\n    'ascending',\n    'args',\n    'async',\n    'await',\n    'by',\n    'descending',\n    'dynamic',\n    'equals',\n    'file',\n    'from',\n    'get',\n    'global',\n    'group',\n    'init',\n    'into',\n    'join',\n    'let',\n    'nameof',\n    'not',\n    'notnull',\n    'on',\n    'or',\n    'orderby',\n    'partial',\n    'record',\n    'remove',\n    'required',\n    'scoped',\n    'select',\n    'set',\n    'unmanaged',\n    'value|0',\n    'var',\n    'when',\n    'where',\n    'with',\n    'yield'\n  ];\n\n  const KEYWORDS = {\n    keyword: NORMAL_KEYWORDS.concat(CONTEXTUAL_KEYWORDS),\n    built_in: BUILT_IN_KEYWORDS,\n    literal: LITERAL_KEYWORDS\n  };\n  const TITLE_MODE = hljs.inherit(hljs.TITLE_MODE, { begin: '[a-zA-Z](\\\\.?\\\\w)*' });\n  const NUMBERS = {\n    className: 'number',\n    variants: [\n      { begin: '\\\\b(0b[01\\']+)' },\n      { begin: '(-?)\\\\b([\\\\d\\']+(\\\\.[\\\\d\\']*)?|\\\\.[\\\\d\\']+)(u|U|l|L|ul|UL|f|F|b|B)' },\n      { begin: '(-?)(\\\\b0[xX][a-fA-F0-9\\']+|(\\\\b[\\\\d\\']+(\\\\.[\\\\d\\']*)?|\\\\.[\\\\d\\']+)([eE][-+]?[\\\\d\\']+)?)' }\n    ],\n    relevance: 0\n  };\n  const RAW_STRING = {\n    className: 'string',\n    begin: /\"\"\"(\"*)(?!\")(.|\\n)*?\"\"\"\\1/,\n    relevance: 1\n  };\n  const VERBATIM_STRING = {\n    className: 'string',\n    begin: '@\"',\n    end: '\"',\n    contains: [ { begin: '\"\"' } ]\n  };\n  const VERBATIM_STRING_NO_LF = hljs.inherit(VERBATIM_STRING, { illegal: /\\n/ });\n  const SUBST = {\n    className: 'subst',\n    begin: /\\{/,\n    end: /\\}/,\n    keywords: KEYWORDS\n  };\n  const SUBST_NO_LF = hljs.inherit(SUBST, { illegal: /\\n/ });\n  const INTERPOLATED_STRING = {\n    className: 'string',\n    begin: /\\$\"/,\n    end: '\"',\n    illegal: /\\n/,\n    contains: [\n      { begin: /\\{\\{/ },\n      { begin: /\\}\\}/ },\n      hljs.BACKSLASH_ESCAPE,\n      SUBST_NO_LF\n    ]\n  };\n  const INTERPOLATED_VERBATIM_STRING = {\n    className: 'string',\n    begin: /\\$@\"/,\n    end: '\"',\n    contains: [\n      { begin: /\\{\\{/ },\n      { begin: /\\}\\}/ },\n      { begin: '\"\"' },\n      SUBST\n    ]\n  };\n  const INTERPOLATED_VERBATIM_STRING_NO_LF = hljs.inherit(INTERPOLATED_VERBATIM_STRING, {\n    illegal: /\\n/,\n    contains: [\n      { begin: /\\{\\{/ },\n      { begin: /\\}\\}/ },\n      { begin: '\"\"' },\n      SUBST_NO_LF\n    ]\n  });\n  SUBST.contains = [\n    INTERPOLATED_VERBATIM_STRING,\n    INTERPOLATED_STRING,\n    VERBATIM_STRING,\n    hljs.APOS_STRING_MODE,\n    hljs.QUOTE_STRING_MODE,\n    NUMBERS,\n    hljs.C_BLOCK_COMMENT_MODE\n  ];\n  SUBST_NO_LF.contains = [\n    INTERPOLATED_VERBATIM_STRING_NO_LF,\n    INTERPOLATED_STRING,\n    VERBATIM_STRING_NO_LF,\n    hljs.APOS_STRING_MODE,\n    hljs.QUOTE_STRING_MODE,\n    NUMBERS,\n    hljs.inherit(hljs.C_BLOCK_COMMENT_MODE, { illegal: /\\n/ })\n  ];\n  const STRING = { variants: [\n    RAW_STRING,\n    INTERPOLATED_VERBATIM_STRING,\n    INTERPOLATED_STRING,\n    VERBATIM_STRING,\n    hljs.APOS_STRING_MODE,\n    hljs.QUOTE_STRING_MODE\n  ] };\n\n  const GENERIC_MODIFIER = {\n    begin: \"<\",\n    end: \">\",\n    contains: [\n      { beginKeywords: \"in out\" },\n      TITLE_MODE\n    ]\n  };\n  const TYPE_IDENT_RE = hljs.IDENT_RE + '(<' + hljs.IDENT_RE + '(\\\\s*,\\\\s*' + hljs.IDENT_RE + ')*>)?(\\\\[\\\\])?';\n  const AT_IDENTIFIER = {\n    // prevents expressions like `@class` from incorrect flagging\n    // `class` as a keyword\n    begin: \"@\" + hljs.IDENT_RE,\n    relevance: 0\n  };\n\n  return {\n    name: 'C#',\n    aliases: [\n      'cs',\n      'c#'\n    ],\n    keywords: KEYWORDS,\n    illegal: /::/,\n    contains: [\n      hljs.COMMENT(\n        '///',\n        '$',\n        {\n          returnBegin: true,\n          contains: [\n            {\n              className: 'doctag',\n              variants: [\n                {\n                  begin: '///',\n                  relevance: 0\n                },\n                { begin: '<!--|-->' },\n                {\n                  begin: '</?',\n                  end: '>'\n                }\n              ]\n            }\n          ]\n        }\n      ),\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'meta',\n        begin: '#',\n        end: '$',\n        keywords: { keyword: 'if else elif endif define undef warning error line region endregion pragma checksum' }\n      },\n      STRING,\n      NUMBERS,\n      {\n        beginKeywords: 'class interface',\n        relevance: 0,\n        end: /[{;=]/,\n        illegal: /[^\\s:,]/,\n        contains: [\n          { beginKeywords: \"where class\" },\n          TITLE_MODE,\n          GENERIC_MODIFIER,\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE\n        ]\n      },\n      {\n        beginKeywords: 'namespace',\n        relevance: 0,\n        end: /[{;=]/,\n        illegal: /[^\\s:]/,\n        contains: [\n          TITLE_MODE,\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE\n        ]\n      },\n      {\n        beginKeywords: 'record',\n        relevance: 0,\n        end: /[{;=]/,\n        illegal: /[^\\s:]/,\n        contains: [\n          TITLE_MODE,\n          GENERIC_MODIFIER,\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE\n        ]\n      },\n      {\n        // [Attributes(\"\")]\n        className: 'meta',\n        begin: '^\\\\s*\\\\[(?=[\\\\w])',\n        excludeBegin: true,\n        end: '\\\\]',\n        excludeEnd: true,\n        contains: [\n          {\n            className: 'string',\n            begin: /\"/,\n            end: /\"/\n          }\n        ]\n      },\n      {\n        // Expression keywords prevent 'keyword Name(...)' from being\n        // recognized as a function definition\n        beginKeywords: 'new return throw await else',\n        relevance: 0\n      },\n      {\n        className: 'function',\n        begin: '(' + TYPE_IDENT_RE + '\\\\s+)+' + hljs.IDENT_RE + '\\\\s*(<[^=]+>\\\\s*)?\\\\(',\n        returnBegin: true,\n        end: /\\s*[{;=]/,\n        excludeEnd: true,\n        keywords: KEYWORDS,\n        contains: [\n          // prevents these from being highlighted `title`\n          {\n            beginKeywords: FUNCTION_MODIFIERS.join(\" \"),\n            relevance: 0\n          },\n          {\n            begin: hljs.IDENT_RE + '\\\\s*(<[^=]+>\\\\s*)?\\\\(',\n            returnBegin: true,\n            contains: [\n              hljs.TITLE_MODE,\n              GENERIC_MODIFIER\n            ],\n            relevance: 0\n          },\n          { match: /\\(\\)/ },\n          {\n            className: 'params',\n            begin: /\\(/,\n            end: /\\)/,\n            excludeBegin: true,\n            excludeEnd: true,\n            keywords: KEYWORDS,\n            relevance: 0,\n            contains: [\n              STRING,\n              NUMBERS,\n              hljs.C_BLOCK_COMMENT_MODE\n            ]\n          },\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE\n        ]\n      },\n      AT_IDENTIFIER\n    ]\n  };\n}\n\nmodule.exports = csharp;\n","const MODES = (hljs) => {\n  return {\n    IMPORTANT: {\n      scope: 'meta',\n      begin: '!important'\n    },\n    BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE,\n    HEXCOLOR: {\n      scope: 'number',\n      begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\\b/\n    },\n    FUNCTION_DISPATCH: {\n      className: \"built_in\",\n      begin: /[\\w-]+(?=\\()/\n    },\n    ATTRIBUTE_SELECTOR_MODE: {\n      scope: 'selector-attr',\n      begin: /\\[/,\n      end: /\\]/,\n      illegal: '$',\n      contains: [\n        hljs.APOS_STRING_MODE,\n        hljs.QUOTE_STRING_MODE\n      ]\n    },\n    CSS_NUMBER_MODE: {\n      scope: 'number',\n      begin: hljs.NUMBER_RE + '(' +\n        '%|em|ex|ch|rem' +\n        '|vw|vh|vmin|vmax' +\n        '|cm|mm|in|pt|pc|px' +\n        '|deg|grad|rad|turn' +\n        '|s|ms' +\n        '|Hz|kHz' +\n        '|dpi|dpcm|dppx' +\n        ')?',\n      relevance: 0\n    },\n    CSS_VARIABLE: {\n      className: \"attr\",\n      begin: /--[A-Za-z_][A-Za-z0-9_-]*/\n    }\n  };\n};\n\nconst HTML_TAGS = [\n  'a',\n  'abbr',\n  'address',\n  'article',\n  'aside',\n  'audio',\n  'b',\n  'blockquote',\n  'body',\n  'button',\n  'canvas',\n  'caption',\n  'cite',\n  'code',\n  'dd',\n  'del',\n  'details',\n  'dfn',\n  'div',\n  'dl',\n  'dt',\n  'em',\n  'fieldset',\n  'figcaption',\n  'figure',\n  'footer',\n  'form',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'header',\n  'hgroup',\n  'html',\n  'i',\n  'iframe',\n  'img',\n  'input',\n  'ins',\n  'kbd',\n  'label',\n  'legend',\n  'li',\n  'main',\n  'mark',\n  'menu',\n  'nav',\n  'object',\n  'ol',\n  'optgroup',\n  'option',\n  'p',\n  'picture',\n  'q',\n  'quote',\n  'samp',\n  'section',\n  'select',\n  'source',\n  'span',\n  'strong',\n  'summary',\n  'sup',\n  'table',\n  'tbody',\n  'td',\n  'textarea',\n  'tfoot',\n  'th',\n  'thead',\n  'time',\n  'tr',\n  'ul',\n  'var',\n  'video'\n];\n\nconst SVG_TAGS = [\n  'defs',\n  'g',\n  'marker',\n  'mask',\n  'pattern',\n  'svg',\n  'switch',\n  'symbol',\n  'feBlend',\n  'feColorMatrix',\n  'feComponentTransfer',\n  'feComposite',\n  'feConvolveMatrix',\n  'feDiffuseLighting',\n  'feDisplacementMap',\n  'feFlood',\n  'feGaussianBlur',\n  'feImage',\n  'feMerge',\n  'feMorphology',\n  'feOffset',\n  'feSpecularLighting',\n  'feTile',\n  'feTurbulence',\n  'linearGradient',\n  'radialGradient',\n  'stop',\n  'circle',\n  'ellipse',\n  'image',\n  'line',\n  'path',\n  'polygon',\n  'polyline',\n  'rect',\n  'text',\n  'use',\n  'textPath',\n  'tspan',\n  'foreignObject',\n  'clipPath'\n];\n\nconst TAGS = [\n  ...HTML_TAGS,\n  ...SVG_TAGS,\n];\n\n// Sorting, then reversing makes sure longer attributes/elements like\n// `font-weight` are matched fully instead of getting false positives on say `font`\n\nconst MEDIA_FEATURES = [\n  'any-hover',\n  'any-pointer',\n  'aspect-ratio',\n  'color',\n  'color-gamut',\n  'color-index',\n  'device-aspect-ratio',\n  'device-height',\n  'device-width',\n  'display-mode',\n  'forced-colors',\n  'grid',\n  'height',\n  'hover',\n  'inverted-colors',\n  'monochrome',\n  'orientation',\n  'overflow-block',\n  'overflow-inline',\n  'pointer',\n  'prefers-color-scheme',\n  'prefers-contrast',\n  'prefers-reduced-motion',\n  'prefers-reduced-transparency',\n  'resolution',\n  'scan',\n  'scripting',\n  'update',\n  'width',\n  // TODO: find a better solution?\n  'min-width',\n  'max-width',\n  'min-height',\n  'max-height'\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes\nconst PSEUDO_CLASSES = [\n  'active',\n  'any-link',\n  'blank',\n  'checked',\n  'current',\n  'default',\n  'defined',\n  'dir', // dir()\n  'disabled',\n  'drop',\n  'empty',\n  'enabled',\n  'first',\n  'first-child',\n  'first-of-type',\n  'fullscreen',\n  'future',\n  'focus',\n  'focus-visible',\n  'focus-within',\n  'has', // has()\n  'host', // host or host()\n  'host-context', // host-context()\n  'hover',\n  'indeterminate',\n  'in-range',\n  'invalid',\n  'is', // is()\n  'lang', // lang()\n  'last-child',\n  'last-of-type',\n  'left',\n  'link',\n  'local-link',\n  'not', // not()\n  'nth-child', // nth-child()\n  'nth-col', // nth-col()\n  'nth-last-child', // nth-last-child()\n  'nth-last-col', // nth-last-col()\n  'nth-last-of-type', //nth-last-of-type()\n  'nth-of-type', //nth-of-type()\n  'only-child',\n  'only-of-type',\n  'optional',\n  'out-of-range',\n  'past',\n  'placeholder-shown',\n  'read-only',\n  'read-write',\n  'required',\n  'right',\n  'root',\n  'scope',\n  'target',\n  'target-within',\n  'user-invalid',\n  'valid',\n  'visited',\n  'where' // where()\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements\nconst PSEUDO_ELEMENTS = [\n  'after',\n  'backdrop',\n  'before',\n  'cue',\n  'cue-region',\n  'first-letter',\n  'first-line',\n  'grammar-error',\n  'marker',\n  'part',\n  'placeholder',\n  'selection',\n  'slotted',\n  'spelling-error'\n].sort().reverse();\n\nconst ATTRIBUTES = [\n  'accent-color',\n  'align-content',\n  'align-items',\n  'align-self',\n  'alignment-baseline',\n  'all',\n  'anchor-name',\n  'animation',\n  'animation-composition',\n  'animation-delay',\n  'animation-direction',\n  'animation-duration',\n  'animation-fill-mode',\n  'animation-iteration-count',\n  'animation-name',\n  'animation-play-state',\n  'animation-range',\n  'animation-range-end',\n  'animation-range-start',\n  'animation-timeline',\n  'animation-timing-function',\n  'appearance',\n  'aspect-ratio',\n  'backdrop-filter',\n  'backface-visibility',\n  'background',\n  'background-attachment',\n  'background-blend-mode',\n  'background-clip',\n  'background-color',\n  'background-image',\n  'background-origin',\n  'background-position',\n  'background-position-x',\n  'background-position-y',\n  'background-repeat',\n  'background-size',\n  'baseline-shift',\n  'block-size',\n  'border',\n  'border-block',\n  'border-block-color',\n  'border-block-end',\n  'border-block-end-color',\n  'border-block-end-style',\n  'border-block-end-width',\n  'border-block-start',\n  'border-block-start-color',\n  'border-block-start-style',\n  'border-block-start-width',\n  'border-block-style',\n  'border-block-width',\n  'border-bottom',\n  'border-bottom-color',\n  'border-bottom-left-radius',\n  'border-bottom-right-radius',\n  'border-bottom-style',\n  'border-bottom-width',\n  'border-collapse',\n  'border-color',\n  'border-end-end-radius',\n  'border-end-start-radius',\n  'border-image',\n  'border-image-outset',\n  'border-image-repeat',\n  'border-image-slice',\n  'border-image-source',\n  'border-image-width',\n  'border-inline',\n  'border-inline-color',\n  'border-inline-end',\n  'border-inline-end-color',\n  'border-inline-end-style',\n  'border-inline-end-width',\n  'border-inline-start',\n  'border-inline-start-color',\n  'border-inline-start-style',\n  'border-inline-start-width',\n  'border-inline-style',\n  'border-inline-width',\n  'border-left',\n  'border-left-color',\n  'border-left-style',\n  'border-left-width',\n  'border-radius',\n  'border-right',\n  'border-right-color',\n  'border-right-style',\n  'border-right-width',\n  'border-spacing',\n  'border-start-end-radius',\n  'border-start-start-radius',\n  'border-style',\n  'border-top',\n  'border-top-color',\n  'border-top-left-radius',\n  'border-top-right-radius',\n  'border-top-style',\n  'border-top-width',\n  'border-width',\n  'bottom',\n  'box-align',\n  'box-decoration-break',\n  'box-direction',\n  'box-flex',\n  'box-flex-group',\n  'box-lines',\n  'box-ordinal-group',\n  'box-orient',\n  'box-pack',\n  'box-shadow',\n  'box-sizing',\n  'break-after',\n  'break-before',\n  'break-inside',\n  'caption-side',\n  'caret-color',\n  'clear',\n  'clip',\n  'clip-path',\n  'clip-rule',\n  'color',\n  'color-interpolation',\n  'color-interpolation-filters',\n  'color-profile',\n  'color-rendering',\n  'color-scheme',\n  'column-count',\n  'column-fill',\n  'column-gap',\n  'column-rule',\n  'column-rule-color',\n  'column-rule-style',\n  'column-rule-width',\n  'column-span',\n  'column-width',\n  'columns',\n  'contain',\n  'contain-intrinsic-block-size',\n  'contain-intrinsic-height',\n  'contain-intrinsic-inline-size',\n  'contain-intrinsic-size',\n  'contain-intrinsic-width',\n  'container',\n  'container-name',\n  'container-type',\n  'content',\n  'content-visibility',\n  'counter-increment',\n  'counter-reset',\n  'counter-set',\n  'cue',\n  'cue-after',\n  'cue-before',\n  'cursor',\n  'cx',\n  'cy',\n  'direction',\n  'display',\n  'dominant-baseline',\n  'empty-cells',\n  'enable-background',\n  'field-sizing',\n  'fill',\n  'fill-opacity',\n  'fill-rule',\n  'filter',\n  'flex',\n  'flex-basis',\n  'flex-direction',\n  'flex-flow',\n  'flex-grow',\n  'flex-shrink',\n  'flex-wrap',\n  'float',\n  'flood-color',\n  'flood-opacity',\n  'flow',\n  'font',\n  'font-display',\n  'font-family',\n  'font-feature-settings',\n  'font-kerning',\n  'font-language-override',\n  'font-optical-sizing',\n  'font-palette',\n  'font-size',\n  'font-size-adjust',\n  'font-smooth',\n  'font-smoothing',\n  'font-stretch',\n  'font-style',\n  'font-synthesis',\n  'font-synthesis-position',\n  'font-synthesis-small-caps',\n  'font-synthesis-style',\n  'font-synthesis-weight',\n  'font-variant',\n  'font-variant-alternates',\n  'font-variant-caps',\n  'font-variant-east-asian',\n  'font-variant-emoji',\n  'font-variant-ligatures',\n  'font-variant-numeric',\n  'font-variant-position',\n  'font-variation-settings',\n  'font-weight',\n  'forced-color-adjust',\n  'gap',\n  'glyph-orientation-horizontal',\n  'glyph-orientation-vertical',\n  'grid',\n  'grid-area',\n  'grid-auto-columns',\n  'grid-auto-flow',\n  'grid-auto-rows',\n  'grid-column',\n  'grid-column-end',\n  'grid-column-start',\n  'grid-gap',\n  'grid-row',\n  'grid-row-end',\n  'grid-row-start',\n  'grid-template',\n  'grid-template-areas',\n  'grid-template-columns',\n  'grid-template-rows',\n  'hanging-punctuation',\n  'height',\n  'hyphenate-character',\n  'hyphenate-limit-chars',\n  'hyphens',\n  'icon',\n  'image-orientation',\n  'image-rendering',\n  'image-resolution',\n  'ime-mode',\n  'initial-letter',\n  'initial-letter-align',\n  'inline-size',\n  'inset',\n  'inset-area',\n  'inset-block',\n  'inset-block-end',\n  'inset-block-start',\n  'inset-inline',\n  'inset-inline-end',\n  'inset-inline-start',\n  'isolation',\n  'justify-content',\n  'justify-items',\n  'justify-self',\n  'kerning',\n  'left',\n  'letter-spacing',\n  'lighting-color',\n  'line-break',\n  'line-height',\n  'line-height-step',\n  'list-style',\n  'list-style-image',\n  'list-style-position',\n  'list-style-type',\n  'margin',\n  'margin-block',\n  'margin-block-end',\n  'margin-block-start',\n  'margin-bottom',\n  'margin-inline',\n  'margin-inline-end',\n  'margin-inline-start',\n  'margin-left',\n  'margin-right',\n  'margin-top',\n  'margin-trim',\n  'marker',\n  'marker-end',\n  'marker-mid',\n  'marker-start',\n  'marks',\n  'mask',\n  'mask-border',\n  'mask-border-mode',\n  'mask-border-outset',\n  'mask-border-repeat',\n  'mask-border-slice',\n  'mask-border-source',\n  'mask-border-width',\n  'mask-clip',\n  'mask-composite',\n  'mask-image',\n  'mask-mode',\n  'mask-origin',\n  'mask-position',\n  'mask-repeat',\n  'mask-size',\n  'mask-type',\n  'masonry-auto-flow',\n  'math-depth',\n  'math-shift',\n  'math-style',\n  'max-block-size',\n  'max-height',\n  'max-inline-size',\n  'max-width',\n  'min-block-size',\n  'min-height',\n  'min-inline-size',\n  'min-width',\n  'mix-blend-mode',\n  'nav-down',\n  'nav-index',\n  'nav-left',\n  'nav-right',\n  'nav-up',\n  'none',\n  'normal',\n  'object-fit',\n  'object-position',\n  'offset',\n  'offset-anchor',\n  'offset-distance',\n  'offset-path',\n  'offset-position',\n  'offset-rotate',\n  'opacity',\n  'order',\n  'orphans',\n  'outline',\n  'outline-color',\n  'outline-offset',\n  'outline-style',\n  'outline-width',\n  'overflow',\n  'overflow-anchor',\n  'overflow-block',\n  'overflow-clip-margin',\n  'overflow-inline',\n  'overflow-wrap',\n  'overflow-x',\n  'overflow-y',\n  'overlay',\n  'overscroll-behavior',\n  'overscroll-behavior-block',\n  'overscroll-behavior-inline',\n  'overscroll-behavior-x',\n  'overscroll-behavior-y',\n  'padding',\n  'padding-block',\n  'padding-block-end',\n  'padding-block-start',\n  'padding-bottom',\n  'padding-inline',\n  'padding-inline-end',\n  'padding-inline-start',\n  'padding-left',\n  'padding-right',\n  'padding-top',\n  'page',\n  'page-break-after',\n  'page-break-before',\n  'page-break-inside',\n  'paint-order',\n  'pause',\n  'pause-after',\n  'pause-before',\n  'perspective',\n  'perspective-origin',\n  'place-content',\n  'place-items',\n  'place-self',\n  'pointer-events',\n  'position',\n  'position-anchor',\n  'position-visibility',\n  'print-color-adjust',\n  'quotes',\n  'r',\n  'resize',\n  'rest',\n  'rest-after',\n  'rest-before',\n  'right',\n  'rotate',\n  'row-gap',\n  'ruby-align',\n  'ruby-position',\n  'scale',\n  'scroll-behavior',\n  'scroll-margin',\n  'scroll-margin-block',\n  'scroll-margin-block-end',\n  'scroll-margin-block-start',\n  'scroll-margin-bottom',\n  'scroll-margin-inline',\n  'scroll-margin-inline-end',\n  'scroll-margin-inline-start',\n  'scroll-margin-left',\n  'scroll-margin-right',\n  'scroll-margin-top',\n  'scroll-padding',\n  'scroll-padding-block',\n  'scroll-padding-block-end',\n  'scroll-padding-block-start',\n  'scroll-padding-bottom',\n  'scroll-padding-inline',\n  'scroll-padding-inline-end',\n  'scroll-padding-inline-start',\n  'scroll-padding-left',\n  'scroll-padding-right',\n  'scroll-padding-top',\n  'scroll-snap-align',\n  'scroll-snap-stop',\n  'scroll-snap-type',\n  'scroll-timeline',\n  'scroll-timeline-axis',\n  'scroll-timeline-name',\n  'scrollbar-color',\n  'scrollbar-gutter',\n  'scrollbar-width',\n  'shape-image-threshold',\n  'shape-margin',\n  'shape-outside',\n  'shape-rendering',\n  'speak',\n  'speak-as',\n  'src', // @font-face\n  'stop-color',\n  'stop-opacity',\n  'stroke',\n  'stroke-dasharray',\n  'stroke-dashoffset',\n  'stroke-linecap',\n  'stroke-linejoin',\n  'stroke-miterlimit',\n  'stroke-opacity',\n  'stroke-width',\n  'tab-size',\n  'table-layout',\n  'text-align',\n  'text-align-all',\n  'text-align-last',\n  'text-anchor',\n  'text-combine-upright',\n  'text-decoration',\n  'text-decoration-color',\n  'text-decoration-line',\n  'text-decoration-skip',\n  'text-decoration-skip-ink',\n  'text-decoration-style',\n  'text-decoration-thickness',\n  'text-emphasis',\n  'text-emphasis-color',\n  'text-emphasis-position',\n  'text-emphasis-style',\n  'text-indent',\n  'text-justify',\n  'text-orientation',\n  'text-overflow',\n  'text-rendering',\n  'text-shadow',\n  'text-size-adjust',\n  'text-transform',\n  'text-underline-offset',\n  'text-underline-position',\n  'text-wrap',\n  'text-wrap-mode',\n  'text-wrap-style',\n  'timeline-scope',\n  'top',\n  'touch-action',\n  'transform',\n  'transform-box',\n  'transform-origin',\n  'transform-style',\n  'transition',\n  'transition-behavior',\n  'transition-delay',\n  'transition-duration',\n  'transition-property',\n  'transition-timing-function',\n  'translate',\n  'unicode-bidi',\n  'user-modify',\n  'user-select',\n  'vector-effect',\n  'vertical-align',\n  'view-timeline',\n  'view-timeline-axis',\n  'view-timeline-inset',\n  'view-timeline-name',\n  'view-transition-name',\n  'visibility',\n  'voice-balance',\n  'voice-duration',\n  'voice-family',\n  'voice-pitch',\n  'voice-range',\n  'voice-rate',\n  'voice-stress',\n  'voice-volume',\n  'white-space',\n  'white-space-collapse',\n  'widows',\n  'width',\n  'will-change',\n  'word-break',\n  'word-spacing',\n  'word-wrap',\n  'writing-mode',\n  'x',\n  'y',\n  'z-index',\n  'zoom'\n].sort().reverse();\n\n/*\nLanguage: CSS\nCategory: common, css, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/CSS\n*/\n\n\n/** @type LanguageFn */\nfunction css(hljs) {\n  const regex = hljs.regex;\n  const modes = MODES(hljs);\n  const VENDOR_PREFIX = { begin: /-(webkit|moz|ms|o)-(?=[a-z])/ };\n  const AT_MODIFIERS = \"and or not only\";\n  const AT_PROPERTY_RE = /@-?\\w[\\w]*(-\\w+)*/; // @-webkit-keyframes\n  const IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';\n  const STRINGS = [\n    hljs.APOS_STRING_MODE,\n    hljs.QUOTE_STRING_MODE\n  ];\n\n  return {\n    name: 'CSS',\n    case_insensitive: true,\n    illegal: /[=|'\\$]/,\n    keywords: { keyframePosition: \"from to\" },\n    classNameAliases: {\n      // for visual continuity with `tag {}` and because we\n      // don't have a great class for this?\n      keyframePosition: \"selector-tag\" },\n    contains: [\n      modes.BLOCK_COMMENT,\n      VENDOR_PREFIX,\n      // to recognize keyframe 40% etc which are outside the scope of our\n      // attribute value mode\n      modes.CSS_NUMBER_MODE,\n      {\n        className: 'selector-id',\n        begin: /#[A-Za-z0-9_-]+/,\n        relevance: 0\n      },\n      {\n        className: 'selector-class',\n        begin: '\\\\.' + IDENT_RE,\n        relevance: 0\n      },\n      modes.ATTRIBUTE_SELECTOR_MODE,\n      {\n        className: 'selector-pseudo',\n        variants: [\n          { begin: ':(' + PSEUDO_CLASSES.join('|') + ')' },\n          { begin: ':(:)?(' + PSEUDO_ELEMENTS.join('|') + ')' }\n        ]\n      },\n      // we may actually need this (12/2020)\n      // { // pseudo-selector params\n      //   begin: /\\(/,\n      //   end: /\\)/,\n      //   contains: [ hljs.CSS_NUMBER_MODE ]\n      // },\n      modes.CSS_VARIABLE,\n      {\n        className: 'attribute',\n        begin: '\\\\b(' + ATTRIBUTES.join('|') + ')\\\\b'\n      },\n      // attribute values\n      {\n        begin: /:/,\n        end: /[;}{]/,\n        contains: [\n          modes.BLOCK_COMMENT,\n          modes.HEXCOLOR,\n          modes.IMPORTANT,\n          modes.CSS_NUMBER_MODE,\n          ...STRINGS,\n          // needed to highlight these as strings and to avoid issues with\n          // illegal characters that might be inside urls that would tigger the\n          // languages illegal stack\n          {\n            begin: /(url|data-uri)\\(/,\n            end: /\\)/,\n            relevance: 0, // from keywords\n            keywords: { built_in: \"url data-uri\" },\n            contains: [\n              ...STRINGS,\n              {\n                className: \"string\",\n                // any character other than `)` as in `url()` will be the start\n                // of a string, which ends with `)` (from the parent mode)\n                begin: /[^)]/,\n                endsWithParent: true,\n                excludeEnd: true\n              }\n            ]\n          },\n          modes.FUNCTION_DISPATCH\n        ]\n      },\n      {\n        begin: regex.lookahead(/@/),\n        end: '[{;]',\n        relevance: 0,\n        illegal: /:/, // break on Less variables @var: ...\n        contains: [\n          {\n            className: 'keyword',\n            begin: AT_PROPERTY_RE\n          },\n          {\n            begin: /\\s/,\n            endsWithParent: true,\n            excludeEnd: true,\n            relevance: 0,\n            keywords: {\n              $pattern: /[a-z-]+/,\n              keyword: AT_MODIFIERS,\n              attribute: MEDIA_FEATURES.join(\" \")\n            },\n            contains: [\n              {\n                begin: /[a-z-]+(?=:)/,\n                className: \"attribute\"\n              },\n              ...STRINGS,\n              modes.CSS_NUMBER_MODE\n            ]\n          }\n        ]\n      },\n      {\n        className: 'selector-tag',\n        begin: '\\\\b(' + TAGS.join('|') + ')\\\\b'\n      }\n    ]\n  };\n}\n\nmodule.exports = css;\n","/*\nLanguage: Markdown\nRequires: xml.js\nAuthor: John Crepezzi <john.crepezzi@gmail.com>\nWebsite: https://daringfireball.net/projects/markdown/\nCategory: common, markup\n*/\n\nfunction markdown(hljs) {\n  const regex = hljs.regex;\n  const INLINE_HTML = {\n    begin: /<\\/?[A-Za-z_]/,\n    end: '>',\n    subLanguage: 'xml',\n    relevance: 0\n  };\n  const HORIZONTAL_RULE = {\n    begin: '^[-\\\\*]{3,}',\n    end: '$'\n  };\n  const CODE = {\n    className: 'code',\n    variants: [\n      // TODO: fix to allow these to work with sublanguage also\n      { begin: '(`{3,})[^`](.|\\\\n)*?\\\\1`*[ ]*' },\n      { begin: '(~{3,})[^~](.|\\\\n)*?\\\\1~*[ ]*' },\n      // needed to allow markdown as a sublanguage to work\n      {\n        begin: '```',\n        end: '```+[ ]*$'\n      },\n      {\n        begin: '~~~',\n        end: '~~~+[ ]*$'\n      },\n      { begin: '`.+?`' },\n      {\n        begin: '(?=^( {4}|\\\\t))',\n        // use contains to gobble up multiple lines to allow the block to be whatever size\n        // but only have a single open/close tag vs one per line\n        contains: [\n          {\n            begin: '^( {4}|\\\\t)',\n            end: '(\\\\n)$'\n          }\n        ],\n        relevance: 0\n      }\n    ]\n  };\n  const LIST = {\n    className: 'bullet',\n    begin: '^[ \\t]*([*+-]|(\\\\d+\\\\.))(?=\\\\s+)',\n    end: '\\\\s+',\n    excludeEnd: true\n  };\n  const LINK_REFERENCE = {\n    begin: /^\\[[^\\n]+\\]:/,\n    returnBegin: true,\n    contains: [\n      {\n        className: 'symbol',\n        begin: /\\[/,\n        end: /\\]/,\n        excludeBegin: true,\n        excludeEnd: true\n      },\n      {\n        className: 'link',\n        begin: /:\\s*/,\n        end: /$/,\n        excludeBegin: true\n      }\n    ]\n  };\n  const URL_SCHEME = /[A-Za-z][A-Za-z0-9+.-]*/;\n  const LINK = {\n    variants: [\n      // too much like nested array access in so many languages\n      // to have any real relevance\n      {\n        begin: /\\[.+?\\]\\[.*?\\]/,\n        relevance: 0\n      },\n      // popular internet URLs\n      {\n        begin: /\\[.+?\\]\\(((data|javascript|mailto):|(?:http|ftp)s?:\\/\\/).*?\\)/,\n        relevance: 2\n      },\n      {\n        begin: regex.concat(/\\[.+?\\]\\(/, URL_SCHEME, /:\\/\\/.*?\\)/),\n        relevance: 2\n      },\n      // relative urls\n      {\n        begin: /\\[.+?\\]\\([./?&#].*?\\)/,\n        relevance: 1\n      },\n      // whatever else, lower relevance (might not be a link at all)\n      {\n        begin: /\\[.*?\\]\\(.*?\\)/,\n        relevance: 0\n      }\n    ],\n    returnBegin: true,\n    contains: [\n      {\n        // empty strings for alt or link text\n        match: /\\[(?=\\])/ },\n      {\n        className: 'string',\n        relevance: 0,\n        begin: '\\\\[',\n        end: '\\\\]',\n        excludeBegin: true,\n        returnEnd: true\n      },\n      {\n        className: 'link',\n        relevance: 0,\n        begin: '\\\\]\\\\(',\n        end: '\\\\)',\n        excludeBegin: true,\n        excludeEnd: true\n      },\n      {\n        className: 'symbol',\n        relevance: 0,\n        begin: '\\\\]\\\\[',\n        end: '\\\\]',\n        excludeBegin: true,\n        excludeEnd: true\n      }\n    ]\n  };\n  const BOLD = {\n    className: 'strong',\n    contains: [], // defined later\n    variants: [\n      {\n        begin: /_{2}(?!\\s)/,\n        end: /_{2}/\n      },\n      {\n        begin: /\\*{2}(?!\\s)/,\n        end: /\\*{2}/\n      }\n    ]\n  };\n  const ITALIC = {\n    className: 'emphasis',\n    contains: [], // defined later\n    variants: [\n      {\n        begin: /\\*(?![*\\s])/,\n        end: /\\*/\n      },\n      {\n        begin: /_(?![_\\s])/,\n        end: /_/,\n        relevance: 0\n      }\n    ]\n  };\n\n  // 3 level deep nesting is not allowed because it would create confusion\n  // in cases like `***testing***` because where we don't know if the last\n  // `***` is starting a new bold/italic or finishing the last one\n  const BOLD_WITHOUT_ITALIC = hljs.inherit(BOLD, { contains: [] });\n  const ITALIC_WITHOUT_BOLD = hljs.inherit(ITALIC, { contains: [] });\n  BOLD.contains.push(ITALIC_WITHOUT_BOLD);\n  ITALIC.contains.push(BOLD_WITHOUT_ITALIC);\n\n  let CONTAINABLE = [\n    INLINE_HTML,\n    LINK\n  ];\n\n  [\n    BOLD,\n    ITALIC,\n    BOLD_WITHOUT_ITALIC,\n    ITALIC_WITHOUT_BOLD\n  ].forEach(m => {\n    m.contains = m.contains.concat(CONTAINABLE);\n  });\n\n  CONTAINABLE = CONTAINABLE.concat(BOLD, ITALIC);\n\n  const HEADER = {\n    className: 'section',\n    variants: [\n      {\n        begin: '^#{1,6}',\n        end: '$',\n        contains: CONTAINABLE\n      },\n      {\n        begin: '(?=^.+?\\\\n[=-]{2,}$)',\n        contains: [\n          { begin: '^[=-]*$' },\n          {\n            begin: '^',\n            end: \"\\\\n\",\n            contains: CONTAINABLE\n          }\n        ]\n      }\n    ]\n  };\n\n  const BLOCKQUOTE = {\n    className: 'quote',\n    begin: '^>\\\\s+',\n    contains: CONTAINABLE,\n    end: '$'\n  };\n\n  const ENTITY = {\n    //https://spec.commonmark.org/0.31.2/#entity-references\n    scope: 'literal',\n    match: /&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/\n  };\n\n  return {\n    name: 'Markdown',\n    aliases: [\n      'md',\n      'mkdown',\n      'mkd'\n    ],\n    contains: [\n      HEADER,\n      INLINE_HTML,\n      LIST,\n      BOLD,\n      ITALIC,\n      BLOCKQUOTE,\n      CODE,\n      HORIZONTAL_RULE,\n      LINK,\n      LINK_REFERENCE,\n      ENTITY\n    ]\n  };\n}\n\nmodule.exports = markdown;\n","/*\nLanguage: Diff\nDescription: Unified and context diff\nAuthor: Vasily Polovnyov <vast@whiteants.net>\nWebsite: https://www.gnu.org/software/diffutils/\nCategory: common\n*/\n\n/** @type LanguageFn */\nfunction diff(hljs) {\n  const regex = hljs.regex;\n  return {\n    name: 'Diff',\n    aliases: [ 'patch' ],\n    contains: [\n      {\n        className: 'meta',\n        relevance: 10,\n        match: regex.either(\n          /^@@ +-\\d+,\\d+ +\\+\\d+,\\d+ +@@/,\n          /^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/,\n          /^--- +\\d+,\\d+ +----$/\n        )\n      },\n      {\n        className: 'comment',\n        variants: [\n          {\n            begin: regex.either(\n              /Index: /,\n              /^index/,\n              /={3,}/,\n              /^-{3}/,\n              /^\\*{3} /,\n              /^\\+{3}/,\n              /^diff --git/\n            ),\n            end: /$/\n          },\n          { match: /^\\*{15}$/ }\n        ]\n      },\n      {\n        className: 'addition',\n        begin: /^\\+/,\n        end: /$/\n      },\n      {\n        className: 'deletion',\n        begin: /^-/,\n        end: /$/\n      },\n      {\n        className: 'addition',\n        begin: /^!/,\n        end: /$/\n      }\n    ]\n  };\n}\n\nmodule.exports = diff;\n","/*\nLanguage: Ruby\nDescription: Ruby is a dynamic, open source programming language with a focus on simplicity and productivity.\nWebsite: https://www.ruby-lang.org/\nAuthor: Anton Kovalyov <anton@kovalyov.net>\nContributors: Peter Leonov <gojpeg@yandex.ru>, Vasily Polovnyov <vast@whiteants.net>, Loren Segal <lsegal@soen.ca>, Pascal Hurni <phi@ruby-reactive.org>, Cedric Sohrauer <sohrauer@googlemail.com>\nCategory: common, scripting\n*/\n\nfunction ruby(hljs) {\n  const regex = hljs.regex;\n  const RUBY_METHOD_RE = '([a-zA-Z_]\\\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?)';\n  // TODO: move concepts like CAMEL_CASE into `modes.js`\n  const CLASS_NAME_RE = regex.either(\n    /\\b([A-Z]+[a-z0-9]+)+/,\n    // ends in caps\n    /\\b([A-Z]+[a-z0-9]+)+[A-Z]+/,\n  )\n  ;\n  const CLASS_NAME_WITH_NAMESPACE_RE = regex.concat(CLASS_NAME_RE, /(::\\w+)*/);\n  // very popular ruby built-ins that one might even assume\n  // are actual keywords (despite that not being the case)\n  const PSEUDO_KWS = [\n    \"include\",\n    \"extend\",\n    \"prepend\",\n    \"public\",\n    \"private\",\n    \"protected\",\n    \"raise\",\n    \"throw\"\n  ];\n  const RUBY_KEYWORDS = {\n    \"variable.constant\": [\n      \"__FILE__\",\n      \"__LINE__\",\n      \"__ENCODING__\"\n    ],\n    \"variable.language\": [\n      \"self\",\n      \"super\",\n    ],\n    keyword: [\n      \"alias\",\n      \"and\",\n      \"begin\",\n      \"BEGIN\",\n      \"break\",\n      \"case\",\n      \"class\",\n      \"defined\",\n      \"do\",\n      \"else\",\n      \"elsif\",\n      \"end\",\n      \"END\",\n      \"ensure\",\n      \"for\",\n      \"if\",\n      \"in\",\n      \"module\",\n      \"next\",\n      \"not\",\n      \"or\",\n      \"redo\",\n      \"require\",\n      \"rescue\",\n      \"retry\",\n      \"return\",\n      \"then\",\n      \"undef\",\n      \"unless\",\n      \"until\",\n      \"when\",\n      \"while\",\n      \"yield\",\n      ...PSEUDO_KWS\n    ],\n    built_in: [\n      \"proc\",\n      \"lambda\",\n      \"attr_accessor\",\n      \"attr_reader\",\n      \"attr_writer\",\n      \"define_method\",\n      \"private_constant\",\n      \"module_function\"\n    ],\n    literal: [\n      \"true\",\n      \"false\",\n      \"nil\"\n    ]\n  };\n  const YARDOCTAG = {\n    className: 'doctag',\n    begin: '@[A-Za-z]+'\n  };\n  const IRB_OBJECT = {\n    begin: '#<',\n    end: '>'\n  };\n  const COMMENT_MODES = [\n    hljs.COMMENT(\n      '#',\n      '$',\n      { contains: [ YARDOCTAG ] }\n    ),\n    hljs.COMMENT(\n      '^=begin',\n      '^=end',\n      {\n        contains: [ YARDOCTAG ],\n        relevance: 10\n      }\n    ),\n    hljs.COMMENT('^__END__', hljs.MATCH_NOTHING_RE)\n  ];\n  const SUBST = {\n    className: 'subst',\n    begin: /#\\{/,\n    end: /\\}/,\n    keywords: RUBY_KEYWORDS\n  };\n  const STRING = {\n    className: 'string',\n    contains: [\n      hljs.BACKSLASH_ESCAPE,\n      SUBST\n    ],\n    variants: [\n      {\n        begin: /'/,\n        end: /'/\n      },\n      {\n        begin: /\"/,\n        end: /\"/\n      },\n      {\n        begin: /`/,\n        end: /`/\n      },\n      {\n        begin: /%[qQwWx]?\\(/,\n        end: /\\)/\n      },\n      {\n        begin: /%[qQwWx]?\\[/,\n        end: /\\]/\n      },\n      {\n        begin: /%[qQwWx]?\\{/,\n        end: /\\}/\n      },\n      {\n        begin: /%[qQwWx]?</,\n        end: />/\n      },\n      {\n        begin: /%[qQwWx]?\\//,\n        end: /\\//\n      },\n      {\n        begin: /%[qQwWx]?%/,\n        end: /%/\n      },\n      {\n        begin: /%[qQwWx]?-/,\n        end: /-/\n      },\n      {\n        begin: /%[qQwWx]?\\|/,\n        end: /\\|/\n      },\n      // in the following expressions, \\B in the beginning suppresses recognition of ?-sequences\n      // where ? is the last character of a preceding identifier, as in: `func?4`\n      { begin: /\\B\\?(\\\\\\d{1,3})/ },\n      { begin: /\\B\\?(\\\\x[A-Fa-f0-9]{1,2})/ },\n      { begin: /\\B\\?(\\\\u\\{?[A-Fa-f0-9]{1,6}\\}?)/ },\n      { begin: /\\B\\?(\\\\M-\\\\C-|\\\\M-\\\\c|\\\\c\\\\M-|\\\\M-|\\\\C-\\\\M-)[\\x20-\\x7e]/ },\n      { begin: /\\B\\?\\\\(c|C-)[\\x20-\\x7e]/ },\n      { begin: /\\B\\?\\\\?\\S/ },\n      // heredocs\n      {\n        // this guard makes sure that we have an entire heredoc and not a false\n        // positive (auto-detect, etc.)\n        begin: regex.concat(\n          /<<[-~]?'?/,\n          regex.lookahead(/(\\w+)(?=\\W)[^\\n]*\\n(?:[^\\n]*\\n)*?\\s*\\1\\b/)\n        ),\n        contains: [\n          hljs.END_SAME_AS_BEGIN({\n            begin: /(\\w+)/,\n            end: /(\\w+)/,\n            contains: [\n              hljs.BACKSLASH_ESCAPE,\n              SUBST\n            ]\n          })\n        ]\n      }\n    ]\n  };\n\n  // Ruby syntax is underdocumented, but this grammar seems to be accurate\n  // as of version 2.7.2 (confirmed with (irb and `Ripper.sexp(...)`)\n  // https://docs.ruby-lang.org/en/2.7.0/doc/syntax/literals_rdoc.html#label-Numbers\n  const decimal = '[1-9](_?[0-9])*|0';\n  const digits = '[0-9](_?[0-9])*';\n  const NUMBER = {\n    className: 'number',\n    relevance: 0,\n    variants: [\n      // decimal integer/float, optionally exponential or rational, optionally imaginary\n      { begin: `\\\\b(${decimal})(\\\\.(${digits}))?([eE][+-]?(${digits})|r)?i?\\\\b` },\n\n      // explicit decimal/binary/octal/hexadecimal integer,\n      // optionally rational and/or imaginary\n      { begin: \"\\\\b0[dD][0-9](_?[0-9])*r?i?\\\\b\" },\n      { begin: \"\\\\b0[bB][0-1](_?[0-1])*r?i?\\\\b\" },\n      { begin: \"\\\\b0[oO][0-7](_?[0-7])*r?i?\\\\b\" },\n      { begin: \"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\\\b\" },\n\n      // 0-prefixed implicit octal integer, optionally rational and/or imaginary\n      { begin: \"\\\\b0(_?[0-7])+r?i?\\\\b\" }\n    ]\n  };\n\n  const PARAMS = {\n    variants: [\n      {\n        match: /\\(\\)/,\n      },\n      {\n        className: 'params',\n        begin: /\\(/,\n        end: /(?=\\))/,\n        excludeBegin: true,\n        endsParent: true,\n        keywords: RUBY_KEYWORDS,\n      }\n    ]\n  };\n\n  const INCLUDE_EXTEND = {\n    match: [\n      /(include|extend)\\s+/,\n      CLASS_NAME_WITH_NAMESPACE_RE\n    ],\n    scope: {\n      2: \"title.class\"\n    },\n    keywords: RUBY_KEYWORDS\n  };\n\n  const CLASS_DEFINITION = {\n    variants: [\n      {\n        match: [\n          /class\\s+/,\n          CLASS_NAME_WITH_NAMESPACE_RE,\n          /\\s+<\\s+/,\n          CLASS_NAME_WITH_NAMESPACE_RE\n        ]\n      },\n      {\n        match: [\n          /\\b(class|module)\\s+/,\n          CLASS_NAME_WITH_NAMESPACE_RE\n        ]\n      }\n    ],\n    scope: {\n      2: \"title.class\",\n      4: \"title.class.inherited\"\n    },\n    keywords: RUBY_KEYWORDS\n  };\n\n  const UPPER_CASE_CONSTANT = {\n    relevance: 0,\n    match: /\\b[A-Z][A-Z_0-9]+\\b/,\n    className: \"variable.constant\"\n  };\n\n  const METHOD_DEFINITION = {\n    match: [\n      /def/, /\\s+/,\n      RUBY_METHOD_RE\n    ],\n    scope: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    contains: [\n      PARAMS\n    ]\n  };\n\n  const OBJECT_CREATION = {\n    relevance: 0,\n    match: [\n      CLASS_NAME_WITH_NAMESPACE_RE,\n      /\\.new[. (]/\n    ],\n    scope: {\n      1: \"title.class\"\n    }\n  };\n\n  // CamelCase\n  const CLASS_REFERENCE = {\n    relevance: 0,\n    match: CLASS_NAME_RE,\n    scope: \"title.class\"\n  };\n\n  const RUBY_DEFAULT_CONTAINS = [\n    STRING,\n    CLASS_DEFINITION,\n    INCLUDE_EXTEND,\n    OBJECT_CREATION,\n    UPPER_CASE_CONSTANT,\n    CLASS_REFERENCE,\n    METHOD_DEFINITION,\n    {\n      // swallow namespace qualifiers before symbols\n      begin: hljs.IDENT_RE + '::' },\n    {\n      className: 'symbol',\n      begin: hljs.UNDERSCORE_IDENT_RE + '(!|\\\\?)?:',\n      relevance: 0\n    },\n    {\n      className: 'symbol',\n      begin: ':(?!\\\\s)',\n      contains: [\n        STRING,\n        { begin: RUBY_METHOD_RE }\n      ],\n      relevance: 0\n    },\n    NUMBER,\n    {\n      // negative-look forward attempts to prevent false matches like:\n      // @ident@ or $ident$ that might indicate this is not ruby at all\n      className: \"variable\",\n      begin: '(\\\\$\\\\W)|((\\\\$|@@?)(\\\\w+))(?=[^@$?])' + `(?![A-Za-z])(?![@$?'])`\n    },\n    {\n      className: 'params',\n      begin: /\\|(?!=)/,\n      end: /\\|/,\n      excludeBegin: true,\n      excludeEnd: true,\n      relevance: 0, // this could be a lot of things (in other languages) other than params\n      keywords: RUBY_KEYWORDS\n    },\n    { // regexp container\n      begin: '(' + hljs.RE_STARTERS_RE + '|unless)\\\\s*',\n      keywords: 'unless',\n      contains: [\n        {\n          className: 'regexp',\n          contains: [\n            hljs.BACKSLASH_ESCAPE,\n            SUBST\n          ],\n          illegal: /\\n/,\n          variants: [\n            {\n              begin: '/',\n              end: '/[a-z]*'\n            },\n            {\n              begin: /%r\\{/,\n              end: /\\}[a-z]*/\n            },\n            {\n              begin: '%r\\\\(',\n              end: '\\\\)[a-z]*'\n            },\n            {\n              begin: '%r!',\n              end: '![a-z]*'\n            },\n            {\n              begin: '%r\\\\[',\n              end: '\\\\][a-z]*'\n            }\n          ]\n        }\n      ].concat(IRB_OBJECT, COMMENT_MODES),\n      relevance: 0\n    }\n  ].concat(IRB_OBJECT, COMMENT_MODES);\n\n  SUBST.contains = RUBY_DEFAULT_CONTAINS;\n  PARAMS.contains = RUBY_DEFAULT_CONTAINS;\n\n  // >>\n  // ?>\n  const SIMPLE_PROMPT = \"[>?]>\";\n  // irb(main):001:0>\n  const DEFAULT_PROMPT = \"[\\\\w#]+\\\\(\\\\w+\\\\):\\\\d+:\\\\d+[>*]\";\n  const RVM_PROMPT = \"(\\\\w+-)?\\\\d+\\\\.\\\\d+\\\\.\\\\d+(p\\\\d+)?[^\\\\d][^>]+>\";\n\n  const IRB_DEFAULT = [\n    {\n      begin: /^\\s*=>/,\n      starts: {\n        end: '$',\n        contains: RUBY_DEFAULT_CONTAINS\n      }\n    },\n    {\n      className: 'meta.prompt',\n      begin: '^(' + SIMPLE_PROMPT + \"|\" + DEFAULT_PROMPT + '|' + RVM_PROMPT + ')(?=[ ])',\n      starts: {\n        end: '$',\n        keywords: RUBY_KEYWORDS,\n        contains: RUBY_DEFAULT_CONTAINS\n      }\n    }\n  ];\n\n  COMMENT_MODES.unshift(IRB_OBJECT);\n\n  return {\n    name: 'Ruby',\n    aliases: [\n      'rb',\n      'gemspec',\n      'podspec',\n      'thor',\n      'irb'\n    ],\n    keywords: RUBY_KEYWORDS,\n    illegal: /\\/\\*/,\n    contains: [ hljs.SHEBANG({ binary: \"ruby\" }) ]\n      .concat(IRB_DEFAULT)\n      .concat(COMMENT_MODES)\n      .concat(RUBY_DEFAULT_CONTAINS)\n  };\n}\n\nmodule.exports = ruby;\n","/*\nLanguage: Go\nAuthor: Stephan Kountso aka StepLg <steplg@gmail.com>\nContributors: Evgeny Stepanischev <imbolk@gmail.com>\nDescription: Google go language (golang). For info about language\nWebsite: http://golang.org/\nCategory: common, system\n*/\n\nfunction go(hljs) {\n  const LITERALS = [\n    \"true\",\n    \"false\",\n    \"iota\",\n    \"nil\"\n  ];\n  const BUILT_INS = [\n    \"append\",\n    \"cap\",\n    \"close\",\n    \"complex\",\n    \"copy\",\n    \"imag\",\n    \"len\",\n    \"make\",\n    \"new\",\n    \"panic\",\n    \"print\",\n    \"println\",\n    \"real\",\n    \"recover\",\n    \"delete\"\n  ];\n  const TYPES = [\n    \"bool\",\n    \"byte\",\n    \"complex64\",\n    \"complex128\",\n    \"error\",\n    \"float32\",\n    \"float64\",\n    \"int8\",\n    \"int16\",\n    \"int32\",\n    \"int64\",\n    \"string\",\n    \"uint8\",\n    \"uint16\",\n    \"uint32\",\n    \"uint64\",\n    \"int\",\n    \"uint\",\n    \"uintptr\",\n    \"rune\"\n  ];\n  const KWS = [\n    \"break\",\n    \"case\",\n    \"chan\",\n    \"const\",\n    \"continue\",\n    \"default\",\n    \"defer\",\n    \"else\",\n    \"fallthrough\",\n    \"for\",\n    \"func\",\n    \"go\",\n    \"goto\",\n    \"if\",\n    \"import\",\n    \"interface\",\n    \"map\",\n    \"package\",\n    \"range\",\n    \"return\",\n    \"select\",\n    \"struct\",\n    \"switch\",\n    \"type\",\n    \"var\",\n  ];\n  const KEYWORDS = {\n    keyword: KWS,\n    type: TYPES,\n    literal: LITERALS,\n    built_in: BUILT_INS\n  };\n  return {\n    name: 'Go',\n    aliases: [ 'golang' ],\n    keywords: KEYWORDS,\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'string',\n        variants: [\n          hljs.QUOTE_STRING_MODE,\n          hljs.APOS_STRING_MODE,\n          {\n            begin: '`',\n            end: '`'\n          }\n        ]\n      },\n      {\n        className: 'number',\n        variants: [\n          {\n            match: /-?\\b0[xX]\\.[a-fA-F0-9](_?[a-fA-F0-9])*[pP][+-]?\\d(_?\\d)*i?/, // hex without a present digit before . (making a digit afterwards required)\n            relevance: 0\n          },\n          {\n            match: /-?\\b0[xX](_?[a-fA-F0-9])+((\\.([a-fA-F0-9](_?[a-fA-F0-9])*)?)?[pP][+-]?\\d(_?\\d)*)?i?/, // hex with a present digit before . (making a digit afterwards optional)\n            relevance: 0\n          },\n          {\n            match: /-?\\b0[oO](_?[0-7])*i?/, // leading 0o octal\n            relevance: 0\n          },\n          {\n            match: /-?\\.\\d(_?\\d)*([eE][+-]?\\d(_?\\d)*)?i?/, // decimal without a present digit before . (making a digit afterwards required)\n            relevance: 0\n          },\n          {\n            match: /-?\\b\\d(_?\\d)*(\\.(\\d(_?\\d)*)?)?([eE][+-]?\\d(_?\\d)*)?i?/, // decimal with a present digit before . (making a digit afterwards optional)\n            relevance: 0\n          }\n        ]\n      },\n      { begin: /:=/ // relevance booster\n      },\n      {\n        className: 'function',\n        beginKeywords: 'func',\n        end: '\\\\s*(\\\\{|$)',\n        excludeEnd: true,\n        contains: [\n          hljs.TITLE_MODE,\n          {\n            className: 'params',\n            begin: /\\(/,\n            end: /\\)/,\n            endsParent: true,\n            keywords: KEYWORDS,\n            illegal: /[\"']/\n          }\n        ]\n      }\n    ]\n  };\n}\n\nmodule.exports = go;\n","/*\n Language: GraphQL\n Author: John Foster (GH jf990), and others\n Description: GraphQL is a query language for APIs\n Category: web, common\n*/\n\n/** @type LanguageFn */\nfunction graphql(hljs) {\n  const regex = hljs.regex;\n  const GQL_NAME = /[_A-Za-z][_0-9A-Za-z]*/;\n  return {\n    name: \"GraphQL\",\n    aliases: [ \"gql\" ],\n    case_insensitive: true,\n    disableAutodetect: false,\n    keywords: {\n      keyword: [\n        \"query\",\n        \"mutation\",\n        \"subscription\",\n        \"type\",\n        \"input\",\n        \"schema\",\n        \"directive\",\n        \"interface\",\n        \"union\",\n        \"scalar\",\n        \"fragment\",\n        \"enum\",\n        \"on\"\n      ],\n      literal: [\n        \"true\",\n        \"false\",\n        \"null\"\n      ]\n    },\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE,\n      {\n        scope: \"punctuation\",\n        match: /[.]{3}/,\n        relevance: 0\n      },\n      {\n        scope: \"punctuation\",\n        begin: /[\\!\\(\\)\\:\\=\\[\\]\\{\\|\\}]{1}/,\n        relevance: 0\n      },\n      {\n        scope: \"variable\",\n        begin: /\\$/,\n        end: /\\W/,\n        excludeEnd: true,\n        relevance: 0\n      },\n      {\n        scope: \"meta\",\n        match: /@\\w+/,\n        excludeEnd: true\n      },\n      {\n        scope: \"symbol\",\n        begin: regex.concat(GQL_NAME, regex.lookahead(/\\s*:/)),\n        relevance: 0\n      }\n    ],\n    illegal: [\n      /[;<']/,\n      /BEGIN/\n    ]\n  };\n}\n\nmodule.exports = graphql;\n","/*\nLanguage: TOML, also INI\nDescription: TOML aims to be a minimal configuration file format that's easy to read due to obvious semantics.\nContributors: Guillaume Gomez <guillaume1.gomez@gmail.com>\nCategory: common, config\nWebsite: https://github.com/toml-lang/toml\n*/\n\nfunction ini(hljs) {\n  const regex = hljs.regex;\n  const NUMBERS = {\n    className: 'number',\n    relevance: 0,\n    variants: [\n      { begin: /([+-]+)?[\\d]+_[\\d_]+/ },\n      { begin: hljs.NUMBER_RE }\n    ]\n  };\n  const COMMENTS = hljs.COMMENT();\n  COMMENTS.variants = [\n    {\n      begin: /;/,\n      end: /$/\n    },\n    {\n      begin: /#/,\n      end: /$/\n    }\n  ];\n  const VARIABLES = {\n    className: 'variable',\n    variants: [\n      { begin: /\\$[\\w\\d\"][\\w\\d_]*/ },\n      { begin: /\\$\\{(.*?)\\}/ }\n    ]\n  };\n  const LITERALS = {\n    className: 'literal',\n    begin: /\\bon|off|true|false|yes|no\\b/\n  };\n  const STRINGS = {\n    className: \"string\",\n    contains: [ hljs.BACKSLASH_ESCAPE ],\n    variants: [\n      {\n        begin: \"'''\",\n        end: \"'''\",\n        relevance: 10\n      },\n      {\n        begin: '\"\"\"',\n        end: '\"\"\"',\n        relevance: 10\n      },\n      {\n        begin: '\"',\n        end: '\"'\n      },\n      {\n        begin: \"'\",\n        end: \"'\"\n      }\n    ]\n  };\n  const ARRAY = {\n    begin: /\\[/,\n    end: /\\]/,\n    contains: [\n      COMMENTS,\n      LITERALS,\n      VARIABLES,\n      STRINGS,\n      NUMBERS,\n      'self'\n    ],\n    relevance: 0\n  };\n\n  const BARE_KEY = /[A-Za-z0-9_-]+/;\n  const QUOTED_KEY_DOUBLE_QUOTE = /\"(\\\\\"|[^\"])*\"/;\n  const QUOTED_KEY_SINGLE_QUOTE = /'[^']*'/;\n  const ANY_KEY = regex.either(\n    BARE_KEY, QUOTED_KEY_DOUBLE_QUOTE, QUOTED_KEY_SINGLE_QUOTE\n  );\n  const DOTTED_KEY = regex.concat(\n    ANY_KEY, '(\\\\s*\\\\.\\\\s*', ANY_KEY, ')*',\n    regex.lookahead(/\\s*=\\s*[^#\\s]/)\n  );\n\n  return {\n    name: 'TOML, also INI',\n    aliases: [ 'toml' ],\n    case_insensitive: true,\n    illegal: /\\S/,\n    contains: [\n      COMMENTS,\n      {\n        className: 'section',\n        begin: /\\[+/,\n        end: /\\]+/\n      },\n      {\n        begin: DOTTED_KEY,\n        className: 'attr',\n        starts: {\n          end: /$/,\n          contains: [\n            COMMENTS,\n            ARRAY,\n            LITERALS,\n            VARIABLES,\n            STRINGS,\n            NUMBERS\n          ]\n        }\n      }\n    ]\n  };\n}\n\nmodule.exports = ini;\n","// https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10\nvar decimalDigits = '[0-9](_*[0-9])*';\nvar frac = `\\\\.(${decimalDigits})`;\nvar hexDigits = '[0-9a-fA-F](_*[0-9a-fA-F])*';\nvar NUMERIC = {\n  className: 'number',\n  variants: [\n    // DecimalFloatingPointLiteral\n    // including ExponentPart\n    { begin: `(\\\\b(${decimalDigits})((${frac})|\\\\.)?|(${frac}))` +\n      `[eE][+-]?(${decimalDigits})[fFdD]?\\\\b` },\n    // excluding ExponentPart\n    { begin: `\\\\b(${decimalDigits})((${frac})[fFdD]?\\\\b|\\\\.([fFdD]\\\\b)?)` },\n    { begin: `(${frac})[fFdD]?\\\\b` },\n    { begin: `\\\\b(${decimalDigits})[fFdD]\\\\b` },\n\n    // HexadecimalFloatingPointLiteral\n    { begin: `\\\\b0[xX]((${hexDigits})\\\\.?|(${hexDigits})?\\\\.(${hexDigits}))` +\n      `[pP][+-]?(${decimalDigits})[fFdD]?\\\\b` },\n\n    // DecimalIntegerLiteral\n    { begin: '\\\\b(0|[1-9](_*[0-9])*)[lL]?\\\\b' },\n\n    // HexIntegerLiteral\n    { begin: `\\\\b0[xX](${hexDigits})[lL]?\\\\b` },\n\n    // OctalIntegerLiteral\n    { begin: '\\\\b0(_*[0-7])*[lL]?\\\\b' },\n\n    // BinaryIntegerLiteral\n    { begin: '\\\\b0[bB][01](_*[01])*[lL]?\\\\b' },\n  ],\n  relevance: 0\n};\n\n/*\nLanguage: Java\nAuthor: Vsevolod Solovyov <vsevolod.solovyov@gmail.com>\nCategory: common, enterprise\nWebsite: https://www.java.com/\n*/\n\n\n/**\n * Allows recursive regex expressions to a given depth\n *\n * ie: recurRegex(\"(abc~~~)\", /~~~/g, 2) becomes:\n * (abc(abc(abc)))\n *\n * @param {string} re\n * @param {RegExp} substitution (should be a g mode regex)\n * @param {number} depth\n * @returns {string}``\n */\nfunction recurRegex(re, substitution, depth) {\n  if (depth === -1) return \"\";\n\n  return re.replace(substitution, _ => {\n    return recurRegex(re, substitution, depth - 1);\n  });\n}\n\n/** @type LanguageFn */\nfunction java(hljs) {\n  const regex = hljs.regex;\n  const JAVA_IDENT_RE = '[\\u00C0-\\u02B8a-zA-Z_$][\\u00C0-\\u02B8a-zA-Z_$0-9]*';\n  const GENERIC_IDENT_RE = JAVA_IDENT_RE\n    + recurRegex('(?:<' + JAVA_IDENT_RE + '~~~(?:\\\\s*,\\\\s*' + JAVA_IDENT_RE + '~~~)*>)?', /~~~/g, 2);\n  const MAIN_KEYWORDS = [\n    'synchronized',\n    'abstract',\n    'private',\n    'var',\n    'static',\n    'if',\n    'const ',\n    'for',\n    'while',\n    'strictfp',\n    'finally',\n    'protected',\n    'import',\n    'native',\n    'final',\n    'void',\n    'enum',\n    'else',\n    'break',\n    'transient',\n    'catch',\n    'instanceof',\n    'volatile',\n    'case',\n    'assert',\n    'package',\n    'default',\n    'public',\n    'try',\n    'switch',\n    'continue',\n    'throws',\n    'protected',\n    'public',\n    'private',\n    'module',\n    'requires',\n    'exports',\n    'do',\n    'sealed',\n    'yield',\n    'permits',\n    'goto',\n    'when'\n  ];\n\n  const BUILT_INS = [\n    'super',\n    'this'\n  ];\n\n  const LITERALS = [\n    'false',\n    'true',\n    'null'\n  ];\n\n  const TYPES = [\n    'char',\n    'boolean',\n    'long',\n    'float',\n    'int',\n    'byte',\n    'short',\n    'double'\n  ];\n\n  const KEYWORDS = {\n    keyword: MAIN_KEYWORDS,\n    literal: LITERALS,\n    type: TYPES,\n    built_in: BUILT_INS\n  };\n\n  const ANNOTATION = {\n    className: 'meta',\n    begin: '@' + JAVA_IDENT_RE,\n    contains: [\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        contains: [ \"self\" ] // allow nested () inside our annotation\n      }\n    ]\n  };\n  const PARAMS = {\n    className: 'params',\n    begin: /\\(/,\n    end: /\\)/,\n    keywords: KEYWORDS,\n    relevance: 0,\n    contains: [ hljs.C_BLOCK_COMMENT_MODE ],\n    endsParent: true\n  };\n\n  return {\n    name: 'Java',\n    aliases: [ 'jsp' ],\n    keywords: KEYWORDS,\n    illegal: /<\\/|#/,\n    contains: [\n      hljs.COMMENT(\n        '/\\\\*\\\\*',\n        '\\\\*/',\n        {\n          relevance: 0,\n          contains: [\n            {\n              // eat up @'s in emails to prevent them to be recognized as doctags\n              begin: /\\w+@/,\n              relevance: 0\n            },\n            {\n              className: 'doctag',\n              begin: '@[A-Za-z]+'\n            }\n          ]\n        }\n      ),\n      // relevance boost\n      {\n        begin: /import java\\.[a-z]+\\./,\n        keywords: \"import\",\n        relevance: 2\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        begin: /\"\"\"/,\n        end: /\"\"\"/,\n        className: \"string\",\n        contains: [ hljs.BACKSLASH_ESCAPE ]\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        match: [\n          /\\b(?:class|interface|enum|extends|implements|new)/,\n          /\\s+/,\n          JAVA_IDENT_RE\n        ],\n        className: {\n          1: \"keyword\",\n          3: \"title.class\"\n        }\n      },\n      {\n        // Exceptions for hyphenated keywords\n        match: /non-sealed/,\n        scope: \"keyword\"\n      },\n      {\n        begin: [\n          regex.concat(/(?!else)/, JAVA_IDENT_RE),\n          /\\s+/,\n          JAVA_IDENT_RE,\n          /\\s+/,\n          /=(?!=)/\n        ],\n        className: {\n          1: \"type\",\n          3: \"variable\",\n          5: \"operator\"\n        }\n      },\n      {\n        begin: [\n          /record/,\n          /\\s+/,\n          JAVA_IDENT_RE\n        ],\n        className: {\n          1: \"keyword\",\n          3: \"title.class\"\n        },\n        contains: [\n          PARAMS,\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE\n        ]\n      },\n      {\n        // Expression keywords prevent 'keyword Name(...)' from being\n        // recognized as a function definition\n        beginKeywords: 'new throw return else',\n        relevance: 0\n      },\n      {\n        begin: [\n          '(?:' + GENERIC_IDENT_RE + '\\\\s+)',\n          hljs.UNDERSCORE_IDENT_RE,\n          /\\s*(?=\\()/\n        ],\n        className: { 2: \"title.function\" },\n        keywords: KEYWORDS,\n        contains: [\n          {\n            className: 'params',\n            begin: /\\(/,\n            end: /\\)/,\n            keywords: KEYWORDS,\n            relevance: 0,\n            contains: [\n              ANNOTATION,\n              hljs.APOS_STRING_MODE,\n              hljs.QUOTE_STRING_MODE,\n              NUMERIC,\n              hljs.C_BLOCK_COMMENT_MODE\n            ]\n          },\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE\n        ]\n      },\n      NUMERIC,\n      ANNOTATION\n    ]\n  };\n}\n\nmodule.exports = java;\n","const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';\nconst KEYWORDS = [\n  \"as\", // for exports\n  \"in\",\n  \"of\",\n  \"if\",\n  \"for\",\n  \"while\",\n  \"finally\",\n  \"var\",\n  \"new\",\n  \"function\",\n  \"do\",\n  \"return\",\n  \"void\",\n  \"else\",\n  \"break\",\n  \"catch\",\n  \"instanceof\",\n  \"with\",\n  \"throw\",\n  \"case\",\n  \"default\",\n  \"try\",\n  \"switch\",\n  \"continue\",\n  \"typeof\",\n  \"delete\",\n  \"let\",\n  \"yield\",\n  \"const\",\n  \"class\",\n  // JS handles these with a special rule\n  // \"get\",\n  // \"set\",\n  \"debugger\",\n  \"async\",\n  \"await\",\n  \"static\",\n  \"import\",\n  \"from\",\n  \"export\",\n  \"extends\",\n  // It's reached stage 3, which is \"recommended for implementation\":\n  \"using\"\n];\nconst LITERALS = [\n  \"true\",\n  \"false\",\n  \"null\",\n  \"undefined\",\n  \"NaN\",\n  \"Infinity\"\n];\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects\nconst TYPES = [\n  // Fundamental objects\n  \"Object\",\n  \"Function\",\n  \"Boolean\",\n  \"Symbol\",\n  // numbers and dates\n  \"Math\",\n  \"Date\",\n  \"Number\",\n  \"BigInt\",\n  // text\n  \"String\",\n  \"RegExp\",\n  // Indexed collections\n  \"Array\",\n  \"Float32Array\",\n  \"Float64Array\",\n  \"Int8Array\",\n  \"Uint8Array\",\n  \"Uint8ClampedArray\",\n  \"Int16Array\",\n  \"Int32Array\",\n  \"Uint16Array\",\n  \"Uint32Array\",\n  \"BigInt64Array\",\n  \"BigUint64Array\",\n  // Keyed collections\n  \"Set\",\n  \"Map\",\n  \"WeakSet\",\n  \"WeakMap\",\n  // Structured data\n  \"ArrayBuffer\",\n  \"SharedArrayBuffer\",\n  \"Atomics\",\n  \"DataView\",\n  \"JSON\",\n  // Control abstraction objects\n  \"Promise\",\n  \"Generator\",\n  \"GeneratorFunction\",\n  \"AsyncFunction\",\n  // Reflection\n  \"Reflect\",\n  \"Proxy\",\n  // Internationalization\n  \"Intl\",\n  // WebAssembly\n  \"WebAssembly\"\n];\n\nconst ERROR_TYPES = [\n  \"Error\",\n  \"EvalError\",\n  \"InternalError\",\n  \"RangeError\",\n  \"ReferenceError\",\n  \"SyntaxError\",\n  \"TypeError\",\n  \"URIError\"\n];\n\nconst BUILT_IN_GLOBALS = [\n  \"setInterval\",\n  \"setTimeout\",\n  \"clearInterval\",\n  \"clearTimeout\",\n\n  \"require\",\n  \"exports\",\n\n  \"eval\",\n  \"isFinite\",\n  \"isNaN\",\n  \"parseFloat\",\n  \"parseInt\",\n  \"decodeURI\",\n  \"decodeURIComponent\",\n  \"encodeURI\",\n  \"encodeURIComponent\",\n  \"escape\",\n  \"unescape\"\n];\n\nconst BUILT_IN_VARIABLES = [\n  \"arguments\",\n  \"this\",\n  \"super\",\n  \"console\",\n  \"window\",\n  \"document\",\n  \"localStorage\",\n  \"sessionStorage\",\n  \"module\",\n  \"global\" // Node.js\n];\n\nconst BUILT_INS = [].concat(\n  BUILT_IN_GLOBALS,\n  TYPES,\n  ERROR_TYPES\n);\n\n/*\nLanguage: JavaScript\nDescription: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.\nCategory: common, scripting, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/JavaScript\n*/\n\n\n/** @type LanguageFn */\nfunction javascript(hljs) {\n  const regex = hljs.regex;\n  /**\n   * Takes a string like \"<Booger\" and checks to see\n   * if we can find a matching \"</Booger\" later in the\n   * content.\n   * @param {RegExpMatchArray} match\n   * @param {{after:number}} param1\n   */\n  const hasClosingTag = (match, { after }) => {\n    const tag = \"</\" + match[0].slice(1);\n    const pos = match.input.indexOf(tag, after);\n    return pos !== -1;\n  };\n\n  const IDENT_RE$1 = IDENT_RE;\n  const FRAGMENT = {\n    begin: '<>',\n    end: '</>'\n  };\n  // to avoid some special cases inside isTrulyOpeningTag\n  const XML_SELF_CLOSING = /<[A-Za-z0-9\\\\._:-]+\\s*\\/>/;\n  const XML_TAG = {\n    begin: /<[A-Za-z0-9\\\\._:-]+/,\n    end: /\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,\n    /**\n     * @param {RegExpMatchArray} match\n     * @param {CallbackResponse} response\n     */\n    isTrulyOpeningTag: (match, response) => {\n      const afterMatchIndex = match[0].length + match.index;\n      const nextChar = match.input[afterMatchIndex];\n      if (\n        // HTML should not include another raw `<` inside a tag\n        // nested type?\n        // `<Array<Array<number>>`, etc.\n        nextChar === \"<\" ||\n        // the , gives away that this is not HTML\n        // `<T, A extends keyof T, V>`\n        nextChar === \",\"\n        ) {\n        response.ignoreMatch();\n        return;\n      }\n\n      // `<something>`\n      // Quite possibly a tag, lets look for a matching closing tag...\n      if (nextChar === \">\") {\n        // if we cannot find a matching closing tag, then we\n        // will ignore it\n        if (!hasClosingTag(match, { after: afterMatchIndex })) {\n          response.ignoreMatch();\n        }\n      }\n\n      // `<blah />` (self-closing)\n      // handled by simpleSelfClosing rule\n\n      let m;\n      const afterMatch = match.input.substring(afterMatchIndex);\n\n      // some more template typing stuff\n      //  <T = any>(key?: string) => Modify<\n      if ((m = afterMatch.match(/^\\s*=/))) {\n        response.ignoreMatch();\n        return;\n      }\n\n      // `<From extends string>`\n      // technically this could be HTML, but it smells like a type\n      // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276\n      if ((m = afterMatch.match(/^\\s+extends\\s+/))) {\n        if (m.index === 0) {\n          response.ignoreMatch();\n          // eslint-disable-next-line no-useless-return\n          return;\n        }\n      }\n    }\n  };\n  const KEYWORDS$1 = {\n    $pattern: IDENT_RE,\n    keyword: KEYWORDS,\n    literal: LITERALS,\n    built_in: BUILT_INS,\n    \"variable.language\": BUILT_IN_VARIABLES\n  };\n\n  // https://tc39.es/ecma262/#sec-literals-numeric-literals\n  const decimalDigits = '[0-9](_?[0-9])*';\n  const frac = `\\\\.(${decimalDigits})`;\n  // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral\n  // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n  const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`;\n  const NUMBER = {\n    className: 'number',\n    variants: [\n      // DecimalLiteral\n      { begin: `(\\\\b(${decimalInteger})((${frac})|\\\\.)?|(${frac}))` +\n        `[eE][+-]?(${decimalDigits})\\\\b` },\n      { begin: `\\\\b(${decimalInteger})\\\\b((${frac})\\\\b|\\\\.)?|(${frac})\\\\b` },\n\n      // DecimalBigIntegerLiteral\n      { begin: `\\\\b(0|[1-9](_?[0-9])*)n\\\\b` },\n\n      // NonDecimalIntegerLiteral\n      { begin: \"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\" },\n      { begin: \"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\" },\n      { begin: \"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\" },\n\n      // LegacyOctalIntegerLiteral (does not include underscore separators)\n      // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n      { begin: \"\\\\b0[0-7]+n?\\\\b\" },\n    ],\n    relevance: 0\n  };\n\n  const SUBST = {\n    className: 'subst',\n    begin: '\\\\$\\\\{',\n    end: '\\\\}',\n    keywords: KEYWORDS$1,\n    contains: [] // defined later\n  };\n  const HTML_TEMPLATE = {\n    begin: '\\.?html`',\n    end: '',\n    starts: {\n      end: '`',\n      returnEnd: false,\n      contains: [\n        hljs.BACKSLASH_ESCAPE,\n        SUBST\n      ],\n      subLanguage: 'xml'\n    }\n  };\n  const CSS_TEMPLATE = {\n    begin: '\\.?css`',\n    end: '',\n    starts: {\n      end: '`',\n      returnEnd: false,\n      contains: [\n        hljs.BACKSLASH_ESCAPE,\n        SUBST\n      ],\n      subLanguage: 'css'\n    }\n  };\n  const GRAPHQL_TEMPLATE = {\n    begin: '\\.?gql`',\n    end: '',\n    starts: {\n      end: '`',\n      returnEnd: false,\n      contains: [\n        hljs.BACKSLASH_ESCAPE,\n        SUBST\n      ],\n      subLanguage: 'graphql'\n    }\n  };\n  const TEMPLATE_STRING = {\n    className: 'string',\n    begin: '`',\n    end: '`',\n    contains: [\n      hljs.BACKSLASH_ESCAPE,\n      SUBST\n    ]\n  };\n  const JSDOC_COMMENT = hljs.COMMENT(\n    /\\/\\*\\*(?!\\/)/,\n    '\\\\*/',\n    {\n      relevance: 0,\n      contains: [\n        {\n          begin: '(?=@[A-Za-z]+)',\n          relevance: 0,\n          contains: [\n            {\n              className: 'doctag',\n              begin: '@[A-Za-z]+'\n            },\n            {\n              className: 'type',\n              begin: '\\\\{',\n              end: '\\\\}',\n              excludeEnd: true,\n              excludeBegin: true,\n              relevance: 0\n            },\n            {\n              className: 'variable',\n              begin: IDENT_RE$1 + '(?=\\\\s*(-)|$)',\n              endsParent: true,\n              relevance: 0\n            },\n            // eat spaces (not newlines) so we can find\n            // types or variables\n            {\n              begin: /(?=[^\\n])\\s/,\n              relevance: 0\n            }\n          ]\n        }\n      ]\n    }\n  );\n  const COMMENT = {\n    className: \"comment\",\n    variants: [\n      JSDOC_COMMENT,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_LINE_COMMENT_MODE\n    ]\n  };\n  const SUBST_INTERNALS = [\n    hljs.APOS_STRING_MODE,\n    hljs.QUOTE_STRING_MODE,\n    HTML_TEMPLATE,\n    CSS_TEMPLATE,\n    GRAPHQL_TEMPLATE,\n    TEMPLATE_STRING,\n    // Skip numbers when they are part of a variable name\n    { match: /\\$\\d+/ },\n    NUMBER,\n    // This is intentional:\n    // See https://github.com/highlightjs/highlight.js/issues/3288\n    // hljs.REGEXP_MODE\n  ];\n  SUBST.contains = SUBST_INTERNALS\n    .concat({\n      // we need to pair up {} inside our subst to prevent\n      // it from ending too early by matching another }\n      begin: /\\{/,\n      end: /\\}/,\n      keywords: KEYWORDS$1,\n      contains: [\n        \"self\"\n      ].concat(SUBST_INTERNALS)\n    });\n  const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains);\n  const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([\n    // eat recursive parens in sub expressions\n    {\n      begin: /(\\s*)\\(/,\n      end: /\\)/,\n      keywords: KEYWORDS$1,\n      contains: [\"self\"].concat(SUBST_AND_COMMENTS)\n    }\n  ]);\n  const PARAMS = {\n    className: 'params',\n    // convert this to negative lookbehind in v12\n    begin: /(\\s*)\\(/, // to match the parms with\n    end: /\\)/,\n    excludeBegin: true,\n    excludeEnd: true,\n    keywords: KEYWORDS$1,\n    contains: PARAMS_CONTAINS\n  };\n\n  // ES6 classes\n  const CLASS_OR_EXTENDS = {\n    variants: [\n      // class Car extends vehicle\n      {\n        match: [\n          /class/,\n          /\\s+/,\n          IDENT_RE$1,\n          /\\s+/,\n          /extends/,\n          /\\s+/,\n          regex.concat(IDENT_RE$1, \"(\", regex.concat(/\\./, IDENT_RE$1), \")*\")\n        ],\n        scope: {\n          1: \"keyword\",\n          3: \"title.class\",\n          5: \"keyword\",\n          7: \"title.class.inherited\"\n        }\n      },\n      // class Car\n      {\n        match: [\n          /class/,\n          /\\s+/,\n          IDENT_RE$1\n        ],\n        scope: {\n          1: \"keyword\",\n          3: \"title.class\"\n        }\n      },\n\n    ]\n  };\n\n  const CLASS_REFERENCE = {\n    relevance: 0,\n    match:\n    regex.either(\n      // Hard coded exceptions\n      /\\bJSON/,\n      // Float32Array, OutT\n      /\\b[A-Z][a-z]+([A-Z][a-z]*|\\d)*/,\n      // CSSFactory, CSSFactoryT\n      /\\b[A-Z]{2,}([A-Z][a-z]+|\\d)+([A-Z][a-z]*)*/,\n      // FPs, FPsT\n      /\\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\\d)*([A-Z][a-z]*)*/,\n      // P\n      // single letters are not highlighted\n      // BLAH\n      // this will be flagged as a UPPER_CASE_CONSTANT instead\n    ),\n    className: \"title.class\",\n    keywords: {\n      _: [\n        // se we still get relevance credit for JS library classes\n        ...TYPES,\n        ...ERROR_TYPES\n      ]\n    }\n  };\n\n  const USE_STRICT = {\n    label: \"use_strict\",\n    className: 'meta',\n    relevance: 10,\n    begin: /^\\s*['\"]use (strict|asm)['\"]/\n  };\n\n  const FUNCTION_DEFINITION = {\n    variants: [\n      {\n        match: [\n          /function/,\n          /\\s+/,\n          IDENT_RE$1,\n          /(?=\\s*\\()/\n        ]\n      },\n      // anonymous function\n      {\n        match: [\n          /function/,\n          /\\s*(?=\\()/\n        ]\n      }\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    label: \"func.def\",\n    contains: [ PARAMS ],\n    illegal: /%/\n  };\n\n  const UPPER_CASE_CONSTANT = {\n    relevance: 0,\n    match: /\\b[A-Z][A-Z_0-9]+\\b/,\n    className: \"variable.constant\"\n  };\n\n  function noneOf(list) {\n    return regex.concat(\"(?!\", list.join(\"|\"), \")\");\n  }\n\n  const FUNCTION_CALL = {\n    match: regex.concat(\n      /\\b/,\n      noneOf([\n        ...BUILT_IN_GLOBALS,\n        \"super\",\n        \"import\"\n      ].map(x => `${x}\\\\s*\\\\(`)),\n      IDENT_RE$1, regex.lookahead(/\\s*\\(/)),\n    className: \"title.function\",\n    relevance: 0\n  };\n\n  const PROPERTY_ACCESS = {\n    begin: regex.concat(/\\./, regex.lookahead(\n      regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/)\n    )),\n    end: IDENT_RE$1,\n    excludeBegin: true,\n    keywords: \"prototype\",\n    className: \"property\",\n    relevance: 0\n  };\n\n  const GETTER_OR_SETTER = {\n    match: [\n      /get|set/,\n      /\\s+/,\n      IDENT_RE$1,\n      /(?=\\()/\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    contains: [\n      { // eat to avoid empty params\n        begin: /\\(\\)/\n      },\n      PARAMS\n    ]\n  };\n\n  const FUNC_LEAD_IN_RE = '(\\\\(' +\n    '[^()]*(\\\\(' +\n    '[^()]*(\\\\(' +\n    '[^()]*' +\n    '\\\\)[^()]*)*' +\n    '\\\\)[^()]*)*' +\n    '\\\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\\\s*=>';\n\n  const FUNCTION_VARIABLE = {\n    match: [\n      /const|var|let/, /\\s+/,\n      IDENT_RE$1, /\\s*/,\n      /=\\s*/,\n      /(async\\s*)?/, // async is optional\n      regex.lookahead(FUNC_LEAD_IN_RE)\n    ],\n    keywords: \"async\",\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    contains: [\n      PARAMS\n    ]\n  };\n\n  return {\n    name: 'JavaScript',\n    aliases: ['js', 'jsx', 'mjs', 'cjs'],\n    keywords: KEYWORDS$1,\n    // this will be extended by TypeScript\n    exports: { PARAMS_CONTAINS, CLASS_REFERENCE },\n    illegal: /#(?![$_A-z])/,\n    contains: [\n      hljs.SHEBANG({\n        label: \"shebang\",\n        binary: \"node\",\n        relevance: 5\n      }),\n      USE_STRICT,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      HTML_TEMPLATE,\n      CSS_TEMPLATE,\n      GRAPHQL_TEMPLATE,\n      TEMPLATE_STRING,\n      COMMENT,\n      // Skip numbers when they are part of a variable name\n      { match: /\\$\\d+/ },\n      NUMBER,\n      CLASS_REFERENCE,\n      {\n        scope: 'attr',\n        match: IDENT_RE$1 + regex.lookahead(':'),\n        relevance: 0\n      },\n      FUNCTION_VARIABLE,\n      { // \"value\" container\n        begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n        keywords: 'return throw case',\n        relevance: 0,\n        contains: [\n          COMMENT,\n          hljs.REGEXP_MODE,\n          {\n            className: 'function',\n            // we have to count the parens to make sure we actually have the\n            // correct bounding ( ) before the =>.  There could be any number of\n            // sub-expressions inside also surrounded by parens.\n            begin: FUNC_LEAD_IN_RE,\n            returnBegin: true,\n            end: '\\\\s*=>',\n            contains: [\n              {\n                className: 'params',\n                variants: [\n                  {\n                    begin: hljs.UNDERSCORE_IDENT_RE,\n                    relevance: 0\n                  },\n                  {\n                    className: null,\n                    begin: /\\(\\s*\\)/,\n                    skip: true\n                  },\n                  {\n                    begin: /(\\s*)\\(/,\n                    end: /\\)/,\n                    excludeBegin: true,\n                    excludeEnd: true,\n                    keywords: KEYWORDS$1,\n                    contains: PARAMS_CONTAINS\n                  }\n                ]\n              }\n            ]\n          },\n          { // could be a comma delimited list of params to a function call\n            begin: /,/,\n            relevance: 0\n          },\n          {\n            match: /\\s+/,\n            relevance: 0\n          },\n          { // JSX\n            variants: [\n              { begin: FRAGMENT.begin, end: FRAGMENT.end },\n              { match: XML_SELF_CLOSING },\n              {\n                begin: XML_TAG.begin,\n                // we carefully check the opening tag to see if it truly\n                // is a tag and not a false positive\n                'on:begin': XML_TAG.isTrulyOpeningTag,\n                end: XML_TAG.end\n              }\n            ],\n            subLanguage: 'xml',\n            contains: [\n              {\n                begin: XML_TAG.begin,\n                end: XML_TAG.end,\n                skip: true,\n                contains: ['self']\n              }\n            ]\n          }\n        ],\n      },\n      FUNCTION_DEFINITION,\n      {\n        // prevent this from getting swallowed up by function\n        // since they appear \"function like\"\n        beginKeywords: \"while if switch catch for\"\n      },\n      {\n        // we have to count the parens to make sure we actually have the correct\n        // bounding ( ).  There could be any number of sub-expressions inside\n        // also surrounded by parens.\n        begin: '\\\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE +\n          '\\\\(' + // first parens\n          '[^()]*(\\\\(' +\n            '[^()]*(\\\\(' +\n              '[^()]*' +\n            '\\\\)[^()]*)*' +\n          '\\\\)[^()]*)*' +\n          '\\\\)\\\\s*\\\\{', // end parens\n        returnBegin:true,\n        label: \"func.def\",\n        contains: [\n          PARAMS,\n          hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: \"title.function\" })\n        ]\n      },\n      // catch ... so it won't trigger the property rule below\n      {\n        match: /\\.\\.\\./,\n        relevance: 0\n      },\n      PROPERTY_ACCESS,\n      // hack: prevents detection of keywords in some circumstances\n      // .keyword()\n      // $keyword = x\n      {\n        match: '\\\\$' + IDENT_RE$1,\n        relevance: 0\n      },\n      {\n        match: [ /\\bconstructor(?=\\s*\\()/ ],\n        className: { 1: \"title.function\" },\n        contains: [ PARAMS ]\n      },\n      FUNCTION_CALL,\n      UPPER_CASE_CONSTANT,\n      CLASS_OR_EXTENDS,\n      GETTER_OR_SETTER,\n      {\n        match: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n      }\n    ]\n  };\n}\n\nmodule.exports = javascript;\n","/*\nLanguage: JSON\nDescription: JSON (JavaScript Object Notation) is a lightweight data-interchange format.\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\nWebsite: http://www.json.org\nCategory: common, protocols, web\n*/\n\nfunction json(hljs) {\n  const ATTRIBUTE = {\n    className: 'attr',\n    begin: /\"(\\\\.|[^\\\\\"\\r\\n])*\"(?=\\s*:)/,\n    relevance: 1.01\n  };\n  const PUNCTUATION = {\n    match: /[{}[\\],:]/,\n    className: \"punctuation\",\n    relevance: 0\n  };\n  const LITERALS = [\n    \"true\",\n    \"false\",\n    \"null\"\n  ];\n  // NOTE: normally we would rely on `keywords` for this but using a mode here allows us\n  // - to use the very tight `illegal: \\S` rule later to flag any other character\n  // - as illegal indicating that despite looking like JSON we do not truly have\n  // - JSON and thus improve false-positively greatly since JSON will try and claim\n  // - all sorts of JSON looking stuff\n  const LITERALS_MODE = {\n    scope: \"literal\",\n    beginKeywords: LITERALS.join(\" \"),\n  };\n\n  return {\n    name: 'JSON',\n    aliases: ['jsonc'],\n    keywords:{\n      literal: LITERALS,\n    },\n    contains: [\n      ATTRIBUTE,\n      PUNCTUATION,\n      hljs.QUOTE_STRING_MODE,\n      LITERALS_MODE,\n      hljs.C_NUMBER_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE\n    ],\n    illegal: '\\\\S'\n  };\n}\n\nmodule.exports = json;\n","// https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10\nvar decimalDigits = '[0-9](_*[0-9])*';\nvar frac = `\\\\.(${decimalDigits})`;\nvar hexDigits = '[0-9a-fA-F](_*[0-9a-fA-F])*';\nvar NUMERIC = {\n  className: 'number',\n  variants: [\n    // DecimalFloatingPointLiteral\n    // including ExponentPart\n    { begin: `(\\\\b(${decimalDigits})((${frac})|\\\\.)?|(${frac}))` +\n      `[eE][+-]?(${decimalDigits})[fFdD]?\\\\b` },\n    // excluding ExponentPart\n    { begin: `\\\\b(${decimalDigits})((${frac})[fFdD]?\\\\b|\\\\.([fFdD]\\\\b)?)` },\n    { begin: `(${frac})[fFdD]?\\\\b` },\n    { begin: `\\\\b(${decimalDigits})[fFdD]\\\\b` },\n\n    // HexadecimalFloatingPointLiteral\n    { begin: `\\\\b0[xX]((${hexDigits})\\\\.?|(${hexDigits})?\\\\.(${hexDigits}))` +\n      `[pP][+-]?(${decimalDigits})[fFdD]?\\\\b` },\n\n    // DecimalIntegerLiteral\n    { begin: '\\\\b(0|[1-9](_*[0-9])*)[lL]?\\\\b' },\n\n    // HexIntegerLiteral\n    { begin: `\\\\b0[xX](${hexDigits})[lL]?\\\\b` },\n\n    // OctalIntegerLiteral\n    { begin: '\\\\b0(_*[0-7])*[lL]?\\\\b' },\n\n    // BinaryIntegerLiteral\n    { begin: '\\\\b0[bB][01](_*[01])*[lL]?\\\\b' },\n  ],\n  relevance: 0\n};\n\n/*\n Language: Kotlin\n Description: Kotlin is an OSS statically typed programming language that targets the JVM, Android, JavaScript and Native.\n Author: Sergey Mashkov <cy6erGn0m@gmail.com>\n Website: https://kotlinlang.org\n Category: common\n */\n\n\nfunction kotlin(hljs) {\n  const KEYWORDS = {\n    keyword:\n      'abstract as val var vararg get set class object open private protected public noinline '\n      + 'crossinline dynamic final enum if else do while for when throw try catch finally '\n      + 'import package is in fun override companion reified inline lateinit init '\n      + 'interface annotation data sealed internal infix operator out by constructor super '\n      + 'tailrec where const inner suspend typealias external expect actual',\n    built_in:\n      'Byte Short Char Int Long Boolean Float Double Void Unit Nothing',\n    literal:\n      'true false null'\n  };\n  const KEYWORDS_WITH_LABEL = {\n    className: 'keyword',\n    begin: /\\b(break|continue|return|this)\\b/,\n    starts: { contains: [\n      {\n        className: 'symbol',\n        begin: /@\\w+/\n      }\n    ] }\n  };\n  const LABEL = {\n    className: 'symbol',\n    begin: hljs.UNDERSCORE_IDENT_RE + '@'\n  };\n\n  // for string templates\n  const SUBST = {\n    className: 'subst',\n    begin: /\\$\\{/,\n    end: /\\}/,\n    contains: [ hljs.C_NUMBER_MODE ]\n  };\n  const VARIABLE = {\n    className: 'variable',\n    begin: '\\\\$' + hljs.UNDERSCORE_IDENT_RE\n  };\n  const STRING = {\n    className: 'string',\n    variants: [\n      {\n        begin: '\"\"\"',\n        end: '\"\"\"(?=[^\"])',\n        contains: [\n          VARIABLE,\n          SUBST\n        ]\n      },\n      // Can't use built-in modes easily, as we want to use STRING in the meta\n      // context as 'meta-string' and there's no syntax to remove explicitly set\n      // classNames in built-in modes.\n      {\n        begin: '\\'',\n        end: '\\'',\n        illegal: /\\n/,\n        contains: [ hljs.BACKSLASH_ESCAPE ]\n      },\n      {\n        begin: '\"',\n        end: '\"',\n        illegal: /\\n/,\n        contains: [\n          hljs.BACKSLASH_ESCAPE,\n          VARIABLE,\n          SUBST\n        ]\n      }\n    ]\n  };\n  SUBST.contains.push(STRING);\n\n  const ANNOTATION_USE_SITE = {\n    className: 'meta',\n    begin: '@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\\\s*:(?:\\\\s*' + hljs.UNDERSCORE_IDENT_RE + ')?'\n  };\n  const ANNOTATION = {\n    className: 'meta',\n    begin: '@' + hljs.UNDERSCORE_IDENT_RE,\n    contains: [\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        contains: [\n          hljs.inherit(STRING, { className: 'string' }),\n          \"self\"\n        ]\n      }\n    ]\n  };\n\n  // https://kotlinlang.org/docs/reference/whatsnew11.html#underscores-in-numeric-literals\n  // According to the doc above, the number mode of kotlin is the same as java 8,\n  // so the code below is copied from java.js\n  const KOTLIN_NUMBER_MODE = NUMERIC;\n  const KOTLIN_NESTED_COMMENT = hljs.COMMENT(\n    '/\\\\*', '\\\\*/',\n    { contains: [ hljs.C_BLOCK_COMMENT_MODE ] }\n  );\n  const KOTLIN_PAREN_TYPE = { variants: [\n    {\n      className: 'type',\n      begin: hljs.UNDERSCORE_IDENT_RE\n    },\n    {\n      begin: /\\(/,\n      end: /\\)/,\n      contains: [] // defined later\n    }\n  ] };\n  const KOTLIN_PAREN_TYPE2 = KOTLIN_PAREN_TYPE;\n  KOTLIN_PAREN_TYPE2.variants[1].contains = [ KOTLIN_PAREN_TYPE ];\n  KOTLIN_PAREN_TYPE.variants[1].contains = [ KOTLIN_PAREN_TYPE2 ];\n\n  return {\n    name: 'Kotlin',\n    aliases: [\n      'kt',\n      'kts'\n    ],\n    keywords: KEYWORDS,\n    contains: [\n      hljs.COMMENT(\n        '/\\\\*\\\\*',\n        '\\\\*/',\n        {\n          relevance: 0,\n          contains: [\n            {\n              className: 'doctag',\n              begin: '@[A-Za-z]+'\n            }\n          ]\n        }\n      ),\n      hljs.C_LINE_COMMENT_MODE,\n      KOTLIN_NESTED_COMMENT,\n      KEYWORDS_WITH_LABEL,\n      LABEL,\n      ANNOTATION_USE_SITE,\n      ANNOTATION,\n      {\n        className: 'function',\n        beginKeywords: 'fun',\n        end: '[(]|$',\n        returnBegin: true,\n        excludeEnd: true,\n        keywords: KEYWORDS,\n        relevance: 5,\n        contains: [\n          {\n            begin: hljs.UNDERSCORE_IDENT_RE + '\\\\s*\\\\(',\n            returnBegin: true,\n            relevance: 0,\n            contains: [ hljs.UNDERSCORE_TITLE_MODE ]\n          },\n          {\n            className: 'type',\n            begin: /</,\n            end: />/,\n            keywords: 'reified',\n            relevance: 0\n          },\n          {\n            className: 'params',\n            begin: /\\(/,\n            end: /\\)/,\n            endsParent: true,\n            keywords: KEYWORDS,\n            relevance: 0,\n            contains: [\n              {\n                begin: /:/,\n                end: /[=,\\/]/,\n                endsWithParent: true,\n                contains: [\n                  KOTLIN_PAREN_TYPE,\n                  hljs.C_LINE_COMMENT_MODE,\n                  KOTLIN_NESTED_COMMENT\n                ],\n                relevance: 0\n              },\n              hljs.C_LINE_COMMENT_MODE,\n              KOTLIN_NESTED_COMMENT,\n              ANNOTATION_USE_SITE,\n              ANNOTATION,\n              STRING,\n              hljs.C_NUMBER_MODE\n            ]\n          },\n          KOTLIN_NESTED_COMMENT\n        ]\n      },\n      {\n        begin: [\n          /class|interface|trait/,\n          /\\s+/,\n          hljs.UNDERSCORE_IDENT_RE\n        ],\n        beginScope: {\n          3: \"title.class\"\n        },\n        keywords: 'class interface trait',\n        end: /[:\\{(]|$/,\n        excludeEnd: true,\n        illegal: 'extends implements',\n        contains: [\n          { beginKeywords: 'public protected internal private constructor' },\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n            className: 'type',\n            begin: /</,\n            end: />/,\n            excludeBegin: true,\n            excludeEnd: true,\n            relevance: 0\n          },\n          {\n            className: 'type',\n            begin: /[,:]\\s*/,\n            end: /[<\\(,){\\s]|$/,\n            excludeBegin: true,\n            returnEnd: true\n          },\n          ANNOTATION_USE_SITE,\n          ANNOTATION\n        ]\n      },\n      STRING,\n      {\n        className: 'meta',\n        begin: \"^#!/usr/bin/env\",\n        end: '$',\n        illegal: '\\n'\n      },\n      KOTLIN_NUMBER_MODE\n    ]\n  };\n}\n\nmodule.exports = kotlin;\n","const MODES = (hljs) => {\n  return {\n    IMPORTANT: {\n      scope: 'meta',\n      begin: '!important'\n    },\n    BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE,\n    HEXCOLOR: {\n      scope: 'number',\n      begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\\b/\n    },\n    FUNCTION_DISPATCH: {\n      className: \"built_in\",\n      begin: /[\\w-]+(?=\\()/\n    },\n    ATTRIBUTE_SELECTOR_MODE: {\n      scope: 'selector-attr',\n      begin: /\\[/,\n      end: /\\]/,\n      illegal: '$',\n      contains: [\n        hljs.APOS_STRING_MODE,\n        hljs.QUOTE_STRING_MODE\n      ]\n    },\n    CSS_NUMBER_MODE: {\n      scope: 'number',\n      begin: hljs.NUMBER_RE + '(' +\n        '%|em|ex|ch|rem' +\n        '|vw|vh|vmin|vmax' +\n        '|cm|mm|in|pt|pc|px' +\n        '|deg|grad|rad|turn' +\n        '|s|ms' +\n        '|Hz|kHz' +\n        '|dpi|dpcm|dppx' +\n        ')?',\n      relevance: 0\n    },\n    CSS_VARIABLE: {\n      className: \"attr\",\n      begin: /--[A-Za-z_][A-Za-z0-9_-]*/\n    }\n  };\n};\n\nconst HTML_TAGS = [\n  'a',\n  'abbr',\n  'address',\n  'article',\n  'aside',\n  'audio',\n  'b',\n  'blockquote',\n  'body',\n  'button',\n  'canvas',\n  'caption',\n  'cite',\n  'code',\n  'dd',\n  'del',\n  'details',\n  'dfn',\n  'div',\n  'dl',\n  'dt',\n  'em',\n  'fieldset',\n  'figcaption',\n  'figure',\n  'footer',\n  'form',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'header',\n  'hgroup',\n  'html',\n  'i',\n  'iframe',\n  'img',\n  'input',\n  'ins',\n  'kbd',\n  'label',\n  'legend',\n  'li',\n  'main',\n  'mark',\n  'menu',\n  'nav',\n  'object',\n  'ol',\n  'optgroup',\n  'option',\n  'p',\n  'picture',\n  'q',\n  'quote',\n  'samp',\n  'section',\n  'select',\n  'source',\n  'span',\n  'strong',\n  'summary',\n  'sup',\n  'table',\n  'tbody',\n  'td',\n  'textarea',\n  'tfoot',\n  'th',\n  'thead',\n  'time',\n  'tr',\n  'ul',\n  'var',\n  'video'\n];\n\nconst SVG_TAGS = [\n  'defs',\n  'g',\n  'marker',\n  'mask',\n  'pattern',\n  'svg',\n  'switch',\n  'symbol',\n  'feBlend',\n  'feColorMatrix',\n  'feComponentTransfer',\n  'feComposite',\n  'feConvolveMatrix',\n  'feDiffuseLighting',\n  'feDisplacementMap',\n  'feFlood',\n  'feGaussianBlur',\n  'feImage',\n  'feMerge',\n  'feMorphology',\n  'feOffset',\n  'feSpecularLighting',\n  'feTile',\n  'feTurbulence',\n  'linearGradient',\n  'radialGradient',\n  'stop',\n  'circle',\n  'ellipse',\n  'image',\n  'line',\n  'path',\n  'polygon',\n  'polyline',\n  'rect',\n  'text',\n  'use',\n  'textPath',\n  'tspan',\n  'foreignObject',\n  'clipPath'\n];\n\nconst TAGS = [\n  ...HTML_TAGS,\n  ...SVG_TAGS,\n];\n\n// Sorting, then reversing makes sure longer attributes/elements like\n// `font-weight` are matched fully instead of getting false positives on say `font`\n\nconst MEDIA_FEATURES = [\n  'any-hover',\n  'any-pointer',\n  'aspect-ratio',\n  'color',\n  'color-gamut',\n  'color-index',\n  'device-aspect-ratio',\n  'device-height',\n  'device-width',\n  'display-mode',\n  'forced-colors',\n  'grid',\n  'height',\n  'hover',\n  'inverted-colors',\n  'monochrome',\n  'orientation',\n  'overflow-block',\n  'overflow-inline',\n  'pointer',\n  'prefers-color-scheme',\n  'prefers-contrast',\n  'prefers-reduced-motion',\n  'prefers-reduced-transparency',\n  'resolution',\n  'scan',\n  'scripting',\n  'update',\n  'width',\n  // TODO: find a better solution?\n  'min-width',\n  'max-width',\n  'min-height',\n  'max-height'\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes\nconst PSEUDO_CLASSES = [\n  'active',\n  'any-link',\n  'blank',\n  'checked',\n  'current',\n  'default',\n  'defined',\n  'dir', // dir()\n  'disabled',\n  'drop',\n  'empty',\n  'enabled',\n  'first',\n  'first-child',\n  'first-of-type',\n  'fullscreen',\n  'future',\n  'focus',\n  'focus-visible',\n  'focus-within',\n  'has', // has()\n  'host', // host or host()\n  'host-context', // host-context()\n  'hover',\n  'indeterminate',\n  'in-range',\n  'invalid',\n  'is', // is()\n  'lang', // lang()\n  'last-child',\n  'last-of-type',\n  'left',\n  'link',\n  'local-link',\n  'not', // not()\n  'nth-child', // nth-child()\n  'nth-col', // nth-col()\n  'nth-last-child', // nth-last-child()\n  'nth-last-col', // nth-last-col()\n  'nth-last-of-type', //nth-last-of-type()\n  'nth-of-type', //nth-of-type()\n  'only-child',\n  'only-of-type',\n  'optional',\n  'out-of-range',\n  'past',\n  'placeholder-shown',\n  'read-only',\n  'read-write',\n  'required',\n  'right',\n  'root',\n  'scope',\n  'target',\n  'target-within',\n  'user-invalid',\n  'valid',\n  'visited',\n  'where' // where()\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements\nconst PSEUDO_ELEMENTS = [\n  'after',\n  'backdrop',\n  'before',\n  'cue',\n  'cue-region',\n  'first-letter',\n  'first-line',\n  'grammar-error',\n  'marker',\n  'part',\n  'placeholder',\n  'selection',\n  'slotted',\n  'spelling-error'\n].sort().reverse();\n\nconst ATTRIBUTES = [\n  'accent-color',\n  'align-content',\n  'align-items',\n  'align-self',\n  'alignment-baseline',\n  'all',\n  'anchor-name',\n  'animation',\n  'animation-composition',\n  'animation-delay',\n  'animation-direction',\n  'animation-duration',\n  'animation-fill-mode',\n  'animation-iteration-count',\n  'animation-name',\n  'animation-play-state',\n  'animation-range',\n  'animation-range-end',\n  'animation-range-start',\n  'animation-timeline',\n  'animation-timing-function',\n  'appearance',\n  'aspect-ratio',\n  'backdrop-filter',\n  'backface-visibility',\n  'background',\n  'background-attachment',\n  'background-blend-mode',\n  'background-clip',\n  'background-color',\n  'background-image',\n  'background-origin',\n  'background-position',\n  'background-position-x',\n  'background-position-y',\n  'background-repeat',\n  'background-size',\n  'baseline-shift',\n  'block-size',\n  'border',\n  'border-block',\n  'border-block-color',\n  'border-block-end',\n  'border-block-end-color',\n  'border-block-end-style',\n  'border-block-end-width',\n  'border-block-start',\n  'border-block-start-color',\n  'border-block-start-style',\n  'border-block-start-width',\n  'border-block-style',\n  'border-block-width',\n  'border-bottom',\n  'border-bottom-color',\n  'border-bottom-left-radius',\n  'border-bottom-right-radius',\n  'border-bottom-style',\n  'border-bottom-width',\n  'border-collapse',\n  'border-color',\n  'border-end-end-radius',\n  'border-end-start-radius',\n  'border-image',\n  'border-image-outset',\n  'border-image-repeat',\n  'border-image-slice',\n  'border-image-source',\n  'border-image-width',\n  'border-inline',\n  'border-inline-color',\n  'border-inline-end',\n  'border-inline-end-color',\n  'border-inline-end-style',\n  'border-inline-end-width',\n  'border-inline-start',\n  'border-inline-start-color',\n  'border-inline-start-style',\n  'border-inline-start-width',\n  'border-inline-style',\n  'border-inline-width',\n  'border-left',\n  'border-left-color',\n  'border-left-style',\n  'border-left-width',\n  'border-radius',\n  'border-right',\n  'border-right-color',\n  'border-right-style',\n  'border-right-width',\n  'border-spacing',\n  'border-start-end-radius',\n  'border-start-start-radius',\n  'border-style',\n  'border-top',\n  'border-top-color',\n  'border-top-left-radius',\n  'border-top-right-radius',\n  'border-top-style',\n  'border-top-width',\n  'border-width',\n  'bottom',\n  'box-align',\n  'box-decoration-break',\n  'box-direction',\n  'box-flex',\n  'box-flex-group',\n  'box-lines',\n  'box-ordinal-group',\n  'box-orient',\n  'box-pack',\n  'box-shadow',\n  'box-sizing',\n  'break-after',\n  'break-before',\n  'break-inside',\n  'caption-side',\n  'caret-color',\n  'clear',\n  'clip',\n  'clip-path',\n  'clip-rule',\n  'color',\n  'color-interpolation',\n  'color-interpolation-filters',\n  'color-profile',\n  'color-rendering',\n  'color-scheme',\n  'column-count',\n  'column-fill',\n  'column-gap',\n  'column-rule',\n  'column-rule-color',\n  'column-rule-style',\n  'column-rule-width',\n  'column-span',\n  'column-width',\n  'columns',\n  'contain',\n  'contain-intrinsic-block-size',\n  'contain-intrinsic-height',\n  'contain-intrinsic-inline-size',\n  'contain-intrinsic-size',\n  'contain-intrinsic-width',\n  'container',\n  'container-name',\n  'container-type',\n  'content',\n  'content-visibility',\n  'counter-increment',\n  'counter-reset',\n  'counter-set',\n  'cue',\n  'cue-after',\n  'cue-before',\n  'cursor',\n  'cx',\n  'cy',\n  'direction',\n  'display',\n  'dominant-baseline',\n  'empty-cells',\n  'enable-background',\n  'field-sizing',\n  'fill',\n  'fill-opacity',\n  'fill-rule',\n  'filter',\n  'flex',\n  'flex-basis',\n  'flex-direction',\n  'flex-flow',\n  'flex-grow',\n  'flex-shrink',\n  'flex-wrap',\n  'float',\n  'flood-color',\n  'flood-opacity',\n  'flow',\n  'font',\n  'font-display',\n  'font-family',\n  'font-feature-settings',\n  'font-kerning',\n  'font-language-override',\n  'font-optical-sizing',\n  'font-palette',\n  'font-size',\n  'font-size-adjust',\n  'font-smooth',\n  'font-smoothing',\n  'font-stretch',\n  'font-style',\n  'font-synthesis',\n  'font-synthesis-position',\n  'font-synthesis-small-caps',\n  'font-synthesis-style',\n  'font-synthesis-weight',\n  'font-variant',\n  'font-variant-alternates',\n  'font-variant-caps',\n  'font-variant-east-asian',\n  'font-variant-emoji',\n  'font-variant-ligatures',\n  'font-variant-numeric',\n  'font-variant-position',\n  'font-variation-settings',\n  'font-weight',\n  'forced-color-adjust',\n  'gap',\n  'glyph-orientation-horizontal',\n  'glyph-orientation-vertical',\n  'grid',\n  'grid-area',\n  'grid-auto-columns',\n  'grid-auto-flow',\n  'grid-auto-rows',\n  'grid-column',\n  'grid-column-end',\n  'grid-column-start',\n  'grid-gap',\n  'grid-row',\n  'grid-row-end',\n  'grid-row-start',\n  'grid-template',\n  'grid-template-areas',\n  'grid-template-columns',\n  'grid-template-rows',\n  'hanging-punctuation',\n  'height',\n  'hyphenate-character',\n  'hyphenate-limit-chars',\n  'hyphens',\n  'icon',\n  'image-orientation',\n  'image-rendering',\n  'image-resolution',\n  'ime-mode',\n  'initial-letter',\n  'initial-letter-align',\n  'inline-size',\n  'inset',\n  'inset-area',\n  'inset-block',\n  'inset-block-end',\n  'inset-block-start',\n  'inset-inline',\n  'inset-inline-end',\n  'inset-inline-start',\n  'isolation',\n  'justify-content',\n  'justify-items',\n  'justify-self',\n  'kerning',\n  'left',\n  'letter-spacing',\n  'lighting-color',\n  'line-break',\n  'line-height',\n  'line-height-step',\n  'list-style',\n  'list-style-image',\n  'list-style-position',\n  'list-style-type',\n  'margin',\n  'margin-block',\n  'margin-block-end',\n  'margin-block-start',\n  'margin-bottom',\n  'margin-inline',\n  'margin-inline-end',\n  'margin-inline-start',\n  'margin-left',\n  'margin-right',\n  'margin-top',\n  'margin-trim',\n  'marker',\n  'marker-end',\n  'marker-mid',\n  'marker-start',\n  'marks',\n  'mask',\n  'mask-border',\n  'mask-border-mode',\n  'mask-border-outset',\n  'mask-border-repeat',\n  'mask-border-slice',\n  'mask-border-source',\n  'mask-border-width',\n  'mask-clip',\n  'mask-composite',\n  'mask-image',\n  'mask-mode',\n  'mask-origin',\n  'mask-position',\n  'mask-repeat',\n  'mask-size',\n  'mask-type',\n  'masonry-auto-flow',\n  'math-depth',\n  'math-shift',\n  'math-style',\n  'max-block-size',\n  'max-height',\n  'max-inline-size',\n  'max-width',\n  'min-block-size',\n  'min-height',\n  'min-inline-size',\n  'min-width',\n  'mix-blend-mode',\n  'nav-down',\n  'nav-index',\n  'nav-left',\n  'nav-right',\n  'nav-up',\n  'none',\n  'normal',\n  'object-fit',\n  'object-position',\n  'offset',\n  'offset-anchor',\n  'offset-distance',\n  'offset-path',\n  'offset-position',\n  'offset-rotate',\n  'opacity',\n  'order',\n  'orphans',\n  'outline',\n  'outline-color',\n  'outline-offset',\n  'outline-style',\n  'outline-width',\n  'overflow',\n  'overflow-anchor',\n  'overflow-block',\n  'overflow-clip-margin',\n  'overflow-inline',\n  'overflow-wrap',\n  'overflow-x',\n  'overflow-y',\n  'overlay',\n  'overscroll-behavior',\n  'overscroll-behavior-block',\n  'overscroll-behavior-inline',\n  'overscroll-behavior-x',\n  'overscroll-behavior-y',\n  'padding',\n  'padding-block',\n  'padding-block-end',\n  'padding-block-start',\n  'padding-bottom',\n  'padding-inline',\n  'padding-inline-end',\n  'padding-inline-start',\n  'padding-left',\n  'padding-right',\n  'padding-top',\n  'page',\n  'page-break-after',\n  'page-break-before',\n  'page-break-inside',\n  'paint-order',\n  'pause',\n  'pause-after',\n  'pause-before',\n  'perspective',\n  'perspective-origin',\n  'place-content',\n  'place-items',\n  'place-self',\n  'pointer-events',\n  'position',\n  'position-anchor',\n  'position-visibility',\n  'print-color-adjust',\n  'quotes',\n  'r',\n  'resize',\n  'rest',\n  'rest-after',\n  'rest-before',\n  'right',\n  'rotate',\n  'row-gap',\n  'ruby-align',\n  'ruby-position',\n  'scale',\n  'scroll-behavior',\n  'scroll-margin',\n  'scroll-margin-block',\n  'scroll-margin-block-end',\n  'scroll-margin-block-start',\n  'scroll-margin-bottom',\n  'scroll-margin-inline',\n  'scroll-margin-inline-end',\n  'scroll-margin-inline-start',\n  'scroll-margin-left',\n  'scroll-margin-right',\n  'scroll-margin-top',\n  'scroll-padding',\n  'scroll-padding-block',\n  'scroll-padding-block-end',\n  'scroll-padding-block-start',\n  'scroll-padding-bottom',\n  'scroll-padding-inline',\n  'scroll-padding-inline-end',\n  'scroll-padding-inline-start',\n  'scroll-padding-left',\n  'scroll-padding-right',\n  'scroll-padding-top',\n  'scroll-snap-align',\n  'scroll-snap-stop',\n  'scroll-snap-type',\n  'scroll-timeline',\n  'scroll-timeline-axis',\n  'scroll-timeline-name',\n  'scrollbar-color',\n  'scrollbar-gutter',\n  'scrollbar-width',\n  'shape-image-threshold',\n  'shape-margin',\n  'shape-outside',\n  'shape-rendering',\n  'speak',\n  'speak-as',\n  'src', // @font-face\n  'stop-color',\n  'stop-opacity',\n  'stroke',\n  'stroke-dasharray',\n  'stroke-dashoffset',\n  'stroke-linecap',\n  'stroke-linejoin',\n  'stroke-miterlimit',\n  'stroke-opacity',\n  'stroke-width',\n  'tab-size',\n  'table-layout',\n  'text-align',\n  'text-align-all',\n  'text-align-last',\n  'text-anchor',\n  'text-combine-upright',\n  'text-decoration',\n  'text-decoration-color',\n  'text-decoration-line',\n  'text-decoration-skip',\n  'text-decoration-skip-ink',\n  'text-decoration-style',\n  'text-decoration-thickness',\n  'text-emphasis',\n  'text-emphasis-color',\n  'text-emphasis-position',\n  'text-emphasis-style',\n  'text-indent',\n  'text-justify',\n  'text-orientation',\n  'text-overflow',\n  'text-rendering',\n  'text-shadow',\n  'text-size-adjust',\n  'text-transform',\n  'text-underline-offset',\n  'text-underline-position',\n  'text-wrap',\n  'text-wrap-mode',\n  'text-wrap-style',\n  'timeline-scope',\n  'top',\n  'touch-action',\n  'transform',\n  'transform-box',\n  'transform-origin',\n  'transform-style',\n  'transition',\n  'transition-behavior',\n  'transition-delay',\n  'transition-duration',\n  'transition-property',\n  'transition-timing-function',\n  'translate',\n  'unicode-bidi',\n  'user-modify',\n  'user-select',\n  'vector-effect',\n  'vertical-align',\n  'view-timeline',\n  'view-timeline-axis',\n  'view-timeline-inset',\n  'view-timeline-name',\n  'view-transition-name',\n  'visibility',\n  'voice-balance',\n  'voice-duration',\n  'voice-family',\n  'voice-pitch',\n  'voice-range',\n  'voice-rate',\n  'voice-stress',\n  'voice-volume',\n  'white-space',\n  'white-space-collapse',\n  'widows',\n  'width',\n  'will-change',\n  'word-break',\n  'word-spacing',\n  'word-wrap',\n  'writing-mode',\n  'x',\n  'y',\n  'z-index',\n  'zoom'\n].sort().reverse();\n\n// some grammars use them all as a single group\nconst PSEUDO_SELECTORS = PSEUDO_CLASSES.concat(PSEUDO_ELEMENTS).sort().reverse();\n\n/*\nLanguage: Less\nDescription: It's CSS, with just a little more.\nAuthor:   Max Mikhailov <seven.phases.max@gmail.com>\nWebsite: http://lesscss.org\nCategory: common, css, web\n*/\n\n\n/** @type LanguageFn */\nfunction less(hljs) {\n  const modes = MODES(hljs);\n  const PSEUDO_SELECTORS$1 = PSEUDO_SELECTORS;\n\n  const AT_MODIFIERS = \"and or not only\";\n  const IDENT_RE = '[\\\\w-]+'; // yes, Less identifiers may begin with a digit\n  const INTERP_IDENT_RE = '(' + IDENT_RE + '|@\\\\{' + IDENT_RE + '\\\\})';\n\n  /* Generic Modes */\n\n  const RULES = []; const VALUE_MODES = []; // forward def. for recursive modes\n\n  const STRING_MODE = function(c) {\n    return {\n    // Less strings are not multiline (also include '~' for more consistent coloring of \"escaped\" strings)\n      className: 'string',\n      begin: '~?' + c + '.*?' + c\n    };\n  };\n\n  const IDENT_MODE = function(name, begin, relevance) {\n    return {\n      className: name,\n      begin: begin,\n      relevance: relevance\n    };\n  };\n\n  const AT_KEYWORDS = {\n    $pattern: /[a-z-]+/,\n    keyword: AT_MODIFIERS,\n    attribute: MEDIA_FEATURES.join(\" \")\n  };\n\n  const PARENS_MODE = {\n    // used only to properly balance nested parens inside mixin call, def. arg list\n    begin: '\\\\(',\n    end: '\\\\)',\n    contains: VALUE_MODES,\n    keywords: AT_KEYWORDS,\n    relevance: 0\n  };\n\n  // generic Less highlighter (used almost everywhere except selectors):\n  VALUE_MODES.push(\n    hljs.C_LINE_COMMENT_MODE,\n    hljs.C_BLOCK_COMMENT_MODE,\n    STRING_MODE(\"'\"),\n    STRING_MODE('\"'),\n    modes.CSS_NUMBER_MODE, // fixme: it does not include dot for numbers like .5em :(\n    {\n      begin: '(url|data-uri)\\\\(',\n      starts: {\n        className: 'string',\n        end: '[\\\\)\\\\n]',\n        excludeEnd: true\n      }\n    },\n    modes.HEXCOLOR,\n    PARENS_MODE,\n    IDENT_MODE('variable', '@@?' + IDENT_RE, 10),\n    IDENT_MODE('variable', '@\\\\{' + IDENT_RE + '\\\\}'),\n    IDENT_MODE('built_in', '~?`[^`]*?`'), // inline javascript (or whatever host language) *multiline* string\n    { // @media features (it’s here to not duplicate things in AT_RULE_MODE with extra PARENS_MODE overriding):\n      className: 'attribute',\n      begin: IDENT_RE + '\\\\s*:',\n      end: ':',\n      returnBegin: true,\n      excludeEnd: true\n    },\n    modes.IMPORTANT,\n    { beginKeywords: 'and not' },\n    modes.FUNCTION_DISPATCH\n  );\n\n  const VALUE_WITH_RULESETS = VALUE_MODES.concat({\n    begin: /\\{/,\n    end: /\\}/,\n    contains: RULES\n  });\n\n  const MIXIN_GUARD_MODE = {\n    beginKeywords: 'when',\n    endsWithParent: true,\n    contains: [ { beginKeywords: 'and not' } ].concat(VALUE_MODES) // using this form to override VALUE’s 'function' match\n  };\n\n  /* Rule-Level Modes */\n\n  const RULE_MODE = {\n    begin: INTERP_IDENT_RE + '\\\\s*:',\n    returnBegin: true,\n    end: /[;}]/,\n    relevance: 0,\n    contains: [\n      { begin: /-(webkit|moz|ms|o)-/ },\n      modes.CSS_VARIABLE,\n      {\n        className: 'attribute',\n        begin: '\\\\b(' + ATTRIBUTES.join('|') + ')\\\\b',\n        end: /(?=:)/,\n        starts: {\n          endsWithParent: true,\n          illegal: '[<=$]',\n          relevance: 0,\n          contains: VALUE_MODES\n        }\n      }\n    ]\n  };\n\n  const AT_RULE_MODE = {\n    className: 'keyword',\n    begin: '@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\\\b',\n    starts: {\n      end: '[;{}]',\n      keywords: AT_KEYWORDS,\n      returnEnd: true,\n      contains: VALUE_MODES,\n      relevance: 0\n    }\n  };\n\n  // variable definitions and calls\n  const VAR_RULE_MODE = {\n    className: 'variable',\n    variants: [\n      // using more strict pattern for higher relevance to increase chances of Less detection.\n      // this is *the only* Less specific statement used in most of the sources, so...\n      // (we’ll still often loose to the css-parser unless there's '//' comment,\n      // simply because 1 variable just can't beat 99 properties :)\n      {\n        begin: '@' + IDENT_RE + '\\\\s*:',\n        relevance: 15\n      },\n      { begin: '@' + IDENT_RE }\n    ],\n    starts: {\n      end: '[;}]',\n      returnEnd: true,\n      contains: VALUE_WITH_RULESETS\n    }\n  };\n\n  const SELECTOR_MODE = {\n    // first parse unambiguous selectors (i.e. those not starting with tag)\n    // then fall into the scary lookahead-discriminator variant.\n    // this mode also handles mixin definitions and calls\n    variants: [\n      {\n        begin: '[\\\\.#:&\\\\[>]',\n        end: '[;{}]' // mixin calls end with ';'\n      },\n      {\n        begin: INTERP_IDENT_RE,\n        end: /\\{/\n      }\n    ],\n    returnBegin: true,\n    returnEnd: true,\n    illegal: '[<=\\'$\"]',\n    relevance: 0,\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      MIXIN_GUARD_MODE,\n      IDENT_MODE('keyword', 'all\\\\b'),\n      IDENT_MODE('variable', '@\\\\{' + IDENT_RE + '\\\\}'), // otherwise it’s identified as tag\n      \n      {\n        begin: '\\\\b(' + TAGS.join('|') + ')\\\\b',\n        className: 'selector-tag'\n      },\n      modes.CSS_NUMBER_MODE,\n      IDENT_MODE('selector-tag', INTERP_IDENT_RE, 0),\n      IDENT_MODE('selector-id', '#' + INTERP_IDENT_RE),\n      IDENT_MODE('selector-class', '\\\\.' + INTERP_IDENT_RE, 0),\n      IDENT_MODE('selector-tag', '&', 0),\n      modes.ATTRIBUTE_SELECTOR_MODE,\n      {\n        className: 'selector-pseudo',\n        begin: ':(' + PSEUDO_CLASSES.join('|') + ')'\n      },\n      {\n        className: 'selector-pseudo',\n        begin: ':(:)?(' + PSEUDO_ELEMENTS.join('|') + ')'\n      },\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        relevance: 0,\n        contains: VALUE_WITH_RULESETS\n      }, // argument list of parametric mixins\n      { begin: '!important' }, // eat !important after mixin call or it will be colored as tag\n      modes.FUNCTION_DISPATCH\n    ]\n  };\n\n  const PSEUDO_SELECTOR_MODE = {\n    begin: IDENT_RE + ':(:)?' + `(${PSEUDO_SELECTORS$1.join('|')})`,\n    returnBegin: true,\n    contains: [ SELECTOR_MODE ]\n  };\n\n  RULES.push(\n    hljs.C_LINE_COMMENT_MODE,\n    hljs.C_BLOCK_COMMENT_MODE,\n    AT_RULE_MODE,\n    VAR_RULE_MODE,\n    PSEUDO_SELECTOR_MODE,\n    RULE_MODE,\n    SELECTOR_MODE,\n    MIXIN_GUARD_MODE,\n    modes.FUNCTION_DISPATCH\n  );\n\n  return {\n    name: 'Less',\n    case_insensitive: true,\n    illegal: '[=>\\'/<($\"]',\n    contains: RULES\n  };\n}\n\nmodule.exports = less;\n","/*\nLanguage: Lua\nDescription: Lua is a powerful, efficient, lightweight, embeddable scripting language.\nAuthor: Andrew Fedorov <dmmdrs@mail.ru>\nCategory: common, gaming, scripting\nWebsite: https://www.lua.org\n*/\n\nfunction lua(hljs) {\n  const OPENING_LONG_BRACKET = '\\\\[=*\\\\[';\n  const CLOSING_LONG_BRACKET = '\\\\]=*\\\\]';\n  const LONG_BRACKETS = {\n    begin: OPENING_LONG_BRACKET,\n    end: CLOSING_LONG_BRACKET,\n    contains: [ 'self' ]\n  };\n  const COMMENTS = [\n    hljs.COMMENT('--(?!' + OPENING_LONG_BRACKET + ')', '$'),\n    hljs.COMMENT(\n      '--' + OPENING_LONG_BRACKET,\n      CLOSING_LONG_BRACKET,\n      {\n        contains: [ LONG_BRACKETS ],\n        relevance: 10\n      }\n    )\n  ];\n  return {\n    name: 'Lua',\n    aliases: ['pluto'],\n    keywords: {\n      $pattern: hljs.UNDERSCORE_IDENT_RE,\n      literal: \"true false nil\",\n      keyword: \"and break do else elseif end for goto if in local not or repeat return then until while\",\n      built_in:\n        // Metatags and globals:\n        '_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len '\n        + '__gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert '\n        // Standard methods and properties:\n        + 'collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring '\n        + 'module next pairs pcall print rawequal rawget rawset require select setfenv '\n        + 'setmetatable tonumber tostring type unpack xpcall arg self '\n        // Library methods and properties (one line per library):\n        + 'coroutine resume yield status wrap create running debug getupvalue '\n        + 'debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv '\n        + 'io lines write close flush open output type read stderr stdin input stdout popen tmpfile '\n        + 'math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan '\n        + 'os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall '\n        + 'string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower '\n        + 'table setn insert getn foreachi maxn foreach concat sort remove'\n    },\n    contains: COMMENTS.concat([\n      {\n        className: 'function',\n        beginKeywords: 'function',\n        end: '\\\\)',\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, { begin: '([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*' }),\n          {\n            className: 'params',\n            begin: '\\\\(',\n            endsWithParent: true,\n            contains: COMMENTS\n          }\n        ].concat(COMMENTS)\n      },\n      hljs.C_NUMBER_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: OPENING_LONG_BRACKET,\n        end: CLOSING_LONG_BRACKET,\n        contains: [ LONG_BRACKETS ],\n        relevance: 5\n      }\n    ])\n  };\n}\n\nmodule.exports = lua;\n","/*\nLanguage: Makefile\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\nContributors: Joël Porquet <joel@porquet.org>\nWebsite: https://www.gnu.org/software/make/manual/html_node/Introduction.html\nCategory: common, build-system\n*/\n\nfunction makefile(hljs) {\n  /* Variables: simple (eg $(var)) and special (eg $@) */\n  const VARIABLE = {\n    className: 'variable',\n    variants: [\n      {\n        begin: '\\\\$\\\\(' + hljs.UNDERSCORE_IDENT_RE + '\\\\)',\n        contains: [ hljs.BACKSLASH_ESCAPE ]\n      },\n      { begin: /\\$[@%<?\\^\\+\\*]/ }\n    ]\n  };\n  /* Quoted string with variables inside */\n  const QUOTE_STRING = {\n    className: 'string',\n    begin: /\"/,\n    end: /\"/,\n    contains: [\n      hljs.BACKSLASH_ESCAPE,\n      VARIABLE\n    ]\n  };\n  /* Function: $(func arg,...) */\n  const FUNC = {\n    className: 'variable',\n    begin: /\\$\\([\\w-]+\\s/,\n    end: /\\)/,\n    keywords: { built_in:\n        'subst patsubst strip findstring filter filter-out sort '\n        + 'word wordlist firstword lastword dir notdir suffix basename '\n        + 'addsuffix addprefix join wildcard realpath abspath error warning '\n        + 'shell origin flavor foreach if or and call eval file value' },\n    contains: [ \n      VARIABLE,\n      QUOTE_STRING // Added QUOTE_STRING as they can be a part of functions\n    ]\n  };\n  /* Variable assignment */\n  const ASSIGNMENT = { begin: '^' + hljs.UNDERSCORE_IDENT_RE + '\\\\s*(?=[:+?]?=)' };\n  /* Meta targets (.PHONY) */\n  const META = {\n    className: 'meta',\n    begin: /^\\.PHONY:/,\n    end: /$/,\n    keywords: {\n      $pattern: /[\\.\\w]+/,\n      keyword: '.PHONY'\n    }\n  };\n  /* Targets */\n  const TARGET = {\n    className: 'section',\n    begin: /^[^\\s]+:/,\n    end: /$/,\n    contains: [ VARIABLE ]\n  };\n  return {\n    name: 'Makefile',\n    aliases: [\n      'mk',\n      'mak',\n      'make',\n    ],\n    keywords: {\n      $pattern: /[\\w-]+/,\n      keyword: 'define endef undefine ifdef ifndef ifeq ifneq else endif '\n      + 'include -include sinclude override export unexport private vpath'\n    },\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      VARIABLE,\n      QUOTE_STRING,\n      FUNC,\n      ASSIGNMENT,\n      META,\n      TARGET\n    ]\n  };\n}\n\nmodule.exports = makefile;\n","/*\nLanguage: Perl\nAuthor: Peter Leonov <gojpeg@yandex.ru>\nWebsite: https://www.perl.org\nCategory: common\n*/\n\n/** @type LanguageFn */\nfunction perl(hljs) {\n  const regex = hljs.regex;\n  const KEYWORDS = [\n    'abs',\n    'accept',\n    'alarm',\n    'and',\n    'atan2',\n    'bind',\n    'binmode',\n    'bless',\n    'break',\n    'caller',\n    'chdir',\n    'chmod',\n    'chomp',\n    'chop',\n    'chown',\n    'chr',\n    'chroot',\n    'class',\n    'close',\n    'closedir',\n    'connect',\n    'continue',\n    'cos',\n    'crypt',\n    'dbmclose',\n    'dbmopen',\n    'defined',\n    'delete',\n    'die',\n    'do',\n    'dump',\n    'each',\n    'else',\n    'elsif',\n    'endgrent',\n    'endhostent',\n    'endnetent',\n    'endprotoent',\n    'endpwent',\n    'endservent',\n    'eof',\n    'eval',\n    'exec',\n    'exists',\n    'exit',\n    'exp',\n    'fcntl',\n    'field',\n    'fileno',\n    'flock',\n    'for',\n    'foreach',\n    'fork',\n    'format',\n    'formline',\n    'getc',\n    'getgrent',\n    'getgrgid',\n    'getgrnam',\n    'gethostbyaddr',\n    'gethostbyname',\n    'gethostent',\n    'getlogin',\n    'getnetbyaddr',\n    'getnetbyname',\n    'getnetent',\n    'getpeername',\n    'getpgrp',\n    'getpriority',\n    'getprotobyname',\n    'getprotobynumber',\n    'getprotoent',\n    'getpwent',\n    'getpwnam',\n    'getpwuid',\n    'getservbyname',\n    'getservbyport',\n    'getservent',\n    'getsockname',\n    'getsockopt',\n    'given',\n    'glob',\n    'gmtime',\n    'goto',\n    'grep',\n    'gt',\n    'hex',\n    'if',\n    'index',\n    'int',\n    'ioctl',\n    'join',\n    'keys',\n    'kill',\n    'last',\n    'lc',\n    'lcfirst',\n    'length',\n    'link',\n    'listen',\n    'local',\n    'localtime',\n    'log',\n    'lstat',\n    'lt',\n    'ma',\n    'map',\n    'method',\n    'mkdir',\n    'msgctl',\n    'msgget',\n    'msgrcv',\n    'msgsnd',\n    'my',\n    'ne',\n    'next',\n    'no',\n    'not',\n    'oct',\n    'open',\n    'opendir',\n    'or',\n    'ord',\n    'our',\n    'pack',\n    'package',\n    'pipe',\n    'pop',\n    'pos',\n    'print',\n    'printf',\n    'prototype',\n    'push',\n    'q|0',\n    'qq',\n    'quotemeta',\n    'qw',\n    'qx',\n    'rand',\n    'read',\n    'readdir',\n    'readline',\n    'readlink',\n    'readpipe',\n    'recv',\n    'redo',\n    'ref',\n    'rename',\n    'require',\n    'reset',\n    'return',\n    'reverse',\n    'rewinddir',\n    'rindex',\n    'rmdir',\n    'say',\n    'scalar',\n    'seek',\n    'seekdir',\n    'select',\n    'semctl',\n    'semget',\n    'semop',\n    'send',\n    'setgrent',\n    'sethostent',\n    'setnetent',\n    'setpgrp',\n    'setpriority',\n    'setprotoent',\n    'setpwent',\n    'setservent',\n    'setsockopt',\n    'shift',\n    'shmctl',\n    'shmget',\n    'shmread',\n    'shmwrite',\n    'shutdown',\n    'sin',\n    'sleep',\n    'socket',\n    'socketpair',\n    'sort',\n    'splice',\n    'split',\n    'sprintf',\n    'sqrt',\n    'srand',\n    'stat',\n    'state',\n    'study',\n    'sub',\n    'substr',\n    'symlink',\n    'syscall',\n    'sysopen',\n    'sysread',\n    'sysseek',\n    'system',\n    'syswrite',\n    'tell',\n    'telldir',\n    'tie',\n    'tied',\n    'time',\n    'times',\n    'tr',\n    'truncate',\n    'uc',\n    'ucfirst',\n    'umask',\n    'undef',\n    'unless',\n    'unlink',\n    'unpack',\n    'unshift',\n    'untie',\n    'until',\n    'use',\n    'utime',\n    'values',\n    'vec',\n    'wait',\n    'waitpid',\n    'wantarray',\n    'warn',\n    'when',\n    'while',\n    'write',\n    'x|0',\n    'xor',\n    'y|0'\n  ];\n\n  // https://perldoc.perl.org/perlre#Modifiers\n  const REGEX_MODIFIERS = /[dualxmsipngr]{0,12}/; // aa and xx are valid, making max length 12\n  const PERL_KEYWORDS = {\n    $pattern: /[\\w.]+/,\n    keyword: KEYWORDS.join(\" \")\n  };\n  const SUBST = {\n    className: 'subst',\n    begin: '[$@]\\\\{',\n    end: '\\\\}',\n    keywords: PERL_KEYWORDS\n  };\n  const METHOD = {\n    begin: /->\\{/,\n    end: /\\}/\n    // contains defined later\n  };\n  const ATTR = {\n    scope: 'attr',\n    match: /\\s+:\\s*\\w+(\\s*\\(.*?\\))?/,\n  };\n  const VAR = {\n    scope: 'variable',\n    variants: [\n      { begin: /\\$\\d/ },\n      { begin: regex.concat(\n        /[$%@](?!\")(\\^\\w\\b|#\\w+(::\\w+)*|\\{\\w+\\}|\\w+(::\\w*)*)/,\n        // negative look-ahead tries to avoid matching patterns that are not\n        // Perl at all like $ident$, @ident@, etc.\n        `(?![A-Za-z])(?![@$%])`\n        )\n      },\n      {\n        // Only $= is a special Perl variable and one can't declare @= or %=.\n        begin: /[$%@](?!\")[^\\s\\w{=]|\\$=/,\n        relevance: 0\n      }\n    ],\n    contains: [ ATTR ],\n  };\n  const NUMBER = {\n    className: 'number',\n    variants: [\n      // decimal numbers:\n      // include the case where a number starts with a dot (eg. .9), and\n      // the leading 0? avoids mixing the first and second match on 0.x cases\n      { match: /0?\\.[0-9][0-9_]+\\b/ },\n      // include the special versioned number (eg. v5.38)\n      { match: /\\bv?(0|[1-9][0-9_]*(\\.[0-9_]+)?|[1-9][0-9_]*)\\b/ },\n      // non-decimal numbers:\n      { match: /\\b0[0-7][0-7_]*\\b/ },\n      { match: /\\b0x[0-9a-fA-F][0-9a-fA-F_]*\\b/ },\n      { match: /\\b0b[0-1][0-1_]*\\b/ },\n    ],\n    relevance: 0\n  };\n  const STRING_CONTAINS = [\n    hljs.BACKSLASH_ESCAPE,\n    SUBST,\n    VAR\n  ];\n  const REGEX_DELIMS = [\n    /!/,\n    /\\//,\n    /\\|/,\n    /\\?/,\n    /'/,\n    /\"/, // valid but infrequent and weird\n    /#/ // valid but infrequent and weird\n  ];\n  /**\n   * @param {string|RegExp} prefix\n   * @param {string|RegExp} open\n   * @param {string|RegExp} close\n   */\n  const PAIRED_DOUBLE_RE = (prefix, open, close = '\\\\1') => {\n    const middle = (close === '\\\\1')\n      ? close\n      : regex.concat(close, open);\n    return regex.concat(\n      regex.concat(\"(?:\", prefix, \")\"),\n      open,\n      /(?:\\\\.|[^\\\\\\/])*?/,\n      middle,\n      /(?:\\\\.|[^\\\\\\/])*?/,\n      close,\n      REGEX_MODIFIERS\n    );\n  };\n  /**\n   * @param {string|RegExp} prefix\n   * @param {string|RegExp} open\n   * @param {string|RegExp} close\n   */\n  const PAIRED_RE = (prefix, open, close) => {\n    return regex.concat(\n      regex.concat(\"(?:\", prefix, \")\"),\n      open,\n      /(?:\\\\.|[^\\\\\\/])*?/,\n      close,\n      REGEX_MODIFIERS\n    );\n  };\n  const PERL_DEFAULT_CONTAINS = [\n    VAR,\n    hljs.HASH_COMMENT_MODE,\n    hljs.COMMENT(\n      /^=\\w/,\n      /=cut/,\n      { endsWithParent: true }\n    ),\n    METHOD,\n    {\n      className: 'string',\n      contains: STRING_CONTAINS,\n      variants: [\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\(',\n          end: '\\\\)',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\[',\n          end: '\\\\]',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\{',\n          end: '\\\\}',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\|',\n          end: '\\\\|',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*<',\n          end: '>',\n          relevance: 5\n        },\n        {\n          begin: 'qw\\\\s+q',\n          end: 'q',\n          relevance: 5\n        },\n        {\n          begin: '\\'',\n          end: '\\'',\n          contains: [ hljs.BACKSLASH_ESCAPE ]\n        },\n        {\n          begin: '\"',\n          end: '\"'\n        },\n        {\n          begin: '`',\n          end: '`',\n          contains: [ hljs.BACKSLASH_ESCAPE ]\n        },\n        {\n          begin: /\\{\\w+\\}/,\n          relevance: 0\n        },\n        {\n          begin: '-?\\\\w+\\\\s*=>',\n          relevance: 0\n        }\n      ]\n    },\n    NUMBER,\n    { // regexp container\n      begin: '(\\\\/\\\\/|' + hljs.RE_STARTERS_RE + '|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*',\n      keywords: 'split return print reverse grep',\n      relevance: 0,\n      contains: [\n        hljs.HASH_COMMENT_MODE,\n        {\n          className: 'regexp',\n          variants: [\n            // allow matching common delimiters\n            { begin: PAIRED_DOUBLE_RE(\"s|tr|y\", regex.either(...REGEX_DELIMS, { capture: true })) },\n            // and then paired delmis\n            { begin: PAIRED_DOUBLE_RE(\"s|tr|y\", \"\\\\(\", \"\\\\)\") },\n            { begin: PAIRED_DOUBLE_RE(\"s|tr|y\", \"\\\\[\", \"\\\\]\") },\n            { begin: PAIRED_DOUBLE_RE(\"s|tr|y\", \"\\\\{\", \"\\\\}\") }\n          ],\n          relevance: 2\n        },\n        {\n          className: 'regexp',\n          variants: [\n            {\n              // could be a comment in many languages so do not count\n              // as relevant\n              begin: /(m|qr)\\/\\//,\n              relevance: 0\n            },\n            // prefix is optional with /regex/\n            { begin: PAIRED_RE(\"(?:m|qr)?\", /\\//, /\\//) },\n            // allow matching common delimiters\n            { begin: PAIRED_RE(\"m|qr\", regex.either(...REGEX_DELIMS, { capture: true }), /\\1/) },\n            // allow common paired delmins\n            { begin: PAIRED_RE(\"m|qr\", /\\(/, /\\)/) },\n            { begin: PAIRED_RE(\"m|qr\", /\\[/, /\\]/) },\n            { begin: PAIRED_RE(\"m|qr\", /\\{/, /\\}/) }\n          ]\n        }\n      ]\n    },\n    {\n      className: 'function',\n      beginKeywords: 'sub method',\n      end: '(\\\\s*\\\\(.*?\\\\))?[;{]',\n      excludeEnd: true,\n      relevance: 5,\n      contains: [ hljs.TITLE_MODE, ATTR ]\n    },\n    {\n      className: 'class',\n      beginKeywords: 'class',\n      end: '[;{]',\n      excludeEnd: true,\n      relevance: 5,\n      contains: [ hljs.TITLE_MODE, ATTR, NUMBER ]\n    },\n    {\n      begin: '-\\\\w\\\\b',\n      relevance: 0\n    },\n    {\n      begin: \"^__DATA__$\",\n      end: \"^__END__$\",\n      subLanguage: 'mojolicious',\n      contains: [\n        {\n          begin: \"^@@.*\",\n          end: \"$\",\n          className: \"comment\"\n        }\n      ]\n    }\n  ];\n  SUBST.contains = PERL_DEFAULT_CONTAINS;\n  METHOD.contains = PERL_DEFAULT_CONTAINS;\n\n  return {\n    name: 'Perl',\n    aliases: [\n      'pl',\n      'pm'\n    ],\n    keywords: PERL_KEYWORDS,\n    contains: PERL_DEFAULT_CONTAINS\n  };\n}\n\nmodule.exports = perl;\n","/*\nLanguage: Objective-C\nAuthor: Valerii Hiora <valerii.hiora@gmail.com>\nContributors: Angel G. Olloqui <angelgarcia.mail@gmail.com>, Matt Diephouse <matt@diephouse.com>, Andrew Farmer <ahfarmer@gmail.com>, Minh Nguyễn <mxn@1ec5.org>\nWebsite: https://developer.apple.com/documentation/objectivec\nCategory: common\n*/\n\nfunction objectivec(hljs) {\n  const API_CLASS = {\n    className: 'built_in',\n    begin: '\\\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\\\w+'\n  };\n  const IDENTIFIER_RE = /[a-zA-Z@][a-zA-Z0-9_]*/;\n  const TYPES = [\n    \"int\",\n    \"float\",\n    \"char\",\n    \"unsigned\",\n    \"signed\",\n    \"short\",\n    \"long\",\n    \"double\",\n    \"wchar_t\",\n    \"unichar\",\n    \"void\",\n    \"bool\",\n    \"BOOL\",\n    \"id|0\",\n    \"_Bool\"\n  ];\n  const KWS = [\n    \"while\",\n    \"export\",\n    \"sizeof\",\n    \"typedef\",\n    \"const\",\n    \"struct\",\n    \"for\",\n    \"union\",\n    \"volatile\",\n    \"static\",\n    \"mutable\",\n    \"if\",\n    \"do\",\n    \"return\",\n    \"goto\",\n    \"enum\",\n    \"else\",\n    \"break\",\n    \"extern\",\n    \"asm\",\n    \"case\",\n    \"default\",\n    \"register\",\n    \"explicit\",\n    \"typename\",\n    \"switch\",\n    \"continue\",\n    \"inline\",\n    \"readonly\",\n    \"assign\",\n    \"readwrite\",\n    \"self\",\n    \"@synchronized\",\n    \"id\",\n    \"typeof\",\n    \"nonatomic\",\n    \"IBOutlet\",\n    \"IBAction\",\n    \"strong\",\n    \"weak\",\n    \"copy\",\n    \"in\",\n    \"out\",\n    \"inout\",\n    \"bycopy\",\n    \"byref\",\n    \"oneway\",\n    \"__strong\",\n    \"__weak\",\n    \"__block\",\n    \"__autoreleasing\",\n    \"@private\",\n    \"@protected\",\n    \"@public\",\n    \"@try\",\n    \"@property\",\n    \"@end\",\n    \"@throw\",\n    \"@catch\",\n    \"@finally\",\n    \"@autoreleasepool\",\n    \"@synthesize\",\n    \"@dynamic\",\n    \"@selector\",\n    \"@optional\",\n    \"@required\",\n    \"@encode\",\n    \"@package\",\n    \"@import\",\n    \"@defs\",\n    \"@compatibility_alias\",\n    \"__bridge\",\n    \"__bridge_transfer\",\n    \"__bridge_retained\",\n    \"__bridge_retain\",\n    \"__covariant\",\n    \"__contravariant\",\n    \"__kindof\",\n    \"_Nonnull\",\n    \"_Nullable\",\n    \"_Null_unspecified\",\n    \"__FUNCTION__\",\n    \"__PRETTY_FUNCTION__\",\n    \"__attribute__\",\n    \"getter\",\n    \"setter\",\n    \"retain\",\n    \"unsafe_unretained\",\n    \"nonnull\",\n    \"nullable\",\n    \"null_unspecified\",\n    \"null_resettable\",\n    \"class\",\n    \"instancetype\",\n    \"NS_DESIGNATED_INITIALIZER\",\n    \"NS_UNAVAILABLE\",\n    \"NS_REQUIRES_SUPER\",\n    \"NS_RETURNS_INNER_POINTER\",\n    \"NS_INLINE\",\n    \"NS_AVAILABLE\",\n    \"NS_DEPRECATED\",\n    \"NS_ENUM\",\n    \"NS_OPTIONS\",\n    \"NS_SWIFT_UNAVAILABLE\",\n    \"NS_ASSUME_NONNULL_BEGIN\",\n    \"NS_ASSUME_NONNULL_END\",\n    \"NS_REFINED_FOR_SWIFT\",\n    \"NS_SWIFT_NAME\",\n    \"NS_SWIFT_NOTHROW\",\n    \"NS_DURING\",\n    \"NS_HANDLER\",\n    \"NS_ENDHANDLER\",\n    \"NS_VALUERETURN\",\n    \"NS_VOIDRETURN\"\n  ];\n  const LITERALS = [\n    \"false\",\n    \"true\",\n    \"FALSE\",\n    \"TRUE\",\n    \"nil\",\n    \"YES\",\n    \"NO\",\n    \"NULL\"\n  ];\n  const BUILT_INS = [\n    \"dispatch_once_t\",\n    \"dispatch_queue_t\",\n    \"dispatch_sync\",\n    \"dispatch_async\",\n    \"dispatch_once\"\n  ];\n  const KEYWORDS = {\n    \"variable.language\": [\n      \"this\",\n      \"super\"\n    ],\n    $pattern: IDENTIFIER_RE,\n    keyword: KWS,\n    literal: LITERALS,\n    built_in: BUILT_INS,\n    type: TYPES\n  };\n  const CLASS_KEYWORDS = {\n    $pattern: IDENTIFIER_RE,\n    keyword: [\n      \"@interface\",\n      \"@class\",\n      \"@protocol\",\n      \"@implementation\"\n    ]\n  };\n  return {\n    name: 'Objective-C',\n    aliases: [\n      'mm',\n      'objc',\n      'obj-c',\n      'obj-c++',\n      'objective-c++'\n    ],\n    keywords: KEYWORDS,\n    illegal: '</',\n    contains: [\n      API_CLASS,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.APOS_STRING_MODE,\n      {\n        className: 'string',\n        variants: [\n          {\n            begin: '@\"',\n            end: '\"',\n            illegal: '\\\\n',\n            contains: [ hljs.BACKSLASH_ESCAPE ]\n          }\n        ]\n      },\n      {\n        className: 'meta',\n        begin: /#\\s*[a-z]+\\b/,\n        end: /$/,\n        keywords: { keyword:\n            'if else elif endif define undef warning error line '\n            + 'pragma ifdef ifndef include' },\n        contains: [\n          {\n            begin: /\\\\\\n/,\n            relevance: 0\n          },\n          hljs.inherit(hljs.QUOTE_STRING_MODE, { className: 'string' }),\n          {\n            className: 'string',\n            begin: /<.*?>/,\n            end: /$/,\n            illegal: '\\\\n'\n          },\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE\n        ]\n      },\n      {\n        className: 'class',\n        begin: '(' + CLASS_KEYWORDS.keyword.join('|') + ')\\\\b',\n        end: /(\\{|$)/,\n        excludeEnd: true,\n        keywords: CLASS_KEYWORDS,\n        contains: [ hljs.UNDERSCORE_TITLE_MODE ]\n      },\n      {\n        begin: '\\\\.' + hljs.UNDERSCORE_IDENT_RE,\n        relevance: 0\n      }\n    ]\n  };\n}\n\nmodule.exports = objectivec;\n","/*\nLanguage: PHP\nAuthor: Victor Karamzin <Victor.Karamzin@enterra-inc.com>\nContributors: Evgeny Stepanischev <imbolk@gmail.com>, Ivan Sagalaev <maniac@softwaremaniacs.org>\nWebsite: https://www.php.net\nCategory: common\n*/\n\n/**\n * @param {HLJSApi} hljs\n * @returns {LanguageDetail}\n * */\nfunction php(hljs) {\n  const regex = hljs.regex;\n  // negative look-ahead tries to avoid matching patterns that are not\n  // Perl at all like $ident$, @ident@, etc.\n  const NOT_PERL_ETC = /(?![A-Za-z0-9])(?![$])/;\n  const IDENT_RE = regex.concat(\n    /[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*/,\n    NOT_PERL_ETC);\n  // Will not detect camelCase classes\n  const PASCAL_CASE_CLASS_NAME_RE = regex.concat(\n    /(\\\\?[A-Z][a-z0-9_\\x7f-\\xff]+|\\\\?[A-Z]+(?=[A-Z][a-z0-9_\\x7f-\\xff])){1,}/,\n    NOT_PERL_ETC);\n  const UPCASE_NAME_RE = regex.concat(\n    /[A-Z]+/,\n    NOT_PERL_ETC);\n  const VARIABLE = {\n    scope: 'variable',\n    match: '\\\\$+' + IDENT_RE,\n  };\n  const PREPROCESSOR = {\n    scope: \"meta\",\n    variants: [\n      { begin: /<\\?php/, relevance: 10 }, // boost for obvious PHP\n      { begin: /<\\?=/ },\n      // less relevant per PSR-1 which says not to use short-tags\n      { begin: /<\\?/, relevance: 0.1 },\n      { begin: /\\?>/ } // end php tag\n    ]\n  };\n  const SUBST = {\n    scope: 'subst',\n    variants: [\n      { begin: /\\$\\w+/ },\n      {\n        begin: /\\{\\$/,\n        end: /\\}/\n      }\n    ]\n  };\n  const SINGLE_QUOTED = hljs.inherit(hljs.APOS_STRING_MODE, { illegal: null, });\n  const DOUBLE_QUOTED = hljs.inherit(hljs.QUOTE_STRING_MODE, {\n    illegal: null,\n    contains: hljs.QUOTE_STRING_MODE.contains.concat(SUBST),\n  });\n\n  const HEREDOC = {\n    begin: /<<<[ \\t]*(?:(\\w+)|\"(\\w+)\")\\n/,\n    end: /[ \\t]*(\\w+)\\b/,\n    contains: hljs.QUOTE_STRING_MODE.contains.concat(SUBST),\n    'on:begin': (m, resp) => { resp.data._beginMatch = m[1] || m[2]; },\n    'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); },\n  };\n\n  const NOWDOC = hljs.END_SAME_AS_BEGIN({\n    begin: /<<<[ \\t]*'(\\w+)'\\n/,\n    end: /[ \\t]*(\\w+)\\b/,\n  });\n  // list of valid whitespaces because non-breaking space might be part of a IDENT_RE\n  const WHITESPACE = '[ \\t\\n]';\n  const STRING = {\n    scope: 'string',\n    variants: [\n      DOUBLE_QUOTED,\n      SINGLE_QUOTED,\n      HEREDOC,\n      NOWDOC\n    ]\n  };\n  const NUMBER = {\n    scope: 'number',\n    variants: [\n      { begin: `\\\\b0[bB][01]+(?:_[01]+)*\\\\b` }, // Binary w/ underscore support\n      { begin: `\\\\b0[oO][0-7]+(?:_[0-7]+)*\\\\b` }, // Octals w/ underscore support\n      { begin: `\\\\b0[xX][\\\\da-fA-F]+(?:_[\\\\da-fA-F]+)*\\\\b` }, // Hex w/ underscore support\n      // Decimals w/ underscore support, with optional fragments and scientific exponent (e) suffix.\n      { begin: `(?:\\\\b\\\\d+(?:_\\\\d+)*(\\\\.(?:\\\\d+(?:_\\\\d+)*))?|\\\\B\\\\.\\\\d+)(?:[eE][+-]?\\\\d+)?` }\n    ],\n    relevance: 0\n  };\n  const LITERALS = [\n    \"false\",\n    \"null\",\n    \"true\"\n  ];\n  const KWS = [\n    // Magic constants:\n    // <https://www.php.net/manual/en/language.constants.predefined.php>\n    \"__CLASS__\",\n    \"__DIR__\",\n    \"__FILE__\",\n    \"__FUNCTION__\",\n    \"__COMPILER_HALT_OFFSET__\",\n    \"__LINE__\",\n    \"__METHOD__\",\n    \"__NAMESPACE__\",\n    \"__TRAIT__\",\n    // Function that look like language construct or language construct that look like function:\n    // List of keywords that may not require parenthesis\n    \"die\",\n    \"echo\",\n    \"exit\",\n    \"include\",\n    \"include_once\",\n    \"print\",\n    \"require\",\n    \"require_once\",\n    // These are not language construct (function) but operate on the currently-executing function and can access the current symbol table\n    // 'compact extract func_get_arg func_get_args func_num_args get_called_class get_parent_class ' +\n    // Other keywords:\n    // <https://www.php.net/manual/en/reserved.php>\n    // <https://www.php.net/manual/en/language.types.type-juggling.php>\n    \"array\",\n    \"abstract\",\n    \"and\",\n    \"as\",\n    \"binary\",\n    \"bool\",\n    \"boolean\",\n    \"break\",\n    \"callable\",\n    \"case\",\n    \"catch\",\n    \"class\",\n    \"clone\",\n    \"const\",\n    \"continue\",\n    \"declare\",\n    \"default\",\n    \"do\",\n    \"double\",\n    \"else\",\n    \"elseif\",\n    \"empty\",\n    \"enddeclare\",\n    \"endfor\",\n    \"endforeach\",\n    \"endif\",\n    \"endswitch\",\n    \"endwhile\",\n    \"enum\",\n    \"eval\",\n    \"extends\",\n    \"final\",\n    \"finally\",\n    \"float\",\n    \"for\",\n    \"foreach\",\n    \"from\",\n    \"global\",\n    \"goto\",\n    \"if\",\n    \"implements\",\n    \"instanceof\",\n    \"insteadof\",\n    \"int\",\n    \"integer\",\n    \"interface\",\n    \"isset\",\n    \"iterable\",\n    \"list\",\n    \"match|0\",\n    \"mixed\",\n    \"new\",\n    \"never\",\n    \"object\",\n    \"or\",\n    \"private\",\n    \"protected\",\n    \"public\",\n    \"readonly\",\n    \"real\",\n    \"return\",\n    \"string\",\n    \"switch\",\n    \"throw\",\n    \"trait\",\n    \"try\",\n    \"unset\",\n    \"use\",\n    \"var\",\n    \"void\",\n    \"while\",\n    \"xor\",\n    \"yield\"\n  ];\n\n  const BUILT_INS = [\n    // Standard PHP library:\n    // <https://www.php.net/manual/en/book.spl.php>\n    \"Error|0\",\n    \"AppendIterator\",\n    \"ArgumentCountError\",\n    \"ArithmeticError\",\n    \"ArrayIterator\",\n    \"ArrayObject\",\n    \"AssertionError\",\n    \"BadFunctionCallException\",\n    \"BadMethodCallException\",\n    \"CachingIterator\",\n    \"CallbackFilterIterator\",\n    \"CompileError\",\n    \"Countable\",\n    \"DirectoryIterator\",\n    \"DivisionByZeroError\",\n    \"DomainException\",\n    \"EmptyIterator\",\n    \"ErrorException\",\n    \"Exception\",\n    \"FilesystemIterator\",\n    \"FilterIterator\",\n    \"GlobIterator\",\n    \"InfiniteIterator\",\n    \"InvalidArgumentException\",\n    \"IteratorIterator\",\n    \"LengthException\",\n    \"LimitIterator\",\n    \"LogicException\",\n    \"MultipleIterator\",\n    \"NoRewindIterator\",\n    \"OutOfBoundsException\",\n    \"OutOfRangeException\",\n    \"OuterIterator\",\n    \"OverflowException\",\n    \"ParentIterator\",\n    \"ParseError\",\n    \"RangeException\",\n    \"RecursiveArrayIterator\",\n    \"RecursiveCachingIterator\",\n    \"RecursiveCallbackFilterIterator\",\n    \"RecursiveDirectoryIterator\",\n    \"RecursiveFilterIterator\",\n    \"RecursiveIterator\",\n    \"RecursiveIteratorIterator\",\n    \"RecursiveRegexIterator\",\n    \"RecursiveTreeIterator\",\n    \"RegexIterator\",\n    \"RuntimeException\",\n    \"SeekableIterator\",\n    \"SplDoublyLinkedList\",\n    \"SplFileInfo\",\n    \"SplFileObject\",\n    \"SplFixedArray\",\n    \"SplHeap\",\n    \"SplMaxHeap\",\n    \"SplMinHeap\",\n    \"SplObjectStorage\",\n    \"SplObserver\",\n    \"SplPriorityQueue\",\n    \"SplQueue\",\n    \"SplStack\",\n    \"SplSubject\",\n    \"SplTempFileObject\",\n    \"TypeError\",\n    \"UnderflowException\",\n    \"UnexpectedValueException\",\n    \"UnhandledMatchError\",\n    // Reserved interfaces:\n    // <https://www.php.net/manual/en/reserved.interfaces.php>\n    \"ArrayAccess\",\n    \"BackedEnum\",\n    \"Closure\",\n    \"Fiber\",\n    \"Generator\",\n    \"Iterator\",\n    \"IteratorAggregate\",\n    \"Serializable\",\n    \"Stringable\",\n    \"Throwable\",\n    \"Traversable\",\n    \"UnitEnum\",\n    \"WeakReference\",\n    \"WeakMap\",\n    // Reserved classes:\n    // <https://www.php.net/manual/en/reserved.classes.php>\n    \"Directory\",\n    \"__PHP_Incomplete_Class\",\n    \"parent\",\n    \"php_user_filter\",\n    \"self\",\n    \"static\",\n    \"stdClass\"\n  ];\n\n  /** Dual-case keywords\n   *\n   * [\"then\",\"FILE\"] =>\n   *     [\"then\", \"THEN\", \"FILE\", \"file\"]\n   *\n   * @param {string[]} items */\n  const dualCase = (items) => {\n    /** @type string[] */\n    const result = [];\n    items.forEach(item => {\n      result.push(item);\n      if (item.toLowerCase() === item) {\n        result.push(item.toUpperCase());\n      } else {\n        result.push(item.toLowerCase());\n      }\n    });\n    return result;\n  };\n\n  const KEYWORDS = {\n    keyword: KWS,\n    literal: dualCase(LITERALS),\n    built_in: BUILT_INS,\n  };\n\n  /**\n   * @param {string[]} items */\n  const normalizeKeywords = (items) => {\n    return items.map(item => {\n      return item.replace(/\\|\\d+$/, \"\");\n    });\n  };\n\n  const CONSTRUCTOR_CALL = { variants: [\n    {\n      match: [\n        /new/,\n        regex.concat(WHITESPACE, \"+\"),\n        // to prevent built ins from being confused as the class constructor call\n        regex.concat(\"(?!\", normalizeKeywords(BUILT_INS).join(\"\\\\b|\"), \"\\\\b)\"),\n        PASCAL_CASE_CLASS_NAME_RE,\n      ],\n      scope: {\n        1: \"keyword\",\n        4: \"title.class\",\n      },\n    }\n  ] };\n\n  const CONSTANT_REFERENCE = regex.concat(IDENT_RE, \"\\\\b(?!\\\\()\");\n\n  const LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON = { variants: [\n    {\n      match: [\n        regex.concat(\n          /::/,\n          regex.lookahead(/(?!class\\b)/)\n        ),\n        CONSTANT_REFERENCE,\n      ],\n      scope: { 2: \"variable.constant\", },\n    },\n    {\n      match: [\n        /::/,\n        /class/,\n      ],\n      scope: { 2: \"variable.language\", },\n    },\n    {\n      match: [\n        PASCAL_CASE_CLASS_NAME_RE,\n        regex.concat(\n          /::/,\n          regex.lookahead(/(?!class\\b)/)\n        ),\n        CONSTANT_REFERENCE,\n      ],\n      scope: {\n        1: \"title.class\",\n        3: \"variable.constant\",\n      },\n    },\n    {\n      match: [\n        PASCAL_CASE_CLASS_NAME_RE,\n        regex.concat(\n          \"::\",\n          regex.lookahead(/(?!class\\b)/)\n        ),\n      ],\n      scope: { 1: \"title.class\", },\n    },\n    {\n      match: [\n        PASCAL_CASE_CLASS_NAME_RE,\n        /::/,\n        /class/,\n      ],\n      scope: {\n        1: \"title.class\",\n        3: \"variable.language\",\n      },\n    }\n  ] };\n\n  const NAMED_ARGUMENT = {\n    scope: 'attr',\n    match: regex.concat(IDENT_RE, regex.lookahead(':'), regex.lookahead(/(?!::)/)),\n  };\n  const PARAMS_MODE = {\n    relevance: 0,\n    begin: /\\(/,\n    end: /\\)/,\n    keywords: KEYWORDS,\n    contains: [\n      NAMED_ARGUMENT,\n      VARIABLE,\n      LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON,\n      hljs.C_BLOCK_COMMENT_MODE,\n      STRING,\n      NUMBER,\n      CONSTRUCTOR_CALL,\n    ],\n  };\n  const FUNCTION_INVOKE = {\n    relevance: 0,\n    match: [\n      /\\b/,\n      // to prevent keywords from being confused as the function title\n      regex.concat(\"(?!fn\\\\b|function\\\\b|\", normalizeKeywords(KWS).join(\"\\\\b|\"), \"|\", normalizeKeywords(BUILT_INS).join(\"\\\\b|\"), \"\\\\b)\"),\n      IDENT_RE,\n      regex.concat(WHITESPACE, \"*\"),\n      regex.lookahead(/(?=\\()/)\n    ],\n    scope: { 3: \"title.function.invoke\", },\n    contains: [ PARAMS_MODE ]\n  };\n  PARAMS_MODE.contains.push(FUNCTION_INVOKE);\n\n  const ATTRIBUTE_CONTAINS = [\n    NAMED_ARGUMENT,\n    LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON,\n    hljs.C_BLOCK_COMMENT_MODE,\n    STRING,\n    NUMBER,\n    CONSTRUCTOR_CALL,\n  ];\n\n  const ATTRIBUTES = {\n    begin: regex.concat(/#\\[\\s*\\\\?/,\n      regex.either(\n        PASCAL_CASE_CLASS_NAME_RE,\n        UPCASE_NAME_RE\n      )\n    ),\n    beginScope: \"meta\",\n    end: /]/,\n    endScope: \"meta\",\n    keywords: {\n      literal: LITERALS,\n      keyword: [\n        'new',\n        'array',\n      ]\n    },\n    contains: [\n      {\n        begin: /\\[/,\n        end: /]/,\n        keywords: {\n          literal: LITERALS,\n          keyword: [\n            'new',\n            'array',\n          ]\n        },\n        contains: [\n          'self',\n          ...ATTRIBUTE_CONTAINS,\n        ]\n      },\n      ...ATTRIBUTE_CONTAINS,\n      {\n        scope: 'meta',\n        variants: [\n          { match: PASCAL_CASE_CLASS_NAME_RE },\n          { match: UPCASE_NAME_RE }\n        ]\n      }\n    ]\n  };\n\n  return {\n    case_insensitive: false,\n    keywords: KEYWORDS,\n    contains: [\n      ATTRIBUTES,\n      hljs.HASH_COMMENT_MODE,\n      hljs.COMMENT('//', '$'),\n      hljs.COMMENT(\n        '/\\\\*',\n        '\\\\*/',\n        { contains: [\n          {\n            scope: 'doctag',\n            match: '@[A-Za-z]+'\n          }\n        ] }\n      ),\n      {\n        match: /__halt_compiler\\(\\);/,\n        keywords: '__halt_compiler',\n        starts: {\n          scope: \"comment\",\n          end: hljs.MATCH_NOTHING_RE,\n          contains: [\n            {\n              match: /\\?>/,\n              scope: \"meta\",\n              endsParent: true\n            }\n          ]\n        }\n      },\n      PREPROCESSOR,\n      {\n        scope: 'variable.language',\n        match: /\\$this\\b/\n      },\n      VARIABLE,\n      FUNCTION_INVOKE,\n      LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON,\n      {\n        match: [\n          /const/,\n          /\\s/,\n          IDENT_RE,\n        ],\n        scope: {\n          1: \"keyword\",\n          3: \"variable.constant\",\n        },\n      },\n      CONSTRUCTOR_CALL,\n      {\n        scope: 'function',\n        relevance: 0,\n        beginKeywords: 'fn function',\n        end: /[;{]/,\n        excludeEnd: true,\n        illegal: '[$%\\\\[]',\n        contains: [\n          { beginKeywords: 'use', },\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n            begin: '=>', // No markup, just a relevance booster\n            endsParent: true\n          },\n          {\n            scope: 'params',\n            begin: '\\\\(',\n            end: '\\\\)',\n            excludeBegin: true,\n            excludeEnd: true,\n            keywords: KEYWORDS,\n            contains: [\n              'self',\n              ATTRIBUTES,\n              VARIABLE,\n              LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON,\n              hljs.C_BLOCK_COMMENT_MODE,\n              STRING,\n              NUMBER\n            ]\n          },\n        ]\n      },\n      {\n        scope: 'class',\n        variants: [\n          {\n            beginKeywords: \"enum\",\n            illegal: /[($\"]/\n          },\n          {\n            beginKeywords: \"class interface trait\",\n            illegal: /[:($\"]/\n          }\n        ],\n        relevance: 0,\n        end: /\\{/,\n        excludeEnd: true,\n        contains: [\n          { beginKeywords: 'extends implements' },\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      // both use and namespace still use \"old style\" rules (vs multi-match)\n      // because the namespace name can include `\\` and we still want each\n      // element to be treated as its own *individual* title\n      {\n        beginKeywords: 'namespace',\n        relevance: 0,\n        end: ';',\n        illegal: /[.']/,\n        contains: [ hljs.inherit(hljs.UNDERSCORE_TITLE_MODE, { scope: \"title.class\" }) ]\n      },\n      {\n        beginKeywords: 'use',\n        relevance: 0,\n        end: ';',\n        contains: [\n          // TODO: title.function vs title.class\n          {\n            match: /\\b(as|const|function)\\b/,\n            scope: \"keyword\"\n          },\n          // TODO: could be title.class or title.function\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      STRING,\n      NUMBER,\n    ]\n  };\n}\n\nmodule.exports = php;\n","/*\nLanguage: PHP Template\nRequires: xml.js, php.js\nAuthor: Josh Goebel <hello@joshgoebel.com>\nWebsite: https://www.php.net\nCategory: common\n*/\n\nfunction phpTemplate(hljs) {\n  return {\n    name: \"PHP template\",\n    subLanguage: 'xml',\n    contains: [\n      {\n        begin: /<\\?(php|=)?/,\n        end: /\\?>/,\n        subLanguage: 'php',\n        contains: [\n          // We don't want the php closing tag ?> to close the PHP block when\n          // inside any of the following blocks:\n          {\n            begin: '/\\\\*',\n            end: '\\\\*/',\n            skip: true\n          },\n          {\n            begin: 'b\"',\n            end: '\"',\n            skip: true\n          },\n          {\n            begin: 'b\\'',\n            end: '\\'',\n            skip: true\n          },\n          hljs.inherit(hljs.APOS_STRING_MODE, {\n            illegal: null,\n            className: null,\n            contains: null,\n            skip: true\n          }),\n          hljs.inherit(hljs.QUOTE_STRING_MODE, {\n            illegal: null,\n            className: null,\n            contains: null,\n            skip: true\n          })\n        ]\n      }\n    ]\n  };\n}\n\nmodule.exports = phpTemplate;\n","/*\nLanguage: Plain text\nAuthor: Egor Rogov (e.rogov@postgrespro.ru)\nDescription: Plain text without any highlighting.\nCategory: common\n*/\n\nfunction plaintext(hljs) {\n  return {\n    name: 'Plain text',\n    aliases: [\n      'text',\n      'txt'\n    ],\n    disableAutodetect: true\n  };\n}\n\nmodule.exports = plaintext;\n","/*\nLanguage: Python\nDescription: Python is an interpreted, object-oriented, high-level programming language with dynamic semantics.\nWebsite: https://www.python.org\nCategory: common\n*/\n\nfunction python(hljs) {\n  const regex = hljs.regex;\n  const IDENT_RE = /[\\p{XID_Start}_]\\p{XID_Continue}*/u;\n  const RESERVED_WORDS = [\n    'and',\n    'as',\n    'assert',\n    'async',\n    'await',\n    'break',\n    'case',\n    'class',\n    'continue',\n    'def',\n    'del',\n    'elif',\n    'else',\n    'except',\n    'finally',\n    'for',\n    'from',\n    'global',\n    'if',\n    'import',\n    'in',\n    'is',\n    'lambda',\n    'match',\n    'nonlocal|10',\n    'not',\n    'or',\n    'pass',\n    'raise',\n    'return',\n    'try',\n    'while',\n    'with',\n    'yield'\n  ];\n\n  const BUILT_INS = [\n    '__import__',\n    'abs',\n    'all',\n    'any',\n    'ascii',\n    'bin',\n    'bool',\n    'breakpoint',\n    'bytearray',\n    'bytes',\n    'callable',\n    'chr',\n    'classmethod',\n    'compile',\n    'complex',\n    'delattr',\n    'dict',\n    'dir',\n    'divmod',\n    'enumerate',\n    'eval',\n    'exec',\n    'filter',\n    'float',\n    'format',\n    'frozenset',\n    'getattr',\n    'globals',\n    'hasattr',\n    'hash',\n    'help',\n    'hex',\n    'id',\n    'input',\n    'int',\n    'isinstance',\n    'issubclass',\n    'iter',\n    'len',\n    'list',\n    'locals',\n    'map',\n    'max',\n    'memoryview',\n    'min',\n    'next',\n    'object',\n    'oct',\n    'open',\n    'ord',\n    'pow',\n    'print',\n    'property',\n    'range',\n    'repr',\n    'reversed',\n    'round',\n    'set',\n    'setattr',\n    'slice',\n    'sorted',\n    'staticmethod',\n    'str',\n    'sum',\n    'super',\n    'tuple',\n    'type',\n    'vars',\n    'zip'\n  ];\n\n  const LITERALS = [\n    '__debug__',\n    'Ellipsis',\n    'False',\n    'None',\n    'NotImplemented',\n    'True'\n  ];\n\n  // https://docs.python.org/3/library/typing.html\n  // TODO: Could these be supplemented by a CamelCase matcher in certain\n  // contexts, leaving these remaining only for relevance hinting?\n  const TYPES = [\n    \"Any\",\n    \"Callable\",\n    \"Coroutine\",\n    \"Dict\",\n    \"List\",\n    \"Literal\",\n    \"Generic\",\n    \"Optional\",\n    \"Sequence\",\n    \"Set\",\n    \"Tuple\",\n    \"Type\",\n    \"Union\"\n  ];\n\n  const KEYWORDS = {\n    $pattern: /[A-Za-z]\\w+|__\\w+__/,\n    keyword: RESERVED_WORDS,\n    built_in: BUILT_INS,\n    literal: LITERALS,\n    type: TYPES\n  };\n\n  const PROMPT = {\n    className: 'meta',\n    begin: /^(>>>|\\.\\.\\.) /\n  };\n\n  const SUBST = {\n    className: 'subst',\n    begin: /\\{/,\n    end: /\\}/,\n    keywords: KEYWORDS,\n    illegal: /#/\n  };\n\n  const LITERAL_BRACKET = {\n    begin: /\\{\\{/,\n    relevance: 0\n  };\n\n  const STRING = {\n    className: 'string',\n    contains: [ hljs.BACKSLASH_ESCAPE ],\n    variants: [\n      {\n        begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,\n        end: /'''/,\n        contains: [\n          hljs.BACKSLASH_ESCAPE,\n          PROMPT\n        ],\n        relevance: 10\n      },\n      {\n        begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?\"\"\"/,\n        end: /\"\"\"/,\n        contains: [\n          hljs.BACKSLASH_ESCAPE,\n          PROMPT\n        ],\n        relevance: 10\n      },\n      {\n        begin: /([fF][rR]|[rR][fF]|[fF])'''/,\n        end: /'''/,\n        contains: [\n          hljs.BACKSLASH_ESCAPE,\n          PROMPT,\n          LITERAL_BRACKET,\n          SUBST\n        ]\n      },\n      {\n        begin: /([fF][rR]|[rR][fF]|[fF])\"\"\"/,\n        end: /\"\"\"/,\n        contains: [\n          hljs.BACKSLASH_ESCAPE,\n          PROMPT,\n          LITERAL_BRACKET,\n          SUBST\n        ]\n      },\n      {\n        begin: /([uU]|[rR])'/,\n        end: /'/,\n        relevance: 10\n      },\n      {\n        begin: /([uU]|[rR])\"/,\n        end: /\"/,\n        relevance: 10\n      },\n      {\n        begin: /([bB]|[bB][rR]|[rR][bB])'/,\n        end: /'/\n      },\n      {\n        begin: /([bB]|[bB][rR]|[rR][bB])\"/,\n        end: /\"/\n      },\n      {\n        begin: /([fF][rR]|[rR][fF]|[fF])'/,\n        end: /'/,\n        contains: [\n          hljs.BACKSLASH_ESCAPE,\n          LITERAL_BRACKET,\n          SUBST\n        ]\n      },\n      {\n        begin: /([fF][rR]|[rR][fF]|[fF])\"/,\n        end: /\"/,\n        contains: [\n          hljs.BACKSLASH_ESCAPE,\n          LITERAL_BRACKET,\n          SUBST\n        ]\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE\n    ]\n  };\n\n  // https://docs.python.org/3.9/reference/lexical_analysis.html#numeric-literals\n  const digitpart = '[0-9](_?[0-9])*';\n  const pointfloat = `(\\\\b(${digitpart}))?\\\\.(${digitpart})|\\\\b(${digitpart})\\\\.`;\n  // Whitespace after a number (or any lexical token) is needed only if its absence\n  // would change the tokenization\n  // https://docs.python.org/3.9/reference/lexical_analysis.html#whitespace-between-tokens\n  // We deviate slightly, requiring a word boundary or a keyword\n  // to avoid accidentally recognizing *prefixes* (e.g., `0` in `0x41` or `08` or `0__1`)\n  const lookahead = `\\\\b|${RESERVED_WORDS.join('|')}`;\n  const NUMBER = {\n    className: 'number',\n    relevance: 0,\n    variants: [\n      // exponentfloat, pointfloat\n      // https://docs.python.org/3.9/reference/lexical_analysis.html#floating-point-literals\n      // optionally imaginary\n      // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals\n      // Note: no leading \\b because floats can start with a decimal point\n      // and we don't want to mishandle e.g. `fn(.5)`,\n      // no trailing \\b for pointfloat because it can end with a decimal point\n      // and we don't want to mishandle e.g. `0..hex()`; this should be safe\n      // because both MUST contain a decimal point and so cannot be confused with\n      // the interior part of an identifier\n      {\n        begin: `(\\\\b(${digitpart})|(${pointfloat}))[eE][+-]?(${digitpart})[jJ]?(?=${lookahead})`\n      },\n      {\n        begin: `(${pointfloat})[jJ]?`\n      },\n\n      // decinteger, bininteger, octinteger, hexinteger\n      // https://docs.python.org/3.9/reference/lexical_analysis.html#integer-literals\n      // optionally \"long\" in Python 2\n      // https://docs.python.org/2.7/reference/lexical_analysis.html#integer-and-long-integer-literals\n      // decinteger is optionally imaginary\n      // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals\n      {\n        begin: `\\\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${lookahead})`\n      },\n      {\n        begin: `\\\\b0[bB](_?[01])+[lL]?(?=${lookahead})`\n      },\n      {\n        begin: `\\\\b0[oO](_?[0-7])+[lL]?(?=${lookahead})`\n      },\n      {\n        begin: `\\\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${lookahead})`\n      },\n\n      // imagnumber (digitpart-based)\n      // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals\n      {\n        begin: `\\\\b(${digitpart})[jJ](?=${lookahead})`\n      }\n    ]\n  };\n  const COMMENT_TYPE = {\n    className: \"comment\",\n    begin: regex.lookahead(/# type:/),\n    end: /$/,\n    keywords: KEYWORDS,\n    contains: [\n      { // prevent keywords from coloring `type`\n        begin: /# type:/\n      },\n      // comment within a datatype comment includes no keywords\n      {\n        begin: /#/,\n        end: /\\b\\B/,\n        endsWithParent: true\n      }\n    ]\n  };\n  const PARAMS = {\n    className: 'params',\n    variants: [\n      // Exclude params in functions without params\n      {\n        className: \"\",\n        begin: /\\(\\s*\\)/,\n        skip: true\n      },\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        excludeBegin: true,\n        excludeEnd: true,\n        keywords: KEYWORDS,\n        contains: [\n          'self',\n          PROMPT,\n          NUMBER,\n          STRING,\n          hljs.HASH_COMMENT_MODE\n        ]\n      }\n    ]\n  };\n  SUBST.contains = [\n    STRING,\n    NUMBER,\n    PROMPT\n  ];\n\n  return {\n    name: 'Python',\n    aliases: [\n      'py',\n      'gyp',\n      'ipython'\n    ],\n    unicodeRegex: true,\n    keywords: KEYWORDS,\n    illegal: /(<\\/|\\?)|=>/,\n    contains: [\n      PROMPT,\n      NUMBER,\n      {\n        // very common convention\n        scope: 'variable.language',\n        match: /\\bself\\b/\n      },\n      {\n        // eat \"if\" prior to string so that it won't accidentally be\n        // labeled as an f-string\n        beginKeywords: \"if\",\n        relevance: 0\n      },\n      { match: /\\bor\\b/, scope: \"keyword\" },\n      STRING,\n      COMMENT_TYPE,\n      hljs.HASH_COMMENT_MODE,\n      {\n        match: [\n          /\\bdef/, /\\s+/,\n          IDENT_RE,\n        ],\n        scope: {\n          1: \"keyword\",\n          3: \"title.function\"\n        },\n        contains: [ PARAMS ]\n      },\n      {\n        variants: [\n          {\n            match: [\n              /\\bclass/, /\\s+/,\n              IDENT_RE, /\\s*/,\n              /\\(\\s*/, IDENT_RE,/\\s*\\)/\n            ],\n          },\n          {\n            match: [\n              /\\bclass/, /\\s+/,\n              IDENT_RE\n            ],\n          }\n        ],\n        scope: {\n          1: \"keyword\",\n          3: \"title.class\",\n          6: \"title.class.inherited\",\n        }\n      },\n      {\n        className: 'meta',\n        begin: /^[\\t ]*@/,\n        end: /(?=#)|$/,\n        contains: [\n          NUMBER,\n          PARAMS,\n          STRING\n        ]\n      }\n    ]\n  };\n}\n\nmodule.exports = python;\n","/*\nLanguage: Python REPL\nRequires: python.js\nAuthor: Josh Goebel <hello@joshgoebel.com>\nCategory: common\n*/\n\nfunction pythonRepl(hljs) {\n  return {\n    aliases: [ 'pycon' ],\n    contains: [\n      {\n        className: 'meta.prompt',\n        starts: {\n          // a space separates the REPL prefix from the actual code\n          // this is purely for cleaner HTML output\n          end: / |$/,\n          starts: {\n            end: '$',\n            subLanguage: 'python'\n          }\n        },\n        variants: [\n          { begin: /^>>>(?=[ ]|$)/ },\n          { begin: /^\\.\\.\\.(?=[ ]|$)/ }\n        ]\n      }\n    ]\n  };\n}\n\nmodule.exports = pythonRepl;\n","/*\nLanguage: R\nDescription: R is a free software environment for statistical computing and graphics.\nAuthor: Joe Cheng <joe@rstudio.org>\nContributors: Konrad Rudolph <konrad.rudolph@gmail.com>\nWebsite: https://www.r-project.org\nCategory: common,scientific\n*/\n\n/** @type LanguageFn */\nfunction r(hljs) {\n  const regex = hljs.regex;\n  // Identifiers in R cannot start with `_`, but they can start with `.` if it\n  // is not immediately followed by a digit.\n  // R also supports quoted identifiers, which are near-arbitrary sequences\n  // delimited by backticks (`…`), which may contain escape sequences. These are\n  // handled in a separate mode. See `test/markup/r/names.txt` for examples.\n  // FIXME: Support Unicode identifiers.\n  const IDENT_RE = /(?:(?:[a-zA-Z]|\\.[._a-zA-Z])[._a-zA-Z0-9]*)|\\.(?!\\d)/;\n  const NUMBER_TYPES_RE = regex.either(\n    // Special case: only hexadecimal binary powers can contain fractions\n    /0[xX][0-9a-fA-F]+\\.[0-9a-fA-F]*[pP][+-]?\\d+i?/,\n    // Hexadecimal numbers without fraction and optional binary power\n    /0[xX][0-9a-fA-F]+(?:[pP][+-]?\\d+)?[Li]?/,\n    // Decimal numbers\n    /(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?[Li]?/\n  );\n  const OPERATORS_RE = /[=!<>:]=|\\|\\||&&|:::?|<-|<<-|->>|->|\\|>|[-+*\\/?!$&|:<=>@^~]|\\*\\*/;\n  const PUNCTUATION_RE = regex.either(\n    /[()]/,\n    /[{}]/,\n    /\\[\\[/,\n    /[[\\]]/,\n    /\\\\/,\n    /,/\n  );\n\n  return {\n    name: 'R',\n\n    keywords: {\n      $pattern: IDENT_RE,\n      keyword:\n        'function if in break next repeat else for while',\n      literal:\n        'NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 '\n        + 'NA_character_|10 NA_complex_|10',\n      built_in:\n        // Builtin constants\n        'LETTERS letters month.abb month.name pi T F '\n        // Primitive functions\n        // These are all the functions in `base` that are implemented as a\n        // `.Primitive`, minus those functions that are also keywords.\n        + 'abs acos acosh all any anyNA Arg as.call as.character '\n        + 'as.complex as.double as.environment as.integer as.logical '\n        + 'as.null.default as.numeric as.raw asin asinh atan atanh attr '\n        + 'attributes baseenv browser c call ceiling class Conj cos cosh '\n        + 'cospi cummax cummin cumprod cumsum digamma dim dimnames '\n        + 'emptyenv exp expression floor forceAndCall gamma gc.time '\n        + 'globalenv Im interactive invisible is.array is.atomic is.call '\n        + 'is.character is.complex is.double is.environment is.expression '\n        + 'is.finite is.function is.infinite is.integer is.language '\n        + 'is.list is.logical is.matrix is.na is.name is.nan is.null '\n        + 'is.numeric is.object is.pairlist is.raw is.recursive is.single '\n        + 'is.symbol lazyLoadDBfetch length lgamma list log max min '\n        + 'missing Mod names nargs nzchar oldClass on.exit pos.to.env '\n        + 'proc.time prod quote range Re rep retracemem return round '\n        + 'seq_along seq_len seq.int sign signif sin sinh sinpi sqrt '\n        + 'standardGeneric substitute sum switch tan tanh tanpi tracemem '\n        + 'trigamma trunc unclass untracemem UseMethod xtfrm',\n    },\n\n    contains: [\n      // Roxygen comments\n      hljs.COMMENT(\n        /#'/,\n        /$/,\n        { contains: [\n          {\n            // Handle `@examples` separately to cause all subsequent code\n            // until the next `@`-tag on its own line to be kept as-is,\n            // preventing highlighting. This code is example R code, so nested\n            // doctags shouldn’t be treated as such. See\n            // `test/markup/r/roxygen.txt` for an example.\n            scope: 'doctag',\n            match: /@examples/,\n            starts: {\n              end: regex.lookahead(regex.either(\n                // end if another doc comment\n                /\\n^#'\\s*(?=@[a-zA-Z]+)/,\n                // or a line with no comment\n                /\\n^(?!#')/\n              )),\n              endsParent: true\n            }\n          },\n          {\n            // Handle `@param` to highlight the parameter name following\n            // after.\n            scope: 'doctag',\n            begin: '@param',\n            end: /$/,\n            contains: [\n              {\n                scope: 'variable',\n                variants: [\n                  { match: IDENT_RE },\n                  { match: /`(?:\\\\.|[^`\\\\])+`/ }\n                ],\n                endsParent: true\n              }\n            ]\n          },\n          {\n            scope: 'doctag',\n            match: /@[a-zA-Z]+/\n          },\n          {\n            scope: 'keyword',\n            match: /\\\\[a-zA-Z]+/\n          }\n        ] }\n      ),\n\n      hljs.HASH_COMMENT_MODE,\n\n      {\n        scope: 'string',\n        contains: [ hljs.BACKSLASH_ESCAPE ],\n        variants: [\n          hljs.END_SAME_AS_BEGIN({\n            begin: /[rR]\"(-*)\\(/,\n            end: /\\)(-*)\"/\n          }),\n          hljs.END_SAME_AS_BEGIN({\n            begin: /[rR]\"(-*)\\{/,\n            end: /\\}(-*)\"/\n          }),\n          hljs.END_SAME_AS_BEGIN({\n            begin: /[rR]\"(-*)\\[/,\n            end: /\\](-*)\"/\n          }),\n          hljs.END_SAME_AS_BEGIN({\n            begin: /[rR]'(-*)\\(/,\n            end: /\\)(-*)'/\n          }),\n          hljs.END_SAME_AS_BEGIN({\n            begin: /[rR]'(-*)\\{/,\n            end: /\\}(-*)'/\n          }),\n          hljs.END_SAME_AS_BEGIN({\n            begin: /[rR]'(-*)\\[/,\n            end: /\\](-*)'/\n          }),\n          {\n            begin: '\"',\n            end: '\"',\n            relevance: 0\n          },\n          {\n            begin: \"'\",\n            end: \"'\",\n            relevance: 0\n          }\n        ],\n      },\n\n      // Matching numbers immediately following punctuation and operators is\n      // tricky since we need to look at the character ahead of a number to\n      // ensure the number is not part of an identifier, and we cannot use\n      // negative look-behind assertions. So instead we explicitly handle all\n      // possible combinations of (operator|punctuation), number.\n      // TODO: replace with negative look-behind when available\n      // { begin: /(?<![a-zA-Z0-9._])0[xX][0-9a-fA-F]+\\.[0-9a-fA-F]*[pP][+-]?\\d+i?/ },\n      // { begin: /(?<![a-zA-Z0-9._])0[xX][0-9a-fA-F]+([pP][+-]?\\d+)?[Li]?/ },\n      // { begin: /(?<![a-zA-Z0-9._])(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?[Li]?/ }\n      {\n        relevance: 0,\n        variants: [\n          {\n            scope: {\n              1: 'operator',\n              2: 'number'\n            },\n            match: [\n              OPERATORS_RE,\n              NUMBER_TYPES_RE\n            ]\n          },\n          {\n            scope: {\n              1: 'operator',\n              2: 'number'\n            },\n            match: [\n              /%[^%]*%/,\n              NUMBER_TYPES_RE\n            ]\n          },\n          {\n            scope: {\n              1: 'punctuation',\n              2: 'number'\n            },\n            match: [\n              PUNCTUATION_RE,\n              NUMBER_TYPES_RE\n            ]\n          },\n          {\n            scope: { 2: 'number' },\n            match: [\n              /[^a-zA-Z0-9._]|^/, // not part of an identifier, or start of document\n              NUMBER_TYPES_RE\n            ]\n          }\n        ]\n      },\n\n      // Operators/punctuation when they're not directly followed by numbers\n      {\n        // Relevance boost for the most common assignment form.\n        scope: { 3: 'operator' },\n        match: [\n          IDENT_RE,\n          /\\s+/,\n          /<-/,\n          /\\s+/\n        ]\n      },\n\n      {\n        scope: 'operator',\n        relevance: 0,\n        variants: [\n          { match: OPERATORS_RE },\n          { match: /%[^%]*%/ }\n        ]\n      },\n\n      {\n        scope: 'punctuation',\n        relevance: 0,\n        match: PUNCTUATION_RE\n      },\n\n      {\n        // Escaped identifier\n        begin: '`',\n        end: '`',\n        contains: [ { begin: /\\\\./ } ]\n      }\n    ]\n  };\n}\n\nmodule.exports = r;\n","/*\nLanguage: Rust\nAuthor: Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>\nContributors: Roman Shmatov <romanshmatov@gmail.com>, Kasper Andersen <kma_untrusted@protonmail.com>\nWebsite: https://www.rust-lang.org\nCategory: common, system\n*/\n\n/** @type LanguageFn */\n\nfunction rust(hljs) {\n  const regex = hljs.regex;\n  // ============================================\n  // Added to support the r# keyword, which is a raw identifier in Rust.\n  const RAW_IDENTIFIER = /(r#)?/;\n  const UNDERSCORE_IDENT_RE = regex.concat(RAW_IDENTIFIER, hljs.UNDERSCORE_IDENT_RE);\n  const IDENT_RE = regex.concat(RAW_IDENTIFIER, hljs.IDENT_RE);\n  // ============================================\n  const FUNCTION_INVOKE = {\n    className: \"title.function.invoke\",\n    relevance: 0,\n    begin: regex.concat(\n      /\\b/,\n      /(?!let|for|while|if|else|match\\b)/,\n      IDENT_RE,\n      regex.lookahead(/\\s*\\(/))\n  };\n  const NUMBER_SUFFIX = '([ui](8|16|32|64|128|size)|f(32|64))\\?';\n  const KEYWORDS = [\n    \"abstract\",\n    \"as\",\n    \"async\",\n    \"await\",\n    \"become\",\n    \"box\",\n    \"break\",\n    \"const\",\n    \"continue\",\n    \"crate\",\n    \"do\",\n    \"dyn\",\n    \"else\",\n    \"enum\",\n    \"extern\",\n    \"false\",\n    \"final\",\n    \"fn\",\n    \"for\",\n    \"if\",\n    \"impl\",\n    \"in\",\n    \"let\",\n    \"loop\",\n    \"macro\",\n    \"match\",\n    \"mod\",\n    \"move\",\n    \"mut\",\n    \"override\",\n    \"priv\",\n    \"pub\",\n    \"ref\",\n    \"return\",\n    \"self\",\n    \"Self\",\n    \"static\",\n    \"struct\",\n    \"super\",\n    \"trait\",\n    \"true\",\n    \"try\",\n    \"type\",\n    \"typeof\",\n    \"union\",\n    \"unsafe\",\n    \"unsized\",\n    \"use\",\n    \"virtual\",\n    \"where\",\n    \"while\",\n    \"yield\"\n  ];\n  const LITERALS = [\n    \"true\",\n    \"false\",\n    \"Some\",\n    \"None\",\n    \"Ok\",\n    \"Err\"\n  ];\n  const BUILTINS = [\n    // functions\n    'drop ',\n    // traits\n    \"Copy\",\n    \"Send\",\n    \"Sized\",\n    \"Sync\",\n    \"Drop\",\n    \"Fn\",\n    \"FnMut\",\n    \"FnOnce\",\n    \"ToOwned\",\n    \"Clone\",\n    \"Debug\",\n    \"PartialEq\",\n    \"PartialOrd\",\n    \"Eq\",\n    \"Ord\",\n    \"AsRef\",\n    \"AsMut\",\n    \"Into\",\n    \"From\",\n    \"Default\",\n    \"Iterator\",\n    \"Extend\",\n    \"IntoIterator\",\n    \"DoubleEndedIterator\",\n    \"ExactSizeIterator\",\n    \"SliceConcatExt\",\n    \"ToString\",\n    // macros\n    \"assert!\",\n    \"assert_eq!\",\n    \"bitflags!\",\n    \"bytes!\",\n    \"cfg!\",\n    \"col!\",\n    \"concat!\",\n    \"concat_idents!\",\n    \"debug_assert!\",\n    \"debug_assert_eq!\",\n    \"env!\",\n    \"eprintln!\",\n    \"panic!\",\n    \"file!\",\n    \"format!\",\n    \"format_args!\",\n    \"include_bytes!\",\n    \"include_str!\",\n    \"line!\",\n    \"local_data_key!\",\n    \"module_path!\",\n    \"option_env!\",\n    \"print!\",\n    \"println!\",\n    \"select!\",\n    \"stringify!\",\n    \"try!\",\n    \"unimplemented!\",\n    \"unreachable!\",\n    \"vec!\",\n    \"write!\",\n    \"writeln!\",\n    \"macro_rules!\",\n    \"assert_ne!\",\n    \"debug_assert_ne!\"\n  ];\n  const TYPES = [\n    \"i8\",\n    \"i16\",\n    \"i32\",\n    \"i64\",\n    \"i128\",\n    \"isize\",\n    \"u8\",\n    \"u16\",\n    \"u32\",\n    \"u64\",\n    \"u128\",\n    \"usize\",\n    \"f32\",\n    \"f64\",\n    \"str\",\n    \"char\",\n    \"bool\",\n    \"Box\",\n    \"Option\",\n    \"Result\",\n    \"String\",\n    \"Vec\"\n  ];\n  return {\n    name: 'Rust',\n    aliases: [ 'rs' ],\n    keywords: {\n      $pattern: hljs.IDENT_RE + '!?',\n      type: TYPES,\n      keyword: KEYWORDS,\n      literal: LITERALS,\n      built_in: BUILTINS\n    },\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.COMMENT('/\\\\*', '\\\\*/', { contains: [ 'self' ] }),\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {\n        begin: /b?\"/,\n        illegal: null\n      }),\n      {\n        className: 'symbol',\n        // negative lookahead to avoid matching `'`\n        begin: /'[a-zA-Z_][a-zA-Z0-9_]*(?!')/\n      },\n      {\n        scope: 'string',\n        variants: [\n          { begin: /b?r(#*)\"(.|\\n)*?\"\\1(?!#)/ },\n          {\n            begin: /b?'/,\n            end: /'/,\n            contains: [\n              {\n                scope: \"char.escape\",\n                match: /\\\\('|\\w|x\\w{2}|u\\w{4}|U\\w{8})/\n              }\n            ]\n          }\n        ]\n      },\n      {\n        className: 'number',\n        variants: [\n          { begin: '\\\\b0b([01_]+)' + NUMBER_SUFFIX },\n          { begin: '\\\\b0o([0-7_]+)' + NUMBER_SUFFIX },\n          { begin: '\\\\b0x([A-Fa-f0-9_]+)' + NUMBER_SUFFIX },\n          { begin: '\\\\b(\\\\d[\\\\d_]*(\\\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)'\n                   + NUMBER_SUFFIX }\n        ],\n        relevance: 0\n      },\n      {\n        begin: [\n          /fn/,\n          /\\s+/,\n          UNDERSCORE_IDENT_RE\n        ],\n        className: {\n          1: \"keyword\",\n          3: \"title.function\"\n        }\n      },\n      {\n        className: 'meta',\n        begin: '#!?\\\\[',\n        end: '\\\\]',\n        contains: [\n          {\n            className: 'string',\n            begin: /\"/,\n            end: /\"/,\n            contains: [\n              hljs.BACKSLASH_ESCAPE\n            ]\n          }\n        ]\n      },\n      {\n        begin: [\n          /let/,\n          /\\s+/,\n          /(?:mut\\s+)?/,\n          UNDERSCORE_IDENT_RE\n        ],\n        className: {\n          1: \"keyword\",\n          3: \"keyword\",\n          4: \"variable\"\n        }\n      },\n      // must come before impl/for rule later\n      {\n        begin: [\n          /for/,\n          /\\s+/,\n          UNDERSCORE_IDENT_RE,\n          /\\s+/,\n          /in/\n        ],\n        className: {\n          1: \"keyword\",\n          3: \"variable\",\n          5: \"keyword\"\n        }\n      },\n      {\n        begin: [\n          /type/,\n          /\\s+/,\n          UNDERSCORE_IDENT_RE\n        ],\n        className: {\n          1: \"keyword\",\n          3: \"title.class\"\n        }\n      },\n      {\n        begin: [\n          /(?:trait|enum|struct|union|impl|for)/,\n          /\\s+/,\n          UNDERSCORE_IDENT_RE\n        ],\n        className: {\n          1: \"keyword\",\n          3: \"title.class\"\n        }\n      },\n      {\n        begin: hljs.IDENT_RE + '::',\n        keywords: {\n          keyword: \"Self\",\n          built_in: BUILTINS,\n          type: TYPES\n        }\n      },\n      {\n        className: \"punctuation\",\n        begin: '->'\n      },\n      FUNCTION_INVOKE\n    ]\n  };\n}\n\nmodule.exports = rust;\n","const MODES = (hljs) => {\n  return {\n    IMPORTANT: {\n      scope: 'meta',\n      begin: '!important'\n    },\n    BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE,\n    HEXCOLOR: {\n      scope: 'number',\n      begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\\b/\n    },\n    FUNCTION_DISPATCH: {\n      className: \"built_in\",\n      begin: /[\\w-]+(?=\\()/\n    },\n    ATTRIBUTE_SELECTOR_MODE: {\n      scope: 'selector-attr',\n      begin: /\\[/,\n      end: /\\]/,\n      illegal: '$',\n      contains: [\n        hljs.APOS_STRING_MODE,\n        hljs.QUOTE_STRING_MODE\n      ]\n    },\n    CSS_NUMBER_MODE: {\n      scope: 'number',\n      begin: hljs.NUMBER_RE + '(' +\n        '%|em|ex|ch|rem' +\n        '|vw|vh|vmin|vmax' +\n        '|cm|mm|in|pt|pc|px' +\n        '|deg|grad|rad|turn' +\n        '|s|ms' +\n        '|Hz|kHz' +\n        '|dpi|dpcm|dppx' +\n        ')?',\n      relevance: 0\n    },\n    CSS_VARIABLE: {\n      className: \"attr\",\n      begin: /--[A-Za-z_][A-Za-z0-9_-]*/\n    }\n  };\n};\n\nconst HTML_TAGS = [\n  'a',\n  'abbr',\n  'address',\n  'article',\n  'aside',\n  'audio',\n  'b',\n  'blockquote',\n  'body',\n  'button',\n  'canvas',\n  'caption',\n  'cite',\n  'code',\n  'dd',\n  'del',\n  'details',\n  'dfn',\n  'div',\n  'dl',\n  'dt',\n  'em',\n  'fieldset',\n  'figcaption',\n  'figure',\n  'footer',\n  'form',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'header',\n  'hgroup',\n  'html',\n  'i',\n  'iframe',\n  'img',\n  'input',\n  'ins',\n  'kbd',\n  'label',\n  'legend',\n  'li',\n  'main',\n  'mark',\n  'menu',\n  'nav',\n  'object',\n  'ol',\n  'optgroup',\n  'option',\n  'p',\n  'picture',\n  'q',\n  'quote',\n  'samp',\n  'section',\n  'select',\n  'source',\n  'span',\n  'strong',\n  'summary',\n  'sup',\n  'table',\n  'tbody',\n  'td',\n  'textarea',\n  'tfoot',\n  'th',\n  'thead',\n  'time',\n  'tr',\n  'ul',\n  'var',\n  'video'\n];\n\nconst SVG_TAGS = [\n  'defs',\n  'g',\n  'marker',\n  'mask',\n  'pattern',\n  'svg',\n  'switch',\n  'symbol',\n  'feBlend',\n  'feColorMatrix',\n  'feComponentTransfer',\n  'feComposite',\n  'feConvolveMatrix',\n  'feDiffuseLighting',\n  'feDisplacementMap',\n  'feFlood',\n  'feGaussianBlur',\n  'feImage',\n  'feMerge',\n  'feMorphology',\n  'feOffset',\n  'feSpecularLighting',\n  'feTile',\n  'feTurbulence',\n  'linearGradient',\n  'radialGradient',\n  'stop',\n  'circle',\n  'ellipse',\n  'image',\n  'line',\n  'path',\n  'polygon',\n  'polyline',\n  'rect',\n  'text',\n  'use',\n  'textPath',\n  'tspan',\n  'foreignObject',\n  'clipPath'\n];\n\nconst TAGS = [\n  ...HTML_TAGS,\n  ...SVG_TAGS,\n];\n\n// Sorting, then reversing makes sure longer attributes/elements like\n// `font-weight` are matched fully instead of getting false positives on say `font`\n\nconst MEDIA_FEATURES = [\n  'any-hover',\n  'any-pointer',\n  'aspect-ratio',\n  'color',\n  'color-gamut',\n  'color-index',\n  'device-aspect-ratio',\n  'device-height',\n  'device-width',\n  'display-mode',\n  'forced-colors',\n  'grid',\n  'height',\n  'hover',\n  'inverted-colors',\n  'monochrome',\n  'orientation',\n  'overflow-block',\n  'overflow-inline',\n  'pointer',\n  'prefers-color-scheme',\n  'prefers-contrast',\n  'prefers-reduced-motion',\n  'prefers-reduced-transparency',\n  'resolution',\n  'scan',\n  'scripting',\n  'update',\n  'width',\n  // TODO: find a better solution?\n  'min-width',\n  'max-width',\n  'min-height',\n  'max-height'\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes\nconst PSEUDO_CLASSES = [\n  'active',\n  'any-link',\n  'blank',\n  'checked',\n  'current',\n  'default',\n  'defined',\n  'dir', // dir()\n  'disabled',\n  'drop',\n  'empty',\n  'enabled',\n  'first',\n  'first-child',\n  'first-of-type',\n  'fullscreen',\n  'future',\n  'focus',\n  'focus-visible',\n  'focus-within',\n  'has', // has()\n  'host', // host or host()\n  'host-context', // host-context()\n  'hover',\n  'indeterminate',\n  'in-range',\n  'invalid',\n  'is', // is()\n  'lang', // lang()\n  'last-child',\n  'last-of-type',\n  'left',\n  'link',\n  'local-link',\n  'not', // not()\n  'nth-child', // nth-child()\n  'nth-col', // nth-col()\n  'nth-last-child', // nth-last-child()\n  'nth-last-col', // nth-last-col()\n  'nth-last-of-type', //nth-last-of-type()\n  'nth-of-type', //nth-of-type()\n  'only-child',\n  'only-of-type',\n  'optional',\n  'out-of-range',\n  'past',\n  'placeholder-shown',\n  'read-only',\n  'read-write',\n  'required',\n  'right',\n  'root',\n  'scope',\n  'target',\n  'target-within',\n  'user-invalid',\n  'valid',\n  'visited',\n  'where' // where()\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements\nconst PSEUDO_ELEMENTS = [\n  'after',\n  'backdrop',\n  'before',\n  'cue',\n  'cue-region',\n  'first-letter',\n  'first-line',\n  'grammar-error',\n  'marker',\n  'part',\n  'placeholder',\n  'selection',\n  'slotted',\n  'spelling-error'\n].sort().reverse();\n\nconst ATTRIBUTES = [\n  'accent-color',\n  'align-content',\n  'align-items',\n  'align-self',\n  'alignment-baseline',\n  'all',\n  'anchor-name',\n  'animation',\n  'animation-composition',\n  'animation-delay',\n  'animation-direction',\n  'animation-duration',\n  'animation-fill-mode',\n  'animation-iteration-count',\n  'animation-name',\n  'animation-play-state',\n  'animation-range',\n  'animation-range-end',\n  'animation-range-start',\n  'animation-timeline',\n  'animation-timing-function',\n  'appearance',\n  'aspect-ratio',\n  'backdrop-filter',\n  'backface-visibility',\n  'background',\n  'background-attachment',\n  'background-blend-mode',\n  'background-clip',\n  'background-color',\n  'background-image',\n  'background-origin',\n  'background-position',\n  'background-position-x',\n  'background-position-y',\n  'background-repeat',\n  'background-size',\n  'baseline-shift',\n  'block-size',\n  'border',\n  'border-block',\n  'border-block-color',\n  'border-block-end',\n  'border-block-end-color',\n  'border-block-end-style',\n  'border-block-end-width',\n  'border-block-start',\n  'border-block-start-color',\n  'border-block-start-style',\n  'border-block-start-width',\n  'border-block-style',\n  'border-block-width',\n  'border-bottom',\n  'border-bottom-color',\n  'border-bottom-left-radius',\n  'border-bottom-right-radius',\n  'border-bottom-style',\n  'border-bottom-width',\n  'border-collapse',\n  'border-color',\n  'border-end-end-radius',\n  'border-end-start-radius',\n  'border-image',\n  'border-image-outset',\n  'border-image-repeat',\n  'border-image-slice',\n  'border-image-source',\n  'border-image-width',\n  'border-inline',\n  'border-inline-color',\n  'border-inline-end',\n  'border-inline-end-color',\n  'border-inline-end-style',\n  'border-inline-end-width',\n  'border-inline-start',\n  'border-inline-start-color',\n  'border-inline-start-style',\n  'border-inline-start-width',\n  'border-inline-style',\n  'border-inline-width',\n  'border-left',\n  'border-left-color',\n  'border-left-style',\n  'border-left-width',\n  'border-radius',\n  'border-right',\n  'border-right-color',\n  'border-right-style',\n  'border-right-width',\n  'border-spacing',\n  'border-start-end-radius',\n  'border-start-start-radius',\n  'border-style',\n  'border-top',\n  'border-top-color',\n  'border-top-left-radius',\n  'border-top-right-radius',\n  'border-top-style',\n  'border-top-width',\n  'border-width',\n  'bottom',\n  'box-align',\n  'box-decoration-break',\n  'box-direction',\n  'box-flex',\n  'box-flex-group',\n  'box-lines',\n  'box-ordinal-group',\n  'box-orient',\n  'box-pack',\n  'box-shadow',\n  'box-sizing',\n  'break-after',\n  'break-before',\n  'break-inside',\n  'caption-side',\n  'caret-color',\n  'clear',\n  'clip',\n  'clip-path',\n  'clip-rule',\n  'color',\n  'color-interpolation',\n  'color-interpolation-filters',\n  'color-profile',\n  'color-rendering',\n  'color-scheme',\n  'column-count',\n  'column-fill',\n  'column-gap',\n  'column-rule',\n  'column-rule-color',\n  'column-rule-style',\n  'column-rule-width',\n  'column-span',\n  'column-width',\n  'columns',\n  'contain',\n  'contain-intrinsic-block-size',\n  'contain-intrinsic-height',\n  'contain-intrinsic-inline-size',\n  'contain-intrinsic-size',\n  'contain-intrinsic-width',\n  'container',\n  'container-name',\n  'container-type',\n  'content',\n  'content-visibility',\n  'counter-increment',\n  'counter-reset',\n  'counter-set',\n  'cue',\n  'cue-after',\n  'cue-before',\n  'cursor',\n  'cx',\n  'cy',\n  'direction',\n  'display',\n  'dominant-baseline',\n  'empty-cells',\n  'enable-background',\n  'field-sizing',\n  'fill',\n  'fill-opacity',\n  'fill-rule',\n  'filter',\n  'flex',\n  'flex-basis',\n  'flex-direction',\n  'flex-flow',\n  'flex-grow',\n  'flex-shrink',\n  'flex-wrap',\n  'float',\n  'flood-color',\n  'flood-opacity',\n  'flow',\n  'font',\n  'font-display',\n  'font-family',\n  'font-feature-settings',\n  'font-kerning',\n  'font-language-override',\n  'font-optical-sizing',\n  'font-palette',\n  'font-size',\n  'font-size-adjust',\n  'font-smooth',\n  'font-smoothing',\n  'font-stretch',\n  'font-style',\n  'font-synthesis',\n  'font-synthesis-position',\n  'font-synthesis-small-caps',\n  'font-synthesis-style',\n  'font-synthesis-weight',\n  'font-variant',\n  'font-variant-alternates',\n  'font-variant-caps',\n  'font-variant-east-asian',\n  'font-variant-emoji',\n  'font-variant-ligatures',\n  'font-variant-numeric',\n  'font-variant-position',\n  'font-variation-settings',\n  'font-weight',\n  'forced-color-adjust',\n  'gap',\n  'glyph-orientation-horizontal',\n  'glyph-orientation-vertical',\n  'grid',\n  'grid-area',\n  'grid-auto-columns',\n  'grid-auto-flow',\n  'grid-auto-rows',\n  'grid-column',\n  'grid-column-end',\n  'grid-column-start',\n  'grid-gap',\n  'grid-row',\n  'grid-row-end',\n  'grid-row-start',\n  'grid-template',\n  'grid-template-areas',\n  'grid-template-columns',\n  'grid-template-rows',\n  'hanging-punctuation',\n  'height',\n  'hyphenate-character',\n  'hyphenate-limit-chars',\n  'hyphens',\n  'icon',\n  'image-orientation',\n  'image-rendering',\n  'image-resolution',\n  'ime-mode',\n  'initial-letter',\n  'initial-letter-align',\n  'inline-size',\n  'inset',\n  'inset-area',\n  'inset-block',\n  'inset-block-end',\n  'inset-block-start',\n  'inset-inline',\n  'inset-inline-end',\n  'inset-inline-start',\n  'isolation',\n  'justify-content',\n  'justify-items',\n  'justify-self',\n  'kerning',\n  'left',\n  'letter-spacing',\n  'lighting-color',\n  'line-break',\n  'line-height',\n  'line-height-step',\n  'list-style',\n  'list-style-image',\n  'list-style-position',\n  'list-style-type',\n  'margin',\n  'margin-block',\n  'margin-block-end',\n  'margin-block-start',\n  'margin-bottom',\n  'margin-inline',\n  'margin-inline-end',\n  'margin-inline-start',\n  'margin-left',\n  'margin-right',\n  'margin-top',\n  'margin-trim',\n  'marker',\n  'marker-end',\n  'marker-mid',\n  'marker-start',\n  'marks',\n  'mask',\n  'mask-border',\n  'mask-border-mode',\n  'mask-border-outset',\n  'mask-border-repeat',\n  'mask-border-slice',\n  'mask-border-source',\n  'mask-border-width',\n  'mask-clip',\n  'mask-composite',\n  'mask-image',\n  'mask-mode',\n  'mask-origin',\n  'mask-position',\n  'mask-repeat',\n  'mask-size',\n  'mask-type',\n  'masonry-auto-flow',\n  'math-depth',\n  'math-shift',\n  'math-style',\n  'max-block-size',\n  'max-height',\n  'max-inline-size',\n  'max-width',\n  'min-block-size',\n  'min-height',\n  'min-inline-size',\n  'min-width',\n  'mix-blend-mode',\n  'nav-down',\n  'nav-index',\n  'nav-left',\n  'nav-right',\n  'nav-up',\n  'none',\n  'normal',\n  'object-fit',\n  'object-position',\n  'offset',\n  'offset-anchor',\n  'offset-distance',\n  'offset-path',\n  'offset-position',\n  'offset-rotate',\n  'opacity',\n  'order',\n  'orphans',\n  'outline',\n  'outline-color',\n  'outline-offset',\n  'outline-style',\n  'outline-width',\n  'overflow',\n  'overflow-anchor',\n  'overflow-block',\n  'overflow-clip-margin',\n  'overflow-inline',\n  'overflow-wrap',\n  'overflow-x',\n  'overflow-y',\n  'overlay',\n  'overscroll-behavior',\n  'overscroll-behavior-block',\n  'overscroll-behavior-inline',\n  'overscroll-behavior-x',\n  'overscroll-behavior-y',\n  'padding',\n  'padding-block',\n  'padding-block-end',\n  'padding-block-start',\n  'padding-bottom',\n  'padding-inline',\n  'padding-inline-end',\n  'padding-inline-start',\n  'padding-left',\n  'padding-right',\n  'padding-top',\n  'page',\n  'page-break-after',\n  'page-break-before',\n  'page-break-inside',\n  'paint-order',\n  'pause',\n  'pause-after',\n  'pause-before',\n  'perspective',\n  'perspective-origin',\n  'place-content',\n  'place-items',\n  'place-self',\n  'pointer-events',\n  'position',\n  'position-anchor',\n  'position-visibility',\n  'print-color-adjust',\n  'quotes',\n  'r',\n  'resize',\n  'rest',\n  'rest-after',\n  'rest-before',\n  'right',\n  'rotate',\n  'row-gap',\n  'ruby-align',\n  'ruby-position',\n  'scale',\n  'scroll-behavior',\n  'scroll-margin',\n  'scroll-margin-block',\n  'scroll-margin-block-end',\n  'scroll-margin-block-start',\n  'scroll-margin-bottom',\n  'scroll-margin-inline',\n  'scroll-margin-inline-end',\n  'scroll-margin-inline-start',\n  'scroll-margin-left',\n  'scroll-margin-right',\n  'scroll-margin-top',\n  'scroll-padding',\n  'scroll-padding-block',\n  'scroll-padding-block-end',\n  'scroll-padding-block-start',\n  'scroll-padding-bottom',\n  'scroll-padding-inline',\n  'scroll-padding-inline-end',\n  'scroll-padding-inline-start',\n  'scroll-padding-left',\n  'scroll-padding-right',\n  'scroll-padding-top',\n  'scroll-snap-align',\n  'scroll-snap-stop',\n  'scroll-snap-type',\n  'scroll-timeline',\n  'scroll-timeline-axis',\n  'scroll-timeline-name',\n  'scrollbar-color',\n  'scrollbar-gutter',\n  'scrollbar-width',\n  'shape-image-threshold',\n  'shape-margin',\n  'shape-outside',\n  'shape-rendering',\n  'speak',\n  'speak-as',\n  'src', // @font-face\n  'stop-color',\n  'stop-opacity',\n  'stroke',\n  'stroke-dasharray',\n  'stroke-dashoffset',\n  'stroke-linecap',\n  'stroke-linejoin',\n  'stroke-miterlimit',\n  'stroke-opacity',\n  'stroke-width',\n  'tab-size',\n  'table-layout',\n  'text-align',\n  'text-align-all',\n  'text-align-last',\n  'text-anchor',\n  'text-combine-upright',\n  'text-decoration',\n  'text-decoration-color',\n  'text-decoration-line',\n  'text-decoration-skip',\n  'text-decoration-skip-ink',\n  'text-decoration-style',\n  'text-decoration-thickness',\n  'text-emphasis',\n  'text-emphasis-color',\n  'text-emphasis-position',\n  'text-emphasis-style',\n  'text-indent',\n  'text-justify',\n  'text-orientation',\n  'text-overflow',\n  'text-rendering',\n  'text-shadow',\n  'text-size-adjust',\n  'text-transform',\n  'text-underline-offset',\n  'text-underline-position',\n  'text-wrap',\n  'text-wrap-mode',\n  'text-wrap-style',\n  'timeline-scope',\n  'top',\n  'touch-action',\n  'transform',\n  'transform-box',\n  'transform-origin',\n  'transform-style',\n  'transition',\n  'transition-behavior',\n  'transition-delay',\n  'transition-duration',\n  'transition-property',\n  'transition-timing-function',\n  'translate',\n  'unicode-bidi',\n  'user-modify',\n  'user-select',\n  'vector-effect',\n  'vertical-align',\n  'view-timeline',\n  'view-timeline-axis',\n  'view-timeline-inset',\n  'view-timeline-name',\n  'view-transition-name',\n  'visibility',\n  'voice-balance',\n  'voice-duration',\n  'voice-family',\n  'voice-pitch',\n  'voice-range',\n  'voice-rate',\n  'voice-stress',\n  'voice-volume',\n  'white-space',\n  'white-space-collapse',\n  'widows',\n  'width',\n  'will-change',\n  'word-break',\n  'word-spacing',\n  'word-wrap',\n  'writing-mode',\n  'x',\n  'y',\n  'z-index',\n  'zoom'\n].sort().reverse();\n\n/*\nLanguage: SCSS\nDescription: Scss is an extension of the syntax of CSS.\nAuthor: Kurt Emch <kurt@kurtemch.com>\nWebsite: https://sass-lang.com\nCategory: common, css, web\n*/\n\n\n/** @type LanguageFn */\nfunction scss(hljs) {\n  const modes = MODES(hljs);\n  const PSEUDO_ELEMENTS$1 = PSEUDO_ELEMENTS;\n  const PSEUDO_CLASSES$1 = PSEUDO_CLASSES;\n\n  const AT_IDENTIFIER = '@[a-z-]+'; // @font-face\n  const AT_MODIFIERS = \"and or not only\";\n  const IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';\n  const VARIABLE = {\n    className: 'variable',\n    begin: '(\\\\$' + IDENT_RE + ')\\\\b',\n    relevance: 0\n  };\n\n  return {\n    name: 'SCSS',\n    case_insensitive: true,\n    illegal: '[=/|\\']',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      // to recognize keyframe 40% etc which are outside the scope of our\n      // attribute value mode\n      modes.CSS_NUMBER_MODE,\n      {\n        className: 'selector-id',\n        begin: '#[A-Za-z0-9_-]+',\n        relevance: 0\n      },\n      {\n        className: 'selector-class',\n        begin: '\\\\.[A-Za-z0-9_-]+',\n        relevance: 0\n      },\n      modes.ATTRIBUTE_SELECTOR_MODE,\n      {\n        className: 'selector-tag',\n        begin: '\\\\b(' + TAGS.join('|') + ')\\\\b',\n        // was there, before, but why?\n        relevance: 0\n      },\n      {\n        className: 'selector-pseudo',\n        begin: ':(' + PSEUDO_CLASSES$1.join('|') + ')'\n      },\n      {\n        className: 'selector-pseudo',\n        begin: ':(:)?(' + PSEUDO_ELEMENTS$1.join('|') + ')'\n      },\n      VARIABLE,\n      { // pseudo-selector params\n        begin: /\\(/,\n        end: /\\)/,\n        contains: [ modes.CSS_NUMBER_MODE ]\n      },\n      modes.CSS_VARIABLE,\n      {\n        className: 'attribute',\n        begin: '\\\\b(' + ATTRIBUTES.join('|') + ')\\\\b'\n      },\n      { begin: '\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b' },\n      {\n        begin: /:/,\n        end: /[;}{]/,\n        relevance: 0,\n        contains: [\n          modes.BLOCK_COMMENT,\n          VARIABLE,\n          modes.HEXCOLOR,\n          modes.CSS_NUMBER_MODE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.APOS_STRING_MODE,\n          modes.IMPORTANT,\n          modes.FUNCTION_DISPATCH\n        ]\n      },\n      // matching these here allows us to treat them more like regular CSS\n      // rules so everything between the {} gets regular rule highlighting,\n      // which is what we want for page and font-face\n      {\n        begin: '@(page|font-face)',\n        keywords: {\n          $pattern: AT_IDENTIFIER,\n          keyword: '@page @font-face'\n        }\n      },\n      {\n        begin: '@',\n        end: '[{;]',\n        returnBegin: true,\n        keywords: {\n          $pattern: /[a-z-]+/,\n          keyword: AT_MODIFIERS,\n          attribute: MEDIA_FEATURES.join(\" \")\n        },\n        contains: [\n          {\n            begin: AT_IDENTIFIER,\n            className: \"keyword\"\n          },\n          {\n            begin: /[a-z-]+(?=:)/,\n            className: \"attribute\"\n          },\n          VARIABLE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.APOS_STRING_MODE,\n          modes.HEXCOLOR,\n          modes.CSS_NUMBER_MODE\n        ]\n      },\n      modes.FUNCTION_DISPATCH\n    ]\n  };\n}\n\nmodule.exports = scss;\n","/*\nLanguage: Shell Session\nRequires: bash.js\nAuthor: TSUYUSATO Kitsune <make.just.on@gmail.com>\nCategory: common\nAudit: 2020\n*/\n\n/** @type LanguageFn */\nfunction shell(hljs) {\n  return {\n    name: 'Shell Session',\n    aliases: [\n      'console',\n      'shellsession'\n    ],\n    contains: [\n      {\n        className: 'meta.prompt',\n        // We cannot add \\s (spaces) in the regular expression otherwise it will be too broad and produce unexpected result.\n        // For instance, in the following example, it would match \"echo /path/to/home >\" as a prompt:\n        // echo /path/to/home > t.exe\n        begin: /^\\s{0,3}[/~\\w\\d[\\]()@-]*[>%$#][ ]?/,\n        starts: {\n          end: /[^\\\\](?=\\s*$)/,\n          subLanguage: 'bash'\n        }\n      }\n    ]\n  };\n}\n\nmodule.exports = shell;\n","/*\n Language: SQL\n Website: https://en.wikipedia.org/wiki/SQL\n Category: common, database\n */\n\n/*\n\nGoals:\n\nSQL is intended to highlight basic/common SQL keywords and expressions\n\n- If pretty much every single SQL server includes supports, then it's a canidate.\n- It is NOT intended to include tons of vendor specific keywords (Oracle, MySQL,\n  PostgreSQL) although the list of data types is purposely a bit more expansive.\n- For more specific SQL grammars please see:\n  - PostgreSQL and PL/pgSQL - core\n  - T-SQL - https://github.com/highlightjs/highlightjs-tsql\n  - sql_more (core)\n\n */\n\nfunction sql(hljs) {\n  const regex = hljs.regex;\n  const COMMENT_MODE = hljs.COMMENT('--', '$');\n  const STRING = {\n    scope: 'string',\n    variants: [\n      {\n        begin: /'/,\n        end: /'/,\n        contains: [ { match: /''/ } ]\n      }\n    ]\n  };\n  const QUOTED_IDENTIFIER = {\n    begin: /\"/,\n    end: /\"/,\n    contains: [ { match: /\"\"/ } ]\n  };\n\n  const LITERALS = [\n    \"true\",\n    \"false\",\n    // Not sure it's correct to call NULL literal, and clauses like IS [NOT] NULL look strange that way.\n    // \"null\",\n    \"unknown\"\n  ];\n\n  const MULTI_WORD_TYPES = [\n    \"double precision\",\n    \"large object\",\n    \"with timezone\",\n    \"without timezone\"\n  ];\n\n  const TYPES = [\n    'bigint',\n    'binary',\n    'blob',\n    'boolean',\n    'char',\n    'character',\n    'clob',\n    'date',\n    'dec',\n    'decfloat',\n    'decimal',\n    'float',\n    'int',\n    'integer',\n    'interval',\n    'nchar',\n    'nclob',\n    'national',\n    'numeric',\n    'real',\n    'row',\n    'smallint',\n    'time',\n    'timestamp',\n    'varchar',\n    'varying', // modifier (character varying)\n    'varbinary'\n  ];\n\n  const NON_RESERVED_WORDS = [\n    \"add\",\n    \"asc\",\n    \"collation\",\n    \"desc\",\n    \"final\",\n    \"first\",\n    \"last\",\n    \"view\"\n  ];\n\n  // https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#reserved-word\n  const RESERVED_WORDS = [\n    \"abs\",\n    \"acos\",\n    \"all\",\n    \"allocate\",\n    \"alter\",\n    \"and\",\n    \"any\",\n    \"are\",\n    \"array\",\n    \"array_agg\",\n    \"array_max_cardinality\",\n    \"as\",\n    \"asensitive\",\n    \"asin\",\n    \"asymmetric\",\n    \"at\",\n    \"atan\",\n    \"atomic\",\n    \"authorization\",\n    \"avg\",\n    \"begin\",\n    \"begin_frame\",\n    \"begin_partition\",\n    \"between\",\n    \"bigint\",\n    \"binary\",\n    \"blob\",\n    \"boolean\",\n    \"both\",\n    \"by\",\n    \"call\",\n    \"called\",\n    \"cardinality\",\n    \"cascaded\",\n    \"case\",\n    \"cast\",\n    \"ceil\",\n    \"ceiling\",\n    \"char\",\n    \"char_length\",\n    \"character\",\n    \"character_length\",\n    \"check\",\n    \"classifier\",\n    \"clob\",\n    \"close\",\n    \"coalesce\",\n    \"collate\",\n    \"collect\",\n    \"column\",\n    \"commit\",\n    \"condition\",\n    \"connect\",\n    \"constraint\",\n    \"contains\",\n    \"convert\",\n    \"copy\",\n    \"corr\",\n    \"corresponding\",\n    \"cos\",\n    \"cosh\",\n    \"count\",\n    \"covar_pop\",\n    \"covar_samp\",\n    \"create\",\n    \"cross\",\n    \"cube\",\n    \"cume_dist\",\n    \"current\",\n    \"current_catalog\",\n    \"current_date\",\n    \"current_default_transform_group\",\n    \"current_path\",\n    \"current_role\",\n    \"current_row\",\n    \"current_schema\",\n    \"current_time\",\n    \"current_timestamp\",\n    \"current_path\",\n    \"current_role\",\n    \"current_transform_group_for_type\",\n    \"current_user\",\n    \"cursor\",\n    \"cycle\",\n    \"date\",\n    \"day\",\n    \"deallocate\",\n    \"dec\",\n    \"decimal\",\n    \"decfloat\",\n    \"declare\",\n    \"default\",\n    \"define\",\n    \"delete\",\n    \"dense_rank\",\n    \"deref\",\n    \"describe\",\n    \"deterministic\",\n    \"disconnect\",\n    \"distinct\",\n    \"double\",\n    \"drop\",\n    \"dynamic\",\n    \"each\",\n    \"element\",\n    \"else\",\n    \"empty\",\n    \"end\",\n    \"end_frame\",\n    \"end_partition\",\n    \"end-exec\",\n    \"equals\",\n    \"escape\",\n    \"every\",\n    \"except\",\n    \"exec\",\n    \"execute\",\n    \"exists\",\n    \"exp\",\n    \"external\",\n    \"extract\",\n    \"false\",\n    \"fetch\",\n    \"filter\",\n    \"first_value\",\n    \"float\",\n    \"floor\",\n    \"for\",\n    \"foreign\",\n    \"frame_row\",\n    \"free\",\n    \"from\",\n    \"full\",\n    \"function\",\n    \"fusion\",\n    \"get\",\n    \"global\",\n    \"grant\",\n    \"group\",\n    \"grouping\",\n    \"groups\",\n    \"having\",\n    \"hold\",\n    \"hour\",\n    \"identity\",\n    \"in\",\n    \"indicator\",\n    \"initial\",\n    \"inner\",\n    \"inout\",\n    \"insensitive\",\n    \"insert\",\n    \"int\",\n    \"integer\",\n    \"intersect\",\n    \"intersection\",\n    \"interval\",\n    \"into\",\n    \"is\",\n    \"join\",\n    \"json_array\",\n    \"json_arrayagg\",\n    \"json_exists\",\n    \"json_object\",\n    \"json_objectagg\",\n    \"json_query\",\n    \"json_table\",\n    \"json_table_primitive\",\n    \"json_value\",\n    \"lag\",\n    \"language\",\n    \"large\",\n    \"last_value\",\n    \"lateral\",\n    \"lead\",\n    \"leading\",\n    \"left\",\n    \"like\",\n    \"like_regex\",\n    \"listagg\",\n    \"ln\",\n    \"local\",\n    \"localtime\",\n    \"localtimestamp\",\n    \"log\",\n    \"log10\",\n    \"lower\",\n    \"match\",\n    \"match_number\",\n    \"match_recognize\",\n    \"matches\",\n    \"max\",\n    \"member\",\n    \"merge\",\n    \"method\",\n    \"min\",\n    \"minute\",\n    \"mod\",\n    \"modifies\",\n    \"module\",\n    \"month\",\n    \"multiset\",\n    \"national\",\n    \"natural\",\n    \"nchar\",\n    \"nclob\",\n    \"new\",\n    \"no\",\n    \"none\",\n    \"normalize\",\n    \"not\",\n    \"nth_value\",\n    \"ntile\",\n    \"null\",\n    \"nullif\",\n    \"numeric\",\n    \"octet_length\",\n    \"occurrences_regex\",\n    \"of\",\n    \"offset\",\n    \"old\",\n    \"omit\",\n    \"on\",\n    \"one\",\n    \"only\",\n    \"open\",\n    \"or\",\n    \"order\",\n    \"out\",\n    \"outer\",\n    \"over\",\n    \"overlaps\",\n    \"overlay\",\n    \"parameter\",\n    \"partition\",\n    \"pattern\",\n    \"per\",\n    \"percent\",\n    \"percent_rank\",\n    \"percentile_cont\",\n    \"percentile_disc\",\n    \"period\",\n    \"portion\",\n    \"position\",\n    \"position_regex\",\n    \"power\",\n    \"precedes\",\n    \"precision\",\n    \"prepare\",\n    \"primary\",\n    \"procedure\",\n    \"ptf\",\n    \"range\",\n    \"rank\",\n    \"reads\",\n    \"real\",\n    \"recursive\",\n    \"ref\",\n    \"references\",\n    \"referencing\",\n    \"regr_avgx\",\n    \"regr_avgy\",\n    \"regr_count\",\n    \"regr_intercept\",\n    \"regr_r2\",\n    \"regr_slope\",\n    \"regr_sxx\",\n    \"regr_sxy\",\n    \"regr_syy\",\n    \"release\",\n    \"result\",\n    \"return\",\n    \"returns\",\n    \"revoke\",\n    \"right\",\n    \"rollback\",\n    \"rollup\",\n    \"row\",\n    \"row_number\",\n    \"rows\",\n    \"running\",\n    \"savepoint\",\n    \"scope\",\n    \"scroll\",\n    \"search\",\n    \"second\",\n    \"seek\",\n    \"select\",\n    \"sensitive\",\n    \"session_user\",\n    \"set\",\n    \"show\",\n    \"similar\",\n    \"sin\",\n    \"sinh\",\n    \"skip\",\n    \"smallint\",\n    \"some\",\n    \"specific\",\n    \"specifictype\",\n    \"sql\",\n    \"sqlexception\",\n    \"sqlstate\",\n    \"sqlwarning\",\n    \"sqrt\",\n    \"start\",\n    \"static\",\n    \"stddev_pop\",\n    \"stddev_samp\",\n    \"submultiset\",\n    \"subset\",\n    \"substring\",\n    \"substring_regex\",\n    \"succeeds\",\n    \"sum\",\n    \"symmetric\",\n    \"system\",\n    \"system_time\",\n    \"system_user\",\n    \"table\",\n    \"tablesample\",\n    \"tan\",\n    \"tanh\",\n    \"then\",\n    \"time\",\n    \"timestamp\",\n    \"timezone_hour\",\n    \"timezone_minute\",\n    \"to\",\n    \"trailing\",\n    \"translate\",\n    \"translate_regex\",\n    \"translation\",\n    \"treat\",\n    \"trigger\",\n    \"trim\",\n    \"trim_array\",\n    \"true\",\n    \"truncate\",\n    \"uescape\",\n    \"union\",\n    \"unique\",\n    \"unknown\",\n    \"unnest\",\n    \"update\",\n    \"upper\",\n    \"user\",\n    \"using\",\n    \"value\",\n    \"values\",\n    \"value_of\",\n    \"var_pop\",\n    \"var_samp\",\n    \"varbinary\",\n    \"varchar\",\n    \"varying\",\n    \"versioning\",\n    \"when\",\n    \"whenever\",\n    \"where\",\n    \"width_bucket\",\n    \"window\",\n    \"with\",\n    \"within\",\n    \"without\",\n    \"year\",\n  ];\n\n  // these are reserved words we have identified to be functions\n  // and should only be highlighted in a dispatch-like context\n  // ie, array_agg(...), etc.\n  const RESERVED_FUNCTIONS = [\n    \"abs\",\n    \"acos\",\n    \"array_agg\",\n    \"asin\",\n    \"atan\",\n    \"avg\",\n    \"cast\",\n    \"ceil\",\n    \"ceiling\",\n    \"coalesce\",\n    \"corr\",\n    \"cos\",\n    \"cosh\",\n    \"count\",\n    \"covar_pop\",\n    \"covar_samp\",\n    \"cume_dist\",\n    \"dense_rank\",\n    \"deref\",\n    \"element\",\n    \"exp\",\n    \"extract\",\n    \"first_value\",\n    \"floor\",\n    \"json_array\",\n    \"json_arrayagg\",\n    \"json_exists\",\n    \"json_object\",\n    \"json_objectagg\",\n    \"json_query\",\n    \"json_table\",\n    \"json_table_primitive\",\n    \"json_value\",\n    \"lag\",\n    \"last_value\",\n    \"lead\",\n    \"listagg\",\n    \"ln\",\n    \"log\",\n    \"log10\",\n    \"lower\",\n    \"max\",\n    \"min\",\n    \"mod\",\n    \"nth_value\",\n    \"ntile\",\n    \"nullif\",\n    \"percent_rank\",\n    \"percentile_cont\",\n    \"percentile_disc\",\n    \"position\",\n    \"position_regex\",\n    \"power\",\n    \"rank\",\n    \"regr_avgx\",\n    \"regr_avgy\",\n    \"regr_count\",\n    \"regr_intercept\",\n    \"regr_r2\",\n    \"regr_slope\",\n    \"regr_sxx\",\n    \"regr_sxy\",\n    \"regr_syy\",\n    \"row_number\",\n    \"sin\",\n    \"sinh\",\n    \"sqrt\",\n    \"stddev_pop\",\n    \"stddev_samp\",\n    \"substring\",\n    \"substring_regex\",\n    \"sum\",\n    \"tan\",\n    \"tanh\",\n    \"translate\",\n    \"translate_regex\",\n    \"treat\",\n    \"trim\",\n    \"trim_array\",\n    \"unnest\",\n    \"upper\",\n    \"value_of\",\n    \"var_pop\",\n    \"var_samp\",\n    \"width_bucket\",\n  ];\n\n  // these functions can\n  const POSSIBLE_WITHOUT_PARENS = [\n    \"current_catalog\",\n    \"current_date\",\n    \"current_default_transform_group\",\n    \"current_path\",\n    \"current_role\",\n    \"current_schema\",\n    \"current_transform_group_for_type\",\n    \"current_user\",\n    \"session_user\",\n    \"system_time\",\n    \"system_user\",\n    \"current_time\",\n    \"localtime\",\n    \"current_timestamp\",\n    \"localtimestamp\"\n  ];\n\n  // those exist to boost relevance making these very\n  // \"SQL like\" keyword combos worth +1 extra relevance\n  const COMBOS = [\n    \"create table\",\n    \"insert into\",\n    \"primary key\",\n    \"foreign key\",\n    \"not null\",\n    \"alter table\",\n    \"add constraint\",\n    \"grouping sets\",\n    \"on overflow\",\n    \"character set\",\n    \"respect nulls\",\n    \"ignore nulls\",\n    \"nulls first\",\n    \"nulls last\",\n    \"depth first\",\n    \"breadth first\"\n  ];\n\n  const FUNCTIONS = RESERVED_FUNCTIONS;\n\n  const KEYWORDS = [\n    ...RESERVED_WORDS,\n    ...NON_RESERVED_WORDS\n  ].filter((keyword) => {\n    return !RESERVED_FUNCTIONS.includes(keyword);\n  });\n\n  const VARIABLE = {\n    scope: \"variable\",\n    match: /@[a-z0-9][a-z0-9_]*/,\n  };\n\n  const OPERATOR = {\n    scope: \"operator\",\n    match: /[-+*/=%^~]|&&?|\\|\\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,\n    relevance: 0,\n  };\n\n  const FUNCTION_CALL = {\n    match: regex.concat(/\\b/, regex.either(...FUNCTIONS), /\\s*\\(/),\n    relevance: 0,\n    keywords: { built_in: FUNCTIONS }\n  };\n\n  // turns a multi-word keyword combo into a regex that doesn't\n  // care about extra whitespace etc.\n  // input: \"START QUERY\"\n  // output: /\\bSTART\\s+QUERY\\b/\n  function kws_to_regex(list) {\n    return regex.concat(\n      /\\b/,\n      regex.either(...list.map((kw) => {\n        return kw.replace(/\\s+/, \"\\\\s+\")\n      })),\n      /\\b/\n    )\n  }\n\n  const MULTI_WORD_KEYWORDS = {\n    scope: \"keyword\",\n    match: kws_to_regex(COMBOS),\n    relevance: 0,\n  };\n\n  // keywords with less than 3 letters are reduced in relevancy\n  function reduceRelevancy(list, {\n    exceptions, when\n  } = {}) {\n    const qualifyFn = when;\n    exceptions = exceptions || [];\n    return list.map((item) => {\n      if (item.match(/\\|\\d+$/) || exceptions.includes(item)) {\n        return item;\n      } else if (qualifyFn(item)) {\n        return `${item}|0`;\n      } else {\n        return item;\n      }\n    });\n  }\n\n  return {\n    name: 'SQL',\n    case_insensitive: true,\n    // does not include {} or HTML tags `</`\n    illegal: /[{}]|<\\//,\n    keywords: {\n      $pattern: /\\b[\\w\\.]+/,\n      keyword:\n        reduceRelevancy(KEYWORDS, { when: (x) => x.length < 3 }),\n      literal: LITERALS,\n      type: TYPES,\n      built_in: POSSIBLE_WITHOUT_PARENS\n    },\n    contains: [\n      {\n        scope: \"type\",\n        match: kws_to_regex(MULTI_WORD_TYPES)\n      },\n      MULTI_WORD_KEYWORDS,\n      FUNCTION_CALL,\n      VARIABLE,\n      STRING,\n      QUOTED_IDENTIFIER,\n      hljs.C_NUMBER_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      COMMENT_MODE,\n      OPERATOR\n    ]\n  };\n}\n\nmodule.exports = sql;\n","/**\n * @param {string} value\n * @returns {RegExp}\n * */\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction source(re) {\n  if (!re) return null;\n  if (typeof re === \"string\") return re;\n\n  return re.source;\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction lookahead(re) {\n  return concat('(?=', re, ')');\n}\n\n/**\n * @param {...(RegExp | string) } args\n * @returns {string}\n */\nfunction concat(...args) {\n  const joined = args.map((x) => source(x)).join(\"\");\n  return joined;\n}\n\n/**\n * @param { Array<string | RegExp | Object> } args\n * @returns {object}\n */\nfunction stripOptionsFromArgs(args) {\n  const opts = args[args.length - 1];\n\n  if (typeof opts === 'object' && opts.constructor === Object) {\n    args.splice(args.length - 1, 1);\n    return opts;\n  } else {\n    return {};\n  }\n}\n\n/** @typedef { {capture?: boolean} } RegexEitherOptions */\n\n/**\n * Any of the passed expresssions may match\n *\n * Creates a huge this | this | that | that match\n * @param {(RegExp | string)[] | [...(RegExp | string)[], RegexEitherOptions]} args\n * @returns {string}\n */\nfunction either(...args) {\n  /** @type { object & {capture?: boolean} }  */\n  const opts = stripOptionsFromArgs(args);\n  const joined = '('\n    + (opts.capture ? \"\" : \"?:\")\n    + args.map((x) => source(x)).join(\"|\") + \")\";\n  return joined;\n}\n\nconst keywordWrapper = keyword => concat(\n  /\\b/,\n  keyword,\n  /\\w$/.test(keyword) ? /\\b/ : /\\B/\n);\n\n// Keywords that require a leading dot.\nconst dotKeywords = [\n  'Protocol', // contextual\n  'Type' // contextual\n].map(keywordWrapper);\n\n// Keywords that may have a leading dot.\nconst optionalDotKeywords = [\n  'init',\n  'self'\n].map(keywordWrapper);\n\n// should register as keyword, not type\nconst keywordTypes = [\n  'Any',\n  'Self'\n];\n\n// Regular keywords and literals.\nconst keywords = [\n  // strings below will be fed into the regular `keywords` engine while regex\n  // will result in additional modes being created to scan for those keywords to\n  // avoid conflicts with other rules\n  'actor',\n  'any', // contextual\n  'associatedtype',\n  'async',\n  'await',\n  /as\\?/, // operator\n  /as!/, // operator\n  'as', // operator\n  'borrowing', // contextual\n  'break',\n  'case',\n  'catch',\n  'class',\n  'consume', // contextual\n  'consuming', // contextual\n  'continue',\n  'convenience', // contextual\n  'copy', // contextual\n  'default',\n  'defer',\n  'deinit',\n  'didSet', // contextual\n  'distributed',\n  'do',\n  'dynamic', // contextual\n  'each',\n  'else',\n  'enum',\n  'extension',\n  'fallthrough',\n  /fileprivate\\(set\\)/,\n  'fileprivate',\n  'final', // contextual\n  'for',\n  'func',\n  'get', // contextual\n  'guard',\n  'if',\n  'import',\n  'indirect', // contextual\n  'infix', // contextual\n  /init\\?/,\n  /init!/,\n  'inout',\n  /internal\\(set\\)/,\n  'internal',\n  'in',\n  'is', // operator\n  'isolated', // contextual\n  'nonisolated', // contextual\n  'lazy', // contextual\n  'let',\n  'macro',\n  'mutating', // contextual\n  'nonmutating', // contextual\n  /open\\(set\\)/, // contextual\n  'open', // contextual\n  'operator',\n  'optional', // contextual\n  'override', // contextual\n  'package',\n  'postfix', // contextual\n  'precedencegroup',\n  'prefix', // contextual\n  /private\\(set\\)/,\n  'private',\n  'protocol',\n  /public\\(set\\)/,\n  'public',\n  'repeat',\n  'required', // contextual\n  'rethrows',\n  'return',\n  'set', // contextual\n  'some', // contextual\n  'static',\n  'struct',\n  'subscript',\n  'super',\n  'switch',\n  'throws',\n  'throw',\n  /try\\?/, // operator\n  /try!/, // operator\n  'try', // operator\n  'typealias',\n  /unowned\\(safe\\)/, // contextual\n  /unowned\\(unsafe\\)/, // contextual\n  'unowned', // contextual\n  'var',\n  'weak', // contextual\n  'where',\n  'while',\n  'willSet' // contextual\n];\n\n// NOTE: Contextual keywords are reserved only in specific contexts.\n// Ideally, these should be matched using modes to avoid false positives.\n\n// Literals.\nconst literals = [\n  'false',\n  'nil',\n  'true'\n];\n\n// Keywords used in precedence groups.\nconst precedencegroupKeywords = [\n  'assignment',\n  'associativity',\n  'higherThan',\n  'left',\n  'lowerThan',\n  'none',\n  'right'\n];\n\n// Keywords that start with a number sign (#).\n// #(un)available is handled separately.\nconst numberSignKeywords = [\n  '#colorLiteral',\n  '#column',\n  '#dsohandle',\n  '#else',\n  '#elseif',\n  '#endif',\n  '#error',\n  '#file',\n  '#fileID',\n  '#fileLiteral',\n  '#filePath',\n  '#function',\n  '#if',\n  '#imageLiteral',\n  '#keyPath',\n  '#line',\n  '#selector',\n  '#sourceLocation',\n  '#warning'\n];\n\n// Global functions in the Standard Library.\nconst builtIns = [\n  'abs',\n  'all',\n  'any',\n  'assert',\n  'assertionFailure',\n  'debugPrint',\n  'dump',\n  'fatalError',\n  'getVaList',\n  'isKnownUniquelyReferenced',\n  'max',\n  'min',\n  'numericCast',\n  'pointwiseMax',\n  'pointwiseMin',\n  'precondition',\n  'preconditionFailure',\n  'print',\n  'readLine',\n  'repeatElement',\n  'sequence',\n  'stride',\n  'swap',\n  'swift_unboxFromSwiftValueWithType',\n  'transcode',\n  'type',\n  'unsafeBitCast',\n  'unsafeDowncast',\n  'withExtendedLifetime',\n  'withUnsafeMutablePointer',\n  'withUnsafePointer',\n  'withVaList',\n  'withoutActuallyEscaping',\n  'zip'\n];\n\n// Valid first characters for operators.\nconst operatorHead = either(\n  /[/=\\-+!*%<>&|^~?]/,\n  /[\\u00A1-\\u00A7]/,\n  /[\\u00A9\\u00AB]/,\n  /[\\u00AC\\u00AE]/,\n  /[\\u00B0\\u00B1]/,\n  /[\\u00B6\\u00BB\\u00BF\\u00D7\\u00F7]/,\n  /[\\u2016-\\u2017]/,\n  /[\\u2020-\\u2027]/,\n  /[\\u2030-\\u203E]/,\n  /[\\u2041-\\u2053]/,\n  /[\\u2055-\\u205E]/,\n  /[\\u2190-\\u23FF]/,\n  /[\\u2500-\\u2775]/,\n  /[\\u2794-\\u2BFF]/,\n  /[\\u2E00-\\u2E7F]/,\n  /[\\u3001-\\u3003]/,\n  /[\\u3008-\\u3020]/,\n  /[\\u3030]/\n);\n\n// Valid characters for operators.\nconst operatorCharacter = either(\n  operatorHead,\n  /[\\u0300-\\u036F]/,\n  /[\\u1DC0-\\u1DFF]/,\n  /[\\u20D0-\\u20FF]/,\n  /[\\uFE00-\\uFE0F]/,\n  /[\\uFE20-\\uFE2F]/\n  // TODO: The following characters are also allowed, but the regex isn't supported yet.\n  // /[\\u{E0100}-\\u{E01EF}]/u\n);\n\n// Valid operator.\nconst operator = concat(operatorHead, operatorCharacter, '*');\n\n// Valid first characters for identifiers.\nconst identifierHead = either(\n  /[a-zA-Z_]/,\n  /[\\u00A8\\u00AA\\u00AD\\u00AF\\u00B2-\\u00B5\\u00B7-\\u00BA]/,\n  /[\\u00BC-\\u00BE\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u00FF]/,\n  /[\\u0100-\\u02FF\\u0370-\\u167F\\u1681-\\u180D\\u180F-\\u1DBF]/,\n  /[\\u1E00-\\u1FFF]/,\n  /[\\u200B-\\u200D\\u202A-\\u202E\\u203F-\\u2040\\u2054\\u2060-\\u206F]/,\n  /[\\u2070-\\u20CF\\u2100-\\u218F\\u2460-\\u24FF\\u2776-\\u2793]/,\n  /[\\u2C00-\\u2DFF\\u2E80-\\u2FFF]/,\n  /[\\u3004-\\u3007\\u3021-\\u302F\\u3031-\\u303F\\u3040-\\uD7FF]/,\n  /[\\uF900-\\uFD3D\\uFD40-\\uFDCF\\uFDF0-\\uFE1F\\uFE30-\\uFE44]/,\n  /[\\uFE47-\\uFEFE\\uFF00-\\uFFFD]/ // Should be /[\\uFE47-\\uFFFD]/, but we have to exclude FEFF.\n  // The following characters are also allowed, but the regexes aren't supported yet.\n  // /[\\u{10000}-\\u{1FFFD}\\u{20000-\\u{2FFFD}\\u{30000}-\\u{3FFFD}\\u{40000}-\\u{4FFFD}]/u,\n  // /[\\u{50000}-\\u{5FFFD}\\u{60000-\\u{6FFFD}\\u{70000}-\\u{7FFFD}\\u{80000}-\\u{8FFFD}]/u,\n  // /[\\u{90000}-\\u{9FFFD}\\u{A0000-\\u{AFFFD}\\u{B0000}-\\u{BFFFD}\\u{C0000}-\\u{CFFFD}]/u,\n  // /[\\u{D0000}-\\u{DFFFD}\\u{E0000-\\u{EFFFD}]/u\n);\n\n// Valid characters for identifiers.\nconst identifierCharacter = either(\n  identifierHead,\n  /\\d/,\n  /[\\u0300-\\u036F\\u1DC0-\\u1DFF\\u20D0-\\u20FF\\uFE20-\\uFE2F]/\n);\n\n// Valid identifier.\nconst identifier = concat(identifierHead, identifierCharacter, '*');\n\n// Valid type identifier.\nconst typeIdentifier = concat(/[A-Z]/, identifierCharacter, '*');\n\n// Built-in attributes, which are highlighted as keywords.\n// @available is handled separately.\n// https://docs.swift.org/swift-book/documentation/the-swift-programming-language/attributes\nconst keywordAttributes = [\n  'attached',\n  'autoclosure',\n  concat(/convention\\(/, either('swift', 'block', 'c'), /\\)/),\n  'discardableResult',\n  'dynamicCallable',\n  'dynamicMemberLookup',\n  'escaping',\n  'freestanding',\n  'frozen',\n  'GKInspectable',\n  'IBAction',\n  'IBDesignable',\n  'IBInspectable',\n  'IBOutlet',\n  'IBSegueAction',\n  'inlinable',\n  'main',\n  'nonobjc',\n  'NSApplicationMain',\n  'NSCopying',\n  'NSManaged',\n  concat(/objc\\(/, identifier, /\\)/),\n  'objc',\n  'objcMembers',\n  'propertyWrapper',\n  'requires_stored_property_inits',\n  'resultBuilder',\n  'Sendable',\n  'testable',\n  'UIApplicationMain',\n  'unchecked',\n  'unknown',\n  'usableFromInline',\n  'warn_unqualified_access'\n];\n\n// Contextual keywords used in @available and #(un)available.\nconst availabilityKeywords = [\n  'iOS',\n  'iOSApplicationExtension',\n  'macOS',\n  'macOSApplicationExtension',\n  'macCatalyst',\n  'macCatalystApplicationExtension',\n  'watchOS',\n  'watchOSApplicationExtension',\n  'tvOS',\n  'tvOSApplicationExtension',\n  'swift'\n];\n\n/*\nLanguage: Swift\nDescription: Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.\nAuthor: Steven Van Impe <steven.vanimpe@icloud.com>\nContributors: Chris Eidhof <chris@eidhof.nl>, Nate Cook <natecook@gmail.com>, Alexander Lichter <manniL@gmx.net>, Richard Gibson <gibson042@github>\nWebsite: https://swift.org\nCategory: common, system\n*/\n\n\n/** @type LanguageFn */\nfunction swift(hljs) {\n  const WHITESPACE = {\n    match: /\\s+/,\n    relevance: 0\n  };\n  // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#ID411\n  const BLOCK_COMMENT = hljs.COMMENT(\n    '/\\\\*',\n    '\\\\*/',\n    { contains: [ 'self' ] }\n  );\n  const COMMENTS = [\n    hljs.C_LINE_COMMENT_MODE,\n    BLOCK_COMMENT\n  ];\n\n  // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#ID413\n  // https://docs.swift.org/swift-book/ReferenceManual/zzSummaryOfTheGrammar.html\n  const DOT_KEYWORD = {\n    match: [\n      /\\./,\n      either(...dotKeywords, ...optionalDotKeywords)\n    ],\n    className: { 2: \"keyword\" }\n  };\n  const KEYWORD_GUARD = {\n    // Consume .keyword to prevent highlighting properties and methods as keywords.\n    match: concat(/\\./, either(...keywords)),\n    relevance: 0\n  };\n  const PLAIN_KEYWORDS = keywords\n    .filter(kw => typeof kw === 'string')\n    .concat([ \"_|0\" ]); // seems common, so 0 relevance\n  const REGEX_KEYWORDS = keywords\n    .filter(kw => typeof kw !== 'string') // find regex\n    .concat(keywordTypes)\n    .map(keywordWrapper);\n  const KEYWORD = { variants: [\n    {\n      className: 'keyword',\n      match: either(...REGEX_KEYWORDS, ...optionalDotKeywords)\n    }\n  ] };\n  // find all the regular keywords\n  const KEYWORDS = {\n    $pattern: either(\n      /\\b\\w+/, // regular keywords\n      /#\\w+/ // number keywords\n    ),\n    keyword: PLAIN_KEYWORDS\n      .concat(numberSignKeywords),\n    literal: literals\n  };\n  const KEYWORD_MODES = [\n    DOT_KEYWORD,\n    KEYWORD_GUARD,\n    KEYWORD\n  ];\n\n  // https://github.com/apple/swift/tree/main/stdlib/public/core\n  const BUILT_IN_GUARD = {\n    // Consume .built_in to prevent highlighting properties and methods.\n    match: concat(/\\./, either(...builtIns)),\n    relevance: 0\n  };\n  const BUILT_IN = {\n    className: 'built_in',\n    match: concat(/\\b/, either(...builtIns), /(?=\\()/)\n  };\n  const BUILT_INS = [\n    BUILT_IN_GUARD,\n    BUILT_IN\n  ];\n\n  // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#ID418\n  const OPERATOR_GUARD = {\n    // Prevent -> from being highlighting as an operator.\n    match: /->/,\n    relevance: 0\n  };\n  const OPERATOR = {\n    className: 'operator',\n    relevance: 0,\n    variants: [\n      { match: operator },\n      {\n        // dot-operator: only operators that start with a dot are allowed to use dots as\n        // characters (..., ...<, .*, etc). So there rule here is: a dot followed by one or more\n        // characters that may also include dots.\n        match: `\\\\.(\\\\.|${operatorCharacter})+` }\n    ]\n  };\n  const OPERATORS = [\n    OPERATOR_GUARD,\n    OPERATOR\n  ];\n\n  // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_numeric-literal\n  // TODO: Update for leading `-` after lookbehind is supported everywhere\n  const decimalDigits = '([0-9]_*)+';\n  const hexDigits = '([0-9a-fA-F]_*)+';\n  const NUMBER = {\n    className: 'number',\n    relevance: 0,\n    variants: [\n      // decimal floating-point-literal (subsumes decimal-literal)\n      { match: `\\\\b(${decimalDigits})(\\\\.(${decimalDigits}))?` + `([eE][+-]?(${decimalDigits}))?\\\\b` },\n      // hexadecimal floating-point-literal (subsumes hexadecimal-literal)\n      { match: `\\\\b0x(${hexDigits})(\\\\.(${hexDigits}))?` + `([pP][+-]?(${decimalDigits}))?\\\\b` },\n      // octal-literal\n      { match: /\\b0o([0-7]_*)+\\b/ },\n      // binary-literal\n      { match: /\\b0b([01]_*)+\\b/ }\n    ]\n  };\n\n  // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_string-literal\n  const ESCAPED_CHARACTER = (rawDelimiter = \"\") => ({\n    className: 'subst',\n    variants: [\n      { match: concat(/\\\\/, rawDelimiter, /[0\\\\tnr\"']/) },\n      { match: concat(/\\\\/, rawDelimiter, /u\\{[0-9a-fA-F]{1,8}\\}/) }\n    ]\n  });\n  const ESCAPED_NEWLINE = (rawDelimiter = \"\") => ({\n    className: 'subst',\n    match: concat(/\\\\/, rawDelimiter, /[\\t ]*(?:[\\r\\n]|\\r\\n)/)\n  });\n  const INTERPOLATION = (rawDelimiter = \"\") => ({\n    className: 'subst',\n    label: \"interpol\",\n    begin: concat(/\\\\/, rawDelimiter, /\\(/),\n    end: /\\)/\n  });\n  const MULTILINE_STRING = (rawDelimiter = \"\") => ({\n    begin: concat(rawDelimiter, /\"\"\"/),\n    end: concat(/\"\"\"/, rawDelimiter),\n    contains: [\n      ESCAPED_CHARACTER(rawDelimiter),\n      ESCAPED_NEWLINE(rawDelimiter),\n      INTERPOLATION(rawDelimiter)\n    ]\n  });\n  const SINGLE_LINE_STRING = (rawDelimiter = \"\") => ({\n    begin: concat(rawDelimiter, /\"/),\n    end: concat(/\"/, rawDelimiter),\n    contains: [\n      ESCAPED_CHARACTER(rawDelimiter),\n      INTERPOLATION(rawDelimiter)\n    ]\n  });\n  const STRING = {\n    className: 'string',\n    variants: [\n      MULTILINE_STRING(),\n      MULTILINE_STRING(\"#\"),\n      MULTILINE_STRING(\"##\"),\n      MULTILINE_STRING(\"###\"),\n      SINGLE_LINE_STRING(),\n      SINGLE_LINE_STRING(\"#\"),\n      SINGLE_LINE_STRING(\"##\"),\n      SINGLE_LINE_STRING(\"###\")\n    ]\n  };\n\n  const REGEXP_CONTENTS = [\n    hljs.BACKSLASH_ESCAPE,\n    {\n      begin: /\\[/,\n      end: /\\]/,\n      relevance: 0,\n      contains: [ hljs.BACKSLASH_ESCAPE ]\n    }\n  ];\n\n  const BARE_REGEXP_LITERAL = {\n    begin: /\\/[^\\s](?=[^/\\n]*\\/)/,\n    end: /\\//,\n    contains: REGEXP_CONTENTS\n  };\n\n  const EXTENDED_REGEXP_LITERAL = (rawDelimiter) => {\n    const begin = concat(rawDelimiter, /\\//);\n    const end = concat(/\\//, rawDelimiter);\n    return {\n      begin,\n      end,\n      contains: [\n        ...REGEXP_CONTENTS,\n        {\n          scope: \"comment\",\n          begin: `#(?!.*${end})`,\n          end: /$/,\n        },\n      ],\n    };\n  };\n\n  // https://docs.swift.org/swift-book/documentation/the-swift-programming-language/lexicalstructure/#Regular-Expression-Literals\n  const REGEXP = {\n    scope: \"regexp\",\n    variants: [\n      EXTENDED_REGEXP_LITERAL('###'),\n      EXTENDED_REGEXP_LITERAL('##'),\n      EXTENDED_REGEXP_LITERAL('#'),\n      BARE_REGEXP_LITERAL\n    ]\n  };\n\n  // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#ID412\n  const QUOTED_IDENTIFIER = { match: concat(/`/, identifier, /`/) };\n  const IMPLICIT_PARAMETER = {\n    className: 'variable',\n    match: /\\$\\d+/\n  };\n  const PROPERTY_WRAPPER_PROJECTION = {\n    className: 'variable',\n    match: `\\\\$${identifierCharacter}+`\n  };\n  const IDENTIFIERS = [\n    QUOTED_IDENTIFIER,\n    IMPLICIT_PARAMETER,\n    PROPERTY_WRAPPER_PROJECTION\n  ];\n\n  // https://docs.swift.org/swift-book/ReferenceManual/Attributes.html\n  const AVAILABLE_ATTRIBUTE = {\n    match: /(@|#(un)?)available/,\n    scope: 'keyword',\n    starts: { contains: [\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        keywords: availabilityKeywords,\n        contains: [\n          ...OPERATORS,\n          NUMBER,\n          STRING\n        ]\n      }\n    ] }\n  };\n\n  const KEYWORD_ATTRIBUTE = {\n    scope: 'keyword',\n    match: concat(/@/, either(...keywordAttributes), lookahead(either(/\\(/, /\\s+/))),\n  };\n\n  const USER_DEFINED_ATTRIBUTE = {\n    scope: 'meta',\n    match: concat(/@/, identifier)\n  };\n\n  const ATTRIBUTES = [\n    AVAILABLE_ATTRIBUTE,\n    KEYWORD_ATTRIBUTE,\n    USER_DEFINED_ATTRIBUTE\n  ];\n\n  // https://docs.swift.org/swift-book/ReferenceManual/Types.html\n  const TYPE = {\n    match: lookahead(/\\b[A-Z]/),\n    relevance: 0,\n    contains: [\n      { // Common Apple frameworks, for relevance boost\n        className: 'type',\n        match: concat(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/, identifierCharacter, '+')\n      },\n      { // Type identifier\n        className: 'type',\n        match: typeIdentifier,\n        relevance: 0\n      },\n      { // Optional type\n        match: /[?!]+/,\n        relevance: 0\n      },\n      { // Variadic parameter\n        match: /\\.\\.\\./,\n        relevance: 0\n      },\n      { // Protocol composition\n        match: concat(/\\s+&\\s+/, lookahead(typeIdentifier)),\n        relevance: 0\n      }\n    ]\n  };\n  const GENERIC_ARGUMENTS = {\n    begin: /</,\n    end: />/,\n    keywords: KEYWORDS,\n    contains: [\n      ...COMMENTS,\n      ...KEYWORD_MODES,\n      ...ATTRIBUTES,\n      OPERATOR_GUARD,\n      TYPE\n    ]\n  };\n  TYPE.contains.push(GENERIC_ARGUMENTS);\n\n  // https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#ID552\n  // Prevents element names from being highlighted as keywords.\n  const TUPLE_ELEMENT_NAME = {\n    match: concat(identifier, /\\s*:/),\n    keywords: \"_|0\",\n    relevance: 0\n  };\n  // Matches tuples as well as the parameter list of a function type.\n  const TUPLE = {\n    begin: /\\(/,\n    end: /\\)/,\n    relevance: 0,\n    keywords: KEYWORDS,\n    contains: [\n      'self',\n      TUPLE_ELEMENT_NAME,\n      ...COMMENTS,\n      REGEXP,\n      ...KEYWORD_MODES,\n      ...BUILT_INS,\n      ...OPERATORS,\n      NUMBER,\n      STRING,\n      ...IDENTIFIERS,\n      ...ATTRIBUTES,\n      TYPE\n    ]\n  };\n\n  const GENERIC_PARAMETERS = {\n    begin: /</,\n    end: />/,\n    keywords: 'repeat each',\n    contains: [\n      ...COMMENTS,\n      TYPE\n    ]\n  };\n  const FUNCTION_PARAMETER_NAME = {\n    begin: either(\n      lookahead(concat(identifier, /\\s*:/)),\n      lookahead(concat(identifier, /\\s+/, identifier, /\\s*:/))\n    ),\n    end: /:/,\n    relevance: 0,\n    contains: [\n      {\n        className: 'keyword',\n        match: /\\b_\\b/\n      },\n      {\n        className: 'params',\n        match: identifier\n      }\n    ]\n  };\n  const FUNCTION_PARAMETERS = {\n    begin: /\\(/,\n    end: /\\)/,\n    keywords: KEYWORDS,\n    contains: [\n      FUNCTION_PARAMETER_NAME,\n      ...COMMENTS,\n      ...KEYWORD_MODES,\n      ...OPERATORS,\n      NUMBER,\n      STRING,\n      ...ATTRIBUTES,\n      TYPE,\n      TUPLE\n    ],\n    endsParent: true,\n    illegal: /[\"']/\n  };\n  // https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID362\n  // https://docs.swift.org/swift-book/documentation/the-swift-programming-language/declarations/#Macro-Declaration\n  const FUNCTION_OR_MACRO = {\n    match: [\n      /(func|macro)/,\n      /\\s+/,\n      either(QUOTED_IDENTIFIER.match, identifier, operator)\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    contains: [\n      GENERIC_PARAMETERS,\n      FUNCTION_PARAMETERS,\n      WHITESPACE\n    ],\n    illegal: [\n      /\\[/,\n      /%/\n    ]\n  };\n\n  // https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID375\n  // https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID379\n  const INIT_SUBSCRIPT = {\n    match: [\n      /\\b(?:subscript|init[?!]?)/,\n      /\\s*(?=[<(])/,\n    ],\n    className: { 1: \"keyword\" },\n    contains: [\n      GENERIC_PARAMETERS,\n      FUNCTION_PARAMETERS,\n      WHITESPACE\n    ],\n    illegal: /\\[|%/\n  };\n  // https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID380\n  const OPERATOR_DECLARATION = {\n    match: [\n      /operator/,\n      /\\s+/,\n      operator\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title\"\n    }\n  };\n\n  // https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID550\n  const PRECEDENCEGROUP = {\n    begin: [\n      /precedencegroup/,\n      /\\s+/,\n      typeIdentifier\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title\"\n    },\n    contains: [ TYPE ],\n    keywords: [\n      ...precedencegroupKeywords,\n      ...literals\n    ],\n    end: /}/\n  };\n\n  const CLASS_FUNC_DECLARATION = {\n    match: [\n      /class\\b/,          \n      /\\s+/,\n      /func\\b/,\n      /\\s+/,\n      /\\b[A-Za-z_][A-Za-z0-9_]*\\b/ \n    ],\n    scope: {\n      1: \"keyword\",\n      3: \"keyword\",\n      5: \"title.function\"\n    }\n  };\n\n  const CLASS_VAR_DECLARATION = {\n    match: [\n      /class\\b/,\n      /\\s+/,          \n      /var\\b/, \n    ],\n    scope: {\n      1: \"keyword\",\n      3: \"keyword\"\n    }\n  };\n\n  const TYPE_DECLARATION = {\n    begin: [\n      /(struct|protocol|class|extension|enum|actor)/,\n      /\\s+/,\n      identifier,\n      /\\s*/,\n    ],\n    beginScope: {\n      1: \"keyword\",\n      3: \"title.class\"\n    },\n    keywords: KEYWORDS,\n    contains: [\n      GENERIC_PARAMETERS,\n      ...KEYWORD_MODES,\n      {\n        begin: /:/,\n        end: /\\{/,\n        keywords: KEYWORDS,\n        contains: [\n          {\n            scope: \"title.class.inherited\",\n            match: typeIdentifier,\n          },\n          ...KEYWORD_MODES,\n        ],\n        relevance: 0,\n      },\n    ]\n  };\n\n  // Add supported submodes to string interpolation.\n  for (const variant of STRING.variants) {\n    const interpolation = variant.contains.find(mode => mode.label === \"interpol\");\n    // TODO: Interpolation can contain any expression, so there's room for improvement here.\n    interpolation.keywords = KEYWORDS;\n    const submodes = [\n      ...KEYWORD_MODES,\n      ...BUILT_INS,\n      ...OPERATORS,\n      NUMBER,\n      STRING,\n      ...IDENTIFIERS\n    ];\n    interpolation.contains = [\n      ...submodes,\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        contains: [\n          'self',\n          ...submodes\n        ]\n      }\n    ];\n  }\n\n  return {\n    name: 'Swift',\n    keywords: KEYWORDS,\n    contains: [\n      ...COMMENTS,\n      FUNCTION_OR_MACRO,\n      INIT_SUBSCRIPT,\n      CLASS_FUNC_DECLARATION,\n      CLASS_VAR_DECLARATION,\n      TYPE_DECLARATION,\n      OPERATOR_DECLARATION,\n      PRECEDENCEGROUP,\n      {\n        beginKeywords: 'import',\n        end: /$/,\n        contains: [ ...COMMENTS ],\n        relevance: 0\n      },\n      REGEXP,\n      ...KEYWORD_MODES,\n      ...BUILT_INS,\n      ...OPERATORS,\n      NUMBER,\n      STRING,\n      ...IDENTIFIERS,\n      ...ATTRIBUTES,\n      TYPE,\n      TUPLE\n    ]\n  };\n}\n\nmodule.exports = swift;\n","/*\nLanguage: YAML\nDescription: Yet Another Markdown Language\nAuthor: Stefan Wienert <stwienert@gmail.com>\nContributors: Carl Baxter <carl@cbax.tech>\nRequires: ruby.js\nWebsite: https://yaml.org\nCategory: common, config\n*/\nfunction yaml(hljs) {\n  const LITERALS = 'true false yes no null';\n\n  // YAML spec allows non-reserved URI characters in tags.\n  const URI_CHARACTERS = '[\\\\w#;/?:@&=+$,.~*\\'()[\\\\]]+';\n\n  // Define keys as starting with a word character\n  // ...containing word chars, spaces, colons, forward-slashes, hyphens and periods\n  // ...and ending with a colon followed immediately by a space, tab or newline.\n  // The YAML spec allows for much more than this, but this covers most use-cases.\n  const KEY = {\n    className: 'attr',\n    variants: [\n      // added brackets support and special char support\n      { begin: /[\\w*@][\\w*@ :()\\./-]*:(?=[ \\t]|$)/ },\n      { // double quoted keys - with brackets and special char support\n        begin: /\"[\\w*@][\\w*@ :()\\./-]*\":(?=[ \\t]|$)/ },\n      { // single quoted keys - with brackets and special char support\n        begin: /'[\\w*@][\\w*@ :()\\./-]*':(?=[ \\t]|$)/ },\n    ]\n  };\n  \n  const TEMPLATE_VARIABLES = {\n    className: 'template-variable',\n    variants: [\n      { // jinja templates Ansible\n        begin: /\\{\\{/,\n        end: /\\}\\}/\n      },\n      { // Ruby i18n\n        begin: /%\\{/,\n        end: /\\}/\n      }\n    ]\n  };\n\n  const SINGLE_QUOTE_STRING = {\n    className: 'string',\n    relevance: 0,\n    begin: /'/,\n    end: /'/,\n    contains: [\n      {\n        match: /''/,\n        scope: 'char.escape',\n        relevance: 0\n      }\n    ]\n  };\n\n  const STRING = {\n    className: 'string',\n    relevance: 0,\n    variants: [\n      {\n        begin: /\"/,\n        end: /\"/\n      },\n      { begin: /\\S+/ }\n    ],\n    contains: [\n      hljs.BACKSLASH_ESCAPE,\n      TEMPLATE_VARIABLES\n    ]\n  };\n\n  // Strings inside of value containers (objects) can't contain braces,\n  // brackets, or commas\n  const CONTAINER_STRING = hljs.inherit(STRING, { variants: [\n    {\n      begin: /'/,\n      end: /'/,\n      contains: [\n        {\n          begin: /''/,\n          relevance: 0\n        }\n      ]\n    },\n    {\n      begin: /\"/,\n      end: /\"/\n    },\n    { begin: /[^\\s,{}[\\]]+/ }\n  ] });\n\n  const DATE_RE = '[0-9]{4}(-[0-9][0-9]){0,2}';\n  const TIME_RE = '([Tt \\\\t][0-9][0-9]?(:[0-9][0-9]){2})?';\n  const FRACTION_RE = '(\\\\.[0-9]*)?';\n  const ZONE_RE = '([ \\\\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?';\n  const TIMESTAMP = {\n    className: 'number',\n    begin: '\\\\b' + DATE_RE + TIME_RE + FRACTION_RE + ZONE_RE + '\\\\b'\n  };\n\n  const VALUE_CONTAINER = {\n    end: ',',\n    endsWithParent: true,\n    excludeEnd: true,\n    keywords: LITERALS,\n    relevance: 0\n  };\n  const OBJECT = {\n    begin: /\\{/,\n    end: /\\}/,\n    contains: [ VALUE_CONTAINER ],\n    illegal: '\\\\n',\n    relevance: 0\n  };\n  const ARRAY = {\n    begin: '\\\\[',\n    end: '\\\\]',\n    contains: [ VALUE_CONTAINER ],\n    illegal: '\\\\n',\n    relevance: 0\n  };\n\n  const MODES = [\n    KEY,\n    {\n      className: 'meta',\n      begin: '^---\\\\s*$',\n      relevance: 10\n    },\n    { // multi line string\n      // Blocks start with a | or > followed by a newline\n      //\n      // Indentation of subsequent lines must be the same to\n      // be considered part of the block\n      className: 'string',\n      begin: '[\\\\|>]([1-9]?[+-])?[ ]*\\\\n( +)[^ ][^\\\\n]*\\\\n(\\\\2[^\\\\n]+\\\\n?)*'\n    },\n    { // Ruby/Rails erb\n      begin: '<%[%=-]?',\n      end: '[%-]?%>',\n      subLanguage: 'ruby',\n      excludeBegin: true,\n      excludeEnd: true,\n      relevance: 0\n    },\n    { // named tags\n      className: 'type',\n      begin: '!\\\\w+!' + URI_CHARACTERS\n    },\n    // https://yaml.org/spec/1.2/spec.html#id2784064\n    { // verbatim tags\n      className: 'type',\n      begin: '!<' + URI_CHARACTERS + \">\"\n    },\n    { // primary tags\n      className: 'type',\n      begin: '!' + URI_CHARACTERS\n    },\n    { // secondary tags\n      className: 'type',\n      begin: '!!' + URI_CHARACTERS\n    },\n    { // fragment id &ref\n      className: 'meta',\n      begin: '&' + hljs.UNDERSCORE_IDENT_RE + '$'\n    },\n    { // fragment reference *ref\n      className: 'meta',\n      begin: '\\\\*' + hljs.UNDERSCORE_IDENT_RE + '$'\n    },\n    { // array listing\n      className: 'bullet',\n      // TODO: remove |$ hack when we have proper look-ahead support\n      begin: '-(?=[ ]|$)',\n      relevance: 0\n    },\n    hljs.HASH_COMMENT_MODE,\n    {\n      beginKeywords: LITERALS,\n      keywords: { literal: LITERALS }\n    },\n    TIMESTAMP,\n    // numbers are any valid C-style number that\n    // sit isolated from other words\n    {\n      className: 'number',\n      begin: hljs.C_NUMBER_RE + '\\\\b',\n      relevance: 0\n    },\n    OBJECT,\n    ARRAY,\n    SINGLE_QUOTE_STRING,\n    STRING\n  ];\n\n  const VALUE_MODES = [ ...MODES ];\n  VALUE_MODES.pop();\n  VALUE_MODES.push(CONTAINER_STRING);\n  VALUE_CONTAINER.contains = VALUE_MODES;\n\n  return {\n    name: 'YAML',\n    case_insensitive: true,\n    aliases: [ 'yml' ],\n    contains: MODES\n  };\n}\n\nmodule.exports = yaml;\n","const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';\nconst KEYWORDS = [\n  \"as\", // for exports\n  \"in\",\n  \"of\",\n  \"if\",\n  \"for\",\n  \"while\",\n  \"finally\",\n  \"var\",\n  \"new\",\n  \"function\",\n  \"do\",\n  \"return\",\n  \"void\",\n  \"else\",\n  \"break\",\n  \"catch\",\n  \"instanceof\",\n  \"with\",\n  \"throw\",\n  \"case\",\n  \"default\",\n  \"try\",\n  \"switch\",\n  \"continue\",\n  \"typeof\",\n  \"delete\",\n  \"let\",\n  \"yield\",\n  \"const\",\n  \"class\",\n  // JS handles these with a special rule\n  // \"get\",\n  // \"set\",\n  \"debugger\",\n  \"async\",\n  \"await\",\n  \"static\",\n  \"import\",\n  \"from\",\n  \"export\",\n  \"extends\",\n  // It's reached stage 3, which is \"recommended for implementation\":\n  \"using\"\n];\nconst LITERALS = [\n  \"true\",\n  \"false\",\n  \"null\",\n  \"undefined\",\n  \"NaN\",\n  \"Infinity\"\n];\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects\nconst TYPES = [\n  // Fundamental objects\n  \"Object\",\n  \"Function\",\n  \"Boolean\",\n  \"Symbol\",\n  // numbers and dates\n  \"Math\",\n  \"Date\",\n  \"Number\",\n  \"BigInt\",\n  // text\n  \"String\",\n  \"RegExp\",\n  // Indexed collections\n  \"Array\",\n  \"Float32Array\",\n  \"Float64Array\",\n  \"Int8Array\",\n  \"Uint8Array\",\n  \"Uint8ClampedArray\",\n  \"Int16Array\",\n  \"Int32Array\",\n  \"Uint16Array\",\n  \"Uint32Array\",\n  \"BigInt64Array\",\n  \"BigUint64Array\",\n  // Keyed collections\n  \"Set\",\n  \"Map\",\n  \"WeakSet\",\n  \"WeakMap\",\n  // Structured data\n  \"ArrayBuffer\",\n  \"SharedArrayBuffer\",\n  \"Atomics\",\n  \"DataView\",\n  \"JSON\",\n  // Control abstraction objects\n  \"Promise\",\n  \"Generator\",\n  \"GeneratorFunction\",\n  \"AsyncFunction\",\n  // Reflection\n  \"Reflect\",\n  \"Proxy\",\n  // Internationalization\n  \"Intl\",\n  // WebAssembly\n  \"WebAssembly\"\n];\n\nconst ERROR_TYPES = [\n  \"Error\",\n  \"EvalError\",\n  \"InternalError\",\n  \"RangeError\",\n  \"ReferenceError\",\n  \"SyntaxError\",\n  \"TypeError\",\n  \"URIError\"\n];\n\nconst BUILT_IN_GLOBALS = [\n  \"setInterval\",\n  \"setTimeout\",\n  \"clearInterval\",\n  \"clearTimeout\",\n\n  \"require\",\n  \"exports\",\n\n  \"eval\",\n  \"isFinite\",\n  \"isNaN\",\n  \"parseFloat\",\n  \"parseInt\",\n  \"decodeURI\",\n  \"decodeURIComponent\",\n  \"encodeURI\",\n  \"encodeURIComponent\",\n  \"escape\",\n  \"unescape\"\n];\n\nconst BUILT_IN_VARIABLES = [\n  \"arguments\",\n  \"this\",\n  \"super\",\n  \"console\",\n  \"window\",\n  \"document\",\n  \"localStorage\",\n  \"sessionStorage\",\n  \"module\",\n  \"global\" // Node.js\n];\n\nconst BUILT_INS = [].concat(\n  BUILT_IN_GLOBALS,\n  TYPES,\n  ERROR_TYPES\n);\n\n/*\nLanguage: JavaScript\nDescription: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.\nCategory: common, scripting, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/JavaScript\n*/\n\n\n/** @type LanguageFn */\nfunction javascript(hljs) {\n  const regex = hljs.regex;\n  /**\n   * Takes a string like \"<Booger\" and checks to see\n   * if we can find a matching \"</Booger\" later in the\n   * content.\n   * @param {RegExpMatchArray} match\n   * @param {{after:number}} param1\n   */\n  const hasClosingTag = (match, { after }) => {\n    const tag = \"</\" + match[0].slice(1);\n    const pos = match.input.indexOf(tag, after);\n    return pos !== -1;\n  };\n\n  const IDENT_RE$1 = IDENT_RE;\n  const FRAGMENT = {\n    begin: '<>',\n    end: '</>'\n  };\n  // to avoid some special cases inside isTrulyOpeningTag\n  const XML_SELF_CLOSING = /<[A-Za-z0-9\\\\._:-]+\\s*\\/>/;\n  const XML_TAG = {\n    begin: /<[A-Za-z0-9\\\\._:-]+/,\n    end: /\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,\n    /**\n     * @param {RegExpMatchArray} match\n     * @param {CallbackResponse} response\n     */\n    isTrulyOpeningTag: (match, response) => {\n      const afterMatchIndex = match[0].length + match.index;\n      const nextChar = match.input[afterMatchIndex];\n      if (\n        // HTML should not include another raw `<` inside a tag\n        // nested type?\n        // `<Array<Array<number>>`, etc.\n        nextChar === \"<\" ||\n        // the , gives away that this is not HTML\n        // `<T, A extends keyof T, V>`\n        nextChar === \",\"\n        ) {\n        response.ignoreMatch();\n        return;\n      }\n\n      // `<something>`\n      // Quite possibly a tag, lets look for a matching closing tag...\n      if (nextChar === \">\") {\n        // if we cannot find a matching closing tag, then we\n        // will ignore it\n        if (!hasClosingTag(match, { after: afterMatchIndex })) {\n          response.ignoreMatch();\n        }\n      }\n\n      // `<blah />` (self-closing)\n      // handled by simpleSelfClosing rule\n\n      let m;\n      const afterMatch = match.input.substring(afterMatchIndex);\n\n      // some more template typing stuff\n      //  <T = any>(key?: string) => Modify<\n      if ((m = afterMatch.match(/^\\s*=/))) {\n        response.ignoreMatch();\n        return;\n      }\n\n      // `<From extends string>`\n      // technically this could be HTML, but it smells like a type\n      // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276\n      if ((m = afterMatch.match(/^\\s+extends\\s+/))) {\n        if (m.index === 0) {\n          response.ignoreMatch();\n          // eslint-disable-next-line no-useless-return\n          return;\n        }\n      }\n    }\n  };\n  const KEYWORDS$1 = {\n    $pattern: IDENT_RE,\n    keyword: KEYWORDS,\n    literal: LITERALS,\n    built_in: BUILT_INS,\n    \"variable.language\": BUILT_IN_VARIABLES\n  };\n\n  // https://tc39.es/ecma262/#sec-literals-numeric-literals\n  const decimalDigits = '[0-9](_?[0-9])*';\n  const frac = `\\\\.(${decimalDigits})`;\n  // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral\n  // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n  const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`;\n  const NUMBER = {\n    className: 'number',\n    variants: [\n      // DecimalLiteral\n      { begin: `(\\\\b(${decimalInteger})((${frac})|\\\\.)?|(${frac}))` +\n        `[eE][+-]?(${decimalDigits})\\\\b` },\n      { begin: `\\\\b(${decimalInteger})\\\\b((${frac})\\\\b|\\\\.)?|(${frac})\\\\b` },\n\n      // DecimalBigIntegerLiteral\n      { begin: `\\\\b(0|[1-9](_?[0-9])*)n\\\\b` },\n\n      // NonDecimalIntegerLiteral\n      { begin: \"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\" },\n      { begin: \"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\" },\n      { begin: \"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\" },\n\n      // LegacyOctalIntegerLiteral (does not include underscore separators)\n      // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n      { begin: \"\\\\b0[0-7]+n?\\\\b\" },\n    ],\n    relevance: 0\n  };\n\n  const SUBST = {\n    className: 'subst',\n    begin: '\\\\$\\\\{',\n    end: '\\\\}',\n    keywords: KEYWORDS$1,\n    contains: [] // defined later\n  };\n  const HTML_TEMPLATE = {\n    begin: '\\.?html`',\n    end: '',\n    starts: {\n      end: '`',\n      returnEnd: false,\n      contains: [\n        hljs.BACKSLASH_ESCAPE,\n        SUBST\n      ],\n      subLanguage: 'xml'\n    }\n  };\n  const CSS_TEMPLATE = {\n    begin: '\\.?css`',\n    end: '',\n    starts: {\n      end: '`',\n      returnEnd: false,\n      contains: [\n        hljs.BACKSLASH_ESCAPE,\n        SUBST\n      ],\n      subLanguage: 'css'\n    }\n  };\n  const GRAPHQL_TEMPLATE = {\n    begin: '\\.?gql`',\n    end: '',\n    starts: {\n      end: '`',\n      returnEnd: false,\n      contains: [\n        hljs.BACKSLASH_ESCAPE,\n        SUBST\n      ],\n      subLanguage: 'graphql'\n    }\n  };\n  const TEMPLATE_STRING = {\n    className: 'string',\n    begin: '`',\n    end: '`',\n    contains: [\n      hljs.BACKSLASH_ESCAPE,\n      SUBST\n    ]\n  };\n  const JSDOC_COMMENT = hljs.COMMENT(\n    /\\/\\*\\*(?!\\/)/,\n    '\\\\*/',\n    {\n      relevance: 0,\n      contains: [\n        {\n          begin: '(?=@[A-Za-z]+)',\n          relevance: 0,\n          contains: [\n            {\n              className: 'doctag',\n              begin: '@[A-Za-z]+'\n            },\n            {\n              className: 'type',\n              begin: '\\\\{',\n              end: '\\\\}',\n              excludeEnd: true,\n              excludeBegin: true,\n              relevance: 0\n            },\n            {\n              className: 'variable',\n              begin: IDENT_RE$1 + '(?=\\\\s*(-)|$)',\n              endsParent: true,\n              relevance: 0\n            },\n            // eat spaces (not newlines) so we can find\n            // types or variables\n            {\n              begin: /(?=[^\\n])\\s/,\n              relevance: 0\n            }\n          ]\n        }\n      ]\n    }\n  );\n  const COMMENT = {\n    className: \"comment\",\n    variants: [\n      JSDOC_COMMENT,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_LINE_COMMENT_MODE\n    ]\n  };\n  const SUBST_INTERNALS = [\n    hljs.APOS_STRING_MODE,\n    hljs.QUOTE_STRING_MODE,\n    HTML_TEMPLATE,\n    CSS_TEMPLATE,\n    GRAPHQL_TEMPLATE,\n    TEMPLATE_STRING,\n    // Skip numbers when they are part of a variable name\n    { match: /\\$\\d+/ },\n    NUMBER,\n    // This is intentional:\n    // See https://github.com/highlightjs/highlight.js/issues/3288\n    // hljs.REGEXP_MODE\n  ];\n  SUBST.contains = SUBST_INTERNALS\n    .concat({\n      // we need to pair up {} inside our subst to prevent\n      // it from ending too early by matching another }\n      begin: /\\{/,\n      end: /\\}/,\n      keywords: KEYWORDS$1,\n      contains: [\n        \"self\"\n      ].concat(SUBST_INTERNALS)\n    });\n  const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains);\n  const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([\n    // eat recursive parens in sub expressions\n    {\n      begin: /(\\s*)\\(/,\n      end: /\\)/,\n      keywords: KEYWORDS$1,\n      contains: [\"self\"].concat(SUBST_AND_COMMENTS)\n    }\n  ]);\n  const PARAMS = {\n    className: 'params',\n    // convert this to negative lookbehind in v12\n    begin: /(\\s*)\\(/, // to match the parms with\n    end: /\\)/,\n    excludeBegin: true,\n    excludeEnd: true,\n    keywords: KEYWORDS$1,\n    contains: PARAMS_CONTAINS\n  };\n\n  // ES6 classes\n  const CLASS_OR_EXTENDS = {\n    variants: [\n      // class Car extends vehicle\n      {\n        match: [\n          /class/,\n          /\\s+/,\n          IDENT_RE$1,\n          /\\s+/,\n          /extends/,\n          /\\s+/,\n          regex.concat(IDENT_RE$1, \"(\", regex.concat(/\\./, IDENT_RE$1), \")*\")\n        ],\n        scope: {\n          1: \"keyword\",\n          3: \"title.class\",\n          5: \"keyword\",\n          7: \"title.class.inherited\"\n        }\n      },\n      // class Car\n      {\n        match: [\n          /class/,\n          /\\s+/,\n          IDENT_RE$1\n        ],\n        scope: {\n          1: \"keyword\",\n          3: \"title.class\"\n        }\n      },\n\n    ]\n  };\n\n  const CLASS_REFERENCE = {\n    relevance: 0,\n    match:\n    regex.either(\n      // Hard coded exceptions\n      /\\bJSON/,\n      // Float32Array, OutT\n      /\\b[A-Z][a-z]+([A-Z][a-z]*|\\d)*/,\n      // CSSFactory, CSSFactoryT\n      /\\b[A-Z]{2,}([A-Z][a-z]+|\\d)+([A-Z][a-z]*)*/,\n      // FPs, FPsT\n      /\\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\\d)*([A-Z][a-z]*)*/,\n      // P\n      // single letters are not highlighted\n      // BLAH\n      // this will be flagged as a UPPER_CASE_CONSTANT instead\n    ),\n    className: \"title.class\",\n    keywords: {\n      _: [\n        // se we still get relevance credit for JS library classes\n        ...TYPES,\n        ...ERROR_TYPES\n      ]\n    }\n  };\n\n  const USE_STRICT = {\n    label: \"use_strict\",\n    className: 'meta',\n    relevance: 10,\n    begin: /^\\s*['\"]use (strict|asm)['\"]/\n  };\n\n  const FUNCTION_DEFINITION = {\n    variants: [\n      {\n        match: [\n          /function/,\n          /\\s+/,\n          IDENT_RE$1,\n          /(?=\\s*\\()/\n        ]\n      },\n      // anonymous function\n      {\n        match: [\n          /function/,\n          /\\s*(?=\\()/\n        ]\n      }\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    label: \"func.def\",\n    contains: [ PARAMS ],\n    illegal: /%/\n  };\n\n  const UPPER_CASE_CONSTANT = {\n    relevance: 0,\n    match: /\\b[A-Z][A-Z_0-9]+\\b/,\n    className: \"variable.constant\"\n  };\n\n  function noneOf(list) {\n    return regex.concat(\"(?!\", list.join(\"|\"), \")\");\n  }\n\n  const FUNCTION_CALL = {\n    match: regex.concat(\n      /\\b/,\n      noneOf([\n        ...BUILT_IN_GLOBALS,\n        \"super\",\n        \"import\"\n      ].map(x => `${x}\\\\s*\\\\(`)),\n      IDENT_RE$1, regex.lookahead(/\\s*\\(/)),\n    className: \"title.function\",\n    relevance: 0\n  };\n\n  const PROPERTY_ACCESS = {\n    begin: regex.concat(/\\./, regex.lookahead(\n      regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/)\n    )),\n    end: IDENT_RE$1,\n    excludeBegin: true,\n    keywords: \"prototype\",\n    className: \"property\",\n    relevance: 0\n  };\n\n  const GETTER_OR_SETTER = {\n    match: [\n      /get|set/,\n      /\\s+/,\n      IDENT_RE$1,\n      /(?=\\()/\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    contains: [\n      { // eat to avoid empty params\n        begin: /\\(\\)/\n      },\n      PARAMS\n    ]\n  };\n\n  const FUNC_LEAD_IN_RE = '(\\\\(' +\n    '[^()]*(\\\\(' +\n    '[^()]*(\\\\(' +\n    '[^()]*' +\n    '\\\\)[^()]*)*' +\n    '\\\\)[^()]*)*' +\n    '\\\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\\\s*=>';\n\n  const FUNCTION_VARIABLE = {\n    match: [\n      /const|var|let/, /\\s+/,\n      IDENT_RE$1, /\\s*/,\n      /=\\s*/,\n      /(async\\s*)?/, // async is optional\n      regex.lookahead(FUNC_LEAD_IN_RE)\n    ],\n    keywords: \"async\",\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    contains: [\n      PARAMS\n    ]\n  };\n\n  return {\n    name: 'JavaScript',\n    aliases: ['js', 'jsx', 'mjs', 'cjs'],\n    keywords: KEYWORDS$1,\n    // this will be extended by TypeScript\n    exports: { PARAMS_CONTAINS, CLASS_REFERENCE },\n    illegal: /#(?![$_A-z])/,\n    contains: [\n      hljs.SHEBANG({\n        label: \"shebang\",\n        binary: \"node\",\n        relevance: 5\n      }),\n      USE_STRICT,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      HTML_TEMPLATE,\n      CSS_TEMPLATE,\n      GRAPHQL_TEMPLATE,\n      TEMPLATE_STRING,\n      COMMENT,\n      // Skip numbers when they are part of a variable name\n      { match: /\\$\\d+/ },\n      NUMBER,\n      CLASS_REFERENCE,\n      {\n        scope: 'attr',\n        match: IDENT_RE$1 + regex.lookahead(':'),\n        relevance: 0\n      },\n      FUNCTION_VARIABLE,\n      { // \"value\" container\n        begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n        keywords: 'return throw case',\n        relevance: 0,\n        contains: [\n          COMMENT,\n          hljs.REGEXP_MODE,\n          {\n            className: 'function',\n            // we have to count the parens to make sure we actually have the\n            // correct bounding ( ) before the =>.  There could be any number of\n            // sub-expressions inside also surrounded by parens.\n            begin: FUNC_LEAD_IN_RE,\n            returnBegin: true,\n            end: '\\\\s*=>',\n            contains: [\n              {\n                className: 'params',\n                variants: [\n                  {\n                    begin: hljs.UNDERSCORE_IDENT_RE,\n                    relevance: 0\n                  },\n                  {\n                    className: null,\n                    begin: /\\(\\s*\\)/,\n                    skip: true\n                  },\n                  {\n                    begin: /(\\s*)\\(/,\n                    end: /\\)/,\n                    excludeBegin: true,\n                    excludeEnd: true,\n                    keywords: KEYWORDS$1,\n                    contains: PARAMS_CONTAINS\n                  }\n                ]\n              }\n            ]\n          },\n          { // could be a comma delimited list of params to a function call\n            begin: /,/,\n            relevance: 0\n          },\n          {\n            match: /\\s+/,\n            relevance: 0\n          },\n          { // JSX\n            variants: [\n              { begin: FRAGMENT.begin, end: FRAGMENT.end },\n              { match: XML_SELF_CLOSING },\n              {\n                begin: XML_TAG.begin,\n                // we carefully check the opening tag to see if it truly\n                // is a tag and not a false positive\n                'on:begin': XML_TAG.isTrulyOpeningTag,\n                end: XML_TAG.end\n              }\n            ],\n            subLanguage: 'xml',\n            contains: [\n              {\n                begin: XML_TAG.begin,\n                end: XML_TAG.end,\n                skip: true,\n                contains: ['self']\n              }\n            ]\n          }\n        ],\n      },\n      FUNCTION_DEFINITION,\n      {\n        // prevent this from getting swallowed up by function\n        // since they appear \"function like\"\n        beginKeywords: \"while if switch catch for\"\n      },\n      {\n        // we have to count the parens to make sure we actually have the correct\n        // bounding ( ).  There could be any number of sub-expressions inside\n        // also surrounded by parens.\n        begin: '\\\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE +\n          '\\\\(' + // first parens\n          '[^()]*(\\\\(' +\n            '[^()]*(\\\\(' +\n              '[^()]*' +\n            '\\\\)[^()]*)*' +\n          '\\\\)[^()]*)*' +\n          '\\\\)\\\\s*\\\\{', // end parens\n        returnBegin:true,\n        label: \"func.def\",\n        contains: [\n          PARAMS,\n          hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: \"title.function\" })\n        ]\n      },\n      // catch ... so it won't trigger the property rule below\n      {\n        match: /\\.\\.\\./,\n        relevance: 0\n      },\n      PROPERTY_ACCESS,\n      // hack: prevents detection of keywords in some circumstances\n      // .keyword()\n      // $keyword = x\n      {\n        match: '\\\\$' + IDENT_RE$1,\n        relevance: 0\n      },\n      {\n        match: [ /\\bconstructor(?=\\s*\\()/ ],\n        className: { 1: \"title.function\" },\n        contains: [ PARAMS ]\n      },\n      FUNCTION_CALL,\n      UPPER_CASE_CONSTANT,\n      CLASS_OR_EXTENDS,\n      GETTER_OR_SETTER,\n      {\n        match: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n      }\n    ]\n  };\n}\n\n/*\nLanguage: TypeScript\nAuthor: Panu Horsmalahti <panu.horsmalahti@iki.fi>\nContributors: Ike Ku <dempfi@yahoo.com>\nDescription: TypeScript is a strict superset of JavaScript\nWebsite: https://www.typescriptlang.org\nCategory: common, scripting\n*/\n\n\n/** @type LanguageFn */\nfunction typescript(hljs) {\n  const regex = hljs.regex;\n  const tsLanguage = javascript(hljs);\n\n  const IDENT_RE$1 = IDENT_RE;\n  const TYPES = [\n    \"any\",\n    \"void\",\n    \"number\",\n    \"boolean\",\n    \"string\",\n    \"object\",\n    \"never\",\n    \"symbol\",\n    \"bigint\",\n    \"unknown\"\n  ];\n  const NAMESPACE = {\n    begin: [\n      /namespace/,\n      /\\s+/,\n      hljs.IDENT_RE\n    ],\n    beginScope: {\n      1: \"keyword\",\n      3: \"title.class\"\n    }\n  };\n  const INTERFACE = {\n    beginKeywords: 'interface',\n    end: /\\{/,\n    excludeEnd: true,\n    keywords: {\n      keyword: 'interface extends',\n      built_in: TYPES\n    },\n    contains: [ tsLanguage.exports.CLASS_REFERENCE ]\n  };\n  const USE_STRICT = {\n    className: 'meta',\n    relevance: 10,\n    begin: /^\\s*['\"]use strict['\"]/\n  };\n  const TS_SPECIFIC_KEYWORDS = [\n    \"type\",\n    // \"namespace\",\n    \"interface\",\n    \"public\",\n    \"private\",\n    \"protected\",\n    \"implements\",\n    \"declare\",\n    \"abstract\",\n    \"readonly\",\n    \"enum\",\n    \"override\",\n    \"satisfies\"\n  ];\n  /*\n    namespace is a TS keyword but it's fine to use it as a variable name too.\n    const message = 'foo';\n    const namespace = 'bar';\n  */\n  const KEYWORDS$1 = {\n    $pattern: IDENT_RE,\n    keyword: KEYWORDS.concat(TS_SPECIFIC_KEYWORDS),\n    literal: LITERALS,\n    built_in: BUILT_INS.concat(TYPES),\n    \"variable.language\": BUILT_IN_VARIABLES\n  };\n\n  const DECORATOR = {\n    className: 'meta',\n    begin: '@' + IDENT_RE$1,\n  };\n\n  const swapMode = (mode, label, replacement) => {\n    const indx = mode.contains.findIndex(m => m.label === label);\n    if (indx === -1) { throw new Error(\"can not find mode to replace\"); }\n\n    mode.contains.splice(indx, 1, replacement);\n  };\n\n\n  // this should update anywhere keywords is used since\n  // it will be the same actual JS object\n  Object.assign(tsLanguage.keywords, KEYWORDS$1);\n\n  tsLanguage.exports.PARAMS_CONTAINS.push(DECORATOR);\n\n  // highlight the function params\n  const ATTRIBUTE_HIGHLIGHT = tsLanguage.contains.find(c => c.scope === \"attr\");\n\n  // take default attr rule and extend it to support optionals\n  const OPTIONAL_KEY_OR_ARGUMENT = Object.assign({},\n    ATTRIBUTE_HIGHLIGHT,\n    { match: regex.concat(IDENT_RE$1, regex.lookahead(/\\s*\\?:/)) }\n  );\n  tsLanguage.exports.PARAMS_CONTAINS.push([\n    tsLanguage.exports.CLASS_REFERENCE, // class reference for highlighting the params types\n    ATTRIBUTE_HIGHLIGHT, // highlight the params key\n    OPTIONAL_KEY_OR_ARGUMENT, // Added for optional property assignment highlighting\n  ]);\n\n  // Add the optional property assignment highlighting for objects or classes\n  tsLanguage.contains = tsLanguage.contains.concat([\n    DECORATOR,\n    NAMESPACE,\n    INTERFACE,\n    OPTIONAL_KEY_OR_ARGUMENT, // Added for optional property assignment highlighting\n  ]);\n\n  // TS gets a simpler shebang rule than JS\n  swapMode(tsLanguage, \"shebang\", hljs.SHEBANG());\n  // JS use strict rule purposely excludes `asm` which makes no sense\n  swapMode(tsLanguage, \"use_strict\", USE_STRICT);\n\n  const functionDeclaration = tsLanguage.contains.find(m => m.label === \"func.def\");\n  functionDeclaration.relevance = 0; // () => {} is more typical in TypeScript\n\n  Object.assign(tsLanguage, {\n    name: 'TypeScript',\n    aliases: [\n      'ts',\n      'tsx',\n      'mts',\n      'cts'\n    ]\n  });\n\n  return tsLanguage;\n}\n\nmodule.exports = typescript;\n","/*\nLanguage: Visual Basic .NET\nDescription: Visual Basic .NET (VB.NET) is a multi-paradigm, object-oriented programming language, implemented on the .NET Framework.\nAuthors: Poren Chiang <ren.chiang@gmail.com>, Jan Pilzer\nWebsite: https://docs.microsoft.com/dotnet/visual-basic/getting-started\nCategory: common\n*/\n\n/** @type LanguageFn */\nfunction vbnet(hljs) {\n  const regex = hljs.regex;\n  /**\n   * Character Literal\n   * Either a single character (\"a\"C) or an escaped double quote (\"\"\"\"C).\n   */\n  const CHARACTER = {\n    className: 'string',\n    begin: /\"(\"\"|[^/n])\"C\\b/\n  };\n\n  const STRING = {\n    className: 'string',\n    begin: /\"/,\n    end: /\"/,\n    illegal: /\\n/,\n    contains: [\n      {\n        // double quote escape\n        begin: /\"\"/ }\n    ]\n  };\n\n  /** Date Literals consist of a date, a time, or both separated by whitespace, surrounded by # */\n  const MM_DD_YYYY = /\\d{1,2}\\/\\d{1,2}\\/\\d{4}/;\n  const YYYY_MM_DD = /\\d{4}-\\d{1,2}-\\d{1,2}/;\n  const TIME_12H = /(\\d|1[012])(:\\d+){0,2} *(AM|PM)/;\n  const TIME_24H = /\\d{1,2}(:\\d{1,2}){1,2}/;\n  const DATE = {\n    className: 'literal',\n    variants: [\n      {\n        // #YYYY-MM-DD# (ISO-Date) or #M/D/YYYY# (US-Date)\n        begin: regex.concat(/# */, regex.either(YYYY_MM_DD, MM_DD_YYYY), / *#/) },\n      {\n        // #H:mm[:ss]# (24h Time)\n        begin: regex.concat(/# */, TIME_24H, / *#/) },\n      {\n        // #h[:mm[:ss]] A# (12h Time)\n        begin: regex.concat(/# */, TIME_12H, / *#/) },\n      {\n        // date plus time\n        begin: regex.concat(\n          /# */,\n          regex.either(YYYY_MM_DD, MM_DD_YYYY),\n          / +/,\n          regex.either(TIME_12H, TIME_24H),\n          / *#/\n        ) }\n    ]\n  };\n\n  const NUMBER = {\n    className: 'number',\n    relevance: 0,\n    variants: [\n      {\n        // Float\n        begin: /\\b\\d[\\d_]*((\\.[\\d_]+(E[+-]?[\\d_]+)?)|(E[+-]?[\\d_]+))[RFD@!#]?/ },\n      {\n        // Integer (base 10)\n        begin: /\\b\\d[\\d_]*((U?[SIL])|[%&])?/ },\n      {\n        // Integer (base 16)\n        begin: /&H[\\dA-F_]+((U?[SIL])|[%&])?/ },\n      {\n        // Integer (base 8)\n        begin: /&O[0-7_]+((U?[SIL])|[%&])?/ },\n      {\n        // Integer (base 2)\n        begin: /&B[01_]+((U?[SIL])|[%&])?/ }\n    ]\n  };\n\n  const LABEL = {\n    className: 'label',\n    begin: /^\\w+:/\n  };\n\n  const DOC_COMMENT = hljs.COMMENT(/'''/, /$/, { contains: [\n    {\n      className: 'doctag',\n      begin: /<\\/?/,\n      end: />/\n    }\n  ] });\n\n  const COMMENT = hljs.COMMENT(null, /$/, { variants: [\n    { begin: /'/ },\n    {\n      // TODO: Use multi-class for leading spaces\n      begin: /([\\t ]|^)REM(?=\\s)/ }\n  ] });\n\n  const DIRECTIVES = {\n    className: 'meta',\n    // TODO: Use multi-class for indentation once available\n    begin: /[\\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\\b/,\n    end: /$/,\n    keywords: { keyword:\n        'const disable else elseif enable end externalsource if region then' },\n    contains: [ COMMENT ]\n  };\n\n  return {\n    name: 'Visual Basic .NET',\n    aliases: [ 'vb' ],\n    case_insensitive: true,\n    classNameAliases: { label: 'symbol' },\n    keywords: {\n      keyword:\n        'addhandler alias aggregate ansi as async assembly auto binary by byref byval ' /* a-b */\n        + 'call case catch class compare const continue custom declare default delegate dim distinct do ' /* c-d */\n        + 'each equals else elseif end enum erase error event exit explicit finally for friend from function ' /* e-f */\n        + 'get global goto group handles if implements imports in inherits interface into iterator ' /* g-i */\n        + 'join key let lib loop me mid module mustinherit mustoverride mybase myclass ' /* j-m */\n        + 'namespace narrowing new next notinheritable notoverridable ' /* n */\n        + 'of off on operator option optional order overloads overridable overrides ' /* o */\n        + 'paramarray partial preserve private property protected public ' /* p */\n        + 'raiseevent readonly redim removehandler resume return ' /* r */\n        + 'select set shadows shared skip static step stop structure strict sub synclock ' /* s */\n        + 'take text then throw to try unicode until using when where while widening with withevents writeonly yield' /* t-y */,\n      built_in:\n        // Operators https://docs.microsoft.com/dotnet/visual-basic/language-reference/operators\n        'addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor '\n        // Type Conversion Functions https://docs.microsoft.com/dotnet/visual-basic/language-reference/functions/type-conversion-functions\n        + 'cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort',\n      type:\n        // Data types https://docs.microsoft.com/dotnet/visual-basic/language-reference/data-types\n        'boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort',\n      literal: 'true false nothing'\n    },\n    illegal:\n      '//|\\\\{|\\\\}|endif|gosub|variant|wend|^\\\\$ ' /* reserved deprecated keywords */,\n    contains: [\n      CHARACTER,\n      STRING,\n      DATE,\n      NUMBER,\n      LABEL,\n      DOC_COMMENT,\n      COMMENT,\n      DIRECTIVES\n    ]\n  };\n}\n\nmodule.exports = vbnet;\n","/*\nLanguage: WebAssembly\nWebsite: https://webassembly.org\nDescription:  Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server applications.\nCategory: web, common\nAudit: 2020\n*/\n\n/** @type LanguageFn */\nfunction wasm(hljs) {\n  hljs.regex;\n  const BLOCK_COMMENT = hljs.COMMENT(/\\(;/, /;\\)/);\n  BLOCK_COMMENT.contains.push(\"self\");\n  const LINE_COMMENT = hljs.COMMENT(/;;/, /$/);\n\n  const KWS = [\n    \"anyfunc\",\n    \"block\",\n    \"br\",\n    \"br_if\",\n    \"br_table\",\n    \"call\",\n    \"call_indirect\",\n    \"data\",\n    \"drop\",\n    \"elem\",\n    \"else\",\n    \"end\",\n    \"export\",\n    \"func\",\n    \"global.get\",\n    \"global.set\",\n    \"local.get\",\n    \"local.set\",\n    \"local.tee\",\n    \"get_global\",\n    \"get_local\",\n    \"global\",\n    \"if\",\n    \"import\",\n    \"local\",\n    \"loop\",\n    \"memory\",\n    \"memory.grow\",\n    \"memory.size\",\n    \"module\",\n    \"mut\",\n    \"nop\",\n    \"offset\",\n    \"param\",\n    \"result\",\n    \"return\",\n    \"select\",\n    \"set_global\",\n    \"set_local\",\n    \"start\",\n    \"table\",\n    \"tee_local\",\n    \"then\",\n    \"type\",\n    \"unreachable\"\n  ];\n\n  const FUNCTION_REFERENCE = {\n    begin: [\n      /(?:func|call|call_indirect)/,\n      /\\s+/,\n      /\\$[^\\s)]+/\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    }\n  };\n\n  const ARGUMENT = {\n    className: \"variable\",\n    begin: /\\$[\\w_]+/\n  };\n\n  const PARENS = {\n    match: /(\\((?!;)|\\))+/,\n    className: \"punctuation\",\n    relevance: 0\n  };\n\n  const NUMBER = {\n    className: \"number\",\n    relevance: 0,\n    // borrowed from Prism, TODO: split out into variants\n    match: /[+-]?\\b(?:\\d(?:_?\\d)*(?:\\.\\d(?:_?\\d)*)?(?:[eE][+-]?\\d(?:_?\\d)*)?|0x[\\da-fA-F](?:_?[\\da-fA-F])*(?:\\.[\\da-fA-F](?:_?[\\da-fA-D])*)?(?:[pP][+-]?\\d(?:_?\\d)*)?)\\b|\\binf\\b|\\bnan(?::0x[\\da-fA-F](?:_?[\\da-fA-D])*)?\\b/\n  };\n\n  const TYPE = {\n    // look-ahead prevents us from gobbling up opcodes\n    match: /(i32|i64|f32|f64)(?!\\.)/,\n    className: \"type\"\n  };\n\n  const MATH_OPERATIONS = {\n    className: \"keyword\",\n    // borrowed from Prism, TODO: split out into variants\n    match: /\\b(f32|f64|i32|i64)(?:\\.(?:abs|add|and|ceil|clz|const|convert_[su]\\/i(?:32|64)|copysign|ctz|demote\\/f64|div(?:_[su])?|eqz?|extend_[su]\\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\\/f32|reinterpret\\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\\/f(?:32|64))?|wrap\\/i64|xor))\\b/\n  };\n\n  const OFFSET_ALIGN = {\n    match: [\n      /(?:offset|align)/,\n      /\\s*/,\n      /=/\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"operator\"\n    }\n  };\n\n  return {\n    name: 'WebAssembly',\n    keywords: {\n      $pattern: /[\\w.]+/,\n      keyword: KWS\n    },\n    contains: [\n      LINE_COMMENT,\n      BLOCK_COMMENT,\n      OFFSET_ALIGN,\n      ARGUMENT,\n      PARENS,\n      FUNCTION_REFERENCE,\n      hljs.QUOTE_STRING_MODE,\n      TYPE,\n      MATH_OPERATIONS,\n      NUMBER\n    ]\n  };\n}\n\nmodule.exports = wasm;\n","var hljs = require('./core');\n\nhljs.registerLanguage('xml', require('./languages/xml'));\nhljs.registerLanguage('bash', require('./languages/bash'));\nhljs.registerLanguage('c', require('./languages/c'));\nhljs.registerLanguage('cpp', require('./languages/cpp'));\nhljs.registerLanguage('csharp', require('./languages/csharp'));\nhljs.registerLanguage('css', require('./languages/css'));\nhljs.registerLanguage('markdown', require('./languages/markdown'));\nhljs.registerLanguage('diff', require('./languages/diff'));\nhljs.registerLanguage('ruby', require('./languages/ruby'));\nhljs.registerLanguage('go', require('./languages/go'));\nhljs.registerLanguage('graphql', require('./languages/graphql'));\nhljs.registerLanguage('ini', require('./languages/ini'));\nhljs.registerLanguage('java', require('./languages/java'));\nhljs.registerLanguage('javascript', require('./languages/javascript'));\nhljs.registerLanguage('json', require('./languages/json'));\nhljs.registerLanguage('kotlin', require('./languages/kotlin'));\nhljs.registerLanguage('less', require('./languages/less'));\nhljs.registerLanguage('lua', require('./languages/lua'));\nhljs.registerLanguage('makefile', require('./languages/makefile'));\nhljs.registerLanguage('perl', require('./languages/perl'));\nhljs.registerLanguage('objectivec', require('./languages/objectivec'));\nhljs.registerLanguage('php', require('./languages/php'));\nhljs.registerLanguage('php-template', require('./languages/php-template'));\nhljs.registerLanguage('plaintext', require('./languages/plaintext'));\nhljs.registerLanguage('python', require('./languages/python'));\nhljs.registerLanguage('python-repl', require('./languages/python-repl'));\nhljs.registerLanguage('r', require('./languages/r'));\nhljs.registerLanguage('rust', require('./languages/rust'));\nhljs.registerLanguage('scss', require('./languages/scss'));\nhljs.registerLanguage('shell', require('./languages/shell'));\nhljs.registerLanguage('sql', require('./languages/sql'));\nhljs.registerLanguage('swift', require('./languages/swift'));\nhljs.registerLanguage('yaml', require('./languages/yaml'));\nhljs.registerLanguage('typescript', require('./languages/typescript'));\nhljs.registerLanguage('vbnet', require('./languages/vbnet'));\nhljs.registerLanguage('wasm', require('./languages/wasm'));\n\nhljs.HighlightJS = hljs\nhljs.default = hljs\nmodule.exports = hljs;","/**\n * e2evault/layout — the vault's constants, paths and byte primitives\n * (docs/E2E-VAULT-FORMAT.md → \"Layout\", \"Packs\", \"The index\").\n *\n * ⚠ With consts.ts, the one place the TypeScript side keeps these numbers. The Go side keeps\n * the same ones in backend/internal/e2e/vault.go; the test vectors\n * (backend/internal/e2edecrypt/testdata/vault-vectors.json) hold both to the\n * format, byte for byte.\n *\n * No WebCrypto here, no Vue: pure functions over bytes.\n *\n * The numbers code outside the vault needs while no vault is open (the key\n * file's rules, the pack sizes offered, the entry limit) live in consts.ts so\n * the main chunk carries only those; they are re-exported here, and every\n * import from this file keeps working.\n */\nexport {\n  VAULT_DEFAULT_PACK_LOG2,\n  VAULT_ENTRIES_WRITE_MAX,\n  VAULT_FEATURE,\n  VAULT_FORMAT,\n  VAULT_ID_LEN,\n  VAULT_LARGE_PACK_LOG2,\n  VAULT_MAX_PACK_LOG2,\n  VAULT_MIN_PACK_LOG2,\n  VAULT_WRITER_PACK_LOG2,\n  validReaderPackLog2,\n} from './consts';\n\nexport const VAULT_PACK_HEADER_LEN = 32;\nexport const VAULT_INDEX_HEADER_LEN = 40;\nexport const VAULT_TAG_LEN = 16;\n/** Every index file is at least this large (64 KiB). */\nexport const VAULT_INDEX_MIN_SIZE = 65536;\n/** A reader refuses an index file larger than this, before decrypting it. */\nexport const VAULT_INDEX_READ_MAX = 64 * 1024 * 1024;\n/** A writer refuses a change whose index file would be larger than this. */\nexport const VAULT_INDEX_WRITE_MAX = 32 * 1024 * 1024;\n/** From this index file size every client warns before a change. */\nexport const VAULT_INDEX_WARN = 24 * 1024 * 1024;\nexport const VAULT_KIND_PACK = 0x50; // 'P'\nexport const VAULT_KIND_INDEX = 0x49; // 'I'\n/** The newest generations that are always kept. */\nexport const VAULT_KEEP_GENERATIONS = 3;\n/** A generation replaced less than this long ago is kept too. */\nexport const VAULT_RETENTION_MS = 15 * 60 * 1000;\n/** A writer warns from this many entries (it refuses beyond\n *  VAULT_ENTRIES_WRITE_MAX, consts.ts). */\nexport const VAULT_ENTRIES_WARN = 200_000;\n/** A reader refuses an index with more entries than this. */\nexport const VAULT_ENTRIES_READ_MAX = 1_000_000;\n/** The root's children are depth 1. */\nexport const VAULT_MAX_DEPTH = 256;\n/** A name, in UTF-8 bytes. */\nexport const VAULT_NAME_MAX = 255;\n/** Chunk size writers use for file contents (STREAM): 2^20. */\nexport const VAULT_CHUNK_LOG2 = 20;\nexport const VAULT_MIN_CHUNK_LOG2 = 10;\nexport const VAULT_MAX_CHUNK_LOG2 = 24;\n/** At most this many names in one `POST .../delete`, and per collection pass. */\nexport const VAULT_DELETE_MAX = 1000;\n/** The largest integer a uvarint may carry (a JavaScript number holds it exactly). */\nexport const VAULT_UVARINT_MAX = Number.MAX_SAFE_INTEGER; // 2^53 - 1\n\n/** Entry kinds. */\nexport const VAULT_ENTRY_FOLDER = 1;\nexport const VAULT_ENTRY_FILE = 2;\n/** Content kinds. */\nexport const VAULT_CONTENT_NONE = 0;\nexport const VAULT_CONTENT_STREAM = 1;\n\n/** The 8-byte magic of packs and index files. */\nexport const VAULT_MAGIC = new TextEncoder().encode('filexvlt');\n\n/** HKDF labels (ASCII); the 16-byte id follows them raw. */\nexport const VAULT_INFO_INDEX = 'filex-vault-index-v1';\nexport const VAULT_INFO_CONTENT = 'filex-vault-content-v1';\n\n/**\n * A malformed vault object: an index, a pack header, a key file. `code` names\n * the rule that was broken, for tests and for the words a person reads.\n */\nexport class VaultFormatError extends Error {\n  constructor(\n    public readonly code: string,\n    message?: string,\n  ) {\n    super(message ?? `vault: ${code}`);\n    this.name = 'VaultFormatError';\n  }\n}\n\n// ---------------------------------------------------------------------\n// Bytes\n// ---------------------------------------------------------------------\n\n/** A view WebCrypto accepts (TS 5.9 refuses views over a SharedArrayBuffer). */\nexport function bufferView(b: Uint8Array): Uint8Array<ArrayBuffer> {\n  return (b.buffer instanceof ArrayBuffer ? b : new Uint8Array(b)) as Uint8Array<ArrayBuffer>;\n}\n\nexport function toHex(b: Uint8Array): string {\n  let s = '';\n  for (let i = 0; i < b.length; i++) s += b[i].toString(16).padStart(2, '0');\n  return s;\n}\n\n/** Strict lower-case hex; null for anything else. */\nexport function fromHex(s: string): Uint8Array<ArrayBuffer> | null {\n  if (typeof s !== 'string' || s.length % 2 !== 0 || !/^[0-9a-f]*$/.test(s)) return null;\n  const out = new Uint8Array(s.length / 2);\n  for (let i = 0; i < out.length; i++) out[i] = parseInt(s.slice(i * 2, i * 2 + 2), 16);\n  return out;\n}\n\n/** Byte order: byte by byte, a shorter one first when it is a prefix. */\nexport function compareBytes(a: Uint8Array, b: Uint8Array): number {\n  const n = Math.min(a.length, b.length);\n  for (let i = 0; i < n; i++) {\n    if (a[i] !== b[i]) return a[i] - b[i];\n  }\n  return a.length - b.length;\n}\n\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n  return a.length === b.length && compareBytes(a, b) === 0;\n}\n\nexport function concatBytes(parts: Uint8Array[]): Uint8Array<ArrayBuffer> {\n  let n = 0;\n  for (const p of parts) n += p.length;\n  const out = new Uint8Array(n);\n  let o = 0;\n  for (const p of parts) {\n    out.set(p, o);\n    o += p.length;\n  }\n  return out;\n}\n\nconst UTF8 = new TextEncoder();\nconst UTF8_STRICT = new TextDecoder('utf-8', { fatal: true });\n\nexport function utf8(s: string): Uint8Array<ArrayBuffer> {\n  return UTF8.encode(s) as Uint8Array<ArrayBuffer>;\n}\n\n/** Decode UTF-8; null for bytes that are not UTF-8. */\nexport function utf8Decode(b: Uint8Array): string | null {\n  try {\n    return UTF8_STRICT.decode(b);\n  } catch {\n    return null;\n  }\n}\n\n/** Compare two names the way the format orders siblings: as UTF-8 bytes. */\nexport function compareNames(a: string, b: string): number {\n  return compareBytes(utf8(a), utf8(b));\n}\n\n// ---------------------------------------------------------------------\n// uvarint: unsigned LEB128, minimal, at most 2^53 - 1\n// ---------------------------------------------------------------------\n\n/** Encode `n` as a uvarint. Throws for a value the format cannot carry. */\nexport function uvarint(n: number): Uint8Array<ArrayBuffer> {\n  if (!Number.isSafeInteger(n) || n < 0) throw new VaultFormatError('uvarint_range', `vault: uvarint out of range: ${n}`);\n  const out: number[] = [];\n  let v = n;\n  for (;;) {\n    const low = v % 128;\n    v = Math.floor(v / 128);\n    if (v === 0) {\n      out.push(low);\n      break;\n    }\n    out.push(low | 0x80);\n  }\n  return new Uint8Array(out);\n}\n\n/** A growable byte buffer for building a body. */\nexport class ByteWriter {\n  private buf = new Uint8Array(1024);\n  length = 0;\n\n  private room(n: number): void {\n    if (this.length + n <= this.buf.length) return;\n    let cap = this.buf.length * 2;\n    while (cap < this.length + n) cap *= 2;\n    const next = new Uint8Array(cap);\n    next.set(this.buf.subarray(0, this.length));\n    this.buf = next;\n  }\n\n  byte(b: number): void {\n    this.room(1);\n    this.buf[this.length++] = b & 0xff;\n  }\n\n  bytes(b: Uint8Array): void {\n    this.room(b.length);\n    this.buf.set(b, this.length);\n    this.length += b.length;\n  }\n\n  uvarint(n: number): void {\n    this.bytes(uvarint(n));\n  }\n\n  /** The bytes written, as a fresh buffer. */\n  done(): Uint8Array<ArrayBuffer> {\n    return this.buf.slice(0, this.length);\n  }\n}\n\n/** Reads a body front to back; every read past the end is `truncated`. */\nexport class ByteReader {\n  pos = 0;\n\n  constructor(\n    private readonly b: Uint8Array,\n    private readonly end: number = b.length,\n  ) {}\n\n  get left(): number {\n    return this.end - this.pos;\n  }\n\n  byte(): number {\n    if (this.pos >= this.end) throw new VaultFormatError('truncated');\n    return this.b[this.pos++];\n  }\n\n  bytes(n: number): Uint8Array<ArrayBuffer> {\n    if (!Number.isSafeInteger(n) || n < 0 || this.pos + n > this.end) throw new VaultFormatError('truncated');\n    const out = this.b.slice(this.pos, this.pos + n) as Uint8Array<ArrayBuffer>;\n    this.pos += n;\n    return out;\n  }\n\n  /** A minimal uvarint of at most 2^53 - 1; anything else is refused. */\n  uvarint(): number {\n    let value = 0;\n    let scale = 1;\n    for (let i = 0; ; i++) {\n      // 2^53 - 1 needs 8 bytes; a 9th is always too large.\n      if (i >= 8) throw new VaultFormatError('uvarint_range');\n      const b = this.byte();\n      value += (b & 0x7f) * scale;\n      if ((b & 0x80) === 0) {\n        if (i > 0 && b === 0) throw new VaultFormatError('uvarint_nonminimal');\n        break;\n      }\n      scale *= 128;\n    }\n    if (value > VAULT_UVARINT_MAX) throw new VaultFormatError('uvarint_range');\n    return value;\n  }\n}\n\n/** Decode one uvarint from the start of `b`: its value and its length. */\nexport function readUvarint(b: Uint8Array): { value: number; length: number } {\n  const r = new ByteReader(b);\n  const value = r.uvarint();\n  return { value, length: r.pos };\n}\n\n// ---------------------------------------------------------------------\n// Padmé and the index file's size\n// ---------------------------------------------------------------------\n\nfunction bitLength(n: number): number {\n  let b = 0;\n  let v = n;\n  while (v >= 1) {\n    b++;\n    v = Math.floor(v / 2);\n  }\n  return b;\n}\n\n/**\n * Padmé (Nikitin et al., PETS 2019): `E = ⌊log2 L⌋`, `S = ⌊log2 E⌋ + 1`,\n * `step = 2^(E - S)`, the length rounded up to a multiple of `step`.\n */\nexport function padme(L: number): number {\n  if (!Number.isSafeInteger(L) || L < 1) throw new VaultFormatError('padme_range');\n  const E = bitLength(L) - 1;\n  const S = bitLength(E);\n  const step = 2 ** Math.max(0, E - S);\n  return Math.ceil(L / step) * step;\n}\n\n/** The size of the index file that holds a body of `bodyLen` bytes. */\nexport function indexFileSize(bodyLen: number): number {\n  return Math.max(VAULT_INDEX_MIN_SIZE, padme(VAULT_INDEX_HEADER_LEN + bodyLen + VAULT_TAG_LEN));\n}\n\n/** 65 536 ≤ n ≤ 64 MiB and Padmé(n) = n: the sizes an index file can have. */\nexport function validIndexFileSize(n: number): boolean {\n  return Number.isSafeInteger(n) && n >= VAULT_INDEX_MIN_SIZE && n <= VAULT_INDEX_READ_MAX && padme(n) === n;\n}\n\n// ---------------------------------------------------------------------\n// Paths (relative to the vault folder)\n// ---------------------------------------------------------------------\n\n/** `v/p/b0/b067….fxp`: a pack, by its 16-byte id. */\nexport function packPath(id: Uint8Array | string): string {\n  const h = typeof id === 'string' ? id : toHex(id);\n  return `v/p/${h.slice(0, 2)}/${h}.fxp`;\n}\n\n/** `v/idx/0000000000000003.fxi`: the index of one generation. */\nexport function indexPath(gen: number): string {\n  return `v/idx/${generationHex(gen)}.fxi`;\n}\n\n/** A generation as 16 lower-case hex digits. */\nexport function generationHex(gen: number): string {\n  if (!Number.isSafeInteger(gen) || gen < 0) throw new VaultFormatError('generation_range');\n  return gen.toString(16).padStart(16, '0');\n}\n\nexport type VaultPathKind = 'other' | 'keyfile' | 'pack' | 'index' | 'temp';\n\n/** What a path relative to the vault root is (the Go `ParseVaultPath`). */\nexport function parseVaultPath(rel: string): { kind: VaultPathKind; id?: string; gen?: number } {\n  const p = String(rel ?? '').replace(/^\\/+/, '');\n  if (p === '.filex-e2e.json') return { kind: 'keyfile' };\n  let m = /^v\\/p\\/([0-9a-f]{2})\\/([0-9a-f]{32})\\.fxp$/.exec(p);\n  if (m && m[2].startsWith(m[1])) return { kind: 'pack', id: m[2] };\n  m = /^v\\/idx\\/([0-9a-f]{16})\\.fxi$/.exec(p);\n  if (m) {\n    const gen = parseInt(m[1], 16);\n    if (Number.isSafeInteger(gen)) return { kind: 'index', gen };\n    return { kind: 'other' };\n  }\n  if (/^v\\/idx\\/\\.tmp-[^/]+$/.test(p)) return { kind: 'temp' };\n  return { kind: 'other' };\n}\n\n/** A valid pack id in its wire spelling: 32 lower-case hex digits. */\nexport function isPackIdHex(s: unknown): s is string {\n  return typeof s === 'string' && /^[0-9a-f]{32}$/.test(s);\n}\n\n/** The number of bytes of a pack's data area. */\nexport function packDataSize(packLog2: number): number {\n  return 2 ** packLog2 - VAULT_PACK_HEADER_LEN;\n}\n\n/** A chunk size a reader accepts. */\nexport function validChunkLog2(n: unknown): n is number {\n  return typeof n === 'number' && Number.isInteger(n) && n >= VAULT_MIN_CHUNK_LOG2 && n <= VAULT_MAX_CHUNK_LOG2;\n}\n\n/** STREAM body length of `size` plaintext bytes in chunks of 2^log2. */\nexport function streamBodySize(size: number, log2: number): number {\n  return size + VAULT_TAG_LEN * Math.max(1, Math.ceil(size / 2 ** log2));\n}\n\n/**\n * The rules a name must meet (docs/E2E-VAULT-FORMAT.md → \"Index body\",\n * `name`): 1 to 255 UTF-8 bytes; not `.` or `..`; no `/`, `\\`, 0x00-0x1F or\n * 0x7F. Null when it meets them, else what is wrong.\n */\nexport function vaultNameProblem(bytes: Uint8Array): 'empty' | 'too_long' | 'dot' | 'slash' | 'control' | null {\n  if (bytes.length === 0) return 'empty';\n  if (bytes.length > VAULT_NAME_MAX) return 'too_long';\n  if (bytes.length === 1 && bytes[0] === 0x2e) return 'dot';\n  if (bytes.length === 2 && bytes[0] === 0x2e && bytes[1] === 0x2e) return 'dot';\n  for (let i = 0; i < bytes.length; i++) {\n    const c = bytes[i];\n    if (c === 0x2f || c === 0x5c) return 'slash';\n    if (c <= 0x1f || c === 0x7f) return 'control';\n  }\n  return null;\n}\n","/**\n * e2evault/keys — the vault's key schedule (docs/E2E-VAULT-FORMAT.md → \"Keys\n * and the nonce rule\").\n *\n *   FMK (32 bytes, from a key slot)\n *    |- HKDF-SHA-256(IKM = FMK, salt = vault id,\n *    |               info = \"filex-vault-index-v1\"   ‖ seal id)     -> index key\n *    '- HKDF-SHA-256(IKM = FMK, salt = vault id,\n *                    info = \"filex-vault-content-v1\" ‖ content id)  -> content key\n *\n * A vault's FMK is imported ONCE as a non-extractable HKDF key and its bytes\n * are zeroed (lib/e2ecrypto does that on every unlock of a vault key file).\n * It never encrypts anything itself. Every AES-GCM key derived here encrypts\n * exactly one plaintext: an index file, or one version of one file.\n *\n * WebCrypto only.\n */\nimport {\n  VAULT_ID_LEN,\n  VAULT_INFO_CONTENT,\n  VAULT_INFO_INDEX,\n  bufferView,\n  concatBytes,\n  utf8,\n} from './layout';\n\n/**\n * Import the raw 32 FMK bytes as the vault's HKDF key. Non-extractable; the\n * caller zeroes `raw` afterwards.\n */\nexport async function importVaultFmk(raw: Uint8Array): Promise<CryptoKey> {\n  if (raw.length !== 32) throw new Error('vault: the folder master key must be 32 bytes');\n  return crypto.subtle.importKey('raw', bufferView(raw), 'HKDF', false, ['deriveKey', 'deriveBits']);\n}\n\n/** True for a key `importVaultFmk` made (what the key ring holds for a vault). */\nexport function isVaultFmk(key: CryptoKey | null | undefined): key is CryptoKey {\n  return !!key && key.algorithm?.name === 'HKDF';\n}\n\nfunction hkdfParams(vaultId: Uint8Array, label: string, id: Uint8Array): HkdfParams {\n  if (vaultId.length !== VAULT_ID_LEN) throw new Error('vault: a vault id is 16 bytes');\n  if (id.length !== 16) throw new Error('vault: a seal or content id is 16 bytes');\n  return {\n    name: 'HKDF',\n    hash: 'SHA-256',\n    salt: bufferView(vaultId),\n    info: concatBytes([utf8(label), id]),\n  };\n}\n\nasync function deriveAes(\n  fmk: CryptoKey,\n  vaultId: Uint8Array,\n  label: string,\n  id: Uint8Array,\n  usages: KeyUsage[],\n): Promise<CryptoKey> {\n  return crypto.subtle.deriveKey(hkdfParams(vaultId, label, id), fmk, { name: 'AES-GCM', length: 256 }, false, usages);\n}\n\n/** The AES-256-GCM key of the index file sealed under `sealId`. */\nexport function indexKey(fmk: CryptoKey, vaultId: Uint8Array, sealId: Uint8Array): Promise<CryptoKey> {\n  return deriveAes(fmk, vaultId, VAULT_INFO_INDEX, sealId, ['encrypt', 'decrypt']);\n}\n\n/** The AES-256-GCM key of the file version written under `contentId`. */\nexport function contentKey(fmk: CryptoKey, vaultId: Uint8Array, contentId: Uint8Array): Promise<CryptoKey> {\n  return deriveAes(fmk, vaultId, VAULT_INFO_CONTENT, contentId, ['encrypt', 'decrypt']);\n}\n\n/**\n * The same 32 bytes as `indexKey` / `contentKey`, raw — for the test vectors\n * only (the vectors list `index_key` and `content_key`). Nothing in the\n * product reads a derived key's bytes.\n */\nexport async function deriveVaultKeyBits(\n  fmk: CryptoKey,\n  vaultId: Uint8Array,\n  kind: 'index' | 'content',\n  id: Uint8Array,\n): Promise<Uint8Array<ArrayBuffer>> {\n  const label = kind === 'index' ? VAULT_INFO_INDEX : VAULT_INFO_CONTENT;\n  return new Uint8Array(await crypto.subtle.deriveBits(hkdfParams(vaultId, label, id), fmk, 256));\n}\n","/**\n * e2evault/pack — packs: the header, the canonical way bytes go into them,\n * and mapping a span of a file's body onto its extents\n * (docs/E2E-VAULT-FORMAT.md → \"Packs\", \"File contents\").\n *\n * A pack is exactly 2^`vault.pack` bytes: a 32-byte plaintext header, then\n * extents of encrypted file contents back to back, then random padding (never\n * zeros: zeros would show the server how full every pack is). A pack is\n * uploaded whole, once, and never changed.\n */\nimport {\n  VAULT_FORMAT,\n  VAULT_KIND_PACK,\n  VAULT_MAGIC,\n  VAULT_PACK_HEADER_LEN,\n  VaultFormatError,\n  fromHex,\n  packDataSize,\n  toHex,\n} from './layout';\nimport type { VaultExtent } from './vindex';\n\n/** The 32-byte header of pack `id` (hex) of size 2^`packLog2`. */\nexport function buildPackHeader(id: string, packLog2: number): Uint8Array<ArrayBuffer> {\n  const raw = fromHex(id);\n  if (!raw || raw.length !== 16) throw new VaultFormatError('bad_id');\n  const h = new Uint8Array(VAULT_PACK_HEADER_LEN);\n  h.set(VAULT_MAGIC, 0);\n  h[8] = VAULT_FORMAT;\n  h[9] = VAULT_KIND_PACK;\n  h[10] = packLog2;\n  // [11..16) zero\n  h.set(raw, 16);\n  return h;\n}\n\n/**\n * Check a whole pack's header (magic, version 1, kind P, the log2, the five\n * zeros, the id). A reader that fetches byte ranges never sees it; one that\n * holds the whole pack checks it. Throws VaultFormatError: damage.\n */\nexport function checkPackHeader(b: Uint8Array, id: string, packLog2: number): void {\n  if (b.length < VAULT_PACK_HEADER_LEN) throw new VaultFormatError('pack_short');\n  for (let i = 0; i < 8; i++) if (b[i] !== VAULT_MAGIC[i]) throw new VaultFormatError('pack_magic');\n  if (b[8] !== VAULT_FORMAT) throw new VaultFormatError('pack_version');\n  if (b[9] !== VAULT_KIND_PACK) throw new VaultFormatError('pack_kind');\n  if (b[10] !== packLog2) throw new VaultFormatError('pack_log2');\n  for (let i = 11; i < 16; i++) if (b[i] !== 0) throw new VaultFormatError('pack_zeros');\n  if (toHex(b.subarray(16, 32)) !== id) throw new VaultFormatError('pack_id');\n  if (b.length !== 2 ** packLog2) throw new VaultFormatError('pack_size');\n}\n\n/** A pack being filled in memory. `data` is the data area (no header). */\nexport interface OpenPack {\n  /** Its id (hex). May change once, when an upload of unknown outcome is\n   *  sent again under a new id. */\n  id: string;\n  data: Uint8Array<ArrayBuffer>;\n  used: number;\n}\n\nexport function openPack(id: string, packLog2: number): OpenPack {\n  return { id, data: new Uint8Array(packDataSize(packLog2)), used: 0 };\n}\n\n/** The whole pack: header and data area. */\nexport function packBytes(p: OpenPack, packLog2: number): Uint8Array<ArrayBuffer> {\n  const out = new Uint8Array(2 ** packLog2);\n  out.set(buildPackHeader(p.id, packLog2), 0);\n  out.set(p.data, VAULT_PACK_HEADER_LEN);\n  return out;\n}\n\n/** One run of bytes inside one pack: what one HTTP range request fetches. */\nexport interface PackRun {\n  pack: string;\n  /** Offset within the pack (header included). */\n  offset: number;\n  length: number;\n}\n\n/**\n * Map bytes `[start, end)` of a body onto its extents: the runs, in order,\n * whose bytes joined are that span. Adjacent runs in one pack are merged.\n */\nexport function mapBodySpan(extents: VaultExtent[], start: number, end: number): PackRun[] {\n  const runs: PackRun[] = [];\n  let pos = 0;\n  for (const x of extents) {\n    const xs = pos;\n    const xe = pos + x.length;\n    pos = xe;\n    if (xe <= start) continue;\n    if (xs >= end) break;\n    const a = Math.max(start, xs);\n    const b = Math.min(end, xe);\n    const run = { pack: x.pack, offset: x.offset + (a - xs), length: b - a };\n    const last = runs[runs.length - 1];\n    if (last && last.pack === run.pack && last.offset + last.length === run.offset) last.length += run.length;\n    else runs.push(run);\n  }\n  return runs;\n}\n\n/** Merge extents that follow each other in one pack (writers make them maximal). */\nexport function mergeExtents(extents: VaultExtent[]): VaultExtent[] {\n  const out: VaultExtent[] = [];\n  for (const x of extents) {\n    const last = out[out.length - 1];\n    if (last && last.pack === x.pack && last.offset + last.length === x.offset) last.length += x.length;\n    else out.push({ ...x });\n  }\n  return out;\n}\n\n/**\n * The STREAM chunks a plaintext span `[a, b)` needs, and the body span that\n * holds their ciphertext (docs/E2E-VAULT-FORMAT.md → \"Reading bytes [a, b)\").\n */\nexport function chunkSpan(\n  size: number,\n  log2: number,\n  a: number,\n  b: number,\n): { first: number; last: number; start: number; end: number; count: number } {\n  const chunk = 2 ** log2;\n  const full = chunk + 16;\n  const count = Math.max(1, Math.ceil(size / chunk));\n  const bodyLen = size + 16 * count;\n  const first = Math.floor(a / chunk);\n  const last = Math.floor((b - 1) / chunk);\n  return { first, last, start: first * full, end: Math.min((last + 1) * full, bodyLen), count };\n}\n","/**\n * e2evault/vindex — the index body: the vault's tree, its pack table and its\n * graveyard (docs/E2E-VAULT-FORMAT.md → \"Index body\", \"Canonical order\").\n *\n * One encoding per tree: two writers that agree on a tree, its pack table and\n * its graveyard write the same bytes. The decoder is the reader's half and\n * checks every rule of the format in one pass; a body that breaks one is\n * damaged (VaultFormatError with the rule's code).\n *\n * The tree is kept as a map from path (`Belgeler/Arşiv/büyük.bin`, NFC, no\n * leading slash) to its node. Pack and content ids travel as lower-case hex:\n * for ids of one length, string order is byte order.\n */\nimport {\n  ByteReader,\n  ByteWriter,\n  VAULT_CONTENT_NONE,\n  VAULT_CONTENT_STREAM,\n  VAULT_ENTRIES_READ_MAX,\n  VAULT_ENTRY_FILE,\n  VAULT_ENTRY_FOLDER,\n  VAULT_FORMAT,\n  VAULT_MAX_DEPTH,\n  VAULT_PACK_HEADER_LEN,\n  VaultFormatError,\n  compareBytes,\n  fromHex,\n  streamBodySize,\n  toHex,\n  utf8,\n  utf8Decode,\n  validChunkLog2,\n  vaultNameProblem,\n} from './layout';\n\nexport interface VaultExtent {\n  /** The pack's id, 32 lower-case hex digits. */\n  pack: string;\n  offset: number;\n  length: number;\n}\n\nexport interface VaultContent {\n  /** The content id (16 bytes, hex): what the content key is derived from. */\n  id: string;\n  /** STREAM chunk size, log2 (writers: 20). */\n  log2: number;\n  extents: VaultExtent[];\n}\n\nexport interface VaultNode {\n  /** `Belgeler/Arşiv/büyük.bin`: names joined by `/`, no leading slash. */\n  path: string;\n  /** The parent's path; '' = the vault root. */\n  parent: string;\n  name: string;\n  kind: typeof VAULT_ENTRY_FOLDER | typeof VAULT_ENTRY_FILE;\n  /** Milliseconds since 1970 (0 for anything earlier). */\n  mtime: number;\n  /** Plaintext bytes; 0 for a folder. */\n  size: number;\n  /** Null for a folder and for a file of 0 bytes. */\n  content: VaultContent | null;\n  /** Extension bytes a newer writer left on this entry (format 1 writes none). */\n  ext?: Uint8Array;\n}\n\nexport type VaultTree = Map<string, VaultNode>;\n\nexport interface VaultGrave {\n  pack: string;\n  died: number;\n}\n\n/** One generation, decoded. */\nexport interface VaultIndexState {\n  generation: number;\n  tree: VaultTree;\n  /** The pack table: every pack an extent uses, ascending. */\n  packs: string[];\n  /** Packs the tree no longer uses that a kept older generation may. */\n  grave: VaultGrave[];\n  /** A newer filex wrote extension bytes somewhere: this build only reads. */\n  hasExt: boolean;\n  /** The body's length (the rest of the plaintext is zero padding). */\n  bodyLen: number;\n}\n\nexport function joinVaultPath(parent: string, name: string): string {\n  return parent ? `${parent}/${name}` : name;\n}\n\nexport function splitVaultPath(path: string): { parent: string; name: string } {\n  const i = path.lastIndexOf('/');\n  return i < 0 ? { parent: '', name: path } : { parent: path.slice(0, i), name: path.slice(i + 1) };\n}\n\n/** A tree's copy: the nodes are copied, their contents shared (never mutated). */\nexport function cloneTree(tree: VaultTree): VaultTree {\n  const t: VaultTree = new Map();\n  for (const [k, e] of tree) t.set(k, { ...e });\n  return t;\n}\n\n/** The children of every folder, each list in byte order of the names. */\nexport function childrenOf(tree: VaultTree): Map<string, VaultNode[]> {\n  const kids = new Map<string, VaultNode[]>();\n  const bytes = new Map<VaultNode, Uint8Array>();\n  for (const e of tree.values()) {\n    let list = kids.get(e.parent);\n    if (!list) kids.set(e.parent, (list = []));\n    list.push(e);\n    bytes.set(e, utf8(e.name));\n  }\n  for (const list of kids.values()) list.sort((a, b) => compareBytes(bytes.get(a)!, bytes.get(b)!));\n  return kids;\n}\n\n/** Entries in canonical order: pre-order, siblings by the bytes of their name. */\nexport function canonicalOrder(tree: VaultTree): VaultNode[] {\n  const kids = childrenOf(tree);\n  const out: VaultNode[] = [];\n  const walk = (p: string) => {\n    for (const e of kids.get(p) ?? []) {\n      out.push(e);\n      if (e.kind === VAULT_ENTRY_FOLDER) walk(e.path);\n    }\n  };\n  walk('');\n  return out;\n}\n\n/** The pack table of a tree: every pack an extent uses, each once, ascending. */\nexport function packTableOf(tree: VaultTree): string[] {\n  const ids = new Set<string>();\n  for (const e of tree.values()) for (const x of e.content?.extents ?? []) ids.add(x.pack);\n  return [...ids].sort();\n}\n\n/** Depth of a path: the root's children are depth 1. */\nexport function depthOf(path: string): number {\n  return path ? path.split('/').length : 0;\n}\n\n// ---------------------------------------------------------------------\n// Encoding\n// ---------------------------------------------------------------------\n\n/**\n * The canonical body of a tree and a graveyard. A format-1 writer writes no\n * extension bytes; a tree that carries some is never written (the caller\n * refuses first — `VaultIndexState.hasExt`).\n */\nexport function encodeIndexBody(tree: VaultTree, grave: VaultGrave[]): { body: Uint8Array<ArrayBuffer>; packs: string[]; entries: VaultNode[] } {\n  const entries = canonicalOrder(tree);\n  const packs = packTableOf(tree);\n  const packPos = new Map(packs.map((p, i) => [p, i]));\n  const pos = new Map(entries.map((e, i) => [e.path, i + 1]));\n  const w = new ByteWriter();\n  w.byte(VAULT_FORMAT);\n  w.uvarint(0); // flags\n  w.uvarint(packs.length);\n  for (const p of packs) w.bytes(hexId(p));\n  w.uvarint(entries.length);\n  for (const e of entries) {\n    const name = utf8(e.name);\n    w.byte(e.kind);\n    w.uvarint(e.parent === '' ? 0 : pos.get(e.parent)!);\n    w.uvarint(name.length);\n    w.bytes(name);\n    w.uvarint(Math.max(0, Math.floor(e.mtime)));\n    if (e.kind === VAULT_ENTRY_FILE) {\n      w.uvarint(e.size);\n      if (e.content) {\n        w.byte(VAULT_CONTENT_STREAM);\n        w.bytes(hexId(e.content.id));\n        w.byte(e.content.log2);\n        w.uvarint(e.content.extents.length);\n        for (const x of e.content.extents) {\n          w.uvarint(packPos.get(x.pack)!);\n          w.uvarint(x.offset);\n          w.uvarint(x.length);\n        }\n      } else {\n        w.byte(VAULT_CONTENT_NONE);\n      }\n    }\n    w.uvarint(0); // entry ext\n  }\n  const g = [...grave].sort((a, b) => (a.pack < b.pack ? -1 : a.pack > b.pack ? 1 : 0));\n  w.uvarint(g.length);\n  for (const x of g) {\n    w.bytes(hexId(x.pack));\n    w.uvarint(x.died);\n  }\n  w.uvarint(0); // body ext\n  return { body: w.done(), packs, entries };\n}\n\nfunction hexId(h: string): Uint8Array<ArrayBuffer> {\n  const b = fromHex(h);\n  if (!b || b.length !== 16) throw new VaultFormatError('bad_id', `vault: not a 16-byte id: ${h}`);\n  return b;\n}\n\n// ---------------------------------------------------------------------\n// Decoding\n// ---------------------------------------------------------------------\n\nexport interface DecodeOptions {\n  /** The generation this body claims to be (the graveyard's `died` ≤ it). */\n  generation: number;\n  /** The vault's pack size, log2 (extents stay inside one pack). */\n  packLog2: number;\n}\n\n/**\n * Decode an index file's plaintext: the body, then zero bytes. Throws\n * VaultFormatError for anything the format does not allow.\n */\nexport function decodeIndexPlaintext(plain: Uint8Array, opts: DecodeOptions): VaultIndexState {\n  const r = new ByteReader(plain);\n  const packEnd = 2 ** opts.packLog2;\n\n  const version = r.byte();\n  if (version !== VAULT_FORMAT) throw new VaultFormatError('body_version', `vault: index body version ${version}`);\n  const flags = r.uvarint();\n  if (flags !== 0) throw new VaultFormatError('flags_unknown', `vault: unknown required feature flags ${flags.toString(2)}`);\n\n  const packCount = r.uvarint();\n  const packs: string[] = [];\n  for (let i = 0; i < packCount; i++) {\n    const id = toHex(r.bytes(16));\n    if (i > 0 && !(packs[i - 1] < id)) throw new VaultFormatError('pack_table_order');\n    packs.push(id);\n  }\n  const packUsed = new Uint8Array(packCount);\n\n  const entryCount = r.uvarint();\n  if (entryCount > VAULT_ENTRIES_READ_MAX) throw new VaultFormatError('too_many_entries');\n\n  const tree: VaultTree = new Map();\n  // Per entry (1-based): its path, whether it is a folder, its depth.\n  const paths: string[] = [''];\n  const isFolder: boolean[] = [true];\n  const depth: number[] = [0];\n  const lastName = new Map<number, Uint8Array>();\n  const chain: number[] = [];\n  let hasExt = false;\n\n  for (let i = 1; i <= entryCount; i++) {\n    const kind = r.byte();\n    if (kind !== VAULT_ENTRY_FOLDER && kind !== VAULT_ENTRY_FILE) throw new VaultFormatError('entry_kind');\n    const parent = r.uvarint();\n    const nameLen = r.uvarint();\n    const nameBytes = r.bytes(nameLen);\n    const mtime = r.uvarint();\n\n    // Where it hangs: an earlier folder on the chain we are inside.\n    if (parent > 0) {\n      if (parent >= i) throw new VaultFormatError('parent_forward');\n      if (!isFolder[parent]) throw new VaultFormatError('parent_is_file');\n      while (chain.length > 0 && chain[chain.length - 1] !== parent) chain.pop();\n      if (chain.length === 0) throw new VaultFormatError('not_preorder');\n    } else {\n      chain.length = 0;\n    }\n    const problem = vaultNameProblem(nameBytes);\n    if (problem) throw new VaultFormatError(`name_${problem}`);\n    const prev = lastName.get(parent);\n    if (prev && compareBytes(prev, nameBytes) >= 0) {\n      throw new VaultFormatError(compareBytes(prev, nameBytes) === 0 ? 'duplicate_name' : 'sibling_order');\n    }\n    lastName.set(parent, nameBytes);\n    const name = utf8Decode(nameBytes);\n    if (name === null) throw new VaultFormatError('name_utf8');\n    const d = depth[parent] + 1;\n    if (d > VAULT_MAX_DEPTH) throw new VaultFormatError('too_deep');\n\n    let size = 0;\n    let content: VaultContent | null = null;\n    if (kind === VAULT_ENTRY_FILE) {\n      size = r.uvarint();\n      const ck = r.byte();\n      if (ck === VAULT_CONTENT_NONE) {\n        if (size !== 0) throw new VaultFormatError('sized_without_content');\n      } else if (ck === VAULT_CONTENT_STREAM) {\n        if (size === 0) throw new VaultFormatError('empty_with_content');\n        const id = toHex(r.bytes(16));\n        const log2 = r.byte();\n        if (!validChunkLog2(log2)) throw new VaultFormatError('chunk_log2');\n        const n = r.uvarint();\n        if (n < 1) throw new VaultFormatError('no_extents');\n        const extents: VaultExtent[] = [];\n        let total = 0;\n        for (let k = 0; k < n; k++) {\n          const p = r.uvarint();\n          const offset = r.uvarint();\n          const length = r.uvarint();\n          if (p >= packCount) throw new VaultFormatError('extent_pack_index');\n          if (length < 1) throw new VaultFormatError('extent_empty');\n          if (offset < VAULT_PACK_HEADER_LEN) throw new VaultFormatError('extent_in_header');\n          if (offset + length > packEnd) throw new VaultFormatError('extent_past_pack');\n          packUsed[p] = 1;\n          total += length;\n          extents.push({ pack: packs[p], offset, length });\n        }\n        if (total !== streamBodySize(size, log2)) throw new VaultFormatError('extent_sum');\n        content = { id, log2, extents };\n      } else {\n        throw new VaultFormatError('content_kind', `vault: content kind ${ck} is not known to this filex`);\n      }\n    }\n    const extLen = r.uvarint();\n    const ext = r.bytes(extLen);\n    if (extLen > 0) hasExt = true;\n\n    const parentPath = paths[parent];\n    const path = parentPath ? `${parentPath}/${name}` : name;\n    paths.push(path);\n    isFolder.push(kind === VAULT_ENTRY_FOLDER);\n    depth.push(d);\n    if (kind === VAULT_ENTRY_FOLDER) chain.push(i);\n    const node: VaultNode = { path, parent: parentPath, name, kind: kind as VaultNode['kind'], mtime, size, content };\n    if (extLen > 0) node.ext = ext;\n    tree.set(path, node);\n  }\n\n  for (let p = 0; p < packCount; p++) if (!packUsed[p]) throw new VaultFormatError('pack_unreferenced');\n\n  const graveCount = r.uvarint();\n  const grave: VaultGrave[] = [];\n  const live = new Set(packs);\n  for (let i = 0; i < graveCount; i++) {\n    const id = toHex(r.bytes(16));\n    const died = r.uvarint();\n    if (i > 0 && !(grave[i - 1].pack < id)) throw new VaultFormatError('grave_order');\n    if (live.has(id)) throw new VaultFormatError('grave_in_table');\n    if (died < 2 || died > opts.generation) throw new VaultFormatError('grave_died');\n    grave.push({ pack: id, died });\n  }\n\n  const extLen = r.uvarint();\n  r.bytes(extLen);\n  if (extLen > 0) hasExt = true;\n\n  const bodyLen = r.pos;\n  for (let i = bodyLen; i < plain.length; i++) {\n    if (plain[i] !== 0) throw new VaultFormatError('nonzero_tail');\n  }\n  return { generation: opts.generation, tree, packs, grave, hasExt, bodyLen };\n}\n\n/** The empty tree of generation 1: `01 00 00 00 00 00`. */\nexport function emptyIndexState(generation = 0): VaultIndexState {\n  return { generation, tree: new Map(), packs: [], grave: [], hasExt: false, bodyLen: 6 };\n}\n\n/** How many live bytes each pack of the table holds (extents of `tree`). */\nexport function liveBytesByPack(tree: VaultTree): Map<string, number> {\n  const out = new Map<string, number>();\n  for (const e of tree.values()) {\n    for (const x of e.content?.extents ?? []) out.set(x.pack, (out.get(x.pack) ?? 0) + x.length);\n  }\n  return out;\n}\n","/**\n * e2evault/reader — opening index files, finding the generation to show, and\n * reading file contents by byte ranges (docs/E2E-VAULT-FORMAT.md → \"Index\n * file\", \"Reading\", \"File contents\").\n *\n * Nothing here talks HTTP: the caller hands in how to fetch an index file and\n * a byte range of a pack (lib/e2evault/api does it over the files API; a test\n * does it from the fixture on disk).\n */\nimport {\n  VAULT_FORMAT,\n  VAULT_INDEX_HEADER_LEN,\n  VAULT_INDEX_READ_MAX,\n  VAULT_KEEP_GENERATIONS,\n  VAULT_KIND_INDEX,\n  VAULT_MAGIC,\n  VaultFormatError,\n  bufferView,\n  concatBytes,\n  fromHex,\n  indexFileSize,\n  toHex,\n  validIndexFileSize,\n} from './layout';\nimport { contentKey, indexKey } from './keys';\nimport { chunkSpan, mapBodySpan } from './pack';\nimport { decodeIndexPlaintext, emptyIndexState, type VaultIndexState, type VaultNode } from './vindex';\n\n/** What every read of one vault needs. */\nexport interface VaultKeys {\n  /** The FMK as an HKDF key (lib/e2evault/keys importVaultFmk). */\n  fmk: CryptoKey;\n  /** The 16 raw bytes of `vault.id`. */\n  vaultId: Uint8Array;\n  /** `vault.pack`. */\n  packLog2: number;\n}\n\n/** Read the generation an index file's header names (bytes 16-23, big-endian). */\nexport function indexHeaderGeneration(b: Uint8Array): number {\n  const dv = new DataView(b.buffer, b.byteOffset, b.byteLength);\n  const hi = dv.getUint32(16, false);\n  const lo = dv.getUint32(20, false);\n  return hi * 2 ** 32 + lo;\n}\n\n/** The 40-byte plaintext header of an index file of generation `gen`. */\nexport function buildIndexHeader(gen: number, sealId: Uint8Array): Uint8Array<ArrayBuffer> {\n  if (!Number.isSafeInteger(gen) || gen < 0) throw new VaultFormatError('generation_range');\n  if (sealId.length !== 16) throw new VaultFormatError('bad_id');\n  const h = new Uint8Array(VAULT_INDEX_HEADER_LEN);\n  h.set(VAULT_MAGIC, 0);\n  h[8] = VAULT_FORMAT;\n  h[9] = VAULT_KIND_INDEX;\n  const dv = new DataView(h.buffer);\n  dv.setUint32(16, Math.floor(gen / 2 ** 32), false);\n  dv.setUint32(20, gen >>> 0, false);\n  h.set(sealId, 24);\n  return h;\n}\n\n/**\n * What the server can check of an index file without the key: magic,\n * version, kind, the six zeros, the generation, and a Padmé size.\n */\nexport function checkIndexHeader(b: Uint8Array, gen: number): void {\n  if (b.length > VAULT_INDEX_READ_MAX) throw new VaultFormatError('index_too_large');\n  if (!validIndexFileSize(b.length)) throw new VaultFormatError('index_size');\n  for (let i = 0; i < 8; i++) if (b[i] !== VAULT_MAGIC[i]) throw new VaultFormatError('index_magic');\n  if (b[8] !== VAULT_FORMAT) throw new VaultFormatError('index_version');\n  if (b[9] !== VAULT_KIND_INDEX) throw new VaultFormatError('index_kind');\n  for (let i = 10; i < 16; i++) if (b[i] !== 0) throw new VaultFormatError('index_zeros');\n  if (indexHeaderGeneration(b) !== gen) throw new VaultFormatError('index_generation');\n}\n\n/**\n * Open the index file of generation `gen`: check the header, decrypt with\n * the index key of its seal id (associated data = bytes 0 to 39), decode the\n * body, and check the file is the padded size of the body it holds. Throws\n * VaultFormatError (\"damaged\") for anything wrong.\n */\nexport async function openIndexFile(keys: VaultKeys, gen: number, file: Uint8Array): Promise<VaultIndexState> {\n  // Before anything is decrypted: a reader refuses an index over 64 MiB.\n  if (file.length > VAULT_INDEX_READ_MAX) throw new VaultFormatError('index_too_large');\n  checkIndexHeader(file, gen);\n  const header = file.subarray(0, VAULT_INDEX_HEADER_LEN);\n  const sealId = file.slice(24, 40);\n  const key = await indexKey(keys.fmk, keys.vaultId, sealId);\n  let plain: Uint8Array;\n  try {\n    plain = new Uint8Array(\n      await crypto.subtle.decrypt(\n        { name: 'AES-GCM', iv: new Uint8Array(12), additionalData: bufferView(header.slice()) },\n        key,\n        bufferView(file.subarray(VAULT_INDEX_HEADER_LEN)),\n      ),\n    );\n  } catch {\n    throw new VaultFormatError('index_tag', 'vault: the index file does not verify');\n  }\n  const state = decodeIndexPlaintext(plain, { generation: gen, packLog2: keys.packLog2 });\n  if (file.length !== indexFileSize(state.bodyLen)) throw new VaultFormatError('index_size');\n  return state;\n}\n\n// ---------------------------------------------------------------------\n// The generation to show\n// ---------------------------------------------------------------------\n\n/** Where index files come from. */\nexport interface VaultIndexSource {\n  /** The bytes of `v/idx/G.fxi`, or null when there is no such file. */\n  fetchIndex(gen: number): Promise<Uint8Array | null>;\n  /** The generations present (from a listing), any order. Optional. */\n  listGenerations?(): Promise<number[]>;\n  /** Are there packs at all? Asked only when there is no index file. */\n  hasPacks?(): Promise<boolean>;\n  /** Waits before the second try of a damaged latest. Default: setTimeout. */\n  sleep?(ms: number): Promise<void>;\n}\n\n/** The vault cannot be shown at all: no index verifies, or packs and no index. */\nexport class VaultDamagedError extends Error {\n  constructor(public readonly code: 'no_index_but_packs' | 'nothing_verifies') {\n    super(`vault: ${code}`);\n    this.name = 'VaultDamagedError';\n  }\n}\n\nexport interface LoadedGeneration {\n  /** The generation shown. Generation 0 is a vault whose creation stopped\n   *  half way: no index file and no pack. */\n  state: VaultIndexState;\n  /** The newest generation the server names. */\n  latest: number;\n  /** The newest generation did not verify: an older one is shown, read-only. */\n  damagedLatest: boolean;\n}\n\n/** How long to wait before fetching a damaged latest once more. */\nexport const DAMAGED_RETRY_MS = 2000;\n\n/**\n * Load the generation to show: the latest; if it does not verify, the same\n * file once more after 2 seconds (a commit may be landing on a storage\n * without an atomic rename); then the newest older generation that verifies,\n * read-only.\n */\nexport async function loadLatestGeneration(keys: VaultKeys, latest: number, src: VaultIndexSource): Promise<LoadedGeneration> {\n  if (latest <= 0) {\n    if (src.hasPacks && (await src.hasPacks())) throw new VaultDamagedError('no_index_but_packs');\n    return { state: emptyIndexState(0), latest: 0, damagedLatest: false };\n  }\n  const tryOpen = async (gen: number): Promise<VaultIndexState | null> => {\n    const file = await src.fetchIndex(gen);\n    if (!file) return null;\n    try {\n      return await openIndexFile(keys, gen, file);\n    } catch (err) {\n      if (err instanceof VaultFormatError) return null;\n      throw err;\n    }\n  };\n  let state = await tryOpen(latest);\n  if (state) return { state, latest, damagedLatest: false };\n  await (src.sleep ?? defaultSleep)(DAMAGED_RETRY_MS);\n  state = await tryOpen(latest);\n  if (state) return { state, latest, damagedLatest: false };\n\n  let older: number[];\n  if (src.listGenerations) {\n    older = (await src.listGenerations()).filter((g) => g < latest).sort((a, b) => b - a);\n  } else {\n    older = [];\n    for (let g = latest - 1; g >= Math.max(1, latest - VAULT_KEEP_GENERATIONS - 2); g--) older.push(g);\n  }\n  for (const g of older) {\n    const s = await tryOpen(g);\n    if (s) return { state: s, latest, damagedLatest: true };\n  }\n  throw new VaultDamagedError('nothing_verifies');\n}\n\nfunction defaultSleep(ms: number): Promise<void> {\n  return new Promise((r) => setTimeout(r, ms));\n}\n\n/**\n * Rollback guard: within one session a client remembers the highest\n * generation it has seen of each vault; a lower one offered later is a\n * rollback, and the vault stays read-only.\n */\nexport function createRollbackGuard() {\n  const seen = new Map<string, number>();\n  return {\n    /** Note `gen` of the vault `id` (hex): false when it is a rollback. */\n    note(id: string, gen: number): boolean {\n      const was = seen.get(id) ?? 0;\n      if (gen < was) return false;\n      seen.set(id, gen);\n      return true;\n    },\n    highest(id: string): number {\n      return seen.get(id) ?? 0;\n    },\n    forget(id: string): void {\n      seen.delete(id);\n    },\n  };\n}\n\n/** The tab's guard: a reload is a new session. */\nexport const vaultRollbackGuard = createRollbackGuard();\n\n// ---------------------------------------------------------------------\n// Contents\n// ---------------------------------------------------------------------\n\n/** Fetch `length` bytes at `offset` of pack `pack` (hex). */\nexport type FetchRange = (pack: string, offset: number, length: number, signal?: AbortSignal) => Promise<Uint8Array>;\n\n/** A pack an extent needs is gone (deleted by a collection meanwhile). */\nexport class VaultPackMissingError extends Error {\n  constructor(public readonly pack: string) {\n    super(`vault: pack ${pack} is gone`);\n    this.name = 'VaultPackMissingError';\n  }\n}\n\n/** The 12-byte nonce of chunk `i` of a vault file: 7 zero bytes ‖ i ‖ last. */\nexport function vaultChunkNonce(i: number, last: boolean): Uint8Array<ArrayBuffer> {\n  const n = new Uint8Array(12);\n  new DataView(n.buffer).setUint32(7, i, false);\n  n[11] = last ? 1 : 0;\n  return n;\n}\n\n/** Decryption failed: the file is damaged. */\nexport class VaultContentError extends Error {\n  constructor(message = 'vault: the file is damaged') {\n    super(message);\n    this.name = 'VaultContentError';\n  }\n}\n\n/**\n * Plaintext bytes `[a, b)` of a file (b clamped to its size). Fetches only\n * the chunks the span needs, one range request per run inside one pack.\n */\nexport async function readFileRange(\n  keys: VaultKeys,\n  node: VaultNode,\n  a: number,\n  b: number,\n  fetchRange: FetchRange,\n  opts: { key?: CryptoKey; signal?: AbortSignal } = {},\n): Promise<Uint8Array<ArrayBuffer>> {\n  const end = Math.min(b, node.size);\n  if (!node.content || node.size === 0 || a >= end) return new Uint8Array(0);\n  const c = node.content;\n  const span = chunkSpan(node.size, c.log2, a, end);\n  const runs = mapBodySpan(c.extents, span.start, span.end);\n  const parts: Uint8Array[] = [];\n  for (const run of runs) parts.push(await fetchRange(run.pack, run.offset, run.length, opts.signal));\n  const body = concatBytes(parts);\n  if (body.length !== span.end - span.start) throw new VaultContentError('vault: a pack returned fewer bytes than asked');\n  const key = opts.key ?? (await contentKey(keys.fmk, keys.vaultId, fromHex(c.id)!));\n  const chunk = 2 ** c.log2;\n  const full = chunk + 16;\n  const out = new Uint8Array((span.last - span.first) * chunk + Math.min(chunk, node.size - span.last * chunk));\n  let o = 0;\n  for (let i = span.first; i <= span.last; i++) {\n    const off = (i - span.first) * full;\n    const piece = body.subarray(off, Math.min(off + full, body.length));\n    let plain: Uint8Array;\n    try {\n      plain = new Uint8Array(\n        await crypto.subtle.decrypt({ name: 'AES-GCM', iv: vaultChunkNonce(i, i === span.count - 1) }, key, bufferView(piece.slice())),\n      );\n    } catch {\n      throw new VaultContentError();\n    }\n    out.set(plain, o);\n    o += plain.length;\n  }\n  const from = a - span.first * chunk;\n  return out.slice(from, from + (end - a));\n}\n\n/** The whole file, in memory. */\nexport function readWholeFile(keys: VaultKeys, node: VaultNode, fetchRange: FetchRange, signal?: AbortSignal): Promise<Uint8Array<ArrayBuffer>> {\n  return readFileRange(keys, node, 0, node.size, fetchRange, { signal });\n}\n\n/**\n * The file as a stream of plaintext, fetched a few chunks at a time (about\n * 4 MiB of body per step). An error mid-way errors the stream: what was\n * already read is not the file (lib/e2esave discards it).\n */\nexport function fileStream(keys: VaultKeys, node: VaultNode, fetchRange: FetchRange, signal?: AbortSignal): ReadableStream<Uint8Array> {\n  let pos = 0;\n  let key: CryptoKey | null = null;\n  const step = node.content ? Math.max(1, Math.floor((4 * 1024 * 1024) / 2 ** node.content.log2)) * 2 ** node.content.log2 : 1;\n  return new ReadableStream<Uint8Array>({\n    async pull(ctl) {\n      if (pos >= node.size) {\n        ctl.close();\n        return;\n      }\n      try {\n        if (!key && node.content) key = await contentKey(keys.fmk, keys.vaultId, fromHex(node.content.id)!);\n        const end = Math.min(node.size, pos + step);\n        const piece = await readFileRange(keys, node, pos, end, fetchRange, { key: key ?? undefined, signal });\n        pos = end;\n        ctl.enqueue(piece);\n      } catch (err) {\n        ctl.error(err);\n      }\n    },\n  });\n}\n\n/** Hex of the vault id from the key file's base64url `vault.id`. */\nexport function vaultIdHex(id: Uint8Array): string {\n  return toHex(id);\n}\n","/**\n * e2evault/writer — one generation's worth of changes, written the canonical\n * way (docs/E2E-VAULT-FORMAT.md → \"Writing\", \"Canonical layout\").\n *\n *   1. A generation starts with no open pack; a pack of an earlier generation\n *      is never added to.\n *   2. Operations are applied in order. New contents of n > 0 bytes: draw the\n *      content id, encrypt the body (STREAM, 2^20-byte chunks, nonce prefix\n *      7 zero bytes), append it to the open pack. No open pack: open one,\n *      drawing its id. A full pack is closed without padding and uploaded.\n *   3. After the last operation an open pack that is not full gets its\n *      padding drawn and is closed.\n *   4. The body: the new tree's pack table, the entries in canonical order,\n *      the graveyard (previous graveyard + packs of the previous table the\n *      tree no longer uses, `died` = this generation, minus the packs this\n *      writer deleted). Then the seal id; then the index is sealed.\n *\n * Every random byte comes from ONE source, drawn in exactly that order — so\n * the test vectors' DRBG replays a generation byte for byte. The product's\n * source is `crypto.getRandomValues` and nothing else.\n *\n * Packs go up before the index: the index is the only thing that makes\n * anything visible, and it never names a pack that is not stored.\n */\nimport {\n  VAULT_CHUNK_LOG2,\n  VAULT_ENTRIES_WARN,\n  VAULT_ENTRIES_WRITE_MAX,\n  VAULT_ENTRY_FILE,\n  VAULT_ENTRY_FOLDER,\n  VAULT_INDEX_HEADER_LEN,\n  VAULT_INDEX_WARN,\n  VAULT_INDEX_WRITE_MAX,\n  VAULT_MAX_DEPTH,\n  VAULT_TAG_LEN,\n  VaultFormatError,\n  bufferView,\n  indexFileSize,\n  packDataSize,\n  toHex,\n  utf8,\n  vaultNameProblem,\n} from './layout';\nimport { contentKey, indexKey } from './keys';\nimport { openPack, packBytes, type OpenPack } from './pack';\nimport { buildIndexHeader, vaultChunkNonce, type FetchRange } from './reader';\nimport {\n  canonicalOrder,\n  cloneTree,\n  depthOf,\n  encodeIndexBody,\n  joinVaultPath,\n  packTableOf,\n  splitVaultPath,\n  type VaultExtent,\n  type VaultGrave,\n  type VaultIndexState,\n  type VaultNode,\n  type VaultTree,\n} from './vindex';\n\n/** `n` random bytes. The product passes `cryptoRandom`; the vectors a DRBG. */\nexport type RandomSource = (n: number) => Uint8Array;\n\nexport const cryptoRandom: RandomSource = (n) => {\n  const out = new Uint8Array(n);\n  // getRandomValues fills at most 65 536 bytes per call.\n  for (let o = 0; o < n; o += 65536) crypto.getRandomValues(out.subarray(o, Math.min(n, o + 65536)));\n  return out;\n};\n\n/** What a write's new contents can be. `size` must be what the stream yields. */\nexport type VaultWriteContent =\n  | Uint8Array\n  | Blob\n  | { size: number; stream: () => ReadableStream<Uint8Array> };\n\nexport type VaultOp =\n  | { op: 'mkdir'; path: string; mtime: number }\n  | { op: 'write'; path: string; mtime: number; content: VaultWriteContent }\n  | { op: 'delete'; path: string }\n  | { op: 'move'; from: string; to: string };\n\n/** Where packs and the index go. Throwing aborts the change. */\nexport interface VaultSink {\n  putPack(id: string, bytes: Uint8Array<ArrayBuffer>, signal?: AbortSignal): Promise<void>;\n  putIndex(gen: number, bytes: Uint8Array<ArrayBuffer>, signal?: AbortSignal): Promise<void>;\n}\n\n/**\n * An upload whose outcome is unknown (a time-out, a dropped connection) or\n * whose id is taken: the pack goes up again under a new id.\n */\nexport class VaultPackRetry extends Error {\n  constructor(message = 'vault: the pack upload did not finish') {\n    super(message);\n    this.name = 'VaultPackRetry';\n  }\n}\n\n/** A change the writer refuses before anything is written. */\nexport class VaultWriteError extends Error {\n  constructor(\n    public readonly code:\n      | 'parent_missing'\n      | 'parent_not_folder'\n      | 'name_taken'\n      | 'bad_name'\n      | 'too_deep'\n      | 'not_found'\n      | 'is_folder'\n      | 'into_itself'\n      | 'too_many_entries'\n      | 'index_too_large'\n      | 'newer_format'\n      | 'size_mismatch',\n    public readonly path = '',\n  ) {\n    super(`vault: ${code}${path ? ` (${path})` : ''}`);\n    this.name = 'VaultWriteError';\n  }\n}\n\nexport interface VaultWriterOptions {\n  fmk: CryptoKey;\n  vaultId: Uint8Array;\n  packLog2: number;\n  random: RandomSource;\n  sink: VaultSink;\n  signal?: AbortSignal;\n  /** Packs this writer deleted (a collection): they leave the graveyard. */\n  deleted?: ReadonlySet<string>;\n  /** Plaintext bytes consumed so far by the current operation. */\n  onProgress?: (bytes: number) => void;\n  /** How often a pack upload of unknown outcome is sent again. Default 2. */\n  packRetries?: number;\n}\n\nexport interface VaultCommit {\n  generation: number;\n  index: Uint8Array<ArrayBuffer>;\n  state: VaultIndexState;\n  /** Every pack uploaded in this generation, used or not. */\n  packsWritten: string[];\n}\n\n/** Where a vault stands against its limits (before a change). */\nexport function vaultLimitStatus(entries: number, indexBytes: number): 'ok' | 'warn' | 'full' {\n  if (entries >= VAULT_ENTRIES_WRITE_MAX || indexBytes > VAULT_INDEX_WRITE_MAX) return 'full';\n  if (entries >= VAULT_ENTRIES_WARN || indexBytes >= VAULT_INDEX_WARN) return 'warn';\n  return 'ok';\n}\n\n/** The NFC path of a person's input; throws for a name the format refuses. */\nexport function normalizeVaultPath(path: string): string {\n  const p = String(path ?? '')\n    .normalize('NFC')\n    .replace(/^\\/+|\\/+$/g, '');\n  if (!p) throw new VaultWriteError('bad_name', path);\n  for (const seg of p.split('/')) {\n    if (vaultNameProblem(utf8(seg))) throw new VaultWriteError('bad_name', path);\n  }\n  return p;\n}\n\nfunction abortError(): Error {\n  const e = new Error('vault: the change was stopped');\n  e.name = 'AbortError';\n  return e;\n}\n\n/**\n * One generation in the making. Apply operations, then `commit` once. A\n * writer is spent after its commit (or after any error): the next change\n * starts a new writer from the committed state.\n */\nexport class VaultWriter {\n  readonly generation: number;\n  private readonly tree: VaultTree;\n  private readonly cap: number;\n  private open: OpenPack | null = null;\n  private readonly written: string[] = [];\n  /** Extents made in this generation (an id change on a retry rewrites them). */\n  private readonly fresh: VaultExtent[] = [];\n  private done = false;\n\n  constructor(\n    private readonly base: VaultIndexState,\n    private readonly opts: VaultWriterOptions,\n  ) {\n    if (base.hasExt) throw new VaultWriteError('newer_format');\n    this.generation = base.generation + 1;\n    this.tree = cloneTree(base.tree);\n    this.cap = packDataSize(opts.packLog2);\n  }\n\n  /** The tree as it stands with the operations applied so far. */\n  get current(): VaultTree {\n    return this.tree;\n  }\n\n  /** How many entries the tree holds now. */\n  get entryCount(): number {\n    return this.tree.size;\n  }\n\n  private check(): void {\n    if (this.done) throw new Error('vault: this writer has committed');\n    if (this.opts.signal?.aborted) throw abortError();\n  }\n\n  private parentFolder(parent: string, path: string): void {\n    if (!parent) return;\n    const p = this.tree.get(parent);\n    if (!p) throw new VaultWriteError('parent_missing', path);\n    if (p.kind !== VAULT_ENTRY_FOLDER) throw new VaultWriteError('parent_not_folder', path);\n  }\n\n  private room(path: string): void {\n    if (this.tree.size + 1 > VAULT_ENTRIES_WRITE_MAX) throw new VaultWriteError('too_many_entries', path);\n    if (depthOf(path) > VAULT_MAX_DEPTH) throw new VaultWriteError('too_deep', path);\n  }\n\n  async apply(op: VaultOp): Promise<void> {\n    this.check();\n    switch (op.op) {\n      case 'mkdir': {\n        const path = normalizeVaultPath(op.path);\n        const { parent, name } = splitVaultPath(path);\n        this.parentFolder(parent, path);\n        if (this.tree.has(path)) throw new VaultWriteError('name_taken', path);\n        this.room(path);\n        this.tree.set(path, { path, parent, name, kind: VAULT_ENTRY_FOLDER, mtime: clampTime(op.mtime), size: 0, content: null });\n        return;\n      }\n      case 'write': {\n        const path = normalizeVaultPath(op.path);\n        const { parent, name } = splitVaultPath(path);\n        this.parentFolder(parent, path);\n        const was = this.tree.get(path);\n        if (was && was.kind === VAULT_ENTRY_FOLDER) throw new VaultWriteError('is_folder', path);\n        if (!was) this.room(path);\n        const size = contentSize(op.content);\n        let content: VaultNode['content'] = null;\n        if (size > 0) {\n          const id = this.opts.random(16);\n          const key = await contentKey(this.opts.fmk, this.opts.vaultId, id);\n          const extents = await this.encryptInto(key, op.content, size);\n          content = { id: toHex(id), log2: VAULT_CHUNK_LOG2, extents };\n        }\n        this.tree.set(path, { path, parent, name, kind: VAULT_ENTRY_FILE, mtime: clampTime(op.mtime), size, content });\n        return;\n      }\n      case 'delete': {\n        const path = normalizeVaultPath(op.path);\n        const node = this.tree.get(path);\n        if (!node) throw new VaultWriteError('not_found', path);\n        this.tree.delete(path);\n        if (node.kind === VAULT_ENTRY_FOLDER) {\n          const prefix = path + '/';\n          for (const k of [...this.tree.keys()]) if (k.startsWith(prefix)) this.tree.delete(k);\n        }\n        return;\n      }\n      case 'move': {\n        const from = normalizeVaultPath(op.from);\n        const to = normalizeVaultPath(op.to);\n        const node = this.tree.get(from);\n        if (!node) throw new VaultWriteError('not_found', from);\n        if (from === to) return;\n        if (to.startsWith(from + '/')) throw new VaultWriteError('into_itself', to);\n        const { parent, name } = splitVaultPath(to);\n        this.parentFolder(parent, to);\n        if (this.tree.has(to)) throw new VaultWriteError('name_taken', to);\n        const moved: VaultNode[] = [];\n        this.tree.delete(from);\n        moved.push({ ...node, path: to, parent, name });\n        if (node.kind === VAULT_ENTRY_FOLDER) {\n          const prefix = from + '/';\n          for (const [k, e] of [...this.tree]) {\n            if (!k.startsWith(prefix)) continue;\n            this.tree.delete(k);\n            const np = to + k.slice(from.length);\n            moved.push({ ...e, path: np, parent: to + e.parent.slice(from.length) });\n          }\n        }\n        for (const e of moved) {\n          if (depthOf(e.path) > VAULT_MAX_DEPTH) throw new VaultWriteError('too_deep', e.path);\n          this.tree.set(e.path, e);\n        }\n        return;\n      }\n    }\n  }\n\n  /**\n   * Repacking (docs/E2E-VAULT-FORMAT.md → \"Garbage collection\"): copy the\n   * live extents that lie in `packs` - entry by entry in index order, each\n   * entry's extents in order, the bytes as they are, nothing re-encrypted -\n   * into new packs by the canonical layout. Every piece stays an extent of\n   * its own, even when two land side by side in one new pack (the format's\n   * \"Details the implementations settled\": no merging), so two writers lay a\n   * repack out alike.\n   */\n  async repack(packs: ReadonlySet<string>, fetchRange: FetchRange): Promise<void> {\n    this.check();\n    for (const node of canonicalOrder(this.tree)) {\n      const c = node.content;\n      if (!c || !c.extents.some((x) => packs.has(x.pack))) continue;\n      const next: VaultExtent[] = [];\n      for (const x of c.extents) {\n        if (!packs.has(x.pack)) {\n          next.push({ ...x });\n          continue;\n        }\n        const bytes = await fetchRange(x.pack, x.offset, x.length, this.opts.signal);\n        if (bytes.length !== x.length) throw new Error('vault: a pack returned fewer bytes than asked');\n        next.push(...(await this.append(bytes)));\n      }\n      this.tree.set(node.path, { ...node, content: { ...c, extents: next } });\n    }\n  }\n\n  /** Encrypt `content` (`size` bytes) as a STREAM under `key`, into packs. */\n  private async encryptInto(key: CryptoKey, content: VaultWriteContent, size: number): Promise<VaultExtent[]> {\n    const chunk = 2 ** VAULT_CHUNK_LOG2;\n    const count = Math.ceil(size / chunk);\n    const extents: VaultExtent[] = [];\n    const next = chunkReader(content);\n    let seen = 0;\n    for (let i = 0; i < count; i++) {\n      this.check();\n      const want = Math.min(chunk, size - i * chunk);\n      const plain = await next(want);\n      if (plain.length !== want) throw new VaultWriteError('size_mismatch');\n      seen += plain.length;\n      const ct = new Uint8Array(\n        await crypto.subtle.encrypt({ name: 'AES-GCM', iv: vaultChunkNonce(i, i === count - 1) }, key, bufferView(plain)),\n      );\n      extents.push(...(await this.append(ct)));\n      this.opts.onProgress?.(seen);\n    }\n    if ((await next(1)).length !== 0) throw new VaultWriteError('size_mismatch');\n    return mergeFresh(extents);\n  }\n\n  /** Append bytes to the open pack (opening and closing packs as needed). */\n  private async append(bytes: Uint8Array): Promise<VaultExtent[]> {\n    const out: VaultExtent[] = [];\n    let pos = 0;\n    while (pos < bytes.length) {\n      if (!this.open) this.open = openPack(toHex(this.opts.random(16)), this.opts.packLog2);\n      const p = this.open;\n      const n = Math.min(bytes.length - pos, this.cap - p.used);\n      p.data.set(bytes.subarray(pos, pos + n), p.used);\n      const x: VaultExtent = { pack: p.id, offset: 32 + p.used, length: n };\n      this.fresh.push(x);\n      out.push(x);\n      p.used += n;\n      pos += n;\n      if (p.used === this.cap) {\n        this.open = null;\n        await this.upload(p);\n      }\n    }\n    return out;\n  }\n\n  private async upload(p: OpenPack): Promise<void> {\n    const retries = this.opts.packRetries ?? 2;\n    for (let attempt = 0; ; attempt++) {\n      this.check();\n      try {\n        await this.opts.sink.putPack(p.id, packBytes(p, this.opts.packLog2), this.opts.signal);\n        this.written.push(p.id);\n        return;\n      } catch (err) {\n        if (!(err instanceof VaultPackRetry) || attempt >= retries) throw err;\n        // The first upload may have landed: it becomes an orphan. Only the\n        // header changes; the data area is sent again as it is.\n        const old = p.id;\n        p.id = toHex(cryptoRandom(16));\n        for (const x of this.fresh) if (x.pack === old) x.pack = p.id;\n      }\n    }\n  }\n\n  /** Close the generation: pad and upload the open pack, seal and send the index. */\n  async commit(): Promise<VaultCommit> {\n    this.check();\n    if (this.open) {\n      const p = this.open;\n      this.open = null;\n      if (p.used < this.cap) p.data.set(this.opts.random(this.cap - p.used), p.used);\n      await this.upload(p);\n    }\n    if (this.tree.size > VAULT_ENTRIES_WRITE_MAX) throw new VaultWriteError('too_many_entries');\n\n    const table = new Set(packTableOf(this.tree));\n    const deleted = this.opts.deleted ?? new Set<string>();\n    const grave: VaultGrave[] = this.base.grave.filter((g) => !deleted.has(g.pack) && !table.has(g.pack));\n    for (const id of this.base.packs) {\n      if (!table.has(id) && !deleted.has(id)) grave.push({ pack: id, died: this.generation });\n    }\n    const { body, packs } = encodeIndexBody(this.tree, grave);\n    const size = indexFileSize(body.length);\n    if (size > VAULT_INDEX_WRITE_MAX) throw new VaultWriteError('index_too_large');\n\n    const index = await sealIndexFile(this.opts.fmk, this.opts.vaultId, this.generation, body, this.opts.random);\n    // A commit of unknown outcome is sent again with the SAME bytes: nothing\n    // new is sealed (the nonce rule), and the server's generation check tells\n    // a landed first try from a lost one (the sink's business).\n    const retries = this.opts.packRetries ?? 2;\n    for (let attempt = 0; ; attempt++) {\n      this.check();\n      try {\n        await this.opts.sink.putIndex(this.generation, index, this.opts.signal);\n        break;\n      } catch (err) {\n        if (!(err instanceof VaultPackRetry) || attempt >= retries) throw err;\n      }\n    }\n    this.done = true;\n    const sortedGrave = [...grave].sort((a, b) => (a.pack < b.pack ? -1 : a.pack > b.pack ? 1 : 0));\n    return {\n      generation: this.generation,\n      index,\n      state: { generation: this.generation, tree: this.tree, packs, grave: sortedGrave, hasExt: false, bodyLen: body.length },\n      packsWritten: [...this.written],\n    };\n  }\n}\n\n/**\n * Seal an index file: the body padded with zeros to its Padmé size, under the\n * index key of a seal id drawn from `random`, the 40-byte header as\n * associated data (docs/E2E-VAULT-FORMAT.md → \"Index file\").\n */\nexport async function sealIndexFile(\n  fmk: CryptoKey,\n  vaultId: Uint8Array,\n  generation: number,\n  body: Uint8Array,\n  random: RandomSource,\n): Promise<Uint8Array<ArrayBuffer>> {\n  const size = indexFileSize(body.length);\n  const sealId = random(16);\n  const header = buildIndexHeader(generation, sealId);\n  const plain = new Uint8Array(size - VAULT_INDEX_HEADER_LEN - VAULT_TAG_LEN);\n  plain.set(body, 0);\n  const key = await indexKey(fmk, vaultId, sealId);\n  const ct = new Uint8Array(\n    await crypto.subtle.encrypt({ name: 'AES-GCM', iv: new Uint8Array(12), additionalData: header }, key, plain),\n  );\n  const index = new Uint8Array(size);\n  index.set(header, 0);\n  index.set(ct, VAULT_INDEX_HEADER_LEN);\n  return index;\n}\n\nfunction clampTime(ms: number): number {\n  return Number.isFinite(ms) && ms > 0 ? Math.min(Math.floor(ms), Number.MAX_SAFE_INTEGER) : 0;\n}\n\nfunction contentSize(c: VaultWriteContent): number {\n  if (c instanceof Uint8Array) return c.length;\n  if (typeof Blob !== 'undefined' && c instanceof Blob) return c.size;\n  return (c as { size: number }).size;\n}\n\n/** Hands out exactly-sized pieces of the content, in order. */\nfunction chunkReader(c: VaultWriteContent): (n: number) => Promise<Uint8Array> {\n  if (c instanceof Uint8Array) {\n    let off = 0;\n    return async (n) => {\n      const out = c.subarray(off, Math.min(c.length, off + n));\n      off += out.length;\n      return out;\n    };\n  }\n  if (typeof Blob !== 'undefined' && c instanceof Blob) {\n    let off = 0;\n    return async (n) => {\n      const end = Math.min(c.size, off + n);\n      const out = new Uint8Array(await c.slice(off, end).arrayBuffer());\n      off = end;\n      return out;\n    };\n  }\n  const reader = (c as { stream: () => ReadableStream<Uint8Array> }).stream().getReader();\n  const pending: Uint8Array[] = [];\n  let have = 0;\n  let ended = false;\n  return async (n) => {\n    while (have < n && !ended) {\n      const { done, value } = await reader.read();\n      if (done) ended = true;\n      else if (value && value.length) {\n        pending.push(value);\n        have += value.length;\n      }\n    }\n    const take = Math.min(n, have);\n    const out = new Uint8Array(take);\n    let o = 0;\n    while (o < take) {\n      const p = pending[0];\n      const k = Math.min(p.length, take - o);\n      out.set(p.subarray(0, k), o);\n      o += k;\n      if (k === p.length) pending.shift();\n      else pending[0] = p.subarray(k);\n    }\n    have -= take;\n    return out;\n  };\n}\n\n/**\n * Merge extents that follow each other in one pack, IN PLACE: the objects\n * kept are the ones `append` made, so a pack sent again under a new id\n * (`upload`) still finds and renames every extent that points into it.\n */\nfunction mergeFresh(extents: VaultExtent[]): VaultExtent[] {\n  const out: VaultExtent[] = [];\n  for (const x of extents) {\n    const last = out[out.length - 1];\n    if (last && last.pack === x.pack && last.offset + last.length === x.offset) last.length += x.length;\n    else out.push(x);\n  }\n  return out;\n}\n","/**\n * @licstart The following is the entire license notice for the\n * JavaScript code in this page\n *\n * Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @licend The above is the entire license notice for the\n * JavaScript code in this page\n */\n\n/**\n * pdfjsVersion = 5.7.284\n * pdfjsBuild = 7e5b36c2d\n */\n/******/ var __webpack_modules__ = ({\n\n/***/ 9306\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar isCallable = __webpack_require__(4901);\nvar tryToString = __webpack_require__(6823);\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n  if (isCallable(argument)) return argument;\n  throw new $TypeError(tryToString(argument) + ' is not a function');\n};\n\n\n/***/ },\n\n/***/ 3506\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar isPossiblePrototype = __webpack_require__(3925);\n\nvar $String = String;\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument) {\n  if (isPossiblePrototype(argument)) return argument;\n  throw new $TypeError(\"Can't set \" + $String(argument) + ' as a prototype');\n};\n\n\n/***/ },\n\n/***/ 7080\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar has = (__webpack_require__(4402).has);\n\n// Perform ? RequireInternalSlot(M, [[SetData]])\nmodule.exports = function (it) {\n  has(it);\n  return it;\n};\n\n\n/***/ },\n\n/***/ 3463\n(module) {\n\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument) {\n  if (typeof argument == 'string') return argument;\n  throw new $TypeError('Argument is not a string');\n};\n\n\n/***/ },\n\n/***/ 4328\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar WeakMapHelpers = __webpack_require__(4995);\n\nvar weakmap = new WeakMapHelpers.WeakMap();\nvar set = WeakMapHelpers.set;\nvar remove = WeakMapHelpers.remove;\n\nmodule.exports = function (key) {\n  set(weakmap, key, 1);\n  remove(weakmap, key);\n  return key;\n};\n\n\n/***/ },\n\n/***/ 6557\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar has = (__webpack_require__(4995).has);\n\n// Perform ? RequireInternalSlot(M, [[WeakMapData]])\nmodule.exports = function (it) {\n  has(it);\n  return it;\n};\n\n\n/***/ },\n\n/***/ 6469\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar wellKnownSymbol = __webpack_require__(608);\nvar create = __webpack_require__(2360);\nvar defineProperty = (__webpack_require__(4913).f);\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] === undefined) {\n  defineProperty(ArrayPrototype, UNSCOPABLES, {\n    configurable: true,\n    value: create(null)\n  });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n  ArrayPrototype[UNSCOPABLES][key] = true;\n};\n\n\n/***/ },\n\n/***/ 679\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar isPrototypeOf = __webpack_require__(1625);\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (it, Prototype) {\n  if (isPrototypeOf(Prototype, it)) return it;\n  throw new $TypeError('Incorrect invocation');\n};\n\n\n/***/ },\n\n/***/ 3972\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar isObject = __webpack_require__(34);\n\nvar $String = String;\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument) {\n  if (argument === undefined || isObject(argument)) return argument;\n  throw new $TypeError($String(argument) + ' is not an object or undefined');\n};\n\n\n/***/ },\n\n/***/ 8551\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar isObject = __webpack_require__(34);\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n  if (isObject(argument)) return argument;\n  throw new $TypeError($String(argument) + ' is not an object');\n};\n\n\n/***/ },\n\n/***/ 4154\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar classof = __webpack_require__(6955);\n\nvar $TypeError = TypeError;\n\n// Perform ? RequireInternalSlot(argument, [[TypedArrayName]])\n// If argument.[[TypedArrayName]] is not \"Uint8Array\", throw a TypeError exception\nmodule.exports = function (argument) {\n  if (classof(argument) === 'Uint8Array') return argument;\n  throw new $TypeError('Argument is not an Uint8Array');\n};\n\n\n/***/ },\n\n/***/ 7811\n(module) {\n\n\n// eslint-disable-next-line es/no-typed-arrays -- safe\nmodule.exports = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined';\n\n\n/***/ },\n\n/***/ 7394\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\nvar uncurryThisAccessor = __webpack_require__(6706);\nvar classof = __webpack_require__(2195);\n\nvar ArrayBuffer = globalThis.ArrayBuffer;\nvar TypeError = globalThis.TypeError;\n\n// Includes\n// - Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).\n// - If IsSharedArrayBuffer(O) is true, throw a TypeError exception.\nmodule.exports = ArrayBuffer && uncurryThisAccessor(ArrayBuffer.prototype, 'byteLength', 'get') || function (O) {\n  if (classof(O) !== 'ArrayBuffer') throw new TypeError('ArrayBuffer expected');\n  return O.byteLength;\n};\n\n\n/***/ },\n\n/***/ 3238\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\nvar NATIVE_ARRAY_BUFFER = __webpack_require__(7811);\nvar arrayBufferByteLength = __webpack_require__(7394);\n\nvar DataView = globalThis.DataView;\n\nmodule.exports = function (O) {\n  if (!NATIVE_ARRAY_BUFFER || arrayBufferByteLength(O) !== 0) return false;\n  try {\n    // eslint-disable-next-line no-new -- thrower\n    new DataView(O);\n    return false;\n  } catch (error) {\n    return true;\n  }\n};\n\n\n/***/ },\n\n/***/ 5169\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar isDetached = __webpack_require__(3238);\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (it) {\n  if (isDetached(it)) throw new $TypeError('ArrayBuffer is detached');\n  return it;\n};\n\n\n/***/ },\n\n/***/ 5636\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\nvar uncurryThis = __webpack_require__(9504);\nvar uncurryThisAccessor = __webpack_require__(6706);\nvar toIndex = __webpack_require__(7696);\nvar notDetached = __webpack_require__(5169);\nvar arrayBufferByteLength = __webpack_require__(7394);\nvar detachTransferable = __webpack_require__(4483);\nvar PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(1548);\n\nvar structuredClone = globalThis.structuredClone;\nvar ArrayBuffer = globalThis.ArrayBuffer;\nvar DataView = globalThis.DataView;\nvar max = Math.max;\nvar min = Math.min;\nvar ArrayBufferPrototype = ArrayBuffer.prototype;\nvar DataViewPrototype = DataView.prototype;\nvar slice = uncurryThis(ArrayBufferPrototype.slice);\nvar isResizable = uncurryThisAccessor(ArrayBufferPrototype, 'resizable', 'get');\nvar maxByteLength = uncurryThisAccessor(ArrayBufferPrototype, 'maxByteLength', 'get');\nvar getInt8 = uncurryThis(DataViewPrototype.getInt8);\nvar setInt8 = uncurryThis(DataViewPrototype.setInt8);\n\nmodule.exports = (PROPER_STRUCTURED_CLONE_TRANSFER || detachTransferable) && function (arrayBuffer, newLength, preserveResizability) {\n  var byteLength = arrayBufferByteLength(arrayBuffer);\n  var newByteLength = newLength === undefined ? byteLength : toIndex(newLength);\n  var fixedLength = !isResizable || !isResizable(arrayBuffer);\n  var newBuffer;\n  notDetached(arrayBuffer);\n  if (PROPER_STRUCTURED_CLONE_TRANSFER) {\n    arrayBuffer = structuredClone(arrayBuffer, { transfer: [arrayBuffer] });\n    if (byteLength === newByteLength && (preserveResizability || fixedLength)) return arrayBuffer;\n  }\n  if (byteLength >= newByteLength && (!preserveResizability || fixedLength)) {\n    newBuffer = slice(arrayBuffer, 0, newByteLength);\n  } else {\n    var options = preserveResizability && !fixedLength && maxByteLength\n      ? { maxByteLength: max(newByteLength, maxByteLength(arrayBuffer)) }\n      : undefined;\n    newBuffer = new ArrayBuffer(newByteLength, options);\n    var a = new DataView(arrayBuffer);\n    var b = new DataView(newBuffer);\n    var copyLength = min(newByteLength, byteLength);\n    for (var i = 0; i < copyLength; i++) setInt8(b, i, getInt8(a, i));\n  }\n  if (!PROPER_STRUCTURED_CLONE_TRANSFER) detachTransferable(arrayBuffer);\n  return newBuffer;\n};\n\n\n/***/ },\n\n/***/ 4644\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar NATIVE_ARRAY_BUFFER = __webpack_require__(7811);\nvar DESCRIPTORS = __webpack_require__(3724);\nvar globalThis = __webpack_require__(4576);\nvar isCallable = __webpack_require__(4901);\nvar isObject = __webpack_require__(34);\nvar hasOwn = __webpack_require__(9297);\nvar classof = __webpack_require__(6955);\nvar tryToString = __webpack_require__(6823);\nvar createNonEnumerableProperty = __webpack_require__(6699);\nvar defineBuiltIn = __webpack_require__(6840);\nvar defineBuiltInAccessor = __webpack_require__(2106);\nvar isPrototypeOf = __webpack_require__(1625);\nvar getPrototypeOf = __webpack_require__(2787);\nvar setPrototypeOf = __webpack_require__(2967);\nvar wellKnownSymbol = __webpack_require__(608);\nvar uid = __webpack_require__(3392);\nvar InternalStateModule = __webpack_require__(1181);\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar Int8Array = globalThis.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar Uint8ClampedArray = globalThis.Uint8ClampedArray;\nvar Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;\nvar TypedArray = Int8Array && getPrototypeOf(Int8Array);\nvar TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype);\nvar ObjectPrototype = Object.prototype;\nvar TypeError = globalThis.TypeError;\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');\nvar TYPED_ARRAY_CONSTRUCTOR = 'TypedArrayConstructor';\n// Fixing native typed arrays in Opera Presto crashes the browser, see #595\nvar NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(globalThis.opera) !== 'Opera';\nvar TYPED_ARRAY_TAG_REQUIRED = false;\nvar NAME, Constructor, Prototype;\n\nvar TypedArrayConstructorsList = {\n  Int8Array: 1,\n  Uint8Array: 1,\n  Uint8ClampedArray: 1,\n  Int16Array: 2,\n  Uint16Array: 2,\n  Int32Array: 4,\n  Uint32Array: 4,\n  Float32Array: 4,\n  Float64Array: 8\n};\n\nvar BigIntArrayConstructorsList = {\n  BigInt64Array: 8,\n  BigUint64Array: 8\n};\n\nvar isView = function isView(it) {\n  if (!isObject(it)) return false;\n  var klass = classof(it);\n  return klass === 'DataView'\n    || hasOwn(TypedArrayConstructorsList, klass)\n    || hasOwn(BigIntArrayConstructorsList, klass);\n};\n\nvar getTypedArrayConstructor = function (it) {\n  var proto = getPrototypeOf(it);\n  if (!isObject(proto)) return;\n  var state = getInternalState(proto);\n  return (state && hasOwn(state, TYPED_ARRAY_CONSTRUCTOR)) ? state[TYPED_ARRAY_CONSTRUCTOR] : getTypedArrayConstructor(proto);\n};\n\nvar isTypedArray = function (it) {\n  if (!isObject(it)) return false;\n  var klass = classof(it);\n  return hasOwn(TypedArrayConstructorsList, klass)\n    || hasOwn(BigIntArrayConstructorsList, klass);\n};\n\nvar aTypedArray = function (it) {\n  if (isTypedArray(it)) return it;\n  throw new TypeError('Target is not a typed array');\n};\n\nvar aTypedArrayConstructor = function (C) {\n  if (isCallable(C) && (!setPrototypeOf || isPrototypeOf(TypedArray, C))) return C;\n  throw new TypeError(tryToString(C) + ' is not a typed array constructor');\n};\n\nvar exportTypedArrayMethod = function (KEY, property, forced, options) {\n  if (!DESCRIPTORS) return;\n  if (forced) for (var ARRAY in TypedArrayConstructorsList) {\n    var TypedArrayConstructor = globalThis[ARRAY];\n    if (TypedArrayConstructor && hasOwn(TypedArrayConstructor.prototype, KEY)) try {\n      delete TypedArrayConstructor.prototype[KEY];\n    } catch (error) {\n      // old WebKit bug - some methods are non-configurable\n      try {\n        TypedArrayConstructor.prototype[KEY] = property;\n      } catch (error2) { /* empty */ }\n    }\n  }\n  if (!TypedArrayPrototype[KEY] || forced) {\n    defineBuiltIn(TypedArrayPrototype, KEY, forced ? property\n      : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options);\n  }\n};\n\nvar exportTypedArrayStaticMethod = function (KEY, property, forced) {\n  var ARRAY, TypedArrayConstructor;\n  if (!DESCRIPTORS) return;\n  if (setPrototypeOf) {\n    if (forced) for (ARRAY in TypedArrayConstructorsList) {\n      TypedArrayConstructor = globalThis[ARRAY];\n      if (TypedArrayConstructor && hasOwn(TypedArrayConstructor, KEY)) try {\n        delete TypedArrayConstructor[KEY];\n      } catch (error) { /* empty */ }\n    }\n    if (!TypedArray[KEY] || forced) {\n      // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable\n      try {\n        return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property);\n      } catch (error) { /* empty */ }\n    } else return;\n  }\n  for (ARRAY in TypedArrayConstructorsList) {\n    TypedArrayConstructor = globalThis[ARRAY];\n    if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {\n      defineBuiltIn(TypedArrayConstructor, KEY, property);\n    }\n  }\n};\n\nfor (NAME in TypedArrayConstructorsList) {\n  Constructor = globalThis[NAME];\n  Prototype = Constructor && Constructor.prototype;\n  if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor;\n  else NATIVE_ARRAY_BUFFER_VIEWS = false;\n}\n\nfor (NAME in BigIntArrayConstructorsList) {\n  Constructor = globalThis[NAME];\n  Prototype = Constructor && Constructor.prototype;\n  if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor;\n}\n\n// WebKit bug - typed arrays constructors prototype is Object.prototype\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !isCallable(TypedArray) || TypedArray === Function.prototype) {\n  // eslint-disable-next-line no-shadow -- safe\n  TypedArray = function TypedArray() {\n    throw new TypeError('Incorrect invocation');\n  };\n  if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n    if (globalThis[NAME]) setPrototypeOf(globalThis[NAME], TypedArray);\n  }\n}\n\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) {\n  TypedArrayPrototype = TypedArray.prototype;\n  if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n    if (globalThis[NAME]) setPrototypeOf(globalThis[NAME].prototype, TypedArrayPrototype);\n  }\n}\n\n// WebKit bug - one more object in Uint8ClampedArray prototype chain\nif (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {\n  setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);\n}\n\nif (DESCRIPTORS && !hasOwn(TypedArrayPrototype, TO_STRING_TAG)) {\n  TYPED_ARRAY_TAG_REQUIRED = true;\n  defineBuiltInAccessor(TypedArrayPrototype, TO_STRING_TAG, {\n    configurable: true,\n    get: function () {\n      return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;\n    }\n  });\n  for (NAME in TypedArrayConstructorsList) if (globalThis[NAME]) {\n    createNonEnumerableProperty(globalThis[NAME].prototype, TYPED_ARRAY_TAG, NAME);\n  }\n}\n\nmodule.exports = {\n  NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,\n  TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG,\n  aTypedArray: aTypedArray,\n  aTypedArrayConstructor: aTypedArrayConstructor,\n  exportTypedArrayMethod: exportTypedArrayMethod,\n  exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,\n  getTypedArrayConstructor: getTypedArrayConstructor,\n  isView: isView,\n  isTypedArray: isTypedArray,\n  TypedArray: TypedArray,\n  TypedArrayPrototype: TypedArrayPrototype\n};\n\n\n/***/ },\n\n/***/ 5370\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar lengthOfArrayLike = __webpack_require__(6198);\n\nmodule.exports = function (Constructor, list, $length) {\n  var index = 0;\n  var length = arguments.length > 2 ? $length : lengthOfArrayLike(list);\n  var result = new Constructor(length);\n  while (length > index) result[index] = list[index++];\n  return result;\n};\n\n\n/***/ },\n\n/***/ 9617\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar toIndexedObject = __webpack_require__(5397);\nvar toAbsoluteIndex = __webpack_require__(5610);\nvar lengthOfArrayLike = __webpack_require__(6198);\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIndexedObject($this);\n    var length = lengthOfArrayLike(O);\n    if (length === 0) return !IS_INCLUDES && -1;\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare -- NaN check\n    if (IS_INCLUDES && el !== el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare -- NaN check\n      if (value !== value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) {\n      if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\nmodule.exports = {\n  // `Array.prototype.includes` method\n  // https://tc39.es/ecma262/#sec-array.prototype.includes\n  includes: createMethod(true),\n  // `Array.prototype.indexOf` method\n  // https://tc39.es/ecma262/#sec-array.prototype.indexof\n  indexOf: createMethod(false)\n};\n\n\n/***/ },\n\n/***/ 4527\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar DESCRIPTORS = __webpack_require__(3724);\nvar isArray = __webpack_require__(4376);\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Safari < 13 does not throw an error in this case\nvar SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () {\n  // makes no sense without proper strict mode support\n  if (this !== undefined) return true;\n  try {\n    // eslint-disable-next-line es/no-object-defineproperty -- safe\n    Object.defineProperty([], 'length', { writable: false }).length = 1;\n  } catch (error) {\n    return error instanceof TypeError;\n  }\n}();\n\nmodule.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) {\n  if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) {\n    throw new $TypeError('Cannot set read only .length');\n  } return O.length = length;\n} : function (O, length) {\n  return O.length = length;\n};\n\n\n/***/ },\n\n/***/ 7680\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\n\nmodule.exports = uncurryThis([].slice);\n\n\n/***/ },\n\n/***/ 2804\n(module) {\n\n\nvar commonAlphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\nvar base64Alphabet = commonAlphabet + '+/';\nvar base64UrlAlphabet = commonAlphabet + '-_';\n\nvar inverse = function (characters) {\n  // TODO: use `Object.create(null)` in `core-js@4`\n  var result = {};\n  var index = 0;\n  for (; index < 64; index++) result[characters.charAt(index)] = index;\n  return result;\n};\n\nmodule.exports = {\n  i2c: base64Alphabet,\n  c2i: inverse(base64Alphabet),\n  i2cUrl: base64UrlAlphabet,\n  c2iUrl: inverse(base64UrlAlphabet)\n};\n\n\n/***/ },\n\n/***/ 6319\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar anObject = __webpack_require__(8551);\nvar iteratorClose = __webpack_require__(9539);\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n  try {\n    return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n  } catch (error) {\n    iteratorClose(iterator, 'throw', error);\n  }\n};\n\n\n/***/ },\n\n/***/ 2195\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n  return stringSlice(toString(it), 8, -1);\n};\n\n\n/***/ },\n\n/***/ 6955\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar TO_STRING_TAG_SUPPORT = __webpack_require__(2140);\nvar isCallable = __webpack_require__(4901);\nvar classofRaw = __webpack_require__(2195);\nvar wellKnownSymbol = __webpack_require__(608);\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n  var O, tag, result;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n    // builtinTag case\n    : CORRECT_ARGUMENTS ? classofRaw(O)\n    // ES3 arguments fallback\n    : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n\n\n/***/ },\n\n/***/ 7740\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar hasOwn = __webpack_require__(9297);\nvar ownKeys = __webpack_require__(5031);\nvar getOwnPropertyDescriptorModule = __webpack_require__(7347);\nvar definePropertyModule = __webpack_require__(4913);\n\nmodule.exports = function (target, source, exceptions) {\n  var keys = ownKeys(source);\n  var defineProperty = definePropertyModule.f;\n  var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n      defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n    }\n  }\n};\n\n\n/***/ },\n\n/***/ 2211\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar fails = __webpack_require__(9039);\n\nmodule.exports = !fails(function () {\n  function F() { /* empty */ }\n  F.prototype.constructor = null;\n  // eslint-disable-next-line es/no-object-getprototypeof -- required for testing\n  return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n\n\n/***/ },\n\n/***/ 2529\n(module) {\n\n\n// `CreateIterResultObject` abstract operation\n// https://tc39.es/ecma262/#sec-createiterresultobject\nmodule.exports = function (value, done) {\n  return { value: value, done: done };\n};\n\n\n/***/ },\n\n/***/ 6699\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar DESCRIPTORS = __webpack_require__(3724);\nvar definePropertyModule = __webpack_require__(4913);\nvar createPropertyDescriptor = __webpack_require__(6980);\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n  return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n\n\n/***/ },\n\n/***/ 6980\n(module) {\n\n\nmodule.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n\n\n/***/ },\n\n/***/ 4659\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar DESCRIPTORS = __webpack_require__(3724);\nvar definePropertyModule = __webpack_require__(4913);\nvar createPropertyDescriptor = __webpack_require__(6980);\n\nmodule.exports = function (object, key, value) {\n  if (DESCRIPTORS) definePropertyModule.f(object, key, createPropertyDescriptor(0, value));\n  else object[key] = value;\n};\n\n\n/***/ },\n\n/***/ 2106\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar makeBuiltIn = __webpack_require__(283);\nvar defineProperty = __webpack_require__(4913);\n\nmodule.exports = function (target, name, descriptor) {\n  if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true });\n  if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true });\n  return defineProperty.f(target, name, descriptor);\n};\n\n\n/***/ },\n\n/***/ 6840\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar isCallable = __webpack_require__(4901);\nvar definePropertyModule = __webpack_require__(4913);\nvar makeBuiltIn = __webpack_require__(283);\nvar defineGlobalProperty = __webpack_require__(9433);\n\nmodule.exports = function (O, key, value, options) {\n  if (!options) options = {};\n  var simple = options.enumerable;\n  var name = options.name !== undefined ? options.name : key;\n  if (isCallable(value)) makeBuiltIn(value, name, options);\n  if (options.global) {\n    if (simple) O[key] = value;\n    else defineGlobalProperty(key, value);\n  } else {\n    try {\n      if (!options.unsafe) delete O[key];\n      else if (O[key]) simple = true;\n    } catch (error) { /* empty */ }\n    if (simple) O[key] = value;\n    else definePropertyModule.f(O, key, {\n      value: value,\n      enumerable: false,\n      configurable: !options.nonConfigurable,\n      writable: !options.nonWritable\n    });\n  } return O;\n};\n\n\n/***/ },\n\n/***/ 6279\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar defineBuiltIn = __webpack_require__(6840);\n\nmodule.exports = function (target, src, options) {\n  for (var key in src) defineBuiltIn(target, key, src[key], options);\n  return target;\n};\n\n\n/***/ },\n\n/***/ 9433\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n  try {\n    defineProperty(globalThis, key, { value: value, configurable: true, writable: true });\n  } catch (error) {\n    globalThis[key] = value;\n  } return value;\n};\n\n\n/***/ },\n\n/***/ 3724\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar fails = __webpack_require__(9039);\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n  // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n  return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7;\n});\n\n\n/***/ },\n\n/***/ 4483\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\nvar getBuiltInNodeModule = __webpack_require__(9429);\nvar PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(1548);\n\nvar structuredClone = globalThis.structuredClone;\nvar $ArrayBuffer = globalThis.ArrayBuffer;\nvar $MessageChannel = globalThis.MessageChannel;\nvar detach = false;\nvar WorkerThreads, channel, buffer, $detach;\n\nif (PROPER_STRUCTURED_CLONE_TRANSFER) {\n  detach = function (transferable) {\n    structuredClone(transferable, { transfer: [transferable] });\n  };\n} else if ($ArrayBuffer) try {\n  if (!$MessageChannel) {\n    WorkerThreads = getBuiltInNodeModule('worker_threads');\n    if (WorkerThreads) $MessageChannel = WorkerThreads.MessageChannel;\n  }\n\n  if ($MessageChannel) {\n    channel = new $MessageChannel();\n    buffer = new $ArrayBuffer(2);\n\n    $detach = function (transferable) {\n      channel.port1.postMessage(null, [transferable]);\n    };\n\n    if (buffer.byteLength === 2) {\n      $detach(buffer);\n      if (buffer.byteLength === 0) detach = $detach;\n    }\n  }\n} catch (error) { /* empty */ }\n\nmodule.exports = detach;\n\n\n/***/ },\n\n/***/ 4055\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\nvar isObject = __webpack_require__(34);\n\nvar document = globalThis.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n  return EXISTS ? document.createElement(it) : {};\n};\n\n\n/***/ },\n\n/***/ 6837\n(module) {\n\n\nvar $TypeError = TypeError;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991\n\nmodule.exports = function (it) {\n  if (it > MAX_SAFE_INTEGER) throw new $TypeError('Maximum allowed index exceeded');\n  return it;\n};\n\n\n/***/ },\n\n/***/ 5002\n(module) {\n\n\nmodule.exports = {\n  IndexSizeError: { s: 'INDEX_SIZE_ERR', c: 1, m: 1 },\n  DOMStringSizeError: { s: 'DOMSTRING_SIZE_ERR', c: 2, m: 0 },\n  HierarchyRequestError: { s: 'HIERARCHY_REQUEST_ERR', c: 3, m: 1 },\n  WrongDocumentError: { s: 'WRONG_DOCUMENT_ERR', c: 4, m: 1 },\n  InvalidCharacterError: { s: 'INVALID_CHARACTER_ERR', c: 5, m: 1 },\n  NoDataAllowedError: { s: 'NO_DATA_ALLOWED_ERR', c: 6, m: 0 },\n  NoModificationAllowedError: { s: 'NO_MODIFICATION_ALLOWED_ERR', c: 7, m: 1 },\n  NotFoundError: { s: 'NOT_FOUND_ERR', c: 8, m: 1 },\n  NotSupportedError: { s: 'NOT_SUPPORTED_ERR', c: 9, m: 1 },\n  InUseAttributeError: { s: 'INUSE_ATTRIBUTE_ERR', c: 10, m: 1 },\n  InvalidStateError: { s: 'INVALID_STATE_ERR', c: 11, m: 1 },\n  SyntaxError: { s: 'SYNTAX_ERR', c: 12, m: 1 },\n  InvalidModificationError: { s: 'INVALID_MODIFICATION_ERR', c: 13, m: 1 },\n  NamespaceError: { s: 'NAMESPACE_ERR', c: 14, m: 1 },\n  InvalidAccessError: { s: 'INVALID_ACCESS_ERR', c: 15, m: 1 },\n  ValidationError: { s: 'VALIDATION_ERR', c: 16, m: 0 },\n  TypeMismatchError: { s: 'TYPE_MISMATCH_ERR', c: 17, m: 1 },\n  SecurityError: { s: 'SECURITY_ERR', c: 18, m: 1 },\n  NetworkError: { s: 'NETWORK_ERR', c: 19, m: 1 },\n  AbortError: { s: 'ABORT_ERR', c: 20, m: 1 },\n  URLMismatchError: { s: 'URL_MISMATCH_ERR', c: 21, m: 1 },\n  QuotaExceededError: { s: 'QUOTA_EXCEEDED_ERR', c: 22, m: 1 },\n  TimeoutError: { s: 'TIMEOUT_ERR', c: 23, m: 1 },\n  InvalidNodeTypeError: { s: 'INVALID_NODE_TYPE_ERR', c: 24, m: 1 },\n  DataCloneError: { s: 'DATA_CLONE_ERR', c: 25, m: 1 }\n};\n\n\n/***/ },\n\n/***/ 8727\n(module) {\n\n\n// IE8- don't enum bug keys\nmodule.exports = [\n  'constructor',\n  'hasOwnProperty',\n  'isPrototypeOf',\n  'propertyIsEnumerable',\n  'toLocaleString',\n  'toString',\n  'valueOf'\n];\n\n\n/***/ },\n\n/***/ 6193\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar ENVIRONMENT = __webpack_require__(4215);\n\nmodule.exports = ENVIRONMENT === 'NODE';\n\n\n/***/ },\n\n/***/ 2839\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\n\nvar navigator = globalThis.navigator;\nvar userAgent = navigator && navigator.userAgent;\n\nmodule.exports = userAgent ? String(userAgent) : '';\n\n\n/***/ },\n\n/***/ 9519\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\nvar userAgent = __webpack_require__(2839);\n\nvar process = globalThis.process;\nvar Deno = globalThis.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n  match = v8.split('.');\n  // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n  // but their correct versions are not interesting for us\n  version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n  match = userAgent.match(/Edge\\/(\\d+)/);\n  if (!match || match[1] >= 74) {\n    match = userAgent.match(/Chrome\\/(\\d+)/);\n    if (match) version = +match[1];\n  }\n}\n\nmodule.exports = version;\n\n\n/***/ },\n\n/***/ 4215\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\n/* global Bun, Deno -- detection */\nvar globalThis = __webpack_require__(4576);\nvar userAgent = __webpack_require__(2839);\nvar classof = __webpack_require__(2195);\n\nvar userAgentStartsWith = function (string) {\n  return userAgent.slice(0, string.length) === string;\n};\n\nmodule.exports = (function () {\n  if (userAgentStartsWith('Bun/')) return 'BUN';\n  if (userAgentStartsWith('Cloudflare-Workers')) return 'CLOUDFLARE';\n  if (userAgentStartsWith('Deno/')) return 'DENO';\n  if (userAgentStartsWith('Node.js/')) return 'NODE';\n  if (globalThis.Bun && typeof Bun.version == 'string') return 'BUN';\n  if (globalThis.Deno && typeof Deno.version == 'object') return 'DENO';\n  if (classof(globalThis.process) === 'process') return 'NODE';\n  if (globalThis.window && globalThis.document) return 'BROWSER';\n  return 'REST';\n})();\n\n\n/***/ },\n\n/***/ 8574\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\n\nvar $Error = Error;\nvar replace = uncurryThis(''.replace);\n\nvar TEST = (function (arg) { return String(new $Error(arg).stack); })('zxcasd');\n// eslint-disable-next-line redos/no-vulnerable, sonarjs/slow-regex -- safe\nvar V8_OR_CHAKRA_STACK_ENTRY = /\\n\\s*at [^:]*:[^\\n]*/;\nvar IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST);\n\nmodule.exports = function (stack, dropEntries) {\n  if (IS_V8_OR_CHAKRA_STACK && typeof stack == 'string' && !$Error.prepareStackTrace) {\n    while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, '');\n  } return stack;\n};\n\n\n/***/ },\n\n/***/ 6518\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\nvar getOwnPropertyDescriptor = (__webpack_require__(7347).f);\nvar createNonEnumerableProperty = __webpack_require__(6699);\nvar defineBuiltIn = __webpack_require__(6840);\nvar defineGlobalProperty = __webpack_require__(9433);\nvar copyConstructorProperties = __webpack_require__(7740);\nvar isForced = __webpack_require__(2796);\n\n/*\n  options.target         - name of the target object\n  options.global         - target is the global object\n  options.stat           - export as static methods of target\n  options.proto          - export as prototype methods of target\n  options.real           - real prototype method for the `pure` version\n  options.forced         - export even if the native feature is available\n  options.bind           - bind methods to the target, required for the `pure` version\n  options.wrap           - wrap constructors to preventing global pollution, required for the `pure` version\n  options.unsafe         - use the simple assignment of property instead of delete + defineProperty\n  options.sham           - add a flag to not completely full polyfills\n  options.enumerable     - export as enumerable property\n  options.dontCallGetSet - prevent calling a getter on target\n  options.name           - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n  var TARGET = options.target;\n  var GLOBAL = options.global;\n  var STATIC = options.stat;\n  var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n  if (GLOBAL) {\n    target = globalThis;\n  } else if (STATIC) {\n    target = globalThis[TARGET] || defineGlobalProperty(TARGET, {});\n  } else {\n    target = globalThis[TARGET] && globalThis[TARGET].prototype;\n  }\n  if (target) for (key in source) {\n    sourceProperty = source[key];\n    if (options.dontCallGetSet) {\n      descriptor = getOwnPropertyDescriptor(target, key);\n      targetProperty = descriptor && descriptor.value;\n    } else targetProperty = target[key];\n    FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n    // contained in target\n    if (!FORCED && targetProperty !== undefined) {\n      if (typeof sourceProperty == typeof targetProperty) continue;\n      copyConstructorProperties(sourceProperty, targetProperty);\n    }\n    // add a flag to not completely full polyfills\n    if (options.sham || (targetProperty && targetProperty.sham)) {\n      createNonEnumerableProperty(sourceProperty, 'sham', true);\n    }\n    defineBuiltIn(target, key, sourceProperty, options);\n  }\n};\n\n\n/***/ },\n\n/***/ 9039\n(module) {\n\n\nmodule.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (error) {\n    return true;\n  }\n};\n\n\n/***/ },\n\n/***/ 8745\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar NATIVE_BIND = __webpack_require__(616);\n\nvar FunctionPrototype = Function.prototype;\nvar apply = FunctionPrototype.apply;\nvar call = FunctionPrototype.call;\n\n// eslint-disable-next-line es/no-function-prototype-bind, es/no-reflect -- safe\nmodule.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () {\n  return call.apply(apply, arguments);\n});\n\n\n/***/ },\n\n/***/ 6080\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(7476);\nvar aCallable = __webpack_require__(9306);\nvar NATIVE_BIND = __webpack_require__(616);\n\nvar bind = uncurryThis(uncurryThis.bind);\n\n// optional / simple context binding\nmodule.exports = function (fn, that) {\n  aCallable(fn);\n  return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n\n\n/***/ },\n\n/***/ 616\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar fails = __webpack_require__(9039);\n\nmodule.exports = !fails(function () {\n  // eslint-disable-next-line es/no-function-prototype-bind -- safe\n  var test = function () { /* empty */ }.bind();\n  // eslint-disable-next-line no-prototype-builtins -- safe\n  return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n\n\n/***/ },\n\n/***/ 9565\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar NATIVE_BIND = __webpack_require__(616);\n\nvar call = Function.prototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n  return call.apply(call, arguments);\n};\n\n\n/***/ },\n\n/***/ 350\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar DESCRIPTORS = __webpack_require__(3724);\nvar hasOwn = __webpack_require__(9297);\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && function something() { /* empty */ }.name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n  EXISTS: EXISTS,\n  PROPER: PROPER,\n  CONFIGURABLE: CONFIGURABLE\n};\n\n\n/***/ },\n\n/***/ 6706\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\nvar aCallable = __webpack_require__(9306);\n\nmodule.exports = function (object, key, method) {\n  try {\n    // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n    return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method]));\n  } catch (error) { /* empty */ }\n};\n\n\n/***/ },\n\n/***/ 7476\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar classofRaw = __webpack_require__(2195);\nvar uncurryThis = __webpack_require__(9504);\n\nmodule.exports = function (fn) {\n  // Nashorn bug:\n  //   https://github.com/zloirock/core-js/issues/1128\n  //   https://github.com/zloirock/core-js/issues/1130\n  if (classofRaw(fn) === 'Function') return uncurryThis(fn);\n};\n\n\n/***/ },\n\n/***/ 9504\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar NATIVE_BIND = __webpack_require__(616);\n\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n  return function () {\n    return call.apply(fn, arguments);\n  };\n};\n\n\n/***/ },\n\n/***/ 944\n(module) {\n\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (options) {\n  var alphabet = options && options.alphabet;\n  if (alphabet === undefined || alphabet === 'base64' || alphabet === 'base64url') return alphabet || 'base64';\n  throw new $TypeError('Incorrect `alphabet` option');\n};\n\n\n/***/ },\n\n/***/ 9429\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\nvar IS_NODE = __webpack_require__(6193);\n\nmodule.exports = function (name) {\n  if (IS_NODE) {\n    try {\n      return globalThis.process.getBuiltinModule(name);\n    } catch (error) { /* empty */ }\n    try {\n      // eslint-disable-next-line no-new-func -- safe\n      return Function('return require(\"' + name + '\")')();\n    } catch (error) { /* empty */ }\n  }\n};\n\n\n/***/ },\n\n/***/ 7751\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\nvar isCallable = __webpack_require__(4901);\n\nvar aFunction = function (argument) {\n  return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n  return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method];\n};\n\n\n/***/ },\n\n/***/ 1767\n(module) {\n\n\n// `GetIteratorDirect(obj)` abstract operation\n// https://tc39.es/ecma262/#sec-getiteratordirect\nmodule.exports = function (obj) {\n  return {\n    iterator: obj,\n    next: obj.next,\n    done: false\n  };\n};\n\n\n/***/ },\n\n/***/ 8646\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar call = __webpack_require__(9565);\nvar anObject = __webpack_require__(8551);\nvar getIteratorDirect = __webpack_require__(1767);\nvar getIteratorMethod = __webpack_require__(851);\n\nmodule.exports = function (obj, stringHandling) {\n  if (!stringHandling || typeof obj !== 'string') anObject(obj);\n  var method = getIteratorMethod(obj);\n  return getIteratorDirect(anObject(method !== undefined ? call(method, obj) : obj));\n};\n\n\n/***/ },\n\n/***/ 851\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar classof = __webpack_require__(6955);\nvar getMethod = __webpack_require__(5966);\nvar isNullOrUndefined = __webpack_require__(4117);\nvar Iterators = __webpack_require__(6269);\nvar wellKnownSymbol = __webpack_require__(608);\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n  if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR)\n    || getMethod(it, '@@iterator')\n    || Iterators[classof(it)];\n};\n\n\n/***/ },\n\n/***/ 81\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar call = __webpack_require__(9565);\nvar aCallable = __webpack_require__(9306);\nvar anObject = __webpack_require__(8551);\nvar tryToString = __webpack_require__(6823);\nvar getIteratorMethod = __webpack_require__(851);\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument, usingIterator) {\n  var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;\n  if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));\n  throw new $TypeError(tryToString(argument) + ' is not iterable');\n};\n\n\n/***/ },\n\n/***/ 5966\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar aCallable = __webpack_require__(9306);\nvar isNullOrUndefined = __webpack_require__(4117);\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n  var func = V[P];\n  return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n\n\n/***/ },\n\n/***/ 3789\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar aCallable = __webpack_require__(9306);\nvar anObject = __webpack_require__(8551);\nvar call = __webpack_require__(9565);\nvar toIntegerOrInfinity = __webpack_require__(1291);\nvar getIteratorDirect = __webpack_require__(1767);\n\nvar INVALID_SIZE = 'Invalid size';\nvar $RangeError = RangeError;\nvar $TypeError = TypeError;\nvar max = Math.max;\n\nvar SetRecord = function (set, intSize) {\n  this.set = set;\n  this.size = max(intSize, 0);\n  this.has = aCallable(set.has);\n  this.keys = aCallable(set.keys);\n};\n\nSetRecord.prototype = {\n  getIterator: function () {\n    return getIteratorDirect(anObject(call(this.keys, this.set)));\n  },\n  includes: function (it) {\n    return call(this.has, this.set, it);\n  }\n};\n\n// `GetSetRecord` abstract operation\n// https://tc39.es/proposal-set-methods/#sec-getsetrecord\nmodule.exports = function (obj) {\n  anObject(obj);\n  var numSize = +obj.size;\n  // NOTE: If size is undefined, then numSize will be NaN\n  // eslint-disable-next-line no-self-compare -- NaN check\n  if (numSize !== numSize) throw new $TypeError(INVALID_SIZE);\n  var intSize = toIntegerOrInfinity(numSize);\n  if (intSize < 0) throw new $RangeError(INVALID_SIZE);\n  return new SetRecord(obj, intSize);\n};\n\n\n/***/ },\n\n/***/ 4576\n(module) {\n\n\nvar check = function (it) {\n  return it && it.Math === Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n  // eslint-disable-next-line es/no-global-this -- safe\n  check(typeof globalThis == 'object' && globalThis) ||\n  check(typeof window == 'object' && window) ||\n  // eslint-disable-next-line no-restricted-globals -- safe\n  check(typeof self == 'object' && self) ||\n  check(typeof global == 'object' && global) ||\n  check(typeof this == 'object' && this) ||\n  // eslint-disable-next-line no-new-func -- fallback\n  (function () { return this; })() || Function('return this')();\n\n\n/***/ },\n\n/***/ 9297\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\nvar toObject = __webpack_require__(8981);\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n  return hasOwnProperty(toObject(it), key);\n};\n\n\n/***/ },\n\n/***/ 421\n(module) {\n\n\nmodule.exports = {};\n\n\n/***/ },\n\n/***/ 397\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar getBuiltIn = __webpack_require__(7751);\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n\n\n/***/ },\n\n/***/ 5917\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar DESCRIPTORS = __webpack_require__(3724);\nvar fails = __webpack_require__(9039);\nvar createElement = __webpack_require__(4055);\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n  // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n  return Object.defineProperty(createElement('div'), 'a', {\n    get: function () { return 7; }\n  }).a !== 7;\n});\n\n\n/***/ },\n\n/***/ 7055\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\nvar fails = __webpack_require__(9039);\nvar classof = __webpack_require__(2195);\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n  // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n  // eslint-disable-next-line no-prototype-builtins -- safe\n  return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n  return classof(it) === 'String' ? split(it, '') : $Object(it);\n} : $Object;\n\n\n/***/ },\n\n/***/ 3167\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar isCallable = __webpack_require__(4901);\nvar isObject = __webpack_require__(34);\nvar setPrototypeOf = __webpack_require__(2967);\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n  var NewTarget, NewTargetPrototype;\n  if (\n    // it can work only with native `setPrototypeOf`\n    setPrototypeOf &&\n    // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n    isCallable(NewTarget = dummy.constructor) &&\n    NewTarget !== Wrapper &&\n    isObject(NewTargetPrototype = NewTarget.prototype) &&\n    NewTargetPrototype !== Wrapper.prototype\n  ) setPrototypeOf($this, NewTargetPrototype);\n  return $this;\n};\n\n\n/***/ },\n\n/***/ 3706\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\nvar isCallable = __webpack_require__(4901);\nvar store = __webpack_require__(7629);\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n  store.inspectSource = function (it) {\n    return functionToString(it);\n  };\n}\n\nmodule.exports = store.inspectSource;\n\n\n/***/ },\n\n/***/ 1181\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar NATIVE_WEAK_MAP = __webpack_require__(8622);\nvar globalThis = __webpack_require__(4576);\nvar isObject = __webpack_require__(34);\nvar createNonEnumerableProperty = __webpack_require__(6699);\nvar hasOwn = __webpack_require__(9297);\nvar shared = __webpack_require__(7629);\nvar sharedKey = __webpack_require__(6119);\nvar hiddenKeys = __webpack_require__(421);\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = globalThis.TypeError;\nvar WeakMap = globalThis.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n  return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n  return function (it) {\n    var state;\n    if (!isObject(it) || (state = get(it)).type !== TYPE) {\n      throw new TypeError('Incompatible receiver, ' + TYPE + ' required');\n    } return state;\n  };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n  var store = shared.state || (shared.state = new WeakMap());\n  /* eslint-disable no-self-assign -- prototype methods protection */\n  store.get = store.get;\n  store.has = store.has;\n  store.set = store.set;\n  /* eslint-enable no-self-assign -- prototype methods protection */\n  set = function (it, metadata) {\n    if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n    metadata.facade = it;\n    store.set(it, metadata);\n    return metadata;\n  };\n  get = function (it) {\n    return store.get(it) || {};\n  };\n  has = function (it) {\n    return store.has(it);\n  };\n} else {\n  var STATE = sharedKey('state');\n  hiddenKeys[STATE] = true;\n  set = function (it, metadata) {\n    if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n    metadata.facade = it;\n    createNonEnumerableProperty(it, STATE, metadata);\n    return metadata;\n  };\n  get = function (it) {\n    return hasOwn(it, STATE) ? it[STATE] : {};\n  };\n  has = function (it) {\n    return hasOwn(it, STATE);\n  };\n}\n\nmodule.exports = {\n  set: set,\n  get: get,\n  has: has,\n  enforce: enforce,\n  getterFor: getterFor\n};\n\n\n/***/ },\n\n/***/ 4209\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar wellKnownSymbol = __webpack_require__(608);\nvar Iterators = __webpack_require__(6269);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n\n\n/***/ },\n\n/***/ 4376\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar classof = __webpack_require__(2195);\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(argument) {\n  return classof(argument) === 'Array';\n};\n\n\n/***/ },\n\n/***/ 1108\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar classof = __webpack_require__(6955);\n\nmodule.exports = function (it) {\n  var klass = classof(it);\n  return klass === 'BigInt64Array' || klass === 'BigUint64Array';\n};\n\n\n/***/ },\n\n/***/ 4901\n(module) {\n\n\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot\nvar documentAll = typeof document == 'object' && document.all;\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\n// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing\nmodule.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) {\n  return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n  return typeof argument == 'function';\n};\n\n\n/***/ },\n\n/***/ 2796\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar fails = __webpack_require__(9039);\nvar isCallable = __webpack_require__(4901);\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n  var value = data[normalize(feature)];\n  return value === POLYFILL ? true\n    : value === NATIVE ? false\n    : isCallable(detection) ? fails(detection)\n    : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n  return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n\n\n/***/ },\n\n/***/ 4117\n(module) {\n\n\n// we can't use just `it == null` since of `document.all` special case\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec\nmodule.exports = function (it) {\n  return it === null || it === undefined;\n};\n\n\n/***/ },\n\n/***/ 34\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar isCallable = __webpack_require__(4901);\n\nmodule.exports = function (it) {\n  return typeof it == 'object' ? it !== null : isCallable(it);\n};\n\n\n/***/ },\n\n/***/ 3925\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar isObject = __webpack_require__(34);\n\nmodule.exports = function (argument) {\n  return isObject(argument) || argument === null;\n};\n\n\n/***/ },\n\n/***/ 6395\n(module) {\n\n\nmodule.exports = false;\n\n\n/***/ },\n\n/***/ 5810\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar isObject = __webpack_require__(34);\nvar getInternalState = (__webpack_require__(1181).get);\n\nmodule.exports = function isRawJSON(O) {\n  if (!isObject(O)) return false;\n  var state = getInternalState(O);\n  return !!state && state.type === 'RawJSON';\n};\n\n\n/***/ },\n\n/***/ 757\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar getBuiltIn = __webpack_require__(7751);\nvar isCallable = __webpack_require__(4901);\nvar isPrototypeOf = __webpack_require__(1625);\nvar USE_SYMBOL_AS_UID = __webpack_require__(7040);\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n  return typeof it == 'symbol';\n} : function (it) {\n  var $Symbol = getBuiltIn('Symbol');\n  return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n\n\n/***/ },\n\n/***/ 507\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar call = __webpack_require__(9565);\n\nmodule.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) {\n  var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator;\n  var next = record.next;\n  var step, result;\n  while (!(step = call(next, iterator)).done) {\n    result = fn(step.value);\n    if (result !== undefined) return result;\n  }\n};\n\n\n/***/ },\n\n/***/ 2652\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar bind = __webpack_require__(6080);\nvar call = __webpack_require__(9565);\nvar anObject = __webpack_require__(8551);\nvar tryToString = __webpack_require__(6823);\nvar isArrayIteratorMethod = __webpack_require__(4209);\nvar lengthOfArrayLike = __webpack_require__(6198);\nvar isPrototypeOf = __webpack_require__(1625);\nvar getIterator = __webpack_require__(81);\nvar getIteratorMethod = __webpack_require__(851);\nvar iteratorClose = __webpack_require__(9539);\n\nvar $TypeError = TypeError;\n\nvar Result = function (stopped, result) {\n  this.stopped = stopped;\n  this.result = result;\n};\n\nvar ResultPrototype = Result.prototype;\n\nmodule.exports = function (iterable, unboundFunction, options) {\n  var that = options && options.that;\n  var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n  var IS_RECORD = !!(options && options.IS_RECORD);\n  var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n  var INTERRUPTED = !!(options && options.INTERRUPTED);\n  var fn = bind(unboundFunction, that);\n  var iterator, iterFn, index, length, result, next, step;\n\n  var stop = function (condition) {\n    var $iterator = iterator;\n    iterator = undefined;\n    if ($iterator) iteratorClose($iterator, 'normal');\n    return new Result(true, condition);\n  };\n\n  var callFn = function (value) {\n    if (AS_ENTRIES) {\n      anObject(value);\n      return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n    } return INTERRUPTED ? fn(value, stop) : fn(value);\n  };\n\n  if (IS_RECORD) {\n    iterator = iterable.iterator;\n  } else if (IS_ITERATOR) {\n    iterator = iterable;\n  } else {\n    iterFn = getIteratorMethod(iterable);\n    if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable');\n    // optimisation for array iterators\n    if (isArrayIteratorMethod(iterFn)) {\n      for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {\n        result = callFn(iterable[index]);\n        if (result && isPrototypeOf(ResultPrototype, result)) return result;\n      } return new Result(false);\n    }\n    iterator = getIterator(iterable, iterFn);\n  }\n\n  next = IS_RECORD ? iterable.next : iterator.next;\n  while (!(step = call(next, iterator)).done) {\n    // `IteratorValue` errors should propagate without closing the iterator\n    var value = step.value;\n    try {\n      result = callFn(value);\n    } catch (error) {\n      if (iterator) iteratorClose(iterator, 'throw', error);\n      else throw error;\n    }\n    if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;\n  } return new Result(false);\n};\n\n\n/***/ },\n\n/***/ 1385\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar iteratorClose = __webpack_require__(9539);\n\nmodule.exports = function (iters, kind, value) {\n  for (var i = iters.length - 1; i >= 0; i--) {\n    if (iters[i] === undefined) continue;\n    try {\n      value = iteratorClose(iters[i].iterator, kind, value);\n    } catch (error) {\n      kind = 'throw';\n      value = error;\n    }\n  }\n  if (kind === 'throw') throw value;\n  return value;\n};\n\n\n/***/ },\n\n/***/ 9539\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar call = __webpack_require__(9565);\nvar anObject = __webpack_require__(8551);\nvar getMethod = __webpack_require__(5966);\n\nmodule.exports = function (iterator, kind, value) {\n  var innerResult, innerError;\n  anObject(iterator);\n  try {\n    innerResult = getMethod(iterator, 'return');\n    if (!innerResult) {\n      if (kind === 'throw') throw value;\n      return value;\n    }\n    innerResult = call(innerResult, iterator);\n  } catch (error) {\n    innerError = true;\n    innerResult = error;\n  }\n  if (kind === 'throw') throw value;\n  if (innerError) throw innerResult;\n  anObject(innerResult);\n  return value;\n};\n\n\n/***/ },\n\n/***/ 9462\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar call = __webpack_require__(9565);\nvar create = __webpack_require__(2360);\nvar createNonEnumerableProperty = __webpack_require__(6699);\nvar defineBuiltIns = __webpack_require__(6279);\nvar wellKnownSymbol = __webpack_require__(608);\nvar InternalStateModule = __webpack_require__(1181);\nvar getMethod = __webpack_require__(5966);\nvar IteratorPrototype = (__webpack_require__(7657).IteratorPrototype);\nvar createIterResultObject = __webpack_require__(2529);\nvar iteratorClose = __webpack_require__(9539);\nvar iteratorCloseAll = __webpack_require__(1385);\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ITERATOR_HELPER = 'IteratorHelper';\nvar WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator';\nvar NORMAL = 'normal';\nvar THROW = 'throw';\nvar setInternalState = InternalStateModule.set;\n\nvar createIteratorProxyPrototype = function (IS_ITERATOR) {\n  var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER);\n\n  return defineBuiltIns(create(IteratorPrototype), {\n    next: function next() {\n      var state = getInternalState(this);\n      // for simplification:\n      //   for `%WrapForValidIteratorPrototype%.next` or with `state.returnHandlerResult` our `nextHandler` returns `IterResultObject`\n      //   for `%IteratorHelperPrototype%.next` - just a value\n      if (IS_ITERATOR) return state.nextHandler();\n      if (state.done) return createIterResultObject(undefined, true);\n      try {\n        var result = state.nextHandler();\n        return state.returnHandlerResult ? result : createIterResultObject(result, state.done);\n      } catch (error) {\n        state.done = true;\n        throw error;\n      }\n    },\n    'return': function () {\n      var state = getInternalState(this);\n      var iterator = state.iterator;\n      var done = state.done;\n      state.done = true;\n      if (IS_ITERATOR) {\n        var returnMethod = getMethod(iterator, 'return');\n        return returnMethod ? call(returnMethod, iterator) : createIterResultObject(undefined, true);\n      }\n      if (done) return createIterResultObject(undefined, true);\n      if (state.inner) try {\n        iteratorClose(state.inner.iterator, NORMAL);\n      } catch (error) {\n        return iteratorClose(iterator, THROW, error);\n      }\n      if (state.openIters) try {\n        iteratorCloseAll(state.openIters, NORMAL);\n      } catch (error) {\n        if (iterator) return iteratorClose(iterator, THROW, error);\n        throw error;\n      }\n      if (iterator) iteratorClose(iterator, NORMAL);\n      return createIterResultObject(undefined, true);\n    }\n  });\n};\n\nvar WrapForValidIteratorPrototype = createIteratorProxyPrototype(true);\nvar IteratorHelperPrototype = createIteratorProxyPrototype(false);\n\ncreateNonEnumerableProperty(IteratorHelperPrototype, TO_STRING_TAG, 'Iterator Helper');\n\nmodule.exports = function (nextHandler, IS_ITERATOR, RETURN_HANDLER_RESULT) {\n  var IteratorProxy = function Iterator(record, state) {\n    if (state) {\n      state.iterator = record.iterator;\n      state.next = record.next;\n    } else state = record;\n    state.type = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER;\n    state.returnHandlerResult = !!RETURN_HANDLER_RESULT;\n    state.nextHandler = nextHandler;\n    state.counter = 0;\n    state.done = false;\n    setInternalState(this, state);\n  };\n\n  IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype;\n\n  return IteratorProxy;\n};\n\n\n/***/ },\n\n/***/ 684\n(module) {\n\n\n// Should throw an error on invalid iterator\n// https://issues.chromium.org/issues/336839115\nmodule.exports = function (methodName, argument) {\n  // eslint-disable-next-line es/no-iterator -- required for testing\n  var method = typeof Iterator == 'function' && Iterator.prototype[methodName];\n  if (method) try {\n    method.call({ next: null }, argument).next();\n  } catch (error) {\n    return true;\n  }\n};\n\n\n/***/ },\n\n/***/ 4549\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\n\n// https://github.com/tc39/ecma262/pull/3467\nmodule.exports = function (METHOD_NAME, ExpectedError) {\n  var Iterator = globalThis.Iterator;\n  var IteratorPrototype = Iterator && Iterator.prototype;\n  var method = IteratorPrototype && IteratorPrototype[METHOD_NAME];\n\n  var CLOSED = false;\n\n  if (method) try {\n    method.call({\n      next: function () { return { done: true }; },\n      'return': function () { CLOSED = true; }\n    }, -1);\n  } catch (error) {\n    // https://bugs.webkit.org/show_bug.cgi?id=291195\n    if (!(error instanceof ExpectedError)) CLOSED = false;\n  }\n\n  if (!CLOSED) return method;\n};\n\n\n/***/ },\n\n/***/ 7657\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar fails = __webpack_require__(9039);\nvar isCallable = __webpack_require__(4901);\nvar isObject = __webpack_require__(34);\nvar create = __webpack_require__(2360);\nvar getPrototypeOf = __webpack_require__(2787);\nvar defineBuiltIn = __webpack_require__(6840);\nvar wellKnownSymbol = __webpack_require__(608);\nvar IS_PURE = __webpack_require__(6395);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n/* eslint-disable es/no-array-prototype-keys -- safe */\nif ([].keys) {\n  arrayIterator = [].keys();\n  // Safari 8 has buggy iterators w/o `next`\n  if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n  else {\n    PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n    if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n  }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () {\n  var test = {};\n  // FF44- legacy iterators case\n  return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\nelse if (IS_PURE) IteratorPrototype = create(IteratorPrototype);\n\n// `%IteratorPrototype%[@@iterator]()` method\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n  defineBuiltIn(IteratorPrototype, ITERATOR, function () {\n    return this;\n  });\n}\n\nmodule.exports = {\n  IteratorPrototype: IteratorPrototype,\n  BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n\n\n/***/ },\n\n/***/ 6269\n(module) {\n\n\nmodule.exports = {};\n\n\n/***/ },\n\n/***/ 6198\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar toLength = __webpack_require__(8014);\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n  return toLength(obj.length);\n};\n\n\n/***/ },\n\n/***/ 283\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\nvar fails = __webpack_require__(9039);\nvar isCallable = __webpack_require__(4901);\nvar hasOwn = __webpack_require__(9297);\nvar DESCRIPTORS = __webpack_require__(3724);\nvar CONFIGURABLE_FUNCTION_NAME = (__webpack_require__(350).CONFIGURABLE);\nvar inspectSource = __webpack_require__(3706);\nvar InternalStateModule = __webpack_require__(1181);\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar $String = String;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\nvar stringSlice = uncurryThis(''.slice);\nvar replace = uncurryThis(''.replace);\nvar join = uncurryThis([].join);\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n  return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n  if (stringSlice($String(name), 0, 7) === 'Symbol(') {\n    name = '[' + replace($String(name), /^Symbol\\(([^)]*)\\).*$/, '$1') + ']';\n  }\n  if (options && options.getter) name = 'get ' + name;\n  if (options && options.setter) name = 'set ' + name;\n  if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n    if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });\n    else value.name = name;\n  }\n  if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n    defineProperty(value, 'length', { value: options.arity });\n  }\n  try {\n    if (options && hasOwn(options, 'constructor') && options.constructor) {\n      if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n    // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n    } else if (value.prototype) value.prototype = undefined;\n  } catch (error) { /* empty */ }\n  var state = enforceInternalState(value);\n  if (!hasOwn(state, 'source')) {\n    state.source = join(TEMPLATE, typeof name == 'string' ? name : '');\n  } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n  return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n\n\n/***/ },\n\n/***/ 2248\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\n\n// eslint-disable-next-line es/no-map -- safe\nvar MapPrototype = Map.prototype;\n\nmodule.exports = {\n  // eslint-disable-next-line es/no-map -- safe\n  Map: Map,\n  set: uncurryThis(MapPrototype.set),\n  get: uncurryThis(MapPrototype.get),\n  has: uncurryThis(MapPrototype.has),\n  remove: uncurryThis(MapPrototype['delete']),\n  proto: MapPrototype\n};\n\n\n/***/ },\n\n/***/ 741\n(module) {\n\n\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n  var n = +x;\n  return (n > 0 ? floor : ceil)(n);\n};\n\n\n/***/ },\n\n/***/ 7819\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\n/* eslint-disable es/no-json -- safe */\nvar fails = __webpack_require__(9039);\n\nmodule.exports = !fails(function () {\n  var unsafeInt = '9007199254740993';\n  // eslint-disable-next-line es/no-json-rawjson -- feature detection\n  var raw = JSON.rawJSON(unsafeInt);\n  // eslint-disable-next-line es/no-json-israwjson -- feature detection\n  return !JSON.isRawJSON(raw) || JSON.stringify(raw) !== unsafeInt;\n});\n\n\n/***/ },\n\n/***/ 6043\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar aCallable = __webpack_require__(9306);\n\nvar $TypeError = TypeError;\n\nvar PromiseCapability = function (C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw new $TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aCallable(resolve);\n  this.reject = aCallable(reject);\n};\n\n// `NewPromiseCapability` abstract operation\n// https://tc39.es/ecma262/#sec-newpromisecapability\nmodule.exports.f = function (C) {\n  return new PromiseCapability(C);\n};\n\n\n/***/ },\n\n/***/ 2603\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar toString = __webpack_require__(655);\n\nmodule.exports = function (argument, $default) {\n  return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument);\n};\n\n\n/***/ },\n\n/***/ 4149\n(module) {\n\n\nvar $RangeError = RangeError;\n\nmodule.exports = function (it) {\n  // eslint-disable-next-line no-self-compare -- NaN check\n  if (it === it) return it;\n  throw new $RangeError('NaN is not allowed');\n};\n\n\n/***/ },\n\n/***/ 2360\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\n/* global ActiveXObject -- old IE, WSH */\nvar anObject = __webpack_require__(8551);\nvar definePropertiesModule = __webpack_require__(6801);\nvar enumBugKeys = __webpack_require__(8727);\nvar hiddenKeys = __webpack_require__(421);\nvar html = __webpack_require__(397);\nvar documentCreateElement = __webpack_require__(4055);\nvar sharedKey = __webpack_require__(6119);\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n  return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n  activeXDocument.write(scriptTag(''));\n  activeXDocument.close();\n  var temp = activeXDocument.parentWindow.Object;\n  // eslint-disable-next-line no-useless-assignment -- avoid memory leak\n  activeXDocument = null;\n  return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = documentCreateElement('iframe');\n  var JS = 'java' + SCRIPT + ':';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  html.appendChild(iframe);\n  // https://github.com/zloirock/core-js/issues/475\n  iframe.src = String(JS);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(scriptTag('document.F=Object'));\n  iframeDocument.close();\n  return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n  try {\n    activeXDocument = new ActiveXObject('htmlfile');\n  } catch (error) { /* ignore */ }\n  NullProtoObject = typeof document != 'undefined'\n    ? document.domain && activeXDocument\n      ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n      : NullProtoObjectViaIFrame()\n    : NullProtoObjectViaActiveX(activeXDocument); // WSH\n  var length = enumBugKeys.length;\n  while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n  return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n// eslint-disable-next-line es/no-object-create -- safe\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    EmptyConstructor[PROTOTYPE] = anObject(O);\n    result = new EmptyConstructor();\n    EmptyConstructor[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = NullProtoObject();\n  return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n\n\n/***/ },\n\n/***/ 6801\n(__unused_webpack_module, exports, __webpack_require__) {\n\n\nvar DESCRIPTORS = __webpack_require__(3724);\nvar V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(8686);\nvar definePropertyModule = __webpack_require__(4913);\nvar anObject = __webpack_require__(8551);\nvar toIndexedObject = __webpack_require__(5397);\nvar objectKeys = __webpack_require__(1072);\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var props = toIndexedObject(Properties);\n  var keys = objectKeys(Properties);\n  var length = keys.length;\n  var index = 0;\n  var key;\n  while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n  return O;\n};\n\n\n/***/ },\n\n/***/ 4913\n(__unused_webpack_module, exports, __webpack_require__) {\n\n\nvar DESCRIPTORS = __webpack_require__(3724);\nvar IE8_DOM_DEFINE = __webpack_require__(5917);\nvar V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(8686);\nvar anObject = __webpack_require__(8551);\nvar toPropertyKey = __webpack_require__(6969);\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPropertyKey(P);\n  anObject(Attributes);\n  if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n    var current = $getOwnPropertyDescriptor(O, P);\n    if (current && current[WRITABLE]) {\n      O[P] = Attributes.value;\n      Attributes = {\n        configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n        enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n        writable: false\n      };\n    }\n  } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPropertyKey(P);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return $defineProperty(O, P, Attributes);\n  } catch (error) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n\n\n/***/ },\n\n/***/ 7347\n(__unused_webpack_module, exports, __webpack_require__) {\n\n\nvar DESCRIPTORS = __webpack_require__(3724);\nvar call = __webpack_require__(9565);\nvar propertyIsEnumerableModule = __webpack_require__(8773);\nvar createPropertyDescriptor = __webpack_require__(6980);\nvar toIndexedObject = __webpack_require__(5397);\nvar toPropertyKey = __webpack_require__(6969);\nvar hasOwn = __webpack_require__(9297);\nvar IE8_DOM_DEFINE = __webpack_require__(5917);\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n  O = toIndexedObject(O);\n  P = toPropertyKey(P);\n  if (IE8_DOM_DEFINE) try {\n    return $getOwnPropertyDescriptor(O, P);\n  } catch (error) { /* empty */ }\n  if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n\n\n/***/ },\n\n/***/ 8480\n(__unused_webpack_module, exports, __webpack_require__) {\n\n\nvar internalObjectKeys = __webpack_require__(1828);\nvar enumBugKeys = __webpack_require__(8727);\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return internalObjectKeys(O, hiddenKeys);\n};\n\n\n/***/ },\n\n/***/ 3717\n(__unused_webpack_module, exports) {\n\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ },\n\n/***/ 2787\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar hasOwn = __webpack_require__(9297);\nvar isCallable = __webpack_require__(4901);\nvar toObject = __webpack_require__(8981);\nvar sharedKey = __webpack_require__(6119);\nvar CORRECT_PROTOTYPE_GETTER = __webpack_require__(2211);\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar $Object = Object;\nvar ObjectPrototype = $Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n// eslint-disable-next-line es/no-object-getprototypeof -- safe\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) {\n  var object = toObject(O);\n  if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];\n  var constructor = object.constructor;\n  if (isCallable(constructor) && object instanceof constructor) {\n    return constructor.prototype;\n  } return object instanceof $Object ? ObjectPrototype : null;\n};\n\n\n/***/ },\n\n/***/ 1625\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n\n\n/***/ },\n\n/***/ 1828\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\nvar hasOwn = __webpack_require__(9297);\nvar toIndexedObject = __webpack_require__(5397);\nvar indexOf = (__webpack_require__(9617).indexOf);\nvar hiddenKeys = __webpack_require__(421);\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n  var O = toIndexedObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (hasOwn(O, key = names[i++])) {\n    ~indexOf(result, key) || push(result, key);\n  }\n  return result;\n};\n\n\n/***/ },\n\n/***/ 1072\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar internalObjectKeys = __webpack_require__(1828);\nvar enumBugKeys = __webpack_require__(8727);\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n  return internalObjectKeys(O, enumBugKeys);\n};\n\n\n/***/ },\n\n/***/ 8773\n(__unused_webpack_module, exports) {\n\n\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n  var descriptor = getOwnPropertyDescriptor(this, V);\n  return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n\n\n/***/ },\n\n/***/ 2967\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\n/* eslint-disable no-proto -- safe */\nvar uncurryThisAccessor = __webpack_require__(6706);\nvar isObject = __webpack_require__(34);\nvar requireObjectCoercible = __webpack_require__(7750);\nvar aPossiblePrototype = __webpack_require__(3506);\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n// eslint-disable-next-line es/no-object-setprototypeof -- safe\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n  var CORRECT_SETTER = false;\n  var test = {};\n  var setter;\n  try {\n    setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set');\n    setter(test, []);\n    CORRECT_SETTER = test instanceof Array;\n  } catch (error) { /* empty */ }\n  return function setPrototypeOf(O, proto) {\n    requireObjectCoercible(O);\n    aPossiblePrototype(proto);\n    if (!isObject(O)) return O;\n    if (CORRECT_SETTER) setter(O, proto);\n    else O.__proto__ = proto;\n    return O;\n  };\n}() : undefined);\n\n\n/***/ },\n\n/***/ 4270\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar call = __webpack_require__(9565);\nvar isCallable = __webpack_require__(4901);\nvar isObject = __webpack_require__(34);\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n  var fn, val;\n  if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n  if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n  if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n  throw new $TypeError(\"Can't convert object to primitive value\");\n};\n\n\n/***/ },\n\n/***/ 5031\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar getBuiltIn = __webpack_require__(7751);\nvar uncurryThis = __webpack_require__(9504);\nvar getOwnPropertyNamesModule = __webpack_require__(8480);\nvar getOwnPropertySymbolsModule = __webpack_require__(3717);\nvar anObject = __webpack_require__(8551);\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n  var keys = getOwnPropertyNamesModule.f(anObject(it));\n  var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n  return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n\n\n/***/ },\n\n/***/ 8235\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\nvar hasOwn = __webpack_require__(9297);\n\nvar $SyntaxError = SyntaxError;\nvar $parseInt = parseInt;\nvar fromCharCode = String.fromCharCode;\nvar at = uncurryThis(''.charAt);\nvar slice = uncurryThis(''.slice);\nvar exec = uncurryThis(/./.exec);\n\nvar codePoints = {\n  '\\\\\"': '\"',\n  '\\\\\\\\': '\\\\',\n  '\\\\/': '/',\n  '\\\\b': '\\b',\n  '\\\\f': '\\f',\n  '\\\\n': '\\n',\n  '\\\\r': '\\r',\n  '\\\\t': '\\t'\n};\n\nvar IS_4_HEX_DIGITS = /^[\\da-f]{4}$/i;\n// eslint-disable-next-line regexp/no-control-character -- safe\nvar IS_C0_CONTROL_CODE = /^[\\u0000-\\u001F]$/;\n\nmodule.exports = function (source, i) {\n  var unterminated = true;\n  var value = '';\n  while (i < source.length) {\n    var chr = at(source, i);\n    if (chr === '\\\\') {\n      var twoChars = slice(source, i, i + 2);\n      if (hasOwn(codePoints, twoChars)) {\n        value += codePoints[twoChars];\n        i += 2;\n      } else if (twoChars === '\\\\u') {\n        i += 2;\n        var fourHexDigits = slice(source, i, i + 4);\n        if (!exec(IS_4_HEX_DIGITS, fourHexDigits)) throw new $SyntaxError('Bad Unicode escape at: ' + i);\n        value += fromCharCode($parseInt(fourHexDigits, 16));\n        i += 4;\n      } else throw new $SyntaxError('Unknown escape sequence: \"' + twoChars + '\"');\n    } else if (chr === '\"') {\n      unterminated = false;\n      i++;\n      break;\n    } else {\n      if (exec(IS_C0_CONTROL_CODE, chr)) throw new $SyntaxError('Bad control character in string literal at: ' + i);\n      value += chr;\n      i++;\n    }\n  }\n  if (unterminated) throw new $SyntaxError('Unterminated string at: ' + i);\n  return { value: value, end: i };\n};\n\n\n/***/ },\n\n/***/ 1103\n(module) {\n\n\nmodule.exports = function (exec) {\n  try {\n    return { error: false, value: exec() };\n  } catch (error) {\n    return { error: true, value: error };\n  }\n};\n\n\n/***/ },\n\n/***/ 7750\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar isNullOrUndefined = __webpack_require__(4117);\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n  if (isNullOrUndefined(it)) throw new $TypeError(\"Can't call method on \" + it);\n  return it;\n};\n\n\n/***/ },\n\n/***/ 9286\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar SetHelpers = __webpack_require__(4402);\nvar iterate = __webpack_require__(8469);\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\n\nmodule.exports = function (set) {\n  var result = new Set();\n  iterate(set, function (it) {\n    add(result, it);\n  });\n  return result;\n};\n\n\n/***/ },\n\n/***/ 3440\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar aSet = __webpack_require__(7080);\nvar SetHelpers = __webpack_require__(4402);\nvar clone = __webpack_require__(9286);\nvar size = __webpack_require__(5170);\nvar getSetRecord = __webpack_require__(3789);\nvar iterateSet = __webpack_require__(8469);\nvar iterateSimple = __webpack_require__(507);\n\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.difference` method\n// https://tc39.es/ecma262/#sec-set.prototype.difference\nmodule.exports = function difference(other) {\n  var O = aSet(this);\n  var otherRec = getSetRecord(other);\n  var result = clone(O);\n  if (size(result) <= otherRec.size) iterateSet(result, function (e) {\n    if (otherRec.includes(e)) remove(result, e);\n  });\n  else iterateSimple(otherRec.getIterator(), function (e) {\n    if (has(result, e)) remove(result, e);\n  });\n  return result;\n};\n\n\n/***/ },\n\n/***/ 4402\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\n\n// eslint-disable-next-line es/no-set -- safe\nvar SetPrototype = Set.prototype;\n\nmodule.exports = {\n  // eslint-disable-next-line es/no-set -- safe\n  Set: Set,\n  add: uncurryThis(SetPrototype.add),\n  has: uncurryThis(SetPrototype.has),\n  remove: uncurryThis(SetPrototype['delete']),\n  proto: SetPrototype\n};\n\n\n/***/ },\n\n/***/ 8750\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar aSet = __webpack_require__(7080);\nvar SetHelpers = __webpack_require__(4402);\nvar size = __webpack_require__(5170);\nvar getSetRecord = __webpack_require__(3789);\nvar iterateSet = __webpack_require__(8469);\nvar iterateSimple = __webpack_require__(507);\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\n\n// `Set.prototype.intersection` method\n// https://tc39.es/ecma262/#sec-set.prototype.intersection\nmodule.exports = function intersection(other) {\n  var O = aSet(this);\n  var otherRec = getSetRecord(other);\n  var result = new Set();\n\n  if (size(O) > otherRec.size) {\n    iterateSimple(otherRec.getIterator(), function (e) {\n      if (has(O, e)) add(result, e);\n    });\n  } else {\n    iterateSet(O, function (e) {\n      if (otherRec.includes(e)) add(result, e);\n    });\n  }\n\n  return result;\n};\n\n\n/***/ },\n\n/***/ 4449\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar aSet = __webpack_require__(7080);\nvar has = (__webpack_require__(4402).has);\nvar size = __webpack_require__(5170);\nvar getSetRecord = __webpack_require__(3789);\nvar iterateSet = __webpack_require__(8469);\nvar iterateSimple = __webpack_require__(507);\nvar iteratorClose = __webpack_require__(9539);\n\n// `Set.prototype.isDisjointFrom` method\n// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom\nmodule.exports = function isDisjointFrom(other) {\n  var O = aSet(this);\n  var otherRec = getSetRecord(other);\n  if (size(O) <= otherRec.size) return iterateSet(O, function (e) {\n    if (otherRec.includes(e)) return false;\n  }, true) !== false;\n  var iterator = otherRec.getIterator();\n  return iterateSimple(iterator, function (e) {\n    if (has(O, e)) return iteratorClose(iterator.iterator, 'normal', false);\n  }) !== false;\n};\n\n\n/***/ },\n\n/***/ 3838\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar aSet = __webpack_require__(7080);\nvar size = __webpack_require__(5170);\nvar iterate = __webpack_require__(8469);\nvar getSetRecord = __webpack_require__(3789);\n\n// `Set.prototype.isSubsetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issubsetof\nmodule.exports = function isSubsetOf(other) {\n  var O = aSet(this);\n  var otherRec = getSetRecord(other);\n  if (size(O) > otherRec.size) return false;\n  return iterate(O, function (e) {\n    if (!otherRec.includes(e)) return false;\n  }, true) !== false;\n};\n\n\n/***/ },\n\n/***/ 8527\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar aSet = __webpack_require__(7080);\nvar has = (__webpack_require__(4402).has);\nvar size = __webpack_require__(5170);\nvar getSetRecord = __webpack_require__(3789);\nvar iterateSimple = __webpack_require__(507);\nvar iteratorClose = __webpack_require__(9539);\n\n// `Set.prototype.isSupersetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issupersetof\nmodule.exports = function isSupersetOf(other) {\n  var O = aSet(this);\n  var otherRec = getSetRecord(other);\n  if (size(O) < otherRec.size) return false;\n  var iterator = otherRec.getIterator();\n  return iterateSimple(iterator, function (e) {\n    if (!has(O, e)) return iteratorClose(iterator.iterator, 'normal', false);\n  }) !== false;\n};\n\n\n/***/ },\n\n/***/ 8469\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\nvar iterateSimple = __webpack_require__(507);\nvar SetHelpers = __webpack_require__(4402);\n\nvar Set = SetHelpers.Set;\nvar SetPrototype = SetHelpers.proto;\nvar forEach = uncurryThis(SetPrototype.forEach);\nvar keys = uncurryThis(SetPrototype.keys);\nvar next = keys(new Set()).next;\n\nmodule.exports = function (set, fn, interruptible) {\n  return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn);\n};\n\n\n/***/ },\n\n/***/ 4916\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar getBuiltIn = __webpack_require__(7751);\n\nvar createSetLike = function (size) {\n  return {\n    size: size,\n    has: function () {\n      return false;\n    },\n    keys: function () {\n      return {\n        next: function () {\n          return { done: true };\n        }\n      };\n    }\n  };\n};\n\nvar createSetLikeWithInfinitySize = function (size) {\n  return {\n    size: size,\n    has: function () {\n      return true;\n    },\n    keys: function () {\n      throw new Error('e');\n    }\n  };\n};\n\nmodule.exports = function (name, callback) {\n  var Set = getBuiltIn('Set');\n  try {\n    new Set()[name](createSetLike(0));\n    try {\n      // late spec change, early WebKit ~ Safari 17 implementation does not pass it\n      // https://github.com/tc39/proposal-set-methods/pull/88\n      // also covered engines with\n      // https://bugs.webkit.org/show_bug.cgi?id=272679\n      new Set()[name](createSetLike(-1));\n      return false;\n    } catch (error2) {\n      if (!callback) return true;\n      // early V8 implementation bug\n      // https://issues.chromium.org/issues/351332634\n      try {\n        new Set()[name](createSetLikeWithInfinitySize(-Infinity));\n        return false;\n      } catch (error) {\n        var set = new Set([1, 2]);\n        return callback(set[name](createSetLikeWithInfinitySize(Infinity)));\n      }\n    }\n  } catch (error) {\n    return false;\n  }\n};\n\n\n/***/ },\n\n/***/ 9835\n(module) {\n\n\n// Should get iterator record of a set-like object before cloning this\n// https://bugs.webkit.org/show_bug.cgi?id=289430\nmodule.exports = function (METHOD_NAME) {\n  try {\n    // eslint-disable-next-line es/no-set -- needed for test\n    var baseSet = new Set();\n    var setLike = {\n      size: 0,\n      has: function () { return true; },\n      keys: function () {\n        // eslint-disable-next-line es/no-object-defineproperty -- needed for test\n        return Object.defineProperty({}, 'next', {\n          get: function () {\n            baseSet.clear();\n            baseSet.add(4);\n            return function () {\n              return { done: true };\n            };\n          }\n        });\n      }\n    };\n    var result = baseSet[METHOD_NAME](setLike);\n\n    return result.size === 1 && result.values().next().value === 4;\n  } catch (error) {\n    return false;\n  }\n};\n\n\n/***/ },\n\n/***/ 5170\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThisAccessor = __webpack_require__(6706);\nvar SetHelpers = __webpack_require__(4402);\n\nmodule.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) {\n  return set.size;\n};\n\n\n/***/ },\n\n/***/ 3650\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar aSet = __webpack_require__(7080);\nvar SetHelpers = __webpack_require__(4402);\nvar clone = __webpack_require__(9286);\nvar getSetRecord = __webpack_require__(3789);\nvar iterateSimple = __webpack_require__(507);\n\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.symmetricDifference` method\n// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference\nmodule.exports = function symmetricDifference(other) {\n  var O = aSet(this);\n  var keysIter = getSetRecord(other).getIterator();\n  var result = clone(O);\n  iterateSimple(keysIter, function (e) {\n    if (has(O, e)) remove(result, e);\n    else add(result, e);\n  });\n  return result;\n};\n\n\n/***/ },\n\n/***/ 4204\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar aSet = __webpack_require__(7080);\nvar add = (__webpack_require__(4402).add);\nvar clone = __webpack_require__(9286);\nvar getSetRecord = __webpack_require__(3789);\nvar iterateSimple = __webpack_require__(507);\n\n// `Set.prototype.union` method\n// https://tc39.es/ecma262/#sec-set.prototype.union\nmodule.exports = function union(other) {\n  var O = aSet(this);\n  var keysIter = getSetRecord(other).getIterator();\n  var result = clone(O);\n  iterateSimple(keysIter, function (it) {\n    add(result, it);\n  });\n  return result;\n};\n\n\n/***/ },\n\n/***/ 6119\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar shared = __webpack_require__(5745);\nvar uid = __webpack_require__(3392);\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n  return keys[key] || (keys[key] = uid(key));\n};\n\n\n/***/ },\n\n/***/ 7629\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar IS_PURE = __webpack_require__(6395);\nvar globalThis = __webpack_require__(4576);\nvar defineGlobalProperty = __webpack_require__(9433);\n\nvar SHARED = '__core-js_shared__';\nvar store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {});\n\n(store.versions || (store.versions = [])).push({\n  version: '3.49.0',\n  mode: IS_PURE ? 'pure' : 'global',\n  copyright: '© 2013–2025 Denis Pushkarev (zloirock.ru), 2025–2026 CoreJS Company (core-js.io). All rights reserved.',\n  license: 'https://github.com/zloirock/core-js/blob/v3.49.0/LICENSE',\n  source: 'https://github.com/zloirock/core-js'\n});\n\n\n/***/ },\n\n/***/ 5745\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar store = __webpack_require__(7629);\n\nmodule.exports = function (key, value) {\n  return store[key] || (store[key] = value || {});\n};\n\n\n/***/ },\n\n/***/ 1548\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\nvar fails = __webpack_require__(9039);\nvar V8 = __webpack_require__(9519);\nvar ENVIRONMENT = __webpack_require__(4215);\n\nvar structuredClone = globalThis.structuredClone;\n\nmodule.exports = !!structuredClone && !fails(function () {\n  // prevent V8 ArrayBufferDetaching protector cell invalidation and performance degradation\n  // https://github.com/zloirock/core-js/issues/679\n  if ((ENVIRONMENT === 'DENO' && V8 > 92) || (ENVIRONMENT === 'NODE' && V8 > 94) || (ENVIRONMENT === 'BROWSER' && V8 > 97)) return false;\n  var buffer = new ArrayBuffer(8);\n  var clone = structuredClone(buffer, { transfer: [buffer] });\n  return buffer.byteLength !== 0 || clone.byteLength !== 8;\n});\n\n\n/***/ },\n\n/***/ 4495\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\n/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = __webpack_require__(9519);\nvar fails = __webpack_require__(9039);\nvar globalThis = __webpack_require__(4576);\n\nvar $String = globalThis.String;\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n  var symbol = Symbol('symbol detection');\n  // Chrome 38 Symbol has incorrect toString conversion\n  // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n  // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,\n  // of course, fail.\n  return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||\n    // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n    !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n\n\n/***/ },\n\n/***/ 5610\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar toIntegerOrInfinity = __webpack_require__(1291);\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n  var integer = toIntegerOrInfinity(index);\n  return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n\n\n/***/ },\n\n/***/ 5854\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar toPrimitive = __webpack_require__(2777);\n\nvar $TypeError = TypeError;\n\n// `ToBigInt` abstract operation\n// https://tc39.es/ecma262/#sec-tobigint\nmodule.exports = function (argument) {\n  var prim = toPrimitive(argument, 'number');\n  if (typeof prim == 'number') throw new $TypeError(\"Can't convert number to bigint\");\n  // eslint-disable-next-line es/no-bigint -- safe\n  return BigInt(prim);\n};\n\n\n/***/ },\n\n/***/ 7696\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar toIntegerOrInfinity = __webpack_require__(1291);\nvar toLength = __webpack_require__(8014);\n\nvar $RangeError = RangeError;\n\n// `ToIndex` abstract operation\n// https://tc39.es/ecma262/#sec-toindex\nmodule.exports = function (it) {\n  if (it === undefined) return 0;\n  var number = toIntegerOrInfinity(it);\n  var length = toLength(number);\n  if (number !== length) throw new $RangeError('Wrong length or index');\n  return length;\n};\n\n\n/***/ },\n\n/***/ 5397\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = __webpack_require__(7055);\nvar requireObjectCoercible = __webpack_require__(7750);\n\nmodule.exports = function (it) {\n  return IndexedObject(requireObjectCoercible(it));\n};\n\n\n/***/ },\n\n/***/ 1291\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar trunc = __webpack_require__(741);\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n  var number = +argument;\n  // eslint-disable-next-line no-self-compare -- NaN check\n  return number !== number || number === 0 ? 0 : trunc(number);\n};\n\n\n/***/ },\n\n/***/ 8014\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar toIntegerOrInfinity = __webpack_require__(1291);\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n  var len = toIntegerOrInfinity(argument);\n  return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n\n\n/***/ },\n\n/***/ 8981\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar requireObjectCoercible = __webpack_require__(7750);\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n  return $Object(requireObjectCoercible(argument));\n};\n\n\n/***/ },\n\n/***/ 9590\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar toIntegerOrInfinity = __webpack_require__(1291);\n\nvar $RangeError = RangeError;\n\nmodule.exports = function (it) {\n  var result = toIntegerOrInfinity(it);\n  if (result < 0) throw new $RangeError(\"The argument can't be less than 0\");\n  return result;\n};\n\n\n/***/ },\n\n/***/ 2777\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar call = __webpack_require__(9565);\nvar isObject = __webpack_require__(34);\nvar isSymbol = __webpack_require__(757);\nvar getMethod = __webpack_require__(5966);\nvar ordinaryToPrimitive = __webpack_require__(4270);\nvar wellKnownSymbol = __webpack_require__(608);\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n  if (!isObject(input) || isSymbol(input)) return input;\n  var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n  var result;\n  if (exoticToPrim) {\n    if (pref === undefined) pref = 'default';\n    result = call(exoticToPrim, input, pref);\n    if (!isObject(result) || isSymbol(result)) return result;\n    throw new $TypeError(\"Can't convert object to primitive value\");\n  }\n  if (pref === undefined) pref = 'number';\n  return ordinaryToPrimitive(input, pref);\n};\n\n\n/***/ },\n\n/***/ 6969\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar toPrimitive = __webpack_require__(2777);\nvar isSymbol = __webpack_require__(757);\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n  var key = toPrimitive(argument, 'string');\n  return isSymbol(key) ? key : key + '';\n};\n\n\n/***/ },\n\n/***/ 2140\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar wellKnownSymbol = __webpack_require__(608);\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n// eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n\n\n/***/ },\n\n/***/ 655\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar classof = __webpack_require__(6955);\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n  if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string');\n  return $String(argument);\n};\n\n\n/***/ },\n\n/***/ 6823\n(module) {\n\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n  try {\n    return $String(argument);\n  } catch (error) {\n    return 'Object';\n  }\n};\n\n\n/***/ },\n\n/***/ 3392\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.1.toString);\n\nmodule.exports = function (key) {\n  return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n\n\n/***/ },\n\n/***/ 9143\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\nvar uncurryThis = __webpack_require__(9504);\nvar anObjectOrUndefined = __webpack_require__(3972);\nvar aString = __webpack_require__(3463);\nvar hasOwn = __webpack_require__(9297);\nvar base64Map = __webpack_require__(2804);\nvar getAlphabetOption = __webpack_require__(944);\nvar notDetached = __webpack_require__(5169);\n\nvar base64Alphabet = base64Map.c2i;\nvar base64UrlAlphabet = base64Map.c2iUrl;\n\nvar SyntaxError = globalThis.SyntaxError;\nvar TypeError = globalThis.TypeError;\nvar at = uncurryThis(''.charAt);\n\nvar skipAsciiWhitespace = function (string, index) {\n  var length = string.length;\n  for (;index < length; index++) {\n    var chr = at(string, index);\n    if (chr !== ' ' && chr !== '\\t' && chr !== '\\n' && chr !== '\\f' && chr !== '\\r') break;\n  } return index;\n};\n\nvar decodeBase64Chunk = function (chunk, alphabet, throwOnExtraBits) {\n  var chunkLength = chunk.length;\n\n  if (chunkLength < 4) {\n    chunk += chunkLength === 2 ? 'AA' : 'A';\n  }\n\n  var triplet = (alphabet[at(chunk, 0)] << 18)\n    + (alphabet[at(chunk, 1)] << 12)\n    + (alphabet[at(chunk, 2)] << 6)\n    + alphabet[at(chunk, 3)];\n\n  var chunkBytes = [\n    (triplet >> 16) & 255,\n    (triplet >> 8) & 255,\n    triplet & 255\n  ];\n\n  if (chunkLength === 2) {\n    if (throwOnExtraBits && chunkBytes[1] !== 0) {\n      throw new SyntaxError('Extra bits');\n    }\n    return [chunkBytes[0]];\n  }\n\n  if (chunkLength === 3) {\n    if (throwOnExtraBits && chunkBytes[2] !== 0) {\n      throw new SyntaxError('Extra bits');\n    }\n    return [chunkBytes[0], chunkBytes[1]];\n  }\n\n  return chunkBytes;\n};\n\nvar writeBytes = function (bytes, elements, written) {\n  var elementsLength = elements.length;\n  for (var index = 0; index < elementsLength; index++) {\n    bytes[written + index] = elements[index];\n  }\n  return written + elementsLength;\n};\n\n/* eslint-disable max-statements, max-depth -- TODO */\nmodule.exports = function (string, options, into, maxLength) {\n  aString(string);\n  anObjectOrUndefined(options);\n  var alphabet = getAlphabetOption(options) === 'base64' ? base64Alphabet : base64UrlAlphabet;\n  var lastChunkHandling = options ? options.lastChunkHandling : undefined;\n\n  if (lastChunkHandling === undefined) lastChunkHandling = 'loose';\n\n  if (lastChunkHandling !== 'loose' && lastChunkHandling !== 'strict' && lastChunkHandling !== 'stop-before-partial') {\n    throw new TypeError('Incorrect `lastChunkHandling` option');\n  }\n\n  if (into) notDetached(into.buffer);\n\n  var stringLength = string.length;\n  var bytes = into || [];\n  var written = 0;\n  var read = 0;\n  var chunk = '';\n  var index = 0;\n\n  if (maxLength) while (true) {\n    index = skipAsciiWhitespace(string, index);\n    if (index === stringLength) {\n      if (chunk.length > 0) {\n        if (lastChunkHandling === 'stop-before-partial') {\n          break;\n        }\n        if (lastChunkHandling === 'loose') {\n          if (chunk.length === 1) {\n            throw new SyntaxError('Malformed padding: exactly one additional character');\n          }\n          written = writeBytes(bytes, decodeBase64Chunk(chunk, alphabet, false), written);\n        } else {\n          throw new SyntaxError('Missing padding');\n        }\n      }\n      read = stringLength;\n      break;\n    }\n    var chr = at(string, index);\n    ++index;\n    if (chr === '=') {\n      if (chunk.length < 2) {\n        throw new SyntaxError('Padding is too early');\n      }\n      index = skipAsciiWhitespace(string, index);\n      if (chunk.length === 2) {\n        if (index === stringLength) {\n          if (lastChunkHandling === 'stop-before-partial') {\n            break;\n          }\n          throw new SyntaxError('Malformed padding: only one =');\n        }\n        if (at(string, index) === '=') {\n          ++index;\n          index = skipAsciiWhitespace(string, index);\n        }\n      }\n      if (index < stringLength) {\n        throw new SyntaxError('Unexpected character after padding');\n      }\n      written = writeBytes(bytes, decodeBase64Chunk(chunk, alphabet, lastChunkHandling === 'strict'), written);\n      read = stringLength;\n      break;\n    }\n    if (!hasOwn(alphabet, chr)) {\n      throw new SyntaxError('Unexpected character');\n    }\n    var remainingBytes = maxLength - written;\n    if (remainingBytes === 1 && chunk.length === 2 || remainingBytes === 2 && chunk.length === 3) {\n      // special case: we can fit exactly the number of bytes currently represented by chunk, so we were just checking for `=`\n      break;\n    }\n\n    chunk += chr;\n    if (chunk.length === 4) {\n      written = writeBytes(bytes, decodeBase64Chunk(chunk, alphabet, false), written);\n      chunk = '';\n      read = index;\n      if (written === maxLength) {\n        break;\n      }\n    }\n  }\n\n  return { bytes: bytes, read: read, written: written };\n};\n\n\n/***/ },\n\n/***/ 2303\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\nvar uncurryThis = __webpack_require__(9504);\n\nvar Uint8Array = globalThis.Uint8Array;\nvar SyntaxError = globalThis.SyntaxError;\nvar min = Math.min;\nvar stringMatch = uncurryThis(''.match);\n\nmodule.exports = function (string, into) {\n  var stringLength = string.length;\n  if (stringLength % 2 !== 0) throw new SyntaxError('String should be an even number of characters');\n  var maxLength = into ? min(into.length, stringLength / 2) : stringLength / 2;\n  var bytes = into || new Uint8Array(maxLength);\n  var segments = stringMatch(string, /.{2}/g);\n  var written = 0;\n  for (; written < maxLength; written++) {\n    var result = +('0x' + segments[written] + '0');\n    // eslint-disable-next-line no-self-compare -- NaN check\n    if (result !== result) {\n      throw new SyntaxError('String should only contain hex characters');\n    }\n    bytes[written] = result >> 4;\n  }\n  return { bytes: bytes, read: written << 1 };\n};\n\n\n/***/ },\n\n/***/ 7416\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar fails = __webpack_require__(9039);\nvar wellKnownSymbol = __webpack_require__(608);\nvar DESCRIPTORS = __webpack_require__(3724);\nvar IS_PURE = __webpack_require__(6395);\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n  // eslint-disable-next-line unicorn/relative-url-style -- required for testing\n  var url = new URL('b?a=1&b=2&c=3', 'https://a');\n  var params = url.searchParams;\n  var params2 = new URLSearchParams('a=1&a=2&b=3');\n  var result = '';\n  url.pathname = 'c%20d';\n  params.forEach(function (value, key) {\n    params['delete']('b');\n    result += key + value;\n  });\n  params2['delete']('a', 2);\n  // `undefined` case is a Chromium 117 bug\n  // https://bugs.chromium.org/p/v8/issues/detail?id=14222\n  params2['delete']('b', undefined);\n  return (IS_PURE && (!url.toJSON || !params2.has('a', 1) || params2.has('a', 2) || !params2.has('a', undefined) || params2.has('b')))\n    || (!params.size && (IS_PURE || !DESCRIPTORS))\n    || !params.sort\n    || url.href !== 'https://a/c%20d?a=1&c=3'\n    || params.get('c') !== '3'\n    || String(new URLSearchParams('?a=1')) !== 'a=1'\n    || !params[ITERATOR]\n    // throws in Edge\n    || new URL('https://a@b').username !== 'a'\n    || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n    // not punycoded in Edge\n    || new URL('https://тест').host !== 'xn--e1aybc'\n    // not escaped in Chrome 62-\n    || new URL('https://a#б').hash !== '#%D0%B1'\n    // fails in Chrome 66-\n    || result !== 'a1c3'\n    // throws in Safari\n    || new URL('https://x', undefined).host !== 'x';\n});\n\n\n/***/ },\n\n/***/ 7040\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\n/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = __webpack_require__(4495);\n\nmodule.exports = NATIVE_SYMBOL &&\n  !Symbol.sham &&\n  typeof Symbol.iterator == 'symbol';\n\n\n/***/ },\n\n/***/ 8686\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar DESCRIPTORS = __webpack_require__(3724);\nvar fails = __webpack_require__(9039);\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n  // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n  return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n    value: 42,\n    writable: false\n  }).prototype !== 42;\n});\n\n\n/***/ },\n\n/***/ 2812\n(module) {\n\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (passed, required) {\n  if (passed < required) throw new $TypeError('Not enough arguments');\n  return passed;\n};\n\n\n/***/ },\n\n/***/ 8622\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\nvar isCallable = __webpack_require__(4901);\n\nvar WeakMap = globalThis.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n\n\n/***/ },\n\n/***/ 4995\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar uncurryThis = __webpack_require__(9504);\n\n// eslint-disable-next-line es/no-weak-map -- safe\nvar WeakMapPrototype = WeakMap.prototype;\n\nmodule.exports = {\n  // eslint-disable-next-line es/no-weak-map -- safe\n  WeakMap: WeakMap,\n  set: uncurryThis(WeakMapPrototype.set),\n  get: uncurryThis(WeakMapPrototype.get),\n  has: uncurryThis(WeakMapPrototype.has),\n  remove: uncurryThis(WeakMapPrototype['delete'])\n};\n\n\n/***/ },\n\n/***/ 608\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar globalThis = __webpack_require__(4576);\nvar shared = __webpack_require__(5745);\nvar hasOwn = __webpack_require__(9297);\nvar uid = __webpack_require__(3392);\nvar NATIVE_SYMBOL = __webpack_require__(4495);\nvar USE_SYMBOL_AS_UID = __webpack_require__(7040);\n\nvar Symbol = globalThis.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n  if (!hasOwn(WellKnownSymbolsStore, name)) {\n    WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)\n      ? Symbol[name]\n      : createWellKnownSymbol('Symbol.' + name);\n  } return WellKnownSymbolsStore[name];\n};\n\n\n/***/ },\n\n/***/ 6573\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar DESCRIPTORS = __webpack_require__(3724);\nvar defineBuiltInAccessor = __webpack_require__(2106);\nvar isDetached = __webpack_require__(3238);\n\nvar ArrayBufferPrototype = ArrayBuffer.prototype;\n\n// `ArrayBuffer.prototype.detached` getter\n// https://tc39.es/ecma262/#sec-get-arraybuffer.prototype.detached\nif (DESCRIPTORS && !('detached' in ArrayBufferPrototype)) {\n  defineBuiltInAccessor(ArrayBufferPrototype, 'detached', {\n    configurable: true,\n    get: function detached() {\n      return isDetached(this);\n    }\n  });\n}\n\n\n/***/ },\n\n/***/ 7936\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar $transfer = __webpack_require__(5636);\n\n// `ArrayBuffer.prototype.transferToFixedLength` method\n// https://tc39.es/ecma262/#sec-arraybuffer.prototype.transfertofixedlength\nif ($transfer) $({ target: 'ArrayBuffer', proto: true }, {\n  transferToFixedLength: function transferToFixedLength() {\n    return $transfer(this, arguments.length ? arguments[0] : undefined, false);\n  }\n});\n\n\n/***/ },\n\n/***/ 8100\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar $transfer = __webpack_require__(5636);\n\n// `ArrayBuffer.prototype.transfer` method\n// https://tc39.es/ecma262/#sec-arraybuffer.prototype.transfer\nif ($transfer) $({ target: 'ArrayBuffer', proto: true }, {\n  transfer: function transfer() {\n    return $transfer(this, arguments.length ? arguments[0] : undefined, true);\n  }\n});\n\n\n/***/ },\n\n/***/ 4423\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar $includes = (__webpack_require__(9617).includes);\nvar fails = __webpack_require__(9039);\nvar addToUnscopables = __webpack_require__(6469);\n\n// FF99+ bug\nvar BROKEN_ON_SPARSE = fails(function () {\n  // eslint-disable-next-line es/no-array-prototype-includes -- detection\n  return !Array(1).includes();\n});\n\n// Safari 26.4- bug\nvar BROKEN_ON_SPARSE_WITH_FROM_INDEX = fails(function () {\n  // eslint-disable-next-line no-sparse-arrays, es/no-array-prototype-includes -- detection\n  return [, 1].includes(undefined, 1);\n});\n\n// `Array.prototype.includes` method\n// https://tc39.es/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE || BROKEN_ON_SPARSE_WITH_FROM_INDEX }, {\n  includes: function includes(el /* , fromIndex = 0 */) {\n    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n\n\n/***/ },\n\n/***/ 4114\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar toObject = __webpack_require__(8981);\nvar lengthOfArrayLike = __webpack_require__(6198);\nvar setArrayLength = __webpack_require__(4527);\nvar doesNotExceedSafeInteger = __webpack_require__(6837);\nvar fails = __webpack_require__(9039);\n\nvar INCORRECT_TO_LENGTH = fails(function () {\n  return [].push.call({ length: 0x100000000 }, 1) !== 4294967297;\n});\n\n// V8 <= 121 and Safari <= 15.4; FF < 23 throws InternalError\n// https://bugs.chromium.org/p/v8/issues/detail?id=12681\nvar properErrorOnNonWritableLength = function () {\n  try {\n    // eslint-disable-next-line es/no-object-defineproperty -- safe\n    Object.defineProperty([], 'length', { writable: false }).push();\n  } catch (error) {\n    return error instanceof TypeError;\n  }\n};\n\nvar FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength();\n\n// `Array.prototype.push` method\n// https://tc39.es/ecma262/#sec-array.prototype.push\n$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, {\n  // eslint-disable-next-line no-unused-vars -- required for `.length`\n  push: function push(item) {\n    var O = toObject(this);\n    var len = lengthOfArrayLike(O);\n    var argCount = arguments.length;\n    doesNotExceedSafeInteger(len + argCount);\n    for (var i = 0; i < argCount; i++) {\n      O[len] = arguments[i];\n      len++;\n    }\n    setArrayLength(O, len);\n    return len;\n  }\n});\n\n\n/***/ },\n\n/***/ 8111\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar globalThis = __webpack_require__(4576);\nvar anInstance = __webpack_require__(679);\nvar anObject = __webpack_require__(8551);\nvar isCallable = __webpack_require__(4901);\nvar getPrototypeOf = __webpack_require__(2787);\nvar defineBuiltInAccessor = __webpack_require__(2106);\nvar createProperty = __webpack_require__(4659);\nvar fails = __webpack_require__(9039);\nvar hasOwn = __webpack_require__(9297);\nvar wellKnownSymbol = __webpack_require__(608);\nvar IteratorPrototype = (__webpack_require__(7657).IteratorPrototype);\nvar DESCRIPTORS = __webpack_require__(3724);\nvar IS_PURE = __webpack_require__(6395);\n\nvar CONSTRUCTOR = 'constructor';\nvar ITERATOR = 'Iterator';\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nvar $TypeError = TypeError;\nvar NativeIterator = globalThis[ITERATOR];\n\n// FF56- have non-standard global helper `Iterator`\nvar FORCED = IS_PURE\n  || !isCallable(NativeIterator)\n  || NativeIterator.prototype !== IteratorPrototype\n  // FF44- non-standard `Iterator` passes previous tests\n  || !fails(function () { NativeIterator({}); });\n\nvar IteratorConstructor = function Iterator() {\n  anInstance(this, IteratorPrototype);\n  if (getPrototypeOf(this) === IteratorPrototype) throw new $TypeError('Abstract class Iterator not directly constructable');\n};\n\nvar defineIteratorPrototypeAccessor = function (key, value) {\n  if (DESCRIPTORS) {\n    defineBuiltInAccessor(IteratorPrototype, key, {\n      configurable: true,\n      get: function () {\n        return value;\n      },\n      set: function (replacement) {\n        anObject(this);\n        if (this === IteratorPrototype) throw new $TypeError(\"You can't redefine this property\");\n        if (hasOwn(this, key)) this[key] = replacement;\n        else createProperty(this, key, replacement);\n      }\n    });\n  } else IteratorPrototype[key] = value;\n};\n\nif (!hasOwn(IteratorPrototype, TO_STRING_TAG)) defineIteratorPrototypeAccessor(TO_STRING_TAG, ITERATOR);\n\nif (FORCED || !hasOwn(IteratorPrototype, CONSTRUCTOR) || IteratorPrototype[CONSTRUCTOR] === Object) {\n  defineIteratorPrototypeAccessor(CONSTRUCTOR, IteratorConstructor);\n}\n\nIteratorConstructor.prototype = IteratorPrototype;\n\n// `Iterator` constructor\n// https://tc39.es/ecma262/#sec-iterator\n$({ global: true, constructor: true, forced: FORCED }, {\n  Iterator: IteratorConstructor\n});\n\n\n/***/ },\n\n/***/ 9314\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar call = __webpack_require__(9565);\nvar anObject = __webpack_require__(8551);\nvar getIteratorDirect = __webpack_require__(1767);\nvar notANaN = __webpack_require__(4149);\nvar toPositiveInteger = __webpack_require__(9590);\nvar iteratorClose = __webpack_require__(9539);\nvar createIteratorProxy = __webpack_require__(9462);\nvar iteratorHelperThrowsOnInvalidIterator = __webpack_require__(684);\nvar iteratorHelperWithoutClosingOnEarlyError = __webpack_require__(4549);\nvar IS_PURE = __webpack_require__(6395);\n\nvar DROP_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('drop', 0);\nvar dropWithoutClosingOnEarlyError = !IS_PURE && !DROP_WITHOUT_THROWING_ON_INVALID_ITERATOR\n  && iteratorHelperWithoutClosingOnEarlyError('drop', RangeError);\n\nvar FORCED = IS_PURE || DROP_WITHOUT_THROWING_ON_INVALID_ITERATOR || dropWithoutClosingOnEarlyError;\n\nvar IteratorProxy = createIteratorProxy(function () {\n  var iterator = this.iterator;\n  var next = this.next;\n  var result, done;\n  while (this.remaining) {\n    this.remaining--;\n    result = anObject(call(next, iterator));\n    done = this.done = !!result.done;\n    if (done) return;\n  }\n  result = anObject(call(next, iterator));\n  done = this.done = !!result.done;\n  if (!done) return result.value;\n});\n\n// `Iterator.prototype.drop` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.drop\n$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, {\n  drop: function drop(limit) {\n    anObject(this);\n    var remaining;\n    try {\n      remaining = toPositiveInteger(notANaN(+limit));\n    } catch (error) {\n      iteratorClose(this, 'throw', error);\n    }\n\n    if (dropWithoutClosingOnEarlyError) return call(dropWithoutClosingOnEarlyError, this, remaining);\n\n    return new IteratorProxy(getIteratorDirect(this), {\n      remaining: remaining\n    });\n  }\n});\n\n\n/***/ },\n\n/***/ 1148\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar call = __webpack_require__(9565);\nvar iterate = __webpack_require__(2652);\nvar aCallable = __webpack_require__(9306);\nvar anObject = __webpack_require__(8551);\nvar getIteratorDirect = __webpack_require__(1767);\nvar iteratorClose = __webpack_require__(9539);\nvar iteratorHelperWithoutClosingOnEarlyError = __webpack_require__(4549);\n\nvar everyWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('every', TypeError);\n\n// `Iterator.prototype.every` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.every\n$({ target: 'Iterator', proto: true, real: true, forced: everyWithoutClosingOnEarlyError }, {\n  every: function every(predicate) {\n    anObject(this);\n    try {\n      aCallable(predicate);\n    } catch (error) {\n      iteratorClose(this, 'throw', error);\n    }\n\n    if (everyWithoutClosingOnEarlyError) return call(everyWithoutClosingOnEarlyError, this, predicate);\n\n    var record = getIteratorDirect(this);\n    var counter = 0;\n    return !iterate(record, function (value, stop) {\n      if (!predicate(value, counter++)) return stop();\n    }, { IS_RECORD: true, INTERRUPTED: true }).stopped;\n  }\n});\n\n\n/***/ },\n\n/***/ 2489\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar call = __webpack_require__(9565);\nvar aCallable = __webpack_require__(9306);\nvar anObject = __webpack_require__(8551);\nvar getIteratorDirect = __webpack_require__(1767);\nvar createIteratorProxy = __webpack_require__(9462);\nvar callWithSafeIterationClosing = __webpack_require__(6319);\nvar IS_PURE = __webpack_require__(6395);\nvar iteratorClose = __webpack_require__(9539);\nvar iteratorHelperThrowsOnInvalidIterator = __webpack_require__(684);\nvar iteratorHelperWithoutClosingOnEarlyError = __webpack_require__(4549);\n\nvar FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('filter', function () { /* empty */ });\nvar filterWithoutClosingOnEarlyError = !IS_PURE && !FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR\n  && iteratorHelperWithoutClosingOnEarlyError('filter', TypeError);\n\nvar FORCED = IS_PURE || FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR || filterWithoutClosingOnEarlyError;\n\nvar IteratorProxy = createIteratorProxy(function () {\n  var iterator = this.iterator;\n  var predicate = this.predicate;\n  var next = this.next;\n  var result, done, value;\n  while (true) {\n    result = anObject(call(next, iterator));\n    done = this.done = !!result.done;\n    if (done) return;\n    value = result.value;\n    if (callWithSafeIterationClosing(iterator, predicate, [value, this.counter++], true)) return value;\n  }\n});\n\n// `Iterator.prototype.filter` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.filter\n$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, {\n  filter: function filter(predicate) {\n    anObject(this);\n    try {\n      aCallable(predicate);\n    } catch (error) {\n      iteratorClose(this, 'throw', error);\n    }\n\n    if (filterWithoutClosingOnEarlyError) return call(filterWithoutClosingOnEarlyError, this, predicate);\n\n    return new IteratorProxy(getIteratorDirect(this), {\n      predicate: predicate\n    });\n  }\n});\n\n\n/***/ },\n\n/***/ 116\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar call = __webpack_require__(9565);\nvar iterate = __webpack_require__(2652);\nvar aCallable = __webpack_require__(9306);\nvar anObject = __webpack_require__(8551);\nvar getIteratorDirect = __webpack_require__(1767);\nvar iteratorClose = __webpack_require__(9539);\nvar iteratorHelperWithoutClosingOnEarlyError = __webpack_require__(4549);\n\nvar findWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('find', TypeError);\n\n// `Iterator.prototype.find` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.find\n$({ target: 'Iterator', proto: true, real: true, forced: findWithoutClosingOnEarlyError }, {\n  find: function find(predicate) {\n    anObject(this);\n    try {\n      aCallable(predicate);\n    } catch (error) {\n      iteratorClose(this, 'throw', error);\n    }\n\n    if (findWithoutClosingOnEarlyError) return call(findWithoutClosingOnEarlyError, this, predicate);\n\n    var record = getIteratorDirect(this);\n    var counter = 0;\n    return iterate(record, function (value, stop) {\n      if (predicate(value, counter++)) return stop(value);\n    }, { IS_RECORD: true, INTERRUPTED: true }).result;\n  }\n});\n\n\n/***/ },\n\n/***/ 531\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar call = __webpack_require__(9565);\nvar aCallable = __webpack_require__(9306);\nvar anObject = __webpack_require__(8551);\nvar getIteratorDirect = __webpack_require__(1767);\nvar getIteratorFlattenable = __webpack_require__(8646);\nvar createIteratorProxy = __webpack_require__(9462);\nvar iteratorClose = __webpack_require__(9539);\nvar IS_PURE = __webpack_require__(6395);\nvar iteratorHelperThrowsOnInvalidIterator = __webpack_require__(684);\nvar iteratorHelperWithoutClosingOnEarlyError = __webpack_require__(4549);\n\n// Should not throw an error for an iterator without `return` method. Fixed in Safari 26.2\n// https://bugs.webkit.org/show_bug.cgi?id=297532\nfunction throwsOnIteratorWithoutReturn() {\n  try {\n    // eslint-disable-next-line es/no-map, es/no-iterator, es/no-iterator-prototype-flatmap -- required for testing\n    var it = Iterator.prototype.flatMap.call(new Map([[4, 5]]).entries(), function (v) { return v; });\n    it.next();\n    it['return']();\n  } catch (error) {\n    return true;\n  }\n}\n\nvar FLAT_MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE\n  && !iteratorHelperThrowsOnInvalidIterator('flatMap', function () { /* empty */ });\nvar flatMapWithoutClosingOnEarlyError = !IS_PURE && !FLAT_MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR\n  && iteratorHelperWithoutClosingOnEarlyError('flatMap', TypeError);\n\nvar FORCED = IS_PURE || FLAT_MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR || flatMapWithoutClosingOnEarlyError\n  || throwsOnIteratorWithoutReturn();\n\nvar IteratorProxy = createIteratorProxy(function () {\n  var iterator = this.iterator;\n  var mapper = this.mapper;\n  var result, inner;\n\n  while (true) {\n    if (inner = this.inner) try {\n      result = anObject(call(inner.next, inner.iterator));\n      if (!result.done) return result.value;\n      this.inner = null;\n    } catch (error) { iteratorClose(iterator, 'throw', error); }\n\n    result = anObject(call(this.next, iterator));\n\n    if (this.done = !!result.done) return;\n\n    try {\n      this.inner = getIteratorFlattenable(mapper(result.value, this.counter++), false);\n    } catch (error) { iteratorClose(iterator, 'throw', error); }\n  }\n});\n\n// `Iterator.prototype.flatMap` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.flatmap\n$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, {\n  flatMap: function flatMap(mapper) {\n    anObject(this);\n    try {\n      aCallable(mapper);\n    } catch (error) {\n      iteratorClose(this, 'throw', error);\n    }\n\n    if (flatMapWithoutClosingOnEarlyError) return call(flatMapWithoutClosingOnEarlyError, this, mapper);\n\n    return new IteratorProxy(getIteratorDirect(this), {\n      mapper: mapper,\n      inner: null\n    });\n  }\n});\n\n\n/***/ },\n\n/***/ 7588\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar call = __webpack_require__(9565);\nvar iterate = __webpack_require__(2652);\nvar aCallable = __webpack_require__(9306);\nvar anObject = __webpack_require__(8551);\nvar getIteratorDirect = __webpack_require__(1767);\nvar iteratorClose = __webpack_require__(9539);\nvar iteratorHelperWithoutClosingOnEarlyError = __webpack_require__(4549);\n\nvar forEachWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('forEach', TypeError);\n\n// `Iterator.prototype.forEach` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.foreach\n$({ target: 'Iterator', proto: true, real: true, forced: forEachWithoutClosingOnEarlyError }, {\n  forEach: function forEach(fn) {\n    anObject(this);\n    try {\n      aCallable(fn);\n    } catch (error) {\n      iteratorClose(this, 'throw', error);\n    }\n\n    if (forEachWithoutClosingOnEarlyError) return call(forEachWithoutClosingOnEarlyError, this, fn);\n\n    var record = getIteratorDirect(this);\n    var counter = 0;\n    iterate(record, function (value) {\n      fn(value, counter++);\n    }, { IS_RECORD: true });\n  }\n});\n\n\n/***/ },\n\n/***/ 1701\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar call = __webpack_require__(9565);\nvar aCallable = __webpack_require__(9306);\nvar anObject = __webpack_require__(8551);\nvar getIteratorDirect = __webpack_require__(1767);\nvar createIteratorProxy = __webpack_require__(9462);\nvar callWithSafeIterationClosing = __webpack_require__(6319);\nvar iteratorClose = __webpack_require__(9539);\nvar iteratorHelperThrowsOnInvalidIterator = __webpack_require__(684);\nvar iteratorHelperWithoutClosingOnEarlyError = __webpack_require__(4549);\nvar IS_PURE = __webpack_require__(6395);\n\nvar MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('map', function () { /* empty */ });\nvar mapWithoutClosingOnEarlyError = !IS_PURE && !MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR\n  && iteratorHelperWithoutClosingOnEarlyError('map', TypeError);\n\nvar FORCED = IS_PURE || MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR || mapWithoutClosingOnEarlyError;\n\nvar IteratorProxy = createIteratorProxy(function () {\n  var iterator = this.iterator;\n  var result = anObject(call(this.next, iterator));\n  var done = this.done = !!result.done;\n  if (!done) return callWithSafeIterationClosing(iterator, this.mapper, [result.value, this.counter++], true);\n});\n\n// `Iterator.prototype.map` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.map\n$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, {\n  map: function map(mapper) {\n    anObject(this);\n    try {\n      aCallable(mapper);\n    } catch (error) {\n      iteratorClose(this, 'throw', error);\n    }\n\n    if (mapWithoutClosingOnEarlyError) return call(mapWithoutClosingOnEarlyError, this, mapper);\n\n    return new IteratorProxy(getIteratorDirect(this), {\n      mapper: mapper\n    });\n  }\n});\n\n\n/***/ },\n\n/***/ 3579\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar call = __webpack_require__(9565);\nvar iterate = __webpack_require__(2652);\nvar aCallable = __webpack_require__(9306);\nvar anObject = __webpack_require__(8551);\nvar getIteratorDirect = __webpack_require__(1767);\nvar iteratorClose = __webpack_require__(9539);\nvar iteratorHelperWithoutClosingOnEarlyError = __webpack_require__(4549);\n\nvar someWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('some', TypeError);\n\n// `Iterator.prototype.some` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.some\n$({ target: 'Iterator', proto: true, real: true, forced: someWithoutClosingOnEarlyError }, {\n  some: function some(predicate) {\n    anObject(this);\n    try {\n      aCallable(predicate);\n    } catch (error) {\n      iteratorClose(this, 'throw', error);\n    }\n\n    if (someWithoutClosingOnEarlyError) return call(someWithoutClosingOnEarlyError, this, predicate);\n\n    var record = getIteratorDirect(this);\n    var counter = 0;\n    return iterate(record, function (value, stop) {\n      if (predicate(value, counter++)) return stop();\n    }, { IS_RECORD: true, INTERRUPTED: true }).stopped;\n  }\n});\n\n\n/***/ },\n\n/***/ 4972\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar call = __webpack_require__(9565);\nvar anObject = __webpack_require__(8551);\nvar getIteratorDirect = __webpack_require__(1767);\nvar notANaN = __webpack_require__(4149);\nvar toPositiveInteger = __webpack_require__(9590);\nvar createIteratorProxy = __webpack_require__(9462);\nvar iteratorClose = __webpack_require__(9539);\nvar iteratorHelperThrowsOnInvalidIterator = __webpack_require__(684);\nvar iteratorHelperWithoutClosingOnEarlyError = __webpack_require__(4549);\nvar IS_PURE = __webpack_require__(6395);\n\nvar TAKE_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('take', 1);\nvar takeWithoutClosingOnEarlyError = !IS_PURE && !TAKE_WITHOUT_THROWING_ON_INVALID_ITERATOR\n  && iteratorHelperWithoutClosingOnEarlyError('take', RangeError);\n\nvar FORCED = IS_PURE || TAKE_WITHOUT_THROWING_ON_INVALID_ITERATOR || takeWithoutClosingOnEarlyError;\n\nvar IteratorProxy = createIteratorProxy(function () {\n  var iterator = this.iterator;\n  if (!this.remaining--) {\n    this.done = true;\n    return iteratorClose(iterator, 'normal', undefined);\n  }\n  var result = anObject(call(this.next, iterator));\n  var done = this.done = !!result.done;\n  if (!done) return result.value;\n});\n\n// `Iterator.prototype.take` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.take\n$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, {\n  take: function take(limit) {\n    anObject(this);\n    var remaining;\n    try {\n      remaining = toPositiveInteger(notANaN(+limit));\n    } catch (error) {\n      iteratorClose(this, 'throw', error);\n    }\n\n    if (takeWithoutClosingOnEarlyError) return call(takeWithoutClosingOnEarlyError, this, remaining);\n\n    return new IteratorProxy(getIteratorDirect(this), {\n      remaining: remaining\n    });\n  }\n});\n\n\n/***/ },\n\n/***/ 9112\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar DESCRIPTORS = __webpack_require__(3724);\nvar globalThis = __webpack_require__(4576);\nvar getBuiltIn = __webpack_require__(7751);\nvar uncurryThis = __webpack_require__(9504);\nvar call = __webpack_require__(9565);\nvar isCallable = __webpack_require__(4901);\nvar isObject = __webpack_require__(34);\nvar isArray = __webpack_require__(4376);\nvar hasOwn = __webpack_require__(9297);\nvar toString = __webpack_require__(655);\nvar lengthOfArrayLike = __webpack_require__(6198);\nvar createProperty = __webpack_require__(4659);\nvar fails = __webpack_require__(9039);\nvar parseJSONString = __webpack_require__(8235);\nvar NATIVE_SYMBOL = __webpack_require__(4495);\n\nvar JSON = globalThis.JSON;\nvar Number = globalThis.Number;\nvar SyntaxError = globalThis.SyntaxError;\nvar nativeParse = JSON && JSON.parse;\nvar enumerableOwnProperties = getBuiltIn('Object', 'keys');\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar at = uncurryThis(''.charAt);\nvar slice = uncurryThis(''.slice);\nvar exec = uncurryThis(/./.exec);\nvar push = uncurryThis([].push);\n\nvar IS_DIGIT = /^\\d$/;\nvar IS_NON_ZERO_DIGIT = /^[1-9]$/;\nvar IS_NUMBER_START = /^[\\d-]$/;\nvar IS_WHITESPACE = /^[\\t\\n\\r ]$/;\n\nvar PRIMITIVE = 0;\nvar OBJECT = 1;\n\nvar $parse = function (source, reviver) {\n  source = toString(source);\n  var context = new Context(source, 0, '');\n  var root = context.parse();\n  var value = root.value;\n  var endIndex = context.skip(IS_WHITESPACE, root.end);\n  if (endIndex < source.length) {\n    throw new SyntaxError('Unexpected extra character: \"' + at(source, endIndex) + '\" after the parsed data at: ' + endIndex);\n  }\n  return isCallable(reviver) ? internalize({ '': value }, '', reviver, root) : value;\n};\n\nvar internalize = function (holder, name, reviver, node) {\n  var val = holder[name];\n  var unmodified = node && val === node.value;\n  var context = unmodified && typeof node.source == 'string' ? { source: node.source } : {};\n  var elementRecordsLen, keys, len, i, P;\n  if (isObject(val)) {\n    var nodeIsArray = isArray(val);\n    var nodes = unmodified ? node.nodes : nodeIsArray ? [] : {};\n    if (nodeIsArray) {\n      elementRecordsLen = nodes.length;\n      len = lengthOfArrayLike(val);\n      for (i = 0; i < len; i++) {\n        internalizeProperty(val, i, internalize(val, '' + i, reviver, i < elementRecordsLen ? nodes[i] : undefined));\n      }\n    } else {\n      keys = enumerableOwnProperties(val);\n      len = lengthOfArrayLike(keys);\n      for (i = 0; i < len; i++) {\n        P = keys[i];\n        internalizeProperty(val, P, internalize(val, P, reviver, hasOwn(nodes, P) ? nodes[P] : undefined));\n      }\n    }\n  }\n  return call(reviver, holder, name, val, context);\n};\n\nvar internalizeProperty = function (object, key, value) {\n  if (DESCRIPTORS) {\n    var descriptor = getOwnPropertyDescriptor(object, key);\n    if (descriptor && !descriptor.configurable) return;\n  }\n  if (value === undefined) delete object[key];\n  else createProperty(object, key, value);\n};\n\nvar Node = function (value, end, source, nodes) {\n  this.value = value;\n  this.end = end;\n  this.source = source;\n  this.nodes = nodes;\n};\n\nvar Context = function (source, index) {\n  this.source = source;\n  this.index = index;\n};\n\n// https://www.json.org/json-en.html\nContext.prototype = {\n  fork: function (nextIndex) {\n    return new Context(this.source, nextIndex);\n  },\n  parse: function () {\n    var source = this.source;\n    var i = this.skip(IS_WHITESPACE, this.index);\n    var fork = this.fork(i);\n    var chr = at(source, i);\n    if (exec(IS_NUMBER_START, chr)) return fork.number();\n    switch (chr) {\n      case '{':\n        return fork.object();\n      case '[':\n        return fork.array();\n      case '\"':\n        return fork.string();\n      case 't':\n        return fork.keyword(true);\n      case 'f':\n        return fork.keyword(false);\n      case 'n':\n        return fork.keyword(null);\n    } throw new SyntaxError('Unexpected character: \"' + chr + '\" at: ' + i);\n  },\n  node: function (type, value, start, end, nodes) {\n    return new Node(value, end, type ? null : slice(this.source, start, end), nodes);\n  },\n  object: function () {\n    var source = this.source;\n    var i = this.index + 1;\n    var expectKeypair = false;\n    var object = {};\n    var nodes = {};\n    var closed = false;\n    while (i < source.length) {\n      i = this.until(['\"', '}'], i);\n      if (at(source, i) === '}' && !expectKeypair) {\n        i++;\n        closed = true;\n        break;\n      }\n      // Parsing the key\n      var result = this.fork(i).string();\n      var key = result.value;\n      i = result.end;\n      i = this.until([':'], i) + 1;\n      // Parsing value\n      i = this.skip(IS_WHITESPACE, i);\n      result = this.fork(i).parse();\n      createProperty(nodes, key, result);\n      createProperty(object, key, result.value);\n      i = this.until([',', '}'], result.end);\n      var chr = at(source, i);\n      if (chr === ',') {\n        expectKeypair = true;\n        i++;\n      } else if (chr === '}') {\n        i++;\n        closed = true;\n        break;\n      }\n    }\n    if (!closed) throw new SyntaxError('Unterminated object at: ' + i);\n    return this.node(OBJECT, object, this.index, i, nodes);\n  },\n  array: function () {\n    var source = this.source;\n    var i = this.index + 1;\n    var expectElement = false;\n    var array = [];\n    var nodes = [];\n    var closed = false;\n    while (i < source.length) {\n      i = this.skip(IS_WHITESPACE, i);\n      if (at(source, i) === ']' && !expectElement) {\n        i++;\n        closed = true;\n        break;\n      }\n      var result = this.fork(i).parse();\n      push(nodes, result);\n      push(array, result.value);\n      i = this.until([',', ']'], result.end);\n      if (at(source, i) === ',') {\n        expectElement = true;\n        i++;\n      } else if (at(source, i) === ']') {\n        i++;\n        closed = true;\n        break;\n      }\n    }\n    if (!closed) throw new SyntaxError('Unterminated array at: ' + i);\n    return this.node(OBJECT, array, this.index, i, nodes);\n  },\n  string: function () {\n    var index = this.index;\n    var parsed = parseJSONString(this.source, this.index + 1);\n    return this.node(PRIMITIVE, parsed.value, index, parsed.end);\n  },\n  number: function () {\n    var source = this.source;\n    var startIndex = this.index;\n    var i = startIndex;\n    if (at(source, i) === '-') i++;\n    if (at(source, i) === '0') i++;\n    else if (exec(IS_NON_ZERO_DIGIT, at(source, i))) i = this.skip(IS_DIGIT, i + 1);\n    else throw new SyntaxError('Failed to parse number at: ' + i);\n    if (at(source, i) === '.') {\n      var fractionStartIndex = i + 1;\n      i = this.skip(IS_DIGIT, fractionStartIndex);\n      if (fractionStartIndex === i) throw new SyntaxError(\"Failed to parse number's fraction at: \" + i);\n    }\n    if (at(source, i) === 'e' || at(source, i) === 'E') {\n      i++;\n      if (at(source, i) === '+' || at(source, i) === '-') i++;\n      var exponentStartIndex = i;\n      i = this.skip(IS_DIGIT, i);\n      if (exponentStartIndex === i) throw new SyntaxError(\"Failed to parse number's exponent value at: \" + i);\n    }\n    return this.node(PRIMITIVE, Number(slice(source, startIndex, i)), startIndex, i);\n  },\n  keyword: function (value) {\n    var keyword = '' + value;\n    var index = this.index;\n    var endIndex = index + keyword.length;\n    if (slice(this.source, index, endIndex) !== keyword) throw new SyntaxError('Failed to parse value at: ' + index);\n    return this.node(PRIMITIVE, value, index, endIndex);\n  },\n  skip: function (regex, i) {\n    var source = this.source;\n    for (; i < source.length; i++) if (!exec(regex, at(source, i))) break;\n    return i;\n  },\n  until: function (array, i) {\n    i = this.skip(IS_WHITESPACE, i);\n    var chr = at(this.source, i);\n    for (var j = 0; j < array.length; j++) if (array[j] === chr) return i;\n    throw new SyntaxError('Unexpected character: \"' + chr + '\" at: ' + i);\n  }\n};\n\nvar NO_SOURCE_SUPPORT = fails(function () {\n  var unsafeInt = '9007199254740993';\n  var source;\n  nativeParse(unsafeInt, function (key, value, context) {\n    source = context.source;\n  });\n  return source !== unsafeInt;\n});\n\nvar PROPER_BASE_PARSE = NATIVE_SYMBOL && !fails(function () {\n  // Safari 9 bug\n  return 1 / nativeParse('-0 \\t') !== -Infinity;\n});\n\n// `JSON.parse` method\n// https://tc39.es/ecma262/#sec-json.parse\n// https://github.com/tc39/proposal-json-parse-with-source\n$({ target: 'JSON', stat: true, forced: NO_SOURCE_SUPPORT }, {\n  parse: function parse(text, reviver) {\n    return PROPER_BASE_PARSE && !isCallable(reviver) ? nativeParse(text) : $parse(text, reviver);\n  }\n});\n\n\n/***/ },\n\n/***/ 3110\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar getBuiltIn = __webpack_require__(7751);\nvar apply = __webpack_require__(8745);\nvar call = __webpack_require__(9565);\nvar uncurryThis = __webpack_require__(9504);\nvar fails = __webpack_require__(9039);\nvar isArray = __webpack_require__(4376);\nvar isCallable = __webpack_require__(4901);\nvar isRawJSON = __webpack_require__(5810);\nvar isSymbol = __webpack_require__(757);\nvar classof = __webpack_require__(2195);\nvar toString = __webpack_require__(655);\nvar arraySlice = __webpack_require__(7680);\nvar parseJSONString = __webpack_require__(8235);\nvar uid = __webpack_require__(3392);\nvar NATIVE_SYMBOL = __webpack_require__(4495);\nvar NATIVE_RAW_JSON = __webpack_require__(7819);\n\nvar $String = String;\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar exec = uncurryThis(/./.exec);\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar replace = uncurryThis(''.replace);\nvar slice = uncurryThis(''.slice);\nvar push = uncurryThis([].push);\nvar numberToString = uncurryThis(1.1.toString);\n\nvar surrogates = /[\\uD800-\\uDFFF]/g;\nvar leadingSurrogates = /^[\\uD800-\\uDBFF]$/;\nvar trailingSurrogates = /^[\\uDC00-\\uDFFF]$/;\n\nvar MARK = uid();\nvar MARK_LENGTH = MARK.length;\n\nvar WRONG_SYMBOLS_CONVERSION = !NATIVE_SYMBOL || fails(function () {\n  var symbol = getBuiltIn('Symbol')('stringify detection');\n  // MS Edge converts symbol values to JSON as {}\n  return $stringify([symbol]) !== '[null]'\n    // WebKit converts symbol values to JSON as null\n    || $stringify({ a: symbol }) !== '{}'\n    // V8 throws on boxed symbols\n    || $stringify(Object(symbol)) !== '{}';\n});\n\n// https://github.com/tc39/proposal-well-formed-stringify\nvar ILL_FORMED_UNICODE = fails(function () {\n  return $stringify('\\uDF06\\uD834') !== '\"\\\\udf06\\\\ud834\"'\n    || $stringify('\\uDEAD') !== '\"\\\\udead\"';\n});\n\nvar stringifyWithProperSymbolsConversion = WRONG_SYMBOLS_CONVERSION ? function (it, replacer) {\n  var args = arraySlice(arguments);\n  var $replacer = getReplacerFunction(replacer);\n  if (!isCallable($replacer) && (it === undefined || isSymbol(it))) return; // IE8 returns string on undefined\n  args[1] = function (key, value) {\n    // some old implementations (like WebKit) could pass numbers as keys\n    if (isCallable($replacer)) value = call($replacer, this, $String(key), value);\n    if (!isSymbol(value)) return value;\n  };\n  return apply($stringify, null, args);\n} : $stringify;\n\nvar fixIllFormedJSON = function (match, offset, string) {\n  var prev = charAt(string, offset - 1);\n  var next = charAt(string, offset + 1);\n  if (\n    (exec(leadingSurrogates, match) && !exec(trailingSurrogates, next)) ||\n    (exec(trailingSurrogates, match) && !exec(leadingSurrogates, prev))\n  ) {\n    return '\\\\u' + numberToString(charCodeAt(match, 0), 16);\n  } return match;\n};\n\nvar getReplacerFunction = function (replacer) {\n  if (isCallable(replacer)) return replacer;\n  if (!isArray(replacer)) return;\n  var rawLength = replacer.length;\n  var keys = [];\n  for (var i = 0; i < rawLength; i++) {\n    var element = replacer[i];\n    if (typeof element == 'string') push(keys, element);\n    else if (typeof element == 'number' || classof(element) === 'Number' || classof(element) === 'String') push(keys, toString(element));\n  }\n  var keysLength = keys.length;\n  var root = true;\n  return function (key, value) {\n    if (root) {\n      root = false;\n      return value;\n    }\n    if (isArray(this)) return value;\n    for (var j = 0; j < keysLength; j++) if (keys[j] === key) return value;\n  };\n};\n\n// `JSON.stringify` method\n// https://tc39.es/ecma262/#sec-json.stringify\n// https://github.com/tc39/proposal-json-parse-with-source\nif ($stringify) $({ target: 'JSON', stat: true, arity: 3, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE || !NATIVE_RAW_JSON }, {\n  stringify: function stringify(text, replacer, space) {\n    var replacerFunction = getReplacerFunction(replacer);\n    var rawStrings = [];\n\n    var json = stringifyWithProperSymbolsConversion(text, function (key, value) {\n      // some old implementations (like WebKit) could pass numbers as keys\n      var v = isCallable(replacerFunction) ? call(replacerFunction, this, $String(key), value) : value;\n      return !NATIVE_RAW_JSON && isRawJSON(v) ? MARK + (push(rawStrings, v.rawJSON) - 1) : v;\n    }, space);\n\n    if (typeof json != 'string') return json;\n\n    if (ILL_FORMED_UNICODE) json = replace(json, surrogates, fixIllFormedJSON);\n\n    if (NATIVE_RAW_JSON) return json;\n\n    var result = '';\n    var length = json.length;\n\n    for (var i = 0; i < length; i++) {\n      var chr = charAt(json, i);\n      if (chr === '\"') {\n        var end = parseJSONString(json, ++i).end - 1;\n        var string = slice(json, i, end);\n        result += slice(string, 0, MARK_LENGTH) === MARK\n          ? rawStrings[slice(string, MARK_LENGTH)]\n          : '\"' + string + '\"';\n        i = end;\n      } else result += chr;\n    }\n\n    return result;\n  }\n});\n\n\n/***/ },\n\n/***/ 2731\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar aCallable = __webpack_require__(9306);\nvar MapHelpers = __webpack_require__(2248);\nvar IS_PURE = __webpack_require__(6395);\n\nvar get = MapHelpers.get;\nvar has = MapHelpers.has;\nvar set = MapHelpers.set;\n\n// `Map.prototype.getOrInsertComputed` method\n// https://tc39.es/ecma262/#sec-map.prototype.getorinsertcomputed\n$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {\n  getOrInsertComputed: function getOrInsertComputed(key, callbackfn) {\n    var hasKey = has(this, key);\n    aCallable(callbackfn);\n    if (hasKey) return get(this, key);\n    // CanonicalizeKeyedCollectionKey\n    if (key === 0 && 1 / key === -Infinity) key = 0;\n    var value = callbackfn(key);\n    set(this, key, value);\n    return value;\n  }\n});\n\n\n/***/ },\n\n/***/ 5367\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar MapHelpers = __webpack_require__(2248);\nvar IS_PURE = __webpack_require__(6395);\n\nvar get = MapHelpers.get;\nvar has = MapHelpers.has;\nvar set = MapHelpers.set;\n\n// `Map.prototype.getOrInsert` method\n// https://tc39.es/ecma262/#sec-map.prototype.getorinsert\n$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {\n  getOrInsert: function getOrInsert(key, value) {\n    if (has(this, key)) return get(this, key);\n    set(this, key, value);\n    return value;\n  }\n});\n\n\n/***/ },\n\n/***/ 3068\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\n// based on Shewchuk's algorithm for exactly floating point addition\n// adapted from https://github.com/tc39/proposal-math-sum/blob/3513d58323a1ae25560e8700aa5294500c6c9287/polyfill/polyfill.mjs\nvar $ = __webpack_require__(6518);\nvar uncurryThis = __webpack_require__(9504);\nvar iterate = __webpack_require__(2652);\n\nvar $RangeError = RangeError;\nvar $TypeError = TypeError;\nvar $Infinity = Infinity;\nvar $NaN = NaN;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar push = uncurryThis([].push);\n\nvar POW_2_1023 = pow(2, 1023);\nvar MAX_SAFE_INTEGER = pow(2, 53) - 1; // 2 ** 53 - 1 === 9007199254740991\nvar MAX_DOUBLE = Number.MAX_VALUE; // 2 ** 1024 - 2 ** (1023 - 52) === 1.79769313486231570815e+308\nvar MAX_ULP = pow(2, 971); // 2 ** (1023 - 52) === 1.99584030953471981166e+292\n\nvar NOT_A_NUMBER = {};\nvar MINUS_INFINITY = {};\nvar PLUS_INFINITY = {};\nvar MINUS_ZERO = {};\nvar FINITE = {};\n\n// prerequisite: abs(x) >= abs(y)\nvar twosum = function (x, y) {\n  var hi = x + y;\n  var lo = y - (hi - x);\n  return { hi: hi, lo: lo };\n};\n\n// `Math.sumPrecise` method\n// https://tc39.es/ecma262/#sec-math.sumprecise\n$({ target: 'Math', stat: true }, {\n  // eslint-disable-next-line max-statements -- ok\n  sumPrecise: function sumPrecise(items) {\n    var numbers = [];\n    var count = 0;\n    var state = MINUS_ZERO;\n\n    iterate(items, function (n) {\n      if (++count > MAX_SAFE_INTEGER) throw new $RangeError('Maximum allowed index exceeded');\n      if (typeof n != 'number') throw new $TypeError('Value is not a number');\n      if (state !== NOT_A_NUMBER) {\n        // eslint-disable-next-line no-self-compare -- NaN check\n        if (n !== n) state = NOT_A_NUMBER;\n        else if (n === $Infinity) state = state === MINUS_INFINITY ? NOT_A_NUMBER : PLUS_INFINITY;\n        else if (n === -$Infinity) state = state === PLUS_INFINITY ? NOT_A_NUMBER : MINUS_INFINITY;\n        else if ((n !== 0 || (1 / n) === $Infinity) && (state === MINUS_ZERO || state === FINITE)) {\n          state = FINITE;\n          push(numbers, n);\n        }\n      }\n    });\n\n    switch (state) {\n      case NOT_A_NUMBER: return $NaN;\n      case MINUS_INFINITY: return -$Infinity;\n      case PLUS_INFINITY: return $Infinity;\n      case MINUS_ZERO: return -0;\n    }\n\n    var partials = [];\n    var overflow = 0; // conceptually 2 ** 1024 times this value; the final partial is biased by this amount\n    var x, y, sum, hi, lo, tmp;\n\n    for (var i = 0; i < numbers.length; i++) {\n      x = numbers[i];\n      var actuallyUsedPartials = 0;\n      for (var j = 0; j < partials.length; j++) {\n        y = partials[j];\n        if (abs(x) < abs(y)) {\n          tmp = x;\n          x = y;\n          y = tmp;\n        }\n        sum = twosum(x, y);\n        hi = sum.hi;\n        lo = sum.lo;\n        if (abs(hi) === $Infinity) {\n          var sign = hi === $Infinity ? 1 : -1;\n          overflow += sign;\n\n          x = (x - (sign * POW_2_1023)) - (sign * POW_2_1023);\n          if (abs(x) < abs(y)) {\n            tmp = x;\n            x = y;\n            y = tmp;\n          }\n          sum = twosum(x, y);\n          hi = sum.hi;\n          lo = sum.lo;\n        }\n        if (lo !== 0) partials[actuallyUsedPartials++] = lo;\n        x = hi;\n      }\n      partials.length = actuallyUsedPartials;\n      if (x !== 0) push(partials, x);\n    }\n\n    // compute the exact sum of partials, stopping once we lose precision\n    var n = partials.length - 1;\n    hi = 0;\n    lo = 0;\n\n    if (overflow !== 0) {\n      var next = n >= 0 ? partials[n] : 0;\n      n--;\n      if (abs(overflow) > 1 || (overflow > 0 && next > 0) || (overflow < 0 && next < 0)) {\n        return overflow > 0 ? $Infinity : -$Infinity;\n      }\n      // here we actually have to do the arithmetic\n      // drop a factor of 2 so we can do it without overflow\n      // assert(abs(overflow) === 1)\n      sum = twosum(overflow * POW_2_1023, next / 2);\n      hi = sum.hi;\n      lo = sum.lo;\n      lo *= 2;\n      if (abs(2 * hi) === $Infinity) {\n        // rounding to the maximum value\n        if (hi > 0) {\n          return (hi === POW_2_1023 && lo === -(MAX_ULP / 2) && n >= 0 && partials[n] < 0) ? MAX_DOUBLE : $Infinity;\n        } return (hi === -POW_2_1023 && lo === (MAX_ULP / 2) && n >= 0 && partials[n] > 0) ? -MAX_DOUBLE : -$Infinity;\n      }\n\n      if (lo !== 0) {\n        partials[++n] = lo;\n        lo = 0;\n      }\n\n      hi *= 2;\n    }\n\n    while (n >= 0) {\n      sum = twosum(hi, partials[n--]);\n      hi = sum.hi;\n      lo = sum.lo;\n      if (lo !== 0) break;\n    }\n\n    if (n >= 0 && ((lo < 0 && partials[n] < 0) || (lo > 0 && partials[n] > 0))) {\n      y = lo * 2;\n      x = hi + y;\n      if (y === x - hi) hi = x;\n    }\n\n    return hi;\n  }\n});\n\n\n/***/ },\n\n/***/ 1689\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar globalThis = __webpack_require__(4576);\nvar apply = __webpack_require__(8745);\nvar slice = __webpack_require__(7680);\nvar newPromiseCapabilityModule = __webpack_require__(6043);\nvar aCallable = __webpack_require__(9306);\nvar perform = __webpack_require__(1103);\n\nvar Promise = globalThis.Promise;\n\nvar ACCEPT_ARGUMENTS = false;\n// Avoiding the use of polyfills of the previous iteration of this proposal\n// that does not accept arguments of the callback\nvar FORCED = !Promise || !Promise['try'] || perform(function () {\n  Promise['try'](function (argument) {\n    ACCEPT_ARGUMENTS = argument === 8;\n  }, 8);\n}).error || !ACCEPT_ARGUMENTS;\n\n// `Promise.try` method\n// https://tc39.es/ecma262/#sec-promise.try\n$({ target: 'Promise', stat: true, forced: FORCED }, {\n  'try': function (callbackfn /* , ...args */) {\n    var args = arguments.length > 1 ? slice(arguments, 1) : [];\n    var promiseCapability = newPromiseCapabilityModule.f(this);\n    var result = perform(function () {\n      return apply(aCallable(callbackfn), undefined, args);\n    });\n    (result.error ? promiseCapability.reject : promiseCapability.resolve)(result.value);\n    return promiseCapability.promise;\n  }\n});\n\n\n/***/ },\n\n/***/ 4628\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar newPromiseCapabilityModule = __webpack_require__(6043);\n\n// `Promise.withResolvers` method\n// https://tc39.es/ecma262/#sec-promise.withResolvers\n$({ target: 'Promise', stat: true }, {\n  withResolvers: function withResolvers() {\n    var promiseCapability = newPromiseCapabilityModule.f(this);\n    return {\n      promise: promiseCapability.promise,\n      resolve: promiseCapability.resolve,\n      reject: promiseCapability.reject\n    };\n  }\n});\n\n\n/***/ },\n\n/***/ 7642\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar difference = __webpack_require__(3440);\nvar fails = __webpack_require__(9039);\nvar setMethodAcceptSetLike = __webpack_require__(4916);\n\nvar SET_LIKE_INCORRECT_BEHAVIOR = !setMethodAcceptSetLike('difference', function (result) {\n  return result.size === 0;\n});\n\nvar FORCED = SET_LIKE_INCORRECT_BEHAVIOR || fails(function () {\n  // https://bugs.webkit.org/show_bug.cgi?id=288595\n  var setLike = {\n    size: 1,\n    has: function () { return true; },\n    keys: function () {\n      var index = 0;\n      return {\n        next: function () {\n          var done = index++ > 1;\n          if (baseSet.has(1)) baseSet.clear();\n          return { done: done, value: 2 };\n        }\n      };\n    }\n  };\n  // eslint-disable-next-line es/no-set -- testing\n  var baseSet = new Set([1, 2, 3, 4]);\n  // eslint-disable-next-line es/no-set-prototype-difference -- testing\n  return baseSet.difference(setLike).size !== 3;\n});\n\n// `Set.prototype.difference` method\n// https://tc39.es/ecma262/#sec-set.prototype.difference\n$({ target: 'Set', proto: true, real: true, forced: FORCED }, {\n  difference: difference\n});\n\n\n/***/ },\n\n/***/ 8004\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar fails = __webpack_require__(9039);\nvar intersection = __webpack_require__(8750);\nvar setMethodAcceptSetLike = __webpack_require__(4916);\n\nvar INCORRECT = !setMethodAcceptSetLike('intersection', function (result) {\n  return result.size === 2 && result.has(1) && result.has(2);\n}) || fails(function () {\n  // eslint-disable-next-line es/no-array-from, es/no-set, es/no-set-prototype-intersection -- testing\n  return String(Array.from(new Set([1, 2, 3]).intersection(new Set([3, 2])))) !== '3,2';\n});\n\n// `Set.prototype.intersection` method\n// https://tc39.es/ecma262/#sec-set.prototype.intersection\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n  intersection: intersection\n});\n\n\n/***/ },\n\n/***/ 3853\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar isDisjointFrom = __webpack_require__(4449);\nvar setMethodAcceptSetLike = __webpack_require__(4916);\n\nvar INCORRECT = !setMethodAcceptSetLike('isDisjointFrom', function (result) {\n  return !result;\n});\n\n// `Set.prototype.isDisjointFrom` method\n// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n  isDisjointFrom: isDisjointFrom\n});\n\n\n/***/ },\n\n/***/ 5876\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar isSubsetOf = __webpack_require__(3838);\nvar setMethodAcceptSetLike = __webpack_require__(4916);\n\nvar INCORRECT = !setMethodAcceptSetLike('isSubsetOf', function (result) {\n  return result;\n});\n\n// `Set.prototype.isSubsetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issubsetof\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n  isSubsetOf: isSubsetOf\n});\n\n\n/***/ },\n\n/***/ 2475\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar isSupersetOf = __webpack_require__(8527);\nvar setMethodAcceptSetLike = __webpack_require__(4916);\n\nvar INCORRECT = !setMethodAcceptSetLike('isSupersetOf', function (result) {\n  return !result;\n});\n\n// `Set.prototype.isSupersetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issupersetof\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n  isSupersetOf: isSupersetOf\n});\n\n\n/***/ },\n\n/***/ 5024\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar symmetricDifference = __webpack_require__(3650);\nvar setMethodGetKeysBeforeCloning = __webpack_require__(9835);\nvar setMethodAcceptSetLike = __webpack_require__(4916);\n\nvar FORCED = !setMethodAcceptSetLike('symmetricDifference') || !setMethodGetKeysBeforeCloning('symmetricDifference');\n\n// `Set.prototype.symmetricDifference` method\n// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference\n$({ target: 'Set', proto: true, real: true, forced: FORCED }, {\n  symmetricDifference: symmetricDifference\n});\n\n\n/***/ },\n\n/***/ 1698\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar union = __webpack_require__(4204);\nvar setMethodGetKeysBeforeCloning = __webpack_require__(9835);\nvar setMethodAcceptSetLike = __webpack_require__(4916);\n\nvar FORCED = !setMethodAcceptSetLike('union') || !setMethodGetKeysBeforeCloning('union');\n\n// `Set.prototype.union` method\n// https://tc39.es/ecma262/#sec-set.prototype.union\n$({ target: 'Set', proto: true, real: true, forced: FORCED }, {\n  union: union\n});\n\n\n/***/ },\n\n/***/ 9577\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar ArrayBufferViewCore = __webpack_require__(4644);\nvar isBigIntArray = __webpack_require__(1108);\nvar lengthOfArrayLike = __webpack_require__(6198);\nvar toIntegerOrInfinity = __webpack_require__(1291);\nvar toBigInt = __webpack_require__(5854);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\nvar $RangeError = RangeError;\n\nvar PROPER_ORDER = function () {\n  try {\n    // eslint-disable-next-line no-throw-literal, es/no-typed-arrays, es/no-array-prototype-with -- required for testing\n    new Int8Array(1)['with'](2, { valueOf: function () { throw 8; } });\n  } catch (error) {\n    // some early implementations, like WebKit, does not follow the final semantic\n    // https://github.com/tc39/proposal-change-array-by-copy/pull/86\n    return error === 8;\n  }\n}();\n\n// Bug in WebKit. It should truncate a negative fractional index to zero, but instead throws an error\nvar THROW_ON_NEGATIVE_FRACTIONAL_INDEX = PROPER_ORDER && function () {\n  try {\n    // eslint-disable-next-line es/no-typed-arrays, es/no-array-prototype-with -- required for testing\n    new Int8Array(1)['with'](-0.5, 1);\n  } catch (error) {\n    return true;\n  }\n}();\n\n// `%TypedArray%.prototype.with` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.with\nexportTypedArrayMethod('with', { 'with': function (index, value) {\n  var O = aTypedArray(this);\n  var len = lengthOfArrayLike(O);\n  var relativeIndex = toIntegerOrInfinity(index);\n  var actualIndex = relativeIndex < 0 ? len + relativeIndex : relativeIndex;\n  var numericValue = isBigIntArray(O) ? toBigInt(value) : +value;\n  if (actualIndex >= len || actualIndex < 0) throw new $RangeError('Incorrect index');\n  var A = new (getTypedArrayConstructor(O))(len);\n  var k = 0;\n  for (; k < len; k++) A[k] = k === actualIndex ? numericValue : O[k];\n  return A;\n} }['with'], !PROPER_ORDER || THROW_ON_NEGATIVE_FRACTIONAL_INDEX);\n\n\n/***/ },\n\n/***/ 5213\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar globalThis = __webpack_require__(4576);\nvar arrayFromConstructorAndList = __webpack_require__(5370);\nvar $fromBase64 = __webpack_require__(9143);\n\nvar Uint8Array = globalThis.Uint8Array;\n\nvar INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array || !Uint8Array.fromBase64 || !function () {\n  // Webkit not throw an error on odd length string\n  try {\n    Uint8Array.fromBase64('a');\n    return;\n  } catch (error) { /* empty */ }\n  try {\n    Uint8Array.fromBase64('', null);\n  } catch (error) {\n    return true;\n  }\n}();\n\n// `Uint8Array.fromBase64` method\n// https://tc39.es/ecma262/#sec-uint8array.frombase64\nif (Uint8Array) $({ target: 'Uint8Array', stat: true, forced: INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS }, {\n  fromBase64: function fromBase64(string /* , options */) {\n    var result = $fromBase64(string, arguments.length > 1 ? arguments[1] : undefined, null, 0x1FFFFFFFFFFFFF);\n    return arrayFromConstructorAndList(Uint8Array, result.bytes);\n  }\n});\n\n\n/***/ },\n\n/***/ 6632\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar globalThis = __webpack_require__(4576);\nvar $fromBase64 = __webpack_require__(9143);\nvar anUint8Array = __webpack_require__(4154);\n\nvar Uint8Array = globalThis.Uint8Array;\n\nvar INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array || !Uint8Array.prototype.setFromBase64 || !function () {\n  var target = new Uint8Array([255, 255, 255, 255, 255]);\n  try {\n    target.setFromBase64('', null);\n    return;\n  } catch (error) { /* empty */ }\n  // Webkit not throw an error on odd length string\n  try {\n    target.setFromBase64('a');\n    return;\n  } catch (error) { /* empty */ }\n  try {\n    target.setFromBase64('MjYyZg===');\n  } catch (error) {\n    return target[0] === 50 && target[1] === 54 && target[2] === 50 && target[3] === 255 && target[4] === 255;\n  }\n}();\n\n// `Uint8Array.prototype.setFromBase64` method\n// https://tc39.es/ecma262/#sec-uint8array.prototype.setfrombase64\nif (Uint8Array) $({ target: 'Uint8Array', proto: true, forced: INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS }, {\n  setFromBase64: function setFromBase64(string /* , options */) {\n    anUint8Array(this);\n\n    var result = $fromBase64(string, arguments.length > 1 ? arguments[1] : undefined, this, this.length);\n\n    return { read: result.read, written: result.written };\n  }\n});\n\n\n/***/ },\n\n/***/ 4226\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar globalThis = __webpack_require__(4576);\nvar aString = __webpack_require__(3463);\nvar anUint8Array = __webpack_require__(4154);\nvar notDetached = __webpack_require__(5169);\nvar $fromHex = __webpack_require__(2303);\n\n// Should not throw an error on length-tracking views over ResizableArrayBuffer\n// https://issues.chromium.org/issues/454630441\nfunction throwsOnLengthTrackingView() {\n  try {\n    // eslint-disable-next-line es/no-resizable-and-growable-arraybuffers -- required for testing\n    var rab = new ArrayBuffer(16, { maxByteLength: 1024 });\n    // eslint-disable-next-line es/no-uint8array-prototype-setfromhex, es/no-typed-arrays -- required for testing\n    new Uint8Array(rab).setFromHex('cafed00d');\n  } catch (error) {\n    return true;\n  }\n}\n\n// `Uint8Array.prototype.setFromHex` method\n// https://tc39.es/ecma262/#sec-uint8array.prototype.setfromhex\nif (globalThis.Uint8Array) $({ target: 'Uint8Array', proto: true, forced: throwsOnLengthTrackingView() }, {\n  setFromHex: function setFromHex(string) {\n    anUint8Array(this);\n    aString(string);\n    notDetached(this.buffer);\n    var read = $fromHex(string, this).read;\n    return { read: read, written: read / 2 };\n  }\n});\n\n\n/***/ },\n\n/***/ 9486\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar globalThis = __webpack_require__(4576);\nvar uncurryThis = __webpack_require__(9504);\nvar anObjectOrUndefined = __webpack_require__(3972);\nvar anUint8Array = __webpack_require__(4154);\nvar notDetached = __webpack_require__(5169);\nvar base64Map = __webpack_require__(2804);\nvar getAlphabetOption = __webpack_require__(944);\n\nvar base64Alphabet = base64Map.i2c;\nvar base64UrlAlphabet = base64Map.i2cUrl;\n\nvar charAt = uncurryThis(''.charAt);\n\nvar Uint8Array = globalThis.Uint8Array;\n\nvar INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array || !Uint8Array.prototype.toBase64 || !function () {\n  try {\n    var target = new Uint8Array();\n    target.toBase64(null);\n  } catch (error) {\n    return true;\n  }\n}();\n\n// `Uint8Array.prototype.toBase64` method\n// https://tc39.es/ecma262/#sec-uint8array.prototype.tobase64\nif (Uint8Array) $({ target: 'Uint8Array', proto: true, forced: INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS }, {\n  toBase64: function toBase64(/* options */) {\n    var array = anUint8Array(this);\n    var options = arguments.length ? anObjectOrUndefined(arguments[0]) : undefined;\n    var alphabet = getAlphabetOption(options) === 'base64' ? base64Alphabet : base64UrlAlphabet;\n    var omitPadding = !!options && !!options.omitPadding;\n    notDetached(this.buffer);\n\n    var result = '';\n    var i = 0;\n    var length = array.length;\n    var triplet;\n\n    var at = function (shift) {\n      return charAt(alphabet, (triplet >> (6 * shift)) & 63);\n    };\n\n    for (; i + 2 < length; i += 3) {\n      triplet = (array[i] << 16) + (array[i + 1] << 8) + array[i + 2];\n      result += at(3) + at(2) + at(1) + at(0);\n    }\n    if (i + 2 === length) {\n      triplet = (array[i] << 16) + (array[i + 1] << 8);\n      result += at(3) + at(2) + at(1) + (omitPadding ? '' : '=');\n    } else if (i + 1 === length) {\n      triplet = array[i] << 16;\n      result += at(3) + at(2) + (omitPadding ? '' : '==');\n    }\n\n    return result;\n  }\n});\n\n\n/***/ },\n\n/***/ 456\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar globalThis = __webpack_require__(4576);\nvar uncurryThis = __webpack_require__(9504);\nvar anUint8Array = __webpack_require__(4154);\nvar notDetached = __webpack_require__(5169);\n\nvar numberToString = uncurryThis(1.1.toString);\nvar join = uncurryThis([].join);\nvar $Array = Array;\n\nvar Uint8Array = globalThis.Uint8Array;\n\nvar INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array || !Uint8Array.prototype.toHex || !(function () {\n  try {\n    var target = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]);\n    return target.toHex() === 'ffffffffffffffff';\n  } catch (error) {\n    return false;\n  }\n})();\n\n// `Uint8Array.prototype.toHex` method\n// https://tc39.es/ecma262/#sec-uint8array.prototype.tohex\nif (Uint8Array) $({ target: 'Uint8Array', proto: true, forced: INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS }, {\n  toHex: function toHex() {\n    anUint8Array(this);\n    notDetached(this.buffer);\n    var result = $Array(this.length);\n    for (var i = 0, length = this.length; i < length; i++) {\n      var hex = numberToString(this[i], 16);\n      result[i] = hex.length === 1 ? '0' + hex : hex;\n    }\n    return join(result, '');\n  }\n});\n\n\n/***/ },\n\n/***/ 9452\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar aCallable = __webpack_require__(9306);\nvar aWeakMap = __webpack_require__(6557);\nvar aWeakKey = __webpack_require__(4328);\nvar WeakMapHelpers = __webpack_require__(4995);\nvar IS_PURE = __webpack_require__(6395);\n\nvar get = WeakMapHelpers.get;\nvar has = WeakMapHelpers.has;\nvar set = WeakMapHelpers.set;\n\nvar FORCED = IS_PURE || !function () {\n  try {\n    // eslint-disable-next-line es/no-weak-map, no-throw-literal -- testing\n    if (WeakMap.prototype.getOrInsertComputed) new WeakMap().getOrInsertComputed(1, function () { throw 1; });\n  } catch (error) {\n    // FF144 Nightly - Beta 3 bug\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=1988369\n    return error instanceof TypeError;\n  }\n}();\n\n// `WeakMap.prototype.getOrInsertComputed` method\n// https://tc39.es/ecma262/#sec-weakmap.prototype.getorinsertcomputed\n$({ target: 'WeakMap', proto: true, real: true, forced: FORCED }, {\n  getOrInsertComputed: function getOrInsertComputed(key, callbackfn) {\n    if (!IS_PURE) aWeakMap(this);\n    aWeakKey(key);\n    aCallable(callbackfn);\n    if (has(this, key)) return get(this, key);\n    var value = callbackfn(key);\n    set(this, key, value);\n    return value;\n  }\n});\n\n\n/***/ },\n\n/***/ 8454\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar WeakMapHelpers = __webpack_require__(4995);\nvar IS_PURE = __webpack_require__(6395);\n\nvar get = WeakMapHelpers.get;\nvar has = WeakMapHelpers.has;\nvar set = WeakMapHelpers.set;\n\n// `WeakMap.prototype.getOrInsert` method\n// https://tc39.es/ecma262/#sec-weakmap.prototype.getorinsert\n$({ target: 'WeakMap', proto: true, real: true, forced: IS_PURE }, {\n  getOrInsert: function getOrInsert(key, value) {\n    if (has(this, key)) return get(this, key);\n    set(this, key, value);\n    return value;\n  }\n});\n\n\n/***/ },\n\n/***/ 4979\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar globalThis = __webpack_require__(4576);\nvar getBuiltIn = __webpack_require__(7751);\nvar createPropertyDescriptor = __webpack_require__(6980);\nvar defineProperty = (__webpack_require__(4913).f);\nvar hasOwn = __webpack_require__(9297);\nvar anInstance = __webpack_require__(679);\nvar inheritIfRequired = __webpack_require__(3167);\nvar normalizeStringArgument = __webpack_require__(2603);\nvar DOMExceptionConstants = __webpack_require__(5002);\nvar clearErrorStack = __webpack_require__(8574);\nvar DESCRIPTORS = __webpack_require__(3724);\nvar IS_PURE = __webpack_require__(6395);\n\nvar DOM_EXCEPTION = 'DOMException';\nvar Error = getBuiltIn('Error');\nvar NativeDOMException = getBuiltIn(DOM_EXCEPTION);\n\nvar $DOMException = function DOMException() {\n  anInstance(this, DOMExceptionPrototype);\n  var argumentsLength = arguments.length;\n  var message = normalizeStringArgument(argumentsLength < 1 ? undefined : arguments[0]);\n  var name = normalizeStringArgument(argumentsLength < 2 ? undefined : arguments[1], 'Error');\n  var that = new NativeDOMException(message, name);\n  var error = new Error(message);\n  error.name = DOM_EXCEPTION;\n  defineProperty(that, 'stack', createPropertyDescriptor(1, clearErrorStack(error.stack, 1)));\n  inheritIfRequired(that, this, $DOMException);\n  return that;\n};\n\nvar DOMExceptionPrototype = $DOMException.prototype = NativeDOMException.prototype;\n\nvar ERROR_HAS_STACK = 'stack' in new Error(DOM_EXCEPTION);\nvar DOM_EXCEPTION_HAS_STACK = 'stack' in new NativeDOMException(1, 2);\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar descriptor = NativeDOMException && DESCRIPTORS && Object.getOwnPropertyDescriptor(globalThis, DOM_EXCEPTION);\n\n// Bun ~ 0.1.1 DOMException have incorrect descriptor and we can't redefine it\n// https://github.com/Jarred-Sumner/bun/issues/399\nvar BUGGY_DESCRIPTOR = !!descriptor && !(descriptor.writable && descriptor.configurable);\n\nvar FORCED_CONSTRUCTOR = ERROR_HAS_STACK && !BUGGY_DESCRIPTOR && !DOM_EXCEPTION_HAS_STACK;\n\n// `DOMException` constructor patch for `.stack` where it's required\n// https://webidl.spec.whatwg.org/#es-DOMException-specialness\n$({ global: true, constructor: true, forced: IS_PURE || FORCED_CONSTRUCTOR }, { // TODO: fix export logic\n  DOMException: FORCED_CONSTRUCTOR ? $DOMException : NativeDOMException\n});\n\nvar PolyfilledDOMException = getBuiltIn(DOM_EXCEPTION);\nvar PolyfilledDOMExceptionPrototype = PolyfilledDOMException.prototype;\n\nif (PolyfilledDOMExceptionPrototype.constructor !== PolyfilledDOMException) {\n  if (!IS_PURE) {\n    defineProperty(PolyfilledDOMExceptionPrototype, 'constructor', createPropertyDescriptor(1, PolyfilledDOMException));\n  }\n\n  for (var key in DOMExceptionConstants) if (hasOwn(DOMExceptionConstants, key)) {\n    var constant = DOMExceptionConstants[key];\n    var constantName = constant.s;\n    if (!hasOwn(PolyfilledDOMException, constantName)) {\n      defineProperty(PolyfilledDOMException, constantName, createPropertyDescriptor(6, constant.c));\n    }\n  }\n}\n\n\n/***/ },\n\n/***/ 4603\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar defineBuiltIn = __webpack_require__(6840);\nvar uncurryThis = __webpack_require__(9504);\nvar toString = __webpack_require__(655);\nvar validateArgumentsLength = __webpack_require__(2812);\n\nvar $URLSearchParams = URLSearchParams;\nvar URLSearchParamsPrototype = $URLSearchParams.prototype;\nvar append = uncurryThis(URLSearchParamsPrototype.append);\nvar $delete = uncurryThis(URLSearchParamsPrototype['delete']);\nvar forEach = uncurryThis(URLSearchParamsPrototype.forEach);\nvar push = uncurryThis([].push);\nvar params = new $URLSearchParams('a=1&a=2&b=3');\n\nparams['delete']('a', 1);\n// `undefined` case is a Chromium 117 bug\n// https://bugs.chromium.org/p/v8/issues/detail?id=14222\nparams['delete']('b', undefined);\n\nif (params + '' !== 'a=2') {\n  defineBuiltIn(URLSearchParamsPrototype, 'delete', function (name /* , value */) {\n    var length = arguments.length;\n    var $value = length < 2 ? undefined : arguments[1];\n    if (length && $value === undefined) return $delete(this, name);\n    var entries = [];\n    forEach(this, function (v, k) { // also validates `this`\n      push(entries, { key: k, value: v });\n    });\n    validateArgumentsLength(length, 1);\n    var key = toString(name);\n    var value = toString($value);\n    var index = 0;\n    var entriesLength = entries.length;\n    var entry;\n    while (index < entriesLength) {\n      entry = entries[index];\n      $delete(this, entry.key);\n      index++;\n    }\n    index = 0;\n    while (index < entriesLength) {\n      entry = entries[index++];\n      if (!(entry.key === key && entry.value === value)) append(this, entry.key, entry.value);\n    }\n  }, { enumerable: true, unsafe: true });\n}\n\n\n/***/ },\n\n/***/ 7566\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar defineBuiltIn = __webpack_require__(6840);\nvar uncurryThis = __webpack_require__(9504);\nvar toString = __webpack_require__(655);\nvar validateArgumentsLength = __webpack_require__(2812);\n\nvar $URLSearchParams = URLSearchParams;\nvar URLSearchParamsPrototype = $URLSearchParams.prototype;\nvar getAll = uncurryThis(URLSearchParamsPrototype.getAll);\nvar $has = uncurryThis(URLSearchParamsPrototype.has);\nvar params = new $URLSearchParams('a=1');\n\n// `undefined` case is a Chromium 117 bug\n// https://bugs.chromium.org/p/v8/issues/detail?id=14222\nif (params.has('a', 2) || !params.has('a', undefined)) {\n  defineBuiltIn(URLSearchParamsPrototype, 'has', function has(name /* , value */) {\n    var length = arguments.length;\n    var $value = length < 2 ? undefined : arguments[1];\n    if (length && $value === undefined) return $has(this, name);\n    var values = getAll(this, name); // also validates `this`\n    validateArgumentsLength(length, 1);\n    var value = toString($value);\n    var index = 0;\n    while (index < values.length) {\n      if (values[index++] === value) return true;\n    } return false;\n  }, { enumerable: true, unsafe: true });\n}\n\n\n/***/ },\n\n/***/ 8721\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar DESCRIPTORS = __webpack_require__(3724);\nvar uncurryThis = __webpack_require__(9504);\nvar defineBuiltInAccessor = __webpack_require__(2106);\n\nvar URLSearchParamsPrototype = URLSearchParams.prototype;\nvar forEach = uncurryThis(URLSearchParamsPrototype.forEach);\n\n// `URLSearchParams.prototype.size` getter\n// https://github.com/whatwg/url/pull/734\nif (DESCRIPTORS && !('size' in URLSearchParamsPrototype)) {\n  defineBuiltInAccessor(URLSearchParamsPrototype, 'size', {\n    get: function size() {\n      var count = 0;\n      forEach(this, function () { count++; });\n      return count;\n    },\n    configurable: true,\n    enumerable: true\n  });\n}\n\n\n/***/ },\n\n/***/ 5781\n(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar $ = __webpack_require__(6518);\nvar getBuiltIn = __webpack_require__(7751);\nvar validateArgumentsLength = __webpack_require__(2812);\nvar toString = __webpack_require__(655);\nvar USE_NATIVE_URL = __webpack_require__(7416);\n\nvar URL = getBuiltIn('URL');\n\n// `URL.parse` method\n// https://url.spec.whatwg.org/#dom-url-parse\n$({ target: 'URL', stat: true, forced: !USE_NATIVE_URL }, {\n  parse: function parse(url) {\n    var length = validateArgumentsLength(arguments.length, 1);\n    var urlString = toString(url);\n    var base = length < 2 || arguments[1] === undefined ? undefined : toString(arguments[1]);\n    try {\n      return new URL(urlString, base);\n    } catch (error) {\n      return null;\n    }\n  }\n});\n\n\n/***/ }\n\n/******/ });\n/************************************************************************/\n/******/ // The module cache\n/******/ var __webpack_module_cache__ = {};\n/******/ \n/******/ // The require function\n/******/ function __webpack_require__(moduleId) {\n/******/ \t// Check if module is in cache\n/******/ \tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \tif (cachedModule !== undefined) {\n/******/ \t\treturn cachedModule.exports;\n/******/ \t}\n/******/ \t// Create a new module (and put it into the cache)\n/******/ \tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t// no module.id needed\n/******/ \t\t// no module.loaded needed\n/******/ \t\texports: {}\n/******/ \t};\n/******/ \n/******/ \t// Execute the module function\n/******/ \t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/ \n/******/ \t// Return the exports of the module\n/******/ \treturn module.exports;\n/******/ }\n/******/ \n/************************************************************************/\n/******/ /* webpack/runtime/define property getters */\n/******/ (() => {\n/******/ \t// define getter functions for harmony exports\n/******/ \t__webpack_require__.d = (exports, definition) => {\n/******/ \t\tfor(var key in definition) {\n/******/ \t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t};\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/hasOwnProperty shorthand */\n/******/ (() => {\n/******/ \t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ })();\n/******/ \n/************************************************************************/\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.includes.js\nvar es_array_includes = __webpack_require__(4423);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js\nvar es_array_push = __webpack_require__(4114);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.detached.js\nvar es_array_buffer_detached = __webpack_require__(6573);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.transfer.js\nvar es_array_buffer_transfer = __webpack_require__(8100);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.transfer-to-fixed-length.js\nvar es_array_buffer_transfer_to_fixed_length = __webpack_require__(7936);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.map.get-or-insert.js\nvar es_map_get_or_insert = __webpack_require__(5367);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.map.get-or-insert-computed.js\nvar es_map_get_or_insert_computed = __webpack_require__(2731);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.with.js\nvar es_typed_array_with = __webpack_require__(9577);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.uint8-array.set-from-base64.js\nvar es_uint8_array_set_from_base64 = __webpack_require__(6632);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.uint8-array.set-from-hex.js\nvar es_uint8_array_set_from_hex = __webpack_require__(4226);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.uint8-array.to-base64.js\nvar es_uint8_array_to_base64 = __webpack_require__(9486);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.uint8-array.to-hex.js\nvar es_uint8_array_to_hex = __webpack_require__(456);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url.parse.js\nvar web_url_parse = __webpack_require__(5781);\n;// ./src/shared/util.js\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst isNodeJS = typeof process === \"object\" && process + \"\" === \"[object process]\" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== \"browser\");\nconst BBOX_INIT = [Infinity, Infinity, -Infinity, -Infinity];\nconst F32_BBOX_INIT = new Float32Array(BBOX_INIT);\nconst FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\nconst LINE_FACTOR = 1.35;\nconst LINE_DESCENT_FACTOR = 0.35;\nconst BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR;\nconst RenderingIntentFlag = {\n  ANY: 0x01,\n  DISPLAY: 0x02,\n  PRINT: 0x04,\n  SAVE: 0x08,\n  ANNOTATIONS_FORMS: 0x10,\n  ANNOTATIONS_STORAGE: 0x20,\n  ANNOTATIONS_DISABLE: 0x40,\n  IS_EDITING: 0x80,\n  OPLIST: 0x100\n};\nconst AnnotationMode = {\n  DISABLE: 0,\n  ENABLE: 1,\n  ENABLE_FORMS: 2,\n  ENABLE_STORAGE: 3\n};\nconst AnnotationEditorPrefix = \"pdfjs_internal_editor_\";\nconst AnnotationEditorType = {\n  DISABLE: -1,\n  NONE: 0,\n  FREETEXT: 3,\n  HIGHLIGHT: 9,\n  STAMP: 13,\n  INK: 15,\n  POPUP: 16,\n  SIGNATURE: 101,\n  COMMENT: 102\n};\nconst AnnotationEditorParamsType = {\n  RESIZE: 1,\n  CREATE: 2,\n  FREETEXT_SIZE: 11,\n  FREETEXT_COLOR: 12,\n  FREETEXT_OPACITY: 13,\n  INK_COLOR: 21,\n  INK_THICKNESS: 22,\n  INK_OPACITY: 23,\n  INK_COLOR_AND_OPACITY: 24,\n  HIGHLIGHT_COLOR: 31,\n  HIGHLIGHT_THICKNESS: 32,\n  HIGHLIGHT_FREE: 33,\n  HIGHLIGHT_SHOW_ALL: 34,\n  DRAW_STEP: 41\n};\nconst PermissionFlag = {\n  PRINT: 0x04,\n  MODIFY_CONTENTS: 0x08,\n  COPY: 0x10,\n  MODIFY_ANNOTATIONS: 0x20,\n  FILL_INTERACTIVE_FORMS: 0x100,\n  COPY_FOR_ACCESSIBILITY: 0x200,\n  ASSEMBLE: 0x400,\n  PRINT_HIGH_QUALITY: 0x800\n};\nconst MeshFigureType = {\n  TRIANGLES: 1,\n  LATTICE: 2,\n  PATCH: 3\n};\nconst TextRenderingMode = {\n  FILL: 0,\n  STROKE: 1,\n  FILL_STROKE: 2,\n  INVISIBLE: 3,\n  FILL_ADD_TO_PATH: 4,\n  STROKE_ADD_TO_PATH: 5,\n  FILL_STROKE_ADD_TO_PATH: 6,\n  ADD_TO_PATH: 7,\n  FILL_STROKE_MASK: 3,\n  ADD_TO_PATH_FLAG: 4\n};\nconst ImageKind = {\n  GRAYSCALE_1BPP: 1,\n  RGB_24BPP: 2,\n  RGBA_32BPP: 3\n};\nconst AnnotationType = {\n  TEXT: 1,\n  LINK: 2,\n  FREETEXT: 3,\n  LINE: 4,\n  SQUARE: 5,\n  CIRCLE: 6,\n  POLYGON: 7,\n  POLYLINE: 8,\n  HIGHLIGHT: 9,\n  UNDERLINE: 10,\n  SQUIGGLY: 11,\n  STRIKEOUT: 12,\n  STAMP: 13,\n  CARET: 14,\n  INK: 15,\n  POPUP: 16,\n  FILEATTACHMENT: 17,\n  SOUND: 18,\n  MOVIE: 19,\n  WIDGET: 20,\n  SCREEN: 21,\n  PRINTERMARK: 22,\n  TRAPNET: 23,\n  WATERMARK: 24,\n  THREED: 25,\n  REDACT: 26\n};\nconst AnnotationReplyType = {\n  GROUP: \"Group\",\n  REPLY: \"R\"\n};\nconst AnnotationFlag = {\n  INVISIBLE: 0x01,\n  HIDDEN: 0x02,\n  PRINT: 0x04,\n  NOZOOM: 0x08,\n  NOROTATE: 0x10,\n  NOVIEW: 0x20,\n  READONLY: 0x40,\n  LOCKED: 0x80,\n  TOGGLENOVIEW: 0x100,\n  LOCKEDCONTENTS: 0x200\n};\nconst AnnotationFieldFlag = {\n  READONLY: 0x0000001,\n  REQUIRED: 0x0000002,\n  NOEXPORT: 0x0000004,\n  MULTILINE: 0x0001000,\n  PASSWORD: 0x0002000,\n  NOTOGGLETOOFF: 0x0004000,\n  RADIO: 0x0008000,\n  PUSHBUTTON: 0x0010000,\n  COMBO: 0x0020000,\n  EDIT: 0x0040000,\n  SORT: 0x0080000,\n  FILESELECT: 0x0100000,\n  MULTISELECT: 0x0200000,\n  DONOTSPELLCHECK: 0x0400000,\n  DONOTSCROLL: 0x0800000,\n  COMB: 0x1000000,\n  RICHTEXT: 0x2000000,\n  RADIOSINUNISON: 0x2000000,\n  COMMITONSELCHANGE: 0x4000000\n};\nconst AnnotationBorderStyleType = {\n  SOLID: 1,\n  DASHED: 2,\n  BEVELED: 3,\n  INSET: 4,\n  UNDERLINE: 5\n};\nconst AnnotationActionEventType = {\n  E: \"Mouse Enter\",\n  X: \"Mouse Exit\",\n  D: \"Mouse Down\",\n  U: \"Mouse Up\",\n  Fo: \"Focus\",\n  Bl: \"Blur\",\n  PO: \"PageOpen\",\n  PC: \"PageClose\",\n  PV: \"PageVisible\",\n  PI: \"PageInvisible\",\n  K: \"Keystroke\",\n  F: \"Format\",\n  V: \"Validate\",\n  C: \"Calculate\"\n};\nconst DocumentActionEventType = {\n  WC: \"WillClose\",\n  WS: \"WillSave\",\n  DS: \"DidSave\",\n  WP: \"WillPrint\",\n  DP: \"DidPrint\"\n};\nconst PageActionEventType = {\n  O: \"PageOpen\",\n  C: \"PageClose\"\n};\nconst VerbosityLevel = {\n  ERRORS: 0,\n  WARNINGS: 1,\n  INFOS: 5\n};\nconst OPS = {\n  dependency: 1,\n  setLineWidth: 2,\n  setLineCap: 3,\n  setLineJoin: 4,\n  setMiterLimit: 5,\n  setDash: 6,\n  setRenderingIntent: 7,\n  setFlatness: 8,\n  setGState: 9,\n  save: 10,\n  restore: 11,\n  transform: 12,\n  moveTo: 13,\n  lineTo: 14,\n  curveTo: 15,\n  curveTo2: 16,\n  curveTo3: 17,\n  closePath: 18,\n  rectangle: 19,\n  stroke: 20,\n  closeStroke: 21,\n  fill: 22,\n  eoFill: 23,\n  fillStroke: 24,\n  eoFillStroke: 25,\n  closeFillStroke: 26,\n  closeEOFillStroke: 27,\n  endPath: 28,\n  clip: 29,\n  eoClip: 30,\n  beginText: 31,\n  endText: 32,\n  setCharSpacing: 33,\n  setWordSpacing: 34,\n  setHScale: 35,\n  setLeading: 36,\n  setFont: 37,\n  setTextRenderingMode: 38,\n  setTextRise: 39,\n  moveText: 40,\n  setLeadingMoveText: 41,\n  setTextMatrix: 42,\n  nextLine: 43,\n  showText: 44,\n  showSpacedText: 45,\n  nextLineShowText: 46,\n  nextLineSetSpacingShowText: 47,\n  setCharWidth: 48,\n  setCharWidthAndBounds: 49,\n  setStrokeColorSpace: 50,\n  setFillColorSpace: 51,\n  setStrokeColor: 52,\n  setStrokeColorN: 53,\n  setFillColor: 54,\n  setFillColorN: 55,\n  setStrokeGray: 56,\n  setFillGray: 57,\n  setStrokeRGBColor: 58,\n  setFillRGBColor: 59,\n  setStrokeCMYKColor: 60,\n  setFillCMYKColor: 61,\n  shadingFill: 62,\n  beginInlineImage: 63,\n  beginImageData: 64,\n  endInlineImage: 65,\n  paintXObject: 66,\n  markPoint: 67,\n  markPointProps: 68,\n  beginMarkedContent: 69,\n  beginMarkedContentProps: 70,\n  endMarkedContent: 71,\n  beginCompat: 72,\n  endCompat: 73,\n  paintFormXObjectBegin: 74,\n  paintFormXObjectEnd: 75,\n  beginGroup: 76,\n  endGroup: 77,\n  beginAnnotation: 80,\n  endAnnotation: 81,\n  paintImageMaskXObject: 83,\n  paintImageMaskXObjectGroup: 84,\n  paintImageXObject: 85,\n  paintInlineImageXObject: 86,\n  paintInlineImageXObjectGroup: 87,\n  paintImageXObjectRepeat: 88,\n  paintImageMaskXObjectRepeat: 89,\n  paintSolidColorImageMask: 90,\n  constructPath: 91,\n  setStrokeTransparent: 92,\n  setFillTransparent: 93,\n  rawFillPath: 94\n};\nconst DrawOPS = {\n  moveTo: 0,\n  lineTo: 1,\n  curveTo: 2,\n  quadraticCurveTo: 3,\n  closePath: 4\n};\nconst PasswordResponses = {\n  NEED_PASSWORD: 1,\n  INCORRECT_PASSWORD: 2\n};\nlet verbosity = VerbosityLevel.WARNINGS;\nfunction setVerbosityLevel(level) {\n  if (Number.isInteger(level)) {\n    verbosity = level;\n  }\n}\nfunction getVerbosityLevel() {\n  return verbosity;\n}\nfunction info(msg) {\n  if (verbosity >= VerbosityLevel.INFOS) {\n    console.info(`Info: ${msg}`);\n  }\n}\nfunction warn(msg) {\n  if (verbosity >= VerbosityLevel.WARNINGS) {\n    console.warn(`Warning: ${msg}`);\n  }\n}\nfunction unreachable(msg) {\n  throw new Error(msg);\n}\nfunction assert(cond, msg) {\n  if (!cond) {\n    unreachable(msg);\n  }\n}\nfunction _isValidProtocol(url) {\n  switch (url?.protocol) {\n    case \"http:\":\n    case \"https:\":\n    case \"ftp:\":\n    case \"mailto:\":\n    case \"tel:\":\n      return true;\n    default:\n      return false;\n  }\n}\nfunction createValidAbsoluteUrl(url, baseUrl = null, options = null) {\n  if (!url) {\n    return null;\n  }\n  if (options && typeof url === \"string\") {\n    if (options.addDefaultProtocol && url.startsWith(\"www.\")) {\n      const dots = url.match(/\\./g);\n      if (dots?.length >= 2) {\n        url = `http://${url}`;\n      }\n    }\n    if (options.tryConvertEncoding) {\n      try {\n        url = stringToUTF8String(url);\n      } catch {}\n    }\n  }\n  const absoluteUrl = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url);\n  return _isValidProtocol(absoluteUrl) ? absoluteUrl : null;\n}\nfunction updateUrlHash(url, hash, allowRel = false) {\n  const res = URL.parse(url);\n  if (res) {\n    res.hash = hash;\n    return res.href;\n  }\n  if (allowRel && createValidAbsoluteUrl(url, \"http://example.com\")) {\n    return url.split(\"#\", 1)[0] + `${hash ? `#${hash}` : \"\"}`;\n  }\n  return \"\";\n}\nfunction stripPath(str) {\n  return str.substring(str.lastIndexOf(\"/\") + 1);\n}\nfunction shadow(obj, prop, value, nonSerializable = false) {\n  Object.defineProperty(obj, prop, {\n    value,\n    enumerable: !nonSerializable,\n    configurable: true,\n    writable: false\n  });\n  return value;\n}\nconst BaseException = function BaseExceptionClosure() {\n  function BaseException(message, name) {\n    this.message = message;\n    this.name = name;\n  }\n  BaseException.prototype = new Error();\n  BaseException.constructor = BaseException;\n  return BaseException;\n}();\nclass PasswordException extends BaseException {\n  constructor(msg, code) {\n    super(msg, \"PasswordException\");\n    this.code = code;\n  }\n}\nclass UnknownErrorException extends BaseException {\n  constructor(msg, details) {\n    super(msg, \"UnknownErrorException\");\n    this.details = details;\n  }\n}\nclass InvalidPDFException extends BaseException {\n  constructor(msg) {\n    super(msg, \"InvalidPDFException\");\n  }\n}\nclass ResponseException extends BaseException {\n  constructor(msg, status, missing) {\n    super(msg, \"ResponseException\");\n    this.status = status;\n    this.missing = missing;\n  }\n}\nclass FormatError extends BaseException {\n  constructor(msg) {\n    super(msg, \"FormatError\");\n  }\n}\nclass AbortException extends BaseException {\n  constructor(msg) {\n    super(msg, \"AbortException\");\n  }\n}\nfunction bytesToString(bytes) {\n  if (typeof bytes !== \"object\" || bytes?.length === undefined) {\n    unreachable(\"Invalid argument for bytesToString\");\n  }\n  const length = bytes.length;\n  const MAX_ARGUMENT_COUNT = 8192;\n  if (length < MAX_ARGUMENT_COUNT) {\n    return String.fromCharCode.apply(null, bytes);\n  }\n  const strBuf = [];\n  for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n    const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n    const chunk = bytes.subarray(i, chunkEnd);\n    strBuf.push(String.fromCharCode.apply(null, chunk));\n  }\n  return strBuf.join(\"\");\n}\nfunction stringToBytes(str) {\n  if (typeof str !== \"string\") {\n    unreachable(\"Invalid argument for stringToBytes\");\n  }\n  const length = str.length;\n  const bytes = new Uint8Array(length);\n  for (let i = 0; i < length; ++i) {\n    bytes[i] = str.charCodeAt(i) & 0xff;\n  }\n  return bytes;\n}\nfunction objectSize(obj) {\n  return Object.keys(obj).length;\n}\nfunction isLittleEndian() {\n  const buffer8 = new Uint8Array(4);\n  buffer8[0] = 1;\n  const view32 = new Uint32Array(buffer8.buffer, 0, 1);\n  return view32[0] === 1;\n}\nclass FeatureTest {\n  static get isLittleEndian() {\n    return shadow(this, \"isLittleEndian\", isLittleEndian());\n  }\n  static get isOffscreenCanvasSupported() {\n    return shadow(this, \"isOffscreenCanvasSupported\", typeof OffscreenCanvas !== \"undefined\");\n  }\n  static get isImageDecoderSupported() {\n    return shadow(this, \"isImageDecoderSupported\", typeof ImageDecoder !== \"undefined\");\n  }\n  static get isFloat16ArraySupported() {\n    return shadow(this, \"isFloat16ArraySupported\", typeof Float16Array !== \"undefined\");\n  }\n  static get isSanitizerSupported() {\n    return shadow(this, \"isSanitizerSupported\", typeof Sanitizer !== \"undefined\");\n  }\n  static get platform() {\n    const {\n      platform,\n      userAgent\n    } = navigator;\n    return shadow(this, \"platform\", {\n      isAndroid: userAgent.includes(\"Android\"),\n      isLinux: platform.includes(\"Linux\"),\n      isMac: platform.includes(\"Mac\"),\n      isWindows: platform.includes(\"Win\"),\n      isFirefox: userAgent.includes(\"Firefox\")\n    });\n  }\n  static get isCSSRoundSupported() {\n    return shadow(this, \"isCSSRoundSupported\", globalThis.CSS?.supports?.(\"width: round(1.5px, 1px)\"));\n  }\n  static get isAlphaColorInputSupported() {\n    return shadow(this, \"isAlphaColorInputSupported\", (() => {\n      if (typeof document === \"undefined\") {\n        return false;\n      }\n      const input = document.createElement(\"input\");\n      input.type = \"color\";\n      input.setAttribute(\"alpha\", \"\");\n      input.value = \"#ff000080\";\n      return input.value !== \"#ff0000\";\n    })());\n  }\n}\nclass Util {\n  static get hexNums() {\n    return shadow(this, \"hexNums\", Array.from(Array(256).keys(), n => n.toString(16).padStart(2, \"0\")));\n  }\n  static makeHexColor(r, g, b) {\n    return `#${this.hexNums[r]}${this.hexNums[g]}${this.hexNums[b]}`;\n  }\n  static domMatrixToTransform(dm) {\n    return [dm.a, dm.b, dm.c, dm.d, dm.e, dm.f];\n  }\n  static scaleMinMax(transform, minMax) {\n    let temp;\n    if (transform[0]) {\n      if (transform[0] < 0) {\n        temp = minMax[0];\n        minMax[0] = minMax[2];\n        minMax[2] = temp;\n      }\n      minMax[0] *= transform[0];\n      minMax[2] *= transform[0];\n      if (transform[3] < 0) {\n        temp = minMax[1];\n        minMax[1] = minMax[3];\n        minMax[3] = temp;\n      }\n      minMax[1] *= transform[3];\n      minMax[3] *= transform[3];\n    } else {\n      temp = minMax[0];\n      minMax[0] = minMax[1];\n      minMax[1] = temp;\n      temp = minMax[2];\n      minMax[2] = minMax[3];\n      minMax[3] = temp;\n      if (transform[1] < 0) {\n        temp = minMax[1];\n        minMax[1] = minMax[3];\n        minMax[3] = temp;\n      }\n      minMax[1] *= transform[1];\n      minMax[3] *= transform[1];\n      if (transform[2] < 0) {\n        temp = minMax[0];\n        minMax[0] = minMax[2];\n        minMax[2] = temp;\n      }\n      minMax[0] *= transform[2];\n      minMax[2] *= transform[2];\n    }\n    minMax[0] += transform[4];\n    minMax[1] += transform[5];\n    minMax[2] += transform[4];\n    minMax[3] += transform[5];\n  }\n  static transform(m1, m2) {\n    return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];\n  }\n  static multiplyByDOMMatrix(m, md) {\n    return [m[0] * md.a + m[2] * md.b, m[1] * md.a + m[3] * md.b, m[0] * md.c + m[2] * md.d, m[1] * md.c + m[3] * md.d, m[0] * md.e + m[2] * md.f + m[4], m[1] * md.e + m[3] * md.f + m[5]];\n  }\n  static applyTransform(p, m, pos = 0) {\n    const p0 = p[pos];\n    const p1 = p[pos + 1];\n    p[pos] = p0 * m[0] + p1 * m[2] + m[4];\n    p[pos + 1] = p0 * m[1] + p1 * m[3] + m[5];\n  }\n  static applyTransformToBezier(p, transform, pos = 0) {\n    const m0 = transform[0];\n    const m1 = transform[1];\n    const m2 = transform[2];\n    const m3 = transform[3];\n    const m4 = transform[4];\n    const m5 = transform[5];\n    for (let i = 0; i < 6; i += 2) {\n      const pI = p[pos + i];\n      const pI1 = p[pos + i + 1];\n      p[pos + i] = pI * m0 + pI1 * m2 + m4;\n      p[pos + i + 1] = pI * m1 + pI1 * m3 + m5;\n    }\n  }\n  static applyInverseTransform(p, m) {\n    const p0 = p[0];\n    const p1 = p[1];\n    const d = m[0] * m[3] - m[1] * m[2];\n    p[0] = (p0 * m[3] - p1 * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n    p[1] = (-p0 * m[1] + p1 * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n  }\n  static axialAlignedBoundingBox(rect, transform, output) {\n    const m0 = transform[0];\n    const m1 = transform[1];\n    const m2 = transform[2];\n    const m3 = transform[3];\n    const m4 = transform[4];\n    const m5 = transform[5];\n    const r0 = rect[0];\n    const r1 = rect[1];\n    const r2 = rect[2];\n    const r3 = rect[3];\n    let a0 = m0 * r0 + m4;\n    let a2 = a0;\n    let a1 = m0 * r2 + m4;\n    let a3 = a1;\n    let b0 = m3 * r1 + m5;\n    let b2 = b0;\n    let b1 = m3 * r3 + m5;\n    let b3 = b1;\n    if (m1 !== 0 || m2 !== 0) {\n      const m1r0 = m1 * r0;\n      const m1r2 = m1 * r2;\n      const m2r1 = m2 * r1;\n      const m2r3 = m2 * r3;\n      a0 += m2r1;\n      a3 += m2r1;\n      a1 += m2r3;\n      a2 += m2r3;\n      b0 += m1r0;\n      b3 += m1r0;\n      b1 += m1r2;\n      b2 += m1r2;\n    }\n    output[0] = Math.min(output[0], a0, a1, a2, a3);\n    output[1] = Math.min(output[1], b0, b1, b2, b3);\n    output[2] = Math.max(output[2], a0, a1, a2, a3);\n    output[3] = Math.max(output[3], b0, b1, b2, b3);\n  }\n  static inverseTransform(m) {\n    const d = m[0] * m[3] - m[1] * m[2];\n    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];\n  }\n  static singularValueDecompose2dScale(matrix, output) {\n    const m0 = matrix[0];\n    const m1 = matrix[1];\n    const m2 = matrix[2];\n    const m3 = matrix[3];\n    const a = m0 ** 2 + m1 ** 2;\n    const b = m0 * m2 + m1 * m3;\n    const c = m2 ** 2 + m3 ** 2;\n    const first = (a + c) / 2;\n    const second = Math.sqrt(first ** 2 - (a * c - b ** 2));\n    output[0] = Math.sqrt(first + second || 1);\n    output[1] = Math.sqrt(first - second || 1);\n  }\n  static normalizeRect(rect) {\n    const r = rect.slice(0);\n    if (rect[0] > rect[2]) {\n      r[0] = rect[2];\n      r[2] = rect[0];\n    }\n    if (rect[1] > rect[3]) {\n      r[1] = rect[3];\n      r[3] = rect[1];\n    }\n    return r;\n  }\n  static intersect(rect1, rect2) {\n    const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2]));\n    const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2]));\n    if (xLow > xHigh) {\n      return null;\n    }\n    const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3]));\n    const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3]));\n    if (yLow > yHigh) {\n      return null;\n    }\n    return [xLow, yLow, xHigh, yHigh];\n  }\n  static pointBoundingBox(x, y, minMax) {\n    minMax[0] = Math.min(minMax[0], x);\n    minMax[1] = Math.min(minMax[1], y);\n    minMax[2] = Math.max(minMax[2], x);\n    minMax[3] = Math.max(minMax[3], y);\n  }\n  static rectBoundingBox(x0, y0, x1, y1, minMax) {\n    minMax[0] = Math.min(minMax[0], x0, x1);\n    minMax[1] = Math.min(minMax[1], y0, y1);\n    minMax[2] = Math.max(minMax[2], x0, x1);\n    minMax[3] = Math.max(minMax[3], y0, y1);\n  }\n  static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) {\n    if (t <= 0 || t >= 1) {\n      return;\n    }\n    const mt = 1 - t;\n    const tt = t * t;\n    const ttt = tt * t;\n    const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3;\n    const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3;\n    minMax[0] = Math.min(minMax[0], x);\n    minMax[1] = Math.min(minMax[1], y);\n    minMax[2] = Math.max(minMax[2], x);\n    minMax[3] = Math.max(minMax[3], y);\n  }\n  static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) {\n    if (Math.abs(a) < 1e-12) {\n      if (Math.abs(b) >= 1e-12) {\n        this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax);\n      }\n      return;\n    }\n    const delta = b ** 2 - 4 * c * a;\n    if (delta < 0) {\n      return;\n    }\n    const sqrtDelta = Math.sqrt(delta);\n    const a2 = 2 * a;\n    this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax);\n    this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax);\n  }\n  static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) {\n    minMax[0] = Math.min(minMax[0], x0, x3);\n    minMax[1] = Math.min(minMax[1], y0, y3);\n    minMax[2] = Math.max(minMax[2], x0, x3);\n    minMax[3] = Math.max(minMax[3], y0, y3);\n    this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax);\n    this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax);\n  }\n}\nconst PDFStringTranslateTable = (/* unused pure expression or super */ null && ([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac]));\nfunction stringToPDFString(str, keepEscapeSequence = false) {\n  if (str[0] >= \"\\xEF\") {\n    let encoding;\n    if (str[0] === \"\\xFE\" && str[1] === \"\\xFF\") {\n      encoding = \"utf-16be\";\n      if (str.length % 2 === 1) {\n        str = str.slice(0, -1);\n      }\n    } else if (str[0] === \"\\xFF\" && str[1] === \"\\xFE\") {\n      encoding = \"utf-16le\";\n      if (str.length % 2 === 1) {\n        str = str.slice(0, -1);\n      }\n    } else if (str[0] === \"\\xEF\" && str[1] === \"\\xBB\" && str[2] === \"\\xBF\") {\n      encoding = \"utf-8\";\n    }\n    if (encoding) {\n      try {\n        const decoder = new TextDecoder(encoding, {\n          fatal: true\n        });\n        const buffer = stringToBytes(str);\n        const decoded = decoder.decode(buffer);\n        if (keepEscapeSequence || !decoded.includes(\"\\x1b\")) {\n          return decoded;\n        }\n        return decoded.replaceAll(/\\x1b[^\\x1b]*(?:\\x1b|$)/g, \"\");\n      } catch (ex) {\n        warn(`stringToPDFString: \"${ex}\".`);\n      }\n    }\n  }\n  const strBuf = [];\n  for (let i = 0, ii = str.length; i < ii; i++) {\n    const charCode = str.charCodeAt(i);\n    if (!keepEscapeSequence && charCode === 0x1b) {\n      while (++i < ii && str.charCodeAt(i) !== 0x1b) {}\n      continue;\n    }\n    const code = PDFStringTranslateTable[charCode];\n    strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n  }\n  return strBuf.join(\"\");\n}\nfunction stringToUTF8String(str) {\n  return decodeURIComponent(escape(str));\n}\nfunction utf8StringToString(str) {\n  return unescape(encodeURIComponent(str));\n}\nfunction isArrayEqual(arr1, arr2) {\n  if (arr1.length !== arr2.length) {\n    return false;\n  }\n  for (let i = 0, ii = arr1.length; i < ii; i++) {\n    if (arr1[i] !== arr2[i]) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction getModificationDate(date = new Date()) {\n  if (!(date instanceof Date)) {\n    date = new Date(date);\n  }\n  const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, \"0\"), date.getUTCDate().toString().padStart(2, \"0\"), date.getUTCHours().toString().padStart(2, \"0\"), date.getUTCMinutes().toString().padStart(2, \"0\"), date.getUTCSeconds().toString().padStart(2, \"0\")];\n  return buffer.join(\"\");\n}\nlet NormalizeRegex = null;\nlet NormalizationMap = null;\nfunction normalizeUnicode(str) {\n  if (!NormalizeRegex) {\n    NormalizeRegex = /([\\u00a0\\u00b5\\u037e\\u0eb3\\u2000-\\u200a\\u202f\\u2126\\ufb00-\\ufb04\\ufb06\\ufb20-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufba1\\ufba4-\\ufba9\\ufbae-\\ufbb1\\ufbd3-\\ufbdc\\ufbde-\\ufbe7\\ufbea-\\ufbf8\\ufbfc-\\ufbfd\\ufc00-\\ufc5d\\ufc64-\\ufcf1\\ufcf5-\\ufd3d\\ufd88\\ufdf4\\ufdfa-\\ufdfb\\ufe71\\ufe77\\ufe79\\ufe7b\\ufe7d]+)|(\\ufb05+)/gu;\n    NormalizationMap = new Map([[\"ﬅ\", \"ſt\"]]);\n  }\n  return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize(\"NFKC\") : NormalizationMap.get(p2));\n}\nfunction getUuid() {\n  if (typeof crypto.randomUUID === \"function\") {\n    return crypto.randomUUID();\n  }\n  const buf = new Uint8Array(32);\n  crypto.getRandomValues(buf);\n  return bytesToString(buf);\n}\nconst AnnotationPrefix = \"pdfjs_internal_id_\";\nfunction _isValidExplicitDest(validRef, validName, dest) {\n  if (!Array.isArray(dest) || dest.length < 2) {\n    return false;\n  }\n  const [page, zoom, ...args] = dest;\n  if (!validRef(page) && !Number.isInteger(page)) {\n    return false;\n  }\n  if (!validName(zoom)) {\n    return false;\n  }\n  const argsLen = args.length;\n  let allowNull = true;\n  switch (zoom.name) {\n    case \"XYZ\":\n      if (argsLen < 2 || argsLen > 3) {\n        return false;\n      }\n      break;\n    case \"Fit\":\n    case \"FitB\":\n      return argsLen === 0;\n    case \"FitH\":\n    case \"FitBH\":\n    case \"FitV\":\n    case \"FitBV\":\n      if (argsLen > 1) {\n        return false;\n      }\n      break;\n    case \"FitR\":\n      if (argsLen !== 4) {\n        return false;\n      }\n      allowNull = false;\n      break;\n    default:\n      return false;\n  }\n  for (const arg of args) {\n    if (typeof arg === \"number\" || allowNull && arg === null) {\n      continue;\n    }\n    return false;\n  }\n  return true;\n}\nconst makeArr = () => [];\nconst makeMap = () => new Map();\nconst makeObj = () => Object.create(null);\nif (typeof Blob.prototype.bytes !== \"function\") {\n  Blob.prototype.bytes = async function () {\n    return new Uint8Array(await this.arrayBuffer());\n  };\n}\nif (typeof Response.prototype.bytes !== \"function\") {\n  Response.prototype.bytes = async function () {\n    return new Uint8Array(await this.arrayBuffer());\n  };\n}\nif (typeof AbortSignal.any !== \"function\") {\n  AbortSignal.any = function (iterable) {\n    const ac = new AbortController();\n    const {\n      signal\n    } = ac;\n    for (const s of iterable) {\n      if (s.aborted) {\n        ac.abort(s.reason);\n        return signal;\n      }\n    }\n    for (const s of iterable) {\n      s.addEventListener(\"abort\", () => {\n        ac.abort(s.reason);\n      }, {\n        signal\n      });\n    }\n    return signal;\n  };\n}\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.constructor.js\nvar es_iterator_constructor = __webpack_require__(8111);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.map.js\nvar es_iterator_map = __webpack_require__(1701);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.delete.js\nvar web_url_search_params_delete = __webpack_require__(4603);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.has.js\nvar web_url_search_params_has = __webpack_require__(7566);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.size.js\nvar web_url_search_params_size = __webpack_require__(8721);\n;// ./src/shared/math_clamp.js\nfunction MathClamp(v, min, max) {\n  return Math.min(Math.max(v, min), max);\n}\n\n;// ./src/display/xfa_text.js\n\nclass XfaText {\n  static textContent(xfa) {\n    const items = [];\n    const output = {\n      items,\n      styles: Object.create(null)\n    };\n    function walk(node) {\n      if (!node) {\n        return;\n      }\n      let str = null;\n      const name = node.name;\n      if (name === \"#text\") {\n        str = node.value;\n      } else if (!XfaText.shouldBuildText(name)) {\n        return;\n      } else if (node?.attributes?.textContent) {\n        str = node.attributes.textContent;\n      } else if (node.value) {\n        str = node.value;\n      }\n      if (str !== null) {\n        items.push({\n          str\n        });\n      }\n      if (!node.children) {\n        return;\n      }\n      for (const child of node.children) {\n        walk(child);\n      }\n    }\n    walk(xfa);\n    return output;\n  }\n  static shouldBuildText(name) {\n    return !(name === \"textarea\" || name === \"input\" || name === \"option\" || name === \"select\");\n  }\n}\n\n;// ./src/display/xfa_layer.js\n\n\nclass XfaLayer {\n  static setupStorage(html, id, element, storage, intent) {\n    const storedData = storage.getValue(id, {\n      value: null\n    });\n    switch (element.name) {\n      case \"textarea\":\n        if (storedData.value !== null) {\n          html.textContent = storedData.value;\n        }\n        if (intent === \"print\") {\n          break;\n        }\n        html.addEventListener(\"input\", event => {\n          storage.setValue(id, {\n            value: event.target.value\n          });\n        });\n        break;\n      case \"input\":\n        if (element.attributes.type === \"radio\" || element.attributes.type === \"checkbox\") {\n          if (storedData.value === element.attributes.xfaOn) {\n            html.setAttribute(\"checked\", true);\n          } else if (storedData.value === element.attributes.xfaOff) {\n            html.removeAttribute(\"checked\");\n          }\n          if (intent === \"print\") {\n            break;\n          }\n          html.addEventListener(\"change\", event => {\n            storage.setValue(id, {\n              value: event.target.checked ? event.target.getAttribute(\"xfaOn\") : event.target.getAttribute(\"xfaOff\")\n            });\n          });\n        } else {\n          if (storedData.value !== null) {\n            html.setAttribute(\"value\", storedData.value);\n          }\n          if (intent === \"print\") {\n            break;\n          }\n          html.addEventListener(\"input\", event => {\n            storage.setValue(id, {\n              value: event.target.value\n            });\n          });\n        }\n        break;\n      case \"select\":\n        if (storedData.value !== null) {\n          html.setAttribute(\"value\", storedData.value);\n          for (const option of element.children) {\n            if (option.attributes.value === storedData.value) {\n              option.attributes.selected = true;\n            } else if (Object.hasOwn(option.attributes, \"selected\")) {\n              delete option.attributes.selected;\n            }\n          }\n        }\n        html.addEventListener(\"input\", event => {\n          const options = event.target.options;\n          const value = options.selectedIndex === -1 ? \"\" : options[options.selectedIndex].value;\n          storage.setValue(id, {\n            value\n          });\n        });\n        break;\n    }\n  }\n  static setAttributes({\n    html,\n    element,\n    storage = null,\n    intent,\n    linkService\n  }) {\n    const {\n      attributes\n    } = element;\n    const isHTMLAnchorElement = html instanceof HTMLAnchorElement;\n    if (attributes.type === \"radio\") {\n      attributes.name = `${attributes.name}-${intent}`;\n    }\n    for (const [key, value] of Object.entries(attributes)) {\n      if (value === null || value === undefined) {\n        continue;\n      }\n      switch (key) {\n        case \"class\":\n          if (value.length) {\n            html.setAttribute(key, value.join(\" \"));\n          }\n          break;\n        case \"dataId\":\n          break;\n        case \"id\":\n          html.setAttribute(\"data-element-id\", value);\n          break;\n        case \"style\":\n          Object.assign(html.style, value);\n          break;\n        case \"textContent\":\n          html.textContent = value;\n          break;\n        default:\n          if (!isHTMLAnchorElement || key !== \"href\" && key !== \"newWindow\") {\n            html.setAttribute(key, value);\n          }\n      }\n    }\n    if (isHTMLAnchorElement) {\n      linkService.addLinkAttributes(html, attributes.href, attributes.newWindow);\n    }\n    if (storage && attributes.dataId) {\n      this.setupStorage(html, attributes.dataId, element, storage);\n    }\n  }\n  static render(parameters) {\n    const storage = parameters.annotationStorage;\n    const linkService = parameters.linkService;\n    const root = parameters.xfaHtml;\n    const intent = parameters.intent || \"display\";\n    const rootHtml = document.createElement(root.name);\n    if (root.attributes) {\n      this.setAttributes({\n        html: rootHtml,\n        element: root,\n        intent,\n        linkService\n      });\n    }\n    const isNotForRichText = intent !== \"richText\";\n    const rootDiv = parameters.div;\n    rootDiv.append(rootHtml);\n    if (parameters.viewport) {\n      const transform = `matrix(${parameters.viewport.transform.join(\",\")})`;\n      rootDiv.style.transform = transform;\n    }\n    if (isNotForRichText) {\n      rootDiv.setAttribute(\"class\", \"xfaLayer xfaFont\");\n    }\n    const textDivs = [];\n    if (root.children.length === 0) {\n      if (root.value) {\n        const node = document.createTextNode(root.value);\n        rootHtml.append(node);\n        if (isNotForRichText && XfaText.shouldBuildText(root.name)) {\n          textDivs.push(node);\n        }\n      }\n      return {\n        textDivs\n      };\n    }\n    const stack = [[root, -1, rootHtml]];\n    while (stack.length > 0) {\n      const [parent, i, html] = stack.at(-1);\n      if (i + 1 === parent.children.length) {\n        stack.pop();\n        continue;\n      }\n      const child = parent.children[++stack.at(-1)[1]];\n      if (child === null) {\n        continue;\n      }\n      const {\n        name\n      } = child;\n      if (name === \"#text\") {\n        const node = document.createTextNode(child.value);\n        textDivs.push(node);\n        html.append(node);\n        continue;\n      }\n      const childHtml = child?.attributes?.xmlns ? document.createElementNS(child.attributes.xmlns, name) : document.createElement(name);\n      html.append(childHtml);\n      if (child.attributes) {\n        this.setAttributes({\n          html: childHtml,\n          element: child,\n          storage,\n          intent,\n          linkService\n        });\n      }\n      if (child.children?.length > 0) {\n        stack.push([child, -1, childHtml]);\n      } else if (child.value) {\n        const node = document.createTextNode(child.value);\n        if (isNotForRichText && XfaText.shouldBuildText(name)) {\n          textDivs.push(node);\n        }\n        childHtml.append(node);\n      }\n    }\n    for (const el of rootDiv.querySelectorAll(\".xfaNonInteractive input, .xfaNonInteractive textarea\")) {\n      el.setAttribute(\"readOnly\", true);\n    }\n    return {\n      textDivs\n    };\n  }\n  static update(parameters) {\n    const transform = `matrix(${parameters.viewport.transform.join(\",\")})`;\n    parameters.div.style.transform = transform;\n    parameters.div.hidden = false;\n  }\n}\n\n;// ./src/display/display_utils.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\nclass PixelsPerInch {\n  static CSS = 96.0;\n  static PDF = 72.0;\n  static PDF_TO_CSS_UNITS = this.CSS / this.PDF;\n}\nasync function fetchData(url, type = \"text\") {\n  if (isValidFetchUrl(url, document.baseURI)) {\n    const response = await fetch(url);\n    if (!response.ok) {\n      throw new Error(response.statusText);\n    }\n    switch (type) {\n      case \"blob\":\n        return response.blob();\n      case \"bytes\":\n        return response.bytes();\n      case \"json\":\n        return response.json();\n    }\n    return response.text();\n  }\n  return new Promise((resolve, reject) => {\n    const request = new XMLHttpRequest();\n    request.open(\"GET\", url, true);\n    request.responseType = type === \"bytes\" ? \"arraybuffer\" : type;\n    request.onreadystatechange = () => {\n      if (request.readyState !== XMLHttpRequest.DONE) {\n        return;\n      }\n      if (request.status === 200 || request.status === 0) {\n        switch (type) {\n          case \"bytes\":\n            resolve(new Uint8Array(request.response));\n            return;\n          case \"blob\":\n          case \"json\":\n            resolve(request.response);\n            return;\n        }\n        resolve(request.responseText);\n        return;\n      }\n      reject(new Error(request.statusText));\n    };\n    request.send(null);\n  });\n}\nclass PageViewport {\n  constructor({\n    viewBox,\n    userUnit,\n    scale,\n    rotation,\n    offsetX = 0,\n    offsetY = 0,\n    dontFlip = false\n  }) {\n    this.viewBox = viewBox;\n    this.userUnit = userUnit;\n    this.scale = scale;\n    this.rotation = rotation;\n    this.offsetX = offsetX;\n    this.offsetY = offsetY;\n    scale *= userUnit;\n    const centerX = (viewBox[2] + viewBox[0]) / 2;\n    const centerY = (viewBox[3] + viewBox[1]) / 2;\n    let rotateA, rotateB, rotateC, rotateD;\n    rotation %= 360;\n    if (rotation < 0) {\n      rotation += 360;\n    }\n    switch (rotation) {\n      case 180:\n        rotateA = -1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = 1;\n        break;\n      case 90:\n        rotateA = 0;\n        rotateB = 1;\n        rotateC = 1;\n        rotateD = 0;\n        break;\n      case 270:\n        rotateA = 0;\n        rotateB = -1;\n        rotateC = -1;\n        rotateD = 0;\n        break;\n      case 0:\n        rotateA = 1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = -1;\n        break;\n      default:\n        throw new Error(\"PageViewport: Invalid rotation, must be a multiple of 90 degrees.\");\n    }\n    if (dontFlip) {\n      rotateC = -rotateC;\n      rotateD = -rotateD;\n    }\n    let offsetCanvasX, offsetCanvasY;\n    let width, height;\n    if (rotateA === 0) {\n      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n      width = (viewBox[3] - viewBox[1]) * scale;\n      height = (viewBox[2] - viewBox[0]) * scale;\n    } else {\n      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n      width = (viewBox[2] - viewBox[0]) * scale;\n      height = (viewBox[3] - viewBox[1]) * scale;\n    }\n    this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY];\n    this.width = width;\n    this.height = height;\n  }\n  get rawDims() {\n    const dims = this.viewBox;\n    return shadow(this, \"rawDims\", {\n      pageWidth: dims[2] - dims[0],\n      pageHeight: dims[3] - dims[1],\n      pageX: dims[0],\n      pageY: dims[1]\n    });\n  }\n  clone({\n    scale = this.scale,\n    rotation = this.rotation,\n    offsetX = this.offsetX,\n    offsetY = this.offsetY,\n    dontFlip = false\n  } = {}) {\n    return new PageViewport({\n      viewBox: this.viewBox.slice(),\n      userUnit: this.userUnit,\n      scale,\n      rotation,\n      offsetX,\n      offsetY,\n      dontFlip\n    });\n  }\n  convertToViewportPoint(x, y) {\n    const p = [x, y];\n    Util.applyTransform(p, this.transform);\n    return p;\n  }\n  convertToViewportRectangle(rect) {\n    const topLeft = [rect[0], rect[1]];\n    Util.applyTransform(topLeft, this.transform);\n    const bottomRight = [rect[2], rect[3]];\n    Util.applyTransform(bottomRight, this.transform);\n    return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]];\n  }\n  convertToPdfPoint(x, y) {\n    const p = [x, y];\n    Util.applyInverseTransform(p, this.transform);\n    return p;\n  }\n}\nclass RenderingCancelledException extends BaseException {\n  constructor(msg, extraDelay = 0) {\n    super(msg, \"RenderingCancelledException\");\n    this.extraDelay = extraDelay;\n  }\n}\nfunction isDataScheme(url) {\n  const ii = url.length;\n  let i = 0;\n  while (i < ii && url[i].trim() === \"\") {\n    i++;\n  }\n  return url.substring(i, i + 5).toLowerCase() === \"data:\";\n}\nfunction isPdfFile(filename) {\n  return typeof filename === \"string\" && /\\.pdf$/i.test(filename);\n}\nfunction getFilenameFromUrl(url) {\n  [url] = url.split(/[#?]/, 1);\n  return stripPath(url);\n}\nfunction getPdfFilenameFromUrl(url, defaultFilename = \"document.pdf\") {\n  if (typeof url !== \"string\") {\n    return defaultFilename;\n  }\n  if (isDataScheme(url)) {\n    warn('getPdfFilenameFromUrl: ignore \"data:\"-URL for performance reasons.');\n    return defaultFilename;\n  }\n  const getURL = urlString => {\n    try {\n      return new URL(urlString);\n    } catch {\n      try {\n        return new URL(decodeURIComponent(urlString));\n      } catch {\n        try {\n          return new URL(urlString, \"https://foo.bar\");\n        } catch {\n          try {\n            return new URL(decodeURIComponent(urlString), \"https://foo.bar\");\n          } catch {\n            return null;\n          }\n        }\n      }\n    }\n  };\n  const newURL = getURL(url);\n  if (!newURL) {\n    return defaultFilename;\n  }\n  const decode = name => {\n    try {\n      let decoded = decodeURIComponent(name);\n      if (decoded.includes(\"/\")) {\n        decoded = stripPath(decoded);\n        if (/^\\.pdf$/i.test(decoded)) {\n          return name;\n        }\n      }\n      return decoded;\n    } catch {\n      return name;\n    }\n  };\n  const pdfRegex = /\\.pdf$/i;\n  const filename = stripPath(newURL.pathname);\n  if (pdfRegex.test(filename)) {\n    return decode(filename);\n  }\n  if (newURL.searchParams.size > 0) {\n    const getLast = iterator => [...iterator].findLast(v => pdfRegex.test(v));\n    const name = getLast(newURL.searchParams.values()) ?? getLast(newURL.searchParams.keys());\n    if (name) {\n      return decode(name);\n    }\n  }\n  if (newURL.hash) {\n    const reFilename = /[^/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n    const hashFilename = reFilename.exec(newURL.hash);\n    if (hashFilename) {\n      return decode(hashFilename[0]);\n    }\n  }\n  return defaultFilename;\n}\nclass StatTimer {\n  #started = new Map();\n  times = [];\n  time(name) {\n    if (this.#started.has(name)) {\n      warn(`Timer is already running for ${name}`);\n    }\n    this.#started.set(name, Date.now());\n  }\n  timeEnd(name) {\n    if (!this.#started.has(name)) {\n      warn(`Timer has not been started for ${name}`);\n    }\n    this.times.push({\n      name,\n      start: this.#started.get(name),\n      end: Date.now()\n    });\n    this.#started.delete(name);\n  }\n  toString() {\n    const longest = Math.max(...this.times.map(t => t.name.length));\n    return this.times.map(t => `${t.name.padEnd(longest)} ${t.end - t.start}ms\\n`).join(\"\");\n  }\n}\nfunction isValidFetchUrl(url, baseUrl) {\n  const res = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url);\n  return /https?:/.test(res?.protocol ?? \"\");\n}\nfunction noContextMenu(e) {\n  e.preventDefault();\n}\nfunction stopEvent(e) {\n  e.preventDefault();\n  e.stopPropagation();\n}\nfunction deprecated(details) {\n  console.log(\"Deprecated API usage: \" + details);\n}\nclass PDFDateString {\n  static #regex;\n  static toDateObject(input) {\n    if (input instanceof Date) {\n      return input;\n    }\n    if (!input || typeof input !== \"string\") {\n      return null;\n    }\n    this.#regex ||= new RegExp(\"^D:\" + \"(\\\\d{4})\" + \"(\\\\d{2})?\" + \"(\\\\d{2})?\" + \"(\\\\d{2})?\" + \"(\\\\d{2})?\" + \"(\\\\d{2})?\" + \"([Z|+|-])?\" + \"(\\\\d{2})?\" + \"'?\" + \"(\\\\d{2})?\" + \"'?\");\n    const matches = this.#regex.exec(input);\n    if (!matches) {\n      return null;\n    }\n    const year = parseInt(matches[1], 10);\n    let month = parseInt(matches[2], 10);\n    month = month >= 1 && month <= 12 ? month - 1 : 0;\n    let day = parseInt(matches[3], 10);\n    day = day >= 1 && day <= 31 ? day : 1;\n    let hour = parseInt(matches[4], 10);\n    hour = hour >= 0 && hour <= 23 ? hour : 0;\n    let minute = parseInt(matches[5], 10);\n    minute = minute >= 0 && minute <= 59 ? minute : 0;\n    let second = parseInt(matches[6], 10);\n    second = second >= 0 && second <= 59 ? second : 0;\n    const universalTimeRelation = matches[7] || \"Z\";\n    let offsetHour = parseInt(matches[8], 10);\n    offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0;\n    let offsetMinute = parseInt(matches[9], 10) || 0;\n    offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0;\n    if (universalTimeRelation === \"-\") {\n      hour += offsetHour;\n      minute += offsetMinute;\n    } else if (universalTimeRelation === \"+\") {\n      hour -= offsetHour;\n      minute -= offsetMinute;\n    }\n    return new Date(Date.UTC(year, month, day, hour, minute, second));\n  }\n}\nfunction getXfaPageViewport(xfaPage, {\n  scale = 1,\n  rotation = 0\n}) {\n  const {\n    width,\n    height\n  } = xfaPage.attributes.style;\n  const viewBox = [0, 0, parseInt(width, 10), parseInt(height, 10)];\n  return new PageViewport({\n    viewBox,\n    userUnit: 1,\n    scale,\n    rotation\n  });\n}\nfunction getRGBA(color) {\n  if (color.startsWith(\"#\")) {\n    const hex = color.slice(1);\n    return [parseInt(hex.slice(0, 2), 16), parseInt(hex.slice(2, 4), 16), parseInt(hex.slice(4, 6), 16), hex.length >= 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1];\n  }\n  if (color.startsWith(\"rgb(\")) {\n    const [r, g, b] = color.slice(4, -1).split(\",\").map(x => parseInt(x, 10));\n    return [r, g, b, 1];\n  }\n  if (color.startsWith(\"rgba(\")) {\n    const parts = color.slice(5, -1).split(\",\");\n    return [parseInt(parts[0], 10), parseInt(parts[1], 10), parseInt(parts[2], 10), parseFloat(parts[3])];\n  }\n  const m = color.match(/^color\\(srgb\\s+([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)(?:\\s*\\/\\s*([\\d.]+|none))?\\)$/);\n  if (m) {\n    return [Math.round(parseFloat(m[1]) * 255), Math.round(parseFloat(m[2]) * 255), Math.round(parseFloat(m[3]) * 255), m[4] !== undefined && m[4] !== \"none\" ? parseFloat(m[4]) : 1];\n  }\n  return null;\n}\nfunction getRGB(color) {\n  const rgba = getRGBA(color);\n  if (!rgba) {\n    warn(`Not a valid color format: \"${color}\"`);\n    return [0, 0, 0];\n  }\n  return rgba.slice(0, 3);\n}\nfunction getColorValues(colors) {\n  const span = document.createElement(\"span\");\n  span.style.visibility = \"hidden\";\n  span.style.colorScheme = \"only light\";\n  document.body.append(span);\n  for (const name of colors.keys()) {\n    span.style.color = name;\n    const computedColor = window.getComputedStyle(span).color;\n    colors.set(name, getRGB(computedColor));\n  }\n  span.remove();\n}\nfunction getCurrentTransform(ctx) {\n  const {\n    a,\n    b,\n    c,\n    d,\n    e,\n    f\n  } = ctx.getTransform();\n  return [a, b, c, d, e, f];\n}\nfunction getCurrentTransformInverse(ctx) {\n  const {\n    a,\n    b,\n    c,\n    d,\n    e,\n    f\n  } = ctx.getTransform().invertSelf();\n  return [a, b, c, d, e, f];\n}\nfunction setLayerDimensions(div, viewport, mustFlip = false, mustRotate = true) {\n  if (viewport instanceof PageViewport) {\n    const {\n      pageWidth,\n      pageHeight\n    } = viewport.rawDims;\n    const {\n      style\n    } = div;\n    const useRound = FeatureTest.isCSSRoundSupported;\n    const w = `var(--total-scale-factor) * ${pageWidth}px`,\n      h = `var(--total-scale-factor) * ${pageHeight}px`;\n    const widthStr = useRound ? `round(down, ${w}, var(--scale-round-x))` : `calc(${w})`,\n      heightStr = useRound ? `round(down, ${h}, var(--scale-round-y))` : `calc(${h})`;\n    if (!mustFlip || viewport.rotation % 180 === 0) {\n      style.width = widthStr;\n      style.height = heightStr;\n    } else {\n      style.width = heightStr;\n      style.height = widthStr;\n    }\n  }\n  if (mustRotate) {\n    div.setAttribute(\"data-main-rotation\", viewport.rotation);\n  }\n}\nclass OutputScale {\n  constructor() {\n    const {\n      pixelRatio\n    } = OutputScale;\n    this.sx = pixelRatio;\n    this.sy = pixelRatio;\n  }\n  get scaled() {\n    return this.sx !== 1 || this.sy !== 1;\n  }\n  get symmetric() {\n    return this.sx === this.sy;\n  }\n  limitCanvas(width, height, maxPixels, maxDim, capAreaFactor = -1) {\n    let maxAreaScale = Infinity,\n      maxWidthScale = Infinity,\n      maxHeightScale = Infinity;\n    maxPixels = OutputScale.capPixels(maxPixels, capAreaFactor);\n    if (maxPixels > 0) {\n      maxAreaScale = Math.sqrt(maxPixels / (width * height));\n    }\n    if (maxDim !== -1) {\n      maxWidthScale = maxDim / width;\n      maxHeightScale = maxDim / height;\n    }\n    const maxScale = Math.min(maxAreaScale, maxWidthScale, maxHeightScale);\n    if (this.sx > maxScale || this.sy > maxScale) {\n      this.sx = maxScale;\n      this.sy = maxScale;\n      return true;\n    }\n    return false;\n  }\n  static get pixelRatio() {\n    return globalThis.devicePixelRatio || 1;\n  }\n  static capPixels(maxPixels, capAreaFactor) {\n    if (capAreaFactor >= 0) {\n      const winPixels = Math.ceil(window.screen.availWidth * window.screen.availHeight * this.pixelRatio ** 2 * (1 + capAreaFactor / 100));\n      return maxPixels > 0 ? Math.min(maxPixels, winPixels) : winPixels;\n    }\n    return maxPixels;\n  }\n}\nconst SupportedImageMimeTypes = [\"image/apng\", \"image/avif\", \"image/bmp\", \"image/gif\", \"image/jpeg\", \"image/png\", \"image/svg+xml\", \"image/webp\", \"image/x-icon\"];\nclass ColorScheme {\n  static get isDarkMode() {\n    return shadow(this, \"isDarkMode\", !!window?.matchMedia?.(\"(prefers-color-scheme: dark)\").matches);\n  }\n}\nclass CSSConstants {\n  static get commentForegroundColor() {\n    const element = document.createElement(\"span\");\n    element.classList.add(\"comment\", \"sidebar\");\n    const {\n      style\n    } = element;\n    style.width = style.height = \"0\";\n    style.display = \"none\";\n    style.color = \"var(--comment-fg-color)\";\n    document.body.append(element);\n    const {\n      color\n    } = window.getComputedStyle(element);\n    element.remove();\n    return shadow(this, \"commentForegroundColor\", getRGB(color));\n  }\n}\nfunction applyOpacity(color, opacity) {\n  opacity = MathClamp(opacity ?? 1, 0, 1);\n  const white = 255 * (1 - opacity);\n  return color.map(c => Math.round(c * opacity + white));\n}\nfunction RGBToHSL(rgb, output) {\n  const r = rgb[0] / 255;\n  const g = rgb[1] / 255;\n  const b = rgb[2] / 255;\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n  const l = (max + min) / 2;\n  if (max === min) {\n    output[0] = output[1] = 0;\n  } else {\n    const d = max - min;\n    output[1] = l < 0.5 ? d / (max + min) : d / (2 - max - min);\n    switch (max) {\n      case r:\n        output[0] = ((g - b) / d + (g < b ? 6 : 0)) * 60;\n        break;\n      case g:\n        output[0] = ((b - r) / d + 2) * 60;\n        break;\n      case b:\n        output[0] = ((r - g) / d + 4) * 60;\n        break;\n    }\n  }\n  output[2] = l;\n}\nfunction HSLToRGB(hsl, output) {\n  const h = hsl[0];\n  const s = hsl[1];\n  const l = hsl[2];\n  const c = (1 - Math.abs(2 * l - 1)) * s;\n  const x = c * (1 - Math.abs(h / 60 % 2 - 1));\n  const m = l - c / 2;\n  switch (Math.floor(h / 60)) {\n    case 0:\n      output[0] = c + m;\n      output[1] = x + m;\n      output[2] = m;\n      break;\n    case 1:\n      output[0] = x + m;\n      output[1] = c + m;\n      output[2] = m;\n      break;\n    case 2:\n      output[0] = m;\n      output[1] = c + m;\n      output[2] = x + m;\n      break;\n    case 3:\n      output[0] = m;\n      output[1] = x + m;\n      output[2] = c + m;\n      break;\n    case 4:\n      output[0] = x + m;\n      output[1] = m;\n      output[2] = c + m;\n      break;\n    case 5:\n    case 6:\n      output[0] = c + m;\n      output[1] = m;\n      output[2] = x + m;\n      break;\n  }\n}\nfunction computeLuminance(x) {\n  return x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;\n}\nfunction contrastRatio(hsl1, hsl2, output) {\n  HSLToRGB(hsl1, output);\n  output.map(computeLuminance);\n  const lum1 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2];\n  HSLToRGB(hsl2, output);\n  output.map(computeLuminance);\n  const lum2 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2];\n  return lum1 > lum2 ? (lum1 + 0.05) / (lum2 + 0.05) : (lum2 + 0.05) / (lum1 + 0.05);\n}\nconst contrastCache = new Map();\nfunction findContrastColor(baseColor, fixedColor) {\n  const key = baseColor[0] + baseColor[1] * 0x100 + baseColor[2] * 0x10000 + fixedColor[0] * 0x1000000 + fixedColor[1] * 0x100000000 + fixedColor[2] * 0x10000000000;\n  let cachedValue = contrastCache.get(key);\n  if (cachedValue) {\n    return cachedValue;\n  }\n  const array = new Float32Array(9);\n  const output = array.subarray(0, 3);\n  const baseHSL = array.subarray(3, 6);\n  RGBToHSL(baseColor, baseHSL);\n  const fixedHSL = array.subarray(6, 9);\n  RGBToHSL(fixedColor, fixedHSL);\n  const isFixedColorDark = fixedHSL[2] < 0.5;\n  const minContrast = isFixedColorDark ? 12 : 4.5;\n  baseHSL[2] = isFixedColorDark ? Math.sqrt(baseHSL[2]) : 1 - Math.sqrt(1 - baseHSL[2]);\n  if (contrastRatio(baseHSL, fixedHSL, output) < minContrast) {\n    let start, end;\n    if (isFixedColorDark) {\n      start = baseHSL[2];\n      end = 1;\n    } else {\n      start = 0;\n      end = baseHSL[2];\n    }\n    const PRECISION = 0.005;\n    while (end - start > PRECISION) {\n      const mid = baseHSL[2] = (start + end) / 2;\n      if (isFixedColorDark === contrastRatio(baseHSL, fixedHSL, output) < minContrast) {\n        start = mid;\n      } else {\n        end = mid;\n      }\n    }\n    baseHSL[2] = isFixedColorDark ? end : start;\n  }\n  HSLToRGB(baseHSL, output);\n  cachedValue = Util.makeHexColor(Math.round(output[0] * 255), Math.round(output[1] * 255), Math.round(output[2] * 255));\n  contrastCache.set(key, cachedValue);\n  return cachedValue;\n}\nfunction renderRichText({\n  html,\n  dir,\n  className\n}, container) {\n  const fragment = document.createDocumentFragment();\n  if (typeof html === \"string\") {\n    const p = document.createElement(\"p\");\n    p.dir = dir || \"auto\";\n    const lines = html.split(/(?:\\r\\n?|\\n)/);\n    for (let i = 0, ii = lines.length; i < ii; ++i) {\n      const line = lines[i];\n      p.append(document.createTextNode(line));\n      if (i < ii - 1) {\n        p.append(document.createElement(\"br\"));\n      }\n    }\n    fragment.append(p);\n  } else {\n    XfaLayer.render({\n      xfaHtml: html,\n      div: fragment,\n      intent: \"richText\"\n    });\n  }\n  fragment.firstElementChild.classList.add(\"richText\", className);\n  container.append(fragment);\n}\nfunction makePathFromDrawOPS(data) {\n  const path = new Path2D();\n  if (!data) {\n    return path;\n  }\n  for (let i = 0, ii = data.length; i < ii;) {\n    switch (data[i++]) {\n      case DrawOPS.moveTo:\n        path.moveTo(data[i++], data[i++]);\n        break;\n      case DrawOPS.lineTo:\n        path.lineTo(data[i++], data[i++]);\n        break;\n      case DrawOPS.curveTo:\n        path.bezierCurveTo(data[i++], data[i++], data[i++], data[i++], data[i++], data[i++]);\n        break;\n      case DrawOPS.quadraticCurveTo:\n        path.quadraticCurveTo(data[i++], data[i++], data[i++], data[i++]);\n        break;\n      case DrawOPS.closePath:\n        path.closePath();\n        break;\n      default:\n        warn(`Unrecognized drawing path operator: ${data[i - 1]}`);\n        break;\n    }\n  }\n  return path;\n}\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.take.js\nvar es_iterator_take = __webpack_require__(4972);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.promise.with-resolvers.js\nvar es_promise_with_resolvers = __webpack_require__(4628);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.difference.v2.js\nvar es_set_difference_v2 = __webpack_require__(7642);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.intersection.v2.js\nvar es_set_intersection_v2 = __webpack_require__(8004);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\nvar es_set_is_disjoint_from_v2 = __webpack_require__(3853);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.is-subset-of.v2.js\nvar es_set_is_subset_of_v2 = __webpack_require__(5876);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.is-superset-of.v2.js\nvar es_set_is_superset_of_v2 = __webpack_require__(2475);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\nvar es_set_symmetric_difference_v2 = __webpack_require__(5024);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.union.v2.js\nvar es_set_union_v2 = __webpack_require__(1698);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.weak-map.get-or-insert.js\nvar es_weak_map_get_or_insert = __webpack_require__(8454);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.weak-map.get-or-insert-computed.js\nvar es_weak_map_get_or_insert_computed = __webpack_require__(9452);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-exception.stack.js\nvar web_dom_exception_stack = __webpack_require__(4979);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.some.js\nvar es_iterator_some = __webpack_require__(3579);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.json.stringify.js\nvar es_json_stringify = __webpack_require__(3110);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.drop.js\nvar es_iterator_drop = __webpack_require__(9314);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.every.js\nvar es_iterator_every = __webpack_require__(1148);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.json.parse.js\nvar es_json_parse = __webpack_require__(9112);\n;// ./src/display/editor/toolbar.js\n\nclass EditorToolbar {\n  #toolbar = null;\n  #colorPicker = null;\n  #editor;\n  #buttons = null;\n  #altText = null;\n  #comment = null;\n  #commentButtonDivider = null;\n  #signatureDescriptionButton = null;\n  static #l10nRemove = null;\n  constructor(editor) {\n    this.#editor = editor;\n    EditorToolbar.#l10nRemove ||= Object.freeze({\n      freetext: \"pdfjs-editor-remove-freetext-button\",\n      highlight: \"pdfjs-editor-remove-highlight-button\",\n      ink: \"pdfjs-editor-remove-ink-button\",\n      stamp: \"pdfjs-editor-remove-stamp-button\",\n      signature: \"pdfjs-editor-remove-signature-button\"\n    });\n  }\n  render() {\n    const editToolbar = this.#toolbar = document.createElement(\"div\");\n    editToolbar.classList.add(\"editToolbar\", \"hidden\");\n    editToolbar.setAttribute(\"role\", \"toolbar\");\n    const signal = this.#editor._uiManager._signal;\n    if (signal instanceof AbortSignal && !signal.aborted) {\n      editToolbar.addEventListener(\"contextmenu\", noContextMenu, {\n        signal\n      });\n      editToolbar.addEventListener(\"pointerdown\", EditorToolbar.#pointerDown, {\n        signal\n      });\n    }\n    const buttons = this.#buttons = document.createElement(\"div\");\n    buttons.className = \"buttons\";\n    editToolbar.append(buttons);\n    const position = this.#editor.toolbarPosition;\n    if (position) {\n      const {\n        style\n      } = editToolbar;\n      const x = this.#editor._uiManager.direction === \"ltr\" ? 1 - position[0] : position[0];\n      style.insetInlineEnd = `${100 * x}%`;\n      style.top = `calc(${100 * position[1]}% + var(--editor-toolbar-vert-offset))`;\n    }\n    return editToolbar;\n  }\n  get div() {\n    return this.#toolbar;\n  }\n  static #pointerDown(e) {\n    e.stopPropagation();\n  }\n  #focusIn(e) {\n    this.#editor._focusEventsAllowed = false;\n    stopEvent(e);\n  }\n  #focusOut(e) {\n    this.#editor._focusEventsAllowed = true;\n    stopEvent(e);\n  }\n  #addListenersToElement(element) {\n    const signal = this.#editor._uiManager._signal;\n    if (!(signal instanceof AbortSignal) || signal.aborted) {\n      return false;\n    }\n    element.addEventListener(\"focusin\", this.#focusIn.bind(this), {\n      capture: true,\n      signal\n    });\n    element.addEventListener(\"focusout\", this.#focusOut.bind(this), {\n      capture: true,\n      signal\n    });\n    element.addEventListener(\"contextmenu\", noContextMenu, {\n      signal\n    });\n    return true;\n  }\n  hide() {\n    this.#toolbar.classList.add(\"hidden\");\n    this.#colorPicker?.hideDropdown();\n  }\n  show() {\n    this.#toolbar.classList.remove(\"hidden\");\n    this.#altText?.shown();\n    this.#comment?.shown();\n  }\n  addDeleteButton() {\n    const {\n      editorType,\n      _uiManager\n    } = this.#editor;\n    const button = document.createElement(\"button\");\n    button.classList.add(\"basic\", \"deleteButton\");\n    button.tabIndex = 0;\n    button.setAttribute(\"data-l10n-id\", EditorToolbar.#l10nRemove[editorType]);\n    if (this.#addListenersToElement(button)) {\n      button.addEventListener(\"click\", e => {\n        _uiManager.delete();\n      }, {\n        signal: _uiManager._signal\n      });\n    }\n    this.#buttons.append(button);\n  }\n  get #divider() {\n    const divider = document.createElement(\"div\");\n    divider.className = \"divider\";\n    return divider;\n  }\n  async addAltText(altText) {\n    const button = await altText.render();\n    this.#addListenersToElement(button);\n    this.#buttons.append(button, this.#divider);\n    this.#altText = altText;\n  }\n  addComment(comment, beforeElement = null) {\n    if (this.#comment) {\n      return;\n    }\n    const button = comment.renderForToolbar();\n    if (!button) {\n      return;\n    }\n    this.#addListenersToElement(button);\n    const divider = this.#commentButtonDivider = this.#divider;\n    if (!beforeElement) {\n      this.#buttons.append(button, divider);\n    } else {\n      this.#buttons.insertBefore(button, beforeElement);\n      this.#buttons.insertBefore(divider, beforeElement);\n    }\n    this.#comment = comment;\n    comment.toolbar = this;\n  }\n  addColorPicker(colorPicker) {\n    if (this.#colorPicker) {\n      return;\n    }\n    this.#colorPicker = colorPicker;\n    const button = colorPicker.renderButton();\n    this.#addListenersToElement(button);\n    this.#buttons.append(button, this.#divider);\n  }\n  async addEditSignatureButton(signatureManager) {\n    const button = this.#signatureDescriptionButton = await signatureManager.renderEditButton(this.#editor);\n    this.#addListenersToElement(button);\n    this.#buttons.append(button, this.#divider);\n  }\n  removeButton(name) {\n    switch (name) {\n      case \"comment\":\n        this.#comment?.removeToolbarCommentButton();\n        this.#comment = null;\n        this.#commentButtonDivider?.remove();\n        this.#commentButtonDivider = null;\n        break;\n    }\n  }\n  async addButton(name, tool) {\n    switch (name) {\n      case \"colorPicker\":\n        if (tool) {\n          this.addColorPicker(tool);\n        }\n        break;\n      case \"altText\":\n        if (tool) {\n          await this.addAltText(tool);\n        }\n        break;\n      case \"editSignature\":\n        if (tool) {\n          await this.addEditSignatureButton(tool);\n        }\n        break;\n      case \"delete\":\n        this.addDeleteButton();\n        break;\n      case \"comment\":\n        if (tool) {\n          this.addComment(tool);\n        }\n        break;\n    }\n  }\n  async addButtonBefore(name, tool, beforeSelector) {\n    if (!tool && name === \"comment\") {\n      return;\n    }\n    const beforeElement = this.#buttons.querySelector(beforeSelector);\n    if (!beforeElement) {\n      return;\n    }\n    if (name === \"comment\") {\n      this.addComment(tool, beforeElement);\n    }\n  }\n  updateEditSignatureButton(description) {\n    if (this.#signatureDescriptionButton) {\n      this.#signatureDescriptionButton.title = description;\n    }\n  }\n  remove() {\n    this.#toolbar.remove();\n    this.#colorPicker?.destroy();\n    this.#colorPicker = null;\n  }\n}\nclass FloatingToolbar {\n  #buttons = null;\n  #toolbar = null;\n  #uiManager;\n  constructor(uiManager) {\n    this.#uiManager = uiManager;\n  }\n  #render() {\n    const editToolbar = this.#toolbar = document.createElement(\"div\");\n    editToolbar.className = \"editToolbar\";\n    editToolbar.setAttribute(\"role\", \"toolbar\");\n    const signal = this.#uiManager._signal;\n    if (signal instanceof AbortSignal && !signal.aborted) {\n      editToolbar.addEventListener(\"contextmenu\", noContextMenu, {\n        signal\n      });\n    }\n    const buttons = this.#buttons = document.createElement(\"div\");\n    buttons.className = \"buttons\";\n    editToolbar.append(buttons);\n    if (this.#uiManager.hasCommentManager()) {\n      this.#makeButton(\"commentButton\", `pdfjs-comment-floating-button`, \"pdfjs-comment-floating-button-label\", () => {\n        this.#uiManager.commentSelection(\"floating_button\");\n      });\n    }\n    this.#makeButton(\"highlightButton\", `pdfjs-highlight-floating-button1`, \"pdfjs-highlight-floating-button-label\", () => {\n      this.#uiManager.highlightSelection(\"floating_button\");\n    });\n    return editToolbar;\n  }\n  #getLastPoint(boxes, isLTR) {\n    let lastY = 0;\n    let lastX = 0;\n    for (const box of boxes) {\n      const y = box.y + box.height;\n      if (y < lastY) {\n        continue;\n      }\n      const x = box.x + (isLTR ? box.width : 0);\n      if (y > lastY) {\n        lastX = x;\n        lastY = y;\n        continue;\n      }\n      if (isLTR) {\n        if (x > lastX) {\n          lastX = x;\n        }\n      } else if (x < lastX) {\n        lastX = x;\n      }\n    }\n    return [isLTR ? 1 - lastX : lastX, lastY];\n  }\n  show(parent, boxes, isLTR) {\n    const [x, y] = this.#getLastPoint(boxes, isLTR);\n    const {\n      style\n    } = this.#toolbar ||= this.#render();\n    parent.append(this.#toolbar);\n    style.insetInlineEnd = `${100 * x}%`;\n    style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`;\n  }\n  hide() {\n    this.#toolbar.remove();\n  }\n  #makeButton(buttonClass, l10nId, labelL10nId, clickHandler) {\n    const button = document.createElement(\"button\");\n    button.classList.add(\"basic\", buttonClass);\n    button.tabIndex = 0;\n    button.setAttribute(\"data-l10n-id\", l10nId);\n    const span = document.createElement(\"span\");\n    button.append(span);\n    span.className = \"visuallyHidden\";\n    span.setAttribute(\"data-l10n-id\", labelL10nId);\n    const signal = this.#uiManager._signal;\n    if (signal instanceof AbortSignal && !signal.aborted) {\n      button.addEventListener(\"contextmenu\", noContextMenu, {\n        signal\n      });\n      button.addEventListener(\"click\", clickHandler, {\n        signal\n      });\n    }\n    this.#buttons.append(button);\n  }\n}\n\n;// ./src/display/editor/tools.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction bindEvents(obj, element, names) {\n  for (const name of names) {\n    element.addEventListener(name, obj[name].bind(obj));\n  }\n}\nclass CurrentPointers {\n  static #pointerId = NaN;\n  static #pointerIds = null;\n  static #moveTimestamp = NaN;\n  static #pointerType = null;\n  static initializeAndAddPointerId(pointerId) {\n    (CurrentPointers.#pointerIds ||= new Set()).add(pointerId);\n  }\n  static setPointer(pointerType, pointerId) {\n    CurrentPointers.#pointerId ||= pointerId;\n    CurrentPointers.#pointerType ??= pointerType;\n  }\n  static setTimeStamp(timeStamp) {\n    CurrentPointers.#moveTimestamp = timeStamp;\n  }\n  static isSamePointerId(pointerId) {\n    return CurrentPointers.#pointerId === pointerId;\n  }\n  static isSamePointerIdOrRemove(pointerId) {\n    if (CurrentPointers.#pointerId === pointerId) {\n      return true;\n    }\n    CurrentPointers.#pointerIds?.delete(pointerId);\n    return false;\n  }\n  static isSamePointerType(pointerType) {\n    return CurrentPointers.#pointerType === pointerType;\n  }\n  static isInitializedAndDifferentPointerType(pointerType) {\n    return CurrentPointers.#pointerType !== null && !CurrentPointers.isSamePointerType(pointerType);\n  }\n  static isSameTimeStamp(timeStamp) {\n    return CurrentPointers.#moveTimestamp === timeStamp;\n  }\n  static isUsingMultiplePointers() {\n    return CurrentPointers.#pointerIds?.size >= 1;\n  }\n  static clearPointerType() {\n    CurrentPointers.#pointerType = null;\n  }\n  static clearPointerIds() {\n    CurrentPointers.#pointerId = NaN;\n    CurrentPointers.#pointerIds = null;\n  }\n  static clearTimeStamp() {\n    CurrentPointers.#moveTimestamp = NaN;\n  }\n}\nclass IdManager {\n  #id = 0;\n  get id() {\n    return `${AnnotationEditorPrefix}${this.#id++}`;\n  }\n}\nclass ImageManager {\n  #baseId = getUuid();\n  #id = 0;\n  #cache = null;\n  static get _isSVGFittingCanvas() {\n    const svg = `data:image/svg+xml;charset=UTF-8,<svg viewBox=\"0 0 1 1\" width=\"1\" height=\"1\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"1\" height=\"1\" style=\"fill:red;\"/></svg>`;\n    const canvas = new OffscreenCanvas(1, 3);\n    const ctx = canvas.getContext(\"2d\", {\n      willReadFrequently: true\n    });\n    const image = new Image();\n    image.src = svg;\n    const promise = image.decode().then(() => {\n      ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3);\n      return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0;\n    });\n    return shadow(this, \"_isSVGFittingCanvas\", promise);\n  }\n  async #get(key, rawData) {\n    this.#cache ||= new Map();\n    let data = this.#cache.get(key);\n    if (data === null) {\n      return null;\n    }\n    if (data?.bitmap) {\n      data.refCounter += 1;\n      return data;\n    }\n    try {\n      data ||= {\n        bitmap: null,\n        id: `image_${this.#baseId}_${this.#id++}`,\n        refCounter: 0,\n        isSvg: false\n      };\n      let image;\n      if (typeof rawData === \"string\") {\n        data.url = rawData;\n        image = await fetchData(rawData, \"blob\");\n      } else if (rawData instanceof File) {\n        image = data.file = rawData;\n      } else if (rawData instanceof Blob) {\n        image = rawData;\n      }\n      if (image.type === \"image/svg+xml\") {\n        const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas;\n        const fileReader = new FileReader();\n        const imageElement = new Image();\n        const imagePromise = new Promise((resolve, reject) => {\n          imageElement.onload = () => {\n            data.bitmap = imageElement;\n            data.isSvg = true;\n            resolve();\n          };\n          fileReader.onload = async () => {\n            const url = data.svgUrl = fileReader.result;\n            imageElement.src = (await mustRemoveAspectRatioPromise) ? `${url}#svgView(preserveAspectRatio(none))` : url;\n          };\n          imageElement.onerror = fileReader.onerror = reject;\n        });\n        fileReader.readAsDataURL(image);\n        await imagePromise;\n      } else {\n        data.bitmap = await createImageBitmap(image);\n      }\n      data.refCounter = 1;\n    } catch (e) {\n      warn(e);\n      data = null;\n    }\n    this.#cache.set(key, data);\n    if (data) {\n      this.#cache.set(data.id, data);\n    }\n    return data;\n  }\n  async getFromFile(file) {\n    const {\n      lastModified,\n      name,\n      size,\n      type\n    } = file;\n    return this.#get(`${lastModified}_${name}_${size}_${type}`, file);\n  }\n  async getFromUrl(url) {\n    return this.#get(url, url);\n  }\n  async getFromBlob(id, blobPromise) {\n    const blob = await blobPromise;\n    return this.#get(id, blob);\n  }\n  async getFromId(id) {\n    this.#cache ||= new Map();\n    const data = this.#cache.get(id);\n    if (!data) {\n      return null;\n    }\n    if (data.bitmap) {\n      data.refCounter += 1;\n      return data;\n    }\n    if (data.file) {\n      return this.getFromFile(data.file);\n    }\n    if (data.blobPromise) {\n      const {\n        blobPromise\n      } = data;\n      delete data.blobPromise;\n      return this.getFromBlob(data.id, blobPromise);\n    }\n    return this.getFromUrl(data.url);\n  }\n  getFromCanvas(id, canvas) {\n    this.#cache ||= new Map();\n    let data = this.#cache.get(id);\n    if (data?.bitmap) {\n      data.refCounter += 1;\n      return data;\n    }\n    const offscreen = new OffscreenCanvas(canvas.width, canvas.height);\n    const ctx = offscreen.getContext(\"2d\");\n    ctx.drawImage(canvas, 0, 0);\n    data = {\n      bitmap: offscreen.transferToImageBitmap(),\n      id: `image_${this.#baseId}_${this.#id++}`,\n      refCounter: 1,\n      isSvg: false\n    };\n    this.#cache.set(id, data);\n    this.#cache.set(data.id, data);\n    return data;\n  }\n  getSvgUrl(id) {\n    const data = this.#cache.get(id);\n    if (!data?.isSvg) {\n      return null;\n    }\n    return data.svgUrl;\n  }\n  deleteId(id) {\n    this.#cache ||= new Map();\n    const data = this.#cache.get(id);\n    if (!data) {\n      return;\n    }\n    data.refCounter -= 1;\n    if (data.refCounter !== 0) {\n      return;\n    }\n    const {\n      bitmap\n    } = data;\n    if (!data.url && !data.file) {\n      const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n      const ctx = canvas.getContext(\"bitmaprenderer\");\n      ctx.transferFromImageBitmap(bitmap);\n      data.blobPromise = canvas.convertToBlob();\n    }\n    bitmap.close?.();\n    data.bitmap = null;\n  }\n  isValidId(id) {\n    return id.startsWith(`image_${this.#baseId}_`);\n  }\n}\nclass CommandManager {\n  #commands = [];\n  #locked = false;\n  #maxSize;\n  #position = -1;\n  constructor(maxSize = 128) {\n    this.#maxSize = maxSize;\n  }\n  add({\n    cmd,\n    undo,\n    post,\n    mustExec,\n    type = NaN,\n    overwriteIfSameType = false,\n    keepUndo = false\n  }) {\n    if (mustExec) {\n      cmd();\n    }\n    if (this.#locked) {\n      return;\n    }\n    const save = {\n      cmd,\n      undo,\n      post,\n      type\n    };\n    if (this.#position === -1) {\n      if (this.#commands.length > 0) {\n        this.#commands.length = 0;\n      }\n      this.#position = 0;\n      this.#commands.push(save);\n      return;\n    }\n    if (overwriteIfSameType && this.#commands[this.#position].type === type) {\n      if (keepUndo) {\n        save.undo = this.#commands[this.#position].undo;\n      }\n      this.#commands[this.#position] = save;\n      return;\n    }\n    const next = this.#position + 1;\n    if (next === this.#maxSize) {\n      this.#commands.splice(0, 1);\n    } else {\n      this.#position = next;\n      if (next < this.#commands.length) {\n        this.#commands.splice(next);\n      }\n    }\n    this.#commands.push(save);\n  }\n  undo() {\n    if (this.#position === -1) {\n      return;\n    }\n    this.#locked = true;\n    const {\n      undo,\n      post\n    } = this.#commands[this.#position];\n    undo();\n    post?.();\n    this.#locked = false;\n    this.#position -= 1;\n  }\n  redo() {\n    if (this.#position < this.#commands.length - 1) {\n      this.#position += 1;\n      this.#locked = true;\n      const {\n        cmd,\n        post\n      } = this.#commands[this.#position];\n      cmd();\n      post?.();\n      this.#locked = false;\n    }\n  }\n  hasSomethingToUndo() {\n    return this.#position !== -1;\n  }\n  hasSomethingToRedo() {\n    return this.#position < this.#commands.length - 1;\n  }\n  cleanType(type) {\n    if (this.#position === -1) {\n      return;\n    }\n    for (let i = this.#position; i >= 0; i--) {\n      if (this.#commands[i].type !== type) {\n        this.#commands.splice(i + 1, this.#position - i);\n        this.#position = i;\n        return;\n      }\n    }\n    this.#commands.length = 0;\n    this.#position = -1;\n  }\n  destroy() {\n    this.#commands = null;\n  }\n}\nclass KeyboardManager {\n  constructor(callbacks) {\n    this.buffer = [];\n    this.callbacks = new Map();\n    this.allKeys = new Set();\n    const {\n      isMac\n    } = FeatureTest.platform;\n    for (const [keys, callback, options = {}] of callbacks) {\n      for (const key of keys) {\n        const isMacKey = key.startsWith(\"mac+\");\n        if (isMac && isMacKey) {\n          this.callbacks.set(key.slice(4), {\n            callback,\n            options\n          });\n          this.allKeys.add(key.split(\"+\").at(-1));\n        } else if (!isMac && !isMacKey) {\n          this.callbacks.set(key, {\n            callback,\n            options\n          });\n          this.allKeys.add(key.split(\"+\").at(-1));\n        }\n      }\n    }\n  }\n  #serialize(event) {\n    if (event.altKey) {\n      this.buffer.push(\"alt\");\n    }\n    if (event.ctrlKey) {\n      this.buffer.push(\"ctrl\");\n    }\n    if (event.metaKey) {\n      this.buffer.push(\"meta\");\n    }\n    if (event.shiftKey) {\n      this.buffer.push(\"shift\");\n    }\n    this.buffer.push(event.key);\n    const str = this.buffer.join(\"+\");\n    this.buffer.length = 0;\n    return str;\n  }\n  exec(self, event) {\n    if (!this.allKeys.has(event.key)) {\n      return;\n    }\n    const info = this.callbacks.get(this.#serialize(event));\n    if (!info) {\n      return;\n    }\n    const {\n      callback,\n      options: {\n        bubbles = false,\n        args = [],\n        checker = null\n      }\n    } = info;\n    if (checker && !checker(self, event)) {\n      return;\n    }\n    callback.bind(self, ...args, event)();\n    if (!bubbles) {\n      stopEvent(event);\n    }\n  }\n}\nclass ColorManager {\n  static _colorsMapping = new Map([[\"CanvasText\", [0, 0, 0]], [\"Canvas\", [255, 255, 255]]]);\n  get _colors() {\n    const colors = new Map([[\"CanvasText\", null], [\"Canvas\", null]]);\n    getColorValues(colors);\n    return shadow(this, \"_colors\", colors);\n  }\n  convert(color) {\n    const rgb = getRGB(color);\n    if (!window.matchMedia(\"(forced-colors: active)\").matches) {\n      return rgb;\n    }\n    for (const [name, RGB] of this._colors) {\n      if (RGB.every((x, i) => x === rgb[i])) {\n        return ColorManager._colorsMapping.get(name);\n      }\n    }\n    return rgb;\n  }\n  getHexCode(name) {\n    const rgb = this._colors.get(name);\n    if (!rgb) {\n      return name;\n    }\n    return Util.makeHexColor(...rgb);\n  }\n}\nclass AnnotationEditorUIManager {\n  #abortController = new AbortController();\n  #activeEditor = null;\n  #allEditableAnnotations = null;\n  #allEditors = new Map();\n  #allLayers = new Map();\n  #savedAllLayers = null;\n  #altTextManager = null;\n  #annotationStorage = null;\n  #changedExistingAnnotations = null;\n  #commandManager = new CommandManager();\n  #commentManager = null;\n  #copyPasteAC = null;\n  #currentDrawingSession = null;\n  #currentPageIndex = 0;\n  #deletedAnnotationsElementIds = new Set();\n  #draggingEditors = null;\n  #editorTypes = null;\n  #editorsToRescale = new Set();\n  _editorUndoBar = null;\n  #enableHighlightFloatingButton = false;\n  #enableUpdatedAddImage = false;\n  #enableNewAltTextWhenAddingImage = false;\n  #filterFactory = null;\n  #focusMainContainerTimeoutId = null;\n  #focusManagerAC = null;\n  #highlightColors = null;\n  #highlightWhenShiftUp = false;\n  #floatingToolbar = null;\n  #idManager = new IdManager();\n  #isEnabled = false;\n  #isPointerDown = false;\n  #isWaiting = false;\n  #keyboardManagerAC = null;\n  #lastActiveElement = null;\n  #mainHighlightColorPicker = null;\n  #missingCanvases = null;\n  #mlManager = null;\n  #mode = AnnotationEditorType.NONE;\n  #selectedEditors = new Set();\n  #selectedTextNode = null;\n  #signatureManager = null;\n  #pageColors = null;\n  #showAllStates = null;\n  #pdfDocument = null;\n  #previousStates = {\n    isEditing: false,\n    isEmpty: true,\n    hasSomethingToUndo: false,\n    hasSomethingToRedo: false,\n    hasSelectedEditor: false,\n    hasSelectedText: false\n  };\n  #translation = [0, 0];\n  #translationTimeoutId = null;\n  #container = null;\n  #viewer = null;\n  #viewerAlert = null;\n  #updateModeCapability = null;\n  static TRANSLATE_SMALL = 1;\n  static TRANSLATE_BIG = 10;\n  static get _keyboardManager() {\n    const proto = AnnotationEditorUIManager.prototype;\n    const arrowChecker = self => self.#container.contains(document.activeElement) && document.activeElement.tagName !== \"BUTTON\" && self.hasSomethingToControl();\n    const textInputChecker = (_self, {\n      target: el\n    }) => {\n      if (el instanceof HTMLInputElement) {\n        const {\n          type\n        } = el;\n        return type !== \"text\" && type !== \"number\";\n      }\n      return true;\n    };\n    const small = this.TRANSLATE_SMALL;\n    const big = this.TRANSLATE_BIG;\n    return shadow(this, \"_keyboardManager\", new KeyboardManager([[[\"ctrl+a\", \"mac+meta+a\"], proto.selectAll, {\n      checker: textInputChecker\n    }], [[\"ctrl+z\", \"mac+meta+z\"], proto.undo, {\n      checker: textInputChecker\n    }], [[\"ctrl+y\", \"ctrl+shift+z\", \"mac+meta+shift+z\", \"ctrl+shift+Z\", \"mac+meta+shift+Z\"], proto.redo, {\n      checker: textInputChecker\n    }], [[\"Backspace\", \"alt+Backspace\", \"ctrl+Backspace\", \"shift+Backspace\", \"mac+Backspace\", \"mac+alt+Backspace\", \"mac+ctrl+Backspace\", \"Delete\", \"ctrl+Delete\", \"shift+Delete\", \"mac+Delete\"], proto.delete, {\n      checker: textInputChecker\n    }], [[\"Enter\", \"mac+Enter\"], proto.addNewEditorFromKeyboard, {\n      checker: (self, {\n        target: el\n      }) => !(el instanceof HTMLButtonElement) && self.#container.contains(el) && !self.isEnterHandled\n    }], [[\" \", \"mac+ \"], proto.addNewEditorFromKeyboard, {\n      checker: (self, {\n        target: el\n      }) => !(el instanceof HTMLButtonElement) && self.#container.contains(document.activeElement)\n    }], [[\"Escape\", \"mac+Escape\"], proto.unselectAll], [[\"ArrowLeft\", \"mac+ArrowLeft\"], proto.translateSelectedEditors, {\n      args: [-small, 0],\n      checker: arrowChecker\n    }], [[\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"], proto.translateSelectedEditors, {\n      args: [-big, 0],\n      checker: arrowChecker\n    }], [[\"ArrowRight\", \"mac+ArrowRight\"], proto.translateSelectedEditors, {\n      args: [small, 0],\n      checker: arrowChecker\n    }], [[\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"], proto.translateSelectedEditors, {\n      args: [big, 0],\n      checker: arrowChecker\n    }], [[\"ArrowUp\", \"mac+ArrowUp\"], proto.translateSelectedEditors, {\n      args: [0, -small],\n      checker: arrowChecker\n    }], [[\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"], proto.translateSelectedEditors, {\n      args: [0, -big],\n      checker: arrowChecker\n    }], [[\"ArrowDown\", \"mac+ArrowDown\"], proto.translateSelectedEditors, {\n      args: [0, small],\n      checker: arrowChecker\n    }], [[\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"], proto.translateSelectedEditors, {\n      args: [0, big],\n      checker: arrowChecker\n    }]]));\n  }\n  constructor(container, viewer, viewerAlert, altTextManager, commentManager, signatureManager, eventBus, pdfDocument, pageColors, highlightColors, enableHighlightFloatingButton, enableUpdatedAddImage, enableNewAltTextWhenAddingImage, mlManager, editorUndoBar, supportsPinchToZoom) {\n    const signal = this._signal = this.#abortController.signal;\n    this.#container = container;\n    this.#viewer = viewer;\n    this.#viewerAlert = viewerAlert;\n    this.#altTextManager = altTextManager;\n    this.#commentManager = commentManager;\n    this.#signatureManager = signatureManager;\n    this.#pdfDocument = pdfDocument;\n    this._eventBus = eventBus;\n    eventBus._on(\"editingaction\", this.onEditingAction.bind(this), {\n      signal\n    });\n    eventBus._on(\"pagechanging\", this.onPageChanging.bind(this), {\n      signal\n    });\n    eventBus._on(\"scalechanging\", this.onScaleChanging.bind(this), {\n      signal\n    });\n    eventBus._on(\"rotationchanging\", this.onRotationChanging.bind(this), {\n      signal\n    });\n    eventBus._on(\"setpreference\", this.onSetPreference.bind(this), {\n      signal\n    });\n    eventBus._on(\"switchannotationeditorparams\", evt => this.updateParams(evt.type, evt.value), {\n      signal\n    });\n    window.addEventListener(\"pointerdown\", () => {\n      this.#isPointerDown = true;\n    }, {\n      capture: true,\n      signal\n    });\n    window.addEventListener(\"pointerup\", () => {\n      this.#isPointerDown = false;\n    }, {\n      capture: true,\n      signal\n    });\n    window.addEventListener(\"beforeunload\", this.#beforeUnload.bind(this), {\n      capture: true,\n      signal\n    });\n    this.#addSelectionListener();\n    this.#addDragAndDropListeners();\n    this.#addKeyboardManager();\n    this.#annotationStorage = pdfDocument.annotationStorage;\n    this.#filterFactory = pdfDocument.filterFactory;\n    this.#pageColors = pageColors;\n    this.#highlightColors = highlightColors || null;\n    this.#enableHighlightFloatingButton = enableHighlightFloatingButton;\n    this.#enableUpdatedAddImage = enableUpdatedAddImage;\n    this.#enableNewAltTextWhenAddingImage = enableNewAltTextWhenAddingImage;\n    this.#mlManager = mlManager || null;\n    this.viewParameters = {\n      realScale: PixelsPerInch.PDF_TO_CSS_UNITS,\n      rotation: 0\n    };\n    this.isShiftKeyDown = false;\n    this._editorUndoBar = editorUndoBar || null;\n    this._supportsPinchToZoom = supportsPinchToZoom !== false;\n    commentManager?.setSidebarUiManager(this);\n  }\n  destroy() {\n    this.#updateModeCapability?.resolve();\n    this.#updateModeCapability = null;\n    this.#abortController?.abort();\n    this.#abortController = null;\n    this._signal = null;\n    for (const layer of this.#allLayers.values()) {\n      layer.destroy();\n    }\n    this.#allLayers.clear();\n    this.#allEditors.clear();\n    this.#editorsToRescale.clear();\n    this.#missingCanvases?.clear();\n    this.#activeEditor = null;\n    this.#selectedEditors.clear();\n    this.#commandManager.destroy();\n    this.#altTextManager?.destroy();\n    this.#commentManager?.destroy();\n    this.#signatureManager?.destroy();\n    this.#floatingToolbar?.hide();\n    this.#floatingToolbar = null;\n    this.#mainHighlightColorPicker?.destroy();\n    this.#mainHighlightColorPicker = null;\n    this.#allEditableAnnotations = null;\n    if (this.#focusMainContainerTimeoutId) {\n      clearTimeout(this.#focusMainContainerTimeoutId);\n      this.#focusMainContainerTimeoutId = null;\n    }\n    if (this.#translationTimeoutId) {\n      clearTimeout(this.#translationTimeoutId);\n      this.#translationTimeoutId = null;\n    }\n    this._editorUndoBar?.destroy();\n    this.#pdfDocument = null;\n  }\n  combinedSignal(ac) {\n    return AbortSignal.any([this._signal, ac.signal]);\n  }\n  get mlManager() {\n    return this.#mlManager;\n  }\n  get useNewAltTextFlow() {\n    return this.#enableUpdatedAddImage;\n  }\n  get useNewAltTextWhenAddingImage() {\n    return this.#enableNewAltTextWhenAddingImage;\n  }\n  get hcmFilter() {\n    return shadow(this, \"hcmFilter\", this.#pageColors ? this.#filterFactory.addHCMFilter(this.#pageColors.foreground, this.#pageColors.background) : \"none\");\n  }\n  get direction() {\n    return shadow(this, \"direction\", getComputedStyle(this.#container).direction);\n  }\n  get _highlightColors() {\n    return shadow(this, \"_highlightColors\", this.#highlightColors ? new Map(this.#highlightColors.split(\",\").map(pair => {\n      pair = pair.split(\"=\").map(x => x.trim());\n      pair[1] = pair[1].toUpperCase();\n      return pair;\n    })) : null);\n  }\n  get highlightColors() {\n    const {\n      _highlightColors\n    } = this;\n    if (!_highlightColors) {\n      return shadow(this, \"highlightColors\", null);\n    }\n    const map = new Map();\n    const hasHCM = !!this.#pageColors;\n    for (const [name, color] of _highlightColors) {\n      const isNameForHCM = name.endsWith(\"_HCM\");\n      if (hasHCM && isNameForHCM) {\n        map.set(name.replace(\"_HCM\", \"\"), color);\n        continue;\n      }\n      if (!hasHCM && !isNameForHCM) {\n        map.set(name, color);\n      }\n    }\n    return shadow(this, \"highlightColors\", map);\n  }\n  get highlightColorNames() {\n    return shadow(this, \"highlightColorNames\", this.highlightColors ? new Map(Array.from(this.highlightColors, e => e.reverse())) : null);\n  }\n  getNonHCMColor(color) {\n    if (!this._highlightColors) {\n      return color;\n    }\n    const colorName = this.highlightColorNames.get(color);\n    return this._highlightColors.get(colorName) || color;\n  }\n  getNonHCMColorName(color) {\n    return this.highlightColorNames.get(color) || color;\n  }\n  setCurrentDrawingSession(layer) {\n    if (layer) {\n      this.unselectAll();\n      this.disableUserSelect(true);\n    } else {\n      this.disableUserSelect(false);\n    }\n    this.#currentDrawingSession = layer;\n  }\n  setMainHighlightColorPicker(colorPicker) {\n    this.#mainHighlightColorPicker = colorPicker;\n  }\n  editAltText(editor, firstTime = false) {\n    this.#altTextManager?.editAltText(this, editor, firstTime);\n  }\n  hasCommentManager() {\n    return !!this.#commentManager;\n  }\n  editComment(editor, posX, posY, options) {\n    this.#commentManager?.showDialog(this, editor, posX, posY, options);\n  }\n  selectComment(pageIndex, uid) {\n    const layer = this.#allLayers.get(pageIndex);\n    const editor = layer?.getEditorByUID(uid);\n    editor?.toggleComment(true, true);\n  }\n  updateComment(editor) {\n    this.#commentManager?.updateComment(editor.getData());\n  }\n  updatePopupColor(editor) {\n    this.#commentManager?.updatePopupColor(editor);\n  }\n  removeComment(editor) {\n    this.#commentManager?.removeComments([editor.uid]);\n  }\n  deleteComment(editor, savedData) {\n    const undo = () => {\n      editor.comment = savedData;\n    };\n    const cmd = () => {\n      this._editorUndoBar?.show(undo, \"comment\");\n      this.toggleComment(null);\n      editor.comment = null;\n    };\n    this.addCommands({\n      cmd,\n      undo,\n      mustExec: true\n    });\n  }\n  toggleComment(editor, isSelected, visibility = undefined) {\n    this.#commentManager?.toggleCommentPopup(editor, isSelected, visibility);\n  }\n  makeCommentColor(color, opacity) {\n    return color && this.#commentManager?.makeCommentColor(color, opacity) || null;\n  }\n  getCommentDialogElement() {\n    return this.#commentManager?.dialogElement || null;\n  }\n  async waitForEditorsRendered(pageNumber) {\n    if (this.#allLayers.has(pageNumber - 1)) {\n      return;\n    }\n    const {\n      resolve,\n      promise\n    } = Promise.withResolvers();\n    const onEditorsRendered = evt => {\n      if (evt.pageNumber === pageNumber) {\n        this._eventBus._off(\"editorsrendered\", onEditorsRendered);\n        resolve();\n      }\n    };\n    this._eventBus.on(\"editorsrendered\", onEditorsRendered);\n    await promise;\n  }\n  getSignature(editor) {\n    this.#signatureManager?.getSignature({\n      uiManager: this,\n      editor\n    });\n  }\n  get signatureManager() {\n    return this.#signatureManager;\n  }\n  switchToMode(mode, callback) {\n    this._eventBus.on(\"annotationeditormodechanged\", callback, {\n      once: true,\n      signal: this._signal\n    });\n    this._eventBus.dispatch(\"showannotationeditorui\", {\n      source: this,\n      mode\n    });\n  }\n  setPreference(name, value) {\n    this._eventBus.dispatch(\"setpreference\", {\n      source: this,\n      name,\n      value\n    });\n  }\n  onSetPreference({\n    name,\n    value\n  }) {\n    switch (name) {\n      case \"enableNewAltTextWhenAddingImage\":\n        this.#enableNewAltTextWhenAddingImage = value;\n        break;\n    }\n  }\n  onPageChanging({\n    pageNumber\n  }) {\n    this.#currentPageIndex = pageNumber - 1;\n  }\n  deletePage(id) {\n    for (const editor of this.getEditors(id)) {\n      editor.remove();\n    }\n    this.#allLayers.delete(id);\n    if (this.#currentPageIndex === id) {\n      this.#currentPageIndex = 0;\n    }\n  }\n  focusMainContainer() {\n    this.#container.focus();\n  }\n  findParent(x, y) {\n    for (const layer of this.#allLayers.values()) {\n      const {\n        x: layerX,\n        y: layerY,\n        width,\n        height\n      } = layer.div.getBoundingClientRect();\n      if (x >= layerX && x <= layerX + width && y >= layerY && y <= layerY + height) {\n        return layer;\n      }\n    }\n    return null;\n  }\n  disableUserSelect(value = false) {\n    this.#viewer.classList.toggle(\"noUserSelect\", value);\n  }\n  addShouldRescale(editor) {\n    this.#editorsToRescale.add(editor);\n  }\n  removeShouldRescale(editor) {\n    this.#editorsToRescale.delete(editor);\n  }\n  onScaleChanging({\n    scale\n  }) {\n    this.commitOrRemove();\n    this.viewParameters.realScale = scale * PixelsPerInch.PDF_TO_CSS_UNITS;\n    for (const editor of this.#editorsToRescale) {\n      editor.onScaleChanging();\n    }\n    this.#currentDrawingSession?.onScaleChanging();\n  }\n  onRotationChanging({\n    pagesRotation\n  }) {\n    this.commitOrRemove();\n    this.viewParameters.rotation = pagesRotation;\n  }\n  #getAnchorElementForSelection({\n    anchorNode\n  }) {\n    return anchorNode.nodeType === Node.TEXT_NODE ? anchorNode.parentElement : anchorNode;\n  }\n  #getLayerForTextLayer(textLayer) {\n    const {\n      currentLayer\n    } = this;\n    if (currentLayer.hasTextLayer(textLayer)) {\n      return currentLayer;\n    }\n    for (const layer of this.#allLayers.values()) {\n      if (layer.hasTextLayer(textLayer)) {\n        return layer;\n      }\n    }\n    return null;\n  }\n  highlightSelection(methodOfCreation = \"\", comment = false) {\n    const selection = document.getSelection();\n    if (!selection || selection.isCollapsed) {\n      return;\n    }\n    const {\n      anchorNode,\n      anchorOffset,\n      focusNode,\n      focusOffset\n    } = selection;\n    const text = selection.toString();\n    const anchorElement = this.#getAnchorElementForSelection(selection);\n    const textLayer = anchorElement.closest(\".textLayer\");\n    const boxes = this.getSelectionBoxes(textLayer);\n    if (!boxes) {\n      return;\n    }\n    selection.empty();\n    const layer = this.#getLayerForTextLayer(textLayer);\n    const isNoneMode = this.#mode === AnnotationEditorType.NONE;\n    const callback = () => {\n      const editor = layer?.createAndAddNewEditor({\n        x: 0,\n        y: 0\n      }, false, {\n        methodOfCreation,\n        boxes,\n        anchorNode,\n        anchorOffset,\n        focusNode,\n        focusOffset,\n        text\n      });\n      if (isNoneMode) {\n        this.showAllEditors(\"highlight\", true, true);\n      }\n      if (comment) {\n        editor?.editComment();\n      }\n    };\n    if (isNoneMode) {\n      this.switchToMode(AnnotationEditorType.HIGHLIGHT, callback);\n      return;\n    }\n    callback();\n  }\n  commentSelection(methodOfCreation = \"\") {\n    this.highlightSelection(methodOfCreation, true);\n  }\n  #beforeUnload(e) {\n    this.commitOrRemove();\n    this.currentLayer?.endDrawingSession(false);\n  }\n  #displayFloatingToolbar() {\n    const selection = document.getSelection();\n    if (!selection || selection.isCollapsed) {\n      return;\n    }\n    const anchorElement = this.#getAnchorElementForSelection(selection);\n    const textLayer = anchorElement.closest(\".textLayer\");\n    const boxes = this.getSelectionBoxes(textLayer);\n    if (!boxes) {\n      return;\n    }\n    this.#floatingToolbar ||= new FloatingToolbar(this);\n    this.#floatingToolbar.show(textLayer, boxes, this.direction === \"ltr\");\n  }\n  getAndRemoveDataFromAnnotationStorage(annotationId) {\n    if (!this.#annotationStorage) {\n      return null;\n    }\n    const key = `${AnnotationEditorPrefix}${annotationId}`;\n    const storedValue = this.#annotationStorage.getRawValue(key);\n    if (storedValue) {\n      this.#annotationStorage.remove(key);\n    }\n    return storedValue;\n  }\n  addToAnnotationStorage(editor) {\n    if (!editor.isEmpty() && this.#annotationStorage && !this.#annotationStorage.has(editor.id)) {\n      this.#annotationStorage.setValue(editor.id, editor);\n    }\n  }\n  a11yAlert(messageId, args = null) {\n    const viewerAlert = this.#viewerAlert;\n    if (!viewerAlert) {\n      return;\n    }\n    viewerAlert.setAttribute(\"data-l10n-id\", messageId);\n    if (args) {\n      viewerAlert.setAttribute(\"data-l10n-args\", JSON.stringify(args));\n    } else {\n      viewerAlert.removeAttribute(\"data-l10n-args\");\n    }\n  }\n  #selectionChange() {\n    const selection = document.getSelection();\n    if (!selection || selection.isCollapsed) {\n      if (this.#selectedTextNode) {\n        this.#floatingToolbar?.hide();\n        this.#selectedTextNode = null;\n        this.#dispatchUpdateStates({\n          hasSelectedText: false\n        });\n      }\n      return;\n    }\n    const {\n      anchorNode\n    } = selection;\n    if (anchorNode === this.#selectedTextNode) {\n      return;\n    }\n    const anchorElement = this.#getAnchorElementForSelection(selection);\n    const textLayer = anchorElement.closest(\".textLayer\");\n    if (!textLayer) {\n      if (this.#selectedTextNode) {\n        this.#floatingToolbar?.hide();\n        this.#selectedTextNode = null;\n        this.#dispatchUpdateStates({\n          hasSelectedText: false\n        });\n      }\n      return;\n    }\n    this.#floatingToolbar?.hide();\n    this.#selectedTextNode = anchorNode;\n    this.#dispatchUpdateStates({\n      hasSelectedText: true\n    });\n    if (this.#mode !== AnnotationEditorType.HIGHLIGHT && this.#mode !== AnnotationEditorType.NONE) {\n      return;\n    }\n    if (this.#mode === AnnotationEditorType.HIGHLIGHT) {\n      this.showAllEditors(\"highlight\", true, true);\n    }\n    this.#highlightWhenShiftUp = this.isShiftKeyDown;\n    if (!this.isShiftKeyDown) {\n      const activeLayer = this.#mode === AnnotationEditorType.HIGHLIGHT ? this.#getLayerForTextLayer(textLayer) : null;\n      activeLayer?.toggleDrawing();\n      if (this.#isPointerDown) {\n        const ac = new AbortController();\n        const signal = this.combinedSignal(ac);\n        const pointerup = e => {\n          if (e.type === \"pointerup\" && e.button !== 0) {\n            return;\n          }\n          ac.abort();\n          activeLayer?.toggleDrawing(true);\n          if (e.type === \"pointerup\") {\n            this.#onSelectEnd(\"main_toolbar\");\n          }\n        };\n        window.addEventListener(\"pointerup\", pointerup, {\n          signal\n        });\n        window.addEventListener(\"blur\", pointerup, {\n          signal\n        });\n      } else {\n        activeLayer?.toggleDrawing(true);\n        this.#onSelectEnd(\"main_toolbar\");\n      }\n    }\n  }\n  #onSelectEnd(methodOfCreation = \"\") {\n    if (this.#mode === AnnotationEditorType.HIGHLIGHT) {\n      this.highlightSelection(methodOfCreation);\n    } else if (this.#enableHighlightFloatingButton) {\n      this.#displayFloatingToolbar();\n    }\n  }\n  #addSelectionListener() {\n    document.addEventListener(\"selectionchange\", this.#selectionChange.bind(this), {\n      signal: this._signal\n    });\n  }\n  #addFocusManager() {\n    if (this.#focusManagerAC) {\n      return;\n    }\n    this.#focusManagerAC = new AbortController();\n    const signal = this.combinedSignal(this.#focusManagerAC);\n    window.addEventListener(\"focus\", this.focus.bind(this), {\n      signal\n    });\n    window.addEventListener(\"blur\", this.blur.bind(this), {\n      signal\n    });\n  }\n  #removeFocusManager() {\n    this.#focusManagerAC?.abort();\n    this.#focusManagerAC = null;\n  }\n  blur() {\n    this.isShiftKeyDown = false;\n    if (this.#highlightWhenShiftUp) {\n      this.#highlightWhenShiftUp = false;\n      this.#onSelectEnd(\"main_toolbar\");\n    }\n    if (!this.hasSelection) {\n      return;\n    }\n    const {\n      activeElement\n    } = document;\n    for (const editor of this.#selectedEditors) {\n      if (editor.div.contains(activeElement)) {\n        this.#lastActiveElement = [editor, activeElement];\n        editor._focusEventsAllowed = false;\n        break;\n      }\n    }\n  }\n  focus() {\n    if (!this.#lastActiveElement) {\n      return;\n    }\n    const [lastEditor, lastActiveElement] = this.#lastActiveElement;\n    this.#lastActiveElement = null;\n    lastActiveElement.addEventListener(\"focusin\", () => {\n      lastEditor._focusEventsAllowed = true;\n    }, {\n      once: true,\n      signal: this._signal\n    });\n    lastActiveElement.focus();\n  }\n  #addKeyboardManager() {\n    if (this.#keyboardManagerAC) {\n      return;\n    }\n    this.#keyboardManagerAC = new AbortController();\n    const signal = this.combinedSignal(this.#keyboardManagerAC);\n    window.addEventListener(\"keydown\", this.keydown.bind(this), {\n      signal\n    });\n    window.addEventListener(\"keyup\", this.keyup.bind(this), {\n      signal\n    });\n  }\n  #removeKeyboardManager() {\n    this.#keyboardManagerAC?.abort();\n    this.#keyboardManagerAC = null;\n  }\n  #addCopyPasteListeners() {\n    if (this.#copyPasteAC) {\n      return;\n    }\n    this.#copyPasteAC = new AbortController();\n    const signal = this.combinedSignal(this.#copyPasteAC);\n    document.addEventListener(\"copy\", this.copy.bind(this), {\n      signal\n    });\n    document.addEventListener(\"cut\", this.cut.bind(this), {\n      signal\n    });\n    document.addEventListener(\"paste\", this.paste.bind(this), {\n      signal\n    });\n  }\n  #removeCopyPasteListeners() {\n    this.#copyPasteAC?.abort();\n    this.#copyPasteAC = null;\n  }\n  #addDragAndDropListeners() {\n    const signal = this._signal;\n    document.addEventListener(\"dragover\", this.dragOver.bind(this), {\n      signal\n    });\n    document.addEventListener(\"drop\", this.drop.bind(this), {\n      signal\n    });\n  }\n  addEditListeners() {\n    this.#addKeyboardManager();\n    this.setEditingState(true);\n  }\n  removeEditListeners() {\n    this.#removeKeyboardManager();\n    this.setEditingState(false);\n  }\n  dragOver(event) {\n    for (const {\n      type\n    } of event.dataTransfer.items) {\n      for (const editorType of this.#editorTypes) {\n        if (editorType.isHandlingMimeForPasting(type)) {\n          event.dataTransfer.dropEffect = \"copy\";\n          event.preventDefault();\n          return;\n        }\n      }\n    }\n  }\n  drop(event) {\n    for (const item of event.dataTransfer.items) {\n      for (const editorType of this.#editorTypes) {\n        if (editorType.isHandlingMimeForPasting(item.type)) {\n          editorType.paste(item, this.currentLayer);\n          event.preventDefault();\n          return;\n        }\n      }\n    }\n  }\n  copy(event) {\n    event.preventDefault();\n    this.#activeEditor?.commitOrRemove();\n    if (!this.hasSelection) {\n      return;\n    }\n    const editors = [];\n    for (const editor of this.#selectedEditors) {\n      const serialized = editor.serialize(true);\n      if (serialized) {\n        editors.push(serialized);\n      }\n    }\n    if (editors.length === 0) {\n      return;\n    }\n    event.clipboardData.setData(\"application/pdfjs\", JSON.stringify(editors));\n  }\n  cut(event) {\n    this.copy(event);\n    this.delete();\n  }\n  async paste(event) {\n    event.preventDefault();\n    const {\n      clipboardData\n    } = event;\n    for (const item of clipboardData.items) {\n      for (const editorType of this.#editorTypes) {\n        if (editorType.isHandlingMimeForPasting(item.type)) {\n          editorType.paste(item, this.currentLayer);\n          return;\n        }\n      }\n    }\n    let data = clipboardData.getData(\"application/pdfjs\");\n    if (!data) {\n      return;\n    }\n    try {\n      data = JSON.parse(data);\n    } catch (ex) {\n      warn(`paste: \"${ex.message}\".`);\n      return;\n    }\n    if (!Array.isArray(data)) {\n      return;\n    }\n    this.unselectAll();\n    const layer = this.currentLayer;\n    try {\n      const newEditors = [];\n      for (const editor of data) {\n        const deserializedEditor = await layer.deserialize(editor);\n        if (!deserializedEditor) {\n          return;\n        }\n        newEditors.push(deserializedEditor);\n      }\n      const cmd = () => {\n        for (const editor of newEditors) {\n          this.#addEditorToLayer(editor);\n        }\n        this.#selectEditors(newEditors);\n      };\n      const undo = () => {\n        for (const editor of newEditors) {\n          editor.remove();\n        }\n      };\n      this.addCommands({\n        cmd,\n        undo,\n        mustExec: true\n      });\n    } catch (ex) {\n      warn(`paste: \"${ex.message}\".`);\n    }\n  }\n  keydown(event) {\n    if (!this.isShiftKeyDown && event.key === \"Shift\") {\n      this.isShiftKeyDown = true;\n    }\n    if (this.#mode !== AnnotationEditorType.NONE && !this.isEditorHandlingKeyboard) {\n      AnnotationEditorUIManager._keyboardManager.exec(this, event);\n    }\n  }\n  keyup(event) {\n    if (this.isShiftKeyDown && event.key === \"Shift\") {\n      this.isShiftKeyDown = false;\n      if (this.#highlightWhenShiftUp) {\n        this.#highlightWhenShiftUp = false;\n        this.#onSelectEnd(\"main_toolbar\");\n      }\n    }\n  }\n  onEditingAction({\n    name\n  }) {\n    switch (name) {\n      case \"undo\":\n      case \"redo\":\n      case \"delete\":\n      case \"selectAll\":\n        this[name]();\n        break;\n      case \"highlightSelection\":\n        this.highlightSelection(\"context_menu\");\n        break;\n      case \"commentSelection\":\n        this.commentSelection(\"context_menu\");\n        break;\n    }\n  }\n  updatePageIndex(oldPageIndex, newPageIndex) {\n    for (const editor of this.getEditors(oldPageIndex)) {\n      editor.pageIndex = newPageIndex;\n    }\n    const layer = this.#savedAllLayers.get(oldPageIndex);\n    if (layer) {\n      layer.pageIndex = newPageIndex;\n      this.#allLayers.set(newPageIndex, layer);\n      if (this.#isEnabled) {\n        layer.enable();\n      } else {\n        layer.disable();\n      }\n    }\n  }\n  startUpdatePages() {\n    this.#savedAllLayers = new Map(this.#allLayers);\n    this.#allLayers.clear();\n  }\n  endUpdatePages() {\n    this.#savedAllLayers = null;\n  }\n  clonePage(pageIndex, newPageIndex) {\n    for (const editor of this.getEditors(pageIndex)) {\n      const serialized = editor.serialize(editor.mode !== AnnotationEditorType.HIGHLIGHT);\n      if (!serialized) {\n        continue;\n      }\n      serialized.pageIndex = newPageIndex;\n      serialized.id = this.getId();\n      serialized.isClone = true;\n      delete serialized.popupRef;\n      this.#annotationStorage.setValue(serialized.id, serialized);\n    }\n  }\n  findClonesForPage(layer) {\n    const promises = [];\n    const {\n      pageIndex\n    } = layer;\n    for (const [id, editor] of this.#annotationStorage) {\n      if (editor.pageIndex === pageIndex && editor.isClone) {\n        this.#annotationStorage.remove(id);\n        promises.push(layer.deserialize(editor).then(deserializedEditor => {\n          if (deserializedEditor) {\n            deserializedEditor.isClone = true;\n            layer.addOrRebuild(deserializedEditor);\n          }\n        }));\n      }\n    }\n    return Promise.all(promises);\n  }\n  #dispatchUpdateStates(details) {\n    const hasChanged = Object.entries(details).some(([key, value]) => this.#previousStates[key] !== value);\n    if (hasChanged) {\n      this._eventBus.dispatch(\"editingstateschanged\", {\n        source: this,\n        details: Object.assign(this.#previousStates, details)\n      });\n      if (this.#mode === AnnotationEditorType.HIGHLIGHT && details.hasSelectedEditor === false) {\n        this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_FREE, true]]);\n      }\n    }\n  }\n  #dispatchUpdateUI(details) {\n    this._eventBus.dispatch(\"annotationeditorparamschanged\", {\n      source: this,\n      details\n    });\n  }\n  setEditingState(isEditing) {\n    if (isEditing) {\n      this.#addFocusManager();\n      this.#addCopyPasteListeners();\n      this.#dispatchUpdateStates({\n        isEditing: this.#mode !== AnnotationEditorType.NONE,\n        isEmpty: this.#isEmpty(),\n        hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),\n        hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),\n        hasSelectedEditor: false\n      });\n    } else {\n      this.#removeFocusManager();\n      this.#removeCopyPasteListeners();\n      this.#dispatchUpdateStates({\n        isEditing: false\n      });\n      this.disableUserSelect(false);\n    }\n  }\n  registerEditorTypes(types) {\n    if (this.#editorTypes) {\n      return;\n    }\n    this.#editorTypes = types;\n    for (const editorType of this.#editorTypes) {\n      this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate);\n    }\n  }\n  getId() {\n    return this.#idManager.id;\n  }\n  get currentLayer() {\n    return this.#allLayers.get(this.#currentPageIndex);\n  }\n  getLayer(pageIndex) {\n    return this.#allLayers.get(pageIndex);\n  }\n  get currentPageIndex() {\n    return this.#currentPageIndex;\n  }\n  addLayer(layer) {\n    this.#allLayers.set(layer.pageIndex, layer);\n    if (this.#isEnabled) {\n      layer.enable();\n    } else {\n      layer.disable();\n    }\n  }\n  removeLayer(layer) {\n    this.#allLayers.delete(layer.pageIndex);\n  }\n  async updateMode(mode, editId = null, isFromUser = false, isFromKeyboard = false, mustEnterInEditMode = false, editComment = false) {\n    if (this.#mode === mode) {\n      return;\n    }\n    if (this.#updateModeCapability) {\n      await this.#updateModeCapability.promise;\n      if (!this.#updateModeCapability) {\n        return;\n      }\n    }\n    this.#updateModeCapability = Promise.withResolvers();\n    this.#currentDrawingSession?.commitOrRemove();\n    if (this.#mode === AnnotationEditorType.POPUP) {\n      this.#commentManager?.hideSidebar();\n    }\n    this.#commentManager?.destroyPopup();\n    this.#mode = mode;\n    if (mode === AnnotationEditorType.NONE) {\n      this.setEditingState(false);\n      this.#disableAll();\n      for (const editor of this.#allEditors.values()) {\n        editor.hideStandaloneCommentButton();\n      }\n      this._editorUndoBar?.hide();\n      this.toggleComment(null);\n      this.#updateModeCapability.resolve();\n      return;\n    }\n    for (const editor of this.#allEditors.values()) {\n      editor.addStandaloneCommentButton();\n    }\n    if (mode === AnnotationEditorType.SIGNATURE) {\n      await this.#signatureManager?.loadSignatures();\n    }\n    if (isFromUser) {\n      CurrentPointers.clearPointerType();\n    }\n    this.setEditingState(true);\n    await this.#enableAll();\n    this.unselectAll();\n    for (const layer of this.#allLayers.values()) {\n      layer.updateMode(mode);\n    }\n    if (mode === AnnotationEditorType.POPUP) {\n      this.#allEditableAnnotations ||= await this.#pdfDocument.getAnnotationsByType(new Set(this.#editorTypes.map(editorClass => editorClass._editorType)));\n      const elementIds = new Set();\n      const allComments = [];\n      for (const editor of this.#allEditors.values()) {\n        const {\n          annotationElementId,\n          hasComment,\n          deleted\n        } = editor;\n        if (annotationElementId) {\n          elementIds.add(annotationElementId);\n        }\n        if (hasComment && !deleted) {\n          allComments.push(editor.getData());\n        }\n      }\n      for (const annotation of this.#allEditableAnnotations) {\n        const {\n          id,\n          popupRef,\n          contentsObj\n        } = annotation;\n        if (popupRef && contentsObj?.str && !elementIds.has(id) && !this.#deletedAnnotationsElementIds.has(id)) {\n          allComments.push(annotation);\n        }\n      }\n      this.#commentManager?.showSidebar(allComments);\n    }\n    if (!editId) {\n      if (isFromKeyboard) {\n        this.addNewEditorFromKeyboard();\n      }\n      this.#updateModeCapability.resolve();\n      return;\n    }\n    for (const editor of this.#allEditors.values()) {\n      if (editor.uid === editId) {\n        this.setSelected(editor);\n        if (editComment) {\n          editor.editComment();\n        } else if (mustEnterInEditMode) {\n          editor.enterInEditMode();\n        } else {\n          editor.focus();\n        }\n      } else {\n        editor.unselect();\n      }\n    }\n    this.#updateModeCapability.resolve();\n  }\n  addNewEditorFromKeyboard() {\n    if (this.currentLayer.canCreateNewEmptyEditor()) {\n      this.currentLayer.addNewEditor();\n    }\n  }\n  updateToolbar(options) {\n    if (options.mode === this.#mode) {\n      return;\n    }\n    this._eventBus.dispatch(\"switchannotationeditormode\", {\n      source: this,\n      ...options\n    });\n  }\n  updateParams(type, value) {\n    if (!this.#editorTypes) {\n      return;\n    }\n    switch (type) {\n      case AnnotationEditorParamsType.CREATE:\n        this.currentLayer.addNewEditor(value);\n        return;\n      case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL:\n        this._eventBus.dispatch(\"reporttelemetry\", {\n          source: this,\n          details: {\n            type: \"editing\",\n            data: {\n              type: \"highlight\",\n              action: \"toggle_visibility\"\n            }\n          }\n        });\n        (this.#showAllStates ||= new Map()).set(type, value);\n        this.showAllEditors(\"highlight\", value);\n        break;\n    }\n    if (this.hasSelection) {\n      for (const editor of this.#selectedEditors) {\n        editor.updateParams(type, value);\n      }\n    } else {\n      for (const editorType of this.#editorTypes) {\n        editorType.updateDefaultParams(type, value);\n      }\n    }\n  }\n  showAllEditors(type, visible, updateButton = false) {\n    for (const editor of this.#allEditors.values()) {\n      if (editor.editorType === type) {\n        editor.show(visible);\n      }\n    }\n    const state = this.#showAllStates?.get(AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL) ?? true;\n    if (state !== visible) {\n      this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible]]);\n    }\n  }\n  enableWaiting(mustWait = false) {\n    if (this.#isWaiting === mustWait) {\n      return;\n    }\n    this.#isWaiting = mustWait;\n    for (const layer of this.#allLayers.values()) {\n      if (mustWait) {\n        layer.disableClick();\n      } else {\n        layer.enableClick();\n      }\n      layer.div.classList.toggle(\"waiting\", mustWait);\n    }\n  }\n  async #enableAll() {\n    if (!this.#isEnabled) {\n      this.#isEnabled = true;\n      const promises = [];\n      for (const layer of this.#allLayers.values()) {\n        promises.push(layer.enable());\n      }\n      await Promise.all(promises);\n      for (const editor of this.#allEditors.values()) {\n        editor.enable();\n      }\n    }\n  }\n  #disableAll() {\n    this.unselectAll();\n    if (this.#isEnabled) {\n      this.#isEnabled = false;\n      for (const layer of this.#allLayers.values()) {\n        layer.disable();\n      }\n      for (const editor of this.#allEditors.values()) {\n        editor.disable();\n      }\n    }\n  }\n  *getEditors(pageIndex) {\n    for (const editor of this.#allEditors.values()) {\n      if (editor.pageIndex === pageIndex) {\n        yield editor;\n      }\n    }\n  }\n  getEditor(id) {\n    return this.#allEditors.get(id);\n  }\n  addEditor(editor) {\n    this.#allEditors.set(editor.id, editor);\n  }\n  removeEditor(editor) {\n    if (editor.div.contains(document.activeElement)) {\n      if (this.#focusMainContainerTimeoutId) {\n        clearTimeout(this.#focusMainContainerTimeoutId);\n      }\n      this.#focusMainContainerTimeoutId = setTimeout(() => {\n        this.focusMainContainer();\n        this.#focusMainContainerTimeoutId = null;\n      }, 0);\n    }\n    this.#allEditors.delete(editor.id);\n    if (editor.annotationElementId) {\n      this.#missingCanvases?.delete(editor.annotationElementId);\n    }\n    this.unselect(editor);\n    if (!editor.annotationElementId || !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)) {\n      this.#annotationStorage?.remove(editor.id);\n    }\n  }\n  addDeletedAnnotationElement(editor) {\n    this.#deletedAnnotationsElementIds.add(editor.annotationElementId);\n    this.addChangedExistingAnnotation(editor);\n    editor.deleted = true;\n  }\n  isDeletedAnnotationElement(annotationElementId) {\n    return this.#deletedAnnotationsElementIds.has(annotationElementId);\n  }\n  removeDeletedAnnotationElement(editor) {\n    this.#deletedAnnotationsElementIds.delete(editor.annotationElementId);\n    this.removeChangedExistingAnnotation(editor);\n    editor.deleted = false;\n  }\n  #addEditorToLayer(editor) {\n    const layer = this.#allLayers.get(editor.pageIndex);\n    if (layer) {\n      layer.addOrRebuild(editor);\n    } else {\n      this.addEditor(editor);\n      this.addToAnnotationStorage(editor);\n    }\n  }\n  setActiveEditor(editor) {\n    if (this.#activeEditor === editor) {\n      return;\n    }\n    this.#activeEditor = editor;\n    if (editor) {\n      this.#dispatchUpdateUI(editor.propertiesToUpdate);\n    }\n  }\n  get #lastSelectedEditor() {\n    let ed = null;\n    for (ed of this.#selectedEditors) {}\n    return ed;\n  }\n  updateUI(editor) {\n    if (this.#lastSelectedEditor === editor) {\n      this.#dispatchUpdateUI(editor.propertiesToUpdate);\n    }\n  }\n  updateUIForDefaultProperties(editorType) {\n    this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate);\n  }\n  toggleSelected(editor) {\n    if (this.#selectedEditors.has(editor)) {\n      this.#selectedEditors.delete(editor);\n      editor.unselect();\n      this.#dispatchUpdateStates({\n        hasSelectedEditor: this.hasSelection\n      });\n      return;\n    }\n    this.#selectedEditors.add(editor);\n    editor.select();\n    this.#dispatchUpdateUI(editor.propertiesToUpdate);\n    this.#dispatchUpdateStates({\n      hasSelectedEditor: true\n    });\n  }\n  setSelected(editor) {\n    this.updateToolbar({\n      mode: editor.mode,\n      editId: editor.uid\n    });\n    this.#currentDrawingSession?.commitOrRemove();\n    for (const ed of this.#selectedEditors) {\n      if (ed !== editor) {\n        ed.unselect();\n      }\n    }\n    this.#commentManager?.destroyPopup();\n    this.#selectedEditors.clear();\n    this.#selectedEditors.add(editor);\n    editor.select();\n    this.#dispatchUpdateUI(editor.propertiesToUpdate);\n    this.#dispatchUpdateStates({\n      hasSelectedEditor: true\n    });\n  }\n  isSelected(editor) {\n    return this.#selectedEditors.has(editor);\n  }\n  get firstSelectedEditor() {\n    return this.#selectedEditors.values().next().value;\n  }\n  unselect(editor) {\n    editor.unselect();\n    this.#selectedEditors.delete(editor);\n    this.#dispatchUpdateStates({\n      hasSelectedEditor: this.hasSelection\n    });\n  }\n  get hasSelection() {\n    return this.#selectedEditors.size !== 0;\n  }\n  get isEnterHandled() {\n    return this.#selectedEditors.size === 1 && this.firstSelectedEditor.isEnterHandled;\n  }\n  undo() {\n    this.#commandManager.undo();\n    this.#dispatchUpdateStates({\n      hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),\n      hasSomethingToRedo: true,\n      isEmpty: this.#isEmpty()\n    });\n    this._editorUndoBar?.hide();\n  }\n  redo() {\n    this.#commandManager.redo();\n    this.#dispatchUpdateStates({\n      hasSomethingToUndo: true,\n      hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),\n      isEmpty: this.#isEmpty()\n    });\n  }\n  addCommands(params) {\n    this.#commandManager.add(params);\n    this.#dispatchUpdateStates({\n      hasSomethingToUndo: true,\n      hasSomethingToRedo: false,\n      isEmpty: this.#isEmpty()\n    });\n  }\n  cleanUndoStack(type) {\n    this.#commandManager.cleanType(type);\n  }\n  #isEmpty() {\n    if (this.#allEditors.size === 0) {\n      return true;\n    }\n    if (this.#allEditors.size === 1) {\n      for (const editor of this.#allEditors.values()) {\n        return editor.isEmpty();\n      }\n    }\n    return false;\n  }\n  delete() {\n    this.commitOrRemove();\n    const drawingEditor = this.currentLayer?.endDrawingSession(true);\n    if (!this.hasSelection && !drawingEditor) {\n      return;\n    }\n    const editors = drawingEditor ? [drawingEditor] : [...this.#selectedEditors];\n    const cmd = () => {\n      this._editorUndoBar?.show(undo, editors.length === 1 ? editors[0].editorType : editors.length);\n      for (const editor of editors) {\n        editor.remove();\n      }\n    };\n    const undo = () => {\n      for (const editor of editors) {\n        this.#addEditorToLayer(editor);\n      }\n    };\n    this.addCommands({\n      cmd,\n      undo,\n      mustExec: true\n    });\n  }\n  commitOrRemove() {\n    this.#activeEditor?.commitOrRemove();\n  }\n  hasSomethingToControl() {\n    return this.#activeEditor || this.hasSelection;\n  }\n  #selectEditors(editors) {\n    for (const editor of this.#selectedEditors) {\n      editor.unselect();\n    }\n    this.#selectedEditors.clear();\n    for (const editor of editors) {\n      if (editor.isEmpty()) {\n        continue;\n      }\n      this.#selectedEditors.add(editor);\n      editor.select();\n    }\n    this.#dispatchUpdateStates({\n      hasSelectedEditor: this.hasSelection\n    });\n  }\n  selectAll() {\n    for (const editor of this.#selectedEditors) {\n      editor.commit();\n    }\n    this.#selectEditors(this.#allEditors.values());\n  }\n  unselectAll() {\n    if (this.#activeEditor) {\n      this.#activeEditor.commitOrRemove();\n      if (this.#mode !== AnnotationEditorType.NONE) {\n        return;\n      }\n    }\n    if (this.#currentDrawingSession?.commitOrRemove()) {\n      return;\n    }\n    this.#commentManager?.destroyPopup();\n    if (!this.hasSelection) {\n      return;\n    }\n    for (const editor of this.#selectedEditors) {\n      editor.unselect();\n    }\n    this.#selectedEditors.clear();\n    this.#dispatchUpdateStates({\n      hasSelectedEditor: false\n    });\n  }\n  translateSelectedEditors(x, y, noCommit = false) {\n    if (!noCommit) {\n      this.commitOrRemove();\n    }\n    if (!this.hasSelection) {\n      return;\n    }\n    this.#translation[0] += x;\n    this.#translation[1] += y;\n    const [totalX, totalY] = this.#translation;\n    const editors = [...this.#selectedEditors];\n    const TIME_TO_WAIT = 1000;\n    if (this.#translationTimeoutId) {\n      clearTimeout(this.#translationTimeoutId);\n    }\n    this.#translationTimeoutId = setTimeout(() => {\n      this.#translationTimeoutId = null;\n      this.#translation[0] = this.#translation[1] = 0;\n      this.addCommands({\n        cmd: () => {\n          for (const editor of editors) {\n            if (this.#allEditors.has(editor.id)) {\n              editor.translateInPage(totalX, totalY);\n              editor.translationDone();\n            }\n          }\n        },\n        undo: () => {\n          for (const editor of editors) {\n            if (this.#allEditors.has(editor.id)) {\n              editor.translateInPage(-totalX, -totalY);\n              editor.translationDone();\n            }\n          }\n        },\n        mustExec: false\n      });\n    }, TIME_TO_WAIT);\n    for (const editor of editors) {\n      editor.translateInPage(x, y);\n      editor.translationDone();\n    }\n  }\n  setUpDragSession() {\n    if (!this.hasSelection) {\n      return;\n    }\n    this.disableUserSelect(true);\n    this.#draggingEditors = new Map();\n    for (const editor of this.#selectedEditors) {\n      this.#draggingEditors.set(editor, {\n        savedX: editor.x,\n        savedY: editor.y,\n        savedPageIndex: editor.pageIndex,\n        newX: 0,\n        newY: 0,\n        newPageIndex: -1\n      });\n    }\n  }\n  endDragSession() {\n    if (!this.#draggingEditors) {\n      return false;\n    }\n    this.disableUserSelect(false);\n    const map = this.#draggingEditors;\n    this.#draggingEditors = null;\n    let mustBeAddedInUndoStack = false;\n    for (const [{\n      x,\n      y,\n      pageIndex\n    }, value] of map) {\n      value.newX = x;\n      value.newY = y;\n      value.newPageIndex = pageIndex;\n      mustBeAddedInUndoStack ||= x !== value.savedX || y !== value.savedY || pageIndex !== value.savedPageIndex;\n    }\n    if (!mustBeAddedInUndoStack) {\n      return false;\n    }\n    const move = (editor, x, y, pageIndex) => {\n      if (this.#allEditors.has(editor.id)) {\n        const parent = this.#allLayers.get(pageIndex);\n        if (parent) {\n          editor._setParentAndPosition(parent, x, y);\n        } else {\n          editor.pageIndex = pageIndex;\n          editor.x = x;\n          editor.y = y;\n        }\n      }\n    };\n    this.addCommands({\n      cmd: () => {\n        for (const [editor, {\n          newX,\n          newY,\n          newPageIndex\n        }] of map) {\n          move(editor, newX, newY, newPageIndex);\n        }\n      },\n      undo: () => {\n        for (const [editor, {\n          savedX,\n          savedY,\n          savedPageIndex\n        }] of map) {\n          move(editor, savedX, savedY, savedPageIndex);\n        }\n      },\n      mustExec: true\n    });\n    return true;\n  }\n  dragSelectedEditors(tx, ty) {\n    if (!this.#draggingEditors) {\n      return;\n    }\n    for (const editor of this.#draggingEditors.keys()) {\n      editor.drag(tx, ty);\n    }\n  }\n  rebuild(editor) {\n    if (editor.parent === null) {\n      const parent = this.getLayer(editor.pageIndex);\n      if (parent) {\n        parent.changeParent(editor);\n        parent.addOrRebuild(editor);\n      } else {\n        this.addEditor(editor);\n        this.addToAnnotationStorage(editor);\n        editor.rebuild();\n      }\n    } else {\n      editor.parent.addOrRebuild(editor);\n    }\n  }\n  get isEditorHandlingKeyboard() {\n    return this.getActive()?.shouldGetKeyboardEvents() || this.#selectedEditors.size === 1 && this.firstSelectedEditor.shouldGetKeyboardEvents();\n  }\n  isActive(editor) {\n    return this.#activeEditor === editor;\n  }\n  getActive() {\n    return this.#activeEditor;\n  }\n  getMode() {\n    return this.#mode;\n  }\n  isEditingMode() {\n    return this.#mode !== AnnotationEditorType.NONE;\n  }\n  get imageManager() {\n    return shadow(this, \"imageManager\", new ImageManager());\n  }\n  getSelectionBoxes(textLayer) {\n    if (!textLayer) {\n      return null;\n    }\n    const selection = document.getSelection();\n    for (let i = 0, ii = selection.rangeCount; i < ii; i++) {\n      if (!textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)) {\n        return null;\n      }\n    }\n    const {\n      x: layerX,\n      y: layerY,\n      width: parentWidth,\n      height: parentHeight\n    } = textLayer.getBoundingClientRect();\n    let rotator;\n    switch (textLayer.getAttribute(\"data-main-rotation\")) {\n      case \"90\":\n        rotator = (x, y, w, h) => ({\n          x: (y - layerY) / parentHeight,\n          y: 1 - (x + w - layerX) / parentWidth,\n          width: h / parentHeight,\n          height: w / parentWidth\n        });\n        break;\n      case \"180\":\n        rotator = (x, y, w, h) => ({\n          x: 1 - (x + w - layerX) / parentWidth,\n          y: 1 - (y + h - layerY) / parentHeight,\n          width: w / parentWidth,\n          height: h / parentHeight\n        });\n        break;\n      case \"270\":\n        rotator = (x, y, w, h) => ({\n          x: 1 - (y + h - layerY) / parentHeight,\n          y: (x - layerX) / parentWidth,\n          width: h / parentHeight,\n          height: w / parentWidth\n        });\n        break;\n      default:\n        rotator = (x, y, w, h) => ({\n          x: (x - layerX) / parentWidth,\n          y: (y - layerY) / parentHeight,\n          width: w / parentWidth,\n          height: h / parentHeight\n        });\n        break;\n    }\n    const boxes = [];\n    for (let i = 0, ii = selection.rangeCount; i < ii; i++) {\n      const range = selection.getRangeAt(i);\n      if (range.collapsed) {\n        continue;\n      }\n      for (const {\n        x,\n        y,\n        width,\n        height\n      } of range.getClientRects()) {\n        if (width === 0 || height === 0) {\n          continue;\n        }\n        boxes.push(rotator(x, y, width, height));\n      }\n    }\n    return boxes.length === 0 ? null : boxes;\n  }\n  addChangedExistingAnnotation({\n    annotationElementId,\n    id\n  }) {\n    (this.#changedExistingAnnotations ||= new Map()).set(annotationElementId, id);\n  }\n  removeChangedExistingAnnotation({\n    annotationElementId\n  }) {\n    this.#changedExistingAnnotations?.delete(annotationElementId);\n  }\n  renderAnnotationElement(annotation) {\n    const editorId = this.#changedExistingAnnotations?.get(annotation.data.id);\n    if (!editorId) {\n      return;\n    }\n    const editor = this.#annotationStorage.getRawValue(editorId);\n    if (!editor) {\n      return;\n    }\n    if (this.#mode === AnnotationEditorType.NONE && !editor.hasBeenModified) {\n      return;\n    }\n    editor.renderAnnotationElement(annotation);\n  }\n  setMissingCanvas(annotationId, annotationElementId, canvas) {\n    const editor = this.#missingCanvases?.get(annotationId);\n    if (!editor) {\n      return;\n    }\n    editor.setCanvas(annotationElementId, canvas);\n    this.#missingCanvases.delete(annotationId);\n  }\n  addMissingCanvas(annotationId, editor) {\n    (this.#missingCanvases ||= new Map()).set(annotationId, editor);\n  }\n}\n\n;// ./src/display/editor/alt_text.js\n\nclass AltText {\n  #altText = null;\n  #altTextDecorative = false;\n  #altTextButton = null;\n  #altTextButtonLabel = null;\n  #altTextTooltip = null;\n  #altTextTooltipTimeout = null;\n  #altTextWasFromKeyBoard = false;\n  #badge = null;\n  #editor = null;\n  #guessedText = null;\n  #textWithDisclaimer = null;\n  #useNewAltTextFlow = false;\n  static #l10nNewButton = null;\n  static _l10n = null;\n  constructor(editor) {\n    this.#editor = editor;\n    this.#useNewAltTextFlow = editor._uiManager.useNewAltTextFlow;\n    AltText.#l10nNewButton ||= Object.freeze({\n      added: \"pdfjs-editor-new-alt-text-added-button\",\n      \"added-label\": \"pdfjs-editor-new-alt-text-added-button-label\",\n      missing: \"pdfjs-editor-new-alt-text-missing-button\",\n      \"missing-label\": \"pdfjs-editor-new-alt-text-missing-button-label\",\n      review: \"pdfjs-editor-new-alt-text-to-review-button\",\n      \"review-label\": \"pdfjs-editor-new-alt-text-to-review-button-label\"\n    });\n  }\n  static initialize(l10n) {\n    AltText._l10n ??= l10n;\n  }\n  async render() {\n    const altText = this.#altTextButton = document.createElement(\"button\");\n    altText.className = \"altText\";\n    altText.tabIndex = \"0\";\n    const label = this.#altTextButtonLabel = document.createElement(\"span\");\n    altText.append(label);\n    if (this.#useNewAltTextFlow) {\n      altText.classList.add(\"new\");\n      altText.setAttribute(\"data-l10n-id\", AltText.#l10nNewButton.missing);\n      label.setAttribute(\"data-l10n-id\", AltText.#l10nNewButton[\"missing-label\"]);\n    } else {\n      altText.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-button\");\n      label.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-button-label\");\n    }\n    const signal = this.#editor._uiManager._signal;\n    altText.addEventListener(\"contextmenu\", noContextMenu, {\n      signal\n    });\n    altText.addEventListener(\"pointerdown\", event => event.stopPropagation(), {\n      signal\n    });\n    const onClick = event => {\n      event.preventDefault();\n      this.#editor._uiManager.editAltText(this.#editor);\n      if (this.#useNewAltTextFlow) {\n        this.#editor._reportTelemetry({\n          action: \"pdfjs.image.alt_text.image_status_label_clicked\",\n          data: {\n            label: this.#label\n          }\n        });\n      }\n    };\n    altText.addEventListener(\"click\", onClick, {\n      capture: true,\n      signal\n    });\n    altText.addEventListener(\"keydown\", event => {\n      if (event.target === altText && event.key === \"Enter\") {\n        this.#altTextWasFromKeyBoard = true;\n        onClick(event);\n      }\n    }, {\n      signal\n    });\n    await this.#setState();\n    return altText;\n  }\n  get #label() {\n    return this.#altText && \"added\" || this.#altText === null && this.guessedText && \"review\" || \"missing\";\n  }\n  finish() {\n    if (!this.#altTextButton) {\n      return;\n    }\n    this.#altTextButton.focus({\n      focusVisible: this.#altTextWasFromKeyBoard\n    });\n    this.#altTextWasFromKeyBoard = false;\n  }\n  isEmpty() {\n    if (this.#useNewAltTextFlow) {\n      return this.#altText === null;\n    }\n    return !this.#altText && !this.#altTextDecorative;\n  }\n  hasData() {\n    if (this.#useNewAltTextFlow) {\n      return this.#altText !== null || !!this.#guessedText;\n    }\n    return this.isEmpty();\n  }\n  get guessedText() {\n    return this.#guessedText;\n  }\n  async setGuessedText(guessedText) {\n    if (this.#altText !== null) {\n      return;\n    }\n    this.#guessedText = guessedText;\n    this.#textWithDisclaimer = await AltText._l10n.get(\"pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer\", {\n      generatedAltText: guessedText\n    });\n    this.#setState();\n  }\n  toggleAltTextBadge(visibility = false) {\n    if (!this.#useNewAltTextFlow || this.#altText) {\n      this.#badge?.remove();\n      this.#badge = null;\n      return;\n    }\n    if (!this.#badge) {\n      const badge = this.#badge = document.createElement(\"div\");\n      badge.className = \"noAltTextBadge\";\n      this.#editor.div.append(badge);\n    }\n    this.#badge.classList.toggle(\"hidden\", !visibility);\n  }\n  serialize(isForCopying) {\n    let altText = this.#altText;\n    if (!isForCopying && this.#guessedText === altText) {\n      altText = this.#textWithDisclaimer;\n    }\n    return {\n      altText,\n      decorative: this.#altTextDecorative,\n      guessedText: this.#guessedText,\n      textWithDisclaimer: this.#textWithDisclaimer\n    };\n  }\n  get data() {\n    return {\n      altText: this.#altText,\n      decorative: this.#altTextDecorative\n    };\n  }\n  set data({\n    altText,\n    decorative,\n    guessedText,\n    textWithDisclaimer,\n    cancel = false\n  }) {\n    if (guessedText) {\n      this.#guessedText = guessedText;\n      this.#textWithDisclaimer = textWithDisclaimer;\n    }\n    if (this.#altText === altText && this.#altTextDecorative === decorative) {\n      return;\n    }\n    if (!cancel) {\n      this.#altText = altText;\n      this.#altTextDecorative = decorative;\n    }\n    this.#setState();\n  }\n  toggle(enabled = false) {\n    if (!this.#altTextButton) {\n      return;\n    }\n    if (!enabled && this.#altTextTooltipTimeout) {\n      clearTimeout(this.#altTextTooltipTimeout);\n      this.#altTextTooltipTimeout = null;\n    }\n    this.#altTextButton.disabled = !enabled;\n  }\n  shown() {\n    this.#editor._reportTelemetry({\n      action: \"pdfjs.image.alt_text.image_status_label_displayed\",\n      data: {\n        label: this.#label\n      }\n    });\n  }\n  destroy() {\n    this.#altTextButton?.remove();\n    this.#altTextButton = null;\n    this.#altTextButtonLabel = null;\n    this.#altTextTooltip = null;\n    this.#badge?.remove();\n    this.#badge = null;\n  }\n  async #setState() {\n    const button = this.#altTextButton;\n    if (!button) {\n      return;\n    }\n    if (this.#useNewAltTextFlow) {\n      button.classList.toggle(\"done\", !!this.#altText);\n      button.setAttribute(\"data-l10n-id\", AltText.#l10nNewButton[this.#label]);\n      this.#altTextButtonLabel?.setAttribute(\"data-l10n-id\", AltText.#l10nNewButton[`${this.#label}-label`]);\n      if (!this.#altText) {\n        this.#altTextTooltip?.remove();\n        return;\n      }\n    } else {\n      if (!this.#altText && !this.#altTextDecorative) {\n        button.classList.remove(\"done\");\n        this.#altTextTooltip?.remove();\n        return;\n      }\n      button.classList.add(\"done\");\n      button.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-edit-button\");\n    }\n    let tooltip = this.#altTextTooltip;\n    if (!tooltip) {\n      this.#altTextTooltip = tooltip = document.createElement(\"span\");\n      tooltip.className = \"tooltip\";\n      tooltip.setAttribute(\"role\", \"tooltip\");\n      tooltip.id = `alt-text-tooltip-${this.#editor.id}`;\n      const DELAY_TO_SHOW_TOOLTIP = 100;\n      const signal = this.#editor._uiManager._signal;\n      signal.addEventListener(\"abort\", () => {\n        clearTimeout(this.#altTextTooltipTimeout);\n        this.#altTextTooltipTimeout = null;\n      }, {\n        once: true\n      });\n      button.addEventListener(\"mouseenter\", () => {\n        this.#altTextTooltipTimeout = setTimeout(() => {\n          this.#altTextTooltipTimeout = null;\n          this.#altTextTooltip.classList.add(\"show\");\n          this.#editor._reportTelemetry({\n            action: \"alt_text_tooltip\"\n          });\n        }, DELAY_TO_SHOW_TOOLTIP);\n      }, {\n        signal\n      });\n      button.addEventListener(\"mouseleave\", () => {\n        if (this.#altTextTooltipTimeout) {\n          clearTimeout(this.#altTextTooltipTimeout);\n          this.#altTextTooltipTimeout = null;\n        }\n        this.#altTextTooltip?.classList.remove(\"show\");\n      }, {\n        signal\n      });\n    }\n    if (this.#altTextDecorative) {\n      tooltip.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-decorative-tooltip\");\n    } else {\n      tooltip.removeAttribute(\"data-l10n-id\");\n      tooltip.textContent = this.#altText;\n    }\n    if (!tooltip.parentNode) {\n      button.append(tooltip);\n    }\n    const element = this.#editor.getElementForAltText();\n    element?.setAttribute(\"aria-describedby\", tooltip.id);\n  }\n}\n\n;// ./src/display/editor/comment.js\n\nclass Comment {\n  #commentStandaloneButton = null;\n  #commentToolbarButton = null;\n  #commentWasFromKeyBoard = false;\n  #editor = null;\n  #initialText = null;\n  #richText = null;\n  #text = null;\n  #date = null;\n  #deleted = false;\n  #popupPosition = null;\n  constructor(editor) {\n    this.#editor = editor;\n  }\n  renderForToolbar() {\n    const button = this.#commentToolbarButton = document.createElement(\"button\");\n    button.className = \"comment\";\n    return this.#render(button, false);\n  }\n  renderForStandalone() {\n    const button = this.#commentStandaloneButton = document.createElement(\"button\");\n    button.className = \"annotationCommentButton\";\n    const position = this.#editor.commentButtonPosition;\n    if (position) {\n      const {\n        style\n      } = button;\n      style.insetInlineEnd = `calc(${100 * (this.#editor._uiManager.direction === \"ltr\" ? 1 - position[0] : position[0])}% - var(--comment-button-dim))`;\n      style.top = `calc(${100 * position[1]}% - var(--comment-button-dim))`;\n      const color = this.#editor.commentButtonColor;\n      if (color) {\n        style.backgroundColor = color;\n      }\n    }\n    return this.#render(button, true);\n  }\n  focusButton() {\n    setTimeout(() => {\n      (this.#commentStandaloneButton ?? this.#commentToolbarButton)?.focus();\n    }, 0);\n  }\n  onUpdatedColor() {\n    if (!this.#commentStandaloneButton) {\n      return;\n    }\n    const color = this.#editor.commentButtonColor;\n    if (color) {\n      this.#commentStandaloneButton.style.backgroundColor = color;\n    }\n    this.#editor._uiManager.updatePopupColor(this.#editor);\n  }\n  get commentButtonWidth() {\n    return (this.#commentStandaloneButton?.getBoundingClientRect().width ?? 0) / this.#editor.parent.boundingClientRect.width;\n  }\n  get commentPopupPositionInLayer() {\n    if (this.#popupPosition) {\n      return this.#popupPosition;\n    }\n    if (!this.#commentStandaloneButton) {\n      return null;\n    }\n    const {\n      x,\n      y,\n      height\n    } = this.#commentStandaloneButton.getBoundingClientRect();\n    const {\n      x: parentX,\n      y: parentY,\n      width: parentWidth,\n      height: parentHeight\n    } = this.#editor.parent.boundingClientRect;\n    return [(x - parentX) / parentWidth, (y + height - parentY) / parentHeight];\n  }\n  set commentPopupPositionInLayer(pos) {\n    this.#popupPosition = pos;\n  }\n  hasDefaultPopupPosition() {\n    return this.#popupPosition === null;\n  }\n  removeStandaloneCommentButton() {\n    this.#commentStandaloneButton?.remove();\n    this.#commentStandaloneButton = null;\n  }\n  removeToolbarCommentButton() {\n    this.#commentToolbarButton?.remove();\n    this.#commentToolbarButton = null;\n  }\n  setCommentButtonStates({\n    selected,\n    hasPopup\n  }) {\n    if (!this.#commentStandaloneButton) {\n      return;\n    }\n    this.#commentStandaloneButton.classList.toggle(\"selected\", selected);\n    this.#commentStandaloneButton.ariaExpanded = hasPopup;\n  }\n  #render(comment, isStandalone) {\n    if (!this.#editor._uiManager.hasCommentManager()) {\n      return null;\n    }\n    comment.tabIndex = \"0\";\n    comment.ariaHasPopup = \"dialog\";\n    if (isStandalone) {\n      comment.ariaControls = \"commentPopup\";\n      comment.setAttribute(\"data-l10n-id\", \"pdfjs-show-comment-button\");\n    } else {\n      comment.ariaControlsElements = [this.#editor._uiManager.getCommentDialogElement()];\n      comment.setAttribute(\"data-l10n-id\", \"pdfjs-editor-add-comment-button\");\n    }\n    const signal = this.#editor._uiManager._signal;\n    if (!(signal instanceof AbortSignal) || signal.aborted) {\n      return comment;\n    }\n    comment.addEventListener(\"contextmenu\", noContextMenu, {\n      signal\n    });\n    if (isStandalone) {\n      comment.addEventListener(\"focusin\", e => {\n        this.#editor._focusEventsAllowed = false;\n        stopEvent(e);\n      }, {\n        capture: true,\n        signal\n      });\n      comment.addEventListener(\"focusout\", e => {\n        this.#editor._focusEventsAllowed = true;\n        stopEvent(e);\n      }, {\n        capture: true,\n        signal\n      });\n    }\n    comment.addEventListener(\"pointerdown\", event => event.stopPropagation(), {\n      signal\n    });\n    const onClick = event => {\n      event.preventDefault();\n      if (comment === this.#commentToolbarButton) {\n        this.edit();\n      } else {\n        this.#editor.toggleComment(true);\n      }\n    };\n    comment.addEventListener(\"click\", onClick, {\n      capture: true,\n      signal\n    });\n    comment.addEventListener(\"keydown\", event => {\n      if (event.target === comment && event.key === \"Enter\") {\n        this.#commentWasFromKeyBoard = true;\n        onClick(event);\n      }\n    }, {\n      signal\n    });\n    comment.addEventListener(\"pointerenter\", () => {\n      this.#editor.toggleComment(false, true);\n    }, {\n      signal\n    });\n    comment.addEventListener(\"pointerleave\", () => {\n      this.#editor.toggleComment(false, false);\n    }, {\n      signal\n    });\n    return comment;\n  }\n  edit(options) {\n    const position = this.commentPopupPositionInLayer;\n    let posX, posY;\n    if (position) {\n      [posX, posY] = position;\n    } else {\n      [posX, posY] = this.#editor.commentButtonPosition;\n      const {\n        width,\n        height,\n        x,\n        y\n      } = this.#editor;\n      posX = x + posX * width;\n      posY = y + posY * height;\n    }\n    const parentDimensions = this.#editor.parent.boundingClientRect;\n    const {\n      x: parentX,\n      y: parentY,\n      width: parentWidth,\n      height: parentHeight\n    } = parentDimensions;\n    this.#editor._uiManager.editComment(this.#editor, parentX + posX * parentWidth, parentY + posY * parentHeight, {\n      ...options,\n      parentDimensions\n    });\n  }\n  finish() {\n    if (!this.#commentToolbarButton) {\n      return;\n    }\n    this.#commentToolbarButton.focus({\n      focusVisible: this.#commentWasFromKeyBoard\n    });\n    this.#commentWasFromKeyBoard = false;\n  }\n  isDeleted() {\n    return this.#deleted || this.#text === \"\";\n  }\n  isEmpty() {\n    return this.#text === null;\n  }\n  hasBeenEdited() {\n    return this.isDeleted() || this.#text !== this.#initialText;\n  }\n  serialize() {\n    return this.data;\n  }\n  get data() {\n    return {\n      text: this.#text,\n      richText: this.#richText,\n      date: this.#date,\n      deleted: this.isDeleted()\n    };\n  }\n  set data(text) {\n    if (text !== this.#text) {\n      this.#richText = null;\n    }\n    if (text === null) {\n      this.#text = \"\";\n      this.#deleted = true;\n      return;\n    }\n    this.#text = text;\n    this.#date = new Date();\n    this.#deleted = false;\n  }\n  restoreData({\n    text,\n    richText,\n    date\n  }) {\n    this.#text = text;\n    this.#richText = richText;\n    this.#date = date;\n    this.#deleted = false;\n  }\n  setInitialText(text, richText = null) {\n    this.#initialText = text;\n    this.data = text;\n    this.#date = null;\n    this.#richText = richText;\n  }\n  shown() {}\n  destroy() {\n    this.#commentToolbarButton?.remove();\n    this.#commentToolbarButton = null;\n    this.#commentStandaloneButton?.remove();\n    this.#commentStandaloneButton = null;\n    this.#text = \"\";\n    this.#richText = null;\n    this.#date = null;\n    this.#editor = null;\n    this.#commentWasFromKeyBoard = false;\n    this.#deleted = false;\n  }\n}\n\n;// ./src/display/touch_manager.js\n\nclass TouchManager {\n  #container;\n  #isPinching = false;\n  #isPinchingStopped = null;\n  #isPinchingDisabled;\n  #onPinchStart;\n  #onPinching;\n  #onPinchEnd;\n  #pointerDownAC = null;\n  #signal;\n  #touchInfo = null;\n  #touchManagerAC;\n  #touchMoveAC = null;\n  constructor({\n    container,\n    isPinchingDisabled = null,\n    isPinchingStopped = null,\n    onPinchStart = null,\n    onPinching = null,\n    onPinchEnd = null,\n    signal\n  }) {\n    this.#container = container;\n    this.#isPinchingStopped = isPinchingStopped;\n    this.#isPinchingDisabled = isPinchingDisabled;\n    this.#onPinchStart = onPinchStart;\n    this.#onPinching = onPinching;\n    this.#onPinchEnd = onPinchEnd;\n    this.#touchManagerAC = new AbortController();\n    this.#signal = AbortSignal.any([signal, this.#touchManagerAC.signal]);\n    container.addEventListener(\"touchstart\", this.#onTouchStart.bind(this), {\n      passive: false,\n      signal: this.#signal\n    });\n  }\n  get MIN_TOUCH_DISTANCE_TO_PINCH() {\n    return 35 / OutputScale.pixelRatio;\n  }\n  #onTouchStart(evt) {\n    if (this.#isPinchingDisabled?.()) {\n      return;\n    }\n    if (evt.touches.length === 1) {\n      if (this.#pointerDownAC) {\n        return;\n      }\n      const pointerDownAC = this.#pointerDownAC = new AbortController();\n      const signal = AbortSignal.any([this.#signal, pointerDownAC.signal]);\n      const container = this.#container;\n      const opts = {\n        capture: true,\n        signal,\n        passive: false\n      };\n      const cancelPointerDown = e => {\n        if (e.pointerType === \"touch\") {\n          this.#pointerDownAC?.abort();\n          this.#pointerDownAC = null;\n        }\n      };\n      container.addEventListener(\"pointerdown\", e => {\n        if (e.pointerType === \"touch\") {\n          stopEvent(e);\n          cancelPointerDown(e);\n        }\n      }, opts);\n      container.addEventListener(\"pointerup\", cancelPointerDown, opts);\n      container.addEventListener(\"pointercancel\", cancelPointerDown, opts);\n      return;\n    }\n    if (!this.#touchMoveAC) {\n      this.#touchMoveAC = new AbortController();\n      const signal = AbortSignal.any([this.#signal, this.#touchMoveAC.signal]);\n      const container = this.#container;\n      const opt = {\n        signal,\n        capture: false,\n        passive: false\n      };\n      container.addEventListener(\"touchmove\", this.#onTouchMove.bind(this), opt);\n      const onTouchEnd = this.#onTouchEnd.bind(this);\n      container.addEventListener(\"touchend\", onTouchEnd, opt);\n      container.addEventListener(\"touchcancel\", onTouchEnd, opt);\n      opt.capture = true;\n      container.addEventListener(\"pointerdown\", stopEvent, opt);\n      container.addEventListener(\"pointermove\", stopEvent, opt);\n      container.addEventListener(\"pointercancel\", stopEvent, opt);\n      container.addEventListener(\"pointerup\", stopEvent, opt);\n      this.#onPinchStart?.();\n    }\n    stopEvent(evt);\n    if (evt.touches.length !== 2 || this.#isPinchingStopped?.()) {\n      this.#touchInfo = null;\n      return;\n    }\n    let [touch0, touch1] = evt.touches;\n    if (touch0.identifier > touch1.identifier) {\n      [touch0, touch1] = [touch1, touch0];\n    }\n    this.#touchInfo = {\n      touch0X: touch0.screenX,\n      touch0Y: touch0.screenY,\n      touch1X: touch1.screenX,\n      touch1Y: touch1.screenY\n    };\n  }\n  #onTouchMove(evt) {\n    if (!this.#touchInfo || evt.touches.length !== 2) {\n      return;\n    }\n    stopEvent(evt);\n    let [touch0, touch1] = evt.touches;\n    if (touch0.identifier > touch1.identifier) {\n      [touch0, touch1] = [touch1, touch0];\n    }\n    const {\n      screenX: screen0X,\n      screenY: screen0Y\n    } = touch0;\n    const {\n      screenX: screen1X,\n      screenY: screen1Y\n    } = touch1;\n    const touchInfo = this.#touchInfo;\n    const {\n      touch0X: pTouch0X,\n      touch0Y: pTouch0Y,\n      touch1X: pTouch1X,\n      touch1Y: pTouch1Y\n    } = touchInfo;\n    const prevGapX = pTouch1X - pTouch0X;\n    const prevGapY = pTouch1Y - pTouch0Y;\n    const currGapX = screen1X - screen0X;\n    const currGapY = screen1Y - screen0Y;\n    const distance = Math.hypot(currGapX, currGapY) || 1;\n    const pDistance = Math.hypot(prevGapX, prevGapY) || 1;\n    if (!this.#isPinching && Math.abs(pDistance - distance) <= TouchManager.MIN_TOUCH_DISTANCE_TO_PINCH) {\n      return;\n    }\n    touchInfo.touch0X = screen0X;\n    touchInfo.touch0Y = screen0Y;\n    touchInfo.touch1X = screen1X;\n    touchInfo.touch1Y = screen1Y;\n    if (!this.#isPinching) {\n      this.#isPinching = true;\n      return;\n    }\n    const origin = [(screen0X + screen1X) / 2, (screen0Y + screen1Y) / 2];\n    this.#onPinching?.(origin, pDistance, distance);\n  }\n  #onTouchEnd(evt) {\n    if (evt.touches.length >= 2) {\n      return;\n    }\n    if (this.#touchMoveAC) {\n      this.#touchMoveAC.abort();\n      this.#touchMoveAC = null;\n      this.#onPinchEnd?.();\n    }\n    if (!this.#touchInfo) {\n      return;\n    }\n    stopEvent(evt);\n    this.#touchInfo = null;\n    this.#isPinching = false;\n  }\n  destroy() {\n    this.#touchManagerAC?.abort();\n    this.#touchManagerAC = null;\n    this.#pointerDownAC?.abort();\n    this.#pointerDownAC = null;\n  }\n}\n\n;// ./src/display/editor/editor.js\n\n\n\n\n\n\n\n\n\n\nclass AnnotationEditor {\n  #accessibilityData = null;\n  #allResizerDivs = null;\n  #altText = null;\n  #comment = null;\n  #commentStandaloneButton = null;\n  #disabled = false;\n  #dragPointerId = null;\n  #dragPointerType = \"\";\n  #resizersDiv = null;\n  #lastPointerCoords = null;\n  #savedDimensions = null;\n  #fakeAnnotation = null;\n  #focusAC = null;\n  #focusedResizerName = \"\";\n  #hasBeenClicked = false;\n  #initialRect = null;\n  #isEditing = false;\n  #isInEditMode = false;\n  #isResizerEnabledForKeyboard = false;\n  #moveInDOMTimeout = null;\n  #prevDragX = 0;\n  #prevDragY = 0;\n  #telemetryTimeouts = null;\n  #touchManager = null;\n  isSelected = false;\n  _isCopy = false;\n  _editToolbar = null;\n  _initialOptions = Object.create(null);\n  _initialData = null;\n  _isVisible = true;\n  _uiManager = null;\n  _focusEventsAllowed = true;\n  static _l10n = null;\n  static _l10nResizer = null;\n  #isDraggable = false;\n  #zIndex = AnnotationEditor._zIndex++;\n  static _borderLineWidth = -1;\n  static _colorManager = new ColorManager();\n  static _zIndex = 1;\n  static _telemetryTimeout = 1000;\n  static get _resizerKeyboardManager() {\n    const resize = AnnotationEditor.prototype._resizeWithKeyboard;\n    const small = AnnotationEditorUIManager.TRANSLATE_SMALL;\n    const big = AnnotationEditorUIManager.TRANSLATE_BIG;\n    return shadow(this, \"_resizerKeyboardManager\", new KeyboardManager([[[\"ArrowLeft\", \"mac+ArrowLeft\"], resize, {\n      args: [-small, 0]\n    }], [[\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"], resize, {\n      args: [-big, 0]\n    }], [[\"ArrowRight\", \"mac+ArrowRight\"], resize, {\n      args: [small, 0]\n    }], [[\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"], resize, {\n      args: [big, 0]\n    }], [[\"ArrowUp\", \"mac+ArrowUp\"], resize, {\n      args: [0, -small]\n    }], [[\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"], resize, {\n      args: [0, -big]\n    }], [[\"ArrowDown\", \"mac+ArrowDown\"], resize, {\n      args: [0, small]\n    }], [[\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"], resize, {\n      args: [0, big]\n    }], [[\"Escape\", \"mac+Escape\"], AnnotationEditor.prototype._stopResizingWithKeyboard]]));\n  }\n  constructor(parameters) {\n    this.parent = parameters.parent;\n    this.id = parameters.id;\n    this.width = this.height = null;\n    this.pageIndex = parameters.parent.pageIndex;\n    this.name = parameters.name;\n    this.div = null;\n    this._uiManager = parameters.uiManager;\n    this.annotationElementId = null;\n    this._willKeepAspectRatio = false;\n    this._initialOptions.isCentered = parameters.isCentered;\n    this._structTreeParentId = null;\n    this.annotationElementId = parameters.annotationElementId || null;\n    this.creationDate = parameters.creationDate || new Date();\n    this.modificationDate = parameters.modificationDate || null;\n    this.canAddComment = true;\n    const {\n      rotation,\n      rawDims: {\n        pageWidth,\n        pageHeight,\n        pageX,\n        pageY\n      }\n    } = this.parent.viewport;\n    this.rotation = rotation;\n    this.pageRotation = (360 + rotation - this._uiManager.viewParameters.rotation) % 360;\n    this.pageDimensions = [pageWidth, pageHeight];\n    this.pageTranslation = [pageX, pageY];\n    const [width, height] = this.parentDimensions;\n    this.x = parameters.x / width;\n    this.y = parameters.y / height;\n    this.isAttachedToDOM = false;\n    this.deleted = false;\n  }\n  updatePageIndex(newPageIndex) {\n    this.pageIndex = newPageIndex;\n  }\n  get editorType() {\n    return Object.getPrototypeOf(this).constructor._type;\n  }\n  get mode() {\n    return Object.getPrototypeOf(this).constructor._editorType;\n  }\n  static get isDrawer() {\n    return false;\n  }\n  static get _defaultLineColor() {\n    return shadow(this, \"_defaultLineColor\", this._colorManager.getHexCode(\"CanvasText\"));\n  }\n  static deleteAnnotationElement(editor) {\n    const fakeEditor = new FakeEditor({\n      id: editor._uiManager.getId(),\n      parent: editor.parent,\n      uiManager: editor._uiManager\n    });\n    fakeEditor.annotationElementId = editor.annotationElementId;\n    fakeEditor.deleted = true;\n    fakeEditor._uiManager.addToAnnotationStorage(fakeEditor);\n  }\n  static initialize(l10n, _uiManager) {\n    AnnotationEditor._l10n ??= l10n;\n    AnnotationEditor._l10nResizer ||= Object.freeze({\n      topLeft: \"pdfjs-editor-resizer-top-left\",\n      topMiddle: \"pdfjs-editor-resizer-top-middle\",\n      topRight: \"pdfjs-editor-resizer-top-right\",\n      middleRight: \"pdfjs-editor-resizer-middle-right\",\n      bottomRight: \"pdfjs-editor-resizer-bottom-right\",\n      bottomMiddle: \"pdfjs-editor-resizer-bottom-middle\",\n      bottomLeft: \"pdfjs-editor-resizer-bottom-left\",\n      middleLeft: \"pdfjs-editor-resizer-middle-left\"\n    });\n    if (AnnotationEditor._borderLineWidth !== -1) {\n      return;\n    }\n    const style = getComputedStyle(document.documentElement);\n    AnnotationEditor._borderLineWidth = parseFloat(style.getPropertyValue(\"--outline-width\")) || 0;\n  }\n  static updateDefaultParams(_type, _value) {}\n  static get defaultPropertiesToUpdate() {\n    return [];\n  }\n  static isHandlingMimeForPasting(mime) {\n    return false;\n  }\n  static paste(item, parent) {\n    unreachable(\"Not implemented\");\n  }\n  get propertiesToUpdate() {\n    return [];\n  }\n  get _isDraggable() {\n    return this.#isDraggable;\n  }\n  set _isDraggable(value) {\n    this.#isDraggable = value;\n    this.div?.classList.toggle(\"draggable\", value);\n  }\n  get uid() {\n    return this.annotationElementId || this.id;\n  }\n  get isEnterHandled() {\n    return true;\n  }\n  center() {\n    const [pageWidth, pageHeight] = this.pageDimensions;\n    switch (this.parentRotation) {\n      case 90:\n        this.x -= this.height * pageHeight / (pageWidth * 2);\n        this.y += this.width * pageWidth / (pageHeight * 2);\n        break;\n      case 180:\n        this.x += this.width / 2;\n        this.y += this.height / 2;\n        break;\n      case 270:\n        this.x += this.height * pageHeight / (pageWidth * 2);\n        this.y -= this.width * pageWidth / (pageHeight * 2);\n        break;\n      default:\n        this.x -= this.width / 2;\n        this.y -= this.height / 2;\n        break;\n    }\n    this.fixAndSetPosition();\n  }\n  addCommands(params) {\n    this._uiManager.addCommands(params);\n  }\n  get currentLayer() {\n    return this._uiManager.currentLayer;\n  }\n  setInBackground() {\n    this.div.style.zIndex = 0;\n  }\n  setInForeground() {\n    this.div.style.zIndex = this.#zIndex;\n  }\n  setParent(parent) {\n    if (parent !== null) {\n      this.pageIndex = parent.pageIndex;\n      this.pageDimensions = parent.pageDimensions;\n    } else {\n      this.#stopResizing();\n      this.#fakeAnnotation?.remove();\n      this.#fakeAnnotation = null;\n    }\n    this.parent = parent;\n  }\n  focusin(event) {\n    if (!this._focusEventsAllowed) {\n      return;\n    }\n    if (!this.#hasBeenClicked) {\n      this.parent.setSelected(this);\n    } else {\n      this.#hasBeenClicked = false;\n    }\n  }\n  focusout(event) {\n    if (!this._focusEventsAllowed) {\n      return;\n    }\n    if (!this.isAttachedToDOM) {\n      return;\n    }\n    const target = event.relatedTarget;\n    if (target?.closest(`#${this.id}`)) {\n      return;\n    }\n    event.preventDefault();\n    if (!this.parent?.isMultipleSelection) {\n      this.commitOrRemove();\n    }\n  }\n  commitOrRemove() {\n    if (this.isEmpty()) {\n      this.remove();\n    } else {\n      this.commit();\n    }\n  }\n  commit() {\n    if (!this.isInEditMode()) {\n      return;\n    }\n    this.addToAnnotationStorage();\n  }\n  addToAnnotationStorage() {\n    this._uiManager.addToAnnotationStorage(this);\n  }\n  setAt(x, y, tx, ty) {\n    const [width, height] = this.parentDimensions;\n    [tx, ty] = this.screenToPageTranslation(tx, ty);\n    this.x = (x + tx) / width;\n    this.y = (y + ty) / height;\n    this.fixAndSetPosition();\n  }\n  _moveAfterPaste(baseX, baseY) {\n    if (this.isClone) {\n      delete this.isClone;\n      return;\n    }\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight);\n    this._onTranslated();\n  }\n  #translate([width, height], x, y) {\n    [x, y] = this.screenToPageTranslation(x, y);\n    this.x += x / width;\n    this.y += y / height;\n    this._onTranslating(this.x, this.y);\n    this.fixAndSetPosition();\n  }\n  translate(x, y) {\n    this.#translate(this.parentDimensions, x, y);\n  }\n  translateInPage(x, y) {\n    this.#initialRect ||= [this.x, this.y, this.width, this.height];\n    this.#translate(this.pageDimensions, x, y);\n    this.div.scrollIntoView({\n      block: \"nearest\"\n    });\n  }\n  translationDone() {\n    this._onTranslated(this.x, this.y);\n  }\n  drag(tx, ty) {\n    this.#initialRect ||= [this.x, this.y, this.width, this.height];\n    const {\n      div,\n      parentDimensions: [parentWidth, parentHeight]\n    } = this;\n    this.x += tx / parentWidth;\n    this.y += ty / parentHeight;\n    if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) {\n      const {\n        x,\n        y\n      } = this.div.getBoundingClientRect();\n      if (this.parent.findNewParent(this, x, y)) {\n        this.x -= Math.floor(this.x);\n        this.y -= Math.floor(this.y);\n      }\n    }\n    let {\n      x,\n      y\n    } = this;\n    const [bx, by] = this.getBaseTranslation();\n    x += bx;\n    y += by;\n    const {\n      style\n    } = div;\n    style.left = `${(100 * x).toFixed(2)}%`;\n    style.top = `${(100 * y).toFixed(2)}%`;\n    this._onTranslating(x, y);\n    div.scrollIntoView({\n      block: \"nearest\"\n    });\n  }\n  _onTranslating(x, y) {}\n  _onTranslated(x, y) {}\n  get _hasBeenMoved() {\n    return !!this.#initialRect && (this.#initialRect[0] !== this.x || this.#initialRect[1] !== this.y);\n  }\n  get _hasBeenResized() {\n    return !!this.#initialRect && (this.#initialRect[2] !== this.width || this.#initialRect[3] !== this.height);\n  }\n  getBaseTranslation() {\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    const {\n      _borderLineWidth\n    } = AnnotationEditor;\n    const x = _borderLineWidth / parentWidth;\n    const y = _borderLineWidth / parentHeight;\n    switch (this.rotation) {\n      case 90:\n        return [-x, y];\n      case 180:\n        return [x, y];\n      case 270:\n        return [x, -y];\n      default:\n        return [-x, -y];\n    }\n  }\n  get _mustFixPosition() {\n    return true;\n  }\n  fixAndSetPosition(rotation = this.rotation) {\n    const {\n      div: {\n        style\n      },\n      pageDimensions: [pageWidth, pageHeight]\n    } = this;\n    let {\n      x,\n      y,\n      width,\n      height\n    } = this;\n    width *= pageWidth;\n    height *= pageHeight;\n    x *= pageWidth;\n    y *= pageHeight;\n    if (this._mustFixPosition) {\n      switch (rotation) {\n        case 0:\n          x = MathClamp(x, 0, pageWidth - width);\n          y = MathClamp(y, 0, pageHeight - height);\n          break;\n        case 90:\n          x = MathClamp(x, 0, pageWidth - height);\n          y = MathClamp(y, width, pageHeight);\n          break;\n        case 180:\n          x = MathClamp(x, width, pageWidth);\n          y = MathClamp(y, height, pageHeight);\n          break;\n        case 270:\n          x = MathClamp(x, height, pageWidth);\n          y = MathClamp(y, 0, pageHeight - width);\n          break;\n      }\n    }\n    this.x = x /= pageWidth;\n    this.y = y /= pageHeight;\n    const [bx, by] = this.getBaseTranslation();\n    x += bx;\n    y += by;\n    style.left = `${(100 * x).toFixed(2)}%`;\n    style.top = `${(100 * y).toFixed(2)}%`;\n    this.moveInDOM();\n  }\n  static #rotatePoint(x, y, angle) {\n    switch (angle) {\n      case 90:\n        return [y, -x];\n      case 180:\n        return [-x, -y];\n      case 270:\n        return [-y, x];\n      default:\n        return [x, y];\n    }\n  }\n  screenToPageTranslation(x, y) {\n    return AnnotationEditor.#rotatePoint(x, y, this.parentRotation);\n  }\n  pageTranslationToScreen(x, y) {\n    return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation);\n  }\n  #getRotationMatrix(rotation) {\n    switch (rotation) {\n      case 90:\n        {\n          const [pageWidth, pageHeight] = this.pageDimensions;\n          return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0];\n        }\n      case 180:\n        return [-1, 0, 0, -1];\n      case 270:\n        {\n          const [pageWidth, pageHeight] = this.pageDimensions;\n          return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0];\n        }\n      default:\n        return [1, 0, 0, 1];\n    }\n  }\n  get parentScale() {\n    return this._uiManager.viewParameters.realScale;\n  }\n  get parentRotation() {\n    return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360;\n  }\n  get parentDimensions() {\n    const {\n      parentScale,\n      pageDimensions: [pageWidth, pageHeight]\n    } = this;\n    return [pageWidth * parentScale, pageHeight * parentScale];\n  }\n  setDims() {\n    const {\n      div: {\n        style\n      },\n      width,\n      height\n    } = this;\n    style.width = `${(100 * width).toFixed(2)}%`;\n    style.height = `${(100 * height).toFixed(2)}%`;\n  }\n  getInitialTranslation() {\n    return [0, 0];\n  }\n  #createResizers() {\n    if (this.#resizersDiv) {\n      return;\n    }\n    this.#resizersDiv = document.createElement(\"div\");\n    this.#resizersDiv.classList.add(\"resizers\");\n    const classes = this._willKeepAspectRatio ? [\"topLeft\", \"topRight\", \"bottomRight\", \"bottomLeft\"] : [\"topLeft\", \"topMiddle\", \"topRight\", \"middleRight\", \"bottomRight\", \"bottomMiddle\", \"bottomLeft\", \"middleLeft\"];\n    const signal = this._uiManager._signal;\n    for (const name of classes) {\n      const div = document.createElement(\"div\");\n      this.#resizersDiv.append(div);\n      div.classList.add(\"resizer\", name);\n      div.setAttribute(\"data-resizer-name\", name);\n      div.addEventListener(\"pointerdown\", this.#resizerPointerdown.bind(this, name), {\n        signal\n      });\n      div.addEventListener(\"contextmenu\", noContextMenu, {\n        signal\n      });\n      div.tabIndex = -1;\n    }\n    this.div.prepend(this.#resizersDiv);\n  }\n  #resizerPointerdown(name, event) {\n    event.preventDefault();\n    const {\n      isMac\n    } = FeatureTest.platform;\n    if (event.button !== 0 || event.ctrlKey && isMac) {\n      return;\n    }\n    this.#altText?.toggle(false);\n    const savedDraggable = this._isDraggable;\n    this._isDraggable = false;\n    this.#lastPointerCoords = [event.screenX, event.screenY];\n    const ac = new AbortController();\n    const signal = this._uiManager.combinedSignal(ac);\n    this.parent.togglePointerEvents(false);\n    window.addEventListener(\"pointermove\", this.#resizerPointermove.bind(this, name), {\n      passive: true,\n      capture: true,\n      signal\n    });\n    window.addEventListener(\"touchmove\", stopEvent, {\n      passive: false,\n      signal\n    });\n    window.addEventListener(\"contextmenu\", noContextMenu, {\n      signal\n    });\n    this.#savedDimensions = {\n      savedX: this.x,\n      savedY: this.y,\n      savedWidth: this.width,\n      savedHeight: this.height\n    };\n    const savedParentCursor = this.parent.div.style.cursor;\n    const savedCursor = this.div.style.cursor;\n    this.div.style.cursor = this.parent.div.style.cursor = window.getComputedStyle(event.target).cursor;\n    const pointerUpCallback = () => {\n      ac.abort();\n      this.parent.togglePointerEvents(true);\n      this.#altText?.toggle(true);\n      this._isDraggable = savedDraggable;\n      this.parent.div.style.cursor = savedParentCursor;\n      this.div.style.cursor = savedCursor;\n      this.#addResizeToUndoStack();\n    };\n    window.addEventListener(\"pointerup\", pointerUpCallback, {\n      signal\n    });\n    window.addEventListener(\"blur\", pointerUpCallback, {\n      signal\n    });\n  }\n  #resize(x, y, width, height) {\n    this.width = width;\n    this.height = height;\n    this.x = x;\n    this.y = y;\n    this.setDims();\n    this.fixAndSetPosition();\n    this._onResized();\n  }\n  _onResized() {}\n  #addResizeToUndoStack() {\n    if (!this.#savedDimensions) {\n      return;\n    }\n    const {\n      savedX,\n      savedY,\n      savedWidth,\n      savedHeight\n    } = this.#savedDimensions;\n    this.#savedDimensions = null;\n    const newX = this.x;\n    const newY = this.y;\n    const newWidth = this.width;\n    const newHeight = this.height;\n    if (newX === savedX && newY === savedY && newWidth === savedWidth && newHeight === savedHeight) {\n      return;\n    }\n    this.addCommands({\n      cmd: this.#resize.bind(this, newX, newY, newWidth, newHeight),\n      undo: this.#resize.bind(this, savedX, savedY, savedWidth, savedHeight),\n      mustExec: true\n    });\n  }\n  static _round(x) {\n    return Math.round(x * 10000) / 10000;\n  }\n  #resizerPointermove(name, event) {\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    const savedX = this.x;\n    const savedY = this.y;\n    const savedWidth = this.width;\n    const savedHeight = this.height;\n    const minWidth = AnnotationEditor.MIN_SIZE / parentWidth;\n    const minHeight = AnnotationEditor.MIN_SIZE / parentHeight;\n    const rotationMatrix = this.#getRotationMatrix(this.rotation);\n    const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y];\n    const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation);\n    const invTransf = (x, y) => [invRotationMatrix[0] * x + invRotationMatrix[2] * y, invRotationMatrix[1] * x + invRotationMatrix[3] * y];\n    let getPoint;\n    let getOpposite;\n    let isDiagonal = false;\n    let isHorizontal = false;\n    switch (name) {\n      case \"topLeft\":\n        isDiagonal = true;\n        getPoint = (w, h) => [0, 0];\n        getOpposite = (w, h) => [w, h];\n        break;\n      case \"topMiddle\":\n        getPoint = (w, h) => [w / 2, 0];\n        getOpposite = (w, h) => [w / 2, h];\n        break;\n      case \"topRight\":\n        isDiagonal = true;\n        getPoint = (w, h) => [w, 0];\n        getOpposite = (w, h) => [0, h];\n        break;\n      case \"middleRight\":\n        isHorizontal = true;\n        getPoint = (w, h) => [w, h / 2];\n        getOpposite = (w, h) => [0, h / 2];\n        break;\n      case \"bottomRight\":\n        isDiagonal = true;\n        getPoint = (w, h) => [w, h];\n        getOpposite = (w, h) => [0, 0];\n        break;\n      case \"bottomMiddle\":\n        getPoint = (w, h) => [w / 2, h];\n        getOpposite = (w, h) => [w / 2, 0];\n        break;\n      case \"bottomLeft\":\n        isDiagonal = true;\n        getPoint = (w, h) => [0, h];\n        getOpposite = (w, h) => [w, 0];\n        break;\n      case \"middleLeft\":\n        isHorizontal = true;\n        getPoint = (w, h) => [0, h / 2];\n        getOpposite = (w, h) => [w, h / 2];\n        break;\n    }\n    const point = getPoint(savedWidth, savedHeight);\n    const oppositePoint = getOpposite(savedWidth, savedHeight);\n    let transfOppositePoint = transf(...oppositePoint);\n    const oppositeX = AnnotationEditor._round(savedX + transfOppositePoint[0]);\n    const oppositeY = AnnotationEditor._round(savedY + transfOppositePoint[1]);\n    let ratioX = 1;\n    let ratioY = 1;\n    let deltaX, deltaY;\n    if (!event.fromKeyboard) {\n      const {\n        screenX,\n        screenY\n      } = event;\n      const [lastScreenX, lastScreenY] = this.#lastPointerCoords;\n      [deltaX, deltaY] = this.screenToPageTranslation(screenX - lastScreenX, screenY - lastScreenY);\n      this.#lastPointerCoords[0] = screenX;\n      this.#lastPointerCoords[1] = screenY;\n    } else {\n      ({\n        deltaX,\n        deltaY\n      } = event);\n    }\n    [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight);\n    if (isDiagonal) {\n      const oldDiag = Math.hypot(savedWidth, savedHeight);\n      ratioX = ratioY = Math.max(Math.min(Math.hypot(oppositePoint[0] - point[0] - deltaX, oppositePoint[1] - point[1] - deltaY) / oldDiag, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight);\n    } else if (isHorizontal) {\n      ratioX = MathClamp(Math.abs(oppositePoint[0] - point[0] - deltaX), minWidth, 1) / savedWidth;\n    } else {\n      ratioY = MathClamp(Math.abs(oppositePoint[1] - point[1] - deltaY), minHeight, 1) / savedHeight;\n    }\n    const newWidth = AnnotationEditor._round(savedWidth * ratioX);\n    const newHeight = AnnotationEditor._round(savedHeight * ratioY);\n    transfOppositePoint = transf(...getOpposite(newWidth, newHeight));\n    const newX = oppositeX - transfOppositePoint[0];\n    const newY = oppositeY - transfOppositePoint[1];\n    this.#initialRect ||= [this.x, this.y, this.width, this.height];\n    this.width = newWidth;\n    this.height = newHeight;\n    this.x = newX;\n    this.y = newY;\n    this.setDims();\n    this.fixAndSetPosition();\n    this._onResizing();\n  }\n  _onResizing() {}\n  altTextFinish() {\n    this.#altText?.finish();\n  }\n  get toolbarButtons() {\n    return null;\n  }\n  async addEditToolbar() {\n    if (this._editToolbar || this.#isInEditMode) {\n      return this._editToolbar;\n    }\n    this._editToolbar = new EditorToolbar(this);\n    this.div.append(this._editToolbar.render());\n    const {\n      toolbarButtons\n    } = this;\n    if (toolbarButtons) {\n      for (const [name, tool] of toolbarButtons) {\n        await this._editToolbar.addButton(name, tool);\n      }\n    }\n    if (!this.hasComment) {\n      this._editToolbar.addButton(\"comment\", this.addCommentButton());\n    }\n    this._editToolbar.addButton(\"delete\");\n    return this._editToolbar;\n  }\n  addCommentButtonInToolbar() {\n    this._editToolbar?.addButtonBefore(\"comment\", this.addCommentButton(), \".deleteButton\");\n  }\n  removeCommentButtonFromToolbar() {\n    this._editToolbar?.removeButton(\"comment\");\n  }\n  removeEditToolbar() {\n    this._editToolbar?.remove();\n    this._editToolbar = null;\n    this.#altText?.destroy();\n  }\n  addContainer(container) {\n    const editToolbarDiv = this._editToolbar?.div;\n    if (editToolbarDiv) {\n      editToolbarDiv.before(container);\n    } else {\n      this.div.append(container);\n    }\n  }\n  getClientDimensions() {\n    return this.div.getBoundingClientRect();\n  }\n  createAltText() {\n    if (!this.#altText) {\n      AltText.initialize(AnnotationEditor._l10n);\n      this.#altText = new AltText(this);\n      if (this.#accessibilityData) {\n        this.#altText.data = this.#accessibilityData;\n        this.#accessibilityData = null;\n      }\n    }\n    return this.#altText;\n  }\n  get altTextData() {\n    return this.#altText?.data;\n  }\n  set altTextData(data) {\n    if (!this.#altText) {\n      return;\n    }\n    this.#altText.data = data;\n  }\n  get guessedAltText() {\n    return this.#altText?.guessedText;\n  }\n  async setGuessedAltText(text) {\n    await this.#altText?.setGuessedText(text);\n  }\n  serializeAltText(isForCopying) {\n    return this.#altText?.serialize(isForCopying);\n  }\n  hasAltText() {\n    return !!this.#altText && !this.#altText.isEmpty();\n  }\n  hasAltTextData() {\n    return this.#altText?.hasData() ?? false;\n  }\n  focusCommentButton() {\n    this.#comment?.focusButton();\n  }\n  addCommentButton() {\n    return this.canAddComment ? this.#comment ||= new Comment(this) : null;\n  }\n  addStandaloneCommentButton() {\n    if (!this._uiManager.hasCommentManager()) {\n      return;\n    }\n    if (this.#commentStandaloneButton) {\n      if (this._uiManager.isEditingMode()) {\n        this.#commentStandaloneButton.classList.remove(\"hidden\");\n      }\n      return;\n    }\n    if (!this.hasComment) {\n      return;\n    }\n    this.#commentStandaloneButton = this.#comment.renderForStandalone();\n    this.div.append(this.#commentStandaloneButton);\n  }\n  removeStandaloneCommentButton() {\n    this.#comment.removeStandaloneCommentButton();\n    this.#commentStandaloneButton = null;\n  }\n  hideStandaloneCommentButton() {\n    this.#commentStandaloneButton?.classList.add(\"hidden\");\n  }\n  get comment() {\n    if (!this.#comment) {\n      return null;\n    }\n    const {\n      data: {\n        richText,\n        text,\n        date,\n        deleted\n      }\n    } = this.#comment;\n    return {\n      text,\n      richText,\n      date,\n      deleted,\n      color: this.getNonHCMColor(),\n      opacity: this.opacity ?? 1\n    };\n  }\n  set comment(value) {\n    this.#comment ||= new Comment(this);\n    if (typeof value === \"object\" && value !== null) {\n      this.#comment.restoreData(value);\n    } else {\n      this.#comment.data = value;\n    }\n    if (this.hasComment) {\n      this.removeCommentButtonFromToolbar();\n      this.addStandaloneCommentButton();\n      this._uiManager.updateComment(this);\n    } else {\n      this.addCommentButtonInToolbar();\n      this.removeStandaloneCommentButton();\n      this._uiManager.removeComment(this);\n    }\n  }\n  setCommentData({\n    comment,\n    popupRef,\n    richText\n  }) {\n    if (!popupRef) {\n      return;\n    }\n    this.#comment ||= new Comment(this);\n    this.#comment.setInitialText(comment, richText);\n    if (!this.annotationElementId) {\n      return;\n    }\n    const storedData = this._uiManager.getAndRemoveDataFromAnnotationStorage(this.annotationElementId);\n    if (storedData) {\n      this.updateFromAnnotationLayer(storedData);\n    }\n  }\n  get hasEditedComment() {\n    return this.#comment?.hasBeenEdited();\n  }\n  get hasDeletedComment() {\n    return this.#comment?.isDeleted();\n  }\n  get hasComment() {\n    return !!this.#comment && !this.#comment.isEmpty() && !this.#comment.isDeleted();\n  }\n  async editComment(options) {\n    this.#comment ||= new Comment(this);\n    this.#comment.edit(options);\n  }\n  toggleComment(isSelected, visibility = undefined) {\n    if (this.hasComment) {\n      this._uiManager.toggleComment(this, isSelected, visibility);\n    }\n  }\n  setSelectedCommentButton(selected) {\n    this.#comment.setSelectedButton(selected);\n  }\n  addComment(serialized) {\n    if (this.hasEditedComment) {\n      const DEFAULT_POPUP_WIDTH = 180;\n      const DEFAULT_POPUP_HEIGHT = 100;\n      const [,,, trY] = serialized.rect;\n      const [pageWidth] = this.pageDimensions;\n      const [pageX] = this.pageTranslation;\n      const blX = pageX + pageWidth + 1;\n      const blY = trY - DEFAULT_POPUP_HEIGHT;\n      const trX = blX + DEFAULT_POPUP_WIDTH;\n      serialized.popup = {\n        contents: this.comment.text,\n        deleted: this.comment.deleted,\n        rect: [blX, blY, trX, trY]\n      };\n    }\n  }\n  updateFromAnnotationLayer({\n    popup: {\n      contents,\n      deleted\n    }\n  }) {\n    this.#comment.data = deleted ? null : contents;\n  }\n  get parentBoundingClientRect() {\n    return this.parent.boundingClientRect;\n  }\n  render() {\n    const div = this.div = document.createElement(\"div\");\n    div.setAttribute(\"data-editor-rotation\", (360 - this.rotation) % 360);\n    div.className = this.name;\n    div.setAttribute(\"id\", this.id);\n    div.tabIndex = this.#disabled ? -1 : 0;\n    div.setAttribute(\"role\", \"application\");\n    if (this.defaultL10nId) {\n      div.setAttribute(\"data-l10n-id\", this.defaultL10nId);\n    }\n    if (!this._isVisible) {\n      div.classList.add(\"hidden\");\n    }\n    this.setInForeground();\n    this.#addFocusListeners();\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    if (this.parentRotation % 180 !== 0) {\n      div.style.maxWidth = `${(100 * parentHeight / parentWidth).toFixed(2)}%`;\n      div.style.maxHeight = `${(100 * parentWidth / parentHeight).toFixed(2)}%`;\n    }\n    const [tx, ty] = this.getInitialTranslation();\n    this.translate(tx, ty);\n    bindEvents(this, div, [\"keydown\", \"pointerdown\", \"dblclick\"]);\n    if (this.isResizable && this._uiManager._supportsPinchToZoom) {\n      this.#touchManager ||= new TouchManager({\n        container: div,\n        isPinchingDisabled: () => !this.isSelected,\n        onPinchStart: this.#touchPinchStartCallback.bind(this),\n        onPinching: this.#touchPinchCallback.bind(this),\n        onPinchEnd: this.#touchPinchEndCallback.bind(this),\n        signal: this._uiManager._signal\n      });\n    }\n    this.addStandaloneCommentButton();\n    this._uiManager._editorUndoBar?.hide();\n    return div;\n  }\n  #touchPinchStartCallback() {\n    this.#savedDimensions = {\n      savedX: this.x,\n      savedY: this.y,\n      savedWidth: this.width,\n      savedHeight: this.height\n    };\n    this.#altText?.toggle(false);\n    this.parent.togglePointerEvents(false);\n  }\n  #touchPinchCallback(_origin, prevDistance, distance) {\n    const slowDownFactor = 0.7;\n    let factor = slowDownFactor * (distance / prevDistance) + 1 - slowDownFactor;\n    if (factor === 1) {\n      return;\n    }\n    const rotationMatrix = this.#getRotationMatrix(this.rotation);\n    const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y];\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    const savedX = this.x;\n    const savedY = this.y;\n    const savedWidth = this.width;\n    const savedHeight = this.height;\n    const minWidth = AnnotationEditor.MIN_SIZE / parentWidth;\n    const minHeight = AnnotationEditor.MIN_SIZE / parentHeight;\n    factor = Math.max(Math.min(factor, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight);\n    const newWidth = AnnotationEditor._round(savedWidth * factor);\n    const newHeight = AnnotationEditor._round(savedHeight * factor);\n    if (newWidth === savedWidth && newHeight === savedHeight) {\n      return;\n    }\n    this.#initialRect ||= [savedX, savedY, savedWidth, savedHeight];\n    const transfCenterPoint = transf(savedWidth / 2, savedHeight / 2);\n    const centerX = AnnotationEditor._round(savedX + transfCenterPoint[0]);\n    const centerY = AnnotationEditor._round(savedY + transfCenterPoint[1]);\n    const newTransfCenterPoint = transf(newWidth / 2, newHeight / 2);\n    this.x = centerX - newTransfCenterPoint[0];\n    this.y = centerY - newTransfCenterPoint[1];\n    this.width = newWidth;\n    this.height = newHeight;\n    this.setDims();\n    this.fixAndSetPosition();\n    this._onResizing();\n  }\n  #touchPinchEndCallback() {\n    this.#altText?.toggle(true);\n    this.parent.togglePointerEvents(true);\n    this.#addResizeToUndoStack();\n  }\n  pointerdown(event) {\n    const {\n      isMac\n    } = FeatureTest.platform;\n    if (event.button !== 0 || event.ctrlKey && isMac) {\n      event.preventDefault();\n      return;\n    }\n    this.#hasBeenClicked = true;\n    if (this._isDraggable) {\n      this.#setUpDragSession(event);\n      return;\n    }\n    this.#selectOnPointerEvent(event);\n  }\n  #selectOnPointerEvent(event) {\n    const {\n      isMac\n    } = FeatureTest.platform;\n    if (event.ctrlKey && !isMac || event.shiftKey || event.metaKey && isMac) {\n      this.parent.toggleSelected(this);\n    } else {\n      this.parent.setSelected(this);\n    }\n  }\n  #setUpDragSession(event) {\n    const {\n      isSelected\n    } = this;\n    this._uiManager.setUpDragSession();\n    let hasDraggingStarted = false;\n    const ac = new AbortController();\n    const signal = this._uiManager.combinedSignal(ac);\n    const opts = {\n      capture: true,\n      passive: false,\n      signal\n    };\n    const cancelDrag = e => {\n      ac.abort();\n      this.#dragPointerId = null;\n      this.#hasBeenClicked = false;\n      if (!this._uiManager.endDragSession()) {\n        this.#selectOnPointerEvent(e);\n      }\n      if (hasDraggingStarted) {\n        this._onStopDragging();\n      }\n    };\n    if (isSelected) {\n      this.#prevDragX = event.clientX;\n      this.#prevDragY = event.clientY;\n      this.#dragPointerId = event.pointerId;\n      this.#dragPointerType = event.pointerType;\n      window.addEventListener(\"pointermove\", e => {\n        if (!hasDraggingStarted) {\n          hasDraggingStarted = true;\n          this._uiManager.toggleComment(this, true, false);\n          this._onStartDragging();\n        }\n        const {\n          clientX: x,\n          clientY: y,\n          pointerId\n        } = e;\n        if (pointerId !== this.#dragPointerId) {\n          stopEvent(e);\n          return;\n        }\n        const [tx, ty] = this.screenToPageTranslation(x - this.#prevDragX, y - this.#prevDragY);\n        this.#prevDragX = x;\n        this.#prevDragY = y;\n        this._uiManager.dragSelectedEditors(tx, ty);\n      }, opts);\n      window.addEventListener(\"touchmove\", stopEvent, opts);\n      window.addEventListener(\"pointerdown\", e => {\n        if (e.pointerType === this.#dragPointerType) {\n          if (this.#touchManager || e.isPrimary) {\n            cancelDrag(e);\n          }\n        }\n        stopEvent(e);\n      }, opts);\n    }\n    const pointerUpCallback = e => {\n      if (!this.#dragPointerId || this.#dragPointerId === e.pointerId) {\n        cancelDrag(e);\n        return;\n      }\n      stopEvent(e);\n    };\n    window.addEventListener(\"pointerup\", pointerUpCallback, {\n      signal\n    });\n    window.addEventListener(\"blur\", pointerUpCallback, {\n      signal\n    });\n  }\n  _onStartDragging() {}\n  _onStopDragging() {}\n  moveInDOM() {\n    if (this.#moveInDOMTimeout) {\n      clearTimeout(this.#moveInDOMTimeout);\n    }\n    this.#moveInDOMTimeout = setTimeout(() => {\n      this.#moveInDOMTimeout = null;\n      this.parent?.moveEditorInDOM(this);\n    }, 0);\n  }\n  _setParentAndPosition(parent, x, y) {\n    parent.changeParent(this);\n    this.x = x;\n    this.y = y;\n    this.fixAndSetPosition();\n    this._onTranslated();\n  }\n  getRect(tx, ty, rotation = this.rotation) {\n    const scale = this.parentScale;\n    const [pageWidth, pageHeight] = this.pageDimensions;\n    const [pageX, pageY] = this.pageTranslation;\n    const shiftX = tx / scale;\n    const shiftY = ty / scale;\n    const x = this.x * pageWidth;\n    const y = this.y * pageHeight;\n    const width = this.width * pageWidth;\n    const height = this.height * pageHeight;\n    switch (rotation) {\n      case 0:\n        return [x + shiftX + pageX, pageHeight - y - shiftY - height + pageY, x + shiftX + width + pageX, pageHeight - y - shiftY + pageY];\n      case 90:\n        return [x + shiftY + pageX, pageHeight - y + shiftX + pageY, x + shiftY + height + pageX, pageHeight - y + shiftX + width + pageY];\n      case 180:\n        return [x - shiftX - width + pageX, pageHeight - y + shiftY + pageY, x - shiftX + pageX, pageHeight - y + shiftY + height + pageY];\n      case 270:\n        return [x - shiftY - height + pageX, pageHeight - y - shiftX - width + pageY, x - shiftY + pageX, pageHeight - y - shiftX + pageY];\n      default:\n        throw new Error(\"Invalid rotation\");\n    }\n  }\n  getRectInCurrentCoords(rect, pageHeight) {\n    const [x1, y1, x2, y2] = rect;\n    const width = x2 - x1;\n    const height = y2 - y1;\n    switch (this.rotation) {\n      case 0:\n        return [x1, pageHeight - y2, width, height];\n      case 90:\n        return [x1, pageHeight - y1, height, width];\n      case 180:\n        return [x2, pageHeight - y1, width, height];\n      case 270:\n        return [x2, pageHeight - y2, height, width];\n      default:\n        throw new Error(\"Invalid rotation\");\n    }\n  }\n  getPDFRect() {\n    return this.getRect(0, 0);\n  }\n  getNonHCMColor() {\n    return this.color && AnnotationEditor._colorManager.convert(this._uiManager.getNonHCMColor(this.color));\n  }\n  onUpdatedColor() {\n    this.#comment?.onUpdatedColor();\n  }\n  getData() {\n    const {\n      comment: {\n        text: str,\n        color,\n        date,\n        opacity,\n        deleted,\n        richText\n      },\n      uid: id,\n      pageIndex,\n      creationDate,\n      modificationDate\n    } = this;\n    return {\n      id,\n      pageIndex,\n      rect: this.getPDFRect(),\n      richText,\n      contentsObj: {\n        str\n      },\n      creationDate,\n      modificationDate: date || modificationDate,\n      popupRef: !deleted,\n      color,\n      opacity\n    };\n  }\n  onceAdded(focus) {}\n  isEmpty() {\n    return false;\n  }\n  enableEditMode() {\n    if (this.isInEditMode()) {\n      return false;\n    }\n    this.parent.setEditingState(false);\n    this.#isInEditMode = true;\n    return true;\n  }\n  disableEditMode() {\n    if (!this.isInEditMode()) {\n      return false;\n    }\n    this.parent.setEditingState(true);\n    this.#isInEditMode = false;\n    return true;\n  }\n  isInEditMode() {\n    return this.#isInEditMode;\n  }\n  shouldGetKeyboardEvents() {\n    return this.#isResizerEnabledForKeyboard;\n  }\n  needsToBeRebuilt() {\n    return this.div && !this.isAttachedToDOM;\n  }\n  get isOnScreen() {\n    const {\n      top,\n      left,\n      bottom,\n      right\n    } = this.getClientDimensions();\n    const {\n      innerHeight,\n      innerWidth\n    } = window;\n    return left < innerWidth && right > 0 && top < innerHeight && bottom > 0;\n  }\n  #addFocusListeners() {\n    if (this.#focusAC || !this.div) {\n      return;\n    }\n    this.#focusAC = new AbortController();\n    const signal = this._uiManager.combinedSignal(this.#focusAC);\n    this.div.addEventListener(\"focusin\", this.focusin.bind(this), {\n      signal\n    });\n    this.div.addEventListener(\"focusout\", this.focusout.bind(this), {\n      signal\n    });\n  }\n  rebuild() {\n    this.#addFocusListeners();\n  }\n  rotate(_angle) {}\n  resize() {}\n  serializeDeleted() {\n    return {\n      id: this.annotationElementId,\n      deleted: true,\n      pageIndex: this.pageIndex,\n      popupRef: this._initialData?.popupRef || \"\"\n    };\n  }\n  serialize(isForCopying = false, context = null) {\n    return {\n      annotationType: this.mode,\n      pageIndex: this.pageIndex,\n      rect: this.getPDFRect(),\n      rotation: this.rotation,\n      structTreeParentId: this._structTreeParentId,\n      popupRef: this._initialData?.popupRef || \"\"\n    };\n  }\n  static async deserialize(data, parent, uiManager) {\n    const editor = new this.prototype.constructor({\n      parent,\n      id: uiManager.getId(),\n      uiManager,\n      annotationElementId: data.annotationElementId,\n      creationDate: data.creationDate,\n      modificationDate: data.modificationDate\n    });\n    editor.rotation = data.rotation;\n    editor.#accessibilityData = data.accessibilityData;\n    editor._isCopy = data.isCopy || false;\n    const [pageWidth, pageHeight] = editor.pageDimensions;\n    const [x, y, width, height] = editor.getRectInCurrentCoords(data.rect, pageHeight);\n    editor.x = x / pageWidth;\n    editor.y = y / pageHeight;\n    editor.width = width / pageWidth;\n    editor.height = height / pageHeight;\n    return editor;\n  }\n  get hasBeenModified() {\n    return !!this.annotationElementId && (this.deleted || this.serialize() !== null);\n  }\n  remove() {\n    this.#focusAC?.abort();\n    this.#focusAC = null;\n    if (!this.isEmpty()) {\n      this.commit();\n    }\n    if (this.parent) {\n      this.parent.remove(this);\n    } else {\n      this._uiManager.removeEditor(this);\n    }\n    this.hideCommentPopup();\n    if (this.#moveInDOMTimeout) {\n      clearTimeout(this.#moveInDOMTimeout);\n      this.#moveInDOMTimeout = null;\n    }\n    this.#stopResizing();\n    this.removeEditToolbar();\n    if (this.#telemetryTimeouts) {\n      for (const timeout of this.#telemetryTimeouts.values()) {\n        clearTimeout(timeout);\n      }\n      this.#telemetryTimeouts = null;\n    }\n    this.parent = null;\n    this.#touchManager?.destroy();\n    this.#touchManager = null;\n    this.#fakeAnnotation?.remove();\n    this.#fakeAnnotation = null;\n  }\n  get isResizable() {\n    return false;\n  }\n  makeResizable() {\n    if (this.isResizable) {\n      this.#createResizers();\n      this.#resizersDiv.classList.remove(\"hidden\");\n    }\n  }\n  get toolbarPosition() {\n    return null;\n  }\n  get commentButtonPosition() {\n    return this._uiManager.direction === \"ltr\" ? [1, 0] : [0, 0];\n  }\n  get commentButtonPositionInPage() {\n    const {\n      commentButtonPosition: [posX, posY]\n    } = this;\n    const [blX, blY, trX, trY] = this.getPDFRect();\n    return [AnnotationEditor._round(blX + (trX - blX) * posX), AnnotationEditor._round(blY + (trY - blY) * (1 - posY))];\n  }\n  get commentButtonColor() {\n    return this._uiManager.makeCommentColor(this.getNonHCMColor(), this.opacity);\n  }\n  get commentPopupPosition() {\n    return this.#comment.commentPopupPositionInLayer;\n  }\n  set commentPopupPosition(pos) {\n    this.#comment.commentPopupPositionInLayer = pos;\n  }\n  hasDefaultPopupPosition() {\n    return this.#comment.hasDefaultPopupPosition();\n  }\n  get commentButtonWidth() {\n    return this.#comment.commentButtonWidth;\n  }\n  get elementBeforePopup() {\n    return this.div;\n  }\n  setCommentButtonStates(options) {\n    this.#comment?.setCommentButtonStates(options);\n  }\n  keydown(event) {\n    if (!this.isResizable || event.target !== this.div || event.key !== \"Enter\") {\n      return;\n    }\n    this._uiManager.setSelected(this);\n    this.#savedDimensions = {\n      savedX: this.x,\n      savedY: this.y,\n      savedWidth: this.width,\n      savedHeight: this.height\n    };\n    const children = this.#resizersDiv.children;\n    if (!this.#allResizerDivs) {\n      this.#allResizerDivs = Array.from(children);\n      const boundResizerKeydown = this.#resizerKeydown.bind(this);\n      const boundResizerBlur = this.#resizerBlur.bind(this);\n      const signal = this._uiManager._signal;\n      for (const div of this.#allResizerDivs) {\n        const name = div.getAttribute(\"data-resizer-name\");\n        div.setAttribute(\"role\", \"spinbutton\");\n        div.addEventListener(\"keydown\", boundResizerKeydown, {\n          signal\n        });\n        div.addEventListener(\"blur\", boundResizerBlur, {\n          signal\n        });\n        div.addEventListener(\"focus\", this.#resizerFocus.bind(this, name), {\n          signal\n        });\n        div.setAttribute(\"data-l10n-id\", AnnotationEditor._l10nResizer[name]);\n      }\n    }\n    const first = this.#allResizerDivs[0];\n    let firstPosition = 0;\n    for (const div of children) {\n      if (div === first) {\n        break;\n      }\n      firstPosition++;\n    }\n    const nextFirstPosition = (360 - this.rotation + this.parentRotation) % 360 / 90 * (this.#allResizerDivs.length / 4);\n    if (nextFirstPosition !== firstPosition) {\n      if (nextFirstPosition < firstPosition) {\n        for (let i = 0; i < firstPosition - nextFirstPosition; i++) {\n          this.#resizersDiv.append(this.#resizersDiv.firstElementChild);\n        }\n      } else if (nextFirstPosition > firstPosition) {\n        for (let i = 0; i < nextFirstPosition - firstPosition; i++) {\n          this.#resizersDiv.firstElementChild.before(this.#resizersDiv.lastElementChild);\n        }\n      }\n      let i = 0;\n      for (const child of children) {\n        const div = this.#allResizerDivs[i++];\n        const name = div.getAttribute(\"data-resizer-name\");\n        child.setAttribute(\"data-l10n-id\", AnnotationEditor._l10nResizer[name]);\n      }\n    }\n    this.#setResizerTabIndex(0);\n    this.#isResizerEnabledForKeyboard = true;\n    this.#resizersDiv.firstElementChild.focus({\n      focusVisible: true\n    });\n    event.preventDefault();\n    event.stopImmediatePropagation();\n  }\n  #resizerKeydown(event) {\n    AnnotationEditor._resizerKeyboardManager.exec(this, event);\n  }\n  #resizerBlur(event) {\n    if (this.#isResizerEnabledForKeyboard && event.relatedTarget?.parentNode !== this.#resizersDiv) {\n      this.#stopResizing();\n    }\n  }\n  #resizerFocus(name) {\n    this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : \"\";\n  }\n  #setResizerTabIndex(value) {\n    if (!this.#allResizerDivs) {\n      return;\n    }\n    for (const div of this.#allResizerDivs) {\n      div.tabIndex = value;\n    }\n  }\n  _resizeWithKeyboard(x, y) {\n    if (!this.#isResizerEnabledForKeyboard) {\n      return;\n    }\n    this.#resizerPointermove(this.#focusedResizerName, {\n      deltaX: x,\n      deltaY: y,\n      fromKeyboard: true\n    });\n  }\n  #stopResizing() {\n    this.#isResizerEnabledForKeyboard = false;\n    this.#setResizerTabIndex(-1);\n    this.#addResizeToUndoStack();\n  }\n  _stopResizingWithKeyboard() {\n    this.#stopResizing();\n    this.div.focus();\n  }\n  select() {\n    if (this.isSelected && this._editToolbar) {\n      this._editToolbar.show();\n      return;\n    }\n    this.isSelected = true;\n    this.makeResizable();\n    this.div?.classList.add(\"selectedEditor\");\n    if (!this._editToolbar) {\n      this.addEditToolbar().then(() => {\n        if (this.div?.classList.contains(\"selectedEditor\")) {\n          this._editToolbar?.show();\n        }\n      });\n      return;\n    }\n    this._editToolbar?.show();\n    this.#altText?.toggleAltTextBadge(false);\n  }\n  focus() {\n    if (this.div && !this.div.contains(document.activeElement)) {\n      setTimeout(() => this.div?.focus({\n        preventScroll: true\n      }), 0);\n    }\n  }\n  unselect() {\n    if (!this.isSelected) {\n      return;\n    }\n    this.isSelected = false;\n    this.#resizersDiv?.classList.add(\"hidden\");\n    this.div?.classList.remove(\"selectedEditor\");\n    if (this.div?.contains(document.activeElement)) {\n      this._uiManager.currentLayer.div.focus({\n        preventScroll: true\n      });\n    }\n    this._editToolbar?.hide();\n    this.#altText?.toggleAltTextBadge(true);\n    this.hideCommentPopup();\n  }\n  hideCommentPopup() {\n    if (this.hasComment) {\n      this._uiManager.toggleComment(null);\n    }\n  }\n  updateParams(type, value) {}\n  disableEditing() {}\n  enableEditing() {}\n  get canChangeContent() {\n    return false;\n  }\n  enterInEditMode() {\n    if (!this.canChangeContent) {\n      return;\n    }\n    this.enableEditMode();\n    this.div.focus();\n  }\n  dblclick(event) {\n    if (event.target.nodeName === \"BUTTON\") {\n      return;\n    }\n    this.enterInEditMode();\n    this.parent.updateToolbar({\n      mode: this.constructor._editorType,\n      editId: this.uid\n    });\n  }\n  getElementForAltText() {\n    return this.div;\n  }\n  get contentDiv() {\n    return this.div;\n  }\n  get isEditing() {\n    return this.#isEditing;\n  }\n  set isEditing(value) {\n    this.#isEditing = value;\n    if (!this.parent) {\n      return;\n    }\n    if (value) {\n      this.parent.setSelected(this);\n      this.parent.setActiveEditor(this);\n    } else {\n      this.parent.setActiveEditor(null);\n    }\n  }\n  static get MIN_SIZE() {\n    return 16;\n  }\n  static canCreateNewEmptyEditor() {\n    return true;\n  }\n  get telemetryInitialData() {\n    return {\n      action: \"added\"\n    };\n  }\n  get telemetryFinalData() {\n    return null;\n  }\n  _reportTelemetry(data, mustWait = false) {\n    if (mustWait) {\n      this.#telemetryTimeouts ||= new Map();\n      const {\n        action\n      } = data;\n      let timeout = this.#telemetryTimeouts.get(action);\n      if (timeout) {\n        clearTimeout(timeout);\n      }\n      timeout = setTimeout(() => {\n        this._reportTelemetry(data);\n        this.#telemetryTimeouts.delete(action);\n        if (this.#telemetryTimeouts.size === 0) {\n          this.#telemetryTimeouts = null;\n        }\n      }, AnnotationEditor._telemetryTimeout);\n      this.#telemetryTimeouts.set(action, timeout);\n      return;\n    }\n    data.type ||= this.editorType;\n    this._uiManager._eventBus.dispatch(\"reporttelemetry\", {\n      source: this,\n      details: {\n        type: \"editing\",\n        data\n      }\n    });\n  }\n  show(visible = this._isVisible) {\n    this.div.classList.toggle(\"hidden\", !visible);\n    this._isVisible = visible;\n  }\n  enable() {\n    if (this.div) {\n      this.div.tabIndex = 0;\n    }\n    this.#disabled = false;\n  }\n  disable() {\n    if (this.div) {\n      this.div.tabIndex = -1;\n    }\n    this.#disabled = true;\n  }\n  updateFakeAnnotationElement(annotationLayer) {\n    if (!this.#fakeAnnotation && !this.deleted) {\n      this.#fakeAnnotation = annotationLayer.addFakeAnnotation(this);\n      return;\n    }\n    if (this.deleted) {\n      this.#fakeAnnotation.remove();\n      this.#fakeAnnotation = null;\n      return;\n    }\n    if (this.hasEditedComment || this._hasBeenMoved || this._hasBeenResized) {\n      this.#fakeAnnotation.updateEdited({\n        rect: this.getPDFRect(),\n        popup: this.comment\n      });\n    }\n  }\n  renderAnnotationElement(annotation) {\n    if (this.deleted) {\n      annotation.hide();\n      return null;\n    }\n    let content = annotation.container.querySelector(\".annotationContent\");\n    if (!content) {\n      content = document.createElement(\"div\");\n      content.classList.add(\"annotationContent\", this.editorType);\n      annotation.container.prepend(content);\n    } else if (content.nodeName === \"CANVAS\") {\n      const canvas = content;\n      content = document.createElement(\"div\");\n      content.classList.add(\"annotationContent\", this.editorType);\n      canvas.before(content);\n    }\n    return content;\n  }\n  resetAnnotationElement(annotation) {\n    const {\n      firstElementChild\n    } = annotation.container;\n    if (firstElementChild?.nodeName === \"DIV\" && firstElementChild.classList.contains(\"annotationContent\")) {\n      firstElementChild.remove();\n    }\n  }\n}\nclass FakeEditor extends AnnotationEditor {\n  constructor(params) {\n    super(params);\n    this.annotationElementId = params.annotationElementId;\n    this.deleted = true;\n  }\n  serialize() {\n    return this.serializeDeleted();\n  }\n}\n\n;// ./src/shared/murmurhash3.js\n\n\n\n\n\n\n\n\nconst SEED = 0xc3d2e1f0;\nconst MASK_HIGH = 0xffff0000;\nconst MASK_LOW = 0xffff;\nclass MurmurHash3_64 {\n  constructor(seed) {\n    this.h1 = seed ? seed & 0xffffffff : SEED;\n    this.h2 = seed ? seed & 0xffffffff : SEED;\n  }\n  update(input) {\n    let data, length;\n    if (typeof input === \"string\") {\n      data = new Uint8Array(input.length * 2);\n      length = 0;\n      for (let i = 0, ii = input.length; i < ii; i++) {\n        const code = input.charCodeAt(i);\n        if (code <= 0xff) {\n          data[length++] = code;\n        } else {\n          data[length++] = code >>> 8;\n          data[length++] = code & 0xff;\n        }\n      }\n    } else if (ArrayBuffer.isView(input)) {\n      data = input.slice();\n      length = data.byteLength;\n    } else {\n      throw new Error(\"Invalid data format, must be a string or TypedArray.\");\n    }\n    const blockCounts = length >> 2;\n    const tailLength = length - blockCounts * 4;\n    const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);\n    let k1 = 0,\n      k2 = 0;\n    let h1 = this.h1,\n      h2 = this.h2;\n    const C1 = 0xcc9e2d51,\n      C2 = 0x1b873593;\n    const C1_LOW = C1 & MASK_LOW,\n      C2_LOW = C2 & MASK_LOW;\n    for (let i = 0; i < blockCounts; i++) {\n      if (i & 1) {\n        k1 = dataUint32[i];\n        k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;\n        k1 = k1 << 15 | k1 >>> 17;\n        k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;\n        h1 ^= k1;\n        h1 = h1 << 13 | h1 >>> 19;\n        h1 = h1 * 5 + 0xe6546b64;\n      } else {\n        k2 = dataUint32[i];\n        k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW;\n        k2 = k2 << 15 | k2 >>> 17;\n        k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW;\n        h2 ^= k2;\n        h2 = h2 << 13 | h2 >>> 19;\n        h2 = h2 * 5 + 0xe6546b64;\n      }\n    }\n    k1 = 0;\n    switch (tailLength) {\n      case 3:\n        k1 ^= data[blockCounts * 4 + 2] << 16;\n      case 2:\n        k1 ^= data[blockCounts * 4 + 1] << 8;\n      case 1:\n        k1 ^= data[blockCounts * 4];\n        k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;\n        k1 = k1 << 15 | k1 >>> 17;\n        k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;\n        if (blockCounts & 1) {\n          h1 ^= k1;\n        } else {\n          h2 ^= k1;\n        }\n    }\n    this.h1 = h1;\n    this.h2 = h2;\n  }\n  hexdigest() {\n    let h1 = this.h1,\n      h2 = this.h2;\n    h1 ^= h2 >>> 1;\n    h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW;\n    h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16;\n    h1 ^= h2 >>> 1;\n    h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW;\n    h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16;\n    h1 ^= h2 >>> 1;\n    return (h1 >>> 0).toString(16).padStart(8, \"0\") + (h2 >>> 0).toString(16).padStart(8, \"0\");\n  }\n}\n\n;// ./src/display/annotation_storage.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst SerializableEmpty = Object.freeze({\n  map: null,\n  hash: \"\",\n  transfer: undefined\n});\nclass AnnotationStorage {\n  #modified = false;\n  #modifiedIds = null;\n  #editorsMap = null;\n  #storage = new Map();\n  onSetModified = null;\n  onResetModified = null;\n  onAnnotationEditor = null;\n  getValue(key, defaultValue) {\n    const value = this.#storage.get(key);\n    if (value === undefined) {\n      return defaultValue;\n    }\n    return Object.assign(defaultValue, value);\n  }\n  getRawValue(key) {\n    return this.#storage.get(key);\n  }\n  remove(key) {\n    const storedValue = this.#storage.get(key);\n    if (storedValue === undefined) {\n      return;\n    }\n    if (storedValue instanceof AnnotationEditor) {\n      this.#editorsMap.delete(storedValue.annotationElementId);\n    }\n    this.#storage.delete(key);\n    if (this.#storage.size === 0) {\n      this.resetModified();\n    }\n    if (this.#storage.values().some(v => v instanceof AnnotationEditor)) {\n      return;\n    }\n    this.onAnnotationEditor?.(null);\n  }\n  setValue(key, value) {\n    const obj = this.#storage.get(key);\n    let modified = false;\n    if (obj !== undefined) {\n      for (const [entry, val] of Object.entries(value)) {\n        if (obj[entry] !== val) {\n          modified = true;\n          obj[entry] = val;\n        }\n      }\n    } else {\n      modified = true;\n      this.#storage.set(key, value);\n    }\n    if (modified) {\n      this.#setModified();\n    }\n    if (value instanceof AnnotationEditor) {\n      (this.#editorsMap ||= new Map()).set(value.annotationElementId, value);\n      this.onAnnotationEditor?.(value.constructor._type);\n    }\n  }\n  has(key) {\n    return this.#storage.has(key);\n  }\n  get size() {\n    return this.#storage.size;\n  }\n  #setModified() {\n    if (!this.#modified) {\n      this.#modified = true;\n      this.onSetModified?.();\n    }\n  }\n  resetModified() {\n    if (this.#modified) {\n      this.#modified = false;\n      this.onResetModified?.();\n    }\n  }\n  get print() {\n    return new PrintAnnotationStorage(this);\n  }\n  get serializable() {\n    if (this.#storage.size === 0) {\n      return SerializableEmpty;\n    }\n    const map = new Map(),\n      hash = new MurmurHash3_64(),\n      transfer = [];\n    const context = Object.create(null);\n    let hasBitmap = false;\n    for (const [key, val] of this.#storage) {\n      const serialized = val instanceof AnnotationEditor ? val.serialize(false, context) : val;\n      if (val.page) {\n        val.pageIndex = val.page._pageIndex;\n        delete val.page;\n      }\n      if (serialized) {\n        map.set(key, serialized);\n        hash.update(`${key}:${JSON.stringify(serialized)}`);\n        hasBitmap ||= !!serialized.bitmap;\n      }\n    }\n    if (hasBitmap) {\n      for (const value of map.values()) {\n        if (value.bitmap) {\n          transfer.push(value.bitmap);\n        }\n      }\n    }\n    return map.size > 0 ? {\n      map,\n      hash: hash.hexdigest(),\n      transfer\n    } : SerializableEmpty;\n  }\n  get editorStats() {\n    let stats = null;\n    const typeToEditor = new Map();\n    let numberOfEditedComments = 0;\n    let numberOfDeletedComments = 0;\n    for (const value of this.#storage.values()) {\n      if (!(value instanceof AnnotationEditor)) {\n        if (value.popup) {\n          if (value.popup.deleted) {\n            numberOfDeletedComments += 1;\n          } else {\n            numberOfEditedComments += 1;\n          }\n        }\n        continue;\n      }\n      if (value.isCommentDeleted) {\n        numberOfDeletedComments += 1;\n      } else if (value.hasEditedComment) {\n        numberOfEditedComments += 1;\n      }\n      const editorStats = value.telemetryFinalData;\n      if (!editorStats) {\n        continue;\n      }\n      const {\n        type\n      } = editorStats;\n      if (!typeToEditor.has(type)) {\n        typeToEditor.set(type, Object.getPrototypeOf(value).constructor);\n      }\n      stats ||= Object.create(null);\n      const map = stats[type] ||= new Map();\n      for (const [key, val] of Object.entries(editorStats)) {\n        if (key === \"type\") {\n          continue;\n        }\n        const counters = map.getOrInsertComputed(key, makeMap);\n        counters.set(val, (counters.get(val) ?? 0) + 1);\n      }\n    }\n    if (numberOfDeletedComments > 0 || numberOfEditedComments > 0) {\n      stats ||= Object.create(null);\n      stats.comments = {\n        deleted: numberOfDeletedComments,\n        edited: numberOfEditedComments\n      };\n    }\n    if (!stats) {\n      return null;\n    }\n    for (const [type, editor] of typeToEditor) {\n      stats[type] = editor.computeTelemetryFinalData(stats[type]);\n    }\n    return stats;\n  }\n  resetModifiedIds() {\n    this.#modifiedIds = null;\n  }\n  updateEditor(annotationId, data) {\n    const value = this.#editorsMap?.get(annotationId);\n    if (value) {\n      value.updateFromAnnotationLayer(data);\n      return true;\n    }\n    return false;\n  }\n  getEditor(annotationId) {\n    return this.#editorsMap?.get(annotationId) || null;\n  }\n  get modifiedIds() {\n    if (this.#modifiedIds) {\n      return this.#modifiedIds;\n    }\n    const ids = [];\n    if (this.#editorsMap) {\n      for (const value of this.#editorsMap.values()) {\n        if (!value.serialize()) {\n          continue;\n        }\n        ids.push(value.annotationElementId);\n      }\n    }\n    let hash = \"\";\n    if (ids.length) {\n      const h = new MurmurHash3_64();\n      h.update(ids.join(\",\"));\n      hash = h.hexdigest();\n    }\n    return this.#modifiedIds = {\n      ids: new Set(ids),\n      hash\n    };\n  }\n  [Symbol.iterator]() {\n    return this.#storage.entries();\n  }\n}\nclass PrintAnnotationStorage extends AnnotationStorage {\n  #serializable = SerializableEmpty;\n  constructor(parent) {\n    super();\n    const {\n      serializable\n    } = parent;\n    if (serializable === SerializableEmpty) {\n      return;\n    }\n    const {\n      map,\n      hash,\n      transfer\n    } = serializable;\n    const clone = structuredClone(map, transfer ? {\n      transfer\n    } : null);\n    this.#serializable = {\n      map: clone,\n      hash,\n      transfer: []\n    };\n  }\n  get print() {\n    unreachable(\"Should not call PrintAnnotationStorage.print\");\n  }\n  get serializable() {\n    return this.#serializable;\n  }\n  get modifiedIds() {\n    return shadow(this, \"modifiedIds\", {\n      ids: new Set(),\n      hash: \"\"\n    });\n  }\n}\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.for-each.js\nvar es_iterator_for_each = __webpack_require__(7588);\n;// ./src/display/canvas_dependency_tracker.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst FORCED_DEPENDENCY_LABEL = \"__forcedDependency\";\nconst {\n  floor,\n  ceil\n} = Math;\nfunction expandBBox(array, index, minX, minY, maxX, maxY) {\n  array[index * 4 + 0] = Math.min(array[index * 4 + 0], minX);\n  array[index * 4 + 1] = Math.min(array[index * 4 + 1], minY);\n  array[index * 4 + 2] = Math.max(array[index * 4 + 2], maxX);\n  array[index * 4 + 3] = Math.max(array[index * 4 + 3], maxY);\n}\nconst EMPTY_BBOX = new Uint32Array(new Uint8Array([255, 255, 0, 0]).buffer)[0];\nclass BBoxReader {\n  #bboxes;\n  #coords;\n  constructor(bboxes, coords) {\n    this.#bboxes = bboxes;\n    this.#coords = coords;\n  }\n  get length() {\n    return this.#bboxes.length;\n  }\n  isEmpty(i) {\n    return this.#bboxes[i] === EMPTY_BBOX;\n  }\n  minX(i) {\n    return this.#coords[i * 4 + 0] / 256;\n  }\n  minY(i) {\n    return this.#coords[i * 4 + 1] / 256;\n  }\n  maxX(i) {\n    return (this.#coords[i * 4 + 2] + 1) / 256;\n  }\n  maxY(i) {\n    return (this.#coords[i * 4 + 3] + 1) / 256;\n  }\n}\nconst ensureDebugMetadata = (map, key) => map?.getOrInsertComputed(key, () => ({\n  dependencies: new Set(),\n  isRenderingOperation: false\n}));\nclass CanvasBBoxTracker {\n  #baseTransformStack = [[1, 0, 0, 1, 0, 0]];\n  #clipBox = [-Infinity, -Infinity, Infinity, Infinity];\n  #pendingBBox = new Float64Array(BBOX_INIT);\n  _pendingBBoxIdx = -1;\n  #canvasWidth;\n  #canvasHeight;\n  #bboxesCoords;\n  #bboxes;\n  _savesStack = [];\n  _markedContentStack = [];\n  constructor(canvas, operationsCount) {\n    this.#canvasWidth = canvas.width;\n    this.#canvasHeight = canvas.height;\n    this.#initializeBBoxes(operationsCount);\n  }\n  growOperationsCount(operationsCount) {\n    if (operationsCount >= this.#bboxes.length) {\n      this.#initializeBBoxes(operationsCount, this.#bboxes);\n    }\n  }\n  #initializeBBoxes(operationsCount, oldBBoxes) {\n    const buffer = new ArrayBuffer(operationsCount * 4);\n    this.#bboxesCoords = new Uint8ClampedArray(buffer);\n    this.#bboxes = new Uint32Array(buffer);\n    if (oldBBoxes && oldBBoxes.length > 0) {\n      this.#bboxes.set(oldBBoxes);\n      this.#bboxes.fill(EMPTY_BBOX, oldBBoxes.length);\n    } else {\n      this.#bboxes.fill(EMPTY_BBOX);\n    }\n  }\n  get clipBox() {\n    return this.#clipBox;\n  }\n  save(opIdx) {\n    this.#clipBox = {\n      __proto__: this.#clipBox\n    };\n    this._savesStack.push(opIdx);\n    return this;\n  }\n  restore(opIdx, onSavePopped) {\n    const previous = Object.getPrototypeOf(this.#clipBox);\n    if (previous === null) {\n      return this;\n    }\n    this.#clipBox = previous;\n    const lastSave = this._savesStack.pop();\n    if (lastSave !== undefined) {\n      onSavePopped?.(lastSave, opIdx);\n      this.#bboxes[opIdx] = this.#bboxes[lastSave];\n    }\n    return this;\n  }\n  recordOpenMarker(idx) {\n    this._savesStack.push(idx);\n    return this;\n  }\n  getOpenMarker() {\n    if (this._savesStack.length === 0) {\n      return null;\n    }\n    return this._savesStack.at(-1);\n  }\n  recordCloseMarker(opIdx, onSavePopped) {\n    const lastSave = this._savesStack.pop();\n    if (lastSave !== undefined) {\n      onSavePopped?.(lastSave, opIdx);\n      this.#bboxes[opIdx] = this.#bboxes[lastSave];\n    }\n    return this;\n  }\n  beginMarkedContent(opIdx) {\n    this._markedContentStack.push(opIdx);\n    return this;\n  }\n  endMarkedContent(opIdx, onSavePopped) {\n    const lastSave = this._markedContentStack.pop();\n    if (lastSave !== undefined) {\n      onSavePopped?.(lastSave, opIdx);\n      this.#bboxes[opIdx] = this.#bboxes[lastSave];\n    }\n    return this;\n  }\n  pushBaseTransform(ctx) {\n    this.#baseTransformStack.push(Util.multiplyByDOMMatrix(this.#baseTransformStack.at(-1), ctx.getTransform()));\n    return this;\n  }\n  popBaseTransform() {\n    if (this.#baseTransformStack.length > 1) {\n      this.#baseTransformStack.pop();\n    }\n    return this;\n  }\n  resetBBox(idx) {\n    if (this._pendingBBoxIdx !== idx) {\n      this._pendingBBoxIdx = idx;\n      this.#pendingBBox.set(BBOX_INIT, 0);\n    }\n    return this;\n  }\n  recordClipBox(idx, ctx, minX, maxX, minY, maxY) {\n    const transform = Util.multiplyByDOMMatrix(this.#baseTransformStack.at(-1), ctx.getTransform());\n    const clipBox = BBOX_INIT.slice();\n    Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, clipBox);\n    const intersection = Util.intersect(this.#clipBox, clipBox);\n    if (intersection) {\n      this.#clipBox[0] = intersection[0];\n      this.#clipBox[1] = intersection[1];\n      this.#clipBox[2] = intersection[2];\n      this.#clipBox[3] = intersection[3];\n    } else {\n      this.#clipBox[0] = this.#clipBox[1] = Infinity;\n      this.#clipBox[2] = this.#clipBox[3] = -Infinity;\n    }\n    return this;\n  }\n  recordBBox(idx, ctx, minX, maxX, minY, maxY) {\n    const clipBox = this.#clipBox;\n    if (clipBox[0] === Infinity) {\n      return this;\n    }\n    const transform = Util.multiplyByDOMMatrix(this.#baseTransformStack.at(-1), ctx.getTransform());\n    if (clipBox[0] === -Infinity) {\n      Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, this.#pendingBBox);\n      return this;\n    }\n    const bbox = BBOX_INIT.slice();\n    Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, bbox);\n    this.#pendingBBox[0] = MathClamp(bbox[0], clipBox[0], this.#pendingBBox[0]);\n    this.#pendingBBox[1] = MathClamp(bbox[1], clipBox[1], this.#pendingBBox[1]);\n    this.#pendingBBox[2] = MathClamp(bbox[2], this.#pendingBBox[2], clipBox[2]);\n    this.#pendingBBox[3] = MathClamp(bbox[3], this.#pendingBBox[3], clipBox[3]);\n    return this;\n  }\n  recordFullPageBBox(idx) {\n    this.#pendingBBox[0] = Math.max(0, this.#clipBox[0]);\n    this.#pendingBBox[1] = Math.max(0, this.#clipBox[1]);\n    this.#pendingBBox[2] = Math.min(this.#canvasWidth, this.#clipBox[2]);\n    this.#pendingBBox[3] = Math.min(this.#canvasHeight, this.#clipBox[3]);\n    return this;\n  }\n  recordOperation(idx, preserve = false, dependencyLists) {\n    if (this._pendingBBoxIdx !== idx) {\n      return this;\n    }\n    const minX = floor(this.#pendingBBox[0] * 256 / this.#canvasWidth);\n    const minY = floor(this.#pendingBBox[1] * 256 / this.#canvasHeight);\n    const maxX = ceil(this.#pendingBBox[2] * 256 / this.#canvasWidth);\n    const maxY = ceil(this.#pendingBBox[3] * 256 / this.#canvasHeight);\n    expandBBox(this.#bboxesCoords, idx, minX, minY, maxX, maxY);\n    if (dependencyLists) {\n      for (const dependencies of dependencyLists) {\n        for (const depIdx of dependencies) {\n          if (depIdx !== idx) {\n            expandBBox(this.#bboxesCoords, depIdx, minX, minY, maxX, maxY);\n          }\n        }\n      }\n    }\n    if (!preserve) {\n      this._pendingBBoxIdx = -1;\n    }\n    return this;\n  }\n  bboxToClipBoxDropOperation(idx) {\n    if (this._pendingBBoxIdx === idx) {\n      this._pendingBBoxIdx = -1;\n      this.#clipBox[0] = Math.max(this.#clipBox[0], this.#pendingBBox[0]);\n      this.#clipBox[1] = Math.max(this.#clipBox[1], this.#pendingBBox[1]);\n      this.#clipBox[2] = Math.min(this.#clipBox[2], this.#pendingBBox[2]);\n      this.#clipBox[3] = Math.min(this.#clipBox[3], this.#pendingBBox[3]);\n    }\n    return this;\n  }\n  take() {\n    return new BBoxReader(this.#bboxes, this.#bboxesCoords);\n  }\n  takeDebugMetadata() {\n    throw new Error(\"Unreachable\");\n  }\n  recordSimpleData(name, idx) {\n    return this;\n  }\n  recordIncrementalData(name, idx) {\n    return this;\n  }\n  resetIncrementalData(name, idx) {\n    return this;\n  }\n  recordNamedData(name, idx) {\n    return this;\n  }\n  recordSimpleDataFromNamed(name, depName, fallbackIdx) {\n    return this;\n  }\n  recordFutureForcedDependency(name, idx) {\n    return this;\n  }\n  inheritSimpleDataAsFutureForcedDependencies(names) {\n    return this;\n  }\n  inheritPendingDependenciesAsFutureForcedDependencies() {\n    return this;\n  }\n  recordCharacterBBox(idx, ctx, font, scale = 1, x = 0, y = 0, getMeasure) {\n    return this;\n  }\n  getSimpleIndex(dependencyName) {\n    return undefined;\n  }\n  recordDependencies(idx, dependencyNames) {\n    return this;\n  }\n  recordNamedDependency(idx, name) {\n    return this;\n  }\n  recordShowTextOperation(idx, preserve = false) {\n    return this;\n  }\n}\nclass CanvasDependencyTracker {\n  #simple = {\n    __proto__: null\n  };\n  #incremental = {\n    __proto__: null,\n    transform: [],\n    moveText: [],\n    sameLineText: [],\n    [FORCED_DEPENDENCY_LABEL]: []\n  };\n  #namedDependencies = new Map();\n  #pendingDependencies = new Set();\n  #fontBBoxTrustworthy = new Map();\n  #debugMetadata;\n  #recordDebugMetadataDepenencyAfterRestore;\n  #bboxTracker;\n  constructor(bboxTracker, recordDebugMetadata = false) {\n    this.#bboxTracker = bboxTracker;\n    if (recordDebugMetadata) {\n      this.#debugMetadata = new Map();\n      this.#recordDebugMetadataDepenencyAfterRestore = (lastSave, opIdx) => {\n        ensureDebugMetadata(this.#debugMetadata, opIdx).dependencies.add(lastSave);\n      };\n    }\n  }\n  get clipBox() {\n    return this.#bboxTracker.clipBox;\n  }\n  growOperationsCount(operationsCount) {\n    this.#bboxTracker.growOperationsCount(operationsCount);\n  }\n  save(opIdx) {\n    this.#simple = {\n      __proto__: this.#simple\n    };\n    this.#incremental = {\n      __proto__: this.#incremental,\n      transform: {\n        __proto__: this.#incremental.transform\n      },\n      moveText: {\n        __proto__: this.#incremental.moveText\n      },\n      sameLineText: {\n        __proto__: this.#incremental.sameLineText\n      },\n      [FORCED_DEPENDENCY_LABEL]: {\n        __proto__: this.#incremental[FORCED_DEPENDENCY_LABEL]\n      }\n    };\n    this.#bboxTracker.save(opIdx);\n    return this;\n  }\n  restore(opIdx) {\n    this.#bboxTracker.restore(opIdx, this.#recordDebugMetadataDepenencyAfterRestore);\n    const previous = Object.getPrototypeOf(this.#simple);\n    if (previous === null) {\n      return this;\n    }\n    this.#simple = previous;\n    this.#incremental = Object.getPrototypeOf(this.#incremental);\n    return this;\n  }\n  recordOpenMarker(opIdx) {\n    this.#bboxTracker.recordOpenMarker(opIdx, this.#recordDebugMetadataDepenencyAfterRestore);\n    return this;\n  }\n  getOpenMarker() {\n    return this.#bboxTracker.getOpenMarker();\n  }\n  recordCloseMarker(opIdx) {\n    this.#bboxTracker.recordCloseMarker(opIdx, this.#recordDebugMetadataDepenencyAfterRestore);\n    return this;\n  }\n  beginMarkedContent(opIdx) {\n    this.#bboxTracker.beginMarkedContent(opIdx);\n    return this;\n  }\n  endMarkedContent(opIdx) {\n    this.#bboxTracker.endMarkedContent(opIdx, this.#recordDebugMetadataDepenencyAfterRestore);\n    return this;\n  }\n  pushBaseTransform(ctx) {\n    this.#bboxTracker.pushBaseTransform(ctx);\n    return this;\n  }\n  popBaseTransform() {\n    this.#bboxTracker.popBaseTransform();\n    return this;\n  }\n  recordSimpleData(name, idx) {\n    this.#simple[name] = idx;\n    return this;\n  }\n  recordIncrementalData(name, idx) {\n    this.#incremental[name].push(idx);\n    return this;\n  }\n  resetIncrementalData(name, idx) {\n    this.#incremental[name].length = 0;\n    return this;\n  }\n  recordNamedData(name, idx) {\n    this.#namedDependencies.set(name, idx);\n    return this;\n  }\n  recordSimpleDataFromNamed(name, depName, fallbackIdx) {\n    this.#simple[name] = this.#namedDependencies.get(depName) ?? fallbackIdx;\n  }\n  recordFutureForcedDependency(name, idx) {\n    this.recordIncrementalData(FORCED_DEPENDENCY_LABEL, idx);\n    return this;\n  }\n  inheritSimpleDataAsFutureForcedDependencies(names) {\n    for (const name of names) {\n      if (name in this.#simple) {\n        this.recordFutureForcedDependency(name, this.#simple[name]);\n      }\n    }\n    return this;\n  }\n  inheritPendingDependenciesAsFutureForcedDependencies() {\n    for (const dep of this.#pendingDependencies) {\n      this.recordFutureForcedDependency(FORCED_DEPENDENCY_LABEL, dep);\n    }\n    return this;\n  }\n  resetBBox(idx) {\n    this.#bboxTracker.resetBBox(idx);\n    return this;\n  }\n  recordClipBox(idx, ctx, minX, maxX, minY, maxY) {\n    this.#bboxTracker.recordClipBox(idx, ctx, minX, maxX, minY, maxY);\n    return this;\n  }\n  recordBBox(idx, ctx, minX, maxX, minY, maxY) {\n    this.#bboxTracker.recordBBox(idx, ctx, minX, maxX, minY, maxY);\n    return this;\n  }\n  recordCharacterBBox(idx, ctx, font, scale = 1, x = 0, y = 0, getMeasure) {\n    const fontBBox = font.bbox;\n    let isBBoxTrustworthy;\n    let computedBBox;\n    if (fontBBox) {\n      isBBoxTrustworthy = fontBBox[2] !== fontBBox[0] && fontBBox[3] !== fontBBox[1] && this.#fontBBoxTrustworthy.get(font);\n      if (isBBoxTrustworthy !== false) {\n        computedBBox = [0, 0, 0, 0];\n        Util.axialAlignedBoundingBox(fontBBox, font.fontMatrix, computedBBox);\n        if (scale !== 1 || x !== 0 || y !== 0) {\n          Util.scaleMinMax([scale, 0, 0, -scale, x, y], computedBBox);\n        }\n        if (isBBoxTrustworthy) {\n          return this.recordBBox(idx, ctx, computedBBox[0], computedBBox[2], computedBBox[1], computedBBox[3]);\n        }\n      }\n    }\n    if (!getMeasure) {\n      return this.recordFullPageBBox(idx);\n    }\n    const measure = getMeasure();\n    if (fontBBox && computedBBox && isBBoxTrustworthy === undefined) {\n      isBBoxTrustworthy = computedBBox[0] <= x - measure.actualBoundingBoxLeft && computedBBox[2] >= x + measure.actualBoundingBoxRight && computedBBox[1] <= y - measure.actualBoundingBoxAscent && computedBBox[3] >= y + measure.actualBoundingBoxDescent;\n      this.#fontBBoxTrustworthy.set(font, isBBoxTrustworthy);\n      if (isBBoxTrustworthy) {\n        return this.recordBBox(idx, ctx, computedBBox[0], computedBBox[2], computedBBox[1], computedBBox[3]);\n      }\n    }\n    return this.recordBBox(idx, ctx, x - measure.actualBoundingBoxLeft, x + measure.actualBoundingBoxRight, y - measure.actualBoundingBoxAscent, y + measure.actualBoundingBoxDescent);\n  }\n  recordFullPageBBox(idx) {\n    this.#bboxTracker.recordFullPageBBox(idx);\n    return this;\n  }\n  getSimpleIndex(dependencyName) {\n    return this.#simple[dependencyName];\n  }\n  recordDependencies(idx, dependencyNames) {\n    const pendingDependencies = this.#pendingDependencies;\n    const simple = this.#simple;\n    const incremental = this.#incremental;\n    for (const name of dependencyNames) {\n      if (name in this.#simple) {\n        pendingDependencies.add(simple[name]);\n      } else if (name in incremental) {\n        incremental[name].forEach(pendingDependencies.add, pendingDependencies);\n      }\n    }\n    return this;\n  }\n  recordNamedDependency(idx, name) {\n    if (this.#namedDependencies.has(name)) {\n      this.#pendingDependencies.add(this.#namedDependencies.get(name));\n    }\n    return this;\n  }\n  recordOperation(idx, preserve = false) {\n    this.recordDependencies(idx, [FORCED_DEPENDENCY_LABEL]);\n    if (this.#debugMetadata) {\n      const metadata = ensureDebugMetadata(this.#debugMetadata, idx);\n      const {\n        dependencies\n      } = metadata;\n      this.#pendingDependencies.forEach(dependencies.add, dependencies);\n      this.#bboxTracker._savesStack.forEach(dependencies.add, dependencies);\n      this.#bboxTracker._markedContentStack.forEach(dependencies.add, dependencies);\n      dependencies.delete(idx);\n      metadata.isRenderingOperation = true;\n    }\n    const needsCleanup = !preserve && idx === this.#bboxTracker._pendingBBoxIdx;\n    this.#bboxTracker.recordOperation(idx, preserve, [this.#pendingDependencies, this.#bboxTracker._savesStack, this.#bboxTracker._markedContentStack]);\n    if (needsCleanup) {\n      this.#pendingDependencies.clear();\n    }\n    return this;\n  }\n  recordShowTextOperation(idx, preserve = false) {\n    const deps = Array.from(this.#pendingDependencies);\n    this.recordOperation(idx, preserve);\n    this.recordIncrementalData(\"sameLineText\", idx);\n    for (const dep of deps) {\n      this.recordIncrementalData(\"sameLineText\", dep);\n    }\n    return this;\n  }\n  bboxToClipBoxDropOperation(idx, preserve = false) {\n    const needsCleanup = !preserve && idx === this.#bboxTracker._pendingBBoxIdx;\n    this.#bboxTracker.bboxToClipBoxDropOperation(idx);\n    if (needsCleanup) {\n      this.#pendingDependencies.clear();\n    }\n    return this;\n  }\n  take() {\n    this.#fontBBoxTrustworthy.clear();\n    return this.#bboxTracker.take();\n  }\n  takeDebugMetadata() {\n    return this.#debugMetadata;\n  }\n}\nclass CanvasNestedDependencyTracker {\n  #dependencyTracker;\n  #opIdx;\n  #ignoreBBoxes;\n  #nestingLevel = 0;\n  #savesLevel = 0;\n  constructor(dependencyTracker, opIdx, ignoreBBoxes) {\n    if (dependencyTracker instanceof CanvasNestedDependencyTracker && dependencyTracker.#ignoreBBoxes === !!ignoreBBoxes) {\n      return dependencyTracker;\n    }\n    this.#dependencyTracker = dependencyTracker;\n    this.#opIdx = opIdx;\n    this.#ignoreBBoxes = !!ignoreBBoxes;\n  }\n  get clipBox() {\n    return this.#dependencyTracker.clipBox;\n  }\n  growOperationsCount() {\n    throw new Error(\"Unreachable\");\n  }\n  save(opIdx) {\n    this.#savesLevel++;\n    this.#dependencyTracker.save(this.#opIdx);\n    return this;\n  }\n  restore(opIdx) {\n    if (this.#savesLevel > 0) {\n      this.#dependencyTracker.restore(this.#opIdx);\n      this.#savesLevel--;\n    }\n    return this;\n  }\n  recordOpenMarker(idx) {\n    this.#nestingLevel++;\n    return this;\n  }\n  getOpenMarker() {\n    return this.#nestingLevel > 0 ? this.#opIdx : this.#dependencyTracker.getOpenMarker();\n  }\n  recordCloseMarker(idx) {\n    this.#nestingLevel--;\n    return this;\n  }\n  beginMarkedContent(opIdx) {\n    return this;\n  }\n  endMarkedContent(opIdx) {\n    return this;\n  }\n  pushBaseTransform(ctx) {\n    this.#dependencyTracker.pushBaseTransform(ctx);\n    return this;\n  }\n  popBaseTransform() {\n    this.#dependencyTracker.popBaseTransform();\n    return this;\n  }\n  recordSimpleData(name, idx) {\n    this.#dependencyTracker.recordSimpleData(name, this.#opIdx);\n    return this;\n  }\n  recordIncrementalData(name, idx) {\n    this.#dependencyTracker.recordIncrementalData(name, this.#opIdx);\n    return this;\n  }\n  resetIncrementalData(name, idx) {\n    this.#dependencyTracker.resetIncrementalData(name, this.#opIdx);\n    return this;\n  }\n  recordNamedData(name, idx) {\n    return this;\n  }\n  recordSimpleDataFromNamed(name, depName, fallbackIdx) {\n    this.#dependencyTracker.recordSimpleDataFromNamed(name, depName, this.#opIdx);\n    return this;\n  }\n  recordFutureForcedDependency(name, idx) {\n    this.#dependencyTracker.recordFutureForcedDependency(name, this.#opIdx);\n    return this;\n  }\n  inheritSimpleDataAsFutureForcedDependencies(names) {\n    this.#dependencyTracker.inheritSimpleDataAsFutureForcedDependencies(names);\n    return this;\n  }\n  inheritPendingDependenciesAsFutureForcedDependencies() {\n    this.#dependencyTracker.inheritPendingDependenciesAsFutureForcedDependencies();\n    return this;\n  }\n  resetBBox(idx) {\n    if (!this.#ignoreBBoxes) {\n      this.#dependencyTracker.resetBBox(this.#opIdx);\n    }\n    return this;\n  }\n  recordClipBox(idx, ctx, minX, maxX, minY, maxY) {\n    if (!this.#ignoreBBoxes) {\n      this.#dependencyTracker.recordClipBox(this.#opIdx, ctx, minX, maxX, minY, maxY);\n    }\n    return this;\n  }\n  recordBBox(idx, ctx, minX, maxX, minY, maxY) {\n    if (!this.#ignoreBBoxes) {\n      this.#dependencyTracker.recordBBox(this.#opIdx, ctx, minX, maxX, minY, maxY);\n    }\n    return this;\n  }\n  recordCharacterBBox(idx, ctx, font, scale, x, y, getMeasure) {\n    if (!this.#ignoreBBoxes) {\n      this.#dependencyTracker.recordCharacterBBox(this.#opIdx, ctx, font, scale, x, y, getMeasure);\n    }\n    return this;\n  }\n  recordFullPageBBox(idx) {\n    if (!this.#ignoreBBoxes) {\n      this.#dependencyTracker.recordFullPageBBox(this.#opIdx);\n    }\n    return this;\n  }\n  getSimpleIndex(dependencyName) {\n    return this.#dependencyTracker.getSimpleIndex(dependencyName);\n  }\n  recordDependencies(idx, dependencyNames) {\n    this.#dependencyTracker.recordDependencies(this.#opIdx, dependencyNames);\n    return this;\n  }\n  recordNamedDependency(idx, name) {\n    this.#dependencyTracker.recordNamedDependency(this.#opIdx, name);\n    return this;\n  }\n  recordOperation(idx) {\n    this.#dependencyTracker.recordOperation(this.#opIdx, true);\n    return this;\n  }\n  recordShowTextOperation(idx) {\n    this.#dependencyTracker.recordShowTextOperation(this.#opIdx, true);\n    return this;\n  }\n  bboxToClipBoxDropOperation(idx) {\n    if (!this.#ignoreBBoxes) {\n      this.#dependencyTracker.bboxToClipBoxDropOperation(this.#opIdx, true);\n    }\n    return this;\n  }\n  take() {\n    throw new Error(\"Unreachable\");\n  }\n  takeDebugMetadata() {\n    throw new Error(\"Unreachable\");\n  }\n}\nconst Dependencies = {\n  stroke: [\"path\", \"transform\", \"filter\", \"strokeColor\", \"strokeAlpha\", \"lineWidth\", \"lineCap\", \"lineJoin\", \"miterLimit\", \"dash\"],\n  fill: [\"path\", \"transform\", \"filter\", \"fillColor\", \"fillAlpha\", \"globalCompositeOperation\", \"SMask\"],\n  imageXObject: [\"transform\", \"SMask\", \"filter\", \"fillAlpha\", \"strokeAlpha\", \"globalCompositeOperation\"],\n  rawFillPath: [\"filter\", \"fillColor\", \"fillAlpha\"],\n  showText: [\"transform\", \"leading\", \"charSpacing\", \"wordSpacing\", \"hScale\", \"textRise\", \"moveText\", \"textMatrix\", \"font\", \"fontObj\", \"filter\", \"fillColor\", \"textRenderingMode\", \"SMask\", \"fillAlpha\", \"strokeAlpha\", \"globalCompositeOperation\", \"sameLineText\"],\n  transform: [\"transform\"],\n  transformAndFill: [\"transform\", \"fillColor\"]\n};\nclass CanvasImagesTracker {\n  #canvasWidth;\n  #canvasHeight;\n  #capacity = 4;\n  #count = 0;\n  #coords = new CanvasImagesTracker.#CoordsArray(this.#capacity * 6);\n  static #CoordsArray = FeatureTest.isFloat16ArraySupported ? Float16Array : Float32Array;\n  constructor(canvas) {\n    this.#canvasWidth = canvas.width;\n    this.#canvasHeight = canvas.height;\n  }\n  record(ctx, width, height, clipBox) {\n    if (this.#count === this.#capacity) {\n      this.#capacity *= 2;\n      const newCoords = new CanvasImagesTracker.#CoordsArray(this.#capacity * 6);\n      newCoords.set(this.#coords);\n      this.#coords = newCoords;\n    }\n    const transform = Util.domMatrixToTransform(ctx.getTransform());\n    let coords;\n    if (clipBox[0] !== Infinity) {\n      const bbox = BBOX_INIT.slice();\n      Util.axialAlignedBoundingBox([0, -height, width, 0], transform, bbox);\n      const finalBBox = Util.intersect(clipBox, bbox);\n      if (!finalBBox) {\n        return;\n      }\n      const [minX, minY, maxX, maxY] = finalBBox;\n      if (minX !== bbox[0] || minY !== bbox[1] || maxX !== bbox[2] || maxY !== bbox[3]) {\n        const rotationAngle = Math.atan2(transform[1], transform[0]);\n        const sin = Math.abs(Math.sin(rotationAngle));\n        const cos = Math.abs(Math.cos(rotationAngle));\n        if (sin < 1e-6 || cos < 1e-6 || Math.abs(sin - cos) < 1e-6) {\n          coords = [minX, minY, minX, maxY, maxX, minY];\n        } else {\n          const finalBBoxWidth = maxX - minX;\n          const finalBBoxHeight = maxY - minY;\n          const sin2 = sin * sin;\n          const cos2 = cos * cos;\n          const cosSin = cos * sin;\n          const denom = cos2 - sin2;\n          const a = (finalBBoxHeight * cos2 - finalBBoxWidth * cosSin) / denom;\n          const b = (finalBBoxHeight * cosSin - finalBBoxWidth * sin2) / denom;\n          coords = [minX + b, minY, minX, minY + a, maxX, maxY - a];\n        }\n      }\n    }\n    if (!coords) {\n      coords = [0, -height, 0, 0, width, -height];\n      Util.applyTransform(coords, transform, 0);\n      Util.applyTransform(coords, transform, 2);\n      Util.applyTransform(coords, transform, 4);\n    }\n    coords[0] /= this.#canvasWidth;\n    coords[1] /= this.#canvasHeight;\n    coords[2] /= this.#canvasWidth;\n    coords[3] /= this.#canvasHeight;\n    coords[4] /= this.#canvasWidth;\n    coords[5] /= this.#canvasHeight;\n    this.#coords.set(coords, this.#count * 6);\n    this.#count++;\n  }\n  take() {\n    return this.#coords.subarray(0, this.#count * 6);\n  }\n}\n\n;// ./src/display/font_loader.js\n\n\n\n\n\n\n\n\n\n\n\nclass FontLoader {\n  #systemFonts = new Set();\n  constructor({\n    ownerDocument = globalThis.document,\n    styleElement = null\n  }) {\n    this._document = ownerDocument;\n    this.nativeFontFaces = new Set();\n    this.styleElement = null;\n    this.loadingRequests = [];\n    this.loadTestFontId = 0;\n  }\n  addNativeFontFace(nativeFontFace) {\n    this.nativeFontFaces.add(nativeFontFace);\n    this._document.fonts.add(nativeFontFace);\n  }\n  removeNativeFontFace(nativeFontFace) {\n    this.nativeFontFaces.delete(nativeFontFace);\n    this._document.fonts.delete(nativeFontFace);\n  }\n  insertRule(rule) {\n    if (!this.styleElement) {\n      this.styleElement = this._document.createElement(\"style\");\n      this._document.documentElement.getElementsByTagName(\"head\")[0].append(this.styleElement);\n    }\n    const styleSheet = this.styleElement.sheet;\n    styleSheet.insertRule(rule, styleSheet.cssRules.length);\n  }\n  clear() {\n    for (const nativeFontFace of this.nativeFontFaces) {\n      this._document.fonts.delete(nativeFontFace);\n    }\n    this.nativeFontFaces.clear();\n    this.#systemFonts.clear();\n    if (this.styleElement) {\n      this.styleElement.remove();\n      this.styleElement = null;\n    }\n  }\n  async loadSystemFont({\n    systemFontInfo: info,\n    disableFontFace,\n    _inspectFont\n  }) {\n    if (!info || this.#systemFonts.has(info.loadedName)) {\n      return;\n    }\n    assert(!disableFontFace, \"loadSystemFont shouldn't be called when `disableFontFace` is set.\");\n    if (this.isFontLoadingAPISupported) {\n      const {\n        loadedName,\n        src,\n        style\n      } = info;\n      const fontFace = new FontFace(loadedName, src, style);\n      this.addNativeFontFace(fontFace);\n      try {\n        await fontFace.load();\n        this.#systemFonts.add(loadedName);\n        _inspectFont?.(info);\n      } catch {\n        warn(`Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`);\n        this.removeNativeFontFace(fontFace);\n      }\n      return;\n    }\n    unreachable(\"Not implemented: loadSystemFont without the Font Loading API.\");\n  }\n  async bind(font) {\n    if (font.attached || font.missingFile && !font.systemFontInfo) {\n      return;\n    }\n    font.attached = true;\n    if (font.systemFontInfo) {\n      await this.loadSystemFont(font);\n      return;\n    }\n    if (this.isFontLoadingAPISupported) {\n      const nativeFontFace = font.createNativeFontFace();\n      if (nativeFontFace) {\n        this.addNativeFontFace(nativeFontFace);\n        try {\n          await nativeFontFace.loaded;\n        } catch (ex) {\n          warn(`Failed to load font '${nativeFontFace.family}': '${ex}'.`);\n          font.disableFontFace = true;\n          throw ex;\n        }\n      }\n      return;\n    }\n    const rule = font.createFontFaceRule();\n    if (rule) {\n      this.insertRule(rule);\n      if (this.isSyncFontLoadingSupported) {\n        return;\n      }\n      await new Promise(resolve => {\n        const request = this._queueLoadingCallback(resolve);\n        this._prepareFontLoadEvent(font, request);\n      });\n    }\n  }\n  get isFontLoadingAPISupported() {\n    const hasFonts = !!this._document?.fonts;\n    return shadow(this, \"isFontLoadingAPISupported\", hasFonts);\n  }\n  get isSyncFontLoadingSupported() {\n    return shadow(this, \"isSyncFontLoadingSupported\", isNodeJS || FeatureTest.platform.isFirefox);\n  }\n  _queueLoadingCallback(callback) {\n    function completeRequest() {\n      assert(!request.done, \"completeRequest() cannot be called twice.\");\n      request.done = true;\n      while (loadingRequests.length > 0 && loadingRequests[0].done) {\n        const otherRequest = loadingRequests.shift();\n        setTimeout(otherRequest.callback, 0);\n      }\n    }\n    const {\n      loadingRequests\n    } = this;\n    const request = {\n      done: false,\n      complete: completeRequest,\n      callback\n    };\n    loadingRequests.push(request);\n    return request;\n  }\n  get _loadTestFont() {\n    const testFont = atob(\"T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA\" + \"FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA\" + \"ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA\" + \"AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1\" + \"AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD\" + \"6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM\" + \"AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D\" + \"IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA\" + \"AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA\" + \"AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB\" + \"AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY\" + \"AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA\" + \"AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" + \"AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" + \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" + \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" + \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" + \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA\" + \"AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC\" + \"AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3\" + \"Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj\" + \"FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==\");\n    return shadow(this, \"_loadTestFont\", testFont);\n  }\n  _prepareFontLoadEvent(font, request) {\n    function int32(data, offset) {\n      return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff;\n    }\n    function string32(value) {\n      return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);\n    }\n    function spliceString(s, offset, remove, insert) {\n      const chunk1 = s.substring(0, offset);\n      const chunk2 = s.substring(offset + remove);\n      return chunk1 + insert + chunk2;\n    }\n    let i, ii;\n    const canvas = this._document.createElement(\"canvas\");\n    canvas.width = 1;\n    canvas.height = 1;\n    const ctx = canvas.getContext(\"2d\");\n    let called = 0;\n    function isFontReady(name, callback) {\n      if (++called > 30) {\n        warn(\"Load test font never loaded.\");\n        callback();\n        return;\n      }\n      ctx.font = \"30px \" + name;\n      ctx.fillText(\".\", 0, 20);\n      const imageData = ctx.getImageData(0, 0, 1, 1);\n      if (imageData.data[3] > 0) {\n        callback();\n        return;\n      }\n      setTimeout(isFontReady.bind(null, name, callback));\n    }\n    const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`;\n    let data = this._loadTestFont;\n    const COMMENT_OFFSET = 976;\n    data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId);\n    const CFF_CHECKSUM_OFFSET = 16;\n    const XXXX_VALUE = 0x58585858;\n    let checksum = int32(data, CFF_CHECKSUM_OFFSET);\n    for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {\n      checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0;\n    }\n    if (i < loadTestFontId.length) {\n      checksum = checksum - XXXX_VALUE + int32(loadTestFontId + \"XXX\", i) | 0;\n    }\n    data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum));\n    const url = `url(data:font/opentype;base64,${btoa(data)});`;\n    const rule = `@font-face {font-family:\"${loadTestFontId}\";src:${url}}`;\n    this.insertRule(rule);\n    const div = this._document.createElement(\"div\");\n    div.style.visibility = \"hidden\";\n    div.style.width = div.style.height = \"10px\";\n    div.style.position = \"absolute\";\n    div.style.top = div.style.left = \"0px\";\n    for (const name of [font.loadedName, loadTestFontId]) {\n      const span = this._document.createElement(\"span\");\n      span.textContent = \"Hi\";\n      span.style.fontFamily = name;\n      div.append(span);\n    }\n    this._document.body.append(div);\n    isFontReady(loadTestFontId, () => {\n      div.remove();\n      request.complete();\n    });\n  }\n}\nclass FontFaceObject {\n  compiledGlyphs = Object.create(null);\n  #fontData;\n  constructor(translatedData, inspectFont = null, charProcOperatorList, extra) {\n    this.#fontData = translatedData;\n    this._inspectFont = inspectFont;\n    if (charProcOperatorList) {\n      this.charProcOperatorList = charProcOperatorList;\n    }\n    if (extra) {\n      Object.assign(this, extra);\n    }\n  }\n  createNativeFontFace() {\n    if (!this.data || this.disableFontFace) {\n      return null;\n    }\n    let nativeFontFace;\n    if (!this.cssFontInfo) {\n      nativeFontFace = new FontFace(this.loadedName, this.data, {});\n    } else {\n      const css = {\n        weight: this.cssFontInfo.fontWeight\n      };\n      if (this.cssFontInfo.italicAngle) {\n        css.style = `oblique ${this.cssFontInfo.italicAngle}deg`;\n      }\n      nativeFontFace = new FontFace(this.cssFontInfo.fontFamily, this.data, css);\n    }\n    this._inspectFont?.(this);\n    return nativeFontFace;\n  }\n  createFontFaceRule() {\n    if (!this.data || this.disableFontFace) {\n      return null;\n    }\n    const url = `url(data:${this.mimetype};base64,${this.data.toBase64()});`;\n    let rule;\n    if (!this.cssFontInfo) {\n      rule = `@font-face {font-family:\"${this.loadedName}\";src:${url}}`;\n    } else {\n      let css = `font-weight: ${this.cssFontInfo.fontWeight};`;\n      if (this.cssFontInfo.italicAngle) {\n        css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`;\n      }\n      rule = `@font-face {font-family:\"${this.cssFontInfo.fontFamily}\";${css}src:${url}}`;\n    }\n    this._inspectFont?.(this, url);\n    return rule;\n  }\n  getPathGenerator(objs, character) {\n    if (this.compiledGlyphs[character] !== undefined) {\n      return this.compiledGlyphs[character];\n    }\n    const objId = this.loadedName + \"_path_\" + character;\n    let cmds;\n    try {\n      cmds = objs.get(objId);\n    } catch (ex) {\n      warn(`getPathGenerator - ignoring character: \"${ex}\".`);\n    }\n    const path = makePathFromDrawOPS(cmds?.path);\n    if (!this.fontExtraProperties) {\n      objs.delete(objId);\n    }\n    return this.compiledGlyphs[character] = path;\n  }\n  get black() {\n    return this.#fontData.black;\n  }\n  get bold() {\n    return this.#fontData.bold;\n  }\n  get disableFontFace() {\n    return this.#fontData.disableFontFace;\n  }\n  set disableFontFace(value) {\n    shadow(this, \"disableFontFace\", !!value);\n  }\n  get fontExtraProperties() {\n    return this.#fontData.fontExtraProperties;\n  }\n  get isInvalidPDFjsFont() {\n    return this.#fontData.isInvalidPDFjsFont;\n  }\n  get isType3Font() {\n    return this.#fontData.isType3Font;\n  }\n  get italic() {\n    return this.#fontData.italic;\n  }\n  get missingFile() {\n    return this.#fontData.missingFile;\n  }\n  get remeasure() {\n    return this.#fontData.remeasure;\n  }\n  get vertical() {\n    return this.#fontData.vertical;\n  }\n  get ascent() {\n    return this.#fontData.ascent;\n  }\n  get defaultWidth() {\n    return this.#fontData.defaultWidth;\n  }\n  get descent() {\n    return this.#fontData.descent;\n  }\n  get bbox() {\n    return this.#fontData.bbox;\n  }\n  get fontMatrix() {\n    return this.#fontData.fontMatrix;\n  }\n  get fallbackName() {\n    return this.#fontData.fallbackName;\n  }\n  get loadedName() {\n    return this.#fontData.loadedName;\n  }\n  get mimetype() {\n    return this.#fontData.mimetype;\n  }\n  get name() {\n    return this.#fontData.name;\n  }\n  get data() {\n    return this.#fontData.data;\n  }\n  clearData() {\n    this.#fontData.clearData();\n  }\n  get cssFontInfo() {\n    return this.#fontData.cssFontInfo;\n  }\n  get systemFontInfo() {\n    return this.#fontData.systemFontInfo;\n  }\n  get defaultVMetrics() {\n    return this.#fontData.defaultVMetrics;\n  }\n}\n\n;// ./src/shared/obj_bin_transform_utils.js\nclass CSS_FONT_INFO {\n  static strings = [\"fontFamily\", \"fontWeight\", \"italicAngle\"];\n}\nclass SYSTEM_FONT_INFO {\n  static strings = [\"css\", \"loadedName\", \"baseFontName\", \"src\"];\n}\nclass FONT_INFO {\n  static bools = [\"black\", \"bold\", \"disableFontFace\", \"fontExtraProperties\", \"isInvalidPDFjsFont\", \"isType3Font\", \"italic\", \"missingFile\", \"remeasure\", \"vertical\"];\n  static numbers = [\"ascent\", \"defaultWidth\", \"descent\"];\n  static strings = [\"fallbackName\", \"loadedName\", \"mimetype\", \"name\"];\n  static OFFSET_NUMBERS = Math.ceil(this.bools.length * 2 / 8);\n  static OFFSET_BBOX = this.OFFSET_NUMBERS + this.numbers.length * 8;\n  static OFFSET_FONT_MATRIX = this.OFFSET_BBOX + 1 + 2 * 4;\n  static OFFSET_DEFAULT_VMETRICS = this.OFFSET_FONT_MATRIX + 1 + 8 * 6;\n  static OFFSET_STRINGS = this.OFFSET_DEFAULT_VMETRICS + 1 + 2 * 3;\n}\nclass PATTERN_INFO {\n  static KIND = 0;\n  static HAS_BBOX = 1;\n  static HAS_BACKGROUND = 2;\n  static SHADING_TYPE = 3;\n  static N_COORD = 4;\n  static N_COLOR = 8;\n  static N_STOP = 12;\n  static N_FIGURES = 16;\n}\n\n;// ./src/display/obj_bin_transform_display.js\n\n\n\n\n\n\n\n\n\n\n\nclass CssFontInfo {\n  #buffer;\n  #decoder = new TextDecoder();\n  #view;\n  constructor(buffer) {\n    this.#buffer = buffer;\n    this.#view = new DataView(buffer);\n  }\n  #readString(index) {\n    assert(index < CSS_FONT_INFO.strings.length, \"Invalid string index\");\n    let offset = 0;\n    for (let i = 0; i < index; i++) {\n      offset += this.#view.getUint32(offset) + 4;\n    }\n    const length = this.#view.getUint32(offset);\n    return this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, length));\n  }\n  get fontFamily() {\n    return this.#readString(0);\n  }\n  get fontWeight() {\n    return this.#readString(1);\n  }\n  get italicAngle() {\n    return this.#readString(2);\n  }\n}\nclass SystemFontInfo {\n  #buffer;\n  #decoder = new TextDecoder();\n  #view;\n  constructor(buffer) {\n    this.#buffer = buffer;\n    this.#view = new DataView(buffer);\n  }\n  get guessFallback() {\n    return this.#view.getUint8(0) !== 0;\n  }\n  #readString(index) {\n    assert(index < SYSTEM_FONT_INFO.strings.length, \"Invalid string index\");\n    let offset = 5;\n    for (let i = 0; i < index; i++) {\n      offset += this.#view.getUint32(offset) + 4;\n    }\n    const length = this.#view.getUint32(offset);\n    return this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, length));\n  }\n  get css() {\n    return this.#readString(0);\n  }\n  get loadedName() {\n    return this.#readString(1);\n  }\n  get baseFontName() {\n    return this.#readString(2);\n  }\n  get src() {\n    return this.#readString(3);\n  }\n  get style() {\n    let offset = 1;\n    offset += 4 + this.#view.getUint32(offset);\n    const styleLength = this.#view.getUint32(offset);\n    const style = this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, styleLength));\n    offset += 4 + styleLength;\n    const weightLength = this.#view.getUint32(offset);\n    const weight = this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, weightLength));\n    return {\n      style,\n      weight\n    };\n  }\n}\nclass FontInfo {\n  #buffer;\n  #decoder = new TextDecoder();\n  #view;\n  constructor({\n    buffer,\n    extra\n  }) {\n    this.#buffer = buffer;\n    this.#view = new DataView(buffer);\n    if (extra) {\n      Object.assign(this, extra);\n    }\n  }\n  #readBoolean(index) {\n    assert(index < FONT_INFO.bools.length, \"Invalid boolean index\");\n    const byteOffset = Math.floor(index / 4);\n    const bitOffset = index * 2 % 8;\n    const value = this.#view.getUint8(byteOffset) >> bitOffset & 0x03;\n    return value === 0x00 ? undefined : value === 0x02;\n  }\n  get black() {\n    return this.#readBoolean(0);\n  }\n  get bold() {\n    return this.#readBoolean(1);\n  }\n  get disableFontFace() {\n    return this.#readBoolean(2);\n  }\n  get fontExtraProperties() {\n    return this.#readBoolean(3);\n  }\n  get isInvalidPDFjsFont() {\n    return this.#readBoolean(4);\n  }\n  get isType3Font() {\n    return this.#readBoolean(5);\n  }\n  get italic() {\n    return this.#readBoolean(6);\n  }\n  get missingFile() {\n    return this.#readBoolean(7);\n  }\n  get remeasure() {\n    return this.#readBoolean(8);\n  }\n  get vertical() {\n    return this.#readBoolean(9);\n  }\n  #readNumber(index) {\n    assert(index < FONT_INFO.numbers.length, \"Invalid number index\");\n    return this.#view.getFloat64(FONT_INFO.OFFSET_NUMBERS + index * 8);\n  }\n  get ascent() {\n    return this.#readNumber(0);\n  }\n  get defaultWidth() {\n    return this.#readNumber(1);\n  }\n  get descent() {\n    return this.#readNumber(2);\n  }\n  #readArray(offset, arrLen, lookupName, increment) {\n    const len = this.#view.getUint8(offset);\n    if (len === 0) {\n      return undefined;\n    }\n    assert(len === arrLen, \"Invalid array length.\");\n    offset += 1;\n    const arr = new Array(len);\n    for (let i = 0; i < len; i++) {\n      arr[i] = this.#view[lookupName](offset, true);\n      offset += increment;\n    }\n    return arr;\n  }\n  get bbox() {\n    return this.#readArray(FONT_INFO.OFFSET_BBOX, 4, \"getInt16\", 2);\n  }\n  get fontMatrix() {\n    return this.#readArray(FONT_INFO.OFFSET_FONT_MATRIX, 6, \"getFloat64\", 8);\n  }\n  get defaultVMetrics() {\n    return this.#readArray(FONT_INFO.OFFSET_DEFAULT_VMETRICS, 3, \"getInt16\", 2);\n  }\n  #readString(index) {\n    assert(index < FONT_INFO.strings.length, \"Invalid string index\");\n    let offset = FONT_INFO.OFFSET_STRINGS + 4;\n    for (let i = 0; i < index; i++) {\n      offset += this.#view.getUint32(offset) + 4;\n    }\n    const length = this.#view.getUint32(offset);\n    return this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, length));\n  }\n  get fallbackName() {\n    return this.#readString(0);\n  }\n  get loadedName() {\n    return this.#readString(1);\n  }\n  get mimetype() {\n    return this.#readString(2);\n  }\n  get name() {\n    return this.#readString(3);\n  }\n  #getDataOffsets() {\n    let offset = FONT_INFO.OFFSET_STRINGS;\n    const stringsLength = this.#view.getUint32(offset);\n    offset += 4 + stringsLength;\n    const systemFontInfoLength = this.#view.getUint32(offset);\n    offset += 4 + systemFontInfoLength;\n    const cssFontInfoLength = this.#view.getUint32(offset);\n    offset += 4 + cssFontInfoLength;\n    const length = this.#view.getUint32(offset);\n    return {\n      offset,\n      length\n    };\n  }\n  get data() {\n    const {\n      offset,\n      length\n    } = this.#getDataOffsets();\n    return length === 0 ? undefined : new Uint8Array(this.#buffer, offset + 4, length);\n  }\n  clearData() {\n    const {\n      offset,\n      length\n    } = this.#getDataOffsets();\n    if (length === 0) {\n      return;\n    }\n    this.#view.setUint32(offset, 0);\n    this.#buffer = new Uint8Array(this.#buffer, 0, offset + 4).slice().buffer;\n    this.#view = new DataView(this.#buffer);\n  }\n  get cssFontInfo() {\n    let offset = FONT_INFO.OFFSET_STRINGS;\n    const stringsLength = this.#view.getUint32(offset);\n    offset += 4 + stringsLength;\n    const systemFontInfoLength = this.#view.getUint32(offset);\n    offset += 4 + systemFontInfoLength;\n    const cssFontInfoLength = this.#view.getUint32(offset);\n    if (cssFontInfoLength === 0) {\n      return null;\n    }\n    const cssFontInfoData = new Uint8Array(cssFontInfoLength);\n    cssFontInfoData.set(new Uint8Array(this.#buffer, offset + 4, cssFontInfoLength));\n    return new CssFontInfo(cssFontInfoData.buffer);\n  }\n  get systemFontInfo() {\n    let offset = FONT_INFO.OFFSET_STRINGS;\n    const stringsLength = this.#view.getUint32(offset);\n    offset += 4 + stringsLength;\n    const systemFontInfoLength = this.#view.getUint32(offset);\n    if (systemFontInfoLength === 0) {\n      return null;\n    }\n    const systemFontInfoData = new Uint8Array(systemFontInfoLength);\n    systemFontInfoData.set(new Uint8Array(this.#buffer, offset + 4, systemFontInfoLength));\n    return new SystemFontInfo(systemFontInfoData.buffer);\n  }\n}\nclass PatternInfo {\n  constructor(buffer) {\n    this.buffer = buffer;\n    this.view = new DataView(buffer);\n    this.data = new Uint8Array(buffer);\n  }\n  getIR() {\n    const dataView = this.view;\n    const kind = this.data[PATTERN_INFO.KIND];\n    const hasBBox = !!this.data[PATTERN_INFO.HAS_BBOX];\n    const hasBackground = !!this.data[PATTERN_INFO.HAS_BACKGROUND];\n    const nCoord = dataView.getUint32(PATTERN_INFO.N_COORD, true);\n    const nColor = dataView.getUint32(PATTERN_INFO.N_COLOR, true);\n    const nStop = dataView.getUint32(PATTERN_INFO.N_STOP, true);\n    let offset = 20;\n    const coords = new Float32Array(this.buffer, offset, nCoord * 2);\n    offset += nCoord * 8;\n    const colors = new Uint8Array(this.buffer, offset, nColor * 4);\n    offset += nColor * 4;\n    const stops = [];\n    for (let i = 0; i < nStop; ++i) {\n      const p = dataView.getFloat32(offset, true);\n      offset += 4;\n      const rgb = dataView.getUint32(offset, true);\n      offset += 4;\n      stops.push([p, `#${rgb.toString(16).padStart(6, \"0\")}`]);\n    }\n    let bbox = null;\n    if (hasBBox) {\n      bbox = [];\n      for (let i = 0; i < 4; ++i) {\n        bbox.push(dataView.getFloat32(offset, true));\n        offset += 4;\n      }\n    }\n    let background = null;\n    if (hasBackground) {\n      background = new Uint8Array(this.buffer, offset, 3);\n      offset += 3;\n    }\n    if (kind === 1) {\n      return [\"RadialAxial\", \"axial\", bbox, stops, Array.from(coords.slice(0, 2)), Array.from(coords.slice(2, 4)), null, null];\n    }\n    if (kind === 2) {\n      return [\"RadialAxial\", \"radial\", bbox, stops, [coords[0], coords[1]], [coords[3], coords[4]], coords[2], coords[5]];\n    }\n    if (kind === 3) {\n      const shadingType = this.data[PATTERN_INFO.SHADING_TYPE];\n      let bounds = null;\n      if (coords.length > 0) {\n        bounds = BBOX_INIT.slice();\n        for (let i = 0, ii = coords.length; i < ii; i += 2) {\n          Util.pointBoundingBox(coords[i], coords[i + 1], bounds);\n        }\n      }\n      return [\"Mesh\", shadingType, coords, colors, nCoord, bounds, bbox, background];\n    }\n    throw new Error(`Unsupported pattern kind: ${kind}`);\n  }\n}\nclass FontPathInfo {\n  #buffer;\n  constructor(buffer) {\n    this.#buffer = buffer;\n  }\n  get path() {\n    if (FeatureTest.isFloat16ArraySupported) {\n      return new Float16Array(this.#buffer);\n    }\n    return new Float32Array(this.#buffer);\n  }\n}\n\n;// ./src/display/api_utils.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction getUrlProp(val) {\n  if (val instanceof URL) {\n    return val;\n  }\n  if (typeof val === \"string\") {\n    if (isNodeJS) {\n      if (/^[a-z][a-z0-9\\-+.]+:/i.test(val)) {\n        return new URL(val);\n      }\n      const url = process.getBuiltinModule(\"url\");\n      return new URL(url.pathToFileURL(val));\n    }\n    const url = URL.parse(val, window.location);\n    if (url) {\n      return url;\n    }\n  }\n  throw new Error(\"Invalid PDF url data: \" + \"either string or URL-object is expected in the url property.\");\n}\nfunction getDataProp(val) {\n  if (isNodeJS && typeof Buffer !== \"undefined\" && val instanceof Buffer) {\n    throw new Error(\"Please provide binary data as `Uint8Array`, rather than `Buffer`.\");\n  }\n  if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) {\n    return val;\n  }\n  if (typeof val === \"string\") {\n    return stringToBytes(val);\n  }\n  if (val instanceof ArrayBuffer || ArrayBuffer.isView(val) || typeof val === \"object\" && !isNaN(val?.length)) {\n    return new Uint8Array(val);\n  }\n  throw new Error(\"Invalid PDF binary data: either TypedArray, \" + \"string, or array-like object is expected in the data property.\");\n}\nfunction getFactoryUrlProp(val) {\n  if (typeof val !== \"string\") {\n    return null;\n  }\n  if (val.endsWith(\"/\")) {\n    return val;\n  }\n  throw new Error(`Invalid factory url: \"${val}\" must include trailing slash.`);\n}\nconst isRefProxy = v => typeof v === \"object\" && Number.isInteger(v?.num) && v.num >= 0 && Number.isInteger(v?.gen) && v.gen >= 0;\nconst isNameProxy = v => typeof v === \"object\" && typeof v?.name === \"string\";\nconst isValidExplicitDest = _isValidExplicitDest.bind(null, isRefProxy, isNameProxy);\nclass LoopbackPort {\n  #listeners = new Map();\n  #deferred = Promise.resolve();\n  postMessage(obj, transfer) {\n    const event = {\n      data: structuredClone(obj, transfer ? {\n        transfer\n      } : null)\n    };\n    this.#deferred.then(() => {\n      for (const [listener] of this.#listeners) {\n        listener.call(this, event);\n      }\n    });\n  }\n  addEventListener(name, listener, options = null) {\n    let rmAbort = null;\n    if (options?.signal instanceof AbortSignal) {\n      const {\n        signal\n      } = options;\n      if (signal.aborted) {\n        warn(\"LoopbackPort - cannot use an `aborted` signal.\");\n        return;\n      }\n      const onAbort = () => this.removeEventListener(name, listener);\n      rmAbort = () => signal.removeEventListener(\"abort\", onAbort);\n      signal.addEventListener(\"abort\", onAbort);\n    }\n    this.#listeners.set(listener, rmAbort);\n  }\n  removeEventListener(name, listener) {\n    const rmAbort = this.#listeners.get(listener);\n    rmAbort?.();\n    this.#listeners.delete(listener);\n  }\n  terminate() {\n    for (const [, rmAbort] of this.#listeners) {\n      rmAbort?.();\n    }\n    this.#listeners.clear();\n  }\n}\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.promise.try.js\nvar es_promise_try = __webpack_require__(1689);\n;// ./src/shared/message_handler.js\n\n\n\nconst CallbackKind = {\n  DATA: 1,\n  ERROR: 2\n};\nconst StreamKind = {\n  CANCEL: 1,\n  CANCEL_COMPLETE: 2,\n  CLOSE: 3,\n  ENQUEUE: 4,\n  ERROR: 5,\n  PULL: 6,\n  PULL_COMPLETE: 7,\n  START_COMPLETE: 8\n};\nfunction onFn() {}\nfunction wrapReason(ex) {\n  if (ex instanceof AbortException || ex instanceof InvalidPDFException || ex instanceof PasswordException || ex instanceof ResponseException || ex instanceof UnknownErrorException) {\n    return ex;\n  }\n  if (!(ex instanceof Error || typeof ex === \"object\" && ex !== null)) {\n    unreachable('wrapReason: Expected \"reason\" to be a (possibly cloned) Error.');\n  }\n  switch (ex.name) {\n    case \"AbortException\":\n      return new AbortException(ex.message);\n    case \"InvalidPDFException\":\n      return new InvalidPDFException(ex.message);\n    case \"PasswordException\":\n      return new PasswordException(ex.message, ex.code);\n    case \"ResponseException\":\n      return new ResponseException(ex.message, ex.status, ex.missing);\n    case \"UnknownErrorException\":\n      return new UnknownErrorException(ex.message, ex.details);\n  }\n  return new UnknownErrorException(ex.message, ex.toString());\n}\nclass MessageHandler {\n  #messageAC = new AbortController();\n  constructor(sourceName, targetName, comObj) {\n    this.sourceName = sourceName;\n    this.targetName = targetName;\n    this.comObj = comObj;\n    this.callbackId = 1;\n    this.streamId = 1;\n    this.streamSinks = Object.create(null);\n    this.streamControllers = Object.create(null);\n    this.callbackCapabilities = Object.create(null);\n    this.actionHandler = Object.create(null);\n    comObj.addEventListener(\"message\", this.#onMessage.bind(this), {\n      signal: this.#messageAC.signal\n    });\n  }\n  #onMessage({\n    data\n  }) {\n    if (data.targetName !== this.sourceName) {\n      return;\n    }\n    if (data.stream) {\n      this.#processStreamMessage(data);\n      return;\n    }\n    if (data.callback) {\n      const callbackId = data.callbackId;\n      const capability = this.callbackCapabilities[callbackId];\n      if (!capability) {\n        throw new Error(`Cannot resolve callback ${callbackId}`);\n      }\n      delete this.callbackCapabilities[callbackId];\n      if (data.callback === CallbackKind.DATA) {\n        capability.resolve(data.data);\n      } else if (data.callback === CallbackKind.ERROR) {\n        capability.reject(wrapReason(data.reason));\n      } else {\n        throw new Error(\"Unexpected callback case\");\n      }\n      return;\n    }\n    const action = this.actionHandler[data.action];\n    if (!action) {\n      throw new Error(`Unknown action from worker: ${data.action}`);\n    }\n    if (data.callbackId) {\n      const sourceName = this.sourceName,\n        targetName = data.sourceName,\n        comObj = this.comObj;\n      Promise.try(action, data.data).then(function (result) {\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          callback: CallbackKind.DATA,\n          callbackId: data.callbackId,\n          data: result\n        });\n      }, function (reason) {\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          callback: CallbackKind.ERROR,\n          callbackId: data.callbackId,\n          reason: wrapReason(reason)\n        });\n      });\n      return;\n    }\n    if (data.streamId) {\n      this.#createStreamSink(data);\n      return;\n    }\n    action(data.data);\n  }\n  on(actionName, handler) {\n    const ah = this.actionHandler;\n    if (ah[actionName]) {\n      throw new Error(`There is already an actionName called \"${actionName}\"`);\n    }\n    ah[actionName] = handler;\n  }\n  send(actionName, data, transfers) {\n    this.comObj.postMessage({\n      sourceName: this.sourceName,\n      targetName: this.targetName,\n      action: actionName,\n      data\n    }, transfers);\n  }\n  sendWithPromise(actionName, data, transfers) {\n    const callbackId = this.callbackId++;\n    const capability = Promise.withResolvers();\n    this.callbackCapabilities[callbackId] = capability;\n    try {\n      this.comObj.postMessage({\n        sourceName: this.sourceName,\n        targetName: this.targetName,\n        action: actionName,\n        callbackId,\n        data\n      }, transfers);\n    } catch (ex) {\n      capability.reject(ex);\n    }\n    return capability.promise;\n  }\n  sendWithStream(actionName, data, queueingStrategy, transfers) {\n    const streamId = this.streamId++,\n      sourceName = this.sourceName,\n      targetName = this.targetName,\n      comObj = this.comObj;\n    return new ReadableStream({\n      start: controller => {\n        const startCapability = Promise.withResolvers();\n        this.streamControllers[streamId] = {\n          controller,\n          startCall: startCapability,\n          pullCall: null,\n          cancelCall: null,\n          isClosed: false\n        };\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          action: actionName,\n          streamId,\n          data,\n          desiredSize: controller.desiredSize\n        }, transfers);\n        return startCapability.promise;\n      },\n      pull: controller => {\n        const pullCapability = Promise.withResolvers();\n        this.streamControllers[streamId].pullCall = pullCapability;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.PULL,\n          streamId,\n          desiredSize: controller.desiredSize\n        });\n        return pullCapability.promise;\n      },\n      cancel: reason => {\n        assert(reason instanceof Error, \"cancel must have a valid reason\");\n        const cancelCapability = Promise.withResolvers();\n        this.streamControllers[streamId].cancelCall = cancelCapability;\n        this.streamControllers[streamId].isClosed = true;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.CANCEL,\n          streamId,\n          reason: wrapReason(reason)\n        });\n        return cancelCapability.promise;\n      }\n    }, queueingStrategy);\n  }\n  #createStreamSink(data) {\n    const streamId = data.streamId,\n      sourceName = this.sourceName,\n      targetName = data.sourceName,\n      comObj = this.comObj;\n    const self = this,\n      action = this.actionHandler[data.action];\n    const streamSink = {\n      enqueue(chunk, size = 1, transfers) {\n        if (this.isCancelled) {\n          return;\n        }\n        const lastDesiredSize = this.desiredSize;\n        this.desiredSize -= size;\n        if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n          this.sinkCapability = Promise.withResolvers();\n          this.ready = this.sinkCapability.promise;\n        }\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.ENQUEUE,\n          streamId,\n          chunk\n        }, transfers);\n      },\n      close() {\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.CLOSE,\n          streamId\n        });\n        delete self.streamSinks[streamId];\n      },\n      error(reason) {\n        assert(reason instanceof Error, \"error must have a valid reason\");\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.ERROR,\n          streamId,\n          reason: wrapReason(reason)\n        });\n      },\n      sinkCapability: Promise.withResolvers(),\n      onPull: null,\n      onCancel: null,\n      isCancelled: false,\n      desiredSize: data.desiredSize,\n      ready: null\n    };\n    streamSink.sinkCapability.resolve();\n    streamSink.ready = streamSink.sinkCapability.promise;\n    this.streamSinks[streamId] = streamSink;\n    Promise.try(action, data.data, streamSink).then(function () {\n      comObj.postMessage({\n        sourceName,\n        targetName,\n        stream: StreamKind.START_COMPLETE,\n        streamId,\n        success: true\n      });\n    }, function (reason) {\n      comObj.postMessage({\n        sourceName,\n        targetName,\n        stream: StreamKind.START_COMPLETE,\n        streamId,\n        reason: wrapReason(reason)\n      });\n    });\n  }\n  #processStreamMessage(data) {\n    const streamId = data.streamId,\n      sourceName = this.sourceName,\n      targetName = data.sourceName,\n      comObj = this.comObj;\n    const streamController = this.streamControllers[streamId],\n      streamSink = this.streamSinks[streamId];\n    switch (data.stream) {\n      case StreamKind.START_COMPLETE:\n        if (data.success) {\n          streamController.startCall.resolve();\n        } else {\n          streamController.startCall.reject(wrapReason(data.reason));\n        }\n        break;\n      case StreamKind.PULL_COMPLETE:\n        if (data.success) {\n          streamController.pullCall.resolve();\n        } else {\n          streamController.pullCall.reject(wrapReason(data.reason));\n        }\n        break;\n      case StreamKind.PULL:\n        if (!streamSink) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.PULL_COMPLETE,\n            streamId,\n            success: true\n          });\n          break;\n        }\n        if (streamSink.desiredSize <= 0 && data.desiredSize > 0) {\n          streamSink.sinkCapability.resolve();\n        }\n        streamSink.desiredSize = data.desiredSize;\n        Promise.try(streamSink.onPull || onFn).then(function () {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.PULL_COMPLETE,\n            streamId,\n            success: true\n          });\n        }, function (reason) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.PULL_COMPLETE,\n            streamId,\n            reason: wrapReason(reason)\n          });\n        });\n        break;\n      case StreamKind.ENQUEUE:\n        assert(streamController, \"enqueue should have stream controller\");\n        if (streamController.isClosed) {\n          break;\n        }\n        streamController.controller.enqueue(data.chunk);\n        break;\n      case StreamKind.CLOSE:\n        assert(streamController, \"close should have stream controller\");\n        if (streamController.isClosed) {\n          break;\n        }\n        streamController.isClosed = true;\n        streamController.controller.close();\n        this.#deleteStreamController(streamController, streamId);\n        break;\n      case StreamKind.ERROR:\n        assert(streamController, \"error should have stream controller\");\n        streamController.controller.error(wrapReason(data.reason));\n        this.#deleteStreamController(streamController, streamId);\n        break;\n      case StreamKind.CANCEL_COMPLETE:\n        if (data.success) {\n          streamController.cancelCall.resolve();\n        } else {\n          streamController.cancelCall.reject(wrapReason(data.reason));\n        }\n        this.#deleteStreamController(streamController, streamId);\n        break;\n      case StreamKind.CANCEL:\n        if (!streamSink) {\n          break;\n        }\n        const dataReason = wrapReason(data.reason);\n        Promise.try(streamSink.onCancel || onFn, dataReason).then(function () {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.CANCEL_COMPLETE,\n            streamId,\n            success: true\n          });\n        }, function (reason) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.CANCEL_COMPLETE,\n            streamId,\n            reason: wrapReason(reason)\n          });\n        });\n        streamSink.sinkCapability.reject(dataReason);\n        streamSink.isCancelled = true;\n        delete this.streamSinks[streamId];\n        break;\n      default:\n        throw new Error(\"Unexpected stream case\");\n    }\n  }\n  async #deleteStreamController(streamController, streamId) {\n    await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]);\n    delete this.streamControllers[streamId];\n  }\n  destroy() {\n    this.#messageAC?.abort();\n    this.#messageAC = null;\n  }\n}\n\n;// ./src/display/binary_data_factory.js\n\n\n\n\n\n\n\n\n\n\nclass BaseBinaryDataFactory {\n  #errorStr = Object.freeze({\n    cMapUrl: \"CMap\",\n    standardFontDataUrl: \"font\",\n    wasmUrl: \"wasm\"\n  });\n  constructor({\n    cMapUrl = null,\n    standardFontDataUrl = null,\n    wasmUrl = null\n  }) {\n    this.cMapUrl = cMapUrl;\n    this.standardFontDataUrl = standardFontDataUrl;\n    this.wasmUrl = wasmUrl;\n  }\n  async fetch({\n    kind,\n    filename\n  }) {\n    switch (kind) {\n      case \"cMapUrl\":\n      case \"standardFontDataUrl\":\n      case \"wasmUrl\":\n        break;\n      default:\n        unreachable(`Not implemented: ${kind}`);\n    }\n    const baseUrl = this[kind];\n    if (!baseUrl) {\n      throw new Error(`Ensure that the \\`${kind}\\` API parameter is provided.`);\n    }\n    const url = `${baseUrl}${filename}`;\n    return this._fetch(url, kind).catch(reason => {\n      throw new Error(`Unable to load ${this.#errorStr[kind]} data at: ${url}`);\n    });\n  }\n  async _fetch(url, kind) {\n    unreachable(\"Abstract method `_fetch` called.\");\n  }\n}\nclass DOMBinaryDataFactory extends BaseBinaryDataFactory {\n  async _fetch(url, kind) {\n    const type = kind === \"cMapUrl\" && !url.endsWith(\".bcmap\") ? \"text\" : \"bytes\";\n    const data = await fetchData(url, type);\n    return data instanceof Uint8Array ? data : stringToBytes(data);\n  }\n}\n\n;// ./src/display/canvas_factory.js\n\nclass BaseCanvasFactory {\n  #enableHWA = false;\n  constructor({\n    enableHWA = false\n  }) {\n    this.#enableHWA = enableHWA;\n  }\n  create(width, height) {\n    if (width <= 0 || height <= 0) {\n      throw new Error(\"Invalid canvas size\");\n    }\n    const canvas = this._createCanvas(width, height);\n    return {\n      canvas,\n      context: canvas.getContext(\"2d\", {\n        willReadFrequently: !this.#enableHWA\n      })\n    };\n  }\n  reset({\n    canvas\n  }, width, height) {\n    if (!canvas) {\n      throw new Error(\"Canvas is not specified\");\n    }\n    if (width <= 0 || height <= 0) {\n      throw new Error(\"Invalid canvas size\");\n    }\n    canvas.width = width;\n    canvas.height = height;\n  }\n  destroy(canvasAndContext) {\n    const {\n      canvas\n    } = canvasAndContext;\n    if (!canvas) {\n      throw new Error(\"Canvas is not specified\");\n    }\n    canvas.width = canvas.height = 0;\n    canvasAndContext.canvas = null;\n    canvasAndContext.context = null;\n  }\n  _createCanvas(width, height) {\n    unreachable(\"Abstract method `_createCanvas` called.\");\n  }\n}\nclass DOMCanvasFactory extends BaseCanvasFactory {\n  constructor({\n    ownerDocument = globalThis.document,\n    enableHWA = false\n  }) {\n    super({\n      enableHWA\n    });\n    this._document = ownerDocument;\n  }\n  _createCanvas(width, height) {\n    const canvas = this._document.createElement(\"canvas\");\n    canvas.width = width;\n    canvas.height = height;\n    return canvas;\n  }\n}\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.filter.js\nvar es_iterator_filter = __webpack_require__(2489);\n;// ./src/display/filter_factory.js\n\n\n\n\n\n\nclass BaseFilterFactory {\n  addFilter(maps) {\n    return \"none\";\n  }\n  addHCMFilter(fgColor, bgColor) {\n    return \"none\";\n  }\n  addAlphaFilter(map) {\n    return \"none\";\n  }\n  addLuminosityFilter(map) {\n    return \"none\";\n  }\n  addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {\n    return \"none\";\n  }\n  destroy(keepHCM = false) {}\n}\nclass DOMFilterFactory extends BaseFilterFactory {\n  #baseUrl;\n  #_cache;\n  #_defs;\n  #docId;\n  #document;\n  #_hcmCache;\n  #id = 0;\n  constructor({\n    docId,\n    ownerDocument = globalThis.document\n  }) {\n    super();\n    this.#docId = docId;\n    this.#document = ownerDocument;\n  }\n  get #cache() {\n    return this.#_cache ||= new Map();\n  }\n  get #hcmCache() {\n    return this.#_hcmCache ||= new Map();\n  }\n  get #defs() {\n    if (!this.#_defs) {\n      const div = this.#document.createElement(\"div\");\n      const {\n        style\n      } = div;\n      style.visibility = \"hidden\";\n      style.contain = \"strict\";\n      style.width = style.height = 0;\n      style.position = \"absolute\";\n      style.top = style.left = 0;\n      style.zIndex = -1;\n      const svg = this.#document.createElementNS(SVG_NS, \"svg\");\n      svg.setAttribute(\"width\", 0);\n      svg.setAttribute(\"height\", 0);\n      this.#_defs = this.#document.createElementNS(SVG_NS, \"defs\");\n      div.append(svg);\n      svg.append(this.#_defs);\n      this.#document.body.append(div);\n    }\n    return this.#_defs;\n  }\n  #createTables(maps) {\n    if (maps.length === 1) {\n      const mapR = maps[0];\n      const buffer = new Array(256);\n      for (let i = 0; i < 256; i++) {\n        buffer[i] = mapR[i] / 255;\n      }\n      const table = buffer.join(\",\");\n      return [table, table, table];\n    }\n    const [mapR, mapG, mapB] = maps;\n    const bufferR = new Array(256);\n    const bufferG = new Array(256);\n    const bufferB = new Array(256);\n    for (let i = 0; i < 256; i++) {\n      bufferR[i] = mapR[i] / 255;\n      bufferG[i] = mapG[i] / 255;\n      bufferB[i] = mapB[i] / 255;\n    }\n    return [bufferR.join(\",\"), bufferG.join(\",\"), bufferB.join(\",\")];\n  }\n  #createUrl(id) {\n    if (this.#baseUrl === undefined) {\n      this.#baseUrl = \"\";\n      const url = this.#document.URL;\n      if (url !== this.#document.baseURI) {\n        if (isDataScheme(url)) {\n          warn('#createUrl: ignore \"data:\"-URL for performance reasons.');\n        } else {\n          this.#baseUrl = updateUrlHash(url, \"\");\n        }\n      }\n    }\n    return `url(${this.#baseUrl}#${id})`;\n  }\n  addFilter(maps) {\n    if (!maps) {\n      return \"none\";\n    }\n    let value = this.#cache.get(maps);\n    if (value) {\n      return value;\n    }\n    const [tableR, tableG, tableB] = this.#createTables(maps);\n    const key = maps.length === 1 ? tableR : `${tableR}${tableG}${tableB}`;\n    value = this.#cache.get(key);\n    if (value) {\n      this.#cache.set(maps, value);\n      return value;\n    }\n    const id = `g_${this.#docId}_transfer_map_${this.#id++}`;\n    const url = this.#createUrl(id);\n    this.#cache.set(maps, url);\n    this.#cache.set(key, url);\n    const filter = this.#createFilter(id);\n    this.#addTransferMapConversion(tableR, tableG, tableB, filter);\n    return url;\n  }\n  addHCMFilter(fgColor, bgColor) {\n    const key = `${fgColor}-${bgColor}`;\n    const filterName = \"base\";\n    let info = this.#hcmCache.get(filterName);\n    if (info?.key === key) {\n      return info.url;\n    }\n    if (info) {\n      info.filter?.remove();\n      info.key = key;\n      info.url = \"none\";\n      info.filter = null;\n    } else {\n      info = {\n        key,\n        url: \"none\",\n        filter: null\n      };\n      this.#hcmCache.set(filterName, info);\n    }\n    if (!fgColor || !bgColor) {\n      return info.url;\n    }\n    const fgRGB = this.#getRGB(fgColor);\n    fgColor = Util.makeHexColor(...fgRGB);\n    const bgRGB = this.#getRGB(bgColor);\n    bgColor = Util.makeHexColor(...bgRGB);\n    this.#defs.style.color = \"\";\n    if (fgColor === \"#000000\" && bgColor === \"#ffffff\" || fgColor === bgColor) {\n      return info.url;\n    }\n    const map = new Array(256);\n    for (let i = 0; i <= 255; i++) {\n      const x = i / 255;\n      map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;\n    }\n    const table = map.join(\",\");\n    const id = `g_${this.#docId}_hcm_filter`;\n    const filter = info.filter = this.#createFilter(id);\n    this.#addTransferMapConversion(table, table, table, filter);\n    this.#addGrayConversion(filter);\n    const getSteps = (c, n) => {\n      const start = fgRGB[c] / 255;\n      const end = bgRGB[c] / 255;\n      const arr = new Array(n + 1);\n      for (let i = 0; i <= n; i++) {\n        arr[i] = start + i / n * (end - start);\n      }\n      return arr.join(\",\");\n    };\n    this.#addTransferMapConversion(getSteps(0, 5), getSteps(1, 5), getSteps(2, 5), filter);\n    info.url = this.#createUrl(id);\n    return info.url;\n  }\n  addAlphaFilter(map) {\n    let value = this.#cache.get(map);\n    if (value) {\n      return value;\n    }\n    const [tableA] = this.#createTables([map]);\n    const key = `alpha_${tableA}`;\n    value = this.#cache.get(key);\n    if (value) {\n      this.#cache.set(map, value);\n      return value;\n    }\n    const id = `g_${this.#docId}_alpha_map_${this.#id++}`;\n    const url = this.#createUrl(id);\n    this.#cache.set(map, url);\n    this.#cache.set(key, url);\n    const filter = this.#createFilter(id);\n    this.#addTransferMapAlphaConversion(tableA, filter);\n    return url;\n  }\n  addLuminosityFilter(map) {\n    let value = this.#cache.get(map || \"luminosity\");\n    if (value) {\n      return value;\n    }\n    let tableA, key;\n    if (map) {\n      [tableA] = this.#createTables([map]);\n      key = `luminosity_${tableA}`;\n    } else {\n      key = \"luminosity\";\n    }\n    value = this.#cache.get(key);\n    if (value) {\n      this.#cache.set(map, value);\n      return value;\n    }\n    const id = `g_${this.#docId}_luminosity_map_${this.#id++}`;\n    const url = this.#createUrl(id);\n    this.#cache.set(map, url);\n    this.#cache.set(key, url);\n    const filter = this.#createFilter(id);\n    this.#addLuminosityConversion(filter);\n    if (map) {\n      this.#addTransferMapAlphaConversion(tableA, filter);\n    }\n    return url;\n  }\n  addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {\n    const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`;\n    let info = this.#hcmCache.get(filterName);\n    if (info?.key === key) {\n      return info.url;\n    }\n    if (info) {\n      info.filter?.remove();\n      info.key = key;\n      info.url = \"none\";\n      info.filter = null;\n    } else {\n      info = {\n        key,\n        url: \"none\",\n        filter: null\n      };\n      this.#hcmCache.set(filterName, info);\n    }\n    if (!fgColor || !bgColor) {\n      return info.url;\n    }\n    const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this));\n    let fgGray = Math.round(0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]);\n    let bgGray = Math.round(0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]);\n    let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(this.#getRGB.bind(this));\n    if (bgGray < fgGray) {\n      [fgGray, bgGray, newFgRGB, newBgRGB] = [bgGray, fgGray, newBgRGB, newFgRGB];\n    }\n    this.#defs.style.color = \"\";\n    const getSteps = (fg, bg, n) => {\n      const arr = new Array(256);\n      const step = (bgGray - fgGray) / n;\n      const newStart = fg / 255;\n      const newStep = (bg - fg) / (255 * n);\n      let prev = 0;\n      for (let i = 0; i <= n; i++) {\n        const k = Math.round(fgGray + i * step);\n        const value = newStart + i * newStep;\n        for (let j = prev; j <= k; j++) {\n          arr[j] = value;\n        }\n        prev = k + 1;\n      }\n      for (let i = prev; i < 256; i++) {\n        arr[i] = arr[prev - 1];\n      }\n      return arr.join(\",\");\n    };\n    const id = `g_${this.#docId}_hcm_${filterName}_filter`;\n    const filter = info.filter = this.#createFilter(id);\n    this.#addGrayConversion(filter);\n    this.#addTransferMapConversion(getSteps(newFgRGB[0], newBgRGB[0], 5), getSteps(newFgRGB[1], newBgRGB[1], 5), getSteps(newFgRGB[2], newBgRGB[2], 5), filter);\n    info.url = this.#createUrl(id);\n    return info.url;\n  }\n  destroy(keepHCM = false) {\n    if (keepHCM && this.#_hcmCache?.size) {\n      return;\n    }\n    this.#_defs?.parentNode.parentNode.remove();\n    this.#_defs = null;\n    this.#_cache?.clear();\n    this.#_cache = null;\n    this.#_hcmCache?.clear();\n    this.#_hcmCache = null;\n    this.#id = 0;\n  }\n  #addLuminosityConversion(filter) {\n    const feColorMatrix = this.#document.createElementNS(SVG_NS, \"feColorMatrix\");\n    feColorMatrix.setAttribute(\"type\", \"matrix\");\n    feColorMatrix.setAttribute(\"values\", \"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0\");\n    filter.append(feColorMatrix);\n  }\n  #addGrayConversion(filter) {\n    const feColorMatrix = this.#document.createElementNS(SVG_NS, \"feColorMatrix\");\n    feColorMatrix.setAttribute(\"type\", \"matrix\");\n    feColorMatrix.setAttribute(\"values\", \"0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0\");\n    filter.append(feColorMatrix);\n  }\n  #createFilter(id) {\n    const filter = this.#document.createElementNS(SVG_NS, \"filter\");\n    filter.setAttribute(\"color-interpolation-filters\", \"sRGB\");\n    filter.setAttribute(\"id\", id);\n    this.#defs.append(filter);\n    return filter;\n  }\n  #appendFeFunc(feComponentTransfer, func, table) {\n    const feFunc = this.#document.createElementNS(SVG_NS, func);\n    feFunc.setAttribute(\"type\", \"discrete\");\n    feFunc.setAttribute(\"tableValues\", table);\n    feComponentTransfer.append(feFunc);\n  }\n  #addTransferMapConversion(rTable, gTable, bTable, filter) {\n    const feComponentTransfer = this.#document.createElementNS(SVG_NS, \"feComponentTransfer\");\n    filter.append(feComponentTransfer);\n    this.#appendFeFunc(feComponentTransfer, \"feFuncR\", rTable);\n    this.#appendFeFunc(feComponentTransfer, \"feFuncG\", gTable);\n    this.#appendFeFunc(feComponentTransfer, \"feFuncB\", bTable);\n  }\n  #addTransferMapAlphaConversion(aTable, filter) {\n    const feComponentTransfer = this.#document.createElementNS(SVG_NS, \"feComponentTransfer\");\n    filter.append(feComponentTransfer);\n    this.#appendFeFunc(feComponentTransfer, \"feFuncA\", aTable);\n  }\n  #getRGB(color) {\n    this.#defs.style.color = color;\n    return getRGB(getComputedStyle(this.#defs).getPropertyValue(\"color\"));\n  }\n}\n\n;// ./src/display/node_utils.js\n\n\n\n\n\n\n\n\n\n\n\n\nif (isNodeJS) {\n  let canvas;\n  try {\n    const require = process.getBuiltinModule(\"module\").createRequire(import.meta.url);\n    try {\n      canvas = require(\"@napi-rs/canvas\");\n    } catch (ex) {\n      warn(`Cannot load \"@napi-rs/canvas\" package: \"${ex}\".`);\n    }\n  } catch (ex) {\n    warn(`Cannot access the \\`require\\` function: \"${ex}\".`);\n  }\n  if (!globalThis.DOMMatrix) {\n    if (canvas?.DOMMatrix) {\n      globalThis.DOMMatrix = canvas.DOMMatrix;\n    } else {\n      warn(\"Cannot polyfill `DOMMatrix`, rendering may be broken.\");\n    }\n  }\n  if (!globalThis.ImageData) {\n    if (canvas?.ImageData) {\n      globalThis.ImageData = canvas.ImageData;\n    } else {\n      warn(\"Cannot polyfill `ImageData`, rendering may be broken.\");\n    }\n  }\n  if (!globalThis.Path2D) {\n    if (canvas?.Path2D) {\n      globalThis.Path2D = canvas.Path2D;\n    } else {\n      warn(\"Cannot polyfill `Path2D`, rendering may be broken.\");\n    }\n  }\n  if (!globalThis.navigator?.language) {\n    globalThis.navigator = {\n      language: \"en-US\",\n      platform: \"\",\n      userAgent: \"\"\n    };\n  }\n}\nasync function node_utils_fetchData(url) {\n  const fs = process.getBuiltinModule(\"fs/promises\");\n  const data = await fs.readFile(url);\n  return new Uint8Array(data);\n}\nclass NodeFilterFactory extends BaseFilterFactory {}\nclass NodeCanvasFactory extends BaseCanvasFactory {\n  _createCanvas(width, height) {\n    const require = process.getBuiltinModule(\"module\").createRequire(import.meta.url);\n    const canvas = require(\"@napi-rs/canvas\");\n    return canvas.createCanvas(width, height);\n  }\n}\nclass NodeBinaryDataFactory extends BaseBinaryDataFactory {\n  async _fetch(url, kind) {\n    return node_utils_fetchData(url);\n  }\n}\n\n;// ./src/display/webgpu.js\n\n\n\n\nconst MESH_WGSL = `\nstruct Uniforms {\n  offsetX      : f32,\n  offsetY      : f32,\n  scaleX       : f32,\n  scaleY       : f32,\n  paddedWidth  : f32,\n  paddedHeight : f32,\n  borderSize   : f32,\n  _pad         : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n\nstruct VertexInput {\n  @location(0) position : vec2<f32>,\n  @location(1) color    : vec4<f32>,\n};\n\nstruct VertexOutput {\n  @builtin(position) position : vec4<f32>,\n  @location(0)       color    : vec3<f32>,\n};\n\n@vertex\nfn vs_main(in : VertexInput) -> VertexOutput {\n  var out : VertexOutput;\n  let cx = (in.position.x + u.offsetX) * u.scaleX;\n  let cy = (in.position.y + u.offsetY) * u.scaleY;\n  out.position = vec4<f32>(\n    ((cx + u.borderSize) / u.paddedWidth) * 2.0 - 1.0,\n    1.0 - ((cy + u.borderSize) / u.paddedHeight) * 2.0,\n    0.0,\n    1.0\n  );\n  out.color = in.color.rgb;\n  return out;\n}\n\n@fragment\nfn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {\n  return vec4<f32>(in.color, 1.0);\n}\n`;\nclass WebGPU {\n  #initPromise = null;\n  #device = null;\n  #meshPipeline = null;\n  #preferredFormat = null;\n  async #initGPU() {\n    if (!globalThis.navigator?.gpu) {\n      return false;\n    }\n    try {\n      const adapter = await navigator.gpu.requestAdapter();\n      if (!adapter) {\n        return false;\n      }\n      this.#preferredFormat = navigator.gpu.getPreferredCanvasFormat();\n      this.#device = await adapter.requestDevice();\n      return true;\n    } catch {\n      return false;\n    }\n  }\n  init() {\n    return this.#initPromise ||= this.#initGPU();\n  }\n  get isReady() {\n    return this.#device !== null;\n  }\n  loadMeshShader() {\n    if (!this.#device || this.#meshPipeline) {\n      return;\n    }\n    const shaderModule = this.#device.createShaderModule({\n      code: MESH_WGSL\n    });\n    this.#meshPipeline = this.#device.createRenderPipeline({\n      layout: \"auto\",\n      vertex: {\n        module: shaderModule,\n        entryPoint: \"vs_main\",\n        buffers: [{\n          arrayStride: 2 * 4,\n          attributes: [{\n            shaderLocation: 0,\n            offset: 0,\n            format: \"float32x2\"\n          }]\n        }, {\n          arrayStride: 4,\n          attributes: [{\n            shaderLocation: 1,\n            offset: 0,\n            format: \"unorm8x4\"\n          }]\n        }]\n      },\n      fragment: {\n        module: shaderModule,\n        entryPoint: \"fs_main\",\n        targets: [{\n          format: this.#preferredFormat\n        }]\n      },\n      primitive: {\n        topology: \"triangle-list\"\n      }\n    });\n  }\n  draw(posData, colData, vertexCount, context, backgroundColor, paddedWidth, paddedHeight, borderSize) {\n    this.loadMeshShader();\n    const device = this.#device;\n    const {\n      offsetX,\n      offsetY,\n      scaleX,\n      scaleY\n    } = context;\n    const posBuffer = device.createBuffer({\n      size: Math.max(posData.byteLength, 4),\n      usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST\n    });\n    if (posData.byteLength > 0) {\n      device.queue.writeBuffer(posBuffer, 0, posData);\n    }\n    const colBuffer = device.createBuffer({\n      size: Math.max(colData.byteLength, 4),\n      usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST\n    });\n    if (colData.byteLength > 0) {\n      device.queue.writeBuffer(colBuffer, 0, colData);\n    }\n    const uniformBuffer = device.createBuffer({\n      size: 8 * 4,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n    });\n    device.queue.writeBuffer(uniformBuffer, 0, new Float32Array([offsetX, offsetY, scaleX, scaleY, paddedWidth, paddedHeight, borderSize, 0]));\n    const bindGroup = device.createBindGroup({\n      layout: this.#meshPipeline.getBindGroupLayout(0),\n      entries: [{\n        binding: 0,\n        resource: {\n          buffer: uniformBuffer\n        }\n      }]\n    });\n    const offscreen = new OffscreenCanvas(paddedWidth, paddedHeight);\n    const gpuCtx = offscreen.getContext(\"webgpu\");\n    gpuCtx.configure({\n      device,\n      format: this.#preferredFormat,\n      alphaMode: backgroundColor ? \"opaque\" : \"premultiplied\"\n    });\n    const clearValue = backgroundColor ? {\n      r: backgroundColor[0] / 255,\n      g: backgroundColor[1] / 255,\n      b: backgroundColor[2] / 255,\n      a: 1\n    } : {\n      r: 0,\n      g: 0,\n      b: 0,\n      a: 0\n    };\n    const commandEncoder = device.createCommandEncoder();\n    const renderPass = commandEncoder.beginRenderPass({\n      colorAttachments: [{\n        view: gpuCtx.getCurrentTexture().createView(),\n        clearValue,\n        loadOp: \"clear\",\n        storeOp: \"store\"\n      }]\n    });\n    if (vertexCount > 0) {\n      renderPass.setPipeline(this.#meshPipeline);\n      renderPass.setBindGroup(0, bindGroup);\n      renderPass.setVertexBuffer(0, posBuffer);\n      renderPass.setVertexBuffer(1, colBuffer);\n      renderPass.draw(vertexCount);\n    }\n    renderPass.end();\n    device.queue.submit([commandEncoder.finish()]);\n    posBuffer.destroy();\n    colBuffer.destroy();\n    uniformBuffer.destroy();\n    return offscreen.transferToImageBitmap();\n  }\n}\nconst _webGPU = new WebGPU();\nfunction initGPU() {\n  return _webGPU.init();\n}\nfunction isGPUReady() {\n  return _webGPU.isReady;\n}\nfunction loadMeshShader() {\n  _webGPU.loadMeshShader();\n}\nfunction drawMeshWithGPU(posData, colData, vertexCount, context, backgroundColor, paddedWidth, paddedHeight, borderSize) {\n  return _webGPU.draw(posData, colData, vertexCount, context, backgroundColor, paddedWidth, paddedHeight, borderSize);\n}\n\n;// ./src/display/pattern_helper.js\n\n\n\n\n\n\n\n\n\n\n\nconst PathType = {\n  FILL: \"Fill\",\n  STROKE: \"Stroke\",\n  SHADING: \"Shading\"\n};\nfunction applyBoundingBox(ctx, bbox) {\n  if (!bbox) {\n    return;\n  }\n  const width = bbox[2] - bbox[0];\n  const height = bbox[3] - bbox[1];\n  const region = new Path2D();\n  region.rect(bbox[0], bbox[1], width, height);\n  ctx.clip(region);\n}\nclass BaseShadingPattern {\n  isModifyingCurrentTransform() {\n    return false;\n  }\n  getPattern() {\n    unreachable(\"Abstract method `getPattern` called.\");\n  }\n}\nclass RadialAxialShadingPattern extends BaseShadingPattern {\n  constructor(IR) {\n    super();\n    this._type = IR[1];\n    this._bbox = IR[2];\n    this._colorStops = IR[3];\n    this._p0 = IR[4];\n    this._p1 = IR[5];\n    this._r0 = IR[6];\n    this._r1 = IR[7];\n    this.matrix = null;\n  }\n  isOriginBased() {\n    return this._p0[0] === 0 && this._p0[1] === 0 && (!this.isRadial() || this._p1[0] === 0 && this._p1[1] === 0);\n  }\n  isRadial() {\n    return this._type === \"radial\";\n  }\n  areConic() {\n    if (!this.isRadial()) {\n      return false;\n    }\n    const dist = Math.hypot(this._p0[0] - this._p1[0], this._p0[1] - this._p1[1]);\n    return dist + this._r1 > this._r0 && dist + this._r0 > this._r1;\n  }\n  _createGradient(ctx, transform = null) {\n    let grad;\n    let firstPoint = this._p0;\n    let secondPoint = this._p1;\n    if (transform) {\n      firstPoint = firstPoint.slice();\n      secondPoint = secondPoint.slice();\n      Util.applyTransform(firstPoint, transform);\n      Util.applyTransform(secondPoint, transform);\n    }\n    if (this._type === \"axial\") {\n      grad = ctx.createLinearGradient(firstPoint[0], firstPoint[1], secondPoint[0], secondPoint[1]);\n    } else if (this._type === \"radial\") {\n      let r0 = this._r0;\n      let r1 = this._r1;\n      if (transform) {\n        const scale = new Float32Array(2);\n        Util.singularValueDecompose2dScale(transform, scale);\n        r0 *= scale[0];\n        r1 *= scale[0];\n      }\n      grad = ctx.createRadialGradient(firstPoint[0], firstPoint[1], r0, secondPoint[0], secondPoint[1], r1);\n    }\n    for (const colorStop of this._colorStops) {\n      grad.addColorStop(colorStop[0], colorStop[1]);\n    }\n    return grad;\n  }\n  _createReversedGradient(ctx, transform = null) {\n    let firstPoint = this._p1;\n    let secondPoint = this._p0;\n    if (transform) {\n      firstPoint = firstPoint.slice();\n      secondPoint = secondPoint.slice();\n      Util.applyTransform(firstPoint, transform);\n      Util.applyTransform(secondPoint, transform);\n    }\n    let r0 = this._r1;\n    let r1 = this._r0;\n    if (transform) {\n      const scale = new Float32Array(2);\n      Util.singularValueDecompose2dScale(transform, scale);\n      r0 *= scale[0];\n      r1 *= scale[0];\n    }\n    const grad = ctx.createRadialGradient(firstPoint[0], firstPoint[1], r0, secondPoint[0], secondPoint[1], r1);\n    const reversedStops = this._colorStops.map(([t, c]) => [1 - t, c]).reverse();\n    for (const [t, c] of reversedStops) {\n      grad.addColorStop(t, c);\n    }\n    return grad;\n  }\n  getPattern(ctx, owner, inverse, pathType) {\n    let pattern;\n    if (pathType === PathType.STROKE || pathType === PathType.FILL) {\n      if (this.isOriginBased()) {\n        let transf = Util.transform(inverse, owner.baseTransform);\n        if (this.matrix) {\n          transf = Util.transform(transf, this.matrix);\n        }\n        const precision = 1e-3;\n        const n1 = Math.hypot(transf[0], transf[1]);\n        const n2 = Math.hypot(transf[2], transf[3]);\n        const ps = (transf[0] * transf[2] + transf[1] * transf[3]) / (n1 * n2);\n        if (Math.abs(ps) < precision) {\n          if (this.isRadial()) {\n            if (Math.abs(n1 - n2) < precision) {\n              return this._createGradient(ctx, transf);\n            }\n          } else {\n            return this._createGradient(ctx, transf);\n          }\n        }\n      }\n      const ownerBBox = owner.current.getClippedPathBoundingBox(pathType, getCurrentTransform(ctx)) || [0, 0, 0, 0];\n      const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1;\n      const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1;\n      const tmpCanvas = owner.canvasFactory.create(width, height);\n      const tmpCtx = tmpCanvas.context;\n      tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);\n      tmpCtx.beginPath();\n      tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);\n      tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]);\n      inverse = Util.transform(inverse, [1, 0, 0, 1, ownerBBox[0], ownerBBox[1]]);\n      tmpCtx.transform(...owner.baseTransform);\n      if (this.matrix) {\n        tmpCtx.transform(...this.matrix);\n      }\n      applyBoundingBox(tmpCtx, this._bbox);\n      if (this.areConic()) {\n        tmpCtx.fillStyle = this._createReversedGradient(tmpCtx);\n        tmpCtx.fill();\n      }\n      tmpCtx.fillStyle = this._createGradient(tmpCtx);\n      tmpCtx.fill();\n      pattern = ctx.createPattern(tmpCanvas.canvas, \"no-repeat\");\n      owner.canvasFactory.destroy(tmpCanvas);\n      const domMatrix = new DOMMatrix(inverse);\n      pattern.setTransform(domMatrix);\n    } else {\n      if (this.areConic()) {\n        ctx.save();\n        applyBoundingBox(ctx, this._bbox);\n        ctx.fillStyle = this._createReversedGradient(ctx);\n        ctx.fillRect(-1e10, -1e10, 2e10, 2e10);\n        ctx.restore();\n      }\n      applyBoundingBox(ctx, this._bbox);\n      pattern = this._createGradient(ctx);\n    }\n    return pattern;\n  }\n}\nfunction drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {\n  const coords = context.coords,\n    colors = context.colors;\n  const bytes = data.data,\n    rowSize = data.width * 4;\n  let tmp;\n  if (coords[p1 * 2 + 1] > coords[p2 * 2 + 1]) {\n    tmp = p1;\n    p1 = p2;\n    p2 = tmp;\n    tmp = c1;\n    c1 = c2;\n    c2 = tmp;\n  }\n  if (coords[p2 * 2 + 1] > coords[p3 * 2 + 1]) {\n    tmp = p2;\n    p2 = p3;\n    p3 = tmp;\n    tmp = c2;\n    c2 = c3;\n    c3 = tmp;\n  }\n  if (coords[p1 * 2 + 1] > coords[p2 * 2 + 1]) {\n    tmp = p1;\n    p1 = p2;\n    p2 = tmp;\n    tmp = c1;\n    c1 = c2;\n    c2 = tmp;\n  }\n  const x1 = (coords[p1 * 2] + context.offsetX) * context.scaleX;\n  const y1 = (coords[p1 * 2 + 1] + context.offsetY) * context.scaleY;\n  const x2 = (coords[p2 * 2] + context.offsetX) * context.scaleX;\n  const y2 = (coords[p2 * 2 + 1] + context.offsetY) * context.scaleY;\n  const x3 = (coords[p3 * 2] + context.offsetX) * context.scaleX;\n  const y3 = (coords[p3 * 2 + 1] + context.offsetY) * context.scaleY;\n  if (y1 >= y3) {\n    return;\n  }\n  const c1r = colors[c1 * 4],\n    c1g = colors[c1 * 4 + 1],\n    c1b = colors[c1 * 4 + 2];\n  const c2r = colors[c2 * 4],\n    c2g = colors[c2 * 4 + 1],\n    c2b = colors[c2 * 4 + 2];\n  const c3r = colors[c3 * 4],\n    c3g = colors[c3 * 4 + 1],\n    c3b = colors[c3 * 4 + 2];\n  const minY = Math.round(y1),\n    maxY = Math.round(y3);\n  let xa, car, cag, cab;\n  let xb, cbr, cbg, cbb;\n  for (let y = minY; y <= maxY; y++) {\n    if (y < y2) {\n      const k = y < y1 ? 0 : (y1 - y) / (y1 - y2);\n      xa = x1 - (x1 - x2) * k;\n      car = c1r - (c1r - c2r) * k;\n      cag = c1g - (c1g - c2g) * k;\n      cab = c1b - (c1b - c2b) * k;\n    } else {\n      let k;\n      if (y > y3) {\n        k = 1;\n      } else if (y2 === y3) {\n        k = 0;\n      } else {\n        k = (y2 - y) / (y2 - y3);\n      }\n      xa = x2 - (x2 - x3) * k;\n      car = c2r - (c2r - c3r) * k;\n      cag = c2g - (c2g - c3g) * k;\n      cab = c2b - (c2b - c3b) * k;\n    }\n    let k;\n    if (y < y1) {\n      k = 0;\n    } else if (y > y3) {\n      k = 1;\n    } else {\n      k = (y1 - y) / (y1 - y3);\n    }\n    xb = x1 - (x1 - x3) * k;\n    cbr = c1r - (c1r - c3r) * k;\n    cbg = c1g - (c1g - c3g) * k;\n    cbb = c1b - (c1b - c3b) * k;\n    const x1_ = Math.round(Math.min(xa, xb));\n    const x2_ = Math.round(Math.max(xa, xb));\n    let j = rowSize * y + x1_ * 4;\n    for (let x = x1_; x <= x2_; x++) {\n      k = (xa - x) / (xa - xb);\n      if (k < 0) {\n        k = 0;\n      } else if (k > 1) {\n        k = 1;\n      }\n      bytes[j++] = car - (car - cbr) * k | 0;\n      bytes[j++] = cag - (cag - cbg) * k | 0;\n      bytes[j++] = cab - (cab - cbb) * k | 0;\n      bytes[j++] = 255;\n    }\n  }\n}\nclass MeshShadingPattern extends BaseShadingPattern {\n  constructor(IR) {\n    super();\n    this._posData = IR[2];\n    this._colData = IR[3];\n    this._vertexCount = IR[4];\n    this._bounds = IR[5];\n    this._bbox = IR[6];\n    this._background = IR[7];\n    this.matrix = null;\n    loadMeshShader();\n  }\n  _createMeshCanvas(combinedScale, backgroundColor, canvasFactory) {\n    const EXPECTED_SCALE = 1.1;\n    const MAX_PATTERN_SIZE = 3000;\n    const BORDER_SIZE = 2;\n    const offsetX = Math.floor(this._bounds[0]);\n    const offsetY = Math.floor(this._bounds[1]);\n    const boundsWidth = Math.ceil(this._bounds[2]) - offsetX;\n    const boundsHeight = Math.ceil(this._bounds[3]) - offsetY;\n    const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE) || 1;\n    const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE) || 1;\n    const scaleX = boundsWidth ? boundsWidth / width : 1;\n    const scaleY = boundsHeight ? boundsHeight / height : 1;\n    const context = {\n      coords: this._posData,\n      colors: this._colData,\n      offsetX: -offsetX,\n      offsetY: -offsetY,\n      scaleX: 1 / scaleX,\n      scaleY: 1 / scaleY\n    };\n    const paddedWidth = width + BORDER_SIZE * 2;\n    const paddedHeight = height + BORDER_SIZE * 2;\n    const tmpCanvas = canvasFactory.create(paddedWidth, paddedHeight);\n    if (isGPUReady() && this._vertexCount > 48) {\n      tmpCanvas.context.drawImage(drawMeshWithGPU(this._posData, this._colData, this._vertexCount, context, backgroundColor, paddedWidth, paddedHeight, BORDER_SIZE), 0, 0);\n    } else {\n      const data = tmpCanvas.context.createImageData(width, height);\n      if (backgroundColor) {\n        const bytes = data.data;\n        for (let i = 0, ii = bytes.length; i < ii; i += 4) {\n          bytes[i] = backgroundColor[0];\n          bytes[i + 1] = backgroundColor[1];\n          bytes[i + 2] = backgroundColor[2];\n          bytes[i + 3] = 255;\n        }\n      }\n      for (let i = 0, ii = this._vertexCount; i < ii; i += 3) {\n        drawTriangle(data, context, i, i + 1, i + 2, i, i + 1, i + 2);\n      }\n      tmpCanvas.context.putImageData(data, BORDER_SIZE, BORDER_SIZE);\n    }\n    return {\n      canvas: tmpCanvas.canvas,\n      offsetX: offsetX - BORDER_SIZE * scaleX,\n      offsetY: offsetY - BORDER_SIZE * scaleY,\n      scaleX,\n      scaleY\n    };\n  }\n  isModifyingCurrentTransform() {\n    return true;\n  }\n  getPattern(ctx, owner, inverse, pathType) {\n    applyBoundingBox(ctx, this._bbox);\n    const scale = new Float32Array(2);\n    if (pathType === PathType.SHADING) {\n      Util.singularValueDecompose2dScale(getCurrentTransform(ctx), scale);\n    } else if (this.matrix) {\n      Util.singularValueDecompose2dScale(this.matrix, scale);\n      const [matrixScaleX, matrixScaleY] = scale;\n      Util.singularValueDecompose2dScale(owner.baseTransform, scale);\n      scale[0] *= matrixScaleX;\n      scale[1] *= matrixScaleY;\n    } else {\n      Util.singularValueDecompose2dScale(owner.baseTransform, scale);\n    }\n    const temporaryPatternCanvas = this._createMeshCanvas(scale, pathType === PathType.SHADING ? null : this._background, owner.canvasFactory);\n    if (pathType !== PathType.SHADING) {\n      ctx.setTransform(...owner.baseTransform);\n      if (this.matrix) {\n        ctx.transform(...this.matrix);\n      }\n    }\n    ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY);\n    ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY);\n    const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, \"no-repeat\");\n    owner.canvasFactory.destroy(temporaryPatternCanvas);\n    return pattern;\n  }\n}\nclass DummyShadingPattern extends BaseShadingPattern {\n  getPattern() {\n    return \"hotpink\";\n  }\n}\nfunction getShadingPattern(IR) {\n  switch (IR[0]) {\n    case \"RadialAxial\":\n      return new RadialAxialShadingPattern(IR);\n    case \"Mesh\":\n      return new MeshShadingPattern(IR);\n    case \"Dummy\":\n      return new DummyShadingPattern();\n  }\n  throw new Error(`Unknown IR type: ${IR[0]}`);\n}\nconst PaintType = {\n  COLORED: 1,\n  UNCOLORED: 2\n};\nclass TilingPattern {\n  static MAX_PATTERN_SIZE = 3000;\n  constructor(IR, ctx, canvasGraphicsFactory, baseTransform) {\n    this.color = IR[1];\n    this.operatorList = IR[2];\n    this.matrix = IR[3];\n    this.bbox = IR[4];\n    this.xstep = IR[5];\n    this.ystep = IR[6];\n    this.paintType = IR[7];\n    this.tilingType = IR[8];\n    this.needsIsolation = IR[9] ?? true;\n    this.ctx = ctx;\n    this.canvasGraphicsFactory = canvasGraphicsFactory;\n    this.baseTransform = baseTransform;\n    this.patternBaseMatrix = this.matrix ? Util.transform(baseTransform, this.matrix) : baseTransform;\n  }\n  canSkipPatternCanvas([width, height, offsetX, offsetY]) {\n    const [x0, y0, x1, y1] = this.bbox;\n    const absXStep = Math.abs(this.xstep);\n    const absYStep = Math.abs(this.ystep);\n    if (width > absXStep + 1e-6 || height > absYStep + 1e-6) {\n      return null;\n    }\n    const nXFirst = Math.floor((offsetX - x1) / absXStep) + 1;\n    const nXLast = Math.ceil((offsetX + width - x0) / absXStep) - 1;\n    const nYFirst = Math.floor((offsetY - y1) / absYStep) + 1;\n    const nYLast = Math.ceil((offsetY + height - y0) / absYStep) - 1;\n    return nXLast <= nXFirst && nYLast <= nYFirst ? [nXFirst, nYFirst] : null;\n  }\n  updatePatternDims(clippedBBox, dims) {\n    const inv = Util.inverseTransform(this.patternBaseMatrix);\n    const c1 = [clippedBBox[0], clippedBBox[1]];\n    const c2 = [clippedBBox[2], clippedBBox[3]];\n    Util.applyTransform(c1, inv);\n    Util.applyTransform(c2, inv);\n    dims[0] = Math.abs(c2[0] - c1[0]);\n    dims[1] = Math.abs(c2[1] - c1[1]);\n    dims[2] = Math.min(c1[0], c2[0]);\n    dims[3] = Math.min(c1[1], c2[1]);\n  }\n  _renderTileCanvas(owner, opIdx, dimx, dimy) {\n    const [x0, y0, x1, y1] = this.bbox;\n    const tmpCanvas = owner.canvasFactory.create(dimx.size, dimy.size);\n    const tmpCtx = tmpCanvas.context;\n    const graphics = this.canvasGraphicsFactory.createCanvasGraphics(tmpCtx, opIdx);\n    graphics.groupLevel = owner.groupLevel;\n    this.setFillAndStrokeStyleToContext(graphics, this.paintType, this.color);\n    tmpCtx.translate(-dimx.scale * x0, -dimy.scale * y0);\n    graphics.transform(0, dimx.scale, 0, 0, dimy.scale, 0, 0);\n    tmpCtx.save();\n    graphics.dependencyTracker?.save();\n    this.clipBbox(graphics, x0, y0, x1, y1);\n    graphics.baseTransform = getCurrentTransform(graphics.ctx);\n    graphics.executeOperatorList(this.operatorList);\n    graphics.endDrawing();\n    graphics.dependencyTracker?.restore();\n    tmpCtx.restore();\n    return tmpCanvas;\n  }\n  _getCombinedScales() {\n    const scale = new Float32Array(2);\n    Util.singularValueDecompose2dScale(this.matrix, scale);\n    const [matrixScaleX, matrixScaleY] = scale;\n    Util.singularValueDecompose2dScale(this.baseTransform, scale);\n    return [matrixScaleX * scale[0], matrixScaleY * scale[1]];\n  }\n  drawPattern(owner, path, useEOFill = false, [n, m], opIdx) {\n    const [x0, y0, x1, y1] = this.bbox;\n    const dependencyTracker = owner.dependencyTracker;\n    if (dependencyTracker) {\n      owner.dependencyTracker = new CanvasNestedDependencyTracker(dependencyTracker, opIdx);\n    }\n    owner.save();\n    if (useEOFill) {\n      owner.ctx.clip(path, \"evenodd\");\n    } else {\n      owner.ctx.clip(path);\n    }\n    owner.ctx.setTransform(...this.patternBaseMatrix);\n    owner.ctx.translate(n * this.xstep, m * this.ystep);\n    if (this.needsIsolation || owner.ctx.globalAlpha !== 1 || owner.ctx.globalCompositeOperation !== \"source-over\" || owner.inSMaskMode) {\n      const bboxWidth = x1 - x0;\n      const bboxHeight = y1 - y0;\n      const [combinedScaleX, combinedScaleY] = this._getCombinedScales();\n      const dimx = this.getSizeAndScale(bboxWidth, this.ctx.canvas.width, combinedScaleX);\n      const dimy = this.getSizeAndScale(bboxHeight, this.ctx.canvas.height, combinedScaleY);\n      const tmpCanvas = this._renderTileCanvas(owner, opIdx, dimx, dimy);\n      owner.ctx.drawImage(tmpCanvas.canvas, x0, y0, bboxWidth, bboxHeight);\n      owner.canvasFactory.destroy(tmpCanvas);\n    } else {\n      this.setFillAndStrokeStyleToContext(owner, this.paintType, this.color);\n      this.clipBbox(owner, x0, y0, x1, y1);\n      owner.baseTransformStack.push(owner.baseTransform);\n      owner.baseTransform = getCurrentTransform(owner.ctx);\n      owner.executeOperatorList(this.operatorList);\n      owner.baseTransform = owner.baseTransformStack.pop();\n    }\n    owner.restore();\n    if (dependencyTracker) {\n      owner.dependencyTracker = dependencyTracker;\n    }\n  }\n  createPatternCanvas(owner, opIdx) {\n    const [x0, y0, x1, y1] = this.bbox;\n    const width = x1 - x0;\n    const height = y1 - y0;\n    let {\n      xstep,\n      ystep\n    } = this;\n    xstep = Math.abs(xstep);\n    ystep = Math.abs(ystep);\n    info(\"TilingType: \" + this.tilingType);\n    const [combinedScaleX, combinedScaleY] = this._getCombinedScales();\n    let canvasWidth = width,\n      canvasHeight = height,\n      redrawHorizontally = false,\n      redrawVertically = false;\n    if (Math.ceil(xstep * combinedScaleX) >= Math.ceil(width * combinedScaleX)) {\n      canvasWidth = xstep;\n    } else {\n      redrawHorizontally = true;\n    }\n    if (Math.ceil(ystep * combinedScaleY) >= Math.ceil(height * combinedScaleY)) {\n      canvasHeight = ystep;\n    } else {\n      redrawVertically = true;\n    }\n    const dimx = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX);\n    const dimy = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY);\n    const tmpCanvas = this._renderTileCanvas(owner, opIdx, dimx, dimy);\n    if (redrawHorizontally || redrawVertically) {\n      const image = tmpCanvas.canvas;\n      if (redrawHorizontally) {\n        canvasWidth = xstep;\n      }\n      if (redrawVertically) {\n        canvasHeight = ystep;\n      }\n      const dimx2 = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX);\n      const dimy2 = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY);\n      const xSize = dimx2.size;\n      const ySize = dimy2.size;\n      const tmpCanvas2 = owner.canvasFactory.create(xSize, ySize);\n      const tmpCtx2 = tmpCanvas2.context;\n      const ii = redrawHorizontally ? Math.floor(width / xstep) : 0;\n      const jj = redrawVertically ? Math.floor(height / ystep) : 0;\n      for (let i = 0; i <= ii; i++) {\n        for (let j = 0; j <= jj; j++) {\n          tmpCtx2.drawImage(image, xSize * i, ySize * j, xSize, ySize, 0, 0, xSize, ySize);\n        }\n      }\n      owner.canvasFactory.destroy(tmpCanvas);\n      return {\n        canvas: tmpCanvas2.canvas,\n        canvasEntry: tmpCanvas2,\n        scaleX: dimx2.scale,\n        scaleY: dimy2.scale,\n        offsetX: x0,\n        offsetY: y0\n      };\n    }\n    return {\n      canvas: tmpCanvas.canvas,\n      canvasEntry: tmpCanvas,\n      scaleX: dimx.scale,\n      scaleY: dimy.scale,\n      offsetX: x0,\n      offsetY: y0\n    };\n  }\n  getSizeAndScale(step, realOutputSize, scale) {\n    const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize);\n    let size = Math.ceil(step * scale);\n    if (size >= maxSize) {\n      size = maxSize;\n    } else {\n      scale = size / step;\n    }\n    return {\n      scale,\n      size\n    };\n  }\n  clipBbox(graphics, x0, y0, x1, y1) {\n    const bboxWidth = x1 - x0;\n    const bboxHeight = y1 - y0;\n    const clip = new Path2D();\n    clip.rect(x0, y0, bboxWidth, bboxHeight);\n    Util.axialAlignedBoundingBox([x0, y0, x1, y1], getCurrentTransform(graphics.ctx), graphics.current.minMax);\n    graphics.ctx.clip(clip);\n    graphics.current.updateClipFromPath();\n  }\n  setFillAndStrokeStyleToContext(graphics, paintType, color) {\n    const context = graphics.ctx,\n      current = graphics.current;\n    current.patternFill = current.patternStroke = false;\n    switch (paintType) {\n      case PaintType.COLORED:\n        const {\n          fillStyle,\n          strokeStyle\n        } = this.ctx;\n        context.fillStyle = current.fillColor = fillStyle;\n        context.strokeStyle = current.strokeColor = strokeStyle;\n        break;\n      case PaintType.UNCOLORED:\n        context.fillStyle = context.strokeStyle = color;\n        current.fillColor = current.strokeColor = color;\n        break;\n      default:\n        throw new FormatError(`Unsupported paint type: ${paintType}`);\n    }\n  }\n  isModifyingCurrentTransform() {\n    return false;\n  }\n  getPattern(ctx, owner, inverse, pathType, opIdx) {\n    const matrix = pathType !== PathType.SHADING ? Util.transform(inverse, this.patternBaseMatrix) : inverse;\n    const temporaryPatternCanvas = this.createPatternCanvas(owner, opIdx);\n    let domMatrix = new DOMMatrix(matrix);\n    domMatrix = domMatrix.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY);\n    domMatrix = domMatrix.scale(1 / temporaryPatternCanvas.scaleX, 1 / temporaryPatternCanvas.scaleY);\n    const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, \"repeat\");\n    owner.canvasFactory.destroy(temporaryPatternCanvas.canvasEntry);\n    pattern.setTransform(domMatrix);\n    return pattern;\n  }\n}\n\n;// ./src/shared/image_utils.js\n/* unused harmony import specifier */ var image_utils_ImageKind;\n/* unused harmony import specifier */ var image_utils_FeatureTest;\n\n\n\n\n\nfunction convertToRGBA(params) {\n  switch (params.kind) {\n    case image_utils_ImageKind.GRAYSCALE_1BPP:\n      return convertBlackAndWhiteToRGBA(params);\n    case image_utils_ImageKind.RGB_24BPP:\n      return convertRGBToRGBA(params);\n  }\n  return null;\n}\nfunction convertBlackAndWhiteToRGBA({\n  src,\n  srcPos = 0,\n  dest,\n  width,\n  height,\n  nonBlackColor = 0xffffffff,\n  inverseDecode = false\n}) {\n  const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;\n  const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor];\n  const widthInSource = width >> 3;\n  const widthRemainder = width & 7;\n  const xorMask = zeroMapping ^ oneMapping;\n  const srcLength = src.length;\n  dest = new Uint32Array(dest.buffer);\n  let destPos = 0;\n  for (let i = 0; i < height; ++i) {\n    for (const max = srcPos + widthInSource; srcPos < max; ++srcPos, destPos += 8) {\n      const elem = src[srcPos];\n      dest[destPos] = zeroMapping ^ -(elem >> 7 & 1) & xorMask;\n      dest[destPos + 1] = zeroMapping ^ -(elem >> 6 & 1) & xorMask;\n      dest[destPos + 2] = zeroMapping ^ -(elem >> 5 & 1) & xorMask;\n      dest[destPos + 3] = zeroMapping ^ -(elem >> 4 & 1) & xorMask;\n      dest[destPos + 4] = zeroMapping ^ -(elem >> 3 & 1) & xorMask;\n      dest[destPos + 5] = zeroMapping ^ -(elem >> 2 & 1) & xorMask;\n      dest[destPos + 6] = zeroMapping ^ -(elem >> 1 & 1) & xorMask;\n      dest[destPos + 7] = zeroMapping ^ -(elem & 1) & xorMask;\n    }\n    if (widthRemainder === 0) {\n      continue;\n    }\n    const elem = srcPos < srcLength ? src[srcPos++] : 255;\n    for (let j = 0; j < widthRemainder; ++j, ++destPos) {\n      dest[destPos] = zeroMapping ^ -(elem >> 7 - j & 1) & xorMask;\n    }\n  }\n  return {\n    srcPos,\n    destPos\n  };\n}\nfunction convertRGBToRGBA({\n  src,\n  srcPos = 0,\n  dest,\n  destPos = 0,\n  width,\n  height\n}) {\n  let i = 0;\n  const len = width * height * 3;\n  const len32 = len >> 2;\n  const src32 = new Uint32Array(src.buffer, srcPos, len32);\n  const alphaMask = image_utils_FeatureTest.isLittleEndian ? 0xff000000 : 0xff;\n  if (image_utils_FeatureTest.isLittleEndian) {\n    for (; i < len32 - 2; i += 3, destPos += 4) {\n      const s1 = src32[i],\n        s2 = src32[i + 1],\n        s3 = src32[i + 2];\n      dest[destPos] = s1 | alphaMask;\n      dest[destPos + 1] = s1 >>> 24 | s2 << 8 | alphaMask;\n      dest[destPos + 2] = s2 >>> 16 | s3 << 16 | alphaMask;\n      dest[destPos + 3] = s3 >>> 8 | alphaMask;\n    }\n    for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {\n      dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | alphaMask;\n    }\n  } else {\n    for (; i < len32 - 2; i += 3, destPos += 4) {\n      const s1 = src32[i],\n        s2 = src32[i + 1],\n        s3 = src32[i + 2];\n      dest[destPos] = s1 | alphaMask;\n      dest[destPos + 1] = s1 << 24 | s2 >>> 8 | alphaMask;\n      dest[destPos + 2] = s2 << 16 | s3 >>> 16 | alphaMask;\n      dest[destPos + 3] = s3 << 8 | alphaMask;\n    }\n    for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {\n      dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | alphaMask;\n    }\n  }\n  return {\n    srcPos: srcPos + len,\n    destPos\n  };\n}\nfunction grayToRGBA(src, dest) {\n  if (image_utils_FeatureTest.isLittleEndian) {\n    for (let i = 0, ii = src.length; i < ii; i++) {\n      dest[i] = src[i] * 0x10101 | 0xff000000;\n    }\n  } else {\n    for (let i = 0, ii = src.length; i < ii; i++) {\n      dest[i] = src[i] * 0x1010100 | 0x000000ff;\n    }\n  }\n}\n\n;// ./src/display/canvas.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst MIN_FONT_SIZE = 16;\nconst MAX_FONT_SIZE = 100;\nconst EXECUTION_TIME = 15;\nconst EXECUTION_STEPS = 10;\nconst FULL_CHUNK_HEIGHT = 16;\nconst SCALE_MATRIX = new DOMMatrix();\nconst XY = new Float32Array(2);\nfunction mirrorContextOperations(ctx, destCtx) {\n  if (ctx._removeMirroring) {\n    throw new Error(\"Context is already forwarding operations.\");\n  }\n  ctx.__originalSave = ctx.save;\n  ctx.__originalRestore = ctx.restore;\n  ctx.__originalRotate = ctx.rotate;\n  ctx.__originalScale = ctx.scale;\n  ctx.__originalTranslate = ctx.translate;\n  ctx.__originalTransform = ctx.transform;\n  ctx.__originalSetTransform = ctx.setTransform;\n  ctx.__originalResetTransform = ctx.resetTransform;\n  ctx.__originalClip = ctx.clip;\n  ctx.__originalMoveTo = ctx.moveTo;\n  ctx.__originalLineTo = ctx.lineTo;\n  ctx.__originalBezierCurveTo = ctx.bezierCurveTo;\n  ctx.__originalRect = ctx.rect;\n  ctx.__originalClosePath = ctx.closePath;\n  ctx.__originalBeginPath = ctx.beginPath;\n  ctx._removeMirroring = () => {\n    ctx.save = ctx.__originalSave;\n    ctx.restore = ctx.__originalRestore;\n    ctx.rotate = ctx.__originalRotate;\n    ctx.scale = ctx.__originalScale;\n    ctx.translate = ctx.__originalTranslate;\n    ctx.transform = ctx.__originalTransform;\n    ctx.setTransform = ctx.__originalSetTransform;\n    ctx.resetTransform = ctx.__originalResetTransform;\n    ctx.clip = ctx.__originalClip;\n    ctx.moveTo = ctx.__originalMoveTo;\n    ctx.lineTo = ctx.__originalLineTo;\n    ctx.bezierCurveTo = ctx.__originalBezierCurveTo;\n    ctx.rect = ctx.__originalRect;\n    ctx.closePath = ctx.__originalClosePath;\n    ctx.beginPath = ctx.__originalBeginPath;\n    delete ctx._removeMirroring;\n  };\n  ctx.save = function () {\n    destCtx.save();\n    this.__originalSave();\n  };\n  ctx.restore = function () {\n    destCtx.restore();\n    this.__originalRestore();\n  };\n  ctx.translate = function (x, y) {\n    destCtx.translate(x, y);\n    this.__originalTranslate(x, y);\n  };\n  ctx.scale = function (x, y) {\n    destCtx.scale(x, y);\n    this.__originalScale(x, y);\n  };\n  ctx.transform = function (a, b, c, d, e, f) {\n    destCtx.transform(a, b, c, d, e, f);\n    this.__originalTransform(a, b, c, d, e, f);\n  };\n  ctx.setTransform = function (a, b, c, d, e, f) {\n    if (b === undefined) {\n      destCtx.setTransform(a);\n      this.__originalSetTransform(a);\n    } else {\n      destCtx.setTransform(a, b, c, d, e, f);\n      this.__originalSetTransform(a, b, c, d, e, f);\n    }\n  };\n  ctx.resetTransform = function () {\n    destCtx.resetTransform();\n    this.__originalResetTransform();\n  };\n  ctx.rotate = function (angle) {\n    destCtx.rotate(angle);\n    this.__originalRotate(angle);\n  };\n  ctx.clip = function (rule) {\n    destCtx.clip(rule);\n    this.__originalClip(rule);\n  };\n  ctx.moveTo = function (x, y) {\n    destCtx.moveTo(x, y);\n    this.__originalMoveTo(x, y);\n  };\n  ctx.lineTo = function (x, y) {\n    destCtx.lineTo(x, y);\n    this.__originalLineTo(x, y);\n  };\n  ctx.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) {\n    destCtx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n    this.__originalBezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n  };\n  ctx.rect = function (x, y, width, height) {\n    destCtx.rect(x, y, width, height);\n    this.__originalRect(x, y, width, height);\n  };\n  ctx.closePath = function () {\n    destCtx.closePath();\n    this.__originalClosePath();\n  };\n  ctx.beginPath = function () {\n    destCtx.beginPath();\n    this.__originalBeginPath();\n  };\n}\nfunction drawImageAtIntegerCoords(ctx, srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH) {\n  const [a, b, c, d, tx, ty] = getCurrentTransform(ctx);\n  if (b === 0 && c === 0) {\n    const tlX = destX * a + tx;\n    const rTlX = Math.round(tlX);\n    const tlY = destY * d + ty;\n    const rTlY = Math.round(tlY);\n    const brX = (destX + destW) * a + tx;\n    const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;\n    const brY = (destY + destH) * d + ty;\n    const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;\n    ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY);\n    ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight);\n    ctx.setTransform(a, b, c, d, tx, ty);\n    return [rWidth, rHeight];\n  }\n  if (a === 0 && d === 0) {\n    const tlX = destY * c + tx;\n    const rTlX = Math.round(tlX);\n    const tlY = destX * b + ty;\n    const rTlY = Math.round(tlY);\n    const brX = (destY + destH) * c + tx;\n    const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;\n    const brY = (destX + destW) * b + ty;\n    const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;\n    ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY);\n    ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth);\n    ctx.setTransform(a, b, c, d, tx, ty);\n    return [rHeight, rWidth];\n  }\n  ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH);\n  const scaleX = Math.hypot(a, b);\n  const scaleY = Math.hypot(c, d);\n  return [scaleX * destW, scaleY * destH];\n}\nclass CanvasExtraState {\n  alphaIsShape = false;\n  fontSize = 0;\n  fontSizeScale = 1;\n  textMatrix = null;\n  textMatrixScale = 1;\n  fontMatrix = FONT_IDENTITY_MATRIX;\n  leading = 0;\n  x = 0;\n  y = 0;\n  lineX = 0;\n  lineY = 0;\n  charSpacing = 0;\n  wordSpacing = 0;\n  textHScale = 1;\n  textRenderingMode = TextRenderingMode.FILL;\n  textRise = 0;\n  fillColor = \"#000000\";\n  strokeColor = \"#000000\";\n  tilingPatternDims = null;\n  patternFill = false;\n  patternStroke = false;\n  fillAlpha = 1;\n  strokeAlpha = 1;\n  lineWidth = 1;\n  activeSMask = null;\n  transferMaps = \"none\";\n  minMax = F32_BBOX_INIT.slice();\n  constructor(width, height) {\n    this.clipBox = new Float32Array([0, 0, width, height]);\n  }\n  clone() {\n    const clone = Object.create(this);\n    clone.clipBox = this.clipBox.slice();\n    clone.minMax = this.minMax.slice();\n    clone.tilingPatternDims = this.tilingPatternDims?.slice();\n    return clone;\n  }\n  getPathBoundingBox(pathType = PathType.FILL, transform = null) {\n    const box = this.minMax.slice();\n    if (pathType === PathType.STROKE) {\n      if (!transform) {\n        unreachable(\"Stroke bounding box must include transform.\");\n      }\n      Util.singularValueDecompose2dScale(transform, XY);\n      const xStrokePad = XY[0] * this.lineWidth / 2;\n      const yStrokePad = XY[1] * this.lineWidth / 2;\n      box[0] -= xStrokePad;\n      box[1] -= yStrokePad;\n      box[2] += xStrokePad;\n      box[3] += yStrokePad;\n    }\n    return box;\n  }\n  updateClipFromPath() {\n    const intersect = Util.intersect(this.clipBox, this.getPathBoundingBox());\n    this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]);\n  }\n  isEmptyClip() {\n    return this.minMax[0] === Infinity;\n  }\n  startNewPathAndClipBox(box) {\n    this.clipBox.set(box, 0);\n    this.minMax.set(F32_BBOX_INIT, 0);\n  }\n  getClippedPathBoundingBox(pathType = PathType.FILL, transform = null) {\n    return Util.intersect(this.clipBox, this.getPathBoundingBox(pathType, transform));\n  }\n}\nfunction putBinaryImageData(ctx, imgData) {\n  if (imgData instanceof ImageData) {\n    ctx.putImageData(imgData, 0, 0);\n    return;\n  }\n  const height = imgData.height,\n    width = imgData.width;\n  const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n  const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n  const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n  const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n  let srcPos = 0,\n    destPos;\n  const src = imgData.data;\n  const dest = chunkImgData.data;\n  let i, j, thisChunkHeight, elemsInThisChunk;\n  if (imgData.kind === ImageKind.GRAYSCALE_1BPP) {\n    const srcLength = src.byteLength;\n    const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);\n    const dest32DataLength = dest32.length;\n    const fullSrcDiff = width + 7 >> 3;\n    const white = 0xffffffff;\n    const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;\n    for (i = 0; i < totalChunks; i++) {\n      thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n      destPos = 0;\n      for (j = 0; j < thisChunkHeight; j++) {\n        const srcDiff = srcLength - srcPos;\n        let k = 0;\n        const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7;\n        const kEndUnrolled = kEnd & ~7;\n        let mask = 0;\n        let srcByte = 0;\n        for (; k < kEndUnrolled; k += 8) {\n          srcByte = src[srcPos++];\n          dest32[destPos++] = srcByte & 128 ? white : black;\n          dest32[destPos++] = srcByte & 64 ? white : black;\n          dest32[destPos++] = srcByte & 32 ? white : black;\n          dest32[destPos++] = srcByte & 16 ? white : black;\n          dest32[destPos++] = srcByte & 8 ? white : black;\n          dest32[destPos++] = srcByte & 4 ? white : black;\n          dest32[destPos++] = srcByte & 2 ? white : black;\n          dest32[destPos++] = srcByte & 1 ? white : black;\n        }\n        for (; k < kEnd; k++) {\n          if (mask === 0) {\n            srcByte = src[srcPos++];\n            mask = 128;\n          }\n          dest32[destPos++] = srcByte & mask ? white : black;\n          mask >>= 1;\n        }\n      }\n      while (destPos < dest32DataLength) {\n        dest32[destPos++] = 0;\n      }\n      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n    }\n  } else if (imgData.kind === ImageKind.RGBA_32BPP) {\n    j = 0;\n    elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;\n    for (i = 0; i < fullChunks; i++) {\n      dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n      srcPos += elemsInThisChunk;\n      ctx.putImageData(chunkImgData, 0, j);\n      j += FULL_CHUNK_HEIGHT;\n    }\n    if (i < totalChunks) {\n      elemsInThisChunk = width * partialChunkHeight * 4;\n      dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n      ctx.putImageData(chunkImgData, 0, j);\n    }\n  } else if (imgData.kind === ImageKind.RGB_24BPP) {\n    thisChunkHeight = FULL_CHUNK_HEIGHT;\n    elemsInThisChunk = width * thisChunkHeight;\n    for (i = 0; i < totalChunks; i++) {\n      if (i >= fullChunks) {\n        thisChunkHeight = partialChunkHeight;\n        elemsInThisChunk = width * thisChunkHeight;\n      }\n      destPos = 0;\n      for (j = elemsInThisChunk; j--;) {\n        dest[destPos++] = src[srcPos++];\n        dest[destPos++] = src[srcPos++];\n        dest[destPos++] = src[srcPos++];\n        dest[destPos++] = 255;\n      }\n      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n    }\n  } else {\n    throw new Error(`bad image kind: ${imgData.kind}`);\n  }\n}\nfunction putBinaryImageMask(ctx, imgData) {\n  if (imgData.bitmap) {\n    ctx.drawImage(imgData.bitmap, 0, 0);\n    return;\n  }\n  const height = imgData.height,\n    width = imgData.width;\n  const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n  const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n  const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n  const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n  let srcPos = 0;\n  const src = imgData.data;\n  const dest = chunkImgData.data;\n  for (let i = 0; i < totalChunks; i++) {\n    const thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n    ({\n      srcPos\n    } = convertBlackAndWhiteToRGBA({\n      src,\n      srcPos,\n      dest,\n      width,\n      height: thisChunkHeight,\n      nonBlackColor: 0\n    }));\n    ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n  }\n}\nfunction copyCtxState(sourceCtx, destCtx) {\n  const properties = [\"strokeStyle\", \"fillStyle\", \"fillRule\", \"globalAlpha\", \"lineWidth\", \"lineCap\", \"lineJoin\", \"miterLimit\", \"globalCompositeOperation\", \"font\", \"filter\"];\n  for (const property of properties) {\n    if (sourceCtx[property] !== undefined) {\n      destCtx[property] = sourceCtx[property];\n    }\n  }\n  if (sourceCtx.setLineDash !== undefined) {\n    destCtx.setLineDash(sourceCtx.getLineDash());\n    destCtx.lineDashOffset = sourceCtx.lineDashOffset;\n  }\n}\nfunction resetCtxToDefault(ctx) {\n  ctx.strokeStyle = ctx.fillStyle = \"#000000\";\n  ctx.fillRule = \"nonzero\";\n  ctx.globalAlpha = 1;\n  ctx.lineWidth = 1;\n  ctx.lineCap = \"butt\";\n  ctx.lineJoin = \"miter\";\n  ctx.miterLimit = 10;\n  ctx.globalCompositeOperation = \"source-over\";\n  ctx.font = \"10px sans-serif\";\n  if (ctx.setLineDash !== undefined) {\n    ctx.setLineDash([]);\n    ctx.lineDashOffset = 0;\n  }\n  const {\n    filter\n  } = ctx;\n  if (filter !== \"none\" && filter !== \"\") {\n    ctx.filter = \"none\";\n  }\n}\nfunction getImageSmoothingEnabled(transform, interpolate) {\n  if (interpolate) {\n    return true;\n  }\n  Util.singularValueDecompose2dScale(transform, XY);\n  const actualScale = Math.fround(OutputScale.pixelRatio * PixelsPerInch.PDF_TO_CSS_UNITS);\n  return XY[0] <= actualScale && XY[1] <= actualScale;\n}\nconst LINE_CAP_STYLES = [\"butt\", \"round\", \"square\"];\nconst LINE_JOIN_STYLES = [\"miter\", \"round\", \"bevel\"];\nconst NORMAL_CLIP = {};\nconst EO_CLIP = {};\nclass CanvasGraphics {\n  constructor(canvasCtx, commonObjs, objs, canvasFactory, filterFactory, {\n    optionalContentConfig,\n    markedContentStack = null\n  }, annotationCanvasMap, pageColors, dependencyTracker, imagesTracker) {\n    this.ctx = canvasCtx;\n    this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height);\n    this.stateStack = [];\n    this.pendingClip = null;\n    this.pendingEOFill = false;\n    this.commonObjs = commonObjs;\n    this.objs = objs;\n    this.canvasFactory = canvasFactory;\n    this.filterFactory = filterFactory;\n    this.groupStack = [];\n    this.baseTransform = null;\n    this.baseTransformStack = [];\n    this.groupLevel = 0;\n    this.smaskStack = [];\n    this.tempSMask = null;\n    this.smaskGroupCanvases = [];\n    this.smaskPreparedEntry = null;\n    this.smaskPreparedFor = null;\n    this.smaskPreparedOffsetX = 0;\n    this.smaskPreparedOffsetY = 0;\n    this.suspendedCtx = null;\n    this.contentVisible = true;\n    this.markedContentStack = markedContentStack || [];\n    this.optionalContentConfig = optionalContentConfig;\n    this.cachedPatterns = new Map();\n    this.annotationCanvasMap = annotationCanvasMap;\n    this.viewportScale = 1;\n    this.outputScaleX = 1;\n    this.outputScaleY = 1;\n    this.pageColors = pageColors;\n    this._cachedScaleForStroking = [-1, 0];\n    this._cachedGetSinglePixelWidth = null;\n    this._cachedBitmapsMap = new Map();\n    this.dependencyTracker = dependencyTracker ?? null;\n    this.imagesTracker = imagesTracker ?? null;\n  }\n  getObject(opIdx, data, fallback = null) {\n    if (typeof data === \"string\") {\n      this.dependencyTracker?.recordNamedDependency(opIdx, data);\n      return data.startsWith(\"g_\") ? this.commonObjs.get(data) : this.objs.get(data);\n    }\n    return fallback;\n  }\n  beginDrawing({\n    transform,\n    viewport,\n    transparency = false,\n    background = null\n  }) {\n    const width = this.ctx.canvas.width;\n    const height = this.ctx.canvas.height;\n    const savedFillStyle = this.ctx.fillStyle;\n    this.ctx.fillStyle = background || \"#ffffff\";\n    this.ctx.fillRect(0, 0, width, height);\n    this.ctx.fillStyle = savedFillStyle;\n    if (transparency) {\n      const transparentCanvas = this.transparentCanvasEntry = this.canvasFactory.create(width, height);\n      this.compositeCtx = this.ctx;\n      ({\n        canvas: this.transparentCanvas,\n        context: this.ctx\n      } = transparentCanvas);\n      this.ctx.save();\n      this.ctx.transform(...getCurrentTransform(this.compositeCtx));\n    }\n    this.ctx.save();\n    resetCtxToDefault(this.ctx);\n    if (transform) {\n      this.ctx.transform(...transform);\n      this.outputScaleX = transform[0];\n      this.outputScaleY = transform[3];\n    }\n    this.ctx.transform(...viewport.transform);\n    this.viewportScale = viewport.scale;\n    this.baseTransform = getCurrentTransform(this.ctx);\n  }\n  executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper, operationsFilter) {\n    const argsArray = operatorList.argsArray;\n    const fnArray = operatorList.fnArray;\n    let i = executionStartIdx || 0;\n    const argsArrayLen = argsArray.length;\n    if (argsArrayLen === i) {\n      return i;\n    }\n    const chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === \"function\";\n    const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;\n    let steps = 0;\n    const commonObjs = this.commonObjs;\n    const objs = this.objs;\n    let fnId, fnArgs;\n    while (true) {\n      if (stepper !== undefined) {\n        if (i === stepper.nextBreakPoint) {\n          stepper.breakIt(i, continueCallback);\n          return i;\n        }\n        if (stepper.shouldSkip(i)) {\n          if (++i === argsArrayLen) {\n            return i;\n          }\n          continue;\n        }\n      }\n      if (!operationsFilter || operationsFilter(i)) {\n        fnId = fnArray[i];\n        fnArgs = argsArray[i] ?? null;\n        if (fnId !== OPS.dependency) {\n          if (fnArgs === null) {\n            this[fnId](i);\n          } else {\n            this[fnId](i, ...fnArgs);\n          }\n        } else {\n          for (const depObjId of fnArgs) {\n            this.dependencyTracker?.recordNamedData(depObjId, i);\n            const objsPool = depObjId.startsWith(\"g_\") ? commonObjs : objs;\n            if (!objsPool.has(depObjId)) {\n              objsPool.get(depObjId, continueCallback);\n              return i;\n            }\n          }\n        }\n      }\n      i++;\n      if (i === argsArrayLen) {\n        return i;\n      }\n      if (chunkOperations && ++steps > EXECUTION_STEPS) {\n        if (Date.now() > endTime) {\n          continueCallback();\n          return i;\n        }\n        steps = 0;\n      }\n    }\n  }\n  #restoreInitialState() {\n    while (this.stateStack.length || this.inSMaskMode) {\n      this.restore();\n    }\n    this.current.activeSMask = null;\n    this.ctx.restore();\n    if (this.transparentCanvas) {\n      this.ctx = this.compositeCtx;\n      this.ctx.save();\n      this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n      this.ctx.drawImage(this.transparentCanvas, 0, 0);\n      this.ctx.restore();\n      this.canvasFactory.destroy(this.transparentCanvasEntry);\n      this.transparentCanvas = null;\n      this.transparentCanvasEntry = null;\n    }\n  }\n  endDrawing() {\n    this.#restoreInitialState();\n    for (const canvas of this.smaskGroupCanvases) {\n      this.canvasFactory.destroy(canvas);\n    }\n    this.smaskGroupCanvases.length = 0;\n    this._clearPreparedSMask();\n    this.tempSMask = null;\n    this.smaskStack.length = 0;\n    this.cachedPatterns.clear();\n    for (const cache of this._cachedBitmapsMap.values()) {\n      for (const canvas of cache.values()) {\n        if (typeof HTMLCanvasElement !== \"undefined\" && canvas instanceof HTMLCanvasElement) {\n          canvas.width = canvas.height = 0;\n        }\n      }\n      cache.clear();\n    }\n    this._cachedBitmapsMap.clear();\n    this.#drawFilter();\n  }\n  #drawFilter() {\n    if (this.pageColors) {\n      const hcmFilterId = this.filterFactory.addHCMFilter(this.pageColors.foreground, this.pageColors.background);\n      if (hcmFilterId !== \"none\") {\n        const savedFilter = this.ctx.filter;\n        this.ctx.filter = hcmFilterId;\n        this.ctx.drawImage(this.ctx.canvas, 0, 0);\n        this.ctx.filter = savedFilter;\n      }\n    }\n  }\n  _scaleImage(img, inverseTransform) {\n    const width = img.width ?? img.displayWidth;\n    const height = img.height ?? img.displayHeight;\n    const widthScale = Math.max(Math.hypot(inverseTransform[0], inverseTransform[1]), 1);\n    const heightScale = Math.max(Math.hypot(inverseTransform[2], inverseTransform[3]), 1);\n    const scaleSteps = [];\n    let ws = widthScale,\n      hs = heightScale,\n      pw = width,\n      ph = height;\n    while (ws > 2 && pw > 1 || hs > 2 && ph > 1) {\n      let nw = pw,\n        nh = ph;\n      if (ws > 2 && pw > 1) {\n        nw = Math.ceil(pw / 2);\n        ws /= pw / nw;\n      }\n      if (hs > 2 && ph > 1) {\n        nh = Math.ceil(ph / 2);\n        hs /= ph / nh;\n      }\n      scaleSteps.push({\n        newWidth: nw,\n        newHeight: nh\n      });\n      pw = nw;\n      ph = nh;\n    }\n    if (scaleSteps.length === 0) {\n      return {\n        img,\n        paintWidth: width,\n        paintHeight: height,\n        tmpCanvas: null\n      };\n    }\n    if (scaleSteps.length === 1) {\n      const {\n        newWidth,\n        newHeight\n      } = scaleSteps[0];\n      const tmpCanvas = this.canvasFactory.create(newWidth, newHeight);\n      tmpCanvas.context.drawImage(img, 0, 0, width, height, 0, 0, newWidth, newHeight);\n      return {\n        img: tmpCanvas.canvas,\n        paintWidth: newWidth,\n        paintHeight: newHeight,\n        tmpCanvas\n      };\n    }\n    let readEntry = this.canvasFactory.create(1, 1);\n    let writeEntry = this.canvasFactory.create(1, 1);\n    let paintWidth = width,\n      paintHeight = height;\n    let source = img;\n    for (const {\n      newWidth,\n      newHeight\n    } of scaleSteps) {\n      this.canvasFactory.reset(writeEntry, newWidth, newHeight);\n      writeEntry.context.drawImage(source, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight);\n      [readEntry, writeEntry] = [writeEntry, readEntry];\n      source = readEntry.canvas;\n      paintWidth = newWidth;\n      paintHeight = newHeight;\n    }\n    this.canvasFactory.destroy(writeEntry);\n    return {\n      img: readEntry.canvas,\n      paintWidth,\n      paintHeight,\n      tmpCanvas: readEntry\n    };\n  }\n  _createMaskCanvas(opIdx, img) {\n    const ctx = this.ctx;\n    const {\n      width,\n      height\n    } = img;\n    const fillColor = this.current.fillColor;\n    const isPatternFill = this.current.patternFill;\n    const currentTransform = getCurrentTransform(ctx);\n    let cache, cacheKey, scaled, maskCanvas;\n    if ((img.bitmap || img.data) && img.count > 1) {\n      const mainKey = img.bitmap || img.data.buffer;\n      cacheKey = JSON.stringify(isPatternFill ? currentTransform : [currentTransform.slice(0, 4), fillColor]);\n      cache = this._cachedBitmapsMap.getOrInsertComputed(mainKey, makeMap);\n      const cachedImage = cache.get(cacheKey);\n      if (cachedImage && !isPatternFill) {\n        const offsetX = Math.round(Math.min(currentTransform[0], currentTransform[2]) + currentTransform[4]);\n        const offsetY = Math.round(Math.min(currentTransform[1], currentTransform[3]) + currentTransform[5]);\n        this.dependencyTracker?.recordDependencies(opIdx, Dependencies.transformAndFill);\n        return {\n          canvas: cachedImage,\n          offsetX,\n          offsetY\n        };\n      }\n      scaled = cachedImage;\n    }\n    if (!scaled) {\n      maskCanvas = this.canvasFactory.create(width, height);\n      putBinaryImageMask(maskCanvas.context, img);\n    }\n    let maskToCanvas = Util.transform(currentTransform, [1 / width, 0, 0, -1 / height, 0, 0]);\n    maskToCanvas = Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]);\n    const minMax = F32_BBOX_INIT.slice();\n    Util.axialAlignedBoundingBox([0, 0, width, height], maskToCanvas, minMax);\n    const [minX, minY, maxX, maxY] = minMax;\n    const drawnWidth = Math.round(maxX - minX) || 1;\n    const drawnHeight = Math.round(maxY - minY) || 1;\n    const fillCanvas = this.canvasFactory.create(drawnWidth, drawnHeight);\n    const fillCtx = fillCanvas.context;\n    const offsetX = minX;\n    const offsetY = minY;\n    fillCtx.translate(-offsetX, -offsetY);\n    fillCtx.transform(...maskToCanvas);\n    let scaledEntry = null;\n    if (!scaled) {\n      const scaleResult = this._scaleImage(maskCanvas.canvas, getCurrentTransformInverse(fillCtx));\n      scaled = scaleResult.img;\n      scaledEntry = scaleResult.tmpCanvas;\n      if (scaled !== maskCanvas.canvas) {\n        this.canvasFactory.destroy(maskCanvas);\n        maskCanvas = null;\n      }\n      if (cache && isPatternFill) {\n        cache.set(cacheKey, scaled);\n        scaledEntry = null;\n        maskCanvas = null;\n      }\n    }\n    fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(fillCtx), img.interpolate);\n    drawImageAtIntegerCoords(fillCtx, scaled, 0, 0, scaled.width, scaled.height, 0, 0, width, height);\n    if (scaledEntry) {\n      this.canvasFactory.destroy(scaledEntry);\n    }\n    if (maskCanvas) {\n      this.canvasFactory.destroy(maskCanvas);\n    }\n    fillCtx.globalCompositeOperation = \"source-in\";\n    const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [1, 0, 0, 1, -offsetX, -offsetY]);\n    fillCtx.fillStyle = isPatternFill ? fillColor.getPattern(ctx, this, inverse, PathType.FILL, opIdx) : fillColor;\n    fillCtx.fillRect(0, 0, width, height);\n    if (cache && !isPatternFill) {\n      cache.set(cacheKey, fillCanvas.canvas);\n    }\n    this.dependencyTracker?.recordDependencies(opIdx, Dependencies.transformAndFill);\n    return {\n      canvas: fillCanvas.canvas,\n      canvasEntry: cache && !isPatternFill ? null : fillCanvas,\n      offsetX: Math.round(offsetX),\n      offsetY: Math.round(offsetY)\n    };\n  }\n  setLineWidth(opIdx, width) {\n    this.dependencyTracker?.recordSimpleData(\"lineWidth\", opIdx);\n    if (width !== this.current.lineWidth) {\n      this._cachedScaleForStroking[0] = -1;\n    }\n    this.current.lineWidth = width;\n    this.ctx.lineWidth = width;\n  }\n  setLineCap(opIdx, style) {\n    this.dependencyTracker?.recordSimpleData(\"lineCap\", opIdx);\n    this.ctx.lineCap = LINE_CAP_STYLES[style];\n  }\n  setLineJoin(opIdx, style) {\n    this.dependencyTracker?.recordSimpleData(\"lineJoin\", opIdx);\n    this.ctx.lineJoin = LINE_JOIN_STYLES[style];\n  }\n  setMiterLimit(opIdx, limit) {\n    this.dependencyTracker?.recordSimpleData(\"miterLimit\", opIdx);\n    this.ctx.miterLimit = limit;\n  }\n  setDash(opIdx, dashArray, dashPhase) {\n    this.dependencyTracker?.recordSimpleData(\"dash\", opIdx);\n    const ctx = this.ctx;\n    if (ctx.setLineDash !== undefined) {\n      ctx.setLineDash(dashArray);\n      ctx.lineDashOffset = dashPhase;\n    }\n  }\n  setRenderingIntent(opIdx, intent) {}\n  setFlatness(opIdx, flatness) {}\n  setGState(opIdx, states) {\n    for (const [key, value] of states) {\n      switch (key) {\n        case \"LW\":\n          this.setLineWidth(opIdx, value);\n          break;\n        case \"LC\":\n          this.setLineCap(opIdx, value);\n          break;\n        case \"LJ\":\n          this.setLineJoin(opIdx, value);\n          break;\n        case \"ML\":\n          this.setMiterLimit(opIdx, value);\n          break;\n        case \"D\":\n          this.setDash(opIdx, value[0], value[1]);\n          break;\n        case \"RI\":\n          this.setRenderingIntent(opIdx, value);\n          break;\n        case \"FL\":\n          this.setFlatness(opIdx, value);\n          break;\n        case \"Font\":\n          this.setFont(opIdx, value[0], value[1]);\n          break;\n        case \"CA\":\n          this.dependencyTracker?.recordSimpleData(\"strokeAlpha\", opIdx);\n          this.current.strokeAlpha = value;\n          break;\n        case \"ca\":\n          this.dependencyTracker?.recordSimpleData(\"fillAlpha\", opIdx);\n          this.ctx.globalAlpha = this.current.fillAlpha = value;\n          break;\n        case \"BM\":\n          this.dependencyTracker?.recordSimpleData(\"globalCompositeOperation\", opIdx);\n          this.ctx.globalCompositeOperation = value;\n          break;\n        case \"SMask\":\n          this.dependencyTracker?.recordSimpleData(\"SMask\", opIdx);\n          this.current.activeSMask = value ? this.tempSMask : null;\n          if (this.current.activeSMask) {\n            this.current.activeSMask.blendMode = this.ctx.globalCompositeOperation;\n          }\n          this.tempSMask = null;\n          this.checkSMaskState(opIdx);\n          break;\n        case \"TR\":\n          this.dependencyTracker?.recordSimpleData(\"filter\", opIdx);\n          this.ctx.filter = this.current.transferMaps = this.filterFactory.addFilter(value);\n          break;\n      }\n    }\n  }\n  get inSMaskMode() {\n    return !!this.suspendedCtx;\n  }\n  _clearPreparedSMask() {\n    if (this.smaskPreparedEntry) {\n      this.canvasFactory.destroy(this.smaskPreparedEntry);\n      this.smaskPreparedEntry = null;\n    }\n    this.smaskPreparedFor = null;\n    this.smaskPreparedOffsetX = 0;\n    this.smaskPreparedOffsetY = 0;\n  }\n  _ensurePreparedSMask(smask, width, height) {\n    if (smask === this.smaskPreparedFor) {\n      return;\n    }\n    this._clearPreparedSMask();\n    this._prepareSMaskCanvas(smask, width, height);\n  }\n  checkSMaskState(opIdx) {\n    const inSMaskMode = this.inSMaskMode;\n    if (this.current.activeSMask && !inSMaskMode) {\n      this.beginSMaskMode(opIdx);\n    } else if (!this.current.activeSMask && inSMaskMode) {\n      this.endSMaskMode();\n    } else if (this.current.activeSMask && inSMaskMode) {\n      this._ensurePreparedSMask(this.current.activeSMask, this.ctx.canvas.width, this.ctx.canvas.height);\n    }\n  }\n  _prepareSMaskCanvas(smask, width, height) {\n    const {\n      canvas: maskCanvas,\n      subtype,\n      backdrop,\n      transferMap\n    } = smask;\n    const hasFilter = subtype === \"Luminosity\" || subtype === \"Alpha\" && transferMap;\n    if (!backdrop && !hasFilter) {\n      this.smaskPreparedFor = smask;\n      return;\n    }\n    let preparedEntry, offsetX, offsetY;\n    if (backdrop && hasFilter) {\n      const srcEntry = this.canvasFactory.create(width, height);\n      const sCtx = srcEntry.context;\n      sCtx.drawImage(maskCanvas, smask.offsetX, smask.offsetY);\n      sCtx.globalCompositeOperation = \"destination-atop\";\n      sCtx.fillStyle = backdrop;\n      sCtx.fillRect(0, 0, width, height);\n      sCtx.globalCompositeOperation = \"source-over\";\n      preparedEntry = this.canvasFactory.create(width, height);\n      const pCtx = preparedEntry.context;\n      pCtx.filter = subtype === \"Alpha\" ? this.filterFactory.addAlphaFilter(transferMap) : this.filterFactory.addLuminosityFilter(transferMap);\n      pCtx.drawImage(srcEntry.canvas, 0, 0);\n      pCtx.filter = \"none\";\n      this.canvasFactory.destroy(srcEntry);\n      offsetX = offsetY = 0;\n    } else if (hasFilter) {\n      preparedEntry = this.canvasFactory.create(maskCanvas.width, maskCanvas.height);\n      const pCtx = preparedEntry.context;\n      pCtx.filter = subtype === \"Alpha\" ? this.filterFactory.addAlphaFilter(transferMap) : this.filterFactory.addLuminosityFilter(transferMap);\n      pCtx.drawImage(maskCanvas, 0, 0);\n      pCtx.filter = \"none\";\n      ({\n        offsetX,\n        offsetY\n      } = smask);\n    } else {\n      preparedEntry = this.canvasFactory.create(width, height);\n      const pCtx = preparedEntry.context;\n      pCtx.drawImage(maskCanvas, smask.offsetX, smask.offsetY);\n      pCtx.globalCompositeOperation = \"destination-atop\";\n      pCtx.fillStyle = backdrop;\n      pCtx.fillRect(0, 0, width, height);\n      pCtx.globalCompositeOperation = \"source-over\";\n      offsetX = offsetY = 0;\n    }\n    this.smaskPreparedEntry = preparedEntry;\n    this.smaskPreparedFor = smask;\n    this.smaskPreparedOffsetX = offsetX;\n    this.smaskPreparedOffsetY = offsetY;\n  }\n  beginSMaskMode(opIdx) {\n    if (this.inSMaskMode) {\n      throw new Error(\"beginSMaskMode called while already in smask mode\");\n    }\n    const {\n      width: drawnWidth,\n      height: drawnHeight\n    } = this.ctx.canvas;\n    const scratchCanvas = this.canvasFactory.create(drawnWidth, drawnHeight);\n    this.smaskScratchCanvas = scratchCanvas;\n    this.suspendedCtx = this.ctx;\n    const ctx = this.ctx = scratchCanvas.context;\n    ctx.setTransform(this.suspendedCtx.getTransform());\n    copyCtxState(this.suspendedCtx, ctx);\n    mirrorContextOperations(ctx, this.suspendedCtx);\n    this._ensurePreparedSMask(this.current.activeSMask, drawnWidth, drawnHeight);\n    this.setGState(opIdx, [[\"BM\", \"source-over\"]]);\n  }\n  endSMaskMode() {\n    if (!this.inSMaskMode) {\n      throw new Error(\"endSMaskMode called while not in smask mode\");\n    }\n    this.ctx._removeMirroring();\n    copyCtxState(this.ctx, this.suspendedCtx);\n    this.ctx = this.suspendedCtx;\n    this.suspendedCtx = null;\n    this.canvasFactory.destroy(this.smaskScratchCanvas);\n    this.smaskScratchCanvas = null;\n    this._clearPreparedSMask();\n  }\n  compose(dirtyBox) {\n    if (!this.current.activeSMask) {\n      return;\n    }\n    if (!dirtyBox) {\n      dirtyBox = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height];\n    } else {\n      dirtyBox[0] = Math.floor(dirtyBox[0]);\n      dirtyBox[1] = Math.floor(dirtyBox[1]);\n      dirtyBox[2] = Math.ceil(dirtyBox[2]);\n      dirtyBox[3] = Math.ceil(dirtyBox[3]);\n    }\n    const smask = this.current.activeSMask;\n    const suspendedCtx = this.suspendedCtx;\n    this.composeSMask(suspendedCtx, smask, this.ctx, dirtyBox);\n    this.ctx.save();\n    this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n    this.ctx.clearRect(dirtyBox[0], dirtyBox[1], dirtyBox[2] - dirtyBox[0], dirtyBox[3] - dirtyBox[1]);\n    this.ctx.restore();\n  }\n  composeSMask(ctx, smask, layerCtx, layerBox) {\n    const layerOffsetX = layerBox[0];\n    const layerOffsetY = layerBox[1];\n    const layerWidth = layerBox[2] - layerOffsetX;\n    const layerHeight = layerBox[3] - layerOffsetY;\n    if (layerWidth === 0 || layerHeight === 0) {\n      return;\n    }\n    const preparedEntry = this.smaskPreparedEntry;\n    if (preparedEntry) {\n      const srcX = layerOffsetX - this.smaskPreparedOffsetX;\n      const srcY = layerOffsetY - this.smaskPreparedOffsetY;\n      layerCtx.save();\n      layerCtx.globalAlpha = 1;\n      layerCtx.setTransform(1, 0, 0, 1, 0, 0);\n      const clip = new Path2D();\n      clip.rect(layerOffsetX, layerOffsetY, layerWidth, layerHeight);\n      layerCtx.clip(clip);\n      layerCtx.globalCompositeOperation = \"destination-in\";\n      layerCtx.drawImage(preparedEntry.canvas, srcX, srcY, layerWidth, layerHeight, layerOffsetX, layerOffsetY, layerWidth, layerHeight);\n      layerCtx.restore();\n    } else {\n      this.genericComposeSMask(smask.context, layerCtx, layerWidth, layerHeight, layerOffsetX, layerOffsetY, smask.offsetX, smask.offsetY);\n    }\n    ctx.save();\n    ctx.globalAlpha = 1;\n    ctx.globalCompositeOperation = smask.blendMode || \"source-over\";\n    ctx.setTransform(1, 0, 0, 1, 0, 0);\n    ctx.drawImage(layerCtx.canvas, layerOffsetX, layerOffsetY, layerWidth, layerHeight, layerOffsetX, layerOffsetY, layerWidth, layerHeight);\n    ctx.restore();\n  }\n  genericComposeSMask(maskCtx, layerCtx, width, height, layerOffsetX, layerOffsetY, maskOffsetX, maskOffsetY) {\n    const maskCanvas = maskCtx.canvas;\n    const maskX = layerOffsetX - maskOffsetX;\n    const maskY = layerOffsetY - maskOffsetY;\n    layerCtx.save();\n    layerCtx.globalAlpha = 1;\n    layerCtx.setTransform(1, 0, 0, 1, 0, 0);\n    const clip = new Path2D();\n    clip.rect(layerOffsetX, layerOffsetY, width, height);\n    layerCtx.clip(clip);\n    layerCtx.globalCompositeOperation = \"destination-in\";\n    layerCtx.drawImage(maskCanvas, maskX, maskY, width, height, layerOffsetX, layerOffsetY, width, height);\n    layerCtx.restore();\n  }\n  save(opIdx) {\n    if (this.inSMaskMode) {\n      copyCtxState(this.ctx, this.suspendedCtx);\n    }\n    this.ctx.save();\n    const old = this.current;\n    this.stateStack.push(old);\n    this.current = old.clone();\n    this.dependencyTracker?.save(opIdx);\n  }\n  restore(opIdx) {\n    this.dependencyTracker?.restore(opIdx);\n    if (this.stateStack.length === 0) {\n      if (this.inSMaskMode) {\n        this.endSMaskMode();\n      }\n      return;\n    }\n    this.current = this.stateStack.pop();\n    this.ctx.restore();\n    if (this.inSMaskMode) {\n      copyCtxState(this.suspendedCtx, this.ctx);\n      this.ctx.setTransform(this.suspendedCtx.getTransform());\n    }\n    this.checkSMaskState(opIdx);\n    this.pendingClip = null;\n    this._cachedScaleForStroking[0] = -1;\n    this._cachedGetSinglePixelWidth = null;\n  }\n  transform(opIdx, a, b, c, d, e, f) {\n    this.dependencyTracker?.recordIncrementalData(\"transform\", opIdx);\n    this.ctx.transform(a, b, c, d, e, f);\n    this._cachedScaleForStroking[0] = -1;\n    this._cachedGetSinglePixelWidth = null;\n  }\n  constructPath(opIdx, op, data, minMax) {\n    let [path] = data;\n    if (!minMax) {\n      path ||= data[0] = new Path2D();\n      if (op !== OPS.stroke && op !== OPS.closeStroke) {\n        this.current.tilingPatternDims = null;\n      }\n      this[op](opIdx, path);\n      return;\n    }\n    if (this.dependencyTracker !== null) {\n      const outerExtraSize = op === OPS.stroke ? this.current.lineWidth / 2 : 0;\n      this.dependencyTracker.resetBBox(opIdx).recordBBox(opIdx, this.ctx, minMax[0] - outerExtraSize, minMax[2] + outerExtraSize, minMax[1] - outerExtraSize, minMax[3] + outerExtraSize).recordDependencies(opIdx, [\"transform\"]);\n    }\n    if (!(path instanceof Path2D)) {\n      path = data[0] = makePathFromDrawOPS(path);\n    }\n    Util.axialAlignedBoundingBox(minMax, getCurrentTransform(this.ctx), this.current.minMax);\n    const tilingDims = this.current.tilingPatternDims;\n    if (tilingDims && op !== OPS.stroke && op !== OPS.closeStroke && this.current.fillColor instanceof TilingPattern) {\n      const clippedBBox = Util.intersect(this.current.clipBox, this.current.minMax);\n      if (!clippedBBox) {\n        this.current.tilingPatternDims = null;\n      } else {\n        this.current.fillColor.updatePatternDims(clippedBBox, tilingDims);\n      }\n    }\n    this[op](opIdx, path);\n    this._pathStartIdx = opIdx;\n  }\n  closePath(opIdx) {\n    this.ctx.closePath();\n  }\n  stroke(opIdx, path, consumePath = true) {\n    const ctx = this.ctx;\n    const strokeColor = this.current.strokeColor;\n    ctx.globalAlpha = this.current.strokeAlpha;\n    if (this.contentVisible) {\n      if (typeof strokeColor === \"object\" && strokeColor?.getPattern) {\n        const baseTransform = strokeColor.isModifyingCurrentTransform() ? ctx.getTransform() : null;\n        ctx.save();\n        ctx.strokeStyle = strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE, opIdx);\n        if (baseTransform) {\n          const newPath = new Path2D();\n          newPath.addPath(path, ctx.getTransform().invertSelf().multiplySelf(baseTransform));\n          path = newPath;\n        }\n        this.rescaleAndStroke(path, false);\n        ctx.restore();\n      } else {\n        this.rescaleAndStroke(path, true);\n      }\n    }\n    this.dependencyTracker?.recordDependencies(opIdx, Dependencies.stroke);\n    if (consumePath) {\n      this.consumePath(opIdx, path, this.current.getClippedPathBoundingBox(PathType.STROKE, getCurrentTransform(this.ctx)));\n    }\n    ctx.globalAlpha = this.current.fillAlpha;\n  }\n  closeStroke(opIdx, path) {\n    this.stroke(opIdx, path);\n  }\n  fill(opIdx, path, consumePath = true) {\n    const ctx = this.ctx;\n    const fillColor = this.current.fillColor;\n    const isPatternFill = this.current.patternFill;\n    let needRestore = false;\n    const intersect = this.current.getClippedPathBoundingBox();\n    this.dependencyTracker?.recordDependencies(opIdx, Dependencies.fill);\n    if (isPatternFill) {\n      const dims = this.current.tilingPatternDims;\n      const tileIdx = dims && fillColor.canSkipPatternCanvas(dims);\n      if (tileIdx) {\n        fillColor.drawPattern(this, path, this.pendingEOFill, tileIdx, opIdx);\n        this.pendingEOFill = false;\n        if (consumePath) {\n          this.consumePath(opIdx, path, intersect);\n        }\n        this.current.tilingPatternDims = null;\n        return;\n      }\n      const baseTransform = fillColor.isModifyingCurrentTransform() ? ctx.getTransform() : null;\n      this.dependencyTracker?.save(opIdx);\n      ctx.save();\n      ctx.fillStyle = fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx);\n      if (baseTransform) {\n        const newPath = new Path2D();\n        newPath.addPath(path, ctx.getTransform().invertSelf().multiplySelf(baseTransform));\n        path = newPath;\n      }\n      needRestore = true;\n    }\n    if (this.contentVisible && intersect !== null) {\n      if (this.pendingEOFill) {\n        ctx.fill(path, \"evenodd\");\n        this.pendingEOFill = false;\n      } else {\n        ctx.fill(path);\n      }\n    }\n    if (needRestore) {\n      ctx.restore();\n      this.dependencyTracker?.restore(opIdx);\n    }\n    if (consumePath) {\n      this.consumePath(opIdx, path, intersect);\n    }\n  }\n  eoFill(opIdx, path) {\n    this.pendingEOFill = true;\n    this.fill(opIdx, path);\n  }\n  fillStroke(opIdx, path) {\n    this.fill(opIdx, path, false);\n    this.stroke(opIdx, path, false);\n    this.consumePath(opIdx, path);\n  }\n  eoFillStroke(opIdx, path) {\n    this.pendingEOFill = true;\n    this.fillStroke(opIdx, path);\n  }\n  closeFillStroke(opIdx, path) {\n    this.fillStroke(opIdx, path);\n  }\n  closeEOFillStroke(opIdx, path) {\n    this.pendingEOFill = true;\n    this.fillStroke(opIdx, path);\n  }\n  endPath(opIdx, path) {\n    this.consumePath(opIdx, path);\n  }\n  rawFillPath(opIdx, path) {\n    this.ctx.fill(path);\n    this.dependencyTracker?.recordDependencies(opIdx, Dependencies.rawFillPath).recordOperation(opIdx);\n  }\n  clip(opIdx) {\n    this.dependencyTracker?.recordFutureForcedDependency(\"clipMode\", opIdx);\n    this.pendingClip = NORMAL_CLIP;\n  }\n  eoClip(opIdx) {\n    this.dependencyTracker?.recordFutureForcedDependency(\"clipMode\", opIdx);\n    this.pendingClip = EO_CLIP;\n  }\n  beginText(opIdx) {\n    this.current.textMatrix = null;\n    this.current.textMatrixScale = 1;\n    this.current.x = this.current.lineX = 0;\n    this.current.y = this.current.lineY = 0;\n    this.dependencyTracker?.recordOpenMarker(opIdx).resetIncrementalData(\"sameLineText\").resetIncrementalData(\"moveText\", opIdx);\n  }\n  endText(opIdx) {\n    const paths = this.pendingTextPaths;\n    const ctx = this.ctx;\n    if (this.dependencyTracker) {\n      const {\n        dependencyTracker\n      } = this;\n      if (paths !== undefined) {\n        dependencyTracker.recordFutureForcedDependency(\"textClip\", dependencyTracker.getOpenMarker()).recordFutureForcedDependency(\"textClip\", opIdx);\n      }\n      dependencyTracker.recordCloseMarker(opIdx);\n    }\n    if (paths !== undefined) {\n      const newPath = new Path2D();\n      const invTransf = ctx.getTransform().invertSelf();\n      for (const {\n        transform,\n        x,\n        y,\n        fontSize,\n        path\n      } of paths) {\n        if (!path) {\n          continue;\n        }\n        newPath.addPath(path, new DOMMatrix(transform).preMultiplySelf(invTransf).translate(x, y).scale(fontSize, -fontSize));\n      }\n      ctx.clip(newPath);\n    }\n    delete this.pendingTextPaths;\n  }\n  setCharSpacing(opIdx, spacing) {\n    this.dependencyTracker?.recordSimpleData(\"charSpacing\", opIdx);\n    this.current.charSpacing = spacing;\n  }\n  setWordSpacing(opIdx, spacing) {\n    this.dependencyTracker?.recordSimpleData(\"wordSpacing\", opIdx);\n    this.current.wordSpacing = spacing;\n  }\n  setHScale(opIdx, scale) {\n    this.dependencyTracker?.recordSimpleData(\"hScale\", opIdx);\n    this.current.textHScale = scale / 100;\n  }\n  setLeading(opIdx, leading) {\n    this.dependencyTracker?.recordSimpleData(\"leading\", opIdx);\n    this.current.leading = -leading;\n  }\n  setFont(opIdx, fontRefName, size) {\n    this.dependencyTracker?.recordSimpleData(\"font\", opIdx).recordSimpleDataFromNamed(\"fontObj\", fontRefName, opIdx);\n    const fontObj = this.commonObjs.get(fontRefName);\n    const current = this.current;\n    if (!fontObj) {\n      throw new Error(`Can't find font for ${fontRefName}`);\n    }\n    current.fontMatrix = fontObj.fontMatrix || FONT_IDENTITY_MATRIX;\n    if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {\n      warn(\"Invalid font matrix for font \" + fontRefName);\n    }\n    if (size < 0) {\n      size = -size;\n      current.fontDirection = -1;\n    } else {\n      current.fontDirection = 1;\n    }\n    this.current.font = fontObj;\n    this.current.fontSize = size;\n    if (fontObj.isType3Font) {\n      return;\n    }\n    const name = fontObj.loadedName || \"sans-serif\";\n    const typeface = fontObj.systemFontInfo?.css || `\"${name}\", ${fontObj.fallbackName}`;\n    let bold = \"normal\";\n    if (fontObj.black) {\n      bold = \"900\";\n    } else if (fontObj.bold) {\n      bold = \"bold\";\n    }\n    const italic = fontObj.italic ? \"italic\" : \"normal\";\n    let browserFontSize = size;\n    if (size < MIN_FONT_SIZE) {\n      browserFontSize = MIN_FONT_SIZE;\n    } else if (size > MAX_FONT_SIZE) {\n      browserFontSize = MAX_FONT_SIZE;\n    }\n    this.current.fontSizeScale = size / browserFontSize;\n    this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`;\n  }\n  setTextRenderingMode(opIdx, mode) {\n    this.dependencyTracker?.recordSimpleData(\"textRenderingMode\", opIdx);\n    this.current.textRenderingMode = mode;\n  }\n  setTextRise(opIdx, rise) {\n    this.dependencyTracker?.recordSimpleData(\"textRise\", opIdx);\n    this.current.textRise = rise;\n  }\n  moveText(opIdx, x, y) {\n    this.dependencyTracker?.resetIncrementalData(\"sameLineText\").recordIncrementalData(\"moveText\", opIdx);\n    this.current.x = this.current.lineX += x;\n    this.current.y = this.current.lineY += y;\n  }\n  setLeadingMoveText(opIdx, x, y) {\n    this.setLeading(opIdx, -y);\n    this.moveText(opIdx, x, y);\n  }\n  setTextMatrix(opIdx, matrix) {\n    this.dependencyTracker?.resetIncrementalData(\"sameLineText\").recordSimpleData(\"textMatrix\", opIdx);\n    const {\n      current\n    } = this;\n    current.textMatrix = matrix;\n    current.textMatrixScale = Math.hypot(matrix[0], matrix[1]);\n    current.x = current.lineX = 0;\n    current.y = current.lineY = 0;\n  }\n  nextLine(opIdx) {\n    this.moveText(opIdx, 0, this.current.leading);\n    this.dependencyTracker?.recordIncrementalData(\"moveText\", this.dependencyTracker.getSimpleIndex(\"leading\") ?? opIdx);\n  }\n  #getScaledPath(path, currentTransform, transform) {\n    const newPath = new Path2D();\n    newPath.addPath(path, new DOMMatrix(transform).invertSelf().multiplySelf(currentTransform));\n    return newPath;\n  }\n  paintChar(opIdx, character, x, y, patternFillTransform, patternStrokeTransform) {\n    const ctx = this.ctx;\n    const current = this.current;\n    const font = current.font;\n    const textRenderingMode = current.textRenderingMode;\n    const fontSize = current.fontSize / current.fontSizeScale;\n    const fillStrokeMode = textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;\n    const isAddToPathSet = !!(textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG);\n    const patternFill = current.patternFill && !font.missingFile;\n    const patternStroke = current.patternStroke && !font.missingFile;\n    let path;\n    if ((font.disableFontFace || isAddToPathSet || patternFill || patternStroke) && !font.missingFile) {\n      path = font.getPathGenerator(this.commonObjs, character);\n    }\n    if (path && (font.disableFontFace || patternFill || patternStroke)) {\n      ctx.save();\n      ctx.translate(x, y);\n      ctx.scale(fontSize, -fontSize);\n      this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font);\n      let currentTransform;\n      if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n        if (patternFillTransform) {\n          currentTransform = ctx.getTransform();\n          ctx.setTransform(...patternFillTransform);\n          const scaledPath = this.#getScaledPath(path, currentTransform, patternFillTransform);\n          ctx.fill(scaledPath);\n        } else {\n          ctx.fill(path);\n        }\n      }\n      if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n        if (patternStrokeTransform) {\n          currentTransform ||= ctx.getTransform();\n          ctx.setTransform(...patternStrokeTransform);\n          const {\n            a,\n            b,\n            c,\n            d\n          } = currentTransform;\n          const invPatternTransform = Util.inverseTransform(patternStrokeTransform);\n          const transf = Util.transform([a, b, c, d, 0, 0], invPatternTransform);\n          Util.singularValueDecompose2dScale(transf, XY);\n          ctx.lineWidth *= Math.max(XY[0], XY[1]) / fontSize;\n          ctx.stroke(this.#getScaledPath(path, currentTransform, patternStrokeTransform));\n        } else {\n          ctx.lineWidth /= fontSize;\n          ctx.stroke(path);\n        }\n      }\n      ctx.restore();\n    } else {\n      if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n        ctx.fillText(character, x, y);\n        this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y, () => ctx.measureText(character));\n      }\n      if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n        if (this.dependencyTracker) {\n          this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y, () => ctx.measureText(character)).recordDependencies(opIdx, Dependencies.stroke);\n        }\n        ctx.strokeText(character, x, y);\n      }\n    }\n    if (isAddToPathSet) {\n      const paths = this.pendingTextPaths ||= [];\n      paths.push({\n        transform: getCurrentTransform(ctx),\n        x,\n        y,\n        fontSize,\n        path\n      });\n      this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y);\n    }\n  }\n  get isFontSubpixelAAEnabled() {\n    const tmpCanvas = this.canvasFactory.create(10, 10);\n    const ctx = tmpCanvas.context;\n    ctx.scale(1.5, 1);\n    ctx.fillText(\"I\", 0, 10);\n    const data = ctx.getImageData(0, 0, 10, 10).data;\n    this.canvasFactory.destroy(tmpCanvas);\n    let enabled = false;\n    for (let i = 3; i < data.length; i += 4) {\n      if (data[i] > 0 && data[i] < 255) {\n        enabled = true;\n        break;\n      }\n    }\n    return shadow(this, \"isFontSubpixelAAEnabled\", enabled);\n  }\n  showText(opIdx, glyphs) {\n    if (this.dependencyTracker) {\n      this.dependencyTracker.recordDependencies(opIdx, Dependencies.showText).resetBBox(opIdx);\n      if (this.current.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG) {\n        this.dependencyTracker.recordFutureForcedDependency(\"textClip\", opIdx).inheritPendingDependenciesAsFutureForcedDependencies();\n      }\n    }\n    const current = this.current;\n    const font = current.font;\n    if (font.isType3Font) {\n      this.showType3Text(opIdx, glyphs);\n      this.dependencyTracker?.recordShowTextOperation(opIdx);\n      return undefined;\n    }\n    const fontSize = current.fontSize;\n    if (fontSize === 0) {\n      this.dependencyTracker?.recordOperation(opIdx);\n      return undefined;\n    }\n    const ctx = this.ctx;\n    const fontSizeScale = current.fontSizeScale;\n    const charSpacing = current.charSpacing;\n    const wordSpacing = current.wordSpacing;\n    const fontDirection = current.fontDirection;\n    const textHScale = current.textHScale * fontDirection;\n    const glyphsLength = glyphs.length;\n    const vertical = font.vertical;\n    const spacingDir = vertical ? 1 : -1;\n    const defaultVMetrics = font.defaultVMetrics;\n    const widthAdvanceScale = fontSize * current.fontMatrix[0];\n    const simpleFillText = current.textRenderingMode === TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill;\n    ctx.save();\n    if (current.textMatrix) {\n      ctx.transform(...current.textMatrix);\n    }\n    ctx.translate(current.x, current.y + current.textRise);\n    if (fontDirection > 0) {\n      ctx.scale(textHScale, -1);\n    } else {\n      ctx.scale(textHScale, 1);\n    }\n    let patternFillTransform, patternStrokeTransform;\n    const fillStrokeMode = current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;\n    const needsFill = fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE;\n    const needsStroke = fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE;\n    let lineWidth = current.lineWidth;\n    const scale = current.textMatrixScale;\n    if (scale === 0 || lineWidth === 0) {\n      if (needsStroke) {\n        lineWidth = this.getSinglePixelWidth();\n      }\n    } else {\n      lineWidth /= scale;\n    }\n    if (fontSizeScale !== 1.0) {\n      ctx.scale(fontSizeScale, fontSizeScale);\n      lineWidth /= fontSizeScale;\n    }\n    ctx.lineWidth = lineWidth;\n    if (needsFill && current.patternFill) {\n      ctx.save();\n      const pattern = current.fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx);\n      patternFillTransform = getCurrentTransform(ctx);\n      ctx.restore();\n      ctx.fillStyle = pattern;\n    }\n    if (needsStroke && current.patternStroke) {\n      ctx.save();\n      const pattern = current.strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE, opIdx);\n      patternStrokeTransform = getCurrentTransform(ctx);\n      ctx.restore();\n      ctx.strokeStyle = pattern;\n    }\n    if (font.isInvalidPDFjsFont) {\n      const chars = [];\n      let width = 0;\n      for (const glyph of glyphs) {\n        chars.push(glyph.unicode);\n        width += glyph.width;\n      }\n      const joinedChars = chars.join(\"\");\n      ctx.fillText(joinedChars, 0, 0);\n      if (this.dependencyTracker !== null) {\n        const measure = ctx.measureText(joinedChars);\n        this.dependencyTracker.recordBBox(opIdx, this.ctx, -measure.actualBoundingBoxLeft, measure.actualBoundingBoxRight, -measure.actualBoundingBoxAscent, measure.actualBoundingBoxDescent).recordShowTextOperation(opIdx);\n      }\n      current.x += width * widthAdvanceScale * textHScale;\n      ctx.restore();\n      this.compose();\n      return undefined;\n    }\n    let x = 0,\n      i;\n    for (i = 0; i < glyphsLength; ++i) {\n      const glyph = glyphs[i];\n      if (typeof glyph === \"number\") {\n        x += spacingDir * glyph * fontSize / 1000;\n        continue;\n      }\n      let restoreNeeded = false;\n      const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n      const character = glyph.fontChar;\n      const accent = glyph.accent;\n      let scaledX, scaledY;\n      let width = glyph.width;\n      if (vertical) {\n        const vmetric = glyph.vmetric || defaultVMetrics;\n        const vx = -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale;\n        const vy = vmetric[2] * widthAdvanceScale;\n        width = vmetric ? -vmetric[0] : width;\n        scaledX = vx / fontSizeScale;\n        scaledY = (x + vy) / fontSizeScale;\n      } else {\n        scaledX = x / fontSizeScale;\n        scaledY = 0;\n      }\n      let measure;\n      if (font.remeasure && width > 0) {\n        measure = ctx.measureText(character);\n        const measuredWidth = measure.width * 1000 / fontSize * fontSizeScale;\n        if (width < measuredWidth && this.isFontSubpixelAAEnabled) {\n          const characterScaleX = width / measuredWidth;\n          restoreNeeded = true;\n          ctx.save();\n          ctx.scale(characterScaleX, 1);\n          scaledX /= characterScaleX;\n        } else if (width !== measuredWidth) {\n          scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale;\n        }\n      }\n      if (this.contentVisible && (glyph.isInFont || font.missingFile)) {\n        if (simpleFillText && !accent) {\n          ctx.fillText(character, scaledX, scaledY);\n          this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, measure ? {\n            bbox: null\n          } : font, fontSize / fontSizeScale, scaledX, scaledY, () => measure ?? ctx.measureText(character));\n        } else {\n          this.paintChar(opIdx, character, scaledX, scaledY, patternFillTransform, patternStrokeTransform);\n          if (accent) {\n            const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale;\n            const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale;\n            this.paintChar(opIdx, accent.fontChar, scaledAccentX, scaledAccentY, patternFillTransform, patternStrokeTransform);\n          }\n        }\n      }\n      const charWidth = vertical ? width * widthAdvanceScale - spacing * fontDirection : width * widthAdvanceScale + spacing * fontDirection;\n      x += charWidth;\n      if (restoreNeeded) {\n        ctx.restore();\n      }\n    }\n    if (vertical) {\n      current.y -= x;\n    } else {\n      current.x += x * textHScale;\n    }\n    ctx.restore();\n    this.compose();\n    this.dependencyTracker?.recordShowTextOperation(opIdx);\n    return undefined;\n  }\n  showType3Text(opIdx, glyphs) {\n    const ctx = this.ctx;\n    const current = this.current;\n    const font = current.font;\n    const fontSize = current.fontSize;\n    const fontDirection = current.fontDirection;\n    const spacingDir = font.vertical ? 1 : -1;\n    const charSpacing = current.charSpacing;\n    const wordSpacing = current.wordSpacing;\n    const textHScale = current.textHScale * fontDirection;\n    const fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;\n    const glyphsLength = glyphs.length;\n    const isTextInvisible = current.textRenderingMode === TextRenderingMode.INVISIBLE;\n    let i, glyph, width, spacingLength;\n    if (isTextInvisible || fontSize === 0) {\n      return;\n    }\n    this._cachedScaleForStroking[0] = -1;\n    this._cachedGetSinglePixelWidth = null;\n    ctx.save();\n    if (current.textMatrix) {\n      ctx.transform(...current.textMatrix);\n    }\n    ctx.translate(current.x, current.y + current.textRise);\n    ctx.scale(textHScale, fontDirection);\n    const dependencyTracker = this.dependencyTracker;\n    this.dependencyTracker = dependencyTracker ? new CanvasNestedDependencyTracker(dependencyTracker, opIdx) : null;\n    for (i = 0; i < glyphsLength; ++i) {\n      glyph = glyphs[i];\n      if (typeof glyph === \"number\") {\n        spacingLength = spacingDir * glyph * fontSize / 1000;\n        this.ctx.translate(spacingLength, 0);\n        current.x += spacingLength * textHScale;\n        continue;\n      }\n      const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n      const operatorList = font.charProcOperatorList[glyph.operatorListId];\n      if (!operatorList) {\n        warn(`Type3 character \"${glyph.operatorListId}\" is not available.`);\n      } else if (this.contentVisible) {\n        this.save();\n        ctx.scale(fontSize, fontSize);\n        ctx.transform(...fontMatrix);\n        this.executeOperatorList(operatorList);\n        this.restore();\n      }\n      const p = [glyph.width, 0];\n      Util.applyTransform(p, fontMatrix);\n      width = p[0] * fontSize + spacing;\n      ctx.translate(width, 0);\n      current.x += width * textHScale;\n    }\n    ctx.restore();\n    if (dependencyTracker) {\n      this.dependencyTracker = dependencyTracker;\n    }\n  }\n  setCharWidth(opIdx, xWidth, yWidth) {}\n  setCharWidthAndBounds(opIdx, xWidth, yWidth, llx, lly, urx, ury) {\n    const clip = new Path2D();\n    clip.rect(llx, lly, urx - llx, ury - lly);\n    this.ctx.clip(clip);\n    this.dependencyTracker?.recordBBox(opIdx, this.ctx, llx, urx, lly, ury).recordClipBox(opIdx, this.ctx, llx, urx, lly, ury);\n    this.endPath(opIdx);\n  }\n  getColorN_Pattern(opIdx, IR) {\n    let pattern;\n    if (IR[0] === \"TilingPattern\") {\n      const baseTransform = this.baseTransform || getCurrentTransform(this.ctx);\n      const canvasGraphicsFactory = {\n        createCanvasGraphics: (ctx, renderingOpIdx) => new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, {\n          optionalContentConfig: this.optionalContentConfig,\n          markedContentStack: this.markedContentStack\n        }, undefined, undefined, this.dependencyTracker ? new CanvasNestedDependencyTracker(this.dependencyTracker, renderingOpIdx, true) : null)\n      };\n      pattern = new TilingPattern(IR, this.ctx, canvasGraphicsFactory, baseTransform);\n    } else {\n      pattern = this._getPattern(opIdx, IR[1], IR[2]);\n    }\n    return pattern;\n  }\n  setStrokeColorN(opIdx, ...args) {\n    this.dependencyTracker?.recordSimpleData(\"strokeColor\", opIdx);\n    this.current.strokeColor = this.getColorN_Pattern(opIdx, args);\n    this.current.patternStroke = true;\n  }\n  setFillColorN(opIdx, ...args) {\n    this.dependencyTracker?.recordSimpleData(\"fillColor\", opIdx);\n    const pattern = this.current.fillColor = this.getColorN_Pattern(opIdx, args);\n    this.current.patternFill = true;\n    this.current.tilingPatternDims = pattern instanceof TilingPattern ? [0, 0, 0, 0] : null;\n  }\n  setStrokeRGBColor(opIdx, color) {\n    this.dependencyTracker?.recordSimpleData(\"strokeColor\", opIdx);\n    this.ctx.strokeStyle = this.current.strokeColor = color;\n    this.current.patternStroke = false;\n  }\n  setStrokeTransparent(opIdx) {\n    this.dependencyTracker?.recordSimpleData(\"strokeColor\", opIdx);\n    this.ctx.strokeStyle = this.current.strokeColor = \"transparent\";\n    this.current.patternStroke = false;\n  }\n  setFillRGBColor(opIdx, color) {\n    this.dependencyTracker?.recordSimpleData(\"fillColor\", opIdx);\n    this.ctx.fillStyle = this.current.fillColor = color;\n    this.current.patternFill = false;\n    this.current.tilingPatternDims = null;\n  }\n  setFillTransparent(opIdx) {\n    this.dependencyTracker?.recordSimpleData(\"fillColor\", opIdx);\n    this.ctx.fillStyle = this.current.fillColor = \"transparent\";\n    this.current.patternFill = false;\n    this.current.tilingPatternDims = null;\n  }\n  _getPattern(opIdx, objId, matrix = null) {\n    let pattern;\n    if (this.cachedPatterns.has(objId)) {\n      pattern = this.cachedPatterns.get(objId);\n    } else {\n      pattern = getShadingPattern(this.getObject(opIdx, objId));\n      this.cachedPatterns.set(objId, pattern);\n    }\n    if (matrix) {\n      pattern.matrix = matrix;\n    }\n    return pattern;\n  }\n  shadingFill(opIdx, objId) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const ctx = this.ctx;\n    this.save(opIdx);\n    const pattern = this._getPattern(opIdx, objId);\n    ctx.fillStyle = pattern.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.SHADING, opIdx);\n    const inv = getCurrentTransformInverse(ctx);\n    if (inv) {\n      const {\n        width,\n        height\n      } = ctx.canvas;\n      const minMax = F32_BBOX_INIT.slice();\n      Util.axialAlignedBoundingBox([0, 0, width, height], inv, minMax);\n      const [x0, y0, x1, y1] = minMax;\n      this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);\n    } else {\n      this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);\n    }\n    this.dependencyTracker?.resetBBox(opIdx).recordFullPageBBox(opIdx).recordDependencies(opIdx, Dependencies.transform).recordDependencies(opIdx, Dependencies.fill).recordOperation(opIdx);\n    this.compose(this.current.getClippedPathBoundingBox());\n    this.restore(opIdx);\n  }\n  beginInlineImage() {\n    unreachable(\"Should not call beginInlineImage\");\n  }\n  beginImageData() {\n    unreachable(\"Should not call beginImageData\");\n  }\n  paintFormXObjectBegin(opIdx, matrix, bbox) {\n    if (!this.contentVisible) {\n      return;\n    }\n    this.save(opIdx);\n    this.baseTransformStack.push(this.baseTransform);\n    if (matrix) {\n      this.transform(opIdx, ...matrix);\n    }\n    this.baseTransform = getCurrentTransform(this.ctx);\n    if (bbox) {\n      Util.axialAlignedBoundingBox(bbox, this.baseTransform, this.current.minMax);\n      const [x0, y0, x1, y1] = bbox;\n      const clip = new Path2D();\n      clip.rect(x0, y0, x1 - x0, y1 - y0);\n      this.ctx.clip(clip);\n      this.dependencyTracker?.recordClipBox(opIdx, this.ctx, x0, x1, y0, y1);\n      this.endPath(opIdx);\n    }\n  }\n  paintFormXObjectEnd(opIdx) {\n    if (!this.contentVisible) {\n      return;\n    }\n    this.restore(opIdx);\n    this.baseTransform = this.baseTransformStack.pop();\n  }\n  beginGroup(opIdx, group) {\n    if (!this.contentVisible) {\n      return;\n    }\n    this.save(opIdx);\n    const {\n      inSMaskMode\n    } = this;\n    if (inSMaskMode) {\n      this.endSMaskMode();\n      this.current.activeSMask = null;\n    }\n    const currentCtx = this.ctx;\n    if (!group.isolated) {\n      info(\"TODO: Support non-isolated groups.\");\n    }\n    if (group.knockout) {\n      warn(\"Knockout groups not supported.\");\n    }\n    if (!group.needsIsolation && currentCtx.globalAlpha === 1 && currentCtx.globalCompositeOperation === \"source-over\" && !inSMaskMode) {\n      if (group.bbox) {\n        let clip = new Path2D();\n        const [x0, y0, x1, y1] = group.bbox;\n        clip.rect(x0, y0, x1 - x0, y1 - y0);\n        if (group.matrix) {\n          const path = new Path2D();\n          path.addPath(clip, new DOMMatrix(group.matrix));\n          clip = path;\n        }\n        currentCtx.clip(clip);\n      }\n      this.groupStack.push(null);\n      this.groupLevel++;\n      return;\n    }\n    const currentTransform = getCurrentTransform(currentCtx);\n    if (group.matrix) {\n      currentCtx.transform(...group.matrix);\n    }\n    const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height];\n    let bounds;\n    if (group.bbox) {\n      bounds = F32_BBOX_INIT.slice();\n      Util.axialAlignedBoundingBox(group.bbox, getCurrentTransform(currentCtx), bounds);\n      bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];\n    } else {\n      bounds = canvasBounds;\n    }\n    const offsetX = Math.floor(bounds[0]);\n    const offsetY = Math.floor(bounds[1]);\n    const drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);\n    const drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);\n    this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]);\n    const scratchCanvas = this.canvasFactory.create(drawnWidth, drawnHeight);\n    if (group.smask) {\n      this.smaskGroupCanvases.push(scratchCanvas);\n    }\n    const groupCtx = scratchCanvas.context;\n    groupCtx.translate(-offsetX, -offsetY);\n    groupCtx.transform(...currentTransform);\n    if (!group.isolated && !group.smask && inSMaskMode && group.needsIsolation) {\n      groupCtx.save();\n      groupCtx.setTransform(1, 0, 0, 1, 0, 0);\n      groupCtx.drawImage(currentCtx.canvas, -offsetX, -offsetY);\n      groupCtx.restore();\n    }\n    if (group.bbox) {\n      let clip = new Path2D();\n      const [x0, y0, x1, y1] = group.bbox;\n      clip.rect(x0, y0, x1 - x0, y1 - y0);\n      if (group.matrix) {\n        const path = new Path2D();\n        path.addPath(clip, new DOMMatrix(group.matrix));\n        clip = path;\n      }\n      groupCtx.clip(clip);\n    }\n    if (group.smask) {\n      this.smaskStack.push({\n        canvas: scratchCanvas.canvas,\n        context: groupCtx,\n        offsetX,\n        offsetY,\n        subtype: group.smask.subtype,\n        backdrop: group.smask.backdrop,\n        transferMap: group.smask.transferMap || null\n      });\n    }\n    if (!group.smask || this.dependencyTracker) {\n      currentCtx.setTransform(1, 0, 0, 1, 0, 0);\n      currentCtx.translate(offsetX, offsetY);\n      currentCtx.save();\n    }\n    copyCtxState(currentCtx, groupCtx);\n    this.ctx = groupCtx;\n    this.dependencyTracker?.inheritSimpleDataAsFutureForcedDependencies([\"fillAlpha\", \"strokeAlpha\", \"globalCompositeOperation\"]).pushBaseTransform(currentCtx);\n    this.setGState(opIdx, [[\"BM\", \"source-over\"], [\"ca\", 1], [\"CA\", 1], [\"TR\", null]]);\n    this.groupStack.push(currentCtx);\n    this.groupLevel++;\n  }\n  endGroup(opIdx, group) {\n    if (!this.contentVisible) {\n      return;\n    }\n    this.groupLevel--;\n    const groupCtx = this.ctx;\n    const ctx = this.groupStack.pop();\n    if (ctx === null) {\n      this.restore(opIdx);\n      return;\n    }\n    this.ctx = ctx;\n    this.ctx.imageSmoothingEnabled = false;\n    this.dependencyTracker?.popBaseTransform();\n    if (group.smask) {\n      this.tempSMask = this.smaskStack.pop();\n      this.restore(opIdx);\n      if (this.dependencyTracker) {\n        this.ctx.restore();\n        if (this.inSMaskMode) {\n          this.ctx.setTransform(this.suspendedCtx.getTransform());\n        }\n      }\n    } else {\n      this.ctx.restore();\n      const currentMtx = getCurrentTransform(this.ctx);\n      this.restore(opIdx);\n      this.ctx.save();\n      this.ctx.setTransform(...currentMtx);\n      const dirtyBox = F32_BBOX_INIT.slice();\n      Util.axialAlignedBoundingBox([0, 0, groupCtx.canvas.width, groupCtx.canvas.height], currentMtx, dirtyBox);\n      this.ctx.drawImage(groupCtx.canvas, 0, 0);\n      this.ctx.restore();\n      this.canvasFactory.destroy({\n        canvas: groupCtx.canvas,\n        context: groupCtx\n      });\n      this.compose(dirtyBox);\n    }\n  }\n  beginAnnotation(opIdx, id, rect, transform, matrix, hasOwnCanvas) {\n    this.#restoreInitialState();\n    resetCtxToDefault(this.ctx);\n    this.ctx.save();\n    this.save(opIdx);\n    if (this.baseTransform) {\n      this.ctx.setTransform(...this.baseTransform);\n    }\n    if (rect) {\n      const width = rect[2] - rect[0];\n      const height = rect[3] - rect[1];\n      if (hasOwnCanvas && this.annotationCanvasMap) {\n        transform = transform.slice();\n        transform[4] -= rect[0];\n        transform[5] -= rect[1];\n        rect = rect.slice();\n        rect[0] = rect[1] = 0;\n        rect[2] = width;\n        rect[3] = height;\n        Util.singularValueDecompose2dScale(getCurrentTransform(this.ctx), XY);\n        const {\n          viewportScale\n        } = this;\n        const canvasWidth = Math.ceil(width * this.outputScaleX * viewportScale);\n        const canvasHeight = Math.ceil(height * this.outputScaleY * viewportScale);\n        this.annotationCanvas = this.canvasFactory.create(canvasWidth, canvasHeight);\n        const {\n          canvas,\n          context\n        } = this.annotationCanvas;\n        this.annotationCanvasMap.set(id, canvas);\n        this.annotationCanvas.savedCtx = this.ctx;\n        this.ctx = context;\n        this.ctx.save();\n        this.ctx.setTransform(XY[0], 0, 0, -XY[1], 0, height * XY[1]);\n        resetCtxToDefault(this.ctx);\n      } else {\n        resetCtxToDefault(this.ctx);\n        this.endPath(opIdx);\n        const clip = new Path2D();\n        clip.rect(rect[0], rect[1], width, height);\n        this.ctx.clip(clip);\n      }\n    }\n    this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height);\n    this.baseTransformStack.push(this.baseTransform);\n    this.transform(opIdx, ...transform);\n    this.transform(opIdx, ...matrix);\n    this.baseTransform = getCurrentTransform(this.ctx);\n  }\n  endAnnotation(opIdx) {\n    if (this.annotationCanvas) {\n      this.ctx.restore();\n      this.#drawFilter();\n      this.ctx = this.annotationCanvas.savedCtx;\n      delete this.annotationCanvas.savedCtx;\n      delete this.annotationCanvas;\n    }\n    this.baseTransform = this.baseTransformStack.pop();\n  }\n  paintImageMaskXObject(opIdx, img) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const count = img.count;\n    img = this.getObject(opIdx, img.data, img);\n    img.count = count;\n    const ctx = this.ctx;\n    const mask = this._createMaskCanvas(opIdx, img);\n    const maskCanvas = mask.canvas;\n    ctx.save();\n    ctx.setTransform(1, 0, 0, 1, 0, 0);\n    ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY);\n    this.dependencyTracker?.resetBBox(opIdx).recordBBox(opIdx, this.ctx, mask.offsetX, mask.offsetX + maskCanvas.width, mask.offsetY, mask.offsetY + maskCanvas.height).recordOperation(opIdx);\n    ctx.restore();\n    if (mask.canvasEntry) {\n      this.canvasFactory.destroy(mask.canvasEntry);\n    }\n    this.compose();\n  }\n  paintImageMaskXObjectRepeat(opIdx, img, scaleX, skewX = 0, skewY = 0, scaleY, positions) {\n    if (!this.contentVisible) {\n      return;\n    }\n    img = this.getObject(opIdx, img.data, img);\n    const ctx = this.ctx;\n    ctx.save();\n    const currentTransform = getCurrentTransform(ctx);\n    ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0);\n    const mask = this._createMaskCanvas(opIdx, img);\n    ctx.setTransform(1, 0, 0, 1, mask.offsetX - currentTransform[4], mask.offsetY - currentTransform[5]);\n    this.dependencyTracker?.resetBBox(opIdx);\n    for (let i = 0, ii = positions.length; i < ii; i += 2) {\n      const trans = Util.transform(currentTransform, [scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]]);\n      ctx.drawImage(mask.canvas, trans[4], trans[5]);\n      this.dependencyTracker?.recordBBox(opIdx, this.ctx, trans[4], trans[4] + mask.canvas.width, trans[5], trans[5] + mask.canvas.height);\n    }\n    ctx.restore();\n    if (mask.canvasEntry) {\n      this.canvasFactory.destroy(mask.canvasEntry);\n    }\n    this.compose();\n    this.dependencyTracker?.recordOperation(opIdx);\n  }\n  paintImageMaskXObjectGroup(opIdx, images) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const ctx = this.ctx;\n    const fillColor = this.current.fillColor;\n    const isPatternFill = this.current.patternFill;\n    this.dependencyTracker?.resetBBox(opIdx).recordDependencies(opIdx, Dependencies.transformAndFill);\n    for (const image of images) {\n      const {\n        data,\n        width,\n        height,\n        transform\n      } = image;\n      const maskCanvas = this.canvasFactory.create(width, height);\n      const maskCtx = maskCanvas.context;\n      maskCtx.save();\n      const img = this.getObject(opIdx, data, image);\n      putBinaryImageMask(maskCtx, img);\n      maskCtx.globalCompositeOperation = \"source-in\";\n      maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx) : fillColor;\n      maskCtx.fillRect(0, 0, width, height);\n      maskCtx.restore();\n      ctx.save();\n      ctx.transform(...transform);\n      ctx.scale(1, -1);\n      drawImageAtIntegerCoords(ctx, maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);\n      this.canvasFactory.destroy(maskCanvas);\n      this.dependencyTracker?.recordBBox(opIdx, ctx, 0, width, 0, height);\n      ctx.restore();\n    }\n    this.compose();\n    this.dependencyTracker?.recordOperation(opIdx);\n  }\n  paintImageXObject(opIdx, objId) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const imgData = this.getObject(opIdx, objId);\n    if (!imgData) {\n      warn(\"Dependent image isn't ready yet\");\n      return;\n    }\n    this.paintInlineImageXObject(opIdx, imgData);\n  }\n  paintImageXObjectRepeat(opIdx, objId, scaleX, scaleY, positions) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const imgData = this.getObject(opIdx, objId);\n    if (!imgData) {\n      warn(\"Dependent image isn't ready yet\");\n      return;\n    }\n    const width = imgData.width;\n    const height = imgData.height;\n    const map = [];\n    for (let i = 0, ii = positions.length; i < ii; i += 2) {\n      map.push({\n        transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]],\n        x: 0,\n        y: 0,\n        w: width,\n        h: height\n      });\n    }\n    this.paintInlineImageXObjectGroup(opIdx, imgData, map);\n  }\n  applyTransferMapsToCanvas(ctx) {\n    if (this.current.transferMaps !== \"none\") {\n      ctx.filter = this.current.transferMaps;\n      ctx.drawImage(ctx.canvas, 0, 0);\n      ctx.filter = \"none\";\n    }\n    return ctx.canvas;\n  }\n  applyTransferMapsToBitmap(imgData) {\n    if (this.current.transferMaps === \"none\") {\n      return {\n        img: imgData.bitmap,\n        canvasEntry: null\n      };\n    }\n    const {\n      bitmap,\n      width,\n      height\n    } = imgData;\n    const tmpCanvas = this.canvasFactory.create(width, height);\n    const tmpCtx = tmpCanvas.context;\n    tmpCtx.filter = this.current.transferMaps;\n    tmpCtx.drawImage(bitmap, 0, 0);\n    tmpCtx.filter = \"none\";\n    return {\n      img: tmpCanvas.canvas,\n      canvasEntry: tmpCanvas\n    };\n  }\n  paintInlineImageXObject(opIdx, imgData) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const width = imgData.width;\n    const height = imgData.height;\n    const ctx = this.ctx;\n    this.save(opIdx);\n    const {\n      filter\n    } = ctx;\n    if (filter !== \"none\" && filter !== \"\") {\n      ctx.filter = \"none\";\n    }\n    ctx.scale(1 / width, -1 / height);\n    let imgToPaint;\n    let inlineImgCanvas = null;\n    if (imgData.bitmap) {\n      const result = this.applyTransferMapsToBitmap(imgData);\n      imgToPaint = result.img;\n      inlineImgCanvas = result.canvasEntry;\n    } else if (typeof HTMLElement === \"function\" && imgData instanceof HTMLElement || !imgData.data) {\n      imgToPaint = imgData;\n    } else {\n      const tmpCanvas = this.canvasFactory.create(width, height);\n      putBinaryImageData(tmpCanvas.context, imgData);\n      imgToPaint = this.applyTransferMapsToCanvas(tmpCanvas.context);\n      inlineImgCanvas = tmpCanvas;\n    }\n    const scaled = this._scaleImage(imgToPaint, getCurrentTransformInverse(ctx));\n    ctx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(ctx), imgData.interpolate);\n    if (this.dependencyTracker) {\n      this.dependencyTracker.resetBBox(opIdx).recordBBox(opIdx, ctx, 0, width, -height, 0).recordDependencies(opIdx, Dependencies.imageXObject).recordOperation(opIdx);\n      this.imagesTracker?.record(ctx, width, height, this.dependencyTracker.clipBox);\n    }\n    drawImageAtIntegerCoords(ctx, scaled.img, 0, 0, scaled.paintWidth, scaled.paintHeight, 0, -height, width, height);\n    if (scaled.tmpCanvas) {\n      this.canvasFactory.destroy(scaled.tmpCanvas);\n    }\n    if (inlineImgCanvas) {\n      this.canvasFactory.destroy(inlineImgCanvas);\n    }\n    this.compose();\n    this.restore(opIdx);\n  }\n  paintInlineImageXObjectGroup(opIdx, imgData, map) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const ctx = this.ctx;\n    let imgToPaint;\n    let inlineImgCanvas = null;\n    if (imgData.bitmap) {\n      imgToPaint = imgData.bitmap;\n    } else {\n      const w = imgData.width;\n      const h = imgData.height;\n      const tmpCanvas = this.canvasFactory.create(w, h);\n      putBinaryImageData(tmpCanvas.context, imgData);\n      imgToPaint = this.applyTransferMapsToCanvas(tmpCanvas.context);\n      inlineImgCanvas = tmpCanvas;\n    }\n    this.dependencyTracker?.resetBBox(opIdx);\n    for (const entry of map) {\n      ctx.save();\n      ctx.transform(...entry.transform);\n      ctx.scale(1, -1);\n      drawImageAtIntegerCoords(ctx, imgToPaint, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1);\n      this.dependencyTracker?.recordBBox(opIdx, ctx, 0, 1, -1, 0);\n      ctx.restore();\n    }\n    if (inlineImgCanvas) {\n      this.canvasFactory.destroy(inlineImgCanvas);\n    }\n    this.dependencyTracker?.recordOperation(opIdx);\n    this.compose();\n  }\n  paintSolidColorImageMask(opIdx) {\n    if (!this.contentVisible) {\n      return;\n    }\n    this.dependencyTracker?.resetBBox(opIdx).recordBBox(opIdx, this.ctx, 0, 1, 0, 1).recordDependencies(opIdx, Dependencies.fill).recordOperation(opIdx);\n    this.ctx.fillRect(0, 0, 1, 1);\n    this.compose();\n  }\n  markPoint(opIdx, tag) {}\n  markPointProps(opIdx, tag, properties) {}\n  beginMarkedContent(opIdx, tag) {\n    this.dependencyTracker?.beginMarkedContent(opIdx);\n    this.markedContentStack.push({\n      visible: true\n    });\n  }\n  beginMarkedContentProps(opIdx, tag, properties) {\n    this.dependencyTracker?.beginMarkedContent(opIdx);\n    if (tag === \"OC\") {\n      this.markedContentStack.push({\n        visible: this.optionalContentConfig.isVisible(properties)\n      });\n    } else {\n      this.markedContentStack.push({\n        visible: true\n      });\n    }\n    this.contentVisible = this.isContentVisible();\n  }\n  endMarkedContent(opIdx) {\n    this.dependencyTracker?.endMarkedContent(opIdx);\n    this.markedContentStack.pop();\n    this.contentVisible = this.isContentVisible();\n  }\n  beginCompat(opIdx) {}\n  endCompat(opIdx) {}\n  consumePath(opIdx, path, clipBox) {\n    const isEmpty = this.current.isEmptyClip();\n    if (this.pendingClip) {\n      this.current.updateClipFromPath();\n    }\n    if (!this.pendingClip) {\n      this.compose(clipBox);\n    }\n    const ctx = this.ctx;\n    if (this.pendingClip) {\n      if (!isEmpty) {\n        if (this.pendingClip === EO_CLIP) {\n          ctx.clip(path, \"evenodd\");\n        } else {\n          ctx.clip(path);\n        }\n      }\n      this.pendingClip = null;\n      this.dependencyTracker?.bboxToClipBoxDropOperation(opIdx).recordFutureForcedDependency(\"clipPath\", opIdx);\n    } else {\n      this.dependencyTracker?.recordOperation(opIdx);\n    }\n    this.current.startNewPathAndClipBox(this.current.clipBox);\n  }\n  getSinglePixelWidth() {\n    if (!this._cachedGetSinglePixelWidth) {\n      const m = getCurrentTransform(this.ctx);\n      if (m[1] === 0 && m[2] === 0) {\n        this._cachedGetSinglePixelWidth = 1 / Math.min(Math.abs(m[0]), Math.abs(m[3]));\n      } else {\n        const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]);\n        const normX = Math.hypot(m[0], m[2]);\n        const normY = Math.hypot(m[1], m[3]);\n        this._cachedGetSinglePixelWidth = Math.max(normX, normY) / absDet;\n      }\n    }\n    return this._cachedGetSinglePixelWidth;\n  }\n  getScaleForStroking() {\n    if (this._cachedScaleForStroking[0] === -1) {\n      const {\n        lineWidth\n      } = this.current;\n      const {\n        a,\n        b,\n        c,\n        d\n      } = this.ctx.getTransform();\n      let scaleX, scaleY;\n      if (b === 0 && c === 0) {\n        const normX = Math.abs(a);\n        const normY = Math.abs(d);\n        if (normX === normY) {\n          if (lineWidth === 0) {\n            scaleX = scaleY = 1 / normX;\n          } else {\n            const scaledLineWidth = normX * lineWidth;\n            scaleX = scaleY = scaledLineWidth < 1 ? 1 / scaledLineWidth : 1;\n          }\n        } else if (lineWidth === 0) {\n          scaleX = 1 / normX;\n          scaleY = 1 / normY;\n        } else {\n          const scaledXLineWidth = normX * lineWidth;\n          const scaledYLineWidth = normY * lineWidth;\n          scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1;\n          scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1;\n        }\n      } else {\n        const absDet = Math.abs(a * d - b * c);\n        const normX = Math.hypot(a, b);\n        const normY = Math.hypot(c, d);\n        if (lineWidth === 0) {\n          scaleX = normY / absDet;\n          scaleY = normX / absDet;\n        } else {\n          const baseArea = lineWidth * absDet;\n          scaleX = normY > baseArea ? normY / baseArea : 1;\n          scaleY = normX > baseArea ? normX / baseArea : 1;\n        }\n      }\n      this._cachedScaleForStroking[0] = scaleX;\n      this._cachedScaleForStroking[1] = scaleY;\n    }\n    return this._cachedScaleForStroking;\n  }\n  rescaleAndStroke(path, saveRestore) {\n    const {\n      ctx,\n      current: {\n        lineWidth\n      }\n    } = this;\n    const [scaleX, scaleY] = this.getScaleForStroking();\n    if (scaleX === scaleY) {\n      ctx.lineWidth = (lineWidth || 1) * scaleX;\n      ctx.stroke(path);\n      return;\n    }\n    const dashes = ctx.getLineDash();\n    if (saveRestore) {\n      ctx.save();\n    }\n    ctx.scale(scaleX, scaleY);\n    SCALE_MATRIX.a = 1 / scaleX;\n    SCALE_MATRIX.d = 1 / scaleY;\n    const newPath = new Path2D();\n    newPath.addPath(path, SCALE_MATRIX);\n    if (dashes.length > 0) {\n      const scale = Math.max(scaleX, scaleY);\n      ctx.setLineDash(dashes.map(x => x / scale));\n      ctx.lineDashOffset /= scale;\n    }\n    ctx.lineWidth = lineWidth || 1;\n    ctx.stroke(newPath);\n    if (saveRestore) {\n      ctx.restore();\n    }\n  }\n  isContentVisible() {\n    for (let i = this.markedContentStack.length - 1; i >= 0; i--) {\n      if (!this.markedContentStack[i].visible) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\nfor (const op in OPS) {\n  if (CanvasGraphics.prototype[op] !== undefined) {\n    CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];\n  }\n}\n\n;// ./src/shared/base_pdf_stream.js\n\n\n\n\n\n\n\n\n\nclass BasePDFStream {\n  #PDFStreamReader = null;\n  #PDFStreamRangeReader = null;\n  _fullReader = null;\n  _rangeReaders = new Set();\n  _source = null;\n  constructor(source, PDFStreamReader, PDFStreamRangeReader) {\n    this._source = source;\n    this.#PDFStreamReader = PDFStreamReader;\n    this.#PDFStreamRangeReader = PDFStreamRangeReader;\n  }\n  get _progressiveDataLength() {\n    return this._fullReader?._loaded ?? 0;\n  }\n  getFullReader() {\n    assert(!this._fullReader, \"BasePDFStream.getFullReader can only be called once.\");\n    return this._fullReader = new this.#PDFStreamReader(this);\n  }\n  getRangeReader(begin, end) {\n    if (end <= this._progressiveDataLength) {\n      return null;\n    }\n    const reader = new this.#PDFStreamRangeReader(this, begin, end);\n    this._rangeReaders.add(reader);\n    return reader;\n  }\n  cancelAllRequests(reason) {\n    this._fullReader?.cancel(reason);\n    for (const reader of new Set(this._rangeReaders)) {\n      reader.cancel(reason);\n    }\n  }\n}\nclass BasePDFStreamReader {\n  onProgress = null;\n  _contentLength = 0;\n  _filename = null;\n  _headersCapability = Promise.withResolvers();\n  _isRangeSupported = false;\n  _isStreamingSupported = false;\n  _loaded = 0;\n  _stream = null;\n  constructor(stream) {\n    this._stream = stream;\n  }\n  _callOnProgress() {\n    this.onProgress?.({\n      loaded: this._loaded,\n      total: this._contentLength\n    });\n  }\n  get headersReady() {\n    return this._headersCapability.promise;\n  }\n  get filename() {\n    return this._filename;\n  }\n  get contentLength() {\n    return this._contentLength;\n  }\n  get isRangeSupported() {\n    return this._isRangeSupported;\n  }\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n  async read() {\n    unreachable(\"Abstract method `read` called\");\n  }\n  cancel(reason) {\n    unreachable(\"Abstract method `cancel` called\");\n  }\n}\nclass BasePDFStreamRangeReader {\n  _stream = null;\n  constructor(stream, begin, end) {\n    this._stream = stream;\n  }\n  async read() {\n    unreachable(\"Abstract method `read` called\");\n  }\n  cancel(reason) {\n    unreachable(\"Abstract method `cancel` called\");\n  }\n}\n\n;// ./src/display/content_disposition.js\n\n\n\nfunction getFilenameFromContentDispositionHeader(contentDisposition) {\n  let needsEncodingFixup = true;\n  let tmp = toParamRegExp(\"filename\\\\*\", \"i\").exec(contentDisposition);\n  if (tmp) {\n    tmp = tmp[1];\n    let filename = rfc2616unquote(tmp);\n    filename = unescape(filename);\n    filename = rfc5987decode(filename);\n    filename = rfc2047decode(filename);\n    return fixupEncoding(filename);\n  }\n  tmp = rfc2231getparam(contentDisposition);\n  if (tmp) {\n    const filename = rfc2047decode(tmp);\n    return fixupEncoding(filename);\n  }\n  tmp = toParamRegExp(\"filename\", \"i\").exec(contentDisposition);\n  if (tmp) {\n    tmp = tmp[1];\n    let filename = rfc2616unquote(tmp);\n    filename = rfc2047decode(filename);\n    return fixupEncoding(filename);\n  }\n  function toParamRegExp(attributePattern, flags) {\n    return new RegExp(\"(?:^|;)\\\\s*\" + attributePattern + \"\\\\s*=\\\\s*\" + \"(\" + '[^\";\\\\s][^;\\\\s]*' + \"|\" + '\"(?:[^\"\\\\\\\\]|\\\\\\\\\"?)+\"?' + \")\", flags);\n  }\n  function textdecode(encoding, value) {\n    if (encoding) {\n      if (!/^[\\x00-\\xFF]+$/.test(value)) {\n        return value;\n      }\n      try {\n        const decoder = new TextDecoder(encoding, {\n          fatal: true\n        });\n        const buffer = stringToBytes(value);\n        value = decoder.decode(buffer);\n        needsEncodingFixup = false;\n      } catch {}\n    }\n    return value;\n  }\n  function fixupEncoding(value) {\n    if (needsEncodingFixup && /[\\x80-\\xff]/.test(value)) {\n      value = textdecode(\"utf-8\", value);\n      if (needsEncodingFixup) {\n        value = textdecode(\"iso-8859-1\", value);\n      }\n    }\n    return value;\n  }\n  function rfc2231getparam(contentDispositionStr) {\n    const matches = [];\n    let match;\n    const iter = toParamRegExp(\"filename\\\\*((?!0\\\\d)\\\\d+)(\\\\*?)\", \"ig\");\n    while ((match = iter.exec(contentDispositionStr)) !== null) {\n      let [, n, quot, part] = match;\n      n = parseInt(n, 10);\n      if (n in matches) {\n        if (n === 0) {\n          break;\n        }\n        continue;\n      }\n      matches[n] = [quot, part];\n    }\n    const parts = [];\n    for (let n = 0; n < matches.length; ++n) {\n      if (!(n in matches)) {\n        break;\n      }\n      let [quot, part] = matches[n];\n      part = rfc2616unquote(part);\n      if (quot) {\n        part = unescape(part);\n        if (n === 0) {\n          part = rfc5987decode(part);\n        }\n      }\n      parts.push(part);\n    }\n    return parts.join(\"\");\n  }\n  function rfc2616unquote(value) {\n    if (value.startsWith('\"')) {\n      const parts = value.slice(1).split('\\\\\"');\n      for (let i = 0; i < parts.length; ++i) {\n        const quotindex = parts[i].indexOf('\"');\n        if (quotindex !== -1) {\n          parts[i] = parts[i].slice(0, quotindex);\n          parts.length = i + 1;\n        }\n        parts[i] = parts[i].replaceAll(/\\\\(.)/g, \"$1\");\n      }\n      value = parts.join('\"');\n    }\n    return value;\n  }\n  function rfc5987decode(extvalue) {\n    const encodingend = extvalue.indexOf(\"'\");\n    if (encodingend === -1) {\n      return extvalue;\n    }\n    const encoding = extvalue.slice(0, encodingend);\n    const langvalue = extvalue.slice(encodingend + 1);\n    const value = langvalue.replace(/^[^']*'/, \"\");\n    return textdecode(encoding, value);\n  }\n  function rfc2047decode(value) {\n    if (!value.startsWith(\"=?\") || /[\\x00-\\x19\\x80-\\xff]/.test(value)) {\n      return value;\n    }\n    return value.replaceAll(/=\\?([\\w-]*)\\?([QqBb])\\?((?:[^?]|\\?(?!=))*)\\?=/g, function (matches, charset, encoding, text) {\n      if (encoding === \"q\" || encoding === \"Q\") {\n        text = text.replaceAll(\"_\", \" \");\n        text = text.replaceAll(/=([0-9a-fA-F]{2})/g, function (match, hex) {\n          return String.fromCharCode(parseInt(hex, 16));\n        });\n        return textdecode(charset, text);\n      }\n      try {\n        text = atob(text);\n      } catch {}\n      return textdecode(charset, text);\n    });\n  }\n  return \"\";\n}\n\n;// ./src/display/network_utils.js\n\n\n\n\n\nfunction createHeaders(isHttp, httpHeaders) {\n  const headers = new Headers();\n  if (!isHttp || !httpHeaders || typeof httpHeaders !== \"object\") {\n    return headers;\n  }\n  for (const key in httpHeaders) {\n    const val = httpHeaders[key];\n    if (val !== undefined) {\n      headers.append(key, val);\n    }\n  }\n  return headers;\n}\nfunction getResponseOrigin(url) {\n  return URL.parse(url)?.origin ?? null;\n}\nfunction validateRangeRequestCapabilities({\n  responseHeaders,\n  isHttp,\n  rangeChunkSize,\n  disableRange\n}) {\n  const rv = {\n    contentLength: 0,\n    isRangeSupported: false\n  };\n  const length = parseInt(responseHeaders.get(\"Content-Length\"), 10);\n  if (!Number.isInteger(length)) {\n    return rv;\n  }\n  rv.contentLength = length;\n  if (length <= 2 * rangeChunkSize) {\n    return rv;\n  }\n  if (disableRange || !isHttp) {\n    return rv;\n  }\n  if (responseHeaders.get(\"Accept-Ranges\") !== \"bytes\") {\n    return rv;\n  }\n  const contentEncoding = responseHeaders.get(\"Content-Encoding\") || \"identity\";\n  if (contentEncoding === \"identity\") {\n    rv.isRangeSupported = true;\n  }\n  return rv;\n}\nfunction extractFilenameFromHeader(responseHeaders) {\n  const contentDisposition = responseHeaders.get(\"Content-Disposition\");\n  if (contentDisposition) {\n    let filename = getFilenameFromContentDispositionHeader(contentDisposition);\n    if (filename.includes(\"%\")) {\n      try {\n        filename = decodeURIComponent(filename);\n      } catch {}\n    }\n    if (isPdfFile(filename)) {\n      return filename;\n    }\n  }\n  return null;\n}\nfunction createResponseError(status, url) {\n  return new ResponseException(`Unexpected server response (${status}) while retrieving PDF \"${url.href}\".`, status, status === 404 || status === 0 && url.protocol === \"file:\");\n}\nfunction ensureResponseOrigin(rangeOrigin, origin) {\n  if (rangeOrigin !== origin) {\n    throw new Error(`Expected range response-origin \"${rangeOrigin}\" to match \"${origin}\".`);\n  }\n}\n\n;// ./src/display/fetch_stream.js\n\n\n\n\n\n\n\n\n\n\n\n\nfunction fetchUrl(url, headers, withCredentials, abortController) {\n  return fetch(url, {\n    method: \"GET\",\n    headers,\n    signal: abortController.signal,\n    mode: \"cors\",\n    credentials: withCredentials ? \"include\" : \"same-origin\",\n    redirect: \"follow\"\n  });\n}\nfunction ensureResponseStatus(status, url) {\n  if (status !== 200 && status !== 206) {\n    throw createResponseError(status, url);\n  }\n}\nfunction getArrayBuffer(val) {\n  if (val instanceof Uint8Array) {\n    return val.buffer;\n  }\n  if (val instanceof ArrayBuffer) {\n    return val;\n  }\n  throw new Error(`getArrayBuffer - unexpected data: ${val}`);\n}\nclass PDFFetchStream extends BasePDFStream {\n  _responseOrigin = null;\n  constructor(source) {\n    super(source, PDFFetchStreamReader, PDFFetchStreamRangeReader);\n    const {\n      httpHeaders,\n      url\n    } = source;\n    assert(/https?:/.test(url.protocol), \"PDFFetchStream only supports http(s):// URLs.\");\n    this.headers = createHeaders(true, httpHeaders);\n  }\n}\nclass PDFFetchStreamReader extends BasePDFStreamReader {\n  _abortController = new AbortController();\n  _reader = null;\n  constructor(stream) {\n    super(stream);\n    const {\n      disableRange,\n      disableStream,\n      rangeChunkSize,\n      url,\n      withCredentials\n    } = stream._source;\n    this._isStreamingSupported = !disableStream;\n    const headers = new Headers(stream.headers);\n    fetchUrl(url, headers, withCredentials, this._abortController).then(response => {\n      stream._responseOrigin = getResponseOrigin(response.url);\n      ensureResponseStatus(response.status, url);\n      this._reader = response.body.getReader();\n      const responseHeaders = response.headers;\n      const {\n        contentLength,\n        isRangeSupported\n      } = validateRangeRequestCapabilities({\n        responseHeaders,\n        isHttp: true,\n        rangeChunkSize,\n        disableRange\n      });\n      this._contentLength = contentLength;\n      this._isRangeSupported = isRangeSupported;\n      this._filename = extractFilenameFromHeader(responseHeaders);\n      if (!this._isStreamingSupported && this._isRangeSupported) {\n        this.cancel(new AbortException(\"Streaming is disabled.\"));\n      }\n      this._headersCapability.resolve();\n    }).catch(this._headersCapability.reject);\n  }\n  async read() {\n    await this._headersCapability.promise;\n    const {\n      value,\n      done\n    } = await this._reader.read();\n    if (done) {\n      return {\n        value,\n        done\n      };\n    }\n    this._loaded += value.byteLength;\n    this._callOnProgress();\n    return {\n      value: getArrayBuffer(value),\n      done: false\n    };\n  }\n  cancel(reason) {\n    this._reader?.cancel(reason);\n    this._abortController.abort();\n  }\n}\nclass PDFFetchStreamRangeReader extends BasePDFStreamRangeReader {\n  _abortController = new AbortController();\n  _readCapability = Promise.withResolvers();\n  _reader = null;\n  constructor(stream, begin, end) {\n    super(stream, begin, end);\n    const {\n      url,\n      withCredentials\n    } = stream._source;\n    const headers = new Headers(stream.headers);\n    headers.append(\"Range\", `bytes=${begin}-${end - 1}`);\n    fetchUrl(url, headers, withCredentials, this._abortController).then(response => {\n      const responseOrigin = getResponseOrigin(response.url);\n      ensureResponseOrigin(responseOrigin, stream._responseOrigin);\n      ensureResponseStatus(response.status, url);\n      this._reader = response.body.getReader();\n      this._readCapability.resolve();\n    }).catch(this._readCapability.reject);\n  }\n  async read() {\n    await this._readCapability.promise;\n    const {\n      value,\n      done\n    } = await this._reader.read();\n    if (done) {\n      return {\n        value,\n        done\n      };\n    }\n    return {\n      value: getArrayBuffer(value),\n      done: false\n    };\n  }\n  cancel(reason) {\n    this._reader?.cancel(reason);\n    this._abortController.abort();\n  }\n}\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.find.js\nvar es_iterator_find = __webpack_require__(116);\n;// ./src/display/transport_stream.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction transport_stream_getArrayBuffer(val) {\n  return val instanceof Uint8Array && val.byteLength === val.buffer.byteLength ? val.buffer : new Uint8Array(val).buffer;\n}\nfunction endRequests() {\n  for (const capability of this._requests) {\n    capability.resolve({\n      value: undefined,\n      done: true\n    });\n  }\n  this._requests.length = 0;\n}\nclass PDFDataTransportStream extends BasePDFStream {\n  _progressiveDone = false;\n  _queuedChunks = [];\n  constructor(source) {\n    super(source, PDFDataTransportStreamReader, PDFDataTransportStreamRangeReader);\n    const {\n      pdfDataRangeTransport\n    } = source;\n    const {\n      initialData,\n      progressiveDone\n    } = pdfDataRangeTransport;\n    if (initialData?.length > 0) {\n      const buffer = transport_stream_getArrayBuffer(initialData);\n      this._queuedChunks.push(buffer);\n    }\n    this._progressiveDone = progressiveDone;\n    const listener = args => {\n      switch (args.type) {\n        case \"range\":\n        case \"progressiveRead\":\n          this.#onReceiveData(args.begin, args.chunk);\n          break;\n        case \"progressiveDone\":\n          this._fullReader?.progressiveDone();\n          this._progressiveDone = true;\n          break;\n      }\n    };\n    pdfDataRangeTransport.transportReady(listener);\n  }\n  #onReceiveData(begin, chunk) {\n    const buffer = transport_stream_getArrayBuffer(chunk);\n    if (begin === undefined) {\n      if (this._fullReader) {\n        this._fullReader._enqueue(buffer);\n      } else {\n        this._queuedChunks.push(buffer);\n      }\n    } else {\n      const rangeReader = this._rangeReaders.keys().find(r => r._begin === begin);\n      assert(rangeReader, \"#onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.\");\n      rangeReader._enqueue(buffer);\n    }\n  }\n  getFullReader() {\n    const reader = super.getFullReader();\n    this._queuedChunks = null;\n    return reader;\n  }\n  getRangeReader(begin, end) {\n    const reader = super.getRangeReader(begin, end);\n    if (reader) {\n      reader.onDone = () => this._rangeReaders.delete(reader);\n      this._source.pdfDataRangeTransport.requestDataRange(begin, end);\n    }\n    return reader;\n  }\n  cancelAllRequests(reason) {\n    super.cancelAllRequests(reason);\n    this._source.pdfDataRangeTransport.abort();\n  }\n}\nclass PDFDataTransportStreamReader extends BasePDFStreamReader {\n  #endRequests = endRequests.bind(this);\n  _done = false;\n  _queuedChunks = null;\n  _requests = [];\n  constructor(stream) {\n    super(stream);\n    const {\n      pdfDataRangeTransport,\n      disableRange,\n      disableStream\n    } = stream._source;\n    const {\n      length,\n      contentDispositionFilename\n    } = pdfDataRangeTransport;\n    this._queuedChunks = stream._queuedChunks || [];\n    for (const chunk of this._queuedChunks) {\n      this._loaded += chunk.byteLength;\n    }\n    this._done = stream._progressiveDone;\n    this._contentLength = length;\n    this._isStreamingSupported = !disableStream;\n    this._isRangeSupported = !disableRange;\n    if (isPdfFile(contentDispositionFilename)) {\n      this._filename = contentDispositionFilename;\n    }\n    this._headersCapability.resolve();\n    const loaded = this._loaded;\n    Promise.resolve().then(() => {\n      if (loaded > 0 && this._loaded === loaded) {\n        this._callOnProgress();\n      }\n    });\n  }\n  _enqueue(chunk) {\n    if (this._done) {\n      return;\n    }\n    if (this._requests.length > 0) {\n      const capability = this._requests.shift();\n      capability.resolve({\n        value: chunk,\n        done: false\n      });\n    } else {\n      this._queuedChunks.push(chunk);\n    }\n    this._loaded += chunk.byteLength;\n    this._callOnProgress();\n  }\n  async read() {\n    if (this._queuedChunks.length > 0) {\n      const chunk = this._queuedChunks.shift();\n      return {\n        value: chunk,\n        done: false\n      };\n    }\n    if (this._done) {\n      return {\n        value: undefined,\n        done: true\n      };\n    }\n    const capability = Promise.withResolvers();\n    this._requests.push(capability);\n    return capability.promise;\n  }\n  cancel(reason) {\n    this._done = true;\n    this.#endRequests();\n  }\n  progressiveDone() {\n    this._done ||= true;\n    if (this._queuedChunks.length === 0) {\n      this.#endRequests();\n    }\n  }\n}\nclass PDFDataTransportStreamRangeReader extends BasePDFStreamRangeReader {\n  #endRequests = endRequests.bind(this);\n  onDone = null;\n  _begin = -1;\n  _done = false;\n  _queuedChunk = null;\n  _requests = [];\n  constructor(stream, begin, end) {\n    super(stream, begin, end);\n    this._begin = begin;\n  }\n  _enqueue(chunk) {\n    if (this._done) {\n      return;\n    }\n    if (this._requests.length === 0) {\n      this._queuedChunk = chunk;\n    } else {\n      const capability = this._requests.shift();\n      capability.resolve({\n        value: chunk,\n        done: false\n      });\n      this.#endRequests();\n    }\n    this._done = true;\n    this.onDone?.();\n  }\n  async read() {\n    if (this._queuedChunk) {\n      const chunk = this._queuedChunk;\n      this._queuedChunk = null;\n      return {\n        value: chunk,\n        done: false\n      };\n    }\n    if (this._done) {\n      return {\n        value: undefined,\n        done: true\n      };\n    }\n    const capability = Promise.withResolvers();\n    this._requests.push(capability);\n    return capability.promise;\n  }\n  cancel(reason) {\n    this._done = true;\n    this.#endRequests();\n    this.onDone?.();\n  }\n}\n\n;// ./src/display/network.js\n\n\n\n\n\n\n\n\n\n\nconst OK_RESPONSE = 200;\nconst PARTIAL_CONTENT_RESPONSE = 206;\nfunction network_getArrayBuffer(val) {\n  return typeof val !== \"string\" ? val : stringToBytes(val).buffer;\n}\nclass PDFNetworkStream extends BasePDFStream {\n  #pendingRequests = new WeakMap();\n  _responseOrigin = null;\n  constructor(source) {\n    super(source, PDFNetworkStreamReader, PDFNetworkStreamRangeReader);\n    const {\n      httpHeaders,\n      url\n    } = source;\n    this.url = url;\n    this.isHttp = /https?:/.test(url.protocol);\n    this.headers = createHeaders(this.isHttp, httpHeaders);\n  }\n  _request(args) {\n    const xhr = new XMLHttpRequest();\n    const pendingRequest = {\n      validateStatus: null,\n      onHeadersReceived: args.onHeadersReceived,\n      onDone: args.onDone,\n      onError: args.onError,\n      onProgress: args.onProgress\n    };\n    this.#pendingRequests.set(xhr, pendingRequest);\n    xhr.open(\"GET\", this.url);\n    xhr.withCredentials = this._source.withCredentials;\n    for (const [key, val] of this.headers) {\n      xhr.setRequestHeader(key, val);\n    }\n    if (this.isHttp && \"begin\" in args && \"end\" in args) {\n      xhr.setRequestHeader(\"Range\", `bytes=${args.begin}-${args.end - 1}`);\n      pendingRequest.validateStatus = status => status === PARTIAL_CONTENT_RESPONSE || status === OK_RESPONSE;\n    } else {\n      pendingRequest.validateStatus = status => status === OK_RESPONSE;\n    }\n    xhr.responseType = \"arraybuffer\";\n    assert(args.onError, \"Expected `onError` callback to be provided.\");\n    xhr.onerror = () => args.onError(xhr.status);\n    xhr.onreadystatechange = this.#onStateChange.bind(this, xhr);\n    xhr.onprogress = this.#onProgress.bind(this, xhr);\n    xhr.send(null);\n    return xhr;\n  }\n  #onProgress(xhr, evt) {\n    const pendingRequest = this.#pendingRequests.get(xhr);\n    pendingRequest?.onProgress?.(evt);\n  }\n  #onStateChange(xhr, evt) {\n    const pendingRequest = this.#pendingRequests.get(xhr);\n    if (!pendingRequest) {\n      return;\n    }\n    if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {\n      pendingRequest.onHeadersReceived();\n      delete pendingRequest.onHeadersReceived;\n    }\n    if (xhr.readyState !== 4) {\n      return;\n    }\n    if (!this.#pendingRequests.has(xhr)) {\n      return;\n    }\n    this.#pendingRequests.delete(xhr);\n    if (xhr.status === 0 && this.isHttp) {\n      pendingRequest.onError(xhr.status);\n      return;\n    }\n    const xhrStatus = xhr.status || OK_RESPONSE;\n    if (!pendingRequest.validateStatus(xhrStatus)) {\n      pendingRequest.onError(xhr.status);\n      return;\n    }\n    const chunk = network_getArrayBuffer(xhr.response);\n    if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {\n      const rangeHeader = xhr.getResponseHeader(\"Content-Range\");\n      if (/bytes (\\d+)-(\\d+)\\/(\\d+)/.test(rangeHeader)) {\n        pendingRequest.onDone(chunk);\n      } else {\n        warn(`Missing or invalid \"Content-Range\" header.`);\n        pendingRequest.onError(0);\n      }\n    } else if (chunk) {\n      pendingRequest.onDone(chunk);\n    } else {\n      pendingRequest.onError(xhr.status);\n    }\n  }\n  _abortRequest(xhr) {\n    if (this.#pendingRequests.has(xhr)) {\n      this.#pendingRequests.delete(xhr);\n      xhr.abort();\n    }\n  }\n  getRangeReader(begin, end) {\n    const reader = super.getRangeReader(begin, end);\n    if (reader) {\n      reader.onClosed = () => this._rangeReaders.delete(reader);\n    }\n    return reader;\n  }\n}\nclass PDFNetworkStreamReader extends BasePDFStreamReader {\n  #endRequests = endRequests.bind(this);\n  _cachedChunks = [];\n  _done = false;\n  _requests = [];\n  _storedError = null;\n  constructor(stream) {\n    super(stream);\n    this._fullRequestXhr = stream._request({\n      onHeadersReceived: this.#onHeadersReceived.bind(this),\n      onDone: this.#onDone.bind(this),\n      onError: this.#onError.bind(this),\n      onProgress: this.#onProgress.bind(this)\n    });\n  }\n  #onHeadersReceived() {\n    const stream = this._stream;\n    const {\n      disableRange,\n      rangeChunkSize\n    } = stream._source;\n    const fullRequestXhr = this._fullRequestXhr;\n    stream._responseOrigin = getResponseOrigin(fullRequestXhr.responseURL);\n    const rawResponseHeaders = fullRequestXhr.getAllResponseHeaders();\n    const responseHeaders = new Headers(rawResponseHeaders ? rawResponseHeaders.trimStart().replace(/[^\\S ]+$/, \"\").split(/[\\r\\n]+/).map(x => {\n      const [key, ...val] = x.split(\": \");\n      return [key, val.join(\": \")];\n    }) : []);\n    const {\n      contentLength,\n      isRangeSupported\n    } = validateRangeRequestCapabilities({\n      responseHeaders,\n      isHttp: stream.isHttp,\n      rangeChunkSize,\n      disableRange\n    });\n    this._contentLength = contentLength;\n    this._isRangeSupported = isRangeSupported;\n    this._filename = extractFilenameFromHeader(responseHeaders);\n    if (this._isRangeSupported) {\n      stream._abortRequest(fullRequestXhr);\n    }\n    this._headersCapability.resolve();\n  }\n  #onDone(chunk) {\n    if (this._requests.length > 0) {\n      const capability = this._requests.shift();\n      capability.resolve({\n        value: chunk,\n        done: false\n      });\n    } else {\n      this._cachedChunks.push(chunk);\n    }\n    this._done = true;\n    if (this._cachedChunks.length === 0) {\n      this.#endRequests();\n    }\n  }\n  #onError(status) {\n    this._storedError = createResponseError(status, this._stream.url);\n    this._headersCapability.reject(this._storedError);\n    for (const capability of this._requests) {\n      capability.reject(this._storedError);\n    }\n    this._requests.length = 0;\n    this._cachedChunks.length = 0;\n  }\n  #onProgress(evt) {\n    this.onProgress?.({\n      loaded: evt.loaded,\n      total: evt.lengthComputable ? evt.total : this._contentLength\n    });\n  }\n  async read() {\n    await this._headersCapability.promise;\n    if (this._storedError) {\n      throw this._storedError;\n    }\n    if (this._cachedChunks.length > 0) {\n      const chunk = this._cachedChunks.shift();\n      return {\n        value: chunk,\n        done: false\n      };\n    }\n    if (this._done) {\n      return {\n        value: undefined,\n        done: true\n      };\n    }\n    const capability = Promise.withResolvers();\n    this._requests.push(capability);\n    return capability.promise;\n  }\n  cancel(reason) {\n    this._done = true;\n    this._headersCapability.reject(reason);\n    this.#endRequests();\n    this._stream._abortRequest(this._fullRequestXhr);\n    this._fullRequestXhr = null;\n  }\n}\nclass PDFNetworkStreamRangeReader extends BasePDFStreamRangeReader {\n  #endRequests = endRequests.bind(this);\n  onClosed = null;\n  _done = false;\n  _queuedChunk = null;\n  _requests = [];\n  _storedError = null;\n  constructor(stream, begin, end) {\n    super(stream, begin, end);\n    this._requestXhr = stream._request({\n      begin,\n      end,\n      onHeadersReceived: this.#onHeadersReceived.bind(this),\n      onDone: this.#onDone.bind(this),\n      onError: this.#onError.bind(this),\n      onProgress: null\n    });\n  }\n  #onHeadersReceived() {\n    const responseOrigin = getResponseOrigin(this._requestXhr?.responseURL);\n    try {\n      ensureResponseOrigin(responseOrigin, this._stream._responseOrigin);\n    } catch (ex) {\n      this._storedError = ex;\n      this.#onError(0);\n    }\n  }\n  #onDone(chunk) {\n    if (this._requests.length > 0) {\n      const capability = this._requests.shift();\n      capability.resolve({\n        value: chunk,\n        done: false\n      });\n    } else {\n      this._queuedChunk = chunk;\n    }\n    this._done = true;\n    this.#endRequests();\n    this.onClosed?.();\n  }\n  #onError(status) {\n    this._storedError ??= createResponseError(status, this._stream.url);\n    for (const capability of this._requests) {\n      capability.reject(this._storedError);\n    }\n    this._requests.length = 0;\n    this._queuedChunk = null;\n  }\n  async read() {\n    if (this._storedError) {\n      throw this._storedError;\n    }\n    if (this._queuedChunk !== null) {\n      const chunk = this._queuedChunk;\n      this._queuedChunk = null;\n      return {\n        value: chunk,\n        done: false\n      };\n    }\n    if (this._done) {\n      return {\n        value: undefined,\n        done: true\n      };\n    }\n    const capability = Promise.withResolvers();\n    this._requests.push(capability);\n    return capability.promise;\n  }\n  cancel(reason) {\n    this._done = true;\n    this.#endRequests();\n    this._stream._abortRequest(this._requestXhr);\n    this.onClosed?.();\n  }\n}\n\n;// ./src/display/node_stream.js\n\n\n\n\n\nfunction getReadableStream(url, opts = null) {\n  const fs = process.getBuiltinModule(\"fs\");\n  const {\n    Readable\n  } = process.getBuiltinModule(\"stream\");\n  const readStream = fs.createReadStream(url, opts);\n  return Readable.toWeb(readStream);\n}\nclass PDFNodeStream extends BasePDFStream {\n  constructor(source) {\n    super(source, PDFNodeStreamReader, PDFNodeStreamRangeReader);\n    const {\n      url\n    } = source;\n    assert(url.protocol === \"file:\", \"PDFNodeStream only supports file:// URLs.\");\n  }\n}\nclass PDFNodeStreamReader extends BasePDFStreamReader {\n  _reader = null;\n  constructor(stream) {\n    super(stream);\n    const {\n      disableRange,\n      disableStream,\n      rangeChunkSize,\n      url\n    } = stream._source;\n    this._isStreamingSupported = !disableStream;\n    const fs = process.getBuiltinModule(\"fs/promises\");\n    fs.lstat(url).then(stat => {\n      const readableStream = getReadableStream(url);\n      this._reader = readableStream.getReader();\n      const {\n        size\n      } = stat;\n      this._contentLength = size;\n      this._isRangeSupported = !disableRange && size > 2 * rangeChunkSize;\n      if (!this._isStreamingSupported && this._isRangeSupported) {\n        this.cancel(new AbortException(\"Streaming is disabled.\"));\n      }\n      this._headersCapability.resolve();\n    }).catch(error => {\n      if (error.code === \"ENOENT\") {\n        error = createResponseError(0, url);\n      }\n      this._headersCapability.reject(error);\n    });\n  }\n  async read() {\n    await this._headersCapability.promise;\n    const {\n      value,\n      done\n    } = await this._reader.read();\n    if (done) {\n      return {\n        value,\n        done\n      };\n    }\n    this._loaded += value.byteLength;\n    this._callOnProgress();\n    return {\n      value: getArrayBuffer(value),\n      done: false\n    };\n  }\n  cancel(reason) {\n    this._reader?.cancel(reason);\n  }\n}\nclass PDFNodeStreamRangeReader extends BasePDFStreamRangeReader {\n  _readCapability = Promise.withResolvers();\n  _reader = null;\n  constructor(stream, begin, end) {\n    super(stream, begin, end);\n    const {\n      url\n    } = stream._source;\n    try {\n      const readableStream = getReadableStream(url, {\n        start: begin,\n        end: end - 1\n      });\n      this._reader = readableStream.getReader();\n      this._readCapability.resolve();\n    } catch (error) {\n      this._readCapability.reject(error);\n    }\n  }\n  async read() {\n    await this._readCapability.promise;\n    const {\n      value,\n      done\n    } = await this._reader.read();\n    if (done) {\n      return {\n        value,\n        done\n      };\n    }\n    return {\n      value: getArrayBuffer(value),\n      done: false\n    };\n  }\n  cancel(reason) {\n    this._reader?.cancel(reason);\n  }\n}\n\n;// ./src/display/network_stream.js\n\n\n\n\n\nfunction getNetworkStream(url) {\n  return isValidFetchUrl(url) ? PDFFetchStream : isNodeJS ? PDFNodeStream : PDFNetworkStream;\n}\n\n;// ./src/display/worker_options.js\nclass GlobalWorkerOptions {\n  static #port = null;\n  static #src = \"\";\n  static get workerPort() {\n    return this.#port;\n  }\n  static set workerPort(val) {\n    if (!(typeof Worker !== \"undefined\" && val instanceof Worker) && val !== null) {\n      throw new Error(\"Invalid `workerPort` type.\");\n    }\n    this.#port = val;\n  }\n  static get workerSrc() {\n    return this.#src;\n  }\n  static set workerSrc(val) {\n    if (typeof val !== \"string\") {\n      throw new Error(\"Invalid `workerSrc` type.\");\n    }\n    this.#src = val;\n  }\n}\n\n;// ./src/display/metadata.js\nclass Metadata {\n  #map;\n  #data;\n  constructor({\n    parsedData,\n    rawData\n  }) {\n    this.#map = parsedData;\n    this.#data = rawData;\n  }\n  getRaw() {\n    return this.#data;\n  }\n  get(name) {\n    return this.#map.get(name) ?? null;\n  }\n  [Symbol.iterator]() {\n    return this.#map.entries();\n  }\n}\n\n;// ./src/display/optional_content_config.js\n\n\n\n\nconst INTERNAL = Symbol(\"INTERNAL\");\nclass OptionalContentGroup {\n  #isDisplay = false;\n  #isPrint = false;\n  #userSet = false;\n  #visible = true;\n  constructor(renderingIntent, {\n    name,\n    intent,\n    usage,\n    rbGroups\n  }) {\n    this.#isDisplay = !!(renderingIntent & RenderingIntentFlag.DISPLAY);\n    this.#isPrint = !!(renderingIntent & RenderingIntentFlag.PRINT);\n    this.name = name;\n    this.intent = intent;\n    this.usage = usage;\n    this.rbGroups = rbGroups;\n  }\n  get visible() {\n    if (this.#userSet) {\n      return this.#visible;\n    }\n    if (!this.#visible) {\n      return false;\n    }\n    const {\n      print,\n      view\n    } = this.usage;\n    if (this.#isDisplay) {\n      return view?.viewState !== \"OFF\";\n    } else if (this.#isPrint) {\n      return print?.printState !== \"OFF\";\n    }\n    return true;\n  }\n  _setVisible(internal, visible, userSet = false) {\n    if (internal !== INTERNAL) {\n      unreachable(\"Internal method `_setVisible` called.\");\n    }\n    this.#userSet = userSet;\n    this.#visible = visible;\n  }\n}\nclass OptionalContentConfig {\n  #cachedGetHash = null;\n  #groups = new Map();\n  #initialHash = null;\n  #order = null;\n  constructor(data, renderingIntent = RenderingIntentFlag.DISPLAY) {\n    this.renderingIntent = renderingIntent;\n    this.name = null;\n    this.creator = null;\n    if (data === null) {\n      return;\n    }\n    this.name = data.name;\n    this.creator = data.creator;\n    this.#order = data.order;\n    for (const group of data.groups) {\n      this.#groups.set(group.id, new OptionalContentGroup(renderingIntent, group));\n    }\n    if (data.baseState === \"OFF\") {\n      for (const group of this.#groups.values()) {\n        group._setVisible(INTERNAL, false);\n      }\n    }\n    for (const on of data.on) {\n      this.#groups.get(on)._setVisible(INTERNAL, true);\n    }\n    for (const off of data.off) {\n      this.#groups.get(off)._setVisible(INTERNAL, false);\n    }\n    this.#initialHash = this.getHash();\n  }\n  #evaluateVisibilityExpression(array) {\n    const length = array.length;\n    if (length < 2) {\n      return true;\n    }\n    const operator = array[0];\n    for (let i = 1; i < length; i++) {\n      const element = array[i];\n      let state;\n      if (Array.isArray(element)) {\n        state = this.#evaluateVisibilityExpression(element);\n      } else if (this.#groups.has(element)) {\n        state = this.#groups.get(element).visible;\n      } else {\n        warn(`Optional content group not found: ${element}`);\n        return true;\n      }\n      switch (operator) {\n        case \"And\":\n          if (!state) {\n            return false;\n          }\n          break;\n        case \"Or\":\n          if (state) {\n            return true;\n          }\n          break;\n        case \"Not\":\n          return !state;\n        default:\n          return true;\n      }\n    }\n    return operator === \"And\";\n  }\n  isVisible(group) {\n    if (this.#groups.size === 0) {\n      return true;\n    }\n    if (!group) {\n      info(\"Optional content group not defined.\");\n      return true;\n    }\n    if (group.type === \"OCG\") {\n      if (!this.#groups.has(group.id)) {\n        warn(`Optional content group not found: ${group.id}`);\n        return true;\n      }\n      return this.#groups.get(group.id).visible;\n    } else if (group.type === \"OCMD\") {\n      if (group.expression) {\n        return this.#evaluateVisibilityExpression(group.expression);\n      }\n      if (!group.policy || group.policy === \"AnyOn\") {\n        for (const id of group.ids) {\n          if (!this.#groups.has(id)) {\n            warn(`Optional content group not found: ${id}`);\n            return true;\n          }\n          if (this.#groups.get(id).visible) {\n            return true;\n          }\n        }\n        return false;\n      } else if (group.policy === \"AllOn\") {\n        for (const id of group.ids) {\n          if (!this.#groups.has(id)) {\n            warn(`Optional content group not found: ${id}`);\n            return true;\n          }\n          if (!this.#groups.get(id).visible) {\n            return false;\n          }\n        }\n        return true;\n      } else if (group.policy === \"AnyOff\") {\n        for (const id of group.ids) {\n          if (!this.#groups.has(id)) {\n            warn(`Optional content group not found: ${id}`);\n            return true;\n          }\n          if (!this.#groups.get(id).visible) {\n            return true;\n          }\n        }\n        return false;\n      } else if (group.policy === \"AllOff\") {\n        for (const id of group.ids) {\n          if (!this.#groups.has(id)) {\n            warn(`Optional content group not found: ${id}`);\n            return true;\n          }\n          if (this.#groups.get(id).visible) {\n            return false;\n          }\n        }\n        return true;\n      }\n      warn(`Unknown optional content policy ${group.policy}.`);\n      return true;\n    }\n    warn(`Unknown group type ${group.type}.`);\n    return true;\n  }\n  setVisibility(id, visible = true, preserveRB = true) {\n    const group = this.#groups.get(id);\n    if (!group) {\n      warn(`Optional content group not found: ${id}`);\n      return;\n    }\n    if (preserveRB && visible && group.rbGroups.length) {\n      for (const rbGroup of group.rbGroups) {\n        for (const otherId of rbGroup) {\n          if (otherId !== id) {\n            this.#groups.get(otherId)?._setVisible(INTERNAL, false, true);\n          }\n        }\n      }\n    }\n    group._setVisible(INTERNAL, !!visible, true);\n    this.#cachedGetHash = null;\n  }\n  setOCGState({\n    state,\n    preserveRB\n  }) {\n    let operator;\n    for (const elem of state) {\n      switch (elem) {\n        case \"ON\":\n        case \"OFF\":\n        case \"Toggle\":\n          operator = elem;\n          continue;\n      }\n      const group = this.#groups.get(elem);\n      if (!group) {\n        continue;\n      }\n      switch (operator) {\n        case \"ON\":\n          this.setVisibility(elem, true, preserveRB);\n          break;\n        case \"OFF\":\n          this.setVisibility(elem, false, preserveRB);\n          break;\n        case \"Toggle\":\n          this.setVisibility(elem, !group.visible, preserveRB);\n          break;\n      }\n    }\n    this.#cachedGetHash = null;\n  }\n  get hasInitialVisibility() {\n    return this.#initialHash === null || this.getHash() === this.#initialHash;\n  }\n  getOrder() {\n    if (!this.#groups.size) {\n      return null;\n    }\n    if (this.#order) {\n      return this.#order.slice();\n    }\n    return [...this.#groups.keys()];\n  }\n  getGroup(id) {\n    return this.#groups.get(id) || null;\n  }\n  getHash() {\n    if (this.#cachedGetHash !== null) {\n      return this.#cachedGetHash;\n    }\n    const hash = new MurmurHash3_64();\n    for (const [id, group] of this.#groups) {\n      hash.update(`${id}:${group.visible}`);\n    }\n    return this.#cachedGetHash = hash.hexdigest();\n  }\n  [Symbol.iterator]() {\n    return this.#groups.entries();\n  }\n}\n\n;// ./src/display/pages_mapper.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass PagesMapper {\n  #pageNumberToId = null;\n  #prevPageNumbers = null;\n  #pagesNumber = 0;\n  #clipboard = null;\n  #savedData = null;\n  get pagesNumber() {\n    return this.#pagesNumber;\n  }\n  set pagesNumber(n) {\n    if (this.#pagesNumber === n) {\n      return;\n    }\n    this.#pagesNumber = n;\n    this.#pageNumberToId = null;\n    this.#prevPageNumbers = null;\n  }\n  #ensureInit() {\n    if (this.#pageNumberToId) {\n      return;\n    }\n    const n = this.#pagesNumber;\n    const pageNumberToId = this.#pageNumberToId = new Uint32Array(n);\n    for (let i = 0; i < n; i++) {\n      pageNumberToId[i] = i + 1;\n    }\n    this.#prevPageNumbers = new Int32Array(pageNumberToId);\n  }\n  #buildIdToPageNumber() {\n    const idToPageNumber = new Map();\n    const pageNumberToId = this.#pageNumberToId;\n    for (let i = 0, ii = this.#pagesNumber; i < ii; i++) {\n      const id = pageNumberToId[i];\n      const pageNumbers = idToPageNumber.get(id);\n      if (pageNumbers) {\n        pageNumbers.push(i + 1);\n      } else {\n        idToPageNumber.set(id, [i + 1]);\n      }\n    }\n    return idToPageNumber;\n  }\n  movePages(selectedPages, pagesToMove, index) {\n    this.#ensureInit();\n    const pageNumberToId = this.#pageNumberToId;\n    const prevIdToPageNumber = this.#buildIdToPageNumber();\n    const movedCount = pagesToMove.length;\n    const mappedPagesToMove = new Uint32Array(movedCount);\n    let removedBeforeTarget = 0;\n    for (let i = 0; i < movedCount; i++) {\n      const pageIndex = pagesToMove[i] - 1;\n      mappedPagesToMove[i] = pageNumberToId[pageIndex];\n      if (pageIndex < index) {\n        removedBeforeTarget++;\n      }\n    }\n    const pagesNumber = this.#pagesNumber;\n    const remainingLen = pagesNumber - movedCount;\n    const adjustedTarget = MathClamp(index - removedBeforeTarget, 0, remainingLen);\n    for (let i = 0, r = 0; i < pagesNumber; i++) {\n      if (!selectedPages.has(i + 1)) {\n        pageNumberToId[r++] = pageNumberToId[i];\n      }\n    }\n    pageNumberToId.copyWithin(adjustedTarget + movedCount, adjustedTarget, remainingLen);\n    pageNumberToId.set(mappedPagesToMove, adjustedTarget);\n    this.#updatePrevPageNumbers(prevIdToPageNumber);\n    if (pageNumberToId.every((id, i) => id === i + 1)) {\n      this.#pageNumberToId = null;\n    }\n  }\n  deletePages(pagesToDelete) {\n    this.#ensureInit();\n    const pageNumberToId = this.#pageNumberToId;\n    const prevIdToPageNumber = this.#buildIdToPageNumber();\n    this.#savedData = {\n      pageNumberToId: pageNumberToId.slice(),\n      pagesNumber: this.#pagesNumber,\n      prevPageNumbers: this.#prevPageNumbers.slice()\n    };\n    const newN = this.#pagesNumber - pagesToDelete.length;\n    this.#pagesNumber = newN;\n    const newPageNumberToId = this.#pageNumberToId = new Uint32Array(newN);\n    this.#prevPageNumbers = new Int32Array(newN);\n    let sourceIndex = 0;\n    let destIndex = 0;\n    for (const pageNumber of pagesToDelete) {\n      const pageIndex = pageNumber - 1;\n      if (pageIndex !== sourceIndex) {\n        newPageNumberToId.set(pageNumberToId.subarray(sourceIndex, pageIndex), destIndex);\n        destIndex += pageIndex - sourceIndex;\n      }\n      sourceIndex = pageIndex + 1;\n    }\n    if (sourceIndex < pageNumberToId.length) {\n      newPageNumberToId.set(pageNumberToId.subarray(sourceIndex), destIndex);\n    }\n    this.#updatePrevPageNumbers(prevIdToPageNumber, new Set(pagesToDelete));\n  }\n  cancelDelete() {\n    if (this.#savedData) {\n      this.#pageNumberToId = this.#savedData.pageNumberToId;\n      this.#pagesNumber = this.#savedData.pagesNumber;\n      this.#prevPageNumbers = this.#savedData.prevPageNumbers;\n      this.#savedData = null;\n    }\n  }\n  cleanSavedData() {\n    this.#savedData = null;\n  }\n  copyPages(pagesToCopy) {\n    this.#ensureInit();\n    this.#clipboard = {\n      pageNumbers: pagesToCopy,\n      pageIds: pagesToCopy.map(n => this.#pageNumberToId[n - 1])\n    };\n  }\n  cancelCopy() {\n    this.#clipboard = null;\n  }\n  pastePages(index) {\n    this.#ensureInit();\n    const pageNumberToId = this.#pageNumberToId;\n    const prevIdToPageNumber = this.#buildIdToPageNumber();\n    const {\n      pageNumbers: copiedPageNumbers,\n      pageIds: copiedPageIds\n    } = this.#clipboard;\n    const newN = this.#pagesNumber + copiedPageNumbers.length;\n    this.#pagesNumber = newN;\n    const newPageNumberToId = this.#pageNumberToId = new Uint32Array(newN);\n    this.#prevPageNumbers = new Int32Array(newN);\n    newPageNumberToId.set(pageNumberToId.subarray(0, index), 0);\n    newPageNumberToId.set(copiedPageIds, index);\n    newPageNumberToId.set(pageNumberToId.subarray(index), index + copiedPageNumbers.length);\n    this.#updatePrevPageNumbers(prevIdToPageNumber, null, index, copiedPageNumbers);\n    this.#clipboard = null;\n  }\n  #updatePrevPageNumbers(prevIdToPageNumber, deletedPageNumbers = null, pasteIndex = -1, copiedPageNumbers = null) {\n    const prevPageNumbers = this.#prevPageNumbers;\n    const newPageNumberToId = this.#pageNumberToId;\n    const pasteEnd = pasteIndex + (copiedPageNumbers?.length ?? 0);\n    const idsIndices = new Map();\n    for (let i = 0, ii = this.#pagesNumber; i < ii; i++) {\n      if (i >= pasteIndex && i < pasteEnd) {\n        prevPageNumbers[i] = -copiedPageNumbers[i - pasteIndex];\n        continue;\n      }\n      const id = newPageNumberToId[i];\n      const oldPositions = prevIdToPageNumber.get(id);\n      let j = idsIndices.get(id) || 0;\n      if (deletedPageNumbers && oldPositions) {\n        while (j < oldPositions.length && deletedPageNumbers.has(oldPositions[j])) {\n          j++;\n        }\n      }\n      prevPageNumbers[i] = oldPositions?.[j];\n      idsIndices.set(id, j + 1);\n    }\n  }\n  hasBeenAltered() {\n    return this.#pageNumberToId !== null;\n  }\n  getPageMappingForSaving(idToPageNumber = null) {\n    idToPageNumber ??= this.#buildIdToPageNumber();\n    let nCopy = 0;\n    for (const pageNumbers of idToPageNumber.values()) {\n      nCopy = Math.max(nCopy, pageNumbers.length);\n    }\n    const extractParams = new Array(nCopy);\n    for (let i = 0; i < nCopy; i++) {\n      extractParams[i] = {\n        document: null,\n        pageIndices: [],\n        includePages: []\n      };\n    }\n    for (const [id, pageNumbers] of idToPageNumber) {\n      for (let i = 0, ii = pageNumbers.length; i < ii; i++) {\n        extractParams[i].includePages.push([id - 1, pageNumbers[i] - 1]);\n      }\n    }\n    for (const {\n      includePages,\n      pageIndices\n    } of extractParams) {\n      includePages.sort((a, b) => a[0] - b[0]);\n      for (let i = 0, ii = includePages.length; i < ii; i++) {\n        pageIndices.push(includePages[i][1]);\n        includePages[i] = includePages[i][0];\n      }\n    }\n    return extractParams;\n  }\n  extractPages(extractedPageNumbers) {\n    extractedPageNumbers = Array.from(extractedPageNumbers).sort((a, b) => a - b);\n    const usedIds = new Map();\n    for (let i = 0, ii = extractedPageNumbers.length; i < ii; i++) {\n      const id = this.getPageId(extractedPageNumbers[i]);\n      const usedPageNumbers = usedIds.getOrInsertComputed(id, makeArr);\n      usedPageNumbers.push(i + 1);\n    }\n    return this.getPageMappingForSaving(usedIds);\n  }\n  getPrevPageNumber(pageNumber) {\n    return this.#prevPageNumbers?.[pageNumber - 1] ?? 0;\n  }\n  getPageNumber(id) {\n    if (!this.#pageNumberToId) {\n      return id;\n    }\n    const pageNumberToId = this.#pageNumberToId;\n    for (let i = 0, ii = this.#pagesNumber; i < ii; i++) {\n      if (pageNumberToId[i] === id) {\n        return i + 1;\n      }\n    }\n    return 0;\n  }\n  getPageId(pageNumber) {\n    return this.#pageNumberToId?.[pageNumber - 1] ?? pageNumber;\n  }\n  getMapping() {\n    return this.#pageNumberToId?.subarray(0, this.pagesNumber);\n  }\n}\n\n;// ./src/display/pdf_objects.js\n\n\n\nconst INITIAL_DATA = Symbol(\"INITIAL_DATA\");\nconst dataObj = () => ({\n  ...Promise.withResolvers(),\n  data: INITIAL_DATA\n});\nclass PDFObjects {\n  #objs = new Map();\n  get(objId, callback = null) {\n    if (callback) {\n      const obj = this.#objs.getOrInsertComputed(objId, dataObj);\n      obj.promise.then(() => callback(obj.data));\n      return null;\n    }\n    const obj = this.#objs.get(objId);\n    if (!obj || obj.data === INITIAL_DATA) {\n      throw new Error(`Requesting object that isn't resolved yet ${objId}.`);\n    }\n    return obj.data;\n  }\n  has(objId) {\n    const obj = this.#objs.get(objId);\n    return !!obj && obj.data !== INITIAL_DATA;\n  }\n  delete(objId) {\n    const obj = this.#objs.get(objId);\n    if (!obj || obj.data === INITIAL_DATA) {\n      return false;\n    }\n    this.#objs.delete(objId);\n    return true;\n  }\n  resolve(objId, data = null) {\n    const obj = this.#objs.getOrInsertComputed(objId, dataObj);\n    if (obj.data !== INITIAL_DATA) {\n      throw new Error(`Object already resolved ${objId}.`);\n    }\n    obj.data = data;\n    obj.resolve();\n  }\n  clear() {\n    for (const {\n      data\n    } of this.#objs.values()) {\n      data?.bitmap?.close();\n    }\n    this.#objs.clear();\n  }\n  *[Symbol.iterator]() {\n    for (const [objId, {\n      data\n    }] of this.#objs) {\n      if (data !== INITIAL_DATA) {\n        yield [objId, data];\n      }\n    }\n  }\n}\n\n;// ./src/display/text_layer.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst MAX_TEXT_DIVS_TO_RENDER = 100000;\nconst DEFAULT_FONT_SIZE = 30;\nclass TextLayer {\n  #capability = Promise.withResolvers();\n  #container = null;\n  #disableProcessItems = false;\n  #fontInspectorEnabled = !!globalThis.FontInspector?.enabled;\n  #imagesHandler = null;\n  #lang = null;\n  #layoutTextParams = null;\n  #pageHeight = 0;\n  #pageWidth = 0;\n  #reader = null;\n  #rootContainer = null;\n  #rotation = 0;\n  #scale = 0;\n  #styleCache = Object.create(null);\n  #textContentItemsStr = [];\n  #textContentSource = null;\n  #textDivs = [];\n  #textDivProperties = new WeakMap();\n  #transform = null;\n  static #ascentCache = new Map();\n  static #canvasContexts = new Map();\n  static #canvasCtxFonts = new WeakMap();\n  static #minFontSize = null;\n  static #pendingTextLayers = new Set();\n  constructor({\n    textContentSource,\n    images,\n    container,\n    viewport\n  }) {\n    if (textContentSource instanceof ReadableStream) {\n      this.#textContentSource = textContentSource;\n    } else if (typeof textContentSource === \"object\") {\n      this.#textContentSource = new ReadableStream({\n        start(controller) {\n          controller.enqueue(textContentSource);\n          controller.close();\n        }\n      });\n    } else {\n      throw new Error('No \"textContentSource\" parameter specified.');\n    }\n    this.#container = this.#rootContainer = container;\n    this.#imagesHandler = images;\n    this.#scale = viewport.scale * OutputScale.pixelRatio;\n    this.#rotation = viewport.rotation;\n    this.#layoutTextParams = {\n      div: null,\n      properties: null,\n      ctx: null\n    };\n    const {\n      pageWidth,\n      pageHeight,\n      pageX,\n      pageY\n    } = viewport.rawDims;\n    this.#transform = [1, 0, 0, -1, -pageX, pageY + pageHeight];\n    this.#pageWidth = pageWidth;\n    this.#pageHeight = pageHeight;\n    TextLayer.#ensureMinFontSizeComputed();\n    container.style.setProperty(\"--min-font-size\", TextLayer.#minFontSize);\n    setLayerDimensions(container, viewport);\n    this.#capability.promise.finally(() => {\n      TextLayer.#pendingTextLayers.delete(this);\n      this.#layoutTextParams = null;\n      this.#styleCache = null;\n    }).catch(() => {});\n  }\n  static get fontFamilyMap() {\n    const {\n      isWindows,\n      isFirefox\n    } = FeatureTest.platform;\n    return shadow(this, \"fontFamilyMap\", new Map([[\"sans-serif\", `${isWindows && isFirefox ? \"Calibri, \" : \"\"}sans-serif`], [\"monospace\", `${isWindows && isFirefox ? \"Lucida Console, \" : \"\"}monospace`]]));\n  }\n  render() {\n    if (this.#imagesHandler) {\n      this.#container.append(this.#imagesHandler.render());\n    }\n    const pump = () => {\n      this.#reader.read().then(({\n        value,\n        done\n      }) => {\n        if (done) {\n          this.#capability.resolve();\n          return;\n        }\n        this.#lang ??= value.lang;\n        Object.assign(this.#styleCache, value.styles);\n        this.#processItems(value.items);\n        pump();\n      }, this.#capability.reject);\n    };\n    this.#reader = this.#textContentSource.getReader();\n    TextLayer.#pendingTextLayers.add(this);\n    pump();\n    return this.#capability.promise;\n  }\n  update({\n    viewport,\n    onBefore = null\n  }) {\n    const scale = viewport.scale * OutputScale.pixelRatio;\n    const rotation = viewport.rotation;\n    if (rotation !== this.#rotation) {\n      onBefore?.();\n      this.#rotation = rotation;\n      setLayerDimensions(this.#rootContainer, {\n        rotation\n      });\n    }\n    if (scale !== this.#scale) {\n      onBefore?.();\n      this.#scale = scale;\n      const params = {\n        div: null,\n        properties: null,\n        ctx: TextLayer.#getCtx(this.#lang)\n      };\n      for (const div of this.#textDivs) {\n        params.properties = this.#textDivProperties.get(div);\n        params.div = div;\n        this.#layout(params);\n      }\n    }\n  }\n  cancel() {\n    const abortEx = new AbortException(\"TextLayer task cancelled.\");\n    this.#reader?.cancel(abortEx).catch(() => {});\n    this.#reader = null;\n    this.#capability.reject(abortEx);\n  }\n  get textDivs() {\n    return this.#textDivs;\n  }\n  get textContentItemsStr() {\n    return this.#textContentItemsStr;\n  }\n  #processItems(items) {\n    if (this.#disableProcessItems) {\n      return;\n    }\n    this.#layoutTextParams.ctx ??= TextLayer.#getCtx(this.#lang);\n    const textDivs = this.#textDivs,\n      textContentItemsStr = this.#textContentItemsStr;\n    for (const item of items) {\n      if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) {\n        warn(\"Ignoring additional textDivs for performance reasons.\");\n        this.#disableProcessItems = true;\n        return;\n      }\n      if (item.str === undefined) {\n        if (item.type === \"beginMarkedContentProps\" || item.type === \"beginMarkedContent\") {\n          const parent = this.#container;\n          this.#container = document.createElement(\"span\");\n          this.#container.classList.add(\"markedContent\");\n          if (item.id) {\n            this.#container.setAttribute(\"id\", `${item.id}`);\n          }\n          if (item.tag === \"Artifact\") {\n            this.#container.ariaHidden = true;\n          }\n          parent.append(this.#container);\n        } else if (item.type === \"endMarkedContent\") {\n          this.#container = this.#container.parentNode;\n        }\n        continue;\n      }\n      textContentItemsStr.push(item.str);\n      this.#appendText(item);\n    }\n  }\n  #appendText(geom) {\n    const textDiv = document.createElement(\"span\");\n    const textDivProperties = {\n      angle: 0,\n      canvasWidth: 0,\n      hasText: geom.str !== \"\",\n      hasEOL: geom.hasEOL,\n      fontSize: 0\n    };\n    this.#textDivs.push(textDiv);\n    const tx = Util.transform(this.#transform, geom.transform);\n    let angle = Math.atan2(tx[1], tx[0]);\n    const style = this.#styleCache[geom.fontName];\n    if (style.vertical) {\n      angle += Math.PI / 2;\n    }\n    let fontFamily = this.#fontInspectorEnabled && style.fontSubstitution || style.fontFamily;\n    fontFamily = TextLayer.fontFamilyMap.get(fontFamily) || fontFamily;\n    const fontHeight = Math.hypot(tx[2], tx[3]);\n    const fontAscent = fontHeight * TextLayer.#getAscent(fontFamily, style, this.#lang);\n    let left, top;\n    if (angle === 0) {\n      left = tx[4];\n      top = tx[5] - fontAscent;\n    } else {\n      left = tx[4] + fontAscent * Math.sin(angle);\n      top = tx[5] - fontAscent * Math.cos(angle);\n    }\n    const divStyle = textDiv.style;\n    divStyle.left = `${(100 * left / this.#pageWidth).toFixed(2)}%`;\n    divStyle.top = `${(100 * top / this.#pageHeight).toFixed(2)}%`;\n    divStyle.setProperty(\"--font-height\", `${fontHeight.toFixed(2)}px`);\n    divStyle.fontFamily = fontFamily;\n    textDivProperties.fontSize = fontHeight;\n    textDiv.setAttribute(\"role\", \"presentation\");\n    textDiv.textContent = geom.str;\n    textDiv.dir = geom.dir;\n    if (this.#fontInspectorEnabled) {\n      textDiv.dataset.fontName = style.fontSubstitutionLoadedName || geom.fontName;\n    }\n    if (angle !== 0) {\n      textDivProperties.angle = angle * (180 / Math.PI);\n    }\n    let shouldScaleText = false;\n    if (geom.str.length > 1) {\n      shouldScaleText = true;\n    } else if (geom.str !== \" \" && geom.transform[0] !== geom.transform[3]) {\n      const absScaleX = Math.abs(geom.transform[0]),\n        absScaleY = Math.abs(geom.transform[3]);\n      if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) {\n        shouldScaleText = true;\n      }\n    }\n    if (shouldScaleText) {\n      textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width;\n    }\n    this.#textDivProperties.set(textDiv, textDivProperties);\n    this.#layoutTextParams.div = textDiv;\n    this.#layoutTextParams.properties = textDivProperties;\n    this.#layout(this.#layoutTextParams);\n    if (textDivProperties.hasText) {\n      this.#container.append(textDiv);\n    }\n    if (textDivProperties.hasEOL) {\n      const br = document.createElement(\"br\");\n      br.setAttribute(\"role\", \"presentation\");\n      this.#container.append(br);\n    }\n  }\n  #layout(params) {\n    const {\n      div,\n      properties,\n      ctx\n    } = params;\n    const {\n      style\n    } = div;\n    if (properties.canvasWidth !== 0 && properties.hasText) {\n      const {\n        fontFamily\n      } = style;\n      const {\n        canvasWidth,\n        fontSize\n      } = properties;\n      TextLayer.#ensureCtxFont(ctx, fontSize * this.#scale, fontFamily);\n      const {\n        width\n      } = ctx.measureText(div.textContent);\n      if (width > 0) {\n        style.setProperty(\"--scale-x\", canvasWidth * this.#scale / width);\n      }\n    }\n    if (properties.angle !== 0) {\n      style.setProperty(\"--rotate\", `${properties.angle}deg`);\n    }\n  }\n  static cleanup() {\n    if (this.#pendingTextLayers.size > 0) {\n      return;\n    }\n    this.#ascentCache.clear();\n    for (const {\n      canvas\n    } of this.#canvasContexts.values()) {\n      canvas.remove();\n    }\n    this.#canvasContexts.clear();\n  }\n  static #getCtx(lang = null) {\n    let ctx = this.#canvasContexts.get(lang ||= \"\");\n    if (!ctx) {\n      const canvas = document.createElement(\"canvas\");\n      canvas.className = \"hiddenCanvasElement\";\n      canvas.lang = lang;\n      document.body.append(canvas);\n      ctx = canvas.getContext(\"2d\", {\n        alpha: false,\n        willReadFrequently: true\n      });\n      this.#canvasContexts.set(lang, ctx);\n      this.#canvasCtxFonts.set(ctx, {\n        size: 0,\n        family: \"\"\n      });\n    }\n    return ctx;\n  }\n  static #ensureCtxFont(ctx, size, family) {\n    const cached = this.#canvasCtxFonts.get(ctx);\n    if (size === cached.size && family === cached.family) {\n      return;\n    }\n    ctx.font = `${size}px ${family}`;\n    cached.size = size;\n    cached.family = family;\n  }\n  static #ensureMinFontSizeComputed() {\n    if (this.#minFontSize !== null) {\n      return;\n    }\n    const div = document.createElement(\"div\");\n    div.style.opacity = 0;\n    div.style.lineHeight = 1;\n    div.style.fontSize = \"1px\";\n    div.style.position = \"absolute\";\n    div.textContent = \"X\";\n    document.body.append(div);\n    this.#minFontSize = div.getBoundingClientRect().height;\n    div.remove();\n  }\n  static #getAscent(fontFamily, style, lang) {\n    const cachedAscent = this.#ascentCache.get(fontFamily);\n    if (cachedAscent) {\n      return cachedAscent;\n    }\n    const ctx = this.#getCtx(lang);\n    ctx.canvas.width = ctx.canvas.height = DEFAULT_FONT_SIZE;\n    this.#ensureCtxFont(ctx, DEFAULT_FONT_SIZE, fontFamily);\n    const metrics = ctx.measureText(\"\");\n    const ascent = metrics.fontBoundingBoxAscent;\n    const descent = Math.abs(metrics.fontBoundingBoxDescent);\n    ctx.canvas.width = ctx.canvas.height = 0;\n    let ratio = 0.8;\n    if (ascent) {\n      ratio = ascent / (ascent + descent);\n    } else {\n      if (FeatureTest.platform.isFirefox) {\n        warn(\"Enable the `dom.textMetrics.fontBoundingBox.enabled` preference \" + \"in `about:config` to improve TextLayer rendering.\");\n      }\n      if (style.ascent) {\n        ratio = style.ascent;\n      } else if (style.descent) {\n        ratio = 1 + style.descent;\n      }\n    }\n    this.#ascentCache.set(fontFamily, ratio);\n    return ratio;\n  }\n}\n\n;// ./src/display/api.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst RENDERING_CANCELLED_TIMEOUT = 100;\nfunction getDocument(src = {}) {\n  if (typeof src === \"string\" || src instanceof URL) {\n    src = {\n      url: src\n    };\n  } else if (src instanceof ArrayBuffer || ArrayBuffer.isView(src)) {\n    src = {\n      data: src\n    };\n  }\n  const task = new PDFDocumentLoadingTask();\n  const {\n    docId\n  } = task;\n  const url = src.url ? getUrlProp(src.url) : null;\n  const data = src.data ? getDataProp(src.data) : null;\n  const httpHeaders = src.httpHeaders || null;\n  const withCredentials = src.withCredentials === true;\n  const password = src.password ?? null;\n  const rangeTransport = src.range instanceof PDFDataRangeTransport ? src.range : null;\n  const rangeChunkSize = Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0 ? src.rangeChunkSize : 2 ** 16;\n  let worker = src.worker instanceof PDFWorker ? src.worker : null;\n  const verbosity = src.verbosity;\n  const docBaseUrl = typeof src.docBaseUrl === \"string\" && !isDataScheme(src.docBaseUrl) ? src.docBaseUrl : null;\n  const cMapUrl = getFactoryUrlProp(src.cMapUrl);\n  const cMapPacked = src.cMapPacked !== false;\n  const iccUrl = getFactoryUrlProp(src.iccUrl);\n  const standardFontDataUrl = getFactoryUrlProp(src.standardFontDataUrl);\n  const wasmUrl = getFactoryUrlProp(src.wasmUrl);\n  const ignoreErrors = src.stopAtErrors !== true;\n  const maxImageSize = Number.isInteger(src.maxImageSize) && src.maxImageSize > -1 ? src.maxImageSize : -1;\n  const isOffscreenCanvasSupported = typeof src.isOffscreenCanvasSupported === \"boolean\" ? src.isOffscreenCanvasSupported : !isNodeJS;\n  const isImageDecoderSupported = typeof src.isImageDecoderSupported === \"boolean\" ? src.isImageDecoderSupported : !isNodeJS && (FeatureTest.platform.isFirefox || !globalThis.chrome);\n  const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes) ? src.canvasMaxAreaInBytes : -1;\n  const disableFontFace = typeof src.disableFontFace === \"boolean\" ? src.disableFontFace : isNodeJS;\n  const fontExtraProperties = src.fontExtraProperties === true;\n  const enableXfa = src.enableXfa === true;\n  const ownerDocument = src.ownerDocument || globalThis.document;\n  const disableRange = src.disableRange === true;\n  const disableStream = src.disableStream === true;\n  const disableAutoFetch = src.disableAutoFetch === true;\n  const pdfBug = src.pdfBug === true;\n  const CanvasFactory = src.CanvasFactory || (isNodeJS ? NodeCanvasFactory : DOMCanvasFactory);\n  const FilterFactory = src.FilterFactory || (isNodeJS ? NodeFilterFactory : DOMFilterFactory);\n  const BinaryDataFactory = src.BinaryDataFactory || (isNodeJS ? NodeBinaryDataFactory : DOMBinaryDataFactory);\n  const enableHWA = src.enableHWA === true;\n  const enableWebGPU = src.enableWebGPU === true;\n  const gpuPromise = enableWebGPU ? initGPU() : Promise.resolve(false);\n  const useWasm = src.useWasm !== false;\n  const pagesMapper = src.pagesMapper || new PagesMapper();\n  const useSystemFonts = typeof src.useSystemFonts === \"boolean\" ? src.useSystemFonts : !isNodeJS && !disableFontFace;\n  const useWorkerFetch = typeof src.useWorkerFetch === \"boolean\" ? src.useWorkerFetch : !!(BinaryDataFactory === DOMBinaryDataFactory && cMapUrl && cMapPacked && standardFontDataUrl && wasmUrl && isValidFetchUrl(cMapUrl, document.baseURI) && isValidFetchUrl(standardFontDataUrl, document.baseURI) && isValidFetchUrl(wasmUrl, document.baseURI));\n  const styleElement = null;\n  setVerbosityLevel(verbosity);\n  const transportFactory = {\n    canvasFactory: new CanvasFactory({\n      ownerDocument,\n      enableHWA\n    }),\n    filterFactory: new FilterFactory({\n      docId,\n      ownerDocument\n    }),\n    binaryDataFactory: useWorkerFetch ? null : new BinaryDataFactory({\n      cMapUrl,\n      standardFontDataUrl,\n      wasmUrl\n    })\n  };\n  if (!worker) {\n    worker = PDFWorker.create({\n      verbosity,\n      port: GlobalWorkerOptions.workerPort\n    });\n    task._worker = worker;\n  }\n  const docParams = {\n    docId,\n    apiVersion: \"5.7.284\",\n    data,\n    password,\n    disableAutoFetch,\n    rangeChunkSize,\n    docBaseUrl,\n    enableXfa,\n    evaluatorOptions: {\n      maxImageSize,\n      disableFontFace,\n      ignoreErrors,\n      isOffscreenCanvasSupported,\n      isImageDecoderSupported,\n      canvasMaxAreaInBytes,\n      fontExtraProperties,\n      useSystemFonts,\n      useWasm,\n      useWorkerFetch,\n      cMapUrl,\n      cMapPacked,\n      iccUrl,\n      standardFontDataUrl,\n      wasmUrl,\n      hasGPU: false\n    }\n  };\n  const transportParams = {\n    ownerDocument,\n    pdfBug,\n    styleElement,\n    enableHWA,\n    loadingParams: {\n      disableAutoFetch,\n      enableXfa\n    }\n  };\n  Promise.all([worker.promise, gpuPromise]).then(function ([, hasGPU]) {\n    if (task.destroyed) {\n      throw new Error(\"Loading aborted\");\n    }\n    if (worker.destroyed) {\n      throw new Error(\"Worker was destroyed\");\n    }\n    docParams.evaluatorOptions.hasGPU = hasGPU;\n    const workerIdPromise = worker.messageHandler.sendWithPromise(\"GetDocRequest\", docParams, data ? [data.buffer] : null);\n    let networkStream;\n    if (data) {} else if (rangeTransport) {\n      networkStream = new PDFDataTransportStream({\n        pdfDataRangeTransport: rangeTransport,\n        disableRange,\n        disableStream\n      });\n    } else if (url) {\n      const NetworkStream = getNetworkStream(url);\n      networkStream = new NetworkStream({\n        url,\n        httpHeaders,\n        withCredentials,\n        rangeChunkSize,\n        disableRange,\n        disableStream\n      });\n    } else {\n      throw new Error(\"getDocument - expected either `data`, `range`, or `url` parameter.\");\n    }\n    return workerIdPromise.then(workerId => {\n      if (task.destroyed) {\n        throw new Error(\"Loading aborted\");\n      }\n      if (worker.destroyed) {\n        throw new Error(\"Worker was destroyed\");\n      }\n      const messageHandler = new MessageHandler(docId, workerId, worker.port);\n      const transport = new WorkerTransport(messageHandler, task, networkStream, transportParams, transportFactory, pagesMapper);\n      task._transport = transport;\n      messageHandler.send(\"Ready\", null);\n    });\n  }).catch(task._capability.reject);\n  return task;\n}\nclass PDFDocumentLoadingTask {\n  static #docId = 0;\n  _capability = Promise.withResolvers();\n  _transport = null;\n  _worker = null;\n  docId = `d${PDFDocumentLoadingTask.#docId++}`;\n  destroyed = false;\n  onPassword = null;\n  onProgress = null;\n  get promise() {\n    return this._capability.promise;\n  }\n  async destroy() {\n    this.destroyed = true;\n    try {\n      if (this._worker?.port) {\n        this._worker._pendingDestroy = true;\n      }\n      await this._transport?.destroy();\n    } catch (ex) {\n      if (this._worker?.port) {\n        delete this._worker._pendingDestroy;\n      }\n      throw ex;\n    }\n    this._transport = null;\n    this._worker?.destroy();\n    this._worker = null;\n  }\n  async getData() {\n    return this._transport.getData();\n  }\n}\nclass PDFDataRangeTransport {\n  #capability = Promise.withResolvers();\n  #listener = null;\n  constructor(length, initialData, progressiveDone = false, contentDispositionFilename = null) {\n    this.length = length;\n    this.initialData = initialData;\n    this.progressiveDone = progressiveDone;\n    this.contentDispositionFilename = contentDispositionFilename;\n    Object.defineProperty(this, \"onDataProgress\", {\n      value: () => {\n        deprecated(\"`PDFDataRangeTransport.prototype.onDataProgress` - method was \" + \"removed, since loading progress is now reported automatically \" + \"through the `PDFDataTransportStream` class (and related code).\");\n      }\n    });\n  }\n  onDataRange(begin, chunk) {\n    this.#listener({\n      type: \"range\",\n      begin,\n      chunk\n    });\n  }\n  onDataProgressiveRead(chunk) {\n    this.#capability.promise.then(() => {\n      this.#listener({\n        type: \"progressiveRead\",\n        chunk\n      });\n    });\n  }\n  onDataProgressiveDone() {\n    this.#capability.promise.then(() => {\n      this.#listener({\n        type: \"progressiveDone\"\n      });\n    });\n  }\n  transportReady(listener) {\n    this.#listener = listener;\n    this.#capability.resolve();\n  }\n  requestDataRange(begin, end) {\n    unreachable(\"Abstract method PDFDataRangeTransport.requestDataRange\");\n  }\n  abort() {}\n}\nclass PDFDocumentProxy {\n  constructor(pdfInfo, transport) {\n    this._pdfInfo = pdfInfo;\n    this._transport = transport;\n  }\n  get pagesMapper() {\n    return this._transport.pagesMapper;\n  }\n  get annotationStorage() {\n    return this._transport.annotationStorage;\n  }\n  get canvasFactory() {\n    return this._transport.canvasFactory;\n  }\n  get filterFactory() {\n    return this._transport.filterFactory;\n  }\n  get numPages() {\n    return this._pdfInfo.numPages;\n  }\n  get fingerprints() {\n    return this._pdfInfo.fingerprints;\n  }\n  get isPureXfa() {\n    return shadow(this, \"isPureXfa\", !!this._transport._htmlForXfa);\n  }\n  get allXfaHtml() {\n    return this._transport._htmlForXfa;\n  }\n  getPage(pageNumber) {\n    return this._transport.getPage(pageNumber);\n  }\n  getPageIndex(ref) {\n    return this._transport.getPageIndex(ref);\n  }\n  getDestinations() {\n    return this._transport.getDestinations();\n  }\n  getDestination(id) {\n    return this._transport.getDestination(id);\n  }\n  getPageLabels() {\n    return this._transport.getPageLabels();\n  }\n  getPageLayout() {\n    return this._transport.getPageLayout();\n  }\n  getPageMode() {\n    return this._transport.getPageMode();\n  }\n  getViewerPreferences() {\n    return this._transport.getViewerPreferences();\n  }\n  getOpenAction() {\n    return this._transport.getOpenAction();\n  }\n  getAttachments() {\n    return this._transport.getAttachments();\n  }\n  getAnnotationsByType(types, pageIndexesToSkip) {\n    return this._transport.getAnnotationsByType(types, pageIndexesToSkip);\n  }\n  getJSActions() {\n    return this._transport.getDocJSActions();\n  }\n  getOutline() {\n    return this._transport.getOutline();\n  }\n  getOptionalContentConfig({\n    intent = \"display\"\n  } = {}) {\n    const {\n      renderingIntent\n    } = this._transport.getRenderingIntent(intent);\n    return this._transport.getOptionalContentConfig(renderingIntent);\n  }\n  getPermissions() {\n    return this._transport.getPermissions();\n  }\n  getMetadata() {\n    return this._transport.getMetadata();\n  }\n  getMarkInfo() {\n    return this._transport.getMarkInfo();\n  }\n  getData() {\n    return this._transport.getData();\n  }\n  saveDocument() {\n    return this._transport.saveDocument();\n  }\n  extractPages(pageInfos) {\n    return this._transport.extractPages(pageInfos);\n  }\n  getDownloadInfo() {\n    return this._transport.downloadInfoCapability.promise;\n  }\n  getRawData(data) {\n    return this._transport.getRawData(data);\n  }\n  cleanup(keepLoadedFonts = false) {\n    return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa);\n  }\n  destroy() {\n    return this.loadingTask.destroy();\n  }\n  cachedPageNumber(ref) {\n    return this._transport.cachedPageNumber(ref);\n  }\n  get loadingParams() {\n    return this._transport.loadingParams;\n  }\n  get loadingTask() {\n    return this._transport.loadingTask;\n  }\n  getFieldObjects() {\n    return this._transport.getFieldObjects();\n  }\n  hasJSActions() {\n    return this._transport.hasJSActions();\n  }\n  getCalculationOrderIds() {\n    return this._transport.getCalculationOrderIds();\n  }\n}\nclass PDFPageProxy {\n  #pendingCleanup = false;\n  #pagesMapper = null;\n  constructor(pageIndex, pageInfo, transport, pagesMapper, pdfBug = false) {\n    this._pageIndex = pageIndex;\n    this._pageInfo = pageInfo;\n    this._transport = transport;\n    this._stats = pdfBug ? new StatTimer() : null;\n    this._pdfBug = pdfBug;\n    this.commonObjs = transport.commonObjs;\n    this.objs = new PDFObjects();\n    this._intentStates = new Map();\n    this.destroyed = false;\n    this.recordedBBoxes = null;\n    this.#pagesMapper = pagesMapper;\n    this.imageCoordinates = null;\n  }\n  clone(id) {\n    const clone = new PDFPageProxy(id, this._pageInfo, this._transport, this.#pagesMapper, this._pdfBug);\n    clone.clonedFromIndex = this.clonedFromIndex ?? this._pageIndex;\n    this._transport.updatePage(clone);\n    return clone;\n  }\n  get pageNumber() {\n    return this._pageIndex + 1;\n  }\n  set pageNumber(value) {\n    this._pageIndex = value - 1;\n    this._transport.updatePage(this);\n  }\n  get rotate() {\n    return this._pageInfo.rotate;\n  }\n  get ref() {\n    return this._pageInfo.ref;\n  }\n  get userUnit() {\n    return this._pageInfo.userUnit;\n  }\n  get view() {\n    return this._pageInfo.view;\n  }\n  getViewport({\n    scale,\n    rotation = this.rotate,\n    offsetX = 0,\n    offsetY = 0,\n    dontFlip = false\n  } = {}) {\n    return new PageViewport({\n      viewBox: this.view,\n      userUnit: this.userUnit,\n      scale,\n      rotation,\n      offsetX,\n      offsetY,\n      dontFlip\n    });\n  }\n  getAnnotations({\n    intent = \"display\"\n  } = {}) {\n    const {\n      renderingIntent\n    } = this._transport.getRenderingIntent(intent);\n    return this._transport.getAnnotations(this._pageIndex, renderingIntent);\n  }\n  getJSActions() {\n    return this._transport.getPageJSActions(this._pageIndex);\n  }\n  get filterFactory() {\n    return this._transport.filterFactory;\n  }\n  get isPureXfa() {\n    return shadow(this, \"isPureXfa\", !!this._transport._htmlForXfa);\n  }\n  async getXfa() {\n    return this._transport._htmlForXfa?.children[this._pageIndex] || null;\n  }\n  render({\n    canvasContext,\n    canvas = canvasContext.canvas,\n    viewport,\n    intent = \"display\",\n    annotationMode = AnnotationMode.ENABLE,\n    transform = null,\n    background = null,\n    optionalContentConfigPromise = null,\n    annotationCanvasMap = null,\n    pageColors = null,\n    printAnnotationStorage = null,\n    isEditing = false,\n    recordImages = false,\n    recordOperations = false,\n    operationsFilter = null\n  }) {\n    this._stats?.time(\"Overall\");\n    const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing);\n    const {\n      renderingIntent,\n      cacheKey\n    } = intentArgs;\n    this.#pendingCleanup = false;\n    optionalContentConfigPromise ||= this._transport.getOptionalContentConfig(renderingIntent);\n    const intentState = this._intentStates.getOrInsertComputed(cacheKey, makeObj);\n    if (intentState.streamReaderCancelTimeout) {\n      clearTimeout(intentState.streamReaderCancelTimeout);\n      intentState.streamReaderCancelTimeout = null;\n    }\n    const intentPrint = !!(renderingIntent & RenderingIntentFlag.PRINT);\n    if (!intentState.displayReadyCapability) {\n      intentState.displayReadyCapability = Promise.withResolvers();\n      intentState.operatorList = {\n        fnArray: [],\n        argsArray: [],\n        lastChunk: false,\n        separateAnnots: null\n      };\n      this._stats?.time(\"Page Request\");\n      this._pumpOperatorList(intentArgs);\n    }\n    const recordForDebugger = !!(this._pdfBug && globalThis.StepperManager?.enabled);\n    const shouldRecordOperations = !!canvas && !this.recordedBBoxes && (recordOperations || recordForDebugger);\n    const shouldRecordImages = !!canvas && !this.imageCoordinates && recordImages;\n    const complete = error => {\n      intentState.renderTasks.delete(internalRenderTask);\n      if (shouldRecordOperations) {\n        const recordedBBoxes = internalRenderTask.gfx?.dependencyTracker.take();\n        if (recordedBBoxes) {\n          internalRenderTask.stepper?.setOperatorBBoxes(recordedBBoxes, internalRenderTask.gfx.dependencyTracker.takeDebugMetadata());\n          if (recordOperations) {\n            this.recordedBBoxes = recordedBBoxes;\n          }\n        }\n      }\n      if (shouldRecordImages && !error) {\n        this.imageCoordinates = internalRenderTask.gfx?.imagesTracker.take();\n      }\n      if (intentPrint) {\n        this.#pendingCleanup = true;\n      }\n      this.#tryCleanup();\n      if (error) {\n        internalRenderTask.capability.reject(error);\n        this._abortOperatorList({\n          intentState,\n          reason: error instanceof Error ? error : new Error(error)\n        });\n      } else {\n        internalRenderTask.capability.resolve();\n      }\n      if (this._stats) {\n        this._stats.timeEnd(\"Rendering\");\n        this._stats.timeEnd(\"Overall\");\n        if (globalThis.Stats?.enabled) {\n          globalThis.Stats.add(this.pageNumber, this._stats);\n        }\n      }\n    };\n    let dependencyTracker = null;\n    let bboxTracker = null;\n    if (shouldRecordOperations || shouldRecordImages) {\n      bboxTracker = new CanvasBBoxTracker(canvas, intentState.operatorList.length);\n    }\n    if (shouldRecordOperations) {\n      dependencyTracker = new CanvasDependencyTracker(bboxTracker, recordForDebugger);\n    }\n    const internalRenderTask = new InternalRenderTask({\n      callback: complete,\n      params: {\n        canvas,\n        canvasContext,\n        dependencyTracker: dependencyTracker ?? bboxTracker,\n        imagesTracker: shouldRecordImages ? new CanvasImagesTracker(canvas) : null,\n        viewport,\n        transform,\n        background\n      },\n      objs: this.objs,\n      commonObjs: this.commonObjs,\n      annotationCanvasMap,\n      operatorList: intentState.operatorList,\n      pageIndex: this._pageIndex,\n      canvasFactory: this._transport.canvasFactory,\n      filterFactory: this._transport.filterFactory,\n      useRequestAnimationFrame: !intentPrint,\n      pdfBug: this._pdfBug,\n      pageColors,\n      enableHWA: this._transport.enableHWA,\n      operationsFilter\n    });\n    (intentState.renderTasks ||= new Set()).add(internalRenderTask);\n    const renderTask = internalRenderTask.task;\n    Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => {\n      if (this.destroyed) {\n        complete();\n        return;\n      }\n      this._stats?.time(\"Rendering\");\n      if (!(optionalContentConfig.renderingIntent & renderingIntent)) {\n        throw new Error(\"Must use the same `intent`-argument when calling the `PDFPageProxy.render` \" + \"and `PDFDocumentProxy.getOptionalContentConfig` methods.\");\n      }\n      internalRenderTask.initializeGraphics({\n        transparency,\n        optionalContentConfig\n      });\n      internalRenderTask.operatorListChanged();\n    }).catch(complete);\n    return renderTask;\n  }\n  getOperatorList({\n    intent = \"display\",\n    annotationMode = AnnotationMode.ENABLE,\n    printAnnotationStorage = null,\n    isEditing = false\n  } = {}) {\n    function operatorListChanged() {\n      if (intentState.operatorList.lastChunk) {\n        intentState.opListReadCapability.resolve(intentState.operatorList);\n        intentState.renderTasks.delete(opListTask);\n      }\n    }\n    const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing, true);\n    const intentState = this._intentStates.getOrInsertComputed(intentArgs.cacheKey, makeObj);\n    let opListTask;\n    if (!intentState.opListReadCapability) {\n      opListTask = Object.create(null);\n      opListTask.operatorListChanged = operatorListChanged;\n      intentState.opListReadCapability = Promise.withResolvers();\n      (intentState.renderTasks ||= new Set()).add(opListTask);\n      intentState.operatorList = {\n        fnArray: [],\n        argsArray: [],\n        lastChunk: false,\n        separateAnnots: null\n      };\n      this._stats?.time(\"Page Request\");\n      this._pumpOperatorList(intentArgs);\n    }\n    return intentState.opListReadCapability.promise;\n  }\n  streamTextContent({\n    includeMarkedContent = false,\n    disableNormalization = false\n  } = {}) {\n    const TEXT_CONTENT_CHUNK_SIZE = 100;\n    return this._transport.messageHandler.sendWithStream(\"GetTextContent\", {\n      pageId: this.#pagesMapper.getPageId(this._pageIndex + 1) - 1,\n      pageIndex: this._pageIndex,\n      includeMarkedContent: includeMarkedContent === true,\n      disableNormalization: disableNormalization === true\n    }, {\n      highWaterMark: TEXT_CONTENT_CHUNK_SIZE,\n      size(textContent) {\n        return textContent.items.length;\n      }\n    });\n  }\n  async getTextContent(params = {}) {\n    if (this._transport._htmlForXfa) {\n      return this.getXfa().then(xfa => XfaText.textContent(xfa));\n    }\n    const readableStream = this.streamTextContent(params);\n    const textContent = {\n      items: [],\n      styles: Object.create(null),\n      lang: null\n    };\n    for await (const value of readableStream) {\n      textContent.lang ??= value.lang;\n      Object.assign(textContent.styles, value.styles);\n      textContent.items.push(...value.items);\n    }\n    return textContent;\n  }\n  getStructTree() {\n    return this._transport.getStructTree(this._pageIndex);\n  }\n  _destroy() {\n    this.destroyed = true;\n    const waitOn = [];\n    for (const intentState of this._intentStates.values()) {\n      this._abortOperatorList({\n        intentState,\n        reason: new Error(\"Page was destroyed.\"),\n        force: true\n      });\n      if (intentState.opListReadCapability) {\n        continue;\n      }\n      for (const internalRenderTask of intentState.renderTasks) {\n        waitOn.push(internalRenderTask.completed);\n        internalRenderTask.cancel();\n      }\n    }\n    this.objs.clear();\n    this.#pendingCleanup = false;\n    return Promise.all(waitOn);\n  }\n  cleanup(resetStats = false) {\n    this.#pendingCleanup = true;\n    const success = this.#tryCleanup();\n    if (resetStats && success) {\n      this._stats &&= new StatTimer();\n    }\n    return success;\n  }\n  #tryCleanup() {\n    if (!this.#pendingCleanup || this.destroyed) {\n      return false;\n    }\n    for (const {\n      renderTasks,\n      operatorList\n    } of this._intentStates.values()) {\n      if (renderTasks.size > 0 || !operatorList.lastChunk) {\n        return false;\n      }\n    }\n    this._intentStates.clear();\n    this.objs.clear();\n    this.#pendingCleanup = false;\n    return true;\n  }\n  _startRenderPage(transparency, cacheKey) {\n    const intentState = this._intentStates.get(cacheKey);\n    if (!intentState) {\n      return;\n    }\n    this._stats?.timeEnd(\"Page Request\");\n    intentState.displayReadyCapability?.resolve(transparency);\n  }\n  _renderPageChunk(operatorListChunk, intentState) {\n    for (let i = 0, ii = operatorListChunk.length; i < ii; i++) {\n      intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);\n      intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]);\n    }\n    intentState.operatorList.lastChunk = operatorListChunk.lastChunk;\n    intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots;\n    for (const internalRenderTask of intentState.renderTasks) {\n      internalRenderTask.operatorListChanged();\n    }\n    if (operatorListChunk.lastChunk) {\n      this.#tryCleanup();\n    }\n  }\n  _pumpOperatorList({\n    renderingIntent,\n    cacheKey,\n    annotationStorageSerializable,\n    modifiedIds\n  }) {\n    const {\n      map,\n      transfer\n    } = annotationStorageSerializable;\n    const readableStream = this._transport.messageHandler.sendWithStream(\"GetOperatorList\", {\n      pageId: this.#pagesMapper.getPageId(this._pageIndex + 1) - 1,\n      pageIndex: this._pageIndex,\n      intent: renderingIntent,\n      cacheKey,\n      annotationStorage: map,\n      modifiedIds\n    }, undefined, transfer);\n    const reader = readableStream.getReader();\n    const intentState = this._intentStates.get(cacheKey);\n    intentState.streamReader = reader;\n    const pump = () => {\n      reader.read().then(({\n        value,\n        done\n      }) => {\n        if (done) {\n          intentState.streamReader = null;\n          return;\n        }\n        if (this._transport.destroyed) {\n          return;\n        }\n        this._renderPageChunk(value, intentState);\n        pump();\n      }, reason => {\n        intentState.streamReader = null;\n        if (this._transport.destroyed) {\n          return;\n        }\n        if (intentState.operatorList) {\n          intentState.operatorList.lastChunk = true;\n          for (const internalRenderTask of intentState.renderTasks) {\n            internalRenderTask.operatorListChanged();\n          }\n          this.#tryCleanup();\n        }\n        if (intentState.displayReadyCapability) {\n          intentState.displayReadyCapability.reject(reason);\n        } else if (intentState.opListReadCapability) {\n          intentState.opListReadCapability.reject(reason);\n        } else {\n          throw reason;\n        }\n      });\n    };\n    pump();\n  }\n  _abortOperatorList({\n    intentState,\n    reason,\n    force = false\n  }) {\n    if (!intentState.streamReader) {\n      return;\n    }\n    if (intentState.streamReaderCancelTimeout) {\n      clearTimeout(intentState.streamReaderCancelTimeout);\n      intentState.streamReaderCancelTimeout = null;\n    }\n    if (!force) {\n      if (intentState.renderTasks.size > 0) {\n        return;\n      }\n      if (reason instanceof RenderingCancelledException) {\n        let delay = RENDERING_CANCELLED_TIMEOUT;\n        if (reason.extraDelay > 0 && reason.extraDelay < 1000) {\n          delay += reason.extraDelay;\n        }\n        intentState.streamReaderCancelTimeout = setTimeout(() => {\n          intentState.streamReaderCancelTimeout = null;\n          this._abortOperatorList({\n            intentState,\n            reason,\n            force: true\n          });\n        }, delay);\n        return;\n      }\n    }\n    intentState.streamReader.cancel(new AbortException(reason.message)).catch(() => {});\n    intentState.streamReader = null;\n    if (this._transport.destroyed) {\n      return;\n    }\n    for (const [curCacheKey, curIntentState] of this._intentStates) {\n      if (curIntentState === intentState) {\n        this._intentStates.delete(curCacheKey);\n        break;\n      }\n    }\n    this.cleanup();\n  }\n  get stats() {\n    return this._stats;\n  }\n}\nclass PDFWorker {\n  #capability = Promise.withResolvers();\n  #messageHandler = null;\n  #port = null;\n  #webWorker = null;\n  static #fakeWorkerId = 0;\n  static #isWorkerDisabled = false;\n  static #workerPorts = new WeakMap();\n  static {\n    if (isNodeJS) {\n      this.#isWorkerDisabled = true;\n      GlobalWorkerOptions.workerSrc ||= \"./pdf.worker.mjs\";\n    }\n    this._isSameOrigin = (baseUrl, otherUrl) => {\n      const base = URL.parse(baseUrl);\n      if (!base?.origin || base.origin === \"null\") {\n        return false;\n      }\n      const other = new URL(otherUrl, base);\n      return base.origin === other.origin;\n    };\n    this._createCDNWrapper = url => {\n      const wrapper = `await import(\"${url}\");`;\n      return URL.createObjectURL(new Blob([wrapper], {\n        type: \"text/javascript\"\n      }));\n    };\n  }\n  constructor({\n    name = null,\n    port = null,\n    verbosity = getVerbosityLevel()\n  } = {}) {\n    this.name = name;\n    this.destroyed = false;\n    this.verbosity = verbosity;\n    if (port) {\n      if (PDFWorker.#workerPorts.has(port)) {\n        throw new Error(\"Cannot use more than one PDFWorker per port.\");\n      }\n      PDFWorker.#workerPorts.set(port, this);\n      this.#initializeFromPort(port);\n    } else {\n      this.#initialize();\n    }\n  }\n  get promise() {\n    return this.#capability.promise;\n  }\n  #resolve() {\n    this.#capability.resolve();\n    this.#messageHandler.send(\"configure\", {\n      verbosity: this.verbosity\n    });\n  }\n  get port() {\n    return this.#port;\n  }\n  get messageHandler() {\n    return this.#messageHandler;\n  }\n  #initializeFromPort(port) {\n    this.#port = port;\n    this.#messageHandler = new MessageHandler(\"main\", \"worker\", port);\n    this.#messageHandler.on(\"ready\", () => {});\n    this.#resolve();\n  }\n  #initialize() {\n    if (PDFWorker.#isWorkerDisabled || PDFWorker.#mainThreadWorkerMessageHandler) {\n      this.#setupFakeWorker();\n      return;\n    }\n    let {\n      workerSrc\n    } = PDFWorker;\n    try {\n      if (!PDFWorker._isSameOrigin(window.location, workerSrc)) {\n        workerSrc = PDFWorker._createCDNWrapper(new URL(workerSrc, window.location).href);\n      }\n      const worker = new Worker(workerSrc, {\n        type: \"module\"\n      });\n      const messageHandler = new MessageHandler(\"main\", \"worker\", worker);\n      const terminateEarly = () => {\n        ac.abort();\n        messageHandler.destroy();\n        worker.terminate();\n        if (this.destroyed) {\n          this.#capability.reject(new Error(\"Worker was destroyed\"));\n        } else {\n          this.#setupFakeWorker();\n        }\n      };\n      const ac = new AbortController();\n      worker.addEventListener(\"error\", () => {\n        if (!this.#webWorker) {\n          terminateEarly();\n        }\n      }, {\n        signal: ac.signal\n      });\n      messageHandler.on(\"test\", data => {\n        ac.abort();\n        if (this.destroyed || !data) {\n          terminateEarly();\n          return;\n        }\n        this.#messageHandler = messageHandler;\n        this.#port = worker;\n        this.#webWorker = worker;\n        this.#resolve();\n      });\n      messageHandler.on(\"ready\", data => {\n        ac.abort();\n        if (this.destroyed) {\n          terminateEarly();\n          return;\n        }\n        try {\n          sendTest();\n        } catch {\n          this.#setupFakeWorker();\n        }\n      });\n      const sendTest = () => {\n        const testObj = new Uint8Array();\n        messageHandler.send(\"test\", testObj, [testObj.buffer]);\n      };\n      sendTest();\n      return;\n    } catch {\n      info(\"The worker has been disabled.\");\n    }\n    this.#setupFakeWorker();\n  }\n  #setupFakeWorker() {\n    if (!PDFWorker.#isWorkerDisabled) {\n      warn(\"Setting up fake worker.\");\n      PDFWorker.#isWorkerDisabled = true;\n    }\n    PDFWorker._setupFakeWorkerGlobal.then(WorkerMessageHandler => {\n      if (this.destroyed) {\n        this.#capability.reject(new Error(\"Worker was destroyed\"));\n        return;\n      }\n      const port = new LoopbackPort();\n      this.#port = port;\n      const id = `fake${PDFWorker.#fakeWorkerId++}`;\n      const workerHandler = new MessageHandler(id + \"_worker\", id, port);\n      WorkerMessageHandler.setup(workerHandler, port);\n      this.#messageHandler = new MessageHandler(id, id + \"_worker\", port);\n      this.#resolve();\n    }).catch(reason => {\n      this.#capability.reject(new Error(`Setting up fake worker failed: \"${reason.message}\".`));\n    });\n  }\n  destroy() {\n    this.destroyed = true;\n    this.#webWorker?.terminate();\n    this.#webWorker = null;\n    PDFWorker.#workerPorts.delete(this.#port);\n    this.#port = null;\n    this.#messageHandler?.destroy();\n    this.#messageHandler = null;\n  }\n  static create(params) {\n    const cachedPort = this.#workerPorts.get(params?.port);\n    if (cachedPort) {\n      if (cachedPort._pendingDestroy) {\n        throw new Error(\"PDFWorker.create - the worker is being destroyed.\\n\" + \"Please remember to await `PDFDocumentLoadingTask.destroy()`-calls.\");\n      }\n      return cachedPort;\n    }\n    return new PDFWorker(params);\n  }\n  static get workerSrc() {\n    if (GlobalWorkerOptions.workerSrc) {\n      return GlobalWorkerOptions.workerSrc;\n    }\n    throw new Error('No \"GlobalWorkerOptions.workerSrc\" specified.');\n  }\n  static get #mainThreadWorkerMessageHandler() {\n    try {\n      return globalThis.pdfjsWorker?.WorkerMessageHandler || null;\n    } catch {\n      return null;\n    }\n  }\n  static get _setupFakeWorkerGlobal() {\n    const loader = async () => {\n      if (this.#mainThreadWorkerMessageHandler) {\n        return this.#mainThreadWorkerMessageHandler;\n      }\n      const worker = await import(\n      /*webpackIgnore: true*/\n      /*@vite-ignore*/\n      this.workerSrc);\n      return worker.WorkerMessageHandler;\n    };\n    return shadow(this, \"_setupFakeWorkerGlobal\", loader());\n  }\n}\nclass WorkerTransport {\n  downloadInfoCapability = Promise.withResolvers();\n  #fullReader = null;\n  #methodPromises = new Map();\n  #networkStream = null;\n  #pageCache = new Map();\n  #pagePromises = new Map();\n  #pageRefCache = new Map();\n  #passwordCapability = null;\n  constructor(messageHandler, loadingTask, networkStream, params, factory, pagesMapper) {\n    this.messageHandler = messageHandler;\n    this.loadingTask = loadingTask;\n    this.#networkStream = networkStream;\n    this.commonObjs = new PDFObjects();\n    this.fontLoader = new FontLoader({\n      ownerDocument: params.ownerDocument,\n      styleElement: params.styleElement\n    });\n    this.enableHWA = params.enableHWA;\n    this.loadingParams = params.loadingParams;\n    this._params = params;\n    this.canvasFactory = factory.canvasFactory;\n    this.filterFactory = factory.filterFactory;\n    this.binaryDataFactory = factory.binaryDataFactory;\n    this.pagesMapper = pagesMapper;\n    this.destroyed = false;\n    this.destroyCapability = null;\n    this.setupMessageHandler();\n  }\n  updatePage(page) {\n    const {\n      _pageIndex\n    } = page;\n    this.#pageCache.set(_pageIndex, page);\n    this.#pagePromises.set(_pageIndex, Promise.resolve(page));\n  }\n  #cacheSimpleMethod(name, data = null) {\n    return this.#methodPromises.getOrInsertComputed(name, () => this.messageHandler.sendWithPromise(name, data));\n  }\n  #onProgress({\n    loaded,\n    total\n  }) {\n    this.loadingTask.onProgress?.({\n      loaded,\n      total,\n      percent: total ? MathClamp(Math.round(loaded / total * 100), 0, 100) : NaN\n    });\n  }\n  get annotationStorage() {\n    return shadow(this, \"annotationStorage\", new AnnotationStorage());\n  }\n  getRenderingIntent(intent, annotationMode = AnnotationMode.ENABLE, printAnnotationStorage = null, isEditing = false, isOpList = false) {\n    let renderingIntent = RenderingIntentFlag.DISPLAY;\n    let annotationStorageSerializable = SerializableEmpty;\n    switch (intent) {\n      case \"any\":\n        renderingIntent = RenderingIntentFlag.ANY;\n        break;\n      case \"display\":\n        break;\n      case \"print\":\n        renderingIntent = RenderingIntentFlag.PRINT;\n        break;\n      default:\n        warn(`getRenderingIntent - invalid intent: ${intent}`);\n    }\n    const annotationStorage = renderingIntent & RenderingIntentFlag.PRINT && printAnnotationStorage instanceof PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage;\n    switch (annotationMode) {\n      case AnnotationMode.DISABLE:\n        renderingIntent += RenderingIntentFlag.ANNOTATIONS_DISABLE;\n        break;\n      case AnnotationMode.ENABLE:\n        break;\n      case AnnotationMode.ENABLE_FORMS:\n        renderingIntent += RenderingIntentFlag.ANNOTATIONS_FORMS;\n        break;\n      case AnnotationMode.ENABLE_STORAGE:\n        renderingIntent += RenderingIntentFlag.ANNOTATIONS_STORAGE;\n        annotationStorageSerializable = annotationStorage.serializable;\n        break;\n      default:\n        warn(`getRenderingIntent - invalid annotationMode: ${annotationMode}`);\n    }\n    if (isEditing) {\n      renderingIntent += RenderingIntentFlag.IS_EDITING;\n    }\n    if (isOpList) {\n      renderingIntent += RenderingIntentFlag.OPLIST;\n    }\n    const {\n      ids: modifiedIds,\n      hash: modifiedIdsHash\n    } = annotationStorage.modifiedIds;\n    const cacheKeyBuf = [renderingIntent, annotationStorageSerializable.hash, modifiedIdsHash];\n    return {\n      renderingIntent,\n      cacheKey: cacheKeyBuf.join(\"_\"),\n      annotationStorageSerializable,\n      modifiedIds\n    };\n  }\n  destroy() {\n    if (this.destroyCapability) {\n      return this.destroyCapability.promise;\n    }\n    this.destroyed = true;\n    this.destroyCapability = Promise.withResolvers();\n    this.#passwordCapability?.reject(new Error(\"Worker was destroyed during onPassword callback\"));\n    const waitOn = [];\n    for (const page of this.#pageCache.values()) {\n      waitOn.push(page._destroy());\n    }\n    this.#pageCache.clear();\n    this.#pagePromises.clear();\n    this.#pageRefCache.clear();\n    if (Object.hasOwn(this, \"annotationStorage\")) {\n      this.annotationStorage.resetModified();\n    }\n    const terminated = this.messageHandler.sendWithPromise(\"Terminate\", null);\n    waitOn.push(terminated);\n    Promise.all(waitOn).then(() => {\n      this.commonObjs.clear();\n      this.fontLoader.clear();\n      this.#methodPromises.clear();\n      this.filterFactory.destroy();\n      TextLayer.cleanup();\n      this.#networkStream?.cancelAllRequests(new AbortException(\"Worker was terminated.\"));\n      this.messageHandler?.destroy();\n      this.messageHandler = null;\n      this.destroyCapability.resolve();\n    }, this.destroyCapability.reject);\n    return this.destroyCapability.promise;\n  }\n  setupMessageHandler() {\n    const {\n      messageHandler,\n      loadingTask\n    } = this;\n    messageHandler.on(\"GetReader\", (data, sink) => {\n      assert(this.#networkStream, \"GetReader - no `BasePDFStream` instance available.\");\n      this.#fullReader = this.#networkStream.getFullReader();\n      this.#fullReader.onProgress = evt => this.#onProgress(evt);\n      sink.onPull = () => {\n        this.#fullReader.read().then(function ({\n          value,\n          done\n        }) {\n          if (done) {\n            sink.close();\n            return;\n          }\n          assert(value instanceof ArrayBuffer, \"GetReader - expected an ArrayBuffer.\");\n          sink.enqueue(new Uint8Array(value), 1, [value]);\n        }).catch(reason => {\n          sink.error(reason);\n        });\n      };\n      sink.onCancel = reason => {\n        this.#fullReader.cancel(reason);\n        sink.ready.catch(readyReason => {\n          if (this.destroyed) {\n            return;\n          }\n          throw readyReason;\n        });\n      };\n    });\n    messageHandler.on(\"ReaderHeadersReady\", async data => {\n      await this.#fullReader.headersReady;\n      const {\n        isStreamingSupported,\n        isRangeSupported,\n        contentLength\n      } = this.#fullReader;\n      if (isStreamingSupported && isRangeSupported) {\n        this.#fullReader.onProgress = null;\n      }\n      return {\n        isStreamingSupported,\n        isRangeSupported,\n        contentLength\n      };\n    });\n    messageHandler.on(\"GetRangeReader\", (data, sink) => {\n      assert(this.#networkStream, \"GetRangeReader - no `BasePDFStream` instance available.\");\n      const rangeReader = this.#networkStream.getRangeReader(data.begin, data.end);\n      if (!rangeReader) {\n        sink.close();\n        return;\n      }\n      sink.onPull = () => {\n        rangeReader.read().then(function ({\n          value,\n          done\n        }) {\n          if (done) {\n            sink.close();\n            return;\n          }\n          assert(value instanceof ArrayBuffer, \"GetRangeReader - expected an ArrayBuffer.\");\n          sink.enqueue(new Uint8Array(value), 1, [value]);\n        }).catch(reason => {\n          sink.error(reason);\n        });\n      };\n      sink.onCancel = reason => {\n        rangeReader.cancel(reason);\n        sink.ready.catch(readyReason => {\n          if (this.destroyed) {\n            return;\n          }\n          throw readyReason;\n        });\n      };\n    });\n    messageHandler.on(\"GetDoc\", ({\n      pdfInfo\n    }) => {\n      this.pagesMapper.pagesNumber = pdfInfo.numPages;\n      this._numPages = pdfInfo.numPages;\n      this._htmlForXfa = pdfInfo.htmlForXfa;\n      delete pdfInfo.htmlForXfa;\n      loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this));\n    });\n    messageHandler.on(\"DocException\", ex => {\n      loadingTask._capability.reject(wrapReason(ex));\n    });\n    messageHandler.on(\"PasswordRequest\", ex => {\n      this.#passwordCapability = Promise.withResolvers();\n      try {\n        if (!loadingTask.onPassword) {\n          throw wrapReason(ex);\n        }\n        const updatePassword = password => {\n          if (password instanceof Error) {\n            this.#passwordCapability.reject(password);\n          } else {\n            this.#passwordCapability.resolve({\n              password\n            });\n          }\n        };\n        loadingTask.onPassword(updatePassword, ex.code);\n      } catch (err) {\n        this.#passwordCapability.reject(err);\n      }\n      return this.#passwordCapability.promise;\n    });\n    messageHandler.on(\"DataLoaded\", data => {\n      this.#onProgress({\n        loaded: data.length,\n        total: data.length\n      });\n      this.downloadInfoCapability.resolve(data);\n    });\n    messageHandler.on(\"StartRenderPage\", data => {\n      if (this.destroyed) {\n        return;\n      }\n      const page = this.#pageCache.get(data.pageIndex);\n      page._startRenderPage(data.transparency, data.cacheKey);\n    });\n    messageHandler.on(\"commonobj\", ([id, type, exportedData]) => {\n      if (this.destroyed) {\n        return null;\n      }\n      if (this.commonObjs.has(id)) {\n        return null;\n      }\n      switch (type) {\n        case \"Font\":\n          if (\"error\" in exportedData) {\n            const exportedError = exportedData.error;\n            warn(`Error during font loading: ${exportedError}`);\n            this.commonObjs.resolve(id, exportedError);\n            break;\n          }\n          const fontData = new FontInfo(exportedData);\n          const inspectFont = this._params.pdfBug && globalThis.FontInspector?.enabled ? (font, url) => globalThis.FontInspector.fontAdded(font, url) : null;\n          const font = new FontFaceObject(fontData, inspectFont, exportedData.charProcOperatorList, exportedData.extra);\n          this.fontLoader.bind(font).catch(() => messageHandler.sendWithPromise(\"FontFallback\", {\n            id\n          })).finally(() => {\n            if (!font.fontExtraProperties) {\n              font.clearData();\n            }\n            this.commonObjs.resolve(id, font);\n          });\n          break;\n        case \"CopyLocalImage\":\n          const {\n            imageRef\n          } = exportedData;\n          assert(imageRef, \"The imageRef must be defined.\");\n          for (const pageProxy of this.#pageCache.values()) {\n            for (const [, data] of pageProxy.objs) {\n              if (data?.ref !== imageRef) {\n                continue;\n              }\n              if (!data.dataLen) {\n                return null;\n              }\n              const copy = structuredClone(data);\n              this.commonObjs.resolve(id, copy);\n              return data.dataLen;\n            }\n          }\n          break;\n        case \"FontPath\":\n          this.commonObjs.resolve(id, new FontPathInfo(exportedData));\n          break;\n        case \"Image\":\n          this.commonObjs.resolve(id, exportedData);\n          break;\n        case \"Pattern\":\n          const pattern = new PatternInfo(exportedData);\n          this.commonObjs.resolve(id, pattern.getIR());\n          break;\n        default:\n          throw new Error(`Got unknown common object type ${type}`);\n      }\n      return null;\n    });\n    messageHandler.on(\"obj\", ([id, pageIndex, type, imageData]) => {\n      if (this.destroyed) {\n        return;\n      }\n      const pageProxy = this.#pageCache.get(pageIndex);\n      if (pageProxy.objs.has(id)) {\n        return;\n      }\n      if (pageProxy._intentStates.size === 0) {\n        imageData?.bitmap?.close();\n        return;\n      }\n      switch (type) {\n        case \"Image\":\n        case \"Pattern\":\n          pageProxy.objs.resolve(id, imageData);\n          break;\n        default:\n          throw new Error(`Got unknown object type ${type}`);\n      }\n    });\n    messageHandler.on(\"DocProgress\", data => {\n      if (this.destroyed) {\n        return;\n      }\n      this.#onProgress(data);\n    });\n    messageHandler.on(\"FetchBinaryData\", async data => {\n      if (this.destroyed) {\n        throw new Error(\"Worker was destroyed.\");\n      }\n      if (!this.binaryDataFactory) {\n        throw new Error(\"`BinaryDataFactory` not initialized, see the `useWorkerFetch` parameter.\");\n      }\n      return this.binaryDataFactory.fetch(data);\n    });\n  }\n  getData() {\n    return this.messageHandler.sendWithPromise(\"GetData\", null);\n  }\n  saveDocument() {\n    if (this.annotationStorage.size <= 0) {\n      warn(\"saveDocument called while `annotationStorage` is empty, \" + \"please use the getData-method instead.\");\n    }\n    const {\n      map,\n      transfer\n    } = this.annotationStorage.serializable;\n    return this.messageHandler.sendWithPromise(\"SaveDocument\", {\n      isPureXfa: !!this._htmlForXfa,\n      numPages: this._numPages,\n      annotationStorage: map,\n      filename: this.#fullReader?.filename ?? null\n    }, transfer).finally(() => {\n      this.annotationStorage.resetModified();\n    });\n  }\n  extractPages(pageInfos) {\n    const params = {\n      pageInfos\n    };\n    let transfer;\n    if (this.annotationStorage.size > 0) {\n      const {\n        map,\n        transfer: t\n      } = this.annotationStorage.serializable;\n      params.annotationStorage = map;\n      transfer = t;\n    }\n    return this.messageHandler.sendWithPromise(\"ExtractPages\", params, transfer).finally(() => {\n      this.annotationStorage.resetModified();\n    });\n  }\n  getPage(pageNumber) {\n    if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this.pagesMapper.pagesNumber) {\n      return Promise.reject(new Error(\"Invalid page request.\"));\n    }\n    const pageIndex = pageNumber - 1;\n    const newPageIndex = this.pagesMapper.getPageId(pageNumber) - 1;\n    const cachedPromise = this.#pagePromises.get(pageIndex);\n    if (cachedPromise) {\n      return cachedPromise;\n    }\n    const promise = this.messageHandler.sendWithPromise(\"GetPage\", {\n      pageIndex: newPageIndex\n    }).then(pageInfo => {\n      if (this.destroyed) {\n        throw new Error(\"Transport destroyed\");\n      }\n      if (pageInfo.refStr) {\n        this.#pageRefCache.set(pageInfo.refStr, newPageIndex);\n      }\n      const page = new PDFPageProxy(pageIndex, pageInfo, this, this.pagesMapper, this._params.pdfBug);\n      this.#pageCache.set(pageIndex, page);\n      return page;\n    });\n    this.#pagePromises.set(pageIndex, promise);\n    return promise;\n  }\n  async getPageIndex(ref) {\n    if (!isRefProxy(ref)) {\n      throw new Error(\"Invalid pageIndex request.\");\n    }\n    const index = await this.messageHandler.sendWithPromise(\"GetPageIndex\", {\n      num: ref.num,\n      gen: ref.gen\n    });\n    const pageNumber = this.pagesMapper.getPageNumber(index + 1);\n    if (pageNumber === 0) {\n      throw new Error(\"GetPageIndex: page has been removed.\");\n    }\n    return pageNumber - 1;\n  }\n  getAnnotations(pageIndex, intent) {\n    return this.messageHandler.sendWithPromise(\"GetAnnotations\", {\n      pageIndex: this.pagesMapper.getPageId(pageIndex + 1) - 1,\n      intent\n    });\n  }\n  getFieldObjects() {\n    return this.#cacheSimpleMethod(\"GetFieldObjects\");\n  }\n  hasJSActions() {\n    return this.#cacheSimpleMethod(\"HasJSActions\");\n  }\n  getCalculationOrderIds() {\n    return this.messageHandler.sendWithPromise(\"GetCalculationOrderIds\", null);\n  }\n  getDestinations() {\n    return this.messageHandler.sendWithPromise(\"GetDestinations\", null);\n  }\n  getDestination(id) {\n    if (typeof id !== \"string\") {\n      return Promise.reject(new Error(\"Invalid destination request.\"));\n    }\n    return this.messageHandler.sendWithPromise(\"GetDestination\", {\n      id\n    });\n  }\n  getPageLabels() {\n    return this.messageHandler.sendWithPromise(\"GetPageLabels\", null);\n  }\n  getPageLayout() {\n    return this.messageHandler.sendWithPromise(\"GetPageLayout\", null);\n  }\n  getPageMode() {\n    return this.messageHandler.sendWithPromise(\"GetPageMode\", null);\n  }\n  getViewerPreferences() {\n    return this.messageHandler.sendWithPromise(\"GetViewerPreferences\", null);\n  }\n  getOpenAction() {\n    return this.messageHandler.sendWithPromise(\"GetOpenAction\", null);\n  }\n  getAttachments() {\n    return this.messageHandler.sendWithPromise(\"GetAttachments\", null);\n  }\n  getAnnotationsByType(types, pageIndexesToSkip) {\n    return this.messageHandler.sendWithPromise(\"GetAnnotationsByType\", {\n      types,\n      pageIndexesToSkip\n    });\n  }\n  getDocJSActions() {\n    return this.#cacheSimpleMethod(\"GetDocJSActions\");\n  }\n  getPageJSActions(pageIndex) {\n    return this.messageHandler.sendWithPromise(\"GetPageJSActions\", {\n      pageIndex: this.pagesMapper.getPageId(pageIndex + 1) - 1\n    });\n  }\n  getStructTree(pageIndex) {\n    return this.messageHandler.sendWithPromise(\"GetStructTree\", {\n      pageIndex: this.pagesMapper.getPageId(pageIndex + 1) - 1\n    });\n  }\n  getOutline() {\n    return this.messageHandler.sendWithPromise(\"GetOutline\", null);\n  }\n  getOptionalContentConfig(renderingIntent) {\n    return this.#cacheSimpleMethod(\"GetOptionalContentConfig\").then(data => new OptionalContentConfig(data, renderingIntent));\n  }\n  getPermissions() {\n    return this.messageHandler.sendWithPromise(\"GetPermissions\", null);\n  }\n  getMetadata() {\n    const name = \"GetMetadata\";\n    return this.#methodPromises.getOrInsertComputed(name, () => this.messageHandler.sendWithPromise(name, null).then(results => ({\n      info: results[0],\n      metadata: results[1] ? new Metadata(results[1]) : null,\n      contentDispositionFilename: this.#fullReader?.filename ?? null,\n      contentLength: this.#fullReader?.contentLength ?? null,\n      hasStructTree: results[2]\n    })));\n  }\n  getMarkInfo() {\n    return this.messageHandler.sendWithPromise(\"GetMarkInfo\", null);\n  }\n  getRawData(data) {\n    return this.messageHandler.sendWithPromise(\"GetRawData\", data);\n  }\n  async startCleanup(keepLoadedFonts = false) {\n    if (this.destroyed) {\n      return;\n    }\n    await this.messageHandler.sendWithPromise(\"Cleanup\", null);\n    for (const page of this.#pageCache.values()) {\n      const cleanupSuccessful = page.cleanup();\n      if (!cleanupSuccessful) {\n        throw new Error(`startCleanup: Page ${page.pageNumber} is currently rendering.`);\n      }\n    }\n    this.commonObjs.clear();\n    if (!keepLoadedFonts) {\n      this.fontLoader.clear();\n    }\n    this.#methodPromises.clear();\n    this.filterFactory.destroy(true);\n    TextLayer.cleanup();\n  }\n  cachedPageNumber(ref) {\n    if (!isRefProxy(ref)) {\n      return null;\n    }\n    const refStr = ref.gen === 0 ? `${ref.num}R` : `${ref.num}R${ref.gen}`;\n    const pageIndex = this.#pageRefCache.get(refStr);\n    if (pageIndex >= 0) {\n      const pageNumber = this.pagesMapper.getPageNumber(pageIndex + 1);\n      if (pageNumber !== 0) {\n        return pageNumber;\n      }\n    }\n    return null;\n  }\n}\nclass RenderTask {\n  _internalRenderTask = null;\n  onContinue = null;\n  onError = null;\n  constructor(internalRenderTask) {\n    this._internalRenderTask = internalRenderTask;\n  }\n  get promise() {\n    return this._internalRenderTask.capability.promise;\n  }\n  cancel(extraDelay = 0) {\n    this._internalRenderTask.cancel(null, extraDelay);\n  }\n  get separateAnnots() {\n    const {\n      separateAnnots\n    } = this._internalRenderTask.operatorList;\n    if (!separateAnnots) {\n      return false;\n    }\n    const {\n      annotationCanvasMap\n    } = this._internalRenderTask;\n    return separateAnnots.form || separateAnnots.canvas && annotationCanvasMap?.size > 0;\n  }\n  get imageCoordinates() {\n    return this._internalRenderTask.imageCoordinates || null;\n  }\n}\nclass InternalRenderTask {\n  #rAF = null;\n  static #canvasInUse = new WeakSet();\n  constructor({\n    callback,\n    params,\n    objs,\n    commonObjs,\n    annotationCanvasMap,\n    operatorList,\n    pageIndex,\n    canvasFactory,\n    filterFactory,\n    useRequestAnimationFrame = false,\n    pdfBug = false,\n    pageColors = null,\n    enableHWA = false,\n    operationsFilter = null\n  }) {\n    this.callback = callback;\n    this.params = params;\n    this.objs = objs;\n    this.commonObjs = commonObjs;\n    this.annotationCanvasMap = annotationCanvasMap;\n    this.operatorListIdx = null;\n    this.operatorList = operatorList;\n    this._pageIndex = pageIndex;\n    this.canvasFactory = canvasFactory;\n    this.filterFactory = filterFactory;\n    this._pdfBug = pdfBug;\n    this.pageColors = pageColors;\n    this.running = false;\n    this.graphicsReadyCallback = null;\n    this.graphicsReady = false;\n    this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== \"undefined\";\n    this.cancelled = false;\n    this.capability = Promise.withResolvers();\n    this.task = new RenderTask(this);\n    this._cancelBound = this.cancel.bind(this);\n    this._continueBound = this._continue.bind(this);\n    this._scheduleNextBound = this._scheduleNext.bind(this);\n    this._nextBound = this._next.bind(this);\n    this._canvas = params.canvas;\n    this._canvasContext = params.canvas ? null : params.canvasContext;\n    this._enableHWA = enableHWA;\n    this._dependencyTracker = params.dependencyTracker;\n    this._imagesTracker = params.imagesTracker;\n    this._operationsFilter = operationsFilter;\n  }\n  get completed() {\n    return this.capability.promise.catch(function () {});\n  }\n  initializeGraphics({\n    transparency = false,\n    optionalContentConfig\n  }) {\n    if (this.cancelled) {\n      return;\n    }\n    if (this._canvas) {\n      if (InternalRenderTask.#canvasInUse.has(this._canvas)) {\n        throw new Error(\"Cannot use the same canvas during multiple render() operations. \" + \"Use different canvas or ensure previous operations were \" + \"cancelled or completed.\");\n      }\n      InternalRenderTask.#canvasInUse.add(this._canvas);\n    }\n    if (this._pdfBug && globalThis.StepperManager?.enabled) {\n      this.stepper = globalThis.StepperManager.create(this._pageIndex);\n      this.stepper.init(this.operatorList);\n      this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();\n    }\n    const {\n      viewport,\n      transform,\n      background,\n      dependencyTracker,\n      imagesTracker\n    } = this.params;\n    const canvasContext = this._canvasContext || this._canvas.getContext(\"2d\", {\n      alpha: false,\n      willReadFrequently: !this._enableHWA\n    });\n    this.gfx = new CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, {\n      optionalContentConfig\n    }, this.annotationCanvasMap, this.pageColors, dependencyTracker, imagesTracker);\n    this.gfx.beginDrawing({\n      transform,\n      viewport,\n      transparency,\n      background\n    });\n    this.operatorListIdx = 0;\n    this.graphicsReady = true;\n    this.graphicsReadyCallback?.();\n  }\n  cancel(error = null, extraDelay = 0) {\n    this.running = false;\n    this.cancelled = true;\n    this.gfx?.endDrawing();\n    if (this.#rAF) {\n      window.cancelAnimationFrame(this.#rAF);\n      this.#rAF = null;\n    }\n    InternalRenderTask.#canvasInUse.delete(this._canvas);\n    error ||= new RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, extraDelay);\n    this.callback(error);\n    this.task.onError?.(error);\n  }\n  operatorListChanged() {\n    if (!this.graphicsReady) {\n      this.graphicsReadyCallback ||= this._continueBound;\n      return;\n    }\n    this.gfx.dependencyTracker?.growOperationsCount(this.operatorList.fnArray.length);\n    this.stepper?.updateOperatorList(this.operatorList);\n    if (this.running) {\n      return;\n    }\n    this._continue();\n  }\n  _continue() {\n    this.running = true;\n    if (this.cancelled) {\n      return;\n    }\n    if (this.task.onContinue) {\n      this.task.onContinue(this._scheduleNextBound);\n    } else {\n      this._scheduleNext();\n    }\n  }\n  _scheduleNext() {\n    if (this._useRequestAnimationFrame) {\n      this.#rAF = window.requestAnimationFrame(() => {\n        this.#rAF = null;\n        this._nextBound().catch(this._cancelBound);\n      });\n    } else {\n      Promise.resolve().then(this._nextBound).catch(this._cancelBound);\n    }\n  }\n  async _next() {\n    if (this.cancelled) {\n      return;\n    }\n    this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper, this._operationsFilter);\n    if (this.operatorListIdx === this.operatorList.argsArray.length) {\n      this.running = false;\n      if (this.operatorList.lastChunk) {\n        this.gfx.endDrawing();\n        InternalRenderTask.#canvasInUse.delete(this._canvas);\n        this.callback();\n      }\n    }\n  }\n}\nconst version = \"5.7.284\";\nconst build = \"7e5b36c2d\";\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.math.sum-precise.js\nvar es_math_sum_precise = __webpack_require__(3068);\n;// ./src/display/editor/color_picker.js\n\n\n\nclass ColorPicker {\n  #button = null;\n  #buttonSwatch = null;\n  #defaultColor;\n  #dropdown = null;\n  #dropdownWasFromKeyboard = false;\n  #isMainColorPicker = false;\n  #editor = null;\n  #eventBus;\n  #openDropdownAC = null;\n  #uiManager = null;\n  static #l10nColor = null;\n  static get _keyboardManager() {\n    return shadow(this, \"_keyboardManager\", new KeyboardManager([[[\"Escape\", \"mac+Escape\"], ColorPicker.prototype._hideDropdownFromKeyboard], [[\" \", \"mac+ \"], ColorPicker.prototype._colorSelectFromKeyboard], [[\"ArrowDown\", \"ArrowRight\", \"mac+ArrowDown\", \"mac+ArrowRight\"], ColorPicker.prototype._moveToNext], [[\"ArrowUp\", \"ArrowLeft\", \"mac+ArrowUp\", \"mac+ArrowLeft\"], ColorPicker.prototype._moveToPrevious], [[\"Home\", \"mac+Home\"], ColorPicker.prototype._moveToBeginning], [[\"End\", \"mac+End\"], ColorPicker.prototype._moveToEnd]]));\n  }\n  constructor({\n    editor = null,\n    uiManager = null\n  }) {\n    if (editor) {\n      this.#isMainColorPicker = false;\n      this.#editor = editor;\n    } else {\n      this.#isMainColorPicker = true;\n    }\n    this.#uiManager = editor?._uiManager || uiManager;\n    this.#eventBus = this.#uiManager._eventBus;\n    this.#defaultColor = editor?.color?.toUpperCase() || this.#uiManager?.highlightColors.values().next().value || \"#FFFF98\";\n    ColorPicker.#l10nColor ||= Object.freeze({\n      blue: \"pdfjs-editor-colorpicker-blue\",\n      green: \"pdfjs-editor-colorpicker-green\",\n      pink: \"pdfjs-editor-colorpicker-pink\",\n      red: \"pdfjs-editor-colorpicker-red\",\n      yellow: \"pdfjs-editor-colorpicker-yellow\"\n    });\n  }\n  renderButton() {\n    const button = this.#button = document.createElement(\"button\");\n    button.className = \"colorPicker\";\n    button.tabIndex = \"0\";\n    button.setAttribute(\"data-l10n-id\", \"pdfjs-editor-colorpicker-button\");\n    button.ariaHasPopup = \"true\";\n    if (this.#editor) {\n      button.ariaControls = `${this.#editor.id}_colorpicker_dropdown`;\n    }\n    const signal = this.#uiManager._signal;\n    button.addEventListener(\"click\", this.#openDropdown.bind(this), {\n      signal\n    });\n    button.addEventListener(\"keydown\", this.#keyDown.bind(this), {\n      signal\n    });\n    const swatch = this.#buttonSwatch = document.createElement(\"span\");\n    swatch.className = \"swatch\";\n    swatch.ariaHidden = \"true\";\n    swatch.style.backgroundColor = this.#defaultColor;\n    button.append(swatch);\n    return button;\n  }\n  renderMainDropdown() {\n    const dropdown = this.#dropdown = this.#getDropdownRoot();\n    dropdown.ariaOrientation = \"horizontal\";\n    dropdown.ariaLabelledBy = \"highlightColorPickerLabel\";\n    return dropdown;\n  }\n  #getDropdownRoot() {\n    const div = document.createElement(\"div\");\n    const signal = this.#uiManager._signal;\n    div.addEventListener(\"contextmenu\", noContextMenu, {\n      signal\n    });\n    div.className = \"dropdown\";\n    div.role = \"listbox\";\n    div.ariaMultiSelectable = \"false\";\n    div.ariaOrientation = \"vertical\";\n    div.setAttribute(\"data-l10n-id\", \"pdfjs-editor-colorpicker-dropdown\");\n    if (this.#editor) {\n      div.id = `${this.#editor.id}_colorpicker_dropdown`;\n    }\n    for (const [name, color] of this.#uiManager.highlightColors) {\n      const button = document.createElement(\"button\");\n      button.tabIndex = \"0\";\n      button.role = \"option\";\n      button.setAttribute(\"data-color\", color);\n      button.title = name;\n      button.setAttribute(\"data-l10n-id\", ColorPicker.#l10nColor[name]);\n      const swatch = document.createElement(\"span\");\n      button.append(swatch);\n      swatch.className = \"swatch\";\n      swatch.style.backgroundColor = color;\n      button.ariaSelected = color === this.#defaultColor;\n      button.addEventListener(\"click\", this.#colorSelect.bind(this, color), {\n        signal\n      });\n      div.append(button);\n    }\n    div.addEventListener(\"keydown\", this.#keyDown.bind(this), {\n      signal\n    });\n    return div;\n  }\n  #colorSelect(color, event) {\n    event.stopPropagation();\n    this.#eventBus.dispatch(\"switchannotationeditorparams\", {\n      source: this,\n      type: AnnotationEditorParamsType.HIGHLIGHT_COLOR,\n      value: color\n    });\n    this.updateColor(color);\n  }\n  _colorSelectFromKeyboard(event) {\n    if (event.target === this.#button) {\n      this.#openDropdown(event);\n      return;\n    }\n    const color = event.target.getAttribute(\"data-color\");\n    if (!color) {\n      return;\n    }\n    this.#colorSelect(color, event);\n  }\n  _moveToNext(event) {\n    if (!this.#isDropdownVisible) {\n      this.#openDropdown(event);\n      return;\n    }\n    if (event.target === this.#button) {\n      this.#dropdown.firstElementChild?.focus();\n      return;\n    }\n    event.target.nextSibling?.focus();\n  }\n  _moveToPrevious(event) {\n    if (event.target === this.#dropdown?.firstElementChild || event.target === this.#button) {\n      if (this.#isDropdownVisible) {\n        this._hideDropdownFromKeyboard();\n      }\n      return;\n    }\n    if (!this.#isDropdownVisible) {\n      this.#openDropdown(event);\n    }\n    event.target.previousSibling?.focus();\n  }\n  _moveToBeginning(event) {\n    if (!this.#isDropdownVisible) {\n      this.#openDropdown(event);\n      return;\n    }\n    this.#dropdown.firstElementChild?.focus();\n  }\n  _moveToEnd(event) {\n    if (!this.#isDropdownVisible) {\n      this.#openDropdown(event);\n      return;\n    }\n    this.#dropdown.lastElementChild?.focus();\n  }\n  #keyDown(event) {\n    ColorPicker._keyboardManager.exec(this, event);\n  }\n  #openDropdown(event) {\n    if (this.#isDropdownVisible) {\n      this.hideDropdown();\n      return;\n    }\n    this.#dropdownWasFromKeyboard = event.detail === 0;\n    if (!this.#openDropdownAC) {\n      this.#openDropdownAC = new AbortController();\n      window.addEventListener(\"pointerdown\", this.#pointerDown.bind(this), {\n        signal: this.#uiManager.combinedSignal(this.#openDropdownAC)\n      });\n    }\n    this.#button.ariaExpanded = \"true\";\n    if (this.#dropdown) {\n      this.#dropdown.classList.remove(\"hidden\");\n      return;\n    }\n    const root = this.#dropdown = this.#getDropdownRoot();\n    this.#button.append(root);\n  }\n  #pointerDown(event) {\n    if (this.#dropdown?.contains(event.target)) {\n      return;\n    }\n    this.hideDropdown();\n  }\n  hideDropdown() {\n    this.#dropdown?.classList.add(\"hidden\");\n    this.#button.ariaExpanded = \"false\";\n    this.#openDropdownAC?.abort();\n    this.#openDropdownAC = null;\n  }\n  get #isDropdownVisible() {\n    return this.#dropdown && !this.#dropdown.classList.contains(\"hidden\");\n  }\n  _hideDropdownFromKeyboard() {\n    if (this.#isMainColorPicker) {\n      return;\n    }\n    if (!this.#isDropdownVisible) {\n      this.#editor?.unselect();\n      return;\n    }\n    this.hideDropdown();\n    this.#button.focus({\n      preventScroll: true,\n      focusVisible: this.#dropdownWasFromKeyboard\n    });\n  }\n  updateColor(color) {\n    if (this.#buttonSwatch) {\n      this.#buttonSwatch.style.backgroundColor = color;\n    }\n    if (!this.#dropdown) {\n      return;\n    }\n    const i = this.#uiManager.highlightColors.values();\n    for (const child of this.#dropdown.children) {\n      child.ariaSelected = i.next().value === color.toUpperCase();\n    }\n  }\n  destroy() {\n    this.#button?.remove();\n    this.#button = null;\n    this.#buttonSwatch = null;\n    this.#dropdown?.remove();\n    this.#dropdown = null;\n  }\n}\nclass BasicColorPicker {\n  #input = null;\n  #hasAlpha = false;\n  #editor = null;\n  #uiManager = null;\n  static #l10nColor = null;\n  constructor(editor) {\n    this.#editor = editor;\n    this.#uiManager = editor._uiManager;\n    BasicColorPicker.#l10nColor ||= Object.freeze({\n      freetext: \"pdfjs-editor-color-picker-free-text-input\",\n      ink: \"pdfjs-editor-color-picker-ink-input\"\n    });\n  }\n  renderButton() {\n    if (this.#input) {\n      return this.#input;\n    }\n    const {\n      editorType,\n      colorType,\n      colorAndOpacityType,\n      opacityType,\n      color,\n      opacity\n    } = this.#editor;\n    const hasAlpha = this.#hasAlpha = FeatureTest.isAlphaColorInputSupported && opacityType !== undefined;\n    const input = this.#input = document.createElement(\"input\");\n    input.type = \"color\";\n    if (hasAlpha) {\n      input.setAttribute(\"alpha\", \"\");\n      const alphaHex = Util.hexNums[Math.round((opacity ?? 1) * 255)];\n      input.value = (color || \"#000000\") + alphaHex;\n    } else {\n      input.value = color || \"#000000\";\n    }\n    input.className = \"basicColorPicker\";\n    input.tabIndex = 0;\n    input.setAttribute(\"data-l10n-id\", BasicColorPicker.#l10nColor[editorType]);\n    input.addEventListener(\"input\", () => {\n      if (hasAlpha) {\n        const rgba = getRGBA(input.value);\n        if (!rgba) {\n          return;\n        }\n        const [r, g, b, op] = rgba;\n        const hex = Util.makeHexColor(r, g, b);\n        if (colorAndOpacityType !== undefined) {\n          this.#uiManager.updateParams(colorAndOpacityType, {\n            color: hex,\n            opacity: op\n          });\n        } else {\n          this.#uiManager.updateParams(colorType, hex);\n          this.#uiManager.updateParams(opacityType, op);\n        }\n      } else {\n        this.#uiManager.updateParams(colorType, input.value);\n      }\n    }, {\n      signal: this.#uiManager._signal\n    });\n    return input;\n  }\n  update(value) {\n    if (!this.#input) {\n      return;\n    }\n    if (this.#hasAlpha) {\n      const alphaHex = Util.hexNums[Math.round(this.#editor.opacity * 255)];\n      this.#input.value = value + alphaHex;\n    } else {\n      this.#input.value = value;\n    }\n  }\n  updateOpacity(value) {\n    if (!this.#input || !this.#hasAlpha) {\n      return;\n    }\n    const alphaHex = Util.hexNums[Math.round(value * 255)];\n    this.#input.value = this.#editor.color + alphaHex;\n  }\n  destroy() {\n    this.#input?.remove();\n    this.#input = null;\n  }\n  hideDropdown() {}\n}\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.flat-map.js\nvar es_iterator_flat_map = __webpack_require__(531);\n;// ./src/shared/scripting_utils.js\n\n\n\nfunction makeColorComp(n) {\n  return Math.floor(MathClamp(n, 0, 1) * 255).toString(16).padStart(2, \"0\");\n}\nfunction scaleAndClamp(x) {\n  return MathClamp(x, 0, 1) * 255;\n}\nclass ColorConverters {\n  static CMYK_G([c, y, m, k]) {\n    return [\"G\", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];\n  }\n  static G_CMYK([g]) {\n    return [\"CMYK\", 0, 0, 0, 1 - g];\n  }\n  static G_RGB([g]) {\n    return [\"RGB\", g, g, g];\n  }\n  static G_rgb([g]) {\n    g = scaleAndClamp(g);\n    return [g, g, g];\n  }\n  static G_HTML([g]) {\n    const G = makeColorComp(g);\n    return `#${G}${G}${G}`;\n  }\n  static RGB_G([r, g, b]) {\n    return [\"G\", 0.3 * r + 0.59 * g + 0.11 * b];\n  }\n  static RGB_rgb(color) {\n    return color.map(scaleAndClamp);\n  }\n  static RGB_HTML(color) {\n    return `#${color.map(makeColorComp).join(\"\")}`;\n  }\n  static T_HTML() {\n    return \"#00000000\";\n  }\n  static T_rgb() {\n    return [null];\n  }\n  static CMYK_RGB([c, y, m, k]) {\n    return [\"RGB\", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)];\n  }\n  static CMYK_rgb([c, y, m, k]) {\n    return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))];\n  }\n  static CMYK_HTML(components) {\n    const rgb = this.CMYK_RGB(components).slice(1);\n    return this.RGB_HTML(rgb);\n  }\n  static RGB_CMYK([r, g, b]) {\n    const c = 1 - r;\n    const m = 1 - g;\n    const y = 1 - b;\n    const k = Math.min(c, m, y);\n    return [\"CMYK\", c, m, y, k];\n  }\n}\nconst DateFormats = (/* unused pure expression or super */ null && ([\"m/d\", \"m/d/yy\", \"mm/dd/yy\", \"mm/yy\", \"d-mmm\", \"d-mmm-yy\", \"dd-mmm-yy\", \"yy-mm-dd\", \"mmm-yy\", \"mmmm-yy\", \"mmm d, yyyy\", \"mmmm d, yyyy\", \"m/d/yy h:MM tt\", \"m/d/yy HH:MM\"]));\nconst TimeFormats = (/* unused pure expression or super */ null && ([\"HH:MM\", \"h:MM tt\", \"HH:MM:ss\", \"h:MM:ss tt\"]));\n\n;// ./src/display/svg_factory.js\n\n\nclass BaseSVGFactory {\n  create(width, height, skipDimensions = false) {\n    if (width <= 0 || height <= 0) {\n      throw new Error(\"Invalid SVG dimensions\");\n    }\n    const svg = this._createSVG(\"svg:svg\");\n    svg.setAttribute(\"version\", \"1.1\");\n    if (!skipDimensions) {\n      svg.setAttribute(\"width\", `${width}px`);\n      svg.setAttribute(\"height\", `${height}px`);\n    }\n    svg.setAttribute(\"preserveAspectRatio\", \"none\");\n    svg.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n    return svg;\n  }\n  createElement(type) {\n    if (typeof type !== \"string\") {\n      throw new Error(\"Invalid SVG element type\");\n    }\n    return this._createSVG(type);\n  }\n  _createSVG(type) {\n    unreachable(\"Abstract method `_createSVG` called.\");\n  }\n}\nclass DOMSVGFactory extends BaseSVGFactory {\n  _createSVG(type) {\n    return document.createElementNS(SVG_NS, type);\n  }\n}\n\n;// ./src/display/annotation_layer.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst annotation_layer_DEFAULT_FONT_SIZE = 9;\nconst GetElementsByNameSet = new WeakSet();\nconst TIMEZONE_OFFSET = new Date().getTimezoneOffset() * 60 * 1000;\nclass AnnotationElementFactory {\n  static create(parameters) {\n    const subtype = parameters.data.annotationType;\n    switch (subtype) {\n      case AnnotationType.LINK:\n        return new LinkAnnotationElement(parameters);\n      case AnnotationType.TEXT:\n        return new TextAnnotationElement(parameters);\n      case AnnotationType.WIDGET:\n        const fieldType = parameters.data.fieldType;\n        switch (fieldType) {\n          case \"Tx\":\n            return new TextWidgetAnnotationElement(parameters);\n          case \"Btn\":\n            if (parameters.data.radioButton) {\n              return new RadioButtonWidgetAnnotationElement(parameters);\n            } else if (parameters.data.checkBox) {\n              return new CheckboxWidgetAnnotationElement(parameters);\n            }\n            return new PushButtonWidgetAnnotationElement(parameters);\n          case \"Ch\":\n            return new ChoiceWidgetAnnotationElement(parameters);\n          case \"Sig\":\n            return new SignatureWidgetAnnotationElement(parameters);\n        }\n        return new WidgetAnnotationElement(parameters);\n      case AnnotationType.POPUP:\n        return new PopupAnnotationElement(parameters);\n      case AnnotationType.FREETEXT:\n        return new FreeTextAnnotationElement(parameters);\n      case AnnotationType.LINE:\n        return new LineAnnotationElement(parameters);\n      case AnnotationType.SQUARE:\n        return new SquareAnnotationElement(parameters);\n      case AnnotationType.CIRCLE:\n        return new CircleAnnotationElement(parameters);\n      case AnnotationType.POLYLINE:\n        return new PolylineAnnotationElement(parameters);\n      case AnnotationType.CARET:\n        return new CaretAnnotationElement(parameters);\n      case AnnotationType.INK:\n        return new InkAnnotationElement(parameters);\n      case AnnotationType.POLYGON:\n        return new PolygonAnnotationElement(parameters);\n      case AnnotationType.HIGHLIGHT:\n        return new HighlightAnnotationElement(parameters);\n      case AnnotationType.UNDERLINE:\n        return new UnderlineAnnotationElement(parameters);\n      case AnnotationType.SQUIGGLY:\n        return new SquigglyAnnotationElement(parameters);\n      case AnnotationType.STRIKEOUT:\n        return new StrikeOutAnnotationElement(parameters);\n      case AnnotationType.STAMP:\n        return new StampAnnotationElement(parameters);\n      case AnnotationType.FILEATTACHMENT:\n        return new FileAttachmentAnnotationElement(parameters);\n      default:\n        return new AnnotationElement(parameters);\n    }\n  }\n}\nclass AnnotationElement {\n  #updates = null;\n  #hasBorder = false;\n  #popupElement = null;\n  constructor(parameters, {\n    isRenderable = false,\n    ignoreBorder = false,\n    createQuadrilaterals = false\n  } = {}) {\n    this.isRenderable = isRenderable;\n    this.data = parameters.data;\n    this.layer = parameters.layer;\n    this.linkService = parameters.linkService;\n    this.downloadManager = parameters.downloadManager;\n    this.imageResourcesPath = parameters.imageResourcesPath;\n    this.renderForms = parameters.renderForms;\n    this.svgFactory = parameters.svgFactory;\n    this.annotationStorage = parameters.annotationStorage;\n    this.enableComment = parameters.enableComment;\n    this.enableScripting = parameters.enableScripting;\n    this.hasJSActions = parameters.hasJSActions;\n    this._fieldObjects = parameters.fieldObjects;\n    this.parent = parameters.parent;\n    this.hasOwnCommentButton = false;\n    if (isRenderable) {\n      this.contentElement = this.container = this._createContainer(ignoreBorder);\n    }\n    if (createQuadrilaterals) {\n      this._createQuadrilaterals();\n    }\n  }\n  static _hasPopupData({\n    contentsObj,\n    richText\n  }) {\n    return !!(contentsObj?.str || richText?.str);\n  }\n  get _isEditable() {\n    return this.data.isEditable;\n  }\n  get hasPopupData() {\n    return AnnotationElement._hasPopupData(this.data) || this.enableComment && !!this.commentText;\n  }\n  get commentData() {\n    const {\n      data\n    } = this;\n    const editor = this.annotationStorage?.getEditor(data.id);\n    if (editor) {\n      return editor.getData();\n    }\n    return data;\n  }\n  get hasCommentButton() {\n    return this.enableComment && this.hasPopupElement;\n  }\n  get commentButtonPosition() {\n    const editor = this.annotationStorage?.getEditor(this.data.id);\n    if (editor) {\n      return editor.commentButtonPositionInPage;\n    }\n    const {\n      quadPoints,\n      inkLists,\n      rect\n    } = this.data;\n    let maxX = -Infinity;\n    let maxY = -Infinity;\n    if (quadPoints?.length >= 8) {\n      for (let i = 0; i < quadPoints.length; i += 8) {\n        if (quadPoints[i + 1] > maxY) {\n          maxY = quadPoints[i + 1];\n          maxX = quadPoints[i + 2];\n        } else if (quadPoints[i + 1] === maxY) {\n          maxX = Math.max(maxX, quadPoints[i + 2]);\n        }\n      }\n      return [maxX, maxY];\n    }\n    if (inkLists?.length >= 1) {\n      for (const inkList of inkLists) {\n        for (let i = 0, ii = inkList.length; i < ii; i += 2) {\n          if (inkList[i + 1] > maxY) {\n            maxY = inkList[i + 1];\n            maxX = inkList[i];\n          } else if (inkList[i + 1] === maxY) {\n            maxX = Math.max(maxX, inkList[i]);\n          }\n        }\n      }\n      if (maxX !== Infinity) {\n        return [maxX, maxY];\n      }\n    }\n    if (rect) {\n      return [rect[2], rect[3]];\n    }\n    return null;\n  }\n  _normalizePoint(point) {\n    const {\n      page: {\n        view\n      },\n      viewport: {\n        rawDims: {\n          pageWidth,\n          pageHeight,\n          pageX,\n          pageY\n        }\n      }\n    } = this.parent;\n    point[1] = view[3] - point[1] + view[1];\n    point[0] = 100 * (point[0] - pageX) / pageWidth;\n    point[1] = 100 * (point[1] - pageY) / pageHeight;\n    return point;\n  }\n  get commentText() {\n    const {\n      data\n    } = this;\n    return this.annotationStorage.getRawValue(`${AnnotationEditorPrefix}${data.id}`)?.popup?.contents || data.contentsObj?.str || \"\";\n  }\n  set commentText(text) {\n    const {\n      data\n    } = this;\n    const popup = {\n      deleted: !text,\n      contents: text || \"\"\n    };\n    if (!this.annotationStorage.updateEditor(data.id, {\n      popup\n    })) {\n      this.annotationStorage.setValue(`${AnnotationEditorPrefix}${data.id}`, {\n        id: data.id,\n        annotationType: data.annotationType,\n        page: this.parent.page,\n        popup,\n        popupRef: data.popupRef,\n        modificationDate: new Date()\n      });\n    }\n    if (!text) {\n      this.removePopup();\n    }\n  }\n  removePopup() {\n    (this.#popupElement?.popup || this.popup)?.remove();\n    this.#popupElement = this.popup = null;\n  }\n  updateEdited(params) {\n    if (!this.container) {\n      return;\n    }\n    if (params.rect) {\n      this.#updates ||= {\n        rect: this.data.rect.slice(0)\n      };\n    }\n    const {\n      rect,\n      popup: newPopup\n    } = params;\n    if (rect) {\n      this.#setRectEdited(rect);\n    }\n    let popup = this.#popupElement?.popup || this.popup;\n    if (!popup && newPopup?.text) {\n      this._createPopup(newPopup);\n      popup = this.#popupElement.popup;\n    }\n    if (!popup) {\n      return;\n    }\n    popup.updateEdited(params);\n    if (newPopup?.deleted) {\n      popup.remove();\n      this.#popupElement = null;\n      this.popup = null;\n    }\n  }\n  resetEdited() {\n    if (!this.#updates) {\n      return;\n    }\n    this.#setRectEdited(this.#updates.rect);\n    this.#popupElement?.popup.resetEdited();\n    this.#updates = null;\n  }\n  #setRectEdited(rect) {\n    const {\n      container: {\n        style\n      },\n      data: {\n        rect: currentRect,\n        rotation\n      },\n      parent: {\n        viewport: {\n          rawDims: {\n            pageWidth,\n            pageHeight,\n            pageX,\n            pageY\n          }\n        }\n      }\n    } = this;\n    currentRect?.splice(0, 4, ...rect);\n    style.left = `${100 * (rect[0] - pageX) / pageWidth}%`;\n    style.top = `${100 * (pageHeight - rect[3] + pageY) / pageHeight}%`;\n    if (rotation === 0) {\n      style.width = `${100 * (rect[2] - rect[0]) / pageWidth}%`;\n      style.height = `${100 * (rect[3] - rect[1]) / pageHeight}%`;\n    } else {\n      this.setRotation(rotation);\n    }\n  }\n  _createContainer(ignoreBorder) {\n    const {\n      data,\n      parent: {\n        page,\n        viewport\n      }\n    } = this;\n    const container = document.createElement(\"section\");\n    container.setAttribute(\"data-annotation-id\", data.id);\n    if (!(this instanceof WidgetAnnotationElement) && !(this instanceof LinkAnnotationElement)) {\n      container.tabIndex = 0;\n    }\n    const {\n      style\n    } = container;\n    style.zIndex = this.parent.zIndex;\n    this.parent.zIndex += 2;\n    if (data.alternativeText) {\n      container.title = data.alternativeText;\n    }\n    if (data.noRotate) {\n      container.classList.add(\"norotate\");\n    }\n    if (!data.rect || this instanceof PopupAnnotationElement) {\n      const {\n        rotation\n      } = data;\n      if (!data.hasOwnCanvas && rotation !== 0) {\n        this.setRotation(rotation, container);\n      }\n      return container;\n    }\n    const {\n      width,\n      height\n    } = this;\n    if (!ignoreBorder && data.borderStyle.width > 0) {\n      style.borderWidth = `${data.borderStyle.width}px`;\n      const horizontalRadius = data.borderStyle.horizontalCornerRadius;\n      const verticalRadius = data.borderStyle.verticalCornerRadius;\n      if (horizontalRadius > 0 || verticalRadius > 0) {\n        const radius = `calc(${horizontalRadius}px * var(--total-scale-factor)) / calc(${verticalRadius}px * var(--total-scale-factor))`;\n        style.borderRadius = radius;\n      } else if (this instanceof RadioButtonWidgetAnnotationElement) {\n        const radius = `calc(${width}px * var(--total-scale-factor)) / calc(${height}px * var(--total-scale-factor))`;\n        style.borderRadius = radius;\n      }\n      switch (data.borderStyle.style) {\n        case AnnotationBorderStyleType.SOLID:\n          style.borderStyle = \"solid\";\n          break;\n        case AnnotationBorderStyleType.DASHED:\n          style.borderStyle = \"dashed\";\n          break;\n        case AnnotationBorderStyleType.BEVELED:\n          warn(\"Unimplemented border style: beveled\");\n          break;\n        case AnnotationBorderStyleType.INSET:\n          warn(\"Unimplemented border style: inset\");\n          break;\n        case AnnotationBorderStyleType.UNDERLINE:\n          style.borderBottomStyle = \"solid\";\n          break;\n        default:\n          break;\n      }\n      const borderColor = data.borderColor || null;\n      if (borderColor) {\n        this.#hasBorder = true;\n        style.borderColor = Util.makeHexColor(...borderColor);\n      } else {\n        style.borderWidth = 0;\n      }\n    }\n    const rect = Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]);\n    const {\n      pageWidth,\n      pageHeight,\n      pageX,\n      pageY\n    } = viewport.rawDims;\n    style.left = `${100 * (rect[0] - pageX) / pageWidth}%`;\n    style.top = `${100 * (rect[1] - pageY) / pageHeight}%`;\n    const {\n      rotation\n    } = data;\n    if (data.hasOwnCanvas || rotation === 0) {\n      style.width = `${100 * width / pageWidth}%`;\n      style.height = `${100 * height / pageHeight}%`;\n    } else {\n      this.setRotation(rotation, container);\n    }\n    return container;\n  }\n  setRotation(angle, container = this.container) {\n    if (!this.data.rect) {\n      return;\n    }\n    const {\n      pageWidth,\n      pageHeight\n    } = this.parent.viewport.rawDims;\n    let {\n      width,\n      height\n    } = this;\n    if (angle % 180 !== 0) {\n      [width, height] = [height, width];\n    }\n    container.style.width = `${100 * width / pageWidth}%`;\n    container.style.height = `${100 * height / pageHeight}%`;\n    container.setAttribute(\"data-main-rotation\", (360 - angle) % 360);\n  }\n  get _commonActions() {\n    const setColor = (jsName, styleName, event) => {\n      const color = event.detail[jsName];\n      const colorType = color[0];\n      const colorArray = color.slice(1);\n      event.target.style[styleName] = ColorConverters[`${colorType}_HTML`](colorArray);\n      this.annotationStorage.setValue(this.data.id, {\n        [styleName]: ColorConverters[`${colorType}_rgb`](colorArray)\n      });\n    };\n    return shadow(this, \"_commonActions\", {\n      display: event => {\n        const {\n          display\n        } = event.detail;\n        const hidden = display % 2 === 1;\n        this.container.style.visibility = hidden ? \"hidden\" : \"visible\";\n        this.annotationStorage.setValue(this.data.id, {\n          noView: hidden,\n          noPrint: display === 1 || display === 2\n        });\n      },\n      print: event => {\n        this.annotationStorage.setValue(this.data.id, {\n          noPrint: !event.detail.print\n        });\n      },\n      hidden: event => {\n        const {\n          hidden\n        } = event.detail;\n        this.container.style.visibility = hidden ? \"hidden\" : \"visible\";\n        this.annotationStorage.setValue(this.data.id, {\n          noPrint: hidden,\n          noView: hidden\n        });\n      },\n      focus: event => {\n        setTimeout(() => event.target.focus({\n          preventScroll: false\n        }), 0);\n      },\n      userName: event => {\n        event.target.title = event.detail.userName;\n      },\n      readonly: event => {\n        event.target.disabled = event.detail.readonly;\n      },\n      required: event => {\n        this._setRequired(event.target, event.detail.required);\n      },\n      bgColor: event => {\n        setColor(\"bgColor\", \"backgroundColor\", event);\n      },\n      fillColor: event => {\n        setColor(\"fillColor\", \"backgroundColor\", event);\n      },\n      fgColor: event => {\n        setColor(\"fgColor\", \"color\", event);\n      },\n      textColor: event => {\n        setColor(\"textColor\", \"color\", event);\n      },\n      borderColor: event => {\n        setColor(\"borderColor\", \"borderColor\", event);\n      },\n      strokeColor: event => {\n        setColor(\"strokeColor\", \"borderColor\", event);\n      },\n      rotation: event => {\n        const angle = event.detail.rotation;\n        this.setRotation(angle);\n        this.annotationStorage.setValue(this.data.id, {\n          rotation: angle\n        });\n      }\n    });\n  }\n  _dispatchEventFromSandbox(actions, jsEvent) {\n    const commonActions = this._commonActions;\n    for (const name of Object.keys(jsEvent.detail)) {\n      const action = actions[name] || commonActions[name];\n      action?.(jsEvent);\n    }\n  }\n  _setDefaultPropertiesFromJS(element) {\n    if (!this.enableScripting) {\n      return;\n    }\n    const storedData = this.annotationStorage.getRawValue(this.data.id);\n    if (!storedData) {\n      return;\n    }\n    const commonActions = this._commonActions;\n    for (const [actionName, detail] of Object.entries(storedData)) {\n      const action = commonActions[actionName];\n      if (action) {\n        const eventProxy = {\n          detail: {\n            [actionName]: detail\n          },\n          target: element\n        };\n        action(eventProxy);\n        delete storedData[actionName];\n      }\n    }\n  }\n  _createQuadrilaterals() {\n    if (!this.container) {\n      return;\n    }\n    const {\n      quadPoints\n    } = this.data;\n    if (!quadPoints) {\n      return;\n    }\n    const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect.map(x => Math.fround(x));\n    if (quadPoints.length === 8) {\n      const [trX, trY, blX, blY] = quadPoints.subarray(2, 6);\n      if (rectTrX === trX && rectTrY === trY && rectBlX === blX && rectBlY === blY) {\n        return;\n      }\n    }\n    const {\n      style\n    } = this.container;\n    let svgBuffer;\n    if (this.#hasBorder) {\n      const {\n        borderColor,\n        borderWidth\n      } = style;\n      style.borderWidth = 0;\n      svgBuffer = [\"url('data:image/svg+xml;utf8,\", `<svg xmlns=\"http://www.w3.org/2000/svg\"`, ` preserveAspectRatio=\"none\" viewBox=\"0 0 1 1\">`, `<g fill=\"transparent\" stroke=\"${borderColor}\" stroke-width=\"${borderWidth}\">`];\n      this.container.classList.add(\"hasBorder\");\n    }\n    const width = rectTrX - rectBlX;\n    const height = rectTrY - rectBlY;\n    const {\n      svgFactory\n    } = this;\n    const svg = svgFactory.createElement(\"svg\");\n    svg.classList.add(\"quadrilateralsContainer\");\n    svg.setAttribute(\"width\", 0);\n    svg.setAttribute(\"height\", 0);\n    svg.role = \"none\";\n    const defs = svgFactory.createElement(\"defs\");\n    svg.append(defs);\n    const clipPath = svgFactory.createElement(\"clipPath\");\n    const id = `clippath_${this.data.id}`;\n    clipPath.setAttribute(\"id\", id);\n    clipPath.setAttribute(\"clipPathUnits\", \"objectBoundingBox\");\n    defs.append(clipPath);\n    for (let i = 2, ii = quadPoints.length; i < ii; i += 8) {\n      const trX = quadPoints[i];\n      const trY = quadPoints[i + 1];\n      const blX = quadPoints[i + 2];\n      const blY = quadPoints[i + 3];\n      const rect = svgFactory.createElement(\"rect\");\n      const x = (blX - rectBlX) / width;\n      const y = (rectTrY - trY) / height;\n      const rectWidth = (trX - blX) / width;\n      const rectHeight = (trY - blY) / height;\n      rect.setAttribute(\"x\", x);\n      rect.setAttribute(\"y\", y);\n      rect.setAttribute(\"width\", rectWidth);\n      rect.setAttribute(\"height\", rectHeight);\n      clipPath.append(rect);\n      svgBuffer?.push(`<rect vector-effect=\"non-scaling-stroke\" x=\"${x}\" y=\"${y}\" width=\"${rectWidth}\" height=\"${rectHeight}\"/>`);\n    }\n    if (this.#hasBorder) {\n      svgBuffer.push(`</g></svg>')`);\n      style.backgroundImage = svgBuffer.join(\"\");\n    }\n    this.container.append(svg);\n    this.container.style.clipPath = `url(#${id})`;\n  }\n  _createPopup(popupData = null) {\n    const {\n      data\n    } = this;\n    let contentsObj, modificationDate;\n    if (popupData) {\n      contentsObj = {\n        str: popupData.text\n      };\n      modificationDate = popupData.date;\n    } else {\n      contentsObj = data.contentsObj;\n      modificationDate = data.modificationDate;\n    }\n    this.#popupElement = new PopupAnnotationElement({\n      data: {\n        color: data.color,\n        titleObj: data.titleObj,\n        modificationDate,\n        contentsObj,\n        richText: data.richText,\n        parentRect: data.rect,\n        borderStyle: 0,\n        id: `popup_${data.id}`,\n        rotation: data.rotation,\n        noRotate: true\n      },\n      linkService: this.linkService,\n      parent: this.parent,\n      elements: [this]\n    });\n  }\n  get hasPopupElement() {\n    return !!(this.#popupElement || this.popup || this.data.popupRef);\n  }\n  get extraPopupElement() {\n    return this.#popupElement;\n  }\n  render() {\n    unreachable(\"Abstract method `AnnotationElement.render` called\");\n  }\n  _getElementsByName(name, skipId = null) {\n    const fields = [];\n    if (this._fieldObjects) {\n      const fieldObj = this._fieldObjects[name];\n      if (fieldObj) {\n        for (const {\n          page,\n          id,\n          exportValues\n        } of fieldObj) {\n          if (page === -1) {\n            continue;\n          }\n          if (id === skipId) {\n            continue;\n          }\n          const exportValue = typeof exportValues === \"string\" ? exportValues : null;\n          const domElement = document.querySelector(`[data-element-id=\"${id}\"]`);\n          if (domElement && !GetElementsByNameSet.has(domElement)) {\n            warn(`_getElementsByName - element not allowed: ${id}`);\n            continue;\n          }\n          fields.push({\n            id,\n            exportValue,\n            domElement\n          });\n        }\n      }\n      return fields;\n    }\n    for (const domElement of document.getElementsByName(name)) {\n      const {\n        exportValue\n      } = domElement;\n      const id = domElement.getAttribute(\"data-element-id\");\n      if (id === skipId) {\n        continue;\n      }\n      if (!GetElementsByNameSet.has(domElement)) {\n        continue;\n      }\n      fields.push({\n        id,\n        exportValue,\n        domElement\n      });\n    }\n    return fields;\n  }\n  show() {\n    if (this.container) {\n      this.container.hidden = false;\n    }\n    this.popup?.maybeShow();\n  }\n  hide() {\n    if (this.container) {\n      this.container.hidden = true;\n    }\n    this.popup?.forceHide();\n  }\n  getElementsToTriggerPopup() {\n    return this.container;\n  }\n  addHighlightArea() {\n    const triggers = this.getElementsToTriggerPopup();\n    if (Array.isArray(triggers)) {\n      for (const element of triggers) {\n        element.classList.add(\"highlightArea\");\n      }\n    } else {\n      triggers.classList.add(\"highlightArea\");\n    }\n  }\n  _editOnDoubleClick() {\n    if (!this._isEditable) {\n      return;\n    }\n    const {\n      annotationEditorType: mode,\n      data: {\n        id: editId\n      }\n    } = this;\n    this.container.addEventListener(\"dblclick\", () => {\n      this.linkService.eventBus?.dispatch(\"switchannotationeditormode\", {\n        source: this,\n        mode,\n        editId,\n        mustEnterInEditMode: true\n      });\n    });\n  }\n  get width() {\n    return this.data.rect[2] - this.data.rect[0];\n  }\n  get height() {\n    return this.data.rect[3] - this.data.rect[1];\n  }\n}\nclass EditorAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true\n    });\n    this.editor = parameters.editor;\n  }\n  render() {\n    this.container.className = \"editorAnnotation\";\n    return this.container;\n  }\n  createOrUpdatePopup() {\n    const {\n      editor\n    } = this;\n    if (!editor.hasComment) {\n      return;\n    }\n    this._createPopup(editor.comment);\n  }\n  get hasCommentButton() {\n    return this.enableComment && this.editor.hasComment;\n  }\n  get commentButtonPosition() {\n    return this.editor.commentButtonPositionInPage;\n  }\n  get commentText() {\n    return this.editor.comment.text;\n  }\n  set commentText(text) {\n    this.editor.comment = text;\n    if (!text) {\n      this.removePopup();\n    }\n  }\n  get commentData() {\n    return this.editor.getData();\n  }\n  remove() {\n    this.parent.removeAnnotation(this.data.id);\n    this.container.remove();\n    this.container = null;\n    this.removePopup();\n  }\n}\nclass LinkAnnotationElement extends AnnotationElement {\n  constructor(parameters, options = null) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: !!options?.ignoreBorder,\n      createQuadrilaterals: true\n    });\n    this.isTooltipOnly = parameters.data.isTooltipOnly;\n  }\n  render() {\n    const {\n      data,\n      linkService\n    } = this;\n    const link = document.createElement(\"a\");\n    link.setAttribute(\"data-element-id\", data.id);\n    let isBound = false;\n    if (data.url) {\n      linkService.addLinkAttributes(link, data.url, data.newWindow);\n      isBound = true;\n    } else if (data.action) {\n      this._bindNamedAction(link, data.action, data.overlaidText);\n      isBound = true;\n    } else if (data.attachment) {\n      this.#bindAttachment(link, data.attachment, data.overlaidText, data.attachmentDest);\n      isBound = true;\n    } else if (data.setOCGState) {\n      this.#bindSetOCGState(link, data.setOCGState, data.overlaidText);\n      isBound = true;\n    } else if (data.dest) {\n      this._bindLink(link, data.dest, data.overlaidText);\n      isBound = true;\n    } else {\n      if (data.actions && (data.actions.Action || data.actions[\"Mouse Up\"] || data.actions[\"Mouse Down\"]) && this.enableScripting && this.hasJSActions) {\n        this._bindJSAction(link, data);\n        isBound = true;\n      }\n      if (data.resetForm) {\n        this._bindResetFormAction(link, data.resetForm);\n        isBound = true;\n      } else if (this.isTooltipOnly && !isBound) {\n        this._bindLink(link, \"\");\n        isBound = true;\n      }\n    }\n    this.container.classList.add(\"linkAnnotation\");\n    if (isBound) {\n      this.contentElement = link;\n      this.container.append(link);\n    }\n    return this.container;\n  }\n  #setInternalLink() {\n    this.container.setAttribute(\"data-internal-link\", \"\");\n  }\n  _bindLink(link, destination, overlaidText = \"\") {\n    link.href = this.linkService.getDestinationHash(destination);\n    link.onclick = () => {\n      if (destination) {\n        this.linkService.goToDestination(destination);\n      }\n      return false;\n    };\n    if (destination || destination === \"\") {\n      this.#setInternalLink();\n    }\n    if (overlaidText) {\n      link.title = overlaidText;\n    }\n  }\n  _bindNamedAction(link, action, overlaidText = \"\") {\n    link.href = this.linkService.getAnchorUrl(\"\");\n    link.onclick = () => {\n      this.linkService.executeNamedAction(action);\n      return false;\n    };\n    if (overlaidText) {\n      link.title = overlaidText;\n    }\n    this.#setInternalLink();\n  }\n  #bindAttachment(link, attachment, overlaidText = \"\", dest = null) {\n    link.href = this.linkService.getAnchorUrl(\"\");\n    if (attachment.description) {\n      link.title = attachment.description;\n    } else if (overlaidText) {\n      link.title = overlaidText;\n    }\n    link.onclick = () => {\n      this.downloadManager?.openOrDownloadData(attachment.content, attachment.filename, dest);\n      return false;\n    };\n    this.#setInternalLink();\n  }\n  #bindSetOCGState(link, action, overlaidText = \"\") {\n    link.href = this.linkService.getAnchorUrl(\"\");\n    link.onclick = () => {\n      this.linkService.executeSetOCGState(action);\n      return false;\n    };\n    if (overlaidText) {\n      link.title = overlaidText;\n    }\n    this.#setInternalLink();\n  }\n  _bindJSAction(link, data) {\n    link.href = this.linkService.getAnchorUrl(\"\");\n    const map = new Map([[\"Action\", \"onclick\"], [\"Mouse Up\", \"onmouseup\"], [\"Mouse Down\", \"onmousedown\"]]);\n    for (const name of Object.keys(data.actions)) {\n      const jsName = map.get(name);\n      if (!jsName) {\n        continue;\n      }\n      link[jsName] = () => {\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id: data.id,\n            name\n          }\n        });\n        return false;\n      };\n    }\n    if (data.overlaidText) {\n      link.title = data.overlaidText;\n    }\n    if (!link.onclick) {\n      link.onclick = () => false;\n    }\n    this.#setInternalLink();\n  }\n  _bindResetFormAction(link, resetForm) {\n    const otherClickAction = link.onclick;\n    if (!otherClickAction) {\n      link.href = this.linkService.getAnchorUrl(\"\");\n    }\n    this.#setInternalLink();\n    if (!this._fieldObjects) {\n      warn(`_bindResetFormAction - \"resetForm\" action not supported, ` + \"ensure that the `fieldObjects` parameter is provided.\");\n      if (!otherClickAction) {\n        link.onclick = () => false;\n      }\n      return;\n    }\n    link.onclick = () => {\n      otherClickAction?.();\n      const {\n        fields: resetFormFields,\n        refs: resetFormRefs,\n        include\n      } = resetForm;\n      const allFields = [];\n      if (resetFormFields.length !== 0 || resetFormRefs.length !== 0) {\n        const fieldIds = new Set(resetFormRefs);\n        for (const fieldName of resetFormFields) {\n          const fields = this._fieldObjects[fieldName] || [];\n          for (const {\n            id\n          } of fields) {\n            fieldIds.add(id);\n          }\n        }\n        for (const fields of Object.values(this._fieldObjects)) {\n          for (const field of fields) {\n            if (fieldIds.has(field.id) === include) {\n              allFields.push(field);\n            }\n          }\n        }\n      } else {\n        for (const fields of Object.values(this._fieldObjects)) {\n          allFields.push(...fields);\n        }\n      }\n      const storage = this.annotationStorage;\n      const allIds = [];\n      for (const field of allFields) {\n        const {\n          id\n        } = field;\n        allIds.push(id);\n        switch (field.type) {\n          case \"text\":\n            {\n              const value = field.defaultValue || \"\";\n              storage.setValue(id, {\n                value\n              });\n              break;\n            }\n          case \"checkbox\":\n          case \"radiobutton\":\n            {\n              const value = field.defaultValue === field.exportValues;\n              storage.setValue(id, {\n                value\n              });\n              break;\n            }\n          case \"combobox\":\n          case \"listbox\":\n            {\n              const value = field.defaultValue || \"\";\n              storage.setValue(id, {\n                value\n              });\n              break;\n            }\n          default:\n            continue;\n        }\n        const domElement = document.querySelector(`[data-element-id=\"${id}\"]`);\n        if (!domElement) {\n          continue;\n        } else if (!GetElementsByNameSet.has(domElement)) {\n          warn(`_bindResetFormAction - element not allowed: ${id}`);\n          continue;\n        }\n        domElement.dispatchEvent(new Event(\"resetform\"));\n      }\n      if (this.enableScripting) {\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id: \"app\",\n            ids: allIds,\n            name: \"ResetForm\"\n          }\n        });\n      }\n      return false;\n    };\n  }\n}\nclass TextAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true\n    });\n  }\n  render() {\n    this.container.classList.add(\"textAnnotation\");\n    const image = document.createElement(\"img\");\n    image.src = this.imageResourcesPath + \"annotation-\" + this.data.name.toLowerCase() + \".svg\";\n    image.setAttribute(\"data-l10n-id\", \"pdfjs-text-annotation-type\");\n    image.setAttribute(\"data-l10n-args\", JSON.stringify({\n      type: this.data.name\n    }));\n    if (!this.data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n    this.container.append(image);\n    return this.container;\n  }\n}\nclass WidgetAnnotationElement extends AnnotationElement {\n  render() {\n    return this.container;\n  }\n  showElementAndHideCanvas(element) {\n    if (this.data.hasOwnCanvas) {\n      if (element.previousSibling?.nodeName === \"CANVAS\") {\n        element.previousSibling.hidden = true;\n      }\n      element.hidden = false;\n    }\n  }\n  _getKeyModifier(event) {\n    return FeatureTest.platform.isMac ? event.metaKey : event.ctrlKey;\n  }\n  _setEventListener(element, elementData, baseName, eventName, valueGetter) {\n    if (baseName.includes(\"mouse\")) {\n      element.addEventListener(baseName, event => {\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id: this.data.id,\n            name: eventName,\n            value: valueGetter(event),\n            shift: event.shiftKey,\n            modifier: this._getKeyModifier(event)\n          }\n        });\n      });\n    } else {\n      element.addEventListener(baseName, event => {\n        if (baseName === \"blur\") {\n          if (!elementData.focused || !event.relatedTarget) {\n            return;\n          }\n          elementData.focused = false;\n        } else if (baseName === \"focus\") {\n          if (elementData.focused) {\n            return;\n          }\n          elementData.focused = true;\n        }\n        if (!valueGetter) {\n          return;\n        }\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id: this.data.id,\n            name: eventName,\n            value: valueGetter(event)\n          }\n        });\n      });\n    }\n  }\n  _setEventListeners(element, elementData, names, getter) {\n    for (const [baseName, eventName] of names) {\n      if (eventName === \"Action\" || this.data.actions?.[eventName]) {\n        if (eventName === \"Focus\" || eventName === \"Blur\") {\n          elementData ||= {\n            focused: false\n          };\n        }\n        this._setEventListener(element, elementData, baseName, eventName, getter);\n        if (eventName === \"Focus\" && !this.data.actions?.Blur) {\n          this._setEventListener(element, elementData, \"blur\", \"Blur\", null);\n        } else if (eventName === \"Blur\" && !this.data.actions?.Focus) {\n          this._setEventListener(element, elementData, \"focus\", \"Focus\", null);\n        }\n      }\n    }\n  }\n  _setBackgroundColor(element) {\n    const color = this.data.backgroundColor || null;\n    element.style.backgroundColor = color === null ? \"transparent\" : Util.makeHexColor(...color);\n  }\n  _setTextStyle(element) {\n    const TEXT_ALIGNMENT = [\"left\", \"center\", \"right\"];\n    const {\n      fontColor\n    } = this.data.defaultAppearanceData;\n    const fontSize = this.data.defaultAppearanceData.fontSize || annotation_layer_DEFAULT_FONT_SIZE;\n    const style = element.style;\n    let computedFontSize;\n    const BORDER_SIZE = 2;\n    const roundToOneDecimal = x => Math.round(10 * x) / 10;\n    if (this.data.multiLine) {\n      const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE);\n      const numberOfLines = Math.round(height / (LINE_FACTOR * fontSize)) || 1;\n      const lineHeight = height / numberOfLines;\n      computedFontSize = Math.min(fontSize, roundToOneDecimal(lineHeight / LINE_FACTOR));\n    } else {\n      const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE);\n      computedFontSize = Math.min(fontSize, roundToOneDecimal(height / LINE_FACTOR));\n    }\n    style.fontSize = `calc(${computedFontSize}px * var(--total-scale-factor))`;\n    style.color = Util.makeHexColor(...fontColor);\n    if (this.data.textAlignment !== null) {\n      style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment];\n    }\n  }\n  _setRequired(element, isRequired) {\n    if (isRequired) {\n      element.setAttribute(\"required\", true);\n    } else {\n      element.removeAttribute(\"required\");\n    }\n    element.setAttribute(\"aria-required\", isRequired);\n  }\n}\nclass TextWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    const isRenderable = parameters.renderForms || parameters.data.hasOwnCanvas || !parameters.data.hasAppearance && !!parameters.data.fieldValue;\n    super(parameters, {\n      isRenderable\n    });\n  }\n  setPropertyOnSiblings(base, key, value, keyInStorage) {\n    const storage = this.annotationStorage;\n    for (const element of this._getElementsByName(base.name, base.id)) {\n      if (element.domElement) {\n        element.domElement[key] = value;\n      }\n      storage.setValue(element.id, {\n        [keyInStorage]: value\n      });\n    }\n  }\n  render() {\n    const storage = this.annotationStorage;\n    const id = this.data.id;\n    this.container.classList.add(\"textWidgetAnnotation\");\n    let element = null;\n    if (this.renderForms) {\n      const storedData = storage.getValue(id, {\n        value: this.data.fieldValue\n      });\n      let textContent = storedData.value || \"\";\n      const maxLen = storage.getValue(id, {\n        charLimit: this.data.maxLen\n      }).charLimit;\n      if (maxLen && textContent.length > maxLen) {\n        textContent = textContent.slice(0, maxLen);\n      }\n      let fieldFormattedValues = storedData.formattedValue || this.data.textContent?.join(\"\\n\") || null;\n      if (fieldFormattedValues && this.data.comb) {\n        fieldFormattedValues = fieldFormattedValues.replaceAll(/\\s+/g, \"\");\n      }\n      const elementData = {\n        userValue: textContent,\n        formattedValue: fieldFormattedValues,\n        lastCommittedValue: null,\n        commitKey: 1,\n        focused: false\n      };\n      if (this.data.multiLine) {\n        element = document.createElement(\"textarea\");\n        element.textContent = fieldFormattedValues ?? textContent;\n        if (this.data.doNotScroll) {\n          element.style.overflowY = \"hidden\";\n        }\n      } else {\n        element = document.createElement(\"input\");\n        element.type = this.data.password ? \"password\" : \"text\";\n        element.setAttribute(\"value\", fieldFormattedValues ?? textContent);\n        if (this.data.doNotScroll) {\n          element.style.overflowX = \"hidden\";\n        }\n      }\n      if (this.data.hasOwnCanvas) {\n        element.hidden = true;\n      }\n      GetElementsByNameSet.add(element);\n      this.contentElement = element;\n      element.setAttribute(\"data-element-id\", id);\n      element.disabled = this.data.readOnly;\n      element.name = this.data.fieldName;\n      element.tabIndex = 0;\n      const {\n        datetimeFormat,\n        datetimeType,\n        timeStep\n      } = this.data;\n      const hasDateOrTime = !!datetimeType && this.enableScripting;\n      if (datetimeFormat) {\n        element.title = datetimeFormat;\n      }\n      this._setRequired(element, this.data.required);\n      if (maxLen) {\n        element.maxLength = maxLen;\n      }\n      element.addEventListener(\"input\", event => {\n        storage.setValue(id, {\n          value: event.target.value\n        });\n        this.setPropertyOnSiblings(element, \"value\", event.target.value, \"value\");\n        elementData.formattedValue = null;\n      });\n      element.addEventListener(\"resetform\", event => {\n        const defaultValue = this.data.defaultFieldValue ?? \"\";\n        element.value = elementData.userValue = defaultValue;\n        elementData.formattedValue = null;\n      });\n      let blurListener = event => {\n        const {\n          formattedValue\n        } = elementData;\n        if (formattedValue !== null && formattedValue !== undefined) {\n          event.target.value = formattedValue;\n        }\n        event.target.scrollLeft = 0;\n      };\n      if (this.enableScripting && this.hasJSActions) {\n        element.addEventListener(\"focus\", event => {\n          if (elementData.focused) {\n            return;\n          }\n          const {\n            target\n          } = event;\n          if (hasDateOrTime) {\n            target.type = datetimeType;\n            if (timeStep) {\n              target.step = timeStep;\n            }\n          }\n          if (elementData.userValue) {\n            const value = elementData.userValue;\n            if (hasDateOrTime) {\n              if (datetimeType === \"time\") {\n                const date = new Date(value);\n                const parts = [date.getHours(), date.getMinutes(), date.getSeconds()];\n                target.value = parts.map(v => v.toString().padStart(2, \"0\")).join(\":\");\n              } else {\n                target.value = new Date(value - TIMEZONE_OFFSET).toISOString().split(datetimeType === \"date\" ? \"T\" : \".\", 1)[0];\n              }\n            } else {\n              target.value = value;\n            }\n          }\n          elementData.lastCommittedValue = target.value;\n          elementData.commitKey = 1;\n          if (!this.data.actions?.Focus) {\n            elementData.focused = true;\n          }\n        });\n        element.addEventListener(\"updatefromsandbox\", jsEvent => {\n          this.showElementAndHideCanvas(jsEvent.target);\n          const actions = {\n            value(event) {\n              elementData.userValue = event.detail.value ?? \"\";\n              if (!hasDateOrTime) {\n                storage.setValue(id, {\n                  value: elementData.userValue.toString()\n                });\n              }\n              event.target.value = elementData.userValue;\n            },\n            formattedValue(event) {\n              const {\n                formattedValue\n              } = event.detail;\n              elementData.formattedValue = formattedValue;\n              if (formattedValue !== null && formattedValue !== undefined && event.target !== document.activeElement) {\n                event.target.value = formattedValue;\n              }\n              const data = {\n                formattedValue\n              };\n              if (hasDateOrTime) {\n                data.value = formattedValue;\n              }\n              storage.setValue(id, data);\n            },\n            selRange(event) {\n              event.target.setSelectionRange(...event.detail.selRange);\n            },\n            charLimit: event => {\n              const {\n                charLimit\n              } = event.detail;\n              const {\n                target\n              } = event;\n              if (charLimit === 0) {\n                target.removeAttribute(\"maxLength\");\n                return;\n              }\n              target.setAttribute(\"maxLength\", charLimit);\n              let value = elementData.userValue;\n              if (!value || value.length <= charLimit) {\n                return;\n              }\n              value = value.slice(0, charLimit);\n              target.value = elementData.userValue = value;\n              storage.setValue(id, {\n                value\n              });\n              this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n                source: this,\n                detail: {\n                  id,\n                  name: \"Keystroke\",\n                  value,\n                  willCommit: true,\n                  commitKey: 1,\n                  selStart: target.selectionStart,\n                  selEnd: target.selectionEnd\n                }\n              });\n            }\n          };\n          this._dispatchEventFromSandbox(actions, jsEvent);\n        });\n        element.addEventListener(\"keydown\", event => {\n          elementData.commitKey = 1;\n          let commitKey = -1;\n          if (event.key === \"Escape\") {\n            commitKey = 0;\n          } else if (event.key === \"Enter\" && !this.data.multiLine) {\n            commitKey = 2;\n          } else if (event.key === \"Tab\") {\n            elementData.commitKey = 3;\n          }\n          if (commitKey === -1) {\n            return;\n          }\n          const {\n            value\n          } = event.target;\n          if (elementData.lastCommittedValue === value) {\n            return;\n          }\n          elementData.lastCommittedValue = value;\n          elementData.userValue = value;\n          this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n            source: this,\n            detail: {\n              id,\n              name: \"Keystroke\",\n              value,\n              willCommit: true,\n              commitKey,\n              selStart: event.target.selectionStart,\n              selEnd: event.target.selectionEnd\n            }\n          });\n        });\n        const _blurListener = blurListener;\n        blurListener = null;\n        element.addEventListener(\"blur\", event => {\n          if (!elementData.focused || !event.relatedTarget) {\n            return;\n          }\n          if (!this.data.actions?.Blur) {\n            elementData.focused = false;\n          }\n          const {\n            target\n          } = event;\n          let {\n            value\n          } = target;\n          if (hasDateOrTime) {\n            if (value && datetimeType === \"time\") {\n              const parts = value.split(\":\").map(v => parseInt(v, 10));\n              value = new Date(2000, 0, 1, parts[0], parts[1], parts[2] || 0).valueOf();\n              target.step = \"\";\n            } else {\n              if (!value.includes(\"T\")) {\n                value = `${value}T00:00`;\n              }\n              value = new Date(value).valueOf();\n            }\n            target.type = \"text\";\n          }\n          elementData.userValue = value;\n          if (elementData.lastCommittedValue !== value) {\n            this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n              source: this,\n              detail: {\n                id,\n                name: \"Keystroke\",\n                value,\n                willCommit: true,\n                commitKey: elementData.commitKey,\n                selStart: event.target.selectionStart,\n                selEnd: event.target.selectionEnd\n              }\n            });\n          }\n          _blurListener(event);\n        });\n        if (this.data.actions?.Keystroke) {\n          element.addEventListener(\"beforeinput\", event => {\n            elementData.lastCommittedValue = null;\n            const {\n              data,\n              target\n            } = event;\n            const {\n              value,\n              selectionStart,\n              selectionEnd\n            } = target;\n            let selStart = selectionStart,\n              selEnd = selectionEnd;\n            switch (event.inputType) {\n              case \"deleteWordBackward\":\n                {\n                  const match = value.substring(0, selectionStart).match(/\\w*[^\\w]*$/);\n                  if (match) {\n                    selStart -= match[0].length;\n                  }\n                  break;\n                }\n              case \"deleteWordForward\":\n                {\n                  const match = value.substring(selectionStart).match(/^[^\\w]*\\w*/);\n                  if (match) {\n                    selEnd += match[0].length;\n                  }\n                  break;\n                }\n              case \"deleteContentBackward\":\n                if (selectionStart === selectionEnd) {\n                  selStart -= 1;\n                }\n                break;\n              case \"deleteContentForward\":\n                if (selectionStart === selectionEnd) {\n                  selEnd += 1;\n                }\n                break;\n            }\n            event.preventDefault();\n            this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n              source: this,\n              detail: {\n                id,\n                name: \"Keystroke\",\n                value,\n                change: data || \"\",\n                willCommit: false,\n                selStart,\n                selEnd\n              }\n            });\n          });\n        }\n        this._setEventListeners(element, elementData, [[\"focus\", \"Focus\"], [\"blur\", \"Blur\"], [\"mousedown\", \"Mouse Down\"], [\"mouseenter\", \"Mouse Enter\"], [\"mouseleave\", \"Mouse Exit\"], [\"mouseup\", \"Mouse Up\"]], event => event.target.value);\n      }\n      if (blurListener) {\n        element.addEventListener(\"blur\", blurListener);\n      }\n      if (this.data.comb) {\n        const fieldWidth = this.data.rect[2] - this.data.rect[0];\n        const combWidth = fieldWidth / maxLen;\n        element.classList.add(\"comb\");\n        element.style.letterSpacing = `calc(${combWidth}px * var(--total-scale-factor) - 1ch)`;\n      }\n    } else {\n      element = document.createElement(\"div\");\n      element.textContent = this.data.fieldValue;\n      element.style.verticalAlign = \"middle\";\n      element.style.display = \"table-cell\";\n      if (this.data.hasOwnCanvas) {\n        element.hidden = true;\n      }\n    }\n    this._setTextStyle(element);\n    this._setBackgroundColor(element);\n    this._setDefaultPropertiesFromJS(element);\n    this.container.append(element);\n    return this.container;\n  }\n}\nclass SignatureWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: !!parameters.data.hasOwnCanvas\n    });\n  }\n}\nclass CheckboxWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: parameters.renderForms\n    });\n  }\n  render() {\n    const storage = this.annotationStorage;\n    const data = this.data;\n    const id = data.id;\n    let value = storage.getValue(id, {\n      value: data.exportValue === data.fieldValue\n    }).value;\n    if (typeof value === \"string\") {\n      value = value !== \"Off\";\n      storage.setValue(id, {\n        value\n      });\n    }\n    this.container.classList.add(\"buttonWidgetAnnotation\", \"checkBox\");\n    const element = document.createElement(\"input\");\n    GetElementsByNameSet.add(element);\n    element.setAttribute(\"data-element-id\", id);\n    element.disabled = data.readOnly;\n    this._setRequired(element, this.data.required);\n    element.type = \"checkbox\";\n    element.name = data.fieldName;\n    if (value) {\n      element.setAttribute(\"checked\", true);\n    }\n    element.setAttribute(\"exportValue\", data.exportValue);\n    element.tabIndex = 0;\n    element.addEventListener(\"change\", event => {\n      const {\n        name,\n        checked\n      } = event.target;\n      for (const checkbox of this._getElementsByName(name, id)) {\n        const curChecked = checked && checkbox.exportValue === data.exportValue;\n        if (checkbox.domElement) {\n          checkbox.domElement.checked = curChecked;\n        }\n        storage.setValue(checkbox.id, {\n          value: curChecked\n        });\n      }\n      storage.setValue(id, {\n        value: checked\n      });\n    });\n    element.addEventListener(\"resetform\", event => {\n      const defaultValue = data.defaultFieldValue || \"Off\";\n      event.target.checked = defaultValue === data.exportValue;\n    });\n    if (this.enableScripting && this.hasJSActions) {\n      element.addEventListener(\"updatefromsandbox\", jsEvent => {\n        const actions = {\n          value(event) {\n            event.target.checked = event.detail.value !== \"Off\";\n            storage.setValue(id, {\n              value: event.target.checked\n            });\n          }\n        };\n        this._dispatchEventFromSandbox(actions, jsEvent);\n      });\n      this._setEventListeners(element, null, [[\"change\", \"Validate\"], [\"change\", \"Action\"], [\"focus\", \"Focus\"], [\"blur\", \"Blur\"], [\"mousedown\", \"Mouse Down\"], [\"mouseenter\", \"Mouse Enter\"], [\"mouseleave\", \"Mouse Exit\"], [\"mouseup\", \"Mouse Up\"]], event => event.target.checked);\n    }\n    this._setBackgroundColor(element);\n    this._setDefaultPropertiesFromJS(element);\n    this.container.append(element);\n    return this.container;\n  }\n}\nclass RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: parameters.renderForms\n    });\n  }\n  render() {\n    this.container.classList.add(\"buttonWidgetAnnotation\", \"radioButton\");\n    const storage = this.annotationStorage;\n    const data = this.data;\n    const id = data.id;\n    let value = storage.getValue(id, {\n      value: data.fieldValue === data.buttonValue\n    }).value;\n    if (typeof value === \"string\") {\n      value = value !== data.buttonValue;\n      storage.setValue(id, {\n        value\n      });\n    }\n    if (value) {\n      for (const radio of this._getElementsByName(data.fieldName, id)) {\n        storage.setValue(radio.id, {\n          value: false\n        });\n      }\n    }\n    const element = document.createElement(\"input\");\n    GetElementsByNameSet.add(element);\n    element.setAttribute(\"data-element-id\", id);\n    element.disabled = data.readOnly;\n    this._setRequired(element, this.data.required);\n    element.type = \"radio\";\n    element.name = data.fieldName;\n    if (value) {\n      element.setAttribute(\"checked\", true);\n    }\n    element.tabIndex = 0;\n    element.addEventListener(\"change\", event => {\n      const {\n        name,\n        checked\n      } = event.target;\n      for (const radio of this._getElementsByName(name, id)) {\n        storage.setValue(radio.id, {\n          value: false\n        });\n      }\n      storage.setValue(id, {\n        value: checked\n      });\n    });\n    element.addEventListener(\"resetform\", event => {\n      const defaultValue = data.defaultFieldValue;\n      event.target.checked = defaultValue !== null && defaultValue !== undefined && defaultValue === data.buttonValue;\n    });\n    if (this.enableScripting && this.hasJSActions) {\n      const pdfButtonValue = data.buttonValue;\n      element.addEventListener(\"updatefromsandbox\", jsEvent => {\n        const actions = {\n          value: event => {\n            const checked = pdfButtonValue === event.detail.value;\n            for (const radio of this._getElementsByName(event.target.name)) {\n              const curChecked = checked && radio.id === id;\n              if (radio.domElement) {\n                radio.domElement.checked = curChecked;\n              }\n              storage.setValue(radio.id, {\n                value: curChecked\n              });\n            }\n          }\n        };\n        this._dispatchEventFromSandbox(actions, jsEvent);\n      });\n      this._setEventListeners(element, null, [[\"change\", \"Validate\"], [\"change\", \"Action\"], [\"focus\", \"Focus\"], [\"blur\", \"Blur\"], [\"mousedown\", \"Mouse Down\"], [\"mouseenter\", \"Mouse Enter\"], [\"mouseleave\", \"Mouse Exit\"], [\"mouseup\", \"Mouse Up\"]], event => event.target.checked);\n    }\n    this._setBackgroundColor(element);\n    this._setDefaultPropertiesFromJS(element);\n    this.container.append(element);\n    return this.container;\n  }\n}\nclass PushButtonWidgetAnnotationElement extends LinkAnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      ignoreBorder: parameters.data.hasAppearance\n    });\n  }\n  render() {\n    const container = super.render();\n    container.classList.add(\"buttonWidgetAnnotation\", \"pushButton\");\n    const linkElement = container.lastChild;\n    if (this.enableScripting && this.hasJSActions && linkElement) {\n      this._setDefaultPropertiesFromJS(linkElement);\n      linkElement.addEventListener(\"updatefromsandbox\", jsEvent => {\n        this._dispatchEventFromSandbox({}, jsEvent);\n      });\n    }\n    return container;\n  }\n}\nclass ChoiceWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: parameters.renderForms\n    });\n  }\n  render() {\n    this.container.classList.add(\"choiceWidgetAnnotation\");\n    const storage = this.annotationStorage;\n    const id = this.data.id;\n    const storedData = storage.getValue(id, {\n      value: this.data.fieldValue\n    });\n    const selectElement = document.createElement(\"select\");\n    GetElementsByNameSet.add(selectElement);\n    selectElement.setAttribute(\"data-element-id\", id);\n    selectElement.disabled = this.data.readOnly;\n    this._setRequired(selectElement, this.data.required);\n    selectElement.name = this.data.fieldName;\n    selectElement.tabIndex = 0;\n    let addAnEmptyEntry = this.data.combo && this.data.options.length > 0;\n    if (!this.data.combo) {\n      selectElement.size = this.data.options.length;\n      if (this.data.multiSelect) {\n        selectElement.multiple = true;\n      }\n    }\n    selectElement.addEventListener(\"resetform\", event => {\n      const defaultValue = this.data.defaultFieldValue;\n      for (const option of selectElement.options) {\n        option.selected = option.value === defaultValue;\n      }\n    });\n    const fixDisplayValue = (option, value) => {\n      const newValue = value.replaceAll(\" \", \"\\u00A0\");\n      option.textContent = newValue;\n      if (newValue !== value) {\n        option.setAttribute(\"display-value\", value);\n      }\n    };\n    for (const option of this.data.options) {\n      const optionElement = document.createElement(\"option\");\n      fixDisplayValue(optionElement, option.displayValue);\n      optionElement.value = option.exportValue;\n      if (storedData.value.includes(option.exportValue)) {\n        optionElement.setAttribute(\"selected\", true);\n        addAnEmptyEntry = false;\n      }\n      selectElement.append(optionElement);\n    }\n    let removeEmptyEntry = null;\n    if (addAnEmptyEntry) {\n      const noneOptionElement = document.createElement(\"option\");\n      noneOptionElement.value = \" \";\n      noneOptionElement.setAttribute(\"hidden\", true);\n      noneOptionElement.setAttribute(\"selected\", true);\n      selectElement.prepend(noneOptionElement);\n      removeEmptyEntry = () => {\n        noneOptionElement.remove();\n        selectElement.removeEventListener(\"input\", removeEmptyEntry);\n        removeEmptyEntry = null;\n      };\n      selectElement.addEventListener(\"input\", removeEmptyEntry);\n    }\n    const getValue = isExport => {\n      const name = isExport ? \"value\" : \"textContent\";\n      const {\n        options,\n        multiple\n      } = selectElement;\n      if (!multiple) {\n        return options.selectedIndex === -1 ? null : options[options.selectedIndex][name];\n      }\n      return Array.prototype.filter.call(options, option => option.selected).map(option => option[name]);\n    };\n    let selectedValues = getValue(false);\n    const getItems = event => {\n      const options = event.target.options;\n      return Array.prototype.map.call(options, option => ({\n        displayValue: option.getAttribute(\"display-value\") || option.textContent,\n        exportValue: option.value\n      }));\n    };\n    if (this.enableScripting && this.hasJSActions) {\n      selectElement.addEventListener(\"updatefromsandbox\", jsEvent => {\n        const actions = {\n          value(event) {\n            removeEmptyEntry?.();\n            const value = event.detail.value;\n            const values = new Set(Array.isArray(value) ? value : [value]);\n            for (const option of selectElement.options) {\n              option.selected = values.has(option.value);\n            }\n            storage.setValue(id, {\n              value: getValue(true)\n            });\n            selectedValues = getValue(false);\n          },\n          multipleSelection(event) {\n            selectElement.multiple = true;\n          },\n          remove(event) {\n            const options = selectElement.options;\n            const index = event.detail.remove;\n            options[index].selected = false;\n            selectElement.remove(index);\n            if (options.length > 0) {\n              const i = Array.prototype.findIndex.call(options, option => option.selected);\n              if (i === -1) {\n                options[0].selected = true;\n              }\n            }\n            storage.setValue(id, {\n              value: getValue(true),\n              items: getItems(event)\n            });\n            selectedValues = getValue(false);\n          },\n          clear(event) {\n            while (selectElement.length !== 0) {\n              selectElement.remove(0);\n            }\n            storage.setValue(id, {\n              value: null,\n              items: []\n            });\n            selectedValues = getValue(false);\n          },\n          insert(event) {\n            const {\n              index,\n              displayValue,\n              exportValue\n            } = event.detail.insert;\n            const selectChild = selectElement.children[index];\n            const optionElement = document.createElement(\"option\");\n            fixDisplayValue(optionElement, displayValue);\n            optionElement.value = exportValue;\n            if (selectChild) {\n              selectChild.before(optionElement);\n            } else {\n              selectElement.append(optionElement);\n            }\n            storage.setValue(id, {\n              value: getValue(true),\n              items: getItems(event)\n            });\n            selectedValues = getValue(false);\n          },\n          items(event) {\n            const {\n              items\n            } = event.detail;\n            while (selectElement.length !== 0) {\n              selectElement.remove(0);\n            }\n            for (const item of items) {\n              const {\n                displayValue,\n                exportValue\n              } = item;\n              const optionElement = document.createElement(\"option\");\n              fixDisplayValue(optionElement, displayValue);\n              optionElement.value = exportValue;\n              selectElement.append(optionElement);\n            }\n            if (selectElement.options.length > 0) {\n              selectElement.options[0].selected = true;\n            }\n            storage.setValue(id, {\n              value: getValue(true),\n              items: getItems(event)\n            });\n            selectedValues = getValue(false);\n          },\n          indices(event) {\n            const indices = new Set(event.detail.indices);\n            for (const option of event.target.options) {\n              option.selected = indices.has(option.index);\n            }\n            storage.setValue(id, {\n              value: getValue(true)\n            });\n            selectedValues = getValue(false);\n          },\n          editable(event) {\n            event.target.disabled = !event.detail.editable;\n          }\n        };\n        this._dispatchEventFromSandbox(actions, jsEvent);\n      });\n      selectElement.addEventListener(\"input\", event => {\n        const exportValue = getValue(true);\n        const change = getValue(false);\n        storage.setValue(id, {\n          value: exportValue\n        });\n        event.preventDefault();\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id,\n            name: \"Keystroke\",\n            value: selectedValues,\n            change,\n            changeEx: exportValue,\n            willCommit: false,\n            commitKey: 1,\n            keyDown: false\n          }\n        });\n      });\n      this._setEventListeners(selectElement, null, [[\"focus\", \"Focus\"], [\"blur\", \"Blur\"], [\"mousedown\", \"Mouse Down\"], [\"mouseenter\", \"Mouse Enter\"], [\"mouseleave\", \"Mouse Exit\"], [\"mouseup\", \"Mouse Up\"], [\"input\", \"Action\"], [\"input\", \"Validate\"]], event => event.target.value);\n    } else {\n      selectElement.addEventListener(\"input\", function (event) {\n        storage.setValue(id, {\n          value: getValue(true)\n        });\n      });\n    }\n    if (this.data.combo) {\n      this._setTextStyle(selectElement);\n    } else {}\n    this._setBackgroundColor(selectElement);\n    this._setDefaultPropertiesFromJS(selectElement);\n    this.container.append(selectElement);\n    return this.container;\n  }\n}\nclass PopupAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const {\n      data,\n      elements,\n      parent\n    } = parameters;\n    const hasCommentManager = !!parent._commentManager;\n    super(parameters, {\n      isRenderable: !hasCommentManager && AnnotationElement._hasPopupData(data)\n    });\n    this.elements = elements;\n    if (hasCommentManager && AnnotationElement._hasPopupData(data)) {\n      const popup = this.popup = this.#createPopup();\n      for (const element of elements) {\n        element.popup = popup;\n      }\n    } else {\n      this.popup = null;\n    }\n  }\n  #createPopup() {\n    return new PopupElement({\n      container: this.container,\n      color: this.data.color,\n      titleObj: this.data.titleObj,\n      modificationDate: this.data.modificationDate || this.data.creationDate,\n      contentsObj: this.data.contentsObj,\n      richText: this.data.richText,\n      rect: this.data.rect,\n      parentRect: this.data.parentRect || null,\n      parent: this.parent,\n      elements: this.elements,\n      open: this.data.open,\n      commentManager: this.parent._commentManager\n    });\n  }\n  render() {\n    const {\n      container\n    } = this;\n    container.classList.add(\"popupAnnotation\");\n    container.role = \"comment\";\n    const popup = this.popup = this.#createPopup();\n    const elementIds = [];\n    for (const element of this.elements) {\n      element.popup = popup;\n      element.container.ariaHasPopup = \"dialog\";\n      elementIds.push(element.data.id);\n      element.addHighlightArea();\n    }\n    this.container.setAttribute(\"aria-controls\", elementIds.map(id => `${AnnotationPrefix}${id}`).join(\",\"));\n    return this.container;\n  }\n}\nclass PopupElement {\n  #commentManager = null;\n  #boundKeyDown = this.#keyDown.bind(this);\n  #boundHide = this.#hide.bind(this);\n  #boundShow = this.#show.bind(this);\n  #boundToggle = this.#toggle.bind(this);\n  #color = null;\n  #container = null;\n  #contentsObj = null;\n  #dateObj = null;\n  #elements = null;\n  #parent = null;\n  #parentRect = null;\n  #pinned = false;\n  #popup = null;\n  #popupAbortController = null;\n  #position = null;\n  #commentButton = null;\n  #commentButtonPosition = null;\n  #popupPosition = null;\n  #rect = null;\n  #richText = null;\n  #titleObj = null;\n  #updates = null;\n  #wasVisible = false;\n  #firstElement = null;\n  #commentText = null;\n  constructor({\n    container,\n    color,\n    elements,\n    titleObj,\n    modificationDate,\n    contentsObj,\n    richText,\n    parent,\n    rect,\n    parentRect,\n    open,\n    commentManager = null\n  }) {\n    this.#container = container;\n    this.#titleObj = titleObj;\n    this.#contentsObj = contentsObj;\n    this.#richText = richText;\n    this.#parent = parent;\n    this.#color = color;\n    this.#rect = rect;\n    this.#parentRect = parentRect;\n    this.#elements = elements;\n    this.#commentManager = commentManager;\n    this.#firstElement = elements[0];\n    this.#dateObj = PDFDateString.toDateObject(modificationDate);\n    this.trigger = elements.flatMap(e => e.getElementsToTriggerPopup());\n    if (!commentManager) {\n      this.#addEventListeners();\n      this.#container.hidden = true;\n      if (open) {\n        this.#toggle();\n      }\n    }\n  }\n  #addEventListeners() {\n    if (this.#popupAbortController) {\n      return;\n    }\n    this.#popupAbortController = new AbortController();\n    const {\n      signal\n    } = this.#popupAbortController;\n    for (const element of this.trigger) {\n      element.addEventListener(\"click\", this.#boundToggle, {\n        signal\n      });\n      element.addEventListener(\"pointerenter\", this.#boundShow, {\n        signal\n      });\n      element.addEventListener(\"pointerleave\", this.#boundHide, {\n        signal\n      });\n      element.classList.add(\"popupTriggerArea\");\n    }\n    for (const element of this.#elements) {\n      element.container?.addEventListener(\"keydown\", this.#boundKeyDown, {\n        signal\n      });\n    }\n  }\n  #setCommentButtonPosition() {\n    const element = this.#elements.find(e => e.hasCommentButton);\n    if (!element) {\n      return;\n    }\n    this.#commentButtonPosition = element._normalizePoint(element.commentButtonPosition);\n  }\n  renderCommentButton() {\n    if (this.#commentButton) {\n      if (!this.#commentButton.parentNode) {\n        this.#firstElement.container.after(this.#commentButton);\n      }\n      return;\n    }\n    if (!this.#commentButtonPosition) {\n      this.#setCommentButtonPosition();\n    }\n    if (!this.#commentButtonPosition) {\n      return;\n    }\n    const {\n      signal\n    } = this.#popupAbortController = new AbortController();\n    const hasOwnButton = this.#firstElement.hasOwnCommentButton;\n    const togglePopup = () => {\n      this.#commentManager.toggleCommentPopup(this, true, undefined, !hasOwnButton);\n    };\n    const showPopup = () => {\n      this.#commentManager.toggleCommentPopup(this, false, true, !hasOwnButton);\n    };\n    const hidePopup = () => {\n      this.#commentManager.toggleCommentPopup(this, false, false);\n    };\n    if (!hasOwnButton) {\n      const button = this.#commentButton = document.createElement(\"button\");\n      button.className = \"annotationCommentButton\";\n      const parentContainer = this.#firstElement.container;\n      button.style.zIndex = parseInt(parentContainer.style.zIndex, 10) + 1;\n      button.tabIndex = 0;\n      button.ariaHasPopup = \"dialog\";\n      button.ariaControls = \"commentPopup\";\n      button.setAttribute(\"data-l10n-id\", \"pdfjs-show-comment-button\");\n      this.#updateColor();\n      this.#updateCommentButtonPosition();\n      button.addEventListener(\"keydown\", this.#boundKeyDown, {\n        signal\n      });\n      button.addEventListener(\"click\", togglePopup, {\n        signal\n      });\n      button.addEventListener(\"pointerenter\", showPopup, {\n        signal\n      });\n      button.addEventListener(\"pointerleave\", hidePopup, {\n        signal\n      });\n      parentContainer.after(button);\n    } else {\n      this.#commentButton = this.#firstElement.container;\n      for (const element of this.trigger) {\n        element.ariaHasPopup = \"dialog\";\n        element.ariaControls = \"commentPopup\";\n        element.addEventListener(\"keydown\", this.#boundKeyDown, {\n          signal\n        });\n        element.addEventListener(\"click\", togglePopup, {\n          signal\n        });\n        element.addEventListener(\"pointerenter\", showPopup, {\n          signal\n        });\n        element.addEventListener(\"pointerleave\", hidePopup, {\n          signal\n        });\n        element.classList.add(\"popupTriggerArea\");\n      }\n    }\n  }\n  #updateCommentButtonPosition() {\n    if (this.#firstElement.extraPopupElement && !this.#firstElement.editor) {\n      return;\n    }\n    if (!this.#commentButton) {\n      this.renderCommentButton();\n    }\n    const [x, y] = this.#commentButtonPosition;\n    const {\n      style\n    } = this.#commentButton;\n    style.left = `calc(${x}%)`;\n    style.top = `calc(${y}% - var(--comment-button-dim))`;\n  }\n  #updateColor() {\n    if (this.#firstElement.extraPopupElement) {\n      return;\n    }\n    if (!this.#commentButton) {\n      this.renderCommentButton();\n    }\n    this.#commentButton.style.backgroundColor = this.commentButtonColor || \"\";\n  }\n  get commentButtonColor() {\n    const {\n      color,\n      opacity\n    } = this.#firstElement.commentData;\n    if (!color) {\n      return null;\n    }\n    return this.#parent._commentManager.makeCommentColor(color, opacity);\n  }\n  focusCommentButton() {\n    setTimeout(() => {\n      this.#commentButton?.focus();\n    }, 0);\n  }\n  getData() {\n    const {\n      richText,\n      color,\n      opacity,\n      creationDate,\n      modificationDate\n    } = this.#firstElement.commentData;\n    return {\n      contentsObj: {\n        str: this.comment\n      },\n      richText,\n      color,\n      opacity,\n      creationDate,\n      modificationDate\n    };\n  }\n  get elementBeforePopup() {\n    return this.#commentButton;\n  }\n  get comment() {\n    this.#commentText ||= this.#firstElement.commentText;\n    return this.#commentText;\n  }\n  set comment(text) {\n    if (text === this.comment) {\n      return;\n    }\n    this.#firstElement.commentText = this.#commentText = text;\n  }\n  focus() {\n    this.#firstElement.container?.focus();\n  }\n  get parentBoundingClientRect() {\n    return this.#firstElement.layer.getBoundingClientRect();\n  }\n  setCommentButtonStates({\n    selected,\n    hasPopup\n  }) {\n    if (!this.#commentButton) {\n      return;\n    }\n    this.#commentButton.classList.toggle(\"selected\", selected);\n    this.#commentButton.ariaExpanded = hasPopup;\n  }\n  setSelectedCommentButton(selected) {\n    this.#commentButton.classList.toggle(\"selected\", selected);\n  }\n  get commentPopupPosition() {\n    if (this.#popupPosition) {\n      return this.#popupPosition;\n    }\n    const {\n      x,\n      y,\n      height\n    } = this.#commentButton.getBoundingClientRect();\n    const {\n      x: parentX,\n      y: parentY,\n      width: parentWidth,\n      height: parentHeight\n    } = this.#firstElement.layer.getBoundingClientRect();\n    return [(x - parentX) / parentWidth, (y + height - parentY) / parentHeight];\n  }\n  set commentPopupPosition(pos) {\n    this.#popupPosition = pos;\n  }\n  hasDefaultPopupPosition() {\n    return this.#popupPosition === null;\n  }\n  get commentButtonPosition() {\n    return this.#commentButtonPosition;\n  }\n  get commentButtonWidth() {\n    return this.#commentButton.getBoundingClientRect().width / this.parentBoundingClientRect.width;\n  }\n  editComment(options) {\n    const [posX, posY] = this.#popupPosition || this.commentButtonPosition.map(x => x / 100);\n    const parentDimensions = this.parentBoundingClientRect;\n    const {\n      x: parentX,\n      y: parentY,\n      width: parentWidth,\n      height: parentHeight\n    } = parentDimensions;\n    this.#commentManager.showDialog(null, this, parentX + posX * parentWidth, parentY + posY * parentHeight, {\n      ...options,\n      parentDimensions\n    });\n  }\n  render() {\n    if (this.#popup) {\n      return;\n    }\n    const popup = this.#popup = document.createElement(\"div\");\n    popup.className = \"popup\";\n    if (this.#color) {\n      const baseColor = popup.style.outlineColor = Util.makeHexColor(...this.#color);\n      popup.style.backgroundColor = `color-mix(in srgb, ${baseColor} 30%, white)`;\n    }\n    const header = document.createElement(\"span\");\n    header.className = \"header\";\n    if (this.#titleObj?.str) {\n      const title = document.createElement(\"span\");\n      title.className = \"title\";\n      header.append(title);\n      ({\n        dir: title.dir,\n        str: title.textContent\n      } = this.#titleObj);\n    }\n    popup.append(header);\n    if (this.#dateObj) {\n      const modificationDate = document.createElement(\"time\");\n      modificationDate.className = \"popupDate\";\n      modificationDate.setAttribute(\"data-l10n-id\", \"pdfjs-annotation-date-time-string\");\n      modificationDate.setAttribute(\"data-l10n-args\", JSON.stringify({\n        dateObj: this.#dateObj.valueOf()\n      }));\n      modificationDate.dateTime = this.#dateObj.toISOString();\n      header.append(modificationDate);\n    }\n    renderRichText({\n      html: this.#html || this.#contentsObj.str,\n      dir: this.#contentsObj?.dir,\n      className: \"popupContent\"\n    }, popup);\n    this.#container.append(popup);\n  }\n  get #html() {\n    const richText = this.#richText;\n    const contentsObj = this.#contentsObj;\n    if (richText?.str && (!contentsObj?.str || contentsObj.str === richText.str)) {\n      return this.#richText.html || null;\n    }\n    return null;\n  }\n  get #fontSize() {\n    return this.#html?.attributes?.style?.fontSize || 0;\n  }\n  get #fontColor() {\n    return this.#html?.attributes?.style?.color || null;\n  }\n  #makePopupContent(text) {\n    const popupLines = [];\n    const popupContent = {\n      str: text,\n      html: {\n        name: \"div\",\n        attributes: {\n          dir: \"auto\"\n        },\n        children: [{\n          name: \"p\",\n          children: popupLines\n        }]\n      }\n    };\n    const lineAttributes = {\n      style: {\n        color: this.#fontColor,\n        fontSize: this.#fontSize ? `calc(${this.#fontSize}px * var(--total-scale-factor))` : \"\"\n      }\n    };\n    for (const line of text.split(\"\\n\")) {\n      popupLines.push({\n        name: \"span\",\n        value: line,\n        attributes: lineAttributes\n      });\n    }\n    return popupContent;\n  }\n  #keyDown(event) {\n    if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) {\n      return;\n    }\n    if (event.key === \"Enter\" || event.key === \"Escape\" && this.#pinned) {\n      this.#toggle();\n    }\n  }\n  updateEdited({\n    rect,\n    popup,\n    deleted\n  }) {\n    if (this.#commentManager) {\n      if (deleted) {\n        this.remove();\n        this.#commentText = null;\n      } else if (popup) {\n        if (popup.deleted) {\n          this.remove();\n        } else {\n          this.#updateColor();\n          this.#commentText = popup.text;\n        }\n      }\n      if (rect) {\n        this.#commentButtonPosition = null;\n        this.#setCommentButtonPosition();\n        this.#updateCommentButtonPosition();\n      }\n      return;\n    }\n    if (deleted || popup?.deleted) {\n      this.remove();\n      return;\n    }\n    this.#addEventListeners();\n    this.#updates ||= {\n      contentsObj: this.#contentsObj,\n      richText: this.#richText\n    };\n    if (rect) {\n      this.#position = null;\n    }\n    if (popup && popup.text) {\n      this.#richText = this.#makePopupContent(popup.text);\n      this.#dateObj = PDFDateString.toDateObject(popup.date);\n      this.#contentsObj = null;\n    }\n    this.#popup?.remove();\n    this.#popup = null;\n  }\n  resetEdited() {\n    if (!this.#updates) {\n      return;\n    }\n    ({\n      contentsObj: this.#contentsObj,\n      richText: this.#richText\n    } = this.#updates);\n    this.#updates = null;\n    this.#popup?.remove();\n    this.#popup = null;\n    this.#position = null;\n  }\n  remove() {\n    this.#popupAbortController?.abort();\n    this.#popupAbortController = null;\n    this.#popup?.remove();\n    this.#popup = null;\n    this.#wasVisible = false;\n    this.#pinned = false;\n    this.#commentButton?.remove();\n    this.#commentButton = null;\n    if (this.trigger) {\n      for (const element of this.trigger) {\n        element.classList.remove(\"popupTriggerArea\");\n      }\n    }\n  }\n  #setPosition() {\n    if (this.#position !== null) {\n      return;\n    }\n    const {\n      page: {\n        view\n      },\n      viewport: {\n        rawDims: {\n          pageWidth,\n          pageHeight,\n          pageX,\n          pageY\n        }\n      }\n    } = this.#parent;\n    let useParentRect = !!this.#parentRect;\n    let rect = useParentRect ? this.#parentRect : this.#rect;\n    for (const element of this.#elements) {\n      if (!rect || Util.intersect(element.data.rect, rect) !== null) {\n        rect = element.data.rect;\n        useParentRect = true;\n        break;\n      }\n    }\n    const normalizedRect = Util.normalizeRect([rect[0], view[3] - rect[1] + view[1], rect[2], view[3] - rect[3] + view[1]]);\n    const HORIZONTAL_SPACE_AFTER_ANNOTATION = 5;\n    const parentWidth = useParentRect ? rect[2] - rect[0] + HORIZONTAL_SPACE_AFTER_ANNOTATION : 0;\n    const popupLeft = normalizedRect[0] + parentWidth;\n    const popupTop = normalizedRect[1];\n    this.#position = [100 * (popupLeft - pageX) / pageWidth, 100 * (popupTop - pageY) / pageHeight];\n    const {\n      style\n    } = this.#container;\n    style.left = `${this.#position[0]}%`;\n    style.top = `${this.#position[1]}%`;\n  }\n  #toggle() {\n    if (this.#commentManager) {\n      this.#commentManager.toggleCommentPopup(this, false);\n      return;\n    }\n    this.#pinned = !this.#pinned;\n    if (this.#pinned) {\n      this.#show();\n      this.#container.addEventListener(\"click\", this.#boundToggle);\n      this.#container.addEventListener(\"keydown\", this.#boundKeyDown);\n    } else {\n      this.#hide();\n      this.#container.removeEventListener(\"click\", this.#boundToggle);\n      this.#container.removeEventListener(\"keydown\", this.#boundKeyDown);\n    }\n  }\n  #show() {\n    if (!this.#popup) {\n      this.render();\n    }\n    if (!this.isVisible) {\n      this.#setPosition();\n      this.#container.hidden = false;\n      this.#container.style.zIndex = parseInt(this.#container.style.zIndex, 10) + 1000;\n    } else if (this.#pinned) {\n      this.#container.classList.add(\"focused\");\n    }\n  }\n  #hide() {\n    this.#container.classList.remove(\"focused\");\n    if (this.#pinned || !this.isVisible) {\n      return;\n    }\n    this.#container.hidden = true;\n    this.#container.style.zIndex = parseInt(this.#container.style.zIndex, 10) - 1000;\n  }\n  forceHide() {\n    this.#wasVisible = this.isVisible;\n    if (!this.#wasVisible) {\n      return;\n    }\n    this.#container.hidden = true;\n  }\n  maybeShow() {\n    if (this.#commentManager) {\n      return;\n    }\n    this.#addEventListeners();\n    if (!this.#wasVisible) {\n      return;\n    }\n    if (!this.#popup) {\n      this.#show();\n    }\n    this.#wasVisible = false;\n    this.#container.hidden = false;\n  }\n  get isVisible() {\n    if (this.#commentManager) {\n      return false;\n    }\n    return this.#container.hidden === false;\n  }\n}\nclass FreeTextAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true\n    });\n    this.textContent = parameters.data.textContent;\n    this.textPosition = parameters.data.textPosition;\n    this.annotationEditorType = AnnotationEditorType.FREETEXT;\n  }\n  render() {\n    this.container.classList.add(\"freeTextAnnotation\");\n    if (this.textContent) {\n      const content = this.contentElement = document.createElement(\"div\");\n      content.classList.add(\"annotationTextContent\");\n      content.setAttribute(\"role\", \"comment\");\n      for (const line of this.textContent) {\n        const lineSpan = document.createElement(\"span\");\n        lineSpan.textContent = line;\n        content.append(lineSpan);\n      }\n      this.container.append(content);\n    }\n    if (!this.data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n    this._editOnDoubleClick();\n    return this.container;\n  }\n}\nclass LineAnnotationElement extends AnnotationElement {\n  #line = null;\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true\n    });\n  }\n  render() {\n    this.container.classList.add(\"lineAnnotation\");\n    const {\n      data,\n      width,\n      height\n    } = this;\n    const svg = this.svgFactory.create(width, height, true);\n    const line = this.#line = this.svgFactory.createElement(\"svg:line\");\n    line.setAttribute(\"x1\", data.rect[2] - data.lineCoordinates[0]);\n    line.setAttribute(\"y1\", data.rect[3] - data.lineCoordinates[1]);\n    line.setAttribute(\"x2\", data.rect[2] - data.lineCoordinates[2]);\n    line.setAttribute(\"y2\", data.rect[3] - data.lineCoordinates[3]);\n    line.setAttribute(\"stroke-width\", data.borderStyle.width || 1);\n    line.setAttribute(\"stroke\", \"transparent\");\n    line.setAttribute(\"fill\", \"transparent\");\n    svg.append(line);\n    this.container.append(svg);\n    if (!data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n    return this.container;\n  }\n  getElementsToTriggerPopup() {\n    return this.#line;\n  }\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n}\nclass SquareAnnotationElement extends AnnotationElement {\n  #square = null;\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true\n    });\n  }\n  render() {\n    this.container.classList.add(\"squareAnnotation\");\n    const {\n      data,\n      width,\n      height\n    } = this;\n    const svg = this.svgFactory.create(width, height, true);\n    const borderWidth = data.borderStyle.width;\n    const square = this.#square = this.svgFactory.createElement(\"svg:rect\");\n    square.setAttribute(\"x\", borderWidth / 2);\n    square.setAttribute(\"y\", borderWidth / 2);\n    square.setAttribute(\"width\", width - borderWidth);\n    square.setAttribute(\"height\", height - borderWidth);\n    square.setAttribute(\"stroke-width\", borderWidth || 1);\n    square.setAttribute(\"stroke\", \"transparent\");\n    square.setAttribute(\"fill\", \"transparent\");\n    svg.append(square);\n    this.container.append(svg);\n    if (!data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n    return this.container;\n  }\n  getElementsToTriggerPopup() {\n    return this.#square;\n  }\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n}\nclass CircleAnnotationElement extends AnnotationElement {\n  #circle = null;\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true\n    });\n  }\n  render() {\n    this.container.classList.add(\"circleAnnotation\");\n    const {\n      data,\n      width,\n      height\n    } = this;\n    const svg = this.svgFactory.create(width, height, true);\n    const borderWidth = data.borderStyle.width;\n    const circle = this.#circle = this.svgFactory.createElement(\"svg:ellipse\");\n    circle.setAttribute(\"cx\", width / 2);\n    circle.setAttribute(\"cy\", height / 2);\n    circle.setAttribute(\"rx\", width / 2 - borderWidth / 2);\n    circle.setAttribute(\"ry\", height / 2 - borderWidth / 2);\n    circle.setAttribute(\"stroke-width\", borderWidth || 1);\n    circle.setAttribute(\"stroke\", \"transparent\");\n    circle.setAttribute(\"fill\", \"transparent\");\n    svg.append(circle);\n    this.container.append(svg);\n    if (!data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n    return this.container;\n  }\n  getElementsToTriggerPopup() {\n    return this.#circle;\n  }\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n}\nclass PolylineAnnotationElement extends AnnotationElement {\n  #polyline = null;\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true\n    });\n    this.containerClassName = \"polylineAnnotation\";\n    this.svgElementName = \"svg:polyline\";\n  }\n  render() {\n    this.container.classList.add(this.containerClassName);\n    const {\n      data: {\n        rect,\n        vertices,\n        borderStyle,\n        popupRef\n      },\n      width,\n      height\n    } = this;\n    if (!vertices) {\n      return this.container;\n    }\n    const svg = this.svgFactory.create(width, height, true);\n    let points = [];\n    for (let i = 0, ii = vertices.length; i < ii; i += 2) {\n      const x = vertices[i] - rect[0];\n      const y = rect[3] - vertices[i + 1];\n      points.push(`${x},${y}`);\n    }\n    points = points.join(\" \");\n    const polyline = this.#polyline = this.svgFactory.createElement(this.svgElementName);\n    polyline.setAttribute(\"points\", points);\n    polyline.setAttribute(\"stroke-width\", borderStyle.width || 1);\n    polyline.setAttribute(\"stroke\", \"transparent\");\n    polyline.setAttribute(\"fill\", \"transparent\");\n    svg.append(polyline);\n    this.container.append(svg);\n    if (!popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n    return this.container;\n  }\n  getElementsToTriggerPopup() {\n    return this.#polyline;\n  }\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n}\nclass PolygonAnnotationElement extends PolylineAnnotationElement {\n  constructor(parameters) {\n    super(parameters);\n    this.containerClassName = \"polygonAnnotation\";\n    this.svgElementName = \"svg:polygon\";\n  }\n}\nclass CaretAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true\n    });\n  }\n  render() {\n    this.container.classList.add(\"caretAnnotation\");\n    if (!this.data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n    return this.container;\n  }\n}\nclass InkAnnotationElement extends AnnotationElement {\n  #polylinesGroupElement = null;\n  #polylines = [];\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true\n    });\n    this.containerClassName = \"inkAnnotation\";\n    this.svgElementName = \"svg:polyline\";\n    this.annotationEditorType = this.data.it === \"InkHighlight\" ? AnnotationEditorType.HIGHLIGHT : AnnotationEditorType.INK;\n  }\n  #getTransform(rotation, rect) {\n    switch (rotation) {\n      case 90:\n        return {\n          transform: `rotate(90) translate(${-rect[0]},${rect[1]}) scale(1,-1)`,\n          width: rect[3] - rect[1],\n          height: rect[2] - rect[0]\n        };\n      case 180:\n        return {\n          transform: `rotate(180) translate(${-rect[2]},${rect[1]}) scale(1,-1)`,\n          width: rect[2] - rect[0],\n          height: rect[3] - rect[1]\n        };\n      case 270:\n        return {\n          transform: `rotate(270) translate(${-rect[2]},${rect[3]}) scale(1,-1)`,\n          width: rect[3] - rect[1],\n          height: rect[2] - rect[0]\n        };\n      default:\n        return {\n          transform: `translate(${-rect[0]},${rect[3]}) scale(1,-1)`,\n          width: rect[2] - rect[0],\n          height: rect[3] - rect[1]\n        };\n    }\n  }\n  render() {\n    this.container.classList.add(this.containerClassName);\n    const {\n      data: {\n        rect,\n        rotation,\n        inkLists,\n        borderStyle,\n        popupRef\n      }\n    } = this;\n    const {\n      transform,\n      width,\n      height\n    } = this.#getTransform(rotation, rect);\n    const svg = this.svgFactory.create(width, height, true);\n    const g = this.#polylinesGroupElement = this.svgFactory.createElement(\"svg:g\");\n    svg.append(g);\n    g.setAttribute(\"stroke-width\", borderStyle.width || 1);\n    g.setAttribute(\"stroke-linecap\", \"round\");\n    g.setAttribute(\"stroke-linejoin\", \"round\");\n    g.setAttribute(\"stroke-miterlimit\", 10);\n    g.setAttribute(\"stroke\", \"transparent\");\n    g.setAttribute(\"fill\", \"transparent\");\n    g.setAttribute(\"transform\", transform);\n    for (let i = 0, ii = inkLists.length; i < ii; i++) {\n      const polyline = this.svgFactory.createElement(this.svgElementName);\n      this.#polylines.push(polyline);\n      polyline.setAttribute(\"points\", inkLists[i].join(\",\"));\n      g.append(polyline);\n    }\n    if (!popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n    this.container.append(svg);\n    this._editOnDoubleClick();\n    return this.container;\n  }\n  updateEdited(params) {\n    super.updateEdited(params);\n    const {\n      thickness,\n      points,\n      rect\n    } = params;\n    const g = this.#polylinesGroupElement;\n    if (thickness >= 0) {\n      g.setAttribute(\"stroke-width\", thickness || 1);\n    }\n    if (points) {\n      for (let i = 0, ii = this.#polylines.length; i < ii; i++) {\n        this.#polylines[i].setAttribute(\"points\", points[i].join(\",\"));\n      }\n    }\n    if (rect) {\n      const {\n        transform,\n        width,\n        height\n      } = this.#getTransform(this.data.rotation, rect);\n      const root = g.parentElement;\n      root.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n      g.setAttribute(\"transform\", transform);\n    }\n  }\n  getElementsToTriggerPopup() {\n    return this.#polylines;\n  }\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n}\nclass HighlightAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true,\n      createQuadrilaterals: true\n    });\n    this.annotationEditorType = AnnotationEditorType.HIGHLIGHT;\n  }\n  render() {\n    const {\n      data: {\n        overlaidText,\n        popupRef\n      }\n    } = this;\n    if (!popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n    this.container.classList.add(\"highlightAnnotation\");\n    this._editOnDoubleClick();\n    if (overlaidText) {\n      const mark = document.createElement(\"mark\");\n      mark.classList.add(\"overlaidText\");\n      mark.textContent = overlaidText;\n      this.container.append(mark);\n    }\n    return this.container;\n  }\n}\nclass UnderlineAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true,\n      createQuadrilaterals: true\n    });\n  }\n  render() {\n    const {\n      data: {\n        overlaidText,\n        popupRef\n      }\n    } = this;\n    if (!popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n    this.container.classList.add(\"underlineAnnotation\");\n    if (overlaidText) {\n      const underline = document.createElement(\"u\");\n      underline.classList.add(\"overlaidText\");\n      underline.textContent = overlaidText;\n      this.container.append(underline);\n    }\n    return this.container;\n  }\n}\nclass SquigglyAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true,\n      createQuadrilaterals: true\n    });\n  }\n  render() {\n    const {\n      data: {\n        overlaidText,\n        popupRef\n      }\n    } = this;\n    if (!popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n    this.container.classList.add(\"squigglyAnnotation\");\n    if (overlaidText) {\n      const underline = document.createElement(\"u\");\n      underline.classList.add(\"overlaidText\");\n      underline.textContent = overlaidText;\n      this.container.append(underline);\n    }\n    return this.container;\n  }\n}\nclass StrikeOutAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true,\n      createQuadrilaterals: true\n    });\n  }\n  render() {\n    const {\n      data: {\n        overlaidText,\n        popupRef\n      }\n    } = this;\n    if (!popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n    this.container.classList.add(\"strikeoutAnnotation\");\n    if (overlaidText) {\n      const strikeout = document.createElement(\"s\");\n      strikeout.classList.add(\"overlaidText\");\n      strikeout.textContent = overlaidText;\n      this.container.append(strikeout);\n    }\n    return this.container;\n  }\n}\nclass StampAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true\n    });\n    this.annotationEditorType = AnnotationEditorType.STAMP;\n  }\n  render() {\n    this.container.classList.add(\"stampAnnotation\");\n    this.container.setAttribute(\"role\", \"img\");\n    if (!this.data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n    this._editOnDoubleClick();\n    return this.container;\n  }\n}\nclass FileAttachmentAnnotationElement extends AnnotationElement {\n  #trigger = null;\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true\n    });\n    const {\n      file\n    } = this.data;\n    this.filename = file.filename;\n    this.content = file.content;\n    this.linkService.eventBus?.dispatch(\"fileattachmentannotation\", {\n      source: this,\n      ...file\n    });\n  }\n  render() {\n    this.container.classList.add(\"fileAttachmentAnnotation\");\n    const {\n      container,\n      data\n    } = this;\n    let trigger;\n    if (data.hasAppearance || data.fillAlpha === 0) {\n      trigger = document.createElement(\"div\");\n    } else {\n      trigger = document.createElement(\"img\");\n      trigger.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(data.name) ? \"paperclip\" : \"pushpin\"}.svg`;\n      if (data.fillAlpha && data.fillAlpha < 1) {\n        trigger.style = `filter: opacity(${Math.round(data.fillAlpha * 100)}%);`;\n      }\n    }\n    trigger.addEventListener(\"dblclick\", this.#download.bind(this));\n    this.#trigger = trigger;\n    const {\n      isMac\n    } = FeatureTest.platform;\n    container.addEventListener(\"keydown\", evt => {\n      if (evt.key === \"Enter\" && (isMac ? evt.metaKey : evt.ctrlKey)) {\n        this.#download();\n      }\n    });\n    if (!data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    } else {\n      trigger.classList.add(\"popupTriggerArea\");\n    }\n    container.append(trigger);\n    return container;\n  }\n  getElementsToTriggerPopup() {\n    return this.#trigger;\n  }\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n  #download() {\n    this.downloadManager?.openOrDownloadData(this.content, this.filename);\n  }\n}\nclass AnnotationLayer {\n  #accessibilityManager = null;\n  #annotationCanvasMap = null;\n  #annotationStorage = null;\n  #editableAnnotations = new Map();\n  #structTreeLayer = null;\n  #linkService = null;\n  #elements = [];\n  #hasAriaAttributesFromStructTree = false;\n  zIndex = 0;\n  constructor({\n    div,\n    accessibilityManager,\n    annotationCanvasMap,\n    annotationEditorUIManager,\n    page,\n    viewport,\n    structTreeLayer,\n    commentManager,\n    linkService,\n    annotationStorage\n  }) {\n    this.div = div;\n    this.#accessibilityManager = accessibilityManager;\n    this.#annotationCanvasMap = annotationCanvasMap;\n    this.#structTreeLayer = structTreeLayer || null;\n    this.#linkService = linkService || null;\n    this.#annotationStorage = annotationStorage || new AnnotationStorage();\n    this.page = page;\n    this.viewport = viewport;\n    this._annotationEditorUIManager = annotationEditorUIManager;\n    this._commentManager = commentManager || null;\n  }\n  hasEditableAnnotations() {\n    return this.#editableAnnotations.size > 0;\n  }\n  async render(params) {\n    const {\n      annotations\n    } = params;\n    const layer = this.div;\n    setLayerDimensions(layer, this.viewport);\n    const popupToElements = new Map();\n    const popupAnnotations = [];\n    const elementParams = {\n      data: null,\n      layer,\n      linkService: this.#linkService,\n      downloadManager: params.downloadManager,\n      imageResourcesPath: params.imageResourcesPath || \"\",\n      renderForms: params.renderForms !== false,\n      svgFactory: new DOMSVGFactory(),\n      annotationStorage: this.#annotationStorage,\n      enableComment: params.enableComment === true,\n      enableScripting: params.enableScripting === true,\n      hasJSActions: params.hasJSActions,\n      fieldObjects: params.fieldObjects,\n      parent: this,\n      elements: null\n    };\n    for (const data of annotations) {\n      if (data.noHTML) {\n        continue;\n      }\n      const isPopupAnnotation = data.annotationType === AnnotationType.POPUP;\n      if (!isPopupAnnotation) {\n        if (data.rect[2] === data.rect[0] || data.rect[3] === data.rect[1]) {\n          continue;\n        }\n      } else {\n        const elements = popupToElements.get(data.id);\n        if (!elements) {\n          continue;\n        }\n        if (!this._commentManager) {\n          popupAnnotations.push(data);\n          continue;\n        }\n        elementParams.elements = elements;\n      }\n      elementParams.data = data;\n      const element = AnnotationElementFactory.create(elementParams);\n      if (!element.isRenderable) {\n        continue;\n      }\n      if (!isPopupAnnotation) {\n        this.#elements.push(element);\n        if (data.popupRef) {\n          popupToElements.getOrInsertComputed(data.popupRef, makeArr).push(element);\n        }\n      }\n      const rendered = element.render();\n      if (data.hidden) {\n        rendered.style.visibility = \"hidden\";\n      }\n      if (element._isEditable) {\n        this.#editableAnnotations.set(element.data.id, element);\n        this._annotationEditorUIManager?.renderAnnotationElement(element);\n      }\n    }\n    await this.#addElementsToDOM();\n    for (const data of popupAnnotations) {\n      const elements = elementParams.elements = popupToElements.get(data.id);\n      elementParams.data = data;\n      const element = AnnotationElementFactory.create(elementParams);\n      if (!element.isRenderable) {\n        continue;\n      }\n      const rendered = element.render();\n      element.contentElement.id = `${AnnotationPrefix}${data.id}`;\n      if (data.hidden) {\n        rendered.style.visibility = \"hidden\";\n      }\n      elements.at(-1).container.after(rendered);\n    }\n    this.#setAnnotationCanvasMap();\n  }\n  async #addElementsToDOM() {\n    if (this.#elements.length === 0) {\n      return;\n    }\n    this.div.replaceChildren();\n    const promises = [];\n    if (!this.#hasAriaAttributesFromStructTree) {\n      this.#hasAriaAttributesFromStructTree = true;\n      for (const {\n        contentElement,\n        data: {\n          id\n        }\n      } of this.#elements) {\n        const annotationId = contentElement.id = `${AnnotationPrefix}${id}`;\n        promises.push(this.#structTreeLayer?.getAriaAttributes(annotationId).then(ariaAttributes => {\n          if (ariaAttributes) {\n            for (const [key, value] of ariaAttributes) {\n              contentElement.setAttribute(key, value);\n            }\n          }\n        }));\n      }\n    }\n    this.#elements.sort(({\n      data: {\n        rect: [a0, a1, a2, a3]\n      }\n    }, {\n      data: {\n        rect: [b0, b1, b2, b3]\n      }\n    }) => {\n      if (a0 === a2 && a1 === a3) {\n        return +1;\n      }\n      if (b0 === b2 && b1 === b3) {\n        return -1;\n      }\n      const top1 = a3;\n      const bot1 = a1;\n      const mid1 = (a1 + a3) / 2;\n      const top2 = b3;\n      const bot2 = b1;\n      const mid2 = (b1 + b3) / 2;\n      if (mid1 >= top2 && mid2 <= bot1) {\n        return -1;\n      }\n      if (mid2 >= top1 && mid1 <= bot2) {\n        return +1;\n      }\n      const centerX1 = (a0 + a2) / 2;\n      const centerX2 = (b0 + b2) / 2;\n      return centerX1 - centerX2;\n    });\n    const fragment = document.createDocumentFragment();\n    for (const element of this.#elements) {\n      fragment.append(element.container);\n      if (this._commentManager) {\n        (element.extraPopupElement?.popup || element.popup)?.renderCommentButton();\n      } else if (element.extraPopupElement) {\n        fragment.append(element.extraPopupElement.render());\n      }\n    }\n    this.div.append(fragment);\n    await Promise.all(promises);\n    if (this.#accessibilityManager) {\n      for (const element of this.#elements) {\n        this.#accessibilityManager.addPointerInTextLayer(element.contentElement, false);\n      }\n    }\n  }\n  async addLinkAnnotations(annotations) {\n    const elementParams = {\n      data: null,\n      layer: this.div,\n      linkService: this.#linkService,\n      svgFactory: new DOMSVGFactory(),\n      parent: this\n    };\n    for (const data of annotations) {\n      data.borderStyle ||= AnnotationLayer._defaultBorderStyle;\n      elementParams.data = data;\n      const element = AnnotationElementFactory.create(elementParams);\n      if (!element.isRenderable) {\n        continue;\n      }\n      element.render();\n      element.contentElement.id = `${AnnotationPrefix}${data.id}`;\n      this.#elements.push(element);\n    }\n    await this.#addElementsToDOM();\n  }\n  update({\n    viewport\n  }) {\n    const layer = this.div;\n    this.viewport = viewport;\n    setLayerDimensions(layer, {\n      rotation: viewport.rotation\n    });\n    this.#setAnnotationCanvasMap();\n    layer.hidden = false;\n  }\n  #setAnnotationCanvasMap() {\n    if (!this.#annotationCanvasMap) {\n      return;\n    }\n    const layer = this.div;\n    for (const [id, canvas] of this.#annotationCanvasMap) {\n      const element = layer.querySelector(`[data-annotation-id=\"${id}\"]`);\n      if (!element) {\n        continue;\n      }\n      canvas.className = \"annotationContent\";\n      const {\n        firstChild\n      } = element;\n      if (!firstChild) {\n        element.append(canvas);\n      } else if (firstChild.nodeName === \"CANVAS\") {\n        firstChild.replaceWith(canvas);\n      } else if (!firstChild.classList.contains(\"annotationContent\")) {\n        firstChild.before(canvas);\n      } else {\n        firstChild.after(canvas);\n      }\n      const editableAnnotation = this.#editableAnnotations.get(id);\n      if (!editableAnnotation) {\n        continue;\n      }\n      if (editableAnnotation._hasNoCanvas) {\n        this._annotationEditorUIManager?.setMissingCanvas(id, element.id, canvas);\n        editableAnnotation._hasNoCanvas = false;\n      } else {\n        editableAnnotation.canvas = canvas;\n      }\n    }\n    this.#annotationCanvasMap.clear();\n  }\n  getEditableAnnotations() {\n    return this.#editableAnnotations.values();\n  }\n  getEditableAnnotation(id) {\n    return this.#editableAnnotations.get(id);\n  }\n  addFakeAnnotation(editor) {\n    const {\n      div\n    } = this;\n    const {\n      id,\n      rotation\n    } = editor;\n    const element = new EditorAnnotationElement({\n      data: {\n        id,\n        rect: editor.getPDFRect(),\n        rotation\n      },\n      editor,\n      layer: div,\n      parent: this,\n      enableComment: !!this._commentManager,\n      linkService: this.#linkService,\n      annotationStorage: this.#annotationStorage\n    });\n    element.render();\n    element.contentElement.id = `${AnnotationPrefix}${id}`;\n    element.createOrUpdatePopup();\n    this.#elements.push(element);\n    return element;\n  }\n  removeAnnotation(id) {\n    const index = this.#elements.findIndex(el => el.data.id === id);\n    if (index < 0) {\n      return;\n    }\n    const [element] = this.#elements.splice(index, 1);\n    this.#accessibilityManager?.removePointerInTextLayer(element.contentElement);\n  }\n  updateFakeAnnotations(editors) {\n    if (editors.length === 0) {\n      return;\n    }\n    for (const editor of editors) {\n      editor.updateFakeAnnotationElement(this);\n    }\n    this.#addElementsToDOM();\n  }\n  togglePointerEvents(enabled = false) {\n    this.div.classList.toggle(\"disabled\", !enabled);\n  }\n  static get _defaultBorderStyle() {\n    return shadow(this, \"_defaultBorderStyle\", Object.freeze({\n      width: 1,\n      rawWidth: 1,\n      style: AnnotationBorderStyleType.SOLID,\n      dashArray: [3],\n      horizontalCornerRadius: 0,\n      verticalCornerRadius: 0\n    }));\n  }\n}\n\n;// ./src/display/editor/freetext.js\n\n\n\n\n\n\n\n\n\n\nconst EOL_PATTERN = /\\r\\n?|\\n/g;\nclass FreeTextEditor extends AnnotationEditor {\n  #content = \"\";\n  #editorDivId = `${this.id}-editor`;\n  #editModeAC = null;\n  #fontSize;\n  _colorPicker = null;\n  static _freeTextDefaultContent = \"\";\n  static _internalPadding = 0;\n  static _defaultColor = null;\n  static _defaultFontSize = 10;\n  static get _keyboardManager() {\n    const proto = FreeTextEditor.prototype;\n    const arrowChecker = self => self.isEmpty();\n    const small = AnnotationEditorUIManager.TRANSLATE_SMALL;\n    const big = AnnotationEditorUIManager.TRANSLATE_BIG;\n    return shadow(this, \"_keyboardManager\", new KeyboardManager([[[\"ctrl+s\", \"mac+meta+s\", \"ctrl+p\", \"mac+meta+p\"], proto.commitOrRemove, {\n      bubbles: true\n    }], [[\"ctrl+Enter\", \"mac+meta+Enter\", \"Escape\", \"mac+Escape\"], proto.commitOrRemove], [[\"ArrowLeft\", \"mac+ArrowLeft\"], proto._translateEmpty, {\n      args: [-small, 0],\n      checker: arrowChecker\n    }], [[\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"], proto._translateEmpty, {\n      args: [-big, 0],\n      checker: arrowChecker\n    }], [[\"ArrowRight\", \"mac+ArrowRight\"], proto._translateEmpty, {\n      args: [small, 0],\n      checker: arrowChecker\n    }], [[\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"], proto._translateEmpty, {\n      args: [big, 0],\n      checker: arrowChecker\n    }], [[\"ArrowUp\", \"mac+ArrowUp\"], proto._translateEmpty, {\n      args: [0, -small],\n      checker: arrowChecker\n    }], [[\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"], proto._translateEmpty, {\n      args: [0, -big],\n      checker: arrowChecker\n    }], [[\"ArrowDown\", \"mac+ArrowDown\"], proto._translateEmpty, {\n      args: [0, small],\n      checker: arrowChecker\n    }], [[\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"], proto._translateEmpty, {\n      args: [0, big],\n      checker: arrowChecker\n    }]]));\n  }\n  static _type = \"freetext\";\n  static _editorType = AnnotationEditorType.FREETEXT;\n  constructor(params) {\n    super({\n      ...params,\n      name: \"freeTextEditor\"\n    });\n    this.color = params.color || FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor;\n    this.#fontSize = params.fontSize || FreeTextEditor._defaultFontSize;\n    if (!this.annotationElementId) {\n      this._uiManager.a11yAlert(\"pdfjs-editor-freetext-added-alert\");\n    }\n    this.canAddComment = false;\n  }\n  static initialize(l10n, uiManager) {\n    AnnotationEditor.initialize(l10n, uiManager);\n    const style = getComputedStyle(document.documentElement);\n    this._internalPadding = parseFloat(style.getPropertyValue(\"--freetext-padding\"));\n  }\n  static updateDefaultParams(type, value) {\n    switch (type) {\n      case AnnotationEditorParamsType.FREETEXT_SIZE:\n        FreeTextEditor._defaultFontSize = value;\n        break;\n      case AnnotationEditorParamsType.FREETEXT_COLOR:\n        FreeTextEditor._defaultColor = value;\n        break;\n    }\n  }\n  updateParams(type, value) {\n    switch (type) {\n      case AnnotationEditorParamsType.FREETEXT_SIZE:\n        this.#updateFontSize(value);\n        break;\n      case AnnotationEditorParamsType.FREETEXT_COLOR:\n        this.#updateColor(value);\n        break;\n    }\n  }\n  static get defaultPropertiesToUpdate() {\n    return [[AnnotationEditorParamsType.FREETEXT_SIZE, FreeTextEditor._defaultFontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor]];\n  }\n  get propertiesToUpdate() {\n    return [[AnnotationEditorParamsType.FREETEXT_SIZE, this.#fontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, this.color]];\n  }\n  get toolbarButtons() {\n    this._colorPicker ||= new BasicColorPicker(this);\n    return [[\"colorPicker\", this._colorPicker]];\n  }\n  get colorType() {\n    return AnnotationEditorParamsType.FREETEXT_COLOR;\n  }\n  #updateFontSize(fontSize) {\n    const setFontsize = size => {\n      this.editorDiv.style.fontSize = `calc(${size}px * var(--total-scale-factor))`;\n      this.translate(0, -(size - this.#fontSize) * this.parentScale);\n      this.#fontSize = size;\n      this.#setEditorDimensions();\n    };\n    const savedFontsize = this.#fontSize;\n    this.addCommands({\n      cmd: setFontsize.bind(this, fontSize),\n      undo: setFontsize.bind(this, savedFontsize),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type: AnnotationEditorParamsType.FREETEXT_SIZE,\n      overwriteIfSameType: true,\n      keepUndo: true\n    });\n  }\n  onUpdatedColor() {\n    this.editorDiv.style.color = this.color;\n    this._colorPicker?.update(this.color);\n    super.onUpdatedColor();\n  }\n  #updateColor(color) {\n    const setColor = col => {\n      this.color = col;\n      this.onUpdatedColor();\n    };\n    const savedColor = this.color;\n    this.addCommands({\n      cmd: setColor.bind(this, color),\n      undo: setColor.bind(this, savedColor),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type: AnnotationEditorParamsType.FREETEXT_COLOR,\n      overwriteIfSameType: true,\n      keepUndo: true\n    });\n  }\n  _translateEmpty(x, y) {\n    this._uiManager.translateSelectedEditors(x, y, true);\n  }\n  getInitialTranslation() {\n    const scale = this.parentScale;\n    return [-FreeTextEditor._internalPadding * scale, -(FreeTextEditor._internalPadding + this.#fontSize) * scale];\n  }\n  rebuild() {\n    if (!this.parent) {\n      return;\n    }\n    super.rebuild();\n    if (this.div === null) {\n      return;\n    }\n    if (!this.isAttachedToDOM) {\n      this.parent.add(this);\n    }\n  }\n  enableEditMode() {\n    if (!super.enableEditMode()) {\n      return false;\n    }\n    this.overlayDiv.classList.remove(\"enabled\");\n    this.editorDiv.contentEditable = true;\n    this._isDraggable = false;\n    this.div.removeAttribute(\"aria-activedescendant\");\n    this.#editModeAC = new AbortController();\n    const signal = this._uiManager.combinedSignal(this.#editModeAC);\n    this.editorDiv.addEventListener(\"keydown\", this.editorDivKeydown.bind(this), {\n      signal\n    });\n    this.editorDiv.addEventListener(\"focus\", this.editorDivFocus.bind(this), {\n      signal\n    });\n    this.editorDiv.addEventListener(\"blur\", this.editorDivBlur.bind(this), {\n      signal\n    });\n    this.editorDiv.addEventListener(\"input\", this.editorDivInput.bind(this), {\n      signal\n    });\n    this.editorDiv.addEventListener(\"paste\", this.editorDivPaste.bind(this), {\n      signal\n    });\n    return true;\n  }\n  disableEditMode() {\n    if (!super.disableEditMode()) {\n      return false;\n    }\n    this.overlayDiv.classList.add(\"enabled\");\n    this.editorDiv.contentEditable = false;\n    this.div.setAttribute(\"aria-activedescendant\", this.#editorDivId);\n    this._isDraggable = true;\n    this.#editModeAC?.abort();\n    this.#editModeAC = null;\n    this.div.focus({\n      preventScroll: true\n    });\n    this.isEditing = false;\n    this.parent.div.classList.add(\"freetextEditing\");\n    return true;\n  }\n  focusin(event) {\n    if (!this._focusEventsAllowed) {\n      return;\n    }\n    super.focusin(event);\n    if (event.target !== this.editorDiv) {\n      this.editorDiv.focus();\n    }\n  }\n  onceAdded(focus) {\n    if (this.width) {\n      return;\n    }\n    this.enableEditMode();\n    if (focus) {\n      this.editorDiv.focus();\n    }\n    if (this._initialOptions?.isCentered) {\n      this.center();\n    }\n    this._initialOptions = null;\n  }\n  isEmpty() {\n    return !this.editorDiv || this.editorDiv.innerText.trim() === \"\";\n  }\n  remove() {\n    this.isEditing = false;\n    if (this.parent) {\n      this.parent.setEditingState(true);\n      this.parent.div.classList.add(\"freetextEditing\");\n    }\n    super.remove();\n  }\n  #extractText() {\n    const buffer = [];\n    this.editorDiv.normalize();\n    let prevChild = null;\n    for (const child of this.editorDiv.childNodes) {\n      if (prevChild?.nodeType === Node.TEXT_NODE && child.nodeName === \"BR\") {\n        continue;\n      }\n      buffer.push(FreeTextEditor.#getNodeContent(child));\n      prevChild = child;\n    }\n    return buffer.join(\"\\n\");\n  }\n  #setEditorDimensions() {\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    let rect;\n    if (this.isAttachedToDOM) {\n      rect = this.div.getBoundingClientRect();\n    } else {\n      const {\n        currentLayer,\n        div\n      } = this;\n      const savedDisplay = div.style.display;\n      const savedVisibility = div.classList.contains(\"hidden\");\n      div.classList.remove(\"hidden\");\n      div.style.display = \"hidden\";\n      currentLayer.div.append(this.div);\n      rect = div.getBoundingClientRect();\n      div.remove();\n      div.style.display = savedDisplay;\n      div.classList.toggle(\"hidden\", savedVisibility);\n    }\n    if (this.rotation % 180 === this.parentRotation % 180) {\n      this.width = rect.width / parentWidth;\n      this.height = rect.height / parentHeight;\n    } else {\n      this.width = rect.height / parentWidth;\n      this.height = rect.width / parentHeight;\n    }\n    this.fixAndSetPosition();\n  }\n  commit() {\n    if (!this.isInEditMode()) {\n      return;\n    }\n    super.commit();\n    this.disableEditMode();\n    const savedText = this.#content;\n    const newText = this.#content = this.#extractText().trimEnd();\n    if (savedText === newText) {\n      return;\n    }\n    const setText = text => {\n      this.#content = text;\n      if (!text) {\n        this.remove();\n        return;\n      }\n      this.#setContent();\n      this._uiManager.rebuild(this);\n      this.#setEditorDimensions();\n    };\n    this.addCommands({\n      cmd: () => {\n        setText(newText);\n      },\n      undo: () => {\n        setText(savedText);\n      },\n      mustExec: false\n    });\n    this.#setEditorDimensions();\n  }\n  shouldGetKeyboardEvents() {\n    return this.isInEditMode();\n  }\n  enterInEditMode() {\n    this.enableEditMode();\n    this.editorDiv.focus();\n  }\n  keydown(event) {\n    if (event.target === this.div && event.key === \"Enter\") {\n      this.enterInEditMode();\n      event.preventDefault();\n    }\n  }\n  editorDivKeydown(event) {\n    FreeTextEditor._keyboardManager.exec(this, event);\n  }\n  editorDivFocus(event) {\n    this.isEditing = true;\n  }\n  editorDivBlur(event) {\n    this.isEditing = false;\n  }\n  editorDivInput(event) {\n    this.parent.div.classList.toggle(\"freetextEditing\", this.isEmpty());\n  }\n  disableEditing() {\n    this.editorDiv.setAttribute(\"role\", \"comment\");\n    this.editorDiv.removeAttribute(\"aria-multiline\");\n  }\n  enableEditing() {\n    this.editorDiv.setAttribute(\"role\", \"textbox\");\n    this.editorDiv.setAttribute(\"aria-multiline\", true);\n  }\n  get canChangeContent() {\n    return true;\n  }\n  render() {\n    if (this.div) {\n      return this.div;\n    }\n    let baseX, baseY;\n    if (this._isCopy || this.annotationElementId) {\n      baseX = this.x;\n      baseY = this.y;\n    }\n    super.render();\n    this.editorDiv = document.createElement(\"div\");\n    this.editorDiv.className = \"internal\";\n    this.editorDiv.setAttribute(\"id\", this.#editorDivId);\n    this.editorDiv.setAttribute(\"data-l10n-id\", \"pdfjs-free-text2\");\n    this.editorDiv.setAttribute(\"data-l10n-attrs\", \"default-content\");\n    this.enableEditing();\n    this.editorDiv.contentEditable = true;\n    const {\n      style\n    } = this.editorDiv;\n    style.fontSize = `calc(${this.#fontSize}px * var(--total-scale-factor))`;\n    style.color = this.color;\n    this.div.append(this.editorDiv);\n    this.overlayDiv = document.createElement(\"div\");\n    this.overlayDiv.classList.add(\"overlay\", \"enabled\");\n    this.div.append(this.overlayDiv);\n    if (this._isCopy || this.annotationElementId) {\n      const [parentWidth, parentHeight] = this.parentDimensions;\n      if (this.annotationElementId) {\n        const {\n          position\n        } = this._initialData;\n        let [tx, ty] = this.getInitialTranslation();\n        [tx, ty] = this.pageTranslationToScreen(tx, ty);\n        const [pageWidth, pageHeight] = this.pageDimensions;\n        const [pageX, pageY] = this.pageTranslation;\n        let posX, posY;\n        switch (this.rotation) {\n          case 0:\n            posX = baseX + (position[0] - pageX) / pageWidth;\n            posY = baseY + this.height - (position[1] - pageY) / pageHeight;\n            break;\n          case 90:\n            posX = baseX + (position[0] - pageX) / pageWidth;\n            posY = baseY - (position[1] - pageY) / pageHeight;\n            [tx, ty] = [ty, -tx];\n            break;\n          case 180:\n            posX = baseX - this.width + (position[0] - pageX) / pageWidth;\n            posY = baseY - (position[1] - pageY) / pageHeight;\n            [tx, ty] = [-tx, -ty];\n            break;\n          case 270:\n            posX = baseX + (position[0] - pageX - this.height * pageHeight) / pageWidth;\n            posY = baseY + (position[1] - pageY - this.width * pageWidth) / pageHeight;\n            [tx, ty] = [-ty, tx];\n            break;\n        }\n        this.setAt(posX * parentWidth, posY * parentHeight, tx, ty);\n      } else {\n        this._moveAfterPaste(baseX, baseY);\n      }\n      this.#setContent();\n      this._isDraggable = true;\n      this.editorDiv.contentEditable = false;\n    } else {\n      this._isDraggable = false;\n      this.editorDiv.contentEditable = true;\n    }\n    return this.div;\n  }\n  static #getNodeContent(node) {\n    return (node.nodeType === Node.TEXT_NODE ? node.nodeValue : node.innerText).replaceAll(EOL_PATTERN, \"\");\n  }\n  editorDivPaste(event) {\n    const clipboardData = event.clipboardData || window.clipboardData;\n    const {\n      types\n    } = clipboardData;\n    if (types.length === 1 && types[0] === \"text/plain\") {\n      return;\n    }\n    event.preventDefault();\n    const paste = FreeTextEditor.#deserializeContent(clipboardData.getData(\"text\") || \"\").replaceAll(EOL_PATTERN, \"\\n\");\n    if (!paste) {\n      return;\n    }\n    const selection = window.getSelection();\n    if (!selection.rangeCount) {\n      return;\n    }\n    this.editorDiv.normalize();\n    selection.deleteFromDocument();\n    const range = selection.getRangeAt(0);\n    if (!paste.includes(\"\\n\")) {\n      range.insertNode(document.createTextNode(paste));\n      this.editorDiv.normalize();\n      selection.collapseToStart();\n      return;\n    }\n    const {\n      startContainer,\n      startOffset\n    } = range;\n    const bufferBefore = [];\n    const bufferAfter = [];\n    if (startContainer.nodeType === Node.TEXT_NODE) {\n      const parent = startContainer.parentElement;\n      bufferAfter.push(startContainer.nodeValue.slice(startOffset).replaceAll(EOL_PATTERN, \"\"));\n      if (parent !== this.editorDiv) {\n        let buffer = bufferBefore;\n        for (const child of this.editorDiv.childNodes) {\n          if (child === parent) {\n            buffer = bufferAfter;\n            continue;\n          }\n          buffer.push(FreeTextEditor.#getNodeContent(child));\n        }\n      }\n      bufferBefore.push(startContainer.nodeValue.slice(0, startOffset).replaceAll(EOL_PATTERN, \"\"));\n    } else if (startContainer === this.editorDiv) {\n      let buffer = bufferBefore;\n      let i = 0;\n      for (const child of this.editorDiv.childNodes) {\n        if (i++ === startOffset) {\n          buffer = bufferAfter;\n        }\n        buffer.push(FreeTextEditor.#getNodeContent(child));\n      }\n    }\n    this.#content = `${bufferBefore.join(\"\\n\")}${paste}${bufferAfter.join(\"\\n\")}`;\n    this.#setContent();\n    const newRange = new Range();\n    let beforeLength = Math.sumPrecise(bufferBefore.map(line => line.length));\n    for (const {\n      firstChild\n    } of this.editorDiv.childNodes) {\n      if (firstChild.nodeType === Node.TEXT_NODE) {\n        const length = firstChild.nodeValue.length;\n        if (beforeLength <= length) {\n          newRange.setStart(firstChild, beforeLength);\n          newRange.setEnd(firstChild, beforeLength);\n          break;\n        }\n        beforeLength -= length;\n      }\n    }\n    selection.removeAllRanges();\n    selection.addRange(newRange);\n  }\n  #setContent() {\n    this.editorDiv.replaceChildren();\n    if (!this.#content) {\n      return;\n    }\n    for (const line of this.#content.split(\"\\n\")) {\n      const div = document.createElement(\"div\");\n      div.append(line ? document.createTextNode(line) : document.createElement(\"br\"));\n      this.editorDiv.append(div);\n    }\n  }\n  #serializeContent() {\n    return this.#content.replaceAll(\"\\xa0\", \" \");\n  }\n  static #deserializeContent(content) {\n    return content.replaceAll(\" \", \"\\xa0\");\n  }\n  get contentDiv() {\n    return this.editorDiv;\n  }\n  getPDFRect() {\n    const padding = FreeTextEditor._internalPadding * this.parentScale;\n    return this.getRect(padding, padding);\n  }\n  static async deserialize(data, parent, uiManager) {\n    let initialData = null;\n    if (data instanceof FreeTextAnnotationElement) {\n      const {\n        data: {\n          defaultAppearanceData: {\n            fontSize,\n            fontColor\n          },\n          rect,\n          rotation,\n          id,\n          popupRef,\n          richText,\n          contentsObj,\n          creationDate,\n          modificationDate\n        },\n        textContent,\n        textPosition,\n        parent: {\n          page: {\n            pageNumber\n          }\n        }\n      } = data;\n      if (!textContent || textContent.length === 0) {\n        return null;\n      }\n      initialData = data = {\n        annotationType: AnnotationEditorType.FREETEXT,\n        color: Array.from(fontColor),\n        fontSize,\n        value: textContent.join(\"\\n\"),\n        position: textPosition,\n        pageIndex: pageNumber - 1,\n        rect: rect.slice(0),\n        rotation,\n        annotationElementId: id,\n        id,\n        deleted: false,\n        popupRef,\n        comment: contentsObj?.str || null,\n        richText,\n        creationDate,\n        modificationDate\n      };\n    }\n    const editor = await super.deserialize(data, parent, uiManager);\n    editor.#fontSize = data.fontSize;\n    editor.color = Util.makeHexColor(...data.color);\n    editor.#content = FreeTextEditor.#deserializeContent(data.value);\n    editor._initialData = initialData;\n    if (data.comment) {\n      editor.setCommentData(data);\n    }\n    return editor;\n  }\n  serialize(isForCopying = false) {\n    if (this.isEmpty()) {\n      return null;\n    }\n    if (this.deleted) {\n      return this.serializeDeleted();\n    }\n    const color = AnnotationEditor._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : this.color);\n    const serialized = Object.assign(super.serialize(isForCopying), {\n      color,\n      fontSize: this.#fontSize,\n      value: this.#serializeContent()\n    });\n    this.addComment(serialized);\n    if (isForCopying) {\n      serialized.isCopy = true;\n      return serialized;\n    }\n    if (this.annotationElementId && !this.#hasElementChanged(serialized)) {\n      return null;\n    }\n    serialized.id = this.annotationElementId;\n    return serialized;\n  }\n  #hasElementChanged(serialized) {\n    const {\n      value,\n      fontSize,\n      color,\n      pageIndex\n    } = this._initialData;\n    return this.hasEditedComment || this._hasBeenMoved || serialized.value !== value || serialized.fontSize !== fontSize || serialized.color.some((c, i) => c !== color[i]) || serialized.pageIndex !== pageIndex;\n  }\n  renderAnnotationElement(annotation) {\n    const content = super.renderAnnotationElement(annotation);\n    if (!content) {\n      return null;\n    }\n    const {\n      style\n    } = content;\n    style.fontSize = `calc(${this.#fontSize}px * var(--total-scale-factor))`;\n    style.color = this.color;\n    content.replaceChildren();\n    for (const line of this.#content.split(\"\\n\")) {\n      const div = document.createElement(\"div\");\n      div.append(line ? document.createTextNode(line) : document.createElement(\"br\"));\n      content.append(div);\n    }\n    annotation.updateEdited({\n      rect: this.getPDFRect(),\n      popup: this._uiManager.hasCommentManager() || this.hasEditedComment ? this.comment : {\n        text: this.#content\n      }\n    });\n    return content;\n  }\n  resetAnnotationElement(annotation) {\n    super.resetAnnotationElement(annotation);\n    annotation.resetEdited();\n  }\n}\n\n;// ./src/display/editor/drawers/outline.js\n\n\n\n\n\nclass Outline {\n  static PRECISION = 1e-4;\n  toSVGPath() {\n    unreachable(\"Abstract method `toSVGPath` must be implemented.\");\n  }\n  get box() {\n    unreachable(\"Abstract getter `box` must be implemented.\");\n  }\n  serialize(_bbox, _rotation) {\n    unreachable(\"Abstract method `serialize` must be implemented.\");\n  }\n  static _rescale(src, tx, ty, sx, sy, dest) {\n    dest ||= new Float32Array(src.length);\n    for (let i = 0, ii = src.length; i < ii; i += 2) {\n      dest[i] = tx + src[i] * sx;\n      dest[i + 1] = ty + src[i + 1] * sy;\n    }\n    return dest;\n  }\n  static _rescaleAndSwap(src, tx, ty, sx, sy, dest) {\n    dest ||= new Float32Array(src.length);\n    for (let i = 0, ii = src.length; i < ii; i += 2) {\n      dest[i] = tx + src[i + 1] * sx;\n      dest[i + 1] = ty + src[i] * sy;\n    }\n    return dest;\n  }\n  static _translate(src, tx, ty, dest) {\n    dest ||= new Float32Array(src.length);\n    for (let i = 0, ii = src.length; i < ii; i += 2) {\n      dest[i] = tx + src[i];\n      dest[i + 1] = ty + src[i + 1];\n    }\n    return dest;\n  }\n  static svgRound(x) {\n    return Math.round(x * 10000);\n  }\n  static _normalizePoint(x, y, parentWidth, parentHeight, rotation) {\n    switch (rotation) {\n      case 90:\n        return [1 - y / parentWidth, x / parentHeight];\n      case 180:\n        return [1 - x / parentWidth, 1 - y / parentHeight];\n      case 270:\n        return [y / parentWidth, 1 - x / parentHeight];\n      default:\n        return [x / parentWidth, y / parentHeight];\n    }\n  }\n  static _normalizePagePoint(x, y, rotation) {\n    switch (rotation) {\n      case 90:\n        return [1 - y, x];\n      case 180:\n        return [1 - x, 1 - y];\n      case 270:\n        return [y, 1 - x];\n      default:\n        return [x, y];\n    }\n  }\n  static createBezierPoints(x1, y1, x2, y2, x3, y3) {\n    return [(x1 + 5 * x2) / 6, (y1 + 5 * y2) / 6, (5 * x2 + x3) / 6, (5 * y2 + y3) / 6, (x2 + x3) / 2, (y2 + y3) / 2];\n  }\n}\n\n;// ./src/display/editor/drawers/freedraw.js\n\n\n\n\n\n\n\nclass FreeDrawOutliner {\n  #box;\n  #bottom = [];\n  #innerMargin;\n  #isLTR;\n  #top = [];\n  #last = new Float32Array(18);\n  #lastX;\n  #lastY;\n  #min;\n  #min_dist;\n  #scaleFactor;\n  #thickness;\n  #points = [];\n  static #MIN_DIST = 8;\n  static #MIN_DIFF = 2;\n  static #MIN = FreeDrawOutliner.#MIN_DIST + FreeDrawOutliner.#MIN_DIFF;\n  constructor({\n    x,\n    y\n  }, box, scaleFactor, thickness, isLTR, innerMargin = 0) {\n    this.#box = box;\n    this.#thickness = thickness * scaleFactor;\n    this.#isLTR = isLTR;\n    this.#last.set([NaN, NaN, NaN, NaN, x, y], 6);\n    this.#innerMargin = innerMargin;\n    this.#min_dist = FreeDrawOutliner.#MIN_DIST * scaleFactor;\n    this.#min = FreeDrawOutliner.#MIN * scaleFactor;\n    this.#scaleFactor = scaleFactor;\n    this.#points.push(x, y);\n  }\n  isEmpty() {\n    return isNaN(this.#last[8]);\n  }\n  #getLastCoords() {\n    const lastTop = this.#last.subarray(4, 6);\n    const lastBottom = this.#last.subarray(16, 18);\n    const [x, y, width, height] = this.#box;\n    return [(this.#lastX + (lastTop[0] - lastBottom[0]) / 2 - x) / width, (this.#lastY + (lastTop[1] - lastBottom[1]) / 2 - y) / height, (this.#lastX + (lastBottom[0] - lastTop[0]) / 2 - x) / width, (this.#lastY + (lastBottom[1] - lastTop[1]) / 2 - y) / height];\n  }\n  add({\n    x,\n    y\n  }) {\n    this.#lastX = x;\n    this.#lastY = y;\n    const [layerX, layerY, layerWidth, layerHeight] = this.#box;\n    let [x1, y1, x2, y2] = this.#last.subarray(8, 12);\n    const diffX = x - x2;\n    const diffY = y - y2;\n    const d = Math.hypot(diffX, diffY);\n    if (d < this.#min) {\n      return false;\n    }\n    const diffD = d - this.#min_dist;\n    const K = diffD / d;\n    const shiftX = K * diffX;\n    const shiftY = K * diffY;\n    let x0 = x1;\n    let y0 = y1;\n    x1 = x2;\n    y1 = y2;\n    x2 += shiftX;\n    y2 += shiftY;\n    this.#points?.push(x, y);\n    const nX = -shiftY / diffD;\n    const nY = shiftX / diffD;\n    const thX = nX * this.#thickness;\n    const thY = nY * this.#thickness;\n    this.#last.set(this.#last.subarray(2, 8), 0);\n    this.#last.set([x2 + thX, y2 + thY], 4);\n    this.#last.set(this.#last.subarray(14, 18), 12);\n    this.#last.set([x2 - thX, y2 - thY], 16);\n    if (isNaN(this.#last[6])) {\n      if (this.#top.length === 0) {\n        this.#last.set([x1 + thX, y1 + thY], 2);\n        this.#top.push(NaN, NaN, NaN, NaN, (x1 + thX - layerX) / layerWidth, (y1 + thY - layerY) / layerHeight);\n        this.#last.set([x1 - thX, y1 - thY], 14);\n        this.#bottom.push(NaN, NaN, NaN, NaN, (x1 - thX - layerX) / layerWidth, (y1 - thY - layerY) / layerHeight);\n      }\n      this.#last.set([x0, y0, x1, y1, x2, y2], 6);\n      return !this.isEmpty();\n    }\n    this.#last.set([x0, y0, x1, y1, x2, y2], 6);\n    const angle = Math.abs(Math.atan2(y0 - y1, x0 - x1) - Math.atan2(shiftY, shiftX));\n    if (angle < Math.PI / 2) {\n      [x1, y1, x2, y2] = this.#last.subarray(2, 6);\n      this.#top.push(NaN, NaN, NaN, NaN, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight);\n      [x1, y1, x0, y0] = this.#last.subarray(14, 18);\n      this.#bottom.push(NaN, NaN, NaN, NaN, ((x0 + x1) / 2 - layerX) / layerWidth, ((y0 + y1) / 2 - layerY) / layerHeight);\n      return true;\n    }\n    [x0, y0, x1, y1, x2, y2] = this.#last.subarray(0, 6);\n    this.#top.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight);\n    [x2, y2, x1, y1, x0, y0] = this.#last.subarray(12, 18);\n    this.#bottom.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight);\n    return true;\n  }\n  toSVGPath() {\n    if (this.isEmpty()) {\n      return \"\";\n    }\n    const top = this.#top;\n    const bottom = this.#bottom;\n    if (isNaN(this.#last[6]) && !this.isEmpty()) {\n      return this.#toSVGPathTwoPoints();\n    }\n    const buffer = [];\n    buffer.push(`M${top[4]} ${top[5]}`);\n    for (let i = 6; i < top.length; i += 6) {\n      if (isNaN(top[i])) {\n        buffer.push(`L${top[i + 4]} ${top[i + 5]}`);\n      } else {\n        buffer.push(`C${top[i]} ${top[i + 1]} ${top[i + 2]} ${top[i + 3]} ${top[i + 4]} ${top[i + 5]}`);\n      }\n    }\n    this.#toSVGPathEnd(buffer);\n    for (let i = bottom.length - 6; i >= 6; i -= 6) {\n      if (isNaN(bottom[i])) {\n        buffer.push(`L${bottom[i + 4]} ${bottom[i + 5]}`);\n      } else {\n        buffer.push(`C${bottom[i]} ${bottom[i + 1]} ${bottom[i + 2]} ${bottom[i + 3]} ${bottom[i + 4]} ${bottom[i + 5]}`);\n      }\n    }\n    this.#toSVGPathStart(buffer);\n    return buffer.join(\" \");\n  }\n  #toSVGPathTwoPoints() {\n    const [x, y, width, height] = this.#box;\n    const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords();\n    return `M${(this.#last[2] - x) / width} ${(this.#last[3] - y) / height} L${(this.#last[4] - x) / width} ${(this.#last[5] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(this.#last[16] - x) / width} ${(this.#last[17] - y) / height} L${(this.#last[14] - x) / width} ${(this.#last[15] - y) / height} Z`;\n  }\n  #toSVGPathStart(buffer) {\n    const bottom = this.#bottom;\n    buffer.push(`L${bottom[4]} ${bottom[5]} Z`);\n  }\n  #toSVGPathEnd(buffer) {\n    const [x, y, width, height] = this.#box;\n    const lastTop = this.#last.subarray(4, 6);\n    const lastBottom = this.#last.subarray(16, 18);\n    const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords();\n    buffer.push(`L${(lastTop[0] - x) / width} ${(lastTop[1] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(lastBottom[0] - x) / width} ${(lastBottom[1] - y) / height}`);\n  }\n  newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) {\n    return new FreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR);\n  }\n  getOutlines() {\n    const top = this.#top;\n    const bottom = this.#bottom;\n    const last = this.#last;\n    const [layerX, layerY, layerWidth, layerHeight] = this.#box;\n    const points = new Float32Array((this.#points?.length ?? 0) + 2);\n    for (let i = 0, ii = points.length - 2; i < ii; i += 2) {\n      points[i] = (this.#points[i] - layerX) / layerWidth;\n      points[i + 1] = (this.#points[i + 1] - layerY) / layerHeight;\n    }\n    points[points.length - 2] = (this.#lastX - layerX) / layerWidth;\n    points[points.length - 1] = (this.#lastY - layerY) / layerHeight;\n    if (isNaN(last[6]) && !this.isEmpty()) {\n      return this.#getOutlineTwoPoints(points);\n    }\n    const outline = new Float32Array(this.#top.length + 24 + this.#bottom.length);\n    let N = top.length;\n    for (let i = 0; i < N; i += 2) {\n      if (isNaN(top[i])) {\n        outline[i] = outline[i + 1] = NaN;\n        continue;\n      }\n      outline[i] = top[i];\n      outline[i + 1] = top[i + 1];\n    }\n    N = this.#getOutlineEnd(outline, N);\n    for (let i = bottom.length - 6; i >= 6; i -= 6) {\n      for (let j = 0; j < 6; j += 2) {\n        if (isNaN(bottom[i + j])) {\n          outline[N] = outline[N + 1] = NaN;\n          N += 2;\n          continue;\n        }\n        outline[N] = bottom[i + j];\n        outline[N + 1] = bottom[i + j + 1];\n        N += 2;\n      }\n    }\n    this.#getOutlineStart(outline, N);\n    return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR);\n  }\n  #getOutlineTwoPoints(points) {\n    const last = this.#last;\n    const [layerX, layerY, layerWidth, layerHeight] = this.#box;\n    const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords();\n    const outline = new Float32Array(36);\n    outline.set([NaN, NaN, NaN, NaN, (last[2] - layerX) / layerWidth, (last[3] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[4] - layerX) / layerWidth, (last[5] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (last[16] - layerX) / layerWidth, (last[17] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[14] - layerX) / layerWidth, (last[15] - layerY) / layerHeight], 0);\n    return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR);\n  }\n  #getOutlineStart(outline, pos) {\n    const bottom = this.#bottom;\n    outline.set([NaN, NaN, NaN, NaN, bottom[4], bottom[5]], pos);\n    return pos += 6;\n  }\n  #getOutlineEnd(outline, pos) {\n    const lastTop = this.#last.subarray(4, 6);\n    const lastBottom = this.#last.subarray(16, 18);\n    const [layerX, layerY, layerWidth, layerHeight] = this.#box;\n    const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords();\n    outline.set([NaN, NaN, NaN, NaN, (lastTop[0] - layerX) / layerWidth, (lastTop[1] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (lastBottom[0] - layerX) / layerWidth, (lastBottom[1] - layerY) / layerHeight], pos);\n    return pos += 24;\n  }\n}\nclass FreeDrawOutline extends Outline {\n  #box;\n  #bbox = new Float32Array(4);\n  #innerMargin;\n  #isLTR;\n  #points;\n  #scaleFactor;\n  #outline;\n  constructor(outline, points, box, scaleFactor, innerMargin, isLTR) {\n    super();\n    this.#outline = outline;\n    this.#points = points;\n    this.#box = box;\n    this.#scaleFactor = scaleFactor;\n    this.#innerMargin = innerMargin;\n    this.#isLTR = isLTR;\n    this.firstPoint = [NaN, NaN];\n    this.lastPoint = [NaN, NaN];\n    this.#computeMinMax(isLTR);\n    const [x, y, width, height] = this.#bbox;\n    for (let i = 0, ii = outline.length; i < ii; i += 2) {\n      outline[i] = (outline[i] - x) / width;\n      outline[i + 1] = (outline[i + 1] - y) / height;\n    }\n    for (let i = 0, ii = points.length; i < ii; i += 2) {\n      points[i] = (points[i] - x) / width;\n      points[i + 1] = (points[i + 1] - y) / height;\n    }\n  }\n  toSVGPath() {\n    const buffer = [`M${this.#outline[4]} ${this.#outline[5]}`];\n    for (let i = 6, ii = this.#outline.length; i < ii; i += 6) {\n      if (isNaN(this.#outline[i])) {\n        buffer.push(`L${this.#outline[i + 4]} ${this.#outline[i + 5]}`);\n        continue;\n      }\n      buffer.push(`C${this.#outline[i]} ${this.#outline[i + 1]} ${this.#outline[i + 2]} ${this.#outline[i + 3]} ${this.#outline[i + 4]} ${this.#outline[i + 5]}`);\n    }\n    buffer.push(\"Z\");\n    return buffer.join(\" \");\n  }\n  serialize([blX, blY, trX, trY], rotation) {\n    const width = trX - blX;\n    const height = trY - blY;\n    let outline;\n    let points;\n    switch (rotation) {\n      case 0:\n        outline = Outline._rescale(this.#outline, blX, trY, width, -height);\n        points = Outline._rescale(this.#points, blX, trY, width, -height);\n        break;\n      case 90:\n        outline = Outline._rescaleAndSwap(this.#outline, blX, blY, width, height);\n        points = Outline._rescaleAndSwap(this.#points, blX, blY, width, height);\n        break;\n      case 180:\n        outline = Outline._rescale(this.#outline, trX, blY, -width, height);\n        points = Outline._rescale(this.#points, trX, blY, -width, height);\n        break;\n      case 270:\n        outline = Outline._rescaleAndSwap(this.#outline, trX, trY, -width, -height);\n        points = Outline._rescaleAndSwap(this.#points, trX, trY, -width, -height);\n        break;\n    }\n    return {\n      outline: Array.from(outline),\n      points: [Array.from(points)]\n    };\n  }\n  #computeMinMax(isLTR) {\n    const outline = this.#outline;\n    let lastX = outline[4];\n    let lastY = outline[5];\n    const minMax = [lastX, lastY, lastX, lastY];\n    let firstPointX = lastX;\n    let firstPointY = lastY;\n    let lastPointX = lastX;\n    let lastPointY = lastY;\n    const ltrCallback = isLTR ? Math.max : Math.min;\n    const bezierBbox = new Float32Array(4);\n    for (let i = 6, ii = outline.length; i < ii; i += 6) {\n      const x = outline[i + 4],\n        y = outline[i + 5];\n      if (isNaN(outline[i])) {\n        Util.pointBoundingBox(x, y, minMax);\n        if (firstPointY > y) {\n          firstPointX = x;\n          firstPointY = y;\n        } else if (firstPointY === y) {\n          firstPointX = ltrCallback(firstPointX, x);\n        }\n        if (lastPointY < y) {\n          lastPointX = x;\n          lastPointY = y;\n        } else if (lastPointY === y) {\n          lastPointX = ltrCallback(lastPointX, x);\n        }\n      } else {\n        bezierBbox.set(BBOX_INIT, 0);\n        Util.bezierBoundingBox(lastX, lastY, ...outline.slice(i, i + 6), bezierBbox);\n        Util.rectBoundingBox(...bezierBbox, minMax);\n        if (firstPointY > bezierBbox[1]) {\n          firstPointX = bezierBbox[0];\n          firstPointY = bezierBbox[1];\n        } else if (firstPointY === bezierBbox[1]) {\n          firstPointX = ltrCallback(firstPointX, bezierBbox[0]);\n        }\n        if (lastPointY < bezierBbox[3]) {\n          lastPointX = bezierBbox[2];\n          lastPointY = bezierBbox[3];\n        } else if (lastPointY === bezierBbox[3]) {\n          lastPointX = ltrCallback(lastPointX, bezierBbox[2]);\n        }\n      }\n      lastX = x;\n      lastY = y;\n    }\n    const bbox = this.#bbox;\n    bbox[0] = minMax[0] - this.#innerMargin;\n    bbox[1] = minMax[1] - this.#innerMargin;\n    bbox[2] = minMax[2] - minMax[0] + 2 * this.#innerMargin;\n    bbox[3] = minMax[3] - minMax[1] + 2 * this.#innerMargin;\n    this.firstPoint = [firstPointX, firstPointY];\n    this.lastPoint = [lastPointX, lastPointY];\n  }\n  get box() {\n    return this.#bbox;\n  }\n  newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) {\n    return new FreeDrawOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin);\n  }\n  getNewOutline(thickness, innerMargin) {\n    const [x, y, width, height] = this.#bbox;\n    const [layerX, layerY, layerWidth, layerHeight] = this.#box;\n    const sx = width * layerWidth;\n    const sy = height * layerHeight;\n    const tx = x * layerWidth + layerX;\n    const ty = y * layerHeight + layerY;\n    const outliner = this.newOutliner({\n      x: this.#points[0] * sx + tx,\n      y: this.#points[1] * sy + ty\n    }, this.#box, this.#scaleFactor, thickness, this.#isLTR, innerMargin ?? this.#innerMargin);\n    for (let i = 2; i < this.#points.length; i += 2) {\n      outliner.add({\n        x: this.#points[i] * sx + tx,\n        y: this.#points[i + 1] * sy + ty\n      });\n    }\n    return outliner.getOutlines();\n  }\n}\n\n;// ./src/display/editor/drawers/highlight.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass HighlightOutliner {\n  #box;\n  #firstPoint;\n  #lastPoint;\n  #verticalEdges = [];\n  #intervals = [];\n  constructor(boxes, borderWidth = 0, innerMargin = 0, isLTR = true) {\n    const minMax = BBOX_INIT.slice();\n    const NUMBER_OF_DIGITS = 4;\n    const EPSILON = 10 ** -NUMBER_OF_DIGITS;\n    for (const {\n      x,\n      y,\n      width,\n      height\n    } of boxes) {\n      const x1 = Math.floor((x - borderWidth) / EPSILON) * EPSILON;\n      const x2 = Math.ceil((x + width + borderWidth) / EPSILON) * EPSILON;\n      const y1 = Math.floor((y - borderWidth) / EPSILON) * EPSILON;\n      const y2 = Math.ceil((y + height + borderWidth) / EPSILON) * EPSILON;\n      const left = [x1, y1, y2, true];\n      const right = [x2, y1, y2, false];\n      this.#verticalEdges.push(left, right);\n      Util.rectBoundingBox(x1, y1, x2, y2, minMax);\n    }\n    const bboxWidth = minMax[2] - minMax[0] + 2 * innerMargin;\n    const bboxHeight = minMax[3] - minMax[1] + 2 * innerMargin;\n    const shiftedMinX = minMax[0] - innerMargin;\n    const shiftedMinY = minMax[1] - innerMargin;\n    let firstPointX = isLTR ? -Infinity : Infinity;\n    let firstPointY = Infinity;\n    const lastEdge = this.#verticalEdges.at(isLTR ? -1 : -2);\n    const lastPoint = [lastEdge[0], lastEdge[2]];\n    for (const edge of this.#verticalEdges) {\n      const [x, y1, y2, left] = edge;\n      if (!left && isLTR) {\n        if (y1 < firstPointY) {\n          firstPointY = y1;\n          firstPointX = x;\n        } else if (y1 === firstPointY) {\n          firstPointX = Math.max(firstPointX, x);\n        }\n      } else if (left && !isLTR) {\n        if (y1 < firstPointY) {\n          firstPointY = y1;\n          firstPointX = x;\n        } else if (y1 === firstPointY) {\n          firstPointX = Math.min(firstPointX, x);\n        }\n      }\n      edge[0] = (x - shiftedMinX) / bboxWidth;\n      edge[1] = (y1 - shiftedMinY) / bboxHeight;\n      edge[2] = (y2 - shiftedMinY) / bboxHeight;\n    }\n    this.#box = new Float32Array([shiftedMinX, shiftedMinY, bboxWidth, bboxHeight]);\n    this.#firstPoint = [firstPointX, firstPointY];\n    this.#lastPoint = lastPoint;\n  }\n  getOutlines() {\n    this.#verticalEdges.sort((a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2]);\n    const outlineVerticalEdges = [];\n    for (const edge of this.#verticalEdges) {\n      if (edge[3]) {\n        outlineVerticalEdges.push(...this.#breakEdge(edge));\n        this.#insert(edge);\n      } else {\n        this.#remove(edge);\n        outlineVerticalEdges.push(...this.#breakEdge(edge));\n      }\n    }\n    return this.#getOutlines(outlineVerticalEdges);\n  }\n  #getOutlines(outlineVerticalEdges) {\n    const edges = [];\n    const allEdges = new Set();\n    for (const edge of outlineVerticalEdges) {\n      const [x, y1, y2] = edge;\n      edges.push([x, y1, edge], [x, y2, edge]);\n    }\n    edges.sort((a, b) => a[1] - b[1] || a[0] - b[0]);\n    for (let i = 0, ii = edges.length; i < ii; i += 2) {\n      const edge1 = edges[i][2];\n      const edge2 = edges[i + 1][2];\n      edge1.push(edge2);\n      edge2.push(edge1);\n      allEdges.add(edge1);\n      allEdges.add(edge2);\n    }\n    const outlines = [];\n    let outline;\n    while (allEdges.size > 0) {\n      const edge = allEdges.values().next().value;\n      let [x, y1, y2, edge1, edge2] = edge;\n      allEdges.delete(edge);\n      let lastPointX = x;\n      let lastPointY = y1;\n      outline = [x, y2];\n      outlines.push(outline);\n      while (true) {\n        let e;\n        if (allEdges.has(edge1)) {\n          e = edge1;\n        } else if (allEdges.has(edge2)) {\n          e = edge2;\n        } else {\n          break;\n        }\n        allEdges.delete(e);\n        [x, y1, y2, edge1, edge2] = e;\n        if (lastPointX !== x) {\n          outline.push(lastPointX, lastPointY, x, lastPointY === y1 ? y1 : y2);\n          lastPointX = x;\n        }\n        lastPointY = lastPointY === y1 ? y2 : y1;\n      }\n      outline.push(lastPointX, lastPointY);\n    }\n    return new HighlightOutline(outlines, this.#box, this.#firstPoint, this.#lastPoint);\n  }\n  #binarySearch(y) {\n    const array = this.#intervals;\n    let start = 0;\n    let end = array.length - 1;\n    while (start <= end) {\n      const middle = start + end >> 1;\n      const y1 = array[middle][0];\n      if (y1 === y) {\n        return middle;\n      }\n      if (y1 < y) {\n        start = middle + 1;\n      } else {\n        end = middle - 1;\n      }\n    }\n    return end + 1;\n  }\n  #insert([, y1, y2]) {\n    const index = this.#binarySearch(y1);\n    this.#intervals.splice(index, 0, [y1, y2]);\n  }\n  #remove([, y1, y2]) {\n    const index = this.#binarySearch(y1);\n    for (let i = index; i < this.#intervals.length; i++) {\n      const [start, end] = this.#intervals[i];\n      if (start !== y1) {\n        break;\n      }\n      if (start === y1 && end === y2) {\n        this.#intervals.splice(i, 1);\n        return;\n      }\n    }\n    for (let i = index - 1; i >= 0; i--) {\n      const [start, end] = this.#intervals[i];\n      if (start !== y1) {\n        break;\n      }\n      if (start === y1 && end === y2) {\n        this.#intervals.splice(i, 1);\n        return;\n      }\n    }\n  }\n  #breakEdge(edge) {\n    const [x, y1, y2] = edge;\n    const results = [[x, y1, y2]];\n    const index = this.#binarySearch(y2);\n    for (let i = 0; i < index; i++) {\n      const [start, end] = this.#intervals[i];\n      for (let j = 0, jj = results.length; j < jj; j++) {\n        const [, y3, y4] = results[j];\n        if (end <= y3 || y4 <= start) {\n          continue;\n        }\n        if (y3 >= start) {\n          if (y4 > end) {\n            results[j][1] = end;\n          } else {\n            if (jj === 1) {\n              return [];\n            }\n            results.splice(j, 1);\n            j--;\n            jj--;\n          }\n          continue;\n        }\n        results[j][2] = start;\n        if (y4 > end) {\n          results.push([x, end, y4]);\n        }\n      }\n    }\n    return results;\n  }\n}\nclass HighlightOutline extends Outline {\n  #box;\n  #outlines;\n  constructor(outlines, box, firstPoint, lastPoint) {\n    super();\n    this.#outlines = outlines;\n    this.#box = box;\n    this.firstPoint = firstPoint;\n    this.lastPoint = lastPoint;\n  }\n  toSVGPath() {\n    const buffer = [];\n    for (const polygon of this.#outlines) {\n      let [prevX, prevY] = polygon;\n      buffer.push(`M${prevX} ${prevY}`);\n      for (let i = 2; i < polygon.length; i += 2) {\n        const x = polygon[i];\n        const y = polygon[i + 1];\n        if (x === prevX) {\n          buffer.push(`V${y}`);\n          prevY = y;\n        } else if (y === prevY) {\n          buffer.push(`H${x}`);\n          prevX = x;\n        }\n      }\n      buffer.push(\"Z\");\n    }\n    return buffer.join(\" \");\n  }\n  serialize([blX, blY, trX, trY], _rotation) {\n    const outlines = [];\n    const width = trX - blX;\n    const height = trY - blY;\n    for (const outline of this.#outlines) {\n      const points = new Array(outline.length);\n      for (let i = 0; i < outline.length; i += 2) {\n        points[i] = blX + outline[i] * width;\n        points[i + 1] = trY - outline[i + 1] * height;\n      }\n      outlines.push(points);\n    }\n    return outlines;\n  }\n  get box() {\n    return this.#box;\n  }\n  get classNamesForOutlining() {\n    return [\"highlightOutline\"];\n  }\n}\nclass FreeHighlightOutliner extends FreeDrawOutliner {\n  newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) {\n    return new FreeHighlightOutline(outline, points, box, scaleFactor, innerMargin, isLTR);\n  }\n}\nclass FreeHighlightOutline extends FreeDrawOutline {\n  newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) {\n    return new FreeHighlightOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin);\n  }\n}\n\n;// ./src/display/editor/highlight.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass HighlightEditor extends AnnotationEditor {\n  #anchorNode = null;\n  #anchorOffset = 0;\n  #boxes;\n  #clipPathId = null;\n  #colorPicker = null;\n  #focusOutlines = null;\n  #focusNode = null;\n  #focusOffset = 0;\n  #highlightDiv = null;\n  #highlightOutlines = null;\n  #id = null;\n  #isFreeHighlight = false;\n  #firstPoint = null;\n  #lastPoint = null;\n  #outlineId = null;\n  #text = \"\";\n  #thickness;\n  #methodOfCreation = \"\";\n  static _defaultColor = null;\n  static _defaultOpacity = 1;\n  static _defaultThickness = 12;\n  static _type = \"highlight\";\n  static _editorType = AnnotationEditorType.HIGHLIGHT;\n  static _freeHighlightId = -1;\n  static _freeHighlight = null;\n  static _freeHighlightClipId = \"\";\n  static get _keyboardManager() {\n    const proto = HighlightEditor.prototype;\n    return shadow(this, \"_keyboardManager\", new KeyboardManager([[[\"ArrowLeft\", \"mac+ArrowLeft\"], proto._moveCaret, {\n      args: [0]\n    }], [[\"ArrowRight\", \"mac+ArrowRight\"], proto._moveCaret, {\n      args: [1]\n    }], [[\"ArrowUp\", \"mac+ArrowUp\"], proto._moveCaret, {\n      args: [2]\n    }], [[\"ArrowDown\", \"mac+ArrowDown\"], proto._moveCaret, {\n      args: [3]\n    }]]));\n  }\n  constructor(params) {\n    super({\n      ...params,\n      name: \"highlightEditor\"\n    });\n    this.color = params.color || HighlightEditor._defaultColor;\n    this.#thickness = params.thickness || HighlightEditor._defaultThickness;\n    this.opacity = params.opacity || HighlightEditor._defaultOpacity;\n    this.#boxes = params.boxes || null;\n    this.#methodOfCreation = params.methodOfCreation || \"\";\n    this.#text = params.text || \"\";\n    this._isDraggable = false;\n    this.defaultL10nId = \"pdfjs-editor-highlight-editor\";\n    if (params.highlightId > -1) {\n      this.#isFreeHighlight = true;\n      this.#createFreeOutlines(params);\n      this.#addToDrawLayer();\n    } else if (this.#boxes) {\n      this.#anchorNode = params.anchorNode;\n      this.#anchorOffset = params.anchorOffset;\n      this.#focusNode = params.focusNode;\n      this.#focusOffset = params.focusOffset;\n      this.#createOutlines();\n      this.#addToDrawLayer();\n      this.rotate(this.rotation);\n    }\n    if (!this.annotationElementId) {\n      this._uiManager.a11yAlert(\"pdfjs-editor-highlight-added-alert\");\n    }\n  }\n  get telemetryInitialData() {\n    return {\n      action: \"added\",\n      type: this.#isFreeHighlight ? \"free_highlight\" : \"highlight\",\n      color: this._uiManager.getNonHCMColorName(this.color),\n      thickness: this.#thickness,\n      methodOfCreation: this.#methodOfCreation\n    };\n  }\n  get telemetryFinalData() {\n    return {\n      type: \"highlight\",\n      color: this._uiManager.getNonHCMColorName(this.color)\n    };\n  }\n  static computeTelemetryFinalData(data) {\n    return {\n      numberOfColors: data.get(\"color\").size\n    };\n  }\n  #createOutlines() {\n    const outliner = new HighlightOutliner(this.#boxes, 0.001);\n    this.#highlightOutlines = outliner.getOutlines();\n    [this.x, this.y, this.width, this.height] = this.#highlightOutlines.box;\n    const outlinerForOutline = new HighlightOutliner(this.#boxes, 0.0025, 0.001, this._uiManager.direction === \"ltr\");\n    this.#focusOutlines = outlinerForOutline.getOutlines();\n    const {\n      firstPoint\n    } = this.#highlightOutlines;\n    this.#firstPoint = [(firstPoint[0] - this.x) / this.width, (firstPoint[1] - this.y) / this.height];\n    const {\n      lastPoint\n    } = this.#focusOutlines;\n    this.#lastPoint = [(lastPoint[0] - this.x) / this.width, (lastPoint[1] - this.y) / this.height];\n  }\n  #createFreeOutlines({\n    highlightOutlines,\n    highlightId,\n    clipPathId\n  }) {\n    this.#highlightOutlines = highlightOutlines;\n    const extraThickness = 1.5;\n    this.#focusOutlines = highlightOutlines.getNewOutline(this.#thickness / 2 + extraThickness, 0.0025);\n    if (highlightId >= 0) {\n      this.#id = highlightId;\n      this.#clipPathId = clipPathId;\n      this.parent.drawLayer.finalizeDraw(highlightId, {\n        bbox: highlightOutlines.box,\n        path: {\n          d: highlightOutlines.toSVGPath()\n        }\n      });\n      this.#outlineId = this.parent.drawLayer.drawOutline({\n        rootClass: {\n          highlightOutline: true,\n          free: true\n        },\n        bbox: this.#focusOutlines.box,\n        path: {\n          d: this.#focusOutlines.toSVGPath()\n        }\n      }, true);\n    } else if (this.parent) {\n      const angle = this.parent.viewport.rotation;\n      this.parent.drawLayer.updateProperties(this.#id, {\n        bbox: HighlightEditor.#rotateBbox(this.#highlightOutlines.box, (angle - this.rotation + 360) % 360),\n        path: {\n          d: highlightOutlines.toSVGPath()\n        }\n      });\n      this.parent.drawLayer.updateProperties(this.#outlineId, {\n        bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle),\n        path: {\n          d: this.#focusOutlines.toSVGPath()\n        }\n      });\n    }\n    const [x, y, width, height] = highlightOutlines.box;\n    switch (this.rotation) {\n      case 0:\n        this.x = x;\n        this.y = y;\n        this.width = width;\n        this.height = height;\n        break;\n      case 90:\n        {\n          const [pageWidth, pageHeight] = this.parentDimensions;\n          this.x = y;\n          this.y = 1 - x;\n          this.width = width * pageHeight / pageWidth;\n          this.height = height * pageWidth / pageHeight;\n          break;\n        }\n      case 180:\n        this.x = 1 - x;\n        this.y = 1 - y;\n        this.width = width;\n        this.height = height;\n        break;\n      case 270:\n        {\n          const [pageWidth, pageHeight] = this.parentDimensions;\n          this.x = 1 - y;\n          this.y = x;\n          this.width = width * pageHeight / pageWidth;\n          this.height = height * pageWidth / pageHeight;\n          break;\n        }\n    }\n    const {\n      firstPoint\n    } = highlightOutlines;\n    this.#firstPoint = [(firstPoint[0] - x) / width, (firstPoint[1] - y) / height];\n    const {\n      lastPoint\n    } = this.#focusOutlines;\n    this.#lastPoint = [(lastPoint[0] - x) / width, (lastPoint[1] - y) / height];\n  }\n  static initialize(l10n, uiManager) {\n    AnnotationEditor.initialize(l10n, uiManager);\n    HighlightEditor._defaultColor ||= uiManager.highlightColors?.values().next().value || \"#fff066\";\n  }\n  static updateDefaultParams(type, value) {\n    switch (type) {\n      case AnnotationEditorParamsType.HIGHLIGHT_COLOR:\n        HighlightEditor._defaultColor = value;\n        break;\n      case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS:\n        HighlightEditor._defaultThickness = value;\n        break;\n    }\n  }\n  translateInPage(x, y) {}\n  get toolbarPosition() {\n    return this.#lastPoint;\n  }\n  get commentButtonPosition() {\n    return this.#firstPoint;\n  }\n  updateParams(type, value) {\n    switch (type) {\n      case AnnotationEditorParamsType.HIGHLIGHT_COLOR:\n        this.#updateColor(value);\n        break;\n      case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS:\n        this.#updateThickness(value);\n        break;\n    }\n  }\n  static get defaultPropertiesToUpdate() {\n    return [[AnnotationEditorParamsType.HIGHLIGHT_COLOR, HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, HighlightEditor._defaultThickness]];\n  }\n  get propertiesToUpdate() {\n    return [[AnnotationEditorParamsType.HIGHLIGHT_COLOR, this.color || HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, this.#thickness || HighlightEditor._defaultThickness], [AnnotationEditorParamsType.HIGHLIGHT_FREE, this.#isFreeHighlight]];\n  }\n  onUpdatedColor() {\n    this.parent?.drawLayer.updateProperties(this.#id, {\n      root: {\n        fill: this.color,\n        \"fill-opacity\": this.opacity\n      }\n    });\n    this.#colorPicker?.updateColor(this.color);\n    super.onUpdatedColor();\n  }\n  #updateColor(color) {\n    const setColorAndOpacity = (col, opa) => {\n      this.color = col;\n      this.opacity = opa;\n      this.onUpdatedColor();\n    };\n    const savedColor = this.color;\n    const savedOpacity = this.opacity;\n    this.addCommands({\n      cmd: setColorAndOpacity.bind(this, color, HighlightEditor._defaultOpacity),\n      undo: setColorAndOpacity.bind(this, savedColor, savedOpacity),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type: AnnotationEditorParamsType.HIGHLIGHT_COLOR,\n      overwriteIfSameType: true,\n      keepUndo: true\n    });\n    this._reportTelemetry({\n      action: \"color_changed\",\n      color: this._uiManager.getNonHCMColorName(color)\n    }, true);\n  }\n  #updateThickness(thickness) {\n    const savedThickness = this.#thickness;\n    const setThickness = th => {\n      this.#thickness = th;\n      this.#changeThickness(th);\n    };\n    this.addCommands({\n      cmd: setThickness.bind(this, thickness),\n      undo: setThickness.bind(this, savedThickness),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type: AnnotationEditorParamsType.INK_THICKNESS,\n      overwriteIfSameType: true,\n      keepUndo: true\n    });\n    this._reportTelemetry({\n      action: \"thickness_changed\",\n      thickness\n    }, true);\n  }\n  get toolbarButtons() {\n    if (this._uiManager.highlightColors) {\n      const colorPicker = this.#colorPicker = new ColorPicker({\n        editor: this\n      });\n      return [[\"colorPicker\", colorPicker]];\n    }\n    return super.toolbarButtons;\n  }\n  disableEditing() {\n    super.disableEditing();\n    this.div.classList.toggle(\"disabled\", true);\n  }\n  enableEditing() {\n    super.enableEditing();\n    this.div.classList.toggle(\"disabled\", false);\n  }\n  fixAndSetPosition() {\n    return super.fixAndSetPosition(this.#getRotation());\n  }\n  getBaseTranslation() {\n    return [0, 0];\n  }\n  getRect(tx, ty) {\n    return super.getRect(tx, ty, this.#getRotation());\n  }\n  onceAdded(focus) {\n    if (!this.annotationElementId) {\n      this.parent.addUndoableEditor(this);\n    }\n    if (focus) {\n      this.div.focus();\n    }\n  }\n  remove() {\n    this.#cleanDrawLayer();\n    this._reportTelemetry({\n      action: \"deleted\"\n    });\n    super.remove();\n  }\n  rebuild() {\n    if (!this.parent) {\n      return;\n    }\n    super.rebuild();\n    if (this.div === null) {\n      return;\n    }\n    this.#addToDrawLayer();\n    if (!this.isAttachedToDOM) {\n      this.parent.add(this);\n    }\n  }\n  setParent(parent) {\n    let mustBeSelected = false;\n    if (this.parent && !parent) {\n      this.#cleanDrawLayer();\n    } else if (parent) {\n      this.#addToDrawLayer(parent);\n      mustBeSelected = !this.parent && this.div?.classList.contains(\"selectedEditor\");\n    }\n    super.setParent(parent);\n    this.show(this._isVisible);\n    if (mustBeSelected) {\n      this.select();\n    }\n  }\n  #changeThickness(thickness) {\n    if (!this.#isFreeHighlight) {\n      return;\n    }\n    this.#createFreeOutlines({\n      highlightOutlines: this.#highlightOutlines.getNewOutline(thickness / 2)\n    });\n    this.fixAndSetPosition();\n    this.setDims();\n  }\n  #cleanDrawLayer() {\n    if (this.#id === null || !this.parent) {\n      return;\n    }\n    this.parent.drawLayer.remove(this.#id);\n    this.#id = null;\n    this.parent.drawLayer.remove(this.#outlineId);\n    this.#outlineId = null;\n  }\n  #addToDrawLayer(parent = this.parent) {\n    if (this.#id !== null) {\n      return;\n    }\n    ({\n      id: this.#id,\n      clipPathId: this.#clipPathId\n    } = parent.drawLayer.draw({\n      bbox: this.#highlightOutlines.box,\n      root: {\n        viewBox: \"0 0 1 1\",\n        fill: this.color,\n        \"fill-opacity\": this.opacity\n      },\n      rootClass: {\n        highlight: true,\n        free: this.#isFreeHighlight\n      },\n      path: {\n        d: this.#highlightOutlines.toSVGPath()\n      }\n    }, false, true));\n    this.#outlineId = parent.drawLayer.drawOutline({\n      rootClass: {\n        highlightOutline: true,\n        free: this.#isFreeHighlight\n      },\n      bbox: this.#focusOutlines.box,\n      path: {\n        d: this.#focusOutlines.toSVGPath()\n      }\n    }, this.#isFreeHighlight);\n    if (this.#highlightDiv) {\n      this.#highlightDiv.style.clipPath = this.#clipPathId;\n    }\n  }\n  static #rotateBbox([x, y, width, height], angle) {\n    switch (angle) {\n      case 90:\n        return [1 - y - height, x, height, width];\n      case 180:\n        return [1 - x - width, 1 - y - height, width, height];\n      case 270:\n        return [y, 1 - x - width, height, width];\n    }\n    return [x, y, width, height];\n  }\n  rotate(angle) {\n    const {\n      drawLayer\n    } = this.parent;\n    let box;\n    if (this.#isFreeHighlight) {\n      angle = (angle - this.rotation + 360) % 360;\n      box = HighlightEditor.#rotateBbox(this.#highlightOutlines.box, angle);\n    } else {\n      box = HighlightEditor.#rotateBbox([this.x, this.y, this.width, this.height], angle);\n    }\n    drawLayer.updateProperties(this.#id, {\n      bbox: box,\n      root: {\n        \"data-main-rotation\": angle\n      }\n    });\n    drawLayer.updateProperties(this.#outlineId, {\n      bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle),\n      root: {\n        \"data-main-rotation\": angle\n      }\n    });\n  }\n  render() {\n    if (this.div) {\n      return this.div;\n    }\n    const div = super.render();\n    if (this.#text) {\n      div.setAttribute(\"aria-label\", this.#text);\n      div.setAttribute(\"role\", \"mark\");\n    }\n    if (this.#isFreeHighlight) {\n      div.classList.add(\"free\");\n    } else {\n      this.div.addEventListener(\"keydown\", this.#keydown.bind(this), {\n        signal: this._uiManager._signal\n      });\n    }\n    const highlightDiv = this.#highlightDiv = document.createElement(\"div\");\n    div.append(highlightDiv);\n    highlightDiv.setAttribute(\"aria-hidden\", \"true\");\n    highlightDiv.className = \"internal\";\n    highlightDiv.style.clipPath = this.#clipPathId;\n    this.setDims();\n    bindEvents(this, this.#highlightDiv, [\"pointerover\", \"pointerleave\"]);\n    this.enableEditing();\n    return div;\n  }\n  pointerover() {\n    if (!this.isSelected) {\n      this.parent?.drawLayer.updateProperties(this.#outlineId, {\n        rootClass: {\n          hovered: true\n        }\n      });\n    }\n  }\n  pointerleave() {\n    if (!this.isSelected) {\n      this.parent?.drawLayer.updateProperties(this.#outlineId, {\n        rootClass: {\n          hovered: false\n        }\n      });\n    }\n  }\n  #keydown(event) {\n    HighlightEditor._keyboardManager.exec(this, event);\n  }\n  _moveCaret(direction) {\n    this.parent.unselect(this);\n    switch (direction) {\n      case 0:\n      case 2:\n        this.#setCaret(true);\n        break;\n      case 1:\n      case 3:\n        this.#setCaret(false);\n        break;\n    }\n  }\n  #setCaret(start) {\n    if (!this.#anchorNode) {\n      return;\n    }\n    const selection = window.getSelection();\n    if (start) {\n      selection.setPosition(this.#anchorNode, this.#anchorOffset);\n    } else {\n      selection.setPosition(this.#focusNode, this.#focusOffset);\n    }\n  }\n  select() {\n    super.select();\n    if (!this.#outlineId) {\n      return;\n    }\n    this.parent?.drawLayer.updateProperties(this.#outlineId, {\n      rootClass: {\n        hovered: false,\n        selected: true\n      }\n    });\n  }\n  unselect() {\n    super.unselect();\n    if (!this.#outlineId) {\n      return;\n    }\n    this.parent?.drawLayer.updateProperties(this.#outlineId, {\n      rootClass: {\n        selected: false\n      }\n    });\n    if (!this.#isFreeHighlight) {\n      this.#setCaret(false);\n    }\n  }\n  get _mustFixPosition() {\n    return !this.#isFreeHighlight;\n  }\n  show(visible = this._isVisible) {\n    super.show(visible);\n    if (this.parent) {\n      this.parent.drawLayer.updateProperties(this.#id, {\n        rootClass: {\n          hidden: !visible\n        }\n      });\n      this.parent.drawLayer.updateProperties(this.#outlineId, {\n        rootClass: {\n          hidden: !visible\n        }\n      });\n    }\n  }\n  #getRotation() {\n    return this.#isFreeHighlight ? this.rotation : 0;\n  }\n  #serializeBoxes() {\n    if (this.#isFreeHighlight) {\n      return null;\n    }\n    const [pageWidth, pageHeight] = this.pageDimensions;\n    const [pageX, pageY] = this.pageTranslation;\n    const boxes = this.#boxes;\n    const quadPoints = new Float32Array(boxes.length * 8);\n    let i = 0;\n    for (const {\n      x,\n      y,\n      width,\n      height\n    } of boxes) {\n      const sx = x * pageWidth + pageX;\n      const sy = (1 - y) * pageHeight + pageY;\n      quadPoints[i] = quadPoints[i + 4] = sx;\n      quadPoints[i + 1] = quadPoints[i + 3] = sy;\n      quadPoints[i + 2] = quadPoints[i + 6] = sx + width * pageWidth;\n      quadPoints[i + 5] = quadPoints[i + 7] = sy - height * pageHeight;\n      i += 8;\n    }\n    return quadPoints;\n  }\n  #serializeOutlines(rect) {\n    return this.#highlightOutlines.serialize(rect, this.#getRotation());\n  }\n  static startHighlighting(parent, isLTR, {\n    target: textLayer,\n    x,\n    y\n  }) {\n    const {\n      x: layerX,\n      y: layerY,\n      width: parentWidth,\n      height: parentHeight\n    } = textLayer.getBoundingClientRect();\n    const ac = new AbortController();\n    const signal = parent.combinedSignal(ac);\n    const pointerUpCallback = e => {\n      ac.abort();\n      this.#endHighlight(parent, e);\n    };\n    window.addEventListener(\"blur\", pointerUpCallback, {\n      signal\n    });\n    window.addEventListener(\"pointerup\", pointerUpCallback, {\n      signal\n    });\n    window.addEventListener(\"pointerdown\", stopEvent, {\n      capture: true,\n      passive: false,\n      signal\n    });\n    window.addEventListener(\"contextmenu\", noContextMenu, {\n      signal\n    });\n    textLayer.addEventListener(\"pointermove\", this.#highlightMove.bind(this, parent), {\n      signal\n    });\n    this._freeHighlight = new FreeHighlightOutliner({\n      x,\n      y\n    }, [layerX, layerY, parentWidth, parentHeight], parent.scale, this._defaultThickness / 2, isLTR, 0.001);\n    ({\n      id: this._freeHighlightId,\n      clipPathId: this._freeHighlightClipId\n    } = parent.drawLayer.draw({\n      bbox: [0, 0, 1, 1],\n      root: {\n        viewBox: \"0 0 1 1\",\n        fill: this._defaultColor,\n        \"fill-opacity\": this._defaultOpacity\n      },\n      rootClass: {\n        highlight: true,\n        free: true\n      },\n      path: {\n        d: this._freeHighlight.toSVGPath()\n      }\n    }, true, true));\n  }\n  static #highlightMove(parent, event) {\n    if (this._freeHighlight.add(event)) {\n      parent.drawLayer.updateProperties(this._freeHighlightId, {\n        path: {\n          d: this._freeHighlight.toSVGPath()\n        }\n      });\n    }\n  }\n  static #endHighlight(parent, event) {\n    if (!this._freeHighlight.isEmpty()) {\n      parent.createAndAddNewEditor(event, false, {\n        highlightId: this._freeHighlightId,\n        highlightOutlines: this._freeHighlight.getOutlines(),\n        clipPathId: this._freeHighlightClipId,\n        methodOfCreation: \"main_toolbar\"\n      });\n    } else {\n      parent.drawLayer.remove(this._freeHighlightId);\n    }\n    this._freeHighlightId = -1;\n    this._freeHighlight = null;\n    this._freeHighlightClipId = \"\";\n  }\n  static async deserialize(data, parent, uiManager) {\n    let initialData = null;\n    if (data instanceof HighlightAnnotationElement) {\n      const {\n        data: {\n          quadPoints,\n          rect,\n          rotation,\n          id,\n          color,\n          opacity,\n          popupRef,\n          richText,\n          contentsObj,\n          creationDate,\n          modificationDate\n        },\n        parent: {\n          page: {\n            pageNumber\n          }\n        }\n      } = data;\n      initialData = data = {\n        annotationType: AnnotationEditorType.HIGHLIGHT,\n        color: Array.from(color),\n        opacity,\n        quadPoints,\n        boxes: null,\n        pageIndex: pageNumber - 1,\n        rect: rect.slice(0),\n        rotation,\n        annotationElementId: id,\n        id,\n        deleted: false,\n        popupRef,\n        richText,\n        comment: contentsObj?.str || null,\n        creationDate,\n        modificationDate\n      };\n    } else if (data instanceof InkAnnotationElement) {\n      const {\n        data: {\n          inkLists,\n          rect,\n          rotation,\n          id,\n          color,\n          borderStyle: {\n            rawWidth: thickness\n          },\n          popupRef,\n          richText,\n          contentsObj,\n          creationDate,\n          modificationDate\n        },\n        parent: {\n          page: {\n            pageNumber\n          }\n        }\n      } = data;\n      initialData = data = {\n        annotationType: AnnotationEditorType.HIGHLIGHT,\n        color: Array.from(color),\n        thickness,\n        inkLists,\n        boxes: null,\n        pageIndex: pageNumber - 1,\n        rect: rect.slice(0),\n        rotation,\n        annotationElementId: id,\n        id,\n        deleted: false,\n        popupRef,\n        richText,\n        comment: contentsObj?.str || null,\n        creationDate,\n        modificationDate\n      };\n    }\n    const {\n      color,\n      quadPoints,\n      inkLists,\n      outlines,\n      opacity\n    } = data;\n    const editor = await super.deserialize(data, parent, uiManager);\n    editor.color = Util.makeHexColor(...color);\n    editor.opacity = opacity || 1;\n    if (inkLists) {\n      editor.#thickness = data.thickness;\n    }\n    editor._initialData = initialData;\n    if (data.comment) {\n      editor.setCommentData(data);\n    }\n    const [pageWidth, pageHeight] = editor.pageDimensions;\n    const [pageX, pageY] = editor.pageTranslation;\n    if (quadPoints) {\n      const boxes = editor.#boxes = [];\n      for (let i = 0; i < quadPoints.length; i += 8) {\n        boxes.push({\n          x: (quadPoints[i] - pageX) / pageWidth,\n          y: 1 - (quadPoints[i + 1] - pageY) / pageHeight,\n          width: (quadPoints[i + 2] - quadPoints[i]) / pageWidth,\n          height: (quadPoints[i + 1] - quadPoints[i + 5]) / pageHeight\n        });\n      }\n      editor.#createOutlines();\n      editor.#addToDrawLayer();\n      editor.rotate(editor.rotation);\n    } else if (inkLists || outlines) {\n      editor.#isFreeHighlight = true;\n      const points = (inkLists || outlines.points)[0];\n      const point = {\n        x: points[0] - pageX,\n        y: pageHeight - (points[1] - pageY)\n      };\n      const outliner = new FreeHighlightOutliner(point, [0, 0, pageWidth, pageHeight], 1, editor.#thickness / 2, true, 0.001);\n      for (let i = 0, ii = points.length; i < ii; i += 2) {\n        point.x = points[i] - pageX;\n        point.y = pageHeight - (points[i + 1] - pageY);\n        outliner.add(point);\n      }\n      const {\n        id,\n        clipPathId\n      } = parent.drawLayer.draw({\n        bbox: [0, 0, 1, 1],\n        root: {\n          viewBox: \"0 0 1 1\",\n          fill: editor.color,\n          \"fill-opacity\": editor._defaultOpacity\n        },\n        rootClass: {\n          highlight: true,\n          free: true\n        },\n        path: {\n          d: outliner.toSVGPath()\n        }\n      }, true, true);\n      editor.#createFreeOutlines({\n        highlightOutlines: outliner.getOutlines(),\n        highlightId: id,\n        clipPathId\n      });\n      editor.#addToDrawLayer();\n      editor.rotate(editor.parentRotation);\n    }\n    return editor;\n  }\n  serialize(isForCopying = false) {\n    if (this.isEmpty() || isForCopying) {\n      return null;\n    }\n    if (this.deleted) {\n      return this.serializeDeleted();\n    }\n    const color = AnnotationEditor._colorManager.convert(this._uiManager.getNonHCMColor(this.color));\n    const serialized = super.serialize(isForCopying);\n    Object.assign(serialized, {\n      color,\n      opacity: this.opacity,\n      thickness: this.#thickness,\n      quadPoints: this.#serializeBoxes(),\n      outlines: this.#serializeOutlines(serialized.rect)\n    });\n    this.addComment(serialized);\n    if (this.annotationElementId && !this.#hasElementChanged(serialized)) {\n      return null;\n    }\n    serialized.id = this.annotationElementId;\n    return serialized;\n  }\n  #hasElementChanged(serialized) {\n    const {\n      color\n    } = this._initialData;\n    return this.hasEditedComment || serialized.color.some((c, i) => c !== color[i]);\n  }\n  renderAnnotationElement(annotation) {\n    if (this.deleted) {\n      annotation.hide();\n      return null;\n    }\n    annotation.updateEdited({\n      rect: this.getPDFRect(),\n      popup: this.comment\n    });\n    return null;\n  }\n  static canCreateNewEmptyEditor() {\n    return false;\n  }\n}\n\n;// ./src/display/editor/draw.js\n\n\n\n\n\n\n\n\n\n\n\n\nclass DrawingOptions {\n  #svgProperties = Object.create(null);\n  updateProperty(name, value) {\n    this[name] = value;\n    this.updateSVGProperty(name, value);\n  }\n  updateProperties(properties) {\n    if (!properties) {\n      return;\n    }\n    for (const [name, value] of Object.entries(properties)) {\n      if (!name.startsWith(\"_\")) {\n        this.updateProperty(name, value);\n      }\n    }\n  }\n  updateSVGProperty(name, value) {\n    this.#svgProperties[name] = value;\n  }\n  toSVGProperties() {\n    const root = this.#svgProperties;\n    this.#svgProperties = Object.create(null);\n    return {\n      root\n    };\n  }\n  reset() {\n    this.#svgProperties = Object.create(null);\n  }\n  updateAll(options = this) {\n    this.updateProperties(options);\n  }\n  clone() {\n    unreachable(\"Not implemented\");\n  }\n}\nclass DrawingEditor extends AnnotationEditor {\n  #drawOutlines = null;\n  #mustBeCommitted;\n  _colorPicker = null;\n  _drawId = null;\n  static _currentDrawId = -1;\n  static _currentParent = null;\n  static #currentDraw = null;\n  static #currentDrawingAC = null;\n  static #currentDrawingOptions = null;\n  static _INNER_MARGIN = 3;\n  constructor(params) {\n    super(params);\n    this.#mustBeCommitted = params.mustBeCommitted || false;\n    this._addOutlines(params);\n  }\n  onUpdatedColor() {\n    this._colorPicker?.update(this.color);\n    super.onUpdatedColor();\n  }\n  onUpdatedOpacity() {\n    this._colorPicker?.updateOpacity?.(this.opacity);\n  }\n  _addOutlines(params) {\n    if (params.drawOutlines) {\n      this.#createDrawOutlines(params);\n      this.#addToDrawLayer();\n    }\n  }\n  #createDrawOutlines({\n    drawOutlines,\n    drawId,\n    drawingOptions\n  }) {\n    this.#drawOutlines = drawOutlines;\n    this._drawingOptions ||= drawingOptions;\n    if (!this.annotationElementId) {\n      this._uiManager.a11yAlert(`pdfjs-editor-${this.editorType}-added-alert`);\n    }\n    if (drawId >= 0) {\n      this._drawId = drawId;\n      this.parent.drawLayer.finalizeDraw(drawId, drawOutlines.defaultProperties);\n    } else {\n      this._drawId = this.#createDrawing(drawOutlines, this.parent);\n    }\n    this.#updateBbox(drawOutlines.box);\n  }\n  #createDrawing(drawOutlines, parent) {\n    const {\n      id\n    } = parent.drawLayer.draw(DrawingEditor._mergeSVGProperties(this._drawingOptions.toSVGProperties(), drawOutlines.defaultSVGProperties), false, false);\n    return id;\n  }\n  static _mergeSVGProperties(p1, p2) {\n    const p1Keys = new Set(Object.keys(p1));\n    for (const [key, value] of Object.entries(p2)) {\n      if (p1Keys.has(key)) {\n        Object.assign(p1[key], value);\n      } else {\n        p1[key] = value;\n      }\n    }\n    return p1;\n  }\n  static getDefaultDrawingOptions(_options) {\n    unreachable(\"Not implemented\");\n  }\n  static get typesMap() {\n    unreachable(\"Not implemented\");\n  }\n  static get isDrawer() {\n    return true;\n  }\n  static get supportMultipleDrawings() {\n    return false;\n  }\n  static updateDefaultParams(type, value) {\n    const propertyName = this.typesMap.get(type);\n    if (propertyName) {\n      this._defaultDrawingOptions.updateProperty(propertyName, value);\n    }\n    if (this._currentParent) {\n      DrawingEditor.#currentDraw.updateProperty(propertyName, value);\n      this._currentParent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties());\n    }\n  }\n  updateParams(type, value) {\n    const propertyName = this.constructor.typesMap.get(type);\n    if (propertyName) {\n      this._updateProperty(type, propertyName, value);\n    }\n  }\n  static get defaultPropertiesToUpdate() {\n    const properties = [];\n    const options = this._defaultDrawingOptions;\n    for (const [type, name] of this.typesMap) {\n      properties.push([type, options[name]]);\n    }\n    return properties;\n  }\n  get propertiesToUpdate() {\n    const properties = [];\n    const {\n      _drawingOptions\n    } = this;\n    for (const [type, name] of this.constructor.typesMap) {\n      properties.push([type, _drawingOptions[name]]);\n    }\n    return properties;\n  }\n  _updateProperty(type, name, value) {\n    const options = this._drawingOptions;\n    const savedValue = options[name];\n    const setter = val => {\n      options.updateProperty(name, val);\n      const bbox = this.#drawOutlines.updateProperty(name, val);\n      if (bbox) {\n        this.#updateBbox(bbox);\n      }\n      this.parent?.drawLayer.updateProperties(this._drawId, options.toSVGProperties());\n      if (type === this.colorType) {\n        this.onUpdatedColor();\n      } else if (type === this.opacityType) {\n        this.onUpdatedOpacity();\n      }\n    };\n    this.addCommands({\n      cmd: setter.bind(this, value),\n      undo: setter.bind(this, savedValue),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type,\n      overwriteIfSameType: true,\n      keepUndo: true\n    });\n  }\n  _updateColorAndOpacity(color, opacity) {\n    const colorName = this.constructor.typesMap.get(this.colorType);\n    const opacityName = this.constructor.typesMap.get(this.opacityType);\n    const options = this._drawingOptions;\n    const savedColor = options[colorName];\n    const savedOpacity = options[opacityName];\n    const setter = (c, op) => {\n      options.updateProperty(colorName, c);\n      options.updateProperty(opacityName, op);\n      this.#drawOutlines.updateProperty(colorName, c);\n      this.#drawOutlines.updateProperty(opacityName, op);\n      this.parent?.drawLayer.updateProperties(this._drawId, options.toSVGProperties());\n      this.onUpdatedColor();\n      this.onUpdatedOpacity();\n    };\n    this.addCommands({\n      cmd: setter.bind(this, color, opacity),\n      undo: setter.bind(this, savedColor, savedOpacity),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type: AnnotationEditorParamsType.INK_COLOR_AND_OPACITY,\n      overwriteIfSameType: true,\n      keepUndo: true\n    });\n  }\n  _onResizing() {\n    this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathResizingSVGProperties(this.#convertToDrawSpace()), {\n      bbox: this.#rotateBox()\n    }));\n  }\n  _onResized() {\n    this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathResizedSVGProperties(this.#convertToDrawSpace()), {\n      bbox: this.#rotateBox()\n    }));\n  }\n  _onTranslating(_x, _y) {\n    this.parent?.drawLayer.updateProperties(this._drawId, {\n      bbox: this.#rotateBox()\n    });\n  }\n  _onTranslated() {\n    this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathTranslatedSVGProperties(this.#convertToDrawSpace(), this.parentDimensions), {\n      bbox: this.#rotateBox()\n    }));\n  }\n  _onStartDragging() {\n    this.parent?.drawLayer.updateProperties(this._drawId, {\n      rootClass: {\n        moving: true\n      }\n    });\n  }\n  _onStopDragging() {\n    this.parent?.drawLayer.updateProperties(this._drawId, {\n      rootClass: {\n        moving: false\n      }\n    });\n  }\n  commit() {\n    super.commit();\n    this.disableEditMode();\n    this.disableEditing();\n  }\n  disableEditing() {\n    super.disableEditing();\n    this.div.classList.toggle(\"disabled\", true);\n  }\n  enableEditing() {\n    super.enableEditing();\n    this.div.classList.toggle(\"disabled\", false);\n  }\n  getBaseTranslation() {\n    return [0, 0];\n  }\n  get isResizable() {\n    return true;\n  }\n  onceAdded(focus) {\n    if (!this.annotationElementId) {\n      this.parent.addUndoableEditor(this);\n    }\n    this._isDraggable = true;\n    if (this.#mustBeCommitted) {\n      this.#mustBeCommitted = false;\n      this.commit();\n      this.parent.setSelected(this);\n      if (focus && this.isOnScreen) {\n        this.div.focus();\n      }\n    }\n  }\n  remove() {\n    this.#cleanDrawLayer();\n    super.remove();\n  }\n  rebuild() {\n    if (!this.parent) {\n      return;\n    }\n    super.rebuild();\n    if (this.div === null) {\n      return;\n    }\n    this.#addToDrawLayer();\n    this.#updateBbox(this.#drawOutlines.box);\n    if (!this.isAttachedToDOM) {\n      this.parent.add(this);\n    }\n  }\n  setParent(parent) {\n    let mustBeSelected = false;\n    if (this.parent && !parent) {\n      this._uiManager.removeShouldRescale(this);\n      this.#cleanDrawLayer();\n    } else if (parent) {\n      this._uiManager.addShouldRescale(this);\n      this.#addToDrawLayer(parent);\n      mustBeSelected = !this.parent && this.div?.classList.contains(\"selectedEditor\");\n    }\n    super.setParent(parent);\n    if (mustBeSelected) {\n      this.select();\n    }\n  }\n  #cleanDrawLayer() {\n    if (this._drawId === null || !this.parent) {\n      return;\n    }\n    this.parent.drawLayer.remove(this._drawId);\n    this._drawId = null;\n    this._drawingOptions.reset();\n  }\n  #addToDrawLayer(parent = this.parent) {\n    if (this._drawId !== null && this.parent === parent) {\n      return;\n    }\n    if (this._drawId !== null) {\n      this.parent.drawLayer.updateParent(this._drawId, parent.drawLayer);\n      return;\n    }\n    this._drawingOptions.updateAll();\n    this._drawId = this.#createDrawing(this.#drawOutlines, parent);\n  }\n  #convertToParentSpace([x, y, width, height]) {\n    const {\n      parentDimensions: [pW, pH],\n      rotation\n    } = this;\n    switch (rotation) {\n      case 90:\n        return [y, 1 - x, width * (pH / pW), height * (pW / pH)];\n      case 180:\n        return [1 - x, 1 - y, width, height];\n      case 270:\n        return [1 - y, x, width * (pH / pW), height * (pW / pH)];\n      default:\n        return [x, y, width, height];\n    }\n  }\n  #convertToDrawSpace() {\n    const {\n      x,\n      y,\n      width,\n      height,\n      parentDimensions: [pW, pH],\n      rotation\n    } = this;\n    switch (rotation) {\n      case 90:\n        return [1 - y, x, width * (pW / pH), height * (pH / pW)];\n      case 180:\n        return [1 - x, 1 - y, width, height];\n      case 270:\n        return [y, 1 - x, width * (pW / pH), height * (pH / pW)];\n      default:\n        return [x, y, width, height];\n    }\n  }\n  #updateBbox(bbox) {\n    [this.x, this.y, this.width, this.height] = this.#convertToParentSpace(bbox);\n    if (this.div) {\n      this.fixAndSetPosition();\n      this.setDims();\n    }\n    this._onResized();\n  }\n  #rotateBox() {\n    const {\n      x,\n      y,\n      width,\n      height,\n      rotation,\n      parentRotation,\n      parentDimensions: [pW, pH]\n    } = this;\n    switch ((rotation * 4 + parentRotation) / 90) {\n      case 1:\n        return [1 - y - height, x, height, width];\n      case 2:\n        return [1 - x - width, 1 - y - height, width, height];\n      case 3:\n        return [y, 1 - x - width, height, width];\n      case 4:\n        return [x, y - width * (pW / pH), height * (pH / pW), width * (pW / pH)];\n      case 5:\n        return [1 - y, x, width * (pW / pH), height * (pH / pW)];\n      case 6:\n        return [1 - x - height * (pH / pW), 1 - y, height * (pH / pW), width * (pW / pH)];\n      case 7:\n        return [y - width * (pW / pH), 1 - x - height * (pH / pW), width * (pW / pH), height * (pH / pW)];\n      case 8:\n        return [x - width, y - height, width, height];\n      case 9:\n        return [1 - y, x - width, height, width];\n      case 10:\n        return [1 - x, 1 - y, width, height];\n      case 11:\n        return [y - height, 1 - x, height, width];\n      case 12:\n        return [x - height * (pH / pW), y, height * (pH / pW), width * (pW / pH)];\n      case 13:\n        return [1 - y - width * (pW / pH), x - height * (pH / pW), width * (pW / pH), height * (pH / pW)];\n      case 14:\n        return [1 - x, 1 - y - width * (pW / pH), height * (pH / pW), width * (pW / pH)];\n      case 15:\n        return [y, 1 - x, width * (pW / pH), height * (pH / pW)];\n      default:\n        return [x, y, width, height];\n    }\n  }\n  rotate() {\n    if (!this.parent) {\n      return;\n    }\n    this.parent.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties({\n      bbox: this.#rotateBox()\n    }, this.#drawOutlines.updateRotation((this.parentRotation - this.rotation + 360) % 360)));\n  }\n  onScaleChanging() {\n    if (!this.parent) {\n      return;\n    }\n    this.#updateBbox(this.#drawOutlines.updateParentDimensions(this.parentDimensions, this.parent.scale));\n  }\n  static onScaleChangingWhenDrawing() {}\n  render() {\n    if (this.div) {\n      return this.div;\n    }\n    let baseX, baseY;\n    if (this._isCopy) {\n      baseX = this.x;\n      baseY = this.y;\n    }\n    const div = super.render();\n    div.classList.add(\"draw\");\n    const drawDiv = document.createElement(\"div\");\n    div.append(drawDiv);\n    drawDiv.setAttribute(\"aria-hidden\", \"true\");\n    drawDiv.className = \"internal\";\n    this.setDims();\n    this._uiManager.addShouldRescale(this);\n    this.disableEditing();\n    if (this._isCopy) {\n      this._moveAfterPaste(baseX, baseY);\n    }\n    return div;\n  }\n  static createDrawerInstance(_x, _y, _parentWidth, _parentHeight, _rotation) {\n    unreachable(\"Not implemented\");\n  }\n  static startDrawing(parent, uiManager, _isLTR, event) {\n    const {\n      target,\n      offsetX: x,\n      offsetY: y,\n      pointerId,\n      pointerType\n    } = event;\n    if (CurrentPointers.isInitializedAndDifferentPointerType(pointerType)) {\n      return;\n    }\n    const {\n      viewport: {\n        rotation\n      }\n    } = parent;\n    const {\n      width: parentWidth,\n      height: parentHeight\n    } = target.getBoundingClientRect();\n    const ac = DrawingEditor.#currentDrawingAC = new AbortController();\n    const signal = parent.combinedSignal(ac);\n    CurrentPointers.setPointer(pointerType, pointerId);\n    window.addEventListener(\"pointerup\", e => {\n      if (CurrentPointers.isSamePointerIdOrRemove(e.pointerId)) {\n        this._endDraw(e);\n      }\n    }, {\n      signal\n    });\n    window.addEventListener(\"pointercancel\", e => {\n      if (CurrentPointers.isSamePointerIdOrRemove(e.pointerId)) {\n        this._currentParent.endDrawingSession();\n      }\n    }, {\n      signal\n    });\n    window.addEventListener(\"pointerdown\", e => {\n      if (!CurrentPointers.isSamePointerType(e.pointerType)) {\n        return;\n      }\n      CurrentPointers.initializeAndAddPointerId(e.pointerId);\n      if (DrawingEditor.#currentDraw.isCancellable()) {\n        DrawingEditor.#currentDraw.removeLastElement();\n        if (DrawingEditor.#currentDraw.isEmpty()) {\n          this._currentParent.endDrawingSession(true);\n        } else {\n          this._endDraw(null);\n        }\n      }\n    }, {\n      capture: true,\n      passive: false,\n      signal\n    });\n    window.addEventListener(\"contextmenu\", noContextMenu, {\n      signal\n    });\n    target.addEventListener(\"pointermove\", this._drawMove.bind(this), {\n      signal\n    });\n    target.addEventListener(\"touchmove\", e => {\n      if (CurrentPointers.isSameTimeStamp(e.timeStamp)) {\n        stopEvent(e);\n      }\n    }, {\n      signal\n    });\n    parent.toggleDrawing();\n    uiManager._editorUndoBar?.hide();\n    if (DrawingEditor.#currentDraw) {\n      parent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.startNew(x, y, parentWidth, parentHeight, rotation));\n      return;\n    }\n    uiManager.updateUIForDefaultProperties(this);\n    DrawingEditor.#currentDraw = this.createDrawerInstance(x, y, parentWidth, parentHeight, rotation);\n    DrawingEditor.#currentDrawingOptions = this.getDefaultDrawingOptions();\n    this._currentParent = parent;\n    ({\n      id: this._currentDrawId\n    } = parent.drawLayer.draw(this._mergeSVGProperties(DrawingEditor.#currentDrawingOptions.toSVGProperties(), DrawingEditor.#currentDraw.defaultSVGProperties), true, false));\n  }\n  static _drawMove(event) {\n    CurrentPointers.isSameTimeStamp(event.timeStamp);\n    if (!DrawingEditor.#currentDraw) {\n      return;\n    }\n    const {\n      offsetX,\n      offsetY,\n      pointerId\n    } = event;\n    if (!CurrentPointers.isSamePointerId(pointerId)) {\n      return;\n    }\n    if (CurrentPointers.isUsingMultiplePointers()) {\n      this._endDraw(event);\n      return;\n    }\n    this._currentParent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.add(offsetX, offsetY));\n    CurrentPointers.setTimeStamp(event.timeStamp);\n    stopEvent(event);\n  }\n  static _cleanup(all) {\n    if (all) {\n      this._currentDrawId = -1;\n      this._currentParent = null;\n      DrawingEditor.#currentDraw = null;\n      DrawingEditor.#currentDrawingOptions = null;\n      CurrentPointers.clearTimeStamp();\n    }\n    if (DrawingEditor.#currentDrawingAC) {\n      DrawingEditor.#currentDrawingAC.abort();\n      DrawingEditor.#currentDrawingAC = null;\n      CurrentPointers.clearPointerIds();\n    }\n  }\n  static _endDraw(event) {\n    const parent = this._currentParent;\n    if (!parent) {\n      return;\n    }\n    parent.toggleDrawing(true);\n    this._cleanup(false);\n    if (event?.target === parent.div) {\n      parent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.end(event.offsetX, event.offsetY));\n    }\n    if (this.supportMultipleDrawings) {\n      const draw = DrawingEditor.#currentDraw;\n      const drawId = this._currentDrawId;\n      const lastElement = draw.getLastElement();\n      parent.addCommands({\n        cmd: () => {\n          parent.drawLayer.updateProperties(drawId, draw.setLastElement(lastElement));\n        },\n        undo: () => {\n          parent.drawLayer.updateProperties(drawId, draw.removeLastElement());\n        },\n        mustExec: false,\n        type: AnnotationEditorParamsType.DRAW_STEP\n      });\n      return;\n    }\n    this.endDrawing(false);\n  }\n  static endDrawing(isAborted) {\n    const parent = this._currentParent;\n    if (!parent) {\n      return null;\n    }\n    parent.toggleDrawing(true);\n    parent.cleanUndoStack(AnnotationEditorParamsType.DRAW_STEP);\n    if (!DrawingEditor.#currentDraw.isEmpty()) {\n      const {\n        pageDimensions: [pageWidth, pageHeight],\n        scale\n      } = parent;\n      const editor = parent.createAndAddNewEditor({\n        offsetX: 0,\n        offsetY: 0\n      }, false, {\n        drawId: this._currentDrawId,\n        drawOutlines: DrawingEditor.#currentDraw.getOutlines(pageWidth * scale, pageHeight * scale, scale, this._INNER_MARGIN),\n        drawingOptions: DrawingEditor.#currentDrawingOptions,\n        mustBeCommitted: !isAborted\n      });\n      this._cleanup(true);\n      return editor;\n    }\n    parent.drawLayer.remove(this._currentDrawId);\n    this._cleanup(true);\n    return null;\n  }\n  createDrawingOptions(_data) {}\n  static deserializeDraw(_pageX, _pageY, _pageWidth, _pageHeight, _innerWidth, _data) {\n    unreachable(\"Not implemented\");\n  }\n  static async deserialize(data, parent, uiManager) {\n    const {\n      rawDims: {\n        pageWidth,\n        pageHeight,\n        pageX,\n        pageY\n      }\n    } = parent.viewport;\n    const drawOutlines = this.deserializeDraw(pageX, pageY, pageWidth, pageHeight, this._INNER_MARGIN, data);\n    const editor = await super.deserialize(data, parent, uiManager);\n    editor.createDrawingOptions(data);\n    editor.#createDrawOutlines({\n      drawOutlines\n    });\n    editor.#addToDrawLayer();\n    editor.onScaleChanging();\n    editor.rotate();\n    return editor;\n  }\n  serializeDraw(isForCopying) {\n    const [pageX, pageY] = this.pageTranslation;\n    const [pageWidth, pageHeight] = this.pageDimensions;\n    return this.#drawOutlines.serialize([pageX, pageY, pageWidth, pageHeight], isForCopying);\n  }\n  renderAnnotationElement(annotation) {\n    annotation.updateEdited({\n      rect: this.getPDFRect()\n    });\n    return null;\n  }\n  static canCreateNewEmptyEditor() {\n    return false;\n  }\n}\n\n;// ./src/display/editor/drawers/inkdraw.js\n\n\n\n\n\n\n\n\n\n\nclass InkDrawOutliner {\n  #last = new Float64Array(6);\n  #line;\n  #lines;\n  #rotation;\n  #thickness;\n  #points;\n  #lastSVGPath = \"\";\n  #lastIndex = 0;\n  #outlines = new InkDrawOutline();\n  #parentWidth;\n  #parentHeight;\n  constructor(x, y, parentWidth, parentHeight, rotation, thickness) {\n    this.#parentWidth = parentWidth;\n    this.#parentHeight = parentHeight;\n    this.#rotation = rotation;\n    this.#thickness = thickness;\n    [x, y] = this.#normalizePoint(x, y);\n    const line = this.#line = [NaN, NaN, NaN, NaN, x, y];\n    this.#points = [x, y];\n    this.#lines = [{\n      line,\n      points: this.#points\n    }];\n    this.#last.set(line, 0);\n  }\n  updateProperty(name, value) {\n    if (name === \"stroke-width\") {\n      this.#thickness = value;\n    }\n  }\n  #normalizePoint(x, y) {\n    return Outline._normalizePoint(x, y, this.#parentWidth, this.#parentHeight, this.#rotation);\n  }\n  isEmpty() {\n    return !this.#lines || this.#lines.length === 0;\n  }\n  isCancellable() {\n    return this.#points.length <= 10;\n  }\n  add(x, y) {\n    [x, y] = this.#normalizePoint(x, y);\n    const [x1, y1, x2, y2] = this.#last.subarray(2, 6);\n    const diffX = x - x2;\n    const diffY = y - y2;\n    const d = Math.hypot(this.#parentWidth * diffX, this.#parentHeight * diffY);\n    if (d <= 2) {\n      return null;\n    }\n    this.#points.push(x, y);\n    if (isNaN(x1)) {\n      this.#last.set([x2, y2, x, y], 2);\n      this.#line.push(NaN, NaN, NaN, NaN, x, y);\n      return {\n        path: {\n          d: this.toSVGPath()\n        }\n      };\n    }\n    if (isNaN(this.#last[0])) {\n      this.#line.splice(6, 6);\n    }\n    this.#last.set([x1, y1, x2, y2, x, y], 0);\n    this.#line.push(...Outline.createBezierPoints(x1, y1, x2, y2, x, y));\n    return {\n      path: {\n        d: this.toSVGPath()\n      }\n    };\n  }\n  end(x, y) {\n    const change = this.add(x, y);\n    if (change) {\n      return change;\n    }\n    if (this.#points.length === 2) {\n      return {\n        path: {\n          d: this.toSVGPath()\n        }\n      };\n    }\n    return null;\n  }\n  startNew(x, y, parentWidth, parentHeight, rotation) {\n    this.#parentWidth = parentWidth;\n    this.#parentHeight = parentHeight;\n    this.#rotation = rotation;\n    [x, y] = this.#normalizePoint(x, y);\n    const line = this.#line = [NaN, NaN, NaN, NaN, x, y];\n    this.#points = [x, y];\n    const last = this.#lines.at(-1);\n    if (last) {\n      last.line = new Float32Array(last.line);\n      last.points = new Float32Array(last.points);\n    }\n    this.#lines.push({\n      line,\n      points: this.#points\n    });\n    this.#last.set(line, 0);\n    this.#lastIndex = 0;\n    this.toSVGPath();\n    return null;\n  }\n  getLastElement() {\n    return this.#lines.at(-1);\n  }\n  setLastElement(element) {\n    if (!this.#lines) {\n      return this.#outlines.setLastElement(element);\n    }\n    this.#lines.push(element);\n    this.#line = element.line;\n    this.#points = element.points;\n    this.#lastIndex = 0;\n    return {\n      path: {\n        d: this.toSVGPath()\n      }\n    };\n  }\n  removeLastElement() {\n    if (!this.#lines) {\n      return this.#outlines.removeLastElement();\n    }\n    this.#lines.pop();\n    this.#lastSVGPath = \"\";\n    for (let i = 0, ii = this.#lines.length; i < ii; i++) {\n      const {\n        line,\n        points\n      } = this.#lines[i];\n      this.#line = line;\n      this.#points = points;\n      this.#lastIndex = 0;\n      this.toSVGPath();\n    }\n    return {\n      path: {\n        d: this.#lastSVGPath\n      }\n    };\n  }\n  toSVGPath() {\n    const firstX = Outline.svgRound(this.#line[4]);\n    const firstY = Outline.svgRound(this.#line[5]);\n    if (this.#points.length === 2) {\n      this.#lastSVGPath = `${this.#lastSVGPath} M ${firstX} ${firstY} Z`;\n      return this.#lastSVGPath;\n    }\n    if (this.#points.length <= 6) {\n      const i = this.#lastSVGPath.lastIndexOf(\"M\");\n      this.#lastSVGPath = `${this.#lastSVGPath.slice(0, i)} M ${firstX} ${firstY}`;\n      this.#lastIndex = 6;\n    }\n    if (this.#points.length === 4) {\n      const secondX = Outline.svgRound(this.#line[10]);\n      const secondY = Outline.svgRound(this.#line[11]);\n      this.#lastSVGPath = `${this.#lastSVGPath} L ${secondX} ${secondY}`;\n      this.#lastIndex = 12;\n      return this.#lastSVGPath;\n    }\n    const buffer = [];\n    if (this.#lastIndex === 0) {\n      buffer.push(`M ${firstX} ${firstY}`);\n      this.#lastIndex = 6;\n    }\n    for (let i = this.#lastIndex, ii = this.#line.length; i < ii; i += 6) {\n      const [c1x, c1y, c2x, c2y, x, y] = this.#line.slice(i, i + 6).map(Outline.svgRound);\n      buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`);\n    }\n    this.#lastSVGPath += buffer.join(\" \");\n    this.#lastIndex = this.#line.length;\n    return this.#lastSVGPath;\n  }\n  getOutlines(parentWidth, parentHeight, scale, innerMargin) {\n    const last = this.#lines.at(-1);\n    last.line = new Float32Array(last.line);\n    last.points = new Float32Array(last.points);\n    this.#outlines.build(this.#lines, parentWidth, parentHeight, scale, this.#rotation, this.#thickness, innerMargin);\n    this.#last = null;\n    this.#line = null;\n    this.#lines = null;\n    this.#lastSVGPath = null;\n    return this.#outlines;\n  }\n  get defaultSVGProperties() {\n    return {\n      root: {\n        viewBox: \"0 0 10000 10000\"\n      },\n      rootClass: {\n        draw: true\n      },\n      bbox: [0, 0, 1, 1]\n    };\n  }\n}\nclass InkDrawOutline extends Outline {\n  #bbox;\n  #currentRotation = 0;\n  #innerMargin;\n  #lines;\n  #parentWidth;\n  #parentHeight;\n  #parentScale;\n  #rotation;\n  #thickness;\n  build(lines, parentWidth, parentHeight, parentScale, rotation, thickness, innerMargin) {\n    this.#parentWidth = parentWidth;\n    this.#parentHeight = parentHeight;\n    this.#parentScale = parentScale;\n    this.#rotation = rotation;\n    this.#thickness = thickness;\n    this.#innerMargin = innerMargin ?? 0;\n    this.#lines = lines;\n    this.#computeBbox();\n  }\n  get thickness() {\n    return this.#thickness;\n  }\n  setLastElement(element) {\n    this.#lines.push(element);\n    return {\n      path: {\n        d: this.toSVGPath()\n      }\n    };\n  }\n  removeLastElement() {\n    this.#lines.pop();\n    return {\n      path: {\n        d: this.toSVGPath()\n      }\n    };\n  }\n  toSVGPath() {\n    const buffer = [];\n    for (const {\n      line\n    } of this.#lines) {\n      buffer.push(`M${Outline.svgRound(line[4])} ${Outline.svgRound(line[5])}`);\n      if (line.length === 6) {\n        buffer.push(\"Z\");\n        continue;\n      }\n      if (line.length === 12 && isNaN(line[6])) {\n        buffer.push(`L${Outline.svgRound(line[10])} ${Outline.svgRound(line[11])}`);\n        continue;\n      }\n      for (let i = 6, ii = line.length; i < ii; i += 6) {\n        const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6).map(Outline.svgRound);\n        buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`);\n      }\n    }\n    return buffer.join(\"\");\n  }\n  serialize([pageX, pageY, pageWidth, pageHeight], isForCopying) {\n    const serializedLines = [];\n    const serializedPoints = [];\n    const [x, y, width, height] = this.#getBBoxWithNoMargin();\n    let tx, ty, sx, sy, x1, y1, x2, y2, rescaleFn;\n    switch (this.#rotation) {\n      case 0:\n        rescaleFn = Outline._rescale;\n        tx = pageX;\n        ty = pageY + pageHeight;\n        sx = pageWidth;\n        sy = -pageHeight;\n        x1 = pageX + x * pageWidth;\n        y1 = pageY + (1 - y - height) * pageHeight;\n        x2 = pageX + (x + width) * pageWidth;\n        y2 = pageY + (1 - y) * pageHeight;\n        break;\n      case 90:\n        rescaleFn = Outline._rescaleAndSwap;\n        tx = pageX;\n        ty = pageY;\n        sx = pageWidth;\n        sy = pageHeight;\n        x1 = pageX + y * pageWidth;\n        y1 = pageY + x * pageHeight;\n        x2 = pageX + (y + height) * pageWidth;\n        y2 = pageY + (x + width) * pageHeight;\n        break;\n      case 180:\n        rescaleFn = Outline._rescale;\n        tx = pageX + pageWidth;\n        ty = pageY;\n        sx = -pageWidth;\n        sy = pageHeight;\n        x1 = pageX + (1 - x - width) * pageWidth;\n        y1 = pageY + y * pageHeight;\n        x2 = pageX + (1 - x) * pageWidth;\n        y2 = pageY + (y + height) * pageHeight;\n        break;\n      case 270:\n        rescaleFn = Outline._rescaleAndSwap;\n        tx = pageX + pageWidth;\n        ty = pageY + pageHeight;\n        sx = -pageWidth;\n        sy = -pageHeight;\n        x1 = pageX + (1 - y - height) * pageWidth;\n        y1 = pageY + (1 - x - width) * pageHeight;\n        x2 = pageX + (1 - y) * pageWidth;\n        y2 = pageY + (1 - x) * pageHeight;\n        break;\n    }\n    for (const {\n      line,\n      points\n    } of this.#lines) {\n      serializedLines.push(rescaleFn(line, tx, ty, sx, sy, isForCopying ? new Array(line.length) : null));\n      serializedPoints.push(rescaleFn(points, tx, ty, sx, sy, isForCopying ? new Array(points.length) : null));\n    }\n    return {\n      lines: serializedLines,\n      points: serializedPoints,\n      rect: [x1, y1, x2, y2]\n    };\n  }\n  static deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, {\n    paths: {\n      lines,\n      points\n    },\n    rotation,\n    thickness\n  }) {\n    const newLines = [];\n    let tx, ty, sx, sy, rescaleFn;\n    switch (rotation) {\n      case 0:\n        rescaleFn = Outline._rescale;\n        tx = -pageX / pageWidth;\n        ty = pageY / pageHeight + 1;\n        sx = 1 / pageWidth;\n        sy = -1 / pageHeight;\n        break;\n      case 90:\n        rescaleFn = Outline._rescaleAndSwap;\n        tx = -pageY / pageHeight;\n        ty = -pageX / pageWidth;\n        sx = 1 / pageHeight;\n        sy = 1 / pageWidth;\n        break;\n      case 180:\n        rescaleFn = Outline._rescale;\n        tx = pageX / pageWidth + 1;\n        ty = -pageY / pageHeight;\n        sx = -1 / pageWidth;\n        sy = 1 / pageHeight;\n        break;\n      case 270:\n        rescaleFn = Outline._rescaleAndSwap;\n        tx = pageY / pageHeight + 1;\n        ty = pageX / pageWidth + 1;\n        sx = -1 / pageHeight;\n        sy = -1 / pageWidth;\n        break;\n    }\n    if (!lines) {\n      lines = [];\n      for (const point of points) {\n        const len = point.length;\n        if (len === 2) {\n          lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1]]));\n          continue;\n        }\n        if (len === 4) {\n          lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1], NaN, NaN, NaN, NaN, point[2], point[3]]));\n          continue;\n        }\n        const line = new Float32Array(3 * (len - 2));\n        lines.push(line);\n        let [x1, y1, x2, y2] = point.subarray(0, 4);\n        line.set([NaN, NaN, NaN, NaN, x1, y1], 0);\n        for (let i = 4; i < len; i += 2) {\n          const x = point[i];\n          const y = point[i + 1];\n          line.set(Outline.createBezierPoints(x1, y1, x2, y2, x, y), (i - 2) * 3);\n          [x1, y1, x2, y2] = [x2, y2, x, y];\n        }\n      }\n    }\n    for (let i = 0, ii = lines.length; i < ii; i++) {\n      newLines.push({\n        line: rescaleFn(lines[i].map(x => x ?? NaN), tx, ty, sx, sy),\n        points: rescaleFn(points[i].map(x => x ?? NaN), tx, ty, sx, sy)\n      });\n    }\n    const outlines = new this.prototype.constructor();\n    outlines.build(newLines, pageWidth, pageHeight, 1, rotation, thickness, innerMargin);\n    return outlines;\n  }\n  #getMarginComponents(thickness = this.#thickness) {\n    const margin = this.#innerMargin + thickness / 2 * this.#parentScale;\n    return this.#rotation % 180 === 0 ? [margin / this.#parentWidth, margin / this.#parentHeight] : [margin / this.#parentHeight, margin / this.#parentWidth];\n  }\n  #getBBoxWithNoMargin() {\n    const [x, y, width, height] = this.#bbox;\n    const [marginX, marginY] = this.#getMarginComponents(0);\n    return [x + marginX, y + marginY, width - 2 * marginX, height - 2 * marginY];\n  }\n  #computeBbox() {\n    const bbox = this.#bbox = F32_BBOX_INIT.slice();\n    for (const {\n      line\n    } of this.#lines) {\n      if (line.length <= 12) {\n        for (let i = 4, ii = line.length; i < ii; i += 6) {\n          Util.pointBoundingBox(line[i], line[i + 1], bbox);\n        }\n        continue;\n      }\n      let lastX = line[4],\n        lastY = line[5];\n      for (let i = 6, ii = line.length; i < ii; i += 6) {\n        const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6);\n        Util.bezierBoundingBox(lastX, lastY, c1x, c1y, c2x, c2y, x, y, bbox);\n        lastX = x;\n        lastY = y;\n      }\n    }\n    const [marginX, marginY] = this.#getMarginComponents();\n    bbox[0] = MathClamp(bbox[0] - marginX, 0, 1);\n    bbox[1] = MathClamp(bbox[1] - marginY, 0, 1);\n    bbox[2] = MathClamp(bbox[2] + marginX, 0, 1);\n    bbox[3] = MathClamp(bbox[3] + marginY, 0, 1);\n    bbox[2] -= bbox[0];\n    bbox[3] -= bbox[1];\n  }\n  get box() {\n    return this.#bbox;\n  }\n  updateProperty(name, value) {\n    if (name === \"stroke-width\") {\n      return this.#updateThickness(value);\n    }\n    return null;\n  }\n  #updateThickness(thickness) {\n    const [oldMarginX, oldMarginY] = this.#getMarginComponents();\n    this.#thickness = thickness;\n    const [newMarginX, newMarginY] = this.#getMarginComponents();\n    const [diffMarginX, diffMarginY] = [newMarginX - oldMarginX, newMarginY - oldMarginY];\n    const bbox = this.#bbox;\n    bbox[0] -= diffMarginX;\n    bbox[1] -= diffMarginY;\n    bbox[2] += 2 * diffMarginX;\n    bbox[3] += 2 * diffMarginY;\n    return bbox;\n  }\n  updateParentDimensions([width, height], scale) {\n    const [oldMarginX, oldMarginY] = this.#getMarginComponents();\n    this.#parentWidth = width;\n    this.#parentHeight = height;\n    this.#parentScale = scale;\n    const [newMarginX, newMarginY] = this.#getMarginComponents();\n    const diffMarginX = newMarginX - oldMarginX;\n    const diffMarginY = newMarginY - oldMarginY;\n    const bbox = this.#bbox;\n    bbox[0] -= diffMarginX;\n    bbox[1] -= diffMarginY;\n    bbox[2] += 2 * diffMarginX;\n    bbox[3] += 2 * diffMarginY;\n    return bbox;\n  }\n  updateRotation(rotation) {\n    this.#currentRotation = rotation;\n    return {\n      path: {\n        transform: this.rotationTransform\n      }\n    };\n  }\n  get viewBox() {\n    return this.#bbox.map(Outline.svgRound).join(\" \");\n  }\n  get defaultProperties() {\n    const [x, y] = this.#bbox;\n    return {\n      root: {\n        viewBox: this.viewBox\n      },\n      path: {\n        \"transform-origin\": `${Outline.svgRound(x)} ${Outline.svgRound(y)}`\n      }\n    };\n  }\n  get rotationTransform() {\n    const [,, width, height] = this.#bbox;\n    let a = 0,\n      b = 0,\n      c = 0,\n      d = 0,\n      e = 0,\n      f = 0;\n    switch (this.#currentRotation) {\n      case 90:\n        b = height / width;\n        c = -width / height;\n        e = width;\n        break;\n      case 180:\n        a = -1;\n        d = -1;\n        e = width;\n        f = height;\n        break;\n      case 270:\n        b = -height / width;\n        c = width / height;\n        f = height;\n        break;\n      default:\n        return \"\";\n    }\n    return `matrix(${a} ${b} ${c} ${d} ${Outline.svgRound(e)} ${Outline.svgRound(f)})`;\n  }\n  getPathResizingSVGProperties([newX, newY, newWidth, newHeight]) {\n    const [marginX, marginY] = this.#getMarginComponents();\n    const [x, y, width, height] = this.#bbox;\n    if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) {\n      const tx = newX + newWidth / 2 - (x + width / 2);\n      const ty = newY + newHeight / 2 - (y + height / 2);\n      return {\n        path: {\n          \"transform-origin\": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`,\n          transform: `${this.rotationTransform} translate(${tx} ${ty})`\n        }\n      };\n    }\n    const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX);\n    const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY);\n    const s2x = width / newWidth;\n    const s2y = height / newHeight;\n    return {\n      path: {\n        \"transform-origin\": `${Outline.svgRound(x)} ${Outline.svgRound(y)}`,\n        transform: `${this.rotationTransform} scale(${s2x} ${s2y}) ` + `translate(${Outline.svgRound(marginX)} ${Outline.svgRound(marginY)}) scale(${s1x} ${s1y}) ` + `translate(${Outline.svgRound(-marginX)} ${Outline.svgRound(-marginY)})`\n      }\n    };\n  }\n  getPathResizedSVGProperties([newX, newY, newWidth, newHeight]) {\n    const [marginX, marginY] = this.#getMarginComponents();\n    const bbox = this.#bbox;\n    const [x, y, width, height] = bbox;\n    bbox[0] = newX;\n    bbox[1] = newY;\n    bbox[2] = newWidth;\n    bbox[3] = newHeight;\n    if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) {\n      const tx = newX + newWidth / 2 - (x + width / 2);\n      const ty = newY + newHeight / 2 - (y + height / 2);\n      for (const {\n        line,\n        points\n      } of this.#lines) {\n        Outline._translate(line, tx, ty, line);\n        Outline._translate(points, tx, ty, points);\n      }\n      return {\n        root: {\n          viewBox: this.viewBox\n        },\n        path: {\n          \"transform-origin\": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`,\n          transform: this.rotationTransform || null,\n          d: this.toSVGPath()\n        }\n      };\n    }\n    const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX);\n    const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY);\n    const tx = -s1x * (x + marginX) + newX + marginX;\n    const ty = -s1y * (y + marginY) + newY + marginY;\n    if (s1x !== 1 || s1y !== 1 || tx !== 0 || ty !== 0) {\n      for (const {\n        line,\n        points\n      } of this.#lines) {\n        Outline._rescale(line, tx, ty, s1x, s1y, line);\n        Outline._rescale(points, tx, ty, s1x, s1y, points);\n      }\n    }\n    return {\n      root: {\n        viewBox: this.viewBox\n      },\n      path: {\n        \"transform-origin\": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`,\n        transform: this.rotationTransform || null,\n        d: this.toSVGPath()\n      }\n    };\n  }\n  getPathTranslatedSVGProperties([newX, newY], parentDimensions) {\n    const [newParentWidth, newParentHeight] = parentDimensions;\n    const bbox = this.#bbox;\n    const tx = newX - bbox[0];\n    const ty = newY - bbox[1];\n    if (this.#parentWidth === newParentWidth && this.#parentHeight === newParentHeight) {\n      for (const {\n        line,\n        points\n      } of this.#lines) {\n        Outline._translate(line, tx, ty, line);\n        Outline._translate(points, tx, ty, points);\n      }\n    } else {\n      const sx = this.#parentWidth / newParentWidth;\n      const sy = this.#parentHeight / newParentHeight;\n      this.#parentWidth = newParentWidth;\n      this.#parentHeight = newParentHeight;\n      for (const {\n        line,\n        points\n      } of this.#lines) {\n        Outline._rescale(line, tx, ty, sx, sy, line);\n        Outline._rescale(points, tx, ty, sx, sy, points);\n      }\n      bbox[2] *= sx;\n      bbox[3] *= sy;\n    }\n    bbox[0] = newX;\n    bbox[1] = newY;\n    return {\n      root: {\n        viewBox: this.viewBox\n      },\n      path: {\n        d: this.toSVGPath(),\n        \"transform-origin\": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`\n      }\n    };\n  }\n  get defaultSVGProperties() {\n    const bbox = this.#bbox;\n    return {\n      root: {\n        viewBox: this.viewBox\n      },\n      rootClass: {\n        draw: true\n      },\n      path: {\n        d: this.toSVGPath(),\n        \"transform-origin\": `${Outline.svgRound(bbox[0])} ${Outline.svgRound(bbox[1])}`,\n        transform: this.rotationTransform || null\n      },\n      bbox\n    };\n  }\n}\n\n;// ./src/display/editor/ink.js\n\n\n\n\n\n\n\n\n\n\nclass InkDrawingOptions extends DrawingOptions {\n  constructor(viewerParameters) {\n    super();\n    this._viewParameters = viewerParameters;\n    super.updateProperties({\n      fill: \"none\",\n      stroke: AnnotationEditor._defaultLineColor,\n      \"stroke-opacity\": 1,\n      \"stroke-width\": 1,\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      \"stroke-miterlimit\": 10\n    });\n  }\n  updateSVGProperty(name, value) {\n    if (name === \"stroke-width\") {\n      value ??= this[\"stroke-width\"];\n      value *= this._viewParameters.realScale;\n    }\n    super.updateSVGProperty(name, value);\n  }\n  clone() {\n    const clone = new InkDrawingOptions(this._viewParameters);\n    clone.updateAll(this);\n    return clone;\n  }\n}\nclass InkEditor extends DrawingEditor {\n  static _type = \"ink\";\n  static _editorType = AnnotationEditorType.INK;\n  static _defaultDrawingOptions = null;\n  constructor(params) {\n    super({\n      ...params,\n      name: \"inkEditor\"\n    });\n    this._willKeepAspectRatio = true;\n    this.defaultL10nId = \"pdfjs-editor-ink-editor\";\n  }\n  static initialize(l10n, uiManager) {\n    AnnotationEditor.initialize(l10n, uiManager);\n    this._defaultDrawingOptions = new InkDrawingOptions(uiManager.viewParameters);\n  }\n  static getDefaultDrawingOptions(options) {\n    const clone = this._defaultDrawingOptions.clone();\n    clone.updateProperties(options);\n    return clone;\n  }\n  static get supportMultipleDrawings() {\n    return true;\n  }\n  static get typesMap() {\n    return shadow(this, \"typesMap\", new Map([[AnnotationEditorParamsType.INK_THICKNESS, \"stroke-width\"], [AnnotationEditorParamsType.INK_COLOR, \"stroke\"], [AnnotationEditorParamsType.INK_OPACITY, \"stroke-opacity\"]]));\n  }\n  static createDrawerInstance(x, y, parentWidth, parentHeight, rotation) {\n    return new InkDrawOutliner(x, y, parentWidth, parentHeight, rotation, this._defaultDrawingOptions[\"stroke-width\"]);\n  }\n  static deserializeDraw(pageX, pageY, pageWidth, pageHeight, innerMargin, data) {\n    return InkDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data);\n  }\n  static async deserialize(data, parent, uiManager) {\n    let initialData = null;\n    if (data instanceof InkAnnotationElement) {\n      const {\n        data: {\n          inkLists,\n          rect,\n          rotation,\n          id,\n          color,\n          opacity,\n          borderStyle: {\n            rawWidth: thickness\n          },\n          popupRef,\n          richText,\n          contentsObj,\n          creationDate,\n          modificationDate\n        },\n        parent: {\n          page: {\n            pageNumber\n          }\n        }\n      } = data;\n      initialData = data = {\n        annotationType: AnnotationEditorType.INK,\n        color: Array.from(color),\n        thickness,\n        opacity,\n        paths: {\n          points: inkLists\n        },\n        boxes: null,\n        pageIndex: pageNumber - 1,\n        rect: rect.slice(0),\n        rotation,\n        annotationElementId: id,\n        id,\n        deleted: false,\n        popupRef,\n        richText,\n        comment: contentsObj?.str || null,\n        creationDate,\n        modificationDate\n      };\n    }\n    const editor = await super.deserialize(data, parent, uiManager);\n    editor._initialData = initialData;\n    if (data.comment) {\n      editor.setCommentData(data);\n    }\n    return editor;\n  }\n  get toolbarButtons() {\n    this._colorPicker ||= new BasicColorPicker(this);\n    return [[\"colorPicker\", this._colorPicker]];\n  }\n  get colorType() {\n    return AnnotationEditorParamsType.INK_COLOR;\n  }\n  get colorAndOpacityType() {\n    return AnnotationEditorParamsType.INK_COLOR_AND_OPACITY;\n  }\n  get opacityType() {\n    return AnnotationEditorParamsType.INK_OPACITY;\n  }\n  updateParams(type, value) {\n    if (type === AnnotationEditorParamsType.INK_COLOR_AND_OPACITY) {\n      this._updateColorAndOpacity(value.color, value.opacity);\n      return;\n    }\n    super.updateParams(type, value);\n  }\n  static updateDefaultParams(type, value) {\n    if (type === AnnotationEditorParamsType.INK_COLOR_AND_OPACITY) {\n      super.updateDefaultParams(AnnotationEditorParamsType.INK_COLOR, value.color);\n      super.updateDefaultParams(AnnotationEditorParamsType.INK_OPACITY, value.opacity);\n      return;\n    }\n    super.updateDefaultParams(type, value);\n  }\n  get color() {\n    return this._drawingOptions.stroke;\n  }\n  get opacity() {\n    return this._drawingOptions[\"stroke-opacity\"];\n  }\n  onScaleChanging() {\n    if (!this.parent) {\n      return;\n    }\n    super.onScaleChanging();\n    const {\n      _drawId,\n      _drawingOptions,\n      parent\n    } = this;\n    _drawingOptions.updateSVGProperty(\"stroke-width\");\n    parent.drawLayer.updateProperties(_drawId, _drawingOptions.toSVGProperties());\n  }\n  static onScaleChangingWhenDrawing() {\n    const parent = this._currentParent;\n    if (!parent) {\n      return;\n    }\n    super.onScaleChangingWhenDrawing();\n    this._defaultDrawingOptions.updateSVGProperty(\"stroke-width\");\n    parent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties());\n  }\n  createDrawingOptions({\n    color,\n    thickness,\n    opacity\n  }) {\n    this._drawingOptions = InkEditor.getDefaultDrawingOptions({\n      stroke: Util.makeHexColor(...color),\n      \"stroke-width\": thickness,\n      \"stroke-opacity\": opacity\n    });\n  }\n  serialize(isForCopying = false) {\n    if (this.isEmpty()) {\n      return null;\n    }\n    if (this.deleted) {\n      return this.serializeDeleted();\n    }\n    const {\n      lines,\n      points\n    } = this.serializeDraw(isForCopying);\n    const {\n      _drawingOptions: {\n        stroke,\n        \"stroke-opacity\": opacity,\n        \"stroke-width\": thickness\n      }\n    } = this;\n    const serialized = Object.assign(super.serialize(isForCopying), {\n      color: AnnotationEditor._colorManager.convert(stroke),\n      opacity,\n      thickness,\n      paths: {\n        lines,\n        points\n      }\n    });\n    this.addComment(serialized);\n    if (isForCopying) {\n      serialized.isCopy = true;\n      return serialized;\n    }\n    if (this.annotationElementId && !this.#hasElementChanged(serialized)) {\n      return null;\n    }\n    serialized.id = this.annotationElementId;\n    return serialized;\n  }\n  #hasElementChanged(serialized) {\n    const {\n      color,\n      thickness,\n      opacity,\n      pageIndex\n    } = this._initialData;\n    return this.hasEditedComment || this._hasBeenMoved || this._hasBeenResized || serialized.color.some((c, i) => c !== color[i]) || serialized.thickness !== thickness || serialized.opacity !== opacity || serialized.pageIndex !== pageIndex;\n  }\n  renderAnnotationElement(annotation) {\n    if (this.deleted) {\n      annotation.hide();\n      return null;\n    }\n    const {\n      points,\n      rect\n    } = this.serializeDraw(false);\n    annotation.updateEdited({\n      rect,\n      thickness: this._drawingOptions[\"stroke-width\"],\n      points,\n      popup: this.comment\n    });\n    return null;\n  }\n}\n\n;// ./src/display/editor/drawers/contour.js\n\nclass ContourDrawOutline extends InkDrawOutline {\n  toSVGPath() {\n    let path = super.toSVGPath();\n    if (!path.endsWith(\"Z\")) {\n      path += \"Z\";\n    }\n    return path;\n  }\n}\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.uint8-array.from-base64.js\nvar es_uint8_array_from_base64 = __webpack_require__(5213);\n;// ./src/display/editor/drawers/signaturedraw.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst BASE_HEADER_LENGTH = 8;\nconst POINTS_PROPERTIES_NUMBER = 3;\nclass SignatureExtractor {\n  static #PARAMETERS = {\n    maxDim: 512,\n    sigmaSFactor: 0.02,\n    sigmaR: 25,\n    kernelSize: 16\n  };\n  static #neighborIndexToId(i0, j0, i, j) {\n    i -= i0;\n    j -= j0;\n    if (i === 0) {\n      return j > 0 ? 0 : 4;\n    }\n    if (i === 1) {\n      return j + 6;\n    }\n    return 2 - j;\n  }\n  static #neighborIdToIndex = new Int32Array([0, 1, -1, 1, -1, 0, -1, -1, 0, -1, 1, -1, 1, 0, 1, 1]);\n  static #clockwiseNonZero(buf, width, i0, j0, i, j, offset) {\n    const id = this.#neighborIndexToId(i0, j0, i, j);\n    for (let k = 0; k < 8; k++) {\n      const kk = (-k + id - offset + 16) % 8;\n      const shiftI = this.#neighborIdToIndex[2 * kk];\n      const shiftJ = this.#neighborIdToIndex[2 * kk + 1];\n      if (buf[(i0 + shiftI) * width + (j0 + shiftJ)] !== 0) {\n        return kk;\n      }\n    }\n    return -1;\n  }\n  static #counterClockwiseNonZero(buf, width, i0, j0, i, j, offset) {\n    const id = this.#neighborIndexToId(i0, j0, i, j);\n    for (let k = 0; k < 8; k++) {\n      const kk = (k + id + offset + 16) % 8;\n      const shiftI = this.#neighborIdToIndex[2 * kk];\n      const shiftJ = this.#neighborIdToIndex[2 * kk + 1];\n      if (buf[(i0 + shiftI) * width + (j0 + shiftJ)] !== 0) {\n        return kk;\n      }\n    }\n    return -1;\n  }\n  static #findContours(buf, width, height, threshold) {\n    const N = buf.length;\n    const types = new Int32Array(N);\n    for (let i = 0; i < N; i++) {\n      types[i] = buf[i] <= threshold ? 1 : 0;\n    }\n    for (let i = 1; i < height - 1; i++) {\n      types[i * width] = types[i * width + width - 1] = 0;\n    }\n    for (let i = 0; i < width; i++) {\n      types[i] = types[width * height - 1 - i] = 0;\n    }\n    let nbd = 1;\n    let lnbd;\n    const contours = [];\n    for (let i = 1; i < height - 1; i++) {\n      lnbd = 1;\n      for (let j = 1; j < width - 1; j++) {\n        const ij = i * width + j;\n        const pix = types[ij];\n        if (pix === 0) {\n          continue;\n        }\n        let i2 = i;\n        let j2 = j;\n        if (pix === 1 && types[ij - 1] === 0) {\n          nbd += 1;\n          j2 -= 1;\n        } else if (pix >= 1 && types[ij + 1] === 0) {\n          nbd += 1;\n          j2 += 1;\n          if (pix > 1) {\n            lnbd = pix;\n          }\n        } else {\n          if (pix !== 1) {\n            lnbd = Math.abs(pix);\n          }\n          continue;\n        }\n        const points = [j, i];\n        const isHole = j2 === j + 1;\n        const contour = {\n          isHole,\n          points,\n          id: nbd,\n          parent: 0\n        };\n        contours.push(contour);\n        let contour0;\n        for (const c of contours) {\n          if (c.id === lnbd) {\n            contour0 = c;\n            break;\n          }\n        }\n        if (!contour0) {\n          contour.parent = isHole ? lnbd : 0;\n        } else if (contour0.isHole) {\n          contour.parent = isHole ? contour0.parent : lnbd;\n        } else {\n          contour.parent = isHole ? lnbd : contour0.parent;\n        }\n        const k = this.#clockwiseNonZero(types, width, i, j, i2, j2, 0);\n        if (k === -1) {\n          types[ij] = -nbd;\n          if (types[ij] !== 1) {\n            lnbd = Math.abs(types[ij]);\n          }\n          continue;\n        }\n        let shiftI = this.#neighborIdToIndex[2 * k];\n        let shiftJ = this.#neighborIdToIndex[2 * k + 1];\n        const i1 = i + shiftI;\n        const j1 = j + shiftJ;\n        i2 = i1;\n        j2 = j1;\n        let i3 = i;\n        let j3 = j;\n        while (true) {\n          const kk = this.#counterClockwiseNonZero(types, width, i3, j3, i2, j2, 1);\n          shiftI = this.#neighborIdToIndex[2 * kk];\n          shiftJ = this.#neighborIdToIndex[2 * kk + 1];\n          const i4 = i3 + shiftI;\n          const j4 = j3 + shiftJ;\n          points.push(j4, i4);\n          const ij3 = i3 * width + j3;\n          if (types[ij3 + 1] === 0) {\n            types[ij3] = -nbd;\n          } else if (types[ij3] === 1) {\n            types[ij3] = nbd;\n          }\n          if (i4 === i && j4 === j && i3 === i1 && j3 === j1) {\n            if (types[ij] !== 1) {\n              lnbd = Math.abs(types[ij]);\n            }\n            break;\n          } else {\n            i2 = i3;\n            j2 = j3;\n            i3 = i4;\n            j3 = j4;\n          }\n        }\n      }\n    }\n    return contours;\n  }\n  static #douglasPeuckerHelper(points, start, end, output) {\n    if (end - start <= 4) {\n      for (let i = start; i < end - 2; i += 2) {\n        output.push(points[i], points[i + 1]);\n      }\n      return;\n    }\n    const ax = points[start];\n    const ay = points[start + 1];\n    const abx = points[end - 4] - ax;\n    const aby = points[end - 3] - ay;\n    const dist = Math.hypot(abx, aby);\n    const nabx = abx / dist;\n    const naby = aby / dist;\n    const aa = nabx * ay - naby * ax;\n    const m = aby / abx;\n    const invS = 1 / dist;\n    const phi = Math.atan(m);\n    const cosPhi = Math.cos(phi);\n    const sinPhi = Math.sin(phi);\n    const tmax = invS * (Math.abs(cosPhi) + Math.abs(sinPhi));\n    const poly = invS * (1 - tmax + tmax ** 2);\n    const partialPhi = Math.max(Math.atan(Math.abs(sinPhi + cosPhi) * poly), Math.atan(Math.abs(sinPhi - cosPhi) * poly));\n    let dmax = 0;\n    let index = start;\n    for (let i = start + 2; i < end - 2; i += 2) {\n      const d = Math.abs(aa - nabx * points[i + 1] + naby * points[i]);\n      if (d > dmax) {\n        index = i;\n        dmax = d;\n      }\n    }\n    if (dmax > (dist * partialPhi) ** 2) {\n      this.#douglasPeuckerHelper(points, start, index + 2, output);\n      this.#douglasPeuckerHelper(points, index, end, output);\n    } else {\n      output.push(ax, ay);\n    }\n  }\n  static #douglasPeucker(points) {\n    const output = [];\n    const len = points.length;\n    this.#douglasPeuckerHelper(points, 0, len, output);\n    output.push(points[len - 2], points[len - 1]);\n    return output.length <= 4 ? null : output;\n  }\n  static #bilateralFilter(buf, width, height, sigmaS, sigmaR, kernelSize) {\n    const kernel = new Float32Array(kernelSize ** 2);\n    const sigmaS2 = -2 * sigmaS ** 2;\n    const halfSize = kernelSize >> 1;\n    for (let i = 0; i < kernelSize; i++) {\n      const x = (i - halfSize) ** 2;\n      for (let j = 0; j < kernelSize; j++) {\n        kernel[i * kernelSize + j] = Math.exp((x + (j - halfSize) ** 2) / sigmaS2);\n      }\n    }\n    const rangeValues = new Float32Array(256);\n    const sigmaR2 = -2 * sigmaR ** 2;\n    for (let i = 0; i < 256; i++) {\n      rangeValues[i] = Math.exp(i ** 2 / sigmaR2);\n    }\n    const N = buf.length;\n    const out = new Uint8Array(N);\n    const histogram = new Uint32Array(256);\n    for (let i = 0; i < height; i++) {\n      for (let j = 0; j < width; j++) {\n        const ij = i * width + j;\n        const center = buf[ij];\n        let sum = 0;\n        let norm = 0;\n        for (let k = 0; k < kernelSize; k++) {\n          const y = i + k - halfSize;\n          if (y < 0 || y >= height) {\n            continue;\n          }\n          for (let l = 0; l < kernelSize; l++) {\n            const x = j + l - halfSize;\n            if (x < 0 || x >= width) {\n              continue;\n            }\n            const neighbour = buf[y * width + x];\n            const w = kernel[k * kernelSize + l] * rangeValues[Math.abs(neighbour - center)];\n            sum += neighbour * w;\n            norm += w;\n          }\n        }\n        const pix = out[ij] = Math.round(sum / norm);\n        histogram[pix]++;\n      }\n    }\n    return [out, histogram];\n  }\n  static #getHistogram(buf) {\n    const histogram = new Uint32Array(256);\n    for (const g of buf) {\n      histogram[g]++;\n    }\n    return histogram;\n  }\n  static #toUint8(buf) {\n    const N = buf.length;\n    const out = new Uint8ClampedArray(N >> 2);\n    let max = -Infinity;\n    let min = Infinity;\n    for (let i = 0, ii = out.length; i < ii; i++) {\n      const pix = out[i] = buf[i << 2];\n      max = Math.max(max, pix);\n      min = Math.min(min, pix);\n    }\n    const ratio = 255 / (max - min);\n    for (let i = 0, ii = out.length; i < ii; i++) {\n      out[i] = (out[i] - min) * ratio;\n    }\n    return out;\n  }\n  static #guessThreshold(histogram) {\n    let i;\n    let M = -Infinity;\n    let L = -Infinity;\n    const min = histogram.findIndex(v => v !== 0);\n    let pos = min;\n    let spos = min;\n    for (i = min; i < 256; i++) {\n      const v = histogram[i];\n      if (v > M) {\n        if (i - pos > L) {\n          L = i - pos;\n          spos = i - 1;\n        }\n        M = v;\n        pos = i;\n      }\n    }\n    for (i = spos - 1; i >= 0; i--) {\n      if (histogram[i] > histogram[i + 1]) {\n        break;\n      }\n    }\n    return i;\n  }\n  static #getGrayPixels(bitmap) {\n    const originalBitmap = bitmap;\n    const {\n      width,\n      height\n    } = bitmap;\n    const {\n      maxDim\n    } = this.#PARAMETERS;\n    let newWidth = width;\n    let newHeight = height;\n    if (width > maxDim || height > maxDim) {\n      let prevWidth = width;\n      let prevHeight = height;\n      let steps = Math.log2(Math.max(width, height) / maxDim);\n      const isteps = Math.floor(steps);\n      steps = steps === isteps ? isteps - 1 : isteps;\n      for (let i = 0; i < steps; i++) {\n        newWidth = Math.ceil(prevWidth / 2);\n        newHeight = Math.ceil(prevHeight / 2);\n        const offscreen = new OffscreenCanvas(newWidth, newHeight);\n        const ctx = offscreen.getContext(\"2d\");\n        ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight);\n        prevWidth = newWidth;\n        prevHeight = newHeight;\n        if (bitmap !== originalBitmap) {\n          bitmap.close();\n        }\n        bitmap = offscreen.transferToImageBitmap();\n      }\n      const ratio = Math.min(maxDim / newWidth, maxDim / newHeight);\n      newWidth = Math.round(newWidth * ratio);\n      newHeight = Math.round(newHeight * ratio);\n    }\n    const offscreen = new OffscreenCanvas(newWidth, newHeight);\n    const ctx = offscreen.getContext(\"2d\", {\n      willReadFrequently: true\n    });\n    ctx.fillStyle = \"white\";\n    ctx.fillRect(0, 0, newWidth, newHeight);\n    ctx.filter = \"grayscale(1)\";\n    ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, newWidth, newHeight);\n    const grayImage = ctx.getImageData(0, 0, newWidth, newHeight).data;\n    const uint8Buf = this.#toUint8(grayImage);\n    return [uint8Buf, newWidth, newHeight];\n  }\n  static extractContoursFromText(text, {\n    fontFamily,\n    fontStyle,\n    fontWeight\n  }, pageWidth, pageHeight, rotation, innerMargin) {\n    let canvas = new OffscreenCanvas(1, 1);\n    let ctx = canvas.getContext(\"2d\", {\n      alpha: false\n    });\n    const fontSize = 200;\n    const font = ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`;\n    const {\n      actualBoundingBoxLeft,\n      actualBoundingBoxRight,\n      actualBoundingBoxAscent,\n      actualBoundingBoxDescent,\n      fontBoundingBoxAscent,\n      fontBoundingBoxDescent,\n      width\n    } = ctx.measureText(text);\n    const SCALE = 1.5;\n    const canvasWidth = Math.ceil(Math.max(Math.abs(actualBoundingBoxLeft) + Math.abs(actualBoundingBoxRight) || 0, width) * SCALE);\n    const canvasHeight = Math.ceil(Math.max(Math.abs(actualBoundingBoxAscent) + Math.abs(actualBoundingBoxDescent) || fontSize, Math.abs(fontBoundingBoxAscent) + Math.abs(fontBoundingBoxDescent) || fontSize) * SCALE);\n    canvas = new OffscreenCanvas(canvasWidth, canvasHeight);\n    ctx = canvas.getContext(\"2d\", {\n      alpha: true,\n      willReadFrequently: true\n    });\n    ctx.font = font;\n    ctx.filter = \"grayscale(1)\";\n    ctx.fillStyle = \"white\";\n    ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n    ctx.fillStyle = \"black\";\n    ctx.fillText(text, canvasWidth * (SCALE - 1) / 2, canvasHeight * (3 - SCALE) / 2);\n    const uint8Buf = this.#toUint8(ctx.getImageData(0, 0, canvasWidth, canvasHeight).data);\n    const histogram = this.#getHistogram(uint8Buf);\n    const threshold = this.#guessThreshold(histogram);\n    const contourList = this.#findContours(uint8Buf, canvasWidth, canvasHeight, threshold);\n    return this.processDrawnLines({\n      lines: {\n        curves: contourList,\n        width: canvasWidth,\n        height: canvasHeight\n      },\n      pageWidth,\n      pageHeight,\n      rotation,\n      innerMargin,\n      mustSmooth: true,\n      areContours: true\n    });\n  }\n  static process(bitmap, pageWidth, pageHeight, rotation, innerMargin) {\n    const [uint8Buf, width, height] = this.#getGrayPixels(bitmap);\n    const [buffer, histogram] = this.#bilateralFilter(uint8Buf, width, height, Math.hypot(width, height) * this.#PARAMETERS.sigmaSFactor, this.#PARAMETERS.sigmaR, this.#PARAMETERS.kernelSize);\n    const threshold = this.#guessThreshold(histogram);\n    const contourList = this.#findContours(buffer, width, height, threshold);\n    return this.processDrawnLines({\n      lines: {\n        curves: contourList,\n        width,\n        height\n      },\n      pageWidth,\n      pageHeight,\n      rotation,\n      innerMargin,\n      mustSmooth: true,\n      areContours: true\n    });\n  }\n  static processDrawnLines({\n    lines,\n    pageWidth,\n    pageHeight,\n    rotation,\n    innerMargin,\n    mustSmooth,\n    areContours\n  }) {\n    if (rotation % 180 !== 0) {\n      [pageWidth, pageHeight] = [pageHeight, pageWidth];\n    }\n    const {\n      curves,\n      width,\n      height\n    } = lines;\n    const thickness = lines.thickness ?? 0;\n    const linesAndPoints = [];\n    const ratio = Math.min(pageWidth / width, pageHeight / height);\n    const xScale = ratio / pageWidth;\n    const yScale = ratio / pageHeight;\n    const newCurves = [];\n    for (const {\n      points\n    } of curves) {\n      const reducedPoints = mustSmooth ? this.#douglasPeucker(points) : points;\n      if (!reducedPoints) {\n        continue;\n      }\n      newCurves.push(reducedPoints);\n      const len = reducedPoints.length;\n      const newPoints = new Float32Array(len);\n      const line = new Float32Array(3 * (len === 2 ? 2 : len - 2));\n      linesAndPoints.push({\n        line,\n        points: newPoints\n      });\n      if (len === 2) {\n        newPoints[0] = reducedPoints[0] * xScale;\n        newPoints[1] = reducedPoints[1] * yScale;\n        line.set([NaN, NaN, NaN, NaN, newPoints[0], newPoints[1]], 0);\n        continue;\n      }\n      let [x1, y1, x2, y2] = reducedPoints;\n      x1 *= xScale;\n      y1 *= yScale;\n      x2 *= xScale;\n      y2 *= yScale;\n      newPoints.set([x1, y1, x2, y2], 0);\n      line.set([NaN, NaN, NaN, NaN, x1, y1], 0);\n      for (let i = 4; i < len; i += 2) {\n        const x = newPoints[i] = reducedPoints[i] * xScale;\n        const y = newPoints[i + 1] = reducedPoints[i + 1] * yScale;\n        line.set(Outline.createBezierPoints(x1, y1, x2, y2, x, y), (i - 2) * 3);\n        [x1, y1, x2, y2] = [x2, y2, x, y];\n      }\n    }\n    if (linesAndPoints.length === 0) {\n      return null;\n    }\n    const outline = areContours ? new ContourDrawOutline() : new InkDrawOutline();\n    outline.build(linesAndPoints, pageWidth, pageHeight, 1, rotation, areContours ? 0 : thickness, innerMargin);\n    return {\n      outline,\n      newCurves,\n      areContours,\n      thickness,\n      width,\n      height\n    };\n  }\n  static async compressSignature({\n    outlines,\n    areContours,\n    thickness,\n    width,\n    height\n  }) {\n    let minDiff = Infinity;\n    let maxDiff = -Infinity;\n    let outlinesLength = 0;\n    for (const points of outlines) {\n      outlinesLength += points.length;\n      for (let i = 2, ii = points.length; i < ii; i++) {\n        const dx = points[i] - points[i - 2];\n        minDiff = Math.min(minDiff, dx);\n        maxDiff = Math.max(maxDiff, dx);\n      }\n    }\n    let bufferType;\n    if (minDiff >= -128 && maxDiff <= 127) {\n      bufferType = Int8Array;\n    } else if (minDiff >= -32768 && maxDiff <= 32767) {\n      bufferType = Int16Array;\n    } else {\n      bufferType = Int32Array;\n    }\n    const len = outlines.length;\n    const headerLength = BASE_HEADER_LENGTH + POINTS_PROPERTIES_NUMBER * len;\n    const header = new Uint32Array(headerLength);\n    let offset = 0;\n    header[offset++] = headerLength * Uint32Array.BYTES_PER_ELEMENT + (outlinesLength - 2 * len) * bufferType.BYTES_PER_ELEMENT;\n    header[offset++] = 0;\n    header[offset++] = width;\n    header[offset++] = height;\n    header[offset++] = areContours ? 0 : 1;\n    header[offset++] = Math.max(0, Math.floor(thickness ?? 0));\n    header[offset++] = len;\n    header[offset++] = bufferType.BYTES_PER_ELEMENT;\n    for (const points of outlines) {\n      header[offset++] = points.length - 2;\n      header[offset++] = points[0];\n      header[offset++] = points[1];\n    }\n    const cs = new CompressionStream(\"deflate-raw\");\n    const writer = cs.writable.getWriter();\n    await writer.ready;\n    writer.write(header);\n    const BufferCtor = bufferType.prototype.constructor;\n    for (const points of outlines) {\n      const diffs = new BufferCtor(points.length - 2);\n      for (let i = 2, ii = points.length; i < ii; i++) {\n        diffs[i - 2] = points[i] - points[i - 2];\n      }\n      writer.write(diffs);\n    }\n    writer.close();\n    const bytes = await new Response(cs.readable).bytes();\n    return bytes.toBase64();\n  }\n  static async decompressSignature(signatureData) {\n    try {\n      const bytes = Uint8Array.fromBase64(signatureData);\n      const {\n        readable,\n        writable\n      } = new DecompressionStream(\"deflate-raw\");\n      const writer = writable.getWriter();\n      await writer.ready;\n      writer.write(bytes).then(async () => {\n        await writer.ready;\n        await writer.close();\n      }).catch(() => {});\n      let data = null;\n      let offset = 0;\n      for await (const chunk of readable) {\n        data ||= new Uint8Array(new Uint32Array(chunk.buffer, 0, 4)[0]);\n        data.set(chunk, offset);\n        offset += chunk.length;\n      }\n      const header = new Uint32Array(data.buffer, 0, data.length >> 2);\n      const version = header[1];\n      if (version !== 0) {\n        throw new Error(`Invalid version: ${version}`);\n      }\n      const width = header[2];\n      const height = header[3];\n      const areContours = header[4] === 0;\n      const thickness = header[5];\n      const numberOfDrawings = header[6];\n      const bufferType = header[7];\n      const outlines = [];\n      const diffsOffset = (BASE_HEADER_LENGTH + POINTS_PROPERTIES_NUMBER * numberOfDrawings) * Uint32Array.BYTES_PER_ELEMENT;\n      let diffs;\n      switch (bufferType) {\n        case Int8Array.BYTES_PER_ELEMENT:\n          diffs = new Int8Array(data.buffer, diffsOffset);\n          break;\n        case Int16Array.BYTES_PER_ELEMENT:\n          diffs = new Int16Array(data.buffer, diffsOffset);\n          break;\n        case Int32Array.BYTES_PER_ELEMENT:\n          diffs = new Int32Array(data.buffer, diffsOffset);\n          break;\n      }\n      offset = 0;\n      for (let i = 0; i < numberOfDrawings; i++) {\n        const len = header[POINTS_PROPERTIES_NUMBER * i + BASE_HEADER_LENGTH];\n        const points = new Float32Array(len + 2);\n        outlines.push(points);\n        for (let j = 0; j < POINTS_PROPERTIES_NUMBER - 1; j++) {\n          points[j] = header[POINTS_PROPERTIES_NUMBER * i + BASE_HEADER_LENGTH + j + 1];\n        }\n        for (let j = 0; j < len; j++) {\n          points[j + 2] = points[j] + diffs[offset++];\n        }\n      }\n      return {\n        areContours,\n        thickness,\n        outlines,\n        width,\n        height\n      };\n    } catch (e) {\n      warn(`decompressSignature: ${e}`);\n      return null;\n    }\n  }\n}\n\n;// ./src/display/editor/signature.js\n\n\n\n\n\n\n\n\n\n\n\n\nclass SignatureOptions extends DrawingOptions {\n  constructor() {\n    super();\n    super.updateProperties({\n      fill: AnnotationEditor._defaultLineColor,\n      \"stroke-width\": 0\n    });\n  }\n  clone() {\n    const clone = new SignatureOptions();\n    clone.updateAll(this);\n    return clone;\n  }\n}\nclass DrawnSignatureOptions extends InkDrawingOptions {\n  constructor(viewerParameters) {\n    super(viewerParameters);\n    super.updateProperties({\n      stroke: AnnotationEditor._defaultLineColor,\n      \"stroke-width\": 1\n    });\n  }\n  clone() {\n    const clone = new DrawnSignatureOptions(this._viewParameters);\n    clone.updateAll(this);\n    return clone;\n  }\n}\nclass SignatureEditor extends DrawingEditor {\n  #isExtracted = false;\n  #description = null;\n  #signatureData = null;\n  #signatureUUID = null;\n  static _type = \"signature\";\n  static _editorType = AnnotationEditorType.SIGNATURE;\n  static _defaultDrawingOptions = null;\n  constructor(params) {\n    super({\n      ...params,\n      mustBeCommitted: true,\n      name: \"signatureEditor\"\n    });\n    this._willKeepAspectRatio = true;\n    this.#signatureData = params.signatureData || null;\n    this.#description = null;\n    this.defaultL10nId = \"pdfjs-editor-signature-editor1\";\n  }\n  static initialize(l10n, uiManager) {\n    AnnotationEditor.initialize(l10n, uiManager);\n    this._defaultDrawingOptions = new SignatureOptions();\n    this._defaultDrawnSignatureOptions = new DrawnSignatureOptions(uiManager.viewParameters);\n  }\n  static getDefaultDrawingOptions(options) {\n    const clone = this._defaultDrawingOptions.clone();\n    clone.updateProperties(options);\n    return clone;\n  }\n  static get supportMultipleDrawings() {\n    return false;\n  }\n  static get typesMap() {\n    return shadow(this, \"typesMap\", new Map());\n  }\n  static get isDrawer() {\n    return false;\n  }\n  get telemetryFinalData() {\n    return {\n      type: \"signature\",\n      hasDescription: !!this.#description\n    };\n  }\n  static computeTelemetryFinalData(data) {\n    const hasDescriptionStats = data.get(\"hasDescription\");\n    return {\n      hasAltText: hasDescriptionStats.get(true) ?? 0,\n      hasNoAltText: hasDescriptionStats.get(false) ?? 0\n    };\n  }\n  get isResizable() {\n    return true;\n  }\n  onScaleChanging() {\n    if (this._drawId === null) {\n      return;\n    }\n    super.onScaleChanging();\n  }\n  render() {\n    if (this.div) {\n      return this.div;\n    }\n    let baseX, baseY;\n    const {\n      _isCopy\n    } = this;\n    if (_isCopy) {\n      this._isCopy = false;\n      baseX = this.x;\n      baseY = this.y;\n    }\n    super.render();\n    if (this._drawId === null) {\n      if (this.#signatureData) {\n        const {\n          lines,\n          mustSmooth,\n          areContours,\n          description,\n          uuid,\n          heightInPage\n        } = this.#signatureData;\n        const {\n          rawDims: {\n            pageWidth,\n            pageHeight\n          },\n          rotation\n        } = this.parent.viewport;\n        const outline = SignatureExtractor.processDrawnLines({\n          lines,\n          pageWidth,\n          pageHeight,\n          rotation,\n          innerMargin: SignatureEditor._INNER_MARGIN,\n          mustSmooth,\n          areContours\n        });\n        this.addSignature(outline, heightInPage, description, uuid);\n      } else {\n        this.div.setAttribute(\"data-l10n-args\", JSON.stringify({\n          description: \"\"\n        }));\n        this.div.hidden = true;\n        this._uiManager.getSignature(this);\n      }\n    } else {\n      this.div.setAttribute(\"data-l10n-args\", JSON.stringify({\n        description: this.#description || \"\"\n      }));\n    }\n    if (_isCopy) {\n      this._isCopy = true;\n      this._moveAfterPaste(baseX, baseY);\n    }\n    return this.div;\n  }\n  setUuid(uuid) {\n    this.#signatureUUID = uuid;\n    this.addEditToolbar();\n  }\n  getUuid() {\n    return this.#signatureUUID;\n  }\n  get description() {\n    return this.#description;\n  }\n  set description(description) {\n    this.#description = description;\n    if (!this.div) {\n      return;\n    }\n    this.div.setAttribute(\"data-l10n-args\", JSON.stringify({\n      description\n    }));\n    super.addEditToolbar().then(toolbar => {\n      toolbar?.updateEditSignatureButton(description);\n    });\n  }\n  getSignaturePreview() {\n    const {\n      newCurves,\n      areContours,\n      thickness,\n      width,\n      height\n    } = this.#signatureData;\n    const maxDim = Math.max(width, height);\n    const outlineData = SignatureExtractor.processDrawnLines({\n      lines: {\n        curves: newCurves.map(points => ({\n          points\n        })),\n        thickness,\n        width,\n        height\n      },\n      pageWidth: maxDim,\n      pageHeight: maxDim,\n      rotation: 0,\n      innerMargin: 0,\n      mustSmooth: false,\n      areContours\n    });\n    return {\n      areContours,\n      outline: outlineData.outline\n    };\n  }\n  get toolbarButtons() {\n    if (this._uiManager.signatureManager) {\n      return [[\"editSignature\", this._uiManager.signatureManager]];\n    }\n    return super.toolbarButtons;\n  }\n  addSignature(data, heightInPage, description, uuid) {\n    const {\n      x: savedX,\n      y: savedY\n    } = this;\n    const {\n      outline\n    } = this.#signatureData = data;\n    this.#isExtracted = outline instanceof ContourDrawOutline;\n    this.description = description;\n    let drawingOptions;\n    if (this.#isExtracted) {\n      drawingOptions = SignatureEditor.getDefaultDrawingOptions();\n    } else {\n      drawingOptions = SignatureEditor._defaultDrawnSignatureOptions.clone();\n      drawingOptions.updateProperties({\n        \"stroke-width\": outline.thickness\n      });\n    }\n    this._addOutlines({\n      drawOutlines: outline,\n      drawingOptions\n    });\n    const [, pageHeight] = this.pageDimensions;\n    let newHeight = heightInPage / pageHeight;\n    newHeight = newHeight >= 1 ? 0.5 : newHeight;\n    this.width *= newHeight / this.height;\n    if (this.width >= 1) {\n      newHeight *= 0.9 / this.width;\n      this.width = 0.9;\n    }\n    this.height = newHeight;\n    this.setDims();\n    this.x = savedX;\n    this.y = savedY;\n    this.center();\n    this._onResized();\n    this.onScaleChanging();\n    this.rotate();\n    this._uiManager.addToAnnotationStorage(this);\n    this.setUuid(uuid);\n    this._reportTelemetry({\n      action: \"pdfjs.signature.inserted\",\n      data: {\n        hasBeenSaved: !!uuid,\n        hasDescription: !!description\n      }\n    });\n    this.div.hidden = false;\n  }\n  getFromImage(bitmap) {\n    const {\n      rawDims: {\n        pageWidth,\n        pageHeight\n      },\n      rotation\n    } = this.parent.viewport;\n    return SignatureExtractor.process(bitmap, pageWidth, pageHeight, rotation, SignatureEditor._INNER_MARGIN);\n  }\n  getFromText(text, fontInfo) {\n    const {\n      rawDims: {\n        pageWidth,\n        pageHeight\n      },\n      rotation\n    } = this.parent.viewport;\n    return SignatureExtractor.extractContoursFromText(text, fontInfo, pageWidth, pageHeight, rotation, SignatureEditor._INNER_MARGIN);\n  }\n  getDrawnSignature(curves) {\n    const {\n      rawDims: {\n        pageWidth,\n        pageHeight\n      },\n      rotation\n    } = this.parent.viewport;\n    return SignatureExtractor.processDrawnLines({\n      lines: curves,\n      pageWidth,\n      pageHeight,\n      rotation,\n      innerMargin: SignatureEditor._INNER_MARGIN,\n      mustSmooth: false,\n      areContours: false\n    });\n  }\n  createDrawingOptions({\n    areContours,\n    thickness\n  }) {\n    if (areContours) {\n      this._drawingOptions = SignatureEditor.getDefaultDrawingOptions();\n    } else {\n      this._drawingOptions = SignatureEditor._defaultDrawnSignatureOptions.clone();\n      this._drawingOptions.updateProperties({\n        \"stroke-width\": thickness\n      });\n    }\n  }\n  serialize(isForCopying = false) {\n    if (this.isEmpty()) {\n      return null;\n    }\n    const {\n      lines,\n      points\n    } = this.serializeDraw(isForCopying);\n    const {\n      _drawingOptions: {\n        \"stroke-width\": thickness\n      }\n    } = this;\n    const serialized = Object.assign(super.serialize(isForCopying), {\n      isSignature: true,\n      areContours: this.#isExtracted,\n      color: [0, 0, 0],\n      thickness: this.#isExtracted ? 0 : thickness\n    });\n    this.addComment(serialized);\n    if (isForCopying) {\n      serialized.paths = {\n        lines,\n        points\n      };\n      serialized.uuid = this.#signatureUUID;\n      serialized.isCopy = true;\n    } else {\n      serialized.lines = lines;\n    }\n    if (this.#description) {\n      serialized.accessibilityData = {\n        type: \"Figure\",\n        alt: this.#description\n      };\n    }\n    return serialized;\n  }\n  static deserializeDraw(pageX, pageY, pageWidth, pageHeight, innerMargin, data) {\n    if (data.areContours) {\n      return ContourDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data);\n    }\n    return InkDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data);\n  }\n  static async deserialize(data, parent, uiManager) {\n    const editor = await super.deserialize(data, parent, uiManager);\n    editor.#isExtracted = data.areContours;\n    editor.description = data.accessibilityData?.alt || \"\";\n    editor.#signatureUUID = data.uuid;\n    return editor;\n  }\n}\n\n;// ./src/display/editor/stamp.js\n\n\n\n\n\n\n\n\n\n\nclass StampEditor extends AnnotationEditor {\n  #bitmap = null;\n  #bitmapId = null;\n  #bitmapPromise = null;\n  #bitmapUrl = null;\n  #bitmapFile = null;\n  #bitmapFileName = \"\";\n  #canvas = null;\n  #missingCanvas = false;\n  #resizeTimeoutId = null;\n  #isSvg = false;\n  #hasBeenAddedInUndoStack = false;\n  static _type = \"stamp\";\n  static _editorType = AnnotationEditorType.STAMP;\n  constructor(params) {\n    super({\n      ...params,\n      name: \"stampEditor\"\n    });\n    this.#bitmapUrl = params.bitmapUrl;\n    this.#bitmapFile = params.bitmapFile;\n    this.defaultL10nId = \"pdfjs-editor-stamp-editor\";\n  }\n  static initialize(l10n, uiManager) {\n    AnnotationEditor.initialize(l10n, uiManager);\n  }\n  static isHandlingMimeForPasting(mime) {\n    return SupportedImageMimeTypes.includes(mime);\n  }\n  static paste(item, parent) {\n    parent.pasteEditor({\n      mode: AnnotationEditorType.STAMP\n    }, {\n      bitmapFile: item.getAsFile()\n    });\n  }\n  altTextFinish() {\n    if (this._uiManager.useNewAltTextFlow) {\n      this.div.hidden = false;\n    }\n    super.altTextFinish();\n  }\n  get telemetryFinalData() {\n    return {\n      type: \"stamp\",\n      hasAltText: !!this.altTextData?.altText\n    };\n  }\n  static computeTelemetryFinalData(data) {\n    const hasAltTextStats = data.get(\"hasAltText\");\n    return {\n      hasAltText: hasAltTextStats.get(true) ?? 0,\n      hasNoAltText: hasAltTextStats.get(false) ?? 0\n    };\n  }\n  #getBitmapFetched(data, fromId = false) {\n    if (!data) {\n      this.remove();\n      return;\n    }\n    this.#bitmap = data.bitmap;\n    if (!fromId) {\n      this.#bitmapId = data.id;\n      this.#isSvg = data.isSvg;\n    }\n    if (data.file) {\n      this.#bitmapFileName = data.file.name;\n    }\n    this.#createCanvas();\n  }\n  #getBitmapDone() {\n    this.#bitmapPromise = null;\n    this._uiManager.enableWaiting(false);\n    if (!this.#canvas) {\n      return;\n    }\n    if (this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) {\n      this.addEditToolbar().then(() => {\n        this._editToolbar.hide();\n        this._uiManager.editAltText(this, true);\n      });\n      return;\n    }\n    if (!this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) {\n      this._reportTelemetry({\n        action: \"pdfjs.image.image_added\",\n        data: {\n          alt_text_modal: false,\n          alt_text_type: \"empty\"\n        }\n      });\n      try {\n        this.mlGuessAltText();\n      } catch {}\n    }\n    this.div.focus();\n  }\n  async mlGuessAltText(imageData = null, updateAltTextData = true) {\n    if (this.hasAltTextData()) {\n      return null;\n    }\n    const {\n      mlManager\n    } = this._uiManager;\n    if (!mlManager) {\n      throw new Error(\"No ML.\");\n    }\n    if (!(await mlManager.isEnabledFor(\"altText\"))) {\n      throw new Error(\"ML isn't enabled for alt text.\");\n    }\n    const {\n      data,\n      width,\n      height\n    } = imageData || this.copyCanvas(null, null, true).imageData;\n    const response = await mlManager.guess({\n      name: \"altText\",\n      request: {\n        data,\n        width,\n        height,\n        channels: data.length / (width * height)\n      }\n    });\n    if (!response) {\n      throw new Error(\"No response from the AI service.\");\n    }\n    if (response.error) {\n      throw new Error(\"Error from the AI service.\");\n    }\n    if (response.cancel) {\n      return null;\n    }\n    if (!response.output) {\n      throw new Error(\"No valid response from the AI service.\");\n    }\n    const altText = response.output;\n    await this.setGuessedAltText(altText);\n    if (updateAltTextData && !this.hasAltTextData()) {\n      this.altTextData = {\n        alt: altText,\n        decorative: false\n      };\n    }\n    return altText;\n  }\n  #getBitmap() {\n    if (this.#bitmapId) {\n      this._uiManager.enableWaiting(true);\n      this._uiManager.imageManager.getFromId(this.#bitmapId).then(data => this.#getBitmapFetched(data, true)).finally(() => this.#getBitmapDone());\n      return;\n    }\n    if (this.#bitmapUrl) {\n      const url = this.#bitmapUrl;\n      this.#bitmapUrl = null;\n      this._uiManager.enableWaiting(true);\n      this.#bitmapPromise = this._uiManager.imageManager.getFromUrl(url).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone());\n      return;\n    }\n    if (this.#bitmapFile) {\n      const file = this.#bitmapFile;\n      this.#bitmapFile = null;\n      this._uiManager.enableWaiting(true);\n      this.#bitmapPromise = this._uiManager.imageManager.getFromFile(file).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone());\n      return;\n    }\n    const input = document.createElement(\"input\");\n    input.type = \"file\";\n    input.accept = SupportedImageMimeTypes.join(\",\");\n    const signal = this._uiManager._signal;\n    this.#bitmapPromise = new Promise(resolve => {\n      input.addEventListener(\"change\", async () => {\n        if (!input.files || input.files.length === 0) {\n          this.remove();\n        } else {\n          this._uiManager.enableWaiting(true);\n          const data = await this._uiManager.imageManager.getFromFile(input.files[0]);\n          this._reportTelemetry({\n            action: \"pdfjs.image.image_selected\",\n            data: {\n              alt_text_modal: this._uiManager.useNewAltTextFlow\n            }\n          });\n          this.#getBitmapFetched(data);\n        }\n        resolve();\n      }, {\n        signal\n      });\n      input.addEventListener(\"cancel\", () => {\n        this.remove();\n        resolve();\n      }, {\n        signal\n      });\n    }).finally(() => this.#getBitmapDone());\n    input.click();\n  }\n  remove() {\n    if (this.#bitmapId) {\n      this.#bitmap = null;\n      this._uiManager.imageManager.deleteId(this.#bitmapId);\n      this.#canvas?.remove();\n      this.#canvas = null;\n      if (this.#resizeTimeoutId) {\n        clearTimeout(this.#resizeTimeoutId);\n        this.#resizeTimeoutId = null;\n      }\n    }\n    super.remove();\n  }\n  rebuild() {\n    if (!this.parent) {\n      if (this.#bitmapId) {\n        this.#getBitmap();\n      }\n      return;\n    }\n    super.rebuild();\n    if (this.div === null) {\n      return;\n    }\n    if (this.#bitmapId && this.#canvas === null) {\n      this.#getBitmap();\n    }\n    if (!this.isAttachedToDOM) {\n      this.parent.add(this);\n    }\n  }\n  onceAdded(focus) {\n    this._isDraggable = true;\n    if (focus) {\n      this.div.focus();\n    }\n  }\n  isEmpty() {\n    return !(this.#bitmapPromise || this.#bitmap || this.#bitmapUrl || this.#bitmapFile || this.#bitmapId || this.#missingCanvas);\n  }\n  get toolbarButtons() {\n    return [[\"altText\", this.createAltText()]];\n  }\n  get isResizable() {\n    return true;\n  }\n  render() {\n    if (this.div) {\n      return this.div;\n    }\n    let baseX, baseY;\n    if (this._isCopy) {\n      baseX = this.x;\n      baseY = this.y;\n    }\n    super.render();\n    this.div.hidden = true;\n    this.createAltText();\n    if (!this.#missingCanvas) {\n      if (this.#bitmap) {\n        this.#createCanvas();\n      } else {\n        this.#getBitmap();\n      }\n    }\n    if (this._isCopy) {\n      this._moveAfterPaste(baseX, baseY);\n    }\n    this._uiManager.addShouldRescale(this);\n    return this.div;\n  }\n  setCanvas(annotationElementId, canvas) {\n    const {\n      id: bitmapId,\n      bitmap\n    } = this._uiManager.imageManager.getFromCanvas(annotationElementId, canvas);\n    canvas.remove();\n    if (bitmapId && this._uiManager.imageManager.isValidId(bitmapId)) {\n      this.#bitmapId = bitmapId;\n      if (bitmap) {\n        this.#bitmap = bitmap;\n      }\n      this.#missingCanvas = false;\n      this.#createCanvas();\n    }\n  }\n  _onResized() {\n    this.onScaleChanging();\n  }\n  onScaleChanging() {\n    if (!this.parent) {\n      return;\n    }\n    if (this.#resizeTimeoutId !== null) {\n      clearTimeout(this.#resizeTimeoutId);\n    }\n    const TIME_TO_WAIT = 200;\n    this.#resizeTimeoutId = setTimeout(() => {\n      this.#resizeTimeoutId = null;\n      this.#drawBitmap();\n    }, TIME_TO_WAIT);\n  }\n  #createCanvas() {\n    const {\n      div\n    } = this;\n    let {\n      width,\n      height\n    } = this.#bitmap;\n    const [pageWidth, pageHeight] = this.pageDimensions;\n    const MAX_RATIO = 0.75;\n    if (this.width) {\n      width = this.width * pageWidth;\n      height = this.height * pageHeight;\n    } else if (width > MAX_RATIO * pageWidth || height > MAX_RATIO * pageHeight) {\n      const factor = Math.min(MAX_RATIO * pageWidth / width, MAX_RATIO * pageHeight / height);\n      width *= factor;\n      height *= factor;\n    }\n    this._uiManager.enableWaiting(false);\n    const canvas = this.#canvas = document.createElement(\"canvas\");\n    canvas.setAttribute(\"role\", \"img\");\n    this.addContainer(canvas);\n    this.width = width / pageWidth;\n    this.height = height / pageHeight;\n    this.setDims();\n    if (this._initialOptions?.isCentered) {\n      this.center();\n    } else {\n      this.fixAndSetPosition();\n    }\n    this._initialOptions = null;\n    if (!this._uiManager.useNewAltTextWhenAddingImage || !this._uiManager.useNewAltTextFlow || this.annotationElementId) {\n      div.hidden = false;\n    }\n    this.#drawBitmap();\n    if (!this.#hasBeenAddedInUndoStack) {\n      this.parent.addUndoableEditor(this);\n      this.#hasBeenAddedInUndoStack = true;\n    }\n    this._reportTelemetry({\n      action: \"inserted_image\"\n    });\n    if (this.#bitmapFileName) {\n      this.div.setAttribute(\"aria-description\", this.#bitmapFileName);\n    }\n    if (!this.annotationElementId) {\n      this._uiManager.a11yAlert(\"pdfjs-editor-stamp-added-alert\");\n    }\n  }\n  copyCanvas(maxDataDimension, maxPreviewDimension, createImageData = false) {\n    if (!maxDataDimension) {\n      maxDataDimension = 224;\n    }\n    const {\n      width: bitmapWidth,\n      height: bitmapHeight\n    } = this.#bitmap;\n    const outputScale = new OutputScale();\n    let bitmap = this.#bitmap;\n    let width = bitmapWidth,\n      height = bitmapHeight;\n    let canvas = null;\n    if (maxPreviewDimension) {\n      if (bitmapWidth > maxPreviewDimension || bitmapHeight > maxPreviewDimension) {\n        const ratio = Math.min(maxPreviewDimension / bitmapWidth, maxPreviewDimension / bitmapHeight);\n        width = Math.floor(bitmapWidth * ratio);\n        height = Math.floor(bitmapHeight * ratio);\n      }\n      canvas = document.createElement(\"canvas\");\n      const scaledWidth = canvas.width = Math.ceil(width * outputScale.sx);\n      const scaledHeight = canvas.height = Math.ceil(height * outputScale.sy);\n      if (!this.#isSvg) {\n        bitmap = this.#scaleBitmap(scaledWidth, scaledHeight);\n      }\n      const ctx = canvas.getContext(\"2d\");\n      ctx.filter = this._uiManager.hcmFilter;\n      let white = \"white\",\n        black = \"#cfcfd8\";\n      if (this._uiManager.hcmFilter !== \"none\") {\n        black = \"black\";\n      } else if (ColorScheme.isDarkMode) {\n        white = \"#8f8f9d\";\n        black = \"#42414d\";\n      }\n      const boxDim = 15;\n      const boxDimWidth = boxDim * outputScale.sx;\n      const boxDimHeight = boxDim * outputScale.sy;\n      const pattern = new OffscreenCanvas(boxDimWidth * 2, boxDimHeight * 2);\n      const patternCtx = pattern.getContext(\"2d\");\n      patternCtx.fillStyle = white;\n      patternCtx.fillRect(0, 0, boxDimWidth * 2, boxDimHeight * 2);\n      patternCtx.fillStyle = black;\n      patternCtx.fillRect(0, 0, boxDimWidth, boxDimHeight);\n      patternCtx.fillRect(boxDimWidth, boxDimHeight, boxDimWidth, boxDimHeight);\n      ctx.fillStyle = ctx.createPattern(pattern, \"repeat\");\n      ctx.fillRect(0, 0, scaledWidth, scaledHeight);\n      ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight);\n    }\n    let imageData = null;\n    if (createImageData) {\n      let dataWidth, dataHeight;\n      if (outputScale.symmetric && bitmap.width < maxDataDimension && bitmap.height < maxDataDimension) {\n        dataWidth = bitmap.width;\n        dataHeight = bitmap.height;\n      } else {\n        bitmap = this.#bitmap;\n        if (bitmapWidth > maxDataDimension || bitmapHeight > maxDataDimension) {\n          const ratio = Math.min(maxDataDimension / bitmapWidth, maxDataDimension / bitmapHeight);\n          dataWidth = Math.floor(bitmapWidth * ratio);\n          dataHeight = Math.floor(bitmapHeight * ratio);\n          if (!this.#isSvg) {\n            bitmap = this.#scaleBitmap(dataWidth, dataHeight);\n          }\n        }\n      }\n      const offscreen = new OffscreenCanvas(dataWidth, dataHeight);\n      const offscreenCtx = offscreen.getContext(\"2d\", {\n        willReadFrequently: true\n      });\n      offscreenCtx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, dataWidth, dataHeight);\n      imageData = {\n        width: dataWidth,\n        height: dataHeight,\n        data: offscreenCtx.getImageData(0, 0, dataWidth, dataHeight).data\n      };\n    }\n    return {\n      canvas,\n      width,\n      height,\n      imageData\n    };\n  }\n  #scaleBitmap(width, height) {\n    const {\n      width: bitmapWidth,\n      height: bitmapHeight\n    } = this.#bitmap;\n    let newWidth = bitmapWidth;\n    let newHeight = bitmapHeight;\n    let bitmap = this.#bitmap;\n    while (newWidth > 2 * width || newHeight > 2 * height) {\n      const prevWidth = newWidth;\n      const prevHeight = newHeight;\n      if (newWidth > 2 * width) {\n        newWidth = Math.ceil(newWidth / 2);\n      }\n      if (newHeight > 2 * height) {\n        newHeight = Math.ceil(newHeight / 2);\n      }\n      const offscreen = new OffscreenCanvas(newWidth, newHeight);\n      const ctx = offscreen.getContext(\"2d\");\n      ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight);\n      bitmap = offscreen.transferToImageBitmap();\n    }\n    return bitmap;\n  }\n  #drawBitmap() {\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    const {\n      width,\n      height\n    } = this;\n    const outputScale = new OutputScale();\n    const scaledWidth = Math.ceil(width * parentWidth * outputScale.sx);\n    const scaledHeight = Math.ceil(height * parentHeight * outputScale.sy);\n    const canvas = this.#canvas;\n    if (!canvas || canvas.width === scaledWidth && canvas.height === scaledHeight) {\n      return;\n    }\n    canvas.width = scaledWidth;\n    canvas.height = scaledHeight;\n    const bitmap = this.#isSvg ? this.#bitmap : this.#scaleBitmap(scaledWidth, scaledHeight);\n    const ctx = canvas.getContext(\"2d\");\n    ctx.filter = this._uiManager.hcmFilter;\n    ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight);\n  }\n  #serializeBitmap(toUrl) {\n    if (toUrl) {\n      if (this.#isSvg) {\n        const url = this._uiManager.imageManager.getSvgUrl(this.#bitmapId);\n        if (url) {\n          return url;\n        }\n      }\n      const canvas = document.createElement(\"canvas\");\n      ({\n        width: canvas.width,\n        height: canvas.height\n      } = this.#bitmap);\n      const ctx = canvas.getContext(\"2d\");\n      ctx.drawImage(this.#bitmap, 0, 0);\n      return canvas.toDataURL();\n    }\n    if (this.#isSvg) {\n      const [pageWidth, pageHeight] = this.pageDimensions;\n      const width = Math.round(this.width * pageWidth * PixelsPerInch.PDF_TO_CSS_UNITS);\n      const height = Math.round(this.height * pageHeight * PixelsPerInch.PDF_TO_CSS_UNITS);\n      const offscreen = new OffscreenCanvas(width, height);\n      const ctx = offscreen.getContext(\"2d\");\n      ctx.drawImage(this.#bitmap, 0, 0, this.#bitmap.width, this.#bitmap.height, 0, 0, width, height);\n      return offscreen.transferToImageBitmap();\n    }\n    return structuredClone(this.#bitmap);\n  }\n  static async deserialize(data, parent, uiManager) {\n    let initialData = null;\n    let missingCanvas = false;\n    if (data instanceof StampAnnotationElement) {\n      const {\n        data: {\n          rect,\n          rotation,\n          id,\n          structParent,\n          popupRef,\n          richText,\n          contentsObj,\n          creationDate,\n          modificationDate\n        },\n        container,\n        parent: {\n          page: {\n            pageNumber\n          }\n        },\n        canvas\n      } = data;\n      let bitmapId, bitmap;\n      if (canvas) {\n        delete data.canvas;\n        ({\n          id: bitmapId,\n          bitmap\n        } = uiManager.imageManager.getFromCanvas(container.id, canvas));\n        canvas.remove();\n      } else {\n        missingCanvas = true;\n        data._hasNoCanvas = true;\n      }\n      const altText = (await parent._structTree.getAriaAttributes(`${AnnotationPrefix}${id}`))?.get(\"aria-label\") || \"\";\n      initialData = data = {\n        annotationType: AnnotationEditorType.STAMP,\n        bitmapId,\n        bitmap,\n        pageIndex: pageNumber - 1,\n        rect: rect.slice(0),\n        rotation,\n        annotationElementId: id,\n        id,\n        deleted: false,\n        accessibilityData: {\n          decorative: false,\n          altText\n        },\n        isSvg: false,\n        structParent,\n        popupRef,\n        richText,\n        comment: contentsObj?.str || null,\n        creationDate,\n        modificationDate\n      };\n    }\n    const editor = await super.deserialize(data, parent, uiManager);\n    const {\n      rect,\n      bitmap,\n      bitmapUrl,\n      bitmapId,\n      isSvg,\n      accessibilityData\n    } = data;\n    if (missingCanvas) {\n      uiManager.addMissingCanvas(data.id, editor);\n      editor.#missingCanvas = true;\n    } else if (bitmapId && uiManager.imageManager.isValidId(bitmapId)) {\n      editor.#bitmapId = bitmapId;\n      if (bitmap) {\n        editor.#bitmap = bitmap;\n      }\n    } else {\n      editor.#bitmapUrl = bitmapUrl;\n    }\n    editor.#isSvg = isSvg;\n    const [parentWidth, parentHeight] = editor.pageDimensions;\n    editor.width = (rect[2] - rect[0]) / parentWidth;\n    editor.height = (rect[3] - rect[1]) / parentHeight;\n    if (accessibilityData) {\n      editor.altTextData = accessibilityData;\n    }\n    editor._initialData = initialData;\n    if (data.comment) {\n      editor.setCommentData(data);\n    }\n    editor.#hasBeenAddedInUndoStack = !!initialData;\n    return editor;\n  }\n  serialize(isForCopying = false, context = null) {\n    if (this.isEmpty()) {\n      return null;\n    }\n    if (this.deleted) {\n      return this.serializeDeleted();\n    }\n    const serialized = Object.assign(super.serialize(isForCopying), {\n      bitmapId: this.#bitmapId,\n      isSvg: this.#isSvg\n    });\n    this.addComment(serialized);\n    if (isForCopying) {\n      serialized.bitmapUrl = this.#serializeBitmap(true);\n      serialized.accessibilityData = this.serializeAltText(true);\n      serialized.isCopy = true;\n      return serialized;\n    }\n    const {\n      decorative,\n      altText\n    } = this.serializeAltText(false);\n    if (!decorative && altText) {\n      serialized.accessibilityData = {\n        type: \"Figure\",\n        alt: altText\n      };\n    }\n    if (this.annotationElementId) {\n      const changes = this.#hasElementChanged(serialized);\n      if (changes.isSame) {\n        return null;\n      }\n      if (changes.isSameAltText) {\n        delete serialized.accessibilityData;\n      } else {\n        serialized.accessibilityData.structParent = this._initialData.structParent ?? -1;\n      }\n      serialized.id = this.annotationElementId;\n      delete serialized.bitmapId;\n      return serialized;\n    }\n    if (context === null) {\n      return serialized;\n    }\n    context.stamps ||= new Map();\n    const area = this.#isSvg ? (serialized.rect[2] - serialized.rect[0]) * (serialized.rect[3] - serialized.rect[1]) : null;\n    if (!context.stamps.has(this.#bitmapId)) {\n      context.stamps.set(this.#bitmapId, {\n        area,\n        serialized\n      });\n      serialized.bitmap = this.#serializeBitmap(false);\n    } else if (this.#isSvg) {\n      const prevData = context.stamps.get(this.#bitmapId);\n      if (area > prevData.area) {\n        prevData.area = area;\n        prevData.serialized.bitmap.close();\n        prevData.serialized.bitmap = this.#serializeBitmap(false);\n      }\n    }\n    return serialized;\n  }\n  #hasElementChanged(serialized) {\n    const {\n      pageIndex,\n      accessibilityData: {\n        altText\n      }\n    } = this._initialData;\n    const isSamePageIndex = serialized.pageIndex === pageIndex;\n    const isSameAltText = (serialized.accessibilityData?.alt || \"\") === altText;\n    return {\n      isSame: !this.hasEditedComment && !this._hasBeenMoved && !this._hasBeenResized && isSamePageIndex && isSameAltText,\n      isSameAltText\n    };\n  }\n  renderAnnotationElement(annotation) {\n    if (this.deleted) {\n      annotation.hide();\n      return null;\n    }\n    annotation.updateEdited({\n      rect: this.getPDFRect(),\n      popup: this.comment\n    });\n    return null;\n  }\n}\n\n;// ./src/display/editor/annotation_editor_layer.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass AnnotationEditorLayer {\n  #accessibilityManager;\n  #allowClick = false;\n  #annotationLayer = null;\n  #clickAC = null;\n  #editorFocusTimeoutId = null;\n  #editors = new Map();\n  #hadPointerDown = false;\n  #isDisabling = false;\n  #isEnabling = false;\n  #drawingAC = null;\n  #focusedElement = null;\n  #textLayer = null;\n  #textSelectionAC = null;\n  #textLayerDblClickAC = null;\n  #lastPointerDownTimestamp = -1;\n  #uiManager;\n  static _initialized = false;\n  static #editorTypes = new Map([FreeTextEditor, InkEditor, StampEditor, HighlightEditor, SignatureEditor].map(type => [type._editorType, type]));\n  constructor({\n    uiManager,\n    pageIndex,\n    div,\n    structTreeLayer,\n    accessibilityManager,\n    annotationLayer,\n    drawLayer,\n    textLayer,\n    viewport,\n    l10n\n  }) {\n    const editorTypes = [...AnnotationEditorLayer.#editorTypes.values()];\n    if (!AnnotationEditorLayer._initialized) {\n      AnnotationEditorLayer._initialized = true;\n      for (const editorType of editorTypes) {\n        editorType.initialize(l10n, uiManager);\n      }\n    }\n    uiManager.registerEditorTypes(editorTypes);\n    this.#uiManager = uiManager;\n    this.pageIndex = pageIndex;\n    this.div = div;\n    this.#accessibilityManager = accessibilityManager;\n    this.#annotationLayer = annotationLayer;\n    this.viewport = viewport;\n    this.#textLayer = textLayer;\n    this.drawLayer = drawLayer;\n    this._structTree = structTreeLayer;\n    this.#uiManager.addLayer(this);\n  }\n  get isEmpty() {\n    return this.#editors.size === 0;\n  }\n  get isInvisible() {\n    return this.isEmpty && this.#uiManager.getMode() === AnnotationEditorType.NONE;\n  }\n  updateToolbar(options) {\n    this.#uiManager.updateToolbar(options);\n  }\n  updateMode(mode = this.#uiManager.getMode()) {\n    this.#cleanup();\n    switch (mode) {\n      case AnnotationEditorType.NONE:\n        this.div.classList.toggle(\"nonEditing\", true);\n        this.disableTextSelection();\n        this.togglePointerEvents(false);\n        this.toggleAnnotationLayerPointerEvents(true);\n        this.disableClick();\n        return;\n      case AnnotationEditorType.INK:\n        this.disableTextSelection();\n        this.togglePointerEvents(true);\n        this.enableClick();\n        break;\n      case AnnotationEditorType.HIGHLIGHT:\n        this.enableTextSelection();\n        this.togglePointerEvents(false);\n        this.disableClick();\n        break;\n      default:\n        this.disableTextSelection();\n        this.togglePointerEvents(true);\n        this.enableClick();\n    }\n    this.toggleAnnotationLayerPointerEvents(false);\n    const {\n      classList\n    } = this.div;\n    classList.toggle(\"nonEditing\", false);\n    if (mode === AnnotationEditorType.POPUP) {\n      classList.toggle(\"commentEditing\", true);\n    } else {\n      classList.toggle(\"commentEditing\", false);\n      for (const editorType of AnnotationEditorLayer.#editorTypes.values()) {\n        classList.toggle(`${editorType._type}Editing`, mode === editorType._editorType);\n      }\n    }\n    this.div.hidden = false;\n  }\n  hasTextLayer(textLayer) {\n    return textLayer === this.#textLayer?.div;\n  }\n  setEditingState(isEditing) {\n    this.#uiManager.setEditingState(isEditing);\n  }\n  addCommands(params) {\n    this.#uiManager.addCommands(params);\n  }\n  cleanUndoStack(type) {\n    this.#uiManager.cleanUndoStack(type);\n  }\n  toggleDrawing(enabled = false) {\n    this.div.classList.toggle(\"drawing\", !enabled);\n  }\n  togglePointerEvents(enabled = false) {\n    this.div.classList.toggle(\"disabled\", !enabled);\n  }\n  toggleAnnotationLayerPointerEvents(enabled = false) {\n    this.#annotationLayer?.togglePointerEvents(enabled);\n  }\n  get #allEditorsIterator() {\n    return this.#editors.size !== 0 ? this.#editors.values() : this.#uiManager.getEditors(this.pageIndex);\n  }\n  async enable() {\n    this.#isEnabling = true;\n    this.div.tabIndex = 0;\n    this.togglePointerEvents(true);\n    this.div.classList.toggle(\"nonEditing\", false);\n    this.#textLayerDblClickAC?.abort();\n    this.#textLayerDblClickAC = null;\n    const annotationElementIds = new Set();\n    for (const editor of this.#allEditorsIterator) {\n      editor.enableEditing();\n      editor.show(true);\n      if (editor.annotationElementId) {\n        this.#uiManager.removeChangedExistingAnnotation(editor);\n        annotationElementIds.add(editor.annotationElementId);\n      }\n    }\n    const annotationLayer = this.#annotationLayer;\n    if (annotationLayer) {\n      for (const editable of annotationLayer.getEditableAnnotations()) {\n        editable.hide();\n        if (this.#uiManager.isDeletedAnnotationElement(editable.data.id)) {\n          continue;\n        }\n        if (annotationElementIds.has(editable.data.id)) {\n          continue;\n        }\n        const editor = await this.deserialize(editable);\n        if (!editor) {\n          continue;\n        }\n        this.addOrRebuild(editor);\n        editor.enableEditing();\n      }\n    }\n    this.#isEnabling = false;\n    this.#uiManager._eventBus.dispatch(\"editorsrendered\", {\n      source: this,\n      pageNumber: this.pageIndex + 1\n    });\n  }\n  disable() {\n    this.#isDisabling = true;\n    this.div.tabIndex = -1;\n    this.togglePointerEvents(false);\n    this.div.classList.toggle(\"nonEditing\", true);\n    if (this.#textLayer && !this.#textLayerDblClickAC) {\n      this.#textLayerDblClickAC = new AbortController();\n      const signal = this.#uiManager.combinedSignal(this.#textLayerDblClickAC);\n      this.#textLayer.div.addEventListener(\"pointerdown\", e => {\n        const DBL_CLICK_THRESHOLD = 500;\n        const {\n          clientX,\n          clientY,\n          timeStamp\n        } = e;\n        const lastPointerDownTimestamp = this.#lastPointerDownTimestamp;\n        if (timeStamp - lastPointerDownTimestamp > DBL_CLICK_THRESHOLD) {\n          this.#lastPointerDownTimestamp = timeStamp;\n          return;\n        }\n        this.#lastPointerDownTimestamp = -1;\n        const {\n          classList\n        } = this.div;\n        classList.toggle(\"getElements\", true);\n        const elements = document.elementsFromPoint(clientX, clientY);\n        classList.toggle(\"getElements\", false);\n        if (!this.div.contains(elements[0])) {\n          return;\n        }\n        let id;\n        const regex = new RegExp(`^${AnnotationEditorPrefix}[0-9]+$`);\n        for (const element of elements) {\n          if (regex.test(element.id)) {\n            id = element.id;\n            break;\n          }\n        }\n        if (!id) {\n          return;\n        }\n        const editor = this.#editors.get(id);\n        if (editor?.annotationElementId === null) {\n          stopEvent(e);\n          editor.dblclick(e);\n        }\n      }, {\n        signal,\n        capture: true\n      });\n    }\n    const annotationLayer = this.#annotationLayer;\n    const needFakeAnnotation = [];\n    if (annotationLayer) {\n      const changedAnnotations = new Map();\n      const resetAnnotations = new Map();\n      for (const editor of this.#allEditorsIterator) {\n        editor.disableEditing();\n        if (!editor.annotationElementId) {\n          needFakeAnnotation.push(editor);\n          continue;\n        }\n        if (editor.serialize() !== null) {\n          changedAnnotations.set(editor.annotationElementId, editor);\n          continue;\n        } else {\n          resetAnnotations.set(editor.annotationElementId, editor);\n        }\n        this.getEditableAnnotation(editor.annotationElementId)?.show();\n        editor.remove();\n      }\n      for (const editable of annotationLayer.getEditableAnnotations()) {\n        const {\n          id\n        } = editable.data;\n        if (this.#uiManager.isDeletedAnnotationElement(id)) {\n          editable.updateEdited({\n            deleted: true\n          });\n          continue;\n        }\n        let editor = resetAnnotations.get(id);\n        if (editor) {\n          editor.resetAnnotationElement(editable);\n          editor.show(false);\n          editable.show();\n          continue;\n        }\n        editor = changedAnnotations.get(id);\n        if (editor) {\n          this.#uiManager.addChangedExistingAnnotation(editor);\n          if (editor.renderAnnotationElement(editable)) {\n            editor.show(false);\n          }\n        }\n        editable.show();\n      }\n    }\n    this.#cleanup();\n    if (this.isEmpty) {\n      this.div.hidden = true;\n    }\n    const {\n      classList\n    } = this.div;\n    for (const editorType of AnnotationEditorLayer.#editorTypes.values()) {\n      classList.remove(`${editorType._type}Editing`);\n    }\n    this.disableTextSelection();\n    this.toggleAnnotationLayerPointerEvents(true);\n    annotationLayer?.updateFakeAnnotations(needFakeAnnotation);\n    this.#isDisabling = false;\n  }\n  getEditableAnnotation(id) {\n    return this.#annotationLayer?.getEditableAnnotation(id) || null;\n  }\n  setActiveEditor(editor) {\n    const currentActive = this.#uiManager.getActive();\n    if (currentActive === editor) {\n      return;\n    }\n    this.#uiManager.setActiveEditor(editor);\n  }\n  enableTextSelection() {\n    this.div.tabIndex = -1;\n    if (this.#textLayer?.div && !this.#textSelectionAC) {\n      this.#textSelectionAC = new AbortController();\n      const signal = this.#uiManager.combinedSignal(this.#textSelectionAC);\n      this.#textLayer.div.addEventListener(\"pointerdown\", this.#textLayerPointerDown.bind(this), {\n        signal\n      });\n      this.#textLayer.div.classList.add(\"highlighting\");\n    }\n  }\n  disableTextSelection() {\n    this.div.tabIndex = 0;\n    if (this.#textLayer?.div && this.#textSelectionAC) {\n      this.#textSelectionAC.abort();\n      this.#textSelectionAC = null;\n      this.#textLayer.div.classList.remove(\"highlighting\");\n    }\n  }\n  #textLayerPointerDown(event) {\n    this.#uiManager.unselectAll();\n    const {\n      target\n    } = event;\n    if (target === this.#textLayer.div || (target.getAttribute(\"role\") === \"img\" || target.classList.contains(\"endOfContent\") || target.classList.contains(\"textLayerImagePlaceholder\")) && this.#textLayer.div.contains(target)) {\n      const {\n        isMac\n      } = FeatureTest.platform;\n      if (event.button !== 0 || event.ctrlKey && isMac) {\n        return;\n      }\n      this.#uiManager.showAllEditors(\"highlight\", true, true);\n      this.#textLayer.div.classList.add(\"free\");\n      this.toggleDrawing();\n      HighlightEditor.startHighlighting(this, this.#uiManager.direction === \"ltr\", {\n        target: this.#textLayer.div,\n        x: event.x,\n        y: event.y\n      });\n      this.#textLayer.div.addEventListener(\"pointerup\", () => {\n        this.#textLayer.div.classList.remove(\"free\");\n        this.toggleDrawing(true);\n      }, {\n        once: true,\n        signal: this.#uiManager._signal\n      });\n      event.preventDefault();\n    }\n  }\n  enableClick() {\n    if (this.#clickAC) {\n      return;\n    }\n    this.#clickAC = new AbortController();\n    const signal = this.#uiManager.combinedSignal(this.#clickAC);\n    this.div.addEventListener(\"pointerdown\", this.pointerdown.bind(this), {\n      signal\n    });\n    const pointerup = this.pointerup.bind(this);\n    this.div.addEventListener(\"pointerup\", pointerup, {\n      signal\n    });\n    this.div.addEventListener(\"pointercancel\", pointerup, {\n      signal\n    });\n  }\n  disableClick() {\n    this.#clickAC?.abort();\n    this.#clickAC = null;\n  }\n  attach(editor) {\n    this.#editors.set(editor.id, editor);\n    const {\n      annotationElementId\n    } = editor;\n    if (annotationElementId && this.#uiManager.isDeletedAnnotationElement(annotationElementId)) {\n      this.#uiManager.removeDeletedAnnotationElement(editor);\n    }\n  }\n  detach(editor) {\n    this.#editors.delete(editor.id);\n    this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv);\n    if (!this.#isDisabling && editor.annotationElementId) {\n      this.#uiManager.addDeletedAnnotationElement(editor);\n    }\n  }\n  remove(editor) {\n    this.detach(editor);\n    this.#uiManager.removeEditor(editor);\n    editor.div.remove();\n    editor.isAttachedToDOM = false;\n  }\n  changeParent(editor) {\n    if (editor.parent === this) {\n      return;\n    }\n    if (editor.parent && editor.annotationElementId) {\n      this.#uiManager.addDeletedAnnotationElement(editor);\n      AnnotationEditor.deleteAnnotationElement(editor);\n      editor.annotationElementId = null;\n    }\n    this.attach(editor);\n    editor.parent?.detach(editor);\n    editor.setParent(this);\n    if (editor.div && editor.isAttachedToDOM) {\n      editor.div.remove();\n      this.div.append(editor.div);\n    }\n  }\n  add(editor) {\n    if (editor.parent === this && editor.isAttachedToDOM) {\n      return;\n    }\n    this.changeParent(editor);\n    this.#uiManager.addEditor(editor);\n    this.attach(editor);\n    if (!editor.isAttachedToDOM) {\n      const div = editor.render();\n      this.div.append(div);\n      editor.isAttachedToDOM = true;\n    }\n    editor.fixAndSetPosition();\n    editor.onceAdded(!this.#isEnabling);\n    this.#uiManager.addToAnnotationStorage(editor);\n    editor._reportTelemetry(editor.telemetryInitialData);\n  }\n  moveEditorInDOM(editor) {\n    if (!editor.isAttachedToDOM) {\n      return;\n    }\n    const {\n      activeElement\n    } = document;\n    if (editor.div.contains(activeElement) && !this.#editorFocusTimeoutId) {\n      editor._focusEventsAllowed = false;\n      this.#editorFocusTimeoutId = setTimeout(() => {\n        this.#editorFocusTimeoutId = null;\n        if (!editor.div.contains(document.activeElement)) {\n          editor.div.addEventListener(\"focusin\", () => {\n            editor._focusEventsAllowed = true;\n          }, {\n            once: true,\n            signal: this.#uiManager._signal\n          });\n          activeElement.focus();\n        } else {\n          editor._focusEventsAllowed = true;\n        }\n      }, 0);\n    }\n    editor._structTreeParentId = this.#accessibilityManager?.moveElementInDOM(this.div, editor.div, editor.contentDiv, true);\n  }\n  addOrRebuild(editor) {\n    if (editor.needsToBeRebuilt()) {\n      editor.parent ||= this;\n      editor.rebuild();\n      editor.show();\n    } else {\n      this.add(editor);\n    }\n  }\n  addUndoableEditor(editor) {\n    const cmd = () => editor._uiManager.rebuild(editor);\n    const undo = () => {\n      editor.remove();\n    };\n    this.addCommands({\n      cmd,\n      undo,\n      mustExec: false\n    });\n  }\n  getEditorByUID(uid) {\n    for (const editor of this.#editors.values()) {\n      if (editor.uid === uid) {\n        return editor;\n      }\n    }\n    return null;\n  }\n  get #currentEditorType() {\n    return AnnotationEditorLayer.#editorTypes.get(this.#uiManager.getMode());\n  }\n  combinedSignal(ac) {\n    return this.#uiManager.combinedSignal(ac);\n  }\n  #createNewEditor(params) {\n    const editorType = this.#currentEditorType;\n    return editorType ? new editorType.prototype.constructor(params) : null;\n  }\n  canCreateNewEmptyEditor() {\n    return this.#currentEditorType?.canCreateNewEmptyEditor();\n  }\n  async pasteEditor(options, params) {\n    this.updateToolbar(options);\n    await this.#uiManager.updateMode(options.mode);\n    const {\n      offsetX,\n      offsetY\n    } = this.#getCenterPoint();\n    const id = this.#uiManager.getId();\n    const editor = this.#createNewEditor({\n      parent: this,\n      id,\n      x: offsetX,\n      y: offsetY,\n      uiManager: this.#uiManager,\n      isCentered: true,\n      ...params\n    });\n    if (editor) {\n      this.add(editor);\n    }\n  }\n  async deserialize(data) {\n    return (await AnnotationEditorLayer.#editorTypes.get(data.annotationType ?? data.annotationEditorType)?.deserialize(data, this, this.#uiManager)) || null;\n  }\n  createAndAddNewEditor(event, isCentered, data = {}) {\n    const id = this.#uiManager.getId();\n    const editor = this.#createNewEditor({\n      parent: this,\n      id,\n      x: event.offsetX,\n      y: event.offsetY,\n      uiManager: this.#uiManager,\n      isCentered,\n      ...data\n    });\n    if (editor) {\n      this.add(editor);\n    }\n    return editor;\n  }\n  get boundingClientRect() {\n    return this.div.getBoundingClientRect();\n  }\n  #getCenterPoint() {\n    const {\n      x,\n      y,\n      width,\n      height\n    } = this.boundingClientRect;\n    const tlX = Math.max(0, x);\n    const tlY = Math.max(0, y);\n    const brX = Math.min(window.innerWidth, x + width);\n    const brY = Math.min(window.innerHeight, y + height);\n    const centerX = (tlX + brX) / 2 - x;\n    const centerY = (tlY + brY) / 2 - y;\n    const [offsetX, offsetY] = this.viewport.rotation % 180 === 0 ? [centerX, centerY] : [centerY, centerX];\n    return {\n      offsetX,\n      offsetY\n    };\n  }\n  addNewEditor(data = {}) {\n    this.createAndAddNewEditor(this.#getCenterPoint(), true, data);\n  }\n  setSelected(editor) {\n    this.#uiManager.setSelected(editor);\n  }\n  toggleSelected(editor) {\n    this.#uiManager.toggleSelected(editor);\n  }\n  unselect(editor) {\n    this.#uiManager.unselect(editor);\n  }\n  pointerup(event) {\n    const {\n      isMac\n    } = FeatureTest.platform;\n    if (event.button !== 0 || event.ctrlKey && isMac) {\n      return;\n    }\n    if (event.target !== this.div) {\n      return;\n    }\n    if (!this.#hadPointerDown) {\n      return;\n    }\n    this.#hadPointerDown = false;\n    if (this.#currentEditorType?.isDrawer && this.#currentEditorType.supportMultipleDrawings) {\n      return;\n    }\n    if (!this.#allowClick) {\n      this.#allowClick = true;\n      return;\n    }\n    const currentMode = this.#uiManager.getMode();\n    if (currentMode === AnnotationEditorType.STAMP || currentMode === AnnotationEditorType.POPUP || currentMode === AnnotationEditorType.SIGNATURE) {\n      this.#uiManager.unselectAll();\n      return;\n    }\n    this.createAndAddNewEditor(event, false);\n  }\n  pointerdown(event) {\n    if (this.#uiManager.getMode() === AnnotationEditorType.HIGHLIGHT) {\n      this.enableTextSelection();\n    }\n    if (this.#hadPointerDown) {\n      this.#hadPointerDown = false;\n      return;\n    }\n    const {\n      isMac\n    } = FeatureTest.platform;\n    if (event.button !== 0 || event.ctrlKey && isMac) {\n      return;\n    }\n    if (event.target !== this.div) {\n      return;\n    }\n    this.#hadPointerDown = true;\n    if (this.#currentEditorType?.isDrawer) {\n      this.startDrawingSession(event);\n      return;\n    }\n    const editor = this.#uiManager.getActive();\n    this.#allowClick = !editor || editor.isEmpty();\n  }\n  startDrawingSession(event) {\n    this.div.focus({\n      preventScroll: true\n    });\n    if (this.#drawingAC) {\n      this.#currentEditorType.startDrawing(this, this.#uiManager, false, event);\n      return;\n    }\n    this.#uiManager.setCurrentDrawingSession(this);\n    this.#drawingAC = new AbortController();\n    const signal = this.#uiManager.combinedSignal(this.#drawingAC);\n    this.div.addEventListener(\"blur\", ({\n      relatedTarget\n    }) => {\n      if (relatedTarget && !this.div.contains(relatedTarget)) {\n        this.#focusedElement = null;\n        this.commitOrRemove();\n      }\n    }, {\n      signal\n    });\n    this.#currentEditorType.startDrawing(this, this.#uiManager, false, event);\n  }\n  pause(on) {\n    if (on) {\n      const {\n        activeElement\n      } = document;\n      if (this.div.contains(activeElement)) {\n        this.#focusedElement = activeElement;\n      }\n      return;\n    }\n    if (this.#focusedElement) {\n      setTimeout(() => {\n        this.#focusedElement?.focus();\n        this.#focusedElement = null;\n      }, 0);\n    }\n  }\n  endDrawingSession(isAborted = false) {\n    if (!this.#drawingAC) {\n      return null;\n    }\n    this.#uiManager.setCurrentDrawingSession(null);\n    this.#drawingAC.abort();\n    this.#drawingAC = null;\n    this.#focusedElement = null;\n    return this.#currentEditorType.endDrawing(isAborted);\n  }\n  findNewParent(editor, x, y) {\n    const layer = this.#uiManager.findParent(x, y);\n    if (layer === null || layer === this) {\n      return false;\n    }\n    layer.changeParent(editor);\n    return true;\n  }\n  commitOrRemove() {\n    if (this.#drawingAC) {\n      this.endDrawingSession();\n      return true;\n    }\n    return false;\n  }\n  onScaleChanging() {\n    if (!this.#drawingAC) {\n      return;\n    }\n    this.#currentEditorType.onScaleChangingWhenDrawing(this);\n  }\n  destroy() {\n    this.commitOrRemove();\n    if (this.#uiManager.getActive()?.parent === this) {\n      this.#uiManager.commitOrRemove();\n      this.#uiManager.setActiveEditor(null);\n    }\n    if (this.#editorFocusTimeoutId) {\n      clearTimeout(this.#editorFocusTimeoutId);\n      this.#editorFocusTimeoutId = null;\n    }\n    for (const editor of this.#editors.values()) {\n      this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv);\n      editor.setParent(null);\n      editor.isAttachedToDOM = false;\n      editor.div.remove();\n    }\n    this.div = null;\n    this.#editors.clear();\n    this.#uiManager.removeLayer(this);\n  }\n  #cleanup() {\n    for (const editor of this.#editors.values()) {\n      if (editor.isEmpty()) {\n        editor.remove();\n      }\n    }\n  }\n  async render({\n    viewport\n  }) {\n    this.viewport = viewport;\n    setLayerDimensions(this.div, viewport);\n    for (const editor of this.#uiManager.getEditors(this.pageIndex)) {\n      this.add(editor);\n      editor.rebuild();\n    }\n    await this.#uiManager.findClonesForPage(this);\n    this.div.hidden = this.isEmpty;\n    this.updateMode();\n  }\n  update({\n    viewport\n  }) {\n    this.#uiManager.commitOrRemove();\n    this.#cleanup();\n    const oldRotation = this.viewport.rotation;\n    const rotation = viewport.rotation;\n    this.viewport = viewport;\n    setLayerDimensions(this.div, {\n      rotation\n    });\n    if (oldRotation !== rotation) {\n      for (const editor of this.#editors.values()) {\n        editor.rotate(rotation);\n      }\n    }\n  }\n  get pageDimensions() {\n    const {\n      pageWidth,\n      pageHeight\n    } = this.viewport.rawDims;\n    return [pageWidth, pageHeight];\n  }\n  get scale() {\n    return this.#uiManager.viewParameters.realScale;\n  }\n}\n\n;// ./src/display/draw_layer.js\n\n\n\n\nclass DrawLayer {\n  #parent = null;\n  #mapping = new Map();\n  #toUpdate = new Map();\n  static #id = 0;\n  setParent(parent) {\n    if (!this.#parent) {\n      this.#parent = parent;\n      return;\n    }\n    if (this.#parent !== parent) {\n      if (this.#mapping.size > 0) {\n        for (const root of this.#mapping.values()) {\n          root.remove();\n          parent.append(root);\n        }\n      }\n      this.#parent = parent;\n    }\n  }\n  static get _svgFactory() {\n    return shadow(this, \"_svgFactory\", new DOMSVGFactory());\n  }\n  static #setBox(element, [x, y, width, height]) {\n    const {\n      style\n    } = element;\n    style.top = `${100 * y}%`;\n    style.left = `${100 * x}%`;\n    style.width = `${100 * width}%`;\n    style.height = `${100 * height}%`;\n  }\n  #createSVG() {\n    const svg = DrawLayer._svgFactory.create(1, 1, true);\n    this.#parent.append(svg);\n    svg.setAttribute(\"aria-hidden\", true);\n    return svg;\n  }\n  #createClipPath(defs, pathId) {\n    const clipPath = DrawLayer._svgFactory.createElement(\"clipPath\");\n    defs.append(clipPath);\n    const clipPathId = `clip_${pathId}`;\n    clipPath.setAttribute(\"id\", clipPathId);\n    clipPath.setAttribute(\"clipPathUnits\", \"objectBoundingBox\");\n    const clipPathUse = DrawLayer._svgFactory.createElement(\"use\");\n    clipPath.append(clipPathUse);\n    clipPathUse.setAttribute(\"href\", `#${pathId}`);\n    clipPathUse.classList.add(\"clip\");\n    return clipPathId;\n  }\n  #updateProperties(element, properties) {\n    for (const [key, value] of Object.entries(properties)) {\n      if (value === null) {\n        element.removeAttribute(key);\n      } else {\n        element.setAttribute(key, value);\n      }\n    }\n  }\n  draw(properties, isPathUpdatable = false, hasClip = false) {\n    const id = DrawLayer.#id++;\n    const root = this.#createSVG();\n    const defs = DrawLayer._svgFactory.createElement(\"defs\");\n    root.append(defs);\n    const path = DrawLayer._svgFactory.createElement(\"path\");\n    defs.append(path);\n    const pathId = `path_${id}`;\n    path.setAttribute(\"id\", pathId);\n    path.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n    if (isPathUpdatable) {\n      this.#toUpdate.set(id, path);\n    }\n    const clipPathId = hasClip ? this.#createClipPath(defs, pathId) : null;\n    const use = DrawLayer._svgFactory.createElement(\"use\");\n    root.append(use);\n    use.setAttribute(\"href\", `#${pathId}`);\n    this.updateProperties(root, properties);\n    this.#mapping.set(id, root);\n    return {\n      id,\n      clipPathId: `url(#${clipPathId})`\n    };\n  }\n  drawOutline(properties, mustRemoveSelfIntersections) {\n    const id = DrawLayer.#id++;\n    const root = this.#createSVG();\n    const defs = DrawLayer._svgFactory.createElement(\"defs\");\n    root.append(defs);\n    const path = DrawLayer._svgFactory.createElement(\"path\");\n    defs.append(path);\n    const pathId = `path_${id}`;\n    path.setAttribute(\"id\", pathId);\n    path.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n    let maskId;\n    if (mustRemoveSelfIntersections) {\n      const mask = DrawLayer._svgFactory.createElement(\"mask\");\n      defs.append(mask);\n      maskId = `mask_${id}`;\n      mask.setAttribute(\"id\", maskId);\n      mask.setAttribute(\"maskUnits\", \"objectBoundingBox\");\n      const rect = DrawLayer._svgFactory.createElement(\"rect\");\n      mask.append(rect);\n      rect.setAttribute(\"width\", \"1\");\n      rect.setAttribute(\"height\", \"1\");\n      rect.setAttribute(\"fill\", \"white\");\n      const use = DrawLayer._svgFactory.createElement(\"use\");\n      mask.append(use);\n      use.setAttribute(\"href\", `#${pathId}`);\n      use.setAttribute(\"stroke\", \"none\");\n      use.setAttribute(\"fill\", \"black\");\n      use.setAttribute(\"fill-rule\", \"nonzero\");\n      use.classList.add(\"mask\");\n    }\n    const use1 = DrawLayer._svgFactory.createElement(\"use\");\n    root.append(use1);\n    use1.setAttribute(\"href\", `#${pathId}`);\n    if (maskId) {\n      use1.setAttribute(\"mask\", `url(#${maskId})`);\n    }\n    const use2 = use1.cloneNode();\n    root.append(use2);\n    use1.classList.add(\"mainOutline\");\n    use2.classList.add(\"secondaryOutline\");\n    this.updateProperties(root, properties);\n    this.#mapping.set(id, root);\n    return id;\n  }\n  finalizeDraw(id, properties) {\n    this.#toUpdate.delete(id);\n    this.updateProperties(id, properties);\n  }\n  updateProperties(elementOrId, properties) {\n    if (!properties) {\n      return;\n    }\n    const {\n      root,\n      bbox,\n      rootClass,\n      path\n    } = properties;\n    const element = typeof elementOrId === \"number\" ? this.#mapping.get(elementOrId) : elementOrId;\n    if (!element) {\n      return;\n    }\n    if (root) {\n      this.#updateProperties(element, root);\n    }\n    if (bbox) {\n      DrawLayer.#setBox(element, bbox);\n    }\n    if (rootClass) {\n      const {\n        classList\n      } = element;\n      for (const [className, value] of Object.entries(rootClass)) {\n        classList.toggle(className, value);\n      }\n    }\n    if (path) {\n      const defs = element.firstElementChild;\n      const pathElement = defs.firstElementChild;\n      this.#updateProperties(pathElement, path);\n    }\n  }\n  updateParent(id, layer) {\n    if (layer === this) {\n      return;\n    }\n    const root = this.#mapping.get(id);\n    if (!root) {\n      return;\n    }\n    layer.#parent.append(root);\n    this.#mapping.delete(id);\n    layer.#mapping.set(id, root);\n  }\n  remove(id) {\n    this.#toUpdate.delete(id);\n    if (this.#parent === null) {\n      return;\n    }\n    this.#mapping.get(id).remove();\n    this.#mapping.delete(id);\n  }\n  destroy() {\n    this.#parent = null;\n    for (const root of this.#mapping.values()) {\n      root.remove();\n    }\n    this.#mapping.clear();\n    this.#toUpdate.clear();\n  }\n}\n\n;// ./src/display/text_layer_images.js\n\n\n\nfunction percentage(value) {\n  return `${(value * 100).toFixed(2)}%`;\n}\nclass TextLayerImages {\n  #coordinates = [];\n  #coordinatesByElement = new Map();\n  #getPageCanvas = null;\n  #minSize = 0;\n  #pageWidth = 0;\n  #pageHeight = 0;\n  static #activeImage = null;\n  constructor(minSize, coordinates, viewport, getPageCanvas) {\n    this.#minSize = minSize;\n    this.#coordinates = coordinates;\n    this.#pageWidth = viewport.rawDims.pageWidth;\n    this.#pageHeight = viewport.rawDims.pageHeight;\n    this.#getPageCanvas = getPageCanvas;\n  }\n  render() {\n    const container = document.createElement(\"div\");\n    container.className = \"textLayerImages\";\n    for (let i = 0; i < this.#coordinates.length; i += 6) {\n      const el = this.#createImagePlaceholder(this.#coordinates.subarray(i, i + 6));\n      if (el) {\n        container.append(el);\n      }\n    }\n    container.addEventListener(\"contextmenu\", event => {\n      if (!(event.target instanceof HTMLCanvasElement)) {\n        return;\n      }\n      const imgElement = event.target;\n      const coords = this.#coordinatesByElement.get(imgElement);\n      if (!coords) {\n        return;\n      }\n      const activeImage = TextLayerImages.#activeImage?.deref();\n      if (activeImage === imgElement) {\n        return;\n      }\n      if (activeImage) {\n        activeImage.width = 0;\n        activeImage.height = 0;\n      }\n      TextLayerImages.#activeImage = new WeakRef(imgElement);\n      const {\n        inverseTransform,\n        x1,\n        y1,\n        width,\n        height\n      } = coords;\n      const pageCanvas = this.#getPageCanvas();\n      const imageX1 = Math.ceil(x1 * pageCanvas.width);\n      const imageY1 = Math.ceil(y1 * pageCanvas.height);\n      const imageX2 = Math.floor((x1 + width / this.#pageWidth) * pageCanvas.width);\n      const imageY2 = Math.floor((y1 + height / this.#pageHeight) * pageCanvas.height);\n      imgElement.width = imageX2 - imageX1;\n      imgElement.height = imageY2 - imageY1;\n      const ctx = imgElement.getContext(\"2d\");\n      ctx.setTransform(...inverseTransform);\n      ctx.translate(-imageX1, -imageY1);\n      ctx.drawImage(pageCanvas, 0, 0);\n    });\n    return container;\n  }\n  #createImagePlaceholder([x1, y1, x2, y2, x3, y3]) {\n    const width = Math.hypot((x3 - x1) * this.#pageWidth, (y3 - y1) * this.#pageHeight);\n    const height = Math.hypot((x2 - x1) * this.#pageWidth, (y2 - y1) * this.#pageHeight);\n    if (width < this.#minSize || height < this.#minSize) {\n      return null;\n    }\n    const transform = [(x3 - x1) * this.#pageWidth / width, (y3 - y1) * this.#pageHeight / width, (x2 - x1) * this.#pageWidth / height, (y2 - y1) * this.#pageHeight / height, 0, 0];\n    const inverseTransform = Util.inverseTransform(transform);\n    const imgElement = document.createElement(\"canvas\");\n    imgElement.className = \"textLayerImagePlaceholder\";\n    imgElement.width = 0;\n    imgElement.height = 0;\n    Object.assign(imgElement.style, {\n      opacity: 0,\n      position: \"absolute\",\n      left: percentage(x1),\n      top: percentage(y1),\n      width: percentage(width / this.#pageWidth),\n      height: percentage(height / this.#pageHeight),\n      transformOrigin: \"0% 0%\",\n      transform: `matrix(${transform.join(\",\")})`\n    });\n    this.#coordinatesByElement.set(imgElement, {\n      inverseTransform,\n      width,\n      height,\n      x1,\n      y1\n    });\n    return imgElement;\n  }\n}\n\n;// ./src/pdf.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n{\n  globalThis._pdfjsTestingUtils = {\n    HighlightOutliner: HighlightOutliner\n  };\n}\nglobalThis.pdfjsLib = {\n  AbortException: AbortException,\n  AnnotationEditorLayer: AnnotationEditorLayer,\n  AnnotationEditorParamsType: AnnotationEditorParamsType,\n  AnnotationEditorType: AnnotationEditorType,\n  AnnotationEditorUIManager: AnnotationEditorUIManager,\n  AnnotationLayer: AnnotationLayer,\n  AnnotationMode: AnnotationMode,\n  AnnotationType: AnnotationType,\n  applyOpacity: applyOpacity,\n  build: build,\n  ColorPicker: ColorPicker,\n  createValidAbsoluteUrl: createValidAbsoluteUrl,\n  CSSConstants: CSSConstants,\n  DOMSVGFactory: DOMSVGFactory,\n  DrawLayer: DrawLayer,\n  FeatureTest: FeatureTest,\n  fetchData: fetchData,\n  findContrastColor: findContrastColor,\n  getDocument: getDocument,\n  getFilenameFromUrl: getFilenameFromUrl,\n  getPdfFilenameFromUrl: getPdfFilenameFromUrl,\n  getRGB: getRGB,\n  getRGBA: getRGBA,\n  getUuid: getUuid,\n  getXfaPageViewport: getXfaPageViewport,\n  GlobalWorkerOptions: GlobalWorkerOptions,\n  ImageKind: ImageKind,\n  InvalidPDFException: InvalidPDFException,\n  isDataScheme: isDataScheme,\n  isPdfFile: isPdfFile,\n  isValidExplicitDest: isValidExplicitDest,\n  makeArr: makeArr,\n  makeMap: makeMap,\n  makeObj: makeObj,\n  MathClamp: MathClamp,\n  noContextMenu: noContextMenu,\n  normalizeUnicode: normalizeUnicode,\n  OPS: OPS,\n  OutputScale: OutputScale,\n  PasswordResponses: PasswordResponses,\n  PDFDataRangeTransport: PDFDataRangeTransport,\n  PDFDateString: PDFDateString,\n  PDFWorker: PDFWorker,\n  PermissionFlag: PermissionFlag,\n  PixelsPerInch: PixelsPerInch,\n  RenderingCancelledException: RenderingCancelledException,\n  renderRichText: renderRichText,\n  ResponseException: ResponseException,\n  setLayerDimensions: setLayerDimensions,\n  shadow: shadow,\n  SignatureExtractor: SignatureExtractor,\n  stopEvent: stopEvent,\n  SupportedImageMimeTypes: SupportedImageMimeTypes,\n  TextLayer: TextLayer,\n  TextLayerImages: TextLayerImages,\n  TouchManager: TouchManager,\n  updateUrlHash: updateUrlHash,\n  Util: Util,\n  VerbosityLevel: VerbosityLevel,\n  version: version,\n  XfaLayer: XfaLayer\n};\n\nexport { AbortException, AnnotationEditorLayer, AnnotationEditorParamsType, AnnotationEditorType, AnnotationEditorUIManager, AnnotationLayer, AnnotationMode, AnnotationType, CSSConstants, ColorPicker, DOMSVGFactory, DrawLayer, FeatureTest, GlobalWorkerOptions, ImageKind, InvalidPDFException, MathClamp, OPS, OutputScale, PDFDataRangeTransport, PDFDateString, PDFWorker, PasswordResponses, PermissionFlag, PixelsPerInch, RenderingCancelledException, ResponseException, SignatureExtractor, SupportedImageMimeTypes, TextLayer, TextLayerImages, TouchManager, Util, VerbosityLevel, XfaLayer, applyOpacity, build, createValidAbsoluteUrl, fetchData, findContrastColor, getDocument, getFilenameFromUrl, getPdfFilenameFromUrl, getRGB, getRGBA, getUuid, getXfaPageViewport, isDataScheme, isPdfFile, isValidExplicitDest, makeArr, makeMap, makeObj, noContextMenu, normalizeUnicode, renderRichText, setLayerDimensions, shadow, stopEvent, updateUrlHash, version };\n\n//# sourceMappingURL=pdf.mjs.map","/**\n * e2evault/gc — what the lock holder may delete, and when it repacks\n * (docs/E2E-VAULT-FORMAT.md → \"Garbage collection\").\n *\n *   - Retention: generation g is EXPIRED when g ≤ latest - 3 and generation\n *     g + 1 was committed more than 15 minutes ago (the modification time of\n *     its index file; an index file that is gone counts as long ago).\n *   - Deleted, for good: index files of expired generations; graveyard packs\n *     whose last user (generation `died - 1`) is expired; orphans - packs in\n *     the listing that are in neither the latest pack table nor the\n *     graveyard, and that this writer did not upload since it took the lock.\n *   - Nothing while the latest generation is damaged, carries extension bytes\n *     or a version this build does not write, or while there is no index.\n *\n * Pure planning: the caller lists, deletes (`POST .../delete`) and commits.\n */\nimport { VAULT_DELETE_MAX, VAULT_KEEP_GENERATIONS, VAULT_RETENTION_MS, packDataSize } from './layout';\nimport { liveBytesByPack, type VaultIndexState } from './vindex';\n\nexport interface IndexFileInfo {\n  generation: number;\n  size?: number;\n  /** Modification time, ms since 1970. */\n  mtime: number;\n}\n\nexport interface PackFileInfo {\n  id: string;\n  size?: number;\n  mtime?: number;\n}\n\n/** Is generation `g` expired, given the index files present? */\nexport function isExpired(g: number, latest: number, indexes: ReadonlyMap<number, number>, now: number): boolean {\n  if (g > latest - VAULT_KEEP_GENERATIONS) return false;\n  const nextAt = indexes.get(g + 1);\n  // An index file that is gone counts as long ago.\n  if (nextAt === undefined) return true;\n  return now - nextAt > VAULT_RETENTION_MS;\n}\n\nexport interface CollectionPlan {\n  indexes: number[];\n  packs: string[];\n}\n\nexport interface CollectionInput {\n  /** The latest generation, decoded (and verified). */\n  latest: VaultIndexState;\n  indexes: IndexFileInfo[];\n  packs: PackFileInfo[];\n  /** Packs this writer uploaded since it took the lock: never orphans. */\n  uploaded: ReadonlySet<string>;\n  now: number;\n  /** At most this many deletions in the pass. Default 1 000. */\n  max?: number;\n}\n\n/** The deletions of one collection pass. Empty when nothing may be deleted. */\nexport function planCollection(input: CollectionInput): CollectionPlan {\n  const { latest, now } = input;\n  const max = Math.min(VAULT_DELETE_MAX, input.max ?? VAULT_DELETE_MAX);\n  const plan: CollectionPlan = { indexes: [], packs: [] };\n  if (latest.hasExt || latest.generation < 1) return plan;\n  const gen = latest.generation;\n  const at = new Map(input.indexes.map((i) => [i.generation, i.mtime]));\n  const room = () => plan.indexes.length + plan.packs.length < max;\n\n  // 1. Index files of expired generations (never one of the three newest).\n  for (const i of [...input.indexes].sort((a, b) => a.generation - b.generation)) {\n    if (!room()) return plan;\n    if (i.generation < gen - (VAULT_KEEP_GENERATIONS - 1) && isExpired(i.generation, gen, at, now)) plan.indexes.push(i.generation);\n  }\n  // 2. Graveyard packs whose last user is expired.\n  const listed = new Set(input.packs.map((p) => p.id));\n  for (const g of latest.grave) {\n    if (!room()) return plan;\n    if (g.died - 1 >= 1 && !isExpired(g.died - 1, gen, at, now)) continue;\n    // A graveyard pack already gone counts as deleted; sending it again is\n    // harmless, and leaves it out of the next commit's graveyard.\n    plan.packs.push(g.pack);\n  }\n  // 3. Orphans.\n  const table = new Set(latest.packs);\n  const grave = new Set(latest.grave.map((g) => g.pack));\n  for (const id of [...listed].sort()) {\n    if (!room()) return plan;\n    if (table.has(id) || grave.has(id) || input.uploaded.has(id)) continue;\n    plan.packs.push(id);\n  }\n  return plan;\n}\n\n/**\n * The packs to repack, or null. After a commit, for each pack of the latest\n * table: its live bytes. S = the packs with fewer live bytes than half a data\n * area. Repack when |S| ≥ 2, the live bytes of S fit in at least one pack\n * fewer than S has, and more than half of all the data areas in the table is\n * dead.\n */\nexport function repackCandidates(state: VaultIndexState, packLog2: number): Set<string> | null {\n  const area = packDataSize(packLog2);\n  const live = liveBytesByPack(state.tree);\n  const S: string[] = [];\n  let liveS = 0;\n  let liveAll = 0;\n  for (const id of state.packs) {\n    const n = live.get(id) ?? 0;\n    liveAll += n;\n    if (n < area / 2) {\n      S.push(id);\n      liveS += n;\n    }\n  }\n  if (S.length < 2) return null;\n  if (Math.ceil(liveS / area) >= S.length) return null;\n  const total = state.packs.length * area;\n  if (total - liveAll <= total / 2) return null;\n  return new Set(S);\n}\n","/**\n * e2evault/api — the vault API (`/api/files/e2e/vault/*`) and the byte-range\n * reads of packs and index files (docs/E2E-VAULT-FORMAT.md → \"API\").\n *\n * Every write carries the lock token in `X-Filex-Vault-Lock`. Reads need no\n * lock: index files and pack ranges come through the ordinary download\n * (`GET /api/files/manager?action=download&path=…` with `Range`), as\n * ciphertext.\n *\n * An error answer is `{\"error\": \"<CODE>\", \"message\": \"...\", ...}`; it comes\n * back as a VaultApiError carrying the code and the extra fields (`holder`,\n * `since`, `retry_after`, `reason`, `latest`).\n */\nimport { bytesToB64 } from '../e2ecrypto';\nimport { VAULT_DELETE_MAX, bufferView, generationHex, indexPath, packPath } from './layout';\nimport { VaultPackRetry } from './writer';\n\nexport const VAULT_LOCK_HEADER = 'X-Filex-Vault-Lock';\n\nexport type VaultClientKind = 'web' | 'desktop' | 'cli' | 'mount';\n\nexport interface VaultHolder {\n  name: string;\n  client: VaultClientKind | string;\n  label?: string;\n}\n\nexport interface VaultLockInfo {\n  holder: VaultHolder;\n  since: string;\n  expires_at: string;\n  mine: boolean;\n}\n\nexport interface VaultState {\n  vault_id: string;\n  pack_log2: number;\n  generation: number;\n  lock: VaultLockInfo | null;\n}\n\nexport interface VaultLockGrant {\n  token: string;\n  generation: number;\n  lease_seconds: number;\n  idle_seconds: number;\n  expires_at: string;\n}\n\nexport interface VaultListItem {\n  generation?: number;\n  id?: string;\n  size: number;\n  /** An RFC 3339 time in UTC (a number is read as seconds or ms since 1970). */\n  mtime: string | number;\n}\n\n/** One page of a listing. `now` is the SERVER's clock: retention is\n *  measured against it, never against this machine's. */\nexport interface VaultListPage {\n  items: VaultListItem[];\n  next: string | null;\n  now?: string;\n}\n\nexport type VaultLostReason = 'expired' | 'idle' | 'broken' | 'released' | 'taken';\n\n/** A refusal of the vault API, with its code and fields. */\nexport class VaultApiError extends Error {\n  constructor(\n    public readonly status: number,\n    public readonly code: string,\n    message: string,\n    public readonly fields: Record<string, unknown> = {},\n  ) {\n    super(message || code || `vault API: ${status}`);\n    this.name = 'VaultApiError';\n  }\n\n  get holder(): VaultHolder | null {\n    const h = this.fields.holder;\n    return h && typeof h === 'object' ? (h as VaultHolder) : null;\n  }\n\n  get reason(): string {\n    return typeof this.fields.reason === 'string' ? this.fields.reason : '';\n  }\n\n  get latest(): number | null {\n    return typeof this.fields.latest === 'number' ? this.fields.latest : null;\n  }\n}\n\n/** The explorer's client, as much of it as the vault needs (useFileApi). */\nexport interface VaultHttp {\n  endpoints: { manager: string };\n  authHeaders(extra?: Record<string, string>): Promise<Record<string, string>>;\n  credentialsMode(): RequestCredentials;\n  downloadUrl(path: string): string;\n  /** The window's language, for the server's `message`. */\n  acceptLanguage?(): string;\n}\n\n/** `/api/files/manager` → `/api/files/e2e/vault`, like permissions and drafts. */\nexport function vaultApiBase(manager: string): string {\n  return manager.replace(/\\/manager(\\?.*)?$/, '/e2e/vault');\n}\n\n/** Join a vault root's wire path and a path inside it. */\nexport function vaultWire(root: string, rel: string): string {\n  return `${root.replace(/\\/+$/, '')}/${rel.replace(/^\\/+/, '')}`;\n}\n\nexport function createVaultApi(http: VaultHttp) {\n  const base = vaultApiBase(http.endpoints.manager);\n\n  async function headers(extra: Record<string, string> = {}, token?: string | null): Promise<Record<string, string>> {\n    const h = await http.authHeaders(extra);\n    if (http.acceptLanguage) h['Accept-Language'] = http.acceptLanguage();\n    if (token) h[VAULT_LOCK_HEADER] = token;\n    return h;\n  }\n\n  async function failure(res: Response): Promise<VaultApiError> {\n    const text = await res.text().catch(() => '');\n    let fields: Record<string, unknown> = {};\n    try {\n      const parsed = JSON.parse(text);\n      if (parsed && typeof parsed === 'object') fields = parsed as Record<string, unknown>;\n    } catch {\n      /* not JSON */\n    }\n    const code = typeof fields.error === 'string' ? fields.error : '';\n    const message = typeof fields.message === 'string' ? fields.message : '';\n    return new VaultApiError(res.status, code, message, fields);\n  }\n\n  async function call<T>(method: string, sub: string, body?: unknown, token?: string | null, signal?: AbortSignal): Promise<T> {\n    const res = await fetch(base + sub, {\n      method,\n      headers: await headers(body === undefined ? {} : { 'Content-Type': 'application/json' }, token),\n      credentials: http.credentialsMode(),\n      body: body === undefined ? undefined : JSON.stringify(body),\n      signal,\n    });\n    if (!res.ok) throw await failure(res);\n    if (res.status === 204) return undefined as T;\n    const text = await res.text();\n    return (text ? JSON.parse(text) : undefined) as T;\n  }\n\n  const q = (params: Record<string, string | number>) =>\n    '?' +\n    Object.entries(params)\n      .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n      .join('&');\n\n  /** A body upload (pack, index). A network failure is an unknown outcome. */\n  async function put(sub: string, bytes: Uint8Array, token: string, signal?: AbortSignal): Promise<Response> {\n    let res: Response;\n    try {\n      res = await fetch(base + sub, {\n        method: 'PUT',\n        headers: await headers({ 'Content-Type': 'application/octet-stream' }, token),\n        credentials: http.credentialsMode(),\n        body: bufferView(bytes),\n        signal,\n      });\n    } catch (err) {\n      if ((err as Error)?.name === 'AbortError') throw err;\n      throw new VaultPackRetry();\n    }\n    return res;\n  }\n\n  /** One page of `v/idx/` or `v/p/`. */\n  function list(path: string, kind: 'index' | 'pack', after = '', limit = 1000): Promise<VaultListPage> {\n    const params: Record<string, string | number> = { path, kind, limit };\n    if (after) params.after = after;\n    return call('GET', '/list' + q(params));\n  }\n\n  return {\n    base,\n    /** `POST /create` — a new, empty vault: its key file and generation 1. */\n    create(path: string, marker: object, index: Uint8Array): Promise<{ generation: number }> {\n      return call('POST', '/create', { path, marker, index: bytesToB64(index) });\n    },\n    /** `GET /state`. With the lock token, when this session holds the lock,\n     *  so that `lock.mine` can mean \"this session\" and not \"this person\". */\n    state(path: string, signal?: AbortSignal, token?: string | null): Promise<VaultState> {\n      return call('GET', '/state' + q({ path }), undefined, token ?? null, signal);\n    },\n    list,\n    /** Every page, and the server's clock of the first one (ms since 1970,\n     *  0 when it sent none). */\n    async listAll(path: string, kind: 'index' | 'pack'): Promise<{ items: VaultListItem[]; now: number }> {\n      const out: VaultListItem[] = [];\n      let now = 0;\n      let after = '';\n      for (let i = 0; i < 10_000; i++) {\n        const page = await list(path, kind, after, 10_000);\n        if (!now && page.now) now = listedTime(page.now);\n        out.push(...(page.items ?? []));\n        if (!page.next) break;\n        after = page.next;\n      }\n      return { items: out, now };\n    },\n    lock(path: string, client: VaultClientKind, label: string): Promise<VaultLockGrant> {\n      return call('POST', '/lock', { path, client, label });\n    },\n    renew(path: string, token: string, active: boolean): Promise<{ expires_at: string; idle_until: string }> {\n      return call('POST', '/lock/renew', { path, active }, token);\n    },\n    release(path: string, token: string): Promise<void> {\n      return call('POST', '/lock/release', { path }, token);\n    },\n    /**\n     * The page is closing: `release` with `keepalive`, best effort (the lease\n     * covers the rest). Synchronous on purpose - an unload handler cannot wait.\n     */\n    releaseKeepalive(path: string, token: string, headersNow: Record<string, string>): void {\n      try {\n        void fetch(base + '/lock/release', {\n          method: 'POST',\n          headers: { ...headersNow, 'Content-Type': 'application/json', [VAULT_LOCK_HEADER]: token },\n          credentials: http.credentialsMode(),\n          body: JSON.stringify({ path }),\n          keepalive: true,\n        }).catch(() => undefined);\n      } catch {\n        /* the page is going anyway */\n      }\n    },\n    /** End someone else's lock (the vault folder's owner, or an administrator). */\n    breakLock(path: string): Promise<void> {\n      return call('POST', '/lock/break', { path });\n    },\n    /** `PUT /pack`: 201. A taken id and a lost answer are both a retry under a new id. */\n    async putPack(path: string, id: string, bytes: Uint8Array, token: string, signal?: AbortSignal): Promise<void> {\n      const res = await put('/pack' + q({ path, id }), bytes, token, signal);\n      if (res.ok) return;\n      const err = await failure(res);\n      if (err.code === 'VAULT_PACK_EXISTS' || res.status >= 500 || res.status === 408) throw new VaultPackRetry(err.message);\n      throw err;\n    },\n    /** `PUT /index`: 201 {generation}. */\n    async putIndex(path: string, generation: number, bytes: Uint8Array, token: string, signal?: AbortSignal): Promise<number> {\n      const res = await put('/index' + q({ path, generation }), bytes, token, signal);\n      if (res.ok) {\n        const body = (await res.json().catch(() => ({}))) as { generation?: number };\n        return typeof body.generation === 'number' ? body.generation : generation;\n      }\n      const err = await failure(res);\n      if (res.status >= 500 || res.status === 408) throw new VaultPackRetry(err.message);\n      throw err;\n    },\n    /** `POST /delete`: at most 1 000 names, for good. Answers how many. */\n    del(path: string, packs: string[], indexes: number[], token: string): Promise<{ deleted: { packs: number; indexes: number } }> {\n      if (packs.length + indexes.length > VAULT_DELETE_MAX) throw new Error('vault: at most 1 000 deletions at a time');\n      return call('POST', '/delete', { path, packs, indexes }, token);\n    },\n    async getPrefs(): Promise<{ idle_minutes: number }> {\n      return call('GET', '/prefs');\n    },\n    async putPrefs(idleMinutes: number): Promise<{ idle_minutes: number }> {\n      return call('PUT', '/prefs', { idle_minutes: idleMinutes });\n    },\n\n    /** The bytes of `v/idx/G.fxi`, whole; null when there is no such file. */\n    async fetchIndex(root: string, gen: number, signal?: AbortSignal): Promise<Uint8Array | null> {\n      const res = await fetch(http.downloadUrl(vaultWire(root, indexPath(gen))), {\n        headers: await headers(),\n        credentials: http.credentialsMode(),\n        cache: 'no-store',\n        signal,\n      });\n      if (res.status === 404) return null;\n      if (!res.ok) throw await failure(res);\n      return new Uint8Array(await res.arrayBuffer());\n    },\n    /** `length` bytes at `offset` of a pack, by an HTTP range request (206). */\n    async fetchRange(root: string, pack: string, offset: number, length: number, signal?: AbortSignal): Promise<Uint8Array> {\n      const res = await fetch(http.downloadUrl(vaultWire(root, packPath(pack))), {\n        headers: await headers({ Range: `bytes=${offset}-${offset + length - 1}` }),\n        credentials: http.credentialsMode(),\n        // A pack never changes once written: its bytes may be cached.\n        cache: 'default',\n        signal,\n      });\n      if (res.status === 404) throw new VaultApiError(404, 'VAULT_PACK_GONE', '', { pack });\n      if (!res.ok) throw await failure(res);\n      const all = new Uint8Array(await res.arrayBuffer());\n      // A server that ignores Range answers 200 with the whole pack.\n      if (res.status === 200 && all.length > length) return all.slice(offset, offset + length);\n      return all;\n    },\n  };\n}\n\nexport type VaultApi = ReturnType<typeof createVaultApi>;\n\n/** An index listing row's modification time, in ms since 1970. */\nexport function listedTime(m: string | number): number {\n  if (typeof m === 'number') return m < 1e12 ? m * 1000 : m;\n  const t = Date.parse(m);\n  return Number.isFinite(t) ? t : 0;\n}\n\n/** For tests and logs. */\nexport function describeGeneration(gen: number): string {\n  return generationHex(gen);\n}\n","/**\n * e2evault/lock — the holder's side of the write lock, and the client's own\n * vault lock (docs/E2E-VAULT-FORMAT.md → \"The write lock\", \"The idle lock\").\n *\n * The write lock (the server's):\n *   - taken at the first action that writes, held while the lease (60 s) has\n *     not run out and the session is not idle;\n *   - a heartbeat renews it every 15 seconds, with `active: true` while\n *     something that will write is being prepared;\n *   - lost when a renewal or a write answers VAULT_LOCK_LOST, or when no\n *     renewal has succeeded for 45 seconds: the holder stops at once;\n *   - released after the last commit; when the page closes, with\n *     `fetch(..., {keepalive: true})`, best effort.\n *\n * The vault lock (the client's alone, decided 2026-10-06):\n *   - after a further 15 minutes in which the open vault sees no activity at\n *     all (no listing, no opening, no download, no write), the client drops\n *     the folder master key and every key derived from it and asks for the\n *     password again. A vault that was opened and never written starts this\n *     clock when it is opened. Fixed in format 1, not a setting.\n *\n * Clocks and timers are injected, so a test runs them without waiting.\n */\nimport { VaultApiError, type VaultApi, type VaultClientKind, type VaultHolder, type VaultLockGrant, type VaultLostReason } from './api';\n\n/** Renew every 15 seconds. */\nexport const VAULT_HEARTBEAT_MS = 15_000;\n/** No successful renewal for this long: the lock is lost. */\nexport const VAULT_LOST_AFTER_MS = 45_000;\n/** The vault lock: 15 minutes with no activity at all after the write lock ended. */\nexport const VAULT_IDLE_LOCK_MS = 15 * 60_000;\n/** Ask `state` this often while a vault is open. */\nexport const VAULT_STATE_POLL_MS = 30_000;\n/** Commit at least this often during a long change in which packs were stored. */\nexport const VAULT_COMMIT_EVERY_MS = 30_000;\n\nexport interface Clock {\n  now(): number;\n  setInterval(fn: () => void, ms: number): unknown;\n  clearInterval(h: unknown): void;\n  setTimeout(fn: () => void, ms: number): unknown;\n  clearTimeout(h: unknown): void;\n}\n\nexport const realClock: Clock = {\n  now: () => Date.now(),\n  setInterval: (fn, ms) => setInterval(fn, ms),\n  clearInterval: (h) => clearInterval(h as ReturnType<typeof setInterval>),\n  setTimeout: (fn, ms) => setTimeout(fn, ms),\n  clearTimeout: (h) => clearTimeout(h as ReturnType<typeof setTimeout>),\n};\n\n/** Why the write lock ended: the server's reasons, or the connection. */\nexport type LockEnd = VaultLostReason | 'connection';\n\nexport interface WriteLockOptions {\n  api: Pick<VaultApi, 'lock' | 'renew' | 'release' | 'releaseKeepalive'>;\n  path: string;\n  client: VaultClientKind;\n  label: string;\n  clock?: Clock;\n  /** The lock ended without this session releasing it. Called once. With\n   *  `taken` or `broken` the server names who holds it now, or broke it. */\n  onLost(reason: LockEnd, holder?: VaultHolder | null): void;\n  /** Headers for the keepalive release (the page is closing; nothing can await). */\n  headersNow?: () => Record<string, string>;\n}\n\n/** One session's hold on one vault's write lock. */\nexport class VaultWriteLock {\n  private token: string | null = null;\n  private timer: unknown = null;\n  private lastOk = 0;\n  private lastActive = 0;\n  private idleMs = 0;\n  private busyCount = 0;\n  private pendingActive = false;\n  private ended = false;\n  private readonly clock: Clock;\n\n  constructor(private readonly opts: WriteLockOptions) {\n    this.clock = opts.clock ?? realClock;\n  }\n\n  get held(): boolean {\n    return !!this.token && !this.ended;\n  }\n\n  /** The token, for the `X-Filex-Vault-Lock` header of every vault write. */\n  get tokenValue(): string | null {\n    return this.held ? this.token : null;\n  }\n\n  /**\n   * When the server ends the lock for idleness, by this session's clock:\n   * the last write or active renewal plus the person's idle time.\n   */\n  get idleDeadline(): number {\n    return this.held ? this.lastActive + this.idleMs : 0;\n  }\n\n  /** The person's idle time the server read when the lock was taken. */\n  get idleSeconds(): number {\n    return Math.round(this.idleMs / 1000);\n  }\n\n  /** Take the lock. Throws VaultApiError 409 VAULT_LOCKED when someone holds it. */\n  async acquire(): Promise<VaultLockGrant> {\n    const grant = await this.opts.api.lock(this.opts.path, this.opts.client, this.opts.label);\n    const now = this.clock.now();\n    this.token = grant.token;\n    this.ended = false;\n    this.lastOk = now;\n    this.lastActive = now;\n    this.idleMs = Math.max(60, grant.idle_seconds || 180) * 1000;\n    this.timer = this.clock.setInterval(() => void this.beat(), VAULT_HEARTBEAT_MS);\n    return grant;\n  }\n\n  /**\n   * Something that will write is under way (an upload or a save being\n   * prepared): heartbeats say `active: true` until `done` is called.\n   */\n  busy(): () => void {\n    this.busyCount++;\n    this.pendingActive = true;\n    let once = false;\n    return () => {\n      if (once) return;\n      once = true;\n      this.busyCount = Math.max(0, this.busyCount - 1);\n    };\n  }\n\n  /** A vault write succeeded: it counts as activity on the server. */\n  wrote(): void {\n    if (!this.held) return;\n    const now = this.clock.now();\n    this.lastActive = now;\n    this.lastOk = now;\n  }\n\n  /** A write answered VAULT_LOCK_LOST: end now. */\n  lostBy(err: unknown): boolean {\n    if (err instanceof VaultApiError && err.code === 'VAULT_LOCK_LOST') {\n      this.end((err.reason as LockEnd) || 'expired', err.holder);\n      return true;\n    }\n    return false;\n  }\n\n  /** One heartbeat. Exposed for tests and for an immediate renewal. */\n  async beat(): Promise<void> {\n    if (!this.held || !this.token) return;\n    const active = this.busyCount > 0 || this.pendingActive;\n    this.pendingActive = false;\n    try {\n      await this.opts.api.renew(this.opts.path, this.token, active);\n      if (!this.held) return;\n      const now = this.clock.now();\n      this.lastOk = now;\n      if (active) this.lastActive = now;\n    } catch (err) {\n      if (!this.held) return;\n      if (this.lostBy(err)) return;\n      if (this.clock.now() - this.lastOk >= VAULT_LOST_AFTER_MS) this.end('connection');\n    }\n  }\n\n  /** Release after the last commit. Answers whether or not it still held. */\n  async release(): Promise<void> {\n    const token = this.token;\n    this.stop();\n    this.token = null;\n    if (!token) return;\n    try {\n      await this.opts.api.release(this.opts.path, token);\n    } catch {\n      /* the lease covers it */\n    }\n  }\n\n  /** The page is closing. */\n  releaseOnUnload(): void {\n    const token = this.token;\n    this.stop();\n    this.token = null;\n    if (token) this.opts.api.releaseKeepalive(this.opts.path, token, this.opts.headersNow?.() ?? {});\n  }\n\n  /** Stop without telling anybody (the vault was closed some other way). */\n  dispose(): void {\n    this.stop();\n    this.token = null;\n  }\n\n  private stop(): void {\n    if (this.timer !== null) this.clock.clearInterval(this.timer);\n    this.timer = null;\n  }\n\n  private end(reason: LockEnd, holder: VaultHolder | null = null): void {\n    if (this.ended) return;\n    this.ended = true;\n    this.stop();\n    this.token = null;\n    this.opts.onLost(reason, holder);\n  }\n}\n\n/**\n * The client's vault lock: one clock that a vault's every activity resets,\n * and that does not run while this session holds the write lock (it starts\n * when the writer goes back to read-only, or when a vault that never wrote\n * was opened).\n */\nexport class VaultIdleLock {\n  private timer: unknown = null;\n  private lastActivity = 0;\n  private paused = false;\n  private readonly clock: Clock;\n\n  constructor(\n    private readonly onLock: () => void,\n    clock?: Clock,\n    private readonly ms = VAULT_IDLE_LOCK_MS,\n  ) {\n    this.clock = clock ?? realClock;\n  }\n\n  /** The vault was opened: the clock starts. */\n  start(): void {\n    this.lastActivity = this.clock.now();\n    this.paused = false;\n    this.arm();\n  }\n\n  /** A listing, an opening, a download or a write. */\n  touch(): void {\n    this.lastActivity = this.clock.now();\n    if (!this.paused) this.arm();\n  }\n\n  /** This session holds the write lock: the vault lock waits. */\n  pause(): void {\n    this.paused = true;\n    this.disarm();\n  }\n\n  /** The write lock ended: 15 minutes from now (or from the last activity). */\n  resume(): void {\n    this.paused = false;\n    this.lastActivity = this.clock.now();\n    this.arm();\n  }\n\n  /** When the vault locks itself, by this clock; 0 while it waits. */\n  get deadline(): number {\n    return this.paused || this.timer === null ? 0 : this.lastActivity + this.ms;\n  }\n\n  stop(): void {\n    this.disarm();\n  }\n\n  /** The page came back (a tab woken from the background): lock now if due. */\n  check(): void {\n    if (this.paused || this.timer === null) return;\n    if (this.clock.now() - this.lastActivity >= this.ms) {\n      this.disarm();\n      this.onLock();\n    }\n  }\n\n  private arm(): void {\n    this.disarm();\n    const left = Math.max(0, this.lastActivity + this.ms - this.clock.now());\n    this.timer = this.clock.setTimeout(() => {\n      this.timer = null;\n      if (this.paused) return;\n      // A late timer (a sleeping laptop) still locks; an early one re-arms.\n      if (this.clock.now() - this.lastActivity >= this.ms) this.onLock();\n      else this.arm();\n    }, left);\n  }\n\n  private disarm(): void {\n    if (this.timer !== null) this.clock.clearTimeout(this.timer);\n    this.timer = null;\n  }\n}\n","/**\n * The vault's engine (wiring:e2 vault; docs/E2E-VAULT-FORMAT.md → \"Clients\",\n * \"The write lock\", \"The idle lock\"): the sessions of the vaults open in this\n * tab - reading the index, the write lock, changes, collection, the clocks.\n *\n * ⚠ Loaded only when a vault is opened or made: composables/useE2eVault.ts is\n * what the explorer holds, and it imports this module with `import()` on the\n * first call that needs it. Everything this file imports (the rest of\n * lib/e2evault) travels with it, out of the explorer's main chunk. Import it\n * statically from code the explorer always loads and the vault is back in the\n * main chunk (web/tests/quality/vaultLazy.test.ts says where).\n *\n * Paths: a vault entry's wire path is the vault folder's wire path, `/`, and\n * its path in the tree (`docs://Kasa/Belgeler/not.txt`). Those paths exist\n * only in this tab; the server never sees them.\n */\nimport type { FileNode } from '../types/FileNode';\nimport { markerIsVault, vaultIdOf, type E2eMarker } from '../lib/e2ecrypto';\nimport { e2eMimeForExt } from '../lib/e2emime';\nimport { numberedName } from '../lib/e2enamepass';\nimport { SaveCancelled, SaveNeedsGesture, SaveTooLarge, pickSaveTarget, type SaveTarget } from '../lib/e2esave';\nimport { createZipStream, type ZipEntry } from '../lib/zipstream';\nimport {\n  VAULT_ENTRY_FOLDER,\n  VAULT_ENTRIES_WRITE_MAX,\n  indexFileSize,\n  toHex,\n  utf8,\n  vaultNameProblem,\n} from '../lib/e2evault/layout';\nimport {\n  canonicalOrder,\n  childrenOf,\n  emptyIndexState,\n  joinVaultPath,\n  splitVaultPath,\n  type VaultIndexState,\n  type VaultNode,\n} from '../lib/e2evault/vindex';\nimport {\n  VaultContentError,\n  VaultDamagedError,\n  fileStream,\n  loadLatestGeneration,\n  readWholeFile,\n  vaultRollbackGuard,\n  type FetchRange,\n  type VaultIndexSource,\n  type VaultKeys,\n} from '../lib/e2evault/reader';\nimport {\n  VaultWriteError,\n  VaultWriter,\n  cryptoRandom,\n  vaultLimitStatus,\n  type VaultOp,\n  type VaultSink,\n} from '../lib/e2evault/writer';\nimport { planCollection, repackCandidates } from '../lib/e2evault/gc';\nimport {\n  VaultApiError,\n  createVaultApi,\n  listedTime,\n  vaultWire,\n  type VaultApi,\n  type VaultClientKind,\n  type VaultLockGrant,\n} from '../lib/e2evault/api';\nimport {\n  VAULT_COMMIT_EVERY_MS,\n  VAULT_STATE_POLL_MS,\n  VaultIdleLock,\n  VaultWriteLock,\n  realClock,\n  type LockEnd,\n} from '../lib/e2evault/lock';\nimport { vaultRelOf, type VaultHost, type VaultOpenOptions, type VaultReadOnly, type VaultShared, type VaultStripState } from './useE2eVault';\n\ninterface Session {\n  root: string;\n  marker: E2eMarker;\n  keys: VaultKeys;\n  idHex: string;\n  state: VaultIndexState;\n  /** Children per folder of `state`, built on first use. */\n  kids: Map<string, VaultNode[]> | null;\n  /** The level the server gave this account at the vault folder. */\n  perm: string | undefined;\n  lock: VaultWriteLock | null;\n  idle: VaultIdleLock;\n  /** Packs uploaded since the lock was taken: never orphans. */\n  uploaded: Set<string>;\n  /** Graveyard packs this writer deleted: they leave the next commit's graveyard. */\n  deleted: Set<string>;\n  queue: Promise<unknown>;\n  poll: unknown;\n  abort: AbortController | null;\n  lastState: number;\n  closed: boolean;\n  strip: VaultStripState;\n}\n\n/** A short label for the lock holder: the browser and the system. */\nexport function vaultLockLabel(kind: VaultClientKind, ua = typeof navigator === 'undefined' ? '' : navigator.userAgent): string {\n  const os = /Windows/.test(ua) ? 'Windows' : /Mac OS X|Macintosh/.test(ua) ? 'macOS' : /Android/.test(ua) ? 'Android' : /iPhone|iPad/.test(ua) ? 'iOS' : /Linux/.test(ua) ? 'Linux' : '';\n  if (kind === 'desktop') return os ? `filex, ${os}` : 'filex';\n  const br = /Edg\\//.test(ua) ? 'Edge' : /Firefox\\//.test(ua) ? 'Firefox' : /Chrome\\//.test(ua) ? 'Chrome' : /Safari\\//.test(ua) ? 'Safari' : '';\n  return [br, os].filter(Boolean).join(', ') || 'web';\n}\n\n/** A name search in a vault shows at most this many rows. */\nconst SEARCH_MAX = 500;\n\nfunction stripWire(p: string): string {\n  const i = p.indexOf('://');\n  return i === -1 ? p : p.slice(i + 3);\n}\n\nfunction baseName(wire: string): string {\n  const s = stripWire(wire).replace(/\\/+$/, '');\n  return s.slice(s.lastIndexOf('/') + 1);\n}\n\nfunction extOf(name: string): string {\n  const i = name.lastIndexOf('.');\n  return i > 0 ? name.slice(i + 1).toLowerCase() : '';\n}\n\nfunction abortError(): Error {\n  const e = new Error('vault: the change was stopped');\n  e.name = 'AbortError';\n  return e;\n}\n\nexport function createVaultEngine(host: VaultHost, shared: VaultShared) {\n  const api: VaultApi = createVaultApi(host.http);\n  const clock = host.clock ?? realClock;\n  const random = host.random ?? cryptoRandom;\n  const sessions = new Map<string, Session>();\n  /** The shell's state (useE2eVault): the strips it hands the explorer, and\n   *  the counter its listings watch. */\n  const { strips, version } = shared;\n\n  /** The tree on screen changed (a commit, a newer generation): draw it again.\n   *  The strip is reactive by itself and needs no call. */\n  function changed(s: Session): void {\n    version.value++;\n    host.onChanged(s.root);\n  }\n\n  // ------------------------------------------------------------------\n  // Where a path is\n  // ------------------------------------------------------------------\n\n  function isOpen(root: string | null | undefined): boolean {\n    return !!root && sessions.has(root) && !sessions.get(root)!.closed;\n  }\n\n  const relOf = vaultRelOf;\n\n  function sessionOf(wire: string): Session | null {\n    const r = shared.rootOf(wire);\n    const s = r ? sessions.get(r) : null;\n    return s && !s.closed ? s : null;\n  }\n\n  /** The node at `wire`, in the generation on screen. */\n  function node(wire: string): VaultNode | null {\n    const s = sessionOf(wire);\n    if (!s) return null;\n    return s.state.tree.get(relOf(s.root, wire)) ?? null;\n  }\n\n  function toRow(s: Session, n: VaultNode, count?: number): FileNode {\n    const path = vaultWire(s.root, n.path);\n    const dir = n.kind === VAULT_ENTRY_FOLDER;\n    const ext = dir ? '' : extOf(n.name);\n    return {\n      path,\n      basename: n.name,\n      relativePath: stripWire(path),\n      type: dir ? 'dir' : 'file',\n      extension: ext,\n      size: n.size,\n      last_modified: n.mtime,\n      mime_type: dir ? 'inode/directory' : e2eMimeForExt(ext),\n      ...(dir && count !== undefined ? { count } : {}),\n      e2e_root: s.root,\n      vault_root: s.root,\n      ...(s.perm ? { perm: s.perm as FileNode['perm'] } : {}),\n    };\n  }\n\n  function kidsOf(s: Session): Map<string, VaultNode[]> {\n    if (!s.kids) s.kids = childrenOf(s.state.tree);\n    return s.kids;\n  }\n\n  /** The rows of folder `dirWire` (null: no such folder in the vault). */\n  function rows(dirWire: string): FileNode[] | null {\n    const s = sessionOf(dirWire);\n    if (!s) return null;\n    const rel = relOf(s.root, dirWire);\n    if (rel) {\n      const d = s.state.tree.get(rel);\n      if (!d || d.kind !== VAULT_ENTRY_FOLDER) return null;\n    }\n    const kids = kidsOf(s);\n    return (kids.get(rel) ?? []).map((n) => toRow(s, n, n.kind === VAULT_ENTRY_FOLDER ? (kids.get(n.path) ?? []).length : undefined));\n  }\n\n  /** Name search inside the vault's index, below `dirWire` (in this tab). */\n  function search(dirWire: string, query: string): FileNode[] | null {\n    const s = sessionOf(dirWire);\n    if (!s) return null;\n    const rel = relOf(s.root, dirWire);\n    const q = query.trim().toLocaleLowerCase();\n    if (!q) return rows(dirWire);\n    const kids = kidsOf(s);\n    const out: FileNode[] = [];\n    for (const n of s.state.tree.values()) {\n      if (rel && !n.path.startsWith(rel + '/')) continue;\n      if (!n.name.toLocaleLowerCase().includes(q)) continue;\n      out.push(toRow(s, n, n.kind === VAULT_ENTRY_FOLDER ? (kids.get(n.path) ?? []).length : undefined));\n      if (out.length >= SEARCH_MAX) break;\n    }\n    return out;\n  }\n\n  // ------------------------------------------------------------------\n  // Opening and closing\n  // ------------------------------------------------------------------\n\n  function indexSource(s: Session): VaultIndexSource {\n    return {\n      fetchIndex: (g) => api.fetchIndex(s.root, g),\n      listGenerations: async () =>\n        (await api.listAll(s.root, 'index')).items.map((i) => i.generation).filter((g): g is number => typeof g === 'number'),\n      hasPacks: async () => (await api.list(s.root, 'pack', '', 1)).items.length > 0,\n    };\n  }\n\n  const fetchRangeOf =\n    (s: Session): FetchRange =>\n    (pack, offset, length, signal) =>\n      api.fetchRange(s.root, pack, offset, length, signal);\n\n  function newStrip(root: string): VaultStripState {\n    return {\n      root,\n      name: baseName(root),\n      generation: 0,\n      mode: 'read',\n      busy: false,\n      progress: null,\n      holder: null,\n      readOnly: '',\n      shownAt: 0,\n      limit: 'ok',\n      entries: 0,\n      lost: '',\n      lostMinutes: 0,\n      lostTo: '',\n      unsaved: [],\n      idleDeadline: 0,\n      idleMinutes: 0,\n      lockDeadline: 0,\n      error: '',\n    };\n  }\n\n  /** Put a generation on screen (and note it for the rollback guard). */\n  function setState(s: Session, st: VaultIndexState): void {\n    s.state = st;\n    s.kids = null;\n    s.strip.generation = st.generation;\n    s.strip.entries = st.tree.size;\n    s.strip.limit = vaultLimitStatus(st.tree.size, indexFileSize(st.bodyLen));\n    if (st.hasExt && !s.strip.readOnly) s.strip.readOnly = 'newer';\n    vaultRollbackGuard.note(s.idHex, st.generation);\n  }\n\n  function syncDeadlines(s: Session): void {\n    s.strip.idleDeadline = s.lock?.held ? s.lock.idleDeadline : 0;\n    s.strip.idleMinutes = s.lock?.held ? Math.round(s.lock.idleSeconds / 60) : 0;\n    s.strip.lockDeadline = s.idle.deadline;\n  }\n\n  /**\n   * Open an unlocked vault: ask `state`, load the latest generation that\n   * verifies, start the clocks. A vault this tab has just made (`justMade`)\n   * starts at generation 1, the empty tree, with nothing to fetch; `initial`\n   * starts from a given state (tests).\n   */\n  async function open(root: string, marker: E2eMarker, fmk: CryptoKey, opts: VaultOpenOptions = {}): Promise<void> {\n    if (!markerIsVault(marker)) throw new Error('vault: not a vault key file');\n    const initial = opts.initial ?? (opts.justMade ? emptyIndexState(1) : undefined);\n    const vaultId = vaultIdOf(marker)!;\n    close(root, 'silent');\n    const strip = newStrip(root);\n    strips[root] = strip;\n    const s: Session = {\n      root,\n      marker,\n      keys: { fmk, vaultId, packLog2: marker.vault!.pack },\n      idHex: toHex(vaultId),\n      state: emptyIndexState(0),\n      kids: null,\n      perm: opts.perm,\n      lock: null,\n      idle: new VaultIdleLock(() => void lockIdle(root), clock),\n      uploaded: new Set(),\n      deleted: new Set(),\n      queue: Promise.resolve(),\n      poll: null,\n      abort: null,\n      lastState: 0,\n      closed: false,\n      strip: strips[root],\n    };\n    sessions.set(root, s);\n    shared.remember(root);\n    try {\n      if (initial) {\n        setState(s, initial);\n      } else {\n        const st = await api.state(root);\n        s.lastState = clock.now();\n        noteHolder(s, st.lock);\n        if (st.generation < vaultRollbackGuard.highest(s.idHex)) s.strip.readOnly = 'rollback';\n        const loaded = await loadLatestGeneration(s.keys, st.generation, indexSource(s));\n        if (loaded.damagedLatest) {\n          s.strip.readOnly = 'damaged';\n          s.strip.shownAt = await commitTimeOf(s, loaded.state.generation);\n        }\n        setState(s, loaded.state);\n      }\n    } catch (err) {\n      if (err instanceof VaultDamagedError) {\n        s.strip.readOnly = 'unreadable';\n        s.strip.error = host.t('e2e.vault.unreadable');\n      } else {\n        sessions.delete(root);\n        delete strips[root];\n        throw err;\n      }\n    }\n    s.idle.start();\n    s.poll = clock.setInterval(() => void poll(s), VAULT_STATE_POLL_MS);\n    syncDeadlines(s);\n    version.value++;\n  }\n\n  /** When generation `g` was committed: its index file's time in the listing. */\n  async function commitTimeOf(s: Session, g: number): Promise<number> {\n    try {\n      const { items } = await api.listAll(s.root, 'index');\n      const it = items.find((i) => i.generation === g);\n      return it ? listedTime(it.mtime) : 0;\n    } catch {\n      return 0;\n    }\n  }\n\n  /**\n   * Close a vault in this tab. 'manual' (Lock, or leaving for good) releases\n   * the write lock; 'silent' only stops the clocks. The keys are the\n   * explorer's to drop (`host.dropKeys`), which `lock` does.\n   */\n  function close(root: string, how: 'manual' | 'silent' = 'manual'): void {\n    const s = sessions.get(root);\n    if (!s) return;\n    s.closed = true;\n    s.abort?.abort();\n    if (s.poll !== null) clock.clearInterval(s.poll);\n    s.poll = null;\n    s.idle.stop();\n    if (s.lock) {\n      if (how === 'manual') void s.lock.release();\n      else s.lock.dispose();\n    }\n    s.lock = null;\n    sessions.delete(root);\n    delete strips[root];\n    version.value++;\n  }\n\n  /** \"Lock\": the keys leave memory, the lock screen comes back. */\n  function lock(root: string): void {\n    close(root, 'manual');\n    host.dropKeys(root);\n    host.onLocked(root, 'manual');\n  }\n\n  /** The vault lock: fifteen minutes with nothing done in an open vault. */\n  async function lockIdle(root: string): Promise<void> {\n    const s = sessions.get(root);\n    if (!s || s.closed) return;\n    // Never while this session writes: the clock is paused then, and a\n    // change in flight is activity.\n    if (s.lock?.held || s.strip.busy) {\n      s.idle.touch();\n      return;\n    }\n    close(root, 'manual');\n    host.dropKeys(root);\n    host.onLocked(root, 'idle');\n  }\n\n  /** Every vault (the explorer unmounts, or the page closes). */\n  function closeAll(how: 'manual' | 'silent' = 'manual'): void {\n    for (const r of [...sessions.keys()]) close(r, how);\n  }\n\n  /** The page is closing: release with keepalive, best effort. */\n  function onPageHide(): void {\n    for (const s of sessions.values()) s.lock?.releaseOnUnload();\n  }\n\n  /** The tab came back to the foreground: a vault lock that is due happens now. */\n  function onVisible(): void {\n    for (const s of [...sessions.values()]) s.idle.check();\n  }\n\n  /** A listing, an opening, a download or a write: the vault lock waits. */\n  function touch(wire: string): void {\n    const s = sessionOf(wire);\n    if (!s) return;\n    s.idle.touch();\n    syncDeadlines(s);\n  }\n\n  // ------------------------------------------------------------------\n  // Following other writers\n  // ------------------------------------------------------------------\n\n  function noteHolder(s: Session, l: { holder: { name: string; client: string; label?: string }; since: string; mine: boolean } | null): void {\n    // While this session holds the lock, nobody else does.\n    if (s.lock?.held) {\n      s.strip.holder = null;\n      return;\n    }\n    s.strip.holder = l && !l.mine ? { name: l.holder?.name ?? '', client: l.holder?.client ?? '', label: l.holder?.label, since: l.since } : null;\n  }\n\n  async function poll(s: Session): Promise<void> {\n    if (s.closed) return;\n    try {\n      const st = await api.state(s.root, undefined, s.lock?.tokenValue);\n      s.lastState = clock.now();\n      if (s.closed) return;\n      noteHolder(s, st.lock);\n      if (st.generation < vaultRollbackGuard.highest(s.idHex)) {\n        s.strip.readOnly = 'rollback';\n      } else if (st.generation > s.state.generation && !s.strip.busy) {\n        await refresh(s, st.generation);\n      }\n      syncDeadlines(s);\n    } catch {\n      /* the next poll asks again */\n    }\n  }\n\n  /** Load generation `gen` (the newest the server names) and show it. */\n  async function refresh(s: Session, gen: number): Promise<void> {\n    const loaded = await loadLatestGeneration(s.keys, gen, indexSource(s));\n    if (s.closed) return;\n    if (loaded.damagedLatest) {\n      s.strip.readOnly = 'damaged';\n      s.strip.shownAt = await commitTimeOf(s, loaded.state.generation);\n    } else if (s.strip.readOnly === 'damaged') {\n      s.strip.readOnly = '';\n      s.strip.shownAt = 0;\n    }\n    setState(s, loaded.state);\n    changed(s);\n  }\n\n  /** A realtime event: `vault.generation` or `vault.lock`. */\n  function onEvent(msg: { type?: string; path?: string; generation?: number; held?: boolean; holder?: unknown }): void {\n    const root = typeof msg.path === 'string' ? msg.path.replace(/\\/+$/, '') : '';\n    const s = root ? sessions.get(root) : null;\n    if (!s || s.closed) return;\n    if (msg.type === 'vault.generation' && typeof msg.generation === 'number' && msg.generation > s.state.generation && !s.lock?.held) {\n      s.queue = s.queue.then(() => refresh(s, msg.generation!)).catch(() => undefined);\n    } else if (msg.type === 'vault.lock') {\n      void poll(s);\n    }\n  }\n\n  /** Ask `state` before opening a file (a newer generation may have moved it). */\n  async function freshBeforeOpen(s: Session): Promise<void> {\n    if (s.lock?.held || clock.now() - s.lastState < 5000) return;\n    try {\n      const st = await api.state(s.root);\n      s.lastState = clock.now();\n      noteHolder(s, st.lock);\n      if (st.generation > s.state.generation) await refresh(s, st.generation);\n    } catch {\n      /* read what is on screen */\n    }\n  }\n\n  // ------------------------------------------------------------------\n  // Reading\n  // ------------------------------------------------------------------\n\n  /** The bytes of a file, decrypted. Tries once more after loading the latest\n   *  generation when a pack is gone (a collection ran meanwhile). */\n  async function readBytes(wire: string): Promise<Uint8Array> {\n    const s = sessionOf(wire);\n    if (!s) throw new Error('vault: not open');\n    touch(wire);\n    await freshBeforeOpen(s);\n    const rel = relOf(s.root, wire);\n    const n = s.state.tree.get(rel);\n    if (!n || n.kind === VAULT_ENTRY_FOLDER) throw new VaultWriteError('not_found', rel);\n    try {\n      return await readWholeFile(s.keys, n, fetchRangeOf(s));\n    } catch (err) {\n      if (!(err instanceof VaultApiError && err.code === 'VAULT_PACK_GONE')) throw err;\n      const st = await api.state(s.root);\n      await refresh(s, st.generation);\n      const again = s.state.tree.get(rel);\n      if (!again || again.kind === VAULT_ENTRY_FOLDER) throw new VaultWriteError('not_found', rel);\n      return readWholeFile(s.keys, again, fetchRangeOf(s));\n    }\n  }\n\n  /** A blob URL of the decrypted file, for the viewers. The caller revokes it. */\n  async function readUrl(wire: string, mime?: string): Promise<string> {\n    const bytes = await readBytes(wire);\n    const ext = extOf(baseName(wire));\n    return URL.createObjectURL(new Blob([bytes as Uint8Array<ArrayBuffer>], { type: mime || e2eMimeForExt(ext) }));\n  }\n\n  /**\n   * Download decrypted: one file as itself, anything else as a zip made in\n   * this tab (lib/zipstream). The save target is picked FIRST, in the click.\n   */\n  async function download(targets: FileNode[]): Promise<void> {\n    if (targets.length === 0) return;\n    const s = sessionOf(targets[0].path);\n    if (!s) return;\n    const single = targets.length === 1 && targets[0].type === 'file';\n    const zipName = targets.length === 1 ? `${targets[0].basename}.zip` : `${s.strip.name}.zip`;\n    let target: SaveTarget;\n    try {\n      target = await pickSaveTarget(single ? targets[0].basename : zipName, single ? targets[0].size : undefined);\n    } catch (err) {\n      if (err instanceof SaveCancelled) return;\n      if (err instanceof SaveNeedsGesture) host.toast(host.t('e2e.dl.click_again'), true);\n      else if (err instanceof SaveTooLarge) host.toast(host.t('e2e.vault.dl_too_big'), true);\n      else host.toast(host.t('e2e.download.failed'), true);\n      return;\n    }\n    touch(targets[0].path);\n    const fr = fetchRangeOf(s);\n    try {\n      if (single) {\n        const n = node(targets[0].path);\n        if (!n) throw new VaultWriteError('not_found', targets[0].path);\n        await target.write(fileStream(s.keys, n, fr), { mime: e2eMimeForExt(extOf(n.name)) });\n        return;\n      }\n      const kids = kidsOf(s);\n      // A function declaration does not keep `s`'s narrowing (TS18047).\n      const keys = s.keys;\n      async function* walk(n: VaultNode, prefix: string): AsyncGenerator<ZipEntry> {\n        if (n.kind === VAULT_ENTRY_FOLDER) {\n          yield { name: `${prefix}/`, mtime: new Date(n.mtime) };\n          for (const k of kids.get(n.path) ?? []) yield* walk(k, `${prefix}/${k.name}`);\n        } else {\n          yield { name: prefix, sizeHint: n.size, mtime: new Date(n.mtime), data: fileStream(keys, n, fr) };\n        }\n      }\n      async function* all(): AsyncGenerator<ZipEntry> {\n        for (const t of targets) {\n          const n = node(t.path);\n          if (n) yield* walk(n, n.name);\n        }\n      }\n      host.toast(host.t('e2e.dl.zip_started', { name: zipName }));\n      await target.write(createZipStream(all()), { mime: 'application/zip' });\n      host.toast(host.t('e2e.dl.zip_done', { name: zipName }));\n    } catch (err) {\n      await target.discard();\n      if (err instanceof SaveCancelled) return;\n      host.emitError?.((err as Error)?.message ?? String(err), 'e2e-vault-download');\n      host.toast(err instanceof VaultContentError ? host.t('e2e.vault.damaged_file') : host.t('e2e.download.failed'), true);\n    }\n  }\n\n  // ------------------------------------------------------------------\n  // Writing\n  // ------------------------------------------------------------------\n\n  function enqueue<T>(s: Session, task: () => Promise<T>): Promise<T> {\n    const run = s.queue.then(task, task);\n    s.queue = run.catch(() => undefined);\n    return run;\n  }\n\n  function onLockLost(s: Session, reason: LockEnd, holder?: { name?: string; label?: string } | null): void {\n    s.strip.lostMinutes = s.lock ? Math.max(1, Math.round(s.lock.idleSeconds / 60)) : Math.max(1, s.strip.idleMinutes);\n    s.strip.lostTo = holder ? holder.name || holder.label || '' : '';\n    s.lock = null;\n    s.abort?.abort();\n    s.strip.mode = 'read';\n    s.strip.lost = reason;\n    if (!s.closed) s.idle.resume();\n    syncDeadlines(s);\n    // Who took over, for the strip.\n    if (reason === 'taken' || reason === 'broken') void poll(s);\n  }\n\n  /** Take the write lock (when it is not held), and load the latest generation. */\n  async function ensureLock(s: Session): Promise<void> {\n    if (s.lock?.held) return;\n    s.lock?.dispose();\n    const kind = host.clientKind();\n    const lock = new VaultWriteLock({\n      api,\n      path: s.root,\n      client: kind,\n      label: vaultLockLabel(kind),\n      clock,\n      onLost: (r, h) => onLockLost(s, r, h),\n      headersNow: () => host.headersNow(),\n    });\n    let grant: VaultLockGrant;\n    try {\n      grant = await lock.acquire();\n    } catch (err) {\n      if (err instanceof VaultApiError && err.code === 'VAULT_LOCKED') {\n        const h = err.holder;\n        s.strip.holder = { name: h?.name ?? '', client: String(h?.client ?? ''), label: h?.label, since: typeof err.fields.since === 'string' ? err.fields.since : '' };\n      }\n      throw err;\n    }\n    s.lock = lock;\n    s.uploaded = new Set();\n    s.deleted = new Set();\n    s.strip.holder = null;\n    s.strip.mode = 'write';\n    s.idle.pause();\n    // Latest first: right after taking the lock, the generation the server\n    // names is the one to change.\n    if (grant.generation !== s.state.generation) {\n      const loaded = await loadLatestGeneration(s.keys, grant.generation, indexSource(s));\n      if (loaded.damagedLatest) {\n        s.strip.readOnly = 'damaged';\n        s.strip.shownAt = await commitTimeOf(s, loaded.state.generation);\n        setState(s, loaded.state);\n        await releaseLock(s);\n        throw new VaultReadOnlyError('damaged');\n      }\n      setState(s, loaded.state);\n    }\n    if (s.state.hasExt) {\n      await releaseLock(s);\n      throw new VaultReadOnlyError('newer');\n    }\n    syncDeadlines(s);\n    // What earlier sessions left is collected by the pass that follows this\n    // change's commit (`change`): the change in hand goes first.\n  }\n\n  async function releaseLock(s: Session): Promise<void> {\n    const l = s.lock;\n    s.lock = null;\n    s.strip.mode = 'read';\n    if (l) await l.release();\n    if (!s.closed) s.idle.resume();\n    syncDeadlines(s);\n  }\n\n  function sinkFor(s: Session, signal: AbortSignal): VaultSink {\n    const tried = new Set<number>();\n    const token = () => {\n      const t = s.lock?.tokenValue;\n      if (!t) throw abortError();\n      return t;\n    };\n    return {\n      async putPack(id, bytes) {\n        try {\n          await api.putPack(s.root, id, bytes, token(), signal);\n        } catch (err) {\n          if (s.lock?.lostBy(err)) throw abortError();\n          throw err;\n        }\n        s.uploaded.add(id);\n        s.lock?.wrote();\n      },\n      async putIndex(gen, bytes) {\n        const again = tried.has(gen);\n        tried.add(gen);\n        try {\n          await api.putIndex(s.root, gen, bytes, token(), signal);\n        } catch (err) {\n          if (s.lock?.lostBy(err)) throw abortError();\n          // A retry whose first try landed: the server is at this generation.\n          if (again && err instanceof VaultApiError && err.code === 'VAULT_GENERATION' && err.latest === gen) return;\n          throw err;\n        }\n        s.lock?.wrote();\n      },\n    };\n  }\n\n  interface ChangeCtx {\n    apply(op: VaultOp): Promise<void>;\n    /** Copy the live extents in `packs` into new packs (garbage collection). */\n    repack(packs: ReadonlySet<string>, fr: FetchRange): Promise<void>;\n    /** The tree with the operations so far. */\n    tree(): Map<string, VaultNode>;\n    /** Commit now when 30 seconds of a long change stored packs. */\n    checkpoint(): Promise<void>;\n    progress(done: number, total: number): void;\n    signal: AbortSignal;\n  }\n\n  /**\n   * One change the person sees: take the lock, apply, commit. Only after the\n   * commit succeeded is it reported as saved. False when nothing was saved\n   * (the reason is already said).\n   */\n  async function change(s: Session, labels: string[], run: (ctx: ChangeCtx) => Promise<void>, opts: { quiet?: boolean } = {}): Promise<boolean> {\n    return enqueue(s, async () => {\n      if (s.closed) return false;\n      if (s.strip.readOnly) {\n        host.toast(readOnlyWords(s.strip.readOnly), true);\n        return false;\n      }\n      s.strip.lost = '';\n      s.strip.lostTo = '';\n      s.strip.unsaved = [];\n      s.strip.error = '';\n      try {\n        await ensureLock(s);\n      } catch (err) {\n        say(s, err);\n        return false;\n      }\n      const lock = s.lock!;\n      const done = lock.busy();\n      const ctl = new AbortController();\n      s.abort = ctl;\n      s.strip.busy = true;\n      const newWriter = () =>\n        new VaultWriter(s.state, {\n          fmk: s.keys.fmk,\n          vaultId: s.keys.vaultId,\n          packLog2: s.keys.packLog2,\n          random,\n          sink: sinkFor(s, ctl.signal),\n          signal: ctl.signal,\n          deleted: s.deleted,\n        });\n      let writer = newWriter();\n      let packsAt = s.uploaded.size;\n      let lastCommit = clock.now();\n      const commit = async () => {\n        const c = await writer.commit();\n        s.deleted = new Set();\n        setState(s, c.state);\n        lastCommit = clock.now();\n        packsAt = s.uploaded.size;\n        changed(s);\n      };\n      const ctx: ChangeCtx = {\n        apply: (op) => writer.apply(op),\n        repack: (packs, fr) => writer.repack(packs, fr),\n        tree: () => writer.current,\n        async checkpoint() {\n          if (clock.now() - lastCommit >= VAULT_COMMIT_EVERY_MS && s.uploaded.size > packsAt) {\n            await commit();\n            writer = newWriter();\n          }\n        },\n        progress(d, t) {\n          s.strip.progress = { done: d, total: t };\n        },\n        signal: ctl.signal,\n      };\n      try {\n        await run(ctx);\n        await commit();\n        // After each commit: a collection pass (and a repack when it pays).\n        void enqueue(s, () => collect(s));\n        return true;\n      } catch (err) {\n        if (ctl.signal.aborted || (err as Error)?.name === 'AbortError') {\n          s.strip.unsaved = labels;\n        } else if (!opts.quiet) {\n          say(s, err);\n        }\n        return false;\n      } finally {\n        done();\n        if (s.abort === ctl) s.abort = null;\n        s.strip.busy = false;\n        s.strip.progress = null;\n        syncDeadlines(s);\n      }\n    });\n  }\n\n  /**\n   * A failure, said in the person's words.\n   *\n   * ⚠ A refusal of the vault API is said in the SERVER's words (its\n   * `message`, server.e2e.vault.* in the reader's language - \"Ayşe is writing\n   * this vault…\", \"This folder is not a vault.\"): this used to keep its own\n   * copies of those two (0.54 audit A2). What the browser alone knows - a\n   * write the encrypted index refused, a vault that reads damaged - stays\n   * said here: the server cannot see inside a vault.\n   */\n  function say(s: Session, err: unknown): void {\n    let msg: string;\n    const serverSaid = err instanceof VaultApiError && typeof err.fields.message === 'string' ? err.fields.message.trim() : '';\n    if (err instanceof VaultReadOnlyError) msg = readOnlyWords(err.why);\n    else if (err instanceof VaultWriteError) msg = host.t(`e2e.vault.err.${err.code}`, { name: err.path ? baseName(err.path) : '' });\n    else if (serverSaid) {\n      // Isolated for the reader's direction by the translator that knows it\n      // (useLocale's `t.foreign`, lib/errorWords `T`).\n      const foreign = (host.t as { foreign?: (text: string) => string }).foreign;\n      msg = typeof foreign === 'function' ? foreign(serverSaid) : serverSaid;\n    }\n    else msg = host.t('e2e.vault.err.failed');\n    s.strip.error = msg;\n    host.emitError?.((err as Error)?.message ?? String(err), 'e2e-vault');\n    host.toast(msg, true);\n  }\n\n  function readOnlyWords(why: VaultReadOnly): string {\n    if (why === 'damaged') return host.t('e2e.vault.ro_damaged_short');\n    if (why === 'rollback') return host.t('e2e.vault.ro_rollback');\n    if (why === 'newer') return host.t('e2e.vault.ro_newer');\n    if (why === 'unreadable') return host.t('e2e.vault.unreadable');\n    return host.t('e2e.vault.err.failed');\n  }\n\n  /** The collection pass the lock holder runs after a commit. */\n  async function collect(s: Session): Promise<void> {\n    if (s.closed || !s.lock?.held || s.strip.readOnly || s.state.hasExt || s.state.generation < 1) return;\n    const token = s.lock.tokenValue;\n    if (!token) return;\n    try {\n      const [idx, packs] = await Promise.all([api.listAll(s.root, 'index'), api.listAll(s.root, 'pack')]);\n      // Retention is measured on the SERVER's clock (the listing's `now`):\n      // a client whose clock runs ahead would delete what a reader still\n      // needs. Without it, nothing that depends on time is deleted.\n      const serverNow = idx.now;\n      const plan = planCollection({\n        latest: s.state,\n        indexes: idx.items.filter((i) => typeof i.generation === 'number').map((i) => ({ generation: i.generation!, mtime: listedTime(i.mtime) })),\n        packs: packs.items.filter((p) => typeof p.id === 'string').map((p) => ({ id: p.id! })),\n        uploaded: s.uploaded,\n        now: serverNow,\n      });\n      if (plan.indexes.length + plan.packs.length > 0 && s.lock?.held) {\n        await api.del(s.root, plan.packs, plan.indexes, token);\n        s.lock?.wrote();\n        const grave = new Set(s.state.grave.map((g) => g.pack));\n        for (const p of plan.packs) if (grave.has(p)) s.deleted.add(p);\n      }\n    } catch (err) {\n      if (s.lock?.lostBy(err)) return;\n      /* the next pass deletes it */\n    }\n    const S = repackCandidates(s.state, s.keys.packLog2);\n    if (S && s.lock?.held) {\n      const fr = fetchRangeOf(s);\n      void change(s, [], (ctx) => ctx.repack(S, fr), { quiet: true });\n    }\n  }\n\n  // ------------------------------------------------------------------\n  // The person's changes\n  // ------------------------------------------------------------------\n\n  function freeName(tree: Map<string, VaultNode>, dir: string, name: string): string {\n    if (!tree.has(joinVaultPath(dir, name))) return name;\n    for (let i = 2; i < 10_000; i++) {\n      const n = numberedName(name, i);\n      if (!tree.has(joinVaultPath(dir, n))) return n;\n    }\n    throw new VaultWriteError('name_taken', name);\n  }\n\n  function checkName(name: string): string {\n    const n = String(name ?? '').normalize('NFC');\n    if (vaultNameProblem(utf8(n))) throw new VaultWriteError('bad_name', n);\n    return n;\n  }\n\n  /** Warn from 200 000 entries; refuse at the limit, before anything is written. */\n  function roomFor(s: Session, more: number): boolean {\n    const after = s.state.tree.size + more;\n    if (after > VAULT_ENTRIES_WRITE_MAX) {\n      host.toast(host.t('e2e.vault.err.too_many_entries'), true);\n      return false;\n    }\n    const status = vaultLimitStatus(after, indexFileSize(s.state.bodyLen));\n    if (status === 'full') {\n      host.toast(host.t('e2e.vault.err.index_too_large'), true);\n      return false;\n    }\n    if (status === 'warn') {\n      const count = host.formatCount ?? ((n: number) => String(n));\n      host.toast(host.t('e2e.vault.limit_warn', { held: count(after), max: count(VAULT_ENTRIES_WRITE_MAX) }));\n    }\n    return true;\n  }\n\n  /**\n   * Upload files into the vault folder `dirWire`. A file from a folder upload\n   * (`webkitRelativePath`) brings its folders. A name that is taken is asked\n   * about (host.askName: \"upload it as `x (2).txt`?\") before anything is\n   * written, as nothing in a vault is overwritten - it keeps no earlier\n   * version; a file the person declines stays out. A name taken in the\n   * meantime (another writer's generation) gets a number.\n   */\n  async function upload(dirWire: string, picked: File[]): Promise<boolean> {\n    const s = sessionOf(dirWire);\n    if (!s || picked.length === 0) return false;\n    if (!roomFor(s, picked.length)) return false;\n    touch(dirWire);\n    const dir = relOf(s.root, dirWire);\n    const asked = new Map<File, string>();\n    const files: File[] = [];\n    if (host.askName) {\n      const planned = new Set<string>();\n      for (const f of picked) {\n        const rel = String((f as File & { webkitRelativePath?: string }).webkitRelativePath || f.name);\n        let segs: string[];\n        try {\n          segs = rel.split('/').filter(Boolean).map(checkName);\n        } catch (err) {\n          say(s, err);\n          return false;\n        }\n        const at = segs.slice(0, -1).reduce((p, seg) => joinVaultPath(p, seg), dir);\n        const name = segs[segs.length - 1] ?? checkName(f.name);\n        const path = joinVaultPath(at, name);\n        if (!s.state.tree.has(path) && !planned.has(path)) {\n          planned.add(path);\n          files.push(f);\n          continue;\n        }\n        let suggested = name;\n        for (let i = 2; i < 10_000; i++) {\n          suggested = numberedName(name, i);\n          const p = joinVaultPath(at, suggested);\n          if (!s.state.tree.has(p) && !planned.has(p)) break;\n        }\n        const folder = [baseName(s.root), ...at.split('/').filter(Boolean)].join(' / ');\n        if (!(await host.askName({ name, folder, suggested }))) continue;\n        planned.add(joinVaultPath(at, suggested));\n        asked.set(f, suggested);\n        files.push(f);\n      }\n      if (files.length === 0) return false;\n    } else {\n      files.push(...picked);\n    }\n    const total = files.reduce((n, f) => n + f.size, 0);\n    return change(s, files.map((f) => asked.get(f) ?? f.name), async (ctx) => {\n      let done = 0;\n      for (const f of files) {\n        const rel = String((f as File & { webkitRelativePath?: string }).webkitRelativePath || f.name);\n        const segs = rel.split('/').filter(Boolean).map(checkName);\n        let at = dir;\n        for (const seg of segs.slice(0, -1)) {\n          const p = joinVaultPath(at, seg);\n          const there = ctx.tree().get(p);\n          if (!there) await ctx.apply({ op: 'mkdir', path: p, mtime: clock.now() });\n          else if (there.kind !== VAULT_ENTRY_FOLDER) throw new VaultWriteError('name_taken', p);\n          at = p;\n        }\n        const name = freeName(ctx.tree(), at, asked.get(f) ?? segs[segs.length - 1] ?? checkName(f.name));\n        await ctx.apply({ op: 'write', path: joinVaultPath(at, name), mtime: f.lastModified || clock.now(), content: f });\n        done += f.size;\n        ctx.progress(done, total);\n        await ctx.checkpoint();\n      }\n    });\n  }\n\n  /** A new folder in `dirWire`. */\n  async function mkdir(dirWire: string, name: string): Promise<boolean> {\n    const s = sessionOf(dirWire);\n    if (!s) return false;\n    if (!roomFor(s, 1)) return false;\n    touch(dirWire);\n    let clean: string;\n    try {\n      clean = checkName(name);\n    } catch (err) {\n      say(s, err);\n      return false;\n    }\n    const path = joinVaultPath(relOf(s.root, dirWire), clean);\n    return change(s, [clean], (ctx) => ctx.apply({ op: 'mkdir', path, mtime: clock.now() }));\n  }\n\n  /** Rename an entry in place. */\n  async function rename(wire: string, newName: string): Promise<boolean> {\n    const s = sessionOf(wire);\n    if (!s) return false;\n    touch(wire);\n    let clean: string;\n    try {\n      clean = checkName(newName);\n    } catch (err) {\n      say(s, err);\n      return false;\n    }\n    const from = relOf(s.root, wire);\n    const to = joinVaultPath(splitVaultPath(from).parent, clean);\n    if (to === from) return true;\n    return change(s, [baseName(wire)], (ctx) => ctx.apply({ op: 'move', from, to }));\n  }\n\n  /** Move entries to the folder `toDirWire` of the same vault. */\n  async function move(wires: string[], toDirWire: string): Promise<boolean> {\n    const s = sessionOf(toDirWire);\n    if (!s || wires.length === 0) return false;\n    if (wires.some((w) => shared.rootOf(w) !== s.root)) {\n      host.toast(host.t('e2e.vault.cross'), true);\n      return false;\n    }\n    touch(toDirWire);\n    const toDir = relOf(s.root, toDirWire);\n    return change(s, wires.map(baseName), async (ctx) => {\n      for (const w of wires) {\n        const from = relOf(s.root, w);\n        const to = joinVaultPath(toDir, splitVaultPath(from).name);\n        if (to !== from) await ctx.apply({ op: 'move', from, to });\n      }\n    });\n  }\n\n  /**\n   * Copy entries to `toDirWire` of the same vault: read and written again,\n   * every file under a new content id (the nonce rule). A taken name gets a\n   * number.\n   */\n  async function copy(wires: string[], toDirWire: string): Promise<boolean> {\n    const s = sessionOf(toDirWire);\n    if (!s || wires.length === 0) return false;\n    if (wires.some((w) => shared.rootOf(w) !== s.root)) {\n      host.toast(host.t('e2e.vault.cross'), true);\n      return false;\n    }\n    const sources = wires.map((w) => s.state.tree.get(relOf(s.root, w))).filter((n): n is VaultNode => !!n);\n    const all = canonicalOrder(s.state.tree);\n    let more = 0;\n    for (const n of sources) more += 1 + (n.kind === VAULT_ENTRY_FOLDER ? all.filter((e) => e.path.startsWith(n.path + '/')).length : 0);\n    if (!roomFor(s, more)) return false;\n    touch(toDirWire);\n    const toDir = relOf(s.root, toDirWire);\n    const fr = fetchRangeOf(s);\n    const keys = s.keys;\n    return change(s, sources.map((n) => n.name), async (ctx) => {\n      for (const src of sources) {\n        const top = joinVaultPath(toDir, freeName(ctx.tree(), toDir, src.name));\n        if (src.kind === VAULT_ENTRY_FOLDER && (top === src.path || top.startsWith(src.path + '/'))) throw new VaultWriteError('into_itself', top);\n        const list = src.kind === VAULT_ENTRY_FOLDER ? [src, ...all.filter((e) => e.path.startsWith(src.path + '/'))] : [src];\n        for (const e of list) {\n          const path = top + e.path.slice(src.path.length);\n          if (e.kind === VAULT_ENTRY_FOLDER) await ctx.apply({ op: 'mkdir', path, mtime: e.mtime });\n          else await ctx.apply({ op: 'write', path, mtime: e.mtime, content: { size: e.size, stream: () => fileStream(keys, e, fr, ctx.signal) } });\n          await ctx.checkpoint();\n        }\n      }\n    });\n  }\n\n  /** Delete entries (a folder with everything under it). For good: a vault keeps no trash. */\n  async function remove(wires: string[]): Promise<boolean> {\n    if (wires.length === 0) return false;\n    const s = sessionOf(wires[0]);\n    if (!s) return false;\n    touch(wires[0]);\n    const paths = wires.map((w) => relOf(s.root, w)).filter(Boolean);\n    // A child of a folder also being deleted goes with it.\n    const top = paths.filter((p) => !paths.some((q) => q !== p && p.startsWith(q + '/')));\n    return change(s, wires.map(baseName), async (ctx) => {\n      for (const p of top) await ctx.apply({ op: 'delete', path: p });\n    });\n  }\n\n  /** The strip's \"Take over\": end the other session's lock, then take it. */\n  async function takeOver(root: string): Promise<boolean> {\n    const s = sessions.get(root);\n    if (!s || s.closed) return false;\n    try {\n      await api.breakLock(root);\n    } catch (err) {\n      say(s, err);\n      return false;\n    }\n    s.strip.holder = null;\n    try {\n      await enqueue(s, () => ensureLock(s));\n    } catch (err) {\n      say(s, err);\n      return false;\n    }\n    return true;\n  }\n\n  /** \"Continue from this state\": commit latest + 1 with the tree on screen. */\n  async function continueFromShown(root: string): Promise<boolean> {\n    const s = sessions.get(root);\n    if (!s || s.closed || s.strip.readOnly !== 'damaged') return false;\n    let latest = s.state.generation;\n    try {\n      latest = (await api.state(root)).generation;\n    } catch {\n      /* the server's answer to the commit decides */\n    }\n    s.strip.readOnly = '';\n    s.state = { ...s.state, generation: latest };\n    const ok = await change(s, [], async () => undefined);\n    if (!ok) s.strip.readOnly = 'damaged';\n    else s.strip.shownAt = 0;\n    return ok;\n  }\n\n  /** Clear what the strip says about the last lost lock. */\n  function dismiss(root: string): void {\n    const s = sessions.get(root);\n    if (!s) return;\n    s.strip.lost = '';\n    s.strip.lostTo = '';\n    s.strip.unsaved = [];\n    s.strip.error = '';\n  }\n\n  /** The person's idle time (minutes, 1-10), kept on the server. */\n  const idlePrefs = {\n    get: async (): Promise<number> => (await api.getPrefs()).idle_minutes,\n    set: async (minutes: number): Promise<number> => (await api.putPrefs(minutes)).idle_minutes,\n  };\n\n  /** Make a vault on the server (`POST /create`); the caller made it in memory. */\n  async function create(path: string, marker: E2eMarker, index: Uint8Array): Promise<void> {\n    await api.create(path, marker, index);\n  }\n\n  /** The level the server gave this account at the vault folder. */\n  function permOf(root: string): string | undefined {\n    return sessions.get(root)?.perm;\n  }\n\n  /** The vault folders open in this tab (useE2eVault's rootOf reads them). */\n  function openRoots(): string[] {\n    return [...sessions.keys()];\n  }\n\n  return {\n    openRoots,\n    isOpen,\n    permOf,\n    node,\n    rows,\n    search,\n    open,\n    close,\n    closeAll,\n    lock,\n    touch,\n    onPageHide,\n    onVisible,\n    onEvent,\n    readBytes,\n    readUrl,\n    download,\n    upload,\n    mkdir,\n    rename,\n    move,\n    copy,\n    remove,\n    takeOver,\n    continueFromShown,\n    dismiss,\n    create,\n    idlePrefs,\n  };\n}\n\n/** A vault this session may read and not write. */\nexport class VaultReadOnlyError extends Error {\n  constructor(public readonly why: VaultReadOnly) {\n    super(`vault: read-only (${why})`);\n    this.name = 'VaultReadOnlyError';\n  }\n}\n\nexport type VaultEngine = ReturnType<typeof createVaultEngine>;\n","<script setup lang=\"ts\">\n/**\n * E2eVaultStrip — what an open vault is doing, in one sentence (wiring:e2\n * vault; docs/E2E-VAULT-FORMAT.md → \"The write lock\", \"The idle lock\").\n *\n * The strip above the listing of an unlocked vault, in place of the\n * encrypted folder's strip. It answers the questions a vault raises and a\n * folder does not:\n *\n *   - who writes: you (with how long until it goes back to read-only), or\n *     somebody else (who, since when, and - for the folder's owner or an\n *     administrator - \"Take over\"), or nobody (read-only until you change\n *     something);\n *   - when the vault locks itself: fifteen minutes with nothing done in it\n *     after the write lock ended (or after it was opened), counted down;\n *   - why it went back to read-only, and what was not saved;\n *   - why it stays read-only (the newest state is damaged, the server offers\n *     an older one than this tab saw, a newer filex wrote it).\n *\n * The countdowns tick here, once a second, from deadlines the composable\n * keeps (composables/useE2eVault). Every action is the parent's.\n */\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { VaultStripState } from '../composables/useE2eVault';\nimport { localeTag, useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport { VAULT_ENTRIES_WRITE_MAX } from '../lib/e2evault/consts';\n\n// ⚠ withDefaults: an absent optional boolean prop is `false` in Vue, not\n// undefined, so without the default the Settings button never showed (the\n// explorer passes no `settings`).\nconst props = withDefaults(\n  defineProps<{\n    locale: LocaleCode;\n    state: VaultStripState;\n    /** Settings (password, escrow) are open to this account. */\n    settings?: boolean;\n  }>(),\n  { settings: true },\n);\n\nconst emit = defineEmits<{\n  (e: 'settings'): void;\n  (e: 'lock'): void;\n  (e: 'take-over'): void;\n  (e: 'continue'): void;\n  (e: 'dismiss'): void;\n}>();\n\nconst { t, formatDate, formatSize } = useLocale(() => props.locale);\n\nconst now = ref(Date.now());\nlet tick: ReturnType<typeof setInterval> | null = null;\nonMounted(() => {\n  tick = setInterval(() => (now.value = Date.now()), 1000);\n});\nonBeforeUnmount(() => {\n  if (tick) clearInterval(tick);\n});\n\n/** A count in this surface's language. */\nfunction count(n: number): string {\n  try {\n    return new Intl.NumberFormat(localeTag(props.locale)).format(n);\n  } catch {\n    return String(n);\n  }\n}\n\n/** m:ss of what is left until `deadline` (0:00 once it passed). */\nfunction left(deadline: number): string {\n  const s = Math.max(0, Math.ceil((deadline - now.value) / 1000));\n  const m = Math.floor(s / 60);\n  return `${m}:${String(s % 60).padStart(2, '0')}`;\n}\n\nconst holderName = computed(() => {\n  const h = props.state.holder;\n  if (!h) return '';\n  return h.label ? `${h.name || t('e2e.vault.someone')} (${h.label})` : h.name || t('e2e.vault.someone');\n});\n\n/** The one sentence: what the vault is doing for this tab right now. */\nconst sentence = computed<string>(() => {\n  const s = props.state;\n  if (s.readOnly === 'unreadable') return t('e2e.vault.unreadable');\n  if (s.readOnly === 'damaged') {\n    return s.shownAt\n      ? t('e2e.vault.ro_damaged', { when: formatDate(s.shownAt, { time: true }) })\n      : t('e2e.vault.ro_damaged_short');\n  }\n  if (s.readOnly === 'rollback') return t('e2e.vault.ro_rollback');\n  if (s.readOnly === 'newer') return t('e2e.vault.ro_newer');\n  if (s.busy && s.progress && s.progress.total > 0) {\n    return t('e2e.vault.saving_progress', { done: formatSize(s.progress.done), total: formatSize(s.progress.total) });\n  }\n  if (s.busy) return t('e2e.vault.saving');\n  if (s.mode === 'write') return t('e2e.vault.writing', { left: left(s.idleDeadline) });\n  // Who took over, as the server said it when the lock was lost.\n  if (s.lost === 'taken' && s.lostTo) return t('e2e.vault.lost_taken_by', { name: s.lostTo });\n  if (s.lost === 'broken' && s.lostTo) return t('e2e.vault.lost_broken_by', { name: s.lostTo });\n  if (s.holder) {\n    return t('e2e.vault.held_by', {\n      name: holderName.value,\n      since: s.holder.since ? formatDate(Date.parse(s.holder.since), { time: true }) : '',\n    });\n  }\n  if (s.lost === 'idle') return t('e2e.vault.lost_idle', { n: s.lostMinutes || 1 });\n  if (s.lost === 'taken' || s.lost === 'broken') return t('e2e.vault.lost_taken');\n  if (s.lost === 'connection') return t('e2e.vault.lost_connection');\n  if (s.lost === 'expired' || s.lost === 'released') return t('e2e.vault.lost_expired');\n  return t('e2e.vault.read_only');\n});\n\n/** The second clock: when the vault locks itself. */\nconst lockLine = computed(() => {\n  const s = props.state;\n  if (!s.lockDeadline || s.mode === 'write' || s.busy) return '';\n  return t('e2e.vault.lock_countdown', { left: left(s.lockDeadline) });\n});\n\nconst tone = computed(() => {\n  const s = props.state;\n  if (s.readOnly) return 'warn';\n  if (s.unsaved.length > 0 || s.error) return 'error';\n  if (s.mode === 'write' || s.busy) return 'write';\n  return 'read';\n});\n</script>\n\n<template>\n  <div\n    class=\"fe-e2e-strip fe-vault-strip\"\n    :class=\"`fe-vault-strip--${tone}`\"\n    role=\"status\"\n    aria-live=\"polite\"\n    data-testid=\"e2e-vault-strip\"\n    :data-mode=\"state.mode\"\n    :data-readonly=\"state.readOnly || undefined\"\n  >\n    <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n    <span class=\"fe-e2e-strip__icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('lock')\"></span>\n    <span class=\"fe-e2e-strip__names\" data-testid=\"e2e-names-status\">{{ t('e2e.level.vault') }}</span>\n    <span class=\"fe-vault-strip__text\">\n      <span class=\"fe-vault-strip__sentence\" data-testid=\"e2e-vault-sentence\">{{ sentence }}</span>\n      <span v-if=\"lockLine\" class=\"fe-vault-strip__lock\" data-testid=\"e2e-vault-lock-countdown\">{{ lockLine }}</span>\n      <span v-if=\"state.unsaved.length\" class=\"fe-vault-strip__unsaved\" data-testid=\"e2e-vault-unsaved\">\n        {{ t('e2e.vault.unsaved', { names: state.unsaved.join(', ') }) }}\n      </span>\n      <span v-if=\"state.limit === 'warn'\" class=\"fe-vault-strip__unsaved\" data-testid=\"e2e-vault-limit\">\n        {{ t('e2e.vault.limit_warn', { held: count(state.entries), max: count(VAULT_ENTRIES_WRITE_MAX) }) }}\n      </span>\n    </span>\n    <span class=\"fe-vault-strip__actions\">\n      <button\n        v-if=\"state.holder && !state.readOnly\"\n        type=\"button\"\n        class=\"fe-btn fe-e2e-strip__btn\"\n        data-testid=\"e2e-vault-take-over\"\n        @click=\"emit('take-over')\"\n      >\n        {{ t('e2e.vault.take_over') }}\n      </button>\n      <button\n        v-if=\"state.readOnly === 'damaged'\"\n        type=\"button\"\n        class=\"fe-btn fe-e2e-strip__btn\"\n        data-testid=\"e2e-vault-continue\"\n        @click=\"emit('continue')\"\n      >\n        {{ t('e2e.vault.continue') }}\n      </button>\n      <button\n        v-if=\"state.lost || state.unsaved.length || state.error\"\n        type=\"button\"\n        class=\"fe-btn fe-e2e-strip__btn\"\n        data-testid=\"e2e-vault-dismiss\"\n        @click=\"emit('dismiss')\"\n      >\n        {{ t('e2e.vault.dismiss') }}\n      </button>\n      <button\n        v-if=\"settings !== false\"\n        type=\"button\"\n        class=\"fe-btn fe-e2e-strip__btn\"\n        data-testid=\"e2e-settings-open\"\n        :disabled=\"state.busy\"\n        @click=\"emit('settings')\"\n      >\n        {{ t('e2e.settings.open') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn fe-e2e-strip__btn\" data-testid=\"e2e-vault-lock\" :disabled=\"state.busy\" @click=\"emit('lock')\">\n        {{ t('e2e.strip.lock') }}\n      </button>\n    </span>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * TimeZoneDialog — zaman:z3, the embed's own time-zone setting.\n *\n * The owner, 2026-09-14: *\"gömme için ayar bırakmamız lazım; basitçe tarayıcıda\n * tutulan bir ayar olması lazım.\"* An embed has no user-settings dialog — its\n * \"⋯\" menu (theme, density, shortcuts) is where its settings live — so the menu\n * opens this, and a pick is stored in THIS browser (`lib/timezone`, tier\n * `viewer`). Nothing is sent anywhere: an embed's credential may be shared by\n * every visitor, and there is no account of the visitor's to write to.\n *\n * ⚠ The picker is `TimeZonePicker`, the same component the web app's settings\n * modal mounts. Not a second one.\n *\n * ⚠ The first row is \"use the default\", and it names what the default IS on\n * this page — the zone the embedder configured, the account's zone, or this\n * device's — by asking the resolver with the viewer tier blanked. A reset\n * whose outcome you have to guess is not a reset.\n */\nimport { computed, inject, onBeforeUnmount, ref, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { formatInstant, useLocale } from '../composables/useLocale';\nimport {\n  EXPLORER_CLOCK,\n  deviceTimeZone,\n  resolveTimeZone,\n  resolvedTimeZoneFor,\n  setViewerTimeZone,\n  timeZoneSourcesFor,\n  viewerTimeZone,\n} from '../lib/timezone';\nimport Modal from '../modals/Modal.vue';\nimport TimeZonePicker from './TimeZonePicker.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  theme?: ThemeMode;\n}>();\n\nconst emit = defineEmits<{ (e: 'close'): void }>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst inputId = `fe-tzdialog-${Math.random().toString(36).slice(2, 9)}`;\n\n// This explorer's clock, not the page's newest (lib/timezone, timeZoneSourcesFor).\nconst clock = inject(EXPLORER_CLOCK, undefined);\nconst fallback = computed(() => resolveTimeZone({ ...timeZoneSourcesFor(clock), viewer: '' }));\nconst inForce = computed(() => resolvedTimeZoneFor(clock));\nconst inForceZone = computed(() => inForce.value.zone ?? deviceTimeZone());\n\n/** \"Right now in Asia/Tokyo: 14:05:09\" — the fastest way to see a wrong pick. */\nconst now = ref('');\nlet timer: ReturnType<typeof setInterval> | undefined;\nfunction refresh(): void {\n  // Through the shared formatter, which reads the RESOLVED zone — the readout\n  // must say what every date on the page is actually drawn in, not what this\n  // dialog thinks it chose.\n  now.value = formatInstant(\n    new Date(),\n    props.locale,\n    {\n      hour: '2-digit',\n      minute: '2-digit',\n      second: '2-digit',\n    },\n    clock,\n  );\n}\nwatch(\n  () => props.open,\n  (open) => {\n    if (timer) clearInterval(timer);\n    timer = undefined;\n    if (!open) return;\n    refresh();\n    timer = setInterval(refresh, 1000);\n  },\n  { immediate: true },\n);\nwatch(inForce, refresh);\nonBeforeUnmount(() => {\n  if (timer) clearInterval(timer);\n});\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('tz.title')\" size=\"md\" :theme=\"theme\" @close=\"emit('close')\">\n    <div class=\"fe-tzdialog\" data-testid=\"fe-tz-dialog\">\n      <label class=\"fe-tzdialog__label\" :for=\"inputId\">{{ t('tz.label') }}</label>\n      <TimeZonePicker\n        :input-id=\"inputId\"\n        :locale=\"locale\"\n        :model-value=\"viewerTimeZone()\"\n        :fallback=\"fallback\"\n        :label=\"t('tz.label')\"\n        testid=\"fe-tz\"\n        @update:model-value=\"setViewerTimeZone\"\n      />\n      <p class=\"fe-tzdialog__hint\">{{ t('tz.hint') }}</p>\n      <p class=\"fe-tzdialog__now\" data-testid=\"fe-tz-now\" :data-tier=\"inForce.tier\">\n        {{ t('tz.now', { zone: inForceZone, time: now }) }}\n      </p>\n    </div>\n  </Modal>\n</template>\n\n<!-- Not scoped — see TimeZonePicker.vue / ThemePalette.vue. -->\n<style>\n/* Tall enough that the zone list opens downward inside the dialog instead of\n   being clipped by the body's own scroll box. */\n.fe-tzdialog {\n  display: flex;\n  flex-direction: column;\n  gap: var(--fe-gap-sm);\n  min-height: 340px;\n}\n.fe-tzdialog__label {\n  font-size: var(--fe-text-sm);\n  font-weight: 500;\n  color: var(--fe-text);\n}\n.fe-tzdialog__hint,\n.fe-tzdialog__now {\n  margin: 0;\n  font-size: var(--fe-text-xs);\n  line-height: 1.45;\n  color: var(--fe-text-muted);\n}\n.fe-tzdialog__now {\n  font-size: var(--fe-text-sm);\n  font-variant-numeric: tabular-nums;\n}\n</style>\n","// The server caps how long a new share link may live (`share_max_ttl_days` in\n// /api/capabilities, set by the admin under Protection; default 7 days). The\n// dialogs read it so they only OFFER expiries the server will honour — a\n// \"30 days\" option that quietly becomes 7 days is a lie on the screen, and a\n// \"Never\" option that becomes a week is a worse one.\n//\n// One helper for every surface: the Share / Permissions panel, the standalone\n// share dialog, the desktop app and the embeds all render the same choices\n// from the same rule. A surface that clamps differently would mean the same\n// product behaves two ways.\n\nimport { formatWhen, translate } from '../composables/useLocale'; /* zaman:z1 */\n\n/**\n * A catalogue string for a bare locale code — this is a module, not a\n * component, so it cannot call `useLocale`. ⚠ Through `translate`, which is\n * `t()`'s own lookup: a language pack's words reach these lines too (they were\n * `tr ? … : …` pairs, which a pack could not translate and which printed\n * TURKISH under any language that was not English), and \"{days} days\" takes\n * its form by the pack language's plural rule, not English's. It had a copy\n * of `t()`'s lookup, and the copy read English's `_one` under a pack that had\n * written only the plain form.\n */\nfunction say(locale: string, key: string, vars: Record<string, string | number> = {}): string {\n  return translate(locale, key, vars);\n}\n\nexport interface ExpiryOption {\n  /** Days; 0 = never. */\n  v: number;\n  l: string;\n}\n\n/** The stock expiry choices before the ceiling is applied (days; 0 = never). */\nexport const STOCK_EXPIRY_DAYS = [0, 1, 7, 30];\n\n/**\n * clampExpiryOptions returns the options a dialog may show under a ceiling\n * of `maxDays` (0/undefined = no ceiling → every option as is). Options past\n * the ceiling and \"never\" are dropped; the ceiling itself is added as the\n * longest choice when the stock list does not already contain it.\n */\nexport function clampExpiryOptions(\n  days: number[],\n  maxDays: number | undefined,\n  label: (days: number) => string,\n): ExpiryOption[] {\n  const max = maxDays && maxDays > 0 ? Math.floor(maxDays) : 0;\n  let list = max ? days.filter((d) => d > 0 && d <= max) : days.slice();\n  if (max && !list.includes(max)) list.push(max);\n  list = Array.from(new Set(list)).sort((a, b) => (a === 0 ? -1 : b === 0 ? 1 : a - b));\n  return list.map((d) => ({ v: d, l: label(d) }));\n}\n\n/**\n * defaultExpiryDays is what a fresh dialog preselects: the ceiling when there\n * is one (the server would apply it anyway — showing it up front is honest),\n * otherwise \"never\".\n */\nexport function defaultExpiryDays(maxDays: number | undefined): number {\n  return maxDays && maxDays > 0 ? Math.floor(maxDays) : 0;\n}\n\n/**\n * clampExpiryDate pulls a free-form expiry (datetime input) under the ceiling.\n * Returns the ISO string to send, or null for \"never\" when there is no\n * ceiling. `now` is injectable for tests.\n */\nexport function clampExpiryDate(\n  chosen: Date | null,\n  maxDays: number | undefined,\n  now: Date = new Date(),\n): { iso: string | null; clamped: boolean } {\n  const max = maxDays && maxDays > 0 ? Math.floor(maxDays) : 0;\n  if (!max) return { iso: chosen ? chosen.toISOString() : null, clamped: false };\n  const limit = new Date(now.getTime() + max * 86400000);\n  if (!chosen || chosen.getTime() > limit.getTime()) return { iso: limit.toISOString(), clamped: true };\n  return { iso: chosen.toISOString(), clamped: false };\n}\n\n/** Value for a `<input type=\"datetime-local\" max=…>` under the ceiling (local time, minute precision). */\nexport function expiryInputMax(maxDays: number | undefined, now: Date = new Date()): string | undefined {\n  const max = maxDays && maxDays > 0 ? Math.floor(maxDays) : 0;\n  if (!max) return undefined;\n  const limit = new Date(now.getTime() + max * 86400000);\n  const pad = (n: number) => String(n).padStart(2, '0');\n  return `${limit.getFullYear()}-${pad(limit.getMonth() + 1)}-${pad(limit.getDate())}T${pad(limit.getHours())}:${pad(limit.getMinutes())}`;\n}\n\n/** \"Valid until 30 Aug 2026, 14:05\" / \"Does not expire\" from the server's `expires_at`. */\nexport function validUntilLine(\n  expiresAt: string | null | undefined,\n  locale: string,\n  /** The explorer whose clock applies (lib/timezone EXPLORER_CLOCK). */\n  clock?: symbol,\n): string {\n  if (!expiresAt) return say(locale, 'share.ttl.never');\n  const d = new Date(expiresAt);\n  // zaman:z1 — the viewer's chosen clock, not the browser's. \"Valid until\n  // 14:05\" is a deadline, and a deadline printed in somebody else's zone is\n  // the worst kind of wrong: it looks actionable. Both halves of that — the\n  // zone AND the locale tag — come from `formatInstant`, which is the one\n  // place either is decided. This file used to pass the zone correctly and\n  // then map the tag itself, to 'en-GB', while useLocale mapped it to\n  // 'en-US': the same deadline was spelled \"20 Sept 2026, 13:53\" in the share\n  // dialog and \"Sep 20, 2026, 1:53 PM\" in the listing behind it.\n  //\n  // ⚠ And the FORMAT is the explorer's (`formatWhen`), not a `dateStyle:\n  // 'medium'` pair of its own: that printed \"21 Eyl 2026 15:02\" beside the\n  // listing's \"21 Eyl 2026, 14:50\" (QA, 2026-09-21).\n  const when = Number.isNaN(d.getTime()) ? expiresAt : formatWhen(d, locale, { time: true }, clock);\n  return say(locale, 'share.ttl.until', { when });\n}\n\n/** The hint under an expiry control: what the server will allow at most. */\nexport function ttlCeilingHint(maxDays: number | undefined, locale: string): string {\n  const max = maxDays && maxDays > 0 ? Math.floor(maxDays) : 0;\n  if (!max) return '';\n  return say(locale, 'share.ttl.ceiling', { days: max });\n}\n\n/**\n * The share dialog's muted detail line: its facts joined with \" · \".\n *\n * ⚠ The first fact is a whole sentence (\"This link is valid until …, 10:00\n * AM.\") and the ones after it are fragments (\"3 downloads\"), so a plain join\n * printed \"10:00 AM. · 3 downloads\" — a full stop in the middle of a line. A\n * fact that is followed by another loses its closing full stop; the last one\n * keeps whatever it has.\n */\nexport function shareDetailLine(facts: Array<string | null | undefined>): string {\n  const kept = facts.filter((f): f is string => !!f);\n  return kept.map((f, i) => (i < kept.length - 1 ? f.replace(/\\.\\s*$/, '') : f)).join(' · ');\n}\n","<script setup lang=\"ts\">\n/**\n * Access modal — \"Share / Permissions\", the popup behind the explorer's\n * `access` action.\n *\n * gorunum:v2-share — the LOOK changed, the capabilities did not.\n *\n * It used to open as three peer tabs (People · Link · Request files), each a\n * grid of controls competing for the first glance. Nine times in ten the\n * person who opened it wants one thing: turn the link on and copy it. So the\n * dialog now leads with exactly that — one switch, one plain sentence saying\n * who can open the item right now, and the link with its Copy button — and\n * everything else sits underneath in a **named** second tier:\n *\n *   · \"Bağlantı seçenekleri\" — PIN, expiry, download cap, the one-line curl,\n *     e-mail delivery, the OS share sheet, and every existing download link.\n *   · \"Erişimi olanlar\"      — the per-user/per-group grants (owner only).\n *   · \"Dosya İste\"           — the inbound drop link (folders only).\n *\n * ⚠ Second tier, not \"Advanced\": each section says what is in it and carries a\n * one-glance summary of its own state (\"PIN · 7 gün · 3 indirme\"), because a\n * control nobody can find is a control that does not exist. `initialTab` still\n * decides which section opens with the dialog, so \"Request files\" still lands\n * on the drop link.\n *\n * ⚠ No `<style>` block: the CSS lives in `styles/base.css`\n * (`gorunum:v2-share`). A scoped style block here is silently dropped in the\n * web-component build — see web/tests/api/scopedStyles.test.ts.\n */\nimport { ref, onMounted, onBeforeUnmount, computed, inject, watch } from 'vue';\nimport type { FileApi, Grant, GroupSuggestion, UserSuggestion } from '../composables/useFileApi';\nimport type { ShareDownloadCommand, ShareInfo } from '../types/FileNode';\nimport {\n  STOCK_EXPIRY_DAYS,\n  clampExpiryOptions,\n  defaultExpiryDays,\n  shareDetailLine,\n  ttlCeilingHint,\n  validUntilLine,\n} from '../lib/shareTtl';\nimport { EXPLORER_CLOCK } from '../lib/timezone';\nimport { resolveLocale } from '../locales/resolve';\nimport { localeTag, useLocale } from '../composables/useLocale';\nimport { personInitial, personName } from '../lib/personName';\nimport { splitList } from '../lib/listInput';\nimport { serverWords } from '../lib/errorWords';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport { fileIconTile } from '../lib/fileIcons';\nimport { gateOnService } from '../lib/serviceGate';\nimport { ALL_SHARING, type SharingHeld } from '../lib/sharingHeld';\nimport ChoiceSelect, { type SelectOption } from '../components/ChoiceSelect.vue';\nimport { availableLocales } from '../lib/uiLocales';\nimport ChoiceButtons, { type ChoiceOption } from '../components/ChoiceButtons.vue';\n\nconst props = defineProps<{\n  api: FileApi;\n  path: string; // adapter://rel of the target item\n  isDir?: boolean; // folder → the \"Request files\" section and the curl's zip; the server decides a grant's kind\n  locale?: string;\n  /** THIS person's ceiling on a new link's life in days\n   *  (capabilities.share_link_max_days: the install's ceiling or their\n   *  permission rules, whichever is shorter). undefined/0 = no ceiling. The\n   *  expiry choices are derived from it. */\n  shareMaxTtlDays?: number;\n  /**\n   * surucu:d1 — which part of the dialog the caller wants opened. Absent =\n   * 'perms', the behaviour every existing caller has.\n   *\n   * The drive shell's \"Request files\" needs 'drop': the file-drop link lives\n   * in this dialog, and a menu entry that opened it anywhere else would be a\n   * menu entry that lied about what it does.\n   *\n   * ⚠ A hint, not a lock: `load()` still falls back to the link tier when the\n   * caller turns out not to be an owner, because the grants section is not\n   * theirs to see.\n   */\n  initialTab?: 'perms' | 'share' | 'drop';\n  /**\n   * Can outgoing mail be sent right now (`capabilities.mail.ready`)? `false`\n   * only when the server SAID so — absent (an older server) keeps the \"Send\n   * by email\" rows exactly as they were.\n   */\n  mailReady?: boolean;\n  /** Could this person set mail up (`capabilities.caller_admin`)? */\n  canConfigure?: boolean;\n  /**\n   * The caller's level on this item, when the host already knows it (the\n   * listing row's `perm`). Anything below `owner` cannot read the grant list,\n   * so the dialog does not ask: it used to send the request anyway, swallow\n   * the 403 and quietly draw no people section — a question the host had\n   * already answered, asked again on every open. Absent = ask.\n   */\n  perm?: string;\n  /**\n   * Which kinds of sharing the account may use on this item\n   * (lib/sharingHeld): a public link (`share.links`), a file request\n   * (`share.upload_links`) and access for people (`share.users`). A section\n   * the account may not use is not drawn — the link switch and its options,\n   * the \"Request files\" section, the people section — so no button here makes\n   * something the server refuses. Absent = all three: the server decides.\n   */\n  sharing?: SharingHeld;\n}>();\nconst emit = defineEmits<{ (e: 'close'): void }>();\n\nconst mayShare = computed<SharingHeld>(() => props.sharing ?? ALL_SHARING);\n\n/**\n * \"Send by email\", when mail cannot be sent — the owner's rule for a missing\n * service (2026-09-21, lib/serviceGate): an administrator sees the row greyed\n * with where to set mail up; everybody else is not offered it. It used to be\n * offered to everyone and answer only after the click.\n */\nconst mailMissing = computed(() => props.mailReady === false);\nconst mailRowShown = computed(() => !mailMissing.value || props.canConfigure === true);\n\nconst localeCode = computed(() => resolveLocale(props.locale));\nconst { t } = useLocale(() => localeCode.value);\n\n// Split adapter://rel for a friendlier path chip.\nconst pathParts = computed(() => {\n  const m = /^([^:]+):\\/\\/(.*)$/.exec(props.path);\n  const adapter = m ? m[1] : '';\n  const rel = m ? m[2] : props.path;\n  const segs = rel.split('/').filter(Boolean);\n  return { adapter, name: segs.length ? segs[segs.length - 1] : adapter, rel };\n});\n// The type tile beside the title — the same badge the listing draws, so the\n// dialog is visibly about the row the user right-clicked.\nconst titleTile = computed(() => {\n  const name = pathParts.value.name;\n  const dot = name.lastIndexOf('.');\n  return fileIconTile({\n    type: props.isDir ? 'dir' : 'file',\n    extension: !props.isDir && dot > 0 ? name.slice(dot + 1) : '',\n  });\n});\n\ntype Section = 'link' | 'people' | 'drop';\nconst open = ref<Record<Section, boolean>>({ link: false, people: false, drop: false });\nfunction toggleSection(s: Section) {\n  open.value = { ...open.value, [s]: !open.value[s] };\n}\nconst canManage = ref(false); // owner/admin → can see the grants section\n\n// ── permissions state ──\nconst loading = ref(true);\nconst err = ref('');\nconst direct = ref<Grant[]>([]);\nconst inherited = ref<Grant[]>([]);\nconst storageRbac = ref(true);\nconst email = ref('');\nconst level = ref<'viewer' | 'editor' | 'owner'>('viewer');\nconst busy = ref(false);\nconst notice = ref('');\nconst noAccount = ref(false);\n/* #191 (the maintainers' rule, 2026-10-08): the language a mail to somebody\n * with NO account here is written in - and the language an account opened by\n * an invitation starts in - is the one picked here, else the server's own\n * (FILEX_DEFAULT_LOCALE). The sender's screen language is not a choice for the\n * recipient, so nothing is sent unless somebody picked. An address that IS an\n * account always reads its owner's language, whatever this says. */\nconst recipientLang = ref('');\nconst recipientLangChoices = computed<SelectOption[]>(() => [\n  { value: '', label: t('access.ui.recipient_lang_server') },\n  ...availableLocales().map((o) => ({ value: o.code, label: o.label || o.code })),\n]);\nfunction pickRecipientLang(v: unknown) {\n  recipientLang.value = typeof v === 'string' ? v : '';\n}\nconst createRole = ref<'user' | 'viewer'>('user');\nconst inviteResult = ref<{ tempPassword?: string } | null>(null);\nconst suggestions = ref<UserSuggestion[]>([]);\n// Groups (backend internal/group) matching what was typed: sharing with a\n// group shares with every member. Offered beside people in the same list.\nconst groupSuggestions = ref<GroupSuggestion[]>([]);\nconst showSuggest = ref(false);\nlet searchTimer: ReturnType<typeof setTimeout> | undefined;\n\n// ⚠ computed, not a plain array: labels built once at setup kept the language\n// the dialog was opened in.\nconst levels = computed<Array<{ v: 'viewer' | 'editor' | 'owner'; l: string; d: string }>>(() => [\n  { v: 'viewer', l: t('access.ui.level_viewer'), d: t('access.ui.level_viewer_desc') },\n  { v: 'editor', l: t('access.ui.level_editor'), d: t('access.ui.level_editor_desc') },\n  { v: 'owner', l: t('access.ui.level_owner'), d: t('access.ui.level_owner_desc') },\n]);\nfunction levelLabel(v: string): string {\n  return levels.value.find((o) => o.v === v)?.l ?? v;\n}\n/* The access level: three answers side by side, each saying what it means\n   when the pointer rests on it or the keyboard reaches it (the owner,\n   2026-10-06: \"yan yana düğmeler, üzerine gelince açıklaması yazar\"); on a\n   touch screen the chosen one's meaning is a line under the strip\n   (ChoiceButtons `segmented`, #160). */\nconst levelChoices = computed<ChoiceOption[]>(() => levels.value.map((o) => ({ value: o.v, label: o.l, help: o.d })));\n/* \"Create the account as…\": two answers beside one button, so a strip. */\nconst createRoleChoices = computed<ChoiceOption[]>(() => [\n  { value: 'user', label: t('access.ui.user') },\n  { value: 'viewer', label: t('access.ui.viewer') },\n]);\n\n/**\n * Per-item access with RBAC OFF on the storage.\n *\n * ⚠ The add-people form used to work there while a box above it said grants\n * do not apply (QA, 2026-09-21): a form that succeeds at something that has no\n * effect. It is the same case as a missing service (lib/serviceGate): an\n * administrator — who can switch RBAC on — sees the section with the form\n * greyed and where to switch it on; anybody else is not offered the section.\n * Grants that already exist stay listed, so they can still be removed.\n */\nconst rbacGate = computed(() =>\n  storageRbac.value ? {} : gateOnService(false, props.canConfigure === true, t('access.ui.rbac_off_here')),\n);\nconst peopleShown = computed(() => mayShare.value.users && canManage.value && rbacGate.value.hidden !== true);\nconst addBlocked = computed(() => rbacGate.value.disabled === true);\n\n// ── share state ──\nconst shares = ref<ShareInfo[]>([]);\nconst shareBusy = ref(false);\nconst sharePwd = ref(false);\nconst shareExpiry = ref(defaultExpiryDays(props.shareMaxTtlDays)); // days; 0 = never\n/** A link this dialog just made. `token` names it to the server (share mail,\n *  share sheet); nothing else about it is sent back. `command` is the server's\n *  one-line download commands (share_command.go). */\ntype MadeLink = {\n  token: string;\n  url: string;\n  pin?: string | null;\n  expiresAt?: string | null;\n  clamped?: boolean;\n  command?: ShareDownloadCommand | null;\n};\nconst shareResult = ref<MadeLink | null>(null);\nconst shareErr = ref('');\nconst copied = ref('');\n// prefilled recipient when the owner chose \"share link\" for a no-account email\nconst shareMailTo = ref('');\nconst shareMailBusy = ref(false);\nconst shareMailNotice = ref('');\n\n/**\n * ⚠ `listShares` returns BOTH kinds of link — a download link (`/s/…`) and a\n * file-drop link (`/d/…`) are the same row with a different `kind`. They used\n * to be listed together under \"Existing links\", which meant an upload link\n * appeared in the download tab and the \"link sharing\" state could not be read\n * off the list at all. Split at the source: each section owns its own kind.\n *\n * `kind` is absent from the `ShareInfo` type but present on the wire (see\n * backend/internal/api/handlers/share.go), so it is read through a narrow cast\n * rather than by widening a shared type this dialog does not own.\n */\nfunction shareKind(s: ShareInfo): string {\n  return (s as ShareInfo & { kind?: string }).kind ?? 'download';\n}\nconst downloadShares = computed(() => shares.value.filter((s) => shareKind(s) !== 'drop'));\nconst dropShares = computed(() => shares.value.filter((s) => shareKind(s) === 'drop'));\n\n// ⚠ Derived from the server's ceiling, never a fixed list: offering \"30 days\"\n// on a server that keeps links for 7 would show a choice that is not one.\n// The same helper drives every surface (see lib/shareTtl.ts).\nfunction expiryLabel(days: number): string {\n  return days === 0 ? t('access.ui.never') : t('access.ui.days', { days });\n}\nconst expiryOptions = computed(() => clampExpiryOptions(STOCK_EXPIRY_DAYS, props.shareMaxTtlDays, expiryLabel));\nconst expiryChoices = computed<SelectOption[]>(() => expiryOptions.value.map((o) => ({ value: o.v, label: o.l })));\nconst ttlHint = computed(() => ttlCeilingHint(props.shareMaxTtlDays, localeCode.value));\nwatch(\n  () => props.shareMaxTtlDays,\n  () => {\n    // The ceiling can arrive after mount (capabilities load async): snap a\n    // selection the server would not honour back to what it will.\n    const allowed = expiryOptions.value.map((o) => o.v);\n    if (!allowed.includes(shareExpiry.value)) shareExpiry.value = defaultExpiryDays(props.shareMaxTtlDays);\n    if (!allowed.includes(dropExpiry.value)) dropExpiry.value = defaultExpiryDays(props.shareMaxTtlDays);\n  },\n);\n\n// ⚠ The download cap lived in the old standalone ShareModal and was left\n// behind when this panel took over link creation — the server has honoured\n// `max_downloads` the whole time, there was simply no way to set it. A select\n// rather than a number box: \"let this be opened three times\" is the whole use\n// case, and typing a number to say it is friction.\nconst shareMaxDl = ref(0); // 0 = unlimited\nconst maxDlOptions = computed(() => [\n  { v: 0, l: t('access.ui.unlimited') },\n  ...[1, 3, 5, 10, 25].map((count) => ({ v: count, l: t('access.ui.downloads', { count }) })),\n]);\nconst maxDlChoices = computed<SelectOption[]>(() => maxDlOptions.value.map((o) => ({ value: o.v, label: o.l })));\n\n// ⚠ The one-line download command. A share link is regularly made FOR a\n// server (\"pull this onto the box\"), and that reader has no browser. The\n// SERVER writes it (`download_command`, handlers/share_command.go): it knows\n// a folder's archive is behind `?zip=wait`, that the PIN rides as `?pin=` and\n// that an S3-backed install answers with a redirect - this dialog used to\n// know all three itself (lib/shareCli), and an agent making the same link\n// over MCP got no command at all.\nconst shareCli = computed(() => shareResult.value?.command?.curl ?? '');\nconst sharePs = computed(() => shareResult.value?.command?.powershell ?? '');\n\n// ── file-drop (public upload link) state ──\nconst dropPwd = ref(false);\nconst dropExpiry = ref(defaultExpiryDays(props.shareMaxTtlDays)); // days; 0 = never\nconst dropShowAdv = ref(false);\nconst dropMaxFiles = ref<string>('');\nconst dropMaxSizeMB = ref<string>('');\nconst dropAllowedExt = ref<string>('');\nconst dropAskName = ref(true);\nconst dropBusy = ref(false);\nconst dropErr = ref('');\nconst dropResult = ref<MadeLink | null>(null);\nconst dropMailTo = ref('');\nconst dropMailBusy = ref(false);\nconst dropMailNotice = ref('');\n\n// splitEmails turns a free-text recipient field into a deduped address list —\n// comma / semicolon / whitespace separated, so one input handles many people.\n// ⚠ lib/listInput: an Arabic keyboard's \"،\" and \"؛\" separate addresses too.\nfunction splitEmails(raw: string): string[] {\n  const seen = new Set<string>();\n  const out: string[] = [];\n  for (const part of splitList(raw, { spaces: true, semicolons: true })) {\n    const e = part.trim().toLowerCase();\n    if (e && e.includes('@') && !seen.has(e)) {\n      seen.add(e);\n      out.push(e);\n    }\n  }\n  return out;\n}\n\nasync function reload() {\n  loading.value = true;\n  err.value = '';\n  // Not an owner, or not allowed to give people access here: the grant list\n  // is not this person's to read, so it is not asked for.\n  if ((props.perm && props.perm !== 'owner') || !mayShare.value.users) {\n    canManage.value = false;\n    open.value = { ...open.value, people: false };\n    loading.value = false;\n    return;\n  }\n  try {\n    const r = await props.api.listPermissions(props.path);\n    direct.value = r.direct ?? [];\n    inherited.value = r.inherited ?? [];\n    storageRbac.value = r.storage_rbac;\n    canManage.value = true;\n  } catch (e) {\n    // 403 = caller is editor (not owner): no grants section, link only.\n    const st = (e as { status?: number }).status;\n    if (st === 403) {\n      canManage.value = false;\n      // Editor (not owner): the grants section is not theirs — close it and\n      // leave the link tier, which is the whole dialog for them.\n      // ⚠ Unless the caller asked for the drop link, which an editor may\n      // perfectly well mint.\n      open.value = { ...open.value, people: false };\n    } else {\n      err.value = e instanceof Error ? e.message : String(e);\n    }\n  } finally {\n    loading.value = false;\n  }\n}\nasync function reloadShares() {\n  try {\n    const r = await props.api.listShares(props.path);\n    shares.value = r.shares ?? [];\n  } catch {\n    shares.value = [];\n  }\n}\nfunction onKey(e: KeyboardEvent) {\n  if (e.key === 'Escape') emit('close');\n}\nonMounted(async () => {\n  // surucu:d1 — the caller's entry point decides which section opens with the\n  // dialog.\n  //\n  // ⚠ The DEFAULT (no `initialTab`, i.e. the plain \"Share / Permissions\"\n  // action) now opens NOTHING. It used to land on the permissions tab, which\n  // meant the common case — turn the link on, copy it — arrived buried under a\n  // grant editor. The link tier is the answer to the default question; the\n  // grants are one click away with their own state (\"2 people\") readable from\n  // the closed heading. A caller that explicitly wants the grants still says\n  // so, and \"Request files\" still lands on the drop link.\n  if (props.initialTab === 'drop') open.value = { ...open.value, drop: true };\n  else if (props.initialTab === 'perms') open.value = { ...open.value, people: true };\n  document.addEventListener('keydown', onKey);\n  await reload();\n  await reloadShares();\n});\nonBeforeUnmount(() => {\n  if (searchTimer) clearTimeout(searchTimer);\n  document.removeEventListener('keydown', onKey);\n});\n\nfunction onEmailInput() {\n  noAccount.value = false;\n  inviteResult.value = null;\n  notice.value = '';\n  const q = email.value.trim();\n  if (searchTimer) clearTimeout(searchTimer);\n  if (q.length < 1) {\n    suggestions.value = [];\n    groupSuggestions.value = [];\n    showSuggest.value = false;\n    return;\n  }\n  searchTimer = setTimeout(async () => {\n    try {\n      // A host API without groups (an older embed) simply offers none.\n      const [r, gr] = await Promise.all([\n        props.api.searchUsers(q),\n        props.api.searchGroups ? props.api.searchGroups(q) : Promise.resolve({ groups: [] }),\n      ]);\n      suggestions.value = r.users ?? [];\n      groupSuggestions.value = gr.groups ?? [];\n      showSuggest.value = suggestions.value.length > 0 || groupSuggestions.value.length > 0;\n    } catch {\n      showSuggest.value = false;\n    }\n  }, 180);\n}\n/** Shares with a whole group. A viewer account in it still reaches the item\n *  as a viewer — the server caps each member — so any level is offered. */\nasync function pickGroup(g: GroupSuggestion) {\n  if (addBlocked.value) return;\n  showSuggest.value = false;\n  // Owner lets every member manage this item's sharing - say so first, in\n  // the dialog (groupOwnerAsk): the browser's confirm() never shows in an\n  // embed's sandboxed iframe, where it answers \"no\" at once.\n  if (level.value === 'owner') {\n    groupOwnerAsk.value = { kind: 'add', group: g };\n    return;\n  }\n  await grantGroup(g, level.value);\n}\nasync function grantGroup(g: GroupSuggestion, lvl: string) {\n  busy.value = true;\n  notice.value = '';\n  try {\n    await props.api.addPermission({ path: props.path, group_id: g.id, level: lvl });\n    email.value = '';\n    suggestions.value = [];\n    groupSuggestions.value = [];\n    await reload();\n    notice.value = t('access.ui.access_granted');\n  } catch (e) {\n    notice.value = e instanceof Error ? e.message : String(e);\n  } finally {\n    busy.value = false;\n  }\n}\nasync function pickUser(u: UserSuggestion) {\n  if (addBlocked.value) return;\n  showSuggest.value = false;\n  email.value = u.email;\n  let lvl = level.value;\n  if (u.role === 'viewer' && lvl !== 'viewer') lvl = 'viewer';\n  busy.value = true;\n  notice.value = '';\n  try {\n    await props.api.addPermission({ path: props.path, user_id: u.id, level: lvl });\n    email.value = '';\n    suggestions.value = [];\n    await reload();\n    notice.value = t('access.ui.access_granted');\n  } catch (e) {\n    notice.value = e instanceof Error ? e.message : String(e);\n  } finally {\n    busy.value = false;\n  }\n}\nasync function submitEmail() {\n  if (addBlocked.value) return;\n  const addr = email.value.trim().toLowerCase();\n  if (!addr || !addr.includes('@')) {\n    notice.value = t('access.ui.enter_a_valid_email');\n    return;\n  }\n  showSuggest.value = false;\n  busy.value = true;\n  notice.value = '';\n  inviteResult.value = null;\n  try {\n    const res = await props.api.resolveEmail(addr);\n    if (res.found && res.user) {\n      let lvl = level.value;\n      if (res.user.role === 'viewer' && lvl !== 'viewer') lvl = 'viewer';\n      await props.api.addPermission({ path: props.path, user_id: res.user.id, level: lvl });\n      email.value = '';\n      await reload();\n      notice.value = t('access.ui.access_granted');\n    } else {\n      noAccount.value = true;\n    }\n  } catch (e) {\n    notice.value = e instanceof Error ? e.message : String(e);\n  } finally {\n    busy.value = false;\n  }\n}\nasync function inviteCreateUser() {\n  busy.value = true;\n  notice.value = '';\n  try {\n    const r = await props.api.invitePermission({\n      path: props.path, email: email.value.trim().toLowerCase(),\n      level: level.value, create_user: true, role: createRole.value,\n      ...(recipientLang.value ? { locale: recipientLang.value } : {}),\n    });\n    inviteResult.value = { tempPassword: r.temp_password };\n    notice.value = r.emailed\n      ? t('access.ui.user_created_invite_emailed')\n      : t('access.ui.user_created_share_the_temp_password');\n    noAccount.value = false; email.value = '';\n    await reload();\n  } catch (e) {\n    notice.value = e instanceof Error ? e.message : String(e);\n  } finally {\n    busy.value = false;\n  }\n}\n// \"Just send a share link\" → open the link options with the address prefilled\n// so the owner creates a link (with their chosen expiry/PIN) and mails it\n// from there.\nfunction gotoShareWithMail() {\n  shareMailTo.value = email.value.trim().toLowerCase();\n  noAccount.value = false;\n  notice.value = '';\n  open.value = { ...open.value, link: true };\n}\n// A group's grant has its own id space on the server, so it is changed and\n// removed through its own calls.\nfunction isGroup(g: Grant): boolean {\n  return g.kind === 'group';\n}\n/** The question before a group is given Owner - asked in the dialog, never\n *  with the browser's confirm(). \"add\" is a new grant, \"change\" raises one. */\nconst groupOwnerAsk = ref<{ kind: 'add'; group: GroupSuggestion } | { kind: 'change'; grant: Grant } | null>(null);\nconst groupOwnerAskName = computed(() => {\n  const a = groupOwnerAsk.value;\n  if (!a) return '';\n  return a.kind === 'add' ? a.group.name : (a.grant.group_name ?? '');\n});\nasync function answerGroupOwner(yes: boolean) {\n  const a = groupOwnerAsk.value;\n  groupOwnerAsk.value = null;\n  if (!a) return;\n  if (a.kind === 'add') {\n    if (yes) await grantGroup(a.group, 'owner');\n    return;\n  }\n  if (yes) await setLevel(a.grant, 'owner');\n  else await reload(); // put the select back\n}\nasync function changeLevel(g: Grant, newLevel: string) {\n  if (newLevel === g.level) return;\n  if (isGroup(g) && newLevel === 'owner') {\n    groupOwnerAsk.value = { kind: 'change', grant: g };\n    return;\n  }\n  await setLevel(g, newLevel);\n}\nasync function setLevel(g: Grant, newLevel: string) {\n  busy.value = true;\n  try {\n    if (isGroup(g)) await props.api.updateGroupPermission(g.id, newLevel);\n    else await props.api.updatePermission(g.id, newLevel);\n    await reload();\n  }\n  catch (e) { notice.value = e instanceof Error ? e.message : String(e); }\n  finally { busy.value = false; }\n}\nasync function removeGrant(g: Grant) {\n  busy.value = true;\n  try {\n    if (isGroup(g)) await props.api.deleteGroupPermission(g.id);\n    else await props.api.deletePermission(g.id);\n    await reload();\n  }\n  catch (e) { notice.value = e instanceof Error ? e.message : String(e); }\n  finally { busy.value = false; }\n}\n/* One rule for naming a person (lib/personName): the server's name, the\n   display name, the username, the address. A group goes by its name. */\nfunction glabel(g: Grant): string {\n  if (isGroup(g)) return g.group_name || `#${g.group_id}`;\n  return personName({ name: g.user_name, display_name: g.user_display_name, email: g.user_email }) || `#${g.user_id}`;\n}\nfunction ginitial(g: Grant): string {\n  if (isGroup(g)) return personInitial({ name: g.group_name }, localeTag(localeCode.value)) || '#';\n  return personInitial({ name: g.user_name, display_name: g.user_display_name, email: g.user_email }, localeTag(localeCode.value)) || '?';\n}\nfunction gtitle(g: Grant): string | undefined {\n  return isGroup(g) ? t('access.ui.group_title', { name: g.group_name ?? '' }) : g.user_email;\n}\nfunction gkey(prefix: string, g: Grant): string {\n  return prefix + (isGroup(g) ? 'g' : 'u') + g.id;\n}\n\n// ── share actions ──\n/**\n * The link's life as a LENGTH (`expires_in`, seconds), never as a moment.\n *\n * ⚠ It used to send `expires_at`, worked out on this device's clock: a clock\n * a few hours off made a \"7 days\" link that lived 6 days and 20 hours (or got\n * cut by the server's ceiling and reported as clamped). The server counts the\n * days from its own now. null = \"never\" (the server then applies its\n * ceiling, as it always did).\n */\nfunction expiresInSeconds(days: number): number | null {\n  return days > 0 ? days * 86400 : null;\n}\n/**\n * Make THE link with the options as they stand.\n *\n * ⚠⚠ ONE download link per item, whichever control made it. The switch at the\n * top mints one; this button used to mint ANOTHER beside it, so a person who\n * turned the link on and then picked a PIN walked away with two live links —\n * the old one without the PIN (QA, 2026-09-21). When a link is on, the button\n * REPLACES it (its label and the note under it say so): the old address stops\n * working and the new one carries the new options.\n */\nasync function createLink() {\n  if (!mayShare.value.links) return;\n  shareBusy.value = true;\n  shareErr.value = '';\n  shareMailNotice.value = '';\n  try {\n    for (const s of downloadShares.value) await props.api.revokeShare(s.uuid);\n    shareResult.value = null;\n    const r = await props.api.createShare({\n      path: props.path,\n      password: sharePwd.value,\n      expires_in: expiresInSeconds(shareExpiry.value),\n      // null, not 0 — the server reads 0 as \"no cap given\" either way, but a\n      // null says it explicitly and keeps the payload honest.\n      max_downloads: shareMaxDl.value || null,\n    });\n    shareResult.value = {\n      // The create answer's `uuid` IS the token (share.go shareCreateRespInner).\n      token: r.share.token ?? r.share.uuid,\n      url: r.share.url,\n      pin: r.share.password_pin ?? null,\n      expiresAt: r.share.expires_at ?? null,\n      clamped: !!r.share.expiry_clamped,\n      command: r.share.download_command ?? null,\n    };\n    await reloadShares();\n  } catch (e) {\n    shareErr.value = e instanceof Error ? e.message : String(e);\n  } finally {\n    shareBusy.value = false;\n  }\n}\n\n/**\n * gorunum:v2-share — the switch.\n *\n * ON with nothing minted mints one with whatever the options tier currently\n * says (that is the default: the server's ceiling as the expiry, no PIN, no\n * cap). OFF revokes every DOWNLOAD link on this item, because that is what\n * \"link sharing is off\" has to mean — a switch that left a live link behind\n * would be the most dangerous control in the dialog.\n *\n * ⚠ Drop links are deliberately untouched: they are an inbound door managed by\n * its own section, and revoking someone's upload invitation because the owner\n * turned off downloads is not what either control says.\n */\nasync function toggleLink() {\n  if (shareBusy.value || !mayShare.value.links) return;\n  if (linkOn.value) {\n    shareBusy.value = true;\n    shareErr.value = '';\n    try {\n      for (const s of downloadShares.value) await props.api.revokeShare(s.uuid);\n      shareResult.value = null;\n      await reloadShares();\n    } catch (e) {\n      shareErr.value = e instanceof Error ? e.message : String(e);\n    } finally {\n      shareBusy.value = false;\n    }\n    return;\n  }\n  await createLink();\n}\n\n/**\n * \"Send by e-mail\" for a link this dialog made.\n *\n * ⚠⚠ The request names the LINK (its token), the addresses and the language\n * — nothing else. The server writes the mail from the link itself: its\n * address, its expiry, the item's name, kind and size, a file request's\n * limits; it never mails a PIN (the mail says one guards the link and the\n * sender gives it another way). This dialog used to send the address, the\n * PIN, the expiry, the kind and the size, and the server mailed them as given\n * (C2, 0.54). What comes back is said by the server too (`message`, in the\n * composer's language), the refusals included.\n *\n * ⚠ One mail per press. The Send button shuts while the mail goes out, but\n * the address box sends on Enter too, and Enter did not ask: a second Enter\n * while the first mail was on its way sent it again, to the same people.\n */\nasync function sendLinkMail(link: MadeLink | null, to: string, busy: { value: boolean }, notice: { value: string }) {\n  if (busy.value) return;\n  const list = splitEmails(to);\n  if (!list.length) {\n    notice.value = t('access.ui.enter_a_valid_email');\n    return;\n  }\n  if (!link?.token) return;\n  busy.value = true;\n  notice.value = '';\n  try {\n    const res = await props.api.shareMail({\n      share: link.token,\n      emails: list,\n      ...(recipientLang.value ? { locale: recipientLang.value } : {}),\n    });\n    notice.value = res?.message ?? '';\n  } catch (e) {\n    notice.value = serverWords(e, localeCode.value);\n  } finally {\n    busy.value = false;\n  }\n}\nfunction sendShareMail() {\n  return sendLinkMail(shareResult.value, shareMailTo.value, shareMailBusy, shareMailNotice);\n}\n\n// ── file-drop (upload link) actions ──\nasync function createDropLink() {\n  if (!mayShare.value.uploadLinks) return;\n  dropBusy.value = true;\n  dropErr.value = '';\n  dropResult.value = null;\n  dropMailNotice.value = '';\n  try {\n    const drop_settings: Record<string, unknown> = { ask_name: dropAskName.value };\n    if (dropMaxFiles.value) drop_settings.max_files = Number(dropMaxFiles.value);\n    if (dropMaxSizeMB.value) drop_settings.max_file_size_mb = Number(dropMaxSizeMB.value);\n    const exts = splitList(dropAllowedExt.value, { spaces: true }).map((s) => s.replace(/^\\./, '')).filter(Boolean);\n    if (exts.length) drop_settings.allowed_ext = exts;\n    const r = await props.api.createShare({\n      path: props.path,\n      kind: 'drop',\n      password: dropPwd.value,\n      expires_in: expiresInSeconds(dropExpiry.value),\n      drop_settings,\n    });\n    dropResult.value = {\n      token: r.share.token ?? r.share.uuid,\n      url: r.share.url,\n      pin: r.share.password_pin ?? null,\n      expiresAt: r.share.expires_at ?? null,\n      clamped: !!r.share.expiry_clamped,\n    };\n    await reloadShares();\n  } catch (e) {\n    dropErr.value = e instanceof Error ? e.message : String(e);\n  } finally {\n    dropBusy.value = false;\n  }\n}\n// The same send for the upload link: the server knows it is one and writes\n// the upload invitation with the link's own limits.\nfunction sendDropMail() {\n  return sendLinkMail(dropResult.value, dropMailTo.value, dropMailBusy, dropMailNotice);\n}\nasync function revoke(s: ShareInfo) {\n  shareBusy.value = true;\n  try {\n    await props.api.revokeShare(s.uuid);\n    // ⚠ The lead tier reads `shareResult` first. Revoking the link that is\n    // showing up there has to clear it too, or the dialog goes on offering a\n    // Copy button — and a switch reading ON — for a link the server has just\n    // thrown away.\n    if (shareResult.value && shareResult.value.url === s.url) shareResult.value = null;\n    await reloadShares();\n  } catch (e) { shareErr.value = e instanceof Error ? e.message : String(e); }\n  finally { shareBusy.value = false; }\n}\nfunction copy(text: string, tag = 'url') {\n  navigator.clipboard?.writeText(text);\n  copied.value = tag;\n  setTimeout(() => { if (copied.value === tag) copied.value = ''; }, 1400);\n}\n\n// ── native share (Web Share API) ──\n// Same OS share sheet the fishapp uses (Windows share / Android share). Only\n// shown when the browser supports it (secure context + navigator.share, e.g.\n// Chrome/Edge on Windows, Android).\nconst canShare = computed(() => typeof navigator !== 'undefined' && typeof navigator.share === 'function');\n\n/**\n * What the share sheet is handed: the share mail's own subject and body,\n * written by the SERVER for this link (GET …/permissions/share-message), so a\n * WhatsApp forward reads exactly like the e-mail — and, like it, carries no\n * PIN. ⚠ This dialog used to write the message itself, a copy of the\n * server's mail in its own words (C2, 0.54); the copy is gone.\n *\n * Asked for as soon as a link is made, not on the click: a browser opens the\n * sheet only inside the click's activation, which a round trip can outlast.\n * A link replaced while its words were on the way does not get the old\n * link's words. Without words the button is not drawn; Copy and e-mail stay.\n */\ntype SheetWords = { title: string; text: string };\nconst shareSheet = ref<SheetWords | null>(null);\nconst dropSheet = ref<SheetWords | null>(null);\nasync function loadSheet(token: string | undefined, current: () => string | undefined, into: { value: SheetWords | null }) {\n  into.value = null;\n  if (!token || !canShare.value) return;\n  try {\n    // The share sheet's words go to whoever it is sent to: the language\n    // picked for the recipient, else the server's.\n    const m = await props.api.shareMessage(token, recipientLang.value || undefined);\n    if (current() === token) into.value = { title: m.subject, text: m.body };\n  } catch {\n    if (current() === token) into.value = null;\n  }\n}\nwatch(\n  () => [shareResult.value?.token, recipientLang.value] as const,\n  ([token]) => void loadSheet(token, () => shareResult.value?.token, shareSheet),\n);\nwatch(\n  () => [dropResult.value?.token, recipientLang.value] as const,\n  ([token]) => void loadSheet(token, () => dropResult.value?.token, dropSheet),\n);\n\n// What the server actually stored — shown under a fresh link so the real\n// expiry is visible even when the server shortened the request.\n// The explorer this dialog belongs to reads deadlines on its own clock.\nconst clock = inject(EXPLORER_CLOCK, undefined);\n\nfunction validUntil(r: { expiresAt?: string | null } | null): string {\n  return validUntilLine(r?.expiresAt ?? null, localeCode.value, clock);\n}\n\n/* ── the top tier: one switch, one sentence, one link ──────────────────── */\n\n/** The link the header row shows: the one just minted, else the oldest live one. */\nconst primaryLink = computed(() => shareResult.value?.url ?? downloadShares.value[0]?.url ?? '');\nconst linkOn = computed(() => !!primaryLink.value);\n\n/**\n * The links the header does NOT already show. ⚠ The header's link used to be\n * listed again right under it, with a second Copy button — one link, two\n * places (QA, 2026-09-21). What is left is an older extra link, kept listed\n * so it can still be copied or revoked.\n */\nconst otherDownloadShares = computed(() => downloadShares.value.filter((s) => s.url !== primaryLink.value));\nconst otherDropShares = computed(() => dropShares.value.filter((s) => s.url !== dropResult.value?.url));\n\n/**\n * The plain sentence. It says who can open the item RIGHT NOW, which is the\n * question the dialog exists to answer.\n *\n * ⚠ The PIN claim is only made about a link this dialog minted: `listShares`\n * does not return `password_pin` (by design — the server will not re-serve a\n * PIN), so for a link that was already there we say how many exist rather than\n * guessing at its protection. A confident wrong sentence about who can read a\n * file is worse than a vaguer true one.\n */\nconst whoLine = computed(() => {\n  if (!linkOn.value) return t('access.who.private');\n  if (shareResult.value) return shareResult.value.pin ? t('access.who.pin') : t('access.who.link');\n  return t('access.who.existing', { n: downloadShares.value.length });\n});\n\n/** The muted second line under it: what the server actually stored. */\nconst linkDetail = computed(() => {\n  const bits: string[] = [];\n  if (shareResult.value) {\n    bits.push(validUntil(shareResult.value));\n    if (shareResult.value.clamped) bits.push(t('access.ui.server_limit_applied'));\n    if (shareMaxDl.value) bits.push(maxDlOptions.value.find((o) => o.v === shareMaxDl.value)?.l ?? '');\n  } else if (downloadShares.value[0]) {\n    const s = downloadShares.value[0];\n    bits.push(validUntil({ expiresAt: s.expires_at ?? null }));\n    if (s.max_downloads) bits.push(maxDlOptions.value.find((o) => o.v === s.max_downloads)?.l ?? String(s.max_downloads));\n  }\n  return shareDetailLine(bits);\n});\n\n/* Section summaries — a named section still has to say what is inside it, or\n   the reader has to open all three to find the control they came for. */\nconst linkSummary = computed(() => {\n  const bits: string[] = [];\n  bits.push(sharePwd.value ? t('access.sum.pin_on') : t('access.sum.pin_off'));\n  bits.push(expiryLabel(shareExpiry.value));\n  if (shareMaxDl.value) bits.push(maxDlOptions.value.find((o) => o.v === shareMaxDl.value)?.l ?? '');\n  return bits.filter(Boolean).join(' · ');\n});\n// People and groups counted apart: \"1 person\" over a list that holds one\n// group would say something that is not there.\nconst peopleSummary = computed(() => {\n  const all = [...direct.value, ...inherited.value];\n  const groups = all.filter(isGroup).length;\n  const people = all.length - groups;\n  if (!all.length) return t('access.sum.people_none');\n  const parts: string[] = [];\n  if (people) parts.push(t('access.sum.people', { n: people }));\n  if (groups) parts.push(t('access.sum.groups', { n: groups }));\n  return parts.join(' · ');\n});\nconst dropSummary = computed(() =>\n  dropShares.value.length ? t('access.sum.drop', { n: dropShares.value.length }) : t('access.sum.drop_none'),\n);\n\nasync function nativeShare(body: SheetWords | null) {\n  if (!canShare.value || !body) return;\n  try {\n    await navigator.share(body);\n  } catch {\n    // user cancelled (AbortError) or the target rejected — nothing to do.\n  }\n}\n</script>\n\n<template>\n  <div class=\"fx-perm-overlay fe-share__scrim\" @click.self=\"emit('close')\">\n    <!-- ⚠ `fx-perm-modal` is kept alongside the new class: e2e/shots/capture.mjs\n         and the embedders' own harnesses address the dialog by it. -->\n    <div class=\"fx-perm-modal fe-share\" role=\"dialog\" aria-modal=\"true\" :aria-label=\"t('access.title', { name: pathParts.name })\">\n      <header class=\"fe-share__head\">\n        <span class=\"fe-share__tile\" aria-hidden=\"true\" v-html=\"titleTile\"></span>\n        <div class=\"fe-share__headtext\">\n          <h3 class=\"fe-share__title\">{{ t('access.title', { name: pathParts.name }) }}</h3>\n          <span class=\"fe-share__path\" :title=\"path\"><bdi>{{ pathParts.adapter }}</bdi></span>\n        </div>\n        <button type=\"button\" class=\"fe-share__close\" :aria-label=\"t('access.close')\" :title=\"t('access.close')\" @click=\"emit('close')\">\n          <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n        </button>\n      </header>\n\n      <div class=\"fe-share__body\">\n        <!-- ───────── tier 1: the link, the whole reason people open this ───── -->\n        <div v-if=\"mayShare.links\" class=\"fe-share__lead\" data-testid=\"share-lead\">\n          <div class=\"fe-share__switchrow\">\n            <span class=\"fe-share__leadicon\" aria-hidden=\"true\" v-html=\"actionIconSvg('access')\"></span>\n            <span class=\"fe-share__leadlabel\">{{ t('access.link.switch') }}</span>\n            <button\n              type=\"button\"\n              class=\"fe-share__switch\"\n              role=\"switch\"\n              :aria-checked=\"linkOn ? 'true' : 'false'\"\n              :aria-label=\"t('access.link.switch')\"\n              data-testid=\"share-switch\"\n              :disabled=\"shareBusy\"\n              @click=\"toggleLink\"\n            ><span class=\"fe-share__knob\"></span></button>\n          </div>\n          <p class=\"fe-share__who\" data-testid=\"share-who\">{{ whoLine }}</p>\n\n          <template v-if=\"linkOn\">\n            <div class=\"fe-share__linkrow\">\n              <a :href=\"primaryLink\" target=\"_blank\" rel=\"noopener\" class=\"fe-share__url\" :title=\"primaryLink\">{{ primaryLink }}</a>\n              <button type=\"button\" class=\"fe-share__copy\" data-testid=\"share-copy\" @click=\"copy(primaryLink, 'new')\">\n                <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                <span>{{ copied === 'new' ? t('access.copied') : t('access.copy') }}</span>\n              </button>\n            </div>\n            <p v-if=\"linkDetail\" class=\"fe-share__detail\" data-testid=\"share-valid-until\">{{ linkDetail }}</p>\n            <div v-if=\"shareResult?.pin\" class=\"fe-share__pinrow\">\n              <span class=\"fe-share__pinlabel\">PIN</span>\n              <code class=\"fe-share__pin\">{{ shareResult?.pin }}</code>\n              <button type=\"button\" class=\"fe-share__copy\" @click=\"copy(shareResult?.pin ?? '', 'sharepin')\">\n                <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                <span>{{ copied === 'sharepin' ? t('access.copied') : t('access.copy') }}</span>\n              </button>\n            </div>\n          </template>\n          <div v-if=\"shareErr\" class=\"fe-share__warn\">{{ shareErr }}</div>\n        </div>\n\n        <!-- ───────── tier 2: named sections, one click each ───────────────── -->\n        <div class=\"fe-share__sections\">\n          <!-- Link options: PIN · expiry · download cap · curl · e-mail · links -->\n          <section v-if=\"mayShare.links\" class=\"fe-share__section\" data-testid=\"share-link-section\">\n            <button\n              type=\"button\"\n              class=\"fe-share__sechead\"\n              :aria-expanded=\"open.link ? 'true' : 'false'\"\n              data-testid=\"share-options-toggle\"\n              @click=\"toggleSection('link')\"\n            >\n              <svg class=\"fe-share__caret\" :class=\"{ 'is-open': open.link }\" viewBox=\"0 0 24 24\" fill=\"none\"\n                stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n                aria-hidden=\"true\" focusable=\"false\"><path d=\"M9 6l6 6-6 6\" /></svg>\n              <span class=\"fe-share__seclabel\">{{ t('access.section.link') }}</span>\n              <span class=\"fe-share__secmeta\">{{ linkSummary }}</span>\n            </button>\n            <div v-if=\"open.link\" class=\"fe-share__panel\">\n              <div class=\"fe-share__opts\">\n                <!-- ⚠ ONE on/off control in this dialog: the switch. The PIN\n                     used to be a native checkbox under a switch — two shapes\n                     for one kind of answer (QA, 2026-09-21). -->\n                <label class=\"fe-share__togglerow\">\n                  <span class=\"fe-share__togglelabel\">{{ t('access.ui.protect_with_a_pin') }}</span>\n                  <button\n                    type=\"button\"\n                    class=\"fe-share__switch\"\n                    role=\"switch\"\n                    :aria-checked=\"sharePwd ? 'true' : 'false'\"\n                    data-testid=\"share-pin-switch\"\n                    @click=\"sharePwd = !sharePwd\"\n                  ><span class=\"fe-share__knob\"></span></button>\n                </label>\n                <label class=\"fe-share__field\">\n                  <span class=\"fe-share__fieldlabel\">{{ t('access.ui.expiry') }}</span>\n                  <ChoiceSelect\n                    class=\"fe-share__pick\"\n                    size=\"lg\"\n                    :model-value=\"shareExpiry\"\n                    :options=\"expiryChoices\"\n                    testid=\"share-expiry\"\n                    @update:model-value=\"(v) => (shareExpiry = Number(v))\"\n                  />\n                </label>\n                <label class=\"fe-share__field\">\n                  <span class=\"fe-share__fieldlabel\">{{ t('access.ui.download_limit') }}</span>\n                  <ChoiceSelect\n                    class=\"fe-share__pick\"\n                    size=\"lg\"\n                    :model-value=\"shareMaxDl\"\n                    :options=\"maxDlChoices\"\n                    testid=\"share-max-downloads\"\n                    @update:model-value=\"(v) => (shareMaxDl = Number(v))\"\n                  />\n                </label>\n              </div>\n              <p v-if=\"ttlHint\" class=\"fe-share__hint\" data-testid=\"share-ttl-hint\">{{ ttlHint }}</p>\n              <button\n                type=\"button\"\n                class=\"fx-perm-create fe-share__btn fe-share__btn--primary fe-share__btn--wide\"\n                data-testid=\"share-create\"\n                :disabled=\"shareBusy\"\n                @click=\"createLink\"\n              >\n                {{ linkOn ? t('access.ui.replace_link') : t('access.ui.create_link') }}\n              </button>\n              <p v-if=\"linkOn\" class=\"fe-share__hint\" data-testid=\"share-replace-hint\">{{ t('access.ui.replace_link_hint') }}</p>\n\n              <!-- ⚠ One message with the address IN it: the sentence used to\n                   be two halves around a <strong>, which put a space before\n                   the English full stop and could not be ordered by a\n                   language that puts the address elsewhere. -->\n              <p v-if=\"!shareResult && shareMailTo\" class=\"fe-share__hint\">\n                {{ t('access.ui.create_then_send', { email: shareMailTo }) }}\n              </p>\n\n              <template v-if=\"shareResult\">\n                <!-- one-line download command, for pulling the file onto a server -->\n                <div v-if=\"shareCli || sharePs\" class=\"fx-perm-cli fe-share__cli\" data-testid=\"share-cli\">\n                  <span class=\"fe-share__fieldlabel\">{{ t('access.ui.command_line') }}</span>\n                  <div v-if=\"shareCli\" class=\"fe-share__clirow\">\n                    <code class=\"fe-share__clicmd\" :title=\"shareCli\" data-testid=\"share-cli-curl\">{{ shareCli }}</code>\n                    <button type=\"button\" class=\"fe-share__copy\" @click=\"copy(shareCli, 'sharecli')\">\n                      <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                      <span>{{ copied === 'sharecli' ? t('access.copied') : t('access.copy') }}</span>\n                    </button>\n                  </div>\n                  <div v-if=\"sharePs\" class=\"fe-share__clirow\">\n                    <code class=\"fe-share__clicmd\" :title=\"sharePs\" data-testid=\"share-cli-powershell\">{{ sharePs }}</code>\n                    <button type=\"button\" class=\"fe-share__copy\" @click=\"copy(sharePs, 'shareps')\">\n                      <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                      <span>{{ copied === 'shareps' ? t('access.copied') : t('access.copy') }}</span>\n                    </button>\n                  </div>\n                </div>\n\n                <!-- send by email (one or more, comma/space separated) -->\n                <div v-if=\"mailRowShown\" class=\"fe-share__mailrow\" data-testid=\"share-mail-row\">\n                  <input v-model=\"shareMailTo\" type=\"text\" class=\"fe-share__input\" autocomplete=\"off\"\n                    :disabled=\"mailMissing\"\n                    :placeholder=\"t('access.ui.emails_comma_separated')\" @keyup.enter=\"sendShareMail\" />\n                  <button type=\"button\" class=\"fe-share__btn\" :disabled=\"shareMailBusy || mailMissing\" @click=\"sendShareMail\">\n                    {{ t('access.ui.send') }}\n                  </button>\n                </div>\n                <div v-if=\"mailRowShown && !mailMissing\" class=\"fe-share__mailrow\" data-testid=\"share-mail-lang-row\">\n                  <span class=\"fe-share__hint\">{{ t('access.ui.recipient_lang') }}</span>\n                  <ChoiceSelect\n                    :model-value=\"recipientLang\"\n                    :options=\"recipientLangChoices\"\n                    size=\"sm\"\n                    :aria-label=\"t('access.ui.recipient_lang')\"\n                    testid=\"share-mail-lang\"\n                    @update:model-value=\"pickRecipientLang\"\n                  />\n                </div>\n                <div v-if=\"mailRowShown && mailMissing\" class=\"fe-share__notice\" data-testid=\"share-mail-unavailable\">\n                  {{ t('access.ui.mail_not_set_up') }}\n                </div>\n                <div v-if=\"shareMailNotice\" class=\"fe-share__notice\">{{ shareMailNotice }}</div>\n\n                <!-- native share (OS share sheet) — same as the fishapp Share button -->\n                <button v-if=\"canShare && shareSheet\" type=\"button\" class=\"fe-share__btn fe-share__btn--wide\" data-testid=\"share-sheet\" @click=\"nativeShare(shareSheet)\">\n                  <span aria-hidden=\"true\" v-html=\"actionIconSvg('access')\"></span>\n                  <span>{{ t('access.ui.share') }}</span>\n                </button>\n              </template>\n\n              <div v-if=\"otherDownloadShares.length\" class=\"fe-share__list\" data-testid=\"share-other-links\">\n                <h4 class=\"fe-share__listhead\">{{ t('access.ui.other_links') }}</h4>\n                <div v-for=\"s in otherDownloadShares\" :key=\"s.uuid\" class=\"fe-share__row\">\n                  <span class=\"fe-share__url\" :title=\"s.url\">{{ s.url }}</span>\n                  <button type=\"button\" class=\"fe-share__copy\" @click=\"copy(s.url, s.uuid)\">\n                    <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                    <span>{{ copied === s.uuid ? t('access.copied') : t('access.copy') }}</span>\n                  </button>\n                  <button type=\"button\" class=\"fe-share__del\" :disabled=\"shareBusy\" :title=\"t('access.ui.revoke')\"\n                    :aria-label=\"t('access.ui.revoke')\" @click=\"revoke(s)\">\n                    <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n                  </button>\n                </div>\n              </div>\n            </div>\n          </section>\n\n          <!-- People with access: the per-user / inherited grants -->\n          <section v-if=\"peopleShown\" class=\"fe-share__section\" data-testid=\"share-people\">\n            <button\n              type=\"button\"\n              class=\"fe-share__sechead\"\n              :aria-expanded=\"open.people ? 'true' : 'false'\"\n              data-testid=\"share-people-toggle\"\n              @click=\"toggleSection('people')\"\n            >\n              <svg class=\"fe-share__caret\" :class=\"{ 'is-open': open.people }\" viewBox=\"0 0 24 24\" fill=\"none\"\n                stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n                aria-hidden=\"true\" focusable=\"false\"><path d=\"M9 6l6 6-6 6\" /></svg>\n              <span class=\"fe-share__seclabel\">{{ t('access.section.people') }}</span>\n              <span class=\"fe-share__secmeta\">{{ peopleSummary }}</span>\n            </button>\n            <div v-if=\"open.people\" class=\"fe-share__panel\">\n              <div v-if=\"addBlocked\" class=\"fe-share__warn\" data-testid=\"share-rbac-off\">\n                {{ t('access.ui.rbac_off_here') }}\n              </div>\n              <div v-if=\"err\" class=\"fe-share__warn\">{{ err }}</div>\n              <p v-if=\"loading\" class=\"fe-share__hint\">{{ t('access.ui.loading') }}</p>\n              <template v-else>\n                <div class=\"fe-share__add\" data-testid=\"share-add-person\">\n                  <div class=\"fe-share__emailwrap\">\n                    <input v-model=\"email\" type=\"email\" class=\"fe-share__input\" autocomplete=\"off\"\n                      :disabled=\"addBlocked\"\n                      :placeholder=\"t('access.ui.name_or_email')\"\n                      @input=\"onEmailInput\" @keyup.enter=\"submitEmail\" @focus=\"onEmailInput\" />\n                    <ul v-if=\"showSuggest\" class=\"fe-share__suggest\">\n                      <li v-for=\"g in groupSuggestions\" :key=\"'g' + g.id\" data-testid=\"share-suggest-group\" @mousedown.prevent=\"pickGroup(g)\">\n                        <span class=\"fe-share__av fe-share__av--sm fe-share__av--group\">{{ personInitial({ name: g.name }, localeTag(localeCode)) }}</span>\n                        <span class=\"fe-share__suggesttxt\">\n                          <span class=\"fe-share__suggestname\">{{ g.name }}</span>\n                          <span class=\"fe-share__suggestmeta\">{{ t('access.ui.group') }}<template v-if=\"g.description\"> · {{ g.description }}</template></span>\n                        </span>\n                      </li>\n                      <li v-for=\"u in suggestions\" :key=\"u.id\" @mousedown.prevent=\"pickUser(u)\">\n                        <span class=\"fe-share__av fe-share__av--sm\">{{ personInitial(u, localeTag(localeCode)) }}</span>\n                        <span class=\"fe-share__suggesttxt\">\n                          <span class=\"fe-share__suggestname\">{{ personName(u) }}</span>\n                          <span class=\"fe-share__suggestmeta\"><bdi>{{ u.email }}</bdi> · {{ u.role }}</span>\n                        </span>\n                      </li>\n                    </ul>\n                  </div>\n                  <ChoiceButtons\n                    class=\"fe-share__level\"\n                    :options=\"levelChoices\"\n                    :model-value=\"level\"\n                    segmented\n                    :disabled=\"addBlocked\"\n                    testid=\"share-add-level\"\n                    testid-prefix=\"share-add-level\"\n                    @update:model-value=\"(v: string | string[]) => (level = v as 'viewer' | 'editor' | 'owner')\"\n                  />\n                  <button type=\"button\" class=\"fe-share__btn fe-share__btn--primary\" :disabled=\"busy || addBlocked\" @click=\"submitEmail\">\n                    {{ t('access.ui.add') }}\n                  </button>\n                </div>\n\n                <div v-if=\"groupOwnerAsk\" class=\"fe-share__invite\" role=\"group\" aria-live=\"polite\" data-testid=\"share-group-owner-ask\">\n                  <p class=\"fe-share__hint\">{{ t('access.ui.group_owner_confirm', { name: groupOwnerAskName }) }}</p>\n                  <div class=\"fe-share__inviterow\">\n                    <button type=\"button\" class=\"fe-share__btn\" :disabled=\"busy\" data-testid=\"share-group-owner-no\" @click=\"answerGroupOwner(false)\">\n                      {{ t('common.cancel') }}\n                    </button>\n                    <button type=\"button\" class=\"fe-share__btn fe-share__btn--primary\" :disabled=\"busy\" data-testid=\"share-group-owner-yes\" @click=\"answerGroupOwner(true)\">\n                      {{ t('access.ui.group_owner_give') }}\n                    </button>\n                  </div>\n                </div>\n                <div v-if=\"noAccount\" class=\"fe-share__invite\">\n                  <p class=\"fe-share__hint\">{{ t('access.ui.no_account_for_this_email_what_next') }}</p>\n                  <div class=\"fe-share__inviterow\">\n                    <ChoiceButtons\n                      :options=\"createRoleChoices\"\n                      :model-value=\"createRole\"\n                      segmented\n                      :aria-label=\"t('access.ui.no_account_for_this_email_what_next')\"\n                      testid=\"share-create-role\"\n                      testid-prefix=\"share-create-role\"\n                      @update:model-value=\"(v: string | string[]) => (createRole = v as 'user' | 'viewer')\"\n                    />\n                    <button type=\"button\" class=\"fe-share__btn fe-share__btn--primary\" :disabled=\"busy\" @click=\"inviteCreateUser\">\n                      {{ t('access.ui.create_user_grant') }}\n                    </button>\n                  </div>\n                  <div class=\"fe-share__mailrow\" data-testid=\"share-invite-lang-row\">\n                    <span class=\"fe-share__hint\">{{ t('access.ui.recipient_lang') }}</span>\n                    <ChoiceSelect\n                      :model-value=\"recipientLang\"\n                      :options=\"recipientLangChoices\"\n                      size=\"sm\"\n                      :aria-label=\"t('access.ui.recipient_lang')\"\n                      testid=\"share-invite-lang\"\n                      @update:model-value=\"pickRecipientLang\"\n                    />\n                  </div>\n                  <button v-if=\"mayShare.links\" type=\"button\" class=\"fe-share__linkbtn\" data-testid=\"share-send-link-instead\" :disabled=\"busy\" @click=\"gotoShareWithMail\">\n                    {{ t('access.ui.just_send_a_share_link') }}\n                  </button>\n                </div>\n                <div v-if=\"notice\" class=\"fe-share__notice\">{{ notice }}</div>\n                <div v-if=\"inviteResult?.tempPassword\" class=\"fe-share__notice\">\n                  {{ t('access.ui.temp_password') }} <code class=\"fe-share__pin\">{{ inviteResult.tempPassword }}</code>\n                </div>\n\n                <div class=\"fe-share__list\">\n                  <h4 class=\"fe-share__listhead\">{{ t('access.ui.people_with_access') }}</h4>\n                  <p v-if=\"!direct.length && !inherited.length\" class=\"fe-share__empty\">\n                    {{ t('access.ui.not_shared_with_anyone_yet') }}\n                  </p>\n                  <div v-for=\"g in direct\" :key=\"gkey('d', g)\" class=\"fe-share__row fe-share__row--grant\">\n                    <span class=\"fe-share__av\" :class=\"{ 'fe-share__av--group': isGroup(g) }\">{{ ginitial(g) }}</span>\n                    <span class=\"fe-share__person\" :title=\"gtitle(g)\">{{ glabel(g) }}<span v-if=\"isGroup(g)\" class=\"fe-share__kind\">{{ t('access.ui.group') }}</span></span>\n                    <ChoiceButtons\n                      class=\"fe-share__level\"\n                      :options=\"levelChoices\"\n                      :model-value=\"g.level\"\n                      segmented\n                      :aria-label=\"glabel(g)\"\n                      testid=\"share-row-level\"\n                      testid-prefix=\"share-row-level\"\n                      @update:model-value=\"(v: string | string[]) => changeLevel(g, String(v))\"\n                    />\n                    <button type=\"button\" class=\"fe-share__del\" :disabled=\"busy\" :title=\"t('access.ui.remove')\"\n                      :aria-label=\"t('access.ui.remove')\" @click=\"removeGrant(g)\">\n                      <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n                    </button>\n                  </div>\n                  <div v-for=\"g in inherited\" :key=\"gkey('i', g)\" class=\"fe-share__row fe-share__row--dim\">\n                    <span class=\"fe-share__av fe-share__av--dim\" :class=\"{ 'fe-share__av--group': isGroup(g) }\">{{ ginitial(g) }}</span>\n                    <span class=\"fe-share__person\" :title=\"gtitle(g)\">{{ glabel(g) }}<span v-if=\"isGroup(g)\" class=\"fe-share__kind\">{{ t('access.ui.group') }}</span></span>\n                    <span class=\"fe-share__badge\">{{ levelLabel(g.level) }}</span>\n                    <span class=\"fe-share__from\" :title=\"t('access.ui.inherited_from') + ': ' + (g.path_prefix || '/')\">\n                      {{ g.path_prefix || '/' }}\n                    </span>\n                  </div>\n                </div>\n              </template>\n            </div>\n          </section>\n\n          <!-- Request files: the inbound drop link (folders only) -->\n          <section v-if=\"isDir && mayShare.uploadLinks\" class=\"fe-share__section\" data-testid=\"share-drop\">\n            <button\n              type=\"button\"\n              class=\"fe-share__sechead\"\n              :aria-expanded=\"open.drop ? 'true' : 'false'\"\n              data-testid=\"share-drop-toggle\"\n              @click=\"toggleSection('drop')\"\n            >\n              <svg class=\"fe-share__caret\" :class=\"{ 'is-open': open.drop }\" viewBox=\"0 0 24 24\" fill=\"none\"\n                stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n                aria-hidden=\"true\" focusable=\"false\"><path d=\"M9 6l6 6-6 6\" /></svg>\n              <span class=\"fe-share__seclabel\">{{ t('access.section.drop') }}</span>\n              <span class=\"fe-share__secmeta\">{{ dropSummary }}</span>\n            </button>\n            <div v-if=\"open.drop\" class=\"fe-share__panel\">\n              <p class=\"fe-share__hint\">\n                {{ t('access.ui.a_public_link_that_lets_anyone_upload_fi') }}\n              </p>\n              <div class=\"fe-share__opts\">\n                <label class=\"fe-share__togglerow\">\n                  <span class=\"fe-share__togglelabel\">{{ t('access.ui.protect_with_a_pin') }}</span>\n                  <button\n                    type=\"button\"\n                    class=\"fe-share__switch\"\n                    role=\"switch\"\n                    :aria-checked=\"dropPwd ? 'true' : 'false'\"\n                    data-testid=\"drop-pin-switch\"\n                    @click=\"dropPwd = !dropPwd\"\n                  ><span class=\"fe-share__knob\"></span></button>\n                </label>\n                <label class=\"fe-share__field\">\n                  <span class=\"fe-share__fieldlabel\">{{ t('access.ui.expiry') }}</span>\n                  <ChoiceSelect\n                    class=\"fe-share__pick\"\n                    size=\"lg\"\n                    :model-value=\"dropExpiry\"\n                    :options=\"expiryChoices\"\n                    testid=\"drop-expiry\"\n                    @update:model-value=\"(v) => (dropExpiry = Number(v))\"\n                  />\n                </label>\n              </div>\n              <p v-if=\"ttlHint\" class=\"fe-share__hint\">{{ ttlHint }}</p>\n              <button type=\"button\" class=\"fe-share__btn fe-share__btn--primary fe-share__btn--wide\" data-testid=\"drop-create\" :disabled=\"dropBusy\" @click=\"createDropLink\">\n                {{ t('access.ui.create_link') }}\n              </button>\n\n              <button type=\"button\" class=\"fe-share__linkbtn\" :aria-expanded=\"dropShowAdv ? 'true' : 'false'\" @click=\"dropShowAdv = !dropShowAdv\">\n                {{ dropShowAdv ? t('access.ui.hide_upload_limits') : t('access.ui.upload_limits') }}\n              </button>\n              <div v-if=\"dropShowAdv\" class=\"fe-share__adv\">\n                <label class=\"fe-share__advrow\">\n                  <span class=\"fe-share__fieldlabel\">{{ t('access.ui.max_files') }}</span>\n                  <input v-model=\"dropMaxFiles\" type=\"number\" min=\"1\" class=\"fe-share__input fe-share__input--sm\" placeholder=\"20\" />\n                </label>\n                <label class=\"fe-share__advrow\">\n                  <span class=\"fe-share__fieldlabel\">{{ t('access.ui.mb_file') }}</span>\n                  <input v-model=\"dropMaxSizeMB\" type=\"number\" min=\"1\" class=\"fe-share__input fe-share__input--sm\" placeholder=\"500\" />\n                </label>\n                <label class=\"fe-share__advrow\">\n                  <span class=\"fe-share__fieldlabel\">{{ t('access.ui.allowed_types') }}</span>\n                  <input v-model=\"dropAllowedExt\" type=\"text\" class=\"fe-share__input fe-share__input--sm\" :placeholder=\"t('access.ui.all_e_g_pdf_jpg')\" />\n                </label>\n                <label class=\"fe-share__togglerow\">\n                  <span class=\"fe-share__togglelabel\">{{ t('access.ui.ask_uploader_name') }}</span>\n                  <button\n                    type=\"button\"\n                    class=\"fe-share__switch\"\n                    role=\"switch\"\n                    :aria-checked=\"dropAskName ? 'true' : 'false'\"\n                    data-testid=\"drop-askname-switch\"\n                    @click=\"dropAskName = !dropAskName\"\n                  ><span class=\"fe-share__knob\"></span></button>\n                </label>\n              </div>\n\n              <div v-if=\"dropErr\" class=\"fe-share__warn\">{{ dropErr }}</div>\n\n              <template v-if=\"dropResult\">\n                <div class=\"fe-share__linkrow\">\n                  <a :href=\"dropResult.url\" target=\"_blank\" rel=\"noopener\" class=\"fe-share__url\" :title=\"dropResult.url\">{{ dropResult.url }}</a>\n                  <button type=\"button\" class=\"fe-share__copy\" data-testid=\"drop-copy\" @click=\"copy(dropResult.url, 'drop')\">\n                    <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                    <span>{{ copied === 'drop' ? t('access.copied') : t('access.copy') }}</span>\n                  </button>\n                </div>\n                <p class=\"fe-share__detail\">\n                  {{ validUntil(dropResult) }}\n                  <span v-if=\"dropResult.clamped\">{{ t('access.ui.server_limit_applied') }}</span>\n                </p>\n                <div v-if=\"dropResult.pin\" class=\"fe-share__pinrow\">\n                  <span class=\"fe-share__pinlabel\">PIN</span>\n                  <code class=\"fe-share__pin\">{{ dropResult.pin }}</code>\n                  <button type=\"button\" class=\"fe-share__copy\" @click=\"copy(dropResult.pin, 'droppin')\">\n                    <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                    <span>{{ copied === 'droppin' ? t('access.copied') : t('access.copy') }}</span>\n                  </button>\n                </div>\n\n                <!-- email the upload link to one or more people -->\n                <div v-if=\"mailRowShown\" class=\"fe-share__mailrow\">\n                  <input v-model=\"dropMailTo\" type=\"text\" class=\"fe-share__input\" autocomplete=\"off\"\n                    :disabled=\"mailMissing\"\n                    :placeholder=\"t('access.ui.emails_comma_separated')\" @keyup.enter=\"sendDropMail\" />\n                  <button type=\"button\" class=\"fe-share__btn\" :disabled=\"dropMailBusy || mailMissing\" @click=\"sendDropMail\">\n                    {{ t('access.ui.send') }}\n                  </button>\n                </div>\n                <div v-if=\"mailRowShown && !mailMissing\" class=\"fe-share__mailrow\" data-testid=\"drop-mail-lang-row\">\n                  <span class=\"fe-share__hint\">{{ t('access.ui.recipient_lang') }}</span>\n                  <ChoiceSelect\n                    :model-value=\"recipientLang\"\n                    :options=\"recipientLangChoices\"\n                    size=\"sm\"\n                    :aria-label=\"t('access.ui.recipient_lang')\"\n                    testid=\"drop-mail-lang\"\n                    @update:model-value=\"pickRecipientLang\"\n                  />\n                </div>\n                <div v-if=\"mailRowShown && mailMissing\" class=\"fe-share__notice\">\n                  {{ t('access.ui.mail_not_set_up') }}\n                </div>\n                <div v-if=\"dropMailNotice\" class=\"fe-share__notice\">{{ dropMailNotice }}</div>\n\n                <!-- native share (OS share sheet) — same as the fishapp Share button -->\n                <button v-if=\"canShare && dropSheet\" type=\"button\" class=\"fe-share__btn fe-share__btn--wide\" data-testid=\"drop-sheet\" @click=\"nativeShare(dropSheet)\">\n                  <span aria-hidden=\"true\" v-html=\"actionIconSvg('access')\"></span>\n                  <span>{{ t('access.ui.share') }}</span>\n                </button>\n              </template>\n\n              <div v-if=\"otherDropShares.length\" class=\"fe-share__list\" data-testid=\"drop-other-links\">\n                <h4 class=\"fe-share__listhead\">{{ dropResult ? t('access.ui.other_links') : t('access.ui.existing_links') }}</h4>\n                <div v-for=\"s in otherDropShares\" :key=\"s.uuid\" class=\"fe-share__row\">\n                  <span class=\"fe-share__url\" :title=\"s.url\">{{ s.url }}</span>\n                  <button type=\"button\" class=\"fe-share__copy\" @click=\"copy(s.url, s.uuid)\">\n                    <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                    <span>{{ copied === s.uuid ? t('access.copied') : t('access.copy') }}</span>\n                  </button>\n                  <button type=\"button\" class=\"fe-share__del\" :disabled=\"shareBusy\" :title=\"t('access.ui.revoke')\"\n                    :aria-label=\"t('access.ui.revoke')\" @click=\"revoke(s)\">\n                    <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n                  </button>\n                </div>\n              </div>\n            </div>\n          </section>\n        </div>\n      </div>\n\n      <footer class=\"fe-share__foot\">\n        <button type=\"button\" class=\"fe-share__btn fe-share__btn--primary\" data-testid=\"share-done\" @click=\"emit('close')\">\n          {{ t('access.done') }}\n        </button>\n      </footer>\n    </div>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * gorunum:v1-advsearch — the Advanced search dialog.\n *\n * ⚠⚠ The rule this component was built under: **only offer what the backend\n * can actually do.** A control wired to a parameter the server never reads\n * looks identical to one that works and quietly changes nothing, which is\n * worse than not shipping it (the same sentence already governs the filter\n * row — see the header of `lib/fileFilters.ts`).\n *\n * The split is still real, and it is still said ON SCREEN — but as one\n * sentence under the count rather than as two half-page captions over two\n * stacked halves (the reference shell's layout, owner's call 2026-09-12:\n * \"görüntü birebir yapalım\"). What the halves are:\n *\n *   1. What the SERVER answers — the text, the tag filters and the scope.\n *      Those are the whole of filex's search surface (`handlers/search.go`\n *      `searchRequest`: q/query, storage_id, limit, scope; the query text may\n *      carry `tag:` / `-tag:`). Drawn at the top: one wide field, one row of\n *      scope tabs, and the tag boxes.\n *   2. What NARROWS THE ROWS THAT CAME BACK — type, modified, size, folder.\n *      No endpoint reads a date, size, mime or path parameter, so these run\n *      here, over the hits. Drawn in the two columns, and named for what they\n *      are by `advsearch.count.cost` directly under the number they produced:\n *      \"Type, date, size and folder are applied to the rows that come back,\n *      not by the server.\"\n *\n * ⚠ Moving that sentence, or letting a redesign drop it, turns four honest\n * controls into four that quietly promise a search the server never runs.\n *\n * **Owner IS drawn now, and the reason it was not is gone.** This block used\n * to read \"there is no per-node owner on the wire\". Migration 00038 made\n * ownership a real fact on the row and the listing projection carries\n * `owner_id` / `owner_name` / `owner_self` on every row that has one, so the\n * Owner select answers from a field the rows ALREADY carry — the same bargain\n * as type, date and size, and it is named in the same sentence under the\n * count. ⚠ It is offered on NAME searches only: the explorer maps a content\n * hit onto the listing shape by hand (`lib/searchHit.hitToNode`) and that\n * mapping does not carry the owner through, so under the content scopes every\n * row would read as \"System\" — a wrong answer, which is worse than a control\n * that says why it is off.\n *\n * Still not drawn, each for a reason that was MEASURED against the reference\n * build on 2026-09-13 rather than assumed:\n *   - **A \"Paths\" scope tab.** The reference sends `scope:\"path\"` and its own\n *     server answers it with the byte-identical result set `scope:\"name\"`\n *     returns — measured over four queries incl. `Code/api`, which matches a\n *     path and no name. Paths are matched INSIDE the name scope (the index\n *     queries the `path` field there, `search.nameQuery`), so the tab renames\n *     a search rather than adding one.\n *   - **A \"Tags\" scope tab.** `search.ParseScope` is name|content|all; the\n *     reference's `scope:\"tags\"` returns nothing for every query on its own\n *     install. Ours has the stronger thing already: two boxes that become\n *     `tag:` / `-tag:` tokens the backend resolves against the database.\n *   - **\"Match whole phrase\".** The query language has no phrase operator. The\n *     only quoting the parser knows keeps a `tag:\"two words\"` value together\n *     (`search.splitQuery`); quotes around free text stay in the text.\n *   - **A storage chooser and a \"search in / all storages\" scope.** Both need\n *     the explorer to send the search somewhere else — `api.search(target, …)`\n *     builds the target from where the explorer is standing, and only the\n *     multi-storage virtual root searches across drives. A picker drawn here\n *     could narrow the rows that came back, which for a single-storage search\n *     can only ever mean \"the drive you are already on\". The endpoint half is\n *     ready (see `handlers/search.go`: a hit now carries its storage NAME);\n *     the routing half is `FileExplorer.advTarget`, and is not this\n *     component's to write.\n *\n * The live count is a REAL query, debounced — the same search the button runs,\n * with the type, date, size, folder and owner choices sent as the server's\n * parameters (0.54, task #207: the server narrows before it cuts its page; the\n * browser used to narrow the page afterwards). That costs a round trip, so the\n * dialog prints that it does instead of presenting the number as free.\n */\nimport { computed, ref, watch, onBeforeUnmount } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from '../modals/Modal.vue';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport { keyOfName, type TagItem, type TagKind } from '../lib/tags';\nimport TagKindIcon from './TagKindIcon.vue';\nimport ChoiceButtons, { type ChoiceOption } from './ChoiceButtons.vue';\nimport ChoiceSelect, { type SelectOption } from './ChoiceSelect.vue';\nimport {\n  EMPTY_FILTERS,\n  type AroundSpan,\n  type ModifiedFilter,\n  type PathMode,\n  type PeopleFilter,\n  type PeopleOption,\n  type SizeFilter,\n  type TypeFilter,\n} from '../lib/fileFilters';\nimport {\n  advQueryString,\n  advSearchEmpty,\n  emptyAdvSearch,\n  parseTagList,\n  type AdvCountResult,\n  type AdvScope,\n  type AdvSearchRequest,\n} from '../lib/advSearch';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  theme?: 'light' | 'dark' | 'auto';\n  /** Seeded from the toolbar field so the dialog continues the search in progress. */\n  initialQuery?: string;\n  /** Human name of the folder the dialog was opened from (\"Documents\"). */\n  folderLabel?: string;\n  /** Adapter-qualified folder the \"only here\" / \"skip here\" choice measures\n   *  against (`qldemo://Documents`). Captured at open: a search rebases the\n   *  explorer to the storage root, so by the time the filter runs the folder\n   *  the user meant is no longer where the explorer is standing. */\n  pathBase?: string;\n  /**\n   * Whether the content scopes may be offered.\n   *\n   * ⚠ Not a preference. Content search exists only on `/api/files/search`,\n   * and a hit from there reaches the explorer without the drive it came from —\n   * with more than one storage mounted the explorer cannot tell which drive a\n   * hit is on, and a row labelled with the wrong drive is worse than a missing\n   * feature. With one storage every hit is necessarily that storage's, so the\n   * scopes are exact. The caller decides; this component only draws it.\n   *\n   * ⚠ The ENDPOINT half of that gap is closed as of 2026-09-13: a hit now\n   * carries `storage` (the drive's name) as well as its id, the same way the\n   * starred and recently-opened handlers have always answered\n   * (`handlers/search.go` `describeHits`). What is left is the explorer's own\n   * hand-written mapping, `lib/searchHit.hitToNode`, which builds a listing\n   * row from the hit and does not read that field — so the caller still has to\n   * pass `false` on a multi-storage install until it does.\n   */\n  contentSearch?: boolean;\n  /** Runs the real query and returns what it found. Owned by the explorer,\n   *  which is the only thing holding the API client. */\n  count: (req: AdvSearchRequest) => Promise<AdvCountResult>;\n  /**\n   * etiket:k2 (v0.43) — the tags the person can see, with their kind, offered\n   * under the Tags box as one-click picks. The filter itself does not take a\n   * kind (`tag:x` matches your personal x and your team's x alike — both are\n   * yours to search), but a tag on screen always says which kind it is, here\n   * as everywhere else. Optional: an embed that passes none gets the box only.\n   */\n  knownTags?: TagItem[];\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'submit', req: AdvSearchRequest): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/* ── form state ──────────────────────────────────────────────────────────── */\n\n/**\n * The query box, focused when the dialog opens.\n *\n * ⚠ Not a flourish — it replaces something that broke. Modal autofocuses the\n * first focusable element inside its card, which used to be the × in its own\n * title bar; this dialog folds that bar away (it draws its own head), and a\n * `display:none` button cannot take focus, so opening the dialog left focus on\n * the opener and nothing in the dialog was focused at all. The field is the\n * right answer anyway: a search dialog opens ready to be typed into. The delay\n * clears Modal's own 30ms autofocus attempt rather than racing it.\n */\nconst queryEl = ref<HTMLInputElement | null>(null);\n\nconst text = ref('');\nconst scope = ref<AdvScope>('name');\nconst tagsRaw = ref('');\n\n/** The known tags, Personal then Team, for the picks under the Tags box. */\nconst knownTagGroups = computed(() =>\n  (['personal', 'team'] as TagKind[])\n    .map((kind) => ({ kind, list: (props.knownTags ?? []).filter((tag) => tag.kind === kind) }))\n    .filter((g) => g.list.length > 0),\n);\n\n/** A pick appends its name to the box, once - by the server's sameness: the\n *  `key` it sent with each known tag (#211), so \"Rapor\" picked beside a typed\n *  \"RAPOR\" the server knows is not added twice. */\nfunction pickTag(tag: TagItem) {\n  const current = parseTagList(tagsRaw.value);\n  const known = props.knownTags ?? [];\n  const same = (c: string) => c === tag.name || (!!tag.key && keyOfName(known, c) === tag.key);\n  if (current.some(same)) return;\n  tagsRaw.value = [...current, tag.name].join(', ');\n}\nconst excludeRaw = ref('');\nconst type = ref<TypeFilter>('any');\nconst modified = ref<ModifiedFilter>('any');\nconst aroundDate = ref('');\nconst aroundSpan = ref<AroundSpan>('d1');\n/**\n * Whose rows to keep.\n *\n * ⚠ The same `PeopleFilter` the filter row's People pill uses, narrowed by the\n * same `matchesPeople` predicate — two definitions of \"files you put here\"\n * would be two products. `any` / `me` / `system` are offered unconditionally\n * because a menu whose members appear and disappear is a menu nobody can\n * learn; the per-account members are the ones that would be inert, so they are\n * the ones that have to come from data (`peopleOptions`, below, reads them off\n * the run that produced the count).\n */\nconst people = ref<PeopleFilter>('any');\nconst size = ref<SizeFilter>('any');\n/* ⚠ `string | number`, not `string`. Vue's v-model casts the value of an\n   `<input type=\"number\">` to a NUMBER on its own — no `.number` modifier\n   needed (`runtime-dom`: `castToNumber = number || vnode.props.type ===\n   'number'`) — and hands back the raw string only when it does not parse, so\n   an empty field is `''` and a typed one is `1`. Typing these as `string` and\n   calling a string method on the value is not a type error the compiler can\n   see, and the failure is silent: see `bytes()` below. */\nconst sizeFrom = ref<string | number>('');\nconst sizeTo = ref<string | number>('');\nconst sizeUnit = ref<'kb' | 'mb' | 'gb'>('mb');\nconst pathMode = ref<PathMode>('any');\n\nconst TYPE_OPTIONS: TypeFilter[] = [\n  'any', 'folder', 'document', 'spreadsheet', 'presentation', 'pdf',\n  'image', 'video', 'audio', 'archive', 'code',\n];\nconst MODIFIED_OPTIONS: ModifiedFilter[] = ['any', 'today', '7d', '30d', 'year', 'around'];\nconst SIZE_OPTIONS: SizeFilter[] = ['any', 'lt1', '1to10', '10to100', 'gt100', 'range'];\nconst SPAN_OPTIONS: AroundSpan[] = ['h1', 'd1', 'w1'];\n/* The lists as the shared controls take them (#160: no native select). A\n   computed, so the labels follow the dialog's language. The unit is three\n   short answers beside two numbers: a segmented strip, not a list. */\nconst modifiedChoices = computed<SelectOption[]>(() =>\n  MODIFIED_OPTIONS.map((o) => ({ value: o, label: t(`filter.modified.${o}`) })),\n);\nconst typeChoices = computed<SelectOption[]>(() => TYPE_OPTIONS.map((o) => ({ value: o, label: t(`filter.type.${o}`) })));\nconst sizeChoices = computed<SelectOption[]>(() => SIZE_OPTIONS.map((o) => ({ value: o, label: t(`filter.size.${o}`) })));\nconst unitChoices = computed<ChoiceOption[]>(() =>\n  (['kb', 'mb', 'gb'] as const).map((u) => ({ value: u, label: t(`unit.${u}`) })),\n);\nconst UNIT_FACTOR: Record<'kb' | 'mb' | 'gb', number> = {\n  kb: 1024,\n  mb: 1024 ** 2,\n  gb: 1024 ** 3,\n};\n\n/**\n * Scopes in the order they are OFFERED — which is not the same thing as which\n * one is selected. `reset()` picks `name` either way, because it is the only\n * scope the folder-search endpoint can serve; the order below is the reference\n * shell's (widest first), and when content search is off the list collapses to\n * the single scope that exists rather than drawing two tabs that would do the\n * same thing.\n */\nconst scopeOptions = computed<AdvScope[]>(() =>\n  props.contentSearch ? ['all', 'content', 'name'] : ['name'],\n);\n\n/**\n * The tab glyph. Keys from `lib/actionIcons` only — the reference shell puts a\n * mark on every scope tab, and an icon per tab drawn from the shared set keeps\n * this row in the same voice as the menus rather than inventing a second one.\n */\nconst SCOPE_ICON: Record<AdvScope, string> = {\n  all: 'search',\n  content: 'preview',\n  name: 'copy-path',\n};\n\n/** The three answers to \"where does the folder come into it\". */\nconst PATH_MODES: PathMode[] = ['any', 'here', 'skip'];\n\n/** The People members that need no data behind them. Named by the catalogue,\n *  not by the directory — which is also why offering them cannot leak one. */\nconst PEOPLE_FIXED: PeopleFilter[] = ['any', 'me', 'system'];\n\n/**\n * Whether the Owner select can be trusted right now.\n *\n * ⚠ A capability check, not a preference — the same shape as `contentSearch`.\n * A NAME search comes back through the manager's search action, whose rows are\n * the listing projection and carry `owner_id` / `owner_name` / `owner_self`.\n * The content scopes come back through `/api/files/search`, and the explorer\n * maps those hits onto the listing shape by hand; that mapping carries no\n * owner, so every row would read as \"System\" and both `me` and `system` would\n * answer the wrong question confidently. Off, and it says so, until the\n * mapping carries it (`lib/searchHit.hitToNode`).\n */\nconst ownerFilterable = computed(() => scope.value === 'name');\n\n/** Leaving the name scope takes the Owner filter with it — a disabled control\n *  that goes on filtering is the dishonest half of disabling it. */\nwatch(ownerFilterable, (ok) => {\n  if (!ok) people.value = 'any';\n});\n\nfunction reset() {\n  text.value = '';\n  scope.value = 'name';\n  tagsRaw.value = '';\n  excludeRaw.value = '';\n  type.value = 'any';\n  modified.value = 'any';\n  aroundDate.value = '';\n  aroundSpan.value = 'd1';\n  size.value = 'any';\n  sizeFrom.value = '';\n  sizeTo.value = '';\n  sizeUnit.value = 'mb';\n  pathMode.value = 'any';\n  people.value = 'any';\n}\n\n/* ── continuing the search that is actually running ───────────────────────\n *\n * ⚠⚠ The bug this exists for. Opening the dialog over a live advanced filter\n * called `reset()`, so it came up saying `Type = any` and printed a count for\n * a search NOBODY had run — measured at \"14 matching items\" over a listing\n * holding 1. Worse than the wrong number: pressing Search from that state\n * submitted the reset form and silently dropped the filter that was in force.\n * The dialog could restart a search and never continue one.\n *\n * The fix is self-contained on purpose. The applied state lives in the\n * explorer (`advFilters` / `advScope`) and could be handed back as a prop, but\n * then the dialog would only remember in the ONE shell that passed it — the\n * desktop app, the fm.example.com explorer and the work/fishapp embeds all mount\n * this same component, and a continuity that works in one of them is two\n * products. So the dialog remembers what IT submitted.\n *\n * `query` is the honesty check, not a nicety. The toolbar field holds exactly\n * the wire query a submit produced (`applyAdvancedSearch` writes it there),\n * and typing in that field CLEARS the advanced filters (`onToolbarSearch`).\n * So \"the seed still equals what I submitted\" is the strongest available\n * evidence that the filter we remember is the filter in force; anything else\n * — a cleared box, an edited query, a plain search — falls back to `reset()`.\n */\ninterface FormState {\n  text: string;\n  scope: AdvScope;\n  tagsRaw: string;\n  excludeRaw: string;\n  type: TypeFilter;\n  modified: ModifiedFilter;\n  aroundDate: string;\n  aroundSpan: AroundSpan;\n  size: SizeFilter;\n  sizeFrom: string | number;\n  sizeTo: string | number;\n  sizeUnit: 'kb' | 'mb' | 'gb';\n  pathMode: PathMode;\n  people: PeopleFilter;\n}\n\nfunction snapshot(): FormState {\n  return {\n    text: text.value,\n    scope: scope.value,\n    tagsRaw: tagsRaw.value,\n    excludeRaw: excludeRaw.value,\n    type: type.value,\n    modified: modified.value,\n    aroundDate: aroundDate.value,\n    aroundSpan: aroundSpan.value,\n    size: size.value,\n    sizeFrom: sizeFrom.value,\n    sizeTo: sizeTo.value,\n    sizeUnit: sizeUnit.value,\n    pathMode: pathMode.value,\n    people: people.value,\n  };\n}\n\nfunction restore(s: FormState) {\n  text.value = s.text;\n  scope.value = s.scope;\n  tagsRaw.value = s.tagsRaw;\n  excludeRaw.value = s.excludeRaw;\n  type.value = s.type;\n  modified.value = s.modified;\n  aroundDate.value = s.aroundDate;\n  aroundSpan.value = s.aroundSpan;\n  size.value = s.size;\n  sizeFrom.value = s.sizeFrom;\n  sizeTo.value = s.sizeTo;\n  sizeUnit.value = s.sizeUnit;\n  pathMode.value = s.pathMode;\n  people.value = s.people;\n}\n\n/** The form as it stood when Search was last pressed, with the wire query it\n *  produced. Not a ref: nothing renders it, and a reactive copy of the whole\n *  form would re-run the count watcher for a value the user cannot see. */\nlet submitted: { query: string; form: FormState } | null = null;\n\n// Opening either CONTINUES the advanced search that is running, or seeds a\n// fresh one from whatever the toolbar held.\nwatch(\n  () => props.open,\n  (v) => {\n    if (!v) return;\n    const seed = props.initialQuery ?? '';\n    if (submitted && submitted.query !== '' && submitted.query === seed) {\n      restore(submitted.form);\n    } else {\n      reset();\n      text.value = seed;\n    }\n    counted.value = null;\n    countError.value = false;\n    setTimeout(() => queryEl.value?.focus(), 60);\n  },\n);\n\n/**\n * Bytes for one end of the custom range, or null when it is left open.\n *\n * ⚠⚠ Takes `unknown` on purpose. This read `raw.trim()` and typed the\n * parameter `string`, which is what the ref was declared as — and Vue casts a\n * number input's value to a NUMBER, so `trim` was not a function. The throw\n * happened inside the `request` computed, which is what the count watcher\n * reads, so the watcher's getter threw before it could fire: the dialog kept\n * printing the PREVIOUS count and looked like a filter that simply did not\n * narrow. Measured in a real browser on 2026-09-12 — \"to = 0 MB\" over two\n * files of 16 and 184 bytes still said \"2 matching items\". Nothing in the\n * console of the page under test, nothing in vue-tsc, nothing in the unit\n * suite: a filter that is a no-op is indistinguishable from a filter that\n * matched everything unless you check it against rows you know it must drop.\n *\n * An empty field is `''` and must stay \"open end\", never `Number('') === 0` —\n * a zero ceiling means nothing passes.\n */\nfunction bytes(raw: unknown): number | null {\n  const s = String(raw ?? '').trim();\n  if (!s) return null;\n  const n = Number(s);\n  if (!Number.isFinite(n) || n < 0) return null;\n  return Math.round(n * UNIT_FACTOR[sizeUnit.value]);\n}\n\nconst request = computed<AdvSearchRequest>(() => ({\n  ...emptyAdvSearch(props.pathBase ?? ''),\n  text: text.value,\n  tags: parseTagList(tagsRaw.value),\n  excludeTags: parseTagList(excludeRaw.value),\n  scope: scope.value,\n  filters: {\n    ...EMPTY_FILTERS,\n    type: type.value,\n    modified: modified.value,\n    aroundDate: aroundDate.value,\n    aroundSpan: aroundSpan.value,\n    size: size.value,\n    sizeMin: size.value === 'range' ? bytes(sizeFrom.value) : null,\n    sizeMax: size.value === 'range' ? bytes(sizeTo.value) : null,\n    pathMode: pathMode.value,\n    pathBase: props.pathBase ?? '',\n    /* ⚠ Read through the guard, not off the ref. The `ownerFilterable` watch\n       below already clears the choice when the scope leaves `name`, so this is\n       the SECOND lock, not the first: a disabled select cannot be changed but\n       it can still hold a value chosen before the scope moved, and a filter\n       that outlives its own control narrows a search nobody asked it to. The\n       two are worth keeping apart — one is what the user sees change, the\n       other is what actually reaches the predicate. */\n    people: ownerFilterable.value ? people.value : 'any',\n  },\n}));\n\nconst nothingToAsk = computed(() => advSearchEmpty(request.value));\n\n/** Exactly what would go on the wire, shown to the user. The tag box becomes\n *  `tag:` tokens and there is no reason to hide that — somebody who learns the\n *  syntax here can type it straight into the toolbar next time. */\nconst wireQuery = computed(() => advQueryString(request.value));\n\n/* ── the live count: a real search, debounced ────────────────────────────── */\n\nconst counted = ref<AdvCountResult | null>(null);\nconst counting = ref(false);\nconst countError = ref(false);\n\n/**\n * The per-account People members, offered only when a real search actually\n * returned rows belonging to somebody else.\n *\n * ⚠ Derived from the count run, never from a directory. The dialog holds no\n * listing of its own, and offering every account on the install would put\n * names in the menu that cannot narrow anything here — the same reason\n * `peopleOptions` in `lib/fileFilters.ts` derives the pill's members from the\n * rows in hand. A count result that does not report them (the field is\n * optional, and the explorer does not fill it yet) simply offers the three\n * that need no data.\n */\nconst peopleOptions = computed<PeopleOption[]>(() => [\n  ...PEOPLE_FIXED.map((value) => ({ value })),\n  ...(counted.value?.people ?? []),\n]);\n\n/** The label for one member: the fixed three are named by the catalogue, an\n *  account by itself. A nameless account falls back to the neutral word rather\n *  than printing `u:7` at somebody. */\nfunction peopleLabel(o: PeopleOption): string {\n  if (o.value === 'any' || o.value === 'me' || o.value === 'system') {\n    return t(`filter.people.${o.value}`);\n  }\n  return o.name || t('filter.people.someone');\n}\n\n/**\n * ⚠ A member can leave the menu — a later count over different rows may not\n * contain that account at all — and a list whose value is no longer one of\n * its options shows no choice (a native one rendered BLANK) while it goes on\n * filtering. Falling back to `any` keeps what is shown and what is applied\n * the same thing.\n */\nwatch(peopleOptions, (opts) => {\n  if (!opts.some((o) => o.value === people.value)) people.value = 'any';\n});\nconst peopleChoices = computed<SelectOption[]>(() =>\n  peopleOptions.value.map((o) => ({ value: o.value, label: peopleLabel(o) })),\n);\nlet timer: ReturnType<typeof setTimeout> | null = null;\n/** Only the newest run may write the answer — a slow early query landing after\n *  a fast later one would print a count for a search nobody is looking at. */\nlet seq = 0;\n\nfunction scheduleCount() {\n  if (timer) clearTimeout(timer);\n  countError.value = false;\n  if (nothingToAsk.value) {\n    counted.value = null;\n    counting.value = false;\n    return;\n  }\n  counting.value = true;\n  timer = setTimeout(run, 450);\n}\n\nasync function run() {\n  const mine = ++seq;\n  const req = request.value;\n  try {\n    const res = await props.count(req);\n    if (mine !== seq) return;\n    counted.value = res;\n  } catch {\n    if (mine !== seq) return;\n    counted.value = null;\n    countError.value = true;\n  } finally {\n    if (mine === seq) counting.value = false;\n  }\n}\n\n/**\n * ⚠ The guard the `bytes()` bug earned. A throw while building `request` used\n * to happen inside this watcher's own getter, so the watcher never fired and\n * the dialog went on showing the count from before the change — a broken\n * filter wearing the face of a filter that matched everything. A failure is\n * now REPORTED (the count line says it could not run) instead of leaving a\n * stale number on screen. `'ERR'` is a constant, not a timestamp: a value that\n * changed every evaluation would re-trigger the watcher forever.\n */\nwatch(\n  () => {\n    if (!props.open) return '';\n    try {\n      return JSON.stringify(request.value);\n    } catch {\n      return 'ERR';\n    }\n  },\n  (v) => {\n    if (!v) return;\n    if (v === 'ERR') {\n      if (timer) clearTimeout(timer);\n      seq++;\n      counted.value = null;\n      counting.value = false;\n      countError.value = true;\n      return;\n    }\n    scheduleCount();\n  },\n);\n\nonBeforeUnmount(() => {\n  if (timer) clearTimeout(timer);\n});\n\n/**\n * The count sentence.\n *\n * ⚠ This dialog's most common real answer on a small folder IS one, and \"1\n * matching items\" is what a bare `{n}` message produces. Both keys have a\n * `_one` form, and `t()` picks it from `n` (composables/useLocale →\n * countedKey) — the rule that used to be written out here, once per caller.\n */\nconst countLabel = computed(() => {\n  const c = counted.value;\n  if (!c) return '';\n  return t(c.capped ? 'advsearch.count.capped' : 'advsearch.count.result', { n: String(c.count) });\n});\n\nfunction submit() {\n  if (nothingToAsk.value) return;\n  // Remember BEFORE emitting: the parent closes the dialog synchronously, and\n  // the `open` watcher that reads this runs on the next opening.\n  submitted = { query: wireQuery.value, form: snapshot() };\n  emit('submit', request.value);\n}\n</script>\n\n<template>\n  <Modal\n    :open=\"open\"\n    :title=\"t('advsearch.title')\"\n    size=\"lg\"\n    :theme=\"theme\"\n    @close=\"emit('close')\"\n  >\n    <form class=\"fe-advsearch\" @submit.prevent=\"submit\">\n      <!-- ── the dialog's own head ───────────────────────────────────────\n           Modal draws a plain title bar; this dialog needs the mark, the\n           title and the sentence under it as ONE block across the full\n           width, so it draws its own and the stylesheet folds Modal's away\n           (`.fe-modal__card:has(.fe-advsearch) .fe-modal__head`). The h2 up\n           there stays in the DOM on purpose — it is what `aria-labelledby`\n           on the dialog points at, so the name survives the fold. -->\n      <header class=\"fe-advsearch__head\">\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-advsearch__head-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('search')\"></span>\n        <div class=\"fe-advsearch__head-text\">\n          <p class=\"fe-advsearch__head-title\">{{ t('advsearch.title') }}</p>\n          <p class=\"fe-advsearch__head-sub\">{{ t('advsearch.subtitle') }}</p>\n        </div>\n        <button\n          type=\"button\"\n          class=\"fe-advsearch__head-close\"\n          :title=\"t('advsearch.close')\"\n          :aria-label=\"t('advsearch.close')\"\n          @click=\"emit('close')\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n        </button>\n      </header>\n\n      <!-- ── what the server answers: the text and the scope ─────────────\n           One wide field and one row of tabs, because this is the whole of\n           the question that leaves the browser. -->\n      <label class=\"fe-advsearch__box\">\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-advsearch__glass\" aria-hidden=\"true\" v-html=\"actionIconSvg('search')\"></span>\n        <input\n          ref=\"queryEl\"\n          v-model=\"text\"\n          type=\"search\"\n          class=\"fe-advsearch__input\"\n          :placeholder=\"t('advsearch.query.placeholder')\"\n          :aria-label=\"t('advsearch.query.label')\"\n          data-testid=\"advsearch-query\"\n        />\n      </label>\n\n      <div\n        class=\"fe-advsearch__seg fe-advsearch__seg--tabs\"\n        role=\"tablist\"\n        :aria-label=\"t('advsearch.scope.label')\"\n      >\n        <button\n          v-for=\"s in scopeOptions\"\n          :key=\"s\"\n          type=\"button\"\n          role=\"tab\"\n          class=\"fe-advsearch__seg-btn\"\n          :class=\"{ 'is-active': scope === s }\"\n          :aria-selected=\"scope === s\"\n          :data-testid=\"`advsearch-scope-${s}`\"\n          @click=\"scope = s\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-advsearch__seg-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg(SCOPE_ICON[s])\"></span>\n          {{ t(`advsearch.scope.${s}`) }}\n        </button>\n      </div>\n\n      <!-- ── the two columns ─────────────────────────────────────────────\n           ⚠ Every control below the tabs narrows the rows that CAME BACK —\n           no endpoint reads a date, a size, a mime or a path. The dialog\n           says so in one sentence under the count rather than shouting it\n           over two half-page captions; the sentence is the part that has to\n           survive, not the caption. -->\n      <div class=\"fe-advsearch__cols\">\n        <div class=\"fe-advsearch__col\">\n          <div class=\"fe-advsearch__group\">\n            <label class=\"fe-advsearch__field\">\n              <span class=\"fe-advsearch__label\">{{ t('filter.modified') }}</span>\n              <ChoiceSelect\n                :model-value=\"modified\"\n                :options=\"modifiedChoices\"\n                testid=\"advsearch-modified\"\n                @update:model-value=\"(v) => (modified = v as ModifiedFilter)\"\n              />\n            </label>\n            <div v-if=\"modified === 'around'\" class=\"fe-advsearch__field\">\n              <span class=\"fe-advsearch__sublabel\">{{ t('advsearch.around.label') }}</span>\n              <div class=\"fe-advsearch__pair\">\n                <input\n                  v-model=\"aroundDate\"\n                  type=\"datetime-local\"\n                  class=\"fe-input\"\n                  :aria-label=\"t('advsearch.around.date')\"\n                  data-testid=\"advsearch-around-date\"\n                />\n                <div class=\"fe-advsearch__seg\" role=\"group\" :aria-label=\"t('advsearch.around.label')\">\n                  <button\n                    v-for=\"s in SPAN_OPTIONS\"\n                    :key=\"s\"\n                    type=\"button\"\n                    class=\"fe-advsearch__seg-btn\"\n                    :class=\"{ 'is-active': aroundSpan === s }\"\n                    :aria-pressed=\"aroundSpan === s\"\n                    @click=\"aroundSpan = s\"\n                  >\n                    {{ t(`advsearch.around.${s}`) }}\n                  </button>\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <label class=\"fe-advsearch__field\">\n            <span class=\"fe-advsearch__label\">{{ t('filter.type') }}</span>\n            <ChoiceSelect\n              :model-value=\"type\"\n              :options=\"typeChoices\"\n              testid=\"advsearch-type\"\n              @update:model-value=\"(v) => (type = v as TypeFilter)\"\n            />\n          </label>\n\n          <!-- Whose it is. Same union and same predicate as the filter row's\n               People pill, so \"files you put here\" means one thing in this\n               product. Off under the content scopes, and it says why rather\n               than vanishing — see `ownerFilterable`. -->\n          <div class=\"fe-advsearch__group\">\n            <label class=\"fe-advsearch__field\">\n              <span class=\"fe-advsearch__label\">{{ t('filter.people') }}</span>\n              <ChoiceSelect\n                :model-value=\"people\"\n                :options=\"peopleChoices\"\n                :disabled=\"!ownerFilterable\"\n                testid=\"advsearch-people\"\n                @update:model-value=\"(v) => (people = v as PeopleFilter)\"\n              />\n            </label>\n            <p v-if=\"!ownerFilterable\" class=\"fe-advsearch__hint fe-advsearch__hint--block\">\n              {{ t('advsearch.people.name_only') }}\n            </p>\n          </div>\n\n          <div class=\"fe-advsearch__group\">\n            <label class=\"fe-advsearch__field\">\n              <span class=\"fe-advsearch__label\">{{ t('advsearch.tags.label') }}</span>\n              <input\n                v-model=\"tagsRaw\"\n                type=\"text\"\n                class=\"fe-input\"\n                :placeholder=\"t('advsearch.tags.placeholder')\"\n                data-testid=\"advsearch-tags\"\n              />\n            </label>\n            <label class=\"fe-advsearch__field\">\n              <span class=\"fe-advsearch__label\">{{ t('advsearch.tags.exclude') }}</span>\n              <input\n                v-model=\"excludeRaw\"\n                type=\"text\"\n                class=\"fe-input\"\n                :placeholder=\"t('advsearch.tags.exclude_placeholder')\"\n                data-testid=\"advsearch-extags\"\n              />\n            </label>\n            <p class=\"fe-advsearch__hint fe-advsearch__hint--block\">{{ t('advsearch.tags.hint') }}</p>\n            <div\n              v-if=\"knownTagGroups.length\"\n              class=\"fe-advsearch__tagpicks\"\n              data-testid=\"advsearch-known-tags\"\n            >\n              <template v-for=\"g in knownTagGroups\" :key=\"g.kind\">\n                <span class=\"fe-advsearch__tagkind\">\n                  <TagKindIcon :kind=\"g.kind\" />\n                  {{ t(`tags.kind.${g.kind}`) }}\n                </span>\n                <button\n                  v-for=\"tag in g.list\"\n                  :key=\"`${g.kind}:${tag.name}`\"\n                  type=\"button\"\n                  class=\"fe-advsearch__tagpick\"\n                  :data-tag-kind=\"g.kind\"\n                  :title=\"t(`tags.chip.${g.kind}`, { tag: tag.name })\"\n                  :aria-label=\"t(`tags.chip.${g.kind}`, { tag: tag.name })\"\n                  @click=\"pickTag(tag)\"\n                >\n                  <TagKindIcon :kind=\"g.kind\" />\n                  {{ tag.name }}\n                </button>\n              </template>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"fe-advsearch__col\">\n          <div class=\"fe-advsearch__group\">\n            <label class=\"fe-advsearch__field\">\n              <span class=\"fe-advsearch__label\">{{ t('filter.size') }}</span>\n              <ChoiceSelect\n                :model-value=\"size\"\n                :options=\"sizeChoices\"\n                testid=\"advsearch-size\"\n                @update:model-value=\"(v) => (size = v as SizeFilter)\"\n              />\n            </label>\n            <div v-if=\"size === 'range'\" class=\"fe-advsearch__field\">\n              <span class=\"fe-advsearch__sublabel\">{{ t('advsearch.size.range_label') }}</span>\n              <div class=\"fe-advsearch__pair\">\n                <input\n                  v-model=\"sizeFrom\"\n                  type=\"number\"\n                  min=\"0\"\n                  class=\"fe-input fe-advsearch__num\"\n                  :placeholder=\"t('advsearch.size.from')\"\n                  :aria-label=\"t('advsearch.size.from')\"\n                  data-testid=\"advsearch-size-from\"\n                />\n                <span class=\"fe-advsearch__dash\" aria-hidden=\"true\">-</span>\n                <input\n                  v-model=\"sizeTo\"\n                  type=\"number\"\n                  min=\"0\"\n                  class=\"fe-input fe-advsearch__num\"\n                  :placeholder=\"t('advsearch.size.to')\"\n                  :aria-label=\"t('advsearch.size.to')\"\n                  data-testid=\"advsearch-size-to\"\n                />\n                <ChoiceButtons\n                  :options=\"unitChoices\"\n                  :model-value=\"sizeUnit\"\n                  segmented\n                  :aria-label=\"t('filter.size')\"\n                  testid=\"advsearch-unit\"\n                  testid-prefix=\"advsearch-unit\"\n                  @update:model-value=\"(v: string | string[]) => (sizeUnit = v as 'kb' | 'mb' | 'gb')\"\n                />\n              </div>\n            </div>\n          </div>\n\n          <!-- The folder. A segmented trio rather than a menu, because the\n               three answers are the whole of the choice and the sentence\n               under it then names the folder the choice is about — the\n               folder captured when the dialog opened, not wherever the\n               explorer has since been rebased to. -->\n          <div class=\"fe-advsearch__group\">\n            <span class=\"fe-advsearch__label\">{{ t('advsearch.where.label') }}</span>\n            <div\n              class=\"fe-advsearch__seg fe-advsearch__seg--wide\"\n              role=\"group\"\n              :aria-label=\"t('advsearch.where.label')\"\n              data-testid=\"advsearch-where\"\n            >\n              <button\n                v-for=\"m in PATH_MODES\"\n                :key=\"m\"\n                type=\"button\"\n                class=\"fe-advsearch__seg-btn\"\n                :class=\"{ 'is-active': pathMode === m }\"\n                :aria-pressed=\"pathMode === m\"\n                :data-testid=\"`advsearch-where-${m}`\"\n                @click=\"pathMode = m\"\n              >\n                {{ t(`advsearch.where.${m}_short`) }}\n              </button>\n            </div>\n            <span class=\"fe-advsearch__hint\">\n              {{ t(`advsearch.where.${pathMode}`, { folder: folderLabel || '' }) }}\n            </span>\n          </div>\n\n          <!-- What \"contents\" means here. This is the 200 KB sentence, kept\n               where the reference shell keeps its content options: a reader\n               who picks the Content tab has to learn what the index covers\n               BEFORE an empty result teaches them. -->\n          <div class=\"fe-advsearch__group\">\n            <p class=\"fe-advsearch__grouphead\">\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n              <span class=\"fe-advsearch__grouphead-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('preview')\"></span>\n              {{ t('advsearch.content.heading') }}\n            </p>\n            <p class=\"fe-advsearch__hint fe-advsearch__hint--block\">\n              {{ contentSearch ? t('advsearch.scope.hint') : t('advsearch.scope.name_only') }}\n            </p>\n          </div>\n        </div>\n      </div>\n\n      <!-- ── the live count ──────────────────────────────────────────────\n           A real query, debounced, and the line under it says both what\n           that cost and which half of the form the server never saw. -->\n      <div class=\"fe-advsearch__count\" data-testid=\"advsearch-count\">\n        <div class=\"fe-advsearch__count-top\">\n          <p class=\"fe-advsearch__count-line\">\n            <span v-if=\"nothingToAsk\">{{ t('advsearch.count.idle') }}</span>\n            <span v-else-if=\"counting\">{{ t('advsearch.count.counting') }}</span>\n            <span v-else-if=\"countError\">{{ t('advsearch.count.error') }}</span>\n            <strong v-else-if=\"counted\">{{ countLabel }}</strong>\n          </p>\n          <button\n            v-if=\"!nothingToAsk\"\n            type=\"button\"\n            class=\"fe-advsearch__viewall\"\n            data-testid=\"advsearch-viewall\"\n            @click=\"submit\"\n          >{{ t('advsearch.viewall') }}</button>\n        </div>\n        <p class=\"fe-advsearch__hint fe-advsearch__hint--block\">{{ t('advsearch.count.cost') }}</p>\n        <p v-if=\"wireQuery\" class=\"fe-advsearch__wire\">\n          {{ t('advsearch.wire') }} <code>{{ wireQuery }}</code>\n        </p>\n      </div>\n    </form>\n\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn fe-advsearch__reset\" @click=\"reset\">\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-advsearch__btn-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('refresh')\"></span>\n        {{ t('advsearch.reset') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">{{ t('advsearch.cancel') }}</button>\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :disabled=\"nothingToAsk\"\n        data-testid=\"advsearch-submit\"\n        @click=\"submit\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-advsearch__btn-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('search')\"></span>\n        {{ t('advsearch.submit') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * CommandPalette — Ctrl/Cmd+K quick launcher.\n *\n * Sources (no new backend calls — everything comes from props):\n *   1. Files/folders of the CURRENT listing (`files` prop), filtered by a\n *      tiny scored-includes matcher (no fuzzy-search dependency).\n *   2. Commands mapped 1:1 onto existing FileExplorer actions, surfaced as\n *      individual emits so the host wires each to code it already has.\n *   3. Path jump: any query containing `/` offers a \"go to path\" entry.\n *\n * Keyboard: ↑/↓ move, Enter selects, Esc closes; the listener sits on the\n * document in CAPTURE phase so it wins over useKeyboardShortcuts' window\n * handler (otherwise Enter would also fire the explorer's own onOpen).\n *\n * bul:s3 additions:\n *   4. \"Everywhere\" group — ≥3-char queries also hit the global files-search\n *      endpoint (debounced 250ms, max 8 rows) via the `globalSearch` prop.\n *      Content matches get an \"In content\" badge + a «»-highlighted snippet\n *      rendered as pure text nodes (no innerHTML).\n *   5. Saved searches — localStorage-backed (`filex.saved-searches`, max 10);\n *      \"save current query\" command + per-row delete.\n *\n * #47 — a hit is something to act on, not only to open:\n *   6. Each hit row carries a Download button (`download-hit`) and drags out\n *      (`drag-hit`, with the DragEvent). The palette only says WHICH hit; the\n *      explorer answers through the same hooks a listing row uses, and\n *      `hitCan` lets it withhold a verb it cannot serve for that hit.\n *   7. Hits stamped with an `account` (a host with several accounts — the\n *      desktop rail) are drawn one group per account under a badge, each\n *      group capped on its own. Unstamped hits draw exactly as before.\n *   8. A drag let go INSIDE the palette is swallowed (`drop-inside`): the\n *      explorer's root turns an OS file drop into an UPLOAD, and the palette\n *      sits inside that root.\n *\n * #71 — `warm-hit` when the pointer rests on / presses a draggable hit: the\n *   explorer may need a server-minted link for the drag, and `dragstart` is\n *   too late to ask (lib/dragOut createDragLinks).\n */\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue';\nimport type { LocaleCode, SearchAccount } from '../types/ExplorerConfig';\nimport type { FileNode, ViewMode } from '../types/FileNode';\nimport type { GlobalSearchHit } from '../composables/useFileApi';\nimport { groupHitsByAccount } from '../lib/searchHit';\nimport { matchedInContent, snippetSegments } from '../lib/snippet';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport { fileIconTile } from '../lib/fileIcons';\nimport { useLocale } from '../composables/useLocale';\nimport { sayFailure } from '../lib/errorWords';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  files: FileNode[];\n  viewMode: ViewMode;\n  /** Gates the mutating commands (new folder / upload). */\n  canWrite?: boolean;\n  /** Gates the \"up one level\" command. */\n  canGoUp?: boolean;\n  /* bul:s3 — global search callback; absent = older host, group hidden. */\n  globalSearch?: (q: string) => Promise<GlobalSearchHit[]>;\n  /* wiring:d1 — false hides the split command (narrow embeds). */\n  splitEnabled?: boolean;\n  /**\n   * surucu:d1 — the query this palette opens WITH.\n   *\n   * The drive shell's header field searches the folder you are in; ⌘K from\n   * inside it opens this palette carrying the same words, so \"not in this\n   * folder — try everywhere\" costs no retyping. Empty (the default) is the\n   * behaviour every other caller has had: a blank palette.\n   */\n  initialQuery?: string;\n  /**\n   * #47 — may this hit be downloaded / dragged out? Absent = yes to both.\n   * The explorer knows what a hit's account and this host can do (a folder\n   * cannot ride the browser's single-file drag; another account's hit needs\n   * the host's hook); the palette only draws the answer.\n   */\n  hitCan?: (hit: GlobalSearchHit, action: 'download' | 'drag') => boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'open-node', node: FileNode): void;\n  (e: 'navigate', path: string): void;\n  (e: 'new-folder'): void;\n  (e: 'upload'): void;\n  (e: 'toggle-view'): void;\n  (e: 'open-trash'): void;\n  (e: 'refresh'): void;\n  (e: 'go-up'): void;\n  /* bul:s3 — an \"everywhere\" hit was chosen. */\n  (e: 'open-hit', hit: GlobalSearchHit): void;\n  /* #47 — the hit's Download button / a drag started on its row / a drag let\n     go inside the palette (swallowed here — see the file header, point 8). */\n  (e: 'download-hit', hit: GlobalSearchHit): void;\n  (e: 'drag-hit', hit: GlobalSearchHit, ev: DragEvent): void;\n  (e: 'drop-inside'): void;\n  /* #71 — the pointer rests on / presses a draggable hit. */\n  (e: 'warm-hit', hit: GlobalSearchHit): void;\n  /* wiring:int — settings surfaces reachable from anywhere via the palette */\n  (e: 'open-theme'): void;\n  (e: 'open-shortcut-settings'): void;\n  (e: 'start-tour'): void;\n  /* wiring:d1 — tab / split commands */\n  (e: 'tab-new'): void;\n  (e: 'split-toggle'): void;\n}>();\n\nconst { t, nodeDisplayName } = useLocale(() => props.locale);\n\nconst query = ref('');\nconst active = ref(0);\nconst inputEl = ref<HTMLInputElement | null>(null);\nconst listEl = ref<HTMLElement | null>(null);\n\ntype PaletteItem =\n  | { kind: 'goto'; id: string; label: string; icon: string; path: string }\n  | { kind: 'file'; id: string; label: string; icon: string; node: FileNode }\n  | { kind: 'command'; id: string; label: string; icon: string; command: string }\n  /* bul:s3 — everywhere hit / saved search / save-current-query. */\n  | {\n      kind: 'hit'; id: string; label: string; icon: string; hit: GlobalSearchHit; crumb: string; inContent: boolean; snippet: string;\n      /* #47 — the account badge drawn ABOVE this row (first row of its group only). */\n      groupHead?: SearchAccount;\n      canDownload: boolean;\n      canDrag: boolean;\n    }\n  | { kind: 'saved'; id: string; label: string; icon: string; query: string }\n  | { kind: 'save'; id: string; label: string; icon: string; query: string };\n\n/* bul:s3 — narrowed aliases so the template doesn't need kind-guards. */\ntype HitItem = Extract<PaletteItem, { kind: 'hit' }>;\ntype SavedGroupItem = Extract<PaletteItem, { kind: 'saved' | 'save' }>;\n\n/* === ikon:emoji — the palette's marks =================================\n *\n * `icon` used to be the glyph itself and the template printed it as TEXT:\n * `➜ 📁 📄 ⬆ ▦ 🗑 ⟳ ↑ 🎨 ⌨ 🎓 ⧉ ◫ 💾 🔖`, i.e. two colour-emoji sets, a\n * geometric-shapes set and an arrows set, in one 20px column — beside a\n * context menu and a toolbar that draw the same actions from\n * `lib/actionIcons`. It is a KEY now, resolved the way ContextMenu resolves\n * a row's key, and the two groups that list FILES resolve through\n * `lib/fileIcons` instead, so a result row in the palette wears the same\n * tile as the same file in the listing behind it.\n */\n\n/** `name.ext` → `ext`, for a search hit (which carries no `extension`). */\nfunction extOf(name: string): string {\n  const dot = name.lastIndexOf('.');\n  return dot > 0 ? name.slice(dot + 1) : '';\n}\n\n/**\n * The row's mark. Static markup from our own two icon modules — never a\n * string that came off the wire, which is what lets the template v-html it.\n */\nfunction iconHtml(it: PaletteItem): string {\n  if (it.kind === 'file') return fileIconTile(it.node);\n  if (it.kind === 'hit') {\n    const name = String(it.hit.name ?? '');\n    return fileIconTile({\n      type: it.hit.type === 'dir' ? 'dir' : 'file',\n      extension: extOf(name),\n      basename: name,\n    });\n  }\n  return actionIconSvg(it.icon);\n}\n\n/**\n * Scored includes: -1 = no match; otherwise earlier + prefix matches rank\n * higher and shorter names get a small edge. Good enough without a fuzzy\n * dependency.\n */\nfunction matchScore(label: string, q: string): number {\n  if (!q) return 0;\n  const n = label.toLocaleLowerCase();\n  const s = q.toLocaleLowerCase();\n  const i = n.indexOf(s);\n  if (i === -1) return -1;\n  let sc = 100 - Math.min(i, 50);\n  if (i === 0) sc += 40;\n  sc -= Math.min(n.length, 40) / 4;\n  return sc;\n}\n\nconst gotoItems = computed<PaletteItem[]>(() => {\n  const q = query.value.trim();\n  if (!q.includes('/')) return [];\n  const clean = q.replace(/^\\/+|\\/+$/g, '');\n  if (!clean) return [];\n  return [\n    { kind: 'goto', id: `goto:${clean}`, label: `${t('palette.goto')}: ${clean}`, icon: 'goto', path: clean },\n  ];\n});\n\nconst fileItems = computed<PaletteItem[]>(() => {\n  const q = query.value.trim();\n  const scored = props.files\n    .map((f) => ({ f, name: nodeDisplayName(f), s: matchScore(nodeDisplayName(f), q) }))\n    .filter((r) => r.s >= 0);\n  if (q) scored.sort((a, b) => b.s - a.s);\n  return scored.slice(0, 8).map((r) => ({\n    kind: 'file' as const,\n    id: `file:${r.f.path}`,\n    label: r.name,\n    icon: '', // file rows draw their real tile — see iconHtml()\n    node: r.f,\n  }));\n});\n\nconst commandItems = computed<PaletteItem[]>(() => {\n  const q = query.value.trim();\n  const defs: Array<{ command: string; label: string; icon: string; enabled: boolean }> = [\n    { command: 'new-folder', label: t('toolbar.new_folder'), icon: 'new-folder', enabled: props.canWrite !== false },\n    { command: 'upload', label: t('toolbar.upload'), icon: 'upload', enabled: props.canWrite !== false },\n    /* wiring:d2 — the mark is the NEXT mode (list→grid→gallery→list), which is\n       what pressing the row gets you; the three keys are the ViewSwitcher's own. */\n    { command: 'toggle-view', label: t('cmd.view_toggle'), icon: props.viewMode === 'list' ? 'view-grid' : props.viewMode === 'grid' ? 'view-gallery' : 'view-list', enabled: true },\n    { command: 'open-trash', label: t('cmd.trash'), icon: 'open-trash', enabled: true },\n    { command: 'refresh', label: t('toolbar.refresh'), icon: 'refresh', enabled: true },\n    { command: 'go-up', label: t('toolbar.go_up'), icon: 'go-up', enabled: props.canGoUp !== false },\n    /* wiring:int */\n    { command: 'open-theme', label: t('theme.menu'), icon: 'theme', enabled: true },\n    { command: 'open-shortcut-settings', label: t('shortcuts.settings.menu'), icon: 'shortcut-settings', enabled: true },\n    { command: 'start-tour', label: t('tour.restart'), icon: 'tour', enabled: true },\n    /* wiring:d1 — tabs + split */\n    { command: 'tab-new', label: t('cmd.tab_new'), icon: 'tab-new', enabled: true },\n    { command: 'split-toggle', label: t('cmd.split_toggle'), icon: 'split', enabled: props.splitEnabled !== false },\n  ];\n  return defs\n    .filter((d) => d.enabled && matchScore(d.label, q) >= 0)\n    .map((d) => ({ kind: 'command' as const, id: `cmd:${d.command}`, label: d.label, icon: d.icon, command: d.command }));\n});\n\n/* === bul:s3 — \"everywhere\" global search ================================ */\n\nconst EVERYWHERE_MIN_CHARS = 3;\nconst EVERYWHERE_LIMIT = 8;\nconst EVERYWHERE_DEBOUNCE_MS = 250;\n\nconst everywhere = ref<GlobalSearchHit[]>([]);\nconst everywhereLoading = ref(false);\n/** ⚠ The last search could not be made. A failure used to be drawn as an\n *  empty answer — the group simply went away, as it does when nothing was\n *  found — and a person believed the file was not there. */\nconst everywhereFailed = ref(false);\n/** Why it could not search, in the failure's own words (lib/errorWords): a\n *  refusal, an outage and an unreachable server are different sentences —\n *  #65 said \"could not reach the server\" for every one of them. */\nconst everywhereFailure = ref('');\nlet everywhereTimer: ReturnType<typeof setTimeout> | undefined;\nlet everywhereSeq = 0;\n\nfunction scheduleEverywhere(q: string) {\n  if (everywhereTimer) clearTimeout(everywhereTimer);\n  const fn = props.globalSearch;\n  if (!fn || q.length < EVERYWHERE_MIN_CHARS) {\n    everywhere.value = [];\n    everywhereLoading.value = false;\n    everywhereFailed.value = false;\n    return;\n  }\n  everywhereLoading.value = true;\n  everywhereTimer = setTimeout(async () => {\n    const seq = ++everywhereSeq;\n    try {\n      const hits = await fn(q);\n      if (seq !== everywhereSeq) return; // stale response — a newer query won\n      // #47 — capped per ACCOUNT in hitItems (groupHitsByAccount), not here: a\n      // flat cut would let the first account's eight rows hide every other.\n      everywhere.value = Array.isArray(hits) ? hits : [];\n      everywhereFailed.value = false;\n    } catch (err) {\n      if (seq === everywhereSeq) {\n        everywhere.value = [];\n        everywhereFailed.value = true;\n        everywhereFailure.value = sayFailure(err, t('palette.everywhere_failed'), { t }).text;\n      }\n    } finally {\n      if (seq === everywhereSeq) everywhereLoading.value = false;\n    }\n  }, EVERYWHERE_DEBOUNCE_MS);\n}\n\n/** Parent-path crumb for a hit row (storage label when the hit carries one). */\nfunction hitCrumb(h: GlobalSearchHit): string {\n  /* wiring:e2 names — a hit inside an encrypted folder carries its plaintext\n     parent (the explorer's name view); the stored path would print ciphertext. */\n  if (typeof h.e2e_display_dir === 'string') {\n    const drive = (typeof h.storage === 'string' && h.storage) || '';\n    return [drive, h.e2e_display_dir].filter(Boolean).join('/') || '/';\n  }\n  const rel = String(h.path ?? '').replace(/^\\/+|\\/+$/g, '');\n  const slash = rel.lastIndexOf('/');\n  const parent = slash === -1 ? '' : rel.slice(0, slash);\n  const storage =\n    (typeof h.storage === 'string' && h.storage) ||\n    (typeof h.storage_name === 'string' && h.storage_name) ||\n    '';\n  if (storage && parent) return `${storage}/${parent}`;\n  if (storage) return storage;\n  return parent || '/';\n}\n\n/* #47 — flattened in DRAWN order: group by group, so the keyboard's ↑/↓ and\n   the rows on screen walk the same sequence. */\nconst hitItems = computed<HitItem[]>(() => {\n  const can = props.hitCan;\n  const out: HitItem[] = [];\n  for (const group of groupHitsByAccount(everywhere.value, EVERYWHERE_LIMIT)) {\n    group.hits.forEach((h, i) => {\n      out.push({\n        kind: 'hit' as const,\n        // The account is part of the key: two accounts can both hold node 7\n        // at `a.txt` on storage 1.\n        id: `hit:${h.account?.id ?? ''}:${h.storage_id ?? ''}:${h.path ?? ''}:${h.id ?? ''}`,\n        label: String(h.name ?? h.path ?? ''),\n        icon: '', // hit rows draw their real tile — see iconHtml()\n        hit: h,\n        crumb: hitCrumb(h),\n        inContent: matchedInContent(h.matched),\n        snippet: typeof h.snippet === 'string' ? h.snippet : '',\n        groupHead: i === 0 ? group.account : undefined,\n        canDownload: can ? can(h, 'download') : true,\n        canDrag: can ? can(h, 'drag') : true,\n      });\n    });\n  }\n  return out;\n});\n\n/* === #47 — hit verbs ==================================================== */\n\nfunction downloadHit(it: HitItem) {\n  if (!it.canDownload) return;\n  emit('download-hit', it.hit);\n}\n\nfunction warmHit(it: HitItem) {\n  if (it.canDrag) emit('warm-hit', it.hit);\n}\n\nfunction onHitDragStart(it: HitItem, ev: DragEvent) {\n  if (!it.canDrag) {\n    ev.preventDefault();\n    return;\n  }\n  emit('drag-hit', it.hit, ev);\n}\n\n/**\n * Everything dragged over the palette stops here. The explorer's root owns\n * `dragenter`/`dragover`/`drop` for uploads, and the palette is inside it: a\n * hit dragged out through the desktop shell is an OS FILE drag, so letting it\n * bubble would light the upload overlay and, on release, upload the shell's\n * stand-in copy into whatever folder is open behind the palette.\n */\nfunction onBackdropDragOver(ev: DragEvent) {\n  ev.preventDefault();\n}\nfunction onBackdropDrop(ev: DragEvent) {\n  ev.preventDefault();\n  emit('drop-inside');\n}\n\n/* === bul:s3 — saved searches (localStorage) ============================= */\n\nconst SAVED_LS_KEY = 'filex.saved-searches';\nconst SAVED_MAX = 10;\n\nconst savedSearches = ref<string[]>([]);\n\nfunction readSavedSearches(): string[] {\n  try {\n    const raw = localStorage.getItem(SAVED_LS_KEY);\n    if (!raw) return [];\n    const parsed: unknown = JSON.parse(raw);\n    if (!Array.isArray(parsed)) return [];\n    return parsed.filter((x): x is string => typeof x === 'string' && x.trim() !== '').slice(0, SAVED_MAX);\n  } catch {\n    return [];\n  }\n}\n\nfunction writeSavedSearches(list: string[]) {\n  savedSearches.value = list.slice(0, SAVED_MAX);\n  try {\n    localStorage.setItem(SAVED_LS_KEY, JSON.stringify(savedSearches.value));\n  } catch {\n    /* private mode / quota — the in-memory list still works this session */\n  }\n}\n\nfunction saveSearch(q: string) {\n  const clean = q.trim();\n  if (!clean) return;\n  const list = savedSearches.value.filter((s) => s !== clean);\n  list.unshift(clean); // newest first; cap enforced by writeSavedSearches\n  writeSavedSearches(list);\n}\n\nfunction removeSavedSearch(q: string) {\n  writeSavedSearches(savedSearches.value.filter((s) => s !== q));\n  if (active.value >= flat.value.length) active.value = Math.max(0, flat.value.length - 1);\n}\n\nconst savedItems = computed<SavedGroupItem[]>(() => {\n  const q = query.value.trim();\n  const out: SavedGroupItem[] = [];\n  // \"Save this query\" command — only when there IS a query and it isn't saved yet.\n  if (q && !savedSearches.value.includes(q)) {\n    out.push({ kind: 'save', id: `save:${q}`, label: `${t('palette.save')}: ${q}`, icon: 'save-search', query: q });\n  }\n  const scored = savedSearches.value\n    .map((s) => ({ s, sc: matchScore(s, q) }))\n    .filter((r) => r.sc >= 0 || !q);\n  for (const r of scored) {\n    out.push({ kind: 'saved', id: `saved:${r.s}`, label: r.s, icon: 'bookmark', query: r.s });\n  }\n  return out;\n});\n\n/* ======================================================================== */\n\nconst flat = computed<PaletteItem[]>(() => [\n  ...gotoItems.value,\n  ...fileItems.value,\n  ...hitItems.value,\n  ...savedItems.value,\n  ...commandItems.value,\n]);\nconst fileOffset = computed(() => gotoItems.value.length);\nconst hitOffset = computed(() => fileOffset.value + fileItems.value.length);\nconst savedOffset = computed(() => hitOffset.value + hitItems.value.length);\nconst cmdOffset = computed(() => savedOffset.value + savedItems.value.length);\n\nwatch(query, (q) => {\n  active.value = 0;\n  scheduleEverywhere(q.trim()); /* bul:s3 */\n});\n\nfunction move(delta: number) {\n  const n = flat.value.length;\n  if (!n) return;\n  active.value = (active.value + delta + n) % n;\n  void nextTick(() => {\n    listEl.value?.querySelector('.is-active')?.scrollIntoView({ block: 'nearest' });\n  });\n}\n\nfunction choose(item?: PaletteItem) {\n  const it = item ?? flat.value[active.value];\n  if (!it) return;\n  /* bul:s3 — saved-search rows keep the palette OPEN: picking one re-runs\n   * the palette with that query; saving just persists it. */\n  if (it.kind === 'saved') {\n    query.value = it.query;\n    void nextTick(() => inputEl.value?.focus());\n    return;\n  }\n  if (it.kind === 'save') {\n    saveSearch(it.query);\n    void nextTick(() => inputEl.value?.focus());\n    return;\n  }\n  emit('close');\n  if (it.kind === 'hit') {\n    emit('open-hit', it.hit);\n    return;\n  }\n  if (it.kind === 'file') {\n    emit('open-node', it.node);\n  } else if (it.kind === 'goto') {\n    emit('navigate', it.path);\n  } else {\n    switch (it.command) {\n      case 'new-folder': emit('new-folder'); break;\n      case 'upload': emit('upload'); break;\n      case 'toggle-view': emit('toggle-view'); break;\n      case 'open-trash': emit('open-trash'); break;\n      case 'refresh': emit('refresh'); break;\n      case 'go-up': emit('go-up'); break;\n      /* wiring:int */\n      case 'open-theme': emit('open-theme'); break;\n      case 'open-shortcut-settings': emit('open-shortcut-settings'); break;\n      case 'start-tour': emit('start-tour'); break;\n      /* wiring:d1 */\n      case 'tab-new': emit('tab-new'); break;\n      case 'split-toggle': emit('split-toggle'); break;\n    }\n  }\n}\n\nfunction onDocKeydown(e: KeyboardEvent) {\n  if (!props.open) return;\n  switch (e.key) {\n    case 'ArrowDown':\n      e.preventDefault();\n      e.stopPropagation();\n      move(1);\n      break;\n    case 'ArrowUp':\n      e.preventDefault();\n      e.stopPropagation();\n      move(-1);\n      break;\n    case 'Enter':\n      e.preventDefault();\n      e.stopPropagation();\n      choose();\n      break;\n    case 'Escape':\n      e.preventDefault();\n      e.stopPropagation();\n      emit('close');\n      break;\n  }\n}\n\nwatch(\n  () => props.open,\n  (v) => {\n    if (v) {\n      // ⚠ Read at OPEN, not watched: a seed that kept overwriting the field\n      // would undo every keystroke of whoever is typing here now.\n      query.value = props.initialQuery ?? '';\n      active.value = 0;\n      /* bul:s3 — fresh session state for the new groups. */\n      everywhere.value = [];\n      everywhereLoading.value = false;\n      savedSearches.value = readSavedSearches();\n      document.addEventListener('keydown', onDocKeydown, true);\n      void nextTick(() => {\n        inputEl.value?.focus();\n        // Selected, not appended to: the seed is a starting point, and the\n        // next keystroke should be able to replace it outright.\n        inputEl.value?.select();\n      });\n    } else {\n      if (everywhereTimer) clearTimeout(everywhereTimer); /* bul:s3 */\n      document.removeEventListener('keydown', onDocKeydown, true);\n    }\n  },\n);\n\nonBeforeUnmount(() => {\n  if (everywhereTimer) clearTimeout(everywhereTimer); /* bul:s3 */\n  document.removeEventListener('keydown', onDocKeydown, true);\n});\n</script>\n\n<template>\n  <transition name=\"fe-modal\">\n    <div\n      v-if=\"open\"\n      class=\"fe-modal__backdrop fe-cmdp__backdrop\"\n      role=\"presentation\"\n      @click=\"emit('close')\"\n      @dragenter.stop=\"onBackdropDragOver\"\n      @dragover.stop=\"onBackdropDragOver\"\n      @dragleave.stop\n      @drop.stop=\"onBackdropDrop\"\n    >\n      <div\n        class=\"fe-cmdp\"\n        role=\"dialog\"\n        aria-modal=\"true\"\n        :aria-label=\"t('palette.placeholder')\"\n        @click.stop\n      >\n        <div class=\"fe-cmdp__inputwrap\">\n          <svg\n            class=\"fe-cmdp__glyph\"\n            width=\"16\"\n            height=\"16\"\n            viewBox=\"0 0 16 16\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"1.5\"\n            stroke-linecap=\"round\"\n            aria-hidden=\"true\"\n          >\n            <circle cx=\"7\" cy=\"7\" r=\"4.5\" />\n            <path d=\"m10.5 10.5 3.5 3.5\" />\n          </svg>\n          <input\n            ref=\"inputEl\"\n            v-model=\"query\"\n            type=\"text\"\n            class=\"fe-cmdp__input\"\n            :placeholder=\"t('palette.placeholder')\"\n            autocomplete=\"off\"\n            spellcheck=\"false\"\n          />\n        </div>\n\n        <div ref=\"listEl\" class=\"fe-cmdp__list\" role=\"listbox\">\n          <button\n            v-for=\"(it, i) in gotoItems\"\n            :key=\"it.id\"\n            type=\"button\"\n            class=\"fe-cmdp__item\"\n            :class=\"{ 'is-active': i === active }\"\n            role=\"option\"\n            :aria-selected=\"i === active\"\n            @mouseenter=\"active = i\"\n            @click=\"choose(it)\"\n          >\n            <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons + lib/fileIcons -->\n            <span class=\"fe-cmdp__icon\" aria-hidden=\"true\" v-html=\"iconHtml(it)\"></span>\n            <span class=\"fe-cmdp__label\"><bdi>{{ it.label }}</bdi></span>\n          </button>\n\n          <template v-if=\"fileItems.length\">\n            <div class=\"fe-cmdp__group\">{{ t('palette.files') }}</div>\n            <button\n              v-for=\"(it, i) in fileItems\"\n              :key=\"it.id\"\n              type=\"button\"\n              class=\"fe-cmdp__item\"\n              :class=\"{ 'is-active': fileOffset + i === active }\"\n              role=\"option\"\n              :aria-selected=\"fileOffset + i === active\"\n              @mouseenter=\"active = fileOffset + i\"\n              @click=\"choose(it)\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons + lib/fileIcons -->\n              <span class=\"fe-cmdp__icon\" aria-hidden=\"true\" v-html=\"iconHtml(it)\"></span>\n              <span class=\"fe-cmdp__label\"><bdi>{{ it.label }}</bdi></span>\n            </button>\n          </template>\n\n          <!-- bul:s3 — \"Everywhere\" global-search hits -->\n          <template v-if=\"hitItems.length || everywhereLoading || everywhereFailed\">\n            <div class=\"fe-cmdp__group\">{{ t('palette.everywhere') }}</div>\n            <div v-if=\"everywhereLoading && !hitItems.length\" class=\"fe-cmdp__loading\">\n              {{ t('palette.searching') }}\n            </div>\n            <div\n              v-else-if=\"everywhereFailed && !hitItems.length\"\n              class=\"fe-cmdp__loading\"\n              role=\"alert\"\n              data-testid=\"palette-everywhere-failed\"\n            >\n              {{ everywhereFailure || t('palette.everywhere_failed') }}\n            </div>\n            <template v-for=\"(it, i) in hitItems\" :key=\"it.id\">\n              <!-- #47 — one badge per signed-in account, above its first row. -->\n              <div\n                v-if=\"it.groupHead\"\n                class=\"fe-cmdp__acct\"\n                data-testid=\"palette-account-group\"\n                :data-account=\"it.groupHead.id\"\n              >\n                <span\n                  class=\"fe-cmdp__acct-dot\"\n                  aria-hidden=\"true\"\n                  :style=\"it.groupHead.color ? { background: it.groupHead.color } : undefined\"\n                ></span>\n                <span class=\"fe-cmdp__acct-label\"><bdi>{{ it.groupHead.label }}</bdi></span>\n                <span v-if=\"it.groupHead.detail\" class=\"fe-cmdp__acct-detail\"><bdi>{{ it.groupHead.detail }}</bdi></span>\n              </div>\n              <!-- A div, not a button: the row now holds its own Download button,\n                   and a button inside a button is not HTML (same shape as the\n                   saved-search rows below). -->\n              <div\n                class=\"fe-cmdp__item fe-cmdp__item--hit\"\n                :class=\"{ 'is-active': hitOffset + i === active }\"\n                role=\"option\"\n                tabindex=\"-1\"\n                :aria-selected=\"hitOffset + i === active\"\n                :data-account=\"it.hit.account?.id\"\n                :draggable=\"it.canDrag ? 'true' : 'false'\"\n                @mouseenter=\"active = hitOffset + i; warmHit(it)\"\n                @pointerdown=\"warmHit(it)\"\n                @click=\"choose(it)\"\n                @keydown.enter.prevent=\"choose(it)\"\n                @dragstart=\"onHitDragStart(it, $event)\"\n              >\n                <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons + lib/fileIcons -->\n                <span class=\"fe-cmdp__icon\" aria-hidden=\"true\" v-html=\"iconHtml(it)\"></span>\n                <span class=\"fe-cmdp__hitbody\">\n                  <span class=\"fe-cmdp__hitline\">\n                    <span class=\"fe-cmdp__label\"><bdi>{{ it.label }}</bdi></span>\n                    <span v-if=\"it.inContent\" class=\"fe-cmdp__badge\">{{ t('search.in_content') }}</span>\n                  </span>\n                  <span v-if=\"it.crumb\" class=\"fe-cmdp__crumb\" :title=\"it.crumb\">{{ it.crumb }}</span>\n                  <!-- Snippet: «»-highlights become <mark> via TEXT segments — never innerHTML. -->\n                  <span v-if=\"it.snippet\" class=\"fe-cmdp__snippet\">\n                    <template v-for=\"(seg, si) in snippetSegments(it.snippet)\" :key=\"si\">\n                      <mark v-if=\"seg.match\" class=\"fe-cmdp__mark\">{{ seg.text }}</mark>\n                      <template v-else>{{ seg.text }}</template>\n                    </template>\n                  </span>\n                </span>\n                <button\n                  v-if=\"it.canDownload\"\n                  type=\"button\"\n                  class=\"fe-cmdp__hitact\"\n                  data-testid=\"palette-hit-download\"\n                  :title=\"t('ctx.download')\"\n                  :aria-label=\"t('ctx.download')\"\n                  draggable=\"false\"\n                  @click.stop=\"downloadHit(it)\"\n                ><!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons --><span aria-hidden=\"true\" v-html=\"actionIconSvg('download')\"></span></button>\n              </div>\n            </template>\n          </template>\n\n          <!-- bul:s3 — saved searches -->\n          <template v-if=\"savedItems.length\">\n            <div class=\"fe-cmdp__group\">{{ t('palette.saved') }}</div>\n            <div\n              v-for=\"(it, i) in savedItems\"\n              :key=\"it.id\"\n              class=\"fe-cmdp__item fe-cmdp__item--saved\"\n              :class=\"{ 'is-active': savedOffset + i === active }\"\n              role=\"option\"\n              :aria-selected=\"savedOffset + i === active\"\n              tabindex=\"-1\"\n              @mouseenter=\"active = savedOffset + i\"\n              @click=\"choose(it)\"\n              @keydown.enter.prevent=\"choose(it)\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons + lib/fileIcons -->\n              <span class=\"fe-cmdp__icon\" aria-hidden=\"true\" v-html=\"iconHtml(it)\"></span>\n              <span class=\"fe-cmdp__label\"><bdi>{{ it.label }}</bdi></span>\n              <button\n                v-if=\"it.kind === 'saved'\"\n                type=\"button\"\n                class=\"fe-cmdp__del\"\n                :title=\"t('palette.saved.delete')\"\n                :aria-label=\"t('palette.saved.delete')\"\n                @click.stop=\"removeSavedSearch(it.query)\"\n              ><!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons --><span aria-hidden=\"true\" v-html=\"actionIconSvg('delete')\"></span></button>\n            </div>\n          </template>\n\n          <template v-if=\"commandItems.length\">\n            <div class=\"fe-cmdp__group\">{{ t('palette.commands') }}</div>\n            <button\n              v-for=\"(it, i) in commandItems\"\n              :key=\"it.id\"\n              type=\"button\"\n              class=\"fe-cmdp__item\"\n              :class=\"{ 'is-active': cmdOffset + i === active }\"\n              role=\"option\"\n              :aria-selected=\"cmdOffset + i === active\"\n              @mouseenter=\"active = cmdOffset + i\"\n              @click=\"choose(it)\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons + lib/fileIcons -->\n              <span class=\"fe-cmdp__icon\" aria-hidden=\"true\" v-html=\"iconHtml(it)\"></span>\n              <span class=\"fe-cmdp__label\"><bdi>{{ it.label }}</bdi></span>\n            </button>\n          </template>\n\n          <div v-if=\"flat.length === 0 && !everywhereLoading && !everywhereFailed\" class=\"fe-cmdp__empty\">\n            {{ t('palette.empty') }}\n          </div>\n        </div>\n\n        <div class=\"fe-cmdp__hint\">{{ t('palette.hint') }}</div>\n      </div>\n    </div>\n  </transition>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { ArchiveCreateFormat } from '../types/FileNode';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from './Modal.vue';\nimport { archiveFormatLabel } from '../lib/archiveFormats';\nimport ChoiceSelect, { type SelectOption } from '../components/ChoiceSelect.vue';\n\nconst props = withDefaults(defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  count: number;\n  suggestedName: string;\n  defaultFormat?: ArchiveCreateFormat;\n  allowedFormats?: ArchiveCreateFormat[];\n  busy?: boolean;\n  requestError?: string;\n  /** Can the server set a password (it needs 7-Zip)? Default yes. ⚠ Stated\n   *  in withDefaults: Vue casts an absent optional boolean prop to false. */\n  encryption?: boolean;\n}>(), { encryption: true });\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'submit', value: { name: string; format: ArchiveCreateFormat; password?: string; encrypt_filenames: boolean; compression: number; solid?: boolean; dictionary_size_mb?: number }): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst name = ref('archive.zip');\nconst format = ref<ArchiveCreateFormat>('7z');\nconst password = ref('');\nconst confirmPassword = ref('');\nconst encryptNames = ref(false);\nconst compression = ref(5);\nconst solid = ref(true);\nconst dictionarySizeMB = ref(64);\nconst error = ref('');\n\nconst allFormats: ArchiveCreateFormat[] = ['zip', '7z', 'tar', 'tar.gz', 'tar.bz2', 'tar.xz'];\nconst availableFormats = computed<ArchiveCreateFormat[]>(() => {\n  const formats = (props.allowedFormats ?? allFormats).filter(\n    (value, index, all) => allFormats.includes(value) && all.indexOf(value) === index,\n  );\n  return formats.length ? formats : allFormats;\n});\n/* The two lists as core's own list takes them (#160: no native select). */\nconst formatChoices = computed<SelectOption[]>(() =>\n  availableFormats.value.map((value) => ({ value, label: archiveFormatLabel(value) })),\n);\nconst DICTIONARY_SIZES_MB = [4, 8, 16, 32, 64, 128, 256];\nconst dictionaryChoices = computed<SelectOption[]>(() =>\n  DICTIONARY_SIZES_MB.map((n) => ({ value: n, label: t('archive.dictionary_size_value', { n }) })),\n);\nconst supportsEncryption = computed(() => props.encryption !== false && (format.value === 'zip' || format.value === '7z'));\n\nfunction formatFromName(value: string): ArchiveCreateFormat | null {\n  const lower = value.trim().toLowerCase();\n  return allFormats.find((candidate) => lower.endsWith(`.${candidate}`)) ?? null;\n}\n\nfunction stripArchiveExtension(value: string): string {\n  const detected = formatFromName(value);\n  return detected ? value.slice(0, -(detected.length + 1)) : value;\n}\n\nwatch(() => props.open, (open) => {\n  if (!open) return;\n  const preferred = props.defaultFormat && availableFormats.value.includes(props.defaultFormat)\n    ? props.defaultFormat\n    : availableFormats.value.includes('7z') ? '7z' : availableFormats.value[0];\n  format.value = preferred;\n  name.value = `${stripArchiveExtension(props.suggestedName || 'archive')}.${preferred}`;\n  password.value = '';\n  confirmPassword.value = '';\n  encryptNames.value = false;\n  compression.value = 5;\n  solid.value = true;\n  dictionarySizeMB.value = 64;\n  error.value = '';\n});\n\nwatch(format, (next) => {\n  if (!props.open) return;\n  const base = stripArchiveExtension(name.value.trim()) || 'archive';\n  name.value = `${base}.${next}`;\n  if (next !== 'zip' && next !== '7z') {\n    password.value = '';\n    confirmPassword.value = '';\n    encryptNames.value = false;\n  }\n});\n\nwatch(name, (next) => {\n  const detected = formatFromName(next);\n  if (detected && availableFormats.value.includes(detected)) format.value = detected;\n});\n\nfunction submit() {\n  // Enter in a box submits too; the buttons' `disabled` does not reach it.\n  if (props.busy) return;\n  if (!name.value.trim() || /[\\\\/]/.test(name.value)) {\n    error.value = t('archive.invalid_name');\n    return;\n  }\n  const extension = formatFromName(name.value);\n  if (!extension || !availableFormats.value.includes(extension)) {\n    error.value = t('archive.invalid_extension');\n    return;\n  }\n  if (supportsEncryption.value && password.value !== confirmPassword.value) {\n    error.value = t('archive.password_mismatch');\n    return;\n  }\n  /* 7-Zip encrypts a ZIP with printable ASCII only; the server refuses the\n   * rest too (PASSWORD_CHARSET), this only says so before anything is sent. */\n  if (extension === 'zip' && password.value && !/^[\\x20-\\x7e]*$/.test(password.value)) {\n    error.value = t('archive.password_charset');\n    return;\n  }\n  emit('submit', {\n    name: name.value.trim(),\n    format: extension,\n    password: supportsEncryption.value ? password.value || undefined : undefined,\n    encrypt_filenames: !!password.value && extension === '7z' && encryptNames.value,\n    compression: compression.value,\n    solid: extension === '7z' ? solid.value : undefined,\n    dictionary_size_mb: extension === '7z' ? dictionarySizeMB.value : undefined,\n  });\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('archive.create_title')\" size=\"sm\" :busy=\"busy\" @close=\"emit('close')\">\n    <form class=\"fe-form\" @submit.prevent=\"submit\">\n      <p class=\"fe-field__hint\">{{ t('archive.create_count', { count }) }}</p>\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('archive.filename') }}</span>\n        <input v-model=\"name\" class=\"fe-input\" autocomplete=\"off\" />\n      </label>\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('archive.format') }}</span>\n        <ChoiceSelect\n          :model-value=\"format\"\n          :options=\"formatChoices\"\n          testid=\"archive-format\"\n          @update:model-value=\"(v) => (format = v as ArchiveCreateFormat)\"\n        />\n      </label>\n      <label v-if=\"supportsEncryption\" class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('archive.password_optional') }}</span>\n        <input\n          v-model=\"password\"\n          class=\"fe-input\"\n          type=\"password\"\n          autocomplete=\"off\"\n          data-1p-ignore\n          data-bwignore=\"true\"\n          data-lpignore=\"true\"\n        />\n      </label>\n      <label v-if=\"supportsEncryption\" class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('archive.password_confirm') }}</span>\n        <input\n          v-model=\"confirmPassword\"\n          class=\"fe-input\"\n          type=\"password\"\n          autocomplete=\"off\"\n          data-1p-ignore\n          data-bwignore=\"true\"\n          data-lpignore=\"true\"\n        />\n      </label>\n      <label v-if=\"format === '7z' && password\" class=\"fe-checkbox\">\n        <input v-model=\"encryptNames\" type=\"checkbox\" />\n        <span>{{ t('archive.encrypt_names') }}</span>\n      </label>\n      <label v-if=\"format !== 'tar'\" class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('archive.compression') }}: {{ compression }}</span>\n        <input v-model.number=\"compression\" type=\"range\" min=\"0\" max=\"9\" />\n      </label>\n      <template v-if=\"format === '7z'\">\n        <label class=\"fe-checkbox\">\n          <input v-model=\"solid\" type=\"checkbox\" />\n          <span>{{ t('archive.solid') }}</span>\n        </label>\n        <label class=\"fe-field\">\n          <span class=\"fe-field__label\">{{ t('archive.dictionary_size') }}</span>\n          <ChoiceSelect\n            :model-value=\"dictionarySizeMB\"\n            :options=\"dictionaryChoices\"\n            testid=\"archive-dictionary\"\n            @update:model-value=\"(v) => (dictionarySizeMB = Number(v))\"\n          />\n          <span class=\"fe-field__hint\">{{ t('archive.dictionary_hint') }}</span>\n        </label>\n      </template>\n      <p v-if=\"error || requestError\" class=\"fe-form__error\">{{ error || requestError }}</p>\n    </form>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">{{ t('archive.cancel') }}</button>\n      <button type=\"button\" class=\"fe-btn fe-btn--primary\" :disabled=\"busy\" :aria-busy=\"busy ? 'true' : undefined\" @click=\"submit\">\n        {{ busy ? t('archive.creating') : t('archive.create') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * OnboardingTour — wiring:c4 first-use coach-mark tour.\n *\n * A dependency-free spotlight walkthrough: each step targets a live DOM\n * element inside the explorer root (resolved lazily — steps whose target\n * is missing are skipped, so confined embeds with hidden surfaces never\n * show a dangling spotlight). Positioning is hand-rolled with\n * getBoundingClientRect + fixed overlay; the spotlight is a rounded\n * cutout drawn with a huge box-shadow.\n *\n * Teleported under <body> (same reason as ContextMenu: transformed embed\n * ancestors break position:fixed) and re-uses the `.fe-ctx-backdrop--theme-*`\n * classes so the CSS-variable theme cascade applies outside the `.fe` tree.\n *\n * Persistence (`filex.tourDone`) is the PARENT's job — the tour only\n * emits `close`; FileExplorer decides when it counts as done.\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { useSystemDark } from '../composables/useSystemDark';\nimport { inlineKeyStep } from '../lib/direction';\nimport { shortcutHint } from '../composables/useKeyboardShortcuts';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /** Explorer root — targets are resolved inside it only. */\n  root: HTMLElement | null;\n  theme?: ThemeMode;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n}>();\n\n// ⚠ RTL: `dir` goes on the teleported tour and orders its choices below.\nconst { t, dir } = useLocale(() => props.locale);\n\n/* The tour teaches two keys by name, and both are remappable. Read them\n * from the registry so the sentence stays true for whoever is taking the\n * tour — a walkthrough that names the wrong key is worse than one that\n * names none. */\nconst hintCombos = computed(() => ({\n  palette: shortcutHint('palette'),\n  help: shortcutHint('help'),\n}));\n\n// ------------------------------------------------------------------\n// Step definitions. `target` returns the element to spotlight (null =\n// centered card, e.g. the closing shortcuts step).\n//\n// gorunum:v3-shell — every target below is a `data-testid` or a class the\n// shell owns, resolved from the live DOM. It used to find two of its\n// buttons by matching their localized `title` attribute, which quietly\n// stopped working the moment those verbs moved into a menu: `byTitle(r,\n// t('toolbar.upload'))` matched nothing at 1440px, so the upload step was\n// dropped from the walk and nobody could see that it had been. A step that\n// disappears is indistinguishable from a step that was never written.\n//\n// ⚠ Two steps point at a control the narrow shell draws DIFFERENTLY — the\n// panel (a column at 1440px, a closed drawer behind `toolbar-nav` at\n// 390px) and the create button (\"+ New\" and its menu, versus the upload\n// FAB). They say a different sentence there, and the sentence is chosen\n// from THE ELEMENT THAT ACTUALLY RESOLVED, never from a width: one branch,\n// no media query to keep in sync with the stylesheet.\n// ------------------------------------------------------------------\n\ninterface TourStep {\n  id: string;\n  titleKey: string;\n  /** A key, or a key chosen from whichever element resolved (see above). */\n  descKey: string | ((el: HTMLElement | null) => string);\n  target: (root: HTMLElement) => HTMLElement | null;\n}\n\nconst STEPS: TourStep[] = [\n  {\n    // The navigation panel: the standard views, then STORAGES, then\n    // CONNECTIONS. At 390px it is a drawer that starts closed, so there is\n    // nothing to spotlight and the button that opens it is the target.\n    id: 'nav',\n    titleKey: 'tour.step.nav.title',\n    descKey: (el) =>\n      el?.dataset.testid === 'sidenav' ? 'tour.step.nav.desc' : 'tour.step.nav.desc_closed',\n    target: (r) =>\n      r.querySelector<HTMLElement>('[data-testid=\"sidenav\"]') ||\n      r.querySelector<HTMLElement>('[data-testid=\"toolbar-nav\"]'),\n  },\n  {\n    // \"+ New\" — the menu that replaced the Upload / New folder pair. The\n    // narrow shell has no panel on screen and draws the upload FAB instead,\n    // which does ONE of the three things the menu offers, so it gets a\n    // sentence that promises only that one.\n    id: 'new',\n    titleKey: 'tour.step.new.title',\n    descKey: (el) =>\n      el?.dataset.testid === 'sidenav-new' ? 'tour.step.new.desc' : 'tour.step.new.desc_fab',\n    target: (r) =>\n      r.querySelector<HTMLElement>('[data-testid=\"sidenav-new\"]') ||\n      r.querySelector<HTMLElement>('.fe-fab'),\n  },\n  {\n    // ⚠ The FIELD, not `.fe-search__input`. The wide header's input carries\n    // both class names and the narrow one carries only `fe-drivesearch__input`\n    // — so the old selector resolved at 1440px and matched nothing at 390px,\n    // where the field is the widest thing on the row. The testid is on the\n    // wrapper in both layouts, and spotlighting the wrapper also takes in the\n    // advanced-search and palette buttons the copy now names.\n    id: 'search',\n    titleKey: 'tour.step.search.title',\n    descKey: 'tour.step.search.desc',\n    target: (r) => r.querySelector<HTMLElement>('[data-testid=\"drive-search\"]'),\n  },\n  {\n    // The breadcrumb — this was the old first step's target while its title\n    // said \"Storages & folders\", which is the panel. Now it has its own step\n    // and its own title. Absent on Home, which has no address; the step drops\n    // itself there rather than pointing at the heading that takes its place.\n    id: 'crumb',\n    titleKey: 'tour.step.crumb.title',\n    descKey: 'tour.step.crumb.desc',\n    target: (r) => r.querySelector<HTMLElement>('.fe-breadcrumb'),\n  },\n  {\n    // The filter row. Unconditional in the shell now, but only drawn where\n    // there is a listing to filter — not at the multi-storage virtual root,\n    // which is where a first run usually starts, so this step is often the\n    // one that drops itself.\n    id: 'filters',\n    titleKey: 'tour.step.filters.title',\n    descKey: 'tour.step.filters.desc',\n    target: (r) => r.querySelector<HTMLElement>('[data-testid=\"filterbar\"]'),\n  },\n  {\n    id: 'view',\n    titleKey: 'tour.step.view.title',\n    descKey: 'tour.step.view.desc',\n    // Still `.fe-toolbar__view`: ViewSwitcher kept its class when it moved\n    // from the header to the breadcrumb row.\n    target: (r) => r.querySelector<HTMLElement>('.fe-toolbar__view'),\n  },\n  {\n    // Sharing used to spotlight `.fe__body` — the whole listing, which is to\n    // say nothing in particular — while talking about a context menu. The\n    // details panel is where a share link is actually minted, so the step\n    // points at the control that opens it and names the context menu too.\n    id: 'details',\n    titleKey: 'tour.step.details.title',\n    descKey: 'tour.step.details.desc',\n    target: (r) => r.querySelector<HTMLElement>('[data-testid=\"subhead-inspector\"]'),\n  },\n  {\n    id: 'help',\n    titleKey: 'tour.step.help.title',\n    descKey: 'tour.step.help.desc',\n    target: () => null,\n  },\n];\n\n// Steps re-resolved on every open so surfaces that appeared/disappeared\n// since mount (narrow-mode collapse, RBAC hiding upload…) are honored.\nconst activeSteps = ref<TourStep[]>([]);\nconst stepIdx = ref(0);\n\nconst step = computed<TourStep | null>(() => activeSteps.value[stepIdx.value] ?? null);\nconst total = computed(() => activeSteps.value.length);\n\nfunction resolveSteps() {\n  const r = props.root;\n  activeSteps.value = STEPS.filter((s) => {\n    if (s.id === 'help') return true; // centered card — no DOM dependency\n    if (!r) return false;\n    const el = s.target(r);\n    // Element must exist AND be laid out (visible) — a display:none\n    // toolbar section in narrow mode yields a 0×0 rect.\n    if (!el) return false;\n    const rect = el.getBoundingClientRect();\n    return rect.width > 0 && rect.height > 0;\n  });\n}\n\n// ------------------------------------------------------------------\n// Spotlight + card geometry\n// ------------------------------------------------------------------\n\ninterface Rect {\n  top: number;\n  left: number;\n  width: number;\n  height: number;\n}\nconst spot = ref<Rect | null>(null);\nconst cardStyle = ref<Record<string, string>>({});\nconst cardEl = ref<HTMLElement | null>(null);\n/**\n * The element the CURRENT step resolved to, kept so a step whose control\n * differs by width can pick its sentence from what is really there.\n *\n * Written at the top of `place()`, which runs before the card re-renders\n * (the `stepIdx` watcher flushes 'pre') and again on every resize — so the\n * copy follows the spotlight instead of lagging a step behind it. Assigning\n * the same element twice is not a change, so a scroll storm costs nothing.\n */\nconst targetEl = ref<HTMLElement | null>(null);\n\n/** The step's sentence, with the shortcut names filled in. */\nconst stepDesc = computed(() => {\n  const s = step.value;\n  if (!s) return '';\n  const key = typeof s.descKey === 'function' ? s.descKey(targetEl.value) : s.descKey;\n  return t(key, hintCombos.value);\n});\n\nconst PAD = 6; // spotlight breathing room around the target\nconst GAP = 12; // gap between spotlight and the card\n\nasync function place() {\n  const s = step.value;\n  const r = props.root;\n  if (!s) return;\n  const el = r ? s.target(r) : null;\n  targetEl.value = el;\n  if (!el) {\n    spot.value = null; // centered card\n    cardStyle.value = {};\n    return;\n  }\n  const rect = el.getBoundingClientRect();\n  if (rect.width <= 0 && rect.height <= 0) {\n    spot.value = null;\n    cardStyle.value = {};\n    return;\n  }\n  spot.value = {\n    top: rect.top - PAD,\n    left: rect.left - PAD,\n    width: rect.width + PAD * 2,\n    height: rect.height + PAD * 2,\n  };\n  // Card: below the spotlight, then above, then beside it.\n  //\n  // gorunum:v3-shell — the SIDE branches are why this is four cases and not\n  // two. The navigation panel is a full-height column, so neither \"below\" nor\n  // \"above\" fits and the old code clamped the card to the top of the viewport\n  // — which put it flat on top of the panel, hiding the very rows (\"Home, My\n  // files, Shared with me…\") the step was reading out. A coach mark that\n  // covers its own subject is worse than no coach mark: it looks like the\n  // product drew a dialog in the wrong place.\n  await nextTick();\n  const vw = window.innerWidth;\n  const vh = window.innerHeight;\n  const cw = Math.min(340, vw - 24);\n  const ch = cardEl.value?.offsetHeight ?? 160;\n  const sTop = rect.top - PAD;\n  const sBottom = rect.bottom + PAD;\n  const sLeft = rect.left - PAD;\n  const sRight = rect.right + PAD;\n  // Centred on the target along the other axis, then clamped into view.\n  const clampX = (x: number) => Math.min(Math.max(12, x), Math.max(12, vw - cw - 12));\n  const clampY = (y: number) => Math.min(Math.max(12, y), Math.max(12, vh - ch - 12));\n  const midX = clampX(rect.left + rect.width / 2 - cw / 2);\n  const midY = clampY(rect.top + rect.height / 2 - ch / 2);\n\n  /* Beside it: toward the inline END first — right in LTR, LEFT in RTL, where\n     the reading eye goes next. ⚠ The spotlight and these numbers stay\n     PHYSICAL (they are the target's own viewport box); only which side is\n     tried first follows the direction. */\n  const toRight = { fits: sRight + GAP + cw <= vw - 12, left: sRight + GAP };\n  const toLeft = { fits: sLeft - GAP - cw >= 12, left: sLeft - GAP - cw };\n  const beside = dir.value === 'rtl' ? [toLeft, toRight] : [toRight, toLeft];\n\n  let top: number;\n  let left: number;\n  if (sBottom + GAP + ch <= vh - 12) {\n    top = sBottom + GAP;\n    left = midX;\n  } else if (sTop - GAP - ch >= 12) {\n    top = sTop - GAP - ch;\n    left = midX;\n  } else if (beside[0].fits) {\n    left = beside[0].left;\n    top = midY;\n  } else if (beside[1].fits) {\n    left = beside[1].left;\n    top = midY;\n  } else {\n    // Nothing fits — a target that fills the viewport. Clamp, and accept the\n    // overlap rather than drawing the card off screen.\n    top = clampY(sBottom + GAP);\n    left = midX;\n  }\n  cardStyle.value = {\n    top: `${Math.round(top)}px`,\n    left: `${Math.round(left)}px`,\n    width: `${cw}px`,\n  };\n}\n\nlet placeRaf = 0;\n/**\n * Re-place after a resize or a scroll — but on the NEXT frame, never inline.\n *\n * ⚠ The explorer decides it is narrow from a ResizeObserver on its own root\n * (FileExplorer.vue, `isNarrow`), and ResizeObserver callbacks run AFTER the\n * frame's rAF callbacks — so neither this `window` listener nor a single rAF\n * has seen the new layout yet. Measured: shrinking 1440 → 390 with the tour\n * open left the spotlight on the navigation panel (the element was still in\n * the DOM when this handler asked for it) both inline and after one frame;\n * only a SECOND resize moved it onto the top bar's button. Two frames plus a\n * tick puts this after the observer has fired and Vue has patched, so the\n * first resize gets the right answer — and the step's sentence, which is\n * chosen from that same element, changes with it.\n */\nfunction onViewportChange() {\n  if (!props.open) return;\n  if (placeRaf) cancelAnimationFrame(placeRaf);\n  placeRaf = requestAnimationFrame(() => {\n    placeRaf = requestAnimationFrame(() => {\n      placeRaf = 0;\n      void nextTick().then(place);\n    });\n  });\n}\n\n// ------------------------------------------------------------------\n// Flow\n// ------------------------------------------------------------------\n\nfunction next() {\n  if (stepIdx.value >= total.value - 1) {\n    emit('close');\n    return;\n  }\n  stepIdx.value += 1;\n}\n\nfunction back() {\n  if (stepIdx.value > 0) stepIdx.value -= 1;\n}\n\nfunction skip() {\n  emit('close');\n}\n\nfunction onKey(e: KeyboardEvent) {\n  if (!props.open) return;\n  if (e.key === 'Escape') {\n    e.stopPropagation();\n    skip();\n  } else if (e.key === 'Enter' || inlineKeyStep(e.key, dir.value) === 1) {\n    // ⚠ RTL: \"forward\" is the arrow that points the way the line reads — ←.\n    e.preventDefault();\n    next();\n  } else if (inlineKeyStep(e.key, dir.value) === -1) {\n    e.preventDefault();\n    back();\n  }\n}\n\nwatch(\n  () => props.open,\n  async (v) => {\n    if (v) {\n      stepIdx.value = 0;\n      resolveSteps();\n      await nextTick();\n      await place();\n      cardEl.value?.focus();\n    }\n  },\n);\n\nwatch(stepIdx, async () => {\n  await place();\n  cardEl.value?.focus();\n});\n\nonMounted(() => {\n  window.addEventListener('resize', onViewportChange);\n  window.addEventListener('scroll', onViewportChange, true);\n});\nonBeforeUnmount(() => {\n  window.removeEventListener('resize', onViewportChange);\n  window.removeEventListener('scroll', onViewportChange, true);\n  if (placeRaf) cancelAnimationFrame(placeRaf);\n});\n\n// Theme cascade outside `.fe` - same pattern as ContextMenu: the OS mode for\n// `auto` from composables/useSystemDark, the one shared listener (#74).\nconst prefersDark = useSystemDark();\nconst themeClass = computed(() => `fe-ctx-backdrop--theme-${props.theme || 'auto'}`);\n</script>\n\n<template>\n  <Teleport to=\"body\">\n    <transition name=\"fe-tour\">\n      <div\n        v-if=\"open && step\"\n        class=\"fe-tour\"\n        :dir=\"dir\"\n        :class=\"themeClass\"\n        :data-prefers-dark=\"prefersDark ? '1' : '0'\"\n        role=\"dialog\"\n        aria-modal=\"true\"\n        :aria-label=\"t('tour.aria')\"\n        @keydown=\"onKey\"\n      >\n        <!-- Spotlight: rounded cutout via huge box-shadow. Centered steps\n             (no target) use a full-dim overlay instead. -->\n        <div\n          v-if=\"spot\"\n          class=\"fe-tour__spot\"\n          :style=\"{\n            top: spot.top + 'px',\n            left: spot.left + 'px',\n            width: spot.width + 'px',\n            height: spot.height + 'px',\n          }\"\n          aria-hidden=\"true\"\n        />\n        <div v-else class=\"fe-tour__dim\" aria-hidden=\"true\" />\n\n        <div\n          ref=\"cardEl\"\n          class=\"fe-tour__card\"\n          :class=\"{ 'fe-tour__card--center': !spot }\"\n          :style=\"spot ? cardStyle : {}\"\n          tabindex=\"-1\"\n        >\n          <p class=\"fe-tour__progress\" aria-hidden=\"true\">\n            {{ t('tour.progress', { n: stepIdx + 1, m: total }) }}\n          </p>\n          <h3 class=\"fe-tour__title\">{{ t(step.titleKey) }}</h3>\n          <p class=\"fe-tour__desc\">{{ stepDesc }}</p>\n          <div class=\"fe-tour__dots\" aria-hidden=\"true\">\n            <span\n              v-for=\"(s, i) in activeSteps\"\n              :key=\"s.id\"\n              class=\"fe-tour__dot\"\n              :class=\"{ 'is-active': i === stepIdx }\"\n            />\n          </div>\n          <div class=\"fe-tour__actions\">\n            <button type=\"button\" class=\"fe-btn fe-tour__skip\" @click=\"skip\">\n              {{ t('tour.skip') }}\n            </button>\n            <span class=\"fe-tour__actions-spacer\" />\n            <button\n              v-if=\"stepIdx > 0\"\n              type=\"button\"\n              class=\"fe-btn\"\n              @click=\"back\"\n            >\n              {{ t('tour.back') }}\n            </button>\n            <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"next\">\n              {{ stepIdx >= total - 1 ? t('tour.done') : t('tour.next') }}\n            </button>\n          </div>\n        </div>\n      </div>\n    </transition>\n  </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * E2eSettingsModal — an unlocked encrypted folder's encryption settings.\n *\n * The encryption LEVEL is a property of the folder (docs/E2E-ENCRYPTION.md →\n * \"Encryption levels\"): chosen when it is encrypted, and changed here, by a\n * deliberate act — never by an offer that pops up after an unlock. The same\n * place holds the folder's other keys: its password and, where the\n * installation has one, the operator's escrow slot.\n *\n * Levels are a list the dialog walks, not three hard-coded buttons.\n *\n * wiring:e2 vault — a vault (level 3) shows its level and nothing to change\n * it: a vault is made new and stays one (no move to another level, no\n * re-key - its folder key derives every key in it, so a new one is a new\n * vault). Its password and escrow slot change as at levels 1 and 2.\n *\n * Collects the choice; every action is the parent's (FileExplorer).\n */\nimport { computed, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { EncryptionLevel } from '../lib/e2ecrypto';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  level: EncryptionLevel;\n  /** A v2 folder that may move from contents to contents + names. */\n  canRaise: boolean;\n  /** Names found in view that were never encrypted (a WebDAV write). */\n  plainNamed: number;\n  /** Escrow: 'n/a' (nothing to do), 'offer' / 'declined' (the way back). */\n  escrowState: 'n/a' | 'offer' | 'declined';\n  busy?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'raise-level'): void;\n  (e: 'fix-names'): void;\n  (e: 'change-password'): void;\n  (e: 'escrow'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst confirming = ref(false);\nconst ack = ref(false);\n\nwatch(\n  () => props.open,\n  (v) => {\n    if (!v) return;\n    confirming.value = false;\n    ack.value = false;\n  },\n);\n\nconst levelLabel = computed(() =>\n  props.level === 'content' ? t('e2e.level.content') : props.level === 'vault' ? t('e2e.level.vault') : t('e2e.level.names'),\n);\nconst levelHint = computed(() =>\n  props.level === 'content'\n    ? t('e2e.level.content_hint')\n    : props.level === 'vault'\n      ? t('e2e.level.vault_hint')\n      : t('e2e.level.names_hint'),\n);\n/** wiring:e2 vault — nothing about a vault's level or keys is changed here. */\nconst isVault = computed(() => props.level === 'vault');\n\nfunction raise() {\n  if (!ack.value || props.busy) return;\n  emit('raise-level');\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('e2e.settings.title')\" size=\"sm\" :busy=\"busy\" @close=\"emit('close')\">\n    <div class=\"fe-e2e-settings\" data-testid=\"e2e-settings\">\n      <section class=\"fe-e2e-settings__section\">\n        <h3 class=\"fe-e2e-settings__head\">{{ t('e2e.settings.level') }}</h3>\n        <p class=\"fe-e2e-settings__value\" data-testid=\"e2e-settings-level\">\n          {{ levelLabel }}<span v-if=\"level === 'pending'\"> - {{ t('e2e.level.pending') }}</span>\n        </p>\n        <p class=\"fe-e2e-settings__hint\">{{ levelHint }}</p>\n\n        <p v-if=\"isVault\" class=\"fe-e2e-settings__hint\" data-testid=\"e2e-settings-vault-fixed\">\n          {{ t('e2e.vault.level_fixed') }}\n        </p>\n        <template v-if=\"canRaise && !isVault\">\n          <button\n            v-if=\"!confirming\"\n            type=\"button\"\n            class=\"fe-btn\"\n            data-testid=\"e2e-settings-raise\"\n            :disabled=\"busy\"\n            @click=\"confirming = true\"\n          >\n            {{ t('e2e.level.change') }}\n          </button>\n          <div v-else class=\"fe-e2e-warn\" role=\"note\" data-testid=\"e2e-settings-raise-confirm\">\n            <strong>{{ t('e2e.level.raise_title') }}</strong>\n            <p>{{ t('e2e.level.raise_body') }}</p>\n            <p>{{ t('e2e.names.offer_cost') }}</p>\n            <label class=\"fe-e2e-ack\">\n              <input v-model=\"ack\" type=\"checkbox\" data-testid=\"e2e-settings-raise-ack\" :disabled=\"busy\" />\n              <span>{{ t('e2e.level.raise_ack') }}</span>\n            </label>\n            <div class=\"fe-e2e-settings__row\">\n              <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"confirming = false\">\n                {{ t('modal.newfolder.cancel') }}\n              </button>\n              <button\n                type=\"button\"\n                class=\"fe-btn fe-btn--primary\"\n                data-testid=\"e2e-settings-raise-go\"\n                :disabled=\"!ack || busy\"\n                @click=\"raise\"\n              >\n                {{ t('e2e.level.raise_go') }}\n              </button>\n            </div>\n          </div>\n        </template>\n        <button\n          v-if=\"level !== 'content' && !isVault && plainNamed > 0\"\n          type=\"button\"\n          class=\"fe-btn\"\n          data-testid=\"e2e-settings-fix-names\"\n          :disabled=\"busy\"\n          @click=\"emit('fix-names')\"\n        >\n          {{ t('e2e.names.strip_fix', { n: plainNamed }) }}\n        </button>\n      </section>\n\n      <section class=\"fe-e2e-settings__section\">\n        <h3 class=\"fe-e2e-settings__head\">{{ t('e2e.settings.password') }}</h3>\n        <button type=\"button\" class=\"fe-btn\" data-testid=\"e2e-password-open\" :disabled=\"busy\" @click=\"emit('change-password')\">\n          {{ t('e2e.password.strip_action') }}\n        </button>\n      </section>\n\n      <section v-if=\"escrowState !== 'n/a'\" class=\"fe-e2e-settings__section\">\n        <h3 class=\"fe-e2e-settings__head\">{{ t('e2e.settings.escrow') }}</h3>\n        <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('escrow')\">\n          {{ t('e2e.escrowoffer.strip_action') }}\n        </button>\n      </section>\n    </div>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">\n        {{ t('e2e.settings.close') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * E2eChangePasswordModal — a new password for an encrypted folder.\n *\n * docs/E2E-ENCRYPTION.md → \"Changing the password\". Two modes:\n *\n *   'change'  asked from the unlocked strip. Proof is the CURRENT password,\n *             or the recovery key instead (\"I do not remember it\").\n *   'reset'   right after an unlock with the recovery key. A recovery key\n *             that was used is a password that was lost or leaked, so a new\n *             one is set before the folder is used. There is no proof field\n *             (the key is in hand), and closing the dialog LOCKS the folder:\n *             the parent answers `close` in this mode by locking.\n *\n * What a change costs is decided by the folder and SAID before anything\n * happens:\n *   - a folder with its own key (every folder since v0.31) re-wraps one key;\n *     no file is touched, the recovery key and escrow keep working;\n *   - a folder from before v0.31 (`needsRekey`) has its key derived from the\n *     password, so every file's key is re-wrapped (the contents stay as they\n *     are), a new recovery key is issued unless the change is made with the\n *     current one, and it can be resumed if interrupted. That needs a tick.\n *   - a folder with its own key may be re-keyed on purpose (`rotate`), when\n *     the old password may be known to someone: the same re-wrap.\n *\n * Collects input and validates its shape; all crypto and every request is\n * the parent's (FileExplorer), which owns the marker and the key ring.\n */\nimport { computed, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { E2E_MIN_PASSWORD_LEN, parseRecoveryKey } from '../lib/e2ecrypto';\nimport Modal from '../modals/Modal.vue';\n\nexport interface E2eChangePasswordPayload {\n  /** Proof: the current password or the recovery key. Empty in 'reset' mode. */\n  proof: { password: string } | { recoveryKey: string } | null;\n  newPassword: string;\n  /** Re-key: re-wrap every file key under a new folder key. */\n  rotate: boolean;\n}\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  mode: 'change' | 'reset';\n  /** The folder's key IS its password's (v1 / fmk: kek): a re-key is required. */\n  needsRekey: boolean;\n  /** The folder has a recovery key slot (the \"use the recovery key\" link). */\n  hasRecovery: boolean;\n  /** The folder has an escrow slot; a re-key carries it over, and says so. */\n  hasEscrow: boolean;\n  busy?: boolean;\n  /** Set by the parent after a failed attempt. */\n  error?: string | null;\n  /** Re-wrap progress, while a re-key runs. */\n  progress?: { done: number; failed: number } | null;\n  /**\n   * wiring:e2 fxe — what gets the new password: an encrypted folder (the\n   * default) or a single encrypted file (`.fxe`). A file's header is all\n   * that changes, it has no folder key to replace, and the words say so.\n   */\n  subject?: 'folder' | 'file';\n  /**\n   * wiring:e2 vault — the folder is a vault: its folder key derives every key\n   * in it, so it is never re-keyed (a new key is a new vault). Only the\n   * password slot changes, and \"re-key on purpose\" is not offered.\n   */\n  vault?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'submit', payload: E2eChangePasswordPayload): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst useRecovery = ref(false);\nconst current = ref('');\nconst recovery = ref('');\nconst pw1 = ref('');\nconst pw2 = ref('');\nconst rotate = ref(false);\nconst ack = ref(false);\nconst err = ref<string | null>(null);\n\nwatch(\n  () => props.open,\n  (v) => {\n    if (!v) return;\n    useRecovery.value = false;\n    current.value = '';\n    recovery.value = '';\n    pw1.value = '';\n    pw2.value = '';\n    rotate.value = false;\n    ack.value = false;\n    err.value = null;\n  },\n);\n\nconst isFile = computed(() => props.subject === 'file');\n/** A re-key is what this change will be. */\nconst rekey = computed(() => !isFile.value && !props.vault && (props.needsRekey || rotate.value));\nconst title = computed(() =>\n  props.mode === 'reset'\n    ? t('e2e.password.reset_title')\n    : isFile.value\n      ? t('e2e.fxe.password_title')\n      : t('e2e.password.title'),\n);\nconst shownError = computed(() => err.value ?? props.error ?? null);\n\nfunction submit() {\n  if (props.busy) return;\n  let proof: E2eChangePasswordPayload['proof'] = null;\n  if (props.mode === 'change') {\n    if (useRecovery.value) {\n      if (!parseRecoveryKey(recovery.value)) {\n        err.value = t('e2e.password.bad_recovery');\n        return;\n      }\n      proof = { recoveryKey: recovery.value };\n    } else {\n      if (!current.value) {\n        err.value = t('e2e.password.current_required');\n        return;\n      }\n      proof = { password: current.value };\n    }\n  }\n  if (pw1.value.length < E2E_MIN_PASSWORD_LEN) {\n    err.value = t('e2e.create.pw_short');\n    return;\n  }\n  if (pw1.value !== pw2.value) {\n    err.value = t('e2e.create.pw_mismatch');\n    return;\n  }\n  if (proof && 'password' in proof && proof.password === pw1.value) {\n    err.value = t('e2e.password.same');\n    return;\n  }\n  if (rekey.value && !ack.value) {\n    err.value = t('e2e.create.ack_required');\n    return;\n  }\n  err.value = null;\n  emit('submit', { proof, newPassword: pw1.value, rotate: rekey.value });\n}\n</script>\n\n<template>\n  <!-- In 'reset' mode a click outside does nothing and × / Escape LOCK the\n       folder (the parent's answer to `close`): a used recovery key is a lost\n       or leaked password, and the folder is not used until it has a new one. -->\n  <Modal\n    :open=\"open\"\n    :title=\"title\"\n    size=\"sm\"\n    :busy=\"busy\"\n    :close-on-backdrop=\"mode !== 'reset'\"\n    @close=\"emit('close')\"\n  >\n    <form class=\"fe-e2e-form\" data-testid=\"e2e-password-form\" @submit.prevent=\"submit\">\n      <p v-if=\"mode === 'reset'\" class=\"fe-e2e-pw__lead\">{{ t('e2e.password.reset_lead') }}</p>\n\n      <template v-if=\"mode === 'change'\">\n        <label v-if=\"!useRecovery\" class=\"fe-field\">\n          <span class=\"fe-field__label\">{{ t('e2e.password.current') }}</span>\n          <input\n            v-model=\"current\"\n            type=\"password\"\n            class=\"fe-input\"\n            autocomplete=\"current-password\"\n            data-testid=\"e2e-password-current\"\n            :disabled=\"busy\"\n          />\n        </label>\n        <label v-else class=\"fe-field\">\n          <span class=\"fe-field__label\">{{ t('e2e.password.recovery') }}</span>\n          <input\n            v-model=\"recovery\"\n            type=\"text\"\n            class=\"fe-input fe-e2e-recover__key\"\n            autocomplete=\"off\"\n            spellcheck=\"false\"\n            :placeholder=\"t('e2e.recover.recovery_placeholder')\"\n            data-testid=\"e2e-password-recovery\"\n            :disabled=\"busy\"\n          />\n        </label>\n        <button\n          v-if=\"hasRecovery\"\n          type=\"button\"\n          class=\"fe-e2e-optlink\"\n          :disabled=\"busy\"\n          @click=\"useRecovery = !useRecovery\"\n        >\n          {{ useRecovery ? t('e2e.password.use_current') : t('e2e.password.use_recovery') }}\n        </button>\n      </template>\n\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('e2e.password.new') }}</span>\n        <input\n          v-model=\"pw1\"\n          type=\"password\"\n          class=\"fe-input\"\n          autocomplete=\"new-password\"\n          :placeholder=\"t('e2e.create.pw_placeholder')\"\n          data-testid=\"e2e-password-new\"\n          :disabled=\"busy\"\n        />\n      </label>\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('e2e.create.pw2_label') }}</span>\n        <input\n          v-model=\"pw2\"\n          type=\"password\"\n          class=\"fe-input\"\n          autocomplete=\"new-password\"\n          data-testid=\"e2e-password-new2\"\n          :disabled=\"busy\"\n          @keydown.enter.prevent=\"submit\"\n        />\n      </label>\n\n      <!-- What it costs, before anything happens. -->\n      <p v-if=\"!rekey\" class=\"fe-e2e-pw__note\" data-testid=\"e2e-password-cost\">\n        {{ isFile ? t('e2e.fxe.password_cost') : t('e2e.password.cheap_note') }}\n      </p>\n      <div v-else class=\"fe-e2e-warn\" role=\"note\" data-testid=\"e2e-password-cost\">\n        <strong>{{ needsRekey ? t('e2e.password.rekey_title') : t('e2e.password.rotate_title') }}</strong>\n        <p>{{ needsRekey ? t('e2e.password.rekey_body') : t('e2e.password.rotate_body') }}</p>\n        <p>{{ mode === 'reset' || useRecovery ? t('e2e.password.rekey_rk_kept') : t('e2e.password.rekey_rk_new') }}</p>\n        <p v-if=\"hasEscrow\">{{ t('e2e.password.rekey_escrow') }}</p>\n      </div>\n      <label v-if=\"!needsRekey && !isFile && !vault\" class=\"fe-e2e-ack\">\n        <input v-model=\"rotate\" type=\"checkbox\" data-testid=\"e2e-password-rotate\" :disabled=\"busy\" />\n        <span>{{ t('e2e.password.rotate_label') }}</span>\n      </label>\n      <label v-if=\"rekey\" class=\"fe-e2e-ack\">\n        <input v-model=\"ack\" type=\"checkbox\" data-testid=\"e2e-password-ack\" :disabled=\"busy\" />\n        <span>{{ t('e2e.password.rekey_ack') }}</span>\n      </label>\n      <p v-if=\"!rekey\" class=\"fe-e2e-pw__note\">{{ isFile ? t('e2e.fxe.password_old_copies') : t('e2e.password.old_copies') }}</p>\n\n      <p v-if=\"progress\" class=\"fe-e2e-upgrade__progress\" role=\"status\" data-testid=\"e2e-password-progress\">\n        {{ t('e2e.password.progress', { n: progress.done, failed: progress.failed }) }}\n      </p>\n      <p v-if=\"shownError\" class=\"fe-form__error\" role=\"alert\" data-testid=\"e2e-password-error\">{{ shownError }}</p>\n    </form>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">\n        {{ mode === 'reset' ? t('e2e.password.lock_instead') : t('modal.newfolder.cancel') }}\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :disabled=\"busy\"\n        data-testid=\"e2e-password-submit\"\n        @click=\"submit\"\n      >\n        {{ busy ? t('e2e.password.busy') : t('e2e.password.submit') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * E2eFileEncryptModal — encrypt ONE file on its own, as a `.fxe`\n * (docs/E2E-ENCRYPTION.md → \"Single encrypted files\").\n *\n * Collects the password twice, whether to hide the file name too, and an\n * explicit acknowledgement; says BEFORE anything happens what the server has\n * already seen of the file and what stays behind (the trash, version history,\n * a thumbnail, backups), and — when the installation has escrow — that its\n * operator holds a key. All crypto and every request is the parent's\n * (useE2eFiles); this dialog never stores the password.\n *\n * An administrator is also offered \"delete the original for good\": its old\n * versions and its trash entry go as soon as the encrypted copy is saved. When\n * the file is not theirs, the dialog names its owner and asks for a second,\n * separate confirmation — deleting someone else's file for good is not a side\n * effect to tick past.\n */\nimport { computed, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { E2E_MIN_PASSWORD_LEN } from '../lib/e2ecrypto';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /** The plain file's name. */\n  fileName: string;\n  busy?: boolean;\n  /** Set by the parent after a failed attempt. */\n  error?: string | null;\n  /** 0–100 while encrypting and uploading. */\n  progress?: number | null;\n  /** The installation's escrow key id, when escrow is on. */\n  escrowKid?: string | null;\n  /** The viewer administers this installation: \"delete for good\" is offered. */\n  canPurge?: boolean;\n  /** The file is not the viewer's (someone else's, or nobody's on record). */\n  notOwner?: boolean;\n  /** Its owner's name, when it has one on record. */\n  ownerName?: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'submit', payload: { password: string; hideName: boolean; purge: boolean }): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst pw1 = ref('');\nconst pw2 = ref('');\nconst hideName = ref(false);\nconst ack = ref(false);\nconst purge = ref(false);\nconst purgeOthersAck = ref(false);\nconst err = ref<string | null>(null);\n\nwatch(\n  () => props.open,\n  (v) => {\n    if (!v) return;\n    pw1.value = '';\n    pw2.value = '';\n    hideName.value = false;\n    ack.value = false;\n    purge.value = false;\n    purgeOthersAck.value = false;\n    err.value = null;\n  },\n);\n\nconst storedExample = computed(() => (hideName.value ? 'encrypted-xxxxxxxx.fxe' : `${props.fileName}.fxe`));\nconst shownError = computed(() => err.value ?? props.error ?? null);\n\nfunction submit() {\n  if (props.busy) return;\n  if (pw1.value.length < E2E_MIN_PASSWORD_LEN) {\n    err.value = t('e2e.create.pw_short');\n    return;\n  }\n  if (pw1.value !== pw2.value) {\n    err.value = t('e2e.create.pw_mismatch');\n    return;\n  }\n  if (!ack.value) {\n    err.value = t('e2e.create.ack_required');\n    return;\n  }\n  const purging = !!props.canPurge && purge.value;\n  if (purging && props.notOwner && !purgeOthersAck.value) {\n    err.value = t('e2e.fxe.purge_others_required');\n    return;\n  }\n  err.value = null;\n  emit('submit', { password: pw1.value, hideName: hideName.value, purge: purging });\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('e2e.fxe.encrypt_title')\" size=\"sm\" :busy=\"busy\" @close=\"emit('close')\">\n    <form class=\"fe-e2e-form\" data-testid=\"fxe-encrypt-form\" @submit.prevent=\"submit\">\n      <p class=\"fe-e2e-rk__lead\">{{ t('e2e.fxe.encrypt_lead', { name: fileName }) }}</p>\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('e2e.fxe.pw_label') }}</span>\n        <input\n          v-model=\"pw1\"\n          type=\"password\"\n          class=\"fe-input\"\n          :placeholder=\"t('e2e.create.pw_placeholder')\"\n          autocomplete=\"new-password\"\n          data-testid=\"fxe-encrypt-pw\"\n          :disabled=\"busy\"\n        />\n      </label>\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('e2e.create.pw2_label') }}</span>\n        <input\n          v-model=\"pw2\"\n          type=\"password\"\n          class=\"fe-input\"\n          autocomplete=\"new-password\"\n          data-testid=\"fxe-encrypt-pw2\"\n          :disabled=\"busy\"\n          @keydown.enter.prevent=\"submit\"\n        />\n      </label>\n      <div class=\"fe-e2e-names\">\n        <label class=\"fe-e2e-ack\">\n          <input v-model=\"hideName\" type=\"checkbox\" :disabled=\"busy\" data-testid=\"fxe-encrypt-hide\" />\n          <span>{{ t('e2e.fxe.hide_label') }}</span>\n        </label>\n        <p class=\"fe-e2e-names__hint\" data-testid=\"fxe-encrypt-hide-hint\">\n          {{ hideName ? t('e2e.fxe.hide_on_hint', { stored: storedExample }) : t('e2e.fxe.hide_off_hint', { stored: storedExample }) }}\n        </p>\n      </div>\n      <!-- What the server already saw. Said before, not after: the original\n           was on the server in the clear, and encrypting a copy does not\n           reach the trash, the version history, a thumbnail or a backup. -->\n      <div class=\"fe-e2e-seen\" role=\"note\" data-testid=\"fxe-encrypt-seen\">\n        <strong>{{ t('e2e.fxe.seen_title') }}</strong>\n        <p>{{ t('e2e.fxe.seen_lead') }}</p>\n        <ul>\n          <li>{{ canPurge ? t('e2e.fxe.seen_trash_admin') : t('e2e.fxe.seen_trash') }}</li>\n          <li>{{ canPurge ? t('e2e.fxe.seen_versions_admin') : t('e2e.fxe.seen_versions') }}</li>\n          <li>{{ t('e2e.fxe.seen_thumb') }}</li>\n          <li>{{ t('e2e.fxe.seen_backups') }}</li>\n        </ul>\n      </div>\n      <!-- An administrator's \"delete for good\". Unticked by default: the\n           trash is how a mistake is undone, and giving that up is a choice. -->\n      <div v-if=\"canPurge\" class=\"fe-e2e-names\" data-testid=\"fxe-encrypt-purge-box\">\n        <label class=\"fe-e2e-ack\">\n          <input v-model=\"purge\" type=\"checkbox\" :disabled=\"busy\" data-testid=\"fxe-encrypt-purge\" />\n          <span>{{ t('e2e.fxe.purge_label') }}</span>\n        </label>\n        <p class=\"fe-e2e-names__hint\">{{ t('e2e.fxe.purge_hint') }}</p>\n        <label v-if=\"purge && notOwner\" class=\"fe-e2e-ack fe-e2e-warn\" data-testid=\"fxe-encrypt-purge-others\">\n          <input v-model=\"purgeOthersAck\" type=\"checkbox\" :disabled=\"busy\" data-testid=\"fxe-encrypt-purge-others-ack\" />\n          <span>{{ ownerName ? t('e2e.fxe.purge_others', { owner: ownerName }) : t('e2e.fxe.purge_others_unknown') }}</span>\n        </label>\n      </div>\n      <div class=\"fe-e2e-warn\" role=\"alert\">\n        <strong>{{ t('e2e.create.warn_title') }}</strong>\n        <p>{{ t('e2e.fxe.warn_body') }}</p>\n      </div>\n      <div v-if=\"escrowKid\" class=\"fe-e2e-rk__escrow\" role=\"note\" data-testid=\"fxe-encrypt-escrow\">\n        <strong>{{ t('e2e.create.escrow_title') }}</strong>\n        <p>{{ t('e2e.fxe.escrow_body') }}</p>\n      </div>\n      <label class=\"fe-e2e-ack\">\n        <input v-model=\"ack\" type=\"checkbox\" :disabled=\"busy\" data-testid=\"fxe-encrypt-ack\" />\n        <span>{{ t('e2e.create.ack') }}</span>\n      </label>\n      <p v-if=\"busy && progress !== null && progress !== undefined\" class=\"fe-e2e-upgrade__progress\" role=\"status\">\n        {{ t('e2e.fxe.encrypt_busy', { percent: progress }) }}\n      </p>\n      <p v-if=\"shownError\" class=\"fe-form__error\" role=\"alert\" data-testid=\"fxe-encrypt-error\">{{ shownError }}</p>\n    </form>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">\n        {{ t('modal.newfolder.cancel') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn fe-btn--primary\" :disabled=\"busy\" data-testid=\"fxe-encrypt-submit\" @click=\"submit\">\n        {{ busy ? t('e2e.fxe.unlock_busy') : t('e2e.fxe.encrypt_submit') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * E2eFileUnlockModal — open, download or un-encrypt a single encrypted file\n * (`.fxe`, docs/E2E-ENCRYPTION.md → \"Single encrypted files\").\n *\n * One dialog, three intents, and the dialog says which:\n *   'open'      the password (or the recovery key), then the viewers;\n *   'download'  the same, then the save;\n *   'remove'    a WARNING first — the plaintext goes back to the server —\n *               and the password, unless the file is already open in this\n *               tab (then only the confirmation is asked).\n *\n * The password is checked in the parent (useE2eFiles), in this browser; this\n * component collects it and validates its shape, and never stores it.\n *\n * Three doors, as on an encrypted folder: the password, the recovery key, and\n * — when this file was sealed to THIS installation's escrow key — the escrow\n * key, whose use tells the file's owner. The dialog says so before the key is\n * pasted, and says why when the installation has escrow but this file does\n * not open with it.\n */\nimport { computed, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { parseRecoveryKey } from '../lib/e2ecrypto';\nimport type { EscrowAvailability } from '../lib/e2ecrypto';\nimport type { FxeIntent } from '../composables/useE2eFiles';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  intent: FxeIntent;\n  /** The name to call the file by (the real one when known). */\n  fileName: string;\n  /** The file is already open in this tab: no password is asked. */\n  known?: boolean;\n  hasRecovery?: boolean;\n  busy?: boolean;\n  error?: string | null;\n  progress?: number | null;\n  /** Unlocked; the browser wants one more click before its save dialog. */\n  needsSave?: boolean;\n  /** Whether the installation's escrow key opens this file (escrowAvailability). */\n  escrowState?: EscrowAvailability;\n  /** The escrow key this file was sealed to. */\n  escrowKid?: string | null;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'submit', payload: { password?: string; recoveryKey?: string; escrowKey?: string }): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst mode = ref<'password' | 'recovery' | 'escrow'>('password');\nconst password = ref('');\nconst recovery = ref('');\nconst escrow = ref('');\nconst err = ref<string | null>(null);\n\nwatch(\n  () => props.open,\n  (v) => {\n    if (!v) return;\n    mode.value = 'password';\n    password.value = '';\n    recovery.value = '';\n    escrow.value = '';\n    err.value = null;\n  },\n);\n\n/** The escrow door is offered only when the key can open THIS file. */\nconst escrowOffered = computed(() => props.escrowState === 'available');\n/** The installation has an escrow key that does not open this file: said in\n *  words, or a missing door reads as a bug. */\nconst escrowNote = computed(() =>\n  props.escrowState === 'predates'\n    ? t('e2e.fxe.escrow_predates')\n    : props.escrowState === 'other-key'\n      ? t('e2e.fxe.escrow_other_key')\n      : null,\n);\n\nconst title = computed(() =>\n  props.intent === 'remove'\n    ? t('e2e.fxe.unlock_title_remove')\n    : props.intent === 'download'\n      ? t('e2e.fxe.unlock_title_download')\n      : t('e2e.fxe.unlock_title_open'),\n);\nconst primary = computed(() =>\n  props.needsSave\n    ? t('e2e.fxe.save_button')\n    : props.intent === 'remove'\n      ? t('e2e.fxe.unlock_remove')\n      : props.intent === 'download'\n        ? t('e2e.fxe.unlock_download')\n        : t('e2e.fxe.unlock_open'),\n);\nconst shownError = computed(() => err.value ?? props.error ?? null);\n\nfunction submit() {\n  if (props.busy) return;\n  err.value = null;\n  if (props.known || props.needsSave) {\n    emit('submit', {});\n    return;\n  }\n  if (mode.value === 'escrow') {\n    if (!escrow.value.trim()) {\n      err.value = t('e2e.recover.escrow_required');\n      return;\n    }\n    emit('submit', { escrowKey: escrow.value });\n    return;\n  }\n  if (mode.value === 'recovery') {\n    if (!parseRecoveryKey(recovery.value)) {\n      err.value = t('e2e.password.bad_recovery');\n      return;\n    }\n    emit('submit', { recoveryKey: recovery.value });\n    return;\n  }\n  if (!password.value) {\n    err.value = t('e2e.password.current_required');\n    return;\n  }\n  emit('submit', { password: password.value });\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"title\" size=\"sm\" :busy=\"busy\" @close=\"emit('close')\">\n    <form class=\"fe-e2e-form\" data-testid=\"fxe-unlock-form\" :data-intent=\"intent\" @submit.prevent=\"submit\">\n      <p class=\"fe-e2e-rk__lead\">{{ t('e2e.fxe.unlock_lead', { name: fileName }) }}</p>\n      <div v-if=\"intent === 'remove'\" class=\"fe-e2e-warn\" role=\"alert\" data-testid=\"fxe-remove-warn\">\n        <strong>{{ t('e2e.fxe.remove_warn_title') }}</strong>\n        <p>{{ t('e2e.fxe.remove_warn_body') }}</p>\n      </div>\n      <p v-if=\"needsSave\" class=\"fe-e2e-pw__note\" role=\"status\" data-testid=\"fxe-unlock-save-again\">\n        {{ t('e2e.fxe.save_again') }}\n      </p>\n      <p v-else-if=\"known\" class=\"fe-e2e-pw__note\">{{ t('e2e.fxe.known_note') }}</p>\n      <template v-else>\n        <label v-if=\"mode === 'password'\" class=\"fe-field\">\n          <span class=\"fe-field__label\">{{ t('e2e.fxe.pw_label') }}</span>\n          <input\n            v-model=\"password\"\n            type=\"password\"\n            class=\"fe-input\"\n            autocomplete=\"current-password\"\n            data-testid=\"fxe-unlock-pw\"\n            :disabled=\"busy\"\n            @keydown.enter.prevent=\"submit\"\n          />\n        </label>\n        <label v-else-if=\"mode === 'recovery'\" class=\"fe-field\">\n          <span class=\"fe-field__label\">{{ t('e2e.password.recovery') }}</span>\n          <input\n            v-model=\"recovery\"\n            type=\"text\"\n            class=\"fe-input fe-e2e-recover__key\"\n            autocomplete=\"off\"\n            spellcheck=\"false\"\n            :placeholder=\"t('e2e.recover.recovery_placeholder')\"\n            data-testid=\"fxe-unlock-recovery\"\n            :disabled=\"busy\"\n            @keydown.enter.prevent=\"submit\"\n          />\n        </label>\n        <template v-else>\n          <div class=\"fe-e2e-warn\" role=\"alert\" data-testid=\"fxe-unlock-escrow-warn\">\n            <strong>{{ t('e2e.fxe.escrow_warn_title') }}</strong>\n            <p>{{ t('e2e.fxe.escrow_warn_body') }}</p>\n            <p v-if=\"escrowKid\">\n              {{ t('e2e.recover.escrow_kid') }}: <code>{{ escrowKid }}</code>\n            </p>\n          </div>\n          <textarea\n            v-model=\"escrow\"\n            class=\"fe-input fe-e2e-recover__escrow\"\n            rows=\"5\"\n            :placeholder=\"t('e2e.recover.escrow_placeholder')\"\n            autocomplete=\"off\"\n            spellcheck=\"false\"\n            data-testid=\"fxe-unlock-escrow\"\n            :disabled=\"busy\"\n          ></textarea>\n        </template>\n        <button\n          v-if=\"mode !== 'password' || hasRecovery !== false\"\n          type=\"button\"\n          class=\"fe-e2e-optlink\"\n          data-testid=\"fxe-unlock-toggle\"\n          :disabled=\"busy\"\n          @click=\"mode = mode === 'password' ? 'recovery' : 'password'\"\n        >\n          {{ mode === 'password' ? t('e2e.password.use_recovery') : t('e2e.fxe.use_password') }}\n        </button>\n        <button\n          v-if=\"escrowOffered && mode !== 'escrow'\"\n          type=\"button\"\n          class=\"fe-e2e-optlink\"\n          data-testid=\"fxe-unlock-escrow-toggle\"\n          :disabled=\"busy\"\n          @click=\"mode = 'escrow'\"\n        >\n          {{ t('e2e.fxe.use_escrow') }}\n        </button>\n        <!-- Said where someone looks for another way in: an operator who knows\n             the installation has escrow, and finds no escrow door here. -->\n        <p v-if=\"escrowNote && mode === 'recovery'\" class=\"fe-e2e-recover__note\" data-testid=\"fxe-unlock-escrow-note\">\n          {{ escrowNote }}\n        </p>\n      </template>\n      <p v-if=\"busy && progress !== null && progress !== undefined\" class=\"fe-e2e-upgrade__progress\" role=\"status\">\n        {{ t('e2e.fxe.progress', { percent: progress }) }}\n      </p>\n      <p v-if=\"shownError\" class=\"fe-form__error\" role=\"alert\" data-testid=\"fxe-unlock-error\">{{ shownError }}</p>\n    </form>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">\n        {{ t('modal.newfolder.cancel') }}\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :class=\"{ 'fe-btn--danger': intent === 'remove' && !needsSave }\"\n        :disabled=\"busy\"\n        data-testid=\"fxe-unlock-submit\"\n        @click=\"submit\"\n      >\n        {{ busy ? t('e2e.fxe.unlock_busy') : primary }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Viewer3D — 3D model preview via `@google/model-viewer`.\n *\n * Lazy-imports the `@google/model-viewer` web component (~80 KB).\n *\n * Format support: model-viewer **only** understands glTF (`.gltf`,\n * `.glb`) and USDZ (iOS). For unsupported formats (`.stl`, `.obj`,\n * `.fbx`, `.3ds`) we deliberately render a download fallback instead\n * of feeding them to model-viewer — earlier code did the latter,\n * which surfaced as `JSON.parse(<ascii STL>)` SyntaxError because\n * model-viewer parses the response body as glTF JSON. (sweep-2026-05-09\n * bugs 19-20.)\n *\n * GLB rendering size: model-viewer mounts its canvas inside a\n * shadow root that doesn't always inherit `height: 100%` from\n * flexbox parents — we pin explicit sizing on the host element\n * to avoid the \"Framebuffer is incomplete: zero size\" warning.\n * (sweep-2026-05-09 bug 21.)\n */\nimport { computed, onMounted, ref, watch } from 'vue';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\n\nconst props = defineProps<{\n  url: string;\n  mime?: string;\n  ext: string;\n  /** Locale-aware error/loading messages. */\n  t?: (key: string) => string;\n}>();\n\nconst SUPPORTED_EXTS = new Set(['glb', 'gltf', 'usdz']);\n\nconst isSupported = computed(() => SUPPORTED_EXTS.has((props.ext || '').toLowerCase()));\n\nconst error = ref<string | null>(null);\nconst ready = ref(false);\n\nasync function load(): Promise<void> {\n  ready.value = false;\n  error.value = null;\n  // Bail out early for formats model-viewer can't parse — feeding\n  // them to <model-viewer> triggers JSON.parse SyntaxError because\n  // it expects glTF JSON.\n  if (!isSupported.value) {\n    error.value = props.t\n      ? props.t('viewer.format_unsupported_3d')\n      : `3D format \".${props.ext}\" not supported in browser preview - please download.`;\n    return;\n  }\n  try {\n    await import(/* @vite-ignore */ '@google/model-viewer');\n    ready.value = true;\n  } catch {\n    error.value = props.t\n      ? props.t('viewer.peer_not_installed')\n      : 'This kind of file cannot be shown here. Download it to open it on your device.';\n  }\n}\n\n/**\n * model-viewer failed to FETCH or PARSE the model.\n *\n * ⚠ `ready` only means the ~80 KB web component imported. The model itself is\n * fetched and decoded by model-viewer AFTER it mounts, and when that throws\n * (a truncated or non-glTF file) it renders an empty canvas and reports the\n * failure only on this event. Without the listener the person got a silent\n * black rectangle and nothing else — measured 2026-09-13 on an 8-byte\n * `turbine.glb`, where the console had `RangeError: Invalid DataView length 12`\n * and the pane had no text at all.\n */\nfunction onModelError(): void {\n  ready.value = false;\n  error.value = props.t ? props.t('viewer.failed_to_load') : 'Failed to load file';\n}\n\nonMounted(load);\n\nwatch(() => props.url, () => {\n  // Re-evaluate on URL change (different file may need different\n  // fallback message).\n  load();\n});\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div class=\"filex-viewer-3d\">\n    <model-viewer\n      v-if=\"ready && !error\"\n      :src=\"url\"\n      auto-rotate\n      camera-controls\n      touch-action=\"pan-y\"\n      shadow-intensity=\"1\"\n      :alt=\"ext + ' model'\"\n      style=\"width: 100%; height: 100%; min-height: 480px; display: block\"\n      @error=\"onModelError\"\n    />\n    <div v-else-if=\"error\" class=\"filex-viewer-fallback\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n      <p>{{ error }}</p>\n    </div>\n    <div v-else class=\"filex-viewer-fallback\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span\n        class=\"filex-viewer-fallback__icon filex-viewer-fallback__icon--spin\"\n        aria-hidden=\"true\"\n        v-html=\"actionIconSvg('progress')\"\n      ></span>\n      <p>{{ t ? t('viewer.loading') : 'Loading…' }}</p>\n    </div>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-3d {\n  width: 100%;\n  height: 100%;\n  min-height: 480px;\n  background: #1a1a1a;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n.filex-viewer-3d model-viewer {\n  width: 100%;\n  height: 100%;\n  min-height: 480px;\n  background: #1a1a1a;\n  display: block;\n}\n.filex-viewer-fallback {\n  text-align: center;\n  color: #c8cdd6;\n  padding: 32px;\n  max-width: 480px;\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { requestFailure } from '../lib/errorWords';\n/**\n * EpubViewer — flowable EPUB reader via `epubjs`.\n *\n * Lazy-imports `epubjs` (~80 KB gzipped). epub.js renders the publication\n * inside an iframe (default `flow: 'paginated'`), but we use it in\n * scrolled-doc mode only when the user toggles the \"fit-width\" flag — by\n * default we keep paginated since that matches reader-app expectations.\n *\n * UX:\n *   - prev/next page buttons (also keyboard arrow keys via composable)\n *   - collapsible TOC sidebar (built from `book.loaded.navigation`)\n *   - font size +/- (Themes API)\n *   - graceful fallback if peer not installed\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\n\nconst props = defineProps<{\n  url: string;\n  mime?: string;\n  ext: string;\n  t?: (key: string) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n}>();\n\ninterface TocNode {\n  href: string;\n  label: string;\n  subitems?: TocNode[];\n}\n\nconst root = ref<HTMLDivElement | null>(null);\nconst containerRef = ref<HTMLDivElement | null>(null);\nconst error = ref<string | null>(null);\nconst toc = ref<TocNode[]>([]);\nconst tocOpen = ref(false);\nconst fontSize = ref(100);\nconst ready = ref(false);\nconst loading = ref(true);\n\nlet book: any = null;\nlet rendition: any = null;\n\n/**\n * How long an epub.js step may hang before we call it a failure.\n *\n * Generous on purpose: a large publication on a slow disk legitimately takes\n * seconds, and a false \"cannot open\" on a book that would have rendered is a\n * worse bug than the one this guards against.\n */\nconst EPUB_STEP_TIMEOUT_MS = 15000;\n\n/** Reject if `p` has not settled within `EPUB_STEP_TIMEOUT_MS`. */\nfunction withTimeout<T>(p: Promise<T>, label: string): Promise<T> {\n  let timer: ReturnType<typeof setTimeout>;\n  return Promise.race([\n    p,\n    new Promise<never>((_, reject) => {\n      timer = setTimeout(\n        () => reject(new Error(`EPUB ${label} timed out after ${EPUB_STEP_TIMEOUT_MS}ms`)),\n        EPUB_STEP_TIMEOUT_MS,\n      );\n    }),\n  ]).finally(() => clearTimeout(timer)) as Promise<T>;\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  ready.value = false;\n  error.value = null;\n  let mod: any = null;\n  try {\n    mod = await import(/* @vite-ignore */ 'epubjs');\n  } catch {\n    error.value = tt('viewer.peer_not_installed', 'This kind of file cannot be shown here. Download it to open it on your device.');\n    loading.value = false;\n    return;\n  }\n  try {\n    const Epub = mod.default ?? mod;\n    // epub.js wants a URL (it then fetches with XHR). When the host\n    // site requires auth headers we have to load the file ourselves\n    // and pass an ArrayBuffer instead.\n    let source: string | ArrayBuffer = props.url;\n    if (props.authHeaders) {\n      const headers = await props.authHeaders();\n      const res = await fetch(props.url, {\n        headers,\n        credentials: props.authCredentials || 'same-origin',\n      });\n      if (!res.ok) throw requestFailure(res.status, await res.text().catch(() => ''), undefined);\n      source = await res.arrayBuffer();\n    }\n    book = Epub(source);\n    if (!containerRef.value) {\n      throw new Error('EPUB mount target missing');\n    }\n    rendition = book.renderTo(containerRef.value, {\n      width: '100%',\n      height: '100%',\n      flow: 'paginated',\n      manager: 'default',\n      // epub.js draws each chapter in a sandboxed frame; scripts in a book\n      // stay off (its default, said out loud so it cannot drift).\n      allowScriptedContent: false,\n    });\n    // ⚠⚠ Both of these have to be raced against a clock. epub.js resolves\n    // `display()` and `loaded.navigation` from its own internal promises, and\n    // when the archive is not a readable EPUB it simply NEVER settles —\n    // neither resolve nor reject — so the `catch` below can't fire and\n    // `finally` never runs. Measured 2026-09-13 on an 8-byte `handbook.epub`:\n    // the pane sat on \"Yükleniyor…\" forever with no error anywhere.\n    await withTimeout(rendition.display(), 'display');\n    rendition.themes.fontSize(fontSize.value + '%');\n    // `<any>` explicitly: `book` is `any`, so without it `T` infers as `{}`\n    // and `nav.toc` stops type-checking.\n    const nav = await withTimeout<any>(book.loaded.navigation, 'navigation');\n    toc.value = (nav?.toc ?? []) as TocNode[];\n    ready.value = true;\n  } catch (err) {\n    // The reader gets the localized sentence; epub.js's own wording (and the\n    // timeout marker) goes to the console for whoever is debugging.\n    console.warn('[filex] EPUB load failed:', err);\n    error.value = tt('viewer.failed_to_load', 'Failed to load file');\n  } finally {\n    loading.value = false;\n  }\n}\n\nfunction next(): void {\n  rendition?.next?.();\n}\nfunction prev(): void {\n  rendition?.prev?.();\n}\nfunction gotoHref(href: string): void {\n  rendition?.display?.(href);\n  tocOpen.value = false;\n}\nfunction bigger(): void {\n  fontSize.value = Math.min(200, fontSize.value + 10);\n  rendition?.themes?.fontSize(fontSize.value + '%');\n}\nfunction smaller(): void {\n  fontSize.value = Math.max(60, fontSize.value - 10);\n  rendition?.themes?.fontSize(fontSize.value + '%');\n}\n\nfunction onKey(ev: KeyboardEvent): void {\n  if (ev.key === 'ArrowRight' || ev.key === 'PageDown') next();\n  else if (ev.key === 'ArrowLeft' || ev.key === 'PageUp') prev();\n}\n\nonMounted(() => {\n  load();\n  window.addEventListener('keydown', onKey);\n});\n\nonBeforeUnmount(() => {\n  window.removeEventListener('keydown', onKey);\n  try {\n    rendition?.destroy?.();\n  } catch {\n    /* ignore */\n  }\n  try {\n    book?.destroy?.();\n  } catch {\n    /* ignore */\n  }\n  rendition = null;\n  book = null;\n});\n\nwatch(\n  () => props.url,\n  () => {\n    if (rendition) {\n      try {\n        rendition.destroy();\n      } catch {\n        /* ignore */\n      }\n    }\n    if (book) {\n      try {\n        book.destroy();\n      } catch {\n        /* ignore */\n      }\n    }\n    book = null;\n    rendition = null;\n    load();\n  },\n);\n\nfunction tt(key: string, fallback: string): string {\n  return props.t ? props.t(key) : fallback;\n}\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div ref=\"root\" class=\"filex-viewer-epub\">\n    <div v-if=\"error\" class=\"filex-viewer-fallback\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n      <p>{{ error }}</p>\n    </div>\n    <template v-else>\n      <div ref=\"containerRef\" class=\"filex-viewer-epub__rendition\" />\n      <div v-if=\"ready\" class=\"filex-viewer-epub__nav\">\n        <button type=\"button\" class=\"filex-viewer-btn\" @click=\"prev\" :disabled=\"!ready\">‹</button>\n        <button type=\"button\" class=\"filex-viewer-btn\" @click=\"next\" :disabled=\"!ready\">›</button>\n      </div>\n      <div v-if=\"loading\" class=\"filex-viewer-epub__loading\">\n        {{ tt('viewer.loading', 'Loading…') }}\n      </div>\n    </template>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-epub__nav {\n  position: absolute;\n  bottom: 12px;\n  left: 50%; /* rtl-physical: centred by translate(-50%) — the same place in both directions */\n  transform: translateX(-50%);\n  display: flex;\n  gap: 8px;\n  padding: 4px 8px;\n  background: var(--fe-bg-elev, rgba(255, 255, 255, 0.9));\n  border: 1px solid var(--fe-border, #e2e6ed);\n  border-radius: 6px;\n  backdrop-filter: blur(4px);\n}\n.filex-viewer-epub {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n  position: relative;\n}\n.filex-viewer-epub__bar {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  padding: 8px 12px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-bottom: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 13px;\n}\n.filex-viewer-spacer { flex: 1; }\n.filex-viewer-epub__fs {\n  display: inline-block;\n  min-width: 40px;\n  text-align: center;\n  font-variant-numeric: tabular-nums;\n  font-size: 12px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-epub__main {\n  flex: 1;\n  min-height: 0;\n  display: flex;\n}\n.filex-viewer-epub__rendition {\n  flex: 1;\n  min-height: 0;\n}\n.filex-viewer-epub__toc {\n  width: 260px;\n  border-inline-end: 1px solid var(--fe-border, #e2e6ed);\n  overflow-y: auto;\n  padding: 12px 0;\n  background: var(--fe-bg-elev, #f7f8fa);\n}\n.filex-viewer-epub__toc ul {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n.filex-viewer-epub__toc-link {\n  display: block;\n  width: 100%;\n  text-align: start;\n  background: transparent;\n  border: 0;\n  padding: 6px 14px;\n  font: inherit;\n  color: inherit;\n  cursor: pointer;\n}\n.filex-viewer-epub__toc-link:hover {\n  background: var(--fe-bg-hover, #edf0f5);\n}\n.filex-viewer-epub__toc-link.is-child {\n  padding-inline-start: 28px;\n  color: var(--fe-text-muted, #5a6475);\n  font-size: 12px;\n}\n.filex-viewer-epub__loading {\n  position: absolute;\n  inset: auto 0 0 0;\n  text-align: center;\n  padding: 6px;\n  background: rgba(0, 0, 0, 0.05);\n  font-size: 12px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n.filex-viewer-btn {\n  border: 1px solid var(--fe-border, #e2e6ed);\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n  padding: 4px 10px;\n  border-radius: 4px;\n  cursor: pointer;\n  font: inherit;\n  font-size: 12px;\n}\n.filex-viewer-btn:hover:not(:disabled) {\n  background: var(--fe-bg-hover, #edf0f5);\n}\n.filex-viewer-btn:disabled {\n  opacity: 0.5;\n  cursor: not-allowed;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { sanitizeHtml } from '../lib/sanitizeHtml';\nimport { sayFailure } from '../lib/errorWords';\n/**\n * MermaidViewer — render a `.mmd` / `.mermaid` source file.\n *\n * Lazy-imports the `mermaid` library (~150 KB gzipped). Source text is\n * fetched from `props.url` (with the auth headers from PreviewModal),\n * then rendered to SVG via `mermaid.render('id', src)`. The resulting\n * SVG node is inserted into a wrapper that supports pan + scale via\n * pure CSS transforms (no extra panzoom dep).\n */\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\nimport { fetchViewerText } from '../composables/useViewerFetch';\n\nconst props = defineProps<{\n  url: string;\n  mime?: string;\n  ext: string;\n  t?: (key: string) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n}>();\n\nconst surface = ref<HTMLDivElement | null>(null);\nconst error = ref<string | null>(null);\nconst loading = ref(true);\nconst scale = ref(1);\nconst tx = ref(0);\nconst ty = ref(0);\n\nlet dragging = false;\nlet dragStart: { x: number; y: number; tx: number; ty: number } | null = null;\nlet renderToken = 0;\n\nlet cachedMermaid: any = null;\nasync function ensureMermaid(): Promise<any | null> {\n  if (cachedMermaid) return cachedMermaid;\n  try {\n    const mod = await import(/* @vite-ignore */ 'mermaid');\n    cachedMermaid = mod.default ?? mod;\n    cachedMermaid.initialize?.({\n      startOnLoad: false,\n      securityLevel: 'strict',\n      theme: window.matchMedia?.('(prefers-color-scheme: dark)').matches\n        ? 'dark'\n        : 'default',\n    });\n    return cachedMermaid;\n  } catch {\n    return null;\n  }\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = null;\n  const myToken = ++renderToken;\n\n  const mermaid = await ensureMermaid();\n  if (myToken !== renderToken) return;\n  if (!mermaid) {\n    error.value = tt('viewer.peer_not_installed', 'This kind of file cannot be shown here. Download it to open it on your device.');\n    loading.value = false;\n    return;\n  }\n\n  let src: string;\n  try {\n    src = await fetchViewerText({\n      url: props.url,\n      headers: (await props.authHeaders?.()) ?? {},\n      credentials: props.authCredentials,\n    });\n  } catch (err) {\n    error.value = sayFailure(err, tt('viewer.failed_to_load', 'Failed to load file'), { t: props.t }).text;\n    loading.value = false;\n    return;\n  }\n\n  if (myToken !== renderToken) return;\n\n  try {\n    const id = `filex-mermaid-${Date.now()}`;\n    const { svg } = await mermaid.render(id, src);\n    if (myToken !== renderToken) return;\n    if (surface.value) {\n      surface.value.innerHTML = sanitizeHtml(svg, 'diagram');\n      const svgEl = surface.value.querySelector('svg');\n      if (svgEl) {\n        svgEl.style.maxWidth = '100%';\n        svgEl.style.height = 'auto';\n      }\n    }\n  } catch (err) {\n    error.value = sayFailure(err, tt('viewer.failed_to_load', 'Failed to load file'), { t: props.t }).text;\n  } finally {\n    loading.value = false;\n  }\n}\n\nfunction zoomIn(): void {\n  scale.value = Math.min(8, scale.value * 1.25);\n}\nfunction zoomOut(): void {\n  scale.value = Math.max(0.2, scale.value / 1.25);\n}\nfunction reset(): void {\n  scale.value = 1;\n  tx.value = 0;\n  ty.value = 0;\n}\n\nfunction onWheel(ev: WheelEvent): void {\n  if (!ev.ctrlKey && !ev.metaKey) return;\n  ev.preventDefault();\n  const delta = -ev.deltaY;\n  const factor = delta > 0 ? 1.1 : 1 / 1.1;\n  scale.value = Math.max(0.2, Math.min(8, scale.value * factor));\n}\n\nfunction onPointerDown(ev: PointerEvent): void {\n  dragging = true;\n  dragStart = { x: ev.clientX, y: ev.clientY, tx: tx.value, ty: ty.value };\n  (ev.target as HTMLElement).setPointerCapture?.(ev.pointerId);\n}\nfunction onPointerMove(ev: PointerEvent): void {\n  if (!dragging || !dragStart) return;\n  tx.value = dragStart.tx + (ev.clientX - dragStart.x);\n  ty.value = dragStart.ty + (ev.clientY - dragStart.y);\n}\nfunction onPointerUp(): void {\n  dragging = false;\n  dragStart = null;\n}\n\nonMounted(load);\nonBeforeUnmount(() => {\n  renderToken++;\n});\n\nfunction tt(key: string, fallback: string): string {\n  return props.t ? props.t(key) : fallback;\n}\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div class=\"filex-viewer-mermaid\">\n    <div\n      class=\"filex-viewer-mermaid__pane\"\n      @wheel=\"onWheel\"\n      @pointerdown=\"onPointerDown\"\n      @pointermove=\"onPointerMove\"\n      @pointerup=\"onPointerUp\"\n      @pointercancel=\"onPointerUp\"\n    >\n      <div\n        v-if=\"error\"\n        class=\"filex-viewer-fallback\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n        <p>{{ error }}</p>\n      </div>\n      <div\n        v-else-if=\"loading\"\n        class=\"filex-viewer-fallback\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span\n        class=\"filex-viewer-fallback__icon filex-viewer-fallback__icon--spin\"\n        aria-hidden=\"true\"\n        v-html=\"actionIconSvg('progress')\"\n      ></span>\n        <p>{{ tt('viewer.loading', 'Loading…') }}</p>\n      </div>\n      <div\n        v-show=\"!loading && !error\"\n        ref=\"surface\"\n        class=\"filex-viewer-mermaid__surface\"\n        :style=\"{ transform: `translate(${tx}px, ${ty}px) scale(${scale})` }\"\n      />\n    </div>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-mermaid {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n}\n.filex-viewer-mermaid__bar {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  padding: 8px 12px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-bottom: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 13px;\n}\n.filex-viewer-mermaid__zoom {\n  min-width: 50px;\n  text-align: center;\n  font-variant-numeric: tabular-nums;\n  font-size: 12px;\n}\n.filex-viewer-mermaid__pane {\n  flex: 1;\n  overflow: hidden;\n  position: relative;\n  cursor: grab;\n  background: var(--fe-bg-elev, #f7f8fa);\n  touch-action: none;\n}\n.filex-viewer-mermaid__pane:active {\n  cursor: grabbing;\n}\n.filex-viewer-mermaid__surface {\n  position: absolute;\n  inset: 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  transform-origin: center center;\n  transition: transform 0.05s linear;\n  user-select: none;\n}\n.filex-viewer-mermaid__surface svg {\n  max-width: 90%;\n  max-height: 90%;\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: var(--fe-text-muted, #5a6475);\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n.filex-viewer-btn {\n  border: 1px solid var(--fe-border, #e2e6ed);\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n  padding: 4px 10px;\n  border-radius: 4px;\n  cursor: pointer;\n  font: inherit;\n  font-size: 12px;\n}\n.filex-viewer-btn:hover:not(:disabled) {\n  background: var(--fe-bg-hover, #edf0f5);\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * DrawioViewer — embed diagrams.net via iframe + postMessage handshake.\n *\n * The diagrams.net embed mode (`?embed=1&proto=json`) handshakes via\n * window.postMessage:\n *\n *   1. iframe sends {event:'init'}                   ← bootstrap\n *   2. parent sends {action:'load', xml}             ← our payload\n *   3. iframe sends {event:'save', xml} on save      ← we POST back\n *\n * No external library required — diagrams.net hosts the entire editor\n * inside the iframe. We just fetch the source XML on mount and route\n * `save` events back to the configured `pdfSaveUrl`-style endpoint\n * (drawio uses the same shape: POST `{path, content}` body).\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\nimport { fetchViewerText } from '../composables/useViewerFetch';\n\nconst props = defineProps<{\n  url: string;\n  filePath: string;\n  ext: string;\n  drawioUrl?: string;\n  /** Optional save endpoint. When unset the iframe stays read-only. */\n  saveUrl?: string;\n  readOnly?: boolean;\n  t?: (key: string) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  /** Could this person set up draw.io (`capabilities.caller_admin`)? Picks\n   *  which sentence the \"not configured\" pane says — see `bootIfReady`. */\n  canConfigure?: boolean;\n}>();\n\n/** The diagram changed (a draft's viewer asks, issue #71: it is how the\n *  page knows there are edits before the browser's leave-page question). */\nconst emit = defineEmits<{ (e: 'change'): void }>();\n\nconst iframeRef = ref<HTMLIFrameElement | null>(null);\nconst error = ref<string | null>(null);\nconst status = ref<'loading' | 'ready' | 'saving' | 'saved' | 'error'>('loading');\nconst readOnly = ref(!!props.readOnly || !props.saveUrl);\n\n// drawioUrl=null is the operator's \"off\" signal — FileExplorer wipes it\n// when the capabilities probe reports drawio offline. Don't silently fall\n// back to the public embed.diagrams.net iframe, that defeats the point of\n// gating: render a \"not configured\" pane instead so the user understands\n// why the editor isn't loading.\n//\n// `drawioBase` MUST be a computed (not a const), otherwise a stale null\n// at mount time (capabilities probe still inflight) gets cached for the\n// component's lifetime — leading to the spurious\n// \"viewer.drawio.disabled\" fallback after the capability flips to \"ok\".\nconst drawioBase = computed<string | null>(() =>\n  props.drawioUrl ? props.drawioUrl.replace(/\\/$/, '') : null,\n);\nconst iframeSrc = computed<string>(() => {\n  if (!drawioBase.value) return '';\n  const params = new URLSearchParams({\n    embed: '1',\n    proto: 'json',\n    spin: '1',\n    saveAndExit: '0',\n    noSaveBtn: readOnly.value ? '1' : '0',\n    noExitBtn: '1',\n    ui: 'kennedy',\n    modified: 'unsavedChanges',\n  });\n  return `${drawioBase.value}/?${params.toString()}`;\n});\n\nlet pendingXml: string = '';\n\nasync function loadXml(): Promise<void> {\n  status.value = 'loading';\n  error.value = null;\n  try {\n    pendingXml = await fetchViewerText({\n      url: props.url,\n      headers: (await props.authHeaders?.()) ?? {},\n      credentials: props.authCredentials,\n    });\n  } catch (err) {\n    /* ⚠ A sentence, never `${status} ${statusText} — <body>` (which is what\n       fetchViewerText's error carries). The detail goes to the console. */\n    console.warn('[filex] diagram could not be read', err);\n    error.value = tt('viewer.drawio.load_failed', 'This diagram could not be read. Download it to open it elsewhere.');\n    disabledPane = false;\n    status.value = 'error';\n  }\n}\n\n/**\n * The origin draw.io is served from: where our messages go, and the only one\n * whose messages are taken. A relative base (a draw.io behind this site's own\n * path) is this site's origin.\n */\nconst drawioOrigin = computed<string | null>(() => {\n  if (!drawioBase.value) return null;\n  try {\n    return new URL(drawioBase.value, window.location.href).origin;\n  } catch {\n    return null;\n  }\n});\n\n/** Only to draw.io's origin: if the frame has been navigated anywhere else,\n *  the diagram is not handed to it. */\nfunction send(msg: unknown): void {\n  const origin = drawioOrigin.value;\n  if (!origin) return;\n  iframeRef.value?.contentWindow?.postMessage(JSON.stringify(msg), origin);\n}\n\n/** Did this message come from OUR draw.io frame, at draw.io's origin? What\n *  the payload says about itself decides nothing: any window that can reach\n *  this one can post `{\"event\":\"save\"}`. */\nfunction fromDrawio(ev: MessageEvent): boolean {\n  const frame = iframeRef.value?.contentWindow;\n  return !!frame && ev.source === frame && !!drawioOrigin.value && ev.origin === drawioOrigin.value;\n}\n\nasync function persist(xml: string): Promise<void> {\n  if (!props.saveUrl) return;\n  status.value = 'saving';\n  try {\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n      ...((await props.authHeaders?.()) ?? {}),\n    };\n    const res = await fetch(props.saveUrl, {\n      method: 'POST',\n      headers,\n      credentials: props.authCredentials || 'same-origin',\n      body: JSON.stringify({ path: props.filePath, content: xml }),\n    });\n    if (!res.ok) {\n      /* ⚠ Never the HTTP layer on screen (\"503 Service Unavailable\" is what\n         this used to say when a save could not take its version snapshot). */\n      console.warn('[filex] diagram save failed', res.status, res.statusText);\n      throw new Error('save');\n    }\n    status.value = 'saved';\n    setTimeout(() => {\n      if (status.value === 'saved') status.value = 'ready';\n    }, 2500);\n  } catch (err) {\n    console.warn('[filex] diagram save failed', err);\n    error.value = tt('viewer.drawio.save_failed', 'The diagram could not be saved. Your changes are still in the editor - try again.');\n    disabledPane = false;\n    status.value = 'error';\n  }\n}\n\nfunction onMessage(ev: MessageEvent): void {\n  if (!fromDrawio(ev)) return;\n  if (typeof ev.data !== 'string' || ev.data.length === 0) return;\n  // Drawio messages always start with '{' or '<'. Ignore anything else\n  // (devtools / unrelated postMessage senders inside the same window).\n  const first = ev.data[0];\n  if (first !== '{' && first !== '<') return;\n  let payload: any;\n  try {\n    payload = JSON.parse(ev.data);\n  } catch {\n    return;\n  }\n  if (!payload || typeof payload !== 'object') return;\n  switch (payload.event) {\n    case 'init':\n      send({\n        action: 'load',\n        xml: pendingXml,\n        autosave: 0,\n      });\n      status.value = 'ready';\n      break;\n    case 'save':\n      if (typeof payload.xml === 'string') {\n        emit('change');\n        persist(payload.xml);\n      }\n      break;\n    case 'export':\n      // Could persist a PNG/SVG render; out of V1 scope.\n      break;\n    case 'autosave':\n      if (typeof payload.xml === 'string' && !readOnly.value) {\n        emit('change');\n        persist(payload.xml);\n      }\n      break;\n    default:\n      break;\n  }\n}\n\n/** Is the pane on screen the \"not configured\" one (so a later answer that\n *  draw.io IS there can clear it)? A flag, not a comparison with the text:\n *  the text now depends on who is looking. */\nlet disabledPane = false;\n\nfunction bootIfReady(): void {\n  if (!drawioBase.value) {\n    /* The owner's rule for a missing service (2026-09-21): whoever can fix\n       it is told where; everybody else is told what they can do instead.\n       ⚠ The old sentence named an ENVIRONMENT VARIABLE to every reader —\n       \"operator must wire FILEX_DRAWIO_URL\" — which is a riddle to a person\n       who only wanted to look at a diagram. */\n    error.value = props.canConfigure\n      ? tt('viewer.drawio.disabled_admin', 'draw.io is not set up on this server. Set it up in the admin panel under External services.')\n      : tt('viewer.drawio.disabled', 'Diagrams cannot be opened here: this server has no draw.io. Download the file to open it elsewhere.');\n    disabledPane = true;\n    status.value = 'error';\n    return;\n  }\n  // Clear a previous \"disabled\" pane in case the prop just became available\n  // (capability probe finished after mount).\n  if (disabledPane) {\n    disabledPane = false;\n    error.value = null;\n    status.value = 'loading';\n  }\n  loadXml();\n}\n\nonMounted(() => {\n  window.addEventListener('message', onMessage);\n  bootIfReady();\n});\n\nwatch(() => props.drawioUrl, bootIfReady);\n\nonBeforeUnmount(() => {\n  window.removeEventListener('message', onMessage);\n});\n\nfunction tt(key: string, fallback: string): string {\n  return props.t ? props.t(key) : fallback;\n}\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div class=\"filex-viewer-drawio\">\n    <div v-if=\"error\" class=\"filex-viewer-fallback\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n      <p>{{ error }}</p>\n    </div>\n    <iframe\n      v-else\n      ref=\"iframeRef\"\n      :src=\"iframeSrc\"\n      class=\"filex-viewer-drawio__frame\"\n      title=\"draw.io\"\n    />\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-drawio {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n}\n.filex-viewer-drawio__bar {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  padding: 6px 12px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-bottom: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 12px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-drawio__status[data-state=\"error\"] { color: var(--fe-danger, #dc2626); }\n.filex-viewer-drawio__status[data-state=\"saved\"] { color: #059669; }\n.filex-viewer-drawio__readonly {\n  font-style: italic;\n  margin-inline-start: auto;\n}\n.filex-viewer-drawio__frame {\n  flex: 1;\n  width: 100%;\n  border: 0;\n  background: #fafafa;\n  min-height: 0;\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { sayFailure } from '../lib/errorWords';\n/**\n * TiffViewer — multi-page TIFF preview via `utif`.\n *\n * Lazy-imports `utif` (~50 KB). Decodes IFDs once, paints the active\n * page to a `<canvas>` via `UTIF.toRGBA8`. Page navigation (1/N) +\n * zoom in/out controls. Browser <img> can't render TIFF natively, so\n * the canvas pipeline is the only option short of server-side\n * conversion.\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\nimport { fetchViewerArrayBuffer } from '../composables/useViewerFetch';\n\nconst props = defineProps<{\n  url: string;\n  mime?: string;\n  ext: string;\n  t?: (key: string) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n}>();\n\nconst canvasEl = ref<HTMLCanvasElement | null>(null);\nconst error = ref<string | null>(null);\nconst loading = ref(true);\nconst scale = ref(1);\nconst pageIndex = ref(0);\nconst pageCount = ref(0);\nconst pageDims = ref<{ width: number; height: number }>({ width: 0, height: 0 });\n\nlet UTIF: any = null;\nlet ifds: any[] | null = null;\nlet renderToken = 0;\n\nasync function ensureUtif(): Promise<any | null> {\n  if (UTIF) return UTIF;\n  try {\n    const mod = await import(/* @vite-ignore */ 'utif');\n    UTIF = mod.default ?? mod;\n    return UTIF;\n  } catch {\n    return null;\n  }\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = null;\n  ifds = null;\n  pageIndex.value = 0;\n  pageCount.value = 0;\n  const myToken = ++renderToken;\n\n  const lib = await ensureUtif();\n  if (myToken !== renderToken) return;\n  if (!lib) {\n    error.value = tt('viewer.peer_not_installed', 'This kind of file cannot be shown here. Download it to open it on your device.');\n    loading.value = false;\n    return;\n  }\n\n  try {\n    const buf = await fetchViewerArrayBuffer({\n      url: props.url,\n      headers: (await props.authHeaders?.()) ?? {},\n      credentials: props.authCredentials,\n    });\n    if (myToken !== renderToken) return;\n    ifds = lib.decode(buf);\n    pageCount.value = ifds?.length ?? 0;\n    if (pageCount.value === 0) {\n      throw new Error('No pages decoded');\n    }\n    paint();\n  } catch (err) {\n    error.value = sayFailure(err, tt('viewer.failed_to_load', 'Failed to load file'), { t: props.t }).text;\n  } finally {\n    loading.value = false;\n  }\n}\n\nfunction paint(): void {\n  if (!UTIF || !ifds || !canvasEl.value) return;\n  const idx = Math.max(0, Math.min(pageIndex.value, ifds.length - 1));\n  const ifd = ifds[idx];\n  try {\n    UTIF.decodeImage(undefined, ifd);\n  } catch {\n    // some images already decoded — UTIF.decodeImage is idempotent on\n    // older versions.\n  }\n  const rgba = UTIF.toRGBA8(ifd);\n  const w = ifd.width;\n  const h = ifd.height;\n  pageDims.value = { width: w, height: h };\n  const canvas = canvasEl.value;\n  canvas.width = w;\n  canvas.height = h;\n  const ctx = canvas.getContext('2d');\n  if (!ctx) return;\n  const imageData = ctx.createImageData(w, h);\n  imageData.data.set(rgba);\n  ctx.putImageData(imageData, 0, 0);\n}\n\nfunction next(): void {\n  if (pageIndex.value < pageCount.value - 1) {\n    pageIndex.value++;\n    paint();\n  }\n}\nfunction prev(): void {\n  if (pageIndex.value > 0) {\n    pageIndex.value--;\n    paint();\n  }\n}\nfunction zoomIn(): void {\n  scale.value = Math.min(8, scale.value * 1.25);\n}\nfunction zoomOut(): void {\n  scale.value = Math.max(0.1, scale.value / 1.25);\n}\nfunction reset(): void {\n  scale.value = 1;\n}\n\nonMounted(load);\nonBeforeUnmount(() => {\n  renderToken++;\n  ifds = null;\n});\n\nwatch(() => props.url, load);\n\nconst pageLabel = computed(() => {\n  const m = (props.t && props.t('viewer.page_n_of_m')) || 'Page {n} of {m}';\n  return m.replace('{n}', String(pageIndex.value + 1)).replace('{m}', String(pageCount.value));\n});\n\nfunction tt(key: string, fallback: string): string {\n  return props.t ? props.t(key) : fallback;\n}\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div class=\"filex-viewer-tiff\">\n    <div class=\"filex-viewer-tiff__pane\">\n      <div v-if=\"error\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n        <p>{{ error }}</p>\n      </div>\n      <div v-else-if=\"loading\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span\n        class=\"filex-viewer-fallback__icon filex-viewer-fallback__icon--spin\"\n        aria-hidden=\"true\"\n        v-html=\"actionIconSvg('progress')\"\n      ></span>\n        <p>{{ tt('viewer.loading', 'Loading…') }}</p>\n      </div>\n      <canvas\n        v-show=\"!loading && !error\"\n        ref=\"canvasEl\"\n        :style=\"{ imageRendering: 'pixelated' }\"\n      />\n      <div v-if=\"!loading && !error && pageCount > 1\" class=\"filex-viewer-tiff__pager\">\n        <button\n          type=\"button\"\n          class=\"filex-viewer-btn\"\n          :disabled=\"pageIndex === 0\"\n          @click=\"prev\"\n        >‹</button>\n        <span class=\"filex-viewer-tiff__pages\">{{ pageLabel }}</span>\n        <button\n          type=\"button\"\n          class=\"filex-viewer-btn\"\n          :disabled=\"pageIndex >= pageCount - 1\"\n          @click=\"next\"\n        >›</button>\n      </div>\n    </div>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-tiff__pager {\n  position: absolute;\n  bottom: 12px;\n  left: 50%; /* rtl-physical: centred by translate(-50%) — the same place in both directions */\n  transform: translateX(-50%);\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  padding: 4px 8px;\n  background: var(--fe-bg-elev, rgba(255, 255, 255, 0.9));\n  border: 1px solid var(--fe-border, #e2e6ed);\n  border-radius: 6px;\n  backdrop-filter: blur(4px);\n}\n.filex-viewer-tiff__pages {\n  font-size: 12px;\n  font-variant-numeric: tabular-nums;\n}\n.filex-viewer-tiff {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n}\n.filex-viewer-tiff__bar {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  padding: 8px 12px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-bottom: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 13px;\n}\n.filex-viewer-tiff__pages {\n  min-width: 110px;\n  text-align: center;\n  font-variant-numeric: tabular-nums;\n  font-size: 12px;\n}\n.filex-viewer-tiff__zoom {\n  min-width: 50px;\n  text-align: center;\n  font-variant-numeric: tabular-nums;\n  font-size: 12px;\n}\n.filex-viewer-spacer { flex: 1; }\n.filex-viewer-tiff__pane {\n  flex: 1;\n  overflow: auto;\n  padding: 16px;\n  background: #2a2d33;\n  display: flex;\n  align-items: flex-start;\n  justify-content: flex-start;\n}\n.filex-viewer-tiff__pane canvas {\n  background: #fff;\n  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: #c8cdd6;\n  margin: auto;\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n.filex-viewer-btn {\n  border: 1px solid var(--fe-border, #e2e6ed);\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n  padding: 4px 10px;\n  border-radius: 4px;\n  cursor: pointer;\n  font: inherit;\n  font-size: 12px;\n}\n.filex-viewer-btn:hover:not(:disabled) {\n  background: var(--fe-bg-hover, #edf0f5);\n}\n.filex-viewer-btn:disabled {\n  opacity: 0.4;\n  cursor: not-allowed;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * PsdViewer — Photoshop document preview via `ag-psd`.\n *\n * Lazy-imports `ag-psd` (~150 KB). Renders the flattened composite to\n * a canvas via `psd.canvas`. A simple layer panel toggles the rendered\n * preview (V1: just lists names + visibility; full composite swap on\n * toggle requires re-rendering with `applyOpacity`/`composite` logic\n * — left as TODO for V2 since `ag-psd` doesn't ship a composite\n * pipeline of its own).\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\nimport { fetchViewerArrayBuffer } from '../composables/useViewerFetch';\n\nconst props = defineProps<{\n  url: string;\n  mime?: string;\n  ext: string;\n  t?: (key: string) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n}>();\n\ninterface FlatLayer {\n  index: number;\n  name: string;\n  hidden: boolean;\n}\n\nconst canvasEl = ref<HTMLCanvasElement | null>(null);\nconst layers = ref<FlatLayer[]>([]);\nconst error = ref<string | null>(null);\nconst loading = ref(true);\nconst showLayerPanel = ref(false);\nconst dims = ref<{ width: number; height: number }>({ width: 0, height: 0 });\nconst scale = ref(1);\n\nlet renderToken = 0;\n\nlet agPsd: any = null;\nasync function ensureAgPsd(): Promise<any | null> {\n  if (agPsd) return agPsd;\n  try {\n    const mod = await import(/* @vite-ignore */ 'ag-psd');\n    agPsd = mod;\n    return agPsd;\n  } catch {\n    return null;\n  }\n}\n\nfunction flattenLayers(node: any, list: FlatLayer[]): void {\n  if (!node) return;\n  if (Array.isArray(node.children)) {\n    for (const child of node.children) {\n      list.push({\n        index: list.length,\n        name: child.name ?? '(unnamed)',\n        hidden: !!child.hidden,\n      });\n      if (child.children) flattenLayers(child, list);\n    }\n  }\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = null;\n  layers.value = [];\n  const myToken = ++renderToken;\n\n  const lib = await ensureAgPsd();\n  if (myToken !== renderToken) return;\n  if (!lib) {\n    error.value = tt('viewer.peer_not_installed', 'This kind of file cannot be shown here. Download it to open it on your device.');\n    loading.value = false;\n    return;\n  }\n\n  try {\n    const buf = await fetchViewerArrayBuffer({\n      url: props.url,\n      headers: (await props.authHeaders?.()) ?? {},\n      credentials: props.authCredentials,\n    });\n    if (myToken !== renderToken) return;\n    const psd = lib.readPsd(buf, {\n      skipLayerImageData: false,\n      skipCompositeImageData: false,\n      skipThumbnail: true,\n    });\n    dims.value = { width: psd.width, height: psd.height };\n\n    const composite = psd.canvas;\n    if (composite && canvasEl.value) {\n      const target = canvasEl.value;\n      target.width = psd.width;\n      target.height = psd.height;\n      const ctx = target.getContext('2d');\n      ctx?.drawImage(composite, 0, 0);\n    } else {\n      throw new Error('PSD has no composite image (skipCompositeImageData?)');\n    }\n\n    const flat: FlatLayer[] = [];\n    flattenLayers(psd, flat);\n    layers.value = flat;\n  } catch (err) {\n    // ⚠ The person gets the localized sentence; the decoder's own words go to\n    // the console for whoever is debugging. `ag-psd` throws raw internals\n    // (\"Offset is outside the bounds of the DataView\" on a truncated file),\n    // and printing that verbatim put an untranslated English stack message in\n    // the middle of a Turkish UI — measured 2026-09-13 on a 6-byte\n    // `mockup.psd`.\n    console.warn('[filex] PSD decode failed:', err);\n    error.value = tt('viewer.failed_to_load', 'Failed to load file');\n  } finally {\n    loading.value = false;\n  }\n}\n\nfunction zoomIn(): void {\n  scale.value = Math.min(8, scale.value * 1.25);\n}\nfunction zoomOut(): void {\n  scale.value = Math.max(0.1, scale.value / 1.25);\n}\nfunction reset(): void {\n  scale.value = 1;\n}\n\nonMounted(load);\nonBeforeUnmount(() => {\n  renderToken++;\n});\nwatch(() => props.url, load);\n\nfunction tt(key: string, fallback: string): string {\n  return props.t ? props.t(key) : fallback;\n}\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div class=\"filex-viewer-psd\">\n    <div class=\"filex-viewer-psd__pane\">\n      <div v-if=\"error\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n        <p>{{ error }}</p>\n      </div>\n      <div v-else-if=\"loading\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span\n        class=\"filex-viewer-fallback__icon filex-viewer-fallback__icon--spin\"\n        aria-hidden=\"true\"\n        v-html=\"actionIconSvg('progress')\"\n      ></span>\n        <p>{{ tt('viewer.loading', 'Loading…') }}</p>\n      </div>\n      <canvas\n        v-show=\"!loading && !error\"\n        ref=\"canvasEl\"\n      />\n    </div>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-psd {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n}\n.filex-viewer-psd__bar {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  padding: 8px 12px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-bottom: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 13px;\n}\n.filex-viewer-spacer { flex: 1; }\n.filex-viewer-psd__dim {\n  font-size: 12px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-psd__zoom {\n  min-width: 50px;\n  text-align: center;\n  font-variant-numeric: tabular-nums;\n  font-size: 12px;\n}\n.filex-viewer-psd__main {\n  flex: 1;\n  display: flex;\n  min-height: 0;\n}\n.filex-viewer-psd__layers {\n  width: 240px;\n  border-inline-end: 1px solid var(--fe-border, #e2e6ed);\n  overflow-y: auto;\n  padding: 8px 0;\n  background: var(--fe-bg-elev, #f7f8fa);\n}\n.filex-viewer-psd__layers ul {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n.filex-viewer-psd__layers li {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  padding: 4px 12px;\n  font-size: 12px;\n}\n.filex-viewer-psd__layer-vis {\n  width: 14px;\n  text-align: center;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-psd__layer-vis[data-hidden=\"1\"] { color: var(--fe-border-strong, #c7ced9); }\n.filex-viewer-psd__layer-name {\n  flex: 1;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.filex-viewer-psd__pane {\n  flex: 1;\n  overflow: auto;\n  padding: 16px;\n  background: #2a2d33;\n  display: flex;\n  align-items: flex-start;\n  justify-content: flex-start;\n}\n.filex-viewer-psd__pane canvas {\n  background: #fff\n    repeating-conic-gradient(#e0e0e0 0% 25%, transparent 0% 50%) 50% / 16px 16px;\n  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: #c8cdd6;\n  margin: auto;\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n.filex-viewer-btn {\n  border: 1px solid var(--fe-border, #e2e6ed);\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n  padding: 4px 10px;\n  border-radius: 4px;\n  cursor: pointer;\n  font: inherit;\n  font-size: 12px;\n}\n.filex-viewer-btn:hover:not(:disabled) {\n  background: var(--fe-bg-hover, #edf0f5);\n}\n.filex-viewer-btn.is-active {\n  background: var(--fe-bg-selected, #dfe8ff);\n  border-color: var(--fe-primary, #3b82f6);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { sayFailure } from '../lib/errorWords';\n/**\n * IpynbViewer — Jupyter notebook (.ipynb JSON) renderer.\n *\n * Pure-JS render — no peer dependency required:\n *   - code cells     → `<pre><code>` (highlight.js when available)\n *   - markdown cells → markdown-it when available, plain `<pre>` otherwise\n *   - output cells   → text (stream / display_data 'text/plain'),\n *                      images (display_data 'image/png' base64),\n *                      HTML (display_data 'text/html')\n *\n * Every piece of markup (highlighted code, rendered Markdown, an HTML output)\n * goes through the one preview sanitizer (lib/sanitizeHtml.ts) before v-html.\n *\n * Source list / output count counters at the top so a 200-cell\n * notebook doesn't surprise the user.\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\nimport { fetchViewerText } from '../composables/useViewerFetch';\nimport { sanitizeHtml } from '../lib/sanitizeHtml';\nimport { ensureHighlight } from '../composables/useMonacoLoader';\n\nconst props = defineProps<{\n  url: string;\n  ext: string;\n  t?: (key: string) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n}>();\n\ninterface Cell {\n  cell_type: 'code' | 'markdown' | 'raw' | string;\n  source: string | string[];\n  outputs?: any[];\n  execution_count?: number | null;\n  metadata?: Record<string, unknown>;\n}\n\ninterface Notebook {\n  cells: Cell[];\n  metadata?: { kernelspec?: { language?: string; name?: string } };\n}\n\nconst cells = ref<Cell[]>([]);\nconst language = ref<string>('python');\nconst error = ref<string | null>(null);\nconst loading = ref(true);\nconst renderedSources = ref<Map<number, string>>(new Map());\nconst renderedMarkdown = ref<Map<number, string>>(new Map());\n\nlet renderToken = 0;\nlet highlight: any = null;\nlet mdRenderer: any = null;\n\nasync function ensureMd(): Promise<any | null> {\n  if (mdRenderer !== null) return mdRenderer || null;\n  try {\n    const mod = await import(/* @vite-ignore */ 'markdown-it');\n    const Md = (mod as any).default ?? mod;\n    mdRenderer = new Md({ html: false, linkify: true, breaks: true });\n    return mdRenderer;\n  } catch {\n    mdRenderer = false;\n    return null;\n  }\n}\n\nfunction joinSource(source: string | string[]): string {\n  return Array.isArray(source) ? source.join('') : (source ?? '');\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = null;\n  cells.value = [];\n  renderedSources.value = new Map();\n  renderedMarkdown.value = new Map();\n  const myToken = ++renderToken;\n\n  let raw: string;\n  try {\n    raw = await fetchViewerText({\n      url: props.url,\n      headers: (await props.authHeaders?.()) ?? {},\n      credentials: props.authCredentials,\n    });\n  } catch (err) {\n    error.value = sayFailure(err, tt('viewer.failed_to_load', 'Failed to load file'), { t: props.t }).text;\n    loading.value = false;\n    return;\n  }\n\n  if (myToken !== renderToken) return;\n\n  let nb: Notebook;\n  try {\n    nb = JSON.parse(raw);\n  } catch (err) {\n    error.value = 'Invalid notebook JSON';\n    loading.value = false;\n    return;\n  }\n  cells.value = Array.isArray(nb.cells) ? nb.cells : [];\n  language.value = nb.metadata?.kernelspec?.language || 'python';\n\n  // Best-effort hljs highlight per code cell.\n  highlight = (await ensureHighlight()) as any;\n  if (myToken !== renderToken) return;\n  if (highlight) {\n    const hljs = highlight.default ?? highlight;\n    const langOk = hljs.getLanguage?.(language.value) ? language.value : null;\n    cells.value.forEach((cell, idx) => {\n      if (cell.cell_type === 'code') {\n        const text = joinSource(cell.source);\n        try {\n          const result = langOk\n            ? hljs.highlight(text, { language: langOk, ignoreIllegals: true })\n            : hljs.highlightAuto(text);\n          renderedSources.value.set(idx, sanitizeHtml(result.value, 'code'));\n        } catch {\n          /* leave unrendered */\n        }\n      }\n    });\n  }\n\n  const md = await ensureMd();\n  if (myToken !== renderToken) return;\n  if (md) {\n    cells.value.forEach((cell, idx) => {\n      if (cell.cell_type === 'markdown') {\n        try {\n          renderedMarkdown.value.set(idx, sanitizeHtml(md.render(joinSource(cell.source)), 'document'));\n        } catch {\n          /* leave plain */\n        }\n      }\n    });\n  }\n\n  loading.value = false;\n}\n\nfunction outputText(out: any): string | null {\n  if (!out) return null;\n  if (out.output_type === 'stream') {\n    return joinSource(out.text);\n  }\n  if (out.output_type === 'error') {\n    return [out.ename, out.evalue, ...(out.traceback || [])]\n      .filter(Boolean)\n      .join('\\n');\n  }\n  if (out.output_type === 'execute_result' || out.output_type === 'display_data') {\n    if (out.data?.['text/plain']) {\n      return joinSource(out.data['text/plain']);\n    }\n  }\n  return null;\n}\n\nfunction outputImage(out: any): string | null {\n  if (!out?.data) return null;\n  if (out.data['image/png']) return `data:image/png;base64,${out.data['image/png']}`;\n  if (out.data['image/jpeg']) return `data:image/jpeg;base64,${out.data['image/jpeg']}`;\n  if (out.data['image/svg+xml']) {\n    const svg = joinSource(out.data['image/svg+xml']);\n    return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`;\n  }\n  return null;\n}\n\nfunction outputHtml(out: any): string | null {\n  if (!out?.data) return null;\n  if (out.data['text/html']) {\n    // An output from an arbitrary notebook: drawn only after the document\n    // sanitizer has taken out everything that could run, fetch or submit.\n    return sanitizeHtml(joinSource(out.data['text/html']), 'document');\n  }\n  return null;\n}\n\nonMounted(load);\nonBeforeUnmount(() => {\n  renderToken++;\n});\nwatch(() => props.url, load);\n\nconst stats = computed(() => {\n  const codeCount = cells.value.filter((c) => c.cell_type === 'code').length;\n  const mdCount = cells.value.filter((c) => c.cell_type === 'markdown').length;\n  return { code: codeCount, md: mdCount, total: cells.value.length };\n});\n\nfunction tt(key: string, fallback: string): string {\n  return props.t ? props.t(key) : fallback;\n}\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div class=\"filex-viewer-ipynb\">\n    <div class=\"filex-viewer-ipynb__pane\">\n      <div v-if=\"error\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n        <p>{{ error }}</p>\n      </div>\n      <div v-else-if=\"loading\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span\n        class=\"filex-viewer-fallback__icon filex-viewer-fallback__icon--spin\"\n        aria-hidden=\"true\"\n        v-html=\"actionIconSvg('progress')\"\n      ></span>\n        <p>{{ tt('viewer.loading', 'Loading…') }}</p>\n      </div>\n      <div v-else>\n        <div\n          v-for=\"(cell, idx) in cells\"\n          :key=\"idx\"\n          class=\"filex-viewer-ipynb__cell\"\n          :data-type=\"cell.cell_type\"\n        >\n          <template v-if=\"cell.cell_type === 'code'\">\n            <div class=\"filex-viewer-ipynb__exec\">\n              In [{{ cell.execution_count ?? ' ' }}]:\n            </div>\n            <pre class=\"filex-viewer-ipynb__src hljs\"><code\n              v-if=\"renderedSources.get(idx)\"\n              v-html=\"renderedSources.get(idx)\"\n            /><code v-else>{{ joinSource(cell.source) }}</code></pre>\n            <div v-if=\"cell.outputs && cell.outputs.length\" class=\"filex-viewer-ipynb__outputs\">\n              <template v-for=\"(out, j) in cell.outputs\" :key=\"j\">\n                <img\n                  v-if=\"outputImage(out)\"\n                  :src=\"outputImage(out) || ''\"\n                  class=\"filex-viewer-ipynb__img\"\n                  :alt=\"`output ${j}`\"\n                />\n                <div\n                  v-else-if=\"outputHtml(out)\"\n                  class=\"filex-viewer-ipynb__html\"\n                  v-html=\"outputHtml(out)\"\n                />\n                <pre\n                  v-else-if=\"outputText(out)\"\n                  class=\"filex-viewer-ipynb__out\"\n                  :data-type=\"out.output_type\"\n                >{{ outputText(out) }}</pre>\n              </template>\n            </div>\n          </template>\n\n          <template v-else-if=\"cell.cell_type === 'markdown'\">\n            <div\n              v-if=\"renderedMarkdown.get(idx)\"\n              class=\"filex-viewer-ipynb__md\"\n              dir=\"auto\"\n              v-html=\"renderedMarkdown.get(idx)\"\n            />\n            <pre v-else class=\"filex-viewer-ipynb__md-raw\">{{ joinSource(cell.source) }}</pre>\n          </template>\n\n          <template v-else>\n            <pre class=\"filex-viewer-ipynb__src\">{{ joinSource(cell.source) }}</pre>\n          </template>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-ipynb {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n}\n.filex-viewer-ipynb__bar {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  padding: 8px 12px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-bottom: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 12px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-ipynb__lang {\n  font-family: var(--fe-font-mono, monospace);\n  text-transform: uppercase;\n  letter-spacing: 0.04em;\n}\n.filex-viewer-ipynb__pane {\n  flex: 1;\n  overflow: auto;\n  padding: 16px 24px;\n}\n.filex-viewer-ipynb__cell {\n  border: 1px solid var(--fe-border, #e2e6ed);\n  border-radius: 6px;\n  margin-bottom: 16px;\n  overflow: hidden;\n}\n.filex-viewer-ipynb__cell[data-type=\"code\"] {\n  background: var(--fe-bg-elev, #f7f8fa);\n}\n.filex-viewer-ipynb__exec {\n  padding: 4px 12px;\n  font-family: var(--fe-font-mono, monospace);\n  font-size: 11px;\n  color: var(--fe-text-muted, #5a6475);\n  background: rgba(0, 0, 0, 0.04);\n}\n.filex-viewer-ipynb__src {\n  margin: 0;\n  padding: 12px;\n  font-family: var(--fe-font-mono, monospace);\n  font-size: 12px;\n  line-height: 1.5;\n  white-space: pre;\n  overflow-x: auto;\n}\n.filex-viewer-ipynb__outputs {\n  border-top: 1px dashed var(--fe-border, #e2e6ed);\n  background: var(--fe-bg, #fff);\n  padding: 8px 12px;\n}\n.filex-viewer-ipynb__out {\n  margin: 0;\n  padding: 4px 0;\n  font-family: var(--fe-font-mono, monospace);\n  font-size: 12px;\n  white-space: pre-wrap;\n  word-wrap: break-word;\n}\n.filex-viewer-ipynb__out[data-type=\"error\"] {\n  color: var(--fe-danger, #dc2626);\n}\n.filex-viewer-ipynb__img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n  margin: 8px 0;\n}\n.filex-viewer-ipynb__html {\n  font-size: 13px;\n}\n.filex-viewer-ipynb__md {\n  padding: 12px 16px;\n  font-size: 14px;\n  line-height: 1.6;\n}\n.filex-viewer-ipynb__md-raw {\n  padding: 12px;\n  margin: 0;\n  font-family: var(--fe-font-mono, monospace);\n  font-size: 12px;\n  white-space: pre-wrap;\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { sayFailure } from '../lib/errorWords';\n/**\n * CsvViewer — lightweight CSV / TSV table preview.\n *\n * Lazy-imports `papaparse` when available (best-quality parser — handles\n * embedded quotes, multi-line cells, etc). Falls back to a simple\n * `split` parser when the peer is missing — workable for the trivial\n * \"first 1000 rows\" preview case but loses fidelity on complex files.\n *\n * UX:\n *   - first-row-as-header toggle\n *   - filter input that case-insensitively matches any cell\n *   - 100-rows-per-page pagination\n *   - tab vs comma auto-detection (manual override via toolbar)\n */\nimport { computed, onMounted, ref, watch } from 'vue';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\nimport { fetchViewerText } from '../composables/useViewerFetch';\nimport DataTable, { type DataColumn } from '../components/DataTable.vue';\n\nconst props = defineProps<{\n  url: string;\n  ext: string;\n  t?: (key: string, vars?: Record<string, string | number>) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n}>();\n\nconst PAGE_SIZE = 100;\nconst ROW_LIMIT = 1000;\n\nconst rows = ref<string[][]>([]);\nconst error = ref<string | null>(null);\nconst loading = ref(true);\nconst firstRowHeader = ref(true);\nconst filter = ref('');\nconst page = ref(1);\nconst detectedDelim = ref<',' | '\\t' | ';'>(',');\nconst userDelim = ref<'auto' | ',' | '\\t' | ';'>('auto');\n\nlet renderToken = 0;\n\nfunction detectDelimiter(sample: string): ',' | '\\t' | ';' {\n  const sampleLines = sample.split(/\\r?\\n/).slice(0, 5).join('\\n');\n  const tab = (sampleLines.match(/\\t/g) || []).length;\n  const semi = (sampleLines.match(/;/g) || []).length;\n  const comma = (sampleLines.match(/,/g) || []).length;\n  if (tab > comma && tab > semi) return '\\t';\n  if (semi > comma && semi > tab) return ';';\n  return ',';\n}\n\nasync function parseWith(text: string, delim: string): Promise<string[][]> {\n  try {\n    const mod = await import(/* @vite-ignore */ 'papaparse');\n    const Papa = (mod as any).default ?? mod;\n    const result = Papa.parse(text, {\n      delimiter: delim,\n      skipEmptyLines: true,\n      header: false,\n    });\n    return (result.data as string[][]).slice(0, ROW_LIMIT);\n  } catch {\n    // Fallback: naive line/column split. Loses quoted-comma support\n    // but renders something reasonable.\n    return text\n      .split(/\\r?\\n/)\n      .filter((l) => l.length > 0)\n      .slice(0, ROW_LIMIT)\n      .map((line) => line.split(delim));\n  }\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = null;\n  rows.value = [];\n  page.value = 1;\n  const myToken = ++renderToken;\n\n  let text: string;\n  try {\n    text = await fetchViewerText({\n      url: props.url,\n      headers: (await props.authHeaders?.()) ?? {},\n      credentials: props.authCredentials,\n    });\n  } catch (err) {\n    error.value = sayFailure(err, tt('viewer.failed_to_load', 'Failed to load file'), { t: props.t }).text;\n    loading.value = false;\n    return;\n  }\n\n  if (myToken !== renderToken) return;\n\n  if (props.ext === 'tsv') {\n    detectedDelim.value = '\\t';\n  } else {\n    detectedDelim.value = detectDelimiter(text.slice(0, 4096));\n  }\n\n  const delim = userDelim.value === 'auto' ? detectedDelim.value : userDelim.value;\n  rows.value = await parseWith(text, delim);\n  loading.value = false;\n}\n\nonMounted(load);\nwatch(() => props.url, load);\nwatch(() => userDelim.value, () => {\n  if (rows.value.length === 0) return;\n  // Re-parse with the new delimiter using the cached source — but we\n  // didn't keep it. Cheapest path is a refetch.\n  load();\n});\n\nconst headers = computed<string[]>(() => {\n  if (!firstRowHeader.value || rows.value.length === 0) {\n    if (rows.value.length === 0) return [];\n    return rows.value[0].map((_, i) => `Col ${i + 1}`);\n  }\n  return rows.value[0];\n});\n\nconst dataRows = computed<string[][]>(() => {\n  return firstRowHeader.value ? rows.value.slice(1) : rows.value;\n});\n\n/** A parsed row with the line it came from, so `#` keeps naming the row in\n *  the FILE after a sort re-orders the screen. */\ninterface CsvRow {\n  n: number;\n  cells: string[];\n}\n\nconst filtered = computed<CsvRow[]>(() => {\n  const q = filter.value.trim().toLowerCase();\n  const all = dataRows.value.map((cells, i) => ({ n: i + 1, cells }));\n  if (!q) return all;\n  return all.filter((r) => r.cells.some((c) => (c || '').toLowerCase().includes(q)));\n});\n\n/**\n * THE SORT, done here and handed to the table as CONTROLLED.\n *\n * ⚠⚠ Here and not in the table, because the table only ever holds one page\n * (100 rows) of the parsed file, and a table that sorts the page it holds\n * would call a re-ordered 100 of 1000 \"sorted\" — so it rightly closes its\n * headers over a paged list. This component holds EVERY parsed row, so it can\n * sort all of them and then page, which is the honest order.\n */\nconst sort = ref<{ key: string; dir: 'asc' | 'desc' } | null>(null);\n\nfunction cellOf(r: CsvRow, key: string): string {\n  if (key === 'n') return String(r.n);\n  return r.cells[Number(key.slice(1))] ?? '';\n}\n\nconst sorted = computed<CsvRow[]>(() => {\n  const s = sort.value;\n  if (!s) return filtered.value;\n  const dir = s.dir === 'asc' ? 1 : -1;\n  return [...filtered.value].sort((a, b) => {\n    if (s.key === 'n') return dir * (a.n - b.n);\n    const x = cellOf(a, s.key);\n    const y = cellOf(b, s.key);\n    // Empty cells last in both directions; numbers as numbers.\n    if (!x !== !y) return x ? -1 : 1;\n    const nx = Number(x);\n    const ny = Number(y);\n    if (x && y && Number.isFinite(nx) && Number.isFinite(ny)) return dir * (nx - ny) || a.n - b.n;\n    return dir * x.localeCompare(y, undefined, { numeric: true, sensitivity: 'base' }) || a.n - b.n;\n  });\n});\n\nfunction onSort(next: { key: string; dir: 'asc' | 'desc' }) {\n  sort.value = next;\n}\n\nconst totalPages = computed(() =>\n  Math.max(1, Math.ceil(sorted.value.length / PAGE_SIZE)),\n);\n\nconst visibleRows = computed<CsvRow[]>(() => {\n  const start = (page.value - 1) * PAGE_SIZE;\n  return sorted.value.slice(start, start + PAGE_SIZE);\n});\n\nwatch([filter, sort], () => {\n  page.value = 1;\n});\n\n/** The file's columns, as THE table (DataTable — the explorer's own) draws\n *  them. `#` is the lead: it is what names a row of a spreadsheet. */\nconst columns = computed<DataColumn<CsvRow>[]>(() => [\n  {\n    id: 'n',\n    label: '#',\n    lead: true,\n    width: 64,\n    min: 48,\n    align: 'right',\n    sortable: true,\n    class: 'filex-viewer-csv__rownum',\n    format: (r) => r.n,\n  },\n  ...headers.value.map((h, i) => ({\n    id: `c${i}`,\n    label: h,\n    width: 140,\n    sortable: true,\n    format: (r: CsvRow) => r.cells[i] ?? '',\n  })),\n]);\n\nfunction tt(key: string, fallback: string, vars?: Record<string, string | number>): string {\n  return props.t ? props.t(key, vars) : fallback;\n}\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div class=\"filex-viewer-csv\">\n    <div class=\"filex-viewer-csv__pane\">\n      <div v-if=\"error\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n        <p>{{ error }}</p>\n      </div>\n      <div v-else-if=\"loading\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span\n        class=\"filex-viewer-fallback__icon filex-viewer-fallback__icon--spin\"\n        aria-hidden=\"true\"\n        v-html=\"actionIconSvg('progress')\"\n      ></span>\n        <p>{{ tt('viewer.loading', 'Loading…') }}</p>\n      </div>\n      <!-- ⚠ No table id: a spreadsheet's columns are whatever THIS file has\n           (`c0`, `c1`, …), so widths remembered against them would land on a\n           different file's different columns next time. The arrangement\n           lives for this preview. -->\n      <DataTable\n        v-else\n        :table-id=\"undefined\"\n        :columns=\"columns\"\n        :rows=\"visibleRows\"\n        :row-key=\"(r: CsvRow) => r.n\"\n        :sort=\"sort\"\n        @sort=\"onSort\"\n      />\n    </div>\n    <div v-if=\"!loading && !error && totalPages > 1\" class=\"filex-viewer-csv__pager\">\n      <button\n        type=\"button\"\n        class=\"filex-viewer-btn\"\n        :disabled=\"page <= 1\"\n        @click=\"page--\"\n      >‹</button>\n      <span class=\"filex-viewer-csv__pageno\"><bdi dir=\"ltr\">{{ page }} / {{ totalPages }}</bdi> ({{ tt('viewer.csv_rows', `${filtered.length} rows`, { n: filtered.length }) }})</span>\n      <button\n        type=\"button\"\n        class=\"filex-viewer-btn\"\n        :disabled=\"page >= totalPages\"\n        @click=\"page++\"\n      >›</button>\n    </div>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-csv {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n}\n.filex-viewer-csv__bar {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  padding: 8px 12px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-bottom: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 12px;\n}\n.filex-viewer-csv__check {\n  display: flex;\n  align-items: center;\n  gap: 4px;\n  font-size: 12px;\n}\n.filex-viewer-csv__select,\n.filex-viewer-csv__filter {\n  border: 1px solid var(--fe-border, #e2e6ed);\n  background: var(--fe-bg, #fff);\n  color: inherit;\n  padding: 4px 8px;\n  border-radius: 4px;\n  font: inherit;\n  font-size: 12px;\n}\n.filex-viewer-csv__filter {\n  flex: 0 1 240px;\n}\n.filex-viewer-spacer { flex: 1; }\n.filex-viewer-csv__count {\n  font-size: 11px;\n  color: var(--fe-text-muted, #5a6475);\n  font-variant-numeric: tabular-nums;\n}\n.filex-viewer-csv__pane {\n  flex: 1;\n  overflow: auto;\n}\n.filex-viewer-csv__pane .fe-list__cell {\n  font-family: var(--fe-font-mono, monospace);\n  font-size: 12px;\n}\n/* The table itself is DataTable's (styles/base.css) — the product's one table.\n   ⚠ The row number used to pin itself (`position: sticky; left: 0`) because\n   this was a table of its own; it is the table's LEAD now, and the table\n   freezes its lead itself, only while there is room to (a pin written here\n   would fight that gate). What stays is the look of a row number. */\n.filex-viewer-csv__rownum {\n  color: var(--fe-text-muted, #5a6475);\n  font-variant-numeric: tabular-nums;\n}\n.filex-viewer-csv__pager {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  gap: 8px;\n  padding: 6px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-top: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 12px;\n}\n.filex-viewer-csv__pageno {\n  font-variant-numeric: tabular-nums;\n  font-size: 12px;\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n.filex-viewer-btn {\n  border: 1px solid var(--fe-border, #e2e6ed);\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n  padding: 4px 10px;\n  border-radius: 4px;\n  cursor: pointer;\n  font: inherit;\n  font-size: 12px;\n}\n.filex-viewer-btn:hover:not(:disabled) {\n  background: var(--fe-bg-hover, #edf0f5);\n}\n.filex-viewer-btn:disabled {\n  opacity: 0.4;\n  cursor: not-allowed;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * ArchiveViewer — read-only preview of an archive's contents, browsed like a\n * folder (a breadcrumb, folders first), for every format the server reads.\n *\n * Hits the configured archive-list endpoint (`archiveListUrl`, default\n * `POST /api/files/archive/list`) with the adapter-qualified path. An\n * encrypted archive answers PASSWORD_REQUIRED / BAD_PASSWORD and the shared\n * password dialog asks; the listing it unlocks is remembered for the session\n * (`archivePreviewCache`). Extraction is exposed elsewhere (context menu /\n * actions panel): the viewer's job is just \"what's inside?\".\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\nimport DataTable, { type DataColumn } from '../components/DataTable.vue';\nimport { useLocale } from '../composables/useLocale';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { ArchivePreviewCache } from '../lib/archivePreviewCache';\nimport ArchivePasswordModal from '../modals/ArchivePasswordModal.vue';\nimport { withAppBase } from '../lib/appBase';\n\ninterface ArchiveEntry {\n  name: string;\n  size: number;\n  mtime?: string;\n  is_dir?: boolean;\n}\n\ninterface ArchiveRow extends ArchiveEntry {\n  displayName: string;\n  fullPath: string;\n}\n\nconst props = withDefaults(defineProps<{\n  url: string;\n  filePath?: string;\n  ext: string;\n  /** The interface language — the size column is written the way it writes\n   *  numbers (\"1,96 KB\"), like every other size in the product. */\n  locale?: LocaleCode;\n  t?: (key: string, vars?: Record<string, string | number>) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  /** ⚠ Where to ask. This used to be the literal '/api/files/archive/list',\n   *  which is the ONE thing an embed cannot assume: with `apiBase` pointing at\n   *  another origin the request went to the host page instead and 404'd, while\n   *  every other call in the package honoured the configured base. The default\n   *  keeps a same-origin install working unchanged. */\n  archiveListUrl?: string;\n  archivePreviewCache?: ArchivePreviewCache;\n}>(), {\n  locale: 'en',\n});\n\nconst emit = defineEmits<{ (e: 'close'): void }>();\nconst entries = ref<ArchiveEntry[]>([]);\nconst currentDir = ref('');\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst password = ref('');\nconst passwordNeeded = ref(false);\nconst passwordError = ref('');\n/** The listing has taken long enough to say why. */\nconst slow = ref(false);\n\n/* ⚠ The server reads the WHOLE archive from its storage before it can list\n * it — minutes for a large one on an object store — and all that time this\n * said \"Loading…\". Past SLOW_LISTING_MS it says what it is waiting for.\n *\n * Each listing is also THIS file's: stepping to the next file started a second\n * listing beside the first, and whichever ended last filled the screen, so the\n * big zip's contents (or its \"could not read\") could land under the small\n * one's name. A new listing aborts the old one — which also stops the\n * server's download — and an answer that is no longer the latest is dropped. */\nconst SLOW_LISTING_MS = 3000;\nlet listing = 0;\nlet inFlight: AbortController | null = null;\nlet slowTimer: ReturnType<typeof setTimeout> | undefined;\n\n/** ⚠ `vars` go THROUGH `t()`, not into a `.replace()` afterwards: `t()` is what\n *  picks the singular (`viewer.archive.entries_one`) from the count, and it can\n *  only do that if it is told the count. Same shape CsvViewer's helper has. */\nfunction tt(key: string, fallback: string, vars?: Record<string, string | number>): string {\n  return props.t ? props.t(key, vars) : fallback;\n}\n\n/* ⚠ The product's one byte formatter (useLocale.formatSize). This file had\n   its own — base 1024, a dot, English units — so a zip's member read\n   \"1.9 KB\" beside the explorer's \"1,96 KB\" for the same bytes (QA,\n   2026-09-21). */\nconst { formatSize } = useLocale(() => props.locale ?? 'en');\nfunction fmtSize(n: number): string {\n  return formatSize(n);\n}\n\n/** Stops the listing in flight, if any: its answer is no longer wanted. */\nfunction stopListing(): number {\n  inFlight?.abort();\n  inFlight = null;\n  clearTimeout(slowTimer);\n  slow.value = false;\n  return ++listing;\n}\n\nasync function load(): Promise<void> {\n  const mine = stopListing();\n  loading.value = true;\n  error.value = null;\n  passwordError.value = '';\n  entries.value = [];\n  if (!props.filePath) {\n    error.value = tt('viewer.archive.error', 'Could not read archive contents.');\n    loading.value = false;\n    return;\n  }\n  if (!password.value) {\n    const cached = props.archivePreviewCache?.recall(props.filePath);\n    if (cached) {\n      entries.value = cached;\n      passwordNeeded.value = false;\n      loading.value = false;\n      return;\n    }\n  }\n  const ctl = new AbortController();\n  inFlight = ctl;\n  slowTimer = setTimeout(() => {\n    if (mine === listing) slow.value = true;\n  }, SLOW_LISTING_MS);\n  try {\n    const auth = props.authHeaders ? await props.authHeaders() : {};\n    if (mine !== listing) return;\n    const res = await fetch(props.archiveListUrl || withAppBase('/api/files/archive/list'), {\n      method: 'POST',\n      credentials: props.authCredentials || 'same-origin',\n      headers: {\n        'Content-Type': 'application/json',\n        ...auth,\n      },\n      body: JSON.stringify({ path: props.filePath, password: password.value || undefined }),\n      signal: ctl.signal,\n    });\n    if (mine !== listing) return;\n    if (!res.ok) {\n      /* ⚠ Never the raw status. This printed \"503 Service Unavailable\" (or a\n       * JSON body) straight into the preview — the same failure the owner\n       * reported for ONLYOFFICE (\"Config fetch 503: {…}\"): a person is shown\n       * the HTTP layer instead of what happened. The server's reason, when it\n       * sent one we know, becomes a sentence; anything else is the generic\n       * \"could not read the archive\". */\n      const body = await res.json().catch(() => ({})) as { code?: string; error?: string };\n      if (mine !== listing) return;\n      if (body.code === 'PASSWORD_REQUIRED' || body.code === 'BAD_PASSWORD') {\n        props.archivePreviewCache?.forget(props.filePath);\n        passwordNeeded.value = true;\n        passwordError.value = body.code === 'BAD_PASSWORD'\n          ? tt('archive.bad_password', 'The archive password is incorrect.')\n          : '';\n        return;\n      }\n      throw new ArchiveError(archiveErrorText(res.status, body.code ?? body.error ?? ''));\n    }\n    const body = (await res.json()) as { entries?: ArchiveEntry[] };\n    if (mine !== listing) return;\n    entries.value = body.entries ?? [];\n    if (password.value) props.archivePreviewCache?.remember(props.filePath, entries.value);\n    passwordNeeded.value = false;\n  } catch (err) {\n    if (mine !== listing) return;\n    error.value =\n      err instanceof ArchiveError ? err.message : tt('viewer.archive.error', 'Could not read archive contents.');\n  } finally {\n    if (mine === listing) {\n      loading.value = false;\n      inFlight = null;\n      clearTimeout(slowTimer);\n      slow.value = false;\n    }\n  }\n}\n\n/** A failure already worded for a person. Anything else that throws (the\n *  network, a JSON parse) reads as the generic sentence. */\nclass ArchiveError extends Error {}\n\nfunction archiveErrorText(status: number, code: string): string {\n  if (/not a zip|unsupported|not supported|format/i.test(code)) {\n    return tt('viewer.archive.unsupported', 'This kind of archive cannot be listed here. Download it to see what is inside.');\n  }\n  if (status === 413 || /too large|too big/i.test(code)) {\n    return tt('viewer.archive.too_large', 'This archive is too large to list here. Download it to see what is inside.');\n  }\n  return tt('viewer.archive.error', 'Could not read archive contents.');\n}\n\n\n/**\n * The entries, in THE table (DataTable — the explorer's own). ⚠ It used to be\n * the one table in the package allowed to be its own, with the reasoning that\n * a file's contents answer to the viewer's layout. The owner's rule since\n * 2026-09-21 has no such exception — \"bir yere tablo gerekiyorsa bu tabloyu\n * koymak zorundayız\" — and an archive's listing is a file listing: it wants\n * to be sorted by size and have its Name column widened exactly the way the\n * folder it came from does.\n */\nconst columns = computed<DataColumn<ArchiveRow>[]>(() => [\n  {\n    id: 'name',\n    label: tt('viewer.name', 'Name'),\n    sortable: true,\n    width: 360,\n    class: 'filex-viewer-archive__name',\n    title: (e) => e.name,\n  },\n  {\n    id: 'size',\n    label: tt('viewer.size', 'Size'),\n    sortable: true,\n    width: 110,\n    align: 'right',\n    class: 'filex-viewer-archive__size',\n    format: (e) => (e.is_dir ? '' : fmtSize(e.size)),\n    sortValue: (e) => (e.is_dir ? -1 : e.size),\n  },\n]);\n\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nfunction submitPassword(value: string) {\n  password.value = value;\n  void load();\n}\n\nonMounted(load);\n/* Closing the preview stops the server reading an archive nobody will see. */\nonBeforeUnmount(() => {\n  stopListing();\n});\nwatch(() => props.filePath, () => {\n  currentDir.value = '';\n  password.value = '';\n  passwordNeeded.value = false;\n  void load();\n});\n\nconst totalSize = computed(() => entries.value.reduce((sum, entry) => sum + (entry.size || 0), 0));\nconst fileCount = computed(() => entries.value.filter((entry) => !entry.is_dir).length);\n\nfunction cleanPath(value: string): string {\n  return value.replace(/\\\\/g, '/').replace(/^\\/+|\\/+$/g, '');\n}\n\nconst visibleEntries = computed<ArchiveRow[]>(() => {\n  const rows = new Map<string, ArchiveRow>();\n  for (const entry of entries.value) {\n    const fullPath = cleanPath(entry.name);\n    if (!fullPath || (currentDir.value && !fullPath.startsWith(currentDir.value))) continue;\n    const rest = currentDir.value ? fullPath.slice(currentDir.value.length) : fullPath;\n    if (!rest) continue;\n    const slash = rest.indexOf('/');\n    if (slash >= 0) {\n      const displayName = rest.slice(0, slash);\n      const dirPath = `${currentDir.value}${displayName}`;\n      if (!rows.has(dirPath)) {\n        rows.set(dirPath, { name: dirPath, fullPath: dirPath, displayName, size: 0, is_dir: true });\n      }\n      continue;\n    }\n    rows.set(fullPath, { ...entry, name: fullPath, fullPath, displayName: rest });\n  }\n  return [...rows.values()].sort((a, b) => {\n    if (!!a.is_dir !== !!b.is_dir) return a.is_dir ? -1 : 1;\n    return a.displayName.localeCompare(b.displayName, undefined, { numeric: true, sensitivity: 'base' });\n  });\n});\n\nconst breadcrumbs = computed(() => {\n  const parts = cleanPath(currentDir.value).split('/').filter(Boolean);\n  return parts.map((name, index) => ({ name, path: `${parts.slice(0, index + 1).join('/')}/` }));\n});\n\nfunction openRow(row: ArchiveRow) {\n  if (row.is_dir) currentDir.value = `${cleanPath(row.fullPath)}/`;\n\n}\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n\nfunction entryTile(entry: ArchiveEntry): string {\n  const name = entry.name || '';\n  const dot = name.lastIndexOf('.');\n  return fileIconTile({\n    type: entry.is_dir ? 'dir' : 'file',\n    extension: dot > 0 ? name.slice(dot + 1) : '',\n    basename: name,\n  });\n}\n</script>\n\n<template>\n  <div class=\"filex-viewer-archive\">\n    <div v-if=\"passwordNeeded\" class=\"filex-viewer-fallback\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('lock')\"></span>\n      <p>{{ tt('archive.password_required', 'This archive requires a password.') }}</p>\n    </div>\n    <div v-else-if=\"error\" class=\"filex-viewer-fallback\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n      <p>{{ error }}</p>\n    </div>\n    <div v-else-if=\"loading\" class=\"filex-viewer-fallback\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span\n        class=\"filex-viewer-fallback__icon filex-viewer-fallback__icon--spin\"\n        aria-hidden=\"true\"\n        v-html=\"actionIconSvg('progress')\"\n      ></span>\n      <!-- A live region: the sentence turns into \"still reading…\" while\n           nothing else on the page changes. -->\n      <p role=\"status\">\n        {{\n          slow\n            ? tt(\n                'viewer.archive.reading',\n                'Still reading… the whole archive is read before its contents can be listed, which takes a while for a large one.',\n              )\n            : tt('viewer.loading', 'Loading…')\n        }}\n      </p>\n    </div>\n    <div v-else-if=\"entries.length === 0\" class=\"filex-viewer-fallback\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n      <p>{{ tt('viewer.archive.empty', 'Archive is empty.') }}</p>\n    </div>\n    <div v-else class=\"filex-viewer-archive__pane\">\n      <nav class=\"filex-viewer-archive__crumbs\" :aria-label=\"tt('viewer.archive.location', 'Archive location')\">\n        <button type=\"button\" @click=\"currentDir = ''\">{{ tt('viewer.archive.root', 'Archive') }}</button>\n        <template v-for=\"crumb in breadcrumbs\" :key=\"crumb.path\">\n          <span aria-hidden=\"true\">›</span>\n          <button type=\"button\" @click=\"currentDir = crumb.path\">{{ crumb.name }}</button>\n        </template>\n      </nav>\n      <div class=\"filex-viewer-archive__summary\">\n        <!-- ⚠ The count is IN the message (\"{n} files\"). A `{{ fileCount }}`\n             printed in front of it read \"3 3 files\". -->\n        {{ tt('viewer.archive.entries', `${fileCount} files`, { n: fileCount }) }}\n        · {{ fmtSize(totalSize) }}\n      </div>\n      <DataTable\n        table-id=\"viewer.archive\"\n        :columns=\"columns\"\n        :rows=\"visibleEntries\"\n        :row-key=\"(e: ArchiveRow) => e.fullPath\"\n        :row-attrs=\"(e: ArchiveRow) => ({ 'data-dir': e.is_dir ? '1' : '0', onDblclick: () => openRow(e) })\"\n      >\n        <template #cell-name=\"{ row }\">\n          <!-- ikon:emoji — the same tile the listing draws for the same kind\n               of file, so an archive's contents and the folder it came from\n               read as one product. -->\n          <button type=\"button\" class=\"filex-viewer-archive__entry\" :disabled=\"!row.is_dir\" @click=\"openRow(row)\">\n            <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons -->\n            <span class=\"filex-viewer-archive__icon\" aria-hidden=\"true\" v-html=\"entryTile(row)\"></span>\n            <span class=\"fe-list__cell-text\">{{ row.displayName }}</span>\n          </button>\n        </template>\n      </DataTable>\n    </div>\n    <ArchivePasswordModal\n      :open=\"passwordNeeded\"\n      :locale=\"props.locale\"\n      :archive-name=\"(props.filePath || '').split('/').pop() || ''\"\n      :busy=\"loading\"\n      :error=\"passwordError\"\n      @close=\"emit('close')\"\n      @submit=\"submitPassword\"\n    />\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-archive {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n}\n.filex-viewer-archive__pane {\n  flex: 1;\n  overflow: auto;\n  padding: 16px 20px;\n}\n.filex-viewer-archive__summary {\n  font-size: 12px;\n  color: var(--fe-text-muted, #5a6475);\n  margin-bottom: 12px;\n  font-variant-numeric: tabular-nums;\n}\n/* The table itself is DataTable's (styles/base.css); only the viewer's own\n   touches stay here — tabular figures and muted sizes, a folder row read as\n   quieter than a file. */\n.filex-viewer-archive__size {\n  text-align: end;\n  font-variant-numeric: tabular-nums;\n  white-space: nowrap;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-archive__icon {\n  margin-inline-end: 6px;\n}\n.filex-viewer-archive .fe-list__row[data-dir=\"1\"] {\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n.filex-viewer-archive__crumbs { display: flex; align-items: center; gap: 6px; margin-bottom: 10px; color: var(--fe-text-muted, #5a6475); }\n.filex-viewer-archive__crumbs button { border: 0; background: transparent; color: inherit; cursor: pointer; padding: 2px 4px; border-radius: 4px; }\n.filex-viewer-archive__crumbs button:hover { background: var(--fe-bg-elev, #f7f8fa); color: var(--fe-text, #1a1e27); }\n.filex-viewer-archive__entry { display: inline-flex; align-items: center; max-width: 100%; border: 0; background: transparent; color: inherit; font: inherit; padding: 0; text-align: start; }\n.filex-viewer-archive__entry:not(:disabled) { cursor: pointer; }\n.filex-viewer-archive__entry:disabled { opacity: 1; }\n</style>\n","/**\n * This is the ParseError class, which is the main error thrown by KaTeX\n * functions when something has gone wrong. This is used to distinguish internal\n * errors from errors in the expression that the user provided.\n *\n * If possible, a caller should provide a Token or ParseNode with information\n * about where in the source string the problem occurred.\n */\nclass ParseError extends Error {\n  // Error start position based on passed-in Token or ParseNode.\n\n  // Length of affected text based on passed-in Token or ParseNode.\n\n  // The underlying error message without any context added.\n  constructor(message,\n  // The error message\n  token) {\n    var error = \"KaTeX parse error: \" + message;\n    var start;\n    var end;\n    var loc = token && token.loc;\n    if (loc && loc.start <= loc.end) {\n      // If we have the input and a position, make the error a bit fancier\n      // Get the input\n      var input = loc.lexer.input;\n      // Prepend some information\n      start = loc.start;\n      end = loc.end;\n      if (start === input.length) {\n        error += \" at end of input: \";\n      } else {\n        error += \" at position \" + (start + 1) + \": \";\n      }\n      // Underline token in question using combining underscores\n      var underlined = input.slice(start, end).replace(/[^]/g, \"$&\\u0332\");\n      // Extract some context from the input and add it to the error\n      var left;\n      if (start > 15) {\n        left = \"…\" + input.slice(start - 15, start);\n      } else {\n        left = input.slice(0, start);\n      }\n      var right;\n      if (end + 15 < input.length) {\n        right = input.slice(end, end + 15) + \"…\";\n      } else {\n        right = input.slice(end);\n      }\n      error += left + underlined + right;\n    }\n    super(error);\n    this.name = \"ParseError\";\n    Object.setPrototypeOf(this, ParseError.prototype);\n    this.position = start;\n    if (start != null && end != null) {\n      this.length = end - start;\n    }\n    this.rawMessage = message;\n  }\n}\n\n/**\n * This file contains a list of utility functions which are useful in other\n * files.\n */\n// hyphenate and escape adapted from Facebook's React under Apache 2 license\nvar uppercase = /([A-Z])/g;\nvar hyphenate = str => str.replace(uppercase, \"-$1\").toLowerCase();\nvar ESCAPE_LOOKUP = {\n  \"&\": \"&amp;\",\n  \">\": \"&gt;\",\n  \"<\": \"&lt;\",\n  \"\\\"\": \"&quot;\",\n  \"'\": \"&#x27;\"\n};\nvar ESCAPE_REGEX = /[&><\"']/g;\n/**\n * Escapes text to prevent scripting attacks.\n */\nvar escape = text => String(text).replace(ESCAPE_REGEX, match => ESCAPE_LOOKUP[match]);\n/**\n * Sometimes we want to pull out the innermost element of a group. In most\n * cases, this will just be the group itself, but when ordgroups and colors have\n * a single element, we want to pull that out.\n */\nvar getBaseElem = group => {\n  if (group.type === \"ordgroup\") {\n    if (group.body.length === 1) {\n      return getBaseElem(group.body[0]);\n    } else {\n      return group;\n    }\n  } else if (group.type === \"color\") {\n    if (group.body.length === 1) {\n      return getBaseElem(group.body[0]);\n    } else {\n      return group;\n    }\n  } else if (group.type === \"font\") {\n    return getBaseElem(group.body);\n  } else {\n    return group;\n  }\n};\nvar characterNodesTypes = new Set([\"mathord\", \"textord\", \"atom\"]);\n/**\n * TeXbook algorithms often reference \"character boxes\", which are simply groups\n * with a single character in them. To decide if something is a character box,\n * we find its innermost group, and see if it is a single character.\n */\nvar isCharacterBox = group => characterNodesTypes.has(getBaseElem(group).type);\n/**\n * Return the protocol of a URL, or \"_relative\" if the URL does not specify a\n * protocol (and thus is relative), or `null` if URL has invalid protocol\n * (so should be outright rejected).\n */\nvar protocolFromUrl = url => {\n  // Check for possible leading protocol.\n  // https://url.spec.whatwg.org/#url-parsing strips leading whitespace\n  // (U+20) or C0 control (U+00-U+1F) characters.\n  // eslint-disable-next-line no-control-regex\n  var protocol = /^[\\x00-\\x20]*([^\\\\/#?]*?)(:|&#0*58|&#x0*3a|&colon)/i.exec(url);\n  if (!protocol) {\n    return \"_relative\";\n  }\n  // Reject weird colons\n  if (protocol[2] !== \":\") {\n    return null;\n  }\n  // Reject invalid characters in scheme according to\n  // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1\n  if (!/^[a-zA-Z][a-zA-Z0-9+\\-.]*$/.test(protocol[1])) {\n    return null;\n  }\n  // Lowercase the protocol\n  return protocol[1].toLowerCase();\n};\n\n/* eslint no-console:0 */\n// TODO: automatically generate documentation\n// TODO: check all properties on Settings exist\n// TODO: check the type of a property on Settings matches\nvar SETTINGS_SCHEMA = {\n  displayMode: {\n    type: \"boolean\",\n    description: \"Render math in display mode, which puts the math in \" + \"display style (so \\\\int and \\\\sum are large, for example), and \" + \"centers the math on the page on its own line.\",\n    cli: \"-d, --display-mode\"\n  },\n  output: {\n    type: {\n      enum: [\"htmlAndMathml\", \"html\", \"mathml\"]\n    },\n    description: \"Determines the markup language of the output.\",\n    cli: \"-F, --format <type>\"\n  },\n  leqno: {\n    type: \"boolean\",\n    description: \"Render display math in leqno style (left-justified tags).\"\n  },\n  fleqn: {\n    type: \"boolean\",\n    description: \"Render display math flush left.\"\n  },\n  throwOnError: {\n    type: \"boolean\",\n    default: true,\n    cli: \"-t, --no-throw-on-error\",\n    cliDescription: \"Render errors (in the color given by --error-color) ins\" + \"tead of throwing a ParseError exception when encountering an error.\"\n  },\n  errorColor: {\n    type: \"string\",\n    default: \"#cc0000\",\n    cli: \"-c, --error-color <color>\",\n    cliDescription: \"A color string given in the format 'rgb' or 'rrggbb' \" + \"(no #). This option determines the color of errors rendered by the \" + \"-t option.\",\n    cliProcessor: color => \"#\" + color\n  },\n  macros: {\n    type: \"object\",\n    cli: \"-m, --macro <def>\",\n    cliDescription: \"Define custom macro of the form '\\\\foo:expansion' (use \" + \"multiple -m arguments for multiple macros).\",\n    cliDefault: [],\n    cliProcessor: (def, defs) => {\n      defs.push(def);\n      return defs;\n    }\n  },\n  minRuleThickness: {\n    type: \"number\",\n    description: \"Specifies a minimum thickness, in ems, for fraction lines,\" + \" `\\\\sqrt` top lines, `{array}` vertical lines, `\\\\hline`, \" + \"`\\\\hdashline`, `\\\\underline`, `\\\\overline`, and the borders of \" + \"`\\\\fbox`, `\\\\boxed`, and `\\\\fcolorbox`.\",\n    processor: t => Math.max(0, t),\n    cli: \"--min-rule-thickness <size>\",\n    cliProcessor: parseFloat\n  },\n  colorIsTextColor: {\n    type: \"boolean\",\n    description: \"Makes \\\\color behave like LaTeX's 2-argument \\\\textcolor, \" + \"instead of LaTeX's one-argument \\\\color mode change.\",\n    cli: \"-b, --color-is-text-color\"\n  },\n  strict: {\n    type: [{\n      enum: [\"warn\", \"ignore\", \"error\"]\n    }, \"boolean\", \"function\"],\n    description: \"Turn on strict / LaTeX faithfulness mode, which throws an \" + \"error if the input uses features that are not supported by LaTeX.\",\n    cli: \"-S, --strict\",\n    cliDefault: false\n  },\n  trust: {\n    type: [\"boolean\", \"function\"],\n    description: \"Trust the input, enabling all HTML features such as \\\\url.\",\n    cli: \"-T, --trust\"\n  },\n  maxSize: {\n    type: \"number\",\n    default: Infinity,\n    description: \"If non-zero, all user-specified sizes, e.g. in \" + \"\\\\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, \" + \"elements and spaces can be arbitrarily large\",\n    processor: s => Math.max(0, s),\n    cli: \"-s, --max-size <n>\",\n    cliProcessor: parseInt\n  },\n  maxExpand: {\n    type: \"number\",\n    default: 1000,\n    description: \"Limit the number of macro expansions to the specified \" + \"number, to prevent e.g. infinite macro loops. If set to Infinity, \" + \"the macro expander will try to fully expand as in LaTeX.\",\n    processor: n => Math.max(0, n),\n    cli: \"-e, --max-expand <n>\",\n    cliProcessor: n => n === \"Infinity\" ? Infinity : parseInt(n)\n  },\n  globalGroup: {\n    type: \"boolean\",\n    cli: false\n  }\n};\nfunction getDefaultValue(schema) {\n  if (\"default\" in schema) {\n    return schema.default;\n  }\n  var type = schema.type;\n  var defaultType = Array.isArray(type) ? type[0] : type;\n  if (typeof defaultType !== 'string') {\n    return defaultType.enum[0];\n  }\n  switch (defaultType) {\n    case 'boolean':\n      return false;\n    case 'string':\n      return '';\n    case 'number':\n      return 0;\n    case 'object':\n      return {};\n  }\n}\n/**\n * The main Settings object\n *\n * The current options stored are:\n *  - displayMode: Whether the expression should be typeset as inline math\n *                 (false, the default), meaning that the math starts in\n *                 \\textstyle and is placed in an inline-block); or as display\n *                 math (true), meaning that the math starts in \\displaystyle\n *                 and is placed in a block with vertical margin.\n */\nclass Settings {\n  constructor(options) {\n    if (options === void 0) {\n      options = {};\n    }\n    // allow null options\n    options = options || {};\n    for (var prop of Object.keys(SETTINGS_SCHEMA)) {\n      var schema = SETTINGS_SCHEMA[prop];\n      var optionValue = options[prop];\n      // TODO: validate options\n      this[prop] = optionValue !== undefined ? schema.processor ? schema.processor(optionValue) : optionValue : getDefaultValue(schema);\n    }\n  }\n  /**\n   * Report nonstrict (non-LaTeX-compatible) input.\n   * Can safely not be called if `this.strict` is false in JavaScript.\n   */\n  reportNonstrict(errorCode, errorMsg, token) {\n    var strict = this.strict;\n    if (typeof strict === \"function\") {\n      // Allow return value of strict function to be boolean or string\n      // (or null/undefined, meaning no further processing).\n      strict = strict(errorCode, errorMsg, token);\n    }\n    if (!strict || strict === \"ignore\") {\n      return;\n    } else if (strict === true || strict === \"error\") {\n      throw new ParseError(\"LaTeX-incompatible input and strict mode is set to 'error': \" + (errorMsg + \" [\" + errorCode + \"]\"), token);\n    } else if (strict === \"warn\") {\n      typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \" + (errorMsg + \" [\" + errorCode + \"]\"));\n    } else {\n      // won't happen in type-safe code\n      typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to \" + (\"unrecognized '\" + strict + \"': \" + errorMsg + \" [\" + errorCode + \"]\"));\n    }\n  }\n  /**\n   * Check whether to apply strict (LaTeX-adhering) behavior for unusual\n   * input (like `\\\\`).  Unlike `nonstrict`, will not throw an error;\n   * instead, \"error\" translates to a return value of `true`, while \"ignore\"\n   * translates to a return value of `false`.  May still print a warning:\n   * \"warn\" prints a warning and returns `false`.\n   * This is for the second category of `errorCode`s listed in the README.\n   */\n  useStrictBehavior(errorCode, errorMsg, token) {\n    var strict = this.strict;\n    if (typeof strict === \"function\") {\n      // Allow return value of strict function to be boolean or string\n      // (or null/undefined, meaning no further processing).\n      // But catch any exceptions thrown by function, treating them\n      // like \"error\".\n      try {\n        strict = strict(errorCode, errorMsg, token);\n      } catch (error) {\n        strict = \"error\";\n      }\n    }\n    if (!strict || strict === \"ignore\") {\n      return false;\n    } else if (strict === true || strict === \"error\") {\n      return true;\n    } else if (strict === \"warn\") {\n      typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \" + (errorMsg + \" [\" + errorCode + \"]\"));\n      return false;\n    } else {\n      // won't happen in type-safe code\n      typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to \" + (\"unrecognized '\" + strict + \"': \" + errorMsg + \" [\" + errorCode + \"]\"));\n      return false;\n    }\n  }\n  /**\n   * Check whether to test potentially dangerous input, and return\n   * `true` (trusted) or `false` (untrusted).  The sole argument `context`\n   * should be an object with `command` field specifying the relevant LaTeX\n   * command (as a string starting with `\\`), and any other arguments, etc.\n   * If `context` has a `url` field, a `protocol` field will automatically\n   * get added by this function (changing the specified object).\n   */\n  isTrusted(context) {\n    if (\"url\" in context && context.url && !context.protocol) {\n      var protocol = protocolFromUrl(context.url);\n      if (protocol == null) {\n        return false;\n      }\n      context.protocol = protocol;\n    }\n    var trust = typeof this.trust === \"function\" ? this.trust(context) : this.trust;\n    return Boolean(trust);\n  }\n}\n\n/**\n * This file contains information and classes for the various kinds of styles\n * used in TeX. It provides a generic `Style` class, which holds information\n * about a specific style. It then provides instances of all the different kinds\n * of styles possible, and provides functions to move between them and get\n * information about them.\n */\n/**\n * The main style class. Contains a unique id for the style, a size (which is\n * the same for cramped and uncramped version of a style), and a cramped flag.\n */\nclass Style {\n  constructor(id, size, cramped) {\n    this.id = id;\n    this.size = size;\n    this.cramped = cramped;\n  }\n  /**\n   * Get the style of a superscript given a base in the current style.\n   */\n  sup() {\n    return styles[sup[this.id]];\n  }\n  /**\n   * Get the style of a subscript given a base in the current style.\n   */\n  sub() {\n    return styles[sub[this.id]];\n  }\n  /**\n   * Get the style of a fraction numerator given the fraction in the current\n   * style.\n   */\n  fracNum() {\n    return styles[fracNum[this.id]];\n  }\n  /**\n   * Get the style of a fraction denominator given the fraction in the current\n   * style.\n   */\n  fracDen() {\n    return styles[fracDen[this.id]];\n  }\n  /**\n   * Get the cramped version of a style (in particular, cramping a cramped style\n   * doesn't change the style).\n   */\n  cramp() {\n    return styles[cramp[this.id]];\n  }\n  /**\n   * Get a text or display version of this style.\n   */\n  text() {\n    return styles[text$1[this.id]];\n  }\n  /**\n   * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle)\n   */\n  isTight() {\n    return this.size >= 2;\n  }\n}\n// IDs of the different styles\nvar D = 0;\nvar Dc = 1;\nvar T = 2;\nvar Tc = 3;\nvar S = 4;\nvar Sc = 5;\nvar SS = 6;\nvar SSc = 7;\n// Instances of the different styles\nvar styles = [new Style(D, 0, false), new Style(Dc, 0, true), new Style(T, 1, false), new Style(Tc, 1, true), new Style(S, 2, false), new Style(Sc, 2, true), new Style(SS, 3, false), new Style(SSc, 3, true)];\n// Lookup tables for switching from one style to another\nvar sup = [S, Sc, S, Sc, SS, SSc, SS, SSc];\nvar sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc];\nvar fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc];\nvar fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc];\nvar cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc];\nvar text$1 = [D, Dc, T, Tc, T, Tc, T, Tc];\n// We only export some of the styles.\nvar Style$1 = {\n  DISPLAY: styles[D],\n  TEXT: styles[T],\n  SCRIPT: styles[S],\n  SCRIPTSCRIPT: styles[SS]\n};\n\n/*\n * This file defines the Unicode scripts and script families that we\n * support. To add new scripts or families, just add a new entry to the\n * scriptData array below. Adding scripts to the scriptData array allows\n * characters from that script to appear in \\text{} environments.\n */\n/**\n * Unicode block data for the families of scripts we support in \\text{}.\n * Scripts only need to appear here if they do not have font metrics.\n */\nvar scriptData = [{\n  // Latin characters beyond the Latin-1 characters we have metrics for.\n  // Needed for Czech, Hungarian and Turkish text, for example.\n  name: 'latin',\n  blocks: [[0x0100, 0x024f],\n  // Latin Extended-A and Latin Extended-B\n  [0x0300, 0x036f] // Combining Diacritical marks\n  ]\n}, {\n  // The Cyrillic script used by Russian and related languages.\n  // A Cyrillic subset used to be supported as explicitly defined\n  // symbols in symbols.js\n  name: 'cyrillic',\n  blocks: [[0x0400, 0x04ff]]\n}, {\n  // Armenian\n  name: 'armenian',\n  blocks: [[0x0530, 0x058F]]\n}, {\n  // The Brahmic scripts of South and Southeast Asia\n  // Devanagari (0900–097F)\n  // Bengali (0980–09FF)\n  // Gurmukhi (0A00–0A7F)\n  // Gujarati (0A80–0AFF)\n  // Oriya (0B00–0B7F)\n  // Tamil (0B80–0BFF)\n  // Telugu (0C00–0C7F)\n  // Kannada (0C80–0CFF)\n  // Malayalam (0D00–0D7F)\n  // Sinhala (0D80–0DFF)\n  // Thai (0E00–0E7F)\n  // Lao (0E80–0EFF)\n  // Tibetan (0F00–0FFF)\n  // Myanmar (1000–109F)\n  name: 'brahmic',\n  blocks: [[0x0900, 0x109F]]\n}, {\n  name: 'georgian',\n  blocks: [[0x10A0, 0x10ff]]\n}, {\n  // Chinese and Japanese.\n  // The \"k\" in cjk is for Korean, but we've separated Korean out\n  name: \"cjk\",\n  blocks: [[0x3000, 0x30FF],\n  // CJK symbols and punctuation, Hiragana, Katakana\n  [0x4E00, 0x9FAF],\n  // CJK ideograms\n  [0xFF00, 0xFF60] // Fullwidth punctuation\n  // TODO: add halfwidth Katakana and Romanji glyphs\n  ]\n}, {\n  // Korean\n  name: 'hangul',\n  blocks: [[0xAC00, 0xD7AF]]\n}];\n/**\n * Given a codepoint, return the name of the script or script family\n * it is from, or null if it is not part of a known block\n */\nfunction scriptFromCodepoint(codepoint) {\n  for (var i = 0; i < scriptData.length; i++) {\n    var script = scriptData[i];\n    for (var _i = 0; _i < script.blocks.length; _i++) {\n      var block = script.blocks[_i];\n      if (codepoint >= block[0] && codepoint <= block[1]) {\n        return script.name;\n      }\n    }\n  }\n  return null;\n}\n/**\n * A flattened version of all the supported blocks in a single array.\n * This is an optimization to make supportedCodepoint() fast.\n */\nvar allBlocks = [];\nscriptData.forEach(s => s.blocks.forEach(b => allBlocks.push(...b)));\n/**\n * Given a codepoint, return true if it falls within one of the\n * scripts or script families defined above and false otherwise.\n *\n * Micro benchmarks shows that this is faster than\n * /[\\u3000-\\u30FF\\u4E00-\\u9FAF\\uFF00-\\uFF60\\uAC00-\\uD7AF\\u0900-\\u109F]/.test()\n * in Firefox, Chrome and Node.\n */\nfunction supportedCodepoint(codepoint) {\n  for (var i = 0; i < allBlocks.length; i += 2) {\n    if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * This file provides support to domTree.js and delimiter.js.\n * It's a storehouse of path geometry for SVG images.\n */\n// In all paths below, the viewBox-to-em scale is 1000:1.\n// Second Brush Stroke\n//    Low resolution monitors struggle to display images in fine detail.\n//    So browsers apply anti-aliasing. A long straight arrow shaft therefore\n//    will sometimes appear as if it has a blurred edge.\n//    To mitigate this, these SVG files contain a second \"brush-stroke\" on the\n//    arrow shafts. That is, a second long thin rectangular SVG path has been\n//    written directly on top of each arrow shaft. This reinforcement causes\n//    some of the screen pixels to display as black instead of the anti-aliased\n//    gray pixel that a  single path would generate. So we get arrow shafts\n//    whose edges appear to be sharper.\nvar doubleBrushStroke = svgPath => svgPath + \" \" + svgPath;\nvar hLinePad = 80; // padding above a sqrt vinculum. Prevents image cropping.\n// The vinculum of a \\sqrt can be made thicker by a KaTeX rendering option.\n// Think of variable extraVinculum as two detours in the SVG path.\n// The detour begins at the lower left of the area labeled extraVinculum below.\n// The detour proceeds one extraVinculum distance up and slightly to the right,\n// displacing the radiused corner between surd and vinculum. The radius is\n// traversed as usual, then the detour resumes. It goes right, to the end of\n// the very long vinculum, then down one extraVinculum distance,\n// after which it resumes regular path geometry for the radical.\n/*                                                  vinculum\n                                                   /\n         /▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒←extraVinculum\n        / █████████████████████←0.04em (40 unit) std vinculum thickness\n       / /\n      / /\n     / /\\\n    / / surd\n*/\nvar sqrtMain = function sqrtMain(extraVinculum, hLinePad) {\n  // sqrtMain path geometry is from glyph U221A in the font KaTeX Main\n  return \"M95,\" + (622 + extraVinculum + hLinePad) + \"\\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\\nc69,-144,104.5,-217.7,106.5,-221\\nl\" + extraVinculum / 2.075 + \" -\" + extraVinculum + \"\\nc5.3,-9.3,12,-14,20,-14\\nH400000v\" + (40 + extraVinculum) + \"H845.2724\\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\\nM\" + (834 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize1 = function sqrtSize1(extraVinculum, hLinePad) {\n  // size1 is from glyph U221A in the font KaTeX_Size1-Regular\n  return \"M263,\" + (601 + extraVinculum + hLinePad) + \"c0.7,0,18,39.7,52,119\\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\\nc340,-704.7,510.7,-1060.3,512,-1067\\nl\" + extraVinculum / 2.084 + \" -\" + extraVinculum + \"\\nc4.7,-7.3,11,-11,19,-11\\nH40000v\" + (40 + extraVinculum) + \"H1012.3\\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\\nM\" + (1001 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize2 = function sqrtSize2(extraVinculum, hLinePad) {\n  // size2 is from glyph U221A in the font KaTeX_Size2-Regular\n  return \"M983 \" + (10 + extraVinculum + hLinePad) + \"\\nl\" + extraVinculum / 3.13 + \" -\" + extraVinculum + \"\\nc4,-6.7,10,-10,18,-10 H400000v\" + (40 + extraVinculum) + \"\\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\\nM\" + (1001 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize3 = function sqrtSize3(extraVinculum, hLinePad) {\n  // size3 is from glyph U221A in the font KaTeX_Size3-Regular\n  return \"M424,\" + (2398 + extraVinculum + hLinePad) + \"\\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\\nl\" + extraVinculum / 4.223 + \" -\" + extraVinculum + \"c4,-6.7,10,-10,18,-10 H400000\\nv\" + (40 + extraVinculum) + \"H1014.6\\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\\nc-2,6,-10,9,-24,9\\nc-8,0,-12,-0.7,-12,-2z M\" + (1001 + extraVinculum) + \" \" + hLinePad + \"\\nh400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize4 = function sqrtSize4(extraVinculum, hLinePad) {\n  // size4 is from glyph U221A in the font KaTeX_Size4-Regular\n  return \"M473,\" + (2713 + extraVinculum + hLinePad) + \"\\nc339.3,-1799.3,509.3,-2700,510,-2702 l\" + extraVinculum / 5.298 + \" -\" + extraVinculum + \"\\nc3.3,-7.3,9.3,-11,18,-11 H400000v\" + (40 + extraVinculum) + \"H1017.7\\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\\n606zM\" + (1001 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"H1017.7z\";\n};\nvar phasePath = function phasePath(y) {\n  var x = y / 2; // x coordinate at top of angle\n  return \"M400000 \" + y + \" H0 L\" + x + \" 0 l65 45 L145 \" + (y - 80) + \" H400000z\";\n};\nvar sqrtTall = function sqrtTall(extraVinculum, hLinePad, viewBoxHeight) {\n  // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular\n  // One path edge has a variable length. It runs vertically from the vinculum\n  // to a point near (14 units) the bottom of the surd. The vinculum\n  // is normally 40 units thick. So the length of the line in question is:\n  var vertSegment = viewBoxHeight - 54 - hLinePad - extraVinculum;\n  return \"M702 \" + (extraVinculum + hLinePad) + \"H400000\" + (40 + extraVinculum) + \"\\nH742v\" + vertSegment + \"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\\n219 661 l218 661zM702 \" + hLinePad + \"H400000v\" + (40 + extraVinculum) + \"H742z\";\n};\nvar sqrtPath = function sqrtPath(size, extraVinculum, viewBoxHeight) {\n  extraVinculum = 1000 * extraVinculum; // Convert from document ems to viewBox.\n  var path = \"\";\n  switch (size) {\n    case \"sqrtMain\":\n      path = sqrtMain(extraVinculum, hLinePad);\n      break;\n    case \"sqrtSize1\":\n      path = sqrtSize1(extraVinculum, hLinePad);\n      break;\n    case \"sqrtSize2\":\n      path = sqrtSize2(extraVinculum, hLinePad);\n      break;\n    case \"sqrtSize3\":\n      path = sqrtSize3(extraVinculum, hLinePad);\n      break;\n    case \"sqrtSize4\":\n      path = sqrtSize4(extraVinculum, hLinePad);\n      break;\n    case \"sqrtTall\":\n      path = sqrtTall(extraVinculum, hLinePad, viewBoxHeight);\n  }\n  return path;\n};\nvar innerPath = function innerPath(name, height) {\n  // The inner part of stretchy tall delimiters\n  switch (name) {\n    case \"\\u239c\":\n      return doubleBrushStroke(\"M291 0 H417 V\" + height + \" H291z\");\n    case \"\\u2223\":\n      return doubleBrushStroke(\"M145 0 H188 V\" + height + \" H145z\");\n    case \"\\u2225\":\n      return doubleBrushStroke(\"M145 0 H188 V\" + height + \" H145z\") + doubleBrushStroke(\"M367 0 H410 V\" + height + \" H367z\");\n    case \"\\u239f\":\n      return doubleBrushStroke(\"M457 0 H583 V\" + height + \" H457z\");\n    case \"\\u23a2\":\n      return doubleBrushStroke(\"M319 0 H403 V\" + height + \" H319z\");\n    case \"\\u23a5\":\n      return doubleBrushStroke(\"M263 0 H347 V\" + height + \" H263z\");\n    case \"\\u23aa\":\n      return doubleBrushStroke(\"M384 0 H504 V\" + height + \" H384z\");\n    case \"\\u23d0\":\n      return doubleBrushStroke(\"M312 0 H355 V\" + height + \" H312z\");\n    case \"\\u2016\":\n      return doubleBrushStroke(\"M257 0 H300 V\" + height + \" H257z\") + doubleBrushStroke(\"M478 0 H521 V\" + height + \" H478z\");\n    default:\n      return \"\";\n  }\n};\nvar path = {\n  // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main\n  doubleleftarrow: \"M262 157\\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\\nm8 0v40h399730v-40zm0 194v40h399730v-40z\",\n  // doublerightarrow is from glyph U+21D2 in font KaTeX Main\n  doublerightarrow: \"M399738 392l\\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z\",\n  // leftarrow is from glyph U+2190 in font KaTeX Main\n  leftarrow: \"M400000 241H110l3-3c68.7-52.7 113.7-120\\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\\n l-3-3h399890zM100 241v40h399900v-40z\",\n  // overbrace is from glyphs U+23A9/23A8/23A7 in font KaTeX_Size4-Regular\n  leftbrace: \"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z\",\n  leftbraceunder: \"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z\",\n  // overgroup is from the MnSymbol package (public domain)\n  leftgroup: \"M400000 80\\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\\n 435 0h399565z\",\n  leftgroupunder: \"M400000 262\\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\\n 435 219h399565z\",\n  // Harpoons are from glyph U+21BD in font KaTeX Main\n  leftharpoon: \"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z\",\n  leftharpoonplus: \"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\\nm0 0v40h400000v-40z\",\n  leftharpoondown: \"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z\",\n  leftharpoondownplus: \"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z\",\n  // hook is from glyph U+21A9 in font KaTeX Main\n  lefthook: \"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\\n 71.5 23h399859zM103 281v-40h399897v40z\",\n  leftlinesegment: doubleBrushStroke(\"M40 281 V428 H0 V94 H40 V241 H400000 v40z\"),\n  leftbracketunder: doubleBrushStroke(\"M0 0 h120 V290 H399995 v120 H0z\"),\n  leftbracketover: doubleBrushStroke(\"M0 440 h120 V150 H399995 v-120 H0z\"),\n  leftmapsto: doubleBrushStroke(\"M40 281 V448H0V74H40V241H400000v40z\"),\n  // tofrom is from glyph U+21C4 in font KaTeX AMS Regular\n  leftToFrom: \"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z\",\n  longequal: doubleBrushStroke(\"M0 50 h400000 v40H0z m0 194h40000v40H0z\"),\n  midbrace: \"M200428 334\\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z\",\n  midbraceunder: \"M199572 214\\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z\",\n  oiintSize1: \"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z\",\n  oiintSize2: \"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\\nc0 110 84 276 504 276s502.4-166 502.4-276z\",\n  oiiintSize1: \"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z\",\n  oiiintSize2: \"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z\",\n  rightarrow: \"M0 241v40h399891c-47.3 35.3-84 78-110 128\\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\\n 151.7 139 205zm0 0v40h399900v-40z\",\n  rightbrace: \"M400000 542l\\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z\",\n  rightbraceunder: \"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z\",\n  rightgroup: \"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\\n 3-1 3-3v-38c-76-158-257-219-435-219H0z\",\n  rightgroupunder: \"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z\",\n  rightharpoon: \"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\\n 69.2 92 94.5zm0 0v40h399900v-40z\",\n  rightharpoonplus: \"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z\",\n  rightharpoondown: \"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z\",\n  rightharpoondownplus: \"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\\nm0-194v40h400000v-40zm0 0v40h400000v-40z\",\n  righthook: \"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z\",\n  rightlinesegment: doubleBrushStroke(\"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\"),\n  rightbracketunder: doubleBrushStroke(\"M399995 0 h-120 V290 H0 v120 H400000z\"),\n  rightbracketover: doubleBrushStroke(\"M399995 440 h-120 V150 H0 v-120 H399995z\"),\n  rightToFrom: \"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z\",\n  // twoheadleftarrow is from glyph U+219E in font KaTeX AMS Regular\n  twoheadleftarrow: \"M0 167c68 40\\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z\",\n  twoheadrightarrow: \"M400000 167\\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z\",\n  // tilde1 is a modified version of a glyph from the MnSymbol package\n  tilde1: \"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\\n-68.267.847-113-73.952-191-73.952z\",\n  // ditto tilde2, tilde3, & tilde4\n  tilde2: \"M344 55.266c-142 0-300.638 81.316-311.5 86.418\\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z\",\n  tilde3: \"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\\n -338 0-409-156.573-744-156.573z\",\n  tilde4: \"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\\n -175.236-744-175.236z\",\n  // vec is from glyph U+20D7 in font KaTeX Main\n  vec: \"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\\nc-16-25.333-24-45-24-59z\",\n  // widehat1 is a modified version of a glyph from the MnSymbol package\n  widehat1: \"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z\",\n  // ditto widehat2, widehat3, & widehat4\n  widehat2: \"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",\n  widehat3: \"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",\n  widehat4: \"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",\n  // widecheck paths are all inverted versions of widehat\n  widecheck1: \"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z\",\n  widecheck2: \"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",\n  widecheck3: \"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",\n  widecheck4: \"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",\n  // The next ten paths support reaction arrows from the mhchem package.\n  // Arrows for \\ce{<-->} are offset from xAxis by 0.22ex, per mhchem in LaTeX\n  // baraboveleftarrow is mostly from glyph U+2190 in font KaTeX Main\n  baraboveleftarrow: \"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z\",\n  // rightarrowabovebar is mostly from glyph U+2192, KaTeX Main\n  rightarrowabovebar: \"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z\",\n  // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end.\n  // Ref from mhchem.sty: \\rlap{\\raisebox{-.22ex}{$\\kern0.5em\n  baraboveshortleftharpoon: \"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z\",\n  rightharpoonaboveshortbar: \"M0,241 l0,40c399126,0,399993,0,399993,0\\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z\",\n  shortbaraboveleftharpoon: \"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z\",\n  shortrightharpoonabovebar: \"M53,241l0,40c398570,0,399437,0,399437,0\\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z\"\n};\nvar tallDelim = function tallDelim(label, midHeight) {\n  switch (label) {\n    case \"lbrack\":\n      return \"M403 1759 V84 H666 V0 H319 V1759 v\" + midHeight + \" v1759 h347 v-84\\nH403z M403 1759 V0 H319 V1759 v\" + midHeight + \" v1759 h84z\";\n    case \"rbrack\":\n      return \"M347 1759 V0 H0 V84 H263 V1759 v\" + midHeight + \" v1759 H0 v84 H347z\\nM347 1759 V0 H263 V1759 v\" + midHeight + \" v1759 h84z\";\n    case \"vert\":\n      return \"M145 15 v585 v\" + midHeight + \" v585 c2.667,10,9.667,15,21,15\\nc10,0,16.667,-5,20,-15 v-585 v\" + -midHeight + \" v-585 c-2.667,-10,-9.667,-15,-21,-15\\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v\" + midHeight + \" v585 h43z\";\n    case \"doublevert\":\n      return \"M145 15 v585 v\" + midHeight + \" v585 c2.667,10,9.667,15,21,15\\nc10,0,16.667,-5,20,-15 v-585 v\" + -midHeight + \" v-585 c-2.667,-10,-9.667,-15,-21,-15\\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v\" + midHeight + \" v585 h43z\\nM367 15 v585 v\" + midHeight + \" v585 c2.667,10,9.667,15,21,15\\nc10,0,16.667,-5,20,-15 v-585 v\" + -midHeight + \" v-585 c-2.667,-10,-9.667,-15,-21,-15\\nc-10,0,-16.667,5,-20,15z M410 15 H367 v585 v\" + midHeight + \" v585 h43z\";\n    case \"lfloor\":\n      return \"M319 602 V0 H403 V602 v\" + midHeight + \" v1715 h263 v84 H319z\\nMM319 602 V0 H403 V602 v\" + midHeight + \" v1715 H319z\";\n    case \"rfloor\":\n      return \"M319 602 V0 H403 V602 v\" + midHeight + \" v1799 H0 v-84 H319z\\nMM319 602 V0 H403 V602 v\" + midHeight + \" v1715 H319z\";\n    case \"lceil\":\n      return \"M403 1759 V84 H666 V0 H319 V1759 v\" + midHeight + \" v602 h84z\\nM403 1759 V0 H319 V1759 v\" + midHeight + \" v602 h84z\";\n    case \"rceil\":\n      return \"M347 1759 V0 H0 V84 H263 V1759 v\" + midHeight + \" v602 h84z\\nM347 1759 V0 h-84 V1759 v\" + midHeight + \" v602 h84z\";\n    case \"lparen\":\n      return \"M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1\\nc-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,\\n-36,557 l0,\" + (midHeight + 84) + \"c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,\\n949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9\\nc0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,\\n-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189\\nl0,-\" + (midHeight + 92) + \"c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,\\n-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z\";\n    case \"rparen\":\n      return \"M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,\\n63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5\\nc11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,\" + (midHeight + 9) + \"\\nc-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664\\nc-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11\\nc0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17\\nc242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558\\nl0,-\" + (midHeight + 144) + \"c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,\\n-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z\";\n    default:\n      // We should not ever get here.\n      throw new Error(\"Unknown stretchy delimiter.\");\n  }\n};\n\n/**\n * This node represents a document fragment, which contains elements, but when\n * placed into the DOM doesn't have any representation itself. It only contains\n * children and doesn't have any DOM node properties.\n */\nclass DocumentFragment {\n  // Never used; needed for satisfying interface.\n  constructor(children) {\n    this.children = children;\n    this.classes = [];\n    this.height = 0;\n    this.depth = 0;\n    this.maxFontSize = 0;\n    this.style = {};\n  }\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n  /** Convert the fragment into a node. */\n  toNode() {\n    var frag = document.createDocumentFragment();\n    for (var i = 0; i < this.children.length; i++) {\n      frag.appendChild(this.children[i].toNode());\n    }\n    return frag;\n  }\n  /** Convert the fragment into HTML markup. */\n  toMarkup() {\n    var markup = \"\";\n    // Simply concatenate the markup for the children together.\n    for (var i = 0; i < this.children.length; i++) {\n      markup += this.children[i].toMarkup();\n    }\n    return markup;\n  }\n  /**\n   * Converts the math node into a string, similar to innerText. Applies to\n   * MathDomNode's only.\n   */\n  toText() {\n    // To avoid this, we would subclass documentFragment separately for\n    // MathML, but polyfills for subclassing is expensive per PR 1469.\n    // TODO(ts): Only works for ChildType = MathDomNode.\n    var toText = child => child.toText();\n    return this.children.map(toText).join(\"\");\n  }\n}\n\n/**\n * This file does conversion between units.  In particular, it provides\n * calculateSize to convert other units into ems.\n */\n// This table gives the number of TeX pts in one of each *absolute* TeX unit.\n// Thus, multiplying a length by this number converts the length from units\n// into pts.  Dividing the result by ptPerEm gives the number of ems\n// *assuming* a font size of ptPerEm (normal size, normal style).\nvar ptPerUnit = {\n  // https://en.wikibooks.org/wiki/LaTeX/Lengths and\n  // https://tex.stackexchange.com/a/8263\n  \"pt\": 1,\n  // TeX point\n  \"mm\": 7227 / 2540,\n  // millimeter\n  \"cm\": 7227 / 254,\n  // centimeter\n  \"in\": 72.27,\n  // inch\n  \"bp\": 803 / 800,\n  // big (PostScript) points\n  \"pc\": 12,\n  // pica\n  \"dd\": 1238 / 1157,\n  // didot\n  \"cc\": 14856 / 1157,\n  // cicero (12 didot)\n  \"nd\": 685 / 642,\n  // new didot\n  \"nc\": 1370 / 107,\n  // new cicero (12 new didot)\n  \"sp\": 1 / 65536,\n  // scaled point (TeX's internal smallest unit)\n  // https://tex.stackexchange.com/a/41371\n  \"px\": 803 / 800 // \\pdfpxdimen defaults to 1 bp in pdfTeX and LuaTeX\n};\n// Dictionary of relative units, for fast validity testing.\nvar relativeUnit = {\n  \"ex\": true,\n  \"em\": true,\n  \"mu\": true\n};\n/**\n * Determine whether the specified unit (either a string defining the unit\n * or a \"size\" parse node containing a unit field) is valid.\n */\nvar validUnit = function validUnit(unit) {\n  if (typeof unit !== \"string\") {\n    unit = unit.unit;\n  }\n  return unit in ptPerUnit || unit in relativeUnit || unit === \"ex\";\n};\n/*\n * Convert a \"size\" parse node (with numeric \"number\" and string \"unit\" fields,\n * as parsed by functions.js argType \"size\") into a CSS em value for the\n * current style/scale.  `options` gives the current options.\n */\nvar calculateSize = function calculateSize(sizeValue, options) {\n  var scale;\n  if (sizeValue.unit in ptPerUnit) {\n    // Absolute units\n    scale = ptPerUnit[sizeValue.unit] // Convert unit to pt\n    / options.fontMetrics().ptPerEm // Convert pt to CSS em\n    / options.sizeMultiplier; // Unscale to make absolute units\n  } else if (sizeValue.unit === \"mu\") {\n    // `mu` units scale with scriptstyle/scriptscriptstyle.\n    scale = options.fontMetrics().cssEmPerMu;\n  } else {\n    // Other relative units always refer to the *textstyle* font\n    // in the current size.\n    var unitOptions;\n    if (options.style.isTight()) {\n      // isTight() means current style is script/scriptscript.\n      unitOptions = options.havingStyle(options.style.text());\n    } else {\n      unitOptions = options;\n    }\n    // TODO: In TeX these units are relative to the quad of the current\n    // *text* font, e.g. cmr10. KaTeX instead uses values from the\n    // comparably-sized *Computer Modern symbol* font. At 10pt, these\n    // match. At 7pt and 5pt, they differ: cmr7=1.138894, cmsy7=1.170641;\n    // cmr5=1.361133, cmsy5=1.472241. Consider $\\scriptsize a\\kern1emb$.\n    // TeX \\showlists shows a kern of 1.13889 * fontsize;\n    // KaTeX shows a kern of 1.171 * fontsize.\n    if (sizeValue.unit === \"ex\") {\n      scale = unitOptions.fontMetrics().xHeight;\n    } else if (sizeValue.unit === \"em\") {\n      scale = unitOptions.fontMetrics().quad;\n    } else {\n      throw new ParseError(\"Invalid unit: '\" + sizeValue.unit + \"'\");\n    }\n    if (unitOptions !== options) {\n      scale *= unitOptions.sizeMultiplier / options.sizeMultiplier;\n    }\n  }\n  return Math.min(sizeValue.number * scale, options.maxSize);\n};\n/**\n * Round `n` to 4 decimal places, or to the nearest 1/10,000th em. See\n * https://github.com/KaTeX/KaTeX/pull/2460.\n */\nvar makeEm = function makeEm(n) {\n  return +n.toFixed(4) + \"em\";\n};\n\n/**\n * These objects store the data about the DOM nodes we create, as well as some\n * extra data. They can then be transformed into real DOM nodes with the\n * `toNode` function or HTML markup using `toMarkup`. They are useful for both\n * storing extra properties on the nodes, as well as providing a way to easily\n * work with the DOM.\n *\n * Similar functions for working with MathML nodes exist in mathMLTree.js.\n *\n * TODO: refactor `span` and `anchor` into common superclass when\n * target environments support class inheritance\n */\n/**\n * Create an HTML className based on a list of classes. In addition to joining\n * with spaces, we also remove empty classes.\n */\nvar createClass = function createClass(classes) {\n  return classes.filter(cls => cls).join(\" \");\n};\nvar initNode = function initNode(classes, options, style) {\n  this.classes = classes || [];\n  this.attributes = {};\n  this.height = 0;\n  this.depth = 0;\n  this.maxFontSize = 0;\n  this.style = style || {};\n  if (options) {\n    if (options.style.isTight()) {\n      this.classes.push(\"mtight\");\n    }\n    var color = options.getColor();\n    if (color) {\n      this.style.color = color;\n    }\n  }\n};\n/**\n * Convert into an HTML node\n */\nvar toNode = function toNode(tagName) {\n  var node = document.createElement(tagName);\n  // Apply the class\n  node.className = createClass(this.classes);\n  // Apply inline styles\n  for (var key of Object.keys(this.style)) {\n    node.style[key] = this.style[key];\n  }\n  // Apply attributes\n  for (var attr of Object.keys(this.attributes)) {\n    node.setAttribute(attr, this.attributes[attr]);\n  }\n  // Append the children, also as HTML nodes\n  for (var i = 0; i < this.children.length; i++) {\n    node.appendChild(this.children[i].toNode());\n  }\n  return node;\n};\n/**\n * https://w3c.github.io/html-reference/syntax.html#syntax-attributes\n *\n * > Attribute Names must consist of one or more characters\n * other than the space characters, U+0000 NULL,\n * '\"', \"'\", \">\", \"/\", \"=\", the control characters,\n * and any characters that are not defined by Unicode.\n */\nvar invalidAttributeNameRegex = /[\\s\"'>/=\\x00-\\x1f]/;\n/**\n * Convert into an HTML markup string\n */\nvar toMarkup = function toMarkup(tagName) {\n  var markup = \"<\" + tagName;\n  // Add the class\n  if (this.classes.length) {\n    markup += \" class=\\\"\" + escape(createClass(this.classes)) + \"\\\"\";\n  }\n  var styles = \"\";\n  // Add the styles, after hyphenation\n  for (var key of Object.keys(this.style)) {\n    styles += hyphenate(key) + \":\" + this.style[key] + \";\";\n  }\n  if (styles) {\n    markup += \" style=\\\"\" + escape(styles) + \"\\\"\";\n  }\n  // Add the attributes\n  for (var attr of Object.keys(this.attributes)) {\n    if (invalidAttributeNameRegex.test(attr)) {\n      throw new ParseError(\"Invalid attribute name '\" + attr + \"'\");\n    }\n    markup += \" \" + attr + \"=\\\"\" + escape(this.attributes[attr]) + \"\\\"\";\n  }\n  markup += \">\";\n  // Add the markup of the children, also as markup\n  for (var i = 0; i < this.children.length; i++) {\n    markup += this.children[i].toMarkup();\n  }\n  markup += \"</\" + tagName + \">\";\n  return markup;\n};\n/**\n * This node represents a span node, with a className, a list of children, and\n * an inline style. It also contains information about its height, depth, and\n * maxFontSize.\n *\n * Represents two types with different uses: SvgSpan to wrap an SVG and DomSpan\n * otherwise. This typesafety is important when HTML builders access a span's\n * children.\n */\nclass Span {\n  constructor(classes, children, options, style) {\n    initNode.call(this, classes, options, style);\n    this.children = children || [];\n  }\n  /**\n   * Sets an arbitrary attribute on the span. Warning: use this wisely. Not\n   * all browsers support attributes the same, and having too many custom\n   * attributes is probably bad.\n   */\n  setAttribute(attribute, value) {\n    this.attributes[attribute] = value;\n  }\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n  toNode() {\n    return toNode.call(this, \"span\");\n  }\n  toMarkup() {\n    return toMarkup.call(this, \"span\");\n  }\n}\n/**\n * This node represents an anchor (<a>) element with a hyperlink.  See `span`\n * for further details.\n */\nclass Anchor {\n  constructor(href, classes, children, options) {\n    initNode.call(this, classes, options);\n    this.children = children || [];\n    this.setAttribute('href', href);\n  }\n  setAttribute(attribute, value) {\n    this.attributes[attribute] = value;\n  }\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n  toNode() {\n    return toNode.call(this, \"a\");\n  }\n  toMarkup() {\n    return toMarkup.call(this, \"a\");\n  }\n}\n/**\n * This node represents an image embed (<img>) element.\n */\nclass Img {\n  constructor(src, alt, style) {\n    this.alt = alt;\n    this.src = src;\n    this.classes = [\"mord\"];\n    this.height = 0;\n    this.depth = 0;\n    this.maxFontSize = 0;\n    this.style = style;\n  }\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n  toNode() {\n    var node = document.createElement(\"img\");\n    node.src = this.src;\n    node.alt = this.alt;\n    node.className = \"mord\";\n    // Apply inline styles\n    for (var key of Object.keys(this.style)) {\n      node.style[key] = this.style[key];\n    }\n    return node;\n  }\n  toMarkup() {\n    var markup = \"<img src=\\\"\" + escape(this.src) + \"\\\"\" + (\" alt=\\\"\" + escape(this.alt) + \"\\\"\");\n    // Add the styles, after hyphenation\n    var styles = \"\";\n    for (var key of Object.keys(this.style)) {\n      styles += hyphenate(key) + \":\" + this.style[key] + \";\";\n    }\n    if (styles) {\n      markup += \" style=\\\"\" + escape(styles) + \"\\\"\";\n    }\n    markup += \"'/>\";\n    return markup;\n  }\n}\nvar iCombinations = {\n  'î': '\\u0131\\u0302',\n  'ï': '\\u0131\\u0308',\n  'í': '\\u0131\\u0301',\n  // 'ī': '\\u0131\\u0304', // enable when we add Extended Latin\n  'ì': '\\u0131\\u0300'\n};\n/**\n * A symbol node contains information about a single symbol. It either renders\n * to a single text node, or a span with a single text node in it, depending on\n * whether it has CSS classes, styles, or needs italic correction.\n */\nclass SymbolNode {\n  constructor(text, height, depth, italic, skew, width, classes, style) {\n    this.text = text;\n    this.height = height || 0;\n    this.depth = depth || 0;\n    this.italic = italic || 0;\n    this.skew = skew || 0;\n    this.width = width || 0;\n    this.classes = classes || [];\n    this.style = style || {};\n    this.maxFontSize = 0;\n    // Mark text from non-Latin scripts with specific classes so that we\n    // can specify which fonts to use.  This allows us to render these\n    // characters with a serif font in situations where the browser would\n    // either default to a sans serif or render a placeholder character.\n    // We use CSS class names like cjk_fallback, hangul_fallback and\n    // brahmic_fallback. See ./unicodeScripts.js for the set of possible\n    // script names\n    var script = scriptFromCodepoint(this.text.charCodeAt(0));\n    if (script) {\n      this.classes.push(script + \"_fallback\");\n    }\n    if (/[îïíì]/.test(this.text)) {\n      // add ī when we add Extended Latin\n      this.text = iCombinations[this.text];\n    }\n  }\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n  /**\n   * Creates a text node or span from a symbol node. Note that a span is only\n   * created if it is needed.\n   */\n  toNode() {\n    var node = document.createTextNode(this.text);\n    var span = null;\n    if (this.italic > 0) {\n      span = document.createElement(\"span\");\n      span.style.marginRight = makeEm(this.italic);\n    }\n    if (this.classes.length > 0) {\n      span = span || document.createElement(\"span\");\n      span.className = createClass(this.classes);\n    }\n    for (var key of Object.keys(this.style)) {\n      span = span || document.createElement(\"span\");\n      span.style[key] = this.style[key];\n    }\n    if (span) {\n      span.appendChild(node);\n      return span;\n    } else {\n      return node;\n    }\n  }\n  /**\n   * Creates markup for a symbol node.\n   */\n  toMarkup() {\n    // TODO(alpert): More duplication than I'd like from\n    // span.prototype.toMarkup and symbolNode.prototype.toNode...\n    var needsSpan = false;\n    var markup = \"<span\";\n    if (this.classes.length) {\n      needsSpan = true;\n      markup += \" class=\\\"\";\n      markup += escape(createClass(this.classes));\n      markup += \"\\\"\";\n    }\n    var styles = \"\";\n    if (this.italic > 0) {\n      styles += \"margin-right:\" + makeEm(this.italic) + \";\";\n    }\n    for (var key of Object.keys(this.style)) {\n      styles += hyphenate(key) + \":\" + this.style[key] + \";\";\n    }\n    if (styles) {\n      needsSpan = true;\n      markup += \" style=\\\"\" + escape(styles) + \"\\\"\";\n    }\n    var escaped = escape(this.text);\n    if (needsSpan) {\n      markup += \">\";\n      markup += escaped;\n      markup += \"</span>\";\n      return markup;\n    } else {\n      return escaped;\n    }\n  }\n}\n/**\n * SVG nodes are used to render stretchy wide elements.\n */\nclass SvgNode {\n  constructor(children, attributes) {\n    this.children = children || [];\n    this.attributes = attributes || {};\n  }\n  toNode() {\n    var svgNS = \"http://www.w3.org/2000/svg\";\n    var node = document.createElementNS(svgNS, \"svg\");\n    // Apply attributes\n    for (var attr of Object.keys(this.attributes)) {\n      node.setAttribute(attr, this.attributes[attr]);\n    }\n    for (var i = 0; i < this.children.length; i++) {\n      node.appendChild(this.children[i].toNode());\n    }\n    return node;\n  }\n  toMarkup() {\n    var markup = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"\";\n    // Apply attributes\n    for (var attr of Object.keys(this.attributes)) {\n      markup += \" \" + attr + \"=\\\"\" + escape(this.attributes[attr]) + \"\\\"\";\n    }\n    markup += \">\";\n    for (var i = 0; i < this.children.length; i++) {\n      markup += this.children[i].toMarkup();\n    }\n    markup += \"</svg>\";\n    return markup;\n  }\n}\nclass PathNode {\n  constructor(pathName, alternate) {\n    this.pathName = pathName;\n    this.alternate = alternate; // Used only for \\sqrt, \\phase, & tall delims\n  }\n  toNode() {\n    var svgNS = \"http://www.w3.org/2000/svg\";\n    var node = document.createElementNS(svgNS, \"path\");\n    if (this.alternate) {\n      node.setAttribute(\"d\", this.alternate);\n    } else {\n      node.setAttribute(\"d\", path[this.pathName]);\n    }\n    return node;\n  }\n  toMarkup() {\n    if (this.alternate) {\n      return \"<path d=\\\"\" + escape(this.alternate) + \"\\\"/>\";\n    } else {\n      return \"<path d=\\\"\" + escape(path[this.pathName]) + \"\\\"/>\";\n    }\n  }\n}\nclass LineNode {\n  constructor(attributes) {\n    this.attributes = attributes || {};\n  }\n  toNode() {\n    var svgNS = \"http://www.w3.org/2000/svg\";\n    var node = document.createElementNS(svgNS, \"line\");\n    // Apply attributes\n    for (var attr of Object.keys(this.attributes)) {\n      node.setAttribute(attr, this.attributes[attr]);\n    }\n    return node;\n  }\n  toMarkup() {\n    var markup = \"<line\";\n    for (var attr of Object.keys(this.attributes)) {\n      markup += \" \" + attr + \"=\\\"\" + escape(this.attributes[attr]) + \"\\\"\";\n    }\n    markup += \"/>\";\n    return markup;\n  }\n}\nfunction assertSymbolDomNode(group) {\n  if (group instanceof SymbolNode) {\n    return group;\n  } else {\n    throw new Error(\"Expected symbolNode but got \" + String(group) + \".\");\n  }\n}\nfunction assertSpan(group) {\n  if (group instanceof Span) {\n    return group;\n  } else {\n    throw new Error(\"Expected span<HtmlDomNode> but got \" + String(group) + \".\");\n  }\n}\n/**\n * Whether an HtmlDomNode has HtmlDomNode children.\n * HtmlDomNode is a base type representing a union of\n * SymbolNode, SvgSpan, DomSpan, Anchor, and documentFragment.\n * In the last three cases, the children are HtmlDomNode[].\n */\nvar hasHtmlDomChildren = node => node instanceof Span || node instanceof Anchor || node instanceof DocumentFragment;\n\n// This file is GENERATED by buildMetrics.sh. DO NOT MODIFY.\nvar fontMetricsData = {\n  \"AMS-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"65\": [0, 0.68889, 0, 0, 0.72222],\n    \"66\": [0, 0.68889, 0, 0, 0.66667],\n    \"67\": [0, 0.68889, 0, 0, 0.72222],\n    \"68\": [0, 0.68889, 0, 0, 0.72222],\n    \"69\": [0, 0.68889, 0, 0, 0.66667],\n    \"70\": [0, 0.68889, 0, 0, 0.61111],\n    \"71\": [0, 0.68889, 0, 0, 0.77778],\n    \"72\": [0, 0.68889, 0, 0, 0.77778],\n    \"73\": [0, 0.68889, 0, 0, 0.38889],\n    \"74\": [0.16667, 0.68889, 0, 0, 0.5],\n    \"75\": [0, 0.68889, 0, 0, 0.77778],\n    \"76\": [0, 0.68889, 0, 0, 0.66667],\n    \"77\": [0, 0.68889, 0, 0, 0.94445],\n    \"78\": [0, 0.68889, 0, 0, 0.72222],\n    \"79\": [0.16667, 0.68889, 0, 0, 0.77778],\n    \"80\": [0, 0.68889, 0, 0, 0.61111],\n    \"81\": [0.16667, 0.68889, 0, 0, 0.77778],\n    \"82\": [0, 0.68889, 0, 0, 0.72222],\n    \"83\": [0, 0.68889, 0, 0, 0.55556],\n    \"84\": [0, 0.68889, 0, 0, 0.66667],\n    \"85\": [0, 0.68889, 0, 0, 0.72222],\n    \"86\": [0, 0.68889, 0, 0, 0.72222],\n    \"87\": [0, 0.68889, 0, 0, 1.0],\n    \"88\": [0, 0.68889, 0, 0, 0.72222],\n    \"89\": [0, 0.68889, 0, 0, 0.72222],\n    \"90\": [0, 0.68889, 0, 0, 0.66667],\n    \"107\": [0, 0.68889, 0, 0, 0.55556],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"165\": [0, 0.675, 0.025, 0, 0.75],\n    \"174\": [0.15559, 0.69224, 0, 0, 0.94666],\n    \"240\": [0, 0.68889, 0, 0, 0.55556],\n    \"295\": [0, 0.68889, 0, 0, 0.54028],\n    \"710\": [0, 0.825, 0, 0, 2.33334],\n    \"732\": [0, 0.9, 0, 0, 2.33334],\n    \"770\": [0, 0.825, 0, 0, 2.33334],\n    \"771\": [0, 0.9, 0, 0, 2.33334],\n    \"989\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"1008\": [0, 0.43056, 0.04028, 0, 0.66667],\n    \"8245\": [0, 0.54986, 0, 0, 0.275],\n    \"8463\": [0, 0.68889, 0, 0, 0.54028],\n    \"8487\": [0, 0.68889, 0, 0, 0.72222],\n    \"8498\": [0, 0.68889, 0, 0, 0.55556],\n    \"8502\": [0, 0.68889, 0, 0, 0.66667],\n    \"8503\": [0, 0.68889, 0, 0, 0.44445],\n    \"8504\": [0, 0.68889, 0, 0, 0.66667],\n    \"8513\": [0, 0.68889, 0, 0, 0.63889],\n    \"8592\": [-0.03598, 0.46402, 0, 0, 0.5],\n    \"8594\": [-0.03598, 0.46402, 0, 0, 0.5],\n    \"8602\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8603\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8606\": [0.01354, 0.52239, 0, 0, 1.0],\n    \"8608\": [0.01354, 0.52239, 0, 0, 1.0],\n    \"8610\": [0.01354, 0.52239, 0, 0, 1.11111],\n    \"8611\": [0.01354, 0.52239, 0, 0, 1.11111],\n    \"8619\": [0, 0.54986, 0, 0, 1.0],\n    \"8620\": [0, 0.54986, 0, 0, 1.0],\n    \"8621\": [-0.13313, 0.37788, 0, 0, 1.38889],\n    \"8622\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8624\": [0, 0.69224, 0, 0, 0.5],\n    \"8625\": [0, 0.69224, 0, 0, 0.5],\n    \"8630\": [0, 0.43056, 0, 0, 1.0],\n    \"8631\": [0, 0.43056, 0, 0, 1.0],\n    \"8634\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8635\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8638\": [0.19444, 0.69224, 0, 0, 0.41667],\n    \"8639\": [0.19444, 0.69224, 0, 0, 0.41667],\n    \"8642\": [0.19444, 0.69224, 0, 0, 0.41667],\n    \"8643\": [0.19444, 0.69224, 0, 0, 0.41667],\n    \"8644\": [0.1808, 0.675, 0, 0, 1.0],\n    \"8646\": [0.1808, 0.675, 0, 0, 1.0],\n    \"8647\": [0.1808, 0.675, 0, 0, 1.0],\n    \"8648\": [0.19444, 0.69224, 0, 0, 0.83334],\n    \"8649\": [0.1808, 0.675, 0, 0, 1.0],\n    \"8650\": [0.19444, 0.69224, 0, 0, 0.83334],\n    \"8651\": [0.01354, 0.52239, 0, 0, 1.0],\n    \"8652\": [0.01354, 0.52239, 0, 0, 1.0],\n    \"8653\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8654\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8655\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8666\": [0.13667, 0.63667, 0, 0, 1.0],\n    \"8667\": [0.13667, 0.63667, 0, 0, 1.0],\n    \"8669\": [-0.13313, 0.37788, 0, 0, 1.0],\n    \"8672\": [-0.064, 0.437, 0, 0, 1.334],\n    \"8674\": [-0.064, 0.437, 0, 0, 1.334],\n    \"8705\": [0, 0.825, 0, 0, 0.5],\n    \"8708\": [0, 0.68889, 0, 0, 0.55556],\n    \"8709\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8717\": [0, 0.43056, 0, 0, 0.42917],\n    \"8722\": [-0.03598, 0.46402, 0, 0, 0.5],\n    \"8724\": [0.08198, 0.69224, 0, 0, 0.77778],\n    \"8726\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8733\": [0, 0.69224, 0, 0, 0.77778],\n    \"8736\": [0, 0.69224, 0, 0, 0.72222],\n    \"8737\": [0, 0.69224, 0, 0, 0.72222],\n    \"8738\": [0.03517, 0.52239, 0, 0, 0.72222],\n    \"8739\": [0.08167, 0.58167, 0, 0, 0.22222],\n    \"8740\": [0.25142, 0.74111, 0, 0, 0.27778],\n    \"8741\": [0.08167, 0.58167, 0, 0, 0.38889],\n    \"8742\": [0.25142, 0.74111, 0, 0, 0.5],\n    \"8756\": [0, 0.69224, 0, 0, 0.66667],\n    \"8757\": [0, 0.69224, 0, 0, 0.66667],\n    \"8764\": [-0.13313, 0.36687, 0, 0, 0.77778],\n    \"8765\": [-0.13313, 0.37788, 0, 0, 0.77778],\n    \"8769\": [-0.13313, 0.36687, 0, 0, 0.77778],\n    \"8770\": [-0.03625, 0.46375, 0, 0, 0.77778],\n    \"8774\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8776\": [-0.01688, 0.48312, 0, 0, 0.77778],\n    \"8778\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8782\": [0.06062, 0.54986, 0, 0, 0.77778],\n    \"8783\": [0.06062, 0.54986, 0, 0, 0.77778],\n    \"8785\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8786\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8787\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8790\": [0, 0.69224, 0, 0, 0.77778],\n    \"8791\": [0.22958, 0.72958, 0, 0, 0.77778],\n    \"8796\": [0.08198, 0.91667, 0, 0, 0.77778],\n    \"8806\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"8807\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"8808\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"8809\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"8812\": [0.25583, 0.75583, 0, 0, 0.5],\n    \"8814\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8815\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8816\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8817\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8818\": [0.22958, 0.72958, 0, 0, 0.77778],\n    \"8819\": [0.22958, 0.72958, 0, 0, 0.77778],\n    \"8822\": [0.1808, 0.675, 0, 0, 0.77778],\n    \"8823\": [0.1808, 0.675, 0, 0, 0.77778],\n    \"8828\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8829\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8830\": [0.22958, 0.72958, 0, 0, 0.77778],\n    \"8831\": [0.22958, 0.72958, 0, 0, 0.77778],\n    \"8832\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8833\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8840\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8841\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8842\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8843\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8847\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8848\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8858\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8859\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8861\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8862\": [0, 0.675, 0, 0, 0.77778],\n    \"8863\": [0, 0.675, 0, 0, 0.77778],\n    \"8864\": [0, 0.675, 0, 0, 0.77778],\n    \"8865\": [0, 0.675, 0, 0, 0.77778],\n    \"8872\": [0, 0.69224, 0, 0, 0.61111],\n    \"8873\": [0, 0.69224, 0, 0, 0.72222],\n    \"8874\": [0, 0.69224, 0, 0, 0.88889],\n    \"8876\": [0, 0.68889, 0, 0, 0.61111],\n    \"8877\": [0, 0.68889, 0, 0, 0.61111],\n    \"8878\": [0, 0.68889, 0, 0, 0.72222],\n    \"8879\": [0, 0.68889, 0, 0, 0.72222],\n    \"8882\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8883\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8884\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8885\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8888\": [0, 0.54986, 0, 0, 1.11111],\n    \"8890\": [0.19444, 0.43056, 0, 0, 0.55556],\n    \"8891\": [0.19444, 0.69224, 0, 0, 0.61111],\n    \"8892\": [0.19444, 0.69224, 0, 0, 0.61111],\n    \"8901\": [0, 0.54986, 0, 0, 0.27778],\n    \"8903\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8905\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8906\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8907\": [0, 0.69224, 0, 0, 0.77778],\n    \"8908\": [0, 0.69224, 0, 0, 0.77778],\n    \"8909\": [-0.03598, 0.46402, 0, 0, 0.77778],\n    \"8910\": [0, 0.54986, 0, 0, 0.76042],\n    \"8911\": [0, 0.54986, 0, 0, 0.76042],\n    \"8912\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8913\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8914\": [0, 0.54986, 0, 0, 0.66667],\n    \"8915\": [0, 0.54986, 0, 0, 0.66667],\n    \"8916\": [0, 0.69224, 0, 0, 0.66667],\n    \"8918\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8919\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8920\": [0.03517, 0.54986, 0, 0, 1.33334],\n    \"8921\": [0.03517, 0.54986, 0, 0, 1.33334],\n    \"8922\": [0.38569, 0.88569, 0, 0, 0.77778],\n    \"8923\": [0.38569, 0.88569, 0, 0, 0.77778],\n    \"8926\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8927\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8928\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8929\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8934\": [0.23222, 0.74111, 0, 0, 0.77778],\n    \"8935\": [0.23222, 0.74111, 0, 0, 0.77778],\n    \"8936\": [0.23222, 0.74111, 0, 0, 0.77778],\n    \"8937\": [0.23222, 0.74111, 0, 0, 0.77778],\n    \"8938\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8939\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8940\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8941\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8994\": [0.19444, 0.69224, 0, 0, 0.77778],\n    \"8995\": [0.19444, 0.69224, 0, 0, 0.77778],\n    \"9416\": [0.15559, 0.69224, 0, 0, 0.90222],\n    \"9484\": [0, 0.69224, 0, 0, 0.5],\n    \"9488\": [0, 0.69224, 0, 0, 0.5],\n    \"9492\": [0, 0.37788, 0, 0, 0.5],\n    \"9496\": [0, 0.37788, 0, 0, 0.5],\n    \"9585\": [0.19444, 0.68889, 0, 0, 0.88889],\n    \"9586\": [0.19444, 0.74111, 0, 0, 0.88889],\n    \"9632\": [0, 0.675, 0, 0, 0.77778],\n    \"9633\": [0, 0.675, 0, 0, 0.77778],\n    \"9650\": [0, 0.54986, 0, 0, 0.72222],\n    \"9651\": [0, 0.54986, 0, 0, 0.72222],\n    \"9654\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"9660\": [0, 0.54986, 0, 0, 0.72222],\n    \"9661\": [0, 0.54986, 0, 0, 0.72222],\n    \"9664\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"9674\": [0.11111, 0.69224, 0, 0, 0.66667],\n    \"9733\": [0.19444, 0.69224, 0, 0, 0.94445],\n    \"10003\": [0, 0.69224, 0, 0, 0.83334],\n    \"10016\": [0, 0.69224, 0, 0, 0.83334],\n    \"10731\": [0.11111, 0.69224, 0, 0, 0.66667],\n    \"10846\": [0.19444, 0.75583, 0, 0, 0.61111],\n    \"10877\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"10878\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"10885\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"10886\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"10887\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"10888\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"10889\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10890\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10891\": [0.48256, 0.98256, 0, 0, 0.77778],\n    \"10892\": [0.48256, 0.98256, 0, 0, 0.77778],\n    \"10901\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"10902\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"10933\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"10934\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"10935\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10936\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10937\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10938\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10949\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"10950\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"10955\": [0.28481, 0.79383, 0, 0, 0.77778],\n    \"10956\": [0.28481, 0.79383, 0, 0, 0.77778],\n    \"57350\": [0.08167, 0.58167, 0, 0, 0.22222],\n    \"57351\": [0.08167, 0.58167, 0, 0, 0.38889],\n    \"57352\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"57353\": [0, 0.43056, 0.04028, 0, 0.66667],\n    \"57356\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57357\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57358\": [0.41951, 0.91951, 0, 0, 0.77778],\n    \"57359\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"57360\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"57361\": [0.41951, 0.91951, 0, 0, 0.77778],\n    \"57366\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57367\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57368\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57369\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57370\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"57371\": [0.13597, 0.63597, 0, 0, 0.77778]\n  },\n  \"Caligraphic-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"65\": [0, 0.68333, 0, 0.19445, 0.79847],\n    \"66\": [0, 0.68333, 0.03041, 0.13889, 0.65681],\n    \"67\": [0, 0.68333, 0.05834, 0.13889, 0.52653],\n    \"68\": [0, 0.68333, 0.02778, 0.08334, 0.77139],\n    \"69\": [0, 0.68333, 0.08944, 0.11111, 0.52778],\n    \"70\": [0, 0.68333, 0.09931, 0.11111, 0.71875],\n    \"71\": [0.09722, 0.68333, 0.0593, 0.11111, 0.59487],\n    \"72\": [0, 0.68333, 0.00965, 0.11111, 0.84452],\n    \"73\": [0, 0.68333, 0.07382, 0, 0.54452],\n    \"74\": [0.09722, 0.68333, 0.18472, 0.16667, 0.67778],\n    \"75\": [0, 0.68333, 0.01445, 0.05556, 0.76195],\n    \"76\": [0, 0.68333, 0, 0.13889, 0.68972],\n    \"77\": [0, 0.68333, 0, 0.13889, 1.2009],\n    \"78\": [0, 0.68333, 0.14736, 0.08334, 0.82049],\n    \"79\": [0, 0.68333, 0.02778, 0.11111, 0.79611],\n    \"80\": [0, 0.68333, 0.08222, 0.08334, 0.69556],\n    \"81\": [0.09722, 0.68333, 0, 0.11111, 0.81667],\n    \"82\": [0, 0.68333, 0, 0.08334, 0.8475],\n    \"83\": [0, 0.68333, 0.075, 0.13889, 0.60556],\n    \"84\": [0, 0.68333, 0.25417, 0, 0.54464],\n    \"85\": [0, 0.68333, 0.09931, 0.08334, 0.62583],\n    \"86\": [0, 0.68333, 0.08222, 0, 0.61278],\n    \"87\": [0, 0.68333, 0.08222, 0.08334, 0.98778],\n    \"88\": [0, 0.68333, 0.14643, 0.13889, 0.7133],\n    \"89\": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834],\n    \"90\": [0, 0.68333, 0.07944, 0.13889, 0.72473],\n    \"160\": [0, 0, 0, 0, 0.25]\n  },\n  \"Fraktur-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69141, 0, 0, 0.29574],\n    \"34\": [0, 0.69141, 0, 0, 0.21471],\n    \"38\": [0, 0.69141, 0, 0, 0.73786],\n    \"39\": [0, 0.69141, 0, 0, 0.21201],\n    \"40\": [0.24982, 0.74947, 0, 0, 0.38865],\n    \"41\": [0.24982, 0.74947, 0, 0, 0.38865],\n    \"42\": [0, 0.62119, 0, 0, 0.27764],\n    \"43\": [0.08319, 0.58283, 0, 0, 0.75623],\n    \"44\": [0, 0.10803, 0, 0, 0.27764],\n    \"45\": [0.08319, 0.58283, 0, 0, 0.75623],\n    \"46\": [0, 0.10803, 0, 0, 0.27764],\n    \"47\": [0.24982, 0.74947, 0, 0, 0.50181],\n    \"48\": [0, 0.47534, 0, 0, 0.50181],\n    \"49\": [0, 0.47534, 0, 0, 0.50181],\n    \"50\": [0, 0.47534, 0, 0, 0.50181],\n    \"51\": [0.18906, 0.47534, 0, 0, 0.50181],\n    \"52\": [0.18906, 0.47534, 0, 0, 0.50181],\n    \"53\": [0.18906, 0.47534, 0, 0, 0.50181],\n    \"54\": [0, 0.69141, 0, 0, 0.50181],\n    \"55\": [0.18906, 0.47534, 0, 0, 0.50181],\n    \"56\": [0, 0.69141, 0, 0, 0.50181],\n    \"57\": [0.18906, 0.47534, 0, 0, 0.50181],\n    \"58\": [0, 0.47534, 0, 0, 0.21606],\n    \"59\": [0.12604, 0.47534, 0, 0, 0.21606],\n    \"61\": [-0.13099, 0.36866, 0, 0, 0.75623],\n    \"63\": [0, 0.69141, 0, 0, 0.36245],\n    \"65\": [0, 0.69141, 0, 0, 0.7176],\n    \"66\": [0, 0.69141, 0, 0, 0.88397],\n    \"67\": [0, 0.69141, 0, 0, 0.61254],\n    \"68\": [0, 0.69141, 0, 0, 0.83158],\n    \"69\": [0, 0.69141, 0, 0, 0.66278],\n    \"70\": [0.12604, 0.69141, 0, 0, 0.61119],\n    \"71\": [0, 0.69141, 0, 0, 0.78539],\n    \"72\": [0.06302, 0.69141, 0, 0, 0.7203],\n    \"73\": [0, 0.69141, 0, 0, 0.55448],\n    \"74\": [0.12604, 0.69141, 0, 0, 0.55231],\n    \"75\": [0, 0.69141, 0, 0, 0.66845],\n    \"76\": [0, 0.69141, 0, 0, 0.66602],\n    \"77\": [0, 0.69141, 0, 0, 1.04953],\n    \"78\": [0, 0.69141, 0, 0, 0.83212],\n    \"79\": [0, 0.69141, 0, 0, 0.82699],\n    \"80\": [0.18906, 0.69141, 0, 0, 0.82753],\n    \"81\": [0.03781, 0.69141, 0, 0, 0.82699],\n    \"82\": [0, 0.69141, 0, 0, 0.82807],\n    \"83\": [0, 0.69141, 0, 0, 0.82861],\n    \"84\": [0, 0.69141, 0, 0, 0.66899],\n    \"85\": [0, 0.69141, 0, 0, 0.64576],\n    \"86\": [0, 0.69141, 0, 0, 0.83131],\n    \"87\": [0, 0.69141, 0, 0, 1.04602],\n    \"88\": [0, 0.69141, 0, 0, 0.71922],\n    \"89\": [0.18906, 0.69141, 0, 0, 0.83293],\n    \"90\": [0.12604, 0.69141, 0, 0, 0.60201],\n    \"91\": [0.24982, 0.74947, 0, 0, 0.27764],\n    \"93\": [0.24982, 0.74947, 0, 0, 0.27764],\n    \"94\": [0, 0.69141, 0, 0, 0.49965],\n    \"97\": [0, 0.47534, 0, 0, 0.50046],\n    \"98\": [0, 0.69141, 0, 0, 0.51315],\n    \"99\": [0, 0.47534, 0, 0, 0.38946],\n    \"100\": [0, 0.62119, 0, 0, 0.49857],\n    \"101\": [0, 0.47534, 0, 0, 0.40053],\n    \"102\": [0.18906, 0.69141, 0, 0, 0.32626],\n    \"103\": [0.18906, 0.47534, 0, 0, 0.5037],\n    \"104\": [0.18906, 0.69141, 0, 0, 0.52126],\n    \"105\": [0, 0.69141, 0, 0, 0.27899],\n    \"106\": [0, 0.69141, 0, 0, 0.28088],\n    \"107\": [0, 0.69141, 0, 0, 0.38946],\n    \"108\": [0, 0.69141, 0, 0, 0.27953],\n    \"109\": [0, 0.47534, 0, 0, 0.76676],\n    \"110\": [0, 0.47534, 0, 0, 0.52666],\n    \"111\": [0, 0.47534, 0, 0, 0.48885],\n    \"112\": [0.18906, 0.52396, 0, 0, 0.50046],\n    \"113\": [0.18906, 0.47534, 0, 0, 0.48912],\n    \"114\": [0, 0.47534, 0, 0, 0.38919],\n    \"115\": [0, 0.47534, 0, 0, 0.44266],\n    \"116\": [0, 0.62119, 0, 0, 0.33301],\n    \"117\": [0, 0.47534, 0, 0, 0.5172],\n    \"118\": [0, 0.52396, 0, 0, 0.5118],\n    \"119\": [0, 0.52396, 0, 0, 0.77351],\n    \"120\": [0.18906, 0.47534, 0, 0, 0.38865],\n    \"121\": [0.18906, 0.47534, 0, 0, 0.49884],\n    \"122\": [0.18906, 0.47534, 0, 0, 0.39054],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"8216\": [0, 0.69141, 0, 0, 0.21471],\n    \"8217\": [0, 0.69141, 0, 0, 0.21471],\n    \"58112\": [0, 0.62119, 0, 0, 0.49749],\n    \"58113\": [0, 0.62119, 0, 0, 0.4983],\n    \"58114\": [0.18906, 0.69141, 0, 0, 0.33328],\n    \"58115\": [0.18906, 0.69141, 0, 0, 0.32923],\n    \"58116\": [0.18906, 0.47534, 0, 0, 0.50343],\n    \"58117\": [0, 0.69141, 0, 0, 0.33301],\n    \"58118\": [0, 0.62119, 0, 0, 0.33409],\n    \"58119\": [0, 0.47534, 0, 0, 0.50073]\n  },\n  \"Main-Bold\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0, 0, 0.35],\n    \"34\": [0, 0.69444, 0, 0, 0.60278],\n    \"35\": [0.19444, 0.69444, 0, 0, 0.95833],\n    \"36\": [0.05556, 0.75, 0, 0, 0.575],\n    \"37\": [0.05556, 0.75, 0, 0, 0.95833],\n    \"38\": [0, 0.69444, 0, 0, 0.89444],\n    \"39\": [0, 0.69444, 0, 0, 0.31944],\n    \"40\": [0.25, 0.75, 0, 0, 0.44722],\n    \"41\": [0.25, 0.75, 0, 0, 0.44722],\n    \"42\": [0, 0.75, 0, 0, 0.575],\n    \"43\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"44\": [0.19444, 0.15556, 0, 0, 0.31944],\n    \"45\": [0, 0.44444, 0, 0, 0.38333],\n    \"46\": [0, 0.15556, 0, 0, 0.31944],\n    \"47\": [0.25, 0.75, 0, 0, 0.575],\n    \"48\": [0, 0.64444, 0, 0, 0.575],\n    \"49\": [0, 0.64444, 0, 0, 0.575],\n    \"50\": [0, 0.64444, 0, 0, 0.575],\n    \"51\": [0, 0.64444, 0, 0, 0.575],\n    \"52\": [0, 0.64444, 0, 0, 0.575],\n    \"53\": [0, 0.64444, 0, 0, 0.575],\n    \"54\": [0, 0.64444, 0, 0, 0.575],\n    \"55\": [0, 0.64444, 0, 0, 0.575],\n    \"56\": [0, 0.64444, 0, 0, 0.575],\n    \"57\": [0, 0.64444, 0, 0, 0.575],\n    \"58\": [0, 0.44444, 0, 0, 0.31944],\n    \"59\": [0.19444, 0.44444, 0, 0, 0.31944],\n    \"60\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"61\": [-0.10889, 0.39111, 0, 0, 0.89444],\n    \"62\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"63\": [0, 0.69444, 0, 0, 0.54305],\n    \"64\": [0, 0.69444, 0, 0, 0.89444],\n    \"65\": [0, 0.68611, 0, 0, 0.86944],\n    \"66\": [0, 0.68611, 0, 0, 0.81805],\n    \"67\": [0, 0.68611, 0, 0, 0.83055],\n    \"68\": [0, 0.68611, 0, 0, 0.88194],\n    \"69\": [0, 0.68611, 0, 0, 0.75555],\n    \"70\": [0, 0.68611, 0, 0, 0.72361],\n    \"71\": [0, 0.68611, 0, 0, 0.90416],\n    \"72\": [0, 0.68611, 0, 0, 0.9],\n    \"73\": [0, 0.68611, 0, 0, 0.43611],\n    \"74\": [0, 0.68611, 0, 0, 0.59444],\n    \"75\": [0, 0.68611, 0, 0, 0.90138],\n    \"76\": [0, 0.68611, 0, 0, 0.69166],\n    \"77\": [0, 0.68611, 0, 0, 1.09166],\n    \"78\": [0, 0.68611, 0, 0, 0.9],\n    \"79\": [0, 0.68611, 0, 0, 0.86388],\n    \"80\": [0, 0.68611, 0, 0, 0.78611],\n    \"81\": [0.19444, 0.68611, 0, 0, 0.86388],\n    \"82\": [0, 0.68611, 0, 0, 0.8625],\n    \"83\": [0, 0.68611, 0, 0, 0.63889],\n    \"84\": [0, 0.68611, 0, 0, 0.8],\n    \"85\": [0, 0.68611, 0, 0, 0.88472],\n    \"86\": [0, 0.68611, 0.01597, 0, 0.86944],\n    \"87\": [0, 0.68611, 0.01597, 0, 1.18888],\n    \"88\": [0, 0.68611, 0, 0, 0.86944],\n    \"89\": [0, 0.68611, 0.02875, 0, 0.86944],\n    \"90\": [0, 0.68611, 0, 0, 0.70277],\n    \"91\": [0.25, 0.75, 0, 0, 0.31944],\n    \"92\": [0.25, 0.75, 0, 0, 0.575],\n    \"93\": [0.25, 0.75, 0, 0, 0.31944],\n    \"94\": [0, 0.69444, 0, 0, 0.575],\n    \"95\": [0.31, 0.13444, 0.03194, 0, 0.575],\n    \"97\": [0, 0.44444, 0, 0, 0.55902],\n    \"98\": [0, 0.69444, 0, 0, 0.63889],\n    \"99\": [0, 0.44444, 0, 0, 0.51111],\n    \"100\": [0, 0.69444, 0, 0, 0.63889],\n    \"101\": [0, 0.44444, 0, 0, 0.52708],\n    \"102\": [0, 0.69444, 0.10903, 0, 0.35139],\n    \"103\": [0.19444, 0.44444, 0.01597, 0, 0.575],\n    \"104\": [0, 0.69444, 0, 0, 0.63889],\n    \"105\": [0, 0.69444, 0, 0, 0.31944],\n    \"106\": [0.19444, 0.69444, 0, 0, 0.35139],\n    \"107\": [0, 0.69444, 0, 0, 0.60694],\n    \"108\": [0, 0.69444, 0, 0, 0.31944],\n    \"109\": [0, 0.44444, 0, 0, 0.95833],\n    \"110\": [0, 0.44444, 0, 0, 0.63889],\n    \"111\": [0, 0.44444, 0, 0, 0.575],\n    \"112\": [0.19444, 0.44444, 0, 0, 0.63889],\n    \"113\": [0.19444, 0.44444, 0, 0, 0.60694],\n    \"114\": [0, 0.44444, 0, 0, 0.47361],\n    \"115\": [0, 0.44444, 0, 0, 0.45361],\n    \"116\": [0, 0.63492, 0, 0, 0.44722],\n    \"117\": [0, 0.44444, 0, 0, 0.63889],\n    \"118\": [0, 0.44444, 0.01597, 0, 0.60694],\n    \"119\": [0, 0.44444, 0.01597, 0, 0.83055],\n    \"120\": [0, 0.44444, 0, 0, 0.60694],\n    \"121\": [0.19444, 0.44444, 0.01597, 0, 0.60694],\n    \"122\": [0, 0.44444, 0, 0, 0.51111],\n    \"123\": [0.25, 0.75, 0, 0, 0.575],\n    \"124\": [0.25, 0.75, 0, 0, 0.31944],\n    \"125\": [0.25, 0.75, 0, 0, 0.575],\n    \"126\": [0.35, 0.34444, 0, 0, 0.575],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"163\": [0, 0.69444, 0, 0, 0.86853],\n    \"168\": [0, 0.69444, 0, 0, 0.575],\n    \"172\": [0, 0.44444, 0, 0, 0.76666],\n    \"176\": [0, 0.69444, 0, 0, 0.86944],\n    \"177\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"184\": [0.17014, 0, 0, 0, 0.51111],\n    \"198\": [0, 0.68611, 0, 0, 1.04166],\n    \"215\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"216\": [0.04861, 0.73472, 0, 0, 0.89444],\n    \"223\": [0, 0.69444, 0, 0, 0.59722],\n    \"230\": [0, 0.44444, 0, 0, 0.83055],\n    \"247\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"248\": [0.09722, 0.54167, 0, 0, 0.575],\n    \"305\": [0, 0.44444, 0, 0, 0.31944],\n    \"338\": [0, 0.68611, 0, 0, 1.16944],\n    \"339\": [0, 0.44444, 0, 0, 0.89444],\n    \"567\": [0.19444, 0.44444, 0, 0, 0.35139],\n    \"710\": [0, 0.69444, 0, 0, 0.575],\n    \"711\": [0, 0.63194, 0, 0, 0.575],\n    \"713\": [0, 0.59611, 0, 0, 0.575],\n    \"714\": [0, 0.69444, 0, 0, 0.575],\n    \"715\": [0, 0.69444, 0, 0, 0.575],\n    \"728\": [0, 0.69444, 0, 0, 0.575],\n    \"729\": [0, 0.69444, 0, 0, 0.31944],\n    \"730\": [0, 0.69444, 0, 0, 0.86944],\n    \"732\": [0, 0.69444, 0, 0, 0.575],\n    \"733\": [0, 0.69444, 0, 0, 0.575],\n    \"915\": [0, 0.68611, 0, 0, 0.69166],\n    \"916\": [0, 0.68611, 0, 0, 0.95833],\n    \"920\": [0, 0.68611, 0, 0, 0.89444],\n    \"923\": [0, 0.68611, 0, 0, 0.80555],\n    \"926\": [0, 0.68611, 0, 0, 0.76666],\n    \"928\": [0, 0.68611, 0, 0, 0.9],\n    \"931\": [0, 0.68611, 0, 0, 0.83055],\n    \"933\": [0, 0.68611, 0, 0, 0.89444],\n    \"934\": [0, 0.68611, 0, 0, 0.83055],\n    \"936\": [0, 0.68611, 0, 0, 0.89444],\n    \"937\": [0, 0.68611, 0, 0, 0.83055],\n    \"8211\": [0, 0.44444, 0.03194, 0, 0.575],\n    \"8212\": [0, 0.44444, 0.03194, 0, 1.14999],\n    \"8216\": [0, 0.69444, 0, 0, 0.31944],\n    \"8217\": [0, 0.69444, 0, 0, 0.31944],\n    \"8220\": [0, 0.69444, 0, 0, 0.60278],\n    \"8221\": [0, 0.69444, 0, 0, 0.60278],\n    \"8224\": [0.19444, 0.69444, 0, 0, 0.51111],\n    \"8225\": [0.19444, 0.69444, 0, 0, 0.51111],\n    \"8242\": [0, 0.55556, 0, 0, 0.34444],\n    \"8407\": [0, 0.72444, 0.15486, 0, 0.575],\n    \"8463\": [0, 0.69444, 0, 0, 0.66759],\n    \"8465\": [0, 0.69444, 0, 0, 0.83055],\n    \"8467\": [0, 0.69444, 0, 0, 0.47361],\n    \"8472\": [0.19444, 0.44444, 0, 0, 0.74027],\n    \"8476\": [0, 0.69444, 0, 0, 0.83055],\n    \"8501\": [0, 0.69444, 0, 0, 0.70277],\n    \"8592\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8593\": [0.19444, 0.69444, 0, 0, 0.575],\n    \"8594\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8595\": [0.19444, 0.69444, 0, 0, 0.575],\n    \"8596\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8597\": [0.25, 0.75, 0, 0, 0.575],\n    \"8598\": [0.19444, 0.69444, 0, 0, 1.14999],\n    \"8599\": [0.19444, 0.69444, 0, 0, 1.14999],\n    \"8600\": [0.19444, 0.69444, 0, 0, 1.14999],\n    \"8601\": [0.19444, 0.69444, 0, 0, 1.14999],\n    \"8636\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8637\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8640\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8641\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8656\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8657\": [0.19444, 0.69444, 0, 0, 0.70277],\n    \"8658\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8659\": [0.19444, 0.69444, 0, 0, 0.70277],\n    \"8660\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8661\": [0.25, 0.75, 0, 0, 0.70277],\n    \"8704\": [0, 0.69444, 0, 0, 0.63889],\n    \"8706\": [0, 0.69444, 0.06389, 0, 0.62847],\n    \"8707\": [0, 0.69444, 0, 0, 0.63889],\n    \"8709\": [0.05556, 0.75, 0, 0, 0.575],\n    \"8711\": [0, 0.68611, 0, 0, 0.95833],\n    \"8712\": [0.08556, 0.58556, 0, 0, 0.76666],\n    \"8715\": [0.08556, 0.58556, 0, 0, 0.76666],\n    \"8722\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8723\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8725\": [0.25, 0.75, 0, 0, 0.575],\n    \"8726\": [0.25, 0.75, 0, 0, 0.575],\n    \"8727\": [-0.02778, 0.47222, 0, 0, 0.575],\n    \"8728\": [-0.02639, 0.47361, 0, 0, 0.575],\n    \"8729\": [-0.02639, 0.47361, 0, 0, 0.575],\n    \"8730\": [0.18, 0.82, 0, 0, 0.95833],\n    \"8733\": [0, 0.44444, 0, 0, 0.89444],\n    \"8734\": [0, 0.44444, 0, 0, 1.14999],\n    \"8736\": [0, 0.69224, 0, 0, 0.72222],\n    \"8739\": [0.25, 0.75, 0, 0, 0.31944],\n    \"8741\": [0.25, 0.75, 0, 0, 0.575],\n    \"8743\": [0, 0.55556, 0, 0, 0.76666],\n    \"8744\": [0, 0.55556, 0, 0, 0.76666],\n    \"8745\": [0, 0.55556, 0, 0, 0.76666],\n    \"8746\": [0, 0.55556, 0, 0, 0.76666],\n    \"8747\": [0.19444, 0.69444, 0.12778, 0, 0.56875],\n    \"8764\": [-0.10889, 0.39111, 0, 0, 0.89444],\n    \"8768\": [0.19444, 0.69444, 0, 0, 0.31944],\n    \"8771\": [0.00222, 0.50222, 0, 0, 0.89444],\n    \"8773\": [0.027, 0.638, 0, 0, 0.894],\n    \"8776\": [0.02444, 0.52444, 0, 0, 0.89444],\n    \"8781\": [0.00222, 0.50222, 0, 0, 0.89444],\n    \"8801\": [0.00222, 0.50222, 0, 0, 0.89444],\n    \"8804\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8805\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8810\": [0.08556, 0.58556, 0, 0, 1.14999],\n    \"8811\": [0.08556, 0.58556, 0, 0, 1.14999],\n    \"8826\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"8827\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"8834\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"8835\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"8838\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8839\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8846\": [0, 0.55556, 0, 0, 0.76666],\n    \"8849\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8850\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8851\": [0, 0.55556, 0, 0, 0.76666],\n    \"8852\": [0, 0.55556, 0, 0, 0.76666],\n    \"8853\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8854\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8855\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8856\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8857\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8866\": [0, 0.69444, 0, 0, 0.70277],\n    \"8867\": [0, 0.69444, 0, 0, 0.70277],\n    \"8868\": [0, 0.69444, 0, 0, 0.89444],\n    \"8869\": [0, 0.69444, 0, 0, 0.89444],\n    \"8900\": [-0.02639, 0.47361, 0, 0, 0.575],\n    \"8901\": [-0.02639, 0.47361, 0, 0, 0.31944],\n    \"8902\": [-0.02778, 0.47222, 0, 0, 0.575],\n    \"8968\": [0.25, 0.75, 0, 0, 0.51111],\n    \"8969\": [0.25, 0.75, 0, 0, 0.51111],\n    \"8970\": [0.25, 0.75, 0, 0, 0.51111],\n    \"8971\": [0.25, 0.75, 0, 0, 0.51111],\n    \"8994\": [-0.13889, 0.36111, 0, 0, 1.14999],\n    \"8995\": [-0.13889, 0.36111, 0, 0, 1.14999],\n    \"9651\": [0.19444, 0.69444, 0, 0, 1.02222],\n    \"9657\": [-0.02778, 0.47222, 0, 0, 0.575],\n    \"9661\": [0.19444, 0.69444, 0, 0, 1.02222],\n    \"9667\": [-0.02778, 0.47222, 0, 0, 0.575],\n    \"9711\": [0.19444, 0.69444, 0, 0, 1.14999],\n    \"9824\": [0.12963, 0.69444, 0, 0, 0.89444],\n    \"9825\": [0.12963, 0.69444, 0, 0, 0.89444],\n    \"9826\": [0.12963, 0.69444, 0, 0, 0.89444],\n    \"9827\": [0.12963, 0.69444, 0, 0, 0.89444],\n    \"9837\": [0, 0.75, 0, 0, 0.44722],\n    \"9838\": [0.19444, 0.69444, 0, 0, 0.44722],\n    \"9839\": [0.19444, 0.69444, 0, 0, 0.44722],\n    \"10216\": [0.25, 0.75, 0, 0, 0.44722],\n    \"10217\": [0.25, 0.75, 0, 0, 0.44722],\n    \"10815\": [0, 0.68611, 0, 0, 0.9],\n    \"10927\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"10928\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"57376\": [0.19444, 0.69444, 0, 0, 0]\n  },\n  \"Main-BoldItalic\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0.11417, 0, 0.38611],\n    \"34\": [0, 0.69444, 0.07939, 0, 0.62055],\n    \"35\": [0.19444, 0.69444, 0.06833, 0, 0.94444],\n    \"37\": [0.05556, 0.75, 0.12861, 0, 0.94444],\n    \"38\": [0, 0.69444, 0.08528, 0, 0.88555],\n    \"39\": [0, 0.69444, 0.12945, 0, 0.35555],\n    \"40\": [0.25, 0.75, 0.15806, 0, 0.47333],\n    \"41\": [0.25, 0.75, 0.03306, 0, 0.47333],\n    \"42\": [0, 0.75, 0.14333, 0, 0.59111],\n    \"43\": [0.10333, 0.60333, 0.03306, 0, 0.88555],\n    \"44\": [0.19444, 0.14722, 0, 0, 0.35555],\n    \"45\": [0, 0.44444, 0.02611, 0, 0.41444],\n    \"46\": [0, 0.14722, 0, 0, 0.35555],\n    \"47\": [0.25, 0.75, 0.15806, 0, 0.59111],\n    \"48\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"49\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"50\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"51\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"52\": [0.19444, 0.64444, 0.13167, 0, 0.59111],\n    \"53\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"54\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"55\": [0.19444, 0.64444, 0.13167, 0, 0.59111],\n    \"56\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"57\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"58\": [0, 0.44444, 0.06695, 0, 0.35555],\n    \"59\": [0.19444, 0.44444, 0.06695, 0, 0.35555],\n    \"61\": [-0.10889, 0.39111, 0.06833, 0, 0.88555],\n    \"63\": [0, 0.69444, 0.11472, 0, 0.59111],\n    \"64\": [0, 0.69444, 0.09208, 0, 0.88555],\n    \"65\": [0, 0.68611, 0, 0, 0.86555],\n    \"66\": [0, 0.68611, 0.0992, 0, 0.81666],\n    \"67\": [0, 0.68611, 0.14208, 0, 0.82666],\n    \"68\": [0, 0.68611, 0.09062, 0, 0.87555],\n    \"69\": [0, 0.68611, 0.11431, 0, 0.75666],\n    \"70\": [0, 0.68611, 0.12903, 0, 0.72722],\n    \"71\": [0, 0.68611, 0.07347, 0, 0.89527],\n    \"72\": [0, 0.68611, 0.17208, 0, 0.8961],\n    \"73\": [0, 0.68611, 0.15681, 0, 0.47166],\n    \"74\": [0, 0.68611, 0.145, 0, 0.61055],\n    \"75\": [0, 0.68611, 0.14208, 0, 0.89499],\n    \"76\": [0, 0.68611, 0, 0, 0.69777],\n    \"77\": [0, 0.68611, 0.17208, 0, 1.07277],\n    \"78\": [0, 0.68611, 0.17208, 0, 0.8961],\n    \"79\": [0, 0.68611, 0.09062, 0, 0.85499],\n    \"80\": [0, 0.68611, 0.0992, 0, 0.78721],\n    \"81\": [0.19444, 0.68611, 0.09062, 0, 0.85499],\n    \"82\": [0, 0.68611, 0.02559, 0, 0.85944],\n    \"83\": [0, 0.68611, 0.11264, 0, 0.64999],\n    \"84\": [0, 0.68611, 0.12903, 0, 0.7961],\n    \"85\": [0, 0.68611, 0.17208, 0, 0.88083],\n    \"86\": [0, 0.68611, 0.18625, 0, 0.86555],\n    \"87\": [0, 0.68611, 0.18625, 0, 1.15999],\n    \"88\": [0, 0.68611, 0.15681, 0, 0.86555],\n    \"89\": [0, 0.68611, 0.19803, 0, 0.86555],\n    \"90\": [0, 0.68611, 0.14208, 0, 0.70888],\n    \"91\": [0.25, 0.75, 0.1875, 0, 0.35611],\n    \"93\": [0.25, 0.75, 0.09972, 0, 0.35611],\n    \"94\": [0, 0.69444, 0.06709, 0, 0.59111],\n    \"95\": [0.31, 0.13444, 0.09811, 0, 0.59111],\n    \"97\": [0, 0.44444, 0.09426, 0, 0.59111],\n    \"98\": [0, 0.69444, 0.07861, 0, 0.53222],\n    \"99\": [0, 0.44444, 0.05222, 0, 0.53222],\n    \"100\": [0, 0.69444, 0.10861, 0, 0.59111],\n    \"101\": [0, 0.44444, 0.085, 0, 0.53222],\n    \"102\": [0.19444, 0.69444, 0.21778, 0, 0.4],\n    \"103\": [0.19444, 0.44444, 0.105, 0, 0.53222],\n    \"104\": [0, 0.69444, 0.09426, 0, 0.59111],\n    \"105\": [0, 0.69326, 0.11387, 0, 0.35555],\n    \"106\": [0.19444, 0.69326, 0.1672, 0, 0.35555],\n    \"107\": [0, 0.69444, 0.11111, 0, 0.53222],\n    \"108\": [0, 0.69444, 0.10861, 0, 0.29666],\n    \"109\": [0, 0.44444, 0.09426, 0, 0.94444],\n    \"110\": [0, 0.44444, 0.09426, 0, 0.64999],\n    \"111\": [0, 0.44444, 0.07861, 0, 0.59111],\n    \"112\": [0.19444, 0.44444, 0.07861, 0, 0.59111],\n    \"113\": [0.19444, 0.44444, 0.105, 0, 0.53222],\n    \"114\": [0, 0.44444, 0.11111, 0, 0.50167],\n    \"115\": [0, 0.44444, 0.08167, 0, 0.48694],\n    \"116\": [0, 0.63492, 0.09639, 0, 0.385],\n    \"117\": [0, 0.44444, 0.09426, 0, 0.62055],\n    \"118\": [0, 0.44444, 0.11111, 0, 0.53222],\n    \"119\": [0, 0.44444, 0.11111, 0, 0.76777],\n    \"120\": [0, 0.44444, 0.12583, 0, 0.56055],\n    \"121\": [0.19444, 0.44444, 0.105, 0, 0.56166],\n    \"122\": [0, 0.44444, 0.13889, 0, 0.49055],\n    \"126\": [0.35, 0.34444, 0.11472, 0, 0.59111],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"168\": [0, 0.69444, 0.11473, 0, 0.59111],\n    \"176\": [0, 0.69444, 0, 0, 0.94888],\n    \"184\": [0.17014, 0, 0, 0, 0.53222],\n    \"198\": [0, 0.68611, 0.11431, 0, 1.02277],\n    \"216\": [0.04861, 0.73472, 0.09062, 0, 0.88555],\n    \"223\": [0.19444, 0.69444, 0.09736, 0, 0.665],\n    \"230\": [0, 0.44444, 0.085, 0, 0.82666],\n    \"248\": [0.09722, 0.54167, 0.09458, 0, 0.59111],\n    \"305\": [0, 0.44444, 0.09426, 0, 0.35555],\n    \"338\": [0, 0.68611, 0.11431, 0, 1.14054],\n    \"339\": [0, 0.44444, 0.085, 0, 0.82666],\n    \"567\": [0.19444, 0.44444, 0.04611, 0, 0.385],\n    \"710\": [0, 0.69444, 0.06709, 0, 0.59111],\n    \"711\": [0, 0.63194, 0.08271, 0, 0.59111],\n    \"713\": [0, 0.59444, 0.10444, 0, 0.59111],\n    \"714\": [0, 0.69444, 0.08528, 0, 0.59111],\n    \"715\": [0, 0.69444, 0, 0, 0.59111],\n    \"728\": [0, 0.69444, 0.10333, 0, 0.59111],\n    \"729\": [0, 0.69444, 0.12945, 0, 0.35555],\n    \"730\": [0, 0.69444, 0, 0, 0.94888],\n    \"732\": [0, 0.69444, 0.11472, 0, 0.59111],\n    \"733\": [0, 0.69444, 0.11472, 0, 0.59111],\n    \"915\": [0, 0.68611, 0.12903, 0, 0.69777],\n    \"916\": [0, 0.68611, 0, 0, 0.94444],\n    \"920\": [0, 0.68611, 0.09062, 0, 0.88555],\n    \"923\": [0, 0.68611, 0, 0, 0.80666],\n    \"926\": [0, 0.68611, 0.15092, 0, 0.76777],\n    \"928\": [0, 0.68611, 0.17208, 0, 0.8961],\n    \"931\": [0, 0.68611, 0.11431, 0, 0.82666],\n    \"933\": [0, 0.68611, 0.10778, 0, 0.88555],\n    \"934\": [0, 0.68611, 0.05632, 0, 0.82666],\n    \"936\": [0, 0.68611, 0.10778, 0, 0.88555],\n    \"937\": [0, 0.68611, 0.0992, 0, 0.82666],\n    \"8211\": [0, 0.44444, 0.09811, 0, 0.59111],\n    \"8212\": [0, 0.44444, 0.09811, 0, 1.18221],\n    \"8216\": [0, 0.69444, 0.12945, 0, 0.35555],\n    \"8217\": [0, 0.69444, 0.12945, 0, 0.35555],\n    \"8220\": [0, 0.69444, 0.16772, 0, 0.62055],\n    \"8221\": [0, 0.69444, 0.07939, 0, 0.62055]\n  },\n  \"Main-Italic\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0.12417, 0, 0.30667],\n    \"34\": [0, 0.69444, 0.06961, 0, 0.51444],\n    \"35\": [0.19444, 0.69444, 0.06616, 0, 0.81777],\n    \"37\": [0.05556, 0.75, 0.13639, 0, 0.81777],\n    \"38\": [0, 0.69444, 0.09694, 0, 0.76666],\n    \"39\": [0, 0.69444, 0.12417, 0, 0.30667],\n    \"40\": [0.25, 0.75, 0.16194, 0, 0.40889],\n    \"41\": [0.25, 0.75, 0.03694, 0, 0.40889],\n    \"42\": [0, 0.75, 0.14917, 0, 0.51111],\n    \"43\": [0.05667, 0.56167, 0.03694, 0, 0.76666],\n    \"44\": [0.19444, 0.10556, 0, 0, 0.30667],\n    \"45\": [0, 0.43056, 0.02826, 0, 0.35778],\n    \"46\": [0, 0.10556, 0, 0, 0.30667],\n    \"47\": [0.25, 0.75, 0.16194, 0, 0.51111],\n    \"48\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"49\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"50\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"51\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"52\": [0.19444, 0.64444, 0.13556, 0, 0.51111],\n    \"53\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"54\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"55\": [0.19444, 0.64444, 0.13556, 0, 0.51111],\n    \"56\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"57\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"58\": [0, 0.43056, 0.0582, 0, 0.30667],\n    \"59\": [0.19444, 0.43056, 0.0582, 0, 0.30667],\n    \"61\": [-0.13313, 0.36687, 0.06616, 0, 0.76666],\n    \"63\": [0, 0.69444, 0.1225, 0, 0.51111],\n    \"64\": [0, 0.69444, 0.09597, 0, 0.76666],\n    \"65\": [0, 0.68333, 0, 0, 0.74333],\n    \"66\": [0, 0.68333, 0.10257, 0, 0.70389],\n    \"67\": [0, 0.68333, 0.14528, 0, 0.71555],\n    \"68\": [0, 0.68333, 0.09403, 0, 0.755],\n    \"69\": [0, 0.68333, 0.12028, 0, 0.67833],\n    \"70\": [0, 0.68333, 0.13305, 0, 0.65277],\n    \"71\": [0, 0.68333, 0.08722, 0, 0.77361],\n    \"72\": [0, 0.68333, 0.16389, 0, 0.74333],\n    \"73\": [0, 0.68333, 0.15806, 0, 0.38555],\n    \"74\": [0, 0.68333, 0.14028, 0, 0.525],\n    \"75\": [0, 0.68333, 0.14528, 0, 0.76888],\n    \"76\": [0, 0.68333, 0, 0, 0.62722],\n    \"77\": [0, 0.68333, 0.16389, 0, 0.89666],\n    \"78\": [0, 0.68333, 0.16389, 0, 0.74333],\n    \"79\": [0, 0.68333, 0.09403, 0, 0.76666],\n    \"80\": [0, 0.68333, 0.10257, 0, 0.67833],\n    \"81\": [0.19444, 0.68333, 0.09403, 0, 0.76666],\n    \"82\": [0, 0.68333, 0.03868, 0, 0.72944],\n    \"83\": [0, 0.68333, 0.11972, 0, 0.56222],\n    \"84\": [0, 0.68333, 0.13305, 0, 0.71555],\n    \"85\": [0, 0.68333, 0.16389, 0, 0.74333],\n    \"86\": [0, 0.68333, 0.18361, 0, 0.74333],\n    \"87\": [0, 0.68333, 0.18361, 0, 0.99888],\n    \"88\": [0, 0.68333, 0.15806, 0, 0.74333],\n    \"89\": [0, 0.68333, 0.19383, 0, 0.74333],\n    \"90\": [0, 0.68333, 0.14528, 0, 0.61333],\n    \"91\": [0.25, 0.75, 0.1875, 0, 0.30667],\n    \"93\": [0.25, 0.75, 0.10528, 0, 0.30667],\n    \"94\": [0, 0.69444, 0.06646, 0, 0.51111],\n    \"95\": [0.31, 0.12056, 0.09208, 0, 0.51111],\n    \"97\": [0, 0.43056, 0.07671, 0, 0.51111],\n    \"98\": [0, 0.69444, 0.06312, 0, 0.46],\n    \"99\": [0, 0.43056, 0.05653, 0, 0.46],\n    \"100\": [0, 0.69444, 0.10333, 0, 0.51111],\n    \"101\": [0, 0.43056, 0.07514, 0, 0.46],\n    \"102\": [0.19444, 0.69444, 0.21194, 0, 0.30667],\n    \"103\": [0.19444, 0.43056, 0.08847, 0, 0.46],\n    \"104\": [0, 0.69444, 0.07671, 0, 0.51111],\n    \"105\": [0, 0.65536, 0.1019, 0, 0.30667],\n    \"106\": [0.19444, 0.65536, 0.14467, 0, 0.30667],\n    \"107\": [0, 0.69444, 0.10764, 0, 0.46],\n    \"108\": [0, 0.69444, 0.10333, 0, 0.25555],\n    \"109\": [0, 0.43056, 0.07671, 0, 0.81777],\n    \"110\": [0, 0.43056, 0.07671, 0, 0.56222],\n    \"111\": [0, 0.43056, 0.06312, 0, 0.51111],\n    \"112\": [0.19444, 0.43056, 0.06312, 0, 0.51111],\n    \"113\": [0.19444, 0.43056, 0.08847, 0, 0.46],\n    \"114\": [0, 0.43056, 0.10764, 0, 0.42166],\n    \"115\": [0, 0.43056, 0.08208, 0, 0.40889],\n    \"116\": [0, 0.61508, 0.09486, 0, 0.33222],\n    \"117\": [0, 0.43056, 0.07671, 0, 0.53666],\n    \"118\": [0, 0.43056, 0.10764, 0, 0.46],\n    \"119\": [0, 0.43056, 0.10764, 0, 0.66444],\n    \"120\": [0, 0.43056, 0.12042, 0, 0.46389],\n    \"121\": [0.19444, 0.43056, 0.08847, 0, 0.48555],\n    \"122\": [0, 0.43056, 0.12292, 0, 0.40889],\n    \"126\": [0.35, 0.31786, 0.11585, 0, 0.51111],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"168\": [0, 0.66786, 0.10474, 0, 0.51111],\n    \"176\": [0, 0.69444, 0, 0, 0.83129],\n    \"184\": [0.17014, 0, 0, 0, 0.46],\n    \"198\": [0, 0.68333, 0.12028, 0, 0.88277],\n    \"216\": [0.04861, 0.73194, 0.09403, 0, 0.76666],\n    \"223\": [0.19444, 0.69444, 0.10514, 0, 0.53666],\n    \"230\": [0, 0.43056, 0.07514, 0, 0.71555],\n    \"248\": [0.09722, 0.52778, 0.09194, 0, 0.51111],\n    \"338\": [0, 0.68333, 0.12028, 0, 0.98499],\n    \"339\": [0, 0.43056, 0.07514, 0, 0.71555],\n    \"710\": [0, 0.69444, 0.06646, 0, 0.51111],\n    \"711\": [0, 0.62847, 0.08295, 0, 0.51111],\n    \"713\": [0, 0.56167, 0.10333, 0, 0.51111],\n    \"714\": [0, 0.69444, 0.09694, 0, 0.51111],\n    \"715\": [0, 0.69444, 0, 0, 0.51111],\n    \"728\": [0, 0.69444, 0.10806, 0, 0.51111],\n    \"729\": [0, 0.66786, 0.11752, 0, 0.30667],\n    \"730\": [0, 0.69444, 0, 0, 0.83129],\n    \"732\": [0, 0.66786, 0.11585, 0, 0.51111],\n    \"733\": [0, 0.69444, 0.1225, 0, 0.51111],\n    \"915\": [0, 0.68333, 0.13305, 0, 0.62722],\n    \"916\": [0, 0.68333, 0, 0, 0.81777],\n    \"920\": [0, 0.68333, 0.09403, 0, 0.76666],\n    \"923\": [0, 0.68333, 0, 0, 0.69222],\n    \"926\": [0, 0.68333, 0.15294, 0, 0.66444],\n    \"928\": [0, 0.68333, 0.16389, 0, 0.74333],\n    \"931\": [0, 0.68333, 0.12028, 0, 0.71555],\n    \"933\": [0, 0.68333, 0.11111, 0, 0.76666],\n    \"934\": [0, 0.68333, 0.05986, 0, 0.71555],\n    \"936\": [0, 0.68333, 0.11111, 0, 0.76666],\n    \"937\": [0, 0.68333, 0.10257, 0, 0.71555],\n    \"8211\": [0, 0.43056, 0.09208, 0, 0.51111],\n    \"8212\": [0, 0.43056, 0.09208, 0, 1.02222],\n    \"8216\": [0, 0.69444, 0.12417, 0, 0.30667],\n    \"8217\": [0, 0.69444, 0.12417, 0, 0.30667],\n    \"8220\": [0, 0.69444, 0.1685, 0, 0.51444],\n    \"8221\": [0, 0.69444, 0.06961, 0, 0.51444],\n    \"8463\": [0, 0.68889, 0, 0, 0.54028]\n  },\n  \"Main-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0, 0, 0.27778],\n    \"34\": [0, 0.69444, 0, 0, 0.5],\n    \"35\": [0.19444, 0.69444, 0, 0, 0.83334],\n    \"36\": [0.05556, 0.75, 0, 0, 0.5],\n    \"37\": [0.05556, 0.75, 0, 0, 0.83334],\n    \"38\": [0, 0.69444, 0, 0, 0.77778],\n    \"39\": [0, 0.69444, 0, 0, 0.27778],\n    \"40\": [0.25, 0.75, 0, 0, 0.38889],\n    \"41\": [0.25, 0.75, 0, 0, 0.38889],\n    \"42\": [0, 0.75, 0, 0, 0.5],\n    \"43\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"44\": [0.19444, 0.10556, 0, 0, 0.27778],\n    \"45\": [0, 0.43056, 0, 0, 0.33333],\n    \"46\": [0, 0.10556, 0, 0, 0.27778],\n    \"47\": [0.25, 0.75, 0, 0, 0.5],\n    \"48\": [0, 0.64444, 0, 0, 0.5],\n    \"49\": [0, 0.64444, 0, 0, 0.5],\n    \"50\": [0, 0.64444, 0, 0, 0.5],\n    \"51\": [0, 0.64444, 0, 0, 0.5],\n    \"52\": [0, 0.64444, 0, 0, 0.5],\n    \"53\": [0, 0.64444, 0, 0, 0.5],\n    \"54\": [0, 0.64444, 0, 0, 0.5],\n    \"55\": [0, 0.64444, 0, 0, 0.5],\n    \"56\": [0, 0.64444, 0, 0, 0.5],\n    \"57\": [0, 0.64444, 0, 0, 0.5],\n    \"58\": [0, 0.43056, 0, 0, 0.27778],\n    \"59\": [0.19444, 0.43056, 0, 0, 0.27778],\n    \"60\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"61\": [-0.13313, 0.36687, 0, 0, 0.77778],\n    \"62\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"63\": [0, 0.69444, 0, 0, 0.47222],\n    \"64\": [0, 0.69444, 0, 0, 0.77778],\n    \"65\": [0, 0.68333, 0, 0, 0.75],\n    \"66\": [0, 0.68333, 0, 0, 0.70834],\n    \"67\": [0, 0.68333, 0, 0, 0.72222],\n    \"68\": [0, 0.68333, 0, 0, 0.76389],\n    \"69\": [0, 0.68333, 0, 0, 0.68056],\n    \"70\": [0, 0.68333, 0, 0, 0.65278],\n    \"71\": [0, 0.68333, 0, 0, 0.78472],\n    \"72\": [0, 0.68333, 0, 0, 0.75],\n    \"73\": [0, 0.68333, 0, 0, 0.36111],\n    \"74\": [0, 0.68333, 0, 0, 0.51389],\n    \"75\": [0, 0.68333, 0, 0, 0.77778],\n    \"76\": [0, 0.68333, 0, 0, 0.625],\n    \"77\": [0, 0.68333, 0, 0, 0.91667],\n    \"78\": [0, 0.68333, 0, 0, 0.75],\n    \"79\": [0, 0.68333, 0, 0, 0.77778],\n    \"80\": [0, 0.68333, 0, 0, 0.68056],\n    \"81\": [0.19444, 0.68333, 0, 0, 0.77778],\n    \"82\": [0, 0.68333, 0, 0, 0.73611],\n    \"83\": [0, 0.68333, 0, 0, 0.55556],\n    \"84\": [0, 0.68333, 0, 0, 0.72222],\n    \"85\": [0, 0.68333, 0, 0, 0.75],\n    \"86\": [0, 0.68333, 0.01389, 0, 0.75],\n    \"87\": [0, 0.68333, 0.01389, 0, 1.02778],\n    \"88\": [0, 0.68333, 0, 0, 0.75],\n    \"89\": [0, 0.68333, 0.025, 0, 0.75],\n    \"90\": [0, 0.68333, 0, 0, 0.61111],\n    \"91\": [0.25, 0.75, 0, 0, 0.27778],\n    \"92\": [0.25, 0.75, 0, 0, 0.5],\n    \"93\": [0.25, 0.75, 0, 0, 0.27778],\n    \"94\": [0, 0.69444, 0, 0, 0.5],\n    \"95\": [0.31, 0.12056, 0.02778, 0, 0.5],\n    \"97\": [0, 0.43056, 0, 0, 0.5],\n    \"98\": [0, 0.69444, 0, 0, 0.55556],\n    \"99\": [0, 0.43056, 0, 0, 0.44445],\n    \"100\": [0, 0.69444, 0, 0, 0.55556],\n    \"101\": [0, 0.43056, 0, 0, 0.44445],\n    \"102\": [0, 0.69444, 0.07778, 0, 0.30556],\n    \"103\": [0.19444, 0.43056, 0.01389, 0, 0.5],\n    \"104\": [0, 0.69444, 0, 0, 0.55556],\n    \"105\": [0, 0.66786, 0, 0, 0.27778],\n    \"106\": [0.19444, 0.66786, 0, 0, 0.30556],\n    \"107\": [0, 0.69444, 0, 0, 0.52778],\n    \"108\": [0, 0.69444, 0, 0, 0.27778],\n    \"109\": [0, 0.43056, 0, 0, 0.83334],\n    \"110\": [0, 0.43056, 0, 0, 0.55556],\n    \"111\": [0, 0.43056, 0, 0, 0.5],\n    \"112\": [0.19444, 0.43056, 0, 0, 0.55556],\n    \"113\": [0.19444, 0.43056, 0, 0, 0.52778],\n    \"114\": [0, 0.43056, 0, 0, 0.39167],\n    \"115\": [0, 0.43056, 0, 0, 0.39445],\n    \"116\": [0, 0.61508, 0, 0, 0.38889],\n    \"117\": [0, 0.43056, 0, 0, 0.55556],\n    \"118\": [0, 0.43056, 0.01389, 0, 0.52778],\n    \"119\": [0, 0.43056, 0.01389, 0, 0.72222],\n    \"120\": [0, 0.43056, 0, 0, 0.52778],\n    \"121\": [0.19444, 0.43056, 0.01389, 0, 0.52778],\n    \"122\": [0, 0.43056, 0, 0, 0.44445],\n    \"123\": [0.25, 0.75, 0, 0, 0.5],\n    \"124\": [0.25, 0.75, 0, 0, 0.27778],\n    \"125\": [0.25, 0.75, 0, 0, 0.5],\n    \"126\": [0.35, 0.31786, 0, 0, 0.5],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"163\": [0, 0.69444, 0, 0, 0.76909],\n    \"167\": [0.19444, 0.69444, 0, 0, 0.44445],\n    \"168\": [0, 0.66786, 0, 0, 0.5],\n    \"172\": [0, 0.43056, 0, 0, 0.66667],\n    \"176\": [0, 0.69444, 0, 0, 0.75],\n    \"177\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"182\": [0.19444, 0.69444, 0, 0, 0.61111],\n    \"184\": [0.17014, 0, 0, 0, 0.44445],\n    \"198\": [0, 0.68333, 0, 0, 0.90278],\n    \"215\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"216\": [0.04861, 0.73194, 0, 0, 0.77778],\n    \"223\": [0, 0.69444, 0, 0, 0.5],\n    \"230\": [0, 0.43056, 0, 0, 0.72222],\n    \"247\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"248\": [0.09722, 0.52778, 0, 0, 0.5],\n    \"305\": [0, 0.43056, 0, 0, 0.27778],\n    \"338\": [0, 0.68333, 0, 0, 1.01389],\n    \"339\": [0, 0.43056, 0, 0, 0.77778],\n    \"567\": [0.19444, 0.43056, 0, 0, 0.30556],\n    \"710\": [0, 0.69444, 0, 0, 0.5],\n    \"711\": [0, 0.62847, 0, 0, 0.5],\n    \"713\": [0, 0.56778, 0, 0, 0.5],\n    \"714\": [0, 0.69444, 0, 0, 0.5],\n    \"715\": [0, 0.69444, 0, 0, 0.5],\n    \"728\": [0, 0.69444, 0, 0, 0.5],\n    \"729\": [0, 0.66786, 0, 0, 0.27778],\n    \"730\": [0, 0.69444, 0, 0, 0.75],\n    \"732\": [0, 0.66786, 0, 0, 0.5],\n    \"733\": [0, 0.69444, 0, 0, 0.5],\n    \"915\": [0, 0.68333, 0, 0, 0.625],\n    \"916\": [0, 0.68333, 0, 0, 0.83334],\n    \"920\": [0, 0.68333, 0, 0, 0.77778],\n    \"923\": [0, 0.68333, 0, 0, 0.69445],\n    \"926\": [0, 0.68333, 0, 0, 0.66667],\n    \"928\": [0, 0.68333, 0, 0, 0.75],\n    \"931\": [0, 0.68333, 0, 0, 0.72222],\n    \"933\": [0, 0.68333, 0, 0, 0.77778],\n    \"934\": [0, 0.68333, 0, 0, 0.72222],\n    \"936\": [0, 0.68333, 0, 0, 0.77778],\n    \"937\": [0, 0.68333, 0, 0, 0.72222],\n    \"8211\": [0, 0.43056, 0.02778, 0, 0.5],\n    \"8212\": [0, 0.43056, 0.02778, 0, 1.0],\n    \"8216\": [0, 0.69444, 0, 0, 0.27778],\n    \"8217\": [0, 0.69444, 0, 0, 0.27778],\n    \"8220\": [0, 0.69444, 0, 0, 0.5],\n    \"8221\": [0, 0.69444, 0, 0, 0.5],\n    \"8224\": [0.19444, 0.69444, 0, 0, 0.44445],\n    \"8225\": [0.19444, 0.69444, 0, 0, 0.44445],\n    \"8230\": [0, 0.123, 0, 0, 1.172],\n    \"8242\": [0, 0.55556, 0, 0, 0.275],\n    \"8407\": [0, 0.71444, 0.15382, 0, 0.5],\n    \"8463\": [0, 0.68889, 0, 0, 0.54028],\n    \"8465\": [0, 0.69444, 0, 0, 0.72222],\n    \"8467\": [0, 0.69444, 0, 0.11111, 0.41667],\n    \"8472\": [0.19444, 0.43056, 0, 0.11111, 0.63646],\n    \"8476\": [0, 0.69444, 0, 0, 0.72222],\n    \"8501\": [0, 0.69444, 0, 0, 0.61111],\n    \"8592\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8593\": [0.19444, 0.69444, 0, 0, 0.5],\n    \"8594\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8595\": [0.19444, 0.69444, 0, 0, 0.5],\n    \"8596\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8597\": [0.25, 0.75, 0, 0, 0.5],\n    \"8598\": [0.19444, 0.69444, 0, 0, 1.0],\n    \"8599\": [0.19444, 0.69444, 0, 0, 1.0],\n    \"8600\": [0.19444, 0.69444, 0, 0, 1.0],\n    \"8601\": [0.19444, 0.69444, 0, 0, 1.0],\n    \"8614\": [0.011, 0.511, 0, 0, 1.0],\n    \"8617\": [0.011, 0.511, 0, 0, 1.126],\n    \"8618\": [0.011, 0.511, 0, 0, 1.126],\n    \"8636\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8637\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8640\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8641\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8652\": [0.011, 0.671, 0, 0, 1.0],\n    \"8656\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8657\": [0.19444, 0.69444, 0, 0, 0.61111],\n    \"8658\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8659\": [0.19444, 0.69444, 0, 0, 0.61111],\n    \"8660\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8661\": [0.25, 0.75, 0, 0, 0.61111],\n    \"8704\": [0, 0.69444, 0, 0, 0.55556],\n    \"8706\": [0, 0.69444, 0.05556, 0.08334, 0.5309],\n    \"8707\": [0, 0.69444, 0, 0, 0.55556],\n    \"8709\": [0.05556, 0.75, 0, 0, 0.5],\n    \"8711\": [0, 0.68333, 0, 0, 0.83334],\n    \"8712\": [0.0391, 0.5391, 0, 0, 0.66667],\n    \"8715\": [0.0391, 0.5391, 0, 0, 0.66667],\n    \"8722\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8723\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8725\": [0.25, 0.75, 0, 0, 0.5],\n    \"8726\": [0.25, 0.75, 0, 0, 0.5],\n    \"8727\": [-0.03472, 0.46528, 0, 0, 0.5],\n    \"8728\": [-0.05555, 0.44445, 0, 0, 0.5],\n    \"8729\": [-0.05555, 0.44445, 0, 0, 0.5],\n    \"8730\": [0.2, 0.8, 0, 0, 0.83334],\n    \"8733\": [0, 0.43056, 0, 0, 0.77778],\n    \"8734\": [0, 0.43056, 0, 0, 1.0],\n    \"8736\": [0, 0.69224, 0, 0, 0.72222],\n    \"8739\": [0.25, 0.75, 0, 0, 0.27778],\n    \"8741\": [0.25, 0.75, 0, 0, 0.5],\n    \"8743\": [0, 0.55556, 0, 0, 0.66667],\n    \"8744\": [0, 0.55556, 0, 0, 0.66667],\n    \"8745\": [0, 0.55556, 0, 0, 0.66667],\n    \"8746\": [0, 0.55556, 0, 0, 0.66667],\n    \"8747\": [0.19444, 0.69444, 0.11111, 0, 0.41667],\n    \"8764\": [-0.13313, 0.36687, 0, 0, 0.77778],\n    \"8768\": [0.19444, 0.69444, 0, 0, 0.27778],\n    \"8771\": [-0.03625, 0.46375, 0, 0, 0.77778],\n    \"8773\": [-0.022, 0.589, 0, 0, 0.778],\n    \"8776\": [-0.01688, 0.48312, 0, 0, 0.77778],\n    \"8781\": [-0.03625, 0.46375, 0, 0, 0.77778],\n    \"8784\": [-0.133, 0.673, 0, 0, 0.778],\n    \"8801\": [-0.03625, 0.46375, 0, 0, 0.77778],\n    \"8804\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8805\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8810\": [0.0391, 0.5391, 0, 0, 1.0],\n    \"8811\": [0.0391, 0.5391, 0, 0, 1.0],\n    \"8826\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8827\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8834\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8835\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8838\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8839\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8846\": [0, 0.55556, 0, 0, 0.66667],\n    \"8849\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8850\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8851\": [0, 0.55556, 0, 0, 0.66667],\n    \"8852\": [0, 0.55556, 0, 0, 0.66667],\n    \"8853\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8854\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8855\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8856\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8857\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8866\": [0, 0.69444, 0, 0, 0.61111],\n    \"8867\": [0, 0.69444, 0, 0, 0.61111],\n    \"8868\": [0, 0.69444, 0, 0, 0.77778],\n    \"8869\": [0, 0.69444, 0, 0, 0.77778],\n    \"8872\": [0.249, 0.75, 0, 0, 0.867],\n    \"8900\": [-0.05555, 0.44445, 0, 0, 0.5],\n    \"8901\": [-0.05555, 0.44445, 0, 0, 0.27778],\n    \"8902\": [-0.03472, 0.46528, 0, 0, 0.5],\n    \"8904\": [0.005, 0.505, 0, 0, 0.9],\n    \"8942\": [0.03, 0.903, 0, 0, 0.278],\n    \"8943\": [-0.19, 0.313, 0, 0, 1.172],\n    \"8945\": [-0.1, 0.823, 0, 0, 1.282],\n    \"8968\": [0.25, 0.75, 0, 0, 0.44445],\n    \"8969\": [0.25, 0.75, 0, 0, 0.44445],\n    \"8970\": [0.25, 0.75, 0, 0, 0.44445],\n    \"8971\": [0.25, 0.75, 0, 0, 0.44445],\n    \"8994\": [-0.14236, 0.35764, 0, 0, 1.0],\n    \"8995\": [-0.14236, 0.35764, 0, 0, 1.0],\n    \"9136\": [0.244, 0.744, 0, 0, 0.412],\n    \"9137\": [0.244, 0.745, 0, 0, 0.412],\n    \"9651\": [0.19444, 0.69444, 0, 0, 0.88889],\n    \"9657\": [-0.03472, 0.46528, 0, 0, 0.5],\n    \"9661\": [0.19444, 0.69444, 0, 0, 0.88889],\n    \"9667\": [-0.03472, 0.46528, 0, 0, 0.5],\n    \"9711\": [0.19444, 0.69444, 0, 0, 1.0],\n    \"9824\": [0.12963, 0.69444, 0, 0, 0.77778],\n    \"9825\": [0.12963, 0.69444, 0, 0, 0.77778],\n    \"9826\": [0.12963, 0.69444, 0, 0, 0.77778],\n    \"9827\": [0.12963, 0.69444, 0, 0, 0.77778],\n    \"9837\": [0, 0.75, 0, 0, 0.38889],\n    \"9838\": [0.19444, 0.69444, 0, 0, 0.38889],\n    \"9839\": [0.19444, 0.69444, 0, 0, 0.38889],\n    \"10216\": [0.25, 0.75, 0, 0, 0.38889],\n    \"10217\": [0.25, 0.75, 0, 0, 0.38889],\n    \"10222\": [0.244, 0.744, 0, 0, 0.412],\n    \"10223\": [0.244, 0.745, 0, 0, 0.412],\n    \"10229\": [0.011, 0.511, 0, 0, 1.609],\n    \"10230\": [0.011, 0.511, 0, 0, 1.638],\n    \"10231\": [0.011, 0.511, 0, 0, 1.859],\n    \"10232\": [0.024, 0.525, 0, 0, 1.609],\n    \"10233\": [0.024, 0.525, 0, 0, 1.638],\n    \"10234\": [0.024, 0.525, 0, 0, 1.858],\n    \"10236\": [0.011, 0.511, 0, 0, 1.638],\n    \"10815\": [0, 0.68333, 0, 0, 0.75],\n    \"10927\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"10928\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"57376\": [0.19444, 0.69444, 0, 0, 0]\n  },\n  \"Math-BoldItalic\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"48\": [0, 0.44444, 0, 0, 0.575],\n    \"49\": [0, 0.44444, 0, 0, 0.575],\n    \"50\": [0, 0.44444, 0, 0, 0.575],\n    \"51\": [0.19444, 0.44444, 0, 0, 0.575],\n    \"52\": [0.19444, 0.44444, 0, 0, 0.575],\n    \"53\": [0.19444, 0.44444, 0, 0, 0.575],\n    \"54\": [0, 0.64444, 0, 0, 0.575],\n    \"55\": [0.19444, 0.44444, 0, 0, 0.575],\n    \"56\": [0, 0.64444, 0, 0, 0.575],\n    \"57\": [0.19444, 0.44444, 0, 0, 0.575],\n    \"65\": [0, 0.68611, 0, 0, 0.86944],\n    \"66\": [0, 0.68611, 0.04835, 0, 0.8664],\n    \"67\": [0, 0.68611, 0.06979, 0, 0.81694],\n    \"68\": [0, 0.68611, 0.03194, 0, 0.93812],\n    \"69\": [0, 0.68611, 0.05451, 0, 0.81007],\n    \"70\": [0, 0.68611, 0.15972, 0, 0.68889],\n    \"71\": [0, 0.68611, 0, 0, 0.88673],\n    \"72\": [0, 0.68611, 0.08229, 0, 0.98229],\n    \"73\": [0, 0.68611, 0.07778, 0, 0.51111],\n    \"74\": [0, 0.68611, 0.10069, 0, 0.63125],\n    \"75\": [0, 0.68611, 0.06979, 0, 0.97118],\n    \"76\": [0, 0.68611, 0, 0, 0.75555],\n    \"77\": [0, 0.68611, 0.11424, 0, 1.14201],\n    \"78\": [0, 0.68611, 0.11424, 0, 0.95034],\n    \"79\": [0, 0.68611, 0.03194, 0, 0.83666],\n    \"80\": [0, 0.68611, 0.15972, 0, 0.72309],\n    \"81\": [0.19444, 0.68611, 0, 0, 0.86861],\n    \"82\": [0, 0.68611, 0.00421, 0, 0.87235],\n    \"83\": [0, 0.68611, 0.05382, 0, 0.69271],\n    \"84\": [0, 0.68611, 0.15972, 0, 0.63663],\n    \"85\": [0, 0.68611, 0.11424, 0, 0.80027],\n    \"86\": [0, 0.68611, 0.25555, 0, 0.67778],\n    \"87\": [0, 0.68611, 0.15972, 0, 1.09305],\n    \"88\": [0, 0.68611, 0.07778, 0, 0.94722],\n    \"89\": [0, 0.68611, 0.25555, 0, 0.67458],\n    \"90\": [0, 0.68611, 0.06979, 0, 0.77257],\n    \"97\": [0, 0.44444, 0, 0, 0.63287],\n    \"98\": [0, 0.69444, 0, 0, 0.52083],\n    \"99\": [0, 0.44444, 0, 0, 0.51342],\n    \"100\": [0, 0.69444, 0, 0, 0.60972],\n    \"101\": [0, 0.44444, 0, 0, 0.55361],\n    \"102\": [0.19444, 0.69444, 0.11042, 0, 0.56806],\n    \"103\": [0.19444, 0.44444, 0.03704, 0, 0.5449],\n    \"104\": [0, 0.69444, 0, 0, 0.66759],\n    \"105\": [0, 0.69326, 0, 0, 0.4048],\n    \"106\": [0.19444, 0.69326, 0.0622, 0, 0.47083],\n    \"107\": [0, 0.69444, 0.01852, 0, 0.6037],\n    \"108\": [0, 0.69444, 0.0088, 0, 0.34815],\n    \"109\": [0, 0.44444, 0, 0, 1.0324],\n    \"110\": [0, 0.44444, 0, 0, 0.71296],\n    \"111\": [0, 0.44444, 0, 0, 0.58472],\n    \"112\": [0.19444, 0.44444, 0, 0, 0.60092],\n    \"113\": [0.19444, 0.44444, 0.03704, 0, 0.54213],\n    \"114\": [0, 0.44444, 0.03194, 0, 0.5287],\n    \"115\": [0, 0.44444, 0, 0, 0.53125],\n    \"116\": [0, 0.63492, 0, 0, 0.41528],\n    \"117\": [0, 0.44444, 0, 0, 0.68102],\n    \"118\": [0, 0.44444, 0.03704, 0, 0.56666],\n    \"119\": [0, 0.44444, 0.02778, 0, 0.83148],\n    \"120\": [0, 0.44444, 0, 0, 0.65903],\n    \"121\": [0.19444, 0.44444, 0.03704, 0, 0.59028],\n    \"122\": [0, 0.44444, 0.04213, 0, 0.55509],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"915\": [0, 0.68611, 0.15972, 0, 0.65694],\n    \"916\": [0, 0.68611, 0, 0, 0.95833],\n    \"920\": [0, 0.68611, 0.03194, 0, 0.86722],\n    \"923\": [0, 0.68611, 0, 0, 0.80555],\n    \"926\": [0, 0.68611, 0.07458, 0, 0.84125],\n    \"928\": [0, 0.68611, 0.08229, 0, 0.98229],\n    \"931\": [0, 0.68611, 0.05451, 0, 0.88507],\n    \"933\": [0, 0.68611, 0.15972, 0, 0.67083],\n    \"934\": [0, 0.68611, 0, 0, 0.76666],\n    \"936\": [0, 0.68611, 0.11653, 0, 0.71402],\n    \"937\": [0, 0.68611, 0.04835, 0, 0.8789],\n    \"945\": [0, 0.44444, 0, 0, 0.76064],\n    \"946\": [0.19444, 0.69444, 0.03403, 0, 0.65972],\n    \"947\": [0.19444, 0.44444, 0.06389, 0, 0.59003],\n    \"948\": [0, 0.69444, 0.03819, 0, 0.52222],\n    \"949\": [0, 0.44444, 0, 0, 0.52882],\n    \"950\": [0.19444, 0.69444, 0.06215, 0, 0.50833],\n    \"951\": [0.19444, 0.44444, 0.03704, 0, 0.6],\n    \"952\": [0, 0.69444, 0.03194, 0, 0.5618],\n    \"953\": [0, 0.44444, 0, 0, 0.41204],\n    \"954\": [0, 0.44444, 0, 0, 0.66759],\n    \"955\": [0, 0.69444, 0, 0, 0.67083],\n    \"956\": [0.19444, 0.44444, 0, 0, 0.70787],\n    \"957\": [0, 0.44444, 0.06898, 0, 0.57685],\n    \"958\": [0.19444, 0.69444, 0.03021, 0, 0.50833],\n    \"959\": [0, 0.44444, 0, 0, 0.58472],\n    \"960\": [0, 0.44444, 0.03704, 0, 0.68241],\n    \"961\": [0.19444, 0.44444, 0, 0, 0.6118],\n    \"962\": [0.09722, 0.44444, 0.07917, 0, 0.42361],\n    \"963\": [0, 0.44444, 0.03704, 0, 0.68588],\n    \"964\": [0, 0.44444, 0.13472, 0, 0.52083],\n    \"965\": [0, 0.44444, 0.03704, 0, 0.63055],\n    \"966\": [0.19444, 0.44444, 0, 0, 0.74722],\n    \"967\": [0.19444, 0.44444, 0, 0, 0.71805],\n    \"968\": [0.19444, 0.69444, 0.03704, 0, 0.75833],\n    \"969\": [0, 0.44444, 0.03704, 0, 0.71782],\n    \"977\": [0, 0.69444, 0, 0, 0.69155],\n    \"981\": [0.19444, 0.69444, 0, 0, 0.7125],\n    \"982\": [0, 0.44444, 0.03194, 0, 0.975],\n    \"1009\": [0.19444, 0.44444, 0, 0, 0.6118],\n    \"1013\": [0, 0.44444, 0, 0, 0.48333],\n    \"57649\": [0, 0.44444, 0, 0, 0.39352],\n    \"57911\": [0.19444, 0.44444, 0, 0, 0.43889]\n  },\n  \"Math-Italic\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"48\": [0, 0.43056, 0, 0, 0.5],\n    \"49\": [0, 0.43056, 0, 0, 0.5],\n    \"50\": [0, 0.43056, 0, 0, 0.5],\n    \"51\": [0.19444, 0.43056, 0, 0, 0.5],\n    \"52\": [0.19444, 0.43056, 0, 0, 0.5],\n    \"53\": [0.19444, 0.43056, 0, 0, 0.5],\n    \"54\": [0, 0.64444, 0, 0, 0.5],\n    \"55\": [0.19444, 0.43056, 0, 0, 0.5],\n    \"56\": [0, 0.64444, 0, 0, 0.5],\n    \"57\": [0.19444, 0.43056, 0, 0, 0.5],\n    \"65\": [0, 0.68333, 0, 0.13889, 0.75],\n    \"66\": [0, 0.68333, 0.05017, 0.08334, 0.75851],\n    \"67\": [0, 0.68333, 0.07153, 0.08334, 0.71472],\n    \"68\": [0, 0.68333, 0.02778, 0.05556, 0.82792],\n    \"69\": [0, 0.68333, 0.05764, 0.08334, 0.7382],\n    \"70\": [0, 0.68333, 0.13889, 0.08334, 0.64306],\n    \"71\": [0, 0.68333, 0, 0.08334, 0.78625],\n    \"72\": [0, 0.68333, 0.08125, 0.05556, 0.83125],\n    \"73\": [0, 0.68333, 0.07847, 0.11111, 0.43958],\n    \"74\": [0, 0.68333, 0.09618, 0.16667, 0.55451],\n    \"75\": [0, 0.68333, 0.07153, 0.05556, 0.84931],\n    \"76\": [0, 0.68333, 0, 0.02778, 0.68056],\n    \"77\": [0, 0.68333, 0.10903, 0.08334, 0.97014],\n    \"78\": [0, 0.68333, 0.10903, 0.08334, 0.80347],\n    \"79\": [0, 0.68333, 0.02778, 0.08334, 0.76278],\n    \"80\": [0, 0.68333, 0.13889, 0.08334, 0.64201],\n    \"81\": [0.19444, 0.68333, 0, 0.08334, 0.79056],\n    \"82\": [0, 0.68333, 0.00773, 0.08334, 0.75929],\n    \"83\": [0, 0.68333, 0.05764, 0.08334, 0.6132],\n    \"84\": [0, 0.68333, 0.13889, 0.08334, 0.58438],\n    \"85\": [0, 0.68333, 0.10903, 0.02778, 0.68278],\n    \"86\": [0, 0.68333, 0.22222, 0, 0.58333],\n    \"87\": [0, 0.68333, 0.13889, 0, 0.94445],\n    \"88\": [0, 0.68333, 0.07847, 0.08334, 0.82847],\n    \"89\": [0, 0.68333, 0.22222, 0, 0.58056],\n    \"90\": [0, 0.68333, 0.07153, 0.08334, 0.68264],\n    \"97\": [0, 0.43056, 0, 0, 0.52859],\n    \"98\": [0, 0.69444, 0, 0, 0.42917],\n    \"99\": [0, 0.43056, 0, 0.05556, 0.43276],\n    \"100\": [0, 0.69444, 0, 0.16667, 0.52049],\n    \"101\": [0, 0.43056, 0, 0.05556, 0.46563],\n    \"102\": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959],\n    \"103\": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697],\n    \"104\": [0, 0.69444, 0, 0, 0.57616],\n    \"105\": [0, 0.65952, 0, 0, 0.34451],\n    \"106\": [0.19444, 0.65952, 0.05724, 0, 0.41181],\n    \"107\": [0, 0.69444, 0.03148, 0, 0.5206],\n    \"108\": [0, 0.69444, 0.01968, 0.08334, 0.29838],\n    \"109\": [0, 0.43056, 0, 0, 0.87801],\n    \"110\": [0, 0.43056, 0, 0, 0.60023],\n    \"111\": [0, 0.43056, 0, 0.05556, 0.48472],\n    \"112\": [0.19444, 0.43056, 0, 0.08334, 0.50313],\n    \"113\": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641],\n    \"114\": [0, 0.43056, 0.02778, 0.05556, 0.45116],\n    \"115\": [0, 0.43056, 0, 0.05556, 0.46875],\n    \"116\": [0, 0.61508, 0, 0.08334, 0.36111],\n    \"117\": [0, 0.43056, 0, 0.02778, 0.57246],\n    \"118\": [0, 0.43056, 0.03588, 0.02778, 0.48472],\n    \"119\": [0, 0.43056, 0.02691, 0.08334, 0.71592],\n    \"120\": [0, 0.43056, 0, 0.02778, 0.57153],\n    \"121\": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028],\n    \"122\": [0, 0.43056, 0.04398, 0.05556, 0.46505],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"915\": [0, 0.68333, 0.13889, 0.08334, 0.61528],\n    \"916\": [0, 0.68333, 0, 0.16667, 0.83334],\n    \"920\": [0, 0.68333, 0.02778, 0.08334, 0.76278],\n    \"923\": [0, 0.68333, 0, 0.16667, 0.69445],\n    \"926\": [0, 0.68333, 0.07569, 0.08334, 0.74236],\n    \"928\": [0, 0.68333, 0.08125, 0.05556, 0.83125],\n    \"931\": [0, 0.68333, 0.05764, 0.08334, 0.77986],\n    \"933\": [0, 0.68333, 0.13889, 0.05556, 0.58333],\n    \"934\": [0, 0.68333, 0, 0.08334, 0.66667],\n    \"936\": [0, 0.68333, 0.11, 0.05556, 0.61222],\n    \"937\": [0, 0.68333, 0.05017, 0.08334, 0.7724],\n    \"945\": [0, 0.43056, 0.0037, 0.02778, 0.6397],\n    \"946\": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563],\n    \"947\": [0.19444, 0.43056, 0.05556, 0, 0.51773],\n    \"948\": [0, 0.69444, 0.03785, 0.05556, 0.44444],\n    \"949\": [0, 0.43056, 0, 0.08334, 0.46632],\n    \"950\": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375],\n    \"951\": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653],\n    \"952\": [0, 0.69444, 0.02778, 0.08334, 0.46944],\n    \"953\": [0, 0.43056, 0, 0.05556, 0.35394],\n    \"954\": [0, 0.43056, 0, 0, 0.57616],\n    \"955\": [0, 0.69444, 0, 0, 0.58334],\n    \"956\": [0.19444, 0.43056, 0, 0.02778, 0.60255],\n    \"957\": [0, 0.43056, 0.06366, 0.02778, 0.49398],\n    \"958\": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375],\n    \"959\": [0, 0.43056, 0, 0.05556, 0.48472],\n    \"960\": [0, 0.43056, 0.03588, 0, 0.57003],\n    \"961\": [0.19444, 0.43056, 0, 0.08334, 0.51702],\n    \"962\": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285],\n    \"963\": [0, 0.43056, 0.03588, 0, 0.57141],\n    \"964\": [0, 0.43056, 0.1132, 0.02778, 0.43715],\n    \"965\": [0, 0.43056, 0.03588, 0.02778, 0.54028],\n    \"966\": [0.19444, 0.43056, 0, 0.08334, 0.65417],\n    \"967\": [0.19444, 0.43056, 0, 0.05556, 0.62569],\n    \"968\": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139],\n    \"969\": [0, 0.43056, 0.03588, 0, 0.62245],\n    \"977\": [0, 0.69444, 0, 0.08334, 0.59144],\n    \"981\": [0.19444, 0.69444, 0, 0.08334, 0.59583],\n    \"982\": [0, 0.43056, 0.02778, 0, 0.82813],\n    \"1009\": [0.19444, 0.43056, 0, 0.08334, 0.51702],\n    \"1013\": [0, 0.43056, 0, 0.05556, 0.4059],\n    \"57649\": [0, 0.43056, 0, 0.02778, 0.32246],\n    \"57911\": [0.19444, 0.43056, 0, 0.08334, 0.38403]\n  },\n  \"SansSerif-Bold\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0, 0, 0.36667],\n    \"34\": [0, 0.69444, 0, 0, 0.55834],\n    \"35\": [0.19444, 0.69444, 0, 0, 0.91667],\n    \"36\": [0.05556, 0.75, 0, 0, 0.55],\n    \"37\": [0.05556, 0.75, 0, 0, 1.02912],\n    \"38\": [0, 0.69444, 0, 0, 0.83056],\n    \"39\": [0, 0.69444, 0, 0, 0.30556],\n    \"40\": [0.25, 0.75, 0, 0, 0.42778],\n    \"41\": [0.25, 0.75, 0, 0, 0.42778],\n    \"42\": [0, 0.75, 0, 0, 0.55],\n    \"43\": [0.11667, 0.61667, 0, 0, 0.85556],\n    \"44\": [0.10556, 0.13056, 0, 0, 0.30556],\n    \"45\": [0, 0.45833, 0, 0, 0.36667],\n    \"46\": [0, 0.13056, 0, 0, 0.30556],\n    \"47\": [0.25, 0.75, 0, 0, 0.55],\n    \"48\": [0, 0.69444, 0, 0, 0.55],\n    \"49\": [0, 0.69444, 0, 0, 0.55],\n    \"50\": [0, 0.69444, 0, 0, 0.55],\n    \"51\": [0, 0.69444, 0, 0, 0.55],\n    \"52\": [0, 0.69444, 0, 0, 0.55],\n    \"53\": [0, 0.69444, 0, 0, 0.55],\n    \"54\": [0, 0.69444, 0, 0, 0.55],\n    \"55\": [0, 0.69444, 0, 0, 0.55],\n    \"56\": [0, 0.69444, 0, 0, 0.55],\n    \"57\": [0, 0.69444, 0, 0, 0.55],\n    \"58\": [0, 0.45833, 0, 0, 0.30556],\n    \"59\": [0.10556, 0.45833, 0, 0, 0.30556],\n    \"61\": [-0.09375, 0.40625, 0, 0, 0.85556],\n    \"63\": [0, 0.69444, 0, 0, 0.51945],\n    \"64\": [0, 0.69444, 0, 0, 0.73334],\n    \"65\": [0, 0.69444, 0, 0, 0.73334],\n    \"66\": [0, 0.69444, 0, 0, 0.73334],\n    \"67\": [0, 0.69444, 0, 0, 0.70278],\n    \"68\": [0, 0.69444, 0, 0, 0.79445],\n    \"69\": [0, 0.69444, 0, 0, 0.64167],\n    \"70\": [0, 0.69444, 0, 0, 0.61111],\n    \"71\": [0, 0.69444, 0, 0, 0.73334],\n    \"72\": [0, 0.69444, 0, 0, 0.79445],\n    \"73\": [0, 0.69444, 0, 0, 0.33056],\n    \"74\": [0, 0.69444, 0, 0, 0.51945],\n    \"75\": [0, 0.69444, 0, 0, 0.76389],\n    \"76\": [0, 0.69444, 0, 0, 0.58056],\n    \"77\": [0, 0.69444, 0, 0, 0.97778],\n    \"78\": [0, 0.69444, 0, 0, 0.79445],\n    \"79\": [0, 0.69444, 0, 0, 0.79445],\n    \"80\": [0, 0.69444, 0, 0, 0.70278],\n    \"81\": [0.10556, 0.69444, 0, 0, 0.79445],\n    \"82\": [0, 0.69444, 0, 0, 0.70278],\n    \"83\": [0, 0.69444, 0, 0, 0.61111],\n    \"84\": [0, 0.69444, 0, 0, 0.73334],\n    \"85\": [0, 0.69444, 0, 0, 0.76389],\n    \"86\": [0, 0.69444, 0.01528, 0, 0.73334],\n    \"87\": [0, 0.69444, 0.01528, 0, 1.03889],\n    \"88\": [0, 0.69444, 0, 0, 0.73334],\n    \"89\": [0, 0.69444, 0.0275, 0, 0.73334],\n    \"90\": [0, 0.69444, 0, 0, 0.67223],\n    \"91\": [0.25, 0.75, 0, 0, 0.34306],\n    \"93\": [0.25, 0.75, 0, 0, 0.34306],\n    \"94\": [0, 0.69444, 0, 0, 0.55],\n    \"95\": [0.35, 0.10833, 0.03056, 0, 0.55],\n    \"97\": [0, 0.45833, 0, 0, 0.525],\n    \"98\": [0, 0.69444, 0, 0, 0.56111],\n    \"99\": [0, 0.45833, 0, 0, 0.48889],\n    \"100\": [0, 0.69444, 0, 0, 0.56111],\n    \"101\": [0, 0.45833, 0, 0, 0.51111],\n    \"102\": [0, 0.69444, 0.07639, 0, 0.33611],\n    \"103\": [0.19444, 0.45833, 0.01528, 0, 0.55],\n    \"104\": [0, 0.69444, 0, 0, 0.56111],\n    \"105\": [0, 0.69444, 0, 0, 0.25556],\n    \"106\": [0.19444, 0.69444, 0, 0, 0.28611],\n    \"107\": [0, 0.69444, 0, 0, 0.53056],\n    \"108\": [0, 0.69444, 0, 0, 0.25556],\n    \"109\": [0, 0.45833, 0, 0, 0.86667],\n    \"110\": [0, 0.45833, 0, 0, 0.56111],\n    \"111\": [0, 0.45833, 0, 0, 0.55],\n    \"112\": [0.19444, 0.45833, 0, 0, 0.56111],\n    \"113\": [0.19444, 0.45833, 0, 0, 0.56111],\n    \"114\": [0, 0.45833, 0.01528, 0, 0.37222],\n    \"115\": [0, 0.45833, 0, 0, 0.42167],\n    \"116\": [0, 0.58929, 0, 0, 0.40417],\n    \"117\": [0, 0.45833, 0, 0, 0.56111],\n    \"118\": [0, 0.45833, 0.01528, 0, 0.5],\n    \"119\": [0, 0.45833, 0.01528, 0, 0.74445],\n    \"120\": [0, 0.45833, 0, 0, 0.5],\n    \"121\": [0.19444, 0.45833, 0.01528, 0, 0.5],\n    \"122\": [0, 0.45833, 0, 0, 0.47639],\n    \"126\": [0.35, 0.34444, 0, 0, 0.55],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"168\": [0, 0.69444, 0, 0, 0.55],\n    \"176\": [0, 0.69444, 0, 0, 0.73334],\n    \"180\": [0, 0.69444, 0, 0, 0.55],\n    \"184\": [0.17014, 0, 0, 0, 0.48889],\n    \"305\": [0, 0.45833, 0, 0, 0.25556],\n    \"567\": [0.19444, 0.45833, 0, 0, 0.28611],\n    \"710\": [0, 0.69444, 0, 0, 0.55],\n    \"711\": [0, 0.63542, 0, 0, 0.55],\n    \"713\": [0, 0.63778, 0, 0, 0.55],\n    \"728\": [0, 0.69444, 0, 0, 0.55],\n    \"729\": [0, 0.69444, 0, 0, 0.30556],\n    \"730\": [0, 0.69444, 0, 0, 0.73334],\n    \"732\": [0, 0.69444, 0, 0, 0.55],\n    \"733\": [0, 0.69444, 0, 0, 0.55],\n    \"915\": [0, 0.69444, 0, 0, 0.58056],\n    \"916\": [0, 0.69444, 0, 0, 0.91667],\n    \"920\": [0, 0.69444, 0, 0, 0.85556],\n    \"923\": [0, 0.69444, 0, 0, 0.67223],\n    \"926\": [0, 0.69444, 0, 0, 0.73334],\n    \"928\": [0, 0.69444, 0, 0, 0.79445],\n    \"931\": [0, 0.69444, 0, 0, 0.79445],\n    \"933\": [0, 0.69444, 0, 0, 0.85556],\n    \"934\": [0, 0.69444, 0, 0, 0.79445],\n    \"936\": [0, 0.69444, 0, 0, 0.85556],\n    \"937\": [0, 0.69444, 0, 0, 0.79445],\n    \"8211\": [0, 0.45833, 0.03056, 0, 0.55],\n    \"8212\": [0, 0.45833, 0.03056, 0, 1.10001],\n    \"8216\": [0, 0.69444, 0, 0, 0.30556],\n    \"8217\": [0, 0.69444, 0, 0, 0.30556],\n    \"8220\": [0, 0.69444, 0, 0, 0.55834],\n    \"8221\": [0, 0.69444, 0, 0, 0.55834]\n  },\n  \"SansSerif-Italic\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0.05733, 0, 0.31945],\n    \"34\": [0, 0.69444, 0.00316, 0, 0.5],\n    \"35\": [0.19444, 0.69444, 0.05087, 0, 0.83334],\n    \"36\": [0.05556, 0.75, 0.11156, 0, 0.5],\n    \"37\": [0.05556, 0.75, 0.03126, 0, 0.83334],\n    \"38\": [0, 0.69444, 0.03058, 0, 0.75834],\n    \"39\": [0, 0.69444, 0.07816, 0, 0.27778],\n    \"40\": [0.25, 0.75, 0.13164, 0, 0.38889],\n    \"41\": [0.25, 0.75, 0.02536, 0, 0.38889],\n    \"42\": [0, 0.75, 0.11775, 0, 0.5],\n    \"43\": [0.08333, 0.58333, 0.02536, 0, 0.77778],\n    \"44\": [0.125, 0.08333, 0, 0, 0.27778],\n    \"45\": [0, 0.44444, 0.01946, 0, 0.33333],\n    \"46\": [0, 0.08333, 0, 0, 0.27778],\n    \"47\": [0.25, 0.75, 0.13164, 0, 0.5],\n    \"48\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"49\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"50\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"51\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"52\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"53\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"54\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"55\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"56\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"57\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"58\": [0, 0.44444, 0.02502, 0, 0.27778],\n    \"59\": [0.125, 0.44444, 0.02502, 0, 0.27778],\n    \"61\": [-0.13, 0.37, 0.05087, 0, 0.77778],\n    \"63\": [0, 0.69444, 0.11809, 0, 0.47222],\n    \"64\": [0, 0.69444, 0.07555, 0, 0.66667],\n    \"65\": [0, 0.69444, 0, 0, 0.66667],\n    \"66\": [0, 0.69444, 0.08293, 0, 0.66667],\n    \"67\": [0, 0.69444, 0.11983, 0, 0.63889],\n    \"68\": [0, 0.69444, 0.07555, 0, 0.72223],\n    \"69\": [0, 0.69444, 0.11983, 0, 0.59722],\n    \"70\": [0, 0.69444, 0.13372, 0, 0.56945],\n    \"71\": [0, 0.69444, 0.11983, 0, 0.66667],\n    \"72\": [0, 0.69444, 0.08094, 0, 0.70834],\n    \"73\": [0, 0.69444, 0.13372, 0, 0.27778],\n    \"74\": [0, 0.69444, 0.08094, 0, 0.47222],\n    \"75\": [0, 0.69444, 0.11983, 0, 0.69445],\n    \"76\": [0, 0.69444, 0, 0, 0.54167],\n    \"77\": [0, 0.69444, 0.08094, 0, 0.875],\n    \"78\": [0, 0.69444, 0.08094, 0, 0.70834],\n    \"79\": [0, 0.69444, 0.07555, 0, 0.73611],\n    \"80\": [0, 0.69444, 0.08293, 0, 0.63889],\n    \"81\": [0.125, 0.69444, 0.07555, 0, 0.73611],\n    \"82\": [0, 0.69444, 0.08293, 0, 0.64584],\n    \"83\": [0, 0.69444, 0.09205, 0, 0.55556],\n    \"84\": [0, 0.69444, 0.13372, 0, 0.68056],\n    \"85\": [0, 0.69444, 0.08094, 0, 0.6875],\n    \"86\": [0, 0.69444, 0.1615, 0, 0.66667],\n    \"87\": [0, 0.69444, 0.1615, 0, 0.94445],\n    \"88\": [0, 0.69444, 0.13372, 0, 0.66667],\n    \"89\": [0, 0.69444, 0.17261, 0, 0.66667],\n    \"90\": [0, 0.69444, 0.11983, 0, 0.61111],\n    \"91\": [0.25, 0.75, 0.15942, 0, 0.28889],\n    \"93\": [0.25, 0.75, 0.08719, 0, 0.28889],\n    \"94\": [0, 0.69444, 0.0799, 0, 0.5],\n    \"95\": [0.35, 0.09444, 0.08616, 0, 0.5],\n    \"97\": [0, 0.44444, 0.00981, 0, 0.48056],\n    \"98\": [0, 0.69444, 0.03057, 0, 0.51667],\n    \"99\": [0, 0.44444, 0.08336, 0, 0.44445],\n    \"100\": [0, 0.69444, 0.09483, 0, 0.51667],\n    \"101\": [0, 0.44444, 0.06778, 0, 0.44445],\n    \"102\": [0, 0.69444, 0.21705, 0, 0.30556],\n    \"103\": [0.19444, 0.44444, 0.10836, 0, 0.5],\n    \"104\": [0, 0.69444, 0.01778, 0, 0.51667],\n    \"105\": [0, 0.67937, 0.09718, 0, 0.23889],\n    \"106\": [0.19444, 0.67937, 0.09162, 0, 0.26667],\n    \"107\": [0, 0.69444, 0.08336, 0, 0.48889],\n    \"108\": [0, 0.69444, 0.09483, 0, 0.23889],\n    \"109\": [0, 0.44444, 0.01778, 0, 0.79445],\n    \"110\": [0, 0.44444, 0.01778, 0, 0.51667],\n    \"111\": [0, 0.44444, 0.06613, 0, 0.5],\n    \"112\": [0.19444, 0.44444, 0.0389, 0, 0.51667],\n    \"113\": [0.19444, 0.44444, 0.04169, 0, 0.51667],\n    \"114\": [0, 0.44444, 0.10836, 0, 0.34167],\n    \"115\": [0, 0.44444, 0.0778, 0, 0.38333],\n    \"116\": [0, 0.57143, 0.07225, 0, 0.36111],\n    \"117\": [0, 0.44444, 0.04169, 0, 0.51667],\n    \"118\": [0, 0.44444, 0.10836, 0, 0.46111],\n    \"119\": [0, 0.44444, 0.10836, 0, 0.68334],\n    \"120\": [0, 0.44444, 0.09169, 0, 0.46111],\n    \"121\": [0.19444, 0.44444, 0.10836, 0, 0.46111],\n    \"122\": [0, 0.44444, 0.08752, 0, 0.43472],\n    \"126\": [0.35, 0.32659, 0.08826, 0, 0.5],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"168\": [0, 0.67937, 0.06385, 0, 0.5],\n    \"176\": [0, 0.69444, 0, 0, 0.73752],\n    \"184\": [0.17014, 0, 0, 0, 0.44445],\n    \"305\": [0, 0.44444, 0.04169, 0, 0.23889],\n    \"567\": [0.19444, 0.44444, 0.04169, 0, 0.26667],\n    \"710\": [0, 0.69444, 0.0799, 0, 0.5],\n    \"711\": [0, 0.63194, 0.08432, 0, 0.5],\n    \"713\": [0, 0.60889, 0.08776, 0, 0.5],\n    \"714\": [0, 0.69444, 0.09205, 0, 0.5],\n    \"715\": [0, 0.69444, 0, 0, 0.5],\n    \"728\": [0, 0.69444, 0.09483, 0, 0.5],\n    \"729\": [0, 0.67937, 0.07774, 0, 0.27778],\n    \"730\": [0, 0.69444, 0, 0, 0.73752],\n    \"732\": [0, 0.67659, 0.08826, 0, 0.5],\n    \"733\": [0, 0.69444, 0.09205, 0, 0.5],\n    \"915\": [0, 0.69444, 0.13372, 0, 0.54167],\n    \"916\": [0, 0.69444, 0, 0, 0.83334],\n    \"920\": [0, 0.69444, 0.07555, 0, 0.77778],\n    \"923\": [0, 0.69444, 0, 0, 0.61111],\n    \"926\": [0, 0.69444, 0.12816, 0, 0.66667],\n    \"928\": [0, 0.69444, 0.08094, 0, 0.70834],\n    \"931\": [0, 0.69444, 0.11983, 0, 0.72222],\n    \"933\": [0, 0.69444, 0.09031, 0, 0.77778],\n    \"934\": [0, 0.69444, 0.04603, 0, 0.72222],\n    \"936\": [0, 0.69444, 0.09031, 0, 0.77778],\n    \"937\": [0, 0.69444, 0.08293, 0, 0.72222],\n    \"8211\": [0, 0.44444, 0.08616, 0, 0.5],\n    \"8212\": [0, 0.44444, 0.08616, 0, 1.0],\n    \"8216\": [0, 0.69444, 0.07816, 0, 0.27778],\n    \"8217\": [0, 0.69444, 0.07816, 0, 0.27778],\n    \"8220\": [0, 0.69444, 0.14205, 0, 0.5],\n    \"8221\": [0, 0.69444, 0.00316, 0, 0.5]\n  },\n  \"SansSerif-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0, 0, 0.31945],\n    \"34\": [0, 0.69444, 0, 0, 0.5],\n    \"35\": [0.19444, 0.69444, 0, 0, 0.83334],\n    \"36\": [0.05556, 0.75, 0, 0, 0.5],\n    \"37\": [0.05556, 0.75, 0, 0, 0.83334],\n    \"38\": [0, 0.69444, 0, 0, 0.75834],\n    \"39\": [0, 0.69444, 0, 0, 0.27778],\n    \"40\": [0.25, 0.75, 0, 0, 0.38889],\n    \"41\": [0.25, 0.75, 0, 0, 0.38889],\n    \"42\": [0, 0.75, 0, 0, 0.5],\n    \"43\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"44\": [0.125, 0.08333, 0, 0, 0.27778],\n    \"45\": [0, 0.44444, 0, 0, 0.33333],\n    \"46\": [0, 0.08333, 0, 0, 0.27778],\n    \"47\": [0.25, 0.75, 0, 0, 0.5],\n    \"48\": [0, 0.65556, 0, 0, 0.5],\n    \"49\": [0, 0.65556, 0, 0, 0.5],\n    \"50\": [0, 0.65556, 0, 0, 0.5],\n    \"51\": [0, 0.65556, 0, 0, 0.5],\n    \"52\": [0, 0.65556, 0, 0, 0.5],\n    \"53\": [0, 0.65556, 0, 0, 0.5],\n    \"54\": [0, 0.65556, 0, 0, 0.5],\n    \"55\": [0, 0.65556, 0, 0, 0.5],\n    \"56\": [0, 0.65556, 0, 0, 0.5],\n    \"57\": [0, 0.65556, 0, 0, 0.5],\n    \"58\": [0, 0.44444, 0, 0, 0.27778],\n    \"59\": [0.125, 0.44444, 0, 0, 0.27778],\n    \"61\": [-0.13, 0.37, 0, 0, 0.77778],\n    \"63\": [0, 0.69444, 0, 0, 0.47222],\n    \"64\": [0, 0.69444, 0, 0, 0.66667],\n    \"65\": [0, 0.69444, 0, 0, 0.66667],\n    \"66\": [0, 0.69444, 0, 0, 0.66667],\n    \"67\": [0, 0.69444, 0, 0, 0.63889],\n    \"68\": [0, 0.69444, 0, 0, 0.72223],\n    \"69\": [0, 0.69444, 0, 0, 0.59722],\n    \"70\": [0, 0.69444, 0, 0, 0.56945],\n    \"71\": [0, 0.69444, 0, 0, 0.66667],\n    \"72\": [0, 0.69444, 0, 0, 0.70834],\n    \"73\": [0, 0.69444, 0, 0, 0.27778],\n    \"74\": [0, 0.69444, 0, 0, 0.47222],\n    \"75\": [0, 0.69444, 0, 0, 0.69445],\n    \"76\": [0, 0.69444, 0, 0, 0.54167],\n    \"77\": [0, 0.69444, 0, 0, 0.875],\n    \"78\": [0, 0.69444, 0, 0, 0.70834],\n    \"79\": [0, 0.69444, 0, 0, 0.73611],\n    \"80\": [0, 0.69444, 0, 0, 0.63889],\n    \"81\": [0.125, 0.69444, 0, 0, 0.73611],\n    \"82\": [0, 0.69444, 0, 0, 0.64584],\n    \"83\": [0, 0.69444, 0, 0, 0.55556],\n    \"84\": [0, 0.69444, 0, 0, 0.68056],\n    \"85\": [0, 0.69444, 0, 0, 0.6875],\n    \"86\": [0, 0.69444, 0.01389, 0, 0.66667],\n    \"87\": [0, 0.69444, 0.01389, 0, 0.94445],\n    \"88\": [0, 0.69444, 0, 0, 0.66667],\n    \"89\": [0, 0.69444, 0.025, 0, 0.66667],\n    \"90\": [0, 0.69444, 0, 0, 0.61111],\n    \"91\": [0.25, 0.75, 0, 0, 0.28889],\n    \"93\": [0.25, 0.75, 0, 0, 0.28889],\n    \"94\": [0, 0.69444, 0, 0, 0.5],\n    \"95\": [0.35, 0.09444, 0.02778, 0, 0.5],\n    \"97\": [0, 0.44444, 0, 0, 0.48056],\n    \"98\": [0, 0.69444, 0, 0, 0.51667],\n    \"99\": [0, 0.44444, 0, 0, 0.44445],\n    \"100\": [0, 0.69444, 0, 0, 0.51667],\n    \"101\": [0, 0.44444, 0, 0, 0.44445],\n    \"102\": [0, 0.69444, 0.06944, 0, 0.30556],\n    \"103\": [0.19444, 0.44444, 0.01389, 0, 0.5],\n    \"104\": [0, 0.69444, 0, 0, 0.51667],\n    \"105\": [0, 0.67937, 0, 0, 0.23889],\n    \"106\": [0.19444, 0.67937, 0, 0, 0.26667],\n    \"107\": [0, 0.69444, 0, 0, 0.48889],\n    \"108\": [0, 0.69444, 0, 0, 0.23889],\n    \"109\": [0, 0.44444, 0, 0, 0.79445],\n    \"110\": [0, 0.44444, 0, 0, 0.51667],\n    \"111\": [0, 0.44444, 0, 0, 0.5],\n    \"112\": [0.19444, 0.44444, 0, 0, 0.51667],\n    \"113\": [0.19444, 0.44444, 0, 0, 0.51667],\n    \"114\": [0, 0.44444, 0.01389, 0, 0.34167],\n    \"115\": [0, 0.44444, 0, 0, 0.38333],\n    \"116\": [0, 0.57143, 0, 0, 0.36111],\n    \"117\": [0, 0.44444, 0, 0, 0.51667],\n    \"118\": [0, 0.44444, 0.01389, 0, 0.46111],\n    \"119\": [0, 0.44444, 0.01389, 0, 0.68334],\n    \"120\": [0, 0.44444, 0, 0, 0.46111],\n    \"121\": [0.19444, 0.44444, 0.01389, 0, 0.46111],\n    \"122\": [0, 0.44444, 0, 0, 0.43472],\n    \"126\": [0.35, 0.32659, 0, 0, 0.5],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"168\": [0, 0.67937, 0, 0, 0.5],\n    \"176\": [0, 0.69444, 0, 0, 0.66667],\n    \"184\": [0.17014, 0, 0, 0, 0.44445],\n    \"305\": [0, 0.44444, 0, 0, 0.23889],\n    \"567\": [0.19444, 0.44444, 0, 0, 0.26667],\n    \"710\": [0, 0.69444, 0, 0, 0.5],\n    \"711\": [0, 0.63194, 0, 0, 0.5],\n    \"713\": [0, 0.60889, 0, 0, 0.5],\n    \"714\": [0, 0.69444, 0, 0, 0.5],\n    \"715\": [0, 0.69444, 0, 0, 0.5],\n    \"728\": [0, 0.69444, 0, 0, 0.5],\n    \"729\": [0, 0.67937, 0, 0, 0.27778],\n    \"730\": [0, 0.69444, 0, 0, 0.66667],\n    \"732\": [0, 0.67659, 0, 0, 0.5],\n    \"733\": [0, 0.69444, 0, 0, 0.5],\n    \"915\": [0, 0.69444, 0, 0, 0.54167],\n    \"916\": [0, 0.69444, 0, 0, 0.83334],\n    \"920\": [0, 0.69444, 0, 0, 0.77778],\n    \"923\": [0, 0.69444, 0, 0, 0.61111],\n    \"926\": [0, 0.69444, 0, 0, 0.66667],\n    \"928\": [0, 0.69444, 0, 0, 0.70834],\n    \"931\": [0, 0.69444, 0, 0, 0.72222],\n    \"933\": [0, 0.69444, 0, 0, 0.77778],\n    \"934\": [0, 0.69444, 0, 0, 0.72222],\n    \"936\": [0, 0.69444, 0, 0, 0.77778],\n    \"937\": [0, 0.69444, 0, 0, 0.72222],\n    \"8211\": [0, 0.44444, 0.02778, 0, 0.5],\n    \"8212\": [0, 0.44444, 0.02778, 0, 1.0],\n    \"8216\": [0, 0.69444, 0, 0, 0.27778],\n    \"8217\": [0, 0.69444, 0, 0, 0.27778],\n    \"8220\": [0, 0.69444, 0, 0, 0.5],\n    \"8221\": [0, 0.69444, 0, 0, 0.5]\n  },\n  \"Script-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"65\": [0, 0.7, 0.22925, 0, 0.80253],\n    \"66\": [0, 0.7, 0.04087, 0, 0.90757],\n    \"67\": [0, 0.7, 0.1689, 0, 0.66619],\n    \"68\": [0, 0.7, 0.09371, 0, 0.77443],\n    \"69\": [0, 0.7, 0.18583, 0, 0.56162],\n    \"70\": [0, 0.7, 0.13634, 0, 0.89544],\n    \"71\": [0, 0.7, 0.17322, 0, 0.60961],\n    \"72\": [0, 0.7, 0.29694, 0, 0.96919],\n    \"73\": [0, 0.7, 0.19189, 0, 0.80907],\n    \"74\": [0.27778, 0.7, 0.19189, 0, 1.05159],\n    \"75\": [0, 0.7, 0.31259, 0, 0.91364],\n    \"76\": [0, 0.7, 0.19189, 0, 0.87373],\n    \"77\": [0, 0.7, 0.15981, 0, 1.08031],\n    \"78\": [0, 0.7, 0.3525, 0, 0.9015],\n    \"79\": [0, 0.7, 0.08078, 0, 0.73787],\n    \"80\": [0, 0.7, 0.08078, 0, 1.01262],\n    \"81\": [0, 0.7, 0.03305, 0, 0.88282],\n    \"82\": [0, 0.7, 0.06259, 0, 0.85],\n    \"83\": [0, 0.7, 0.19189, 0, 0.86767],\n    \"84\": [0, 0.7, 0.29087, 0, 0.74697],\n    \"85\": [0, 0.7, 0.25815, 0, 0.79996],\n    \"86\": [0, 0.7, 0.27523, 0, 0.62204],\n    \"87\": [0, 0.7, 0.27523, 0, 0.80532],\n    \"88\": [0, 0.7, 0.26006, 0, 0.94445],\n    \"89\": [0, 0.7, 0.2939, 0, 0.70961],\n    \"90\": [0, 0.7, 0.24037, 0, 0.8212],\n    \"160\": [0, 0, 0, 0, 0.25]\n  },\n  \"Size1-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"40\": [0.35001, 0.85, 0, 0, 0.45834],\n    \"41\": [0.35001, 0.85, 0, 0, 0.45834],\n    \"47\": [0.35001, 0.85, 0, 0, 0.57778],\n    \"91\": [0.35001, 0.85, 0, 0, 0.41667],\n    \"92\": [0.35001, 0.85, 0, 0, 0.57778],\n    \"93\": [0.35001, 0.85, 0, 0, 0.41667],\n    \"123\": [0.35001, 0.85, 0, 0, 0.58334],\n    \"125\": [0.35001, 0.85, 0, 0, 0.58334],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"710\": [0, 0.72222, 0, 0, 0.55556],\n    \"732\": [0, 0.72222, 0, 0, 0.55556],\n    \"770\": [0, 0.72222, 0, 0, 0.55556],\n    \"771\": [0, 0.72222, 0, 0, 0.55556],\n    \"8214\": [-0.00099, 0.601, 0, 0, 0.77778],\n    \"8593\": [1e-05, 0.6, 0, 0, 0.66667],\n    \"8595\": [1e-05, 0.6, 0, 0, 0.66667],\n    \"8657\": [1e-05, 0.6, 0, 0, 0.77778],\n    \"8659\": [1e-05, 0.6, 0, 0, 0.77778],\n    \"8719\": [0.25001, 0.75, 0, 0, 0.94445],\n    \"8720\": [0.25001, 0.75, 0, 0, 0.94445],\n    \"8721\": [0.25001, 0.75, 0, 0, 1.05556],\n    \"8730\": [0.35001, 0.85, 0, 0, 1.0],\n    \"8739\": [-0.00599, 0.606, 0, 0, 0.33333],\n    \"8741\": [-0.00599, 0.606, 0, 0, 0.55556],\n    \"8747\": [0.30612, 0.805, 0.19445, 0, 0.47222],\n    \"8748\": [0.306, 0.805, 0.19445, 0, 0.47222],\n    \"8749\": [0.306, 0.805, 0.19445, 0, 0.47222],\n    \"8750\": [0.30612, 0.805, 0.19445, 0, 0.47222],\n    \"8896\": [0.25001, 0.75, 0, 0, 0.83334],\n    \"8897\": [0.25001, 0.75, 0, 0, 0.83334],\n    \"8898\": [0.25001, 0.75, 0, 0, 0.83334],\n    \"8899\": [0.25001, 0.75, 0, 0, 0.83334],\n    \"8968\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"8969\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"8970\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"8971\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"9168\": [-0.00099, 0.601, 0, 0, 0.66667],\n    \"10216\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"10217\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"10752\": [0.25001, 0.75, 0, 0, 1.11111],\n    \"10753\": [0.25001, 0.75, 0, 0, 1.11111],\n    \"10754\": [0.25001, 0.75, 0, 0, 1.11111],\n    \"10756\": [0.25001, 0.75, 0, 0, 0.83334],\n    \"10758\": [0.25001, 0.75, 0, 0, 0.83334]\n  },\n  \"Size2-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"40\": [0.65002, 1.15, 0, 0, 0.59722],\n    \"41\": [0.65002, 1.15, 0, 0, 0.59722],\n    \"47\": [0.65002, 1.15, 0, 0, 0.81111],\n    \"91\": [0.65002, 1.15, 0, 0, 0.47222],\n    \"92\": [0.65002, 1.15, 0, 0, 0.81111],\n    \"93\": [0.65002, 1.15, 0, 0, 0.47222],\n    \"123\": [0.65002, 1.15, 0, 0, 0.66667],\n    \"125\": [0.65002, 1.15, 0, 0, 0.66667],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"710\": [0, 0.75, 0, 0, 1.0],\n    \"732\": [0, 0.75, 0, 0, 1.0],\n    \"770\": [0, 0.75, 0, 0, 1.0],\n    \"771\": [0, 0.75, 0, 0, 1.0],\n    \"8719\": [0.55001, 1.05, 0, 0, 1.27778],\n    \"8720\": [0.55001, 1.05, 0, 0, 1.27778],\n    \"8721\": [0.55001, 1.05, 0, 0, 1.44445],\n    \"8730\": [0.65002, 1.15, 0, 0, 1.0],\n    \"8747\": [0.86225, 1.36, 0.44445, 0, 0.55556],\n    \"8748\": [0.862, 1.36, 0.44445, 0, 0.55556],\n    \"8749\": [0.862, 1.36, 0.44445, 0, 0.55556],\n    \"8750\": [0.86225, 1.36, 0.44445, 0, 0.55556],\n    \"8896\": [0.55001, 1.05, 0, 0, 1.11111],\n    \"8897\": [0.55001, 1.05, 0, 0, 1.11111],\n    \"8898\": [0.55001, 1.05, 0, 0, 1.11111],\n    \"8899\": [0.55001, 1.05, 0, 0, 1.11111],\n    \"8968\": [0.65002, 1.15, 0, 0, 0.52778],\n    \"8969\": [0.65002, 1.15, 0, 0, 0.52778],\n    \"8970\": [0.65002, 1.15, 0, 0, 0.52778],\n    \"8971\": [0.65002, 1.15, 0, 0, 0.52778],\n    \"10216\": [0.65002, 1.15, 0, 0, 0.61111],\n    \"10217\": [0.65002, 1.15, 0, 0, 0.61111],\n    \"10752\": [0.55001, 1.05, 0, 0, 1.51112],\n    \"10753\": [0.55001, 1.05, 0, 0, 1.51112],\n    \"10754\": [0.55001, 1.05, 0, 0, 1.51112],\n    \"10756\": [0.55001, 1.05, 0, 0, 1.11111],\n    \"10758\": [0.55001, 1.05, 0, 0, 1.11111]\n  },\n  \"Size3-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"40\": [0.95003, 1.45, 0, 0, 0.73611],\n    \"41\": [0.95003, 1.45, 0, 0, 0.73611],\n    \"47\": [0.95003, 1.45, 0, 0, 1.04445],\n    \"91\": [0.95003, 1.45, 0, 0, 0.52778],\n    \"92\": [0.95003, 1.45, 0, 0, 1.04445],\n    \"93\": [0.95003, 1.45, 0, 0, 0.52778],\n    \"123\": [0.95003, 1.45, 0, 0, 0.75],\n    \"125\": [0.95003, 1.45, 0, 0, 0.75],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"710\": [0, 0.75, 0, 0, 1.44445],\n    \"732\": [0, 0.75, 0, 0, 1.44445],\n    \"770\": [0, 0.75, 0, 0, 1.44445],\n    \"771\": [0, 0.75, 0, 0, 1.44445],\n    \"8730\": [0.95003, 1.45, 0, 0, 1.0],\n    \"8968\": [0.95003, 1.45, 0, 0, 0.58334],\n    \"8969\": [0.95003, 1.45, 0, 0, 0.58334],\n    \"8970\": [0.95003, 1.45, 0, 0, 0.58334],\n    \"8971\": [0.95003, 1.45, 0, 0, 0.58334],\n    \"10216\": [0.95003, 1.45, 0, 0, 0.75],\n    \"10217\": [0.95003, 1.45, 0, 0, 0.75]\n  },\n  \"Size4-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"40\": [1.25003, 1.75, 0, 0, 0.79167],\n    \"41\": [1.25003, 1.75, 0, 0, 0.79167],\n    \"47\": [1.25003, 1.75, 0, 0, 1.27778],\n    \"91\": [1.25003, 1.75, 0, 0, 0.58334],\n    \"92\": [1.25003, 1.75, 0, 0, 1.27778],\n    \"93\": [1.25003, 1.75, 0, 0, 0.58334],\n    \"123\": [1.25003, 1.75, 0, 0, 0.80556],\n    \"125\": [1.25003, 1.75, 0, 0, 0.80556],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"710\": [0, 0.825, 0, 0, 1.8889],\n    \"732\": [0, 0.825, 0, 0, 1.8889],\n    \"770\": [0, 0.825, 0, 0, 1.8889],\n    \"771\": [0, 0.825, 0, 0, 1.8889],\n    \"8730\": [1.25003, 1.75, 0, 0, 1.0],\n    \"8968\": [1.25003, 1.75, 0, 0, 0.63889],\n    \"8969\": [1.25003, 1.75, 0, 0, 0.63889],\n    \"8970\": [1.25003, 1.75, 0, 0, 0.63889],\n    \"8971\": [1.25003, 1.75, 0, 0, 0.63889],\n    \"9115\": [0.64502, 1.155, 0, 0, 0.875],\n    \"9116\": [1e-05, 0.6, 0, 0, 0.875],\n    \"9117\": [0.64502, 1.155, 0, 0, 0.875],\n    \"9118\": [0.64502, 1.155, 0, 0, 0.875],\n    \"9119\": [1e-05, 0.6, 0, 0, 0.875],\n    \"9120\": [0.64502, 1.155, 0, 0, 0.875],\n    \"9121\": [0.64502, 1.155, 0, 0, 0.66667],\n    \"9122\": [-0.00099, 0.601, 0, 0, 0.66667],\n    \"9123\": [0.64502, 1.155, 0, 0, 0.66667],\n    \"9124\": [0.64502, 1.155, 0, 0, 0.66667],\n    \"9125\": [-0.00099, 0.601, 0, 0, 0.66667],\n    \"9126\": [0.64502, 1.155, 0, 0, 0.66667],\n    \"9127\": [1e-05, 0.9, 0, 0, 0.88889],\n    \"9128\": [0.65002, 1.15, 0, 0, 0.88889],\n    \"9129\": [0.90001, 0, 0, 0, 0.88889],\n    \"9130\": [0, 0.3, 0, 0, 0.88889],\n    \"9131\": [1e-05, 0.9, 0, 0, 0.88889],\n    \"9132\": [0.65002, 1.15, 0, 0, 0.88889],\n    \"9133\": [0.90001, 0, 0, 0, 0.88889],\n    \"9143\": [0.88502, 0.915, 0, 0, 1.05556],\n    \"10216\": [1.25003, 1.75, 0, 0, 0.80556],\n    \"10217\": [1.25003, 1.75, 0, 0, 0.80556],\n    \"57344\": [-0.00499, 0.605, 0, 0, 1.05556],\n    \"57345\": [-0.00499, 0.605, 0, 0, 1.05556],\n    \"57680\": [0, 0.12, 0, 0, 0.45],\n    \"57681\": [0, 0.12, 0, 0, 0.45],\n    \"57682\": [0, 0.12, 0, 0, 0.45],\n    \"57683\": [0, 0.12, 0, 0, 0.45]\n  },\n  \"Typewriter-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.525],\n    \"33\": [0, 0.61111, 0, 0, 0.525],\n    \"34\": [0, 0.61111, 0, 0, 0.525],\n    \"35\": [0, 0.61111, 0, 0, 0.525],\n    \"36\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"37\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"38\": [0, 0.61111, 0, 0, 0.525],\n    \"39\": [0, 0.61111, 0, 0, 0.525],\n    \"40\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"41\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"42\": [0, 0.52083, 0, 0, 0.525],\n    \"43\": [-0.08056, 0.53055, 0, 0, 0.525],\n    \"44\": [0.13889, 0.125, 0, 0, 0.525],\n    \"45\": [-0.08056, 0.53055, 0, 0, 0.525],\n    \"46\": [0, 0.125, 0, 0, 0.525],\n    \"47\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"48\": [0, 0.61111, 0, 0, 0.525],\n    \"49\": [0, 0.61111, 0, 0, 0.525],\n    \"50\": [0, 0.61111, 0, 0, 0.525],\n    \"51\": [0, 0.61111, 0, 0, 0.525],\n    \"52\": [0, 0.61111, 0, 0, 0.525],\n    \"53\": [0, 0.61111, 0, 0, 0.525],\n    \"54\": [0, 0.61111, 0, 0, 0.525],\n    \"55\": [0, 0.61111, 0, 0, 0.525],\n    \"56\": [0, 0.61111, 0, 0, 0.525],\n    \"57\": [0, 0.61111, 0, 0, 0.525],\n    \"58\": [0, 0.43056, 0, 0, 0.525],\n    \"59\": [0.13889, 0.43056, 0, 0, 0.525],\n    \"60\": [-0.05556, 0.55556, 0, 0, 0.525],\n    \"61\": [-0.19549, 0.41562, 0, 0, 0.525],\n    \"62\": [-0.05556, 0.55556, 0, 0, 0.525],\n    \"63\": [0, 0.61111, 0, 0, 0.525],\n    \"64\": [0, 0.61111, 0, 0, 0.525],\n    \"65\": [0, 0.61111, 0, 0, 0.525],\n    \"66\": [0, 0.61111, 0, 0, 0.525],\n    \"67\": [0, 0.61111, 0, 0, 0.525],\n    \"68\": [0, 0.61111, 0, 0, 0.525],\n    \"69\": [0, 0.61111, 0, 0, 0.525],\n    \"70\": [0, 0.61111, 0, 0, 0.525],\n    \"71\": [0, 0.61111, 0, 0, 0.525],\n    \"72\": [0, 0.61111, 0, 0, 0.525],\n    \"73\": [0, 0.61111, 0, 0, 0.525],\n    \"74\": [0, 0.61111, 0, 0, 0.525],\n    \"75\": [0, 0.61111, 0, 0, 0.525],\n    \"76\": [0, 0.61111, 0, 0, 0.525],\n    \"77\": [0, 0.61111, 0, 0, 0.525],\n    \"78\": [0, 0.61111, 0, 0, 0.525],\n    \"79\": [0, 0.61111, 0, 0, 0.525],\n    \"80\": [0, 0.61111, 0, 0, 0.525],\n    \"81\": [0.13889, 0.61111, 0, 0, 0.525],\n    \"82\": [0, 0.61111, 0, 0, 0.525],\n    \"83\": [0, 0.61111, 0, 0, 0.525],\n    \"84\": [0, 0.61111, 0, 0, 0.525],\n    \"85\": [0, 0.61111, 0, 0, 0.525],\n    \"86\": [0, 0.61111, 0, 0, 0.525],\n    \"87\": [0, 0.61111, 0, 0, 0.525],\n    \"88\": [0, 0.61111, 0, 0, 0.525],\n    \"89\": [0, 0.61111, 0, 0, 0.525],\n    \"90\": [0, 0.61111, 0, 0, 0.525],\n    \"91\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"92\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"93\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"94\": [0, 0.61111, 0, 0, 0.525],\n    \"95\": [0.09514, 0, 0, 0, 0.525],\n    \"96\": [0, 0.61111, 0, 0, 0.525],\n    \"97\": [0, 0.43056, 0, 0, 0.525],\n    \"98\": [0, 0.61111, 0, 0, 0.525],\n    \"99\": [0, 0.43056, 0, 0, 0.525],\n    \"100\": [0, 0.61111, 0, 0, 0.525],\n    \"101\": [0, 0.43056, 0, 0, 0.525],\n    \"102\": [0, 0.61111, 0, 0, 0.525],\n    \"103\": [0.22222, 0.43056, 0, 0, 0.525],\n    \"104\": [0, 0.61111, 0, 0, 0.525],\n    \"105\": [0, 0.61111, 0, 0, 0.525],\n    \"106\": [0.22222, 0.61111, 0, 0, 0.525],\n    \"107\": [0, 0.61111, 0, 0, 0.525],\n    \"108\": [0, 0.61111, 0, 0, 0.525],\n    \"109\": [0, 0.43056, 0, 0, 0.525],\n    \"110\": [0, 0.43056, 0, 0, 0.525],\n    \"111\": [0, 0.43056, 0, 0, 0.525],\n    \"112\": [0.22222, 0.43056, 0, 0, 0.525],\n    \"113\": [0.22222, 0.43056, 0, 0, 0.525],\n    \"114\": [0, 0.43056, 0, 0, 0.525],\n    \"115\": [0, 0.43056, 0, 0, 0.525],\n    \"116\": [0, 0.55358, 0, 0, 0.525],\n    \"117\": [0, 0.43056, 0, 0, 0.525],\n    \"118\": [0, 0.43056, 0, 0, 0.525],\n    \"119\": [0, 0.43056, 0, 0, 0.525],\n    \"120\": [0, 0.43056, 0, 0, 0.525],\n    \"121\": [0.22222, 0.43056, 0, 0, 0.525],\n    \"122\": [0, 0.43056, 0, 0, 0.525],\n    \"123\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"124\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"125\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"126\": [0, 0.61111, 0, 0, 0.525],\n    \"127\": [0, 0.61111, 0, 0, 0.525],\n    \"160\": [0, 0, 0, 0, 0.525],\n    \"176\": [0, 0.61111, 0, 0, 0.525],\n    \"184\": [0.19445, 0, 0, 0, 0.525],\n    \"305\": [0, 0.43056, 0, 0, 0.525],\n    \"567\": [0.22222, 0.43056, 0, 0, 0.525],\n    \"711\": [0, 0.56597, 0, 0, 0.525],\n    \"713\": [0, 0.56555, 0, 0, 0.525],\n    \"714\": [0, 0.61111, 0, 0, 0.525],\n    \"715\": [0, 0.61111, 0, 0, 0.525],\n    \"728\": [0, 0.61111, 0, 0, 0.525],\n    \"730\": [0, 0.61111, 0, 0, 0.525],\n    \"770\": [0, 0.61111, 0, 0, 0.525],\n    \"771\": [0, 0.61111, 0, 0, 0.525],\n    \"776\": [0, 0.61111, 0, 0, 0.525],\n    \"915\": [0, 0.61111, 0, 0, 0.525],\n    \"916\": [0, 0.61111, 0, 0, 0.525],\n    \"920\": [0, 0.61111, 0, 0, 0.525],\n    \"923\": [0, 0.61111, 0, 0, 0.525],\n    \"926\": [0, 0.61111, 0, 0, 0.525],\n    \"928\": [0, 0.61111, 0, 0, 0.525],\n    \"931\": [0, 0.61111, 0, 0, 0.525],\n    \"933\": [0, 0.61111, 0, 0, 0.525],\n    \"934\": [0, 0.61111, 0, 0, 0.525],\n    \"936\": [0, 0.61111, 0, 0, 0.525],\n    \"937\": [0, 0.61111, 0, 0, 0.525],\n    \"8216\": [0, 0.61111, 0, 0, 0.525],\n    \"8217\": [0, 0.61111, 0, 0, 0.525],\n    \"8242\": [0, 0.61111, 0, 0, 0.525],\n    \"9251\": [0.11111, 0.21944, 0, 0, 0.525]\n  }\n};\n\n/**\n * This file contains metrics regarding fonts and individual symbols. The sigma\n * and xi variables, as well as the metricMap map contain data extracted from\n * TeX, TeX font metrics, and the TTF files. These data are then exposed via the\n * `metrics` variable and the getCharacterMetrics function.\n */\n// In TeX, there are actually three sets of dimensions, one for each of\n// textstyle (size index 5 and higher: >=9pt), scriptstyle (size index 3 and 4:\n// 7-8pt), and scriptscriptstyle (size index 1 and 2: 5-6pt).  These are\n// provided in the arrays below, in that order.\n//\n// The font metrics are stored in fonts cmsy10, cmsy7, and cmsy5 respectively.\n// This was determined by running the following script:\n//\n//     latex -interaction=nonstopmode \\\n//     '\\documentclass{article}\\usepackage{amsmath}\\begin{document}' \\\n//     '$a$ \\expandafter\\show\\the\\textfont2' \\\n//     '\\expandafter\\show\\the\\scriptfont2' \\\n//     '\\expandafter\\show\\the\\scriptscriptfont2' \\\n//     '\\stop'\n//\n// The metrics themselves were retrieved using the following commands:\n//\n//     tftopl cmsy10\n//     tftopl cmsy7\n//     tftopl cmsy5\n//\n// The output of each of these commands is quite lengthy.  The only part we\n// care about is the FONTDIMEN section. Each value is measured in EMs.\nvar sigmasAndXis = {\n  slant: [0.250, 0.250, 0.250],\n  // sigma1\n  space: [0.000, 0.000, 0.000],\n  // sigma2\n  stretch: [0.000, 0.000, 0.000],\n  // sigma3\n  shrink: [0.000, 0.000, 0.000],\n  // sigma4\n  xHeight: [0.431, 0.431, 0.431],\n  // sigma5\n  quad: [1.000, 1.171, 1.472],\n  // sigma6\n  extraSpace: [0.000, 0.000, 0.000],\n  // sigma7\n  num1: [0.677, 0.732, 0.925],\n  // sigma8\n  num2: [0.394, 0.384, 0.387],\n  // sigma9\n  num3: [0.444, 0.471, 0.504],\n  // sigma10\n  denom1: [0.686, 0.752, 1.025],\n  // sigma11\n  denom2: [0.345, 0.344, 0.532],\n  // sigma12\n  sup1: [0.413, 0.503, 0.504],\n  // sigma13\n  sup2: [0.363, 0.431, 0.404],\n  // sigma14\n  sup3: [0.289, 0.286, 0.294],\n  // sigma15\n  sub1: [0.150, 0.143, 0.200],\n  // sigma16\n  sub2: [0.247, 0.286, 0.400],\n  // sigma17\n  supDrop: [0.386, 0.353, 0.494],\n  // sigma18\n  subDrop: [0.050, 0.071, 0.100],\n  // sigma19\n  delim1: [2.390, 1.700, 1.980],\n  // sigma20\n  delim2: [1.010, 1.157, 1.420],\n  // sigma21\n  axisHeight: [0.250, 0.250, 0.250],\n  // sigma22\n  // These font metrics are extracted from TeX by using tftopl on cmex10.tfm;\n  // they correspond to the font parameters of the extension fonts (family 3).\n  // See the TeXbook, page 441. In AMSTeX, the extension fonts scale; to\n  // match cmex7, we'd use cmex7.tfm values for script and scriptscript\n  // values.\n  defaultRuleThickness: [0.04, 0.049, 0.049],\n  // xi8; cmex7: 0.049\n  bigOpSpacing1: [0.111, 0.111, 0.111],\n  // xi9\n  bigOpSpacing2: [0.166, 0.166, 0.166],\n  // xi10\n  bigOpSpacing3: [0.2, 0.2, 0.2],\n  // xi11\n  bigOpSpacing4: [0.6, 0.611, 0.611],\n  // xi12; cmex7: 0.611\n  bigOpSpacing5: [0.1, 0.143, 0.143],\n  // xi13; cmex7: 0.143\n  // The \\sqrt rule width is taken from the height of the surd character.\n  // Since we use the same font at all sizes, this thickness doesn't scale.\n  sqrtRuleThickness: [0.04, 0.04, 0.04],\n  // This value determines how large a pt is, for metrics which are defined\n  // in terms of pts.\n  // This value is also used in katex.scss; if you change it make sure the\n  // values match.\n  ptPerEm: [10.0, 10.0, 10.0],\n  // The space between adjacent `|` columns in an array definition. From\n  // `\\showthe\\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm.\n  doubleRuleSep: [0.2, 0.2, 0.2],\n  // The width of separator lines in {array} environments. From\n  // `\\showthe\\arrayrulewidth` in LaTeX. Equals 0.4 / ptPerEm.\n  arrayRuleWidth: [0.04, 0.04, 0.04],\n  // Two values from LaTeX source2e:\n  fboxsep: [0.3, 0.3, 0.3],\n  //        3 pt / ptPerEm\n  fboxrule: [0.04, 0.04, 0.04] // 0.4 pt / ptPerEm\n};\n// These are very rough approximations.  We default to Times New Roman which\n// should have Latin-1 and Cyrillic characters, but may not depending on the\n// operating system.  The metrics do not account for extra height from the\n// accents.  In the case of Cyrillic characters which have both ascenders and\n// descenders we prefer approximations with ascenders, primarily to prevent\n// the fraction bar or root line from intersecting the glyph.\n// TODO(kevinb) allow union of multiple glyph metrics for better accuracy.\nvar extraCharacterMap = {\n  // Latin-1\n  'Å': 'A',\n  'Ð': 'D',\n  'Þ': 'o',\n  'å': 'a',\n  'ð': 'd',\n  'þ': 'o',\n  // Cyrillic\n  'А': 'A',\n  'Б': 'B',\n  'В': 'B',\n  'Г': 'F',\n  'Д': 'A',\n  'Е': 'E',\n  'Ж': 'K',\n  'З': '3',\n  'И': 'N',\n  'Й': 'N',\n  'К': 'K',\n  'Л': 'N',\n  'М': 'M',\n  'Н': 'H',\n  'О': 'O',\n  'П': 'N',\n  'Р': 'P',\n  'С': 'C',\n  'Т': 'T',\n  'У': 'y',\n  'Ф': 'O',\n  'Х': 'X',\n  'Ц': 'U',\n  'Ч': 'h',\n  'Ш': 'W',\n  'Щ': 'W',\n  'Ъ': 'B',\n  'Ы': 'X',\n  'Ь': 'B',\n  'Э': '3',\n  'Ю': 'X',\n  'Я': 'R',\n  'а': 'a',\n  'б': 'b',\n  'в': 'a',\n  'г': 'r',\n  'д': 'y',\n  'е': 'e',\n  'ж': 'm',\n  'з': 'e',\n  'и': 'n',\n  'й': 'n',\n  'к': 'n',\n  'л': 'n',\n  'м': 'm',\n  'н': 'n',\n  'о': 'o',\n  'п': 'n',\n  'р': 'p',\n  'с': 'c',\n  'т': 'o',\n  'у': 'y',\n  'ф': 'b',\n  'х': 'x',\n  'ц': 'n',\n  'ч': 'n',\n  'ш': 'w',\n  'щ': 'w',\n  'ъ': 'a',\n  'ы': 'm',\n  'ь': 'a',\n  'э': 'e',\n  'ю': 'm',\n  'я': 'r'\n};\n/**\n * This function adds new font metrics to default metricMap\n * It can also override existing metrics\n */\nfunction setFontMetrics(fontName, metrics) {\n  fontMetricsData[fontName] = metrics;\n}\n/**\n * This function is a convenience function for looking up information in the\n * metricMap table. It takes a character as a string, and a font.\n *\n * Note: the `width` property may be undefined if fontMetricsData.js wasn't\n * built using `Make extended_metrics`.\n */\nfunction getCharacterMetrics(character, font, mode) {\n  if (!fontMetricsData[font]) {\n    throw new Error(\"Font metrics not found for font: \" + font + \".\");\n  }\n  var ch = character.charCodeAt(0);\n  var metrics = fontMetricsData[font][ch];\n  if (!metrics && character[0] in extraCharacterMap) {\n    ch = extraCharacterMap[character[0]].charCodeAt(0);\n    metrics = fontMetricsData[font][ch];\n  }\n  if (!metrics && mode === 'text') {\n    // We don't typically have font metrics for Asian scripts.\n    // But since we support them in text mode, we need to return\n    // some sort of metrics.\n    // So if the character is in a script we support but we\n    // don't have metrics for it, just use the metrics for\n    // the Latin capital letter M. This is close enough because\n    // we (currently) only care about the height of the glyph\n    // not its width.\n    if (supportedCodepoint(ch)) {\n      metrics = fontMetricsData[font][77]; // 77 is the charcode for 'M'\n    }\n  }\n  if (metrics) {\n    return {\n      depth: metrics[0],\n      height: metrics[1],\n      italic: metrics[2],\n      skew: metrics[3],\n      width: metrics[4]\n    };\n  }\n}\nvar fontMetricsBySizeIndex = {};\n/**\n * Get the font metrics for a given size.\n */\nfunction getGlobalMetrics(size) {\n  var sizeIndex;\n  if (size >= 5) {\n    sizeIndex = 0;\n  } else if (size >= 3) {\n    sizeIndex = 1;\n  } else {\n    sizeIndex = 2;\n  }\n  if (!fontMetricsBySizeIndex[sizeIndex]) {\n    var metrics = fontMetricsBySizeIndex[sizeIndex] = {\n      cssEmPerMu: sigmasAndXis.quad[sizeIndex] / 18\n    };\n    for (var key in sigmasAndXis) {\n      if (sigmasAndXis.hasOwnProperty(key)) {\n        metrics[key] = sigmasAndXis[key][sizeIndex];\n      }\n    }\n  }\n  return fontMetricsBySizeIndex[sizeIndex];\n}\n\n/**\n * This file holds a list of all no-argument functions and single-character\n * symbols (like 'a' or ';').\n *\n * For each of the symbols, there are three properties they can have:\n * - font (required): the font to be used for this symbol. Either \"main\" (the\n     normal font), or \"ams\" (the ams fonts).\n * - group (required): the ParseNode group type the symbol should have (i.e.\n     \"textord\", \"mathord\", etc).\n     See https://github.com/KaTeX/KaTeX/wiki/Examining-TeX#group-types\n * - replace: the character that this symbol or function should be\n *   replaced with (i.e. \"\\phi\" has a replace value of \"\\u03d5\", the phi\n *   character in the main font).\n *\n * The outermost map in the table indicates what mode the symbols should be\n * accepted in (e.g. \"math\" or \"text\").\n */\n// Some of these have a \"-token\" suffix since these are also used as `ParseNode`\n// types for raw text tokens, and we want to avoid conflicts with higher-level\n// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by\n// looking up the `symbols` map.\nvar ATOMS = {\n  \"bin\": 1,\n  \"close\": 1,\n  \"inner\": 1,\n  \"open\": 1,\n  \"punct\": 1,\n  \"rel\": 1\n};\nvar NON_ATOMS = {\n  \"accent-token\": 1,\n  \"mathord\": 1,\n  \"op-token\": 1,\n  \"spacing\": 1,\n  \"textord\": 1\n};\nvar symbols = {\n  \"math\": {},\n  \"text\": {}\n};\n/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */\nfunction defineSymbol(mode, font, group, replace, name, acceptUnicodeChar) {\n  symbols[mode][name] = {\n    font,\n    group,\n    replace\n  };\n  if (acceptUnicodeChar && replace) {\n    symbols[mode][replace] = symbols[mode][name];\n  }\n}\n// Some abbreviations for commonly used strings.\n// This helps minify the code, and also spotting typos using jshint.\n// modes:\nvar math = \"math\";\nvar text = \"text\";\n// fonts:\nvar main = \"main\";\nvar ams = \"ams\";\n// groups:\nvar accent = \"accent-token\";\nvar bin = \"bin\";\nvar close = \"close\";\nvar inner = \"inner\";\nvar mathord = \"mathord\";\nvar op = \"op-token\";\nvar open = \"open\";\nvar punct = \"punct\";\nvar rel = \"rel\";\nvar spacing = \"spacing\";\nvar textord = \"textord\";\n// Now comes the symbol table\n// Relation Symbols\ndefineSymbol(math, main, rel, \"\\u2261\", \"\\\\equiv\", true);\ndefineSymbol(math, main, rel, \"\\u227a\", \"\\\\prec\", true);\ndefineSymbol(math, main, rel, \"\\u227b\", \"\\\\succ\", true);\ndefineSymbol(math, main, rel, \"\\u223c\", \"\\\\sim\", true);\ndefineSymbol(math, main, rel, \"\\u22a5\", \"\\\\perp\");\ndefineSymbol(math, main, rel, \"\\u2aaf\", \"\\\\preceq\", true);\ndefineSymbol(math, main, rel, \"\\u2ab0\", \"\\\\succeq\", true);\ndefineSymbol(math, main, rel, \"\\u2243\", \"\\\\simeq\", true);\ndefineSymbol(math, main, rel, \"\\u2223\", \"\\\\mid\", true);\ndefineSymbol(math, main, rel, \"\\u226a\", \"\\\\ll\", true);\ndefineSymbol(math, main, rel, \"\\u226b\", \"\\\\gg\", true);\ndefineSymbol(math, main, rel, \"\\u224d\", \"\\\\asymp\", true);\ndefineSymbol(math, main, rel, \"\\u2225\", \"\\\\parallel\");\ndefineSymbol(math, main, rel, \"\\u22c8\", \"\\\\bowtie\", true);\ndefineSymbol(math, main, rel, \"\\u2323\", \"\\\\smile\", true);\ndefineSymbol(math, main, rel, \"\\u2291\", \"\\\\sqsubseteq\", true);\ndefineSymbol(math, main, rel, \"\\u2292\", \"\\\\sqsupseteq\", true);\ndefineSymbol(math, main, rel, \"\\u2250\", \"\\\\doteq\", true);\ndefineSymbol(math, main, rel, \"\\u2322\", \"\\\\frown\", true);\ndefineSymbol(math, main, rel, \"\\u220b\", \"\\\\ni\", true);\ndefineSymbol(math, main, rel, \"\\u221d\", \"\\\\propto\", true);\ndefineSymbol(math, main, rel, \"\\u22a2\", \"\\\\vdash\", true);\ndefineSymbol(math, main, rel, \"\\u22a3\", \"\\\\dashv\", true);\ndefineSymbol(math, main, rel, \"\\u220b\", \"\\\\owns\");\n// Punctuation\ndefineSymbol(math, main, punct, \"\\u002e\", \"\\\\ldotp\");\ndefineSymbol(math, main, punct, \"\\u22c5\", \"\\\\cdotp\");\n// The KaTeX fonts do not contain U+00B7. Use the centered dot glyph at U+22C5\n// in both modes, but keep math-mode punctuation spacing only in math mode.\ndefineSymbol(math, main, punct, \"\\u22c5\", \"\\u00b7\");\ndefineSymbol(text, main, textord, \"\\u22c5\", \"\\u00b7\");\n// Misc Symbols\ndefineSymbol(math, main, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(text, main, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(math, main, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(text, main, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(math, main, textord, \"\\u2135\", \"\\\\aleph\", true);\ndefineSymbol(math, main, textord, \"\\u2200\", \"\\\\forall\", true);\ndefineSymbol(math, main, textord, \"\\u210f\", \"\\\\hbar\", true);\ndefineSymbol(math, main, textord, \"\\u2203\", \"\\\\exists\", true);\ndefineSymbol(math, main, textord, \"\\u2207\", \"\\\\nabla\", true);\ndefineSymbol(math, main, textord, \"\\u266d\", \"\\\\flat\", true);\ndefineSymbol(math, main, textord, \"\\u2113\", \"\\\\ell\", true);\ndefineSymbol(math, main, textord, \"\\u266e\", \"\\\\natural\", true);\ndefineSymbol(math, main, textord, \"\\u2663\", \"\\\\clubsuit\", true);\ndefineSymbol(math, main, textord, \"\\u2118\", \"\\\\wp\", true);\ndefineSymbol(math, main, textord, \"\\u266f\", \"\\\\sharp\", true);\ndefineSymbol(math, main, textord, \"\\u2662\", \"\\\\diamondsuit\", true);\ndefineSymbol(math, main, textord, \"\\u211c\", \"\\\\Re\", true);\ndefineSymbol(math, main, textord, \"\\u2661\", \"\\\\heartsuit\", true);\ndefineSymbol(math, main, textord, \"\\u2111\", \"\\\\Im\", true);\ndefineSymbol(math, main, textord, \"\\u2660\", \"\\\\spadesuit\", true);\ndefineSymbol(math, main, textord, \"\\u00a7\", \"\\\\S\", true);\ndefineSymbol(text, main, textord, \"\\u00a7\", \"\\\\S\");\ndefineSymbol(math, main, textord, \"\\u00b6\", \"\\\\P\", true);\ndefineSymbol(text, main, textord, \"\\u00b6\", \"\\\\P\");\n// Math and Text\ndefineSymbol(math, main, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, main, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, main, textord, \"\\u2020\", \"\\\\textdagger\");\ndefineSymbol(math, main, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, main, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, main, textord, \"\\u2021\", \"\\\\textdaggerdbl\");\n// Large Delimiters\ndefineSymbol(math, main, close, \"\\u23b1\", \"\\\\rmoustache\", true);\ndefineSymbol(math, main, open, \"\\u23b0\", \"\\\\lmoustache\", true);\ndefineSymbol(math, main, close, \"\\u27ef\", \"\\\\rgroup\", true);\ndefineSymbol(math, main, open, \"\\u27ee\", \"\\\\lgroup\", true);\n// Binary Operators\ndefineSymbol(math, main, bin, \"\\u2213\", \"\\\\mp\", true);\ndefineSymbol(math, main, bin, \"\\u2296\", \"\\\\ominus\", true);\ndefineSymbol(math, main, bin, \"\\u228e\", \"\\\\uplus\", true);\ndefineSymbol(math, main, bin, \"\\u2293\", \"\\\\sqcap\", true);\ndefineSymbol(math, main, bin, \"\\u2217\", \"\\\\ast\");\ndefineSymbol(math, main, bin, \"\\u2294\", \"\\\\sqcup\", true);\ndefineSymbol(math, main, bin, \"\\u25ef\", \"\\\\bigcirc\", true);\ndefineSymbol(math, main, bin, \"\\u2219\", \"\\\\bullet\", true);\ndefineSymbol(math, main, bin, \"\\u2021\", \"\\\\ddagger\");\ndefineSymbol(math, main, bin, \"\\u2240\", \"\\\\wr\", true);\ndefineSymbol(math, main, bin, \"\\u2a3f\", \"\\\\amalg\");\ndefineSymbol(math, main, bin, \"\\u0026\", \"\\\\And\"); // from amsmath\n// Arrow Symbols\ndefineSymbol(math, main, rel, \"\\u27f5\", \"\\\\longleftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d0\", \"\\\\Leftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f8\", \"\\\\Longleftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f6\", \"\\\\longrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d2\", \"\\\\Rightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f9\", \"\\\\Longrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2194\", \"\\\\leftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f7\", \"\\\\longleftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d4\", \"\\\\Leftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27fa\", \"\\\\Longleftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21a6\", \"\\\\mapsto\", true);\ndefineSymbol(math, main, rel, \"\\u27fc\", \"\\\\longmapsto\", true);\ndefineSymbol(math, main, rel, \"\\u2197\", \"\\\\nearrow\", true);\ndefineSymbol(math, main, rel, \"\\u21a9\", \"\\\\hookleftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21aa\", \"\\\\hookrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2198\", \"\\\\searrow\", true);\ndefineSymbol(math, main, rel, \"\\u21bc\", \"\\\\leftharpoonup\", true);\ndefineSymbol(math, main, rel, \"\\u21c0\", \"\\\\rightharpoonup\", true);\ndefineSymbol(math, main, rel, \"\\u2199\", \"\\\\swarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21bd\", \"\\\\leftharpoondown\", true);\ndefineSymbol(math, main, rel, \"\\u21c1\", \"\\\\rightharpoondown\", true);\ndefineSymbol(math, main, rel, \"\\u2196\", \"\\\\nwarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21cc\", \"\\\\rightleftharpoons\", true);\n// AMS Negated Binary Relations\ndefineSymbol(math, ams, rel, \"\\u226e\", \"\\\\nless\", true);\n// Symbol names preceded by \"@\" each have a corresponding macro.\ndefineSymbol(math, ams, rel, \"\\ue010\", \"\\\\@nleqslant\");\ndefineSymbol(math, ams, rel, \"\\ue011\", \"\\\\@nleqq\");\ndefineSymbol(math, ams, rel, \"\\u2a87\", \"\\\\lneq\", true);\ndefineSymbol(math, ams, rel, \"\\u2268\", \"\\\\lneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue00c\", \"\\\\@lvertneqq\");\ndefineSymbol(math, ams, rel, \"\\u22e6\", \"\\\\lnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a89\", \"\\\\lnapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u2280\", \"\\\\nprec\", true);\n// unicode-math maps \\u22e0 to \\npreccurlyeq. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u22e0\", \"\\\\npreceq\", true);\ndefineSymbol(math, ams, rel, \"\\u22e8\", \"\\\\precnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab9\", \"\\\\precnapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u2241\", \"\\\\nsim\", true);\ndefineSymbol(math, ams, rel, \"\\ue006\", \"\\\\@nshortmid\");\ndefineSymbol(math, ams, rel, \"\\u2224\", \"\\\\nmid\", true);\ndefineSymbol(math, ams, rel, \"\\u22ac\", \"\\\\nvdash\", true);\ndefineSymbol(math, ams, rel, \"\\u22ad\", \"\\\\nvDash\", true);\ndefineSymbol(math, ams, rel, \"\\u22ea\", \"\\\\ntriangleleft\");\ndefineSymbol(math, ams, rel, \"\\u22ec\", \"\\\\ntrianglelefteq\", true);\ndefineSymbol(math, ams, rel, \"\\u228a\", \"\\\\subsetneq\", true);\ndefineSymbol(math, ams, rel, \"\\ue01a\", \"\\\\@varsubsetneq\");\ndefineSymbol(math, ams, rel, \"\\u2acb\", \"\\\\subsetneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue017\", \"\\\\@varsubsetneqq\");\ndefineSymbol(math, ams, rel, \"\\u226f\", \"\\\\ngtr\", true);\ndefineSymbol(math, ams, rel, \"\\ue00f\", \"\\\\@ngeqslant\");\ndefineSymbol(math, ams, rel, \"\\ue00e\", \"\\\\@ngeqq\");\ndefineSymbol(math, ams, rel, \"\\u2a88\", \"\\\\gneq\", true);\ndefineSymbol(math, ams, rel, \"\\u2269\", \"\\\\gneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue00d\", \"\\\\@gvertneqq\");\ndefineSymbol(math, ams, rel, \"\\u22e7\", \"\\\\gnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a8a\", \"\\\\gnapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u2281\", \"\\\\nsucc\", true);\n// unicode-math maps \\u22e1 to \\nsucccurlyeq. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u22e1\", \"\\\\nsucceq\", true);\ndefineSymbol(math, ams, rel, \"\\u22e9\", \"\\\\succnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2aba\", \"\\\\succnapprox\", true);\n// unicode-math maps \\u2246 to \\simneqq. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u2246\", \"\\\\ncong\", true);\ndefineSymbol(math, ams, rel, \"\\ue007\", \"\\\\@nshortparallel\");\ndefineSymbol(math, ams, rel, \"\\u2226\", \"\\\\nparallel\", true);\ndefineSymbol(math, ams, rel, \"\\u22af\", \"\\\\nVDash\", true);\ndefineSymbol(math, ams, rel, \"\\u22eb\", \"\\\\ntriangleright\");\ndefineSymbol(math, ams, rel, \"\\u22ed\", \"\\\\ntrianglerighteq\", true);\ndefineSymbol(math, ams, rel, \"\\ue018\", \"\\\\@nsupseteqq\");\ndefineSymbol(math, ams, rel, \"\\u228b\", \"\\\\supsetneq\", true);\ndefineSymbol(math, ams, rel, \"\\ue01b\", \"\\\\@varsupsetneq\");\ndefineSymbol(math, ams, rel, \"\\u2acc\", \"\\\\supsetneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue019\", \"\\\\@varsupsetneqq\");\ndefineSymbol(math, ams, rel, \"\\u22ae\", \"\\\\nVdash\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab5\", \"\\\\precneqq\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab6\", \"\\\\succneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue016\", \"\\\\@nsubseteqq\");\ndefineSymbol(math, ams, bin, \"\\u22b4\", \"\\\\unlhd\");\ndefineSymbol(math, ams, bin, \"\\u22b5\", \"\\\\unrhd\");\n// AMS Negated Arrows\ndefineSymbol(math, ams, rel, \"\\u219a\", \"\\\\nleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u219b\", \"\\\\nrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21cd\", \"\\\\nLeftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21cf\", \"\\\\nRightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21ae\", \"\\\\nleftrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21ce\", \"\\\\nLeftrightarrow\", true);\n// AMS Misc\ndefineSymbol(math, ams, rel, \"\\u25b3\", \"\\\\vartriangle\");\ndefineSymbol(math, ams, textord, \"\\u210f\", \"\\\\hslash\");\ndefineSymbol(math, ams, textord, \"\\u25bd\", \"\\\\triangledown\");\ndefineSymbol(math, ams, textord, \"\\u25ca\", \"\\\\lozenge\");\ndefineSymbol(math, ams, textord, \"\\u24c8\", \"\\\\circledS\");\ndefineSymbol(math, ams, textord, \"\\u00ae\", \"\\\\circledR\");\ndefineSymbol(text, ams, textord, \"\\u00ae\", \"\\\\circledR\");\ndefineSymbol(math, ams, textord, \"\\u2221\", \"\\\\measuredangle\", true);\ndefineSymbol(math, ams, textord, \"\\u2204\", \"\\\\nexists\");\ndefineSymbol(math, ams, textord, \"\\u2127\", \"\\\\mho\");\ndefineSymbol(math, ams, textord, \"\\u2132\", \"\\\\Finv\", true);\ndefineSymbol(math, ams, textord, \"\\u2141\", \"\\\\Game\", true);\ndefineSymbol(math, ams, textord, \"\\u2035\", \"\\\\backprime\");\ndefineSymbol(math, ams, textord, \"\\u25b2\", \"\\\\blacktriangle\");\ndefineSymbol(math, ams, textord, \"\\u25bc\", \"\\\\blacktriangledown\");\ndefineSymbol(math, ams, textord, \"\\u25a0\", \"\\\\blacksquare\");\ndefineSymbol(math, ams, textord, \"\\u29eb\", \"\\\\blacklozenge\");\ndefineSymbol(math, ams, textord, \"\\u2605\", \"\\\\bigstar\");\ndefineSymbol(math, ams, textord, \"\\u2222\", \"\\\\sphericalangle\", true);\ndefineSymbol(math, ams, textord, \"\\u2201\", \"\\\\complement\", true);\n// unicode-math maps U+F0 to \\matheth. We map to AMS function \\eth\ndefineSymbol(math, ams, textord, \"\\u00f0\", \"\\\\eth\", true);\ndefineSymbol(text, main, textord, \"\\u00f0\", \"\\u00f0\");\ndefineSymbol(math, ams, textord, \"\\u2571\", \"\\\\diagup\");\ndefineSymbol(math, ams, textord, \"\\u2572\", \"\\\\diagdown\");\ndefineSymbol(math, ams, textord, \"\\u25a1\", \"\\\\square\");\ndefineSymbol(math, ams, textord, \"\\u25a1\", \"\\\\Box\");\ndefineSymbol(math, ams, textord, \"\\u25ca\", \"\\\\Diamond\");\n// unicode-math maps U+A5 to \\mathyen. We map to AMS function \\yen\ndefineSymbol(math, ams, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(text, ams, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(math, ams, textord, \"\\u2713\", \"\\\\checkmark\", true);\ndefineSymbol(text, ams, textord, \"\\u2713\", \"\\\\checkmark\");\n// AMS Hebrew\ndefineSymbol(math, ams, textord, \"\\u2136\", \"\\\\beth\", true);\ndefineSymbol(math, ams, textord, \"\\u2138\", \"\\\\daleth\", true);\ndefineSymbol(math, ams, textord, \"\\u2137\", \"\\\\gimel\", true);\n// AMS Greek\ndefineSymbol(math, ams, textord, \"\\u03dd\", \"\\\\digamma\", true);\ndefineSymbol(math, ams, textord, \"\\u03f0\", \"\\\\varkappa\");\n// AMS Delimiters\ndefineSymbol(math, ams, open, \"\\u250c\", \"\\\\@ulcorner\", true);\ndefineSymbol(math, ams, close, \"\\u2510\", \"\\\\@urcorner\", true);\ndefineSymbol(math, ams, open, \"\\u2514\", \"\\\\@llcorner\", true);\ndefineSymbol(math, ams, close, \"\\u2518\", \"\\\\@lrcorner\", true);\n// AMS Binary Relations\ndefineSymbol(math, ams, rel, \"\\u2266\", \"\\\\leqq\", true);\ndefineSymbol(math, ams, rel, \"\\u2a7d\", \"\\\\leqslant\", true);\ndefineSymbol(math, ams, rel, \"\\u2a95\", \"\\\\eqslantless\", true);\ndefineSymbol(math, ams, rel, \"\\u2272\", \"\\\\lesssim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a85\", \"\\\\lessapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u224a\", \"\\\\approxeq\", true);\ndefineSymbol(math, ams, bin, \"\\u22d6\", \"\\\\lessdot\");\ndefineSymbol(math, ams, rel, \"\\u22d8\", \"\\\\lll\", true);\ndefineSymbol(math, ams, rel, \"\\u2276\", \"\\\\lessgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u22da\", \"\\\\lesseqgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u2a8b\", \"\\\\lesseqqgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u2251\", \"\\\\doteqdot\");\ndefineSymbol(math, ams, rel, \"\\u2253\", \"\\\\risingdotseq\", true);\ndefineSymbol(math, ams, rel, \"\\u2252\", \"\\\\fallingdotseq\", true);\ndefineSymbol(math, ams, rel, \"\\u223d\", \"\\\\backsim\", true);\ndefineSymbol(math, ams, rel, \"\\u22cd\", \"\\\\backsimeq\", true);\ndefineSymbol(math, ams, rel, \"\\u2ac5\", \"\\\\subseteqq\", true);\ndefineSymbol(math, ams, rel, \"\\u22d0\", \"\\\\Subset\", true);\ndefineSymbol(math, ams, rel, \"\\u228f\", \"\\\\sqsubset\", true);\ndefineSymbol(math, ams, rel, \"\\u227c\", \"\\\\preccurlyeq\", true);\ndefineSymbol(math, ams, rel, \"\\u22de\", \"\\\\curlyeqprec\", true);\ndefineSymbol(math, ams, rel, \"\\u227e\", \"\\\\precsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab7\", \"\\\\precapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u22b2\", \"\\\\vartriangleleft\");\ndefineSymbol(math, ams, rel, \"\\u22b4\", \"\\\\trianglelefteq\");\ndefineSymbol(math, ams, rel, \"\\u22a8\", \"\\\\vDash\", true);\ndefineSymbol(math, ams, rel, \"\\u22aa\", \"\\\\Vvdash\", true);\ndefineSymbol(math, ams, rel, \"\\u2323\", \"\\\\smallsmile\");\ndefineSymbol(math, ams, rel, \"\\u2322\", \"\\\\smallfrown\");\ndefineSymbol(math, ams, rel, \"\\u224f\", \"\\\\bumpeq\", true);\ndefineSymbol(math, ams, rel, \"\\u224e\", \"\\\\Bumpeq\", true);\ndefineSymbol(math, ams, rel, \"\\u2267\", \"\\\\geqq\", true);\ndefineSymbol(math, ams, rel, \"\\u2a7e\", \"\\\\geqslant\", true);\ndefineSymbol(math, ams, rel, \"\\u2a96\", \"\\\\eqslantgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u2273\", \"\\\\gtrsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a86\", \"\\\\gtrapprox\", true);\ndefineSymbol(math, ams, bin, \"\\u22d7\", \"\\\\gtrdot\");\ndefineSymbol(math, ams, rel, \"\\u22d9\", \"\\\\ggg\", true);\ndefineSymbol(math, ams, rel, \"\\u2277\", \"\\\\gtrless\", true);\ndefineSymbol(math, ams, rel, \"\\u22db\", \"\\\\gtreqless\", true);\ndefineSymbol(math, ams, rel, \"\\u2a8c\", \"\\\\gtreqqless\", true);\ndefineSymbol(math, ams, rel, \"\\u2256\", \"\\\\eqcirc\", true);\ndefineSymbol(math, ams, rel, \"\\u2257\", \"\\\\circeq\", true);\ndefineSymbol(math, ams, rel, \"\\u225c\", \"\\\\triangleq\", true);\ndefineSymbol(math, ams, rel, \"\\u223c\", \"\\\\thicksim\");\ndefineSymbol(math, ams, rel, \"\\u2248\", \"\\\\thickapprox\");\ndefineSymbol(math, ams, rel, \"\\u2ac6\", \"\\\\supseteqq\", true);\ndefineSymbol(math, ams, rel, \"\\u22d1\", \"\\\\Supset\", true);\ndefineSymbol(math, ams, rel, \"\\u2290\", \"\\\\sqsupset\", true);\ndefineSymbol(math, ams, rel, \"\\u227d\", \"\\\\succcurlyeq\", true);\ndefineSymbol(math, ams, rel, \"\\u22df\", \"\\\\curlyeqsucc\", true);\ndefineSymbol(math, ams, rel, \"\\u227f\", \"\\\\succsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab8\", \"\\\\succapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u22b3\", \"\\\\vartriangleright\");\ndefineSymbol(math, ams, rel, \"\\u22b5\", \"\\\\trianglerighteq\");\ndefineSymbol(math, ams, rel, \"\\u22a9\", \"\\\\Vdash\", true);\ndefineSymbol(math, ams, rel, \"\\u2223\", \"\\\\shortmid\");\ndefineSymbol(math, ams, rel, \"\\u2225\", \"\\\\shortparallel\");\ndefineSymbol(math, ams, rel, \"\\u226c\", \"\\\\between\", true);\ndefineSymbol(math, ams, rel, \"\\u22d4\", \"\\\\pitchfork\", true);\ndefineSymbol(math, ams, rel, \"\\u221d\", \"\\\\varpropto\");\ndefineSymbol(math, ams, rel, \"\\u25c0\", \"\\\\blacktriangleleft\");\n// unicode-math says that \\therefore is a mathord atom.\n// We kept the amssymb atom type, which is rel.\ndefineSymbol(math, ams, rel, \"\\u2234\", \"\\\\therefore\", true);\ndefineSymbol(math, ams, rel, \"\\u220d\", \"\\\\backepsilon\");\ndefineSymbol(math, ams, rel, \"\\u25b6\", \"\\\\blacktriangleright\");\n// unicode-math says that \\because is a mathord atom.\n// We kept the amssymb atom type, which is rel.\ndefineSymbol(math, ams, rel, \"\\u2235\", \"\\\\because\", true);\ndefineSymbol(math, ams, rel, \"\\u22d8\", \"\\\\llless\");\ndefineSymbol(math, ams, rel, \"\\u22d9\", \"\\\\gggtr\");\ndefineSymbol(math, ams, bin, \"\\u22b2\", \"\\\\lhd\");\ndefineSymbol(math, ams, bin, \"\\u22b3\", \"\\\\rhd\");\ndefineSymbol(math, ams, rel, \"\\u2242\", \"\\\\eqsim\", true);\ndefineSymbol(math, main, rel, \"\\u22c8\", \"\\\\Join\");\ndefineSymbol(math, ams, rel, \"\\u2251\", \"\\\\Doteq\", true);\n// AMS Binary Operators\ndefineSymbol(math, ams, bin, \"\\u2214\", \"\\\\dotplus\", true);\ndefineSymbol(math, ams, bin, \"\\u2216\", \"\\\\smallsetminus\");\ndefineSymbol(math, ams, bin, \"\\u22d2\", \"\\\\Cap\", true);\ndefineSymbol(math, ams, bin, \"\\u22d3\", \"\\\\Cup\", true);\ndefineSymbol(math, ams, bin, \"\\u2a5e\", \"\\\\doublebarwedge\", true);\ndefineSymbol(math, ams, bin, \"\\u229f\", \"\\\\boxminus\", true);\ndefineSymbol(math, ams, bin, \"\\u229e\", \"\\\\boxplus\", true);\ndefineSymbol(math, ams, bin, \"\\u22c7\", \"\\\\divideontimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22c9\", \"\\\\ltimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22ca\", \"\\\\rtimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22cb\", \"\\\\leftthreetimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22cc\", \"\\\\rightthreetimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22cf\", \"\\\\curlywedge\", true);\ndefineSymbol(math, ams, bin, \"\\u22ce\", \"\\\\curlyvee\", true);\ndefineSymbol(math, ams, bin, \"\\u229d\", \"\\\\circleddash\", true);\ndefineSymbol(math, ams, bin, \"\\u229b\", \"\\\\circledast\", true);\ndefineSymbol(math, ams, bin, \"\\u22c5\", \"\\\\centerdot\");\ndefineSymbol(math, ams, bin, \"\\u22ba\", \"\\\\intercal\", true);\ndefineSymbol(math, ams, bin, \"\\u22d2\", \"\\\\doublecap\");\ndefineSymbol(math, ams, bin, \"\\u22d3\", \"\\\\doublecup\");\ndefineSymbol(math, ams, bin, \"\\u22a0\", \"\\\\boxtimes\", true);\n// AMS Arrows\n// Note: unicode-math maps \\u21e2 to their own function \\rightdasharrow.\n// We'll map it to AMS function \\dashrightarrow. It produces the same atom.\ndefineSymbol(math, ams, rel, \"\\u21e2\", \"\\\\dashrightarrow\", true);\n// unicode-math maps \\u21e0 to \\leftdasharrow. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u21e0\", \"\\\\dashleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21c7\", \"\\\\leftleftarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21c6\", \"\\\\leftrightarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21da\", \"\\\\Lleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u219e\", \"\\\\twoheadleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21a2\", \"\\\\leftarrowtail\", true);\ndefineSymbol(math, ams, rel, \"\\u21ab\", \"\\\\looparrowleft\", true);\ndefineSymbol(math, ams, rel, \"\\u21cb\", \"\\\\leftrightharpoons\", true);\ndefineSymbol(math, ams, rel, \"\\u21b6\", \"\\\\curvearrowleft\", true);\n// unicode-math maps \\u21ba to \\acwopencirclearrow. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u21ba\", \"\\\\circlearrowleft\", true);\ndefineSymbol(math, ams, rel, \"\\u21b0\", \"\\\\Lsh\", true);\ndefineSymbol(math, ams, rel, \"\\u21c8\", \"\\\\upuparrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21bf\", \"\\\\upharpoonleft\", true);\ndefineSymbol(math, ams, rel, \"\\u21c3\", \"\\\\downharpoonleft\", true);\ndefineSymbol(math, main, rel, \"\\u22b6\", \"\\\\origof\", true); // not in font\ndefineSymbol(math, main, rel, \"\\u22b7\", \"\\\\imageof\", true); // not in font\ndefineSymbol(math, ams, rel, \"\\u22b8\", \"\\\\multimap\", true);\ndefineSymbol(math, ams, rel, \"\\u21ad\", \"\\\\leftrightsquigarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21c9\", \"\\\\rightrightarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21c4\", \"\\\\rightleftarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21a0\", \"\\\\twoheadrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21a3\", \"\\\\rightarrowtail\", true);\ndefineSymbol(math, ams, rel, \"\\u21ac\", \"\\\\looparrowright\", true);\ndefineSymbol(math, ams, rel, \"\\u21b7\", \"\\\\curvearrowright\", true);\n// unicode-math maps \\u21bb to \\cwopencirclearrow. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u21bb\", \"\\\\circlearrowright\", true);\ndefineSymbol(math, ams, rel, \"\\u21b1\", \"\\\\Rsh\", true);\ndefineSymbol(math, ams, rel, \"\\u21ca\", \"\\\\downdownarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21be\", \"\\\\upharpoonright\", true);\ndefineSymbol(math, ams, rel, \"\\u21c2\", \"\\\\downharpoonright\", true);\ndefineSymbol(math, ams, rel, \"\\u21dd\", \"\\\\rightsquigarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21dd\", \"\\\\leadsto\");\ndefineSymbol(math, ams, rel, \"\\u21db\", \"\\\\Rrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21be\", \"\\\\restriction\");\ndefineSymbol(math, main, textord, \"\\u2018\", \"`\");\ndefineSymbol(math, main, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, main, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, main, textord, \"$\", \"\\\\textdollar\");\ndefineSymbol(math, main, textord, \"%\", \"\\\\%\");\ndefineSymbol(text, main, textord, \"%\", \"\\\\%\");\ndefineSymbol(math, main, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, main, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, main, textord, \"_\", \"\\\\textunderscore\");\ndefineSymbol(math, main, textord, \"\\u2220\", \"\\\\angle\", true);\ndefineSymbol(math, main, textord, \"\\u221e\", \"\\\\infty\", true);\ndefineSymbol(math, main, textord, \"\\u2032\", \"\\\\prime\");\ndefineSymbol(math, main, textord, \"\\u25b3\", \"\\\\triangle\");\ndefineSymbol(math, main, textord, \"\\u0393\", \"\\\\Gamma\", true);\ndefineSymbol(math, main, textord, \"\\u0394\", \"\\\\Delta\", true);\ndefineSymbol(math, main, textord, \"\\u0398\", \"\\\\Theta\", true);\ndefineSymbol(math, main, textord, \"\\u039b\", \"\\\\Lambda\", true);\ndefineSymbol(math, main, textord, \"\\u039e\", \"\\\\Xi\", true);\ndefineSymbol(math, main, textord, \"\\u03a0\", \"\\\\Pi\", true);\ndefineSymbol(math, main, textord, \"\\u03a3\", \"\\\\Sigma\", true);\ndefineSymbol(math, main, textord, \"\\u03a5\", \"\\\\Upsilon\", true);\ndefineSymbol(math, main, textord, \"\\u03a6\", \"\\\\Phi\", true);\ndefineSymbol(math, main, textord, \"\\u03a8\", \"\\\\Psi\", true);\ndefineSymbol(math, main, textord, \"\\u03a9\", \"\\\\Omega\", true);\ndefineSymbol(math, main, textord, \"A\", \"\\u0391\");\ndefineSymbol(math, main, textord, \"B\", \"\\u0392\");\ndefineSymbol(math, main, textord, \"E\", \"\\u0395\");\ndefineSymbol(math, main, textord, \"Z\", \"\\u0396\");\ndefineSymbol(math, main, textord, \"H\", \"\\u0397\");\ndefineSymbol(math, main, textord, \"I\", \"\\u0399\");\ndefineSymbol(math, main, textord, \"K\", \"\\u039A\");\ndefineSymbol(math, main, textord, \"M\", \"\\u039C\");\ndefineSymbol(math, main, textord, \"N\", \"\\u039D\");\ndefineSymbol(math, main, textord, \"O\", \"\\u039F\");\ndefineSymbol(math, main, textord, \"P\", \"\\u03A1\");\ndefineSymbol(math, main, textord, \"T\", \"\\u03A4\");\ndefineSymbol(math, main, textord, \"X\", \"\\u03A7\");\ndefineSymbol(math, main, textord, \"\\u00ac\", \"\\\\neg\", true);\ndefineSymbol(math, main, textord, \"\\u00ac\", \"\\\\lnot\");\ndefineSymbol(math, main, textord, \"\\u22a4\", \"\\\\top\");\ndefineSymbol(math, main, textord, \"\\u22a5\", \"\\\\bot\");\ndefineSymbol(math, main, textord, \"\\u2205\", \"\\\\emptyset\");\ndefineSymbol(math, ams, textord, \"\\u2205\", \"\\\\varnothing\");\ndefineSymbol(math, main, mathord, \"\\u03b1\", \"\\\\alpha\", true);\ndefineSymbol(math, main, mathord, \"\\u03b2\", \"\\\\beta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b3\", \"\\\\gamma\", true);\ndefineSymbol(math, main, mathord, \"\\u03b4\", \"\\\\delta\", true);\ndefineSymbol(math, main, mathord, \"\\u03f5\", \"\\\\epsilon\", true);\ndefineSymbol(math, main, mathord, \"\\u03b6\", \"\\\\zeta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b7\", \"\\\\eta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b8\", \"\\\\theta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b9\", \"\\\\iota\", true);\ndefineSymbol(math, main, mathord, \"\\u03ba\", \"\\\\kappa\", true);\ndefineSymbol(math, main, mathord, \"\\u03bb\", \"\\\\lambda\", true);\ndefineSymbol(math, main, mathord, \"\\u03bc\", \"\\\\mu\", true);\ndefineSymbol(math, main, mathord, \"\\u03bd\", \"\\\\nu\", true);\ndefineSymbol(math, main, mathord, \"\\u03be\", \"\\\\xi\", true);\ndefineSymbol(math, main, mathord, \"\\u03bf\", \"\\\\omicron\", true);\ndefineSymbol(math, main, mathord, \"\\u03c0\", \"\\\\pi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c1\", \"\\\\rho\", true);\ndefineSymbol(math, main, mathord, \"\\u03c3\", \"\\\\sigma\", true);\ndefineSymbol(math, main, mathord, \"\\u03c4\", \"\\\\tau\", true);\ndefineSymbol(math, main, mathord, \"\\u03c5\", \"\\\\upsilon\", true);\ndefineSymbol(math, main, mathord, \"\\u03d5\", \"\\\\phi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c7\", \"\\\\chi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c8\", \"\\\\psi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c9\", \"\\\\omega\", true);\ndefineSymbol(math, main, mathord, \"\\u03b5\", \"\\\\varepsilon\", true);\ndefineSymbol(math, main, mathord, \"\\u03d1\", \"\\\\vartheta\", true);\ndefineSymbol(math, main, mathord, \"\\u03d6\", \"\\\\varpi\", true);\ndefineSymbol(math, main, mathord, \"\\u03f1\", \"\\\\varrho\", true);\ndefineSymbol(math, main, mathord, \"\\u03c2\", \"\\\\varsigma\", true);\ndefineSymbol(math, main, mathord, \"\\u03c6\", \"\\\\varphi\", true);\ndefineSymbol(math, main, bin, \"\\u2217\", \"*\", true);\ndefineSymbol(math, main, bin, \"+\", \"+\");\ndefineSymbol(math, main, bin, \"\\u2212\", \"-\", true);\ndefineSymbol(math, main, bin, \"\\u22c5\", \"\\\\cdot\", true);\ndefineSymbol(math, main, bin, \"\\u2218\", \"\\\\circ\", true);\ndefineSymbol(math, main, bin, \"\\u00f7\", \"\\\\div\", true);\ndefineSymbol(math, main, bin, \"\\u00b1\", \"\\\\pm\", true);\ndefineSymbol(math, main, bin, \"\\u00d7\", \"\\\\times\", true);\ndefineSymbol(math, main, bin, \"\\u2229\", \"\\\\cap\", true);\ndefineSymbol(math, main, bin, \"\\u222a\", \"\\\\cup\", true);\ndefineSymbol(math, main, bin, \"\\u2216\", \"\\\\setminus\", true);\ndefineSymbol(math, main, bin, \"\\u2227\", \"\\\\land\");\ndefineSymbol(math, main, bin, \"\\u2228\", \"\\\\lor\");\ndefineSymbol(math, main, bin, \"\\u2227\", \"\\\\wedge\", true);\ndefineSymbol(math, main, bin, \"\\u2228\", \"\\\\vee\", true);\ndefineSymbol(math, main, textord, \"\\u221a\", \"\\\\surd\");\ndefineSymbol(math, main, open, \"\\u27e8\", \"\\\\langle\", true);\ndefineSymbol(math, main, open, \"\\u2223\", \"\\\\lvert\");\ndefineSymbol(math, main, open, \"\\u2225\", \"\\\\lVert\");\ndefineSymbol(math, main, close, \"?\", \"?\");\ndefineSymbol(math, main, close, \"!\", \"!\");\ndefineSymbol(math, main, close, \"\\u27e9\", \"\\\\rangle\", true);\ndefineSymbol(math, main, close, \"\\u2223\", \"\\\\rvert\");\ndefineSymbol(math, main, close, \"\\u2225\", \"\\\\rVert\");\ndefineSymbol(math, main, rel, \"=\", \"=\");\ndefineSymbol(math, main, rel, \":\", \":\");\ndefineSymbol(math, main, rel, \"\\u2248\", \"\\\\approx\", true);\ndefineSymbol(math, main, rel, \"\\u2245\", \"\\\\cong\", true);\ndefineSymbol(math, main, rel, \"\\u2265\", \"\\\\ge\");\ndefineSymbol(math, main, rel, \"\\u2265\", \"\\\\geq\", true);\ndefineSymbol(math, main, rel, \"\\u2190\", \"\\\\gets\");\ndefineSymbol(math, main, rel, \">\", \"\\\\gt\", true);\ndefineSymbol(math, main, rel, \"\\u2208\", \"\\\\in\", true);\ndefineSymbol(math, main, rel, \"\\ue020\", \"\\\\@not\");\ndefineSymbol(math, main, rel, \"\\u2282\", \"\\\\subset\", true);\ndefineSymbol(math, main, rel, \"\\u2283\", \"\\\\supset\", true);\ndefineSymbol(math, main, rel, \"\\u2286\", \"\\\\subseteq\", true);\ndefineSymbol(math, main, rel, \"\\u2287\", \"\\\\supseteq\", true);\ndefineSymbol(math, ams, rel, \"\\u2288\", \"\\\\nsubseteq\", true);\ndefineSymbol(math, ams, rel, \"\\u2289\", \"\\\\nsupseteq\", true);\ndefineSymbol(math, main, rel, \"\\u22a8\", \"\\\\models\");\ndefineSymbol(math, main, rel, \"\\u2190\", \"\\\\leftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2264\", \"\\\\le\");\ndefineSymbol(math, main, rel, \"\\u2264\", \"\\\\leq\", true);\ndefineSymbol(math, main, rel, \"<\", \"\\\\lt\", true);\ndefineSymbol(math, main, rel, \"\\u2192\", \"\\\\rightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2192\", \"\\\\to\");\ndefineSymbol(math, ams, rel, \"\\u2271\", \"\\\\ngeq\", true);\ndefineSymbol(math, ams, rel, \"\\u2270\", \"\\\\nleq\", true);\ndefineSymbol(math, main, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(math, main, spacing, \"\\u00a0\", \"\\\\space\");\n// Ref: LaTeX Source 2e: \\DeclareRobustCommand{\\nobreakspace}{%\ndefineSymbol(math, main, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \" \");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \"\\\\space\");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(math, main, spacing, null, \"\\\\nobreak\");\ndefineSymbol(math, main, spacing, null, \"\\\\allowbreak\");\ndefineSymbol(math, main, punct, \",\", \",\");\ndefineSymbol(math, main, punct, \";\", \";\");\ndefineSymbol(math, ams, bin, \"\\u22bc\", \"\\\\barwedge\", true);\ndefineSymbol(math, ams, bin, \"\\u22bb\", \"\\\\veebar\", true);\ndefineSymbol(math, main, bin, \"\\u2299\", \"\\\\odot\", true);\ndefineSymbol(math, main, bin, \"\\u2295\", \"\\\\oplus\", true);\ndefineSymbol(math, main, bin, \"\\u2297\", \"\\\\otimes\", true);\ndefineSymbol(math, main, textord, \"\\u2202\", \"\\\\partial\", true);\ndefineSymbol(math, main, bin, \"\\u2298\", \"\\\\oslash\", true);\ndefineSymbol(math, ams, bin, \"\\u229a\", \"\\\\circledcirc\", true);\ndefineSymbol(math, ams, bin, \"\\u22a1\", \"\\\\boxdot\", true);\ndefineSymbol(math, main, bin, \"\\u25b3\", \"\\\\bigtriangleup\");\ndefineSymbol(math, main, bin, \"\\u25bd\", \"\\\\bigtriangledown\");\ndefineSymbol(math, main, bin, \"\\u2020\", \"\\\\dagger\");\ndefineSymbol(math, main, bin, \"\\u22c4\", \"\\\\diamond\");\ndefineSymbol(math, main, bin, \"\\u22c6\", \"\\\\star\");\ndefineSymbol(math, main, bin, \"\\u25c3\", \"\\\\triangleleft\");\ndefineSymbol(math, main, bin, \"\\u25b9\", \"\\\\triangleright\");\ndefineSymbol(math, main, open, \"{\", \"\\\\{\");\ndefineSymbol(text, main, textord, \"{\", \"\\\\{\");\ndefineSymbol(text, main, textord, \"{\", \"\\\\textbraceleft\");\ndefineSymbol(math, main, close, \"}\", \"\\\\}\");\ndefineSymbol(text, main, textord, \"}\", \"\\\\}\");\ndefineSymbol(text, main, textord, \"}\", \"\\\\textbraceright\");\ndefineSymbol(math, main, open, \"{\", \"\\\\lbrace\");\ndefineSymbol(math, main, close, \"}\", \"\\\\rbrace\");\ndefineSymbol(math, main, open, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(text, main, textord, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(math, main, close, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(text, main, textord, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(math, main, open, \"(\", \"\\\\lparen\", true);\ndefineSymbol(math, main, close, \")\", \"\\\\rparen\", true);\ndefineSymbol(text, main, textord, \"<\", \"\\\\textless\", true); // in T1 fontenc\ndefineSymbol(text, main, textord, \">\", \"\\\\textgreater\", true); // in T1 fontenc\ndefineSymbol(math, main, open, \"\\u230a\", \"\\\\lfloor\", true);\ndefineSymbol(math, main, close, \"\\u230b\", \"\\\\rfloor\", true);\ndefineSymbol(math, main, open, \"\\u2308\", \"\\\\lceil\", true);\ndefineSymbol(math, main, close, \"\\u2309\", \"\\\\rceil\", true);\ndefineSymbol(math, main, textord, \"\\\\\", \"\\\\backslash\");\ndefineSymbol(math, main, textord, \"\\u2223\", \"|\");\ndefineSymbol(math, main, textord, \"\\u2223\", \"\\\\vert\");\ndefineSymbol(text, main, textord, \"|\", \"\\\\textbar\", true); // in T1 fontenc\ndefineSymbol(math, main, textord, \"\\u2225\", \"\\\\|\");\ndefineSymbol(math, main, textord, \"\\u2225\", \"\\\\Vert\");\ndefineSymbol(text, main, textord, \"\\u2225\", \"\\\\textbardbl\");\ndefineSymbol(text, main, textord, \"~\", \"\\\\textasciitilde\");\ndefineSymbol(text, main, textord, \"\\\\\", \"\\\\textbackslash\");\ndefineSymbol(text, main, textord, \"^\", \"\\\\textasciicircum\");\ndefineSymbol(math, main, rel, \"\\u2191\", \"\\\\uparrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d1\", \"\\\\Uparrow\", true);\ndefineSymbol(math, main, rel, \"\\u2193\", \"\\\\downarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d3\", \"\\\\Downarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2195\", \"\\\\updownarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d5\", \"\\\\Updownarrow\", true);\ndefineSymbol(math, main, op, \"\\u2210\", \"\\\\coprod\");\ndefineSymbol(math, main, op, \"\\u22c1\", \"\\\\bigvee\");\ndefineSymbol(math, main, op, \"\\u22c0\", \"\\\\bigwedge\");\ndefineSymbol(math, main, op, \"\\u2a04\", \"\\\\biguplus\");\ndefineSymbol(math, main, op, \"\\u22c2\", \"\\\\bigcap\");\ndefineSymbol(math, main, op, \"\\u22c3\", \"\\\\bigcup\");\ndefineSymbol(math, main, op, \"\\u222b\", \"\\\\int\");\ndefineSymbol(math, main, op, \"\\u222b\", \"\\\\intop\");\ndefineSymbol(math, main, op, \"\\u222c\", \"\\\\iint\");\ndefineSymbol(math, main, op, \"\\u222d\", \"\\\\iiint\");\ndefineSymbol(math, main, op, \"\\u220f\", \"\\\\prod\");\ndefineSymbol(math, main, op, \"\\u2211\", \"\\\\sum\");\ndefineSymbol(math, main, op, \"\\u2a02\", \"\\\\bigotimes\");\ndefineSymbol(math, main, op, \"\\u2a01\", \"\\\\bigoplus\");\ndefineSymbol(math, main, op, \"\\u2a00\", \"\\\\bigodot\");\ndefineSymbol(math, main, op, \"\\u222e\", \"\\\\oint\");\ndefineSymbol(math, main, op, \"\\u222f\", \"\\\\oiint\");\ndefineSymbol(math, main, op, \"\\u2230\", \"\\\\oiiint\");\ndefineSymbol(math, main, op, \"\\u2a06\", \"\\\\bigsqcup\");\ndefineSymbol(math, main, op, \"\\u222b\", \"\\\\smallint\");\ndefineSymbol(text, main, inner, \"\\u2026\", \"\\\\textellipsis\");\ndefineSymbol(math, main, inner, \"\\u2026\", \"\\\\mathellipsis\");\ndefineSymbol(text, main, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, main, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, main, inner, \"\\u22ef\", \"\\\\@cdots\", true);\ndefineSymbol(math, main, inner, \"\\u22f1\", \"\\\\ddots\", true);\n// \\vdots is a macro that uses one of these two symbols (with made-up names):\ndefineSymbol(math, main, textord, \"\\u22ee\", \"\\\\varvdots\");\ndefineSymbol(text, main, textord, \"\\u22ee\", \"\\\\varvdots\");\ndefineSymbol(math, main, accent, \"\\u02ca\", \"\\\\acute\");\ndefineSymbol(math, main, accent, \"\\u02cb\", \"\\\\grave\");\ndefineSymbol(math, main, accent, \"\\u00a8\", \"\\\\ddot\");\ndefineSymbol(math, main, accent, \"\\u007e\", \"\\\\tilde\");\ndefineSymbol(math, main, accent, \"\\u02c9\", \"\\\\bar\");\ndefineSymbol(math, main, accent, \"\\u02d8\", \"\\\\breve\");\ndefineSymbol(math, main, accent, \"\\u02c7\", \"\\\\check\");\ndefineSymbol(math, main, accent, \"\\u005e\", \"\\\\hat\");\ndefineSymbol(math, main, accent, \"\\u20d7\", \"\\\\vec\");\ndefineSymbol(math, main, accent, \"\\u02d9\", \"\\\\dot\");\ndefineSymbol(math, main, accent, \"\\u02da\", \"\\\\mathring\");\n// \\imath and \\jmath should be invariant to \\mathrm, \\mathbf, etc., so use PUA\ndefineSymbol(math, main, mathord, \"\\ue131\", \"\\\\@imath\");\ndefineSymbol(math, main, mathord, \"\\ue237\", \"\\\\@jmath\");\ndefineSymbol(math, main, textord, \"\\u0131\", \"\\u0131\");\ndefineSymbol(math, main, textord, \"\\u0237\", \"\\u0237\");\ndefineSymbol(text, main, textord, \"\\u0131\", \"\\\\i\", true);\ndefineSymbol(text, main, textord, \"\\u0237\", \"\\\\j\", true);\ndefineSymbol(text, main, textord, \"\\u00df\", \"\\\\ss\", true);\ndefineSymbol(text, main, textord, \"\\u00e6\", \"\\\\ae\", true);\ndefineSymbol(text, main, textord, \"\\u0153\", \"\\\\oe\", true);\ndefineSymbol(text, main, textord, \"\\u00f8\", \"\\\\o\", true);\ndefineSymbol(text, main, textord, \"\\u00c6\", \"\\\\AE\", true);\ndefineSymbol(text, main, textord, \"\\u0152\", \"\\\\OE\", true);\ndefineSymbol(text, main, textord, \"\\u00d8\", \"\\\\O\", true);\ndefineSymbol(text, main, accent, \"\\u02ca\", \"\\\\'\"); // acute\ndefineSymbol(text, main, accent, \"\\u02cb\", \"\\\\`\"); // grave\ndefineSymbol(text, main, accent, \"\\u02c6\", \"\\\\^\"); // circumflex\ndefineSymbol(text, main, accent, \"\\u02dc\", \"\\\\~\"); // tilde\ndefineSymbol(text, main, accent, \"\\u02c9\", \"\\\\=\"); // macron\ndefineSymbol(text, main, accent, \"\\u02d8\", \"\\\\u\"); // breve\ndefineSymbol(text, main, accent, \"\\u02d9\", \"\\\\.\"); // dot above\ndefineSymbol(text, main, accent, \"\\u00b8\", \"\\\\c\"); // cedilla\ndefineSymbol(text, main, accent, \"\\u02da\", \"\\\\r\"); // ring above\ndefineSymbol(text, main, accent, \"\\u02c7\", \"\\\\v\"); // caron\ndefineSymbol(text, main, accent, \"\\u00a8\", '\\\\\"'); // diaeresis\ndefineSymbol(text, main, accent, \"\\u02dd\", \"\\\\H\"); // double acute\ndefineSymbol(text, main, accent, \"\\u25ef\", \"\\\\textcircled\"); // \\bigcirc glyph\n// These ligatures are detected and created in Parser.js's `formLigatures`.\nvar ligatures = {\n  \"--\": true,\n  \"---\": true,\n  \"``\": true,\n  \"''\": true\n};\ndefineSymbol(text, main, textord, \"\\u2013\", \"--\", true);\ndefineSymbol(text, main, textord, \"\\u2013\", \"\\\\textendash\");\ndefineSymbol(text, main, textord, \"\\u2014\", \"---\", true);\ndefineSymbol(text, main, textord, \"\\u2014\", \"\\\\textemdash\");\ndefineSymbol(text, main, textord, \"\\u2018\", \"`\", true);\ndefineSymbol(text, main, textord, \"\\u2018\", \"\\\\textquoteleft\");\ndefineSymbol(text, main, textord, \"\\u2019\", \"'\", true);\ndefineSymbol(text, main, textord, \"\\u2019\", \"\\\\textquoteright\");\ndefineSymbol(text, main, textord, \"\\u201c\", \"``\", true);\ndefineSymbol(text, main, textord, \"\\u201c\", \"\\\\textquotedblleft\");\ndefineSymbol(text, main, textord, \"\\u201d\", \"''\", true);\ndefineSymbol(text, main, textord, \"\\u201d\", \"\\\\textquotedblright\");\n//  \\degree from gensymb package\ndefineSymbol(math, main, textord, \"\\u00b0\", \"\\\\degree\", true);\ndefineSymbol(text, main, textord, \"\\u00b0\", \"\\\\degree\");\n// \\textdegree from inputenc package\ndefineSymbol(text, main, textord, \"\\u00b0\", \"\\\\textdegree\", true);\n// TODO: In LaTeX, \\pounds can generate a different character in text and math\n// mode, but among our fonts, only Main-Regular defines this character \"163\".\ndefineSymbol(math, main, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(math, main, textord, \"\\u00a3\", \"\\\\mathsterling\", true);\ndefineSymbol(text, main, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(text, main, textord, \"\\u00a3\", \"\\\\textsterling\", true);\ndefineSymbol(math, ams, textord, \"\\u2720\", \"\\\\maltese\");\ndefineSymbol(text, ams, textord, \"\\u2720\", \"\\\\maltese\");\n// There are lots of symbols which are the same, so we add them in afterwards.\n// All of these are textords in math mode\nvar mathTextSymbols = \"0123456789/@.\\\"\";\nfor (var i = 0; i < mathTextSymbols.length; i++) {\n  var ch = mathTextSymbols.charAt(i);\n  defineSymbol(math, main, textord, ch, ch);\n}\n// All of these are textords in text mode\nvar textSymbols = \"0123456789!@*()-=+\\\";:?/.,\";\nfor (var _i = 0; _i < textSymbols.length; _i++) {\n  var _ch = textSymbols.charAt(_i);\n  defineSymbol(text, main, textord, _ch, _ch);\n}\n// All of these are textords in text mode, and mathords in math mode\nvar letters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nfor (var _i2 = 0; _i2 < letters.length; _i2++) {\n  var _ch2 = letters.charAt(_i2);\n  defineSymbol(math, main, mathord, _ch2, _ch2);\n  defineSymbol(text, main, textord, _ch2, _ch2);\n}\n// Blackboard bold and script letters in Unicode range\ndefineSymbol(math, ams, textord, \"C\", \"\\u2102\"); // blackboard bold\ndefineSymbol(text, ams, textord, \"C\", \"\\u2102\");\ndefineSymbol(math, ams, textord, \"H\", \"\\u210D\");\ndefineSymbol(text, ams, textord, \"H\", \"\\u210D\");\ndefineSymbol(math, ams, textord, \"N\", \"\\u2115\");\ndefineSymbol(text, ams, textord, \"N\", \"\\u2115\");\ndefineSymbol(math, ams, textord, \"P\", \"\\u2119\");\ndefineSymbol(text, ams, textord, \"P\", \"\\u2119\");\ndefineSymbol(math, ams, textord, \"Q\", \"\\u211A\");\ndefineSymbol(text, ams, textord, \"Q\", \"\\u211A\");\ndefineSymbol(math, ams, textord, \"R\", \"\\u211D\");\ndefineSymbol(text, ams, textord, \"R\", \"\\u211D\");\ndefineSymbol(math, ams, textord, \"Z\", \"\\u2124\");\ndefineSymbol(text, ams, textord, \"Z\", \"\\u2124\");\ndefineSymbol(math, main, mathord, \"h\", \"\\u210E\"); // italic h, Planck constant\ndefineSymbol(text, main, mathord, \"h\", \"\\u210E\");\n// The next loop loads wide (surrogate pair) characters.\n// We support some letters in the Unicode range U+1D400 to U+1D7FF,\n// Mathematical Alphanumeric Symbols.\n// Some editors do not deal well with wide characters. So don't write the\n// string into this file. Instead, create the string from the surrogate pair.\nvar wideChar = \"\";\nfor (var _i3 = 0; _i3 < letters.length; _i3++) {\n  var _ch3 = letters.charAt(_i3);\n  // The hex numbers in the next line are a surrogate pair.\n  // 0xD835 is the high surrogate for all letters in the range we support.\n  // 0xDC00 is the low surrogate for bold A.\n  wideChar = String.fromCharCode(0xD835, 0xDC00 + _i3); // A-Z a-z bold\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDC34 + _i3); // A-Z a-z italic\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDC68 + _i3); // A-Z a-z bold italic\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDD04 + _i3); // A-Z a-z Fraktur\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDD6C + _i3); // A-Z a-z bold Fraktur\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDDA0 + _i3); // A-Z a-z sans-serif\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDDD4 + _i3); // A-Z a-z sans bold\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDE08 + _i3); // A-Z a-z sans italic\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDE70 + _i3); // A-Z a-z monospace\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  if (_i3 < 26) {\n    // KaTeX fonts have only capital letters for blackboard bold and script.\n    // See exception for k below.\n    wideChar = String.fromCharCode(0xD835, 0xDD38 + _i3); // A-Z double struck\n    defineSymbol(math, main, mathord, _ch3, wideChar);\n    defineSymbol(text, main, textord, _ch3, wideChar);\n    wideChar = String.fromCharCode(0xD835, 0xDC9C + _i3); // A-Z script\n    defineSymbol(math, main, mathord, _ch3, wideChar);\n    defineSymbol(text, main, textord, _ch3, wideChar);\n  }\n  // TODO: Add bold script when it is supported by a KaTeX font.\n}\n// \"k\" is the only double struck lower case letter in the KaTeX fonts.\nwideChar = String.fromCharCode(0xD835, 0xDD5C); // k double struck\ndefineSymbol(math, main, mathord, \"k\", wideChar);\ndefineSymbol(text, main, textord, \"k\", wideChar);\n// Next, some wide character numerals\nfor (var _i4 = 0; _i4 < 10; _i4++) {\n  var _ch4 = _i4.toString();\n  wideChar = String.fromCharCode(0xD835, 0xDFCE + _i4); // 0-9 bold\n  defineSymbol(math, main, mathord, _ch4, wideChar);\n  defineSymbol(text, main, textord, _ch4, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDFE2 + _i4); // 0-9 sans serif\n  defineSymbol(math, main, mathord, _ch4, wideChar);\n  defineSymbol(text, main, textord, _ch4, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDFEC + _i4); // 0-9 bold sans\n  defineSymbol(math, main, mathord, _ch4, wideChar);\n  defineSymbol(text, main, textord, _ch4, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDFF6 + _i4); // 0-9 monospace\n  defineSymbol(math, main, mathord, _ch4, wideChar);\n  defineSymbol(text, main, textord, _ch4, wideChar);\n}\n// We add these Latin-1 letters as symbols for backwards-compatibility,\n// but they are not actually in the font, nor are they supported by the\n// Unicode accent mechanism, so they fall back to Times font and look ugly.\n// TODO(edemaine): Fix this.\nvar extraLatin = \"\\u00d0\\u00de\\u00fe\";\nfor (var _i5 = 0; _i5 < extraLatin.length; _i5++) {\n  var _ch5 = extraLatin.charAt(_i5);\n  defineSymbol(math, main, mathord, _ch5, _ch5);\n  defineSymbol(text, main, textord, _ch5, _ch5);\n}\n\n/**\n * This file provides support for Unicode range U+1D400 to U+1D7FF,\n * Mathematical Alphanumeric Symbols.\n *\n * Function wideCharacterFont takes a wide character as input and returns\n * the font information necessary to render it properly.\n */\n/**\n * Data below is from https://www.unicode.org/charts/PDF/U1D400.pdf\n * That document sorts characters into groups by font type, say bold or italic.\n *\n * In the arrays below, each subarray consists three elements:\n *      * The CSS class of that group when in math mode.\n *      * The CSS class of that group when in text mode.\n *      * The font name, so that KaTeX can get font metrics.\n */\nvar wideLatinLetterData = [[\"mathbf\", \"textbf\", \"Main-Bold\"],\n// A-Z bold upright\n[\"mathbf\", \"textbf\", \"Main-Bold\"],\n// a-z bold upright\n[\"mathnormal\", \"textit\", \"Math-Italic\"],\n// A-Z italic\n[\"mathnormal\", \"textit\", \"Math-Italic\"],\n// a-z italic\n[\"boldsymbol\", \"boldsymbol\", \"Main-BoldItalic\"],\n// A-Z bold italic\n[\"boldsymbol\", \"boldsymbol\", \"Main-BoldItalic\"],\n// a-z bold italic\n// Map fancy A-Z letters to script, not calligraphic.\n// This aligns with unicode-math and math fonts (except Cambria Math).\n[\"mathscr\", \"textscr\", \"Script-Regular\"],\n// A-Z script\n[\"\", \"\", \"\"],\n// a-z script.  No font\n[\"\", \"\", \"\"],\n// A-Z bold script. No font\n[\"\", \"\", \"\"],\n// a-z bold script. No font\n[\"mathfrak\", \"textfrak\", \"Fraktur-Regular\"],\n// A-Z Fraktur\n[\"mathfrak\", \"textfrak\", \"Fraktur-Regular\"],\n// a-z Fraktur\n[\"mathbb\", \"textbb\", \"AMS-Regular\"],\n// A-Z double-struck\n[\"mathbb\", \"textbb\", \"AMS-Regular\"],\n// k double-struck\n// Note that we are using a bold font, but font metrics for regular Fraktur.\n[\"mathboldfrak\", \"textboldfrak\", \"Fraktur-Regular\"],\n// A-Z bold Fraktur\n[\"mathboldfrak\", \"textboldfrak\", \"Fraktur-Regular\"],\n// a-z bold Fraktur\n[\"mathsf\", \"textsf\", \"SansSerif-Regular\"],\n// A-Z sans-serif\n[\"mathsf\", \"textsf\", \"SansSerif-Regular\"],\n// a-z sans-serif\n[\"mathboldsf\", \"textboldsf\", \"SansSerif-Bold\"],\n// A-Z bold sans-serif\n[\"mathboldsf\", \"textboldsf\", \"SansSerif-Bold\"],\n// a-z bold sans-serif\n[\"mathitsf\", \"textitsf\", \"SansSerif-Italic\"],\n// A-Z italic sans-serif\n[\"mathitsf\", \"textitsf\", \"SansSerif-Italic\"],\n// a-z italic sans-serif\n[\"\", \"\", \"\"],\n// A-Z bold italic sans. No font\n[\"\", \"\", \"\"],\n// a-z bold italic sans. No font\n[\"mathtt\", \"texttt\", \"Typewriter-Regular\"],\n// A-Z monospace\n[\"mathtt\", \"texttt\", \"Typewriter-Regular\"] // a-z monospace\n];\nvar wideNumeralData = [[\"mathbf\", \"textbf\", \"Main-Bold\"],\n// 0-9 bold\n[\"\", \"\", \"\"],\n// 0-9 double-struck. No KaTeX font.\n[\"mathsf\", \"textsf\", \"SansSerif-Regular\"],\n// 0-9 sans-serif\n[\"mathboldsf\", \"textboldsf\", \"SansSerif-Bold\"],\n// 0-9 bold sans-serif\n[\"mathtt\", \"texttt\", \"Typewriter-Regular\"] // 0-9 monospace\n];\nvar wideCharacterFont = (wideChar, mode) => {\n  // IE doesn't support codePointAt(). So work with the surrogate pair.\n  var H = wideChar.charCodeAt(0); // high surrogate\n  var L = wideChar.charCodeAt(1); // low surrogate\n  var codePoint = (H - 0xD800) * 0x400 + (L - 0xDC00) + 0x10000;\n  var j = mode === \"math\" ? 0 : 1; // column index for CSS class.\n  if (0x1D400 <= codePoint && codePoint < 0x1D6A4) {\n    // wideLatinLetterData contains exactly 26 chars on each row.\n    // So we can calculate the relevant row. No traverse necessary.\n    var i = Math.floor((codePoint - 0x1D400) / 26);\n    return [wideLatinLetterData[i][2], wideLatinLetterData[i][j]];\n  } else if (0x1D7CE <= codePoint && codePoint <= 0x1D7FF) {\n    // Numerals, ten per row.\n    var _i = Math.floor((codePoint - 0x1D7CE) / 10);\n    return [wideNumeralData[_i][2], wideNumeralData[_i][j]];\n  } else if (codePoint === 0x1D6A5 || codePoint === 0x1D6A6) {\n    // dotless i or j\n    return [wideLatinLetterData[0][2], wideLatinLetterData[0][j]];\n  } else if (0x1D6A6 < codePoint && codePoint < 0x1D7CE) {\n    // Greek letters. Not supported, yet.\n    return [\"\", \"\"];\n  } else {\n    // We don't support any wide characters outside 1D400–1D7FF.\n    throw new ParseError(\"Unsupported character: \" + wideChar);\n  }\n};\n\n/* eslint no-console:0 */\n/**\n * Looks up the given symbol in fontMetrics, after applying any symbol\n * replacements defined in symbol.js\n */\nvar lookupSymbol = function lookupSymbol(value,\n// TODO(#963): Use a union type for this.\nfontName, mode) {\n  // Replace the value with its replaced value from symbol.js\n  if (symbols[mode][value]) {\n    var replacement = symbols[mode][value].replace;\n    if (replacement) {\n      value = replacement;\n    }\n  }\n  return {\n    value,\n    metrics: getCharacterMetrics(value, fontName, mode)\n  };\n};\n/**\n * Makes a symbolNode after translation via the list of symbols in symbols.js.\n * Correctly pulls out metrics for the character, and optionally takes a list of\n * classes to be attached to the node.\n *\n * TODO: make argument order closer to makeSpan\n * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which\n * should if present come first in `classes`.\n * TODO(#953): Make `options` mandatory and always pass it in.\n */\nvar makeSymbol = function makeSymbol(value, fontName, mode, options, classes) {\n  var lookup = lookupSymbol(value, fontName, mode);\n  var metrics = lookup.metrics;\n  value = lookup.value;\n  var symbolNode;\n  if (metrics) {\n    var italic = metrics.italic;\n    if (mode === \"text\" || options && options.font === \"mathit\") {\n      italic = 0;\n    }\n    symbolNode = new SymbolNode(value, metrics.height, metrics.depth, italic, metrics.skew, metrics.width, classes);\n  } else {\n    // TODO(emily): Figure out a good way to only print this in development\n    typeof console !== \"undefined\" && console.warn(\"No character metrics \" + (\"for '\" + value + \"' in style '\" + fontName + \"' and mode '\" + mode + \"'\"));\n    symbolNode = new SymbolNode(value, 0, 0, 0, 0, 0, classes);\n  }\n  if (options) {\n    symbolNode.maxFontSize = options.sizeMultiplier;\n    if (options.style.isTight()) {\n      symbolNode.classes.push(\"mtight\");\n    }\n    var color = options.getColor();\n    if (color) {\n      symbolNode.style.color = color;\n    }\n  }\n  return symbolNode;\n};\n/**\n * Makes a symbol in Main-Regular or AMS-Regular.\n * Used for rel, bin, open, close, inner, and punct.\n */\nvar mathsym = function mathsym(value, mode, options, classes) {\n  if (classes === void 0) {\n    classes = [];\n  }\n  // Decide what font to render the symbol in by its entry in the symbols\n  // table.\n  // Have a special case for when the value = \\ because the \\ is used as a\n  // textord in unsupported command errors but cannot be parsed as a regular\n  // text ordinal and is therefore not present as a symbol in the symbols\n  // table for text, as well as a special case for boldsymbol because it\n  // can be used for bold + and -\n  if (options.font === \"boldsymbol\" && lookupSymbol(value, \"Main-Bold\", mode).metrics) {\n    return makeSymbol(value, \"Main-Bold\", mode, options, classes.concat([\"mathbf\"]));\n  } else if (value === \"\\\\\" || symbols[mode][value].font === \"main\") {\n    return makeSymbol(value, \"Main-Regular\", mode, options, classes);\n  } else {\n    return makeSymbol(value, \"AMS-Regular\", mode, options, classes.concat([\"amsrm\"]));\n  }\n};\n/**\n * Determines which of the two font names (Main-Bold and Math-BoldItalic) and\n * corresponding style tags (mathbf or boldsymbol) to use for font \"boldsymbol\",\n * depending on the symbol.  Use this function instead of fontMap for font\n * \"boldsymbol\".\n */\nvar boldsymbol = function boldsymbol(value, mode, options, classes, type) {\n  if (type !== \"textord\" && lookupSymbol(value, \"Math-BoldItalic\", mode).metrics) {\n    return {\n      fontName: \"Math-BoldItalic\",\n      fontClass: \"boldsymbol\"\n    };\n  } else {\n    // Some glyphs do not exist in Math-BoldItalic so we need to use\n    // Main-Bold instead.\n    return {\n      fontName: \"Main-Bold\",\n      fontClass: \"mathbf\"\n    };\n  }\n};\n/**\n * Makes either a mathord or textord in the correct font and color.\n */\nvar makeOrd = function makeOrd(group, options, type) {\n  var mode = group.mode;\n  var text = group.text;\n  var classes = [\"mord\"];\n  // Math mode or Old font (i.e. \\rm)\n  var isFont = mode === \"math\" || mode === \"text\" && options.font;\n  var fontOrFamily = isFont ? options.font : options.fontFamily;\n  var wideFontName = \"\";\n  var wideFontClass = \"\";\n  if (text.charCodeAt(0) === 0xD835) {\n    [wideFontName, wideFontClass] = wideCharacterFont(text, mode);\n  }\n  if (wideFontName.length > 0) {\n    // surrogate pairs get special treatment\n    return makeSymbol(text, wideFontName, mode, options, classes.concat(wideFontClass));\n  } else if (fontOrFamily) {\n    var fontName;\n    var fontClasses;\n    if (fontOrFamily === \"boldsymbol\") {\n      var fontData = boldsymbol(text, mode, options, classes, type);\n      fontName = fontData.fontName;\n      fontClasses = [fontData.fontClass];\n    } else if (isFont) {\n      fontName = fontMap[fontOrFamily].fontName;\n      fontClasses = [fontOrFamily];\n    } else {\n      fontName = retrieveTextFontName(fontOrFamily, options.fontWeight, options.fontShape);\n      fontClasses = [fontOrFamily, options.fontWeight, options.fontShape];\n    }\n    if (lookupSymbol(text, fontName, mode).metrics) {\n      return makeSymbol(text, fontName, mode, options, classes.concat(fontClasses));\n    } else if (ligatures.hasOwnProperty(text) && fontName.slice(0, 10) === \"Typewriter\") {\n      // Deconstruct ligatures in monospace fonts (\\texttt, \\tt).\n      var parts = [];\n      for (var i = 0; i < text.length; i++) {\n        parts.push(makeSymbol(text[i], fontName, mode, options, classes.concat(fontClasses)));\n      }\n      return makeFragment(parts);\n    }\n  }\n  // Makes a symbol in the default font for mathords and textords.\n  if (type === \"mathord\") {\n    return makeSymbol(text, \"Math-Italic\", mode, options, classes.concat([\"mathnormal\"]));\n  } else if (type === \"textord\") {\n    var font = symbols[mode][text] && symbols[mode][text].font;\n    if (font === \"ams\") {\n      var _fontName = retrieveTextFontName(\"amsrm\", options.fontWeight, options.fontShape);\n      return makeSymbol(text, _fontName, mode, options, classes.concat(\"amsrm\", options.fontWeight, options.fontShape));\n    } else if (font === \"main\" || !font) {\n      var _fontName2 = retrieveTextFontName(\"textrm\", options.fontWeight, options.fontShape);\n      return makeSymbol(text, _fontName2, mode, options, classes.concat(options.fontWeight, options.fontShape));\n    } else {\n      // fonts added by plugins\n      var _fontName3 = retrieveTextFontName(font, options.fontWeight, options.fontShape);\n      // We add font name as a css class\n      return makeSymbol(text, _fontName3, mode, options, classes.concat(_fontName3, options.fontWeight, options.fontShape));\n    }\n  } else {\n    throw new Error(\"unexpected type: \" + type + \" in makeOrd\");\n  }\n};\n/**\n * Returns true if subsequent symbolNodes have the same classes, skew, maxFont,\n * and styles. For mathnormal text, the left node must also have zero italic\n * correction so we don't lose spacing between combined glyphs.\n */\nvar canCombine = (prev, next) => {\n  if (createClass(prev.classes) !== createClass(next.classes) || prev.skew !== next.skew || prev.maxFontSize !== next.maxFontSize || prev.italic !== 0 && prev.hasClass(\"mathnormal\")) {\n    return false;\n  }\n  // If prev and next both are just \"mbin\"s or \"mord\"s we don't combine them\n  // so that the proper spacing can be preserved.\n  if (prev.classes.length === 1) {\n    var cls = prev.classes[0];\n    if (cls === \"mbin\" || cls === \"mord\") {\n      return false;\n    }\n  }\n  for (var key of Object.keys(prev.style)) {\n    if (prev.style[key] !== next.style[key]) {\n      return false;\n    }\n  }\n  for (var _key of Object.keys(next.style)) {\n    if (prev.style[_key] !== next.style[_key]) {\n      return false;\n    }\n  }\n  return true;\n};\n/**\n * Combine consecutive domTree.symbolNodes into a single symbolNode.\n * Note: this function mutates the argument.\n */\nvar tryCombineChars = chars => {\n  for (var i = 0; i < chars.length - 1; i++) {\n    var prev = chars[i];\n    var next = chars[i + 1];\n    if (prev instanceof SymbolNode && next instanceof SymbolNode && canCombine(prev, next)) {\n      prev.text += next.text;\n      prev.height = Math.max(prev.height, next.height);\n      prev.depth = Math.max(prev.depth, next.depth);\n      // Use the last character's italic correction since we use\n      // it to add padding to the right of the span created from\n      // the combined characters.\n      prev.italic = next.italic;\n      chars.splice(i + 1, 1);\n      i--;\n    }\n  }\n  return chars;\n};\n/**\n * Calculate the height, depth, and maxFontSize of an element based on its\n * children.\n */\nvar sizeElementFromChildren = function sizeElementFromChildren(elem) {\n  var height = 0;\n  var depth = 0;\n  var maxFontSize = 0;\n  for (var i = 0; i < elem.children.length; i++) {\n    var child = elem.children[i];\n    if (child.height > height) {\n      height = child.height;\n    }\n    if (child.depth > depth) {\n      depth = child.depth;\n    }\n    if (child.maxFontSize > maxFontSize) {\n      maxFontSize = child.maxFontSize;\n    }\n  }\n  elem.height = height;\n  elem.depth = depth;\n  elem.maxFontSize = maxFontSize;\n};\n/**\n * Makes a span with the given list of classes, list of children, and options.\n *\n * TODO(#953): Ensure that `options` is always provided (currently some call\n * sites don't pass it) and make the type below mandatory.\n * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which\n * should if present come first in `classes`.\n */\nvar makeSpan = function makeSpan(classes, children, options, style) {\n  var span = new Span(classes, children, options, style);\n  sizeElementFromChildren(span);\n  return span;\n};\n// SVG one is simpler -- doesn't require height, depth, max-font setting.\n// This is also a separate method for typesafety.\nvar makeSvgSpan = (classes, children, options, style) => new Span(classes, children, options, style);\nvar makeLineSpan = function makeLineSpan(className, options, thickness) {\n  var line = makeSpan([className], [], options);\n  line.height = Math.max(thickness || options.fontMetrics().defaultRuleThickness, options.minRuleThickness);\n  line.style.borderBottomWidth = makeEm(line.height);\n  line.maxFontSize = 1.0;\n  return line;\n};\n/**\n * Makes an anchor with the given href, list of classes, list of children,\n * and options.\n */\nvar makeAnchor = function makeAnchor(href, classes, children, options) {\n  var anchor = new Anchor(href, classes, children, options);\n  sizeElementFromChildren(anchor);\n  return anchor;\n};\n/**\n * Makes a document fragment with the given list of children.\n */\nvar makeFragment = function makeFragment(children) {\n  var fragment = new DocumentFragment(children);\n  sizeElementFromChildren(fragment);\n  return fragment;\n};\n/**\n * Wraps group in a span if it's a document fragment, allowing to apply classes\n * and styles\n */\nvar wrapFragment = function wrapFragment(group, options) {\n  if (group instanceof DocumentFragment) {\n    return makeSpan([], [group], options);\n  }\n  return group;\n};\n// Computes the updated `children` list and the overall depth.\n//\n// This helper function for makeVList makes it easier to enforce type safety by\n// allowing early exits (returns) in the logic.\nvar getVListChildrenAndDepth = function getVListChildrenAndDepth(params) {\n  if (params.positionType === \"individualShift\") {\n    var oldChildren = params.children;\n    var children = [oldChildren[0]];\n    // Add in kerns to the list of params.children to get each element to be\n    // shifted to the correct specified shift\n    var _depth = -oldChildren[0].shift - oldChildren[0].elem.depth;\n    var currPos = _depth;\n    for (var i = 1; i < oldChildren.length; i++) {\n      var diff = -oldChildren[i].shift - currPos - oldChildren[i].elem.depth;\n      var size = diff - (oldChildren[i - 1].elem.height + oldChildren[i - 1].elem.depth);\n      currPos = currPos + diff;\n      children.push({\n        type: \"kern\",\n        size\n      });\n      children.push(oldChildren[i]);\n    }\n    return {\n      children,\n      depth: _depth\n    };\n  }\n  var depth;\n  if (params.positionType === \"top\") {\n    // We always start at the bottom, so calculate the bottom by adding up\n    // all the sizes\n    var bottom = params.positionData;\n    for (var _i = 0; _i < params.children.length; _i++) {\n      var child = params.children[_i];\n      bottom -= child.type === \"kern\" ? child.size : child.elem.height + child.elem.depth;\n    }\n    depth = bottom;\n  } else if (params.positionType === \"bottom\") {\n    depth = -params.positionData;\n  } else {\n    var firstChild = params.children[0];\n    if (firstChild.type !== \"elem\") {\n      throw new Error('First child must have type \"elem\".');\n    }\n    if (params.positionType === \"shift\") {\n      depth = -firstChild.elem.depth - params.positionData;\n    } else if (params.positionType === \"firstBaseline\") {\n      depth = -firstChild.elem.depth;\n    } else {\n      throw new Error(\"Invalid positionType \" + params.positionType + \".\");\n    }\n  }\n  return {\n    children: params.children,\n    depth\n  };\n};\n/**\n * Makes a vertical list by stacking elements and kerns on top of each other.\n * Allows for many different ways of specifying the positioning method.\n *\n * See VListParam documentation above.\n */\nvar makeVList = function makeVList(params, options) {\n  var {\n    children,\n    depth\n  } = getVListChildrenAndDepth(params);\n  // Create a strut that is taller than any list item. The strut is added to\n  // each item, where it will determine the item's baseline. Since it has\n  // `overflow:hidden`, the strut's top edge will sit on the item's line box's\n  // top edge and the strut's bottom edge will sit on the item's baseline,\n  // with no additional line-height spacing. This allows the item baseline to\n  // be positioned precisely without worrying about font ascent and\n  // line-height.\n  var pstrutSize = 0;\n  for (var i = 0; i < children.length; i++) {\n    var child = children[i];\n    if (child.type === \"elem\") {\n      var elem = child.elem;\n      pstrutSize = Math.max(pstrutSize, elem.maxFontSize, elem.height);\n    }\n  }\n  pstrutSize += 2;\n  var pstrut = makeSpan([\"pstrut\"], []);\n  pstrut.style.height = makeEm(pstrutSize);\n  // Create a new list of actual children at the correct offsets\n  var realChildren = [];\n  var minPos = depth;\n  var maxPos = depth;\n  var currPos = depth;\n  for (var _i2 = 0; _i2 < children.length; _i2++) {\n    var _child = children[_i2];\n    if (_child.type === \"kern\") {\n      currPos += _child.size;\n    } else {\n      var _elem = _child.elem;\n      var classes = _child.wrapperClasses || [];\n      var style = _child.wrapperStyle || {};\n      var childWrap = makeSpan(classes, [pstrut, _elem], undefined, style);\n      childWrap.style.top = makeEm(-pstrutSize - currPos - _elem.depth);\n      if (_child.marginLeft) {\n        childWrap.style.marginLeft = _child.marginLeft;\n      }\n      if (_child.marginRight) {\n        childWrap.style.marginRight = _child.marginRight;\n      }\n      realChildren.push(childWrap);\n      currPos += _elem.height + _elem.depth;\n    }\n    minPos = Math.min(minPos, currPos);\n    maxPos = Math.max(maxPos, currPos);\n  }\n  // The vlist contents go in a table-cell with `vertical-align:bottom`.\n  // This cell's bottom edge will determine the containing table's baseline\n  // without overly expanding the containing line-box.\n  var vlist = makeSpan([\"vlist\"], realChildren);\n  vlist.style.height = makeEm(maxPos);\n  // A second row is used if necessary to represent the vlist's depth.\n  var rows;\n  if (minPos < 0) {\n    // We will define depth in an empty span with display: table-cell.\n    // It should render with the height that we define. But Chrome, in\n    // contenteditable mode only, treats that span as if it contains some\n    // text content. And that min-height over-rides our desired height.\n    // So we put another empty span inside the depth strut span.\n    var emptySpan = makeSpan([], []);\n    var depthStrut = makeSpan([\"vlist\"], [emptySpan]);\n    depthStrut.style.height = makeEm(-minPos);\n    // Safari wants the first row to have inline content; otherwise it\n    // puts the bottom of the *second* row on the baseline.\n    var topStrut = makeSpan([\"vlist-s\"], [new SymbolNode(\"\\u200b\")]);\n    rows = [makeSpan([\"vlist-r\"], [vlist, topStrut]), makeSpan([\"vlist-r\"], [depthStrut])];\n  } else {\n    rows = [makeSpan([\"vlist-r\"], [vlist])];\n  }\n  var vtable = makeSpan([\"vlist-t\"], rows);\n  if (rows.length === 2) {\n    vtable.classes.push(\"vlist-t2\");\n  }\n  vtable.height = maxPos;\n  vtable.depth = -minPos;\n  return vtable;\n};\n// Glue is a concept from TeX which is a flexible space between elements in\n// either a vertical or horizontal list. In KaTeX, at least for now, it's\n// static space between elements in a horizontal layout.\nvar makeGlue = (measurement, options) => {\n  // Make an empty span for the space\n  var rule = makeSpan([\"mspace\"], [], options);\n  var size = calculateSize(measurement, options);\n  rule.style.marginRight = makeEm(size);\n  return rule;\n};\n// Takes font options, and returns the appropriate fontLookup name\nvar retrieveTextFontName = function retrieveTextFontName(fontFamily, fontWeight, fontShape) {\n  var baseFontName = \"\";\n  switch (fontFamily) {\n    case \"amsrm\":\n      baseFontName = \"AMS\";\n      break;\n    case \"textrm\":\n      baseFontName = \"Main\";\n      break;\n    case \"textsf\":\n      baseFontName = \"SansSerif\";\n      break;\n    case \"texttt\":\n      baseFontName = \"Typewriter\";\n      break;\n    default:\n      baseFontName = fontFamily;\n    // use fonts added by a plugin\n  }\n  var fontStylesName;\n  if (fontWeight === \"textbf\" && fontShape === \"textit\") {\n    fontStylesName = \"BoldItalic\";\n  } else if (fontWeight === \"textbf\") {\n    fontStylesName = \"Bold\";\n  } else if (fontWeight === \"textit\") {\n    fontStylesName = \"Italic\";\n  } else {\n    fontStylesName = \"Regular\";\n  }\n  return baseFontName + \"-\" + fontStylesName;\n};\n/**\n * Maps TeX font commands to objects containing:\n * - variant: string used for \"mathvariant\" attribute in buildMathML.js\n * - fontName: the \"style\" parameter to fontMetrics.getCharacterMetrics\n */\n// A map between tex font commands an MathML mathvariant attribute values\nvar fontMap = {\n  // styles\n  \"mathbf\": {\n    variant: \"bold\",\n    fontName: \"Main-Bold\"\n  },\n  \"mathrm\": {\n    variant: \"normal\",\n    fontName: \"Main-Regular\"\n  },\n  \"textit\": {\n    variant: \"italic\",\n    fontName: \"Main-Italic\"\n  },\n  \"mathit\": {\n    variant: \"italic\",\n    fontName: \"Main-Italic\"\n  },\n  \"mathnormal\": {\n    variant: \"italic\",\n    fontName: \"Math-Italic\"\n  },\n  \"mathsfit\": {\n    variant: \"sans-serif-italic\",\n    fontName: \"SansSerif-Italic\"\n  },\n  // \"boldsymbol\" is missing because they require the use of multiple fonts:\n  // Math-BoldItalic and Main-Bold.  This is handled by a special case in\n  // makeOrd which ends up calling boldsymbol.\n  // families\n  \"mathbb\": {\n    variant: \"double-struck\",\n    fontName: \"AMS-Regular\"\n  },\n  \"mathcal\": {\n    variant: \"script\",\n    fontName: \"Caligraphic-Regular\"\n  },\n  \"mathfrak\": {\n    variant: \"fraktur\",\n    fontName: \"Fraktur-Regular\"\n  },\n  \"mathscr\": {\n    variant: \"script\",\n    fontName: \"Script-Regular\"\n  },\n  \"mathsf\": {\n    variant: \"sans-serif\",\n    fontName: \"SansSerif-Regular\"\n  },\n  \"mathtt\": {\n    variant: \"monospace\",\n    fontName: \"Typewriter-Regular\"\n  }\n};\nvar svgData = {\n  //   path, width, height\n  vec: [\"vec\", 0.471, 0.714],\n  // values from the font glyph\n  oiintSize1: [\"oiintSize1\", 0.957, 0.499],\n  // oval to overlay the integrand\n  oiintSize2: [\"oiintSize2\", 1.472, 0.659],\n  oiiintSize1: [\"oiiintSize1\", 1.304, 0.499],\n  oiiintSize2: [\"oiiintSize2\", 1.98, 0.659]\n};\nvar staticSvg = function staticSvg(value, options) {\n  // Create a span with inline SVG for the element.\n  var [pathName, width, height] = svgData[value];\n  var path = new PathNode(pathName);\n  var svgNode = new SvgNode([path], {\n    \"width\": makeEm(width),\n    \"height\": makeEm(height),\n    // Override CSS rule `.katex svg { width: 100% }`\n    \"style\": \"width:\" + makeEm(width),\n    \"viewBox\": \"0 0 \" + 1000 * width + \" \" + 1000 * height,\n    \"preserveAspectRatio\": \"xMinYMin\"\n  });\n  var span = makeSvgSpan([\"overlay\"], [svgNode], options);\n  span.height = height;\n  span.style.height = makeEm(height);\n  span.style.width = makeEm(width);\n  return span;\n};\n\nvar thinspace = {\n  number: 3,\n  unit: \"mu\"\n};\nvar mediumspace = {\n  number: 4,\n  unit: \"mu\"\n};\nvar thickspace = {\n  number: 5,\n  unit: \"mu\"\n};\n// Spacing relationships for display and text styles\nvar spacings = {\n  mord: {\n    mop: thinspace,\n    mbin: mediumspace,\n    mrel: thickspace,\n    minner: thinspace\n  },\n  mop: {\n    mord: thinspace,\n    mop: thinspace,\n    mrel: thickspace,\n    minner: thinspace\n  },\n  mbin: {\n    mord: mediumspace,\n    mop: mediumspace,\n    mopen: mediumspace,\n    minner: mediumspace\n  },\n  mrel: {\n    mord: thickspace,\n    mop: thickspace,\n    mopen: thickspace,\n    minner: thickspace\n  },\n  mopen: {},\n  mclose: {\n    mop: thinspace,\n    mbin: mediumspace,\n    mrel: thickspace,\n    minner: thinspace\n  },\n  mpunct: {\n    mord: thinspace,\n    mop: thinspace,\n    mrel: thickspace,\n    mopen: thinspace,\n    mclose: thinspace,\n    mpunct: thinspace,\n    minner: thinspace\n  },\n  minner: {\n    mord: thinspace,\n    mop: thinspace,\n    mbin: mediumspace,\n    mrel: thickspace,\n    mopen: thinspace,\n    mpunct: thinspace,\n    minner: thinspace\n  }\n};\n// Spacing relationships for script and scriptscript styles\nvar tightSpacings = {\n  mord: {\n    mop: thinspace\n  },\n  mop: {\n    mord: thinspace,\n    mop: thinspace\n  },\n  mbin: {},\n  mrel: {},\n  mopen: {},\n  mclose: {\n    mop: thinspace\n  },\n  mpunct: {},\n  minner: {\n    mop: thinspace\n  }\n};\n\n/**\n * All registered functions.\n * `functions.js` just exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary.\n */\nvar _functions = {};\n/**\n * All HTML builders. Should be only used in the `define*` and the `build*ML`\n * functions.\n */\nvar _htmlGroupBuilders = {};\n/**\n * All MathML builders. Should be only used in the `define*` and the `build*ML`\n * functions.\n */\nvar _mathmlGroupBuilders = {};\nfunction defineFunction(_ref) {\n  var {\n    type,\n    names,\n    props,\n    handler,\n    htmlBuilder,\n    mathmlBuilder\n  } = _ref;\n  // Set default values of functions\n  var data = {\n    type,\n    numArgs: props.numArgs,\n    argTypes: props.argTypes,\n    allowedInArgument: !!props.allowedInArgument,\n    allowedInText: !!props.allowedInText,\n    allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath,\n    numOptionalArgs: props.numOptionalArgs || 0,\n    infix: !!props.infix,\n    primitive: !!props.primitive,\n    handler\n  };\n  for (var i = 0; i < names.length; ++i) {\n    _functions[names[i]] = data;\n  }\n  if (type) {\n    if (htmlBuilder) {\n      _htmlGroupBuilders[type] = htmlBuilder;\n    }\n    if (mathmlBuilder) {\n      _mathmlGroupBuilders[type] = mathmlBuilder;\n    }\n  }\n}\n/**\n * Use this to register only the HTML and MathML builders for a function (e.g.\n * if the function's ParseNode is generated in Parser.js rather than via a\n * stand-alone handler provided to `defineFunction`).\n */\nfunction defineFunctionBuilders(_ref2) {\n  var {\n    type,\n    htmlBuilder,\n    mathmlBuilder\n  } = _ref2;\n  defineFunction({\n    type,\n    names: [],\n    props: {\n      numArgs: 0\n    },\n    handler() {\n      throw new Error('Should never be called.');\n    },\n    htmlBuilder,\n    mathmlBuilder\n  });\n}\nvar normalizeArgument = function normalizeArgument(arg) {\n  return arg.type === \"ordgroup\" && arg.body.length === 1 ? arg.body[0] : arg;\n};\n// Since the corresponding buildHTML/buildMathML function expects a\n// list of elements, we normalize for different kinds of arguments\nvar ordargument = function ordargument(arg) {\n  return arg.type === \"ordgroup\" ? arg.body : [arg];\n};\n\n/**\n * This file does the main work of building a domTree structure from a parse\n * tree. The entry point is the `buildHTML` function, which takes a parse tree.\n * Then, the buildExpression, buildGroup, and various groupBuilders functions\n * are called, to produce a final HTML tree.\n */\n// Binary atoms (first class `mbin`) change into ordinary atoms (`mord`)\n// depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6,\n// and the text before Rule 19.\nvar binLeftCanceller = new Set([\"leftmost\", \"mbin\", \"mopen\", \"mrel\", \"mop\", \"mpunct\"]);\nvar binRightCanceller = new Set([\"rightmost\", \"mrel\", \"mclose\", \"mpunct\"]);\nvar styleMap$1 = {\n  \"display\": Style$1.DISPLAY,\n  \"text\": Style$1.TEXT,\n  \"script\": Style$1.SCRIPT,\n  \"scriptscript\": Style$1.SCRIPTSCRIPT\n};\nvar DomEnum = {\n  mord: \"mord\",\n  mop: \"mop\",\n  mbin: \"mbin\",\n  mrel: \"mrel\",\n  mopen: \"mopen\",\n  mclose: \"mclose\",\n  mpunct: \"mpunct\",\n  minner: \"minner\"\n};\n/**\n * Take a list of nodes, build them in order, and return a list of the built\n * nodes. documentFragments are flattened into their contents, so the\n * returned list contains no fragments. `isRealGroup` is true if `expression`\n * is a real group (no atoms will be added on either side), as opposed to\n * a partial group (e.g. one created by \\color). `surrounding` is an array\n * consisting type of nodes that will be added to the left and right.\n */\nvar buildExpression$1 = function buildExpression(expression, options, isRealGroup, surrounding) {\n  if (surrounding === void 0) {\n    surrounding = [null, null];\n  }\n  // Parse expressions into `groups`.\n  var groups = [];\n  for (var i = 0; i < expression.length; i++) {\n    var output = buildGroup$1(expression[i], options);\n    if (output instanceof DocumentFragment) {\n      var children = output.children;\n      groups.push(...children);\n    } else {\n      groups.push(output);\n    }\n  }\n  // Combine consecutive domTree.symbolNodes into a single symbolNode.\n  tryCombineChars(groups);\n  // If `expression` is a partial group, let the parent handle spacings\n  // to avoid processing groups multiple times.\n  if (!isRealGroup) {\n    return groups;\n  }\n  var glueOptions = options;\n  if (expression.length === 1) {\n    var node = expression[0];\n    if (node.type === \"sizing\") {\n      glueOptions = options.havingSize(node.size);\n    } else if (node.type === \"styling\") {\n      glueOptions = options.havingStyle(styleMap$1[node.style]);\n    }\n  }\n  // Dummy spans for determining spacings between surrounding atoms.\n  // If `expression` has no atoms on the left or right, class \"leftmost\"\n  // or \"rightmost\", respectively, is used to indicate it.\n  var dummyPrev = makeSpan([surrounding[0] || \"leftmost\"], [], options);\n  var dummyNext = makeSpan([surrounding[1] || \"rightmost\"], [], options);\n  // TODO: These code assumes that a node's math class is the first element\n  // of its `classes` array. A later cleanup should ensure this, for\n  // instance by changing the signature of `makeSpan`.\n  // Before determining what spaces to insert, perform bin cancellation.\n  // Binary operators change to ordinary symbols in some contexts.\n  var isRoot = isRealGroup === \"root\";\n  _traverseNonSpaceNodes(groups, (node, prev) => {\n    var prevType = prev.classes[0];\n    var type = node.classes[0];\n    if (prevType === \"mbin\" && binRightCanceller.has(type)) {\n      prev.classes[0] = \"mord\";\n    } else if (type === \"mbin\" && binLeftCanceller.has(prevType)) {\n      node.classes[0] = \"mord\";\n    }\n  }, {\n    node: dummyPrev\n  }, dummyNext, isRoot);\n  _traverseNonSpaceNodes(groups, (node, prev) => {\n    var _tightSpacings$prevTy, _spacings$prevType;\n    var prevType = getTypeOfDomTree(prev);\n    var type = getTypeOfDomTree(node);\n    // 'mtight' indicates that the node is script or scriptscript style.\n    var space = prevType && type ? node.hasClass(\"mtight\") ? (_tightSpacings$prevTy = tightSpacings[prevType]) == null ? void 0 : _tightSpacings$prevTy[type] : (_spacings$prevType = spacings[prevType]) == null ? void 0 : _spacings$prevType[type] : null;\n    if (space) {\n      // Insert glue (spacing) after the `prev`.\n      return makeGlue(space, glueOptions);\n    }\n  }, {\n    node: dummyPrev\n  }, dummyNext, isRoot);\n  return groups;\n};\n// Depth-first traverse non-space `nodes`, calling `callback` with the current and\n// previous node as arguments, optionally returning a node to insert after the\n// previous node. `prev` is an object with the previous node and `insertAfter`\n// function to insert after it. `next` is a node that will be added to the right.\n// Used for bin cancellation and inserting spacings.\nvar _traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev, next, isRoot) {\n  if (next) {\n    // temporarily append the right node, if exists\n    nodes.push(next);\n  }\n  var i = 0;\n  for (; i < nodes.length; i++) {\n    var node = nodes[i];\n    var partialGroup = checkPartialGroup(node);\n    if (partialGroup) {\n      // Recursive DFS\n      // TODO(ts): make nodes a $ReadOnlyArray by returning a new array\n      _traverseNonSpaceNodes(partialGroup.children, callback, prev, null, isRoot);\n      continue;\n    }\n    // Ignore explicit spaces (e.g., \\;, \\,) when determining what implicit\n    // spacing should go between atoms of different classes\n    var nonspace = !node.hasClass(\"mspace\");\n    if (nonspace) {\n      var result = callback(node, prev.node);\n      if (result) {\n        if (prev.insertAfter) {\n          prev.insertAfter(result);\n        } else {\n          // insert at front\n          nodes.unshift(result);\n          i++;\n        }\n      }\n    }\n    if (nonspace) {\n      prev.node = node;\n    } else if (isRoot && node.hasClass(\"newline\")) {\n      prev.node = makeSpan([\"leftmost\"]); // treat like beginning of line\n    }\n    prev.insertAfter = (index => n => {\n      nodes.splice(index + 1, 0, n);\n      i++;\n    })(i);\n  }\n  if (next) {\n    nodes.pop();\n  }\n};\n// Check if given node is a partial group, i.e., does not affect spacing around.\nvar checkPartialGroup = function checkPartialGroup(node) {\n  if (node instanceof DocumentFragment || node instanceof Anchor || node instanceof Span && node.hasClass(\"enclosing\")) {\n    return node;\n  }\n  return null;\n};\n// Return the outermost node of a domTree.\nvar _getOutermostNode = function getOutermostNode(node, side) {\n  var partialGroup = checkPartialGroup(node);\n  if (partialGroup) {\n    var children = partialGroup.children;\n    if (children.length) {\n      if (side === \"right\") {\n        return _getOutermostNode(children[children.length - 1], \"right\");\n      } else if (side === \"left\") {\n        return _getOutermostNode(children[0], \"left\");\n      }\n    }\n  }\n  return node;\n};\n// Return math atom class (mclass) of a domTree.\n// If `side` is given, it will get the type of the outermost node at given side.\nvar getTypeOfDomTree = function getTypeOfDomTree(node, side) {\n  if (!node) {\n    return null;\n  }\n  if (side) {\n    node = _getOutermostNode(node, side);\n  }\n  // This makes a lot of assumptions as to where the type of atom\n  // appears.  We should do a better job of enforcing this.\n  var className = node.classes[0];\n  return DomEnum[className] || null;\n};\nvar makeNullDelimiter = function makeNullDelimiter(options, classes) {\n  var moreClasses = [\"nulldelimiter\"].concat(options.baseSizingClasses());\n  return makeSpan(classes.concat(moreClasses));\n};\n/**\n * buildGroup is the function that takes a group and calls the correct groupType\n * function for it. It also handles the interaction of size and style changes\n * between parents and children.\n */\nvar buildGroup$1 = function buildGroup(group, options, baseOptions) {\n  if (!group) {\n    return makeSpan();\n  }\n  if (_htmlGroupBuilders[group.type]) {\n    // Call the groupBuilders function\n    // TODO(ts)\n    var groupNode = _htmlGroupBuilders[group.type](group, options);\n    // If the size changed between the parent and the current group, account\n    // for that size difference.\n    if (baseOptions && options.size !== baseOptions.size) {\n      groupNode = makeSpan(options.sizingClasses(baseOptions), [groupNode], options);\n      var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier;\n      groupNode.height *= multiplier;\n      groupNode.depth *= multiplier;\n    }\n    return groupNode;\n  } else {\n    throw new ParseError(\"Got group of unknown type: '\" + group.type + \"'\");\n  }\n};\n/**\n * Combine an array of HTML DOM nodes (e.g., the output of `buildExpression`)\n * into an unbreakable HTML node of class .base, with proper struts to\n * guarantee correct vertical extent.  `buildHTML` calls this repeatedly to\n * make up the entire expression as a sequence of unbreakable units.\n */\nfunction buildHTMLUnbreakable(children, options) {\n  // Compute height and depth of this chunk.\n  var body = makeSpan([\"base\"], children, options);\n  // Add strut, which ensures that the top of the HTML element falls at\n  // the height of the expression, and the bottom of the HTML element\n  // falls at the depth of the expression.\n  var strut = makeSpan([\"strut\"]);\n  strut.style.height = makeEm(body.height + body.depth);\n  if (body.depth) {\n    strut.style.verticalAlign = makeEm(-body.depth);\n  }\n  body.children.unshift(strut);\n  return body;\n}\n/**\n * Take an entire parse tree, and build it into an appropriate set of HTML\n * nodes.\n */\nfunction buildHTML(tree, options) {\n  // Strip off outer tag wrapper for processing below.\n  var tag = null;\n  if (tree.length === 1 && tree[0].type === \"tag\") {\n    tag = tree[0].tag;\n    tree = tree[0].body;\n  }\n  // Build the expression contained in the tree\n  var expression = buildExpression$1(tree, options, \"root\");\n  var eqnNum;\n  if (expression.length === 2 && expression[1].hasClass(\"tag\")) {\n    // An environment with automatic equation numbers, e.g. {gather}.\n    eqnNum = expression.pop();\n  }\n  var children = [];\n  // Create one base node for each chunk between potential line breaks.\n  // The TeXBook [p.173] says \"A formula will be broken only after a\n  // relation symbol like $=$ or $<$ or $\\rightarrow$, or after a binary\n  // operation symbol like $+$ or $-$ or $\\times$, where the relation or\n  // binary operation is on the ``outer level'' of the formula (i.e., not\n  // enclosed in {...} and not part of an \\over construction).\"\n  var parts = [];\n  for (var i = 0; i < expression.length; i++) {\n    parts.push(expression[i]);\n    if (expression[i].hasClass(\"mbin\") || expression[i].hasClass(\"mrel\") || expression[i].hasClass(\"allowbreak\")) {\n      // Put any post-operator glue on same line as operator.\n      // Watch for \\nobreak along the way, and stop at \\newline.\n      var nobreak = false;\n      while (i < expression.length - 1 && expression[i + 1].hasClass(\"mspace\") && !expression[i + 1].hasClass(\"newline\")) {\n        i++;\n        parts.push(expression[i]);\n        if (expression[i].hasClass(\"nobreak\")) {\n          nobreak = true;\n        }\n      }\n      // Don't allow break if \\nobreak among the post-operator glue.\n      if (!nobreak) {\n        children.push(buildHTMLUnbreakable(parts, options));\n        parts = [];\n      }\n    } else if (expression[i].hasClass(\"newline\")) {\n      // Write the line except the newline\n      parts.pop();\n      if (parts.length > 0) {\n        children.push(buildHTMLUnbreakable(parts, options));\n        parts = [];\n      }\n      // Put the newline at the top level\n      children.push(expression[i]);\n    }\n  }\n  if (parts.length > 0) {\n    children.push(buildHTMLUnbreakable(parts, options));\n  }\n  // Now, if there was a tag, build it too and append it as a final child.\n  var tagChild;\n  if (tag) {\n    tagChild = buildHTMLUnbreakable(buildExpression$1(tag, options, true), options);\n    tagChild.classes = [\"tag\"];\n    children.push(tagChild);\n  } else if (eqnNum) {\n    children.push(eqnNum);\n  }\n  var htmlNode = makeSpan([\"katex-html\"], children);\n  htmlNode.setAttribute(\"aria-hidden\", \"true\");\n  // Adjust the strut of the tag to be the maximum height of all children\n  // (the height of the enclosing htmlNode) for proper vertical alignment.\n  if (tagChild) {\n    var strut = tagChild.children[0];\n    strut.style.height = makeEm(htmlNode.height + htmlNode.depth);\n    if (htmlNode.depth) {\n      strut.style.verticalAlign = makeEm(-htmlNode.depth);\n    }\n  }\n  return htmlNode;\n}\n\n/**\n * These objects store data about MathML nodes. This is the MathML equivalent\n * of the types in domTree.js. Since MathML handles its own rendering, and\n * since we're mainly using MathML to improve accessibility, we don't manage\n * any of the styling state that the plain DOM nodes do.\n *\n * The `toNode` and `toMarkup` functions work similarly to how they do in\n * domTree.js, creating namespaced DOM nodes and HTML text markup respectively.\n */\nfunction newDocumentFragment(children) {\n  return new DocumentFragment(children);\n}\n/**\n * This node represents a general purpose MathML node of any type. The\n * constructor requires the type of node to create (for example, `\"mo\"` or\n * `\"mspace\"`, corresponding to `<mo>` and `<mspace>` tags).\n */\nclass MathNode {\n  constructor(type, children, classes) {\n    this.type = type;\n    this.attributes = {};\n    this.children = children || [];\n    this.classes = classes || [];\n  }\n  /**\n   * Sets an attribute on a MathML node. MathML depends on attributes to convey a\n   * semantic content, so this is used heavily.\n   */\n  setAttribute(name, value) {\n    this.attributes[name] = value;\n  }\n  /**\n   * Gets an attribute on a MathML node.\n   */\n  getAttribute(name) {\n    return this.attributes[name];\n  }\n  /**\n   * Converts the math node into a MathML-namespaced DOM element.\n   */\n  toNode() {\n    var node = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", this.type);\n    for (var attr in this.attributes) {\n      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n        node.setAttribute(attr, this.attributes[attr]);\n      }\n    }\n    if (this.classes.length > 0) {\n      node.className = createClass(this.classes);\n    }\n    for (var i = 0; i < this.children.length; i++) {\n      // Combine multiple TextNodes into one TextNode, to prevent\n      // screen readers from reading each as a separate word [#3995]\n      if (this.children[i] instanceof TextNode && this.children[i + 1] instanceof TextNode) {\n        var text = this.children[i].toText() + this.children[++i].toText();\n        while (this.children[i + 1] instanceof TextNode) {\n          text += this.children[++i].toText();\n        }\n        node.appendChild(new TextNode(text).toNode());\n      } else {\n        node.appendChild(this.children[i].toNode());\n      }\n    }\n    return node;\n  }\n  /**\n   * Converts the math node into an HTML markup string.\n   */\n  toMarkup() {\n    var markup = \"<\" + this.type;\n    // Add the attributes\n    for (var attr in this.attributes) {\n      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n        markup += \" \" + attr + \"=\\\"\";\n        markup += escape(this.attributes[attr]);\n        markup += \"\\\"\";\n      }\n    }\n    if (this.classes.length > 0) {\n      markup += \" class =\\\"\" + escape(createClass(this.classes)) + \"\\\"\";\n    }\n    markup += \">\";\n    for (var i = 0; i < this.children.length; i++) {\n      markup += this.children[i].toMarkup();\n    }\n    markup += \"</\" + this.type + \">\";\n    return markup;\n  }\n  /**\n   * Converts the math node into a string, similar to innerText, but escaped.\n   */\n  toText() {\n    return this.children.map(child => child.toText()).join(\"\");\n  }\n}\n/**\n * This node represents a piece of text.\n */\nclass TextNode {\n  constructor(text) {\n    this.text = text;\n  }\n  /**\n   * Converts the text node into a DOM text node.\n   */\n  toNode() {\n    return document.createTextNode(this.text);\n  }\n  /**\n   * Converts the text node into escaped HTML markup\n   * (representing the text itself).\n   */\n  toMarkup() {\n    return escape(this.toText());\n  }\n  /**\n   * Converts the text node into a string\n   * (representing the text itself).\n   */\n  toText() {\n    return this.text;\n  }\n}\n/**\n * This node represents a space, but may render as <mspace.../> or as text,\n * depending on the width.\n */\nclass SpaceNode {\n  /**\n   * Create a Space node with width given in CSS ems.\n   */\n  constructor(width) {\n    this.width = width;\n    // See https://www.w3.org/TR/2000/WD-MathML2-20000328/chapter6.html\n    // for a table of space-like characters.  We use Unicode\n    // representations instead of &LongNames; as it's not clear how to\n    // make the latter via document.createTextNode.\n    if (width >= 0.05555 && width <= 0.05556) {\n      this.character = \"\\u200a\"; // &VeryThinSpace;\n    } else if (width >= 0.1666 && width <= 0.1667) {\n      this.character = \"\\u2009\"; // &ThinSpace;\n    } else if (width >= 0.2222 && width <= 0.2223) {\n      this.character = \"\\u2005\"; // &MediumSpace;\n    } else if (width >= 0.2777 && width <= 0.2778) {\n      this.character = \"\\u2005\\u200a\"; // &ThickSpace;\n    } else if (width >= -0.05556 && width <= -0.05555) {\n      this.character = \"\\u200a\\u2063\"; // &NegativeVeryThinSpace;\n    } else if (width >= -0.1667 && width <= -0.1666) {\n      this.character = \"\\u2009\\u2063\"; // &NegativeThinSpace;\n    } else if (width >= -0.2223 && width <= -0.2222) {\n      this.character = \"\\u205f\\u2063\"; // &NegativeMediumSpace;\n    } else if (width >= -0.2778 && width <= -0.2777) {\n      this.character = \"\\u2005\\u2063\"; // &NegativeThickSpace;\n    } else {\n      this.character = null;\n    }\n  }\n  /**\n   * Converts the math node into a MathML-namespaced DOM element.\n   */\n  toNode() {\n    if (this.character) {\n      return document.createTextNode(this.character);\n    } else {\n      var node = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"mspace\");\n      node.setAttribute(\"width\", makeEm(this.width));\n      return node;\n    }\n  }\n  /**\n   * Converts the math node into an HTML markup string.\n   */\n  toMarkup() {\n    if (this.character) {\n      return \"<mtext>\" + this.character + \"</mtext>\";\n    } else {\n      return \"<mspace width=\\\"\" + makeEm(this.width) + \"\\\"/>\";\n    }\n  }\n  /**\n   * Converts the math node into a string, similar to innerText.\n   */\n  toText() {\n    if (this.character) {\n      return this.character;\n    } else {\n      return \" \";\n    }\n  }\n}\n\n/**\n * This file converts a parse tree into a corresponding MathML tree. The main\n * entry point is the `buildMathML` function, which takes a parse tree from the\n * parser.\n */\nvar noVariantSymbols = new Set([\"\\\\imath\", \"\\\\jmath\"]);\nvar rowLikeTypes = new Set([\"mrow\", \"mtable\"]);\n/**\n * Takes a symbol and converts it into a MathML text node after performing\n * optional replacement from symbols.js.\n */\nvar makeText = function makeText(text, mode, options) {\n  if (symbols[mode][text] && symbols[mode][text].replace && text.charCodeAt(0) !== 0xD835 && !(ligatures.hasOwnProperty(text) && options && (options.fontFamily && options.fontFamily.slice(4, 6) === \"tt\" || options.font && options.font.slice(4, 6) === \"tt\"))) {\n    text = symbols[mode][text].replace;\n  }\n  return new TextNode(text);\n};\n/**\n * Wrap the given array of nodes in an <mrow> node if needed, i.e.,\n * unless the array has length 1.  Always returns a single node.\n */\nvar makeRow = function makeRow(body) {\n  if (body.length === 1) {\n    return body[0];\n  } else {\n    return new MathNode(\"mrow\", body);\n  }\n};\n/**\n * Returns the math variant as a string or null if none is required.\n */\nvar getVariant = function getVariant(group, options) {\n  // Handle \\text... font specifiers as best we can.\n  // MathML has a limited list of allowable mathvariant specifiers; see\n  // https://www.w3.org/TR/MathML3/chapter3.html#presm.commatt\n  if (options.fontFamily === \"texttt\") {\n    return \"monospace\";\n  } else if (options.fontFamily === \"textsf\") {\n    if (options.fontShape === \"textit\" && options.fontWeight === \"textbf\") {\n      return \"sans-serif-bold-italic\";\n    } else if (options.fontShape === \"textit\") {\n      return \"sans-serif-italic\";\n    } else if (options.fontWeight === \"textbf\") {\n      return \"bold-sans-serif\";\n    } else {\n      return \"sans-serif\";\n    }\n  } else if (options.fontShape === \"textit\" && options.fontWeight === \"textbf\") {\n    return \"bold-italic\";\n  } else if (options.fontShape === \"textit\") {\n    return \"italic\";\n  } else if (options.fontWeight === \"textbf\") {\n    return \"bold\";\n  }\n  var font = options.font;\n  if (!font || font === \"mathnormal\") {\n    return null;\n  }\n  var mode = group.mode;\n  if (font === \"mathit\") {\n    return \"italic\";\n  } else if (font === \"boldsymbol\") {\n    return group.type === \"textord\" ? \"bold\" : \"bold-italic\";\n  } else if (font === \"mathbf\") {\n    return \"bold\";\n  } else if (font === \"mathbb\") {\n    return \"double-struck\";\n  } else if (font === \"mathsfit\") {\n    return \"sans-serif-italic\";\n  } else if (font === \"mathfrak\") {\n    return \"fraktur\";\n  } else if (font === \"mathscr\" || font === \"mathcal\") {\n    // MathML makes no distinction between script and calligraphic\n    return \"script\";\n  } else if (font === \"mathsf\") {\n    return \"sans-serif\";\n  } else if (font === \"mathtt\") {\n    return \"monospace\";\n  }\n  var text = group.text;\n  if (noVariantSymbols.has(text)) {\n    return null;\n  }\n  if (symbols[mode][text]) {\n    var replacement = symbols[mode][text].replace;\n    if (replacement) {\n      text = replacement;\n    }\n  }\n  var fontName = fontMap[font].fontName;\n  if (getCharacterMetrics(text, fontName, mode)) {\n    return fontMap[font].variant;\n  }\n  return null;\n};\n/**\n * Check for <mi>.</mi> which is how a dot renders in MathML,\n * or <mo separator=\"true\" lspace=\"0em\" rspace=\"0em\">,</mo>\n * which is how a braced comma {,} renders in MathML\n */\nfunction isNumberPunctuation(group) {\n  if (!group) {\n    return false;\n  }\n  if (group.type === 'mi' && group.children.length === 1) {\n    var child = group.children[0];\n    return child instanceof TextNode && child.text === '.';\n  } else if (group.type === 'mo' && group.children.length === 1 && group.getAttribute('separator') === 'true' && group.getAttribute('lspace') === '0em' && group.getAttribute('rspace') === '0em') {\n    var _child = group.children[0];\n    return _child instanceof TextNode && _child.text === ',';\n  } else {\n    return false;\n  }\n}\n/**\n * Takes a list of nodes, builds them, and returns a list of the generated\n * MathML nodes.  Also combine consecutive <mtext> outputs into a single\n * <mtext> tag.\n */\nvar buildExpression = function buildExpression(expression, options, isOrdgroup) {\n  if (expression.length === 1) {\n    var group = buildGroup(expression[0], options);\n    if (isOrdgroup && group instanceof MathNode && group.type === \"mo\") {\n      // When TeX writers want to suppress spacing on an operator,\n      // they often put the operator by itself inside braces.\n      group.setAttribute(\"lspace\", \"0em\");\n      group.setAttribute(\"rspace\", \"0em\");\n    }\n    return [group];\n  }\n  var groups = [];\n  var lastGroup;\n  for (var i = 0; i < expression.length; i++) {\n    var _group = buildGroup(expression[i], options);\n    if (_group instanceof MathNode && lastGroup instanceof MathNode) {\n      // Concatenate adjacent <mtext>s\n      if (_group.type === 'mtext' && lastGroup.type === 'mtext' && _group.getAttribute('mathvariant') === lastGroup.getAttribute('mathvariant')) {\n        lastGroup.children.push(..._group.children);\n        continue;\n        // Concatenate adjacent <mn>s\n      } else if (_group.type === 'mn' && lastGroup.type === 'mn') {\n        lastGroup.children.push(..._group.children);\n        continue;\n        // Concatenate <mn>...</mn> followed by <mi>.</mi>\n      } else if (isNumberPunctuation(_group) && lastGroup.type === 'mn') {\n        lastGroup.children.push(..._group.children);\n        continue;\n        // Concatenate <mi>.</mi> followed by <mn>...</mn>\n      } else if (_group.type === 'mn' && isNumberPunctuation(lastGroup)) {\n        _group.children = [...lastGroup.children, ..._group.children];\n        groups.pop();\n        // Put preceding <mn>...</mn> or <mi>.</mi> inside base of\n        // <msup><mn>...base...</mn>...exponent...</msup> (or <msub>)\n      } else if ((_group.type === 'msup' || _group.type === 'msub') && _group.children.length >= 1 && (lastGroup.type === 'mn' || isNumberPunctuation(lastGroup))) {\n        var base = _group.children[0];\n        if (base instanceof MathNode && base.type === 'mn') {\n          base.children = [...lastGroup.children, ...base.children];\n          groups.pop();\n        }\n        // \\not\n      } else if (lastGroup.type === 'mi' && lastGroup.children.length === 1) {\n        var lastChild = lastGroup.children[0];\n        if (lastChild instanceof TextNode && lastChild.text === '\\u0338' && (_group.type === 'mo' || _group.type === 'mi' || _group.type === 'mn')) {\n          var child = _group.children[0];\n          if (child instanceof TextNode && child.text.length > 0) {\n            // Overlay with combining character long solidus\n            child.text = child.text.slice(0, 1) + \"\\u0338\" + child.text.slice(1);\n            groups.pop();\n          }\n        }\n      }\n    }\n    groups.push(_group);\n    lastGroup = _group;\n  }\n  return groups;\n};\n/**\n * Equivalent to buildExpression, but wraps the elements in an <mrow>\n * if there's more than one.  Returns a single node instead of an array.\n */\nvar buildExpressionRow = function buildExpressionRow(expression, options, isOrdgroup) {\n  return makeRow(buildExpression(expression, options, isOrdgroup));\n};\n/**\n * Takes a group from the parser and calls the appropriate groupBuilders function\n * on it to produce a MathML node.\n */\nvar buildGroup = function buildGroup(group, options) {\n  if (!group) {\n    return new MathNode(\"mrow\");\n  }\n  if (_mathmlGroupBuilders[group.type]) {\n    // Call the groupBuilders function\n    // TODO(ts)\n    var result = _mathmlGroupBuilders[group.type](group, options);\n    // TODO(ts)\n    return result;\n  } else {\n    throw new ParseError(\"Got group of unknown type: '\" + group.type + \"'\");\n  }\n};\n/**\n * Takes a full parse tree and settings and builds a MathML representation of\n * it. In particular, we put the elements from building the parse tree into a\n * <semantics> tag so we can also include that TeX source as an annotation.\n *\n * Note that we actually return a domTree element with a `<math>` inside it so\n * we can do appropriate styling.\n */\nfunction buildMathML(tree, texExpression, options, isDisplayMode, forMathmlOnly) {\n  var expression = buildExpression(tree, options);\n  // TODO: Make a pass thru the MathML similar to buildHTML.traverseNonSpaceNodes\n  // and add spacing nodes. This is necessary only adjacent to math operators\n  // like \\sin or \\lim or to subsup elements that contain math operators.\n  // MathML takes care of the other spacing issues.\n  // Wrap up the expression in an mrow so it is presented in the semantics\n  // tag correctly, unless it's a single <mrow> or <mtable>.\n  var wrapper;\n  if (expression.length === 1 && expression[0] instanceof MathNode && rowLikeTypes.has(expression[0].type)) {\n    wrapper = expression[0];\n  } else {\n    wrapper = new MathNode(\"mrow\", expression);\n  }\n  // Build a TeX annotation of the source\n  var annotation = new MathNode(\"annotation\", [new TextNode(texExpression)]);\n  annotation.setAttribute(\"encoding\", \"application/x-tex\");\n  var semantics = new MathNode(\"semantics\", [wrapper, annotation]);\n  var math = new MathNode(\"math\", [semantics]);\n  math.setAttribute(\"xmlns\", \"http://www.w3.org/1998/Math/MathML\");\n  if (isDisplayMode) {\n    math.setAttribute(\"display\", \"block\");\n  }\n  // You can't style <math> nodes, so we wrap the node in a span.\n  // NOTE: The span class is not typed to have <math> nodes as children, and\n  // we don't want to make the children type more generic since the children\n  // of span are expected to have more fields in `buildHtml` contexts.\n  var wrapperClass = forMathmlOnly ? \"katex\" : \"katex-mathml\";\n  // TODO(ts)\n  return makeSpan([wrapperClass], [math]);\n}\n\n/**\n * This file contains information about the options that the Parser carries\n * around with it while parsing. Data is held in an `Options` object, and when\n * recursing, a new `Options` object can be created with the `.with*` and\n * `.reset` functions.\n */\nvar sizeStyleMap = [\n// Each element contains [textsize, scriptsize, scriptscriptsize].\n// The size mappings are taken from TeX with \\normalsize=10pt.\n[1, 1, 1],\n// size1: [5, 5, 5]              \\tiny\n[2, 1, 1],\n// size2: [6, 5, 5]\n[3, 1, 1],\n// size3: [7, 5, 5]              \\scriptsize\n[4, 2, 1],\n// size4: [8, 6, 5]              \\footnotesize\n[5, 2, 1],\n// size5: [9, 6, 5]              \\small\n[6, 3, 1],\n// size6: [10, 7, 5]             \\normalsize\n[7, 4, 2],\n// size7: [12, 8, 6]             \\large\n[8, 6, 3],\n// size8: [14.4, 10, 7]          \\Large\n[9, 7, 6],\n// size9: [17.28, 12, 10]        \\LARGE\n[10, 8, 7],\n// size10: [20.74, 14.4, 12]     \\huge\n[11, 10, 9] // size11: [24.88, 20.74, 17.28] \\HUGE\n];\nvar sizeMultipliers = [\n// fontMetrics.js:getGlobalMetrics also uses size indexes, so if\n// you change size indexes, change that function.\n0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.44, 1.728, 2.074, 2.488];\nvar sizeAtStyle = function sizeAtStyle(size, style) {\n  return style.size < 2 ? size : sizeStyleMap[size - 1][style.size - 1];\n};\n/**\n * This is the main options class. It contains the current style, size, color,\n * and font.\n *\n * Options objects should not be modified. To create a new Options with\n * different properties, call a `.having*` method.\n */\nclass Options {\n  constructor(data) {\n    this.style = data.style;\n    this.color = data.color;\n    this.size = data.size || Options.BASESIZE;\n    this.textSize = data.textSize || this.size;\n    this.phantom = !!data.phantom;\n    this.font = data.font || \"\";\n    this.fontFamily = data.fontFamily || \"\";\n    this.fontWeight = data.fontWeight || '';\n    this.fontShape = data.fontShape || '';\n    this.sizeMultiplier = sizeMultipliers[this.size - 1];\n    this.maxSize = data.maxSize;\n    this.minRuleThickness = data.minRuleThickness;\n    this._fontMetrics = undefined;\n  }\n  /**\n   * Returns a new options object with the same properties as \"this\".  Properties\n   * from \"extension\" will be copied to the new options object.\n   */\n  extend(extension) {\n    var data = {\n      style: this.style,\n      size: this.size,\n      textSize: this.textSize,\n      color: this.color,\n      phantom: this.phantom,\n      font: this.font,\n      fontFamily: this.fontFamily,\n      fontWeight: this.fontWeight,\n      fontShape: this.fontShape,\n      maxSize: this.maxSize,\n      minRuleThickness: this.minRuleThickness\n    };\n    Object.assign(data, extension);\n    return new Options(data);\n  }\n  /**\n   * Return an options object with the given style. If `this.style === style`,\n   * returns `this`.\n   */\n  havingStyle(style) {\n    if (this.style === style) {\n      return this;\n    } else {\n      return this.extend({\n        style: style,\n        size: sizeAtStyle(this.textSize, style)\n      });\n    }\n  }\n  /**\n   * Return an options object with a cramped version of the current style. If\n   * the current style is cramped, returns `this`.\n   */\n  havingCrampedStyle() {\n    return this.havingStyle(this.style.cramp());\n  }\n  /**\n   * Return an options object with the given size and in at least `\\textstyle`.\n   * Returns `this` if appropriate.\n   */\n  havingSize(size) {\n    if (this.size === size && this.textSize === size) {\n      return this;\n    } else {\n      return this.extend({\n        style: this.style.text(),\n        size: size,\n        textSize: size,\n        sizeMultiplier: sizeMultipliers[size - 1]\n      });\n    }\n  }\n  /**\n   * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted,\n   * changes to at least `\\textstyle`.\n   */\n  havingBaseStyle(style) {\n    style = style || this.style.text();\n    var wantSize = sizeAtStyle(Options.BASESIZE, style);\n    if (this.size === wantSize && this.textSize === Options.BASESIZE && this.style === style) {\n      return this;\n    } else {\n      return this.extend({\n        style: style,\n        size: wantSize\n      });\n    }\n  }\n  /**\n   * Remove the effect of sizing changes such as \\Huge.\n   * Keep the effect of the current style, such as \\scriptstyle.\n   */\n  havingBaseSizing() {\n    var size;\n    switch (this.style.id) {\n      case 4:\n      case 5:\n        size = 3; // normalsize in scriptstyle\n        break;\n      case 6:\n      case 7:\n        size = 1; // normalsize in scriptscriptstyle\n        break;\n      default:\n        size = 6;\n      // normalsize in textstyle or displaystyle\n    }\n    return this.extend({\n      style: this.style.text(),\n      size: size\n    });\n  }\n  /**\n   * Create a new options object with the given color.\n   */\n  withColor(color) {\n    return this.extend({\n      color: color\n    });\n  }\n  /**\n   * Create a new options object with \"phantom\" set to true.\n   */\n  withPhantom() {\n    return this.extend({\n      phantom: true\n    });\n  }\n  /**\n   * Creates a new options object with the given math font or old text font.\n   * @type {[type]}\n   */\n  withFont(font) {\n    return this.extend({\n      font\n    });\n  }\n  /**\n   * Create a new options objects with the given fontFamily.\n   */\n  withTextFontFamily(fontFamily) {\n    return this.extend({\n      fontFamily,\n      font: \"\"\n    });\n  }\n  /**\n   * Creates a new options object with the given font weight\n   */\n  withTextFontWeight(fontWeight) {\n    return this.extend({\n      fontWeight,\n      font: \"\"\n    });\n  }\n  /**\n   * Creates a new options object with the given font weight\n   */\n  withTextFontShape(fontShape) {\n    return this.extend({\n      fontShape,\n      font: \"\"\n    });\n  }\n  /**\n   * Return the CSS sizing classes required to switch from enclosing options\n   * `oldOptions` to `this`. Returns an array of classes.\n   */\n  sizingClasses(oldOptions) {\n    if (oldOptions.size !== this.size) {\n      return [\"sizing\", \"reset-size\" + oldOptions.size, \"size\" + this.size];\n    } else {\n      return [];\n    }\n  }\n  /**\n   * Return the CSS sizing classes required to switch to the base size. Like\n   * `this.havingSize(BASESIZE).sizingClasses(this)`.\n   */\n  baseSizingClasses() {\n    if (this.size !== Options.BASESIZE) {\n      return [\"sizing\", \"reset-size\" + this.size, \"size\" + Options.BASESIZE];\n    } else {\n      return [];\n    }\n  }\n  /**\n   * Return the font metrics for this size.\n   */\n  fontMetrics() {\n    if (!this._fontMetrics) {\n      this._fontMetrics = getGlobalMetrics(this.size);\n    }\n    return this._fontMetrics;\n  }\n  /**\n   * Gets the CSS color of the current options object\n   */\n  getColor() {\n    if (this.phantom) {\n      return \"transparent\";\n    } else {\n      return this.color;\n    }\n  }\n}\n// A font family applies to a group of fonts (i.e. SansSerif), while a font\n// represents a specific font (i.e. SansSerif Bold).\n// See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm\n/**\n * The base size index.\n */\nOptions.BASESIZE = 6;\n\nvar optionsFromSettings = function optionsFromSettings(settings) {\n  return new Options({\n    style: settings.displayMode ? Style$1.DISPLAY : Style$1.TEXT,\n    maxSize: settings.maxSize,\n    minRuleThickness: settings.minRuleThickness\n  });\n};\nvar displayWrap = function displayWrap(node, settings) {\n  if (settings.displayMode) {\n    var classes = [\"katex-display\"];\n    if (settings.leqno) {\n      classes.push(\"leqno\");\n    }\n    if (settings.fleqn) {\n      classes.push(\"fleqn\");\n    }\n    node = makeSpan(classes, [node]);\n  }\n  return node;\n};\nvar buildTree = function buildTree(tree, expression, settings) {\n  var options = optionsFromSettings(settings);\n  var katexNode;\n  if (settings.output === \"mathml\") {\n    return buildMathML(tree, expression, options, settings.displayMode, true);\n  } else if (settings.output === \"html\") {\n    var htmlNode = buildHTML(tree, options);\n    katexNode = makeSpan([\"katex\"], [htmlNode]);\n  } else {\n    var mathMLNode = buildMathML(tree, expression, options, settings.displayMode, false);\n    var _htmlNode = buildHTML(tree, options);\n    katexNode = makeSpan([\"katex\"], [mathMLNode, _htmlNode]);\n  }\n  return displayWrap(katexNode, settings);\n};\nvar buildHTMLTree = function buildHTMLTree(tree, expression, settings) {\n  var options = optionsFromSettings(settings);\n  var htmlNode = buildHTML(tree, options);\n  var katexNode = makeSpan([\"katex\"], [htmlNode]);\n  return displayWrap(katexNode, settings);\n};\n\n/**\n * This file provides support to buildMathML.js and buildHTML.js\n * for stretchy wide elements rendered from SVG files\n * and other CSS trickery.\n */\nvar stretchyCodePoint = {\n  widehat: \"^\",\n  widecheck: \"ˇ\",\n  widetilde: \"~\",\n  utilde: \"~\",\n  overleftarrow: \"\\u2190\",\n  underleftarrow: \"\\u2190\",\n  xleftarrow: \"\\u2190\",\n  overrightarrow: \"\\u2192\",\n  underrightarrow: \"\\u2192\",\n  xrightarrow: \"\\u2192\",\n  underbrace: \"\\u23df\",\n  overbrace: \"\\u23de\",\n  underbracket: \"\\u23b5\",\n  overbracket: \"\\u23b4\",\n  overgroup: \"\\u23e0\",\n  undergroup: \"\\u23e1\",\n  overleftrightarrow: \"\\u2194\",\n  underleftrightarrow: \"\\u2194\",\n  xleftrightarrow: \"\\u2194\",\n  Overrightarrow: \"\\u21d2\",\n  xRightarrow: \"\\u21d2\",\n  overleftharpoon: \"\\u21bc\",\n  xleftharpoonup: \"\\u21bc\",\n  overrightharpoon: \"\\u21c0\",\n  xrightharpoonup: \"\\u21c0\",\n  xLeftarrow: \"\\u21d0\",\n  xLeftrightarrow: \"\\u21d4\",\n  xhookleftarrow: \"\\u21a9\",\n  xhookrightarrow: \"\\u21aa\",\n  xmapsto: \"\\u21a6\",\n  xrightharpoondown: \"\\u21c1\",\n  xleftharpoondown: \"\\u21bd\",\n  xrightleftharpoons: \"\\u21cc\",\n  xleftrightharpoons: \"\\u21cb\",\n  xtwoheadleftarrow: \"\\u219e\",\n  xtwoheadrightarrow: \"\\u21a0\",\n  xlongequal: \"=\",\n  xtofrom: \"\\u21c4\",\n  xrightleftarrows: \"\\u21c4\",\n  xrightequilibrium: \"\\u21cc\",\n  // Not a perfect match.\n  xleftequilibrium: \"\\u21cb\",\n  // None better available.\n  \"\\\\cdrightarrow\": \"\\u2192\",\n  \"\\\\cdleftarrow\": \"\\u2190\",\n  \"\\\\cdlongequal\": \"=\"\n};\nvar stretchyMathML = function stretchyMathML(label) {\n  var node = new MathNode(\"mo\", [new TextNode(stretchyCodePoint[label.replace(/^\\\\/, '')])]);\n  node.setAttribute(\"stretchy\", \"true\");\n  return node;\n};\n// Many of the KaTeX SVG images have been adapted from glyphs in KaTeX fonts.\n// Copyright (c) 2009-2010, Design Science, Inc. (<www.mathjax.org>)\n// Copyright (c) 2014-2017 Khan Academy (<www.khanacademy.org>)\n// Licensed under the SIL Open Font License, Version 1.1.\n// See \\nhttp://scripts.sil.org/OFL\n// Very Long SVGs\n//    Many of the KaTeX stretchy wide elements use a long SVG image and an\n//    overflow: hidden tactic to achieve a stretchy image while avoiding\n//    distortion of arrowheads or brace corners.\n//    The SVG typically contains a very long (400 em) arrow.\n//    The SVG is in a container span that has overflow: hidden, so the span\n//    acts like a window that exposes only part of the  SVG.\n//    The SVG always has a longer, thinner aspect ratio than the container span.\n//    After the SVG fills 100% of the height of the container span,\n//    there is a long arrow shaft left over. That left-over shaft is not shown.\n//    Instead, it is sliced off because the span's CSS has overflow: hidden.\n//    Thus, the reader sees an arrow that matches the subject matter width\n//    without distortion.\n//    Some functions, such as \\cancel, need to vary their aspect ratio. These\n//    functions do not get the overflow SVG treatment.\n// In the katexImagesData object just below, the dimensions all\n// correspond to path geometry inside the relevant SVG.\n// For example, \\overrightarrow uses the same arrowhead as glyph U+2192\n// from the KaTeX Main font. The scaling factor is 1000.\n// That is, inside the font, that arrowhead is 522 units tall, which\n// corresponds to 0.522 em inside the document.\nvar katexImagesData = {\n  //   path(s), minWidth, height, align\n  overrightarrow: [[\"rightarrow\"], 0.888, 522, \"xMaxYMin\"],\n  overleftarrow: [[\"leftarrow\"], 0.888, 522, \"xMinYMin\"],\n  underrightarrow: [[\"rightarrow\"], 0.888, 522, \"xMaxYMin\"],\n  underleftarrow: [[\"leftarrow\"], 0.888, 522, \"xMinYMin\"],\n  xrightarrow: [[\"rightarrow\"], 1.469, 522, \"xMaxYMin\"],\n  \"\\\\cdrightarrow\": [[\"rightarrow\"], 3.0, 522, \"xMaxYMin\"],\n  // CD minwwidth2.5pc\n  xleftarrow: [[\"leftarrow\"], 1.469, 522, \"xMinYMin\"],\n  \"\\\\cdleftarrow\": [[\"leftarrow\"], 3.0, 522, \"xMinYMin\"],\n  Overrightarrow: [[\"doublerightarrow\"], 0.888, 560, \"xMaxYMin\"],\n  xRightarrow: [[\"doublerightarrow\"], 1.526, 560, \"xMaxYMin\"],\n  xLeftarrow: [[\"doubleleftarrow\"], 1.526, 560, \"xMinYMin\"],\n  overleftharpoon: [[\"leftharpoon\"], 0.888, 522, \"xMinYMin\"],\n  xleftharpoonup: [[\"leftharpoon\"], 0.888, 522, \"xMinYMin\"],\n  xleftharpoondown: [[\"leftharpoondown\"], 0.888, 522, \"xMinYMin\"],\n  overrightharpoon: [[\"rightharpoon\"], 0.888, 522, \"xMaxYMin\"],\n  xrightharpoonup: [[\"rightharpoon\"], 0.888, 522, \"xMaxYMin\"],\n  xrightharpoondown: [[\"rightharpoondown\"], 0.888, 522, \"xMaxYMin\"],\n  xlongequal: [[\"longequal\"], 0.888, 334, \"xMinYMin\"],\n  \"\\\\cdlongequal\": [[\"longequal\"], 3.0, 334, \"xMinYMin\"],\n  xtwoheadleftarrow: [[\"twoheadleftarrow\"], 0.888, 334, \"xMinYMin\"],\n  xtwoheadrightarrow: [[\"twoheadrightarrow\"], 0.888, 334, \"xMaxYMin\"],\n  overleftrightarrow: [[\"leftarrow\", \"rightarrow\"], 0.888, 522],\n  overbrace: [[\"leftbrace\", \"midbrace\", \"rightbrace\"], 1.6, 548],\n  underbrace: [[\"leftbraceunder\", \"midbraceunder\", \"rightbraceunder\"], 1.6, 548],\n  underleftrightarrow: [[\"leftarrow\", \"rightarrow\"], 0.888, 522],\n  xleftrightarrow: [[\"leftarrow\", \"rightarrow\"], 1.75, 522],\n  xLeftrightarrow: [[\"doubleleftarrow\", \"doublerightarrow\"], 1.75, 560],\n  xrightleftharpoons: [[\"leftharpoondownplus\", \"rightharpoonplus\"], 1.75, 716],\n  xleftrightharpoons: [[\"leftharpoonplus\", \"rightharpoondownplus\"], 1.75, 716],\n  xhookleftarrow: [[\"leftarrow\", \"righthook\"], 1.08, 522],\n  xhookrightarrow: [[\"lefthook\", \"rightarrow\"], 1.08, 522],\n  overlinesegment: [[\"leftlinesegment\", \"rightlinesegment\"], 0.888, 522],\n  underlinesegment: [[\"leftlinesegment\", \"rightlinesegment\"], 0.888, 522],\n  overbracket: [[\"leftbracketover\", \"rightbracketover\"], 1.6, 440],\n  underbracket: [[\"leftbracketunder\", \"rightbracketunder\"], 1.6, 410],\n  overgroup: [[\"leftgroup\", \"rightgroup\"], 0.888, 342],\n  undergroup: [[\"leftgroupunder\", \"rightgroupunder\"], 0.888, 342],\n  xmapsto: [[\"leftmapsto\", \"rightarrow\"], 1.5, 522],\n  xtofrom: [[\"leftToFrom\", \"rightToFrom\"], 1.75, 528],\n  // The next three arrows are from the mhchem package.\n  // In mhchem.sty, min-length is 2.0em. But these arrows might appear in the\n  // document as \\xrightarrow or \\xrightleftharpoons. Those have\n  // min-length = 1.75em, so we set min-length on these next three to match.\n  xrightleftarrows: [[\"baraboveleftarrow\", \"rightarrowabovebar\"], 1.75, 901],\n  xrightequilibrium: [[\"baraboveshortleftharpoon\", \"rightharpoonaboveshortbar\"], 1.75, 716],\n  xleftequilibrium: [[\"shortbaraboveleftharpoon\", \"shortrightharpoonabovebar\"], 1.75, 716]\n};\nvar wideAccentLabels = new Set([\"widehat\", \"widecheck\", \"widetilde\", \"utilde\"]);\nvar stretchySvg = function stretchySvg(group, options) {\n  // Create a span with inline SVG for the element.\n  function buildSvgSpan_() {\n    var viewBoxWidth = 400000; // default\n    var label = group.label.slice(1);\n    if (wideAccentLabels.has(label)) {\n      // Each type in the `if` statement corresponds to one of the ParseNode\n      // types below. This narrowing is required to access `grp.base`.\n      // TODO(ts)\n      var grp = group;\n      // There are four SVG images available for each function.\n      // Choose a taller image when there are more characters.\n      var numChars = grp.base.type === \"ordgroup\" ? grp.base.body.length : 1;\n      var viewBoxHeight;\n      var pathName;\n      var _height;\n      if (numChars > 5) {\n        if (label === \"widehat\" || label === \"widecheck\") {\n          viewBoxHeight = 420;\n          viewBoxWidth = 2364;\n          _height = 0.42;\n          pathName = label + \"4\";\n        } else {\n          viewBoxHeight = 312;\n          viewBoxWidth = 2340;\n          _height = 0.34;\n          pathName = \"tilde4\";\n        }\n      } else {\n        var imgIndex = [1, 1, 2, 2, 3, 3][numChars];\n        if (label === \"widehat\" || label === \"widecheck\") {\n          viewBoxWidth = [0, 1062, 2364, 2364, 2364][imgIndex];\n          viewBoxHeight = [0, 239, 300, 360, 420][imgIndex];\n          _height = [0, 0.24, 0.3, 0.3, 0.36, 0.42][imgIndex];\n          pathName = label + imgIndex;\n        } else {\n          viewBoxWidth = [0, 600, 1033, 2339, 2340][imgIndex];\n          viewBoxHeight = [0, 260, 286, 306, 312][imgIndex];\n          _height = [0, 0.26, 0.286, 0.3, 0.306, 0.34][imgIndex];\n          pathName = \"tilde\" + imgIndex;\n        }\n      }\n      var path = new PathNode(pathName);\n      var svgNode = new SvgNode([path], {\n        \"width\": \"100%\",\n        \"height\": makeEm(_height),\n        \"viewBox\": \"0 0 \" + viewBoxWidth + \" \" + viewBoxHeight,\n        \"preserveAspectRatio\": \"none\"\n      });\n      return {\n        span: makeSvgSpan([], [svgNode], options),\n        minWidth: 0,\n        height: _height\n      };\n    } else {\n      var spans = [];\n      var data = katexImagesData[label];\n      var [paths, _minWidth, _viewBoxHeight] = data;\n      var _height2 = _viewBoxHeight / 1000;\n      var numSvgChildren = paths.length;\n      var widthClasses;\n      var aligns;\n      if (numSvgChildren === 1) {\n        // TODO(ts): All these cases must be of the 4-tuple type.\n        var align1 = data[3];\n        widthClasses = [\"hide-tail\"];\n        aligns = [align1];\n      } else if (numSvgChildren === 2) {\n        widthClasses = [\"halfarrow-left\", \"halfarrow-right\"];\n        aligns = [\"xMinYMin\", \"xMaxYMin\"];\n      } else if (numSvgChildren === 3) {\n        widthClasses = [\"brace-left\", \"brace-center\", \"brace-right\"];\n        aligns = [\"xMinYMin\", \"xMidYMin\", \"xMaxYMin\"];\n      } else {\n        throw new Error(\"Correct katexImagesData or update code here to support\\n                    \" + numSvgChildren + \" children.\");\n      }\n      for (var i = 0; i < numSvgChildren; i++) {\n        var _path = new PathNode(paths[i]);\n        var _svgNode = new SvgNode([_path], {\n          \"width\": \"400em\",\n          \"height\": makeEm(_height2),\n          \"viewBox\": \"0 0 \" + viewBoxWidth + \" \" + _viewBoxHeight,\n          \"preserveAspectRatio\": aligns[i] + \" slice\"\n        });\n        var _span = makeSvgSpan([widthClasses[i]], [_svgNode], options);\n        if (numSvgChildren === 1) {\n          return {\n            span: _span,\n            minWidth: _minWidth,\n            height: _height2\n          };\n        } else {\n          _span.style.height = makeEm(_height2);\n          spans.push(_span);\n        }\n      }\n      return {\n        span: makeSpan([\"stretchy\"], spans, options),\n        minWidth: _minWidth,\n        height: _height2\n      };\n    }\n  } // buildSvgSpan_()\n  var {\n    span,\n    minWidth,\n    height\n  } = buildSvgSpan_();\n  // Note that we are returning span.depth = 0.\n  // Any adjustments relative to the baseline must be done in buildHTML.\n  span.height = height;\n  span.style.height = makeEm(height);\n  if (minWidth > 0) {\n    span.style.minWidth = makeEm(minWidth);\n  }\n  return span;\n};\nvar stretchyEnclose = function stretchyEnclose(inner, label, topPad, bottomPad, options) {\n  // Return an image span for \\cancel, \\bcancel, \\xcancel, \\fbox, or \\angl\n  var img;\n  var totalHeight = inner.height + inner.depth + topPad + bottomPad;\n  if (/fbox|color|angl/.test(label)) {\n    img = makeSpan([\"stretchy\", label], [], options);\n    if (label === \"fbox\") {\n      var color = options.color && options.getColor();\n      if (color) {\n        img.style.borderColor = color;\n      }\n    }\n  } else {\n    // \\cancel, \\bcancel, or \\xcancel\n    // Since \\cancel's SVG is inline and it omits the viewBox attribute,\n    // its stroke-width will not vary with span area.\n    var lines = [];\n    if (/^[bx]cancel$/.test(label)) {\n      lines.push(new LineNode({\n        \"x1\": \"0\",\n        \"y1\": \"0\",\n        \"x2\": \"100%\",\n        \"y2\": \"100%\",\n        \"stroke-width\": \"0.046em\"\n      }));\n    }\n    if (/^x?cancel$/.test(label)) {\n      lines.push(new LineNode({\n        \"x1\": \"0\",\n        \"y1\": \"100%\",\n        \"x2\": \"100%\",\n        \"y2\": \"0\",\n        \"stroke-width\": \"0.046em\"\n      }));\n    }\n    var svgNode = new SvgNode(lines, {\n      \"width\": \"100%\",\n      \"height\": makeEm(totalHeight)\n    });\n    img = makeSvgSpan([], [svgNode], options);\n  }\n  img.height = totalHeight;\n  img.style.height = makeEm(totalHeight);\n  return img;\n};\n\n/**\n * Asserts that the node is of the given type and returns it with stricter\n * typing. Throws if the node's type does not match.\n */\nfunction assertNodeType(node, type) {\n  if (!node || node.type !== type) {\n    throw new Error(\"Expected node of type \" + type + \", but got \" + (node ? \"node of type \" + node.type : String(node)));\n  }\n  return node;\n}\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\nfunction assertSymbolNodeType(node) {\n  var typedNode = checkSymbolNodeType(node);\n  if (!typedNode) {\n    throw new Error(\"Expected node of symbol group type, but got \" + (node ? \"node of type \" + node.type : String(node)));\n  }\n  return typedNode;\n}\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\nfunction checkSymbolNodeType(node) {\n  if (node && (node.type === \"atom\" || NON_ATOMS.hasOwnProperty(node.type))) {\n    return node;\n  }\n  return null;\n}\n\nvar getBaseSymbol = group => {\n  if (group instanceof SymbolNode) {\n    return group;\n  }\n  if (hasHtmlDomChildren(group) && group.children.length === 1) {\n    return getBaseSymbol(group.children[0]);\n  }\n};\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only \"accent\", but\n// also \"supsub\" since an accent can affect super/subscripting.\nvar htmlBuilder$a = (grp, options) => {\n  // Accents are handled in the TeXbook pg. 443, rule 12.\n  var base;\n  var group;\n  var supSubGroup;\n  if (grp && grp.type === \"supsub\") {\n    // If our base is a character box, and we have superscripts and\n    // subscripts, the supsub will defer to us. In particular, we want\n    // to attach the superscripts and subscripts to the inner body (so\n    // that the position of the superscripts and subscripts won't be\n    // affected by the height of the accent). We accomplish this by\n    // sticking the base of the accent into the base of the supsub, and\n    // rendering that, while keeping track of where the accent is.\n    // The real accent group is the base of the supsub group\n    group = assertNodeType(grp.base, \"accent\");\n    // The character box is the base of the accent group\n    base = group.base;\n    // Stick the character box into the base of the supsub group\n    grp.base = base;\n    // Rerender the supsub group with its new base, and store that\n    // result.\n    supSubGroup = assertSpan(buildGroup$1(grp, options));\n    // reset original base\n    grp.base = group;\n  } else {\n    group = assertNodeType(grp, \"accent\");\n    base = group.base;\n  }\n  // Build the base group\n  var body = buildGroup$1(base, options.havingCrampedStyle());\n  // Does the accent need to shift for the skew of a character?\n  var mustShift = group.isShifty && isCharacterBox(base);\n  // Calculate the skew of the accent. This is based on the line \"If the\n  // nucleus is not a single character, let s = 0; otherwise set s to the\n  // kern amount for the nucleus followed by the \\skewchar of its font.\"\n  // Note that our skew metrics are just the kern between each character\n  // and the skewchar.\n  var skew = 0;\n  if (mustShift) {\n    var _getBaseSymbol$skew, _getBaseSymbol;\n    // Read the skew from the rendered base symbol.\n    // This preserves font metrics from font wrappers like \\mathbb.\n    skew = (_getBaseSymbol$skew = (_getBaseSymbol = getBaseSymbol(body)) == null ? void 0 : _getBaseSymbol.skew) != null ? _getBaseSymbol$skew : 0;\n  }\n  var accentBelow = group.label === \"\\\\c\";\n  // calculate the amount of space between the body and the accent\n  var clearance = accentBelow ? body.height + body.depth : Math.min(body.height, options.fontMetrics().xHeight);\n  // Build the accent\n  var accentBody;\n  if (!group.isStretchy) {\n    var accent;\n    var width;\n    if (group.label === \"\\\\vec\") {\n      // Before version 0.9, \\vec used the combining font glyph U+20D7.\n      // But browsers, especially Safari, are not consistent in how they\n      // render combining characters when not preceded by a character.\n      // So now we use an SVG.\n      // If Safari reforms, we should consider reverting to the glyph.\n      accent = staticSvg(\"vec\", options);\n      width = svgData.vec[1];\n    } else {\n      accent = makeOrd({\n        type: \"textord\",\n        mode: group.mode,\n        text: group.label\n      }, options, \"textord\");\n      accent = assertSymbolDomNode(accent);\n      // Remove the italic correction of the accent, because it only serves to\n      // shift the accent over to a place we don't want.\n      accent.italic = 0;\n      width = accent.width;\n      if (accentBelow) {\n        clearance += accent.depth;\n      }\n    }\n    accentBody = makeSpan([\"accent-body\"], [accent]);\n    // \"Full\" accents expand the width of the resulting symbol to be\n    // at least the width of the accent, and overlap directly onto the\n    // character without any vertical offset.\n    var accentFull = group.label === \"\\\\textcircled\";\n    if (accentFull) {\n      accentBody.classes.push('accent-full');\n      clearance = body.height;\n    }\n    // Shift the accent over by the skew.\n    var left = skew;\n    // CSS defines `.katex .accent .accent-body:not(.accent-full) { width: 0 }`\n    // so that the accent doesn't contribute to the bounding box.\n    // We need to shift the character by its width (effectively half\n    // its width) to compensate.\n    if (!accentFull) {\n      left -= width / 2;\n    }\n    accentBody.style.left = makeEm(left);\n    // \\textcircled uses the \\bigcirc glyph, so it needs some\n    // vertical adjustment to match LaTeX.\n    if (group.label === \"\\\\textcircled\") {\n      accentBody.style.top = \".2em\";\n    }\n    accentBody = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: body\n      }, {\n        type: \"kern\",\n        size: -clearance\n      }, {\n        type: \"elem\",\n        elem: accentBody\n      }]\n    });\n  } else {\n    accentBody = stretchySvg(group, options);\n    accentBody = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: body\n      }, {\n        type: \"elem\",\n        elem: accentBody,\n        wrapperClasses: [\"svg-align\"],\n        wrapperStyle: skew > 0 ? {\n          width: \"calc(100% - \" + makeEm(2 * skew) + \")\",\n          marginLeft: makeEm(2 * skew)\n        } : undefined\n      }]\n    });\n  }\n  var accentWrap = makeSpan([\"mord\", \"accent\"], [accentBody], options);\n  if (supSubGroup) {\n    // Here, we replace the \"base\" child of the supsub with our newly\n    // generated accent.\n    supSubGroup.children[0] = accentWrap;\n    // Since we don't rerun the height calculation after replacing the\n    // accent, we manually recalculate height.\n    supSubGroup.height = Math.max(accentWrap.height, supSubGroup.height);\n    // Accents should always be ords, even when their innards are not.\n    supSubGroup.classes[0] = \"mord\";\n    return supSubGroup;\n  } else {\n    return accentWrap;\n  }\n};\nvar mathmlBuilder$9 = (group, options) => {\n  var accentNode = group.isStretchy ? stretchyMathML(group.label) : new MathNode(\"mo\", [makeText(group.label, group.mode)]);\n  var node = new MathNode(\"mover\", [buildGroup(group.base, options), accentNode]);\n  node.setAttribute(\"accent\", \"true\");\n  return node;\n};\nvar NON_STRETCHY_ACCENT_REGEX = new RegExp([\"\\\\acute\", \"\\\\grave\", \"\\\\ddot\", \"\\\\tilde\", \"\\\\bar\", \"\\\\breve\", \"\\\\check\", \"\\\\hat\", \"\\\\vec\", \"\\\\dot\", \"\\\\mathring\"].map(accent => \"\\\\\" + accent).join(\"|\"));\n// Accents\ndefineFunction({\n  type: \"accent\",\n  names: [\"\\\\acute\", \"\\\\grave\", \"\\\\ddot\", \"\\\\tilde\", \"\\\\bar\", \"\\\\breve\", \"\\\\check\", \"\\\\hat\", \"\\\\vec\", \"\\\\dot\", \"\\\\mathring\", \"\\\\widecheck\", \"\\\\widehat\", \"\\\\widetilde\", \"\\\\overrightarrow\", \"\\\\overleftarrow\", \"\\\\Overrightarrow\", \"\\\\overleftrightarrow\", \"\\\\overgroup\", \"\\\\overlinesegment\", \"\\\\overleftharpoon\", \"\\\\overrightharpoon\"],\n  props: {\n    numArgs: 1\n  },\n  handler: (context, args) => {\n    var base = normalizeArgument(args[0]);\n    var isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName);\n    var isShifty = !isStretchy || context.funcName === \"\\\\widehat\" || context.funcName === \"\\\\widetilde\" || context.funcName === \"\\\\widecheck\";\n    return {\n      type: \"accent\",\n      mode: context.parser.mode,\n      label: context.funcName,\n      isStretchy: isStretchy,\n      isShifty: isShifty,\n      base: base\n    };\n  },\n  htmlBuilder: htmlBuilder$a,\n  mathmlBuilder: mathmlBuilder$9\n});\n// Text-mode accents\ndefineFunction({\n  type: \"accent\",\n  names: [\"\\\\'\", \"\\\\`\", \"\\\\^\", \"\\\\~\", \"\\\\=\", \"\\\\u\", \"\\\\.\", '\\\\\"', \"\\\\c\", \"\\\\r\", \"\\\\H\", \"\\\\v\", \"\\\\textcircled\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true,\n    allowedInMath: true,\n    // unless in strict mode\n    argTypes: [\"primitive\"]\n  },\n  handler: (context, args) => {\n    var base = args[0];\n    var mode = context.parser.mode;\n    if (mode === \"math\") {\n      context.parser.settings.reportNonstrict(\"mathVsTextAccents\", \"LaTeX's accent \" + context.funcName + \" works only in text mode\");\n      mode = \"text\";\n    }\n    return {\n      type: \"accent\",\n      mode: mode,\n      label: context.funcName,\n      isStretchy: false,\n      isShifty: true,\n      base: base\n    };\n  },\n  htmlBuilder: htmlBuilder$a,\n  mathmlBuilder: mathmlBuilder$9\n});\n\n// Horizontal overlap functions\ndefineFunction({\n  type: \"accentUnder\",\n  names: [\"\\\\underleftarrow\", \"\\\\underrightarrow\", \"\\\\underleftrightarrow\", \"\\\\undergroup\", \"\\\\underlinesegment\", \"\\\\utilde\"],\n  props: {\n    numArgs: 1\n  },\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var base = args[0];\n    return {\n      type: \"accentUnder\",\n      mode: parser.mode,\n      label: funcName,\n      base: base\n    };\n  },\n  htmlBuilder: (group, options) => {\n    // Treat under accents much like underlines.\n    var innerGroup = buildGroup$1(group.base, options);\n    var accentBody = stretchySvg(group, options);\n    var kern = group.label === \"\\\\utilde\" ? 0.12 : 0;\n    // Generate the vlist, with the appropriate kerns\n    var vlist = makeVList({\n      positionType: \"top\",\n      positionData: innerGroup.height,\n      children: [{\n        type: \"elem\",\n        elem: accentBody,\n        wrapperClasses: [\"svg-align\"]\n      }, {\n        type: \"kern\",\n        size: kern\n      }, {\n        type: \"elem\",\n        elem: innerGroup\n      }]\n    });\n    return makeSpan([\"mord\", \"accentunder\"], [vlist], options);\n  },\n  mathmlBuilder: (group, options) => {\n    var accentNode = stretchyMathML(group.label);\n    var node = new MathNode(\"munder\", [buildGroup(group.base, options), accentNode]);\n    node.setAttribute(\"accentunder\", \"true\");\n    return node;\n  }\n});\n\n// Helper function\nvar paddedNode = group => {\n  var node = new MathNode(\"mpadded\", group ? [group] : []);\n  node.setAttribute(\"width\", \"+0.6em\");\n  node.setAttribute(\"lspace\", \"0.3em\");\n  return node;\n};\n// Stretchy arrows with an optional argument\ndefineFunction({\n  type: \"xArrow\",\n  names: [\"\\\\xleftarrow\", \"\\\\xrightarrow\", \"\\\\xLeftarrow\", \"\\\\xRightarrow\", \"\\\\xleftrightarrow\", \"\\\\xLeftrightarrow\", \"\\\\xhookleftarrow\", \"\\\\xhookrightarrow\", \"\\\\xmapsto\", \"\\\\xrightharpoondown\", \"\\\\xrightharpoonup\", \"\\\\xleftharpoondown\", \"\\\\xleftharpoonup\", \"\\\\xrightleftharpoons\", \"\\\\xleftrightharpoons\", \"\\\\xlongequal\", \"\\\\xtwoheadrightarrow\", \"\\\\xtwoheadleftarrow\", \"\\\\xtofrom\",\n  // The next 3 functions are here to support the mhchem extension.\n  // Direct use of these functions is discouraged and may break someday.\n  \"\\\\xrightleftarrows\", \"\\\\xrightequilibrium\", \"\\\\xleftequilibrium\",\n  // The next 3 functions are here only to support the {CD} environment.\n  \"\\\\\\\\cdrightarrow\", \"\\\\\\\\cdleftarrow\", \"\\\\\\\\cdlongequal\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1\n  },\n  handler(_ref, args, optArgs) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    return {\n      type: \"xArrow\",\n      mode: parser.mode,\n      label: funcName,\n      body: args[0],\n      below: optArgs[0]\n    };\n  },\n  htmlBuilder(group, options) {\n    var style = options.style;\n    // Build the argument groups in the appropriate style.\n    // Ref: amsmath.dtx:   \\hbox{$\\scriptstyle\\mkern#3mu{#6}\\mkern#4mu$}%\n    // Some groups can return document fragments.  Handle those by wrapping\n    // them in a span.\n    var newOptions = options.havingStyle(style.sup());\n    var upperGroup = wrapFragment(buildGroup$1(group.body, newOptions, options), options);\n    var arrowPrefix = group.label.slice(0, 2) === \"\\\\x\" ? \"x\" : \"cd\";\n    upperGroup.classes.push(arrowPrefix + \"-arrow-pad\");\n    var lowerGroup;\n    if (group.below) {\n      // Build the lower group\n      newOptions = options.havingStyle(style.sub());\n      lowerGroup = wrapFragment(buildGroup$1(group.below, newOptions, options), options);\n      lowerGroup.classes.push(arrowPrefix + \"-arrow-pad\");\n    }\n    var arrowBody = stretchySvg(group, options);\n    // Re shift: Note that stretchySvg returned arrowBody.depth = 0.\n    // The point we want on the math axis is at 0.5 * arrowBody.height.\n    var arrowShift = -options.fontMetrics().axisHeight + 0.5 * arrowBody.height;\n    // 2 mu kern. Ref: amsmath.dtx: #7\\if0#2\\else\\mkern#2mu\\fi\n    var upperShift = -options.fontMetrics().axisHeight - 0.5 * arrowBody.height - 0.111; // 0.111 em = 2 mu\n    if (upperGroup.depth > 0.25 || group.label === \"\\\\xleftequilibrium\") {\n      upperShift -= upperGroup.depth; // shift up if depth encroaches\n    }\n    // Generate the vlist\n    var vlist;\n    if (lowerGroup) {\n      var lowerShift = -options.fontMetrics().axisHeight + lowerGroup.height + 0.5 * arrowBody.height + 0.111;\n      vlist = makeVList({\n        positionType: \"individualShift\",\n        children: [{\n          type: \"elem\",\n          elem: upperGroup,\n          shift: upperShift\n        }, {\n          type: \"elem\",\n          elem: arrowBody,\n          shift: arrowShift\n        }, {\n          type: \"elem\",\n          elem: lowerGroup,\n          shift: lowerShift\n        }]\n      });\n    } else {\n      vlist = makeVList({\n        positionType: \"individualShift\",\n        children: [{\n          type: \"elem\",\n          elem: upperGroup,\n          shift: upperShift\n        }, {\n          type: \"elem\",\n          elem: arrowBody,\n          shift: arrowShift\n        }]\n      });\n    }\n    // TODO(ts): Replace this with passing \"svg-align\" into makeVList.\n    vlist.children[0].children[0].children[1].classes.push(\"svg-align\");\n    return makeSpan([\"mrel\", \"x-arrow\"], [vlist], options);\n  },\n  mathmlBuilder(group, options) {\n    var arrowNode = stretchyMathML(group.label);\n    arrowNode.setAttribute(\"minsize\", group.label.charAt(0) === \"x\" ? \"1.75em\" : \"3.0em\");\n    var node;\n    if (group.body) {\n      var upperNode = paddedNode(buildGroup(group.body, options));\n      if (group.below) {\n        var lowerNode = paddedNode(buildGroup(group.below, options));\n        node = new MathNode(\"munderover\", [arrowNode, lowerNode, upperNode]);\n      } else {\n        node = new MathNode(\"mover\", [arrowNode, upperNode]);\n      }\n    } else if (group.below) {\n      var _lowerNode = paddedNode(buildGroup(group.below, options));\n      node = new MathNode(\"munder\", [arrowNode, _lowerNode]);\n    } else {\n      // This should never happen.\n      // Parser.js throws an error if there is no argument.\n      node = paddedNode();\n      node = new MathNode(\"mover\", [arrowNode, node]);\n    }\n    return node;\n  }\n});\n\nfunction htmlBuilder$9(group, options) {\n  var elements = buildExpression$1(group.body, options, true);\n  return makeSpan([group.mclass], elements, options);\n}\nfunction mathmlBuilder$8(group, options) {\n  var node;\n  var inner = buildExpression(group.body, options);\n  if (group.mclass === \"minner\") {\n    node = new MathNode(\"mpadded\", inner);\n  } else if (group.mclass === \"mord\") {\n    if (group.isCharacterBox) {\n      node = inner[0];\n      node.type = \"mi\";\n    } else {\n      node = new MathNode(\"mi\", inner);\n    }\n  } else {\n    if (group.isCharacterBox) {\n      node = inner[0];\n      node.type = \"mo\";\n    } else {\n      node = new MathNode(\"mo\", inner);\n    }\n    // Set spacing based on what is the most likely adjacent atom type.\n    // See TeXbook p170.\n    if (group.mclass === \"mbin\") {\n      node.attributes.lspace = \"0.22em\"; // medium space\n      node.attributes.rspace = \"0.22em\";\n    } else if (group.mclass === \"mpunct\") {\n      node.attributes.lspace = \"0em\";\n      node.attributes.rspace = \"0.17em\"; // thinspace\n    } else if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n      node.attributes.lspace = \"0em\";\n      node.attributes.rspace = \"0em\";\n    } else if (group.mclass === \"minner\") {\n      node.attributes.lspace = \"0.0556em\"; // 1 mu is the most likely option\n      node.attributes.width = \"+0.1111em\";\n    }\n    // MathML <mo> default space is 5/18 em, so <mrel> needs no action.\n    // Ref: https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mo\n  }\n  return node;\n}\n// Math class commands except \\mathop\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\mathord\", \"\\\\mathbin\", \"\\\\mathrel\", \"\\\\mathopen\", \"\\\\mathclose\", \"\\\\mathpunct\", \"\\\\mathinner\"],\n  props: {\n    numArgs: 1,\n    primitive: true\n  },\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"mclass\",\n      mode: parser.mode,\n      mclass: \"m\" + funcName.slice(5),\n      // TODO(kevinb): don't prefix with 'm'\n      body: ordargument(body),\n      isCharacterBox: isCharacterBox(body)\n    };\n  },\n  htmlBuilder: htmlBuilder$9,\n  mathmlBuilder: mathmlBuilder$8\n});\nvar binrelClass = arg => {\n  // \\binrel@ spacing varies with (bin|rel|ord) of the atom in the argument.\n  // (by rendering separately and with {}s before and after, and measuring\n  // the change in spacing).  We'll do roughly the same by detecting the\n  // atom type directly.\n  var atom = arg.type === \"ordgroup\" && arg.body.length ? arg.body[0] : arg;\n  if (atom.type === \"atom\" && (atom.family === \"bin\" || atom.family === \"rel\")) {\n    return \"m\" + atom.family;\n  } else {\n    return \"mord\";\n  }\n};\n// \\@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord.\n// This is equivalent to \\binrel@{x}\\binrel@@{y} in AMSTeX.\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\@binrel\"],\n  props: {\n    numArgs: 2\n  },\n  handler(_ref2, args) {\n    var {\n      parser\n    } = _ref2;\n    return {\n      type: \"mclass\",\n      mode: parser.mode,\n      mclass: binrelClass(args[0]),\n      body: ordargument(args[1]),\n      isCharacterBox: isCharacterBox(args[1])\n    };\n  }\n});\n// Build a relation or stacked op by placing one symbol on top of another\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\stackrel\", \"\\\\overset\", \"\\\\underset\"],\n  props: {\n    numArgs: 2\n  },\n  handler(_ref3, args) {\n    var {\n      parser,\n      funcName\n    } = _ref3;\n    var baseArg = args[1];\n    var shiftedArg = args[0];\n    var mclass;\n    if (funcName !== \"\\\\stackrel\") {\n      // LaTeX applies \\binrel spacing to \\overset and \\underset.\n      mclass = binrelClass(baseArg);\n    } else {\n      mclass = \"mrel\"; // for \\stackrel\n    }\n    var baseOp = {\n      type: \"op\",\n      mode: baseArg.mode,\n      limits: true,\n      alwaysHandleSupSub: true,\n      parentIsSupSub: false,\n      symbol: false,\n      suppressBaseShift: funcName !== \"\\\\stackrel\",\n      body: ordargument(baseArg)\n    };\n    var supsub = {\n      type: \"supsub\",\n      mode: shiftedArg.mode,\n      base: baseOp,\n      sup: funcName === \"\\\\underset\" ? null : shiftedArg,\n      sub: funcName === \"\\\\underset\" ? shiftedArg : null\n    };\n    return {\n      type: \"mclass\",\n      mode: parser.mode,\n      mclass,\n      body: [supsub],\n      isCharacterBox: isCharacterBox(supsub)\n    };\n  },\n  htmlBuilder: htmlBuilder$9,\n  mathmlBuilder: mathmlBuilder$8\n});\n\n// \\pmb is a simulation of bold font.\n// The version of \\pmb in ambsy.sty works by typesetting three copies\n// with small offsets. We use CSS text-shadow.\n// It's a hack. Not as good as a real bold font. Better than nothing.\ndefineFunction({\n  type: \"pmb\",\n  names: [\"\\\\pmb\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"pmb\",\n      mode: parser.mode,\n      mclass: binrelClass(args[0]),\n      body: ordargument(args[0])\n    };\n  },\n  htmlBuilder(group, options) {\n    var elements = buildExpression$1(group.body, options, true);\n    var node = makeSpan([group.mclass], elements, options);\n    node.style.textShadow = \"0.02em 0.01em 0.04px\";\n    return node;\n  },\n  mathmlBuilder(group, style) {\n    var inner = buildExpression(group.body, style);\n    // Wrap with an <mstyle> element.\n    var node = new MathNode(\"mstyle\", inner);\n    node.setAttribute(\"style\", \"text-shadow: 0.02em 0.01em 0.04px\");\n    return node;\n  }\n});\n\nvar cdArrowFunctionName = {\n  \">\": \"\\\\\\\\cdrightarrow\",\n  \"<\": \"\\\\\\\\cdleftarrow\",\n  \"=\": \"\\\\\\\\cdlongequal\",\n  \"A\": \"\\\\uparrow\",\n  \"V\": \"\\\\downarrow\",\n  \"|\": \"\\\\Vert\",\n  \".\": \"no arrow\"\n};\nvar newCell = () => {\n  // Create an empty cell, to be filled below with parse nodes.\n  // The parseTree from this module must be constructed like the\n  // one created by parseArray(), so an empty CD cell must\n  // be a ParseNode<\"styling\">. And CD is always displaystyle.\n  return {\n    type: \"styling\",\n    body: [],\n    mode: \"math\",\n    style: \"display\"\n  };\n};\nvar isStartOfArrow = node => {\n  return node.type === \"textord\" && node.text === \"@\";\n};\nvar isLabelEnd = (node, endChar) => {\n  return (node.type === \"mathord\" || node.type === \"atom\") && node.text === endChar;\n};\nfunction cdArrow(arrowChar, labels, parser) {\n  // Return a parse tree of an arrow and its labels.\n  // This acts in a way similar to a macro expansion.\n  var funcName = cdArrowFunctionName[arrowChar];\n  switch (funcName) {\n    case \"\\\\\\\\cdrightarrow\":\n    case \"\\\\\\\\cdleftarrow\":\n      return parser.callFunction(funcName, [labels[0]], [labels[1]]);\n    case \"\\\\uparrow\":\n    case \"\\\\downarrow\":\n      {\n        var leftLabel = parser.callFunction(\"\\\\\\\\cdleft\", [labels[0]], []);\n        var bareArrow = {\n          type: \"atom\",\n          text: funcName,\n          mode: \"math\",\n          family: \"rel\"\n        };\n        var sizedArrow = parser.callFunction(\"\\\\Big\", [bareArrow], []);\n        var rightLabel = parser.callFunction(\"\\\\\\\\cdright\", [labels[1]], []);\n        var arrowGroup = {\n          type: \"ordgroup\",\n          mode: \"math\",\n          body: [leftLabel, sizedArrow, rightLabel]\n        };\n        return parser.callFunction(\"\\\\\\\\cdparent\", [arrowGroup], []);\n      }\n    case \"\\\\\\\\cdlongequal\":\n      return parser.callFunction(\"\\\\\\\\cdlongequal\", [], []);\n    case \"\\\\Vert\":\n      {\n        var arrow = {\n          type: \"textord\",\n          text: \"\\\\Vert\",\n          mode: \"math\"\n        };\n        return parser.callFunction(\"\\\\Big\", [arrow], []);\n      }\n    default:\n      return {\n        type: \"textord\",\n        text: \" \",\n        mode: \"math\"\n      };\n  }\n}\nfunction parseCD(parser) {\n  // Get the array's parse nodes with \\\\ temporarily mapped to \\cr.\n  var parsedRows = [];\n  parser.gullet.beginGroup();\n  parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n  parser.gullet.beginGroup();\n  while (true) {\n    // eslint-disable-line no-constant-condition\n    // Get the parse nodes for the next row.\n    parsedRows.push(parser.parseExpression(false, \"\\\\\\\\\"));\n    parser.gullet.endGroup();\n    parser.gullet.beginGroup();\n    var next = parser.fetch().text;\n    if (next === \"&\" || next === \"\\\\\\\\\") {\n      parser.consume();\n    } else if (next === \"\\\\end\") {\n      if (parsedRows[parsedRows.length - 1].length === 0) {\n        parsedRows.pop(); // final row ended in \\\\\n      }\n      break;\n    } else {\n      throw new ParseError(\"Expected \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n    }\n  }\n  var row = [];\n  var body = [row];\n  // Loop thru the parse nodes. Collect them into cells and arrows.\n  for (var i = 0; i < parsedRows.length; i++) {\n    // Start a new row.\n    var rowNodes = parsedRows[i];\n    // Create the first cell.\n    var cell = newCell();\n    for (var j = 0; j < rowNodes.length; j++) {\n      if (!isStartOfArrow(rowNodes[j])) {\n        // If a parseNode is not an arrow, it goes into a cell.\n        cell.body.push(rowNodes[j]);\n      } else {\n        // Parse node j is an \"@\", the start of an arrow.\n        // Before starting on the arrow, push the cell into `row`.\n        row.push(cell);\n        // Now collect parseNodes into an arrow.\n        // The character after \"@\" defines the arrow type.\n        j += 1;\n        var arrowChar = assertSymbolNodeType(rowNodes[j]).text;\n        // Create two empty label nodes. We may or may not use them.\n        var labels = new Array(2);\n        labels[0] = {\n          type: \"ordgroup\",\n          mode: \"math\",\n          body: []\n        };\n        labels[1] = {\n          type: \"ordgroup\",\n          mode: \"math\",\n          body: []\n        };\n        // Process the arrow.\n        if (\"=|.\".includes(arrowChar)) ; else if (\"<>AV\".includes(arrowChar)) {\n          // Four arrows, `@>>>`, `@<<<`, `@AAA`, and `@VVV`, each take\n          // two optional labels. E.g. the right-point arrow syntax is\n          // really:  @>{optional label}>{optional label}>\n          // Collect parseNodes into labels.\n          for (var labelNum = 0; labelNum < 2; labelNum++) {\n            var inLabel = true;\n            for (var k = j + 1; k < rowNodes.length; k++) {\n              if (isLabelEnd(rowNodes[k], arrowChar)) {\n                inLabel = false;\n                j = k;\n                break;\n              }\n              if (isStartOfArrow(rowNodes[k])) {\n                throw new ParseError(\"Missing a \" + arrowChar + \" character to complete a CD arrow.\", rowNodes[k]);\n              }\n              labels[labelNum].body.push(rowNodes[k]);\n            }\n            if (inLabel) {\n              // isLabelEnd never returned a true.\n              throw new ParseError(\"Missing a \" + arrowChar + \" character to complete a CD arrow.\", rowNodes[j]);\n            }\n          }\n        } else {\n          throw new ParseError(\"Expected one of \\\"<>AV=|.\\\" after @\", rowNodes[j]);\n        }\n        // Now join the arrow to its labels.\n        var arrow = cdArrow(arrowChar, labels, parser);\n        // Wrap the arrow in  ParseNode<\"styling\">.\n        // This is done to match parseArray() behavior.\n        var wrappedArrow = {\n          type: \"styling\",\n          body: [arrow],\n          mode: \"math\",\n          style: \"display\" // CD is always displaystyle.\n        };\n        row.push(wrappedArrow);\n        // In CD's syntax, cells are implicit. That is, everything that\n        // is not an arrow gets collected into a cell. So create an empty\n        // cell now. It will collect upcoming parseNodes.\n        cell = newCell();\n      }\n    }\n    if (i % 2 === 0) {\n      // Even-numbered rows consist of: cell, arrow, cell, arrow, ... cell\n      // The last cell is not yet pushed into `row`, so:\n      row.push(cell);\n    } else {\n      // Odd-numbered rows consist of: vert arrow, empty cell, ... vert arrow\n      // Remove the empty cell that was placed at the beginning of `row`.\n      row.shift();\n    }\n    row = [];\n    body.push(row);\n  }\n  // End row group\n  parser.gullet.endGroup();\n  // End array group defining \\\\\n  parser.gullet.endGroup();\n  // define column separation.\n  var cols = new Array(body[0].length).fill({\n    type: \"align\",\n    align: \"c\",\n    pregap: 0.25,\n    // CD package sets \\enskip between columns.\n    postgap: 0.25 // So pre and post each get half an \\enskip, i.e. 0.25em.\n  });\n  return {\n    type: \"array\",\n    mode: \"math\",\n    body,\n    arraystretch: 1,\n    addJot: true,\n    rowGaps: [null],\n    cols,\n    colSeparationType: \"CD\",\n    hLinesBeforeRow: new Array(body.length + 1).fill([])\n  };\n}\n// The functions below are not available for general use.\n// They are here only for internal use by the {CD} environment in placing labels\n// next to vertical arrows.\n// We don't need any such functions for horizontal arrows because we can reuse\n// the functionality that already exists for extensible arrows.\ndefineFunction({\n  type: \"cdlabel\",\n  names: [\"\\\\\\\\cdleft\", \"\\\\\\\\cdright\"],\n  props: {\n    numArgs: 1\n  },\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    return {\n      type: \"cdlabel\",\n      mode: parser.mode,\n      side: funcName.slice(4),\n      label: args[0]\n    };\n  },\n  htmlBuilder(group, options) {\n    var newOptions = options.havingStyle(options.style.sup());\n    var label = wrapFragment(buildGroup$1(group.label, newOptions, options), options);\n    label.classes.push(\"cd-label-\" + group.side);\n    label.style.bottom = makeEm(0.8 - label.depth);\n    // Zero out label height & depth, so vertical align of arrow is set\n    // by the arrow height, not by the label.\n    label.height = 0;\n    label.depth = 0;\n    return label;\n  },\n  mathmlBuilder(group, options) {\n    var label = new MathNode(\"mrow\", [buildGroup(group.label, options)]);\n    label = new MathNode(\"mpadded\", [label]);\n    label.setAttribute(\"width\", \"0\");\n    if (group.side === \"left\") {\n      label.setAttribute(\"lspace\", \"-1width\");\n    }\n    // We have to guess at vertical alignment. We know the arrow is 1.8em tall,\n    // But we don't know the height or depth of the label.\n    label.setAttribute(\"voffset\", \"0.7em\");\n    label = new MathNode(\"mstyle\", [label]);\n    label.setAttribute(\"displaystyle\", \"false\");\n    label.setAttribute(\"scriptlevel\", \"1\");\n    return label;\n  }\n});\ndefineFunction({\n  type: \"cdlabelparent\",\n  names: [\"\\\\\\\\cdparent\"],\n  props: {\n    numArgs: 1\n  },\n  handler(_ref2, args) {\n    var {\n      parser\n    } = _ref2;\n    return {\n      type: \"cdlabelparent\",\n      mode: parser.mode,\n      fragment: args[0]\n    };\n  },\n  htmlBuilder(group, options) {\n    // Wrap the vertical arrow and its labels.\n    // The parent gets position: relative. The child gets position: absolute.\n    // So CSS can locate the label correctly.\n    var parent = wrapFragment(buildGroup$1(group.fragment, options), options);\n    parent.classes.push(\"cd-vert-arrow\");\n    return parent;\n  },\n  mathmlBuilder(group, options) {\n    return new MathNode(\"mrow\", [buildGroup(group.fragment, options)]);\n  }\n});\n\n// \\@char is an internal function that takes a grouped decimal argument like\n// {123} and converts into symbol with code 123.  It is used by the *macro*\n// \\char defined in macros.js.\ndefineFunction({\n  type: \"textord\",\n  names: [\"\\\\@char\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    var arg = assertNodeType(args[0], \"ordgroup\");\n    var group = arg.body;\n    var number = \"\";\n    for (var i = 0; i < group.length; i++) {\n      var node = assertNodeType(group[i], \"textord\");\n      number += node.text;\n    }\n    var code = parseInt(number);\n    var text;\n    if (isNaN(code)) {\n      throw new ParseError(\"\\\\@char has non-numeric argument \" + number);\n      // If we drop IE support, the following code could be replaced with\n      // text = String.fromCodePoint(code)\n    } else if (code < 0 || code >= 0x10ffff) {\n      throw new ParseError(\"\\\\@char with invalid code point \" + number);\n    } else if (code <= 0xffff) {\n      text = String.fromCharCode(code);\n    } else {\n      // Astral code point; split into surrogate halves\n      code -= 0x10000;\n      text = String.fromCharCode((code >> 10) + 0xd800, (code & 0x3ff) + 0xdc00);\n    }\n    return {\n      type: \"textord\",\n      mode: parser.mode,\n      text: text\n    };\n  }\n});\n\nvar htmlBuilder$8 = (group, options) => {\n  var elements = buildExpression$1(group.body, options.withColor(group.color), false);\n  // \\color isn't supposed to affect the type of the elements it contains.\n  // To accomplish this, we wrap the results in a fragment, so the inner\n  // elements will be able to directly interact with their neighbors. For\n  // example, `\\color{red}{2 +} 3` has the same spacing as `2 + 3`\n  return makeFragment(elements);\n};\nvar mathmlBuilder$7 = (group, options) => {\n  var inner = buildExpression(group.body, options.withColor(group.color));\n  var node = new MathNode(\"mstyle\", inner);\n  node.setAttribute(\"mathcolor\", group.color);\n  return node;\n};\ndefineFunction({\n  type: \"color\",\n  names: [\"\\\\textcolor\"],\n  props: {\n    numArgs: 2,\n    allowedInText: true,\n    argTypes: [\"color\", \"original\"]\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    var color = assertNodeType(args[0], \"color-token\").color;\n    var body = args[1];\n    return {\n      type: \"color\",\n      mode: parser.mode,\n      color,\n      body: ordargument(body)\n    };\n  },\n  htmlBuilder: htmlBuilder$8,\n  mathmlBuilder: mathmlBuilder$7\n});\ndefineFunction({\n  type: \"color\",\n  names: [\"\\\\color\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true,\n    argTypes: [\"color\"]\n  },\n  handler(_ref2, args) {\n    var {\n      parser,\n      breakOnTokenText\n    } = _ref2;\n    var color = assertNodeType(args[0], \"color-token\").color;\n    // Set macro \\current@color in current namespace to store the current\n    // color, mimicking the behavior of color.sty.\n    // This is currently used just to correctly color a \\right\n    // that follows a \\color command.\n    parser.gullet.macros.set(\"\\\\current@color\", color);\n    // Parse out the implicit body that should be colored.\n    var body = parser.parseExpression(true, breakOnTokenText);\n    return {\n      type: \"color\",\n      mode: parser.mode,\n      color,\n      body\n    };\n  },\n  htmlBuilder: htmlBuilder$8,\n  mathmlBuilder: mathmlBuilder$7\n});\n\n// Row breaks within tabular environments, and line breaks at top level\n// \\DeclareRobustCommand\\\\{...\\@xnewline}\ndefineFunction({\n  type: \"cr\",\n  names: [\"\\\\\\\\\"],\n  props: {\n    numArgs: 0,\n    numOptionalArgs: 0,\n    allowedInText: true\n  },\n  handler(_ref, args, optArgs) {\n    var {\n      parser\n    } = _ref;\n    var size = parser.gullet.future().text === \"[\" ? parser.parseSizeGroup(true) : null;\n    var newLine = !parser.settings.displayMode || !parser.settings.useStrictBehavior(\"newLineInDisplayMode\", \"In LaTeX, \\\\\\\\ or \\\\newline \" + \"does nothing in display mode\");\n    return {\n      type: \"cr\",\n      mode: parser.mode,\n      newLine,\n      size: size && assertNodeType(size, \"size\").value\n    };\n  },\n  // The following builders are called only at the top level,\n  // not within tabular/array environments.\n  htmlBuilder(group, options) {\n    var span = makeSpan([\"mspace\"], [], options);\n    if (group.newLine) {\n      span.classes.push(\"newline\");\n      if (group.size) {\n        span.style.marginTop = makeEm(calculateSize(group.size, options));\n      }\n    }\n    return span;\n  },\n  mathmlBuilder(group, options) {\n    var node = new MathNode(\"mspace\");\n    if (group.newLine) {\n      node.setAttribute(\"linebreak\", \"newline\");\n      if (group.size) {\n        node.setAttribute(\"height\", makeEm(calculateSize(group.size, options)));\n      }\n    }\n    return node;\n  }\n});\n\nvar globalMap = {\n  \"\\\\global\": \"\\\\global\",\n  \"\\\\long\": \"\\\\\\\\globallong\",\n  \"\\\\\\\\globallong\": \"\\\\\\\\globallong\",\n  \"\\\\def\": \"\\\\gdef\",\n  \"\\\\gdef\": \"\\\\gdef\",\n  \"\\\\edef\": \"\\\\xdef\",\n  \"\\\\xdef\": \"\\\\xdef\",\n  \"\\\\let\": \"\\\\\\\\globallet\",\n  \"\\\\futurelet\": \"\\\\\\\\globalfuture\"\n};\nvar checkControlSequence = tok => {\n  var name = tok.text;\n  if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n    throw new ParseError(\"Expected a control sequence\", tok);\n  }\n  return name;\n};\nvar getRHS = parser => {\n  var tok = parser.gullet.popToken();\n  if (tok.text === \"=\") {\n    // consume optional equals\n    tok = parser.gullet.popToken();\n    if (tok.text === \" \") {\n      // consume one optional space\n      tok = parser.gullet.popToken();\n    }\n  }\n  return tok;\n};\nvar letCommand = (parser, name, tok, global) => {\n  var macro = parser.gullet.macros.get(tok.text);\n  if (macro == null) {\n    // don't expand it later even if a macro with the same name is defined\n    // e.g., \\let\\foo=\\frac \\def\\frac{\\relax} \\frac12\n    tok.noexpand = true;\n    macro = {\n      tokens: [tok],\n      numArgs: 0,\n      // reproduce the same behavior in expansion\n      unexpandable: !parser.gullet.isExpandable(tok.text)\n    };\n  }\n  parser.gullet.macros.set(name, macro, global);\n};\n// <assignment> -> <non-macro assignment>|<macro assignment>\n// <non-macro assignment> -> <simple assignment>|\\global<non-macro assignment>\n// <macro assignment> -> <definition>|<prefix><macro assignment>\n// <prefix> -> \\global|\\long|\\outer\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\global\", \"\\\\long\", \"\\\\\\\\globallong\" // can’t be entered directly\n  ],\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler(_ref) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    parser.consumeSpaces();\n    var token = parser.fetch();\n    if (globalMap[token.text]) {\n      // KaTeX doesn't have \\par, so ignore \\long\n      if (funcName === \"\\\\global\" || funcName === \"\\\\\\\\globallong\") {\n        token.text = globalMap[token.text];\n      }\n      return assertNodeType(parser.parseFunction(), \"internal\");\n    }\n    throw new ParseError(\"Invalid token after macro prefix\", token);\n  }\n});\n// Basic support for macro definitions: \\def, \\gdef, \\edef, \\xdef\n// <definition> -> <def><control sequence><definition text>\n// <def> -> \\def|\\gdef|\\edef|\\xdef\n// <definition text> -> <parameter text><left brace><balanced text><right brace>\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\def\", \"\\\\gdef\", \"\\\\edef\", \"\\\\xdef\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler(_ref2) {\n    var {\n      parser,\n      funcName\n    } = _ref2;\n    var tok = parser.gullet.popToken();\n    var name = tok.text;\n    if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n      throw new ParseError(\"Expected a control sequence\", tok);\n    }\n    var numArgs = 0;\n    var insert;\n    var delimiters = [[]];\n    // <parameter text> contains no braces\n    while (parser.gullet.future().text !== \"{\") {\n      tok = parser.gullet.popToken();\n      if (tok.text === \"#\") {\n        // If the very last character of the <parameter text> is #, so that\n        // this # is immediately followed by {, TeX will behave as if the {\n        // had been inserted at the right end of both the parameter text\n        // and the replacement text.\n        if (parser.gullet.future().text === \"{\") {\n          insert = parser.gullet.future();\n          delimiters[numArgs].push(\"{\");\n          break;\n        }\n        // A parameter, the first appearance of # must be followed by 1,\n        // the next by 2, and so on; up to nine #’s are allowed\n        tok = parser.gullet.popToken();\n        if (!/^[1-9]$/.test(tok.text)) {\n          throw new ParseError(\"Invalid argument number \\\"\" + tok.text + \"\\\"\");\n        }\n        if (parseInt(tok.text) !== numArgs + 1) {\n          throw new ParseError(\"Argument number \\\"\" + tok.text + \"\\\" out of order\");\n        }\n        numArgs++;\n        delimiters.push([]);\n      } else if (tok.text === \"EOF\") {\n        throw new ParseError(\"Expected a macro definition\");\n      } else {\n        delimiters[numArgs].push(tok.text);\n      }\n    }\n    // replacement text, enclosed in '{' and '}' and properly nested\n    var {\n      tokens\n    } = parser.gullet.consumeArg();\n    if (insert) {\n      tokens.unshift(insert);\n    }\n    if (funcName === \"\\\\edef\" || funcName === \"\\\\xdef\") {\n      tokens = parser.gullet.expandTokens(tokens);\n      tokens.reverse(); // to fit in with stack order\n    }\n    // Final arg is the expansion of the macro\n    parser.gullet.macros.set(name, {\n      tokens,\n      numArgs,\n      delimiters\n    }, funcName === globalMap[funcName]);\n    return {\n      type: \"internal\",\n      mode: parser.mode\n    };\n  }\n});\n// <simple assignment> -> <let assignment>\n// <let assignment> -> \\futurelet<control sequence><token><token>\n//     | \\let<control sequence><equals><one optional space><token>\n// <equals> -> <optional spaces>|<optional spaces>=\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\let\", \"\\\\\\\\globallet\" // can’t be entered directly\n  ],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler(_ref3) {\n    var {\n      parser,\n      funcName\n    } = _ref3;\n    var name = checkControlSequence(parser.gullet.popToken());\n    parser.gullet.consumeSpaces();\n    var tok = getRHS(parser);\n    letCommand(parser, name, tok, funcName === \"\\\\\\\\globallet\");\n    return {\n      type: \"internal\",\n      mode: parser.mode\n    };\n  }\n});\n// ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\futurelet\", \"\\\\\\\\globalfuture\" // can’t be entered directly\n  ],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler(_ref4) {\n    var {\n      parser,\n      funcName\n    } = _ref4;\n    var name = checkControlSequence(parser.gullet.popToken());\n    var middle = parser.gullet.popToken();\n    var tok = parser.gullet.popToken();\n    letCommand(parser, name, tok, funcName === \"\\\\\\\\globalfuture\");\n    parser.gullet.pushToken(tok);\n    parser.gullet.pushToken(middle);\n    return {\n      type: \"internal\",\n      mode: parser.mode\n    };\n  }\n});\n\n/**\n * This file deals with creating delimiters of various sizes. The TeXbook\n * discusses these routines on page 441-442, in the \"Another subroutine sets box\n * x to a specified variable delimiter\" paragraph.\n *\n * There are three main routines here. `makeSmallDelim` makes a delimiter in the\n * normal font, but in either text, script, or scriptscript style.\n * `makeLargeDelim` makes a delimiter in textstyle, but in one of the Size1,\n * Size2, Size3, or Size4 fonts. `makeStackedDelim` makes a delimiter out of\n * smaller pieces that are stacked on top of one another.\n *\n * The functions take a parameter `center`, which determines if the delimiter\n * should be centered around the axis.\n *\n * Then, there are three exposed functions. `sizedDelim` makes a delimiter in\n * one of the given sizes. This is used for things like `\\bigl`.\n * `customSizedDelim` makes a delimiter with a given total height+depth. It is\n * called in places like `\\sqrt`. `leftRightDelim` makes an appropriate\n * delimiter which surrounds an expression of a given height an depth. It is\n * used in `\\left` and `\\right`.\n */\n/**\n * Get the metrics for a given symbol and font, after transformation (i.e.\n * after following replacement from symbols.js)\n */\nvar getMetrics = function getMetrics(symbol, font, mode) {\n  var replace = symbols.math[symbol] && symbols.math[symbol].replace;\n  var metrics = getCharacterMetrics(replace || symbol, font, mode);\n  if (!metrics) {\n    throw new Error(\"Unsupported symbol \" + symbol + \" and font size \" + font + \".\");\n  }\n  return metrics;\n};\n/**\n * Puts a delimiter span in a given style, and adds appropriate height, depth,\n * and maxFontSizes.\n */\nvar styleWrap = function styleWrap(delim, toStyle, options, classes) {\n  var newOptions = options.havingBaseStyle(toStyle);\n  var span = makeSpan(classes.concat(newOptions.sizingClasses(options)), [delim], options);\n  var delimSizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier;\n  span.height *= delimSizeMultiplier;\n  span.depth *= delimSizeMultiplier;\n  span.maxFontSize = newOptions.sizeMultiplier;\n  return span;\n};\nvar centerSpan = function centerSpan(span, options, style) {\n  var newOptions = options.havingBaseStyle(style);\n  var shift = (1 - options.sizeMultiplier / newOptions.sizeMultiplier) * options.fontMetrics().axisHeight;\n  span.classes.push(\"delimcenter\");\n  span.style.top = makeEm(shift);\n  span.height -= shift;\n  span.depth += shift;\n};\n/**\n * Makes a small delimiter. This is a delimiter that comes in the Main-Regular\n * font, but is restyled to either be in textstyle, scriptstyle, or\n * scriptscriptstyle.\n */\nvar makeSmallDelim = function makeSmallDelim(delim, style, center, options, mode, classes) {\n  var text = makeSymbol(delim, \"Main-Regular\", mode, options);\n  var span = styleWrap(text, style, options, classes);\n  if (center) {\n    centerSpan(span, options, style);\n  }\n  return span;\n};\n/**\n * Builds a symbol in the given font size (note size is an integer)\n */\nvar mathrmSize = function mathrmSize(value, size, mode, options) {\n  return makeSymbol(value, \"Size\" + size + \"-Regular\", mode, options);\n};\n/**\n * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2,\n * Size3, or Size4 fonts. It is always rendered in textstyle.\n */\nvar makeLargeDelim = function makeLargeDelim(delim, size, center, options, mode, classes) {\n  var inner = mathrmSize(delim, size, mode, options);\n  var span = styleWrap(makeSpan([\"delimsizing\", \"size\" + size], [inner], options), Style$1.TEXT, options, classes);\n  if (center) {\n    centerSpan(span, options, Style$1.TEXT);\n  }\n  return span;\n};\n/**\n * Make a span from a font glyph with the given offset and in the given font.\n * This is used in makeStackedDelim to make the stacking pieces for the delimiter.\n */\nvar makeGlyphSpan = function makeGlyphSpan(symbol, font, mode) {\n  var sizeClass;\n  // Apply the correct CSS class to choose the right font.\n  if (font === \"Size1-Regular\") {\n    sizeClass = \"delim-size1\";\n  } else /* if (font === \"Size4-Regular\") */{\n      sizeClass = \"delim-size4\";\n    }\n  var corner = makeSpan([\"delimsizinginner\", sizeClass], [makeSpan([], [makeSymbol(symbol, font, mode)])]);\n  // Since this will be passed into `makeVList` in the end, wrap the element\n  // in the appropriate tag that VList uses.\n  return {\n    type: \"elem\",\n    elem: corner\n  };\n};\nvar makeInner = function makeInner(ch, height, options) {\n  // Create a span with inline SVG for the inner part of a tall stacked delimiter.\n  var width = fontMetricsData['Size4-Regular'][ch.charCodeAt(0)] ? fontMetricsData['Size4-Regular'][ch.charCodeAt(0)][4] : fontMetricsData['Size1-Regular'][ch.charCodeAt(0)][4];\n  var path = new PathNode(\"inner\", innerPath(ch, Math.round(1000 * height)));\n  var svgNode = new SvgNode([path], {\n    \"width\": makeEm(width),\n    \"height\": makeEm(height),\n    // Override CSS rule `.katex svg { width: 100% }`\n    \"style\": \"width:\" + makeEm(width),\n    \"viewBox\": \"0 0 \" + 1000 * width + \" \" + Math.round(1000 * height),\n    \"preserveAspectRatio\": \"xMinYMin\"\n  });\n  var span = makeSvgSpan([], [svgNode], options);\n  span.height = height;\n  span.style.height = makeEm(height);\n  span.style.width = makeEm(width);\n  return {\n    type: \"elem\",\n    elem: span\n  };\n};\n// Helpers for makeStackedDelim\nvar lapInEms = 0.008;\nvar lap = {\n  type: \"kern\",\n  size: -1 * lapInEms\n};\nvar verts = new Set([\"|\", \"\\\\lvert\", \"\\\\rvert\", \"\\\\vert\"]);\nvar doubleVerts = new Set([\"\\\\|\", \"\\\\lVert\", \"\\\\rVert\", \"\\\\Vert\"]);\n/**\n * Make a stacked delimiter out of a given delimiter, with the total height at\n * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook.\n */\nvar makeStackedDelim = function makeStackedDelim(delim, heightTotal, center, options, mode, classes) {\n  // There are four parts, the top, an optional middle, a repeated part, and a\n  // bottom.\n  var top;\n  var middle;\n  var repeat;\n  var bottom;\n  var svgLabel = \"\";\n  var viewBoxWidth = 0;\n  top = repeat = bottom = delim;\n  middle = null;\n  // Also keep track of what font the delimiters are in\n  var font = \"Size1-Regular\";\n  // We set the parts and font based on the symbol. Note that we use\n  // '\\u23d0' instead of '|' and '\\u2016' instead of '\\\\|' for the\n  // repeats of the arrows\n  if (delim === \"\\\\uparrow\") {\n    repeat = bottom = \"\\u23d0\";\n  } else if (delim === \"\\\\Uparrow\") {\n    repeat = bottom = \"\\u2016\";\n  } else if (delim === \"\\\\downarrow\") {\n    top = repeat = \"\\u23d0\";\n  } else if (delim === \"\\\\Downarrow\") {\n    top = repeat = \"\\u2016\";\n  } else if (delim === \"\\\\updownarrow\") {\n    top = \"\\\\uparrow\";\n    repeat = \"\\u23d0\";\n    bottom = \"\\\\downarrow\";\n  } else if (delim === \"\\\\Updownarrow\") {\n    top = \"\\\\Uparrow\";\n    repeat = \"\\u2016\";\n    bottom = \"\\\\Downarrow\";\n  } else if (verts.has(delim)) {\n    repeat = \"\\u2223\";\n    svgLabel = \"vert\";\n    viewBoxWidth = 333;\n  } else if (doubleVerts.has(delim)) {\n    repeat = \"\\u2225\";\n    svgLabel = \"doublevert\";\n    viewBoxWidth = 556;\n  } else if (delim === \"[\" || delim === \"\\\\lbrack\") {\n    top = \"\\u23a1\";\n    repeat = \"\\u23a2\";\n    bottom = \"\\u23a3\";\n    font = \"Size4-Regular\";\n    svgLabel = \"lbrack\";\n    viewBoxWidth = 667;\n  } else if (delim === \"]\" || delim === \"\\\\rbrack\") {\n    top = \"\\u23a4\";\n    repeat = \"\\u23a5\";\n    bottom = \"\\u23a6\";\n    font = \"Size4-Regular\";\n    svgLabel = \"rbrack\";\n    viewBoxWidth = 667;\n  } else if (delim === \"\\\\lfloor\" || delim === \"\\u230a\") {\n    repeat = top = \"\\u23a2\";\n    bottom = \"\\u23a3\";\n    font = \"Size4-Regular\";\n    svgLabel = \"lfloor\";\n    viewBoxWidth = 667;\n  } else if (delim === \"\\\\lceil\" || delim === \"\\u2308\") {\n    top = \"\\u23a1\";\n    repeat = bottom = \"\\u23a2\";\n    font = \"Size4-Regular\";\n    svgLabel = \"lceil\";\n    viewBoxWidth = 667;\n  } else if (delim === \"\\\\rfloor\" || delim === \"\\u230b\") {\n    repeat = top = \"\\u23a5\";\n    bottom = \"\\u23a6\";\n    font = \"Size4-Regular\";\n    svgLabel = \"rfloor\";\n    viewBoxWidth = 667;\n  } else if (delim === \"\\\\rceil\" || delim === \"\\u2309\") {\n    top = \"\\u23a4\";\n    repeat = bottom = \"\\u23a5\";\n    font = \"Size4-Regular\";\n    svgLabel = \"rceil\";\n    viewBoxWidth = 667;\n  } else if (delim === \"(\" || delim === \"\\\\lparen\") {\n    top = \"\\u239b\";\n    repeat = \"\\u239c\";\n    bottom = \"\\u239d\";\n    font = \"Size4-Regular\";\n    svgLabel = \"lparen\";\n    viewBoxWidth = 875;\n  } else if (delim === \")\" || delim === \"\\\\rparen\") {\n    top = \"\\u239e\";\n    repeat = \"\\u239f\";\n    bottom = \"\\u23a0\";\n    font = \"Size4-Regular\";\n    svgLabel = \"rparen\";\n    viewBoxWidth = 875;\n  } else if (delim === \"\\\\{\" || delim === \"\\\\lbrace\") {\n    top = \"\\u23a7\";\n    middle = \"\\u23a8\";\n    bottom = \"\\u23a9\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  } else if (delim === \"\\\\}\" || delim === \"\\\\rbrace\") {\n    top = \"\\u23ab\";\n    middle = \"\\u23ac\";\n    bottom = \"\\u23ad\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  } else if (delim === \"\\\\lgroup\" || delim === \"\\u27ee\") {\n    top = \"\\u23a7\";\n    bottom = \"\\u23a9\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  } else if (delim === \"\\\\rgroup\" || delim === \"\\u27ef\") {\n    top = \"\\u23ab\";\n    bottom = \"\\u23ad\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  } else if (delim === \"\\\\lmoustache\" || delim === \"\\u23b0\") {\n    top = \"\\u23a7\";\n    bottom = \"\\u23ad\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  } else if (delim === \"\\\\rmoustache\" || delim === \"\\u23b1\") {\n    top = \"\\u23ab\";\n    bottom = \"\\u23a9\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  }\n  // Get the metrics of the four sections\n  var topMetrics = getMetrics(top, font, mode);\n  var topHeightTotal = topMetrics.height + topMetrics.depth;\n  var repeatMetrics = getMetrics(repeat, font, mode);\n  var repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth;\n  var bottomMetrics = getMetrics(bottom, font, mode);\n  var bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth;\n  var middleHeightTotal = 0;\n  var middleFactor = 1;\n  if (middle !== null) {\n    var middleMetrics = getMetrics(middle, font, mode);\n    middleHeightTotal = middleMetrics.height + middleMetrics.depth;\n    middleFactor = 2; // repeat symmetrically above and below middle\n  }\n  // Calculate the minimal height that the delimiter can have.\n  // It is at least the size of the top, bottom, and optional middle combined.\n  var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal;\n  // Compute the number of copies of the repeat symbol we will need\n  var repeatCount = Math.max(0, Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal)));\n  // Compute the total height of the delimiter including all the symbols\n  var realHeightTotal = minHeight + repeatCount * middleFactor * repeatHeightTotal;\n  // The center of the delimiter is placed at the center of the axis. Note\n  // that in this context, \"center\" means that the delimiter should be\n  // centered around the axis in the current style, while normally it is\n  // centered around the axis in textstyle.\n  var axisHeight = options.fontMetrics().axisHeight;\n  if (center) {\n    axisHeight *= options.sizeMultiplier;\n  }\n  // Calculate the depth\n  var depth = realHeightTotal / 2 - axisHeight;\n  // Now, we start building the pieces that will go into the vlist\n  // Keep a list of the pieces of the stacked delimiter\n  var stack = [];\n  if (svgLabel.length > 0) {\n    // Instead of stacking glyphs, create a single SVG.\n    // This evades browser problems with imprecise positioning of spans.\n    var midHeight = realHeightTotal - topHeightTotal - bottomHeightTotal;\n    var viewBoxHeight = Math.round(realHeightTotal * 1000);\n    var pathStr = tallDelim(svgLabel, Math.round(midHeight * 1000));\n    var path = new PathNode(svgLabel, pathStr);\n    var width = makeEm(viewBoxWidth / 1000);\n    var height = makeEm(viewBoxHeight / 1000);\n    var svg = new SvgNode([path], {\n      \"width\": width,\n      \"height\": height,\n      \"viewBox\": \"0 0 \" + viewBoxWidth + \" \" + viewBoxHeight\n    });\n    var wrapper = makeSvgSpan([], [svg], options);\n    wrapper.height = viewBoxHeight / 1000;\n    wrapper.style.width = width;\n    wrapper.style.height = height;\n    stack.push({\n      type: \"elem\",\n      elem: wrapper\n    });\n  } else {\n    // Stack glyphs\n    // Start by adding the bottom symbol\n    stack.push(makeGlyphSpan(bottom, font, mode));\n    stack.push(lap); // overlap\n    if (middle === null) {\n      // The middle section will be an SVG. Make it an extra 0.016em tall.\n      // We'll overlap by 0.008em at top and bottom.\n      var innerHeight = realHeightTotal - topHeightTotal - bottomHeightTotal + 2 * lapInEms;\n      stack.push(makeInner(repeat, innerHeight, options));\n    } else {\n      // When there is a middle bit, we need the middle part and two repeated\n      // sections\n      var _innerHeight = (realHeightTotal - topHeightTotal - bottomHeightTotal - middleHeightTotal) / 2 + 2 * lapInEms;\n      stack.push(makeInner(repeat, _innerHeight, options));\n      // Now insert the middle of the brace.\n      stack.push(lap);\n      stack.push(makeGlyphSpan(middle, font, mode));\n      stack.push(lap);\n      stack.push(makeInner(repeat, _innerHeight, options));\n    }\n    // Add the top symbol\n    stack.push(lap);\n    stack.push(makeGlyphSpan(top, font, mode));\n  }\n  // Finally, build the vlist\n  var newOptions = options.havingBaseStyle(Style$1.TEXT);\n  var inner = makeVList({\n    positionType: \"bottom\",\n    positionData: depth,\n    children: stack\n  });\n  return styleWrap(makeSpan([\"delimsizing\", \"mult\"], [inner], newOptions), Style$1.TEXT, options, classes);\n};\n// All surds have 0.08em padding above the vinculum inside the SVG.\n// That keeps browser span height rounding error from pinching the line.\nvar vbPad = 80; // padding above the surd, measured inside the viewBox.\nvar emPad = 0.08; // padding, in ems, measured in the document.\nvar sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, extraVinculum, options) {\n  var path = sqrtPath(sqrtName, extraVinculum, viewBoxHeight);\n  var pathNode = new PathNode(sqrtName, path);\n  var svg = new SvgNode([pathNode], {\n    // Note: 1000:1 ratio of viewBox to document em width.\n    \"width\": \"400em\",\n    \"height\": makeEm(height),\n    \"viewBox\": \"0 0 400000 \" + viewBoxHeight,\n    \"preserveAspectRatio\": \"xMinYMin slice\"\n  });\n  return makeSvgSpan([\"hide-tail\"], [svg], options);\n};\n/**\n * Make a sqrt image of the given height,\n */\nvar makeSqrtImage = function makeSqrtImage(height, options) {\n  // Define a newOptions that removes the effect of size changes such as \\Huge.\n  // We don't pick different a height surd for \\Huge. For it, we scale up.\n  var newOptions = options.havingBaseSizing();\n  // Pick the desired surd glyph from a sequence of surds.\n  var delim = traverseSequence(\"\\\\surd\", height * newOptions.sizeMultiplier, stackLargeDelimiterSequence, newOptions);\n  var sizeMultiplier = newOptions.sizeMultiplier; // default\n  // The standard sqrt SVGs each have a 0.04em thick vinculum.\n  // If Settings.minRuleThickness is larger than that, we add extraVinculum.\n  var extraVinculum = Math.max(0, options.minRuleThickness - options.fontMetrics().sqrtRuleThickness);\n  // Create a span containing an SVG image of a sqrt symbol.\n  var span;\n  var spanHeight = 0;\n  var texHeight = 0;\n  var viewBoxHeight = 0;\n  var advanceWidth;\n  // We create viewBoxes with 80 units of \"padding\" above each surd.\n  // Then browser rounding error on the parent span height will not\n  // encroach on the ink of the vinculum. But that padding is not\n  // included in the TeX-like `height` used for calculation of\n  // vertical alignment. So texHeight = span.height < span.style.height.\n  if (delim.type === \"small\") {\n    // Get an SVG that is derived from glyph U+221A in font KaTeX-Main.\n    // 1000 unit normal glyph height.\n    viewBoxHeight = 1000 + 1000 * extraVinculum + vbPad;\n    if (height < 1.0) {\n      sizeMultiplier = 1.0; // mimic a \\textfont radical\n    } else if (height < 1.4) {\n      sizeMultiplier = 0.7; // mimic a \\scriptfont radical\n    }\n    spanHeight = (1.0 + extraVinculum + emPad) / sizeMultiplier;\n    texHeight = (1.00 + extraVinculum) / sizeMultiplier;\n    span = sqrtSvg(\"sqrtMain\", spanHeight, viewBoxHeight, extraVinculum, options);\n    span.style.minWidth = \"0.853em\";\n    advanceWidth = 0.833 / sizeMultiplier; // from the font.\n  } else if (delim.type === \"large\") {\n    // These SVGs come from fonts: KaTeX_Size1, _Size2, etc.\n    viewBoxHeight = (1000 + vbPad) * sizeToMaxHeight[delim.size];\n    texHeight = (sizeToMaxHeight[delim.size] + extraVinculum) / sizeMultiplier;\n    spanHeight = (sizeToMaxHeight[delim.size] + extraVinculum + emPad) / sizeMultiplier;\n    span = sqrtSvg(\"sqrtSize\" + delim.size, spanHeight, viewBoxHeight, extraVinculum, options);\n    span.style.minWidth = \"1.02em\";\n    advanceWidth = 1.0 / sizeMultiplier; // 1.0 from the font.\n  } else {\n    // Tall sqrt. In TeX, this would be stacked using multiple glyphs.\n    // We'll use a single SVG to accomplish the same thing.\n    spanHeight = height + extraVinculum + emPad;\n    texHeight = height + extraVinculum;\n    viewBoxHeight = Math.floor(1000 * height + extraVinculum) + vbPad;\n    span = sqrtSvg(\"sqrtTall\", spanHeight, viewBoxHeight, extraVinculum, options);\n    span.style.minWidth = \"0.742em\";\n    advanceWidth = 1.056;\n  }\n  span.height = texHeight;\n  span.style.height = makeEm(spanHeight);\n  return {\n    span,\n    advanceWidth,\n    // Calculate the actual line width.\n    // This actually should depend on the chosen font -- e.g. \\boldmath\n    // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and\n    // have thicker rules.\n    ruleWidth: (options.fontMetrics().sqrtRuleThickness + extraVinculum) * sizeMultiplier\n  };\n};\n// There are three kinds of delimiters, delimiters that stack when they become\n// too large\nvar stackLargeDelimiters = new Set([\"(\", \"\\\\lparen\", \")\", \"\\\\rparen\", \"[\", \"\\\\lbrack\", \"]\", \"\\\\rbrack\", \"\\\\{\", \"\\\\lbrace\", \"\\\\}\", \"\\\\rbrace\", \"\\\\lfloor\", \"\\\\rfloor\", \"\\u230a\", \"\\u230b\", \"\\\\lceil\", \"\\\\rceil\", \"\\u2308\", \"\\u2309\", \"\\\\surd\"]);\n// delimiters that always stack\nvar stackAlwaysDelimiters = new Set([\"\\\\uparrow\", \"\\\\downarrow\", \"\\\\updownarrow\", \"\\\\Uparrow\", \"\\\\Downarrow\", \"\\\\Updownarrow\", \"|\", \"\\\\|\", \"\\\\vert\", \"\\\\Vert\", \"\\\\lvert\", \"\\\\rvert\", \"\\\\lVert\", \"\\\\rVert\", \"\\\\lgroup\", \"\\\\rgroup\", \"\\u27ee\", \"\\u27ef\", \"\\\\lmoustache\", \"\\\\rmoustache\", \"\\u23b0\", \"\\u23b1\"]);\n// and delimiters that never stack\nvar stackNeverDelimiters = new Set([\"<\", \">\", \"\\\\langle\", \"\\\\rangle\", \"/\", \"\\\\backslash\", \"\\\\lt\", \"\\\\gt\"]);\n// Metrics of the different sizes. Found by looking at TeX's output of\n// $\\bigl| // \\Bigl| \\biggl| \\Biggl| \\showlists$\n// Used to create stacked delimiters of appropriate sizes in makeSizedDelim.\nvar sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0];\n/**\n * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4.\n */\nvar makeSizedDelim = function makeSizedDelim(delim, size, options, mode, classes) {\n  // < and > turn into \\langle and \\rangle in delimiters\n  if (delim === \"<\" || delim === \"\\\\lt\" || delim === \"\\u27e8\") {\n    delim = \"\\\\langle\";\n  } else if (delim === \">\" || delim === \"\\\\gt\" || delim === \"\\u27e9\") {\n    delim = \"\\\\rangle\";\n  }\n  // Sized delimiters are never centered.\n  if (stackLargeDelimiters.has(delim) || stackNeverDelimiters.has(delim)) {\n    return makeLargeDelim(delim, size, false, options, mode, classes);\n  } else if (stackAlwaysDelimiters.has(delim)) {\n    return makeStackedDelim(delim, sizeToMaxHeight[size], false, options, mode, classes);\n  } else {\n    throw new ParseError(\"Illegal delimiter: '\" + delim + \"'\");\n  }\n};\n// Delimiters that never stack try small delimiters and large delimiters only\nvar stackNeverDelimiterSequence = [{\n  type: \"small\",\n  style: Style$1.SCRIPTSCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.SCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.TEXT\n}, {\n  type: \"large\",\n  size: 1\n}, {\n  type: \"large\",\n  size: 2\n}, {\n  type: \"large\",\n  size: 3\n}, {\n  type: \"large\",\n  size: 4\n}];\n// Delimiters that always stack try the small delimiters first, then stack\nvar stackAlwaysDelimiterSequence = [{\n  type: \"small\",\n  style: Style$1.SCRIPTSCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.SCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.TEXT\n}, {\n  type: \"stack\"\n}];\n// Delimiters that stack when large try the small and then large delimiters, and\n// stack afterwards\nvar stackLargeDelimiterSequence = [{\n  type: \"small\",\n  style: Style$1.SCRIPTSCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.SCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.TEXT\n}, {\n  type: \"large\",\n  size: 1\n}, {\n  type: \"large\",\n  size: 2\n}, {\n  type: \"large\",\n  size: 3\n}, {\n  type: \"large\",\n  size: 4\n}, {\n  type: \"stack\"\n}];\n/**\n * Get the font used in a delimiter based on what kind of delimiter it is.\n * TODO(#963) Use more specific font family return type once that is introduced.\n */\nvar delimTypeToFont = function delimTypeToFont(type) {\n  if (type.type === \"small\") {\n    return \"Main-Regular\";\n  } else if (type.type === \"large\") {\n    return \"Size\" + type.size + \"-Regular\";\n  } else if (type.type === \"stack\") {\n    return \"Size4-Regular\";\n  } else {\n    var delimKind = type.type;\n    throw new Error(\"Add support for delim type '\" + delimKind + \"' here.\");\n  }\n};\n/**\n * Traverse a sequence of types of delimiters to decide what kind of delimiter\n * should be used to create a delimiter of the given height+depth.\n */\nvar traverseSequence = function traverseSequence(delim, height, sequence, options) {\n  // Here, we choose the index we should start at in the sequences. In smaller\n  // sizes (which correspond to larger numbers in style.size) we start earlier\n  // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts\n  // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2\n  var start = Math.min(2, 3 - options.style.size);\n  for (var i = start; i < sequence.length; i++) {\n    var delimType = sequence[i];\n    if (delimType.type === \"stack\") {\n      // This is always the last delimiter, so we just break the loop now.\n      break;\n    }\n    var metrics = getMetrics(delim, delimTypeToFont(delimType), \"math\");\n    var heightDepth = metrics.height + metrics.depth;\n    // Small delimiters are scaled down versions of the same font, so we\n    // account for the style change size.\n    if (delimType.type === \"small\") {\n      var newOptions = options.havingBaseStyle(delimType.style);\n      heightDepth *= newOptions.sizeMultiplier;\n    }\n    // Check if the delimiter at this size works for the given height.\n    if (heightDepth > height) {\n      return delimType;\n    }\n  }\n  // If we reached the end of the sequence, return the last sequence element.\n  return sequence[sequence.length - 1];\n};\n/**\n * Make a delimiter of a given height+depth, with optional centering. Here, we\n * traverse the sequences, and create a delimiter that the sequence tells us to.\n */\nvar makeCustomSizedDelim = function makeCustomSizedDelim(delim, height, center, options, mode, classes) {\n  if (delim === \"<\" || delim === \"\\\\lt\" || delim === \"\\u27e8\") {\n    delim = \"\\\\langle\";\n  } else if (delim === \">\" || delim === \"\\\\gt\" || delim === \"\\u27e9\") {\n    delim = \"\\\\rangle\";\n  }\n  // Decide what sequence to use\n  var sequence;\n  if (stackNeverDelimiters.has(delim)) {\n    sequence = stackNeverDelimiterSequence;\n  } else if (stackLargeDelimiters.has(delim)) {\n    sequence = stackLargeDelimiterSequence;\n  } else {\n    sequence = stackAlwaysDelimiterSequence;\n  }\n  // Look through the sequence\n  var delimType = traverseSequence(delim, height, sequence, options);\n  // Get the delimiter from font glyphs.\n  // Depending on the sequence element we decided on, call the\n  // appropriate function.\n  if (delimType.type === \"small\") {\n    return makeSmallDelim(delim, delimType.style, center, options, mode, classes);\n  } else if (delimType.type === \"large\") {\n    return makeLargeDelim(delim, delimType.size, center, options, mode, classes);\n  } else /* if (delimType.type === \"stack\") */{\n      return makeStackedDelim(delim, height, center, options, mode, classes);\n    }\n};\n/**\n * Make a delimiter for use with `\\left` and `\\right`, given a height and depth\n * of an expression that the delimiters surround.\n */\nvar makeLeftRightDelim = function makeLeftRightDelim(delim, height, depth, options, mode, classes) {\n  // We always center \\left/\\right delimiters, so the axis is always shifted\n  var axisHeight = options.fontMetrics().axisHeight * options.sizeMultiplier;\n  // Taken from TeX source, tex.web, function make_left_right\n  var delimiterFactor = 901;\n  var delimiterExtend = 5.0 / options.fontMetrics().ptPerEm;\n  var maxDistFromAxis = Math.max(height - axisHeight, depth + axisHeight);\n  var totalHeight = Math.max(\n  // In real TeX, calculations are done using integral values which are\n  // 65536 per pt, or 655360 per em. So, the division here truncates in\n  // TeX but doesn't here, producing different results. If we wanted to\n  // exactly match TeX's calculation, we could do\n  //   Math.floor(655360 * maxDistFromAxis / 500) *\n  //    delimiterFactor / 655360\n  // (To see the difference, compare\n  //    x^{x^{\\left(\\rule{0.1em}{0.68em}\\right)}}\n  // in TeX and KaTeX)\n  maxDistFromAxis / 500 * delimiterFactor, 2 * maxDistFromAxis - delimiterExtend);\n  // Finally, we defer to `makeCustomSizedDelim` with our calculated total\n  // height\n  return makeCustomSizedDelim(delim, totalHeight, true, options, mode, classes);\n};\n\n// Extra data needed for the delimiter handler down below\nvar delimiterSizes = {\n  \"\\\\bigl\": {\n    mclass: \"mopen\",\n    size: 1\n  },\n  \"\\\\Bigl\": {\n    mclass: \"mopen\",\n    size: 2\n  },\n  \"\\\\biggl\": {\n    mclass: \"mopen\",\n    size: 3\n  },\n  \"\\\\Biggl\": {\n    mclass: \"mopen\",\n    size: 4\n  },\n  \"\\\\bigr\": {\n    mclass: \"mclose\",\n    size: 1\n  },\n  \"\\\\Bigr\": {\n    mclass: \"mclose\",\n    size: 2\n  },\n  \"\\\\biggr\": {\n    mclass: \"mclose\",\n    size: 3\n  },\n  \"\\\\Biggr\": {\n    mclass: \"mclose\",\n    size: 4\n  },\n  \"\\\\bigm\": {\n    mclass: \"mrel\",\n    size: 1\n  },\n  \"\\\\Bigm\": {\n    mclass: \"mrel\",\n    size: 2\n  },\n  \"\\\\biggm\": {\n    mclass: \"mrel\",\n    size: 3\n  },\n  \"\\\\Biggm\": {\n    mclass: \"mrel\",\n    size: 4\n  },\n  \"\\\\big\": {\n    mclass: \"mord\",\n    size: 1\n  },\n  \"\\\\Big\": {\n    mclass: \"mord\",\n    size: 2\n  },\n  \"\\\\bigg\": {\n    mclass: \"mord\",\n    size: 3\n  },\n  \"\\\\Bigg\": {\n    mclass: \"mord\",\n    size: 4\n  }\n};\nvar delimiters = new Set([\"(\", \"\\\\lparen\", \")\", \"\\\\rparen\", \"[\", \"\\\\lbrack\", \"]\", \"\\\\rbrack\", \"\\\\{\", \"\\\\lbrace\", \"\\\\}\", \"\\\\rbrace\", \"\\\\lfloor\", \"\\\\rfloor\", \"\\u230a\", \"\\u230b\", \"\\\\lceil\", \"\\\\rceil\", \"\\u2308\", \"\\u2309\", \"<\", \">\", \"\\\\langle\", \"\\u27e8\", \"\\\\rangle\", \"\\u27e9\", \"\\\\lt\", \"\\\\gt\", \"\\\\lvert\", \"\\\\rvert\", \"\\\\lVert\", \"\\\\rVert\", \"\\\\lgroup\", \"\\\\rgroup\", \"\\u27ee\", \"\\u27ef\", \"\\\\lmoustache\", \"\\\\rmoustache\", \"\\u23b0\", \"\\u23b1\", \"/\", \"\\\\backslash\", \"|\", \"\\\\vert\", \"\\\\|\", \"\\\\Vert\", \"\\\\uparrow\", \"\\\\Uparrow\", \"\\\\downarrow\", \"\\\\Downarrow\", \"\\\\updownarrow\", \"\\\\Updownarrow\", \".\"]);\n// Delimiter functions\nfunction checkDelimiter(delim, context) {\n  var symDelim = checkSymbolNodeType(delim);\n  if (symDelim && delimiters.has(symDelim.text)) {\n    return symDelim;\n  } else if (symDelim) {\n    throw new ParseError(\"Invalid delimiter '\" + symDelim.text + \"' after '\" + context.funcName + \"'\", delim);\n  } else {\n    throw new ParseError(\"Invalid delimiter type '\" + delim.type + \"'\", delim);\n  }\n}\ndefineFunction({\n  type: \"delimsizing\",\n  names: [\"\\\\bigl\", \"\\\\Bigl\", \"\\\\biggl\", \"\\\\Biggl\", \"\\\\bigr\", \"\\\\Bigr\", \"\\\\biggr\", \"\\\\Biggr\", \"\\\\bigm\", \"\\\\Bigm\", \"\\\\biggm\", \"\\\\Biggm\", \"\\\\big\", \"\\\\Big\", \"\\\\bigg\", \"\\\\Bigg\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"primitive\"]\n  },\n  handler: (context, args) => {\n    var delim = checkDelimiter(args[0], context);\n    return {\n      type: \"delimsizing\",\n      mode: context.parser.mode,\n      size: delimiterSizes[context.funcName].size,\n      mclass: delimiterSizes[context.funcName].mclass,\n      delim: delim.text\n    };\n  },\n  htmlBuilder: (group, options) => {\n    if (group.delim === \".\") {\n      // Empty delimiters still count as elements, even though they don't\n      // show anything.\n      return makeSpan([group.mclass]);\n    }\n    return makeSizedDelim(group.delim, group.size, options, group.mode, [group.mclass]);\n  },\n  mathmlBuilder: group => {\n    var children = [];\n    if (group.delim !== \".\") {\n      children.push(makeText(group.delim, group.mode));\n    }\n    var node = new MathNode(\"mo\", children);\n    if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n      // Only some of the delimsizing functions act as fences, and they\n      // return \"mopen\" or \"mclose\" mclass.\n      node.setAttribute(\"fence\", \"true\");\n    } else {\n      // Explicitly disable fencing if it's not a fence, to override the\n      // defaults.\n      node.setAttribute(\"fence\", \"false\");\n    }\n    node.setAttribute(\"stretchy\", \"true\");\n    var size = makeEm(sizeToMaxHeight[group.size]);\n    node.setAttribute(\"minsize\", size);\n    node.setAttribute(\"maxsize\", size);\n    return node;\n  }\n});\nfunction assertParsed(group) {\n  if (!group.body) {\n    throw new Error(\"Bug: The leftright ParseNode wasn't fully parsed.\");\n  }\n}\ndefineFunction({\n  type: \"leftright-right\",\n  names: [\"\\\\right\"],\n  props: {\n    numArgs: 1,\n    primitive: true\n  },\n  handler: (context, args) => {\n    // \\left case below triggers parsing of \\right in\n    //   `const right = parser.parseFunction();`\n    // uses this return value.\n    var color = context.parser.gullet.macros.get(\"\\\\current@color\");\n    if (color && typeof color !== \"string\") {\n      throw new ParseError(\"\\\\current@color set to non-string in \\\\right\");\n    }\n    return {\n      type: \"leftright-right\",\n      mode: context.parser.mode,\n      delim: checkDelimiter(args[0], context).text,\n      color: color // undefined if not set via \\color\n    };\n  }\n});\ndefineFunction({\n  type: \"leftright\",\n  names: [\"\\\\left\"],\n  props: {\n    numArgs: 1,\n    primitive: true\n  },\n  handler: (context, args) => {\n    var delim = checkDelimiter(args[0], context);\n    var parser = context.parser;\n    // Parse out the implicit body\n    ++parser.leftrightDepth;\n    // parseExpression stops before '\\\\right'\n    var body = parser.parseExpression(false);\n    --parser.leftrightDepth;\n    // Check the next token\n    parser.expect(\"\\\\right\", false);\n    var right = assertNodeType(parser.parseFunction(), \"leftright-right\");\n    return {\n      type: \"leftright\",\n      mode: parser.mode,\n      body,\n      left: delim.text,\n      right: right.delim,\n      rightColor: right.color\n    };\n  },\n  htmlBuilder: (group, options) => {\n    assertParsed(group);\n    // Build the inner expression\n    var inner = buildExpression$1(group.body, options, true, [\"mopen\", \"mclose\"]);\n    var innerHeight = 0;\n    var innerDepth = 0;\n    var hadMiddle = false;\n    // Calculate its height and depth\n    for (var i = 0; i < inner.length; i++) {\n      // Property `isMiddle` not defined on `span`. See comment in\n      // \"middle\"'s htmlBuilder.\n      // TODO(ts)\n      if (inner[i].isMiddle) {\n        hadMiddle = true;\n      } else {\n        innerHeight = Math.max(inner[i].height, innerHeight);\n        innerDepth = Math.max(inner[i].depth, innerDepth);\n      }\n    }\n    // The size of delimiters is the same, regardless of what style we are\n    // in. Thus, to correctly calculate the size of delimiter we need around\n    // a group, we scale down the inner size based on the size.\n    innerHeight *= options.sizeMultiplier;\n    innerDepth *= options.sizeMultiplier;\n    var leftDelim;\n    if (group.left === \".\") {\n      // Empty delimiters in \\left and \\right make null delimiter spaces.\n      leftDelim = makeNullDelimiter(options, [\"mopen\"]);\n    } else {\n      // Otherwise, use leftRightDelim to generate the correct sized\n      // delimiter.\n      leftDelim = makeLeftRightDelim(group.left, innerHeight, innerDepth, options, group.mode, [\"mopen\"]);\n    }\n    // Add it to the beginning of the expression\n    inner.unshift(leftDelim);\n    // Handle middle delimiters\n    if (hadMiddle) {\n      for (var _i = 1; _i < inner.length; _i++) {\n        var middleDelim = inner[_i];\n        // Property `isMiddle` not defined on `span`. See comment in\n        // \"middle\"'s htmlBuilder.\n        // TODO(ts)\n        var isMiddle = middleDelim.isMiddle;\n        if (isMiddle) {\n          // Apply the options that were active when \\middle was called\n          inner[_i] = makeLeftRightDelim(isMiddle.delim, innerHeight, innerDepth, isMiddle.options, group.mode, []);\n        }\n      }\n    }\n    var rightDelim;\n    // Same for the right delimiter, but using color specified by \\color\n    if (group.right === \".\") {\n      rightDelim = makeNullDelimiter(options, [\"mclose\"]);\n    } else {\n      var colorOptions = group.rightColor ? options.withColor(group.rightColor) : options;\n      rightDelim = makeLeftRightDelim(group.right, innerHeight, innerDepth, colorOptions, group.mode, [\"mclose\"]);\n    }\n    // Add it to the end of the expression.\n    inner.push(rightDelim);\n    return makeSpan([\"minner\"], inner, options);\n  },\n  mathmlBuilder: (group, options) => {\n    assertParsed(group);\n    var inner = buildExpression(group.body, options);\n    if (group.left !== \".\") {\n      var leftNode = new MathNode(\"mo\", [makeText(group.left, group.mode)]);\n      leftNode.setAttribute(\"fence\", \"true\");\n      inner.unshift(leftNode);\n    }\n    if (group.right !== \".\") {\n      var rightNode = new MathNode(\"mo\", [makeText(group.right, group.mode)]);\n      rightNode.setAttribute(\"fence\", \"true\");\n      if (group.rightColor) {\n        rightNode.setAttribute(\"mathcolor\", group.rightColor);\n      }\n      inner.push(rightNode);\n    }\n    return makeRow(inner);\n  }\n});\ndefineFunction({\n  type: \"middle\",\n  names: [\"\\\\middle\"],\n  props: {\n    numArgs: 1,\n    primitive: true\n  },\n  handler: (context, args) => {\n    var delim = checkDelimiter(args[0], context);\n    if (!context.parser.leftrightDepth) {\n      throw new ParseError(\"\\\\middle without preceding \\\\left\", delim);\n    }\n    return {\n      type: \"middle\",\n      mode: context.parser.mode,\n      delim: delim.text\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var middleDelim;\n    if (group.delim === \".\") {\n      middleDelim = makeNullDelimiter(options, []);\n    } else {\n      middleDelim = makeSizedDelim(group.delim, 1, options, group.mode, []);\n      var isMiddle = {\n        delim: group.delim,\n        options\n      };\n      // Property `isMiddle` not defined on `span`. It is only used in\n      // this file above.\n      // TODO: Fix this violation of the `span` type and possibly rename\n      // things since `isMiddle` sounds like a boolean, but is a struct.\n      // TODO(ts)\n      middleDelim.isMiddle = isMiddle;\n    }\n    return middleDelim;\n  },\n  mathmlBuilder: (group, options) => {\n    // A Firefox \\middle will stretch a character vertically only if it\n    // is in the fence part of the operator dictionary at:\n    // https://www.w3.org/TR/MathML3/appendixc.html.\n    // So we need to avoid U+2223 and use plain \"|\" instead.\n    var textNode = group.delim === \"\\\\vert\" || group.delim === \"|\" ? makeText(\"|\", \"text\") : makeText(group.delim, group.mode);\n    var middleNode = new MathNode(\"mo\", [textNode]);\n    middleNode.setAttribute(\"fence\", \"true\");\n    // MathML gives 5/18em spacing to each <mo> element.\n    // \\middle should get delimiter spacing instead.\n    middleNode.setAttribute(\"lspace\", \"0.05em\");\n    middleNode.setAttribute(\"rspace\", \"0.05em\");\n    return middleNode;\n  }\n});\n\nvar htmlBuilder$7 = (group, options) => {\n  // \\cancel, \\bcancel, \\xcancel, \\sout, \\fbox, \\colorbox, \\fcolorbox, \\phase\n  // Some groups can return document fragments.  Handle those by wrapping\n  // them in a span.\n  var inner = wrapFragment(buildGroup$1(group.body, options), options);\n  var label = group.label.slice(1);\n  var scale = options.sizeMultiplier;\n  var img;\n  var imgShift = 0;\n  // In the LaTeX cancel package, line geometry is slightly different\n  // depending on whether the subject is wider than it is tall, or vice versa.\n  // We don't know the width of a group, so as a proxy, we test if\n  // the subject is a single character. This captures most of the\n  // subjects that should get the \"tall\" treatment.\n  var isSingleChar = isCharacterBox(group.body);\n  if (label === \"sout\") {\n    img = makeSpan([\"stretchy\", \"sout\"]);\n    img.height = options.fontMetrics().defaultRuleThickness / scale;\n    imgShift = -0.5 * options.fontMetrics().xHeight;\n  } else if (label === \"phase\") {\n    // Set a couple of dimensions from the steinmetz package.\n    var lineWeight = calculateSize({\n      number: 0.6,\n      unit: \"pt\"\n    }, options);\n    var clearance = calculateSize({\n      number: 0.35,\n      unit: \"ex\"\n    }, options);\n    // Prevent size changes like \\Huge from affecting line thickness\n    var newOptions = options.havingBaseSizing();\n    scale = scale / newOptions.sizeMultiplier;\n    var angleHeight = inner.height + inner.depth + lineWeight + clearance;\n    // Reserve a left pad for the angle.\n    inner.style.paddingLeft = makeEm(angleHeight / 2 + lineWeight);\n    // Create an SVG\n    var viewBoxHeight = Math.floor(1000 * angleHeight * scale);\n    var path = phasePath(viewBoxHeight);\n    var svgNode = new SvgNode([new PathNode(\"phase\", path)], {\n      \"width\": \"400em\",\n      \"height\": makeEm(viewBoxHeight / 1000),\n      \"viewBox\": \"0 0 400000 \" + viewBoxHeight,\n      \"preserveAspectRatio\": \"xMinYMin slice\"\n    });\n    // Wrap it in a span with overflow: hidden.\n    img = makeSvgSpan([\"hide-tail\"], [svgNode], options);\n    img.style.height = makeEm(angleHeight);\n    imgShift = inner.depth + lineWeight + clearance;\n  } else {\n    // Add horizontal padding\n    if (/cancel/.test(label)) {\n      if (!isSingleChar) {\n        inner.classes.push(\"cancel-pad\");\n      }\n    } else if (label === \"angl\") {\n      inner.classes.push(\"anglpad\");\n    } else {\n      inner.classes.push(\"boxpad\");\n    }\n    // Add vertical padding\n    var topPad = 0;\n    var bottomPad = 0;\n    var ruleThickness = 0;\n    // ref: cancel package: \\advance\\totalheight2\\p@ % \"+2\"\n    if (/box/.test(label)) {\n      ruleThickness = Math.max(options.fontMetrics().fboxrule,\n      // default\n      options.minRuleThickness);\n      topPad = options.fontMetrics().fboxsep + (label === \"colorbox\" ? 0 : ruleThickness);\n      bottomPad = topPad;\n    } else if (label === \"angl\") {\n      ruleThickness = Math.max(options.fontMetrics().defaultRuleThickness, options.minRuleThickness);\n      topPad = 4 * ruleThickness; // gap = 3 × line, plus the line itself.\n      bottomPad = Math.max(0, 0.25 - inner.depth);\n    } else {\n      topPad = isSingleChar ? 0.2 : 0;\n      bottomPad = topPad;\n    }\n    img = stretchyEnclose(inner, label, topPad, bottomPad, options);\n    if (/fbox|boxed|fcolorbox/.test(label)) {\n      img.style.borderStyle = \"solid\";\n      img.style.borderWidth = makeEm(ruleThickness);\n    } else if (label === \"angl\" && ruleThickness !== 0.049) {\n      img.style.borderTopWidth = makeEm(ruleThickness);\n      img.style.borderRightWidth = makeEm(ruleThickness);\n    }\n    imgShift = inner.depth + bottomPad;\n    if (group.backgroundColor) {\n      img.style.backgroundColor = group.backgroundColor;\n      if (group.borderColor) {\n        img.style.borderColor = group.borderColor;\n      }\n    }\n  }\n  var vlist;\n  if (group.backgroundColor) {\n    vlist = makeVList({\n      positionType: \"individualShift\",\n      children: [\n      // Put the color background behind inner;\n      {\n        type: \"elem\",\n        elem: img,\n        shift: imgShift\n      }, {\n        type: \"elem\",\n        elem: inner,\n        shift: 0\n      }]\n    });\n  } else {\n    var classes = /cancel|phase/.test(label) ? [\"svg-align\"] : [];\n    vlist = makeVList({\n      positionType: \"individualShift\",\n      children: [\n      // Write the \\cancel stroke on top of inner.\n      {\n        type: \"elem\",\n        elem: inner,\n        shift: 0\n      }, {\n        type: \"elem\",\n        elem: img,\n        shift: imgShift,\n        wrapperClasses: classes\n      }]\n    });\n  }\n  if (/cancel/.test(label)) {\n    // The cancel package documentation says that cancel lines add their height\n    // to the expression, but tests show that isn't how it actually works.\n    vlist.height = inner.height;\n    vlist.depth = inner.depth;\n  }\n  if (/cancel/.test(label) && !isSingleChar) {\n    // cancel does not create horiz space for its line extension.\n    return makeSpan([\"mord\", \"cancel-lap\"], [vlist], options);\n  } else {\n    return makeSpan([\"mord\"], [vlist], options);\n  }\n};\nvar mathmlBuilder$6 = (group, options) => {\n  var fboxsep = 0;\n  var node = new MathNode(group.label.includes(\"colorbox\") ? \"mpadded\" : \"menclose\", [buildGroup(group.body, options)]);\n  switch (group.label) {\n    case \"\\\\cancel\":\n      node.setAttribute(\"notation\", \"updiagonalstrike\");\n      break;\n    case \"\\\\bcancel\":\n      node.setAttribute(\"notation\", \"downdiagonalstrike\");\n      break;\n    case \"\\\\phase\":\n      node.setAttribute(\"notation\", \"phasorangle\");\n      break;\n    case \"\\\\sout\":\n      node.setAttribute(\"notation\", \"horizontalstrike\");\n      break;\n    case \"\\\\fbox\":\n      node.setAttribute(\"notation\", \"box\");\n      break;\n    case \"\\\\angl\":\n      node.setAttribute(\"notation\", \"actuarial\");\n      break;\n    case \"\\\\fcolorbox\":\n    case \"\\\\colorbox\":\n      // <menclose> doesn't have a good notation option. So use <mpadded>\n      // instead. Set some attributes that come included with <menclose>.\n      fboxsep = options.fontMetrics().fboxsep * options.fontMetrics().ptPerEm;\n      node.setAttribute(\"width\", \"+\" + 2 * fboxsep + \"pt\");\n      node.setAttribute(\"height\", \"+\" + 2 * fboxsep + \"pt\");\n      node.setAttribute(\"lspace\", fboxsep + \"pt\"); //\n      node.setAttribute(\"voffset\", fboxsep + \"pt\");\n      if (group.label === \"\\\\fcolorbox\") {\n        var thk = Math.max(options.fontMetrics().fboxrule,\n        // default\n        options.minRuleThickness);\n        node.setAttribute(\"style\", \"border: \" + makeEm(thk) + \" solid \" + group.borderColor);\n      }\n      break;\n    case \"\\\\xcancel\":\n      node.setAttribute(\"notation\", \"updiagonalstrike downdiagonalstrike\");\n      break;\n  }\n  if (group.backgroundColor) {\n    node.setAttribute(\"mathbackground\", group.backgroundColor);\n  }\n  return node;\n};\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\colorbox\"],\n  props: {\n    numArgs: 2,\n    allowedInText: true,\n    argTypes: [\"color\", \"text\"]\n  },\n  handler(_ref, args, optArgs) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var color = assertNodeType(args[0], \"color-token\").color;\n    var body = args[1];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      backgroundColor: color,\n      body\n    };\n  },\n  htmlBuilder: htmlBuilder$7,\n  mathmlBuilder: mathmlBuilder$6\n});\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\fcolorbox\"],\n  props: {\n    numArgs: 3,\n    allowedInText: true,\n    argTypes: [\"color\", \"color\", \"text\"]\n  },\n  handler(_ref2, args, optArgs) {\n    var {\n      parser,\n      funcName\n    } = _ref2;\n    var borderColor = assertNodeType(args[0], \"color-token\").color;\n    var backgroundColor = assertNodeType(args[1], \"color-token\").color;\n    var body = args[2];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      backgroundColor,\n      borderColor,\n      body\n    };\n  },\n  htmlBuilder: htmlBuilder$7,\n  mathmlBuilder: mathmlBuilder$6\n});\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\fbox\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"hbox\"],\n    allowedInText: true\n  },\n  handler(_ref3, args) {\n    var {\n      parser\n    } = _ref3;\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: \"\\\\fbox\",\n      body: args[0]\n    };\n  }\n});\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\cancel\", \"\\\\bcancel\", \"\\\\xcancel\", \"\\\\phase\"],\n  props: {\n    numArgs: 1\n  },\n  handler(_ref4, args) {\n    var {\n      parser,\n      funcName\n    } = _ref4;\n    var body = args[0];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      body\n    };\n  },\n  htmlBuilder: htmlBuilder$7,\n  mathmlBuilder: mathmlBuilder$6\n});\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\sout\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler(_ref5, args) {\n    var {\n      parser,\n      funcName\n    } = _ref5;\n    if (parser.mode === \"math\") {\n      parser.settings.reportNonstrict(\"mathVsSout\", \"LaTeX's \\\\sout works only in text mode\");\n    }\n    var body = args[0];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      body\n    };\n  },\n  htmlBuilder: htmlBuilder$7,\n  mathmlBuilder: mathmlBuilder$6\n});\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\angl\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"hbox\"],\n    allowedInText: false\n  },\n  handler(_ref6, args) {\n    var {\n      parser\n    } = _ref6;\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: \"\\\\angl\",\n      body: args[0]\n    };\n  }\n});\n\n/**\n * All registered environments.\n * `environments.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `environments.js`.\n */\nvar _environments = {};\nfunction defineEnvironment(_ref) {\n  var {\n    type,\n    names,\n    props,\n    handler,\n    htmlBuilder,\n    mathmlBuilder\n  } = _ref;\n  // Set default values of environments.\n  var data = {\n    type,\n    numArgs: props.numArgs || 0,\n    allowedInText: false,\n    numOptionalArgs: 0,\n    handler\n  };\n  for (var i = 0; i < names.length; ++i) {\n    // TODO: The value type of _environments should be a type union of all\n    // possible `EnvSpec<>` possibilities instead of `EnvSpec<*>`, which is\n    // an existential type.\n    _environments[names[i]] = data;\n  }\n  if (htmlBuilder) {\n    _htmlGroupBuilders[type] = htmlBuilder;\n  }\n  if (mathmlBuilder) {\n    _mathmlGroupBuilders[type] = mathmlBuilder;\n  }\n}\n\n/**\n * All registered global/built-in macros.\n * `macros.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `macros.js`.\n */\nvar _macros = {};\n// This function might one day accept an additional argument and do more things.\nfunction defineMacro(name, body) {\n  _macros[name] = body;\n}\n\n/**\n * Lexing or parsing positional information for error reporting.\n * This object is immutable.\n */\nclass SourceLocation {\n  // The + prefix indicates that these fields aren't writeable\n  // Lexer holding the input string.\n  // Start offset, zero-based inclusive.\n  // End offset, zero-based exclusive.\n  constructor(lexer, start, end) {\n    this.lexer = lexer;\n    this.start = start;\n    this.end = end;\n  }\n  /**\n   * Merges two `SourceLocation`s from location providers, given they are\n   * provided in order of appearance.\n   * - Returns the first one's location if only the first is provided.\n   * - Returns a merged range of the first and the last if both are provided\n   *   and their lexers match.\n   * - Otherwise, returns null.\n   */\n  static range(first, second) {\n    if (!second) {\n      return first && first.loc;\n    } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) {\n      return null;\n    } else {\n      return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end);\n    }\n  }\n}\n\n/**\n * The resulting token returned from `lex`.\n *\n * It consists of the token text plus some position information.\n * The position information is essentially a range in an input string,\n * but instead of referencing the bare input string, we refer to the lexer.\n * That way it is possible to attach extra metadata to the input string,\n * like for example a file name or similar.\n *\n * The position information is optional, so it is OK to construct synthetic\n * tokens if appropriate. Not providing available position information may\n * lead to degraded error reporting, though.\n */\nclass Token {\n  // don't expand the token\n  // used in \\noexpand\n  constructor(text,\n  // the text of this token\n  loc) {\n    this.text = text;\n    this.loc = loc;\n  }\n  /**\n   * Given a pair of tokens (this and endToken), compute a `Token` encompassing\n   * the whole input range enclosed by these two.\n   */\n  range(endToken,\n  // last token of the range, inclusive\n  text) {\n    return new Token(text, SourceLocation.range(this, endToken));\n  }\n}\n\n// Helper functions\nfunction getHLines(parser) {\n  // Return an array. The array length = number of hlines.\n  // Each element in the array tells if the line is dashed.\n  var hlineInfo = [];\n  parser.consumeSpaces();\n  var nxt = parser.fetch().text;\n  if (nxt === \"\\\\relax\") {\n    // \\relax is an artifact of the \\cr macro below\n    parser.consume();\n    parser.consumeSpaces();\n    nxt = parser.fetch().text;\n  }\n  while (nxt === \"\\\\hline\" || nxt === \"\\\\hdashline\") {\n    parser.consume();\n    hlineInfo.push(nxt === \"\\\\hdashline\");\n    parser.consumeSpaces();\n    nxt = parser.fetch().text;\n  }\n  return hlineInfo;\n}\nvar validateAmsEnvironmentContext = context => {\n  var settings = context.parser.settings;\n  if (!settings.displayMode) {\n    throw new ParseError(\"{\" + context.envName + \"} can be used only in\" + \" display mode.\");\n  }\n};\nvar gatherEnvironments = new Set([\"gather\", \"gather*\"]);\n// autoTag (an argument to parseArray) can be one of three values:\n// * undefined: Regular (not-top-level) array; no tags on each row\n// * true: Automatic equation numbering, overridable by \\tag\n// * false: Tags allowed on each row, but no automatic numbering\n// This function *doesn't* work with the \"split\" environment name.\nfunction getAutoTag(name) {\n  if (!name.includes(\"ed\")) {\n    return !name.includes(\"*\");\n  }\n  // return undefined;\n}\n/**\n * Parse the body of the environment, with rows delimited by \\\\ and\n * columns delimited by &, and create a nested list in row-major order\n * with one group per cell.  If given an optional argument style\n * (\"text\", \"display\", etc.), then each cell is cast into that style.\n */\nfunction parseArray(parser, _ref, style) {\n  var {\n    hskipBeforeAndAfter,\n    addJot,\n    cols,\n    arraystretch,\n    colSeparationType,\n    autoTag,\n    singleRow,\n    emptySingleRow,\n    maxNumCols,\n    leqno\n  } = _ref;\n  parser.gullet.beginGroup();\n  if (!singleRow) {\n    // \\cr is equivalent to \\\\ without the optional size argument (see below)\n    // TODO: provide helpful error when \\cr is used outside array environment\n    parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n  }\n  // Get current arraystretch if it's not set by the environment\n  if (!arraystretch) {\n    var stretch = parser.gullet.expandMacroAsText(\"\\\\arraystretch\");\n    if (stretch == null) {\n      // Default \\arraystretch from lttab.dtx\n      arraystretch = 1;\n    } else {\n      arraystretch = parseFloat(stretch);\n      if (!arraystretch || arraystretch < 0) {\n        throw new ParseError(\"Invalid \\\\arraystretch: \" + stretch);\n      }\n    }\n  }\n  // Start group for first cell\n  parser.gullet.beginGroup();\n  var row = [];\n  var body = [row];\n  var rowGaps = [];\n  var hLinesBeforeRow = [];\n  var tags = autoTag != null ? [] : undefined;\n  // amsmath uses \\global\\@eqnswtrue and \\global\\@eqnswfalse to represent\n  // whether this row should have an equation number.  Simulate this with\n  // a \\@eqnsw macro set to 1 or 0.\n  function beginRow() {\n    if (autoTag) {\n      parser.gullet.macros.set(\"\\\\@eqnsw\", \"1\", true);\n    }\n  }\n  function endRow() {\n    if (tags) {\n      if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n        tags.push(parser.subparse([new Token(\"\\\\df@tag\")]));\n        parser.gullet.macros.set(\"\\\\df@tag\", undefined, true);\n      } else {\n        tags.push(Boolean(autoTag) && parser.gullet.macros.get(\"\\\\@eqnsw\") === \"1\");\n      }\n    }\n  }\n  beginRow();\n  // Test for \\hline at the top of the array.\n  hLinesBeforeRow.push(getHLines(parser));\n  while (true) {\n    // eslint-disable-line no-constant-condition\n    // Parse each cell in its own group (namespace)\n    var cellBody = parser.parseExpression(false, singleRow ? \"\\\\end\" : \"\\\\\\\\\");\n    parser.gullet.endGroup();\n    parser.gullet.beginGroup();\n    var cell = {\n      type: \"ordgroup\",\n      mode: parser.mode,\n      body: cellBody\n    };\n    if (style) {\n      cell = {\n        type: \"styling\",\n        mode: parser.mode,\n        style,\n        body: [cell]\n      };\n    }\n    row.push(cell);\n    var next = parser.fetch().text;\n    if (next === \"&\") {\n      if (maxNumCols && row.length === maxNumCols) {\n        if (singleRow || colSeparationType) {\n          // {equation} or {split}\n          throw new ParseError(\"Too many tab characters: &\", parser.nextToken);\n        } else {\n          // {array} environment\n          parser.settings.reportNonstrict(\"textEnv\", \"Too few columns \" + \"specified in the {array} column argument.\");\n        }\n      }\n      parser.consume();\n    } else if (next === \"\\\\end\") {\n      endRow();\n      // Arrays terminate newlines with `\\crcr` which consumes a `\\cr` if\n      // the last line is empty.  However, AMS environments keep the\n      // empty row if it's the only one.\n      // NOTE: Currently, `cell` is the last item added into `row`.\n      if (row.length === 1 && cell.type === \"styling\" && cell.body.length === 1 && cell.body[0].type === \"ordgroup\" && cell.body[0].body.length === 0 && (body.length > 1 || !emptySingleRow)) {\n        body.pop();\n      }\n      if (hLinesBeforeRow.length < body.length + 1) {\n        hLinesBeforeRow.push([]);\n      }\n      break;\n    } else if (next === \"\\\\\\\\\") {\n      parser.consume();\n      var size = void 0;\n      // \\def\\Let@{\\let\\\\\\math@cr}\n      // \\def\\math@cr{...\\math@cr@}\n      // \\def\\math@cr@{\\new@ifnextchar[\\math@cr@@{\\math@cr@@[\\z@]}}\n      // \\def\\math@cr@@[#1]{...\\math@cr@@@...}\n      // \\def\\math@cr@@@{\\cr}\n      if (parser.gullet.future().text !== \" \") {\n        size = parser.parseSizeGroup(true);\n      }\n      rowGaps.push(size ? size.value : null);\n      endRow();\n      // check for \\hline(s) following the row separator\n      hLinesBeforeRow.push(getHLines(parser));\n      row = [];\n      body.push(row);\n      beginRow();\n    } else {\n      throw new ParseError(\"Expected & or \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n    }\n  }\n  // End cell group\n  parser.gullet.endGroup();\n  // End array group defining \\cr\n  parser.gullet.endGroup();\n  return {\n    type: \"array\",\n    mode: parser.mode,\n    addJot,\n    arraystretch,\n    body,\n    cols,\n    rowGaps,\n    hskipBeforeAndAfter,\n    hLinesBeforeRow,\n    colSeparationType,\n    tags,\n    leqno\n  };\n}\n// Decides on a style for cells in an array according to whether the given\n// environment name starts with the letter 'd'.\nfunction dCellStyle(envName) {\n  if (envName.slice(0, 1) === \"d\") {\n    return \"display\";\n  } else {\n    return \"text\";\n  }\n}\nvar htmlBuilder$6 = function htmlBuilder(group, options) {\n  var r;\n  var c;\n  var nr = group.body.length;\n  var hLinesBeforeRow = group.hLinesBeforeRow;\n  var nc = 0;\n  var body = new Array(nr);\n  var hlines = [];\n  var ruleThickness = Math.max(\n  // From LaTeX \\showthe\\arrayrulewidth. Equals 0.04 em.\n  options.fontMetrics().arrayRuleWidth, options.minRuleThickness);\n  // Horizontal spacing\n  var pt = 1 / options.fontMetrics().ptPerEm;\n  var arraycolsep = 5 * pt; // default value, i.e. \\arraycolsep in article.cls\n  if (group.colSeparationType && group.colSeparationType === \"small\") {\n    // We're in a {smallmatrix}. Default column space is \\thickspace,\n    // i.e. 5/18em = 0.2778em, per amsmath.dtx for {smallmatrix}.\n    // But that needs adjustment because LaTeX applies \\scriptstyle to the\n    // entire array, including the colspace, but this function applies\n    // \\scriptstyle only inside each element.\n    var localMultiplier = options.havingStyle(Style$1.SCRIPT).sizeMultiplier;\n    arraycolsep = 0.2778 * (localMultiplier / options.sizeMultiplier);\n  }\n  // Vertical spacing\n  var baselineskip = group.colSeparationType === \"CD\" ? calculateSize({\n    number: 3,\n    unit: \"ex\"\n  }, options) : 12 * pt; // see size10.clo\n  // Default \\jot from ltmath.dtx\n  // TODO(edemaine): allow overriding \\jot via \\setlength (#687)\n  var jot = 3 * pt;\n  var arrayskip = group.arraystretch * baselineskip;\n  var arstrutHeight = 0.7 * arrayskip; // \\strutbox in ltfsstrc.dtx and\n  var arstrutDepth = 0.3 * arrayskip; // \\@arstrutbox in lttab.dtx\n  var totalHeight = 0;\n  // Set a position for \\hline(s) at the top of the array, if any.\n  function setHLinePos(hlinesInGap) {\n    for (var i = 0; i < hlinesInGap.length; ++i) {\n      if (i > 0) {\n        totalHeight += 0.25;\n      }\n      hlines.push({\n        pos: totalHeight,\n        isDashed: hlinesInGap[i]\n      });\n    }\n  }\n  setHLinePos(hLinesBeforeRow[0]);\n  for (r = 0; r < group.body.length; ++r) {\n    var inrow = group.body[r];\n    var height = arstrutHeight; // \\@array adds an \\@arstrut\n    var depth = arstrutDepth; // to each tow (via the template)\n    if (nc < inrow.length) {\n      nc = inrow.length;\n    }\n    var outrow = new Array(inrow.length);\n    for (c = 0; c < inrow.length; ++c) {\n      var elt = buildGroup$1(inrow[c], options);\n      if (depth < elt.depth) {\n        depth = elt.depth;\n      }\n      if (height < elt.height) {\n        height = elt.height;\n      }\n      outrow[c] = elt;\n    }\n    var rowGap = group.rowGaps[r];\n    var gap = 0;\n    if (rowGap) {\n      gap = calculateSize(rowGap, options);\n      if (gap > 0) {\n        // \\@argarraycr\n        gap += arstrutDepth;\n        if (depth < gap) {\n          depth = gap; // \\@xargarraycr\n        }\n        gap = 0;\n      }\n    }\n    // In AMS multiline environments such as aligned and gathered, rows\n    // correspond to lines that have additional \\jot added between lines\n    // via \\openup.\n    // We simulate this by adding \\jot depth to each row except the last.\n    if (group.addJot && r < group.body.length - 1) {\n      depth += jot;\n    }\n    outrow.height = height;\n    outrow.depth = depth;\n    totalHeight += height;\n    outrow.pos = totalHeight;\n    totalHeight += depth + gap; // \\@yargarraycr\n    body[r] = outrow;\n    // Set a position for \\hline(s), if any.\n    setHLinePos(hLinesBeforeRow[r + 1]);\n  }\n  var offset = totalHeight / 2 + options.fontMetrics().axisHeight;\n  var colDescriptions = group.cols || [];\n  var cols = [];\n  var colSep;\n  var colDescrNum;\n  var tagSpans = [];\n  if (group.tags && group.tags.some(tag => tag)) {\n    // An environment with manual tags and/or automatic equation numbers.\n    // Create node(s), the latter of which trigger CSS counter increment.\n    for (r = 0; r < nr; ++r) {\n      var rw = body[r];\n      var shift = rw.pos - offset;\n      var tag = group.tags[r];\n      var tagSpan = void 0;\n      if (tag === true) {\n        // automatic numbering\n        tagSpan = makeSpan([\"eqn-num\"], [], options);\n      } else if (tag === false) {\n        // \\nonumber/\\notag or starred environment\n        tagSpan = makeSpan([], [], options);\n      } else {\n        // manual \\tag\n        tagSpan = makeSpan([], buildExpression$1(tag, options, true), options);\n      }\n      tagSpan.depth = rw.depth;\n      tagSpan.height = rw.height;\n      tagSpans.push({\n        type: \"elem\",\n        elem: tagSpan,\n        shift\n      });\n    }\n  }\n  for (c = 0, colDescrNum = 0;\n  // Continue while either there are more columns or more column\n  // descriptions, so trailing separators don't get lost.\n  c < nc || colDescrNum < colDescriptions.length; ++c, ++colDescrNum) {\n    var _colDescr3;\n    var colDescr = colDescriptions[colDescrNum];\n    var firstSeparator = true;\n    while (((_colDescr = colDescr) == null ? void 0 : _colDescr.type) === \"separator\") {\n      var _colDescr;\n      // If there is more than one separator in a row, add a space\n      // between them.\n      if (!firstSeparator) {\n        colSep = makeSpan([\"arraycolsep\"], []);\n        colSep.style.width = makeEm(options.fontMetrics().doubleRuleSep);\n        cols.push(colSep);\n      }\n      if (colDescr.separator === \"|\" || colDescr.separator === \":\") {\n        var lineType = colDescr.separator === \"|\" ? \"solid\" : \"dashed\";\n        var separator = makeSpan([\"vertical-separator\"], [], options);\n        separator.style.height = makeEm(totalHeight);\n        separator.style.borderRightWidth = makeEm(ruleThickness);\n        separator.style.borderRightStyle = lineType;\n        separator.style.margin = \"0 \" + makeEm(-ruleThickness / 2);\n        var _shift = totalHeight - offset;\n        if (_shift) {\n          separator.style.verticalAlign = makeEm(-_shift);\n        }\n        cols.push(separator);\n      } else {\n        throw new ParseError(\"Invalid separator type: \" + colDescr.separator);\n      }\n      colDescrNum++;\n      colDescr = colDescriptions[colDescrNum];\n      firstSeparator = false;\n    }\n    if (c >= nc) {\n      continue;\n    }\n    var sepwidth = void 0;\n    if (c > 0 || group.hskipBeforeAndAfter) {\n      var _colDescr$pregap, _colDescr2;\n      sepwidth = (_colDescr$pregap = (_colDescr2 = colDescr) == null ? void 0 : _colDescr2.pregap) != null ? _colDescr$pregap : arraycolsep;\n      if (sepwidth !== 0) {\n        colSep = makeSpan([\"arraycolsep\"], []);\n        colSep.style.width = makeEm(sepwidth);\n        cols.push(colSep);\n      }\n    }\n    var colElems = [];\n    for (r = 0; r < nr; ++r) {\n      var row = body[r];\n      var elem = row[c];\n      if (!elem) {\n        continue;\n      }\n      var _shift2 = row.pos - offset;\n      elem.depth = row.depth;\n      elem.height = row.height;\n      colElems.push({\n        type: \"elem\",\n        elem: elem,\n        shift: _shift2\n      });\n    }\n    var colVList = makeVList({\n      positionType: \"individualShift\",\n      children: colElems\n    });\n    var colSpan = makeSpan([\"col-align-\" + (((_colDescr3 = colDescr) == null ? void 0 : _colDescr3.align) || \"c\")], [colVList]);\n    cols.push(colSpan);\n    if (c < nc - 1 || group.hskipBeforeAndAfter) {\n      var _colDescr$postgap, _colDescr4;\n      sepwidth = (_colDescr$postgap = (_colDescr4 = colDescr) == null ? void 0 : _colDescr4.postgap) != null ? _colDescr$postgap : arraycolsep;\n      if (sepwidth !== 0) {\n        colSep = makeSpan([\"arraycolsep\"], []);\n        colSep.style.width = makeEm(sepwidth);\n        cols.push(colSep);\n      }\n    }\n  }\n  var tableBody = makeSpan([\"mtable\"], cols);\n  // Add \\hline(s), if any.\n  if (hlines.length > 0) {\n    var line = makeLineSpan(\"hline\", options, ruleThickness);\n    var dashes = makeLineSpan(\"hdashline\", options, ruleThickness);\n    var vListElems = [{\n      type: \"elem\",\n      elem: tableBody,\n      shift: 0\n    }];\n    while (hlines.length > 0) {\n      var hline = hlines.pop();\n      var lineShift = hline.pos - offset;\n      if (hline.isDashed) {\n        vListElems.push({\n          type: \"elem\",\n          elem: dashes,\n          shift: lineShift\n        });\n      } else {\n        vListElems.push({\n          type: \"elem\",\n          elem: line,\n          shift: lineShift\n        });\n      }\n    }\n    tableBody = makeVList({\n      positionType: \"individualShift\",\n      children: vListElems\n    });\n  }\n  if (tagSpans.length === 0) {\n    return makeSpan([\"mord\"], [tableBody], options);\n  } else {\n    var eqnNumCol = makeVList({\n      positionType: \"individualShift\",\n      children: tagSpans\n    });\n    var tagCol = makeSpan([\"tag\"], [eqnNumCol], options);\n    return makeFragment([tableBody, tagCol]);\n  }\n};\nvar alignMap = {\n  c: \"center \",\n  l: \"left \",\n  r: \"right \"\n};\nvar mathmlBuilder$5 = function mathmlBuilder(group, options) {\n  var tbl = [];\n  var glue = new MathNode(\"mtd\", [], [\"mtr-glue\"]);\n  var tag = new MathNode(\"mtd\", [], [\"mml-eqn-num\"]);\n  for (var i = 0; i < group.body.length; i++) {\n    var rw = group.body[i];\n    var row = [];\n    for (var j = 0; j < rw.length; j++) {\n      row.push(new MathNode(\"mtd\", [buildGroup(rw[j], options)]));\n    }\n    if (group.tags && group.tags[i]) {\n      row.unshift(glue);\n      row.push(glue);\n      if (group.leqno) {\n        row.unshift(tag);\n      } else {\n        row.push(tag);\n      }\n    }\n    tbl.push(new MathNode(\"mtr\", row));\n  }\n  var table = new MathNode(\"mtable\", tbl);\n  // Set column alignment, row spacing, column spacing, and\n  // array lines by setting attributes on the table element.\n  // Set the row spacing. In MathML, we specify a gap distance.\n  // We do not use rowGap[] because MathML automatically increases\n  // cell height with the height/depth of the element content.\n  // LaTeX \\arraystretch multiplies the row baseline-to-baseline distance.\n  // We simulate this by adding (arraystretch - 1)em to the gap. This\n  // does a reasonable job of adjusting arrays containing 1 em tall content.\n  // The 0.16 and 0.09 values are found empirically. They produce an array\n  // similar to LaTeX and in which content does not interfere with \\hlines.\n  var gap = group.arraystretch === 0.5 ? 0.1 // {smallmatrix}, {subarray}\n  : 0.16 + group.arraystretch - 1 + (group.addJot ? 0.09 : 0);\n  table.setAttribute(\"rowspacing\", makeEm(gap));\n  // MathML table lines go only between cells.\n  // To place a line on an edge we'll use <menclose>, if necessary.\n  var menclose = \"\";\n  var align = \"\";\n  if (group.cols && group.cols.length > 0) {\n    // Find column alignment, column spacing, and  vertical lines.\n    var cols = group.cols;\n    var columnLines = \"\";\n    var prevTypeWasAlign = false;\n    var iStart = 0;\n    var iEnd = cols.length;\n    if (cols[0].type === \"separator\") {\n      menclose += \"top \";\n      iStart = 1;\n    }\n    if (cols[cols.length - 1].type === \"separator\") {\n      menclose += \"bottom \";\n      iEnd -= 1;\n    }\n    for (var _i = iStart; _i < iEnd; _i++) {\n      var col = cols[_i];\n      if (col.type === \"align\") {\n        align += alignMap[col.align];\n        if (prevTypeWasAlign) {\n          columnLines += \"none \";\n        }\n        prevTypeWasAlign = true;\n      } else if (col.type === \"separator\") {\n        // MathML accepts only single lines between cells.\n        // So we read only the first of consecutive separators.\n        if (prevTypeWasAlign) {\n          columnLines += col.separator === \"|\" ? \"solid \" : \"dashed \";\n          prevTypeWasAlign = false;\n        }\n      }\n    }\n    table.setAttribute(\"columnalign\", align.trim());\n    if (/[sd]/.test(columnLines)) {\n      table.setAttribute(\"columnlines\", columnLines.trim());\n    }\n  }\n  // Set column spacing.\n  if (group.colSeparationType === \"align\") {\n    var _cols = group.cols || [];\n    var spacing = \"\";\n    for (var _i2 = 1; _i2 < _cols.length; _i2++) {\n      spacing += _i2 % 2 ? \"0em \" : \"1em \";\n    }\n    table.setAttribute(\"columnspacing\", spacing.trim());\n  } else if (group.colSeparationType === \"alignat\" || group.colSeparationType === \"gather\") {\n    table.setAttribute(\"columnspacing\", \"0em\");\n  } else if (group.colSeparationType === \"small\") {\n    table.setAttribute(\"columnspacing\", \"0.2778em\");\n  } else if (group.colSeparationType === \"CD\") {\n    table.setAttribute(\"columnspacing\", \"0.5em\");\n  } else {\n    table.setAttribute(\"columnspacing\", \"1em\");\n  }\n  // Address \\hline and \\hdashline\n  var rowLines = \"\";\n  var hlines = group.hLinesBeforeRow;\n  menclose += hlines[0].length > 0 ? \"left \" : \"\";\n  menclose += hlines[hlines.length - 1].length > 0 ? \"right \" : \"\";\n  for (var _i3 = 1; _i3 < hlines.length - 1; _i3++) {\n    rowLines += hlines[_i3].length === 0 ? \"none \"\n    // MathML accepts only a single line between rows. Read one element.\n    : hlines[_i3][0] ? \"dashed \" : \"solid \";\n  }\n  if (/[sd]/.test(rowLines)) {\n    table.setAttribute(\"rowlines\", rowLines.trim());\n  }\n  if (menclose !== \"\") {\n    table = new MathNode(\"menclose\", [table]);\n    table.setAttribute(\"notation\", menclose.trim());\n  }\n  if (group.arraystretch && group.arraystretch < 1) {\n    // A small array. Wrap in scriptstyle so row gap is not too large.\n    table = new MathNode(\"mstyle\", [table]);\n    table.setAttribute(\"scriptlevel\", \"1\");\n  }\n  return table;\n};\n// Convenience function for align, align*, aligned, alignat, alignat*, alignedat.\nvar alignedHandler = function alignedHandler(context, args) {\n  if (!context.envName.includes(\"ed\")) {\n    validateAmsEnvironmentContext(context);\n  }\n  var cols = [];\n  var separationType = context.envName.includes(\"at\") ? \"alignat\" : \"align\";\n  var isSplit = context.envName === \"split\";\n  var res = parseArray(context.parser, {\n    cols,\n    addJot: true,\n    autoTag: isSplit ? undefined : getAutoTag(context.envName),\n    emptySingleRow: true,\n    colSeparationType: separationType,\n    maxNumCols: isSplit ? 2 : undefined,\n    leqno: context.parser.settings.leqno\n  }, \"display\");\n  // Determining number of columns.\n  // 1. If the first argument is given, we use it as a number of columns,\n  //    and makes sure that each row doesn't exceed that number.\n  // 2. Otherwise, just count number of columns = maximum number\n  //    of cells in each row (\"aligned\" mode -- isAligned will be true).\n  //\n  // At the same time, prepend empty group {} at beginning of every second\n  // cell in each row (starting with second cell) so that operators become\n  // binary.  This behavior is implemented in amsmath's \\start@aligned.\n  var numMaths = 0;\n  var numCols = 0;\n  var emptyGroup = {\n    type: \"ordgroup\",\n    mode: context.mode,\n    body: []\n  };\n  if (args[0] && args[0].type === \"ordgroup\") {\n    var arg0 = \"\";\n    for (var i = 0; i < args[0].body.length; i++) {\n      var textord = assertNodeType(args[0].body[i], \"textord\");\n      arg0 += textord.text;\n    }\n    numMaths = Number(arg0);\n    numCols = numMaths * 2;\n  }\n  var isAligned = !numCols;\n  res.body.forEach(function (row) {\n    for (var _i4 = 1; _i4 < row.length; _i4 += 2) {\n      // Modify ordgroup node within styling node\n      var styling = assertNodeType(row[_i4], \"styling\");\n      var ordgroup = assertNodeType(styling.body[0], \"ordgroup\");\n      ordgroup.body.unshift(emptyGroup);\n    }\n    if (!isAligned) {\n      // Case 1\n      var curMaths = row.length / 2;\n      if (numMaths < curMaths) {\n        throw new ParseError(\"Too many math in a row: \" + (\"expected \" + numMaths + \", but got \" + curMaths), row[0]);\n      }\n    } else if (numCols < row.length) {\n      // Case 2\n      numCols = row.length;\n    }\n  });\n  // Adjusting alignment.\n  // In aligned mode, we add one \\qquad between columns;\n  // otherwise we add nothing.\n  for (var _i5 = 0; _i5 < numCols; ++_i5) {\n    var align = \"r\";\n    var pregap = 0;\n    if (_i5 % 2 === 1) {\n      align = \"l\";\n    } else if (_i5 > 0 && isAligned) {\n      // \"aligned\" mode.\n      pregap = 1; // add one \\quad\n    }\n    cols[_i5] = {\n      type: \"align\",\n      align: align,\n      pregap: pregap,\n      postgap: 0\n    };\n  }\n  res.colSeparationType = isAligned ? \"align\" : \"alignat\";\n  return res;\n};\n// Arrays are part of LaTeX, defined in lttab.dtx so its documentation\n// is part of the source2e.pdf file of LaTeX2e source documentation.\n// {darray} is an {array} environment where cells are set in \\displaystyle,\n// as defined in nccmath.sty.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"array\", \"darray\"],\n  props: {\n    numArgs: 1\n  },\n  handler(context, args) {\n    // Since no types are specified above, the two possibilities are\n    // - The argument is wrapped in {} or [], in which case Parser's\n    //   parseGroup() returns an \"ordgroup\" wrapping some symbol node.\n    // - The argument is a bare symbol node.\n    var symNode = checkSymbolNodeType(args[0]);\n    var colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n    var cols = colalign.map(function (nde) {\n      var node = assertSymbolNodeType(nde);\n      var ca = node.text;\n      if (\"lcr\".includes(ca)) {\n        return {\n          type: \"align\",\n          align: ca\n        };\n      } else if (ca === \"|\") {\n        return {\n          type: \"separator\",\n          separator: \"|\"\n        };\n      } else if (ca === \":\") {\n        return {\n          type: \"separator\",\n          separator: \":\"\n        };\n      }\n      throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n    });\n    var res = {\n      cols,\n      hskipBeforeAndAfter: true,\n      // \\@preamble in lttab.dtx\n      maxNumCols: cols.length\n    };\n    return parseArray(context.parser, res, dCellStyle(context.envName));\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\n// The matrix environments of amsmath builds on the array environment\n// of LaTeX, which is discussed above.\n// The mathtools package adds starred versions of the same environments.\n// These have an optional argument to choose left|center|right justification.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"matrix\", \"pmatrix\", \"bmatrix\", \"Bmatrix\", \"vmatrix\", \"Vmatrix\", \"matrix*\", \"pmatrix*\", \"bmatrix*\", \"Bmatrix*\", \"vmatrix*\", \"Vmatrix*\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    var delimiters = {\n      \"matrix\": null,\n      \"pmatrix\": [\"(\", \")\"],\n      \"bmatrix\": [\"[\", \"]\"],\n      \"Bmatrix\": [\"\\\\{\", \"\\\\}\"],\n      \"vmatrix\": [\"|\", \"|\"],\n      \"Vmatrix\": [\"\\\\Vert\", \"\\\\Vert\"]\n    }[context.envName.replace(\"*\", \"\")];\n    // \\hskip -\\arraycolsep in amsmath\n    var colAlign = \"c\";\n    var payload = {\n      hskipBeforeAndAfter: false,\n      cols: [{\n        type: \"align\",\n        align: colAlign\n      }]\n    };\n    if (context.envName.charAt(context.envName.length - 1) === \"*\") {\n      // It's one of the mathtools starred functions.\n      // Parse the optional alignment argument.\n      var parser = context.parser;\n      parser.consumeSpaces();\n      if (parser.fetch().text === \"[\") {\n        parser.consume();\n        parser.consumeSpaces();\n        colAlign = parser.fetch().text;\n        if (!\"lcr\".includes(colAlign)) {\n          throw new ParseError(\"Expected l or c or r\", parser.nextToken);\n        }\n        parser.consume();\n        parser.consumeSpaces();\n        parser.expect(\"]\");\n        parser.consume();\n        payload.cols = [{\n          type: \"align\",\n          align: colAlign\n        }];\n      }\n    }\n    var res = parseArray(context.parser, payload, dCellStyle(context.envName));\n    // Populate cols with the correct number of column alignment specs.\n    var numCols = Math.max(0, ...res.body.map(row => row.length));\n    res.cols = new Array(numCols).fill({\n      type: \"align\",\n      align: colAlign\n    });\n    return delimiters ? {\n      type: \"leftright\",\n      mode: context.mode,\n      body: [res],\n      left: delimiters[0],\n      right: delimiters[1],\n      rightColor: undefined // \\right uninfluenced by \\color in array\n    } : res;\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n  type: \"array\",\n  names: [\"smallmatrix\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    var payload = {\n      arraystretch: 0.5\n    };\n    var res = parseArray(context.parser, payload, \"script\");\n    res.colSeparationType = \"small\";\n    return res;\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n  type: \"array\",\n  names: [\"subarray\"],\n  props: {\n    numArgs: 1\n  },\n  handler(context, args) {\n    // Parsing of {subarray} is similar to {array}\n    var symNode = checkSymbolNodeType(args[0]);\n    var colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n    var cols = colalign.map(function (nde) {\n      var node = assertSymbolNodeType(nde);\n      var ca = node.text;\n      // {subarray} only recognizes \"l\" & \"c\"\n      if (\"lc\".includes(ca)) {\n        return {\n          type: \"align\",\n          align: ca\n        };\n      }\n      throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n    });\n    if (cols.length > 1) {\n      throw new ParseError(\"{subarray} can contain only one column\");\n    }\n    var payload = {\n      cols,\n      hskipBeforeAndAfter: false,\n      arraystretch: 0.5\n    };\n    var res = parseArray(context.parser, payload, \"script\");\n    if (res.body.length > 0 && res.body[0].length > 1) {\n      throw new ParseError(\"{subarray} can contain only one column\");\n    }\n    return res;\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\n// A cases environment (in amsmath.sty) is almost equivalent to\n// \\def\\arraystretch{1.2}%\n// \\left\\{\\begin{array}{@{}l@{\\quad}l@{}} … \\end{array}\\right.\n// {dcases} is a {cases} environment where cells are set in \\displaystyle,\n// as defined in mathtools.sty.\n// {rcases} is another mathtools environment. It's brace is on the right side.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"cases\", \"dcases\", \"rcases\", \"drcases\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    var payload = {\n      arraystretch: 1.2,\n      cols: [{\n        type: \"align\",\n        align: \"l\",\n        pregap: 0,\n        // TODO(kevinb) get the current style.\n        // For now we use the metrics for TEXT style which is what we were\n        // doing before.  Before attempting to get the current style we\n        // should look at TeX's behavior especially for \\over and matrices.\n        postgap: 1.0 /* 1em quad */\n      }, {\n        type: \"align\",\n        align: \"l\",\n        pregap: 0,\n        postgap: 0\n      }]\n    };\n    var res = parseArray(context.parser, payload, dCellStyle(context.envName));\n    return {\n      type: \"leftright\",\n      mode: context.mode,\n      body: [res],\n      left: context.envName.includes(\"r\") ? \".\" : \"\\\\{\",\n      right: context.envName.includes(\"r\") ? \"\\\\}\" : \".\",\n      rightColor: undefined\n    };\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\n// In the align environment, one uses ampersands, &, to specify number of\n// columns in each row, and to locate spacing between each column.\n// align gets automatic numbering. align* and aligned do not.\n// The alignedat environment can be used in math mode.\n// Note that we assume \\nomallineskiplimit to be zero,\n// so that \\strut@ is the same as \\strut.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"align\", \"align*\", \"aligned\", \"split\"],\n  props: {\n    numArgs: 0\n  },\n  handler: alignedHandler,\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\n// A gathered environment is like an array environment with one centered\n// column, but where rows are considered lines so get \\jot line spacing\n// and contents are set in \\displaystyle.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"gathered\", \"gather\", \"gather*\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    if (gatherEnvironments.has(context.envName)) {\n      validateAmsEnvironmentContext(context);\n    }\n    var res = {\n      cols: [{\n        type: \"align\",\n        align: \"c\"\n      }],\n      addJot: true,\n      colSeparationType: \"gather\",\n      autoTag: getAutoTag(context.envName),\n      emptySingleRow: true,\n      leqno: context.parser.settings.leqno\n    };\n    return parseArray(context.parser, res, \"display\");\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\n// alignat environment is like an align environment, but one must explicitly\n// specify maximum number of columns in each row, and can adjust spacing between\n// each columns.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"alignat\", \"alignat*\", \"alignedat\"],\n  props: {\n    numArgs: 1\n  },\n  handler: alignedHandler,\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n  type: \"array\",\n  names: [\"equation\", \"equation*\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    validateAmsEnvironmentContext(context);\n    var res = {\n      autoTag: getAutoTag(context.envName),\n      emptySingleRow: true,\n      singleRow: true,\n      maxNumCols: 1,\n      leqno: context.parser.settings.leqno\n    };\n    return parseArray(context.parser, res, \"display\");\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n  type: \"array\",\n  names: [\"CD\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    validateAmsEnvironmentContext(context);\n    return parseCD(context.parser);\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\ndefineMacro(\"\\\\nonumber\", \"\\\\gdef\\\\@eqnsw{0}\");\ndefineMacro(\"\\\\notag\", \"\\\\nonumber\");\n// Catch \\hline outside array environment\ndefineFunction({\n  type: \"text\",\n  // Doesn't matter what this is.\n  names: [\"\\\\hline\", \"\\\\hdashline\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInMath: true\n  },\n  handler(context, args) {\n    throw new ParseError(context.funcName + \" valid only within array environment\");\n  }\n});\n\nvar environments = _environments;\n\n// Environment delimiters. HTML/MathML rendering is defined in the corresponding\n// defineEnvironment definitions.\ndefineFunction({\n  type: \"environment\",\n  names: [\"\\\\begin\", \"\\\\end\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"text\"]\n  },\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var nameGroup = args[0];\n    if (nameGroup.type !== \"ordgroup\") {\n      throw new ParseError(\"Invalid environment name\", nameGroup);\n    }\n    var envName = \"\";\n    for (var i = 0; i < nameGroup.body.length; ++i) {\n      envName += assertNodeType(nameGroup.body[i], \"textord\").text;\n    }\n    if (funcName === \"\\\\begin\") {\n      // begin...end is similar to left...right\n      if (!environments.hasOwnProperty(envName)) {\n        throw new ParseError(\"No such environment: \" + envName, nameGroup);\n      }\n      // Build the environment object. Arguments and other information will\n      // be made available to the begin and end methods using properties.\n      var env = environments[envName];\n      var {\n        args: _args,\n        optArgs\n      } = parser.parseArguments(\"\\\\begin{\" + envName + \"}\", env);\n      var context = {\n        mode: parser.mode,\n        envName,\n        parser\n      };\n      var result = env.handler(context, _args, optArgs);\n      parser.expect(\"\\\\end\", false);\n      var endNameToken = parser.nextToken;\n      var end = assertNodeType(parser.parseFunction(), \"environment\");\n      if (end.name !== envName) {\n        throw new ParseError(\"Mismatch: \\\\begin{\" + envName + \"} matched by \\\\end{\" + end.name + \"}\", endNameToken);\n      }\n      // TODO(ts), \"environment\" handler returns an environment ParseNode\n      return result;\n    }\n    return {\n      type: \"environment\",\n      mode: parser.mode,\n      name: envName,\n      nameGroup\n    };\n  }\n});\n\n// TODO(kevinb): implement \\\\sl and \\\\sc\nvar htmlBuilder$5 = (group, options) => {\n  var font = group.font;\n  var newOptions = options.withFont(font);\n  return buildGroup$1(group.body, newOptions);\n};\nvar mathmlBuilder$4 = (group, options) => {\n  var font = group.font;\n  var newOptions = options.withFont(font);\n  return buildGroup(group.body, newOptions);\n};\nvar fontAliases = {\n  \"\\\\Bbb\": \"\\\\mathbb\",\n  \"\\\\bold\": \"\\\\mathbf\",\n  \"\\\\frak\": \"\\\\mathfrak\",\n  \"\\\\bm\": \"\\\\boldsymbol\"\n};\ndefineFunction({\n  type: \"font\",\n  names: [\n  // styles, except \\boldsymbol defined below\n  \"\\\\mathrm\", \"\\\\mathit\", \"\\\\mathbf\", \"\\\\mathnormal\", \"\\\\mathsfit\",\n  // families\n  \"\\\\mathbb\", \"\\\\mathcal\", \"\\\\mathfrak\", \"\\\\mathscr\", \"\\\\mathsf\", \"\\\\mathtt\",\n  // aliases, except \\bm defined below\n  \"\\\\Bbb\", \"\\\\bold\", \"\\\\frak\"],\n  props: {\n    numArgs: 1,\n    allowedInArgument: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var body = normalizeArgument(args[0]);\n    var func = funcName;\n    if (func in fontAliases) {\n      func = fontAliases[func];\n    }\n    return {\n      type: \"font\",\n      mode: parser.mode,\n      font: func.slice(1),\n      body\n    };\n  },\n  htmlBuilder: htmlBuilder$5,\n  mathmlBuilder: mathmlBuilder$4\n});\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\boldsymbol\", \"\\\\bm\"],\n  props: {\n    numArgs: 1\n  },\n  handler: (_ref2, args) => {\n    var {\n      parser\n    } = _ref2;\n    var body = args[0];\n    // amsbsy.sty's \\boldsymbol uses \\binrel spacing to inherit the\n    // argument's bin|rel|ord status\n    return {\n      type: \"mclass\",\n      mode: parser.mode,\n      mclass: binrelClass(body),\n      body: [{\n        type: \"font\",\n        mode: parser.mode,\n        font: \"boldsymbol\",\n        body\n      }],\n      isCharacterBox: isCharacterBox(body)\n    };\n  }\n});\n// Old font changing functions\ndefineFunction({\n  type: \"font\",\n  names: [\"\\\\rm\", \"\\\\sf\", \"\\\\tt\", \"\\\\bf\", \"\\\\it\", \"\\\\cal\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler: (_ref3, args) => {\n    var {\n      parser,\n      funcName,\n      breakOnTokenText\n    } = _ref3;\n    var {\n      mode\n    } = parser;\n    var body = parser.parseExpression(true, breakOnTokenText);\n    var style = \"math\" + funcName.slice(1);\n    return {\n      type: \"font\",\n      mode: mode,\n      font: style,\n      body: {\n        type: \"ordgroup\",\n        mode: parser.mode,\n        body\n      }\n    };\n  },\n  htmlBuilder: htmlBuilder$5,\n  mathmlBuilder: mathmlBuilder$4\n});\n\nvar htmlBuilder$4 = (group, options) => {\n  // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e).\n  var style = options.style;\n  var nstyle = style.fracNum();\n  var dstyle = style.fracDen();\n  var newOptions;\n  newOptions = options.havingStyle(nstyle);\n  var numerm = buildGroup$1(group.numer, newOptions, options);\n  if (group.continued) {\n    // \\cfrac inserts a \\strut into the numerator.\n    // Get \\strut dimensions from TeXbook page 353.\n    var hStrut = 8.5 / options.fontMetrics().ptPerEm;\n    var dStrut = 3.5 / options.fontMetrics().ptPerEm;\n    numerm.height = numerm.height < hStrut ? hStrut : numerm.height;\n    numerm.depth = numerm.depth < dStrut ? dStrut : numerm.depth;\n  }\n  newOptions = options.havingStyle(dstyle);\n  var denomm = buildGroup$1(group.denom, newOptions, options);\n  var rule;\n  var ruleWidth;\n  var ruleSpacing;\n  if (group.hasBarLine) {\n    if (group.barSize) {\n      ruleWidth = calculateSize(group.barSize, options);\n      rule = makeLineSpan(\"frac-line\", options, ruleWidth);\n    } else {\n      rule = makeLineSpan(\"frac-line\", options);\n    }\n    ruleWidth = rule.height;\n    ruleSpacing = rule.height;\n  } else {\n    rule = null;\n    ruleWidth = 0;\n    ruleSpacing = options.fontMetrics().defaultRuleThickness;\n  }\n  // Rule 15b\n  var numShift;\n  var clearance;\n  var denomShift;\n  if (style.size === Style$1.DISPLAY.size) {\n    numShift = options.fontMetrics().num1;\n    if (ruleWidth > 0) {\n      clearance = 3 * ruleSpacing;\n    } else {\n      clearance = 7 * ruleSpacing;\n    }\n    denomShift = options.fontMetrics().denom1;\n  } else {\n    if (ruleWidth > 0) {\n      numShift = options.fontMetrics().num2;\n      clearance = ruleSpacing;\n    } else {\n      numShift = options.fontMetrics().num3;\n      clearance = 3 * ruleSpacing;\n    }\n    denomShift = options.fontMetrics().denom2;\n  }\n  var frac;\n  if (!rule) {\n    // Rule 15c\n    var candidateClearance = numShift - numerm.depth - (denomm.height - denomShift);\n    if (candidateClearance < clearance) {\n      numShift += 0.5 * (clearance - candidateClearance);\n      denomShift += 0.5 * (clearance - candidateClearance);\n    }\n    frac = makeVList({\n      positionType: \"individualShift\",\n      children: [{\n        type: \"elem\",\n        elem: denomm,\n        shift: denomShift\n      }, {\n        type: \"elem\",\n        elem: numerm,\n        shift: -numShift\n      }]\n    });\n  } else {\n    // Rule 15d\n    var axisHeight = options.fontMetrics().axisHeight;\n    if (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth) < clearance) {\n      numShift += clearance - (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth));\n    }\n    if (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift) < clearance) {\n      denomShift += clearance - (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift));\n    }\n    var midShift = -(axisHeight - 0.5 * ruleWidth);\n    frac = makeVList({\n      positionType: \"individualShift\",\n      children: [{\n        type: \"elem\",\n        elem: denomm,\n        shift: denomShift\n      }, {\n        type: \"elem\",\n        elem: rule,\n        shift: midShift\n      }, {\n        type: \"elem\",\n        elem: numerm,\n        shift: -numShift\n      }]\n    });\n  }\n  // Since we manually change the style sometimes (with \\dfrac or \\tfrac),\n  // account for the possible size change here.\n  newOptions = options.havingStyle(style);\n  frac.height *= newOptions.sizeMultiplier / options.sizeMultiplier;\n  frac.depth *= newOptions.sizeMultiplier / options.sizeMultiplier;\n  // Rule 15e\n  var delimSize;\n  if (style.size === Style$1.DISPLAY.size) {\n    delimSize = options.fontMetrics().delim1;\n  } else if (style.size === Style$1.SCRIPTSCRIPT.size) {\n    delimSize = options.havingStyle(Style$1.SCRIPT).fontMetrics().delim2;\n  } else {\n    delimSize = options.fontMetrics().delim2;\n  }\n  var leftDelim;\n  var rightDelim;\n  if (group.leftDelim == null) {\n    leftDelim = makeNullDelimiter(options, [\"mopen\"]);\n  } else {\n    leftDelim = makeCustomSizedDelim(group.leftDelim, delimSize, true, options.havingStyle(style), group.mode, [\"mopen\"]);\n  }\n  if (group.continued) {\n    rightDelim = makeSpan([]); // zero width for \\cfrac\n  } else if (group.rightDelim == null) {\n    rightDelim = makeNullDelimiter(options, [\"mclose\"]);\n  } else {\n    rightDelim = makeCustomSizedDelim(group.rightDelim, delimSize, true, options.havingStyle(style), group.mode, [\"mclose\"]);\n  }\n  return makeSpan([\"mord\"].concat(newOptions.sizingClasses(options)), [leftDelim, makeSpan([\"mfrac\"], [frac]), rightDelim], options);\n};\nvar mathmlBuilder$3 = (group, options) => {\n  var node = new MathNode(\"mfrac\", [buildGroup(group.numer, options), buildGroup(group.denom, options)]);\n  if (!group.hasBarLine) {\n    node.setAttribute(\"linethickness\", \"0px\");\n  } else if (group.barSize) {\n    var ruleWidth = calculateSize(group.barSize, options);\n    node.setAttribute(\"linethickness\", makeEm(ruleWidth));\n  }\n  if (group.leftDelim != null || group.rightDelim != null) {\n    var withDelims = [];\n    if (group.leftDelim != null) {\n      var leftOp = new MathNode(\"mo\", [new TextNode(group.leftDelim.replace(\"\\\\\", \"\"))]);\n      leftOp.setAttribute(\"fence\", \"true\");\n      withDelims.push(leftOp);\n    }\n    withDelims.push(node);\n    if (group.rightDelim != null) {\n      var rightOp = new MathNode(\"mo\", [new TextNode(group.rightDelim.replace(\"\\\\\", \"\"))]);\n      rightOp.setAttribute(\"fence\", \"true\");\n      withDelims.push(rightOp);\n    }\n    return makeRow(withDelims);\n  }\n  return node;\n};\nvar wrapWithStyle = (frac, style) => {\n  if (!style) {\n    return frac;\n  }\n  var wrapper = {\n    type: \"styling\",\n    mode: frac.mode,\n    style,\n    body: [frac]\n  };\n  // @ts-ignore defineFunction handler needs to return ParseNode<\"genfrac\">\n  return wrapper;\n};\ndefineFunction({\n  type: \"genfrac\",\n  names: [\"\\\\cfrac\", \"\\\\dfrac\", \"\\\\frac\", \"\\\\tfrac\", \"\\\\dbinom\", \"\\\\binom\", \"\\\\tbinom\", \"\\\\\\\\atopfrac\",\n  // can’t be entered directly\n  \"\\\\\\\\bracefrac\", \"\\\\\\\\brackfrac\" // ditto\n  ],\n  props: {\n    numArgs: 2,\n    allowedInArgument: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var numer = args[0];\n    var denom = args[1];\n    var hasBarLine;\n    var leftDelim = null;\n    var rightDelim = null;\n    switch (funcName) {\n      case \"\\\\cfrac\":\n      case \"\\\\dfrac\":\n      case \"\\\\frac\":\n      case \"\\\\tfrac\":\n        hasBarLine = true;\n        break;\n      case \"\\\\\\\\atopfrac\":\n        hasBarLine = false;\n        break;\n      case \"\\\\dbinom\":\n      case \"\\\\binom\":\n      case \"\\\\tbinom\":\n        hasBarLine = false;\n        leftDelim = \"(\";\n        rightDelim = \")\";\n        break;\n      case \"\\\\\\\\bracefrac\":\n        hasBarLine = false;\n        leftDelim = \"\\\\{\";\n        rightDelim = \"\\\\}\";\n        break;\n      case \"\\\\\\\\brackfrac\":\n        hasBarLine = false;\n        leftDelim = \"[\";\n        rightDelim = \"]\";\n        break;\n      default:\n        throw new Error(\"Unrecognized genfrac command\");\n    }\n    var continued = funcName === \"\\\\cfrac\";\n    var style = null;\n    if (continued || funcName.startsWith(\"\\\\d\")) {\n      style = \"display\";\n    } else if (funcName.startsWith(\"\\\\t\")) {\n      style = \"text\";\n    }\n    return wrapWithStyle({\n      type: \"genfrac\",\n      mode: parser.mode,\n      numer,\n      denom,\n      continued,\n      hasBarLine,\n      leftDelim,\n      rightDelim,\n      barSize: null\n    }, style);\n  },\n  htmlBuilder: htmlBuilder$4,\n  mathmlBuilder: mathmlBuilder$3\n});\n// Infix generalized fractions -- these are not rendered directly, but replaced\n// immediately by one of the variants above.\ndefineFunction({\n  type: \"infix\",\n  names: [\"\\\\over\", \"\\\\choose\", \"\\\\atop\", \"\\\\brace\", \"\\\\brack\"],\n  props: {\n    numArgs: 0,\n    infix: true\n  },\n  handler(_ref2) {\n    var {\n      parser,\n      funcName,\n      token\n    } = _ref2;\n    var replaceWith;\n    switch (funcName) {\n      case \"\\\\over\":\n        replaceWith = \"\\\\frac\";\n        break;\n      case \"\\\\choose\":\n        replaceWith = \"\\\\binom\";\n        break;\n      case \"\\\\atop\":\n        replaceWith = \"\\\\\\\\atopfrac\";\n        break;\n      case \"\\\\brace\":\n        replaceWith = \"\\\\\\\\bracefrac\";\n        break;\n      case \"\\\\brack\":\n        replaceWith = \"\\\\\\\\brackfrac\";\n        break;\n      default:\n        throw new Error(\"Unrecognized infix genfrac command\");\n    }\n    return {\n      type: \"infix\",\n      mode: parser.mode,\n      replaceWith,\n      token\n    };\n  }\n});\nvar stylArray = [\"display\", \"text\", \"script\", \"scriptscript\"];\nvar delimFromValue = function delimFromValue(delimString) {\n  var delim = null;\n  if (delimString.length > 0) {\n    delim = delimString;\n    delim = delim === \".\" ? null : delim;\n  }\n  return delim;\n};\ndefineFunction({\n  type: \"genfrac\",\n  names: [\"\\\\genfrac\"],\n  props: {\n    numArgs: 6,\n    allowedInArgument: true,\n    argTypes: [\"math\", \"math\", \"size\", \"text\", \"math\", \"math\"]\n  },\n  handler(_ref3, args) {\n    var {\n      parser\n    } = _ref3;\n    var numer = args[4];\n    var denom = args[5];\n    // Look into the parse nodes to get the desired delimiters.\n    var leftNode = normalizeArgument(args[0]);\n    var leftDelim = leftNode.type === \"atom\" && leftNode.family === \"open\" ? delimFromValue(leftNode.text) : null;\n    var rightNode = normalizeArgument(args[1]);\n    var rightDelim = rightNode.type === \"atom\" && rightNode.family === \"close\" ? delimFromValue(rightNode.text) : null;\n    var barNode = assertNodeType(args[2], \"size\");\n    var hasBarLine;\n    var barSize = null;\n    if (barNode.isBlank) {\n      // \\genfrac acts differently than \\above.\n      // \\genfrac treats an empty size group as a signal to use a\n      // standard bar size. \\above would see size = 0 and omit the bar.\n      hasBarLine = true;\n    } else {\n      barSize = barNode.value;\n      hasBarLine = barSize.number > 0;\n    }\n    // Find out if we want displaystyle, textstyle, etc.\n    var size = null;\n    var styl = args[3];\n    if (styl.type === \"ordgroup\") {\n      if (styl.body.length > 0) {\n        var textOrd = assertNodeType(styl.body[0], \"textord\");\n        size = stylArray[Number(textOrd.text)];\n      }\n    } else {\n      styl = assertNodeType(styl, \"textord\");\n      size = stylArray[Number(styl.text)];\n    }\n    return wrapWithStyle({\n      type: \"genfrac\",\n      mode: parser.mode,\n      numer,\n      denom,\n      continued: false,\n      hasBarLine,\n      barSize,\n      leftDelim,\n      rightDelim\n    }, size);\n  }\n});\n// \\above is an infix fraction that also defines a fraction bar size.\ndefineFunction({\n  type: \"infix\",\n  names: [\"\\\\above\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"size\"],\n    infix: true\n  },\n  handler(_ref4, args) {\n    var {\n      parser,\n      funcName,\n      token\n    } = _ref4;\n    return {\n      type: \"infix\",\n      mode: parser.mode,\n      replaceWith: \"\\\\\\\\abovefrac\",\n      size: assertNodeType(args[0], \"size\").value,\n      token\n    };\n  }\n});\ndefineFunction({\n  type: \"genfrac\",\n  names: [\"\\\\\\\\abovefrac\"],\n  props: {\n    numArgs: 3,\n    argTypes: [\"math\", \"size\", \"math\"]\n  },\n  handler: (_ref5, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref5;\n    var numer = args[0];\n    var barSize = assertNodeType(args[1], \"infix\").size;\n    if (!barSize) {\n      throw new Error(\"\\\\\\\\abovefrac expected size, but got \" + String(barSize));\n    }\n    var denom = args[2];\n    var hasBarLine = barSize.number > 0;\n    return {\n      type: \"genfrac\",\n      mode: parser.mode,\n      numer,\n      denom,\n      continued: false,\n      hasBarLine,\n      barSize,\n      leftDelim: null,\n      rightDelim: null\n    };\n  }\n});\n\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only \"horizBrace\", but\n// also \"supsub\" since an over/underbrace can affect super/subscripting.\nvar htmlBuilder$3 = (grp, options) => {\n  var style = options.style;\n  // Pull out the `ParseNode<\"horizBrace\">` if `grp` is a \"supsub\" node.\n  var supSubGroup;\n  var group;\n  if (grp.type === \"supsub\") {\n    // Ref: LaTeX source2e: }}}}\\limits}\n    // i.e. LaTeX treats the brace similar to an op and passes it\n    // with \\limits, so we need to assign supsub style.\n    supSubGroup = grp.sup ? buildGroup$1(grp.sup, options.havingStyle(style.sup()), options) : buildGroup$1(grp.sub, options.havingStyle(style.sub()), options);\n    group = assertNodeType(grp.base, \"horizBrace\");\n  } else {\n    group = assertNodeType(grp, \"horizBrace\");\n  }\n  // Build the base group\n  var body = buildGroup$1(group.base, options.havingBaseStyle(Style$1.DISPLAY));\n  // Create the stretchy element\n  var braceBody = stretchySvg(group, options);\n  // Generate the vlist, with the appropriate kerns        ┏━━━━━━━━┓\n  // This first vlist contains the content and the brace:   equation\n  var vlist;\n  if (group.isOver) {\n    vlist = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: body\n      }, {\n        type: \"kern\",\n        size: 0.1\n      }, {\n        type: \"elem\",\n        elem: braceBody\n      }]\n    });\n    // TODO(ts): Replace this with passing \"svg-align\" into makeVList.\n    vlist.children[0].children[0].children[1].classes.push(\"svg-align\");\n  } else {\n    vlist = makeVList({\n      positionType: \"bottom\",\n      positionData: body.depth + 0.1 + braceBody.height,\n      children: [{\n        type: \"elem\",\n        elem: braceBody\n      }, {\n        type: \"kern\",\n        size: 0.1\n      }, {\n        type: \"elem\",\n        elem: body\n      }]\n    });\n    // TODO(ts): Replace this with passing \"svg-align\" into makeVList.\n    vlist.children[0].children[0].children[0].classes.push(\"svg-align\");\n  }\n  if (supSubGroup) {\n    // To write the supsub, wrap the first vlist in another vlist:\n    // They can't all go in the same vlist, because the note might be\n    // wider than the equation. We want the equation to control the\n    // brace width.\n    //      note          long note           long note\n    //   ┏━━━━━━━━┓   or    ┏━━━┓     not    ┏━━━━━━━━━┓\n    //    equation           eqn                 eqn\n    var vSpan = makeSpan([\"minner\", group.isOver ? \"mover\" : \"munder\"], [vlist], options);\n    if (group.isOver) {\n      vlist = makeVList({\n        positionType: \"firstBaseline\",\n        children: [{\n          type: \"elem\",\n          elem: vSpan\n        }, {\n          type: \"kern\",\n          size: 0.2\n        }, {\n          type: \"elem\",\n          elem: supSubGroup\n        }]\n      });\n    } else {\n      vlist = makeVList({\n        positionType: \"bottom\",\n        positionData: vSpan.depth + 0.2 + supSubGroup.height + supSubGroup.depth,\n        children: [{\n          type: \"elem\",\n          elem: supSubGroup\n        }, {\n          type: \"kern\",\n          size: 0.2\n        }, {\n          type: \"elem\",\n          elem: vSpan\n        }]\n      });\n    }\n  }\n  return makeSpan([\"minner\", group.isOver ? \"mover\" : \"munder\"], [vlist], options);\n};\nvar mathmlBuilder$2 = (group, options) => {\n  var accentNode = stretchyMathML(group.label);\n  return new MathNode(group.isOver ? \"mover\" : \"munder\", [buildGroup(group.base, options), accentNode]);\n};\n// Horizontal stretchy braces\ndefineFunction({\n  type: \"horizBrace\",\n  names: [\"\\\\overbrace\", \"\\\\underbrace\", \"\\\\overbracket\", \"\\\\underbracket\"],\n  props: {\n    numArgs: 1\n  },\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    return {\n      type: \"horizBrace\",\n      mode: parser.mode,\n      label: funcName,\n      isOver: funcName.includes(\"\\\\over\"),\n      base: args[0]\n    };\n  },\n  htmlBuilder: htmlBuilder$3,\n  mathmlBuilder: mathmlBuilder$2\n});\n\ndefineFunction({\n  type: \"href\",\n  names: [\"\\\\href\"],\n  props: {\n    numArgs: 2,\n    argTypes: [\"url\", \"original\"],\n    allowedInText: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser\n    } = _ref;\n    var body = args[1];\n    var href = assertNodeType(args[0], \"url\").url;\n    if (!parser.settings.isTrusted({\n      command: \"\\\\href\",\n      url: href\n    })) {\n      return parser.formatUnsupportedCmd(\"\\\\href\");\n    }\n    return {\n      type: \"href\",\n      mode: parser.mode,\n      href,\n      body: ordargument(body)\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var elements = buildExpression$1(group.body, options, false);\n    return makeAnchor(group.href, [], elements, options);\n  },\n  mathmlBuilder: (group, options) => {\n    var math = buildExpressionRow(group.body, options);\n    if (!(math instanceof MathNode)) {\n      math = new MathNode(\"mrow\", [math]);\n    }\n    math.setAttribute(\"href\", group.href);\n    return math;\n  }\n});\ndefineFunction({\n  type: \"href\",\n  names: [\"\\\\url\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"url\"],\n    allowedInText: true\n  },\n  handler: (_ref2, args) => {\n    var {\n      parser\n    } = _ref2;\n    var href = assertNodeType(args[0], \"url\").url;\n    if (!parser.settings.isTrusted({\n      command: \"\\\\url\",\n      url: href\n    })) {\n      return parser.formatUnsupportedCmd(\"\\\\url\");\n    }\n    var chars = [];\n    for (var i = 0; i < href.length; i++) {\n      var c = href[i];\n      if (c === \"~\") {\n        c = \"\\\\textasciitilde\";\n      }\n      chars.push({\n        type: \"textord\",\n        mode: \"text\",\n        text: c\n      });\n    }\n    var body = {\n      type: \"text\",\n      mode: parser.mode,\n      font: \"\\\\texttt\",\n      body: chars\n    };\n    return {\n      type: \"href\",\n      mode: parser.mode,\n      href,\n      body: ordargument(body)\n    };\n  }\n});\n\n// \\hbox is provided for compatibility with LaTeX \\vcenter.\n// In LaTeX, \\vcenter can act only on a box, as in\n// \\vcenter{\\hbox{$\\frac{a+b}{\\dfrac{c}{d}}$}}\n// This function by itself doesn't do anything but prevent a soft line break.\ndefineFunction({\n  type: \"hbox\",\n  names: [\"\\\\hbox\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"text\"],\n    allowedInText: true,\n    primitive: true\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"hbox\",\n      mode: parser.mode,\n      body: ordargument(args[0])\n    };\n  },\n  htmlBuilder(group, options) {\n    var elements = buildExpression$1(group.body, options, false);\n    return makeFragment(elements);\n  },\n  mathmlBuilder(group, options) {\n    return new MathNode(\"mrow\", buildExpression(group.body, options));\n  }\n});\n\ndefineFunction({\n  type: \"html\",\n  names: [\"\\\\htmlClass\", \"\\\\htmlId\", \"\\\\htmlStyle\", \"\\\\htmlData\"],\n  props: {\n    numArgs: 2,\n    argTypes: [\"raw\", \"original\"],\n    allowedInText: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName,\n      token\n    } = _ref;\n    var value = assertNodeType(args[0], \"raw\").string;\n    var body = args[1];\n    if (parser.settings.strict) {\n      parser.settings.reportNonstrict(\"htmlExtension\", \"HTML extension is disabled on strict mode\");\n    }\n    var trustContext;\n    var attributes = {};\n    switch (funcName) {\n      case \"\\\\htmlClass\":\n        attributes.class = value;\n        trustContext = {\n          command: \"\\\\htmlClass\",\n          class: value\n        };\n        break;\n      case \"\\\\htmlId\":\n        attributes.id = value;\n        trustContext = {\n          command: \"\\\\htmlId\",\n          id: value\n        };\n        break;\n      case \"\\\\htmlStyle\":\n        attributes.style = value;\n        trustContext = {\n          command: \"\\\\htmlStyle\",\n          style: value\n        };\n        break;\n      case \"\\\\htmlData\":\n        {\n          var data = value.split(\",\");\n          for (var i = 0; i < data.length; i++) {\n            var item = data[i];\n            var firstEquals = item.indexOf(\"=\");\n            if (firstEquals < 0) {\n              throw new ParseError(\"\\\\htmlData key/value '\" + item + \"'\" + \" missing equals sign\");\n            }\n            var key = item.slice(0, firstEquals);\n            var _value = item.slice(firstEquals + 1);\n            attributes[\"data-\" + key.trim()] = _value;\n          }\n          trustContext = {\n            command: \"\\\\htmlData\",\n            attributes\n          };\n          break;\n        }\n      default:\n        throw new Error(\"Unrecognized html command\");\n    }\n    if (!parser.settings.isTrusted(trustContext)) {\n      return parser.formatUnsupportedCmd(funcName);\n    }\n    return {\n      type: \"html\",\n      mode: parser.mode,\n      attributes,\n      body: ordargument(body)\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var elements = buildExpression$1(group.body, options, false);\n    var classes = [\"enclosing\"];\n    if (group.attributes.class) {\n      classes.push(...group.attributes.class.trim().split(/\\s+/));\n    }\n    var span = makeSpan(classes, elements, options);\n    for (var attr in group.attributes) {\n      if (attr !== \"class\" && group.attributes.hasOwnProperty(attr)) {\n        span.setAttribute(attr, group.attributes[attr]);\n      }\n    }\n    return span;\n  },\n  mathmlBuilder: (group, options) => {\n    return buildExpressionRow(group.body, options);\n  }\n});\n\ndefineFunction({\n  type: \"htmlmathml\",\n  names: [\"\\\\html@mathml\"],\n  props: {\n    numArgs: 2,\n    allowedInArgument: true,\n    allowedInText: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"htmlmathml\",\n      mode: parser.mode,\n      html: ordargument(args[0]),\n      mathml: ordargument(args[1])\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var elements = buildExpression$1(group.html, options, false);\n    return makeFragment(elements);\n  },\n  mathmlBuilder: (group, options) => {\n    return buildExpressionRow(group.mathml, options);\n  }\n});\n\nvar sizeData = function sizeData(str) {\n  if (/^[-+]? *(\\d+(\\.\\d*)?|\\.\\d+)$/.test(str)) {\n    // str is a number with no unit specified.\n    // default unit is bp, per graphix package.\n    return {\n      number: +str,\n      unit: \"bp\"\n    };\n  } else {\n    var match = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(str);\n    if (!match) {\n      throw new ParseError(\"Invalid size: '\" + str + \"' in \\\\includegraphics\");\n    }\n    var data = {\n      number: +(match[1] + match[2]),\n      // sign + magnitude, cast to number\n      unit: match[3]\n    };\n    if (!validUnit(data)) {\n      throw new ParseError(\"Invalid unit: '\" + data.unit + \"' in \\\\includegraphics.\");\n    }\n    return data;\n  }\n};\ndefineFunction({\n  type: \"includegraphics\",\n  names: [\"\\\\includegraphics\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1,\n    argTypes: [\"raw\", \"url\"],\n    allowedInText: false\n  },\n  handler: (_ref, args, optArgs) => {\n    var {\n      parser\n    } = _ref;\n    var width = {\n      number: 0,\n      unit: \"em\"\n    };\n    var height = {\n      number: 0.9,\n      unit: \"em\"\n    }; // sorta character sized.\n    var totalheight = {\n      number: 0,\n      unit: \"em\"\n    };\n    var alt = \"\";\n    if (optArgs[0]) {\n      var attributeStr = assertNodeType(optArgs[0], \"raw\").string;\n      // Parser.js does not parse key/value pairs. We get a string.\n      var attributes = attributeStr.split(\",\");\n      for (var i = 0; i < attributes.length; i++) {\n        var keyVal = attributes[i].split(\"=\");\n        if (keyVal.length === 2) {\n          var str = keyVal[1].trim();\n          switch (keyVal[0].trim()) {\n            case \"alt\":\n              alt = str;\n              break;\n            case \"width\":\n              width = sizeData(str);\n              break;\n            case \"height\":\n              height = sizeData(str);\n              break;\n            case \"totalheight\":\n              totalheight = sizeData(str);\n              break;\n            default:\n              throw new ParseError(\"Invalid key: '\" + keyVal[0] + \"' in \\\\includegraphics.\");\n          }\n        }\n      }\n    }\n    var src = assertNodeType(args[0], \"url\").url;\n    if (alt === \"\") {\n      // No alt given. Use the file name. Strip away the path.\n      alt = src;\n      alt = alt.replace(/^.*[\\\\/]/, '');\n      alt = alt.substring(0, alt.lastIndexOf('.'));\n    }\n    if (!parser.settings.isTrusted({\n      command: \"\\\\includegraphics\",\n      url: src\n    })) {\n      return parser.formatUnsupportedCmd(\"\\\\includegraphics\");\n    }\n    return {\n      type: \"includegraphics\",\n      mode: parser.mode,\n      alt: alt,\n      width: width,\n      height: height,\n      totalheight: totalheight,\n      src: src\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var height = calculateSize(group.height, options);\n    var depth = 0;\n    if (group.totalheight.number > 0) {\n      depth = calculateSize(group.totalheight, options) - height;\n    }\n    var width = 0;\n    if (group.width.number > 0) {\n      width = calculateSize(group.width, options);\n    }\n    var style = {\n      height: makeEm(height + depth)\n    };\n    if (width > 0) {\n      style.width = makeEm(width);\n    }\n    if (depth > 0) {\n      style.verticalAlign = makeEm(-depth);\n    }\n    var node = new Img(group.src, group.alt, style);\n    node.height = height;\n    node.depth = depth;\n    return node;\n  },\n  mathmlBuilder: (group, options) => {\n    var node = new MathNode(\"mglyph\", []);\n    node.setAttribute(\"alt\", group.alt);\n    var height = calculateSize(group.height, options);\n    var depth = 0;\n    if (group.totalheight.number > 0) {\n      depth = calculateSize(group.totalheight, options) - height;\n      node.setAttribute(\"valign\", makeEm(-depth));\n    }\n    node.setAttribute(\"height\", makeEm(height + depth));\n    if (group.width.number > 0) {\n      var width = calculateSize(group.width, options);\n      node.setAttribute(\"width\", makeEm(width));\n    }\n    node.setAttribute(\"src\", group.src);\n    return node;\n  }\n});\n\n// Horizontal spacing commands\n// TODO: \\hskip and \\mskip should support plus and minus in lengths\ndefineFunction({\n  type: \"kern\",\n  names: [\"\\\\kern\", \"\\\\mkern\", \"\\\\hskip\", \"\\\\mskip\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"size\"],\n    primitive: true,\n    allowedInText: true\n  },\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var size = assertNodeType(args[0], \"size\");\n    if (parser.settings.strict) {\n      var mathFunction = funcName[1] === 'm'; // \\mkern, \\mskip\n      var muUnit = size.value.unit === 'mu';\n      if (mathFunction) {\n        if (!muUnit) {\n          parser.settings.reportNonstrict(\"mathVsTextUnits\", \"LaTeX's \" + funcName + \" supports only mu units, \" + (\"not \" + size.value.unit + \" units\"));\n        }\n        if (parser.mode !== \"math\") {\n          parser.settings.reportNonstrict(\"mathVsTextUnits\", \"LaTeX's \" + funcName + \" works only in math mode\");\n        }\n      } else {\n        // !mathFunction\n        if (muUnit) {\n          parser.settings.reportNonstrict(\"mathVsTextUnits\", \"LaTeX's \" + funcName + \" doesn't support mu units\");\n        }\n      }\n    }\n    return {\n      type: \"kern\",\n      mode: parser.mode,\n      dimension: size.value\n    };\n  },\n  htmlBuilder(group, options) {\n    return makeGlue(group.dimension, options);\n  },\n  mathmlBuilder(group, options) {\n    var dimension = calculateSize(group.dimension, options);\n    return new SpaceNode(dimension);\n  }\n});\n\n// Horizontal overlap functions\ndefineFunction({\n  type: \"lap\",\n  names: [\"\\\\mathllap\", \"\\\\mathrlap\", \"\\\\mathclap\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"lap\",\n      mode: parser.mode,\n      alignment: funcName.slice(5),\n      body\n    };\n  },\n  htmlBuilder: (group, options) => {\n    // mathllap, mathrlap, mathclap\n    var inner;\n    if (group.alignment === \"clap\") {\n      // ref: https://www.math.lsu.edu/~aperlis/publications/mathclap/\n      inner = makeSpan([], [buildGroup$1(group.body, options)]);\n      // wrap, since CSS will center a .clap > .inner > span\n      inner = makeSpan([\"inner\"], [inner], options);\n    } else {\n      inner = makeSpan([\"inner\"], [buildGroup$1(group.body, options)]);\n    }\n    var fix = makeSpan([\"fix\"], []);\n    var node = makeSpan([group.alignment], [inner, fix], options);\n    // At this point, we have correctly set horizontal alignment of the\n    // two items involved in the lap.\n    // Next, use a strut to set the height of the HTML bounding box.\n    // Otherwise, a tall argument may be misplaced.\n    // This code resolved issue #1153\n    var strut = makeSpan([\"strut\"]);\n    strut.style.height = makeEm(node.height + node.depth);\n    if (node.depth) {\n      strut.style.verticalAlign = makeEm(-node.depth);\n    }\n    node.children.unshift(strut);\n    // Next, prevent vertical misplacement when next to something tall.\n    // This code resolves issue #1234\n    node = makeSpan([\"thinbox\"], [node], options);\n    return makeSpan([\"mord\", \"vbox\"], [node], options);\n  },\n  mathmlBuilder: (group, options) => {\n    // mathllap, mathrlap, mathclap\n    var node = new MathNode(\"mpadded\", [buildGroup(group.body, options)]);\n    if (group.alignment !== \"rlap\") {\n      var offset = group.alignment === \"llap\" ? \"-1\" : \"-0.5\";\n      node.setAttribute(\"lspace\", offset + \"width\");\n    }\n    node.setAttribute(\"width\", \"0px\");\n    return node;\n  }\n});\n\n// Switching from text mode back to math mode\ndefineFunction({\n  type: \"styling\",\n  names: [\"\\\\(\", \"$\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInMath: false\n  },\n  handler(_ref, args) {\n    var {\n      funcName,\n      parser\n    } = _ref;\n    var outerMode = parser.mode;\n    parser.switchMode(\"math\");\n    var close = funcName === \"\\\\(\" ? \"\\\\)\" : \"$\";\n    var body = parser.parseExpression(false, close);\n    parser.expect(close);\n    parser.switchMode(outerMode);\n    return {\n      type: \"styling\",\n      mode: parser.mode,\n      style: \"text\",\n      body\n    };\n  }\n});\n// Check for extra closing math delimiters\ndefineFunction({\n  type: \"text\",\n  // Doesn't matter what this is.\n  names: [\"\\\\)\", \"\\\\]\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInMath: false\n  },\n  handler(context, args) {\n    throw new ParseError(\"Mismatched \" + context.funcName);\n  }\n});\n\nvar chooseMathStyle = (group, options) => {\n  switch (options.style.size) {\n    case Style$1.DISPLAY.size:\n      return group.display;\n    case Style$1.TEXT.size:\n      return group.text;\n    case Style$1.SCRIPT.size:\n      return group.script;\n    case Style$1.SCRIPTSCRIPT.size:\n      return group.scriptscript;\n    default:\n      return group.text;\n  }\n};\ndefineFunction({\n  type: \"mathchoice\",\n  names: [\"\\\\mathchoice\"],\n  props: {\n    numArgs: 4,\n    primitive: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"mathchoice\",\n      mode: parser.mode,\n      display: ordargument(args[0]),\n      text: ordargument(args[1]),\n      script: ordargument(args[2]),\n      scriptscript: ordargument(args[3])\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var body = chooseMathStyle(group, options);\n    var elements = buildExpression$1(body, options, false);\n    return makeFragment(elements);\n  },\n  mathmlBuilder: (group, options) => {\n    var body = chooseMathStyle(group, options);\n    return buildExpressionRow(body, options);\n  }\n});\n\n// For an operator with limits, assemble the base, sup, and sub into a span.\nvar assembleSupSub = (base, supGroup, subGroup, options, style, slant, baseShift) => {\n  base = makeSpan([], [base]);\n  var subIsSingleCharacter = subGroup && isCharacterBox(subGroup);\n  var sub;\n  var sup;\n  // We manually have to handle the superscripts and subscripts. This,\n  // aside from the kern calculations, is copied from supsub.\n  if (supGroup) {\n    var elem = buildGroup$1(supGroup, options.havingStyle(style.sup()), options);\n    sup = {\n      elem,\n      kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth)\n    };\n  }\n  if (subGroup) {\n    var _elem = buildGroup$1(subGroup, options.havingStyle(style.sub()), options);\n    sub = {\n      elem: _elem,\n      kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - _elem.height)\n    };\n  }\n  // Build the final group as a vlist of the possible subscript, base,\n  // and possible superscript.\n  var finalGroup;\n  if (sup && sub) {\n    var bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift;\n    finalGroup = makeVList({\n      positionType: \"bottom\",\n      positionData: bottom,\n      children: [{\n        type: \"kern\",\n        size: options.fontMetrics().bigOpSpacing5\n      }, {\n        type: \"elem\",\n        elem: sub.elem,\n        marginLeft: makeEm(-slant)\n      }, {\n        type: \"kern\",\n        size: sub.kern\n      }, {\n        type: \"elem\",\n        elem: base\n      }, {\n        type: \"kern\",\n        size: sup.kern\n      }, {\n        type: \"elem\",\n        elem: sup.elem,\n        marginLeft: makeEm(slant)\n      }, {\n        type: \"kern\",\n        size: options.fontMetrics().bigOpSpacing5\n      }]\n    });\n  } else if (sub) {\n    var top = base.height - baseShift;\n    // Shift the limits by the slant of the symbol. Note\n    // that we are supposed to shift the limits by 1/2 of the slant,\n    // but since we are centering the limits adding a full slant of\n    // margin will shift by 1/2 that.\n    finalGroup = makeVList({\n      positionType: \"top\",\n      positionData: top,\n      children: [{\n        type: \"kern\",\n        size: options.fontMetrics().bigOpSpacing5\n      }, {\n        type: \"elem\",\n        elem: sub.elem,\n        marginLeft: makeEm(-slant)\n      }, {\n        type: \"kern\",\n        size: sub.kern\n      }, {\n        type: \"elem\",\n        elem: base\n      }]\n    });\n  } else if (sup) {\n    var _bottom = base.depth + baseShift;\n    finalGroup = makeVList({\n      positionType: \"bottom\",\n      positionData: _bottom,\n      children: [{\n        type: \"elem\",\n        elem: base\n      }, {\n        type: \"kern\",\n        size: sup.kern\n      }, {\n        type: \"elem\",\n        elem: sup.elem,\n        marginLeft: makeEm(slant)\n      }, {\n        type: \"kern\",\n        size: options.fontMetrics().bigOpSpacing5\n      }]\n    });\n  } else {\n    // This case probably shouldn't occur (this would mean the\n    // supsub was sending us a group with no superscript or\n    // subscript) but be safe.\n    return base;\n  }\n  var parts = [finalGroup];\n  if (sub && slant !== 0 && !subIsSingleCharacter) {\n    // A negative margin-left was applied to the lower limit.\n    // Avoid an overlap by placing a spacer on the left on the group.\n    var spacer = makeSpan([\"mspace\"], [], options);\n    spacer.style.marginRight = makeEm(slant);\n    parts.unshift(spacer);\n  }\n  return makeSpan([\"mop\", \"op-limits\"], parts, options);\n};\n\n// Limits, symbols\n// Most operators have a large successor symbol, but these don't.\nvar noSuccessor = new Set([\"\\\\smallint\"]);\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only \"op\", but also\n// \"supsub\" since some of them (like \\int) can affect super/subscripting.\nvar htmlBuilder$2 = (grp, options) => {\n  // Operators are handled in the TeXbook pg. 443-444, rule 13(a).\n  var supGroup;\n  var subGroup;\n  var hasLimits = false;\n  var group;\n  if (grp.type === \"supsub\") {\n    // If we have limits, supsub will pass us its group to handle. Pull\n    // out the superscript and subscript and set the group to the op in\n    // its base.\n    supGroup = grp.sup;\n    subGroup = grp.sub;\n    group = assertNodeType(grp.base, \"op\");\n    hasLimits = true;\n  } else {\n    group = assertNodeType(grp, \"op\");\n  }\n  var style = options.style;\n  var large = false;\n  if (style.size === Style$1.DISPLAY.size && group.symbol && !noSuccessor.has(group.name)) {\n    // Most symbol operators get larger in displaystyle (rule 13)\n    large = true;\n  }\n  var base;\n  if (group.symbol) {\n    // If this is a symbol, create the symbol.\n    var fontName = large ? \"Size2-Regular\" : \"Size1-Regular\";\n    var stash = \"\";\n    if (group.name === \"\\\\oiint\" || group.name === \"\\\\oiiint\") {\n      // No font glyphs yet, so use a glyph w/o the oval.\n      // TODO: When font glyphs are available, delete this code.\n      stash = group.name.slice(1);\n      group.name = stash === \"oiint\" ? \"\\\\iint\" : \"\\\\iiint\";\n    }\n    base = makeSymbol(group.name, fontName, \"math\", options, [\"mop\", \"op-symbol\", large ? \"large-op\" : \"small-op\"]);\n    if (stash.length > 0) {\n      // We're in \\oiint or \\oiiint. Overlay the oval.\n      // TODO: When font glyphs are available, delete this code.\n      var italic = base.italic;\n      var oval = staticSvg(stash + \"Size\" + (large ? \"2\" : \"1\"), options);\n      base = makeVList({\n        positionType: \"individualShift\",\n        children: [{\n          type: \"elem\",\n          elem: base,\n          shift: 0\n        }, {\n          type: \"elem\",\n          elem: oval,\n          shift: large ? 0.08 : 0\n        }]\n      });\n      group.name = \"\\\\\" + stash;\n      base.classes.unshift(\"mop\");\n      // TODO(ts)\n      base.italic = italic;\n    }\n  } else if (group.body) {\n    // If this is a list, compose that list.\n    var inner = buildExpression$1(group.body, options, true);\n    if (inner.length === 1 && inner[0] instanceof SymbolNode) {\n      base = inner[0];\n      base.classes[0] = \"mop\"; // replace old mclass\n    } else {\n      base = makeSpan([\"mop\"], inner, options);\n    }\n  } else {\n    // Otherwise, this is a text operator. Build the text from the\n    // operator's name.\n    var output = [];\n    for (var i = 1; i < group.name.length; i++) {\n      output.push(mathsym(group.name[i], group.mode, options));\n    }\n    base = makeSpan([\"mop\"], output, options);\n  }\n  // If content of op is a single symbol, shift it vertically.\n  var baseShift = 0;\n  var slant = 0;\n  if ((base instanceof SymbolNode || group.name === \"\\\\oiint\" || group.name === \"\\\\oiiint\") && !group.suppressBaseShift) {\n    // We suppress the shift of the base of \\overset and \\underset. Otherwise,\n    // shift the symbol so its center lies on the axis (rule 13). It\n    // appears that our fonts have the centers of the symbols already\n    // almost on the axis, so these numbers are very small. Note we\n    // don't actually apply this here, but instead it is used either in\n    // the vlist creation or separately when there are no limits.\n    baseShift = (base.height - base.depth) / 2 - options.fontMetrics().axisHeight;\n    // The slant of the symbol is just its italic correction.\n    // TODO(ts)\n    slant = base.italic || 0;\n  }\n  if (hasLimits) {\n    return assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift);\n  } else {\n    if (baseShift) {\n      base.style.position = \"relative\";\n      base.style.top = makeEm(baseShift);\n    }\n    return base;\n  }\n};\nvar mathmlBuilder$1 = (group, options) => {\n  var node;\n  if (group.symbol) {\n    // This is a symbol. Just add the symbol.\n    node = new MathNode(\"mo\", [makeText(group.name, group.mode)]);\n    if (noSuccessor.has(group.name)) {\n      node.setAttribute(\"largeop\", \"false\");\n    }\n  } else if (group.body) {\n    // This is an operator with children. Add them.\n    node = new MathNode(\"mo\", buildExpression(group.body, options));\n  } else {\n    // This is a text operator. Add all the characters from the\n    // operator's name.\n    node = new MathNode(\"mi\", [new TextNode(group.name.slice(1))]);\n    // Append an <mo>&ApplyFunction;</mo>.\n    // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n    var operator = new MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n    if (group.parentIsSupSub) {\n      node = new MathNode(\"mrow\", [node, operator]);\n    } else {\n      node = newDocumentFragment([node, operator]);\n    }\n  }\n  return node;\n};\nvar singleCharBigOps = {\n  \"\\u220F\": \"\\\\prod\",\n  \"\\u2210\": \"\\\\coprod\",\n  \"\\u2211\": \"\\\\sum\",\n  \"\\u22c0\": \"\\\\bigwedge\",\n  \"\\u22c1\": \"\\\\bigvee\",\n  \"\\u22c2\": \"\\\\bigcap\",\n  \"\\u22c3\": \"\\\\bigcup\",\n  \"\\u2a00\": \"\\\\bigodot\",\n  \"\\u2a01\": \"\\\\bigoplus\",\n  \"\\u2a02\": \"\\\\bigotimes\",\n  \"\\u2a04\": \"\\\\biguplus\",\n  \"\\u2a06\": \"\\\\bigsqcup\"\n};\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\coprod\", \"\\\\bigvee\", \"\\\\bigwedge\", \"\\\\biguplus\", \"\\\\bigcap\", \"\\\\bigcup\", \"\\\\intop\", \"\\\\prod\", \"\\\\sum\", \"\\\\bigotimes\", \"\\\\bigoplus\", \"\\\\bigodot\", \"\\\\bigsqcup\", \"\\\\smallint\", \"\\u220F\", \"\\u2210\", \"\\u2211\", \"\\u22c0\", \"\\u22c1\", \"\\u22c2\", \"\\u22c3\", \"\\u2a00\", \"\\u2a01\", \"\\u2a02\", \"\\u2a04\", \"\\u2a06\"],\n  props: {\n    numArgs: 0\n  },\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var fName = funcName;\n    if (fName.length === 1) {\n      fName = singleCharBigOps[fName];\n    }\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: true,\n      parentIsSupSub: false,\n      symbol: true,\n      name: fName\n    };\n  },\n  htmlBuilder: htmlBuilder$2,\n  mathmlBuilder: mathmlBuilder$1\n});\n// Note: calling defineFunction with a type that's already been defined only\n// works because the same htmlBuilder and mathmlBuilder are being used.\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\mathop\"],\n  props: {\n    numArgs: 1,\n    primitive: true\n  },\n  handler: (_ref2, args) => {\n    var {\n      parser\n    } = _ref2;\n    var body = args[0];\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: false,\n      parentIsSupSub: false,\n      symbol: false,\n      body: ordargument(body)\n    };\n  },\n  htmlBuilder: htmlBuilder$2,\n  mathmlBuilder: mathmlBuilder$1\n});\n// There are 2 flags for operators; whether they produce limits in\n// displaystyle, and whether they are symbols and should grow in\n// displaystyle. These four groups cover the four possible choices.\nvar singleCharIntegrals = {\n  \"\\u222b\": \"\\\\int\",\n  \"\\u222c\": \"\\\\iint\",\n  \"\\u222d\": \"\\\\iiint\",\n  \"\\u222e\": \"\\\\oint\",\n  \"\\u222f\": \"\\\\oiint\",\n  \"\\u2230\": \"\\\\oiiint\"\n};\n// No limits, not symbols\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\arcsin\", \"\\\\arccos\", \"\\\\arctan\", \"\\\\arctg\", \"\\\\arcctg\", \"\\\\arg\", \"\\\\ch\", \"\\\\cos\", \"\\\\cosec\", \"\\\\cosh\", \"\\\\cot\", \"\\\\cotg\", \"\\\\coth\", \"\\\\csc\", \"\\\\ctg\", \"\\\\cth\", \"\\\\deg\", \"\\\\dim\", \"\\\\exp\", \"\\\\hom\", \"\\\\ker\", \"\\\\lg\", \"\\\\ln\", \"\\\\log\", \"\\\\sec\", \"\\\\sin\", \"\\\\sinh\", \"\\\\sh\", \"\\\\tan\", \"\\\\tanh\", \"\\\\tg\", \"\\\\th\"],\n  props: {\n    numArgs: 0\n  },\n  handler(_ref3) {\n    var {\n      parser,\n      funcName\n    } = _ref3;\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: false,\n      parentIsSupSub: false,\n      symbol: false,\n      name: funcName\n    };\n  },\n  htmlBuilder: htmlBuilder$2,\n  mathmlBuilder: mathmlBuilder$1\n});\n// Limits, not symbols\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\det\", \"\\\\gcd\", \"\\\\inf\", \"\\\\lim\", \"\\\\max\", \"\\\\min\", \"\\\\Pr\", \"\\\\sup\"],\n  props: {\n    numArgs: 0\n  },\n  handler(_ref4) {\n    var {\n      parser,\n      funcName\n    } = _ref4;\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: true,\n      parentIsSupSub: false,\n      symbol: false,\n      name: funcName\n    };\n  },\n  htmlBuilder: htmlBuilder$2,\n  mathmlBuilder: mathmlBuilder$1\n});\n// No limits, symbols\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\int\", \"\\\\iint\", \"\\\\iiint\", \"\\\\oint\", \"\\\\oiint\", \"\\\\oiiint\", \"\\u222b\", \"\\u222c\", \"\\u222d\", \"\\u222e\", \"\\u222f\", \"\\u2230\"],\n  props: {\n    numArgs: 0,\n    allowedInArgument: true\n  },\n  handler(_ref5) {\n    var {\n      parser,\n      funcName\n    } = _ref5;\n    var fName = funcName;\n    if (fName.length === 1) {\n      fName = singleCharIntegrals[fName];\n    }\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: false,\n      parentIsSupSub: false,\n      symbol: true,\n      name: fName\n    };\n  },\n  htmlBuilder: htmlBuilder$2,\n  mathmlBuilder: mathmlBuilder$1\n});\n\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only\n// \"operatorname\", but also  \"supsub\" since \\operatorname* can\n// affect super/subscripting.\nvar htmlBuilder$1 = (grp, options) => {\n  // Operators are handled in the TeXbook pg. 443-444, rule 13(a).\n  var supGroup;\n  var subGroup;\n  var hasLimits = false;\n  var group;\n  if (grp.type === \"supsub\") {\n    // If we have limits, supsub will pass us its group to handle. Pull\n    // out the superscript and subscript and set the group to the op in\n    // its base.\n    supGroup = grp.sup;\n    subGroup = grp.sub;\n    group = assertNodeType(grp.base, \"operatorname\");\n    hasLimits = true;\n  } else {\n    group = assertNodeType(grp, \"operatorname\");\n  }\n  var base;\n  if (group.body.length > 0) {\n    var body = group.body.map(child => {\n      var childText = \"text\" in child ? child.text : undefined;\n      if (typeof childText === \"string\") {\n        return {\n          type: \"textord\",\n          mode: child.mode,\n          text: childText\n        };\n      } else {\n        return child;\n      }\n    });\n    // Consolidate function names into symbol characters.\n    var expression = buildExpression$1(body, options.withFont(\"mathrm\"), true);\n    for (var i = 0; i < expression.length; i++) {\n      var child = expression[i];\n      if (child instanceof SymbolNode) {\n        // Per amsopn package,\n        // change minus to hyphen and \\ast to asterisk\n        child.text = child.text.replace(/\\u2212/, \"-\").replace(/\\u2217/, \"*\");\n      }\n    }\n    base = makeSpan([\"mop\"], expression, options);\n  } else {\n    base = makeSpan([\"mop\"], [], options);\n  }\n  if (hasLimits) {\n    return assembleSupSub(base, supGroup, subGroup, options, options.style, 0, 0);\n  } else {\n    return base;\n  }\n};\nvar mathmlBuilder = (group, options) => {\n  // The steps taken here are similar to the html version.\n  var expression = buildExpression(group.body, options.withFont(\"mathrm\"));\n  // Is expression a string or has it something like a fraction?\n  var isAllString = true; // default\n  for (var i = 0; i < expression.length; i++) {\n    var node = expression[i];\n    if (node instanceof SpaceNode) ; else if (node instanceof MathNode) {\n      switch (node.type) {\n        case \"mi\":\n        case \"mn\":\n        case \"mspace\":\n        case \"mtext\":\n          break;\n        // Do nothing yet.\n        case \"mo\":\n          {\n            var child = node.children[0];\n            if (node.children.length === 1 && child instanceof TextNode) {\n              child.text = child.text.replace(/\\u2212/, \"-\").replace(/\\u2217/, \"*\");\n            } else {\n              isAllString = false;\n            }\n            break;\n          }\n        default:\n          isAllString = false;\n      }\n    } else {\n      isAllString = false;\n    }\n  }\n  if (isAllString) {\n    // Write a single TextNode instead of multiple nested tags.\n    var word = expression.map(node => node.toText()).join(\"\");\n    expression = [new TextNode(word)];\n  }\n  var identifier = new MathNode(\"mi\", expression);\n  identifier.setAttribute(\"mathvariant\", \"normal\");\n  // \\u2061 is the same as &ApplyFunction;\n  // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp\n  var operator = new MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n  if (group.parentIsSupSub) {\n    return new MathNode(\"mrow\", [identifier, operator]);\n  } else {\n    return newDocumentFragment([identifier, operator]);\n  }\n};\n// \\operatorname\n// amsopn.dtx: \\mathop{#1\\kern\\z@\\operator@font#3}\\newmcodes@\ndefineFunction({\n  type: \"operatorname\",\n  names: [\"\\\\operatorname@\", \"\\\\operatornamewithlimits\"],\n  props: {\n    numArgs: 1\n  },\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"operatorname\",\n      mode: parser.mode,\n      body: ordargument(body),\n      alwaysHandleSupSub: funcName === \"\\\\operatornamewithlimits\",\n      limits: false,\n      parentIsSupSub: false\n    };\n  },\n  htmlBuilder: htmlBuilder$1,\n  mathmlBuilder\n});\ndefineMacro(\"\\\\operatorname\", \"\\\\@ifstar\\\\operatornamewithlimits\\\\operatorname@\");\n\ndefineFunctionBuilders({\n  type: \"ordgroup\",\n  htmlBuilder(group, options) {\n    if (group.semisimple) {\n      return makeFragment(buildExpression$1(group.body, options, false));\n    }\n    return makeSpan([\"mord\"], buildExpression$1(group.body, options, true), options);\n  },\n  mathmlBuilder(group, options) {\n    return buildExpressionRow(group.body, options, true);\n  }\n});\n\ndefineFunction({\n  type: \"overline\",\n  names: [\"\\\\overline\"],\n  props: {\n    numArgs: 1\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"overline\",\n      mode: parser.mode,\n      body\n    };\n  },\n  htmlBuilder(group, options) {\n    // Overlines are handled in the TeXbook pg 443, Rule 9.\n    // Build the inner group in the cramped style.\n    var innerGroup = buildGroup$1(group.body, options.havingCrampedStyle());\n    // Create the line above the body\n    var line = makeLineSpan(\"overline-line\", options);\n    // Generate the vlist, with the appropriate kerns\n    var defaultRuleThickness = options.fontMetrics().defaultRuleThickness;\n    var vlist = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: innerGroup\n      }, {\n        type: \"kern\",\n        size: 3 * defaultRuleThickness\n      }, {\n        type: \"elem\",\n        elem: line\n      }, {\n        type: \"kern\",\n        size: defaultRuleThickness\n      }]\n    });\n    return makeSpan([\"mord\", \"overline\"], [vlist], options);\n  },\n  mathmlBuilder(group, options) {\n    var operator = new MathNode(\"mo\", [new TextNode(\"\\u203e\")]);\n    operator.setAttribute(\"stretchy\", \"true\");\n    var node = new MathNode(\"mover\", [buildGroup(group.body, options), operator]);\n    node.setAttribute(\"accent\", \"true\");\n    return node;\n  }\n});\n\ndefineFunction({\n  type: \"phantom\",\n  names: [\"\\\\phantom\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"phantom\",\n      mode: parser.mode,\n      body: ordargument(body)\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var elements = buildExpression$1(group.body, options.withPhantom(), false);\n    // \\phantom isn't supposed to affect the elements it contains.\n    // See \"color\" for more details.\n    return makeFragment(elements);\n  },\n  mathmlBuilder: (group, options) => {\n    var inner = buildExpression(group.body, options);\n    return new MathNode(\"mphantom\", inner);\n  }\n});\ndefineMacro(\"\\\\hphantom\", \"\\\\smash{\\\\phantom{#1}}\");\ndefineFunction({\n  type: \"vphantom\",\n  names: [\"\\\\vphantom\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler: (_ref2, args) => {\n    var {\n      parser\n    } = _ref2;\n    var body = args[0];\n    return {\n      type: \"vphantom\",\n      mode: parser.mode,\n      body\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var inner = makeSpan([\"inner\"], [buildGroup$1(group.body, options.withPhantom())]);\n    var fix = makeSpan([\"fix\"], []);\n    return makeSpan([\"mord\", \"rlap\"], [inner, fix], options);\n  },\n  mathmlBuilder: (group, options) => {\n    var inner = buildExpression(ordargument(group.body), options);\n    var phantom = new MathNode(\"mphantom\", inner);\n    var node = new MathNode(\"mpadded\", [phantom]);\n    node.setAttribute(\"width\", \"0px\");\n    return node;\n  }\n});\n\n// Box manipulation\ndefineFunction({\n  type: \"raisebox\",\n  names: [\"\\\\raisebox\"],\n  props: {\n    numArgs: 2,\n    argTypes: [\"size\", \"hbox\"],\n    allowedInText: true\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    var amount = assertNodeType(args[0], \"size\").value;\n    var body = args[1];\n    return {\n      type: \"raisebox\",\n      mode: parser.mode,\n      dy: amount,\n      body\n    };\n  },\n  htmlBuilder(group, options) {\n    var body = buildGroup$1(group.body, options);\n    var dy = calculateSize(group.dy, options);\n    return makeVList({\n      positionType: \"shift\",\n      positionData: -dy,\n      children: [{\n        type: \"elem\",\n        elem: body\n      }]\n    });\n  },\n  mathmlBuilder(group, options) {\n    var node = new MathNode(\"mpadded\", [buildGroup(group.body, options)]);\n    var dy = group.dy.number + group.dy.unit;\n    node.setAttribute(\"voffset\", dy);\n    return node;\n  }\n});\n\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\relax\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInArgument: true\n  },\n  handler(_ref) {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"internal\",\n      mode: parser.mode\n    };\n  }\n});\n\ndefineFunction({\n  type: \"rule\",\n  names: [\"\\\\rule\"],\n  props: {\n    numArgs: 2,\n    numOptionalArgs: 1,\n    allowedInText: true,\n    allowedInMath: true,\n    argTypes: [\"size\", \"size\", \"size\"]\n  },\n  handler(_ref, args, optArgs) {\n    var {\n      parser\n    } = _ref;\n    var shift = optArgs[0];\n    var width = assertNodeType(args[0], \"size\");\n    var height = assertNodeType(args[1], \"size\");\n    return {\n      type: \"rule\",\n      mode: parser.mode,\n      shift: shift && assertNodeType(shift, \"size\").value,\n      width: width.value,\n      height: height.value\n    };\n  },\n  htmlBuilder(group, options) {\n    // Make an empty span for the rule\n    var rule = makeSpan([\"mord\", \"rule\"], [], options);\n    // Calculate the shift, width, and height of the rule, and account for units\n    var width = calculateSize(group.width, options);\n    var height = calculateSize(group.height, options);\n    var shift = group.shift ? calculateSize(group.shift, options) : 0;\n    // Style the rule to the right size\n    rule.style.borderRightWidth = makeEm(width);\n    rule.style.borderTopWidth = makeEm(height);\n    rule.style.bottom = makeEm(shift);\n    // Record the height and width\n    rule.width = width;\n    rule.height = height + shift;\n    rule.depth = -shift;\n    // Font size is the number large enough that the browser will\n    // reserve at least `absHeight` space above the baseline.\n    // The 1.125 factor was empirically determined\n    rule.maxFontSize = height * 1.125 * options.sizeMultiplier;\n    return rule;\n  },\n  mathmlBuilder(group, options) {\n    var width = calculateSize(group.width, options);\n    var height = calculateSize(group.height, options);\n    var shift = group.shift ? calculateSize(group.shift, options) : 0;\n    var color = options.color && options.getColor() || \"black\";\n    var rule = new MathNode(\"mspace\");\n    rule.setAttribute(\"mathbackground\", color);\n    rule.setAttribute(\"width\", makeEm(width));\n    rule.setAttribute(\"height\", makeEm(height));\n    var wrapper = new MathNode(\"mpadded\", [rule]);\n    if (shift >= 0) {\n      wrapper.setAttribute(\"height\", makeEm(shift));\n    } else {\n      wrapper.setAttribute(\"height\", makeEm(shift));\n      wrapper.setAttribute(\"depth\", makeEm(-shift));\n    }\n    wrapper.setAttribute(\"voffset\", makeEm(shift));\n    return wrapper;\n  }\n});\n\nfunction sizingGroup(value, options, baseOptions) {\n  var inner = buildExpression$1(value, options, false);\n  var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier;\n  // Add size-resetting classes to the inner list and set maxFontSize\n  // manually. Handle nested size changes.\n  for (var i = 0; i < inner.length; i++) {\n    var pos = inner[i].classes.indexOf(\"sizing\");\n    if (pos < 0) {\n      Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions));\n    } else if (inner[i].classes[pos + 1] === \"reset-size\" + options.size) {\n      // This is a nested size change: e.g., inner[i] is the \"b\" in\n      // `\\Huge a \\small b`. Override the old size (the `reset-` class)\n      // but not the new size.\n      inner[i].classes[pos + 1] = \"reset-size\" + baseOptions.size;\n    }\n    inner[i].height *= multiplier;\n    inner[i].depth *= multiplier;\n  }\n  return makeFragment(inner);\n}\nvar sizeFuncs = [\"\\\\tiny\", \"\\\\sixptsize\", \"\\\\scriptsize\", \"\\\\footnotesize\", \"\\\\small\", \"\\\\normalsize\", \"\\\\large\", \"\\\\Large\", \"\\\\LARGE\", \"\\\\huge\", \"\\\\Huge\"];\nvar htmlBuilder = (group, options) => {\n  // Handle sizing operators like \\Huge. Real TeX doesn't actually allow\n  // these functions inside of math expressions, so we do some special\n  // handling.\n  var newOptions = options.havingSize(group.size);\n  return sizingGroup(group.body, newOptions, options);\n};\ndefineFunction({\n  type: \"sizing\",\n  names: sizeFuncs,\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler: (_ref, args) => {\n    var {\n      breakOnTokenText,\n      funcName,\n      parser\n    } = _ref;\n    var body = parser.parseExpression(false, breakOnTokenText);\n    return {\n      type: \"sizing\",\n      mode: parser.mode,\n      // Figure out what size to use based on the list of functions above\n      size: sizeFuncs.indexOf(funcName) + 1,\n      body\n    };\n  },\n  htmlBuilder,\n  mathmlBuilder: (group, options) => {\n    var newOptions = options.havingSize(group.size);\n    var inner = buildExpression(group.body, newOptions);\n    var node = new MathNode(\"mstyle\", inner);\n    // TODO(emily): This doesn't produce the correct size for nested size\n    // changes, because we don't keep state of what style we're currently\n    // in, so we can't reset the size to normal before changing it.  Now\n    // that we're passing an options parameter we should be able to fix\n    // this.\n    node.setAttribute(\"mathsize\", makeEm(newOptions.sizeMultiplier));\n    return node;\n  }\n});\n\n// smash, with optional [tb], as in AMS\ndefineFunction({\n  type: \"smash\",\n  names: [\"\\\\smash\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1,\n    allowedInText: true\n  },\n  handler: (_ref, args, optArgs) => {\n    var {\n      parser\n    } = _ref;\n    var smashHeight = false;\n    var smashDepth = false;\n    var tbArg = optArgs[0] && assertNodeType(optArgs[0], \"ordgroup\");\n    if (tbArg) {\n      // Optional [tb] argument is engaged.\n      // ref: amsmath: \\renewcommand{\\smash}[1][tb]{%\n      //               def\\mb@t{\\ht}\\def\\mb@b{\\dp}\\def\\mb@tb{\\ht\\z@\\z@\\dp}%\n      var letter = \"\";\n      for (var i = 0; i < tbArg.body.length; ++i) {\n        var node = tbArg.body[i];\n        letter = assertSymbolNodeType(node).text;\n        if (letter === \"t\") {\n          smashHeight = true;\n        } else if (letter === \"b\") {\n          smashDepth = true;\n        } else {\n          smashHeight = false;\n          smashDepth = false;\n          break;\n        }\n      }\n    } else {\n      smashHeight = true;\n      smashDepth = true;\n    }\n    var body = args[0];\n    return {\n      type: \"smash\",\n      mode: parser.mode,\n      body,\n      smashHeight,\n      smashDepth\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var node = makeSpan([], [buildGroup$1(group.body, options)]);\n    if (!group.smashHeight && !group.smashDepth) {\n      return node;\n    }\n    if (group.smashHeight) {\n      node.height = 0;\n    }\n    if (group.smashDepth) {\n      node.depth = 0;\n    }\n    if (group.smashHeight && group.smashDepth) {\n      // Symmetric \\smash can stay in inline layout.\n      return makeSpan([\"mord\", \"smash\"], [node], options);\n    }\n    // In order to influence makeVList for asymmetric smashing, we have to\n    // reset the children.\n    if (node.children) {\n      for (var i = 0; i < node.children.length; i++) {\n        if (group.smashHeight) {\n          node.children[i].height = 0;\n        }\n        if (group.smashDepth) {\n          node.children[i].depth = 0;\n        }\n      }\n    }\n    // At this point, we've reset the TeX-like height and depth values.\n    // But the span still has an HTML line height.\n    // makeVList applies \"display: table-cell\", which prevents the browser\n    // from acting on that line height. So we'll call makeVList now.\n    var smashedNode = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: node\n      }]\n    });\n    // For spacing, TeX treats \\smash as a math group (same spacing as ord).\n    return makeSpan([\"mord\"], [smashedNode], options);\n  },\n  mathmlBuilder: (group, options) => {\n    var node = new MathNode(\"mpadded\", [buildGroup(group.body, options)]);\n    if (group.smashHeight) {\n      node.setAttribute(\"height\", \"0px\");\n    }\n    if (group.smashDepth) {\n      node.setAttribute(\"depth\", \"0px\");\n    }\n    return node;\n  }\n});\n\ndefineFunction({\n  type: \"sqrt\",\n  names: [\"\\\\sqrt\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1\n  },\n  handler(_ref, args, optArgs) {\n    var {\n      parser\n    } = _ref;\n    var index = optArgs[0];\n    var body = args[0];\n    return {\n      type: \"sqrt\",\n      mode: parser.mode,\n      body,\n      index\n    };\n  },\n  htmlBuilder(group, options) {\n    // Square roots are handled in the TeXbook pg. 443, Rule 11.\n    // First, we do the same steps as in overline to build the inner group\n    // and line\n    var inner = buildGroup$1(group.body, options.havingCrampedStyle());\n    if (inner.height === 0) {\n      // Render a small surd.\n      inner.height = options.fontMetrics().xHeight;\n    }\n    // Some groups can return document fragments.  Handle those by wrapping\n    // them in a span.\n    inner = wrapFragment(inner, options);\n    // Calculate the minimum size for the \\surd delimiter\n    var metrics = options.fontMetrics();\n    var theta = metrics.defaultRuleThickness;\n    var phi = theta;\n    if (options.style.id < Style$1.TEXT.id) {\n      phi = options.fontMetrics().xHeight;\n    }\n    // Calculate the clearance between the body and line\n    var lineClearance = theta + phi / 4;\n    var minDelimiterHeight = inner.height + inner.depth + lineClearance + theta;\n    // Create a sqrt SVG of the required minimum size\n    var {\n      span: img,\n      ruleWidth,\n      advanceWidth\n    } = makeSqrtImage(minDelimiterHeight, options);\n    var delimDepth = img.height - ruleWidth;\n    // Adjust the clearance based on the delimiter size\n    if (delimDepth > inner.height + inner.depth + lineClearance) {\n      lineClearance = (lineClearance + delimDepth - inner.height - inner.depth) / 2;\n    }\n    // Shift the sqrt image\n    var imgShift = img.height - inner.height - lineClearance - ruleWidth;\n    inner.style.paddingLeft = makeEm(advanceWidth);\n    // Overlay the image and the argument.\n    var body = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: inner,\n        wrapperClasses: [\"svg-align\"]\n      }, {\n        type: \"kern\",\n        size: -(inner.height + imgShift)\n      }, {\n        type: \"elem\",\n        elem: img\n      }, {\n        type: \"kern\",\n        size: ruleWidth\n      }]\n    });\n    if (!group.index) {\n      return makeSpan([\"mord\", \"sqrt\"], [body], options);\n    } else {\n      // Handle the optional root index\n      // The index is always in scriptscript style\n      var newOptions = options.havingStyle(Style$1.SCRIPTSCRIPT);\n      var rootm = buildGroup$1(group.index, newOptions, options);\n      // The amount the index is shifted by. This is taken from the TeX\n      // source, in the definition of `\\r@@t`.\n      var toShift = 0.6 * (body.height - body.depth);\n      // Build a VList with the superscript shifted up correctly\n      var rootVList = makeVList({\n        positionType: \"shift\",\n        positionData: -toShift,\n        children: [{\n          type: \"elem\",\n          elem: rootm\n        }]\n      });\n      // Add a class surrounding it so we can add on the appropriate\n      // kerning\n      var rootVListWrap = makeSpan([\"root\"], [rootVList]);\n      return makeSpan([\"mord\", \"sqrt\"], [rootVListWrap, body], options);\n    }\n  },\n  mathmlBuilder(group, options) {\n    var {\n      body,\n      index\n    } = group;\n    return index ? new MathNode(\"mroot\", [buildGroup(body, options), buildGroup(index, options)]) : new MathNode(\"msqrt\", [buildGroup(body, options)]);\n  }\n});\n\nvar styleMap = {\n  \"display\": Style$1.DISPLAY,\n  \"text\": Style$1.TEXT,\n  \"script\": Style$1.SCRIPT,\n  \"scriptscript\": Style$1.SCRIPTSCRIPT\n};\ndefineFunction({\n  type: \"styling\",\n  names: [\"\\\\displaystyle\", \"\\\\textstyle\", \"\\\\scriptstyle\", \"\\\\scriptscriptstyle\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler(_ref, args) {\n    var {\n      breakOnTokenText,\n      funcName,\n      parser\n    } = _ref;\n    // parse out the implicit body\n    var body = parser.parseExpression(true, breakOnTokenText);\n    // TODO: Refactor to avoid duplicating styleMap in multiple places (e.g.\n    // here and in buildHTML and de-dupe the enumeration of all the styles).\n    // TODO(ts): The names above exactly match the styles.\n    var style = funcName.slice(1, funcName.length - 5);\n    return {\n      type: \"styling\",\n      mode: parser.mode,\n      // Figure out what style to use by pulling out the style from\n      // the function name\n      style,\n      body\n    };\n  },\n  htmlBuilder(group, options) {\n    // Style changes are handled in the TeXbook on pg. 442, Rule 3.\n    var newStyle = styleMap[group.style];\n    var newOptions = options.havingStyle(newStyle).withFont('');\n    return sizingGroup(group.body, newOptions, options);\n  },\n  mathmlBuilder(group, options) {\n    // Figure out what style we're changing to.\n    var newStyle = styleMap[group.style];\n    var newOptions = options.havingStyle(newStyle);\n    var inner = buildExpression(group.body, newOptions);\n    var node = new MathNode(\"mstyle\", inner);\n    var styleAttributes = {\n      \"display\": [\"0\", \"true\"],\n      \"text\": [\"0\", \"false\"],\n      \"script\": [\"1\", \"false\"],\n      \"scriptscript\": [\"2\", \"false\"]\n    };\n    var attr = styleAttributes[group.style];\n    node.setAttribute(\"scriptlevel\", attr[0]);\n    node.setAttribute(\"displaystyle\", attr[1]);\n    return node;\n  }\n});\n\n/**\n * Sometimes, groups perform special rules when they have superscripts or\n * subscripts attached to them. This function lets the `supsub` group know that\n * Sometimes, groups perform special rules when they have superscripts or\n * its inner element should handle the superscripts and subscripts instead of\n * handling them itself.\n */\nvar htmlBuilderDelegate = function htmlBuilderDelegate(group, options) {\n  var base = group.base;\n  if (!base) {\n    return null;\n  } else if (base.type === \"op\") {\n    // Operators handle supsubs differently when they have limits\n    // (e.g. `\\displaystyle\\sum_2^3`)\n    var delegate = base.limits && (options.style.size === Style$1.DISPLAY.size || base.alwaysHandleSupSub);\n    return delegate ? htmlBuilder$2 : null;\n  } else if (base.type === \"operatorname\") {\n    var _delegate = base.alwaysHandleSupSub && (options.style.size === Style$1.DISPLAY.size || base.limits);\n    return _delegate ? htmlBuilder$1 : null;\n  } else if (base.type === \"accent\") {\n    return isCharacterBox(base.base) ? htmlBuilder$a : null;\n  } else if (base.type === \"horizBrace\") {\n    var isSup = !group.sub;\n    return isSup === base.isOver ? htmlBuilder$3 : null;\n  } else {\n    return null;\n  }\n};\n// Super scripts and subscripts, whose precise placement can depend on other\n// functions that precede them.\ndefineFunctionBuilders({\n  type: \"supsub\",\n  htmlBuilder(group, options) {\n    // Superscript and subscripts are handled in the TeXbook on page\n    // 445-446, rules 18(a-f).\n    // Here is where we defer to the inner group if it should handle\n    // superscripts and subscripts itself.\n    var builderDelegate = htmlBuilderDelegate(group, options);\n    if (builderDelegate) {\n      return builderDelegate(group, options);\n    }\n    var {\n      base: valueBase,\n      sup: valueSup,\n      sub: valueSub\n    } = group;\n    var base = buildGroup$1(valueBase, options);\n    var supm;\n    var subm;\n    var metrics = options.fontMetrics();\n    // Rule 18a\n    var supShift = 0;\n    var subShift = 0;\n    var isCharBox = valueBase && isCharacterBox(valueBase);\n    if (valueSup) {\n      var newOptions = options.havingStyle(options.style.sup());\n      supm = buildGroup$1(valueSup, newOptions, options);\n      if (!isCharBox) {\n        supShift = base.height - newOptions.fontMetrics().supDrop * newOptions.sizeMultiplier / options.sizeMultiplier;\n      }\n    }\n    if (valueSub) {\n      var _newOptions = options.havingStyle(options.style.sub());\n      subm = buildGroup$1(valueSub, _newOptions, options);\n      if (!isCharBox) {\n        subShift = base.depth + _newOptions.fontMetrics().subDrop * _newOptions.sizeMultiplier / options.sizeMultiplier;\n      }\n    }\n    // Rule 18c\n    var minSupShift;\n    if (options.style === Style$1.DISPLAY) {\n      minSupShift = metrics.sup1;\n    } else if (options.style.cramped) {\n      minSupShift = metrics.sup3;\n    } else {\n      minSupShift = metrics.sup2;\n    }\n    // scriptspace is a font-size-independent size, so scale it\n    // appropriately for use as the marginRight.\n    var multiplier = options.sizeMultiplier;\n    var marginRight = makeEm(0.5 / metrics.ptPerEm / multiplier);\n    var marginLeft = null;\n    if (subm) {\n      // Subscripts shouldn't be shifted by the base's italic correction.\n      // Account for that by shifting the subscript back the appropriate\n      // amount. Note we only do this when the base is a single symbol.\n      var isOiint = group.base && group.base.type === \"op\" && group.base.name && (group.base.name === \"\\\\oiint\" || group.base.name === \"\\\\oiiint\");\n      if (base instanceof SymbolNode || isOiint) {\n        // @ts-ignore\n        marginLeft = makeEm(-base.italic);\n      }\n    }\n    var supsub;\n    if (supm && subm) {\n      supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);\n      subShift = Math.max(subShift, metrics.sub2);\n      var ruleWidth = metrics.defaultRuleThickness;\n      // Rule 18e\n      var maxWidth = 4 * ruleWidth;\n      if (supShift - supm.depth - (subm.height - subShift) < maxWidth) {\n        subShift = maxWidth - (supShift - supm.depth) + subm.height;\n        var psi = 0.8 * metrics.xHeight - (supShift - supm.depth);\n        if (psi > 0) {\n          supShift += psi;\n          subShift -= psi;\n        }\n      }\n      var vlistElem = [{\n        type: \"elem\",\n        elem: subm,\n        shift: subShift,\n        marginRight,\n        marginLeft\n      }, {\n        type: \"elem\",\n        elem: supm,\n        shift: -supShift,\n        marginRight\n      }];\n      supsub = makeVList({\n        positionType: \"individualShift\",\n        children: vlistElem\n      });\n    } else if (subm) {\n      // Rule 18b\n      subShift = Math.max(subShift, metrics.sub1, subm.height - 0.8 * metrics.xHeight);\n      var _vlistElem = [{\n        type: \"elem\",\n        elem: subm,\n        marginLeft,\n        marginRight\n      }];\n      supsub = makeVList({\n        positionType: \"shift\",\n        positionData: subShift,\n        children: _vlistElem\n      });\n    } else if (supm) {\n      // Rule 18c, d\n      supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);\n      supsub = makeVList({\n        positionType: \"shift\",\n        positionData: -supShift,\n        children: [{\n          type: \"elem\",\n          elem: supm,\n          marginRight\n        }]\n      });\n    } else {\n      throw new Error(\"supsub must have either sup or sub.\");\n    }\n    // Wrap the supsub vlist in a span.msupsub to reset text-align.\n    var mclass = getTypeOfDomTree(base, \"right\") || \"mord\";\n    return makeSpan([mclass], [base, makeSpan([\"msupsub\"], [supsub])], options);\n  },\n  mathmlBuilder(group, options) {\n    // Is the inner group a relevant horizontal brace?\n    var isBrace = false;\n    var isOver;\n    var isSup;\n    if (group.base && group.base.type === \"horizBrace\") {\n      isSup = !!group.sup;\n      if (isSup === group.base.isOver) {\n        isBrace = true;\n        isOver = group.base.isOver;\n      }\n    }\n    if (group.base && (group.base.type === \"op\" || group.base.type === \"operatorname\")) {\n      group.base.parentIsSupSub = true;\n    }\n    var children = [buildGroup(group.base, options)];\n    if (group.sub) {\n      children.push(buildGroup(group.sub, options));\n    }\n    if (group.sup) {\n      children.push(buildGroup(group.sup, options));\n    }\n    var nodeType;\n    if (isBrace) {\n      nodeType = isOver ? \"mover\" : \"munder\";\n    } else if (!group.sub) {\n      var base = group.base;\n      if (base && base.type === \"op\" && base.limits && (options.style === Style$1.DISPLAY || base.alwaysHandleSupSub)) {\n        nodeType = \"mover\";\n      } else if (base && base.type === \"operatorname\" && base.alwaysHandleSupSub && (base.limits || options.style === Style$1.DISPLAY)) {\n        nodeType = \"mover\";\n      } else {\n        nodeType = \"msup\";\n      }\n    } else if (!group.sup) {\n      var _base = group.base;\n      if (_base && _base.type === \"op\" && _base.limits && (options.style === Style$1.DISPLAY || _base.alwaysHandleSupSub)) {\n        nodeType = \"munder\";\n      } else if (_base && _base.type === \"operatorname\" && _base.alwaysHandleSupSub && (_base.limits || options.style === Style$1.DISPLAY)) {\n        nodeType = \"munder\";\n      } else {\n        nodeType = \"msub\";\n      }\n    } else {\n      var _base2 = group.base;\n      if (_base2 && _base2.type === \"op\" && _base2.limits && options.style === Style$1.DISPLAY) {\n        nodeType = \"munderover\";\n      } else if (_base2 && _base2.type === \"operatorname\" && _base2.alwaysHandleSupSub && (options.style === Style$1.DISPLAY || _base2.limits)) {\n        nodeType = \"munderover\";\n      } else {\n        nodeType = \"msubsup\";\n      }\n    }\n    return new MathNode(nodeType, children);\n  }\n});\n\n// Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js.\ndefineFunctionBuilders({\n  type: \"atom\",\n  htmlBuilder(group, options) {\n    return mathsym(group.text, group.mode, options, [\"m\" + group.family]);\n  },\n  mathmlBuilder(group, options) {\n    var node = new MathNode(\"mo\", [makeText(group.text, group.mode)]);\n    if (group.family === \"bin\") {\n      var variant = getVariant(group, options);\n      if (variant === \"bold-italic\") {\n        node.setAttribute(\"mathvariant\", variant);\n      }\n    } else if (group.family === \"punct\") {\n      node.setAttribute(\"separator\", \"true\");\n    } else if (group.family === \"open\" || group.family === \"close\") {\n      // Delims built here should not stretch vertically.\n      // See delimsizing.js for stretchy delims.\n      node.setAttribute(\"stretchy\", \"false\");\n    }\n    return node;\n  }\n});\n\n// \"mathord\" and \"textord\" ParseNodes created in Parser.js from symbol Groups in\n// src/symbols.js.\nvar defaultVariant = {\n  \"mi\": \"italic\",\n  \"mn\": \"normal\",\n  \"mtext\": \"normal\"\n};\ndefineFunctionBuilders({\n  type: \"mathord\",\n  htmlBuilder(group, options) {\n    return makeOrd(group, options, \"mathord\");\n  },\n  mathmlBuilder(group, options) {\n    var node = new MathNode(\"mi\", [makeText(group.text, group.mode, options)]);\n    var variant = getVariant(group, options) || \"italic\";\n    if (variant !== defaultVariant[node.type]) {\n      node.setAttribute(\"mathvariant\", variant);\n    }\n    return node;\n  }\n});\ndefineFunctionBuilders({\n  type: \"textord\",\n  htmlBuilder(group, options) {\n    return makeOrd(group, options, \"textord\");\n  },\n  mathmlBuilder(group, options) {\n    var text = makeText(group.text, group.mode, options);\n    var variant = getVariant(group, options) || \"normal\";\n    var node;\n    if (group.mode === 'text') {\n      node = new MathNode(\"mtext\", [text]);\n    } else if (/[0-9]/.test(group.text)) {\n      node = new MathNode(\"mn\", [text]);\n    } else if (group.text === \"\\\\prime\") {\n      node = new MathNode(\"mo\", [text]);\n    } else {\n      node = new MathNode(\"mi\", [text]);\n    }\n    if (variant !== defaultVariant[node.type]) {\n      node.setAttribute(\"mathvariant\", variant);\n    }\n    return node;\n  }\n});\n\n// A map of CSS-based spacing functions to their CSS class.\nvar cssSpace = {\n  \"\\\\nobreak\": \"nobreak\",\n  \"\\\\allowbreak\": \"allowbreak\"\n};\n// A lookup table to determine whether a spacing function/symbol should be\n// treated like a regular space character.  If a symbol or command is a key\n// in this table, then it should be a regular space character.  Furthermore,\n// the associated value may have a `className` specifying an extra CSS class\n// to add to the created `span`.\nvar regularSpace = {\n  \" \": {},\n  \"\\\\ \": {},\n  \"~\": {\n    className: \"nobreak\"\n  },\n  \"\\\\space\": {},\n  \"\\\\nobreakspace\": {\n    className: \"nobreak\"\n  }\n};\n// ParseNode<\"spacing\"> created in Parser.js from the \"spacing\" symbol Groups in\n// src/symbols.js.\ndefineFunctionBuilders({\n  type: \"spacing\",\n  htmlBuilder(group, options) {\n    if (regularSpace.hasOwnProperty(group.text)) {\n      var className = regularSpace[group.text].className || \"\";\n      // Spaces are generated by adding an actual space. Each of these\n      // things has an entry in the symbols table, so these will be turned\n      // into appropriate outputs.\n      if (group.mode === \"text\") {\n        var ord = makeOrd(group, options, \"textord\");\n        ord.classes.push(className);\n        return ord;\n      } else {\n        return makeSpan([\"mspace\", className], [mathsym(group.text, group.mode, options)], options);\n      }\n    } else if (cssSpace.hasOwnProperty(group.text)) {\n      // Spaces based on just a CSS class.\n      return makeSpan([\"mspace\", cssSpace[group.text]], [], options);\n    } else {\n      throw new ParseError(\"Unknown type of space \\\"\" + group.text + \"\\\"\");\n    }\n  },\n  mathmlBuilder(group, options) {\n    var node;\n    if (regularSpace.hasOwnProperty(group.text)) {\n      node = new MathNode(\"mtext\", [new TextNode(\"\\u00a0\")]);\n    } else if (cssSpace.hasOwnProperty(group.text)) {\n      // CSS-based MathML spaces (\\nobreak, \\allowbreak) are ignored\n      return new MathNode(\"mspace\");\n    } else {\n      throw new ParseError(\"Unknown type of space \\\"\" + group.text + \"\\\"\");\n    }\n    return node;\n  }\n});\n\nvar pad = () => {\n  var padNode = new MathNode(\"mtd\", []);\n  padNode.setAttribute(\"width\", \"50%\");\n  return padNode;\n};\ndefineFunctionBuilders({\n  type: \"tag\",\n  mathmlBuilder(group, options) {\n    var table = new MathNode(\"mtable\", [new MathNode(\"mtr\", [pad(), new MathNode(\"mtd\", [buildExpressionRow(group.body, options)]), pad(), new MathNode(\"mtd\", [buildExpressionRow(group.tag, options)])])]);\n    table.setAttribute(\"width\", \"100%\");\n    return table;\n    // TODO: Left-aligned tags.\n    // Currently, the group and options passed here do not contain\n    // enough info to set tag alignment. `leqno` is in Settings but it is\n    // not passed to Options. On the HTML side, leqno is\n    // set by a CSS class applied in buildTree.js. That would have worked\n    // in MathML if browsers supported <mlabeledtr>. Since they don't, we\n    // need to rewrite the way this function is called.\n  }\n});\n\n// Non-mathy text, possibly in a font\nvar textFontFamilies = {\n  \"\\\\text\": undefined,\n  \"\\\\textrm\": \"textrm\",\n  \"\\\\textsf\": \"textsf\",\n  \"\\\\texttt\": \"texttt\",\n  \"\\\\textnormal\": \"textrm\"\n};\nvar textFontWeights = {\n  \"\\\\textbf\": \"textbf\",\n  \"\\\\textmd\": \"textmd\"\n};\nvar textFontShapes = {\n  \"\\\\textit\": \"textit\",\n  \"\\\\textup\": \"textup\"\n};\nvar optionsWithFont = (group, options) => {\n  var font = group.font;\n  // Checks if the argument is a font family or a font style.\n  if (!font) {\n    return options;\n  } else if (textFontFamilies[font]) {\n    return options.withTextFontFamily(textFontFamilies[font]);\n  } else if (textFontWeights[font]) {\n    return options.withTextFontWeight(textFontWeights[font]);\n  } else if (font === \"\\\\emph\") {\n    return options.fontShape === \"textit\" ? options.withTextFontShape(\"textup\") : options.withTextFontShape(\"textit\");\n  }\n  return options.withTextFontShape(textFontShapes[font]);\n};\ndefineFunction({\n  type: \"text\",\n  names: [\n  // Font families\n  \"\\\\text\", \"\\\\textrm\", \"\\\\textsf\", \"\\\\texttt\", \"\\\\textnormal\",\n  // Font weights\n  \"\\\\textbf\", \"\\\\textmd\",\n  // Font Shapes\n  \"\\\\textit\", \"\\\\textup\", \"\\\\emph\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"text\"],\n    allowedInArgument: true,\n    allowedInText: true\n  },\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"text\",\n      mode: parser.mode,\n      body: ordargument(body),\n      font: funcName\n    };\n  },\n  htmlBuilder(group, options) {\n    var newOptions = optionsWithFont(group, options);\n    var inner = buildExpression$1(group.body, newOptions, true);\n    return makeSpan([\"mord\", \"text\"], inner, newOptions);\n  },\n  mathmlBuilder(group, options) {\n    var newOptions = optionsWithFont(group, options);\n    return buildExpressionRow(group.body, newOptions);\n  }\n});\n\ndefineFunction({\n  type: \"underline\",\n  names: [\"\\\\underline\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"underline\",\n      mode: parser.mode,\n      body: args[0]\n    };\n  },\n  htmlBuilder(group, options) {\n    // Underlines are handled in the TeXbook pg 443, Rule 10.\n    // Build the inner group.\n    var innerGroup = buildGroup$1(group.body, options);\n    // Create the line to go below the body\n    var line = makeLineSpan(\"underline-line\", options);\n    // Generate the vlist, with the appropriate kerns\n    var defaultRuleThickness = options.fontMetrics().defaultRuleThickness;\n    var vlist = makeVList({\n      positionType: \"top\",\n      positionData: innerGroup.height,\n      children: [{\n        type: \"kern\",\n        size: defaultRuleThickness\n      }, {\n        type: \"elem\",\n        elem: line\n      }, {\n        type: \"kern\",\n        size: 3 * defaultRuleThickness\n      }, {\n        type: \"elem\",\n        elem: innerGroup\n      }]\n    });\n    return makeSpan([\"mord\", \"underline\"], [vlist], options);\n  },\n  mathmlBuilder(group, options) {\n    var operator = new MathNode(\"mo\", [new TextNode(\"\\u203e\")]);\n    operator.setAttribute(\"stretchy\", \"true\");\n    var node = new MathNode(\"munder\", [buildGroup(group.body, options), operator]);\n    node.setAttribute(\"accentunder\", \"true\");\n    return node;\n  }\n});\n\n// \\vcenter:  Vertically center the argument group on the math axis.\ndefineFunction({\n  type: \"vcenter\",\n  names: [\"\\\\vcenter\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"original\"],\n    // In LaTeX, \\vcenter can act only on a box.\n    allowedInText: false\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"vcenter\",\n      mode: parser.mode,\n      body: args[0]\n    };\n  },\n  htmlBuilder(group, options) {\n    var body = buildGroup$1(group.body, options);\n    var axisHeight = options.fontMetrics().axisHeight;\n    var dy = 0.5 * (body.height - axisHeight - (body.depth + axisHeight));\n    return makeVList({\n      positionType: \"shift\",\n      positionData: dy,\n      children: [{\n        type: \"elem\",\n        elem: body\n      }]\n    });\n  },\n  mathmlBuilder(group, options) {\n    // There is no way to do this in MathML.\n    // Write a class as a breadcrumb in case some post-processor wants\n    // to perform a vcenter adjustment.\n    // Wrap in mrow to ensure valid MathML when placed inside mo (e.g., \\mathrel)\n    var mpadded = new MathNode(\"mpadded\", [buildGroup(group.body, options)], [\"vcenter\"]);\n    return new MathNode(\"mrow\", [mpadded]);\n  }\n});\n\ndefineFunction({\n  type: \"verb\",\n  names: [\"\\\\verb\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler(context, args, optArgs) {\n    // \\verb and \\verb* are dealt with directly in Parser.js.\n    // If we end up here, it's because of a failure to match the two delimiters\n    // in the regex in Lexer.js.  LaTeX raises the following error when \\verb is\n    // terminated by end of line (or file).\n    throw new ParseError(\"\\\\verb ended by end of line instead of matching delimiter\");\n  },\n  htmlBuilder(group, options) {\n    var text = makeVerb(group);\n    var body = [];\n    // \\verb enters text mode and therefore is sized like \\textstyle\n    var newOptions = options.havingStyle(options.style.text());\n    for (var i = 0; i < text.length; i++) {\n      var c = text[i];\n      if (c === '~') {\n        c = '\\\\textasciitilde';\n      }\n      body.push(makeSymbol(c, \"Typewriter-Regular\", group.mode, newOptions, [\"mord\", \"texttt\"]));\n    }\n    return makeSpan([\"mord\", \"text\"].concat(newOptions.sizingClasses(options)), tryCombineChars(body), newOptions);\n  },\n  mathmlBuilder(group, options) {\n    var text = new TextNode(makeVerb(group));\n    var node = new MathNode(\"mtext\", [text]);\n    node.setAttribute(\"mathvariant\", \"monospace\");\n    return node;\n  }\n});\n/**\n * Converts verb group into body string.\n *\n * \\verb* replaces each space with an open box \\u2423\n * \\verb replaces each space with a no-break space \\xA0\n */\nvar makeVerb = group => group.body.replace(/ /g, group.star ? '\\u2423' : '\\xA0');\n\n/** Include this to ensure that all functions are defined. */\nvar functions = _functions;\n\n/**\n * The Lexer class handles tokenizing the input in various ways. Since our\n * parser expects us to be able to backtrack, the lexer allows lexing from any\n * given starting point.\n *\n * Its main exposed function is the `lex` function, which takes a position to\n * lex from and a type of token to lex. It defers to the appropriate `_innerLex`\n * function.\n *\n * The various `_innerLex` functions perform the actual lexing of different\n * kinds.\n */\n/* The following tokenRegex\n * - matches typical whitespace (but not NBSP etc.) using its first group\n * - does not match any control character \\x00-\\x1f except whitespace\n * - does not match a bare backslash\n * - matches any ASCII character except those just mentioned\n * - does not match the BMP private use area \\uE000-\\uF8FF\n * - does not match bare surrogate code units\n * - matches any BMP character except for those just described\n * - matches any valid Unicode surrogate pair\n * - matches a backslash followed by one or more whitespace characters\n * - matches a backslash followed by one or more letters then whitespace\n * - matches a backslash followed by any BMP character\n * Capturing groups:\n *   [1] regular whitespace\n *   [2] backslash followed by whitespace\n *   [3] anything else, which may include:\n *     [4] left character of \\verb*\n *     [5] left character of \\verb\n *     [6] backslash followed by word, excluding any trailing whitespace\n * Just because the Lexer matches something doesn't mean it's valid input:\n * If there is no matching function or symbol definition, the Parser will\n * still reject the input.\n */\nvar spaceRegexString = \"[ \\r\\n\\t]\";\nvar controlWordRegexString = \"\\\\\\\\[a-zA-Z@]+\";\nvar controlSymbolRegexString = \"\\\\\\\\[^\\uD800-\\uDFFF]\";\nvar controlWordWhitespaceRegexString = \"(\" + controlWordRegexString + \")\" + spaceRegexString + \"*\";\nvar controlSpaceRegexString = \"\\\\\\\\(\\n|[ \\r\\t]+\\n?)[ \\r\\t]*\";\nvar combiningDiacriticalMarkString = \"[\\u0300-\\u036f]\";\nvar combiningDiacriticalMarksEndRegex = new RegExp(combiningDiacriticalMarkString + \"+$\");\nvar tokenRegexString = \"(\" + spaceRegexString + \"+)|\" + (// whitespace\ncontrolSpaceRegexString + \"|\") +\n// \\whitespace\n\"([!-\\\\[\\\\]-\\u2027\\u202A-\\uD7FF\\uF900-\\uFFFF]\" + (// single codepoint\ncombiningDiacriticalMarkString + \"*\") +\n// ...plus accents\n\"|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]\" + (// surrogate pair\ncombiningDiacriticalMarkString + \"*\") +\n// ...plus accents\n\"|\\\\\\\\verb\\\\*([^]).*?\\\\4\" +\n// \\verb*\n\"|\\\\\\\\verb([^*a-zA-Z]).*?\\\\5\" + (// \\verb unstarred\n\"|\" + controlWordWhitespaceRegexString) + (// \\macroName + spaces\n\"|\" + controlSymbolRegexString + \")\"); // \\\\, \\', etc.\n/** Main Lexer class */\nclass Lexer {\n  // Category codes. The lexer only supports comment characters (14) for now.\n  // MacroExpander additionally distinguishes active (13).\n\n  constructor(input, settings) {\n    // Separate accents from characters\n    this.input = input;\n    this.settings = settings;\n    this.tokenRegex = new RegExp(tokenRegexString, 'g');\n    this.catcodes = {\n      \"%\": 14,\n      // comment character\n      \"~\": 13 // active character\n    };\n  }\n  setCatcode(char, code) {\n    this.catcodes[char] = code;\n  }\n  /**\n   * This function lexes a single token.\n   */\n  lex() {\n    var input = this.input;\n    var pos = this.tokenRegex.lastIndex;\n    if (pos === input.length) {\n      return new Token(\"EOF\", new SourceLocation(this, pos, pos));\n    }\n    var match = this.tokenRegex.exec(input);\n    if (match === null || match.index !== pos) {\n      throw new ParseError(\"Unexpected character: '\" + input[pos] + \"'\", new Token(input[pos], new SourceLocation(this, pos, pos + 1)));\n    }\n    var text = match[6] || match[3] || (match[2] ? \"\\\\ \" : \" \");\n    if (this.catcodes[text] === 14) {\n      // comment character\n      var nlIndex = input.indexOf('\\n', this.tokenRegex.lastIndex);\n      if (nlIndex === -1) {\n        this.tokenRegex.lastIndex = input.length; // EOF\n        this.settings.reportNonstrict(\"commentAtEnd\", \"% comment has no terminating newline; LaTeX would \" + \"fail because of commenting the end of math mode (e.g. $)\");\n      } else {\n        this.tokenRegex.lastIndex = nlIndex + 1;\n      }\n      return this.lex();\n    }\n    return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex));\n  }\n}\n\n/**\n * A `Namespace` refers to a space of nameable things like macros or lengths,\n * which can be `set` either globally or local to a nested group, using an\n * undo stack similar to how TeX implements this functionality.\n * Performance-wise, `get` and local `set` take constant time, while global\n * `set` takes time proportional to the depth of group nesting.\n */\nclass Namespace {\n  /**\n   * Both arguments are optional.  The first argument is an object of\n   * built-in mappings which never change.  The second argument is an object\n   * of initial (global-level) mappings, which will constantly change\n   * according to any global/top-level `set`s done.\n   */\n  constructor(builtins, globalMacros) {\n    if (builtins === void 0) {\n      builtins = {};\n    }\n    if (globalMacros === void 0) {\n      globalMacros = {};\n    }\n    this.current = globalMacros;\n    this.builtins = builtins;\n    this.undefStack = [];\n  }\n  /**\n   * Start a new nested group, affecting future local `set`s.\n   */\n  beginGroup() {\n    this.undefStack.push({});\n  }\n  /**\n   * End current nested group, restoring values before the group began.\n   */\n  endGroup() {\n    if (this.undefStack.length === 0) {\n      throw new ParseError(\"Unbalanced namespace destruction: attempt \" + \"to pop global namespace; please report this as a bug\");\n    }\n    var undefs = this.undefStack.pop();\n    for (var undef in undefs) {\n      if (undefs.hasOwnProperty(undef)) {\n        if (undefs[undef] == null) {\n          delete this.current[undef];\n        } else {\n          this.current[undef] = undefs[undef];\n        }\n      }\n    }\n  }\n  /**\n   * Ends all currently nested groups (if any), restoring values before the\n   * groups began.  Useful in case of an error in the middle of parsing.\n   */\n  endGroups() {\n    while (this.undefStack.length > 0) {\n      this.endGroup();\n    }\n  }\n  /**\n   * Detect whether `name` has a definition.  Equivalent to\n   * `get(name) != null`.\n   */\n  has(name) {\n    return this.current.hasOwnProperty(name) || this.builtins.hasOwnProperty(name);\n  }\n  /**\n   * Get the current value of a name, or `undefined` if there is no value.\n   *\n   * Note: Do not use `if (namespace.get(...))` to detect whether a macro\n   * is defined, as the definition may be the empty string which evaluates\n   * to `false` in JavaScript.  Use `if (namespace.get(...) != null)` or\n   * `if (namespace.has(...))`.\n   */\n  get(name) {\n    if (this.current.hasOwnProperty(name)) {\n      return this.current[name];\n    } else {\n      return this.builtins[name];\n    }\n  }\n  /**\n   * Set the current value of a name, and optionally set it globally too.\n   * Local set() sets the current value and (when appropriate) adds an undo\n   * operation to the undo stack.  Global set() may change the undo\n   * operation at every level, so takes time linear in their number.\n   * A value of undefined means to delete existing definitions.\n   */\n  set(name, value, global) {\n    if (global === void 0) {\n      global = false;\n    }\n    if (global) {\n      // Global set is equivalent to setting in all groups.  Simulate this\n      // by destroying any undos currently scheduled for this name,\n      // and adding an undo with the *new* value (in case it later gets\n      // locally reset within this environment).\n      for (var i = 0; i < this.undefStack.length; i++) {\n        delete this.undefStack[i][name];\n      }\n      if (this.undefStack.length > 0) {\n        this.undefStack[this.undefStack.length - 1][name] = value;\n      }\n    } else {\n      // Undo this set at end of this group (possibly to `undefined`),\n      // unless an undo is already in place, in which case that older\n      // value is the correct one.\n      var top = this.undefStack[this.undefStack.length - 1];\n      if (top && !top.hasOwnProperty(name)) {\n        top[name] = this.current[name];\n      }\n    }\n    if (value == null) {\n      delete this.current[name];\n    } else {\n      this.current[name] = value;\n    }\n  }\n}\n\n/**\n * Predefined macros for KaTeX.\n * This can be used to define some commands in terms of others.\n */\nvar macros = _macros;\n//////////////////////////////////////////////////////////////////////\n// macro tools\ndefineMacro(\"\\\\noexpand\", function (context) {\n  // The expansion is the token itself; but that token is interpreted\n  // as if its meaning were ‘\\relax’ if it is a control sequence that\n  // would ordinarily be expanded by TeX’s expansion rules.\n  var t = context.popToken();\n  if (context.isExpandable(t.text)) {\n    t.noexpand = true;\n    t.treatAsRelax = true;\n  }\n  return {\n    tokens: [t],\n    numArgs: 0\n  };\n});\ndefineMacro(\"\\\\expandafter\", function (context) {\n  // TeX first reads the token that comes immediately after \\expandafter,\n  // without expanding it; let’s call this token t. Then TeX reads the\n  // token that comes after t (and possibly more tokens, if that token\n  // has an argument), replacing it by its expansion. Finally TeX puts\n  // t back in front of that expansion.\n  var t = context.popToken();\n  context.expandOnce(true); // expand only an expandable token\n  return {\n    tokens: [t],\n    numArgs: 0\n  };\n});\n// LaTeX's \\@firstoftwo{#1}{#2} expands to #1, skipping #2\n// TeX source: \\long\\def\\@firstoftwo#1#2{#1}\ndefineMacro(\"\\\\@firstoftwo\", function (context) {\n  var args = context.consumeArgs(2);\n  return {\n    tokens: args[0],\n    numArgs: 0\n  };\n});\n// LaTeX's \\@secondoftwo{#1}{#2} expands to #2, skipping #1\n// TeX source: \\long\\def\\@secondoftwo#1#2{#2}\ndefineMacro(\"\\\\@secondoftwo\", function (context) {\n  var args = context.consumeArgs(2);\n  return {\n    tokens: args[1],\n    numArgs: 0\n  };\n});\n// LaTeX's \\@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded)\n// symbol that isn't a space, consuming any spaces but not consuming the\n// first nonspace character.  If that nonspace character matches #1, then\n// the macro expands to #2; otherwise, it expands to #3.\ndefineMacro(\"\\\\@ifnextchar\", function (context) {\n  var args = context.consumeArgs(3); // symbol, if, else\n  context.consumeSpaces();\n  var nextToken = context.future();\n  if (args[0].length === 1 && args[0][0].text === nextToken.text) {\n    return {\n      tokens: args[1],\n      numArgs: 0\n    };\n  } else {\n    return {\n      tokens: args[2],\n      numArgs: 0\n    };\n  }\n});\n// LaTeX's \\@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol.\n// If it is `*`, then it consumes the symbol, and the macro expands to #1;\n// otherwise, the macro expands to #2 (without consuming the symbol).\n// TeX source: \\def\\@ifstar#1{\\@ifnextchar *{\\@firstoftwo{#1}}}\ndefineMacro(\"\\\\@ifstar\", \"\\\\@ifnextchar *{\\\\@firstoftwo{#1}}\");\n// LaTeX's \\TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode\ndefineMacro(\"\\\\TextOrMath\", function (context) {\n  var args = context.consumeArgs(2);\n  if (context.mode === 'text') {\n    return {\n      tokens: args[0],\n      numArgs: 0\n    };\n  } else {\n    return {\n      tokens: args[1],\n      numArgs: 0\n    };\n  }\n});\n// Lookup table for parsing numbers in base 8 through 16\nvar digitToNumber = {\n  \"0\": 0,\n  \"1\": 1,\n  \"2\": 2,\n  \"3\": 3,\n  \"4\": 4,\n  \"5\": 5,\n  \"6\": 6,\n  \"7\": 7,\n  \"8\": 8,\n  \"9\": 9,\n  \"a\": 10,\n  \"A\": 10,\n  \"b\": 11,\n  \"B\": 11,\n  \"c\": 12,\n  \"C\": 12,\n  \"d\": 13,\n  \"D\": 13,\n  \"e\": 14,\n  \"E\": 14,\n  \"f\": 15,\n  \"F\": 15\n};\n// TeX \\char makes a literal character (catcode 12) using the following forms:\n// (see The TeXBook, p. 43)\n//   \\char123  -- decimal\n//   \\char'123 -- octal\n//   \\char\"123 -- hex\n//   \\char`x   -- character that can be written (i.e. isn't active)\n//   \\char`\\x  -- character that cannot be written (e.g. %)\n// These all refer to characters from the font, so we turn them into special\n// calls to a function \\@char dealt with in the Parser.\ndefineMacro(\"\\\\char\", function (context) {\n  var token = context.popToken();\n  var base;\n  var number = 0;\n  if (token.text === \"'\") {\n    base = 8;\n    token = context.popToken();\n  } else if (token.text === '\"') {\n    base = 16;\n    token = context.popToken();\n  } else if (token.text === \"`\") {\n    token = context.popToken();\n    if (token.text[0] === \"\\\\\") {\n      number = token.text.charCodeAt(1);\n    } else if (token.text === \"EOF\") {\n      throw new ParseError(\"\\\\char` missing argument\");\n    } else {\n      number = token.text.charCodeAt(0);\n    }\n  } else {\n    base = 10;\n  }\n  if (base) {\n    // Parse a number in the given base, starting with first `token`.\n    number = digitToNumber[token.text];\n    if (number == null || number >= base) {\n      throw new ParseError(\"Invalid base-\" + base + \" digit \" + token.text);\n    }\n    var digit;\n    while ((digit = digitToNumber[context.future().text]) != null && digit < base) {\n      number *= base;\n      number += digit;\n      context.popToken();\n    }\n  }\n  return \"\\\\@char{\" + number + \"}\";\n});\n// \\newcommand{\\macro}[args]{definition}\n// \\renewcommand{\\macro}[args]{definition}\n// TODO: Optional arguments: \\newcommand{\\macro}[args][default]{definition}\nvar newcommand = (context, existsOK, nonexistsOK, skipIfExists) => {\n  var arg = context.consumeArg().tokens;\n  if (arg.length !== 1) {\n    throw new ParseError(\"\\\\newcommand's first argument must be a macro name\");\n  }\n  var name = arg[0].text;\n  var exists = context.isDefined(name);\n  if (exists && !existsOK) {\n    throw new ParseError(\"\\\\newcommand{\" + name + \"} attempting to redefine \" + (name + \"; use \\\\renewcommand\"));\n  }\n  if (!exists && !nonexistsOK) {\n    throw new ParseError(\"\\\\renewcommand{\" + name + \"} when command \" + name + \" \" + \"does not yet exist; use \\\\newcommand\");\n  }\n  var numArgs = 0;\n  arg = context.consumeArg().tokens;\n  if (arg.length === 1 && arg[0].text === \"[\") {\n    var argText = '';\n    var token = context.expandNextToken();\n    while (token.text !== \"]\" && token.text !== \"EOF\") {\n      // TODO: Should properly expand arg, e.g., ignore {}s\n      argText += token.text;\n      token = context.expandNextToken();\n    }\n    if (!argText.match(/^\\s*[0-9]+\\s*$/)) {\n      throw new ParseError(\"Invalid number of arguments: \" + argText);\n    }\n    numArgs = parseInt(argText);\n    arg = context.consumeArg().tokens;\n  }\n  if (!(exists && skipIfExists)) {\n    // Final arg is the expansion of the macro\n    context.macros.set(name, {\n      tokens: arg,\n      numArgs\n    });\n  }\n  return '';\n};\ndefineMacro(\"\\\\newcommand\", context => newcommand(context, false, true, false));\ndefineMacro(\"\\\\renewcommand\", context => newcommand(context, true, false, false));\ndefineMacro(\"\\\\providecommand\", context => newcommand(context, true, true, true));\n// terminal (console) tools\ndefineMacro(\"\\\\message\", context => {\n  var arg = context.consumeArgs(1)[0];\n  // eslint-disable-next-line no-console\n  console.log(arg.reverse().map(token => token.text).join(\"\"));\n  return '';\n});\ndefineMacro(\"\\\\errmessage\", context => {\n  var arg = context.consumeArgs(1)[0];\n  // eslint-disable-next-line no-console\n  console.error(arg.reverse().map(token => token.text).join(\"\"));\n  return '';\n});\ndefineMacro(\"\\\\show\", context => {\n  var tok = context.popToken();\n  var name = tok.text;\n  // eslint-disable-next-line no-console\n  console.log(tok, context.macros.get(name), functions[name], symbols.math[name], symbols.text[name]);\n  return '';\n});\n//////////////////////////////////////////////////////////////////////\n// Grouping\n// \\let\\bgroup={ \\let\\egroup=}\ndefineMacro(\"\\\\bgroup\", \"{\");\ndefineMacro(\"\\\\egroup\", \"}\");\n// Symbols from latex.ltx:\n// \\def~{\\nobreakspace{}}\n// \\def\\lq{`}\n// \\def\\rq{'}\n// \\def \\aa {\\r a}\n// \\def \\AA {\\r A}\ndefineMacro(\"~\", \"\\\\nobreakspace\");\ndefineMacro(\"\\\\lq\", \"`\");\ndefineMacro(\"\\\\rq\", \"'\");\ndefineMacro(\"\\\\aa\", \"\\\\r a\");\ndefineMacro(\"\\\\AA\", \"\\\\r A\");\n// Copyright (C) and registered (R) symbols. Use raw symbol in MathML.\n// \\DeclareTextCommandDefault{\\textcopyright}{\\textcircled{c}}\n// \\DeclareTextCommandDefault{\\textregistered}{\\textcircled{%\n//      \\check@mathfonts\\fontsize\\sf@size\\z@\\math@fontsfalse\\selectfont R}}\n// \\DeclareRobustCommand{\\copyright}{%\n//    \\ifmmode{\\nfss@text{\\textcopyright}}\\else\\textcopyright\\fi}\ndefineMacro(\"\\\\textcopyright\", \"\\\\html@mathml{\\\\textcircled{c}}{\\\\char`©}\");\ndefineMacro(\"\\\\copyright\", \"\\\\TextOrMath{\\\\textcopyright}{\\\\text{\\\\textcopyright}}\");\ndefineMacro(\"\\\\textregistered\", \"\\\\html@mathml{\\\\textcircled{\\\\scriptsize R}}{\\\\char`®}\");\n// Characters omitted from Unicode range 1D400–1D7FF\ndefineMacro(\"\\u212C\", \"\\\\mathscr{B}\"); // script\ndefineMacro(\"\\u2130\", \"\\\\mathscr{E}\");\ndefineMacro(\"\\u2131\", \"\\\\mathscr{F}\");\ndefineMacro(\"\\u210B\", \"\\\\mathscr{H}\");\ndefineMacro(\"\\u2110\", \"\\\\mathscr{I}\");\ndefineMacro(\"\\u2112\", \"\\\\mathscr{L}\");\ndefineMacro(\"\\u2133\", \"\\\\mathscr{M}\");\ndefineMacro(\"\\u211B\", \"\\\\mathscr{R}\");\ndefineMacro(\"\\u212D\", \"\\\\mathfrak{C}\"); // Fraktur\ndefineMacro(\"\\u210C\", \"\\\\mathfrak{H}\");\ndefineMacro(\"\\u2128\", \"\\\\mathfrak{Z}\");\n// Define \\Bbbk with a macro that works in both HTML and MathML.\ndefineMacro(\"\\\\Bbbk\", \"\\\\Bbb{k}\");\n// \\llap and \\rlap render their contents in text mode\ndefineMacro(\"\\\\llap\", \"\\\\mathllap{\\\\textrm{#1}}\");\ndefineMacro(\"\\\\rlap\", \"\\\\mathrlap{\\\\textrm{#1}}\");\ndefineMacro(\"\\\\clap\", \"\\\\mathclap{\\\\textrm{#1}}\");\n// \\mathstrut from the TeXbook, p 360\ndefineMacro(\"\\\\mathstrut\", \"\\\\vphantom{(}\");\n// \\underbar from TeXbook p 353\ndefineMacro(\"\\\\underbar\", \"\\\\underline{\\\\text{#1}}\");\n// \\not is defined by base/fontmath.ltx via\n// \\DeclareMathSymbol{\\not}{\\mathrel}{symbols}{\"36}\n// It's thus treated like a \\mathrel, but defined by a symbol that has zero\n// width but extends to the right.  We use \\rlap to get that spacing.\n// For MathML we write U+0338 here. buildMathML.js will then do the overlay.\ndefineMacro(\"\\\\not\", \"\\\\html@mathml{\\\\mathrel{\\\\mathrlap\\\\@not}\\\\nobreak}\" + \"{\\\\char\\\"338}\");\n// Negated symbols from base/fontmath.ltx:\n// \\def\\neq{\\not=} \\let\\ne=\\neq\n// \\DeclareRobustCommand\n//   \\notin{\\mathrel{\\m@th\\mathpalette\\c@ncel\\in}}\n// \\def\\c@ncel#1#2{\\m@th\\ooalign{$\\hfil#1\\mkern1mu/\\hfil$\\crcr$#1#2$}}\ndefineMacro(\"\\\\neq\", \"\\\\html@mathml{\\\\mathrel{\\\\not=}}{\\\\mathrel{\\\\char`≠}}\");\ndefineMacro(\"\\\\ne\", \"\\\\neq\");\ndefineMacro(\"\\u2260\", \"\\\\neq\");\ndefineMacro(\"\\\\notin\", \"\\\\html@mathml{\\\\mathrel{{\\\\in}\\\\mathllap{/\\\\mskip1mu}}}\" + \"{\\\\mathrel{\\\\char`∉}}\");\ndefineMacro(\"\\u2209\", \"\\\\notin\");\n// Unicode stacked relations\ndefineMacro(\"\\u2258\", \"\\\\html@mathml{\" + \"\\\\mathrel{=\\\\kern{-1em}\\\\raisebox{0.4em}{$\\\\scriptsize\\\\frown$}}\" + \"}{\\\\mathrel{\\\\char`\\u2258}}\");\ndefineMacro(\"\\u2259\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\wedge}{=}}{\\\\mathrel{\\\\char`\\u2258}}\");\ndefineMacro(\"\\u225A\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\vee}{=}}{\\\\mathrel{\\\\char`\\u225A}}\");\ndefineMacro(\"\\u225B\", \"\\\\html@mathml{\\\\stackrel{\\\\scriptsize\\\\star}{=}}\" + \"{\\\\mathrel{\\\\char`\\u225B}}\");\ndefineMacro(\"\\u225D\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\mathrm{def}}{=}}\" + \"{\\\\mathrel{\\\\char`\\u225D}}\");\ndefineMacro(\"\\u225E\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\mathrm{m}}{=}}\" + \"{\\\\mathrel{\\\\char`\\u225E}}\");\ndefineMacro(\"\\u225F\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny?}{=}}{\\\\mathrel{\\\\char`\\u225F}}\");\n// Misc Unicode\ndefineMacro(\"\\u27C2\", \"\\\\perp\");\ndefineMacro(\"\\u203C\", \"\\\\mathclose{!\\\\mkern-0.8mu!}\");\ndefineMacro(\"\\u220C\", \"\\\\notni\");\ndefineMacro(\"\\u231C\", \"\\\\ulcorner\");\ndefineMacro(\"\\u231D\", \"\\\\urcorner\");\ndefineMacro(\"\\u231E\", \"\\\\llcorner\");\ndefineMacro(\"\\u231F\", \"\\\\lrcorner\");\ndefineMacro(\"\\u00A9\", \"\\\\copyright\");\ndefineMacro(\"\\u00AE\", \"\\\\textregistered\");\n// The KaTeX fonts have corners at codepoints that don't match Unicode.\n// For MathML purposes, use the Unicode code point.\ndefineMacro(\"\\\\ulcorner\", \"\\\\html@mathml{\\\\@ulcorner}{\\\\mathop{\\\\char\\\"231c}}\");\ndefineMacro(\"\\\\urcorner\", \"\\\\html@mathml{\\\\@urcorner}{\\\\mathop{\\\\char\\\"231d}}\");\ndefineMacro(\"\\\\llcorner\", \"\\\\html@mathml{\\\\@llcorner}{\\\\mathop{\\\\char\\\"231e}}\");\ndefineMacro(\"\\\\lrcorner\", \"\\\\html@mathml{\\\\@lrcorner}{\\\\mathop{\\\\char\\\"231f}}\");\n//////////////////////////////////////////////////////////////////////\n// LaTeX_2ε\n// \\vdots{\\vbox{\\baselineskip4\\p@  \\lineskiplimit\\z@\n// \\kern6\\p@\\hbox{.}\\hbox{.}\\hbox{.}}}\n// We'll call \\varvdots, which gets a glyph from symbols.js.\n// The zero-width rule gets us an equivalent to the vertical 6pt kern.\ndefineMacro(\"\\\\vdots\", \"{\\\\varvdots\\\\rule{0pt}{15pt}}\");\ndefineMacro(\"\\u22ee\", \"\\\\vdots\");\n//////////////////////////////////////////////////////////////////////\n// amsmath.sty\n// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf\n// Italic Greek capital letters.  AMS defines these with \\DeclareMathSymbol,\n// but they are equivalent to \\mathit{\\Letter}.\ndefineMacro(\"\\\\varGamma\", \"\\\\mathit{\\\\Gamma}\");\ndefineMacro(\"\\\\varDelta\", \"\\\\mathit{\\\\Delta}\");\ndefineMacro(\"\\\\varTheta\", \"\\\\mathit{\\\\Theta}\");\ndefineMacro(\"\\\\varLambda\", \"\\\\mathit{\\\\Lambda}\");\ndefineMacro(\"\\\\varXi\", \"\\\\mathit{\\\\Xi}\");\ndefineMacro(\"\\\\varPi\", \"\\\\mathit{\\\\Pi}\");\ndefineMacro(\"\\\\varSigma\", \"\\\\mathit{\\\\Sigma}\");\ndefineMacro(\"\\\\varUpsilon\", \"\\\\mathit{\\\\Upsilon}\");\ndefineMacro(\"\\\\varPhi\", \"\\\\mathit{\\\\Phi}\");\ndefineMacro(\"\\\\varPsi\", \"\\\\mathit{\\\\Psi}\");\ndefineMacro(\"\\\\varOmega\", \"\\\\mathit{\\\\Omega}\");\n//\\newcommand{\\substack}[1]{\\subarray{c}#1\\endsubarray}\ndefineMacro(\"\\\\substack\", \"\\\\begin{subarray}{c}#1\\\\end{subarray}\");\n// \\renewcommand{\\colon}{\\nobreak\\mskip2mu\\mathpunct{}\\nonscript\n// \\mkern-\\thinmuskip{:}\\mskip6muplus1mu\\relax}\ndefineMacro(\"\\\\colon\", \"\\\\nobreak\\\\mskip2mu\\\\mathpunct{}\" + \"\\\\mathchoice{\\\\mkern-3mu}{\\\\mkern-3mu}{}{}{:}\\\\mskip6mu\\\\relax\");\n// \\newcommand{\\boxed}[1]{\\fbox{\\m@th$\\displaystyle#1$}}\ndefineMacro(\"\\\\boxed\", \"\\\\fbox{$\\\\displaystyle{#1}$}\");\n// \\def\\iff{\\DOTSB\\;\\Longleftrightarrow\\;}\n// \\def\\implies{\\DOTSB\\;\\Longrightarrow\\;}\n// \\def\\impliedby{\\DOTSB\\;\\Longleftarrow\\;}\ndefineMacro(\"\\\\iff\", \"\\\\DOTSB\\\\;\\\\Longleftrightarrow\\\\;\");\ndefineMacro(\"\\\\implies\", \"\\\\DOTSB\\\\;\\\\Longrightarrow\\\\;\");\ndefineMacro(\"\\\\impliedby\", \"\\\\DOTSB\\\\;\\\\Longleftarrow\\\\;\");\n// \\def\\dddot#1{{\\mathop{#1}\\limits^{\\vbox to-1.4\\ex@{\\kern-\\tw@\\ex@\n//  \\hbox{\\normalfont ...}\\vss}}}}\n// We use \\overset which avoids the vertical shift of \\mathop.\ndefineMacro(\"\\\\dddot\", \"{\\\\overset{\\\\raisebox{-0.1ex}{\\\\normalsize ...}}{#1}}\");\ndefineMacro(\"\\\\ddddot\", \"{\\\\overset{\\\\raisebox{-0.1ex}{\\\\normalsize ....}}{#1}}\");\n// AMSMath's automatic \\dots, based on \\mdots@@ macro.\nvar dotsByToken = {\n  ',': '\\\\dotsc',\n  '\\\\not': '\\\\dotsb',\n  // \\keybin@ checks for the following:\n  '+': '\\\\dotsb',\n  '=': '\\\\dotsb',\n  '<': '\\\\dotsb',\n  '>': '\\\\dotsb',\n  '-': '\\\\dotsb',\n  '*': '\\\\dotsb',\n  ':': '\\\\dotsb',\n  // Symbols whose definition starts with \\DOTSB:\n  '\\\\DOTSB': '\\\\dotsb',\n  '\\\\coprod': '\\\\dotsb',\n  '\\\\bigvee': '\\\\dotsb',\n  '\\\\bigwedge': '\\\\dotsb',\n  '\\\\biguplus': '\\\\dotsb',\n  '\\\\bigcap': '\\\\dotsb',\n  '\\\\bigcup': '\\\\dotsb',\n  '\\\\prod': '\\\\dotsb',\n  '\\\\sum': '\\\\dotsb',\n  '\\\\bigotimes': '\\\\dotsb',\n  '\\\\bigoplus': '\\\\dotsb',\n  '\\\\bigodot': '\\\\dotsb',\n  '\\\\bigsqcup': '\\\\dotsb',\n  '\\\\And': '\\\\dotsb',\n  '\\\\longrightarrow': '\\\\dotsb',\n  '\\\\Longrightarrow': '\\\\dotsb',\n  '\\\\longleftarrow': '\\\\dotsb',\n  '\\\\Longleftarrow': '\\\\dotsb',\n  '\\\\longleftrightarrow': '\\\\dotsb',\n  '\\\\Longleftrightarrow': '\\\\dotsb',\n  '\\\\mapsto': '\\\\dotsb',\n  '\\\\longmapsto': '\\\\dotsb',\n  '\\\\hookrightarrow': '\\\\dotsb',\n  '\\\\doteq': '\\\\dotsb',\n  // Symbols whose definition starts with \\mathbin:\n  '\\\\mathbin': '\\\\dotsb',\n  // Symbols whose definition starts with \\mathrel:\n  '\\\\mathrel': '\\\\dotsb',\n  '\\\\relbar': '\\\\dotsb',\n  '\\\\Relbar': '\\\\dotsb',\n  '\\\\xrightarrow': '\\\\dotsb',\n  '\\\\xleftarrow': '\\\\dotsb',\n  // Symbols whose definition starts with \\DOTSI:\n  '\\\\DOTSI': '\\\\dotsi',\n  '\\\\int': '\\\\dotsi',\n  '\\\\oint': '\\\\dotsi',\n  '\\\\iint': '\\\\dotsi',\n  '\\\\iiint': '\\\\dotsi',\n  '\\\\iiiint': '\\\\dotsi',\n  '\\\\idotsint': '\\\\dotsi',\n  // Symbols whose definition starts with \\DOTSX:\n  '\\\\DOTSX': '\\\\dotsx'\n};\nvar dotsbGroups = new Set(['bin', 'rel']);\ndefineMacro(\"\\\\dots\", function (context) {\n  // TODO: If used in text mode, should expand to \\textellipsis.\n  // However, in KaTeX, \\textellipsis and \\ldots behave the same\n  // (in text mode), and it's unlikely we'd see any of the math commands\n  // that affect the behavior of \\dots when in text mode.  So fine for now\n  // (until we support \\ifmmode ... \\else ... \\fi).\n  var thedots = '\\\\dotso';\n  var next = context.expandAfterFuture().text;\n  if (next in dotsByToken) {\n    thedots = dotsByToken[next];\n  } else if (next.slice(0, 4) === '\\\\not') {\n    thedots = '\\\\dotsb';\n  } else if (next in symbols.math) {\n    if (dotsbGroups.has(symbols.math[next].group)) {\n      thedots = '\\\\dotsb';\n    }\n  }\n  return thedots;\n});\nvar spaceAfterDots = {\n  // \\rightdelim@ checks for the following:\n  ')': true,\n  ']': true,\n  '\\\\rbrack': true,\n  '\\\\}': true,\n  '\\\\rbrace': true,\n  '\\\\rangle': true,\n  '\\\\rceil': true,\n  '\\\\rfloor': true,\n  '\\\\rgroup': true,\n  '\\\\rmoustache': true,\n  '\\\\right': true,\n  '\\\\bigr': true,\n  '\\\\biggr': true,\n  '\\\\Bigr': true,\n  '\\\\Biggr': true,\n  // \\extra@ also tests for the following:\n  '$': true,\n  // \\extrap@ checks for the following:\n  ';': true,\n  '.': true,\n  ',': true\n};\ndefineMacro(\"\\\\dotso\", function (context) {\n  var next = context.future().text;\n  if (next in spaceAfterDots) {\n    return \"\\\\ldots\\\\,\";\n  } else {\n    return \"\\\\ldots\";\n  }\n});\ndefineMacro(\"\\\\dotsc\", function (context) {\n  var next = context.future().text;\n  // \\dotsc uses \\extra@ but not \\extrap@, instead specially checking for\n  // ';' and '.', but doesn't check for ','.\n  if (next in spaceAfterDots && next !== ',') {\n    return \"\\\\ldots\\\\,\";\n  } else {\n    return \"\\\\ldots\";\n  }\n});\ndefineMacro(\"\\\\cdots\", function (context) {\n  var next = context.future().text;\n  if (next in spaceAfterDots) {\n    return \"\\\\@cdots\\\\,\";\n  } else {\n    return \"\\\\@cdots\";\n  }\n});\ndefineMacro(\"\\\\dotsb\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsm\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsi\", \"\\\\!\\\\cdots\");\n// amsmath doesn't actually define \\dotsx, but \\dots followed by a macro\n// starting with \\DOTSX implies \\dotso, and then \\extra@ detects this case\n// and forces the added `\\,`.\ndefineMacro(\"\\\\dotsx\", \"\\\\ldots\\\\,\");\n// \\let\\DOTSI\\relax\n// \\let\\DOTSB\\relax\n// \\let\\DOTSX\\relax\ndefineMacro(\"\\\\DOTSI\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSB\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSX\", \"\\\\relax\");\n// Spacing, based on amsmath.sty's override of LaTeX defaults\n// \\DeclareRobustCommand{\\tmspace}[3]{%\n//   \\ifmmode\\mskip#1#2\\else\\kern#1#3\\fi\\relax}\ndefineMacro(\"\\\\tmspace\", \"\\\\TextOrMath{\\\\kern#1#3}{\\\\mskip#1#2}\\\\relax\");\n// \\renewcommand{\\,}{\\tmspace+\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\ndefineMacro(\"\\\\,\", \"\\\\tmspace+{3mu}{.1667em}\");\n// \\let\\thinspace\\,\ndefineMacro(\"\\\\thinspace\", \"\\\\,\");\n// \\def\\>{\\mskip\\medmuskip}\n// \\renewcommand{\\:}{\\tmspace+\\medmuskip{.2222em}}\n// TODO: \\> and math mode of \\: should use \\medmuskip = 4mu plus 2mu minus 4mu\ndefineMacro(\"\\\\>\", \"\\\\mskip{4mu}\");\ndefineMacro(\"\\\\:\", \"\\\\tmspace+{4mu}{.2222em}\");\n// \\let\\medspace\\:\ndefineMacro(\"\\\\medspace\", \"\\\\:\");\n// \\renewcommand{\\;}{\\tmspace+\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip = 5mu plus 5mu\ndefineMacro(\"\\\\;\", \"\\\\tmspace+{5mu}{.2777em}\");\n// \\let\\thickspace\\;\ndefineMacro(\"\\\\thickspace\", \"\\\\;\");\n// \\renewcommand{\\!}{\\tmspace-\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\ndefineMacro(\"\\\\!\", \"\\\\tmspace-{3mu}{.1667em}\");\n// \\let\\negthinspace\\!\ndefineMacro(\"\\\\negthinspace\", \"\\\\!\");\n// \\newcommand{\\negmedspace}{\\tmspace-\\medmuskip{.2222em}}\n// TODO: math mode should use \\medmuskip\ndefineMacro(\"\\\\negmedspace\", \"\\\\tmspace-{4mu}{.2222em}\");\n// \\newcommand{\\negthickspace}{\\tmspace-\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip\ndefineMacro(\"\\\\negthickspace\", \"\\\\tmspace-{5mu}{.277em}\");\n// \\def\\enspace{\\kern.5em }\ndefineMacro(\"\\\\enspace\", \"\\\\kern.5em \");\n// \\def\\enskip{\\hskip.5em\\relax}\ndefineMacro(\"\\\\enskip\", \"\\\\hskip.5em\\\\relax\");\n// \\def\\quad{\\hskip1em\\relax}\ndefineMacro(\"\\\\quad\", \"\\\\hskip1em\\\\relax\");\n// \\def\\qquad{\\hskip2em\\relax}\ndefineMacro(\"\\\\qquad\", \"\\\\hskip2em\\\\relax\");\n// \\tag@in@display form of \\tag\ndefineMacro(\"\\\\tag\", \"\\\\@ifstar\\\\tag@literal\\\\tag@paren\");\ndefineMacro(\"\\\\tag@paren\", \"\\\\tag@literal{({#1})}\");\ndefineMacro(\"\\\\tag@literal\", context => {\n  if (context.macros.get(\"\\\\df@tag\")) {\n    throw new ParseError(\"Multiple \\\\tag\");\n  }\n  return \"\\\\gdef\\\\df@tag{\\\\text{#1}}\";\n});\n// \\renewcommand{\\bmod}{\\nonscript\\mskip-\\medmuskip\\mkern5mu\\mathbin\n//   {\\operator@font mod}\\penalty900\n//   \\mkern5mu\\nonscript\\mskip-\\medmuskip}\n// \\newcommand{\\pod}[1]{\\allowbreak\n//   \\if@display\\mkern18mu\\else\\mkern8mu\\fi(#1)}\n// \\renewcommand{\\pmod}[1]{\\pod{{\\operator@font mod}\\mkern6mu#1}}\n// \\newcommand{\\mod}[1]{\\allowbreak\\if@display\\mkern18mu\n//   \\else\\mkern12mu\\fi{\\operator@font mod}\\,\\,#1}\n// TODO: math mode should use \\medmuskip = 4mu plus 2mu minus 4mu\ndefineMacro(\"\\\\bmod\", \"\\\\mathchoice{\\\\mskip1mu}{\\\\mskip1mu}{\\\\mskip5mu}{\\\\mskip5mu}\" + \"\\\\mathbin{\\\\rm mod}\" + \"\\\\mathchoice{\\\\mskip1mu}{\\\\mskip1mu}{\\\\mskip5mu}{\\\\mskip5mu}\");\ndefineMacro(\"\\\\pod\", \"\\\\allowbreak\" + \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern8mu}{\\\\mkern8mu}{\\\\mkern8mu}(#1)\");\ndefineMacro(\"\\\\pmod\", \"\\\\pod{{\\\\rm mod}\\\\mkern6mu#1}\");\ndefineMacro(\"\\\\mod\", \"\\\\allowbreak\" + \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern12mu}{\\\\mkern12mu}{\\\\mkern12mu}\" + \"{\\\\rm mod}\\\\,\\\\,#1\");\n//////////////////////////////////////////////////////////////////////\n// LaTeX source2e\n// \\expandafter\\let\\expandafter\\@normalcr\n//     \\csname\\expandafter\\@gobble\\string\\\\ \\endcsname\n// \\DeclareRobustCommand\\newline{\\@normalcr\\relax}\ndefineMacro(\"\\\\newline\", \"\\\\\\\\\\\\relax\");\n// \\def\\TeX{T\\kern-.1667em\\lower.5ex\\hbox{E}\\kern-.125emX\\@}\n// TODO: Doesn't normally work in math mode because \\@ fails.  KaTeX doesn't\n// support \\@ yet, so that's omitted, and we add \\text so that the result\n// doesn't look funny in math mode.\ndefineMacro(\"\\\\TeX\", \"\\\\textrm{\\\\html@mathml{\" + \"T\\\\kern-.1667em\\\\raisebox{-.5ex}{E}\\\\kern-.125emX\" + \"}{TeX}}\");\n// \\DeclareRobustCommand{\\LaTeX}{L\\kern-.36em%\n//         {\\sbox\\z@ T%\n//          \\vbox to\\ht\\z@{\\hbox{\\check@mathfonts\n//                               \\fontsize\\sf@size\\z@\n//                               \\math@fontsfalse\\selectfont\n//                               A}%\n//                         \\vss}%\n//         }%\n//         \\kern-.15em%\n//         \\TeX}\n// This code aligns the top of the A with the T (from the perspective of TeX's\n// boxes, though visually the A appears to extend above slightly).\n// We compute the corresponding \\raisebox when A is rendered in \\normalsize\n// \\scriptstyle, which has a scale factor of 0.7 (see Options.js).\nvar latexRaiseA = makeEm(fontMetricsData['Main-Regular'][\"T\".charCodeAt(0)][1] - 0.7 * fontMetricsData['Main-Regular'][\"A\".charCodeAt(0)][1]);\ndefineMacro(\"\\\\LaTeX\", \"\\\\textrm{\\\\html@mathml{\" + (\"L\\\\kern-.36em\\\\raisebox{\" + latexRaiseA + \"}{\\\\scriptstyle A}\") + \"\\\\kern-.15em\\\\TeX}{LaTeX}}\");\n// New KaTeX logo based on tweaking LaTeX logo\ndefineMacro(\"\\\\KaTeX\", \"\\\\textrm{\\\\html@mathml{\" + (\"K\\\\kern-.17em\\\\raisebox{\" + latexRaiseA + \"}{\\\\scriptstyle A}\") + \"\\\\kern-.15em\\\\TeX}{KaTeX}}\");\n// \\DeclareRobustCommand\\hspace{\\@ifstar\\@hspacer\\@hspace}\n// \\def\\@hspace#1{\\hskip  #1\\relax}\n// \\def\\@hspacer#1{\\vrule \\@width\\z@\\nobreak\n//                 \\hskip #1\\hskip \\z@skip}\ndefineMacro(\"\\\\hspace\", \"\\\\@ifstar\\\\@hspacer\\\\@hspace\");\ndefineMacro(\"\\\\@hspace\", \"\\\\hskip #1\\\\relax\");\ndefineMacro(\"\\\\@hspacer\", \"\\\\rule{0pt}{0pt}\\\\hskip #1\\\\relax\");\n//////////////////////////////////////////////////////////////////////\n// mathtools.sty\n//\\providecommand\\ordinarycolon{:}\ndefineMacro(\"\\\\ordinarycolon\", \":\");\n//\\def\\vcentcolon{\\mathrel{\\mathop\\ordinarycolon}}\n//TODO(edemaine): Not yet centered. Fix via \\raisebox or #726\ndefineMacro(\"\\\\vcentcolon\", \"\\\\mathrel{\\\\mathop\\\\ordinarycolon}\");\n// \\providecommand*\\dblcolon{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}\ndefineMacro(\"\\\\dblcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-.9mu}\\\\vcentcolon}}\" + \"{\\\\mathop{\\\\char\\\"2237}}\");\n// \\providecommand*\\coloneqq{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}\ndefineMacro(\"\\\\coloneqq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}=}}\" + \"{\\\\mathop{\\\\char\\\"2254}}\"); // ≔\n// \\providecommand*\\Coloneqq{\\dblcolon\\mathrel{\\mkern-1.2mu}=}\ndefineMacro(\"\\\\Coloneqq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}=}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"3d}}\");\n// \\providecommand*\\coloneq{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\ndefineMacro(\"\\\\coloneq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\mathrel{-}}}\" + \"{\\\\mathop{\\\\char\\\"3a\\\\char\\\"2212}}\");\n// \\providecommand*\\Coloneq{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\ndefineMacro(\"\\\\Coloneq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\mathrel{-}}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"2212}}\");\n// \\providecommand*\\eqqcolon{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}\ndefineMacro(\"\\\\eqqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{=\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}}\" + \"{\\\\mathop{\\\\char\\\"2255}}\"); // ≕\n// \\providecommand*\\Eqqcolon{=\\mathrel{\\mkern-1.2mu}\\dblcolon}\ndefineMacro(\"\\\\Eqqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{=\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}}\" + \"{\\\\mathop{\\\\char\\\"3d\\\\char\\\"2237}}\");\n// \\providecommand*\\eqcolon{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}\ndefineMacro(\"\\\\eqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\mathrel{-}\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}}\" + \"{\\\\mathop{\\\\char\\\"2239}}\");\n// \\providecommand*\\Eqcolon{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}\ndefineMacro(\"\\\\Eqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\mathrel{-}\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}}\" + \"{\\\\mathop{\\\\char\\\"2212\\\\char\\\"2237}}\");\n// \\providecommand*\\colonapprox{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}\ndefineMacro(\"\\\\colonapprox\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\approx}}\" + \"{\\\\mathop{\\\\char\\\"3a\\\\char\\\"2248}}\");\n// \\providecommand*\\Colonapprox{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}\ndefineMacro(\"\\\\Colonapprox\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\approx}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"2248}}\");\n// \\providecommand*\\colonsim{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}\ndefineMacro(\"\\\\colonsim\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\sim}}\" + \"{\\\\mathop{\\\\char\\\"3a\\\\char\\\"223c}}\");\n// \\providecommand*\\Colonsim{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}\ndefineMacro(\"\\\\Colonsim\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\sim}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"223c}}\");\n// Some Unicode characters are implemented with macros to mathtools functions.\ndefineMacro(\"\\u2237\", \"\\\\dblcolon\"); // ::\ndefineMacro(\"\\u2239\", \"\\\\eqcolon\"); // -:\ndefineMacro(\"\\u2254\", \"\\\\coloneqq\"); // :=\ndefineMacro(\"\\u2255\", \"\\\\eqqcolon\"); // =:\ndefineMacro(\"\\u2A74\", \"\\\\Coloneqq\"); // ::=\n//////////////////////////////////////////////////////////////////////\n// colonequals.sty\n// Alternate names for mathtools's macros:\ndefineMacro(\"\\\\ratio\", \"\\\\vcentcolon\");\ndefineMacro(\"\\\\coloncolon\", \"\\\\dblcolon\");\ndefineMacro(\"\\\\colonequals\", \"\\\\coloneqq\");\ndefineMacro(\"\\\\coloncolonequals\", \"\\\\Coloneqq\");\ndefineMacro(\"\\\\equalscolon\", \"\\\\eqqcolon\");\ndefineMacro(\"\\\\equalscoloncolon\", \"\\\\Eqqcolon\");\ndefineMacro(\"\\\\colonminus\", \"\\\\coloneq\");\ndefineMacro(\"\\\\coloncolonminus\", \"\\\\Coloneq\");\ndefineMacro(\"\\\\minuscolon\", \"\\\\eqcolon\");\ndefineMacro(\"\\\\minuscoloncolon\", \"\\\\Eqcolon\");\n// \\colonapprox name is same in mathtools and colonequals.\ndefineMacro(\"\\\\coloncolonapprox\", \"\\\\Colonapprox\");\n// \\colonsim name is same in mathtools and colonequals.\ndefineMacro(\"\\\\coloncolonsim\", \"\\\\Colonsim\");\n// Additional macros, implemented by analogy with mathtools definitions:\ndefineMacro(\"\\\\simcolon\", \"\\\\mathrel{\\\\sim\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}\");\ndefineMacro(\"\\\\simcoloncolon\", \"\\\\mathrel{\\\\sim\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}\");\ndefineMacro(\"\\\\approxcolon\", \"\\\\mathrel{\\\\approx\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}\");\ndefineMacro(\"\\\\approxcoloncolon\", \"\\\\mathrel{\\\\approx\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}\");\n// Present in newtxmath, pxfonts and txfonts\ndefineMacro(\"\\\\notni\", \"\\\\html@mathml{\\\\not\\\\ni}{\\\\mathrel{\\\\char`\\u220C}}\");\ndefineMacro(\"\\\\limsup\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,sup}\");\ndefineMacro(\"\\\\liminf\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,inf}\");\n//////////////////////////////////////////////////////////////////////\n// From amsopn.sty\ndefineMacro(\"\\\\injlim\", \"\\\\DOTSB\\\\operatorname*{inj\\\\,lim}\");\ndefineMacro(\"\\\\projlim\", \"\\\\DOTSB\\\\operatorname*{proj\\\\,lim}\");\ndefineMacro(\"\\\\varlimsup\", \"\\\\DOTSB\\\\operatorname*{\\\\overline{lim}}\");\ndefineMacro(\"\\\\varliminf\", \"\\\\DOTSB\\\\operatorname*{\\\\underline{lim}}\");\ndefineMacro(\"\\\\varinjlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underrightarrow{lim}}\");\ndefineMacro(\"\\\\varprojlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underleftarrow{lim}}\");\n//////////////////////////////////////////////////////////////////////\n// MathML alternates for KaTeX glyphs in the Unicode private area\ndefineMacro(\"\\\\gvertneqq\", \"\\\\html@mathml{\\\\@gvertneqq}{\\u2269}\");\ndefineMacro(\"\\\\lvertneqq\", \"\\\\html@mathml{\\\\@lvertneqq}{\\u2268}\");\ndefineMacro(\"\\\\ngeqq\", \"\\\\html@mathml{\\\\@ngeqq}{\\u2271}\");\ndefineMacro(\"\\\\ngeqslant\", \"\\\\html@mathml{\\\\@ngeqslant}{\\u2271}\");\ndefineMacro(\"\\\\nleqq\", \"\\\\html@mathml{\\\\@nleqq}{\\u2270}\");\ndefineMacro(\"\\\\nleqslant\", \"\\\\html@mathml{\\\\@nleqslant}{\\u2270}\");\ndefineMacro(\"\\\\nshortmid\", \"\\\\html@mathml{\\\\@nshortmid}{∤}\");\ndefineMacro(\"\\\\nshortparallel\", \"\\\\html@mathml{\\\\@nshortparallel}{∦}\");\ndefineMacro(\"\\\\nsubseteqq\", \"\\\\html@mathml{\\\\@nsubseteqq}{\\u2288}\");\ndefineMacro(\"\\\\nsupseteqq\", \"\\\\html@mathml{\\\\@nsupseteqq}{\\u2289}\");\ndefineMacro(\"\\\\varsubsetneq\", \"\\\\html@mathml{\\\\@varsubsetneq}{⊊}\");\ndefineMacro(\"\\\\varsubsetneqq\", \"\\\\html@mathml{\\\\@varsubsetneqq}{⫋}\");\ndefineMacro(\"\\\\varsupsetneq\", \"\\\\html@mathml{\\\\@varsupsetneq}{⊋}\");\ndefineMacro(\"\\\\varsupsetneqq\", \"\\\\html@mathml{\\\\@varsupsetneqq}{⫌}\");\ndefineMacro(\"\\\\imath\", \"\\\\html@mathml{\\\\@imath}{\\u0131}\");\ndefineMacro(\"\\\\jmath\", \"\\\\html@mathml{\\\\@jmath}{\\u0237}\");\n//////////////////////////////////////////////////////////////////////\n// stmaryrd and semantic\n// The stmaryrd and semantic packages render the next four items by calling a\n// glyph. Those glyphs do not exist in the KaTeX fonts. Hence the macros.\ndefineMacro(\"\\\\llbracket\", \"\\\\html@mathml{\" + \"\\\\mathopen{[\\\\mkern-3.2mu[}}\" + \"{\\\\mathopen{\\\\char`\\u27e6}}\");\ndefineMacro(\"\\\\rrbracket\", \"\\\\html@mathml{\" + \"\\\\mathclose{]\\\\mkern-3.2mu]}}\" + \"{\\\\mathclose{\\\\char`\\u27e7}}\");\ndefineMacro(\"\\u27e6\", \"\\\\llbracket\"); // blackboard bold [\ndefineMacro(\"\\u27e7\", \"\\\\rrbracket\"); // blackboard bold ]\ndefineMacro(\"\\\\lBrace\", \"\\\\html@mathml{\" + \"\\\\mathopen{\\\\{\\\\mkern-3.2mu[}}\" + \"{\\\\mathopen{\\\\char`\\u2983}}\");\ndefineMacro(\"\\\\rBrace\", \"\\\\html@mathml{\" + \"\\\\mathclose{]\\\\mkern-3.2mu\\\\}}}\" + \"{\\\\mathclose{\\\\char`\\u2984}}\");\ndefineMacro(\"\\u2983\", \"\\\\lBrace\"); // blackboard bold {\ndefineMacro(\"\\u2984\", \"\\\\rBrace\"); // blackboard bold }\n// TODO: Create variable sized versions of the last two items. I believe that\n// will require new font glyphs.\n// The stmaryrd function `\\minuso` provides a \"Plimsoll\" symbol that\n// superimposes the characters \\circ and \\mathminus. Used in chemistry.\ndefineMacro(\"\\\\minuso\", \"\\\\mathbin{\\\\html@mathml{\" + \"{\\\\mathrlap{\\\\mathchoice{\\\\kern{0.145em}}{\\\\kern{0.145em}}\" + \"{\\\\kern{0.1015em}}{\\\\kern{0.0725em}}\\\\circ}{-}}}\" + \"{\\\\char`⦵}}\");\ndefineMacro(\"⦵\", \"\\\\minuso\");\n//////////////////////////////////////////////////////////////////////\n// texvc.sty\n// The texvc package contains macros available in mediawiki pages.\n// We omit the functions deprecated at\n// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax\n// We also omit texvc's \\O, which conflicts with \\text{\\O}\ndefineMacro(\"\\\\darr\", \"\\\\downarrow\");\ndefineMacro(\"\\\\dArr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\Darr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\lang\", \"\\\\langle\");\ndefineMacro(\"\\\\rang\", \"\\\\rangle\");\ndefineMacro(\"\\\\uarr\", \"\\\\uparrow\");\ndefineMacro(\"\\\\uArr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\Uarr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\N\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\R\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Z\", \"\\\\mathbb{Z}\");\ndefineMacro(\"\\\\alef\", \"\\\\aleph\");\ndefineMacro(\"\\\\alefsym\", \"\\\\aleph\");\ndefineMacro(\"\\\\Alpha\", \"\\\\mathrm{A}\");\ndefineMacro(\"\\\\Beta\", \"\\\\mathrm{B}\");\ndefineMacro(\"\\\\bull\", \"\\\\bullet\");\ndefineMacro(\"\\\\Chi\", \"\\\\mathrm{X}\");\ndefineMacro(\"\\\\clubs\", \"\\\\clubsuit\");\ndefineMacro(\"\\\\cnums\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Complex\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Dagger\", \"\\\\ddagger\");\ndefineMacro(\"\\\\diamonds\", \"\\\\diamondsuit\");\ndefineMacro(\"\\\\empty\", \"\\\\emptyset\");\ndefineMacro(\"\\\\Epsilon\", \"\\\\mathrm{E}\");\ndefineMacro(\"\\\\Eta\", \"\\\\mathrm{H}\");\ndefineMacro(\"\\\\exist\", \"\\\\exists\");\ndefineMacro(\"\\\\harr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\hArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Harr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\hearts\", \"\\\\heartsuit\");\ndefineMacro(\"\\\\image\", \"\\\\Im\");\ndefineMacro(\"\\\\infin\", \"\\\\infty\");\ndefineMacro(\"\\\\Iota\", \"\\\\mathrm{I}\");\ndefineMacro(\"\\\\isin\", \"\\\\in\");\ndefineMacro(\"\\\\Kappa\", \"\\\\mathrm{K}\");\ndefineMacro(\"\\\\larr\", \"\\\\leftarrow\");\ndefineMacro(\"\\\\lArr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\Larr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\lrarr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\lrArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Lrarr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Mu\", \"\\\\mathrm{M}\");\ndefineMacro(\"\\\\natnums\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\Nu\", \"\\\\mathrm{N}\");\ndefineMacro(\"\\\\Omicron\", \"\\\\mathrm{O}\");\ndefineMacro(\"\\\\plusmn\", \"\\\\pm\");\ndefineMacro(\"\\\\rarr\", \"\\\\rightarrow\");\ndefineMacro(\"\\\\rArr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\Rarr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\real\", \"\\\\Re\");\ndefineMacro(\"\\\\reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Rho\", \"\\\\mathrm{P}\");\ndefineMacro(\"\\\\sdot\", \"\\\\cdot\");\ndefineMacro(\"\\\\sect\", \"\\\\S\");\ndefineMacro(\"\\\\spades\", \"\\\\spadesuit\");\ndefineMacro(\"\\\\sub\", \"\\\\subset\");\ndefineMacro(\"\\\\sube\", \"\\\\subseteq\");\ndefineMacro(\"\\\\supe\", \"\\\\supseteq\");\ndefineMacro(\"\\\\Tau\", \"\\\\mathrm{T}\");\ndefineMacro(\"\\\\thetasym\", \"\\\\vartheta\");\n// TODO: defineMacro(\"\\\\varcoppa\", \"\\\\\\mbox{\\\\coppa}\");\ndefineMacro(\"\\\\weierp\", \"\\\\wp\");\ndefineMacro(\"\\\\Zeta\", \"\\\\mathrm{Z}\");\n//////////////////////////////////////////////////////////////////////\n// statmath.sty\n// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf\ndefineMacro(\"\\\\argmin\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,min}\");\ndefineMacro(\"\\\\argmax\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,max}\");\ndefineMacro(\"\\\\plim\", \"\\\\DOTSB\\\\mathop{\\\\operatorname{plim}}\\\\limits\");\n//////////////////////////////////////////////////////////////////////\n// braket.sty\n// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf\ndefineMacro(\"\\\\bra\", \"\\\\mathinner{\\\\langle{#1}|}\");\ndefineMacro(\"\\\\ket\", \"\\\\mathinner{|{#1}\\\\rangle}\");\ndefineMacro(\"\\\\braket\", \"\\\\mathinner{\\\\langle{#1}\\\\rangle}\");\ndefineMacro(\"\\\\Bra\", \"\\\\left\\\\langle#1\\\\right|\");\ndefineMacro(\"\\\\Ket\", \"\\\\left|#1\\\\right\\\\rangle\");\nvar braketHelper = one => context => {\n  var left = context.consumeArg().tokens;\n  var middle = context.consumeArg().tokens;\n  var middleDouble = context.consumeArg().tokens;\n  var right = context.consumeArg().tokens;\n  var oldMiddle = context.macros.get(\"|\");\n  var oldMiddleDouble = context.macros.get(\"\\\\|\");\n  context.macros.beginGroup();\n  var midMacro = double => context => {\n    if (one) {\n      // Only modify the first instance of | or \\|\n      context.macros.set(\"|\", oldMiddle);\n      if (middleDouble.length) {\n        context.macros.set(\"\\\\|\", oldMiddleDouble);\n      }\n    }\n    var doubled = double;\n    if (!double && middleDouble.length) {\n      // Mimic \\@ifnextchar\n      var nextToken = context.future();\n      if (nextToken.text === \"|\") {\n        context.popToken();\n        doubled = true;\n      }\n    }\n    return {\n      tokens: doubled ? middleDouble : middle,\n      numArgs: 0\n    };\n  };\n  context.macros.set(\"|\", midMacro(false));\n  if (middleDouble.length) {\n    context.macros.set(\"\\\\|\", midMacro(true));\n  }\n  var arg = context.consumeArg().tokens;\n  var expanded = context.expandTokens([...right, ...arg, ...left // reversed\n  ]);\n  context.macros.endGroup();\n  return {\n    tokens: expanded.reverse(),\n    numArgs: 0\n  };\n};\ndefineMacro(\"\\\\bra@ket\", braketHelper(false));\ndefineMacro(\"\\\\bra@set\", braketHelper(true));\ndefineMacro(\"\\\\Braket\", \"\\\\bra@ket{\\\\left\\\\langle}\" + \"{\\\\,\\\\middle\\\\vert\\\\,}{\\\\,\\\\middle\\\\vert\\\\,}{\\\\right\\\\rangle}\");\ndefineMacro(\"\\\\Set\", \"\\\\bra@set{\\\\left\\\\{\\\\:}\" + \"{\\\\;\\\\middle\\\\vert\\\\;}{\\\\;\\\\middle\\\\Vert\\\\;}{\\\\:\\\\right\\\\}}\");\ndefineMacro(\"\\\\set\", \"\\\\bra@set{\\\\{\\\\,}{\\\\mid}{}{\\\\,\\\\}}\");\n// has no support for special || or \\|\n//////////////////////////////////////////////////////////////////////\n// actuarialangle.dtx\ndefineMacro(\"\\\\angln\", \"{\\\\angl n}\");\n// Custom Khan Academy colors, should be moved to an optional package\ndefineMacro(\"\\\\blue\", \"\\\\textcolor{##6495ed}{#1}\");\ndefineMacro(\"\\\\orange\", \"\\\\textcolor{##ffa500}{#1}\");\ndefineMacro(\"\\\\pink\", \"\\\\textcolor{##ff00af}{#1}\");\ndefineMacro(\"\\\\red\", \"\\\\textcolor{##df0030}{#1}\");\ndefineMacro(\"\\\\green\", \"\\\\textcolor{##28ae7b}{#1}\");\ndefineMacro(\"\\\\gray\", \"\\\\textcolor{gray}{#1}\");\ndefineMacro(\"\\\\purple\", \"\\\\textcolor{##9d38bd}{#1}\");\ndefineMacro(\"\\\\blueA\", \"\\\\textcolor{##ccfaff}{#1}\");\ndefineMacro(\"\\\\blueB\", \"\\\\textcolor{##80f6ff}{#1}\");\ndefineMacro(\"\\\\blueC\", \"\\\\textcolor{##63d9ea}{#1}\");\ndefineMacro(\"\\\\blueD\", \"\\\\textcolor{##11accd}{#1}\");\ndefineMacro(\"\\\\blueE\", \"\\\\textcolor{##0c7f99}{#1}\");\ndefineMacro(\"\\\\tealA\", \"\\\\textcolor{##94fff5}{#1}\");\ndefineMacro(\"\\\\tealB\", \"\\\\textcolor{##26edd5}{#1}\");\ndefineMacro(\"\\\\tealC\", \"\\\\textcolor{##01d1c1}{#1}\");\ndefineMacro(\"\\\\tealD\", \"\\\\textcolor{##01a995}{#1}\");\ndefineMacro(\"\\\\tealE\", \"\\\\textcolor{##208170}{#1}\");\ndefineMacro(\"\\\\greenA\", \"\\\\textcolor{##b6ffb0}{#1}\");\ndefineMacro(\"\\\\greenB\", \"\\\\textcolor{##8af281}{#1}\");\ndefineMacro(\"\\\\greenC\", \"\\\\textcolor{##74cf70}{#1}\");\ndefineMacro(\"\\\\greenD\", \"\\\\textcolor{##1fab54}{#1}\");\ndefineMacro(\"\\\\greenE\", \"\\\\textcolor{##0d923f}{#1}\");\ndefineMacro(\"\\\\goldA\", \"\\\\textcolor{##ffd0a9}{#1}\");\ndefineMacro(\"\\\\goldB\", \"\\\\textcolor{##ffbb71}{#1}\");\ndefineMacro(\"\\\\goldC\", \"\\\\textcolor{##ff9c39}{#1}\");\ndefineMacro(\"\\\\goldD\", \"\\\\textcolor{##e07d10}{#1}\");\ndefineMacro(\"\\\\goldE\", \"\\\\textcolor{##a75a05}{#1}\");\ndefineMacro(\"\\\\redA\", \"\\\\textcolor{##fca9a9}{#1}\");\ndefineMacro(\"\\\\redB\", \"\\\\textcolor{##ff8482}{#1}\");\ndefineMacro(\"\\\\redC\", \"\\\\textcolor{##f9685d}{#1}\");\ndefineMacro(\"\\\\redD\", \"\\\\textcolor{##e84d39}{#1}\");\ndefineMacro(\"\\\\redE\", \"\\\\textcolor{##bc2612}{#1}\");\ndefineMacro(\"\\\\maroonA\", \"\\\\textcolor{##ffbde0}{#1}\");\ndefineMacro(\"\\\\maroonB\", \"\\\\textcolor{##ff92c6}{#1}\");\ndefineMacro(\"\\\\maroonC\", \"\\\\textcolor{##ed5fa6}{#1}\");\ndefineMacro(\"\\\\maroonD\", \"\\\\textcolor{##ca337c}{#1}\");\ndefineMacro(\"\\\\maroonE\", \"\\\\textcolor{##9e034e}{#1}\");\ndefineMacro(\"\\\\purpleA\", \"\\\\textcolor{##ddd7ff}{#1}\");\ndefineMacro(\"\\\\purpleB\", \"\\\\textcolor{##c6b9fc}{#1}\");\ndefineMacro(\"\\\\purpleC\", \"\\\\textcolor{##aa87ff}{#1}\");\ndefineMacro(\"\\\\purpleD\", \"\\\\textcolor{##7854ab}{#1}\");\ndefineMacro(\"\\\\purpleE\", \"\\\\textcolor{##543b78}{#1}\");\ndefineMacro(\"\\\\mintA\", \"\\\\textcolor{##f5f9e8}{#1}\");\ndefineMacro(\"\\\\mintB\", \"\\\\textcolor{##edf2df}{#1}\");\ndefineMacro(\"\\\\mintC\", \"\\\\textcolor{##e0e5cc}{#1}\");\ndefineMacro(\"\\\\grayA\", \"\\\\textcolor{##f6f7f7}{#1}\");\ndefineMacro(\"\\\\grayB\", \"\\\\textcolor{##f0f1f2}{#1}\");\ndefineMacro(\"\\\\grayC\", \"\\\\textcolor{##e3e5e6}{#1}\");\ndefineMacro(\"\\\\grayD\", \"\\\\textcolor{##d6d8da}{#1}\");\ndefineMacro(\"\\\\grayE\", \"\\\\textcolor{##babec2}{#1}\");\ndefineMacro(\"\\\\grayF\", \"\\\\textcolor{##888d93}{#1}\");\ndefineMacro(\"\\\\grayG\", \"\\\\textcolor{##626569}{#1}\");\ndefineMacro(\"\\\\grayH\", \"\\\\textcolor{##3b3e40}{#1}\");\ndefineMacro(\"\\\\grayI\", \"\\\\textcolor{##21242c}{#1}\");\ndefineMacro(\"\\\\kaBlue\", \"\\\\textcolor{##314453}{#1}\");\ndefineMacro(\"\\\\kaGreen\", \"\\\\textcolor{##71B307}{#1}\");\n\n/**\n * This file contains the “gullet” where macros are expanded\n * until only non-macro tokens remain.\n */\n// List of commands that act like macros but aren't defined as a macro,\n// function, or symbol.  Used in `isDefined`.\nvar implicitCommands = {\n  \"^\": true,\n  // Parser.js\n  \"_\": true,\n  // Parser.js\n  \"\\\\limits\": true,\n  // Parser.js\n  \"\\\\nolimits\": true // Parser.js\n};\nclass MacroExpander {\n  constructor(input, settings, mode) {\n    this.settings = settings;\n    this.expansionCount = 0;\n    this.feed(input);\n    // Make new global namespace\n    this.macros = new Namespace(macros, settings.macros);\n    this.mode = mode;\n    this.stack = []; // contains tokens in REVERSE order\n  }\n  /**\n   * Feed a new input string to the same MacroExpander\n   * (with existing macros etc.).\n   */\n  feed(input) {\n    this.lexer = new Lexer(input, this.settings);\n  }\n  /**\n   * Switches between \"text\" and \"math\" modes.\n   */\n  switchMode(newMode) {\n    this.mode = newMode;\n  }\n  /**\n   * Start a new group nesting within all namespaces.\n   */\n  beginGroup() {\n    this.macros.beginGroup();\n  }\n  /**\n   * End current group nesting within all namespaces.\n   */\n  endGroup() {\n    this.macros.endGroup();\n  }\n  /**\n   * Ends all currently nested groups (if any), restoring values before the\n   * groups began.  Useful in case of an error in the middle of parsing.\n   */\n  endGroups() {\n    this.macros.endGroups();\n  }\n  /**\n   * Returns the topmost token on the stack, without expanding it.\n   * Similar in behavior to TeX's `\\futurelet`.\n   */\n  future() {\n    if (this.stack.length === 0) {\n      this.pushToken(this.lexer.lex());\n    }\n    return this.stack[this.stack.length - 1];\n  }\n  /**\n   * Remove and return the next unexpanded token.\n   */\n  popToken() {\n    this.future(); // ensure non-empty stack\n    return this.stack.pop();\n  }\n  /**\n   * Add a given token to the token stack.  In particular, this get be used\n   * to put back a token returned from one of the other methods.\n   */\n  pushToken(token) {\n    this.stack.push(token);\n  }\n  /**\n   * Append an array of tokens to the token stack.\n   */\n  pushTokens(tokens) {\n    this.stack.push(...tokens);\n  }\n  /**\n   * Find an macro argument without expanding tokens and append the array of\n   * tokens to the token stack. Uses Token as a container for the result.\n   */\n  scanArgument(isOptional) {\n    var start;\n    var end;\n    var tokens;\n    if (isOptional) {\n      this.consumeSpaces(); // \\@ifnextchar gobbles any space following it\n      if (this.future().text !== \"[\") {\n        return null;\n      }\n      start = this.popToken(); // don't include [ in tokens\n      ({\n        tokens,\n        end\n      } = this.consumeArg([\"]\"]));\n    } else {\n      ({\n        tokens,\n        start,\n        end\n      } = this.consumeArg());\n    }\n    // indicate the end of an argument\n    this.pushToken(new Token(\"EOF\", end.loc));\n    this.pushTokens(tokens);\n    return new Token(\"\", SourceLocation.range(start, end));\n  }\n  /**\n   * Consume all following space tokens, without expansion.\n   */\n  consumeSpaces() {\n    for (;;) {\n      var token = this.future();\n      if (token.text === \" \") {\n        this.stack.pop();\n      } else {\n        break;\n      }\n    }\n  }\n  /**\n   * Consume an argument from the token stream, and return the resulting array\n   * of tokens and start/end token.\n   */\n  consumeArg(delims) {\n    // The argument for a delimited parameter is the shortest (possibly\n    // empty) sequence of tokens with properly nested {...} groups that is\n    // followed ... by this particular list of non-parameter tokens.\n    // The argument for an undelimited parameter is the next nonblank\n    // token, unless that token is ‘{’, when the argument will be the\n    // entire {...} group that follows.\n    var tokens = [];\n    var isDelimited = delims && delims.length > 0;\n    if (!isDelimited) {\n      // Ignore spaces between arguments.  As the TeXbook says:\n      // \"After you have said ‘\\def\\row#1#2{...}’, you are allowed to\n      //  put spaces between the arguments (e.g., ‘\\row x n’), because\n      //  TeX doesn’t use single spaces as undelimited arguments.\"\n      this.consumeSpaces();\n    }\n    var start = this.future();\n    var tok;\n    var depth = 0;\n    var match = 0;\n    do {\n      tok = this.popToken();\n      tokens.push(tok);\n      if (tok.text === \"{\") {\n        ++depth;\n      } else if (tok.text === \"}\") {\n        --depth;\n        if (depth === -1) {\n          throw new ParseError(\"Extra }\", tok);\n        }\n      } else if (tok.text === \"EOF\") {\n        throw new ParseError(\"Unexpected end of input in a macro argument\" + \", expected '\" + (delims && isDelimited ? delims[match] : \"}\") + \"'\", tok);\n      }\n      if (delims && isDelimited) {\n        if ((depth === 0 || depth === 1 && delims[match] === \"{\") && tok.text === delims[match]) {\n          ++match;\n          if (match === delims.length) {\n            // don't include delims in tokens\n            tokens.splice(-match, match);\n            break;\n          }\n        } else {\n          match = 0;\n        }\n      }\n    } while (depth !== 0 || isDelimited);\n    // If the argument found ... has the form ‘{<nested tokens>}’,\n    // ... the outermost braces enclosing the argument are removed\n    if (start.text === \"{\" && tokens[tokens.length - 1].text === \"}\") {\n      tokens.pop();\n      tokens.shift();\n    }\n    tokens.reverse(); // to fit in with stack order\n    return {\n      tokens,\n      start,\n      end: tok\n    };\n  }\n  /**\n   * Consume the specified number of (delimited) arguments from the token\n   * stream and return the resulting array of arguments.\n   */\n  consumeArgs(numArgs, delimiters) {\n    if (delimiters) {\n      if (delimiters.length !== numArgs + 1) {\n        throw new ParseError(\"The length of delimiters doesn't match the number of args!\");\n      }\n      var delims = delimiters[0];\n      for (var i = 0; i < delims.length; i++) {\n        var tok = this.popToken();\n        if (delims[i] !== tok.text) {\n          throw new ParseError(\"Use of the macro doesn't match its definition\", tok);\n        }\n      }\n    }\n    var args = [];\n    for (var _i = 0; _i < numArgs; _i++) {\n      args.push(this.consumeArg(delimiters && delimiters[_i + 1]).tokens);\n    }\n    return args;\n  }\n  /**\n   * Increment `expansionCount` by the specified amount.\n   * Throw an error if it exceeds `maxExpand`.\n   */\n  countExpansion(amount) {\n    this.expansionCount += amount;\n    if (this.expansionCount > this.settings.maxExpand) {\n      throw new ParseError(\"Too many expansions: infinite loop or \" + \"need to increase maxExpand setting\");\n    }\n  }\n  /**\n   * Expand the next token only once if possible.\n   *\n   * If the token is expanded, the resulting tokens will be pushed onto\n   * the stack in reverse order, and the number of such tokens will be\n   * returned.  This number might be zero or positive.\n   *\n   * If not, the return value is `false`, and the next token remains at the\n   * top of the stack.\n   *\n   * In either case, the next token will be on the top of the stack,\n   * or the stack will be empty (in case of empty expansion\n   * and no other tokens).\n   *\n   * Used to implement `expandAfterFuture` and `expandNextToken`.\n   *\n   * If expandableOnly, only expandable tokens are expanded and\n   * an undefined control sequence results in an error.\n   */\n  expandOnce(expandableOnly) {\n    var topToken = this.popToken();\n    var name = topToken.text;\n    var expansion = !topToken.noexpand ? this._getExpansion(name) : null;\n    if (expansion == null || expandableOnly && expansion.unexpandable) {\n      if (expandableOnly && expansion == null && name[0] === \"\\\\\" && !this.isDefined(name)) {\n        throw new ParseError(\"Undefined control sequence: \" + name);\n      }\n      this.pushToken(topToken);\n      return false;\n    }\n    this.countExpansion(1);\n    var tokens = expansion.tokens;\n    var args = this.consumeArgs(expansion.numArgs, expansion.delimiters);\n    if (expansion.numArgs) {\n      // paste arguments in place of the placeholders\n      tokens = tokens.slice(); // make a shallow copy\n      for (var i = tokens.length - 1; i >= 0; --i) {\n        var tok = tokens[i];\n        if (tok.text === \"#\") {\n          if (i === 0) {\n            throw new ParseError(\"Incomplete placeholder at end of macro body\", tok);\n          }\n          tok = tokens[--i]; // next token on stack\n          if (tok.text === \"#\") {\n            // ## → #\n            tokens.splice(i + 1, 1); // drop first #\n          } else if (/^[1-9]$/.test(tok.text)) {\n            // replace the placeholder with the indicated argument\n            tokens.splice(i, 2, ...args[+tok.text - 1]);\n          } else {\n            throw new ParseError(\"Not a valid argument number\", tok);\n          }\n        }\n      }\n    }\n    // Concatenate expansion onto top of stack.\n    this.pushTokens(tokens);\n    return tokens.length;\n  }\n  /**\n   * Expand the next token only once (if possible), and return the resulting\n   * top token on the stack (without removing anything from the stack).\n   * Similar in behavior to TeX's `\\expandafter\\futurelet`.\n   * Equivalent to expandOnce() followed by future().\n   */\n  expandAfterFuture() {\n    this.expandOnce();\n    return this.future();\n  }\n  /**\n   * Recursively expand first token, then return first non-expandable token.\n   */\n  expandNextToken() {\n    for (;;) {\n      if (this.expandOnce() === false) {\n        // fully expanded\n        var token = this.stack.pop();\n        // the token after \\noexpand is interpreted as if its meaning\n        // were ‘\\relax’\n        if (token.treatAsRelax) {\n          token.text = \"\\\\relax\";\n        }\n        return token;\n      }\n    }\n  }\n  /**\n   * Fully expand the given macro name and return the resulting list of\n   * tokens, or return `undefined` if no such macro is defined.\n   */\n  expandMacro(name) {\n    return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined;\n  }\n  /**\n   * Fully expand the given token stream and return the resulting list of\n   * tokens.  Note that the input tokens are in reverse order, but the\n   * output tokens are in forward order.\n   */\n  expandTokens(tokens) {\n    var output = [];\n    var oldStackLength = this.stack.length;\n    this.pushTokens(tokens);\n    while (this.stack.length > oldStackLength) {\n      // Expand only expandable tokens\n      if (this.expandOnce(true) === false) {\n        // fully expanded\n        var token = this.stack.pop();\n        if (token.treatAsRelax) {\n          // the expansion of \\noexpand is the token itself\n          token.noexpand = false;\n          token.treatAsRelax = false;\n        }\n        output.push(token);\n      }\n    }\n    // Count all of these tokens as additional expansions, to prevent\n    // exponential blowup from linearly many \\edef's.\n    this.countExpansion(output.length);\n    return output;\n  }\n  /**\n   * Fully expand the given macro name and return the result as a string,\n   * or return `undefined` if no such macro is defined.\n   */\n  expandMacroAsText(name) {\n    var tokens = this.expandMacro(name);\n    if (tokens) {\n      return tokens.map(token => token.text).join(\"\");\n    } else {\n      return tokens;\n    }\n  }\n  /**\n   * Returns the expanded macro as a reversed array of tokens and a macro\n   * argument count.  Or returns `null` if no such macro.\n   */\n  _getExpansion(name) {\n    var definition = this.macros.get(name);\n    if (definition == null) {\n      // mainly checking for undefined here\n      return definition;\n    }\n    // If a single character has an associated catcode other than 13\n    // (active character), then don't expand it.\n    if (name.length === 1) {\n      var catcode = this.lexer.catcodes[name];\n      if (catcode != null && catcode !== 13) {\n        return;\n      }\n    }\n    var expansion = typeof definition === \"function\" ? definition(this) : definition;\n    if (typeof expansion === \"string\") {\n      var numArgs = 0;\n      if (expansion.includes(\"#\")) {\n        var stripped = expansion.replace(/##/g, \"\");\n        while (stripped.includes(\"#\" + (numArgs + 1))) {\n          ++numArgs;\n        }\n      }\n      var bodyLexer = new Lexer(expansion, this.settings);\n      var tokens = [];\n      var tok = bodyLexer.lex();\n      while (tok.text !== \"EOF\") {\n        tokens.push(tok);\n        tok = bodyLexer.lex();\n      }\n      tokens.reverse(); // to fit in with stack using push and pop\n      var expanded = {\n        tokens,\n        numArgs\n      };\n      return expanded;\n    }\n    return expansion;\n  }\n  /**\n   * Determine whether a command is currently \"defined\" (has some\n   * functionality), meaning that it's a macro (in the current group),\n   * a function, a symbol, or one of the special commands listed in\n   * `implicitCommands`.\n   */\n  isDefined(name) {\n    return this.macros.has(name) || functions.hasOwnProperty(name) || symbols.math.hasOwnProperty(name) || symbols.text.hasOwnProperty(name) || implicitCommands.hasOwnProperty(name);\n  }\n  /**\n   * Determine whether a command is expandable.\n   */\n  isExpandable(name) {\n    var macro = this.macros.get(name);\n    return macro != null ? typeof macro === \"string\" || typeof macro === \"function\" || !macro.unexpandable : functions.hasOwnProperty(name) && !functions[name].primitive;\n  }\n}\n\n// Helpers for Parser.js handling of Unicode (sub|super)script characters.\nvar unicodeSubRegEx = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/;\nvar uSubsAndSups = Object.freeze({\n  '₊': '+',\n  '₋': '-',\n  '₌': '=',\n  '₍': '(',\n  '₎': ')',\n  '₀': '0',\n  '₁': '1',\n  '₂': '2',\n  '₃': '3',\n  '₄': '4',\n  '₅': '5',\n  '₆': '6',\n  '₇': '7',\n  '₈': '8',\n  '₉': '9',\n  '\\u2090': 'a',\n  '\\u2091': 'e',\n  '\\u2095': 'h',\n  '\\u1D62': 'i',\n  '\\u2C7C': 'j',\n  '\\u2096': 'k',\n  '\\u2097': 'l',\n  '\\u2098': 'm',\n  '\\u2099': 'n',\n  '\\u2092': 'o',\n  '\\u209A': 'p',\n  '\\u1D63': 'r',\n  '\\u209B': 's',\n  '\\u209C': 't',\n  '\\u1D64': 'u',\n  '\\u1D65': 'v',\n  '\\u2093': 'x',\n  '\\u1D66': 'β',\n  '\\u1D67': 'γ',\n  '\\u1D68': 'ρ',\n  '\\u1D69': '\\u03d5',\n  '\\u1D6A': 'χ',\n  '⁺': '+',\n  '⁻': '-',\n  '⁼': '=',\n  '⁽': '(',\n  '⁾': ')',\n  '⁰': '0',\n  '¹': '1',\n  '²': '2',\n  '³': '3',\n  '⁴': '4',\n  '⁵': '5',\n  '⁶': '6',\n  '⁷': '7',\n  '⁸': '8',\n  '⁹': '9',\n  '\\u1D2C': 'A',\n  '\\u1D2E': 'B',\n  '\\u1D30': 'D',\n  '\\u1D31': 'E',\n  '\\u1D33': 'G',\n  '\\u1D34': 'H',\n  '\\u1D35': 'I',\n  '\\u1D36': 'J',\n  '\\u1D37': 'K',\n  '\\u1D38': 'L',\n  '\\u1D39': 'M',\n  '\\u1D3A': 'N',\n  '\\u1D3C': 'O',\n  '\\u1D3E': 'P',\n  '\\u1D3F': 'R',\n  '\\u1D40': 'T',\n  '\\u1D41': 'U',\n  '\\u2C7D': 'V',\n  '\\u1D42': 'W',\n  '\\u1D43': 'a',\n  '\\u1D47': 'b',\n  '\\u1D9C': 'c',\n  '\\u1D48': 'd',\n  '\\u1D49': 'e',\n  '\\u1DA0': 'f',\n  '\\u1D4D': 'g',\n  '\\u02B0': 'h',\n  '\\u2071': 'i',\n  '\\u02B2': 'j',\n  '\\u1D4F': 'k',\n  '\\u02E1': 'l',\n  '\\u1D50': 'm',\n  '\\u207F': 'n',\n  '\\u1D52': 'o',\n  '\\u1D56': 'p',\n  '\\u02B3': 'r',\n  '\\u02E2': 's',\n  '\\u1D57': 't',\n  '\\u1D58': 'u',\n  '\\u1D5B': 'v',\n  '\\u02B7': 'w',\n  '\\u02E3': 'x',\n  '\\u02B8': 'y',\n  '\\u1DBB': 'z',\n  '\\u1D5D': 'β',\n  '\\u1D5E': 'γ',\n  '\\u1D5F': 'δ',\n  '\\u1D60': '\\u03d5',\n  '\\u1D61': 'χ',\n  '\\u1DBF': 'θ'\n});\n\n/* eslint no-constant-condition:0 */\n// Pre-evaluate both modules as unicodeSymbols require String.normalize()\nvar unicodeAccents = {\n  \"́\": {\n    \"text\": \"\\\\'\",\n    \"math\": \"\\\\acute\"\n  },\n  \"̀\": {\n    \"text\": \"\\\\`\",\n    \"math\": \"\\\\grave\"\n  },\n  \"̈\": {\n    \"text\": \"\\\\\\\"\",\n    \"math\": \"\\\\ddot\"\n  },\n  \"̃\": {\n    \"text\": \"\\\\~\",\n    \"math\": \"\\\\tilde\"\n  },\n  \"̄\": {\n    \"text\": \"\\\\=\",\n    \"math\": \"\\\\bar\"\n  },\n  \"̆\": {\n    \"text\": \"\\\\u\",\n    \"math\": \"\\\\breve\"\n  },\n  \"̌\": {\n    \"text\": \"\\\\v\",\n    \"math\": \"\\\\check\"\n  },\n  \"̂\": {\n    \"text\": \"\\\\^\",\n    \"math\": \"\\\\hat\"\n  },\n  \"̇\": {\n    \"text\": \"\\\\.\",\n    \"math\": \"\\\\dot\"\n  },\n  \"̊\": {\n    \"text\": \"\\\\r\",\n    \"math\": \"\\\\mathring\"\n  },\n  \"̋\": {\n    \"text\": \"\\\\H\"\n  },\n  \"̧\": {\n    \"text\": \"\\\\c\"\n  }\n};\nvar unicodeSymbols = {\n  \"á\": \"á\",\n  \"à\": \"à\",\n  \"ä\": \"ä\",\n  \"ǟ\": \"ǟ\",\n  \"ã\": \"ã\",\n  \"ā\": \"ā\",\n  \"ă\": \"ă\",\n  \"ắ\": \"ắ\",\n  \"ằ\": \"ằ\",\n  \"ẵ\": \"ẵ\",\n  \"ǎ\": \"ǎ\",\n  \"â\": \"â\",\n  \"ấ\": \"ấ\",\n  \"ầ\": \"ầ\",\n  \"ẫ\": \"ẫ\",\n  \"ȧ\": \"ȧ\",\n  \"ǡ\": \"ǡ\",\n  \"å\": \"å\",\n  \"ǻ\": \"ǻ\",\n  \"ḃ\": \"ḃ\",\n  \"ć\": \"ć\",\n  \"ḉ\": \"ḉ\",\n  \"č\": \"č\",\n  \"ĉ\": \"ĉ\",\n  \"ċ\": \"ċ\",\n  \"ç\": \"ç\",\n  \"ď\": \"ď\",\n  \"ḋ\": \"ḋ\",\n  \"ḑ\": \"ḑ\",\n  \"é\": \"é\",\n  \"è\": \"è\",\n  \"ë\": \"ë\",\n  \"ẽ\": \"ẽ\",\n  \"ē\": \"ē\",\n  \"ḗ\": \"ḗ\",\n  \"ḕ\": \"ḕ\",\n  \"ĕ\": \"ĕ\",\n  \"ḝ\": \"ḝ\",\n  \"ě\": \"ě\",\n  \"ê\": \"ê\",\n  \"ế\": \"ế\",\n  \"ề\": \"ề\",\n  \"ễ\": \"ễ\",\n  \"ė\": \"ė\",\n  \"ȩ\": \"ȩ\",\n  \"ḟ\": \"ḟ\",\n  \"ǵ\": \"ǵ\",\n  \"ḡ\": \"ḡ\",\n  \"ğ\": \"ğ\",\n  \"ǧ\": \"ǧ\",\n  \"ĝ\": \"ĝ\",\n  \"ġ\": \"ġ\",\n  \"ģ\": \"ģ\",\n  \"ḧ\": \"ḧ\",\n  \"ȟ\": \"ȟ\",\n  \"ĥ\": \"ĥ\",\n  \"ḣ\": \"ḣ\",\n  \"ḩ\": \"ḩ\",\n  \"í\": \"í\",\n  \"ì\": \"ì\",\n  \"ï\": \"ï\",\n  \"ḯ\": \"ḯ\",\n  \"ĩ\": \"ĩ\",\n  \"ī\": \"ī\",\n  \"ĭ\": \"ĭ\",\n  \"ǐ\": \"ǐ\",\n  \"î\": \"î\",\n  \"ǰ\": \"ǰ\",\n  \"ĵ\": \"ĵ\",\n  \"ḱ\": \"ḱ\",\n  \"ǩ\": \"ǩ\",\n  \"ķ\": \"ķ\",\n  \"ĺ\": \"ĺ\",\n  \"ľ\": \"ľ\",\n  \"ļ\": \"ļ\",\n  \"ḿ\": \"ḿ\",\n  \"ṁ\": \"ṁ\",\n  \"ń\": \"ń\",\n  \"ǹ\": \"ǹ\",\n  \"ñ\": \"ñ\",\n  \"ň\": \"ň\",\n  \"ṅ\": \"ṅ\",\n  \"ņ\": \"ņ\",\n  \"ó\": \"ó\",\n  \"ò\": \"ò\",\n  \"ö\": \"ö\",\n  \"ȫ\": \"ȫ\",\n  \"õ\": \"õ\",\n  \"ṍ\": \"ṍ\",\n  \"ṏ\": \"ṏ\",\n  \"ȭ\": \"ȭ\",\n  \"ō\": \"ō\",\n  \"ṓ\": \"ṓ\",\n  \"ṑ\": \"ṑ\",\n  \"ŏ\": \"ŏ\",\n  \"ǒ\": \"ǒ\",\n  \"ô\": \"ô\",\n  \"ố\": \"ố\",\n  \"ồ\": \"ồ\",\n  \"ỗ\": \"ỗ\",\n  \"ȯ\": \"ȯ\",\n  \"ȱ\": \"ȱ\",\n  \"ő\": \"ő\",\n  \"ṕ\": \"ṕ\",\n  \"ṗ\": \"ṗ\",\n  \"ŕ\": \"ŕ\",\n  \"ř\": \"ř\",\n  \"ṙ\": \"ṙ\",\n  \"ŗ\": \"ŗ\",\n  \"ś\": \"ś\",\n  \"ṥ\": \"ṥ\",\n  \"š\": \"š\",\n  \"ṧ\": \"ṧ\",\n  \"ŝ\": \"ŝ\",\n  \"ṡ\": \"ṡ\",\n  \"ş\": \"ş\",\n  \"ẗ\": \"ẗ\",\n  \"ť\": \"ť\",\n  \"ṫ\": \"ṫ\",\n  \"ţ\": \"ţ\",\n  \"ú\": \"ú\",\n  \"ù\": \"ù\",\n  \"ü\": \"ü\",\n  \"ǘ\": \"ǘ\",\n  \"ǜ\": \"ǜ\",\n  \"ǖ\": \"ǖ\",\n  \"ǚ\": \"ǚ\",\n  \"ũ\": \"ũ\",\n  \"ṹ\": \"ṹ\",\n  \"ū\": \"ū\",\n  \"ṻ\": \"ṻ\",\n  \"ŭ\": \"ŭ\",\n  \"ǔ\": \"ǔ\",\n  \"û\": \"û\",\n  \"ů\": \"ů\",\n  \"ű\": \"ű\",\n  \"ṽ\": \"ṽ\",\n  \"ẃ\": \"ẃ\",\n  \"ẁ\": \"ẁ\",\n  \"ẅ\": \"ẅ\",\n  \"ŵ\": \"ŵ\",\n  \"ẇ\": \"ẇ\",\n  \"ẘ\": \"ẘ\",\n  \"ẍ\": \"ẍ\",\n  \"ẋ\": \"ẋ\",\n  \"ý\": \"ý\",\n  \"ỳ\": \"ỳ\",\n  \"ÿ\": \"ÿ\",\n  \"ỹ\": \"ỹ\",\n  \"ȳ\": \"ȳ\",\n  \"ŷ\": \"ŷ\",\n  \"ẏ\": \"ẏ\",\n  \"ẙ\": \"ẙ\",\n  \"ź\": \"ź\",\n  \"ž\": \"ž\",\n  \"ẑ\": \"ẑ\",\n  \"ż\": \"ż\",\n  \"Á\": \"Á\",\n  \"À\": \"À\",\n  \"Ä\": \"Ä\",\n  \"Ǟ\": \"Ǟ\",\n  \"Ã\": \"Ã\",\n  \"Ā\": \"Ā\",\n  \"Ă\": \"Ă\",\n  \"Ắ\": \"Ắ\",\n  \"Ằ\": \"Ằ\",\n  \"Ẵ\": \"Ẵ\",\n  \"Ǎ\": \"Ǎ\",\n  \"Â\": \"Â\",\n  \"Ấ\": \"Ấ\",\n  \"Ầ\": \"Ầ\",\n  \"Ẫ\": \"Ẫ\",\n  \"Ȧ\": \"Ȧ\",\n  \"Ǡ\": \"Ǡ\",\n  \"Å\": \"Å\",\n  \"Ǻ\": \"Ǻ\",\n  \"Ḃ\": \"Ḃ\",\n  \"Ć\": \"Ć\",\n  \"Ḉ\": \"Ḉ\",\n  \"Č\": \"Č\",\n  \"Ĉ\": \"Ĉ\",\n  \"Ċ\": \"Ċ\",\n  \"Ç\": \"Ç\",\n  \"Ď\": \"Ď\",\n  \"Ḋ\": \"Ḋ\",\n  \"Ḑ\": \"Ḑ\",\n  \"É\": \"É\",\n  \"È\": \"È\",\n  \"Ë\": \"Ë\",\n  \"Ẽ\": \"Ẽ\",\n  \"Ē\": \"Ē\",\n  \"Ḗ\": \"Ḗ\",\n  \"Ḕ\": \"Ḕ\",\n  \"Ĕ\": \"Ĕ\",\n  \"Ḝ\": \"Ḝ\",\n  \"Ě\": \"Ě\",\n  \"Ê\": \"Ê\",\n  \"Ế\": \"Ế\",\n  \"Ề\": \"Ề\",\n  \"Ễ\": \"Ễ\",\n  \"Ė\": \"Ė\",\n  \"Ȩ\": \"Ȩ\",\n  \"Ḟ\": \"Ḟ\",\n  \"Ǵ\": \"Ǵ\",\n  \"Ḡ\": \"Ḡ\",\n  \"Ğ\": \"Ğ\",\n  \"Ǧ\": \"Ǧ\",\n  \"Ĝ\": \"Ĝ\",\n  \"Ġ\": \"Ġ\",\n  \"Ģ\": \"Ģ\",\n  \"Ḧ\": \"Ḧ\",\n  \"Ȟ\": \"Ȟ\",\n  \"Ĥ\": \"Ĥ\",\n  \"Ḣ\": \"Ḣ\",\n  \"Ḩ\": \"Ḩ\",\n  \"Í\": \"Í\",\n  \"Ì\": \"Ì\",\n  \"Ï\": \"Ï\",\n  \"Ḯ\": \"Ḯ\",\n  \"Ĩ\": \"Ĩ\",\n  \"Ī\": \"Ī\",\n  \"Ĭ\": \"Ĭ\",\n  \"Ǐ\": \"Ǐ\",\n  \"Î\": \"Î\",\n  \"İ\": \"İ\",\n  \"Ĵ\": \"Ĵ\",\n  \"Ḱ\": \"Ḱ\",\n  \"Ǩ\": \"Ǩ\",\n  \"Ķ\": \"Ķ\",\n  \"Ĺ\": \"Ĺ\",\n  \"Ľ\": \"Ľ\",\n  \"Ļ\": \"Ļ\",\n  \"Ḿ\": \"Ḿ\",\n  \"Ṁ\": \"Ṁ\",\n  \"Ń\": \"Ń\",\n  \"Ǹ\": \"Ǹ\",\n  \"Ñ\": \"Ñ\",\n  \"Ň\": \"Ň\",\n  \"Ṅ\": \"Ṅ\",\n  \"Ņ\": \"Ņ\",\n  \"Ó\": \"Ó\",\n  \"Ò\": \"Ò\",\n  \"Ö\": \"Ö\",\n  \"Ȫ\": \"Ȫ\",\n  \"Õ\": \"Õ\",\n  \"Ṍ\": \"Ṍ\",\n  \"Ṏ\": \"Ṏ\",\n  \"Ȭ\": \"Ȭ\",\n  \"Ō\": \"Ō\",\n  \"Ṓ\": \"Ṓ\",\n  \"Ṑ\": \"Ṑ\",\n  \"Ŏ\": \"Ŏ\",\n  \"Ǒ\": \"Ǒ\",\n  \"Ô\": \"Ô\",\n  \"Ố\": \"Ố\",\n  \"Ồ\": \"Ồ\",\n  \"Ỗ\": \"Ỗ\",\n  \"Ȯ\": \"Ȯ\",\n  \"Ȱ\": \"Ȱ\",\n  \"Ő\": \"Ő\",\n  \"Ṕ\": \"Ṕ\",\n  \"Ṗ\": \"Ṗ\",\n  \"Ŕ\": \"Ŕ\",\n  \"Ř\": \"Ř\",\n  \"Ṙ\": \"Ṙ\",\n  \"Ŗ\": \"Ŗ\",\n  \"Ś\": \"Ś\",\n  \"Ṥ\": \"Ṥ\",\n  \"Š\": \"Š\",\n  \"Ṧ\": \"Ṧ\",\n  \"Ŝ\": \"Ŝ\",\n  \"Ṡ\": \"Ṡ\",\n  \"Ş\": \"Ş\",\n  \"Ť\": \"Ť\",\n  \"Ṫ\": \"Ṫ\",\n  \"Ţ\": \"Ţ\",\n  \"Ú\": \"Ú\",\n  \"Ù\": \"Ù\",\n  \"Ü\": \"Ü\",\n  \"Ǘ\": \"Ǘ\",\n  \"Ǜ\": \"Ǜ\",\n  \"Ǖ\": \"Ǖ\",\n  \"Ǚ\": \"Ǚ\",\n  \"Ũ\": \"Ũ\",\n  \"Ṹ\": \"Ṹ\",\n  \"Ū\": \"Ū\",\n  \"Ṻ\": \"Ṻ\",\n  \"Ŭ\": \"Ŭ\",\n  \"Ǔ\": \"Ǔ\",\n  \"Û\": \"Û\",\n  \"Ů\": \"Ů\",\n  \"Ű\": \"Ű\",\n  \"Ṽ\": \"Ṽ\",\n  \"Ẃ\": \"Ẃ\",\n  \"Ẁ\": \"Ẁ\",\n  \"Ẅ\": \"Ẅ\",\n  \"Ŵ\": \"Ŵ\",\n  \"Ẇ\": \"Ẇ\",\n  \"Ẍ\": \"Ẍ\",\n  \"Ẋ\": \"Ẋ\",\n  \"Ý\": \"Ý\",\n  \"Ỳ\": \"Ỳ\",\n  \"Ÿ\": \"Ÿ\",\n  \"Ỹ\": \"Ỹ\",\n  \"Ȳ\": \"Ȳ\",\n  \"Ŷ\": \"Ŷ\",\n  \"Ẏ\": \"Ẏ\",\n  \"Ź\": \"Ź\",\n  \"Ž\": \"Ž\",\n  \"Ẑ\": \"Ẑ\",\n  \"Ż\": \"Ż\",\n  \"ά\": \"ά\",\n  \"ὰ\": \"ὰ\",\n  \"ᾱ\": \"ᾱ\",\n  \"ᾰ\": \"ᾰ\",\n  \"έ\": \"έ\",\n  \"ὲ\": \"ὲ\",\n  \"ή\": \"ή\",\n  \"ὴ\": \"ὴ\",\n  \"ί\": \"ί\",\n  \"ὶ\": \"ὶ\",\n  \"ϊ\": \"ϊ\",\n  \"ΐ\": \"ΐ\",\n  \"ῒ\": \"ῒ\",\n  \"ῑ\": \"ῑ\",\n  \"ῐ\": \"ῐ\",\n  \"ό\": \"ό\",\n  \"ὸ\": \"ὸ\",\n  \"ύ\": \"ύ\",\n  \"ὺ\": \"ὺ\",\n  \"ϋ\": \"ϋ\",\n  \"ΰ\": \"ΰ\",\n  \"ῢ\": \"ῢ\",\n  \"ῡ\": \"ῡ\",\n  \"ῠ\": \"ῠ\",\n  \"ώ\": \"ώ\",\n  \"ὼ\": \"ὼ\",\n  \"Ύ\": \"Ύ\",\n  \"Ὺ\": \"Ὺ\",\n  \"Ϋ\": \"Ϋ\",\n  \"Ῡ\": \"Ῡ\",\n  \"Ῠ\": \"Ῠ\",\n  \"Ώ\": \"Ώ\",\n  \"Ὼ\": \"Ὼ\"\n};\n/**\n * This file contains the parser used to parse out a TeX expression from the\n * input. Since TeX isn't context-free, standard parsers don't work particularly\n * well.\n *\n * The strategy of this parser is as such:\n *\n * The main functions (the `.parse...` ones) take a position in the current\n * parse string to parse tokens from. The lexer (found in Lexer.js, stored at\n * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When\n * individual tokens are needed at a position, the lexer is called to pull out a\n * token, which is then used.\n *\n * The parser has a property called \"mode\" indicating the mode that\n * the parser is currently in. Currently it has to be one of \"math\" or\n * \"text\", which denotes whether the current environment is a math-y\n * one or a text-y one (e.g. inside \\text). Currently, this serves to\n * limit the functions which can be used in text mode.\n *\n * The main functions then return an object which contains the useful data that\n * was parsed at its given point, and a new position at the end of the parsed\n * data. The main functions can call each other and continue the parsing by\n * using the returned position as a new starting point.\n *\n * There are also extra `.handle...` functions, which pull out some reused\n * functionality into self-contained functions.\n *\n * The functions return ParseNodes.\n */\nclass Parser {\n  constructor(input, settings) {\n    // Start in math mode\n    this.mode = \"math\";\n    // Create a new macro expander (gullet) and (indirectly via that) also a\n    // new lexer (mouth) for this parser (stomach, in the language of TeX)\n    this.gullet = new MacroExpander(input, settings, this.mode);\n    // Store the settings for use in parsing\n    this.settings = settings;\n    // Count leftright depth (for \\middle errors)\n    this.leftrightDepth = 0;\n    this.nextToken = null;\n  }\n  /**\n   * Checks a result to make sure it has the right type, and throws an\n   * appropriate error otherwise.\n   */\n  expect(text, consume) {\n    if (consume === void 0) {\n      consume = true;\n    }\n    if (this.fetch().text !== text) {\n      throw new ParseError(\"Expected '\" + text + \"', got '\" + this.fetch().text + \"'\", this.fetch());\n    }\n    if (consume) {\n      this.consume();\n    }\n  }\n  /**\n   * Discards the current lookahead token, considering it consumed.\n   */\n  consume() {\n    this.nextToken = null;\n  }\n  /**\n   * Return the current lookahead token, or if there isn't one (at the\n   * beginning, or if the previous lookahead token was consume()d),\n   * fetch the next token as the new lookahead token and return it.\n   */\n  fetch() {\n    if (this.nextToken == null) {\n      this.nextToken = this.gullet.expandNextToken();\n    }\n    return this.nextToken;\n  }\n  /**\n   * Switches between \"text\" and \"math\" modes.\n   */\n  switchMode(newMode) {\n    this.mode = newMode;\n    this.gullet.switchMode(newMode);\n  }\n  /**\n   * Main parsing function, which parses an entire input.\n   */\n  parse() {\n    if (!this.settings.globalGroup) {\n      // Create a group namespace for the math expression.\n      // (LaTeX creates a new group for every $...$, $$...$$, \\[...\\].)\n      this.gullet.beginGroup();\n    }\n    // Use old \\color behavior (same as LaTeX's \\textcolor) if requested.\n    // We do this within the group for the math expression, so it doesn't\n    // pollute settings.macros.\n    if (this.settings.colorIsTextColor) {\n      this.gullet.macros.set(\"\\\\color\", \"\\\\textcolor\");\n    }\n    try {\n      // Try to parse the input\n      var parse = this.parseExpression(false);\n      // If we succeeded, make sure there's an EOF at the end\n      this.expect(\"EOF\");\n      // End the group namespace for the expression\n      if (!this.settings.globalGroup) {\n        this.gullet.endGroup();\n      }\n      return parse;\n      // Close any leftover groups in case of a parse error.\n    } finally {\n      this.gullet.endGroups();\n    }\n  }\n  /**\n   * Fully parse a separate sequence of tokens as a separate job.\n   * Tokens should be specified in reverse order, as in a MacroDefinition.\n   */\n  subparse(tokens) {\n    // Save the next token from the current job.\n    var oldToken = this.nextToken;\n    this.consume();\n    // Run the new job, terminating it with an excess '}'\n    this.gullet.pushToken(new Token(\"}\"));\n    this.gullet.pushTokens(tokens);\n    var parse = this.parseExpression(false);\n    this.expect(\"}\");\n    // Restore the next token from the current job.\n    this.nextToken = oldToken;\n    return parse;\n  }\n  /**\n   * Parses an \"expression\", which is a list of atoms.\n   *\n   * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This\n   *                 happens when functions have higher precedence than infix\n   *                 nodes in implicit parses.\n   *\n   * `breakOnTokenText`: The text of the token that the expression should end\n   *                     with, or `null` if something else should end the\n   *                     expression.\n   */\n  parseExpression(breakOnInfix, breakOnTokenText) {\n    var body = [];\n    // Keep adding atoms to the body until we can't parse any more atoms (either\n    // we reached the end, a }, or a \\right)\n    while (true) {\n      // Ignore spaces in math mode\n      if (this.mode === \"math\") {\n        this.consumeSpaces();\n      }\n      var lex = this.fetch();\n      if (Parser.endOfExpression.has(lex.text)) {\n        break;\n      }\n      if (breakOnTokenText && lex.text === breakOnTokenText) {\n        break;\n      }\n      if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) {\n        break;\n      }\n      var atom = this.parseAtom(breakOnTokenText);\n      if (!atom) {\n        break;\n      } else if (atom.type === \"internal\") {\n        // Internal nodes do not appear in parse tree\n        continue;\n      }\n      body.push(atom);\n    }\n    if (this.mode === \"text\") {\n      this.formLigatures(body);\n    }\n    return this.handleInfixNodes(body);\n  }\n  /**\n   * Rewrites infix operators such as \\over with corresponding commands such\n   * as \\frac.\n   *\n   * There can only be one infix operator per group.  If there's more than one\n   * then the expression is ambiguous.  This can be resolved by adding {}.\n   */\n  handleInfixNodes(body) {\n    var overIndex = -1;\n    var funcName;\n    for (var i = 0; i < body.length; i++) {\n      var node = body[i];\n      if (node.type === \"infix\") {\n        if (overIndex !== -1) {\n          throw new ParseError(\"only one infix operator per group\", node.token);\n        }\n        overIndex = i;\n        funcName = node.replaceWith;\n      }\n    }\n    if (overIndex !== -1 && funcName) {\n      var numerNode;\n      var denomNode;\n      var numerBody = body.slice(0, overIndex);\n      var denomBody = body.slice(overIndex + 1);\n      if (numerBody.length === 1 && numerBody[0].type === \"ordgroup\") {\n        numerNode = numerBody[0];\n      } else {\n        numerNode = {\n          type: \"ordgroup\",\n          mode: this.mode,\n          body: numerBody\n        };\n      }\n      if (denomBody.length === 1 && denomBody[0].type === \"ordgroup\") {\n        denomNode = denomBody[0];\n      } else {\n        denomNode = {\n          type: \"ordgroup\",\n          mode: this.mode,\n          body: denomBody\n        };\n      }\n      var _node;\n      if (funcName === \"\\\\\\\\abovefrac\") {\n        _node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []);\n      } else {\n        _node = this.callFunction(funcName, [numerNode, denomNode], []);\n      }\n      return [_node];\n    } else {\n      return body;\n    }\n  }\n  /**\n   * Handle a subscript or superscript with nice errors.\n   */\n  handleSupSubscript(name) {\n    var symbolToken = this.fetch();\n    var symbol = symbolToken.text;\n    this.consume();\n    this.consumeSpaces(); // ignore spaces before sup/subscript argument\n    // Skip over allowed internal nodes such as \\relax\n    var group;\n    do {\n      var _group;\n      group = this.parseGroup(name);\n    } while (((_group = group) == null ? void 0 : _group.type) === \"internal\");\n    if (!group) {\n      throw new ParseError(\"Expected group after '\" + symbol + \"'\", symbolToken);\n    }\n    return group;\n  }\n  /**\n   * Converts the textual input of an unsupported command into a text node\n   * contained within a color node whose color is determined by errorColor\n   */\n  formatUnsupportedCmd(text) {\n    var textordArray = [];\n    for (var i = 0; i < text.length; i++) {\n      textordArray.push({\n        type: \"textord\",\n        mode: \"text\",\n        text: text[i]\n      });\n    }\n    var textNode = {\n      type: \"text\",\n      mode: this.mode,\n      body: textordArray\n    };\n    var colorNode = {\n      type: \"color\",\n      mode: this.mode,\n      color: this.settings.errorColor,\n      body: [textNode]\n    };\n    return colorNode;\n  }\n  /**\n   * Parses a group with optional super/subscripts.\n   */\n  parseAtom(breakOnTokenText) {\n    // The body of an atom is an implicit group, so that things like\n    // \\left(x\\right)^2 work correctly.\n    var base = this.parseGroup(\"atom\", breakOnTokenText);\n    // Internal nodes (e.g. \\relax) cannot support super/subscripts.\n    // Instead we will pick up super/subscripts with blank base next round.\n    if ((base == null ? void 0 : base.type) === \"internal\") {\n      return base;\n    }\n    // In text mode, we don't have superscripts or subscripts\n    if (this.mode === \"text\") {\n      return base;\n    }\n    // Note that base may be empty (i.e. null) at this point.\n    var superscript;\n    var subscript;\n    while (true) {\n      // Guaranteed in math mode, so eat any spaces first.\n      this.consumeSpaces();\n      // Lex the first token\n      var lex = this.fetch();\n      if (lex.text === \"\\\\limits\" || lex.text === \"\\\\nolimits\") {\n        // We got a limit control\n        if (base && base.type === \"op\") {\n          var limits = lex.text === \"\\\\limits\";\n          base.limits = limits;\n          base.alwaysHandleSupSub = true;\n        } else if (base && base.type === \"operatorname\") {\n          if (base.alwaysHandleSupSub) {\n            base.limits = lex.text === \"\\\\limits\";\n          }\n        } else {\n          throw new ParseError(\"Limit controls must follow a math operator\", lex);\n        }\n        this.consume();\n      } else if (lex.text === \"^\") {\n        // We got a superscript start\n        if (superscript) {\n          throw new ParseError(\"Double superscript\", lex);\n        }\n        superscript = this.handleSupSubscript(\"superscript\");\n      } else if (lex.text === \"_\") {\n        // We got a subscript start\n        if (subscript) {\n          throw new ParseError(\"Double subscript\", lex);\n        }\n        subscript = this.handleSupSubscript(\"subscript\");\n      } else if (lex.text === \"'\") {\n        // We got a prime\n        if (superscript) {\n          throw new ParseError(\"Double superscript\", lex);\n        }\n        var prime = {\n          type: \"textord\",\n          mode: this.mode,\n          text: \"\\\\prime\"\n        };\n        // Many primes can be grouped together, so we handle this here\n        var primes = [prime];\n        this.consume();\n        // Keep lexing tokens until we get something that's not a prime\n        while (this.fetch().text === \"'\") {\n          // For each one, add another prime to the list\n          primes.push(prime);\n          this.consume();\n        }\n        // If there's a superscript following the primes, combine that\n        // superscript in with the primes.\n        if (this.fetch().text === \"^\") {\n          primes.push(this.handleSupSubscript(\"superscript\"));\n        }\n        // Put everything into an ordgroup as the superscript\n        superscript = {\n          type: \"ordgroup\",\n          mode: this.mode,\n          body: primes\n        };\n      } else if (uSubsAndSups[lex.text]) {\n        // A Unicode subscript or superscript character.\n        // We treat these similarly to the unicode-math package.\n        // So we render a string of Unicode (sub|super)scripts the\n        // same as a (sub|super)script of regular characters.\n        var isSub = unicodeSubRegEx.test(lex.text);\n        var subsupTokens = [];\n        subsupTokens.push(new Token(uSubsAndSups[lex.text]));\n        this.consume();\n        // Continue fetching tokens to fill out the string.\n        while (true) {\n          var token = this.fetch().text;\n          if (!uSubsAndSups[token]) {\n            break;\n          }\n          if (unicodeSubRegEx.test(token) !== isSub) {\n            break;\n          }\n          subsupTokens.unshift(new Token(uSubsAndSups[token]));\n          this.consume();\n        }\n        // Now create a (sub|super)script.\n        var body = this.subparse(subsupTokens);\n        if (isSub) {\n          subscript = {\n            type: \"ordgroup\",\n            mode: \"math\",\n            body\n          };\n        } else {\n          superscript = {\n            type: \"ordgroup\",\n            mode: \"math\",\n            body\n          };\n        }\n      } else {\n        // If it wasn't ^, _, or ', stop parsing super/subscripts\n        break;\n      }\n    }\n    // Base must be set if superscript or subscript are set per logic above,\n    // but need to check here for type check to pass.\n    if (superscript || subscript) {\n      // If we got either a superscript or subscript, create a supsub\n      return {\n        type: \"supsub\",\n        mode: this.mode,\n        base: base,\n        sup: superscript,\n        sub: subscript\n      };\n    } else {\n      // Otherwise return the original body\n      return base;\n    }\n  }\n  /**\n   * Parses an entire function, including its base and all of its arguments.\n   */\n  parseFunction(breakOnTokenText, name) {\n    var token = this.fetch();\n    var func = token.text;\n    var funcData = functions[func];\n    if (!funcData) {\n      return null;\n    }\n    this.consume(); // consume command token\n    if (name && name !== \"atom\" && !funcData.allowedInArgument) {\n      throw new ParseError(\"Got function '\" + func + \"' with no arguments\" + (name ? \" as \" + name : \"\"), token);\n    } else if (this.mode === \"text\" && !funcData.allowedInText) {\n      throw new ParseError(\"Can't use function '\" + func + \"' in text mode\", token);\n    } else if (this.mode === \"math\" && funcData.allowedInMath === false) {\n      throw new ParseError(\"Can't use function '\" + func + \"' in math mode\", token);\n    }\n    var {\n      args,\n      optArgs\n    } = this.parseArguments(func, funcData);\n    return this.callFunction(func, args, optArgs, token, breakOnTokenText);\n  }\n  /**\n   * Call a function handler with a suitable context and arguments.\n   */\n  callFunction(name, args, optArgs, token, breakOnTokenText) {\n    var context = {\n      funcName: name,\n      parser: this,\n      token,\n      breakOnTokenText\n    };\n    var func = functions[name];\n    if (func && func.handler) {\n      return func.handler(context, args, optArgs);\n    } else {\n      throw new ParseError(\"No function handler for \" + name);\n    }\n  }\n  /**\n   * Parses the arguments of a function or environment\n   */\n  parseArguments(func,\n  // Should look like \"\\name\" or \"\\begin{name}\".\n  funcData) {\n    var totalArgs = funcData.numArgs + funcData.numOptionalArgs;\n    if (totalArgs === 0) {\n      return {\n        args: [],\n        optArgs: []\n      };\n    }\n    var args = [];\n    var optArgs = [];\n    for (var i = 0; i < totalArgs; i++) {\n      var argType = funcData.argTypes && funcData.argTypes[i];\n      var isOptional = i < funcData.numOptionalArgs;\n      if (\"primitive\" in funcData && funcData.primitive && argType == null ||\n      // \\sqrt expands into primitive if optional argument doesn't exist\n      funcData.type === \"sqrt\" && i === 1 && optArgs[0] == null) {\n        argType = \"primitive\";\n      }\n      var arg = this.parseGroupOfType(\"argument to '\" + func + \"'\", argType, isOptional);\n      if (isOptional) {\n        optArgs.push(arg);\n      } else if (arg != null) {\n        args.push(arg);\n      } else {\n        // should be unreachable\n        throw new ParseError(\"Null argument, please report this as a bug\");\n      }\n    }\n    return {\n      args,\n      optArgs\n    };\n  }\n  /**\n   * Parses a group when the mode is changing.\n   */\n  parseGroupOfType(name, type, optional) {\n    switch (type) {\n      case \"color\":\n        return this.parseColorGroup(optional);\n      case \"size\":\n        return this.parseSizeGroup(optional);\n      case \"url\":\n        return this.parseUrlGroup(optional);\n      case \"math\":\n      case \"text\":\n        return this.parseArgumentGroup(optional, type);\n      case \"hbox\":\n        {\n          // hbox argument type wraps the argument in the equivalent of\n          // \\hbox, which is like \\text but switching to \\textstyle size.\n          var group = this.parseArgumentGroup(optional, \"text\");\n          return group != null ? {\n            type: \"styling\",\n            mode: group.mode,\n            body: [group],\n            style: \"text\" // simulate \\textstyle\n          } : null;\n        }\n      case \"raw\":\n        {\n          var token = this.parseStringGroup(\"raw\", optional);\n          return token != null ? {\n            type: \"raw\",\n            mode: \"text\",\n            string: token.text\n          } : null;\n        }\n      case \"primitive\":\n        {\n          if (optional) {\n            throw new ParseError(\"A primitive argument cannot be optional\");\n          }\n          var _group2 = this.parseGroup(name);\n          if (_group2 == null) {\n            throw new ParseError(\"Expected group as \" + name, this.fetch());\n          }\n          return _group2;\n        }\n      case \"original\":\n      case null:\n      case undefined:\n        return this.parseArgumentGroup(optional);\n      default:\n        throw new ParseError(\"Unknown group type as \" + name, this.fetch());\n    }\n  }\n  /**\n   * Discard any space tokens, fetching the next non-space token.\n   */\n  consumeSpaces() {\n    while (this.fetch().text === \" \") {\n      this.consume();\n    }\n  }\n  /**\n   * Parses a group, essentially returning the string formed by the\n   * brace-enclosed tokens plus some position information.\n   */\n  parseStringGroup(modeName,\n  // Used to describe the mode in error messages.\n  optional) {\n    var argToken = this.gullet.scanArgument(optional);\n    if (argToken == null) {\n      return null;\n    }\n    var str = \"\";\n    var nextToken;\n    while ((nextToken = this.fetch()).text !== \"EOF\") {\n      str += nextToken.text;\n      this.consume();\n    }\n    this.consume(); // consume the end of the argument\n    argToken.text = str;\n    return argToken;\n  }\n  /**\n   * Parses a regex-delimited group: the largest sequence of tokens\n   * whose concatenated strings match `regex`. Returns the string\n   * formed by the tokens plus some position information.\n   */\n  parseRegexGroup(regex, modeName) {\n    var firstToken = this.fetch();\n    var lastToken = firstToken;\n    var str = \"\";\n    var nextToken;\n    while ((nextToken = this.fetch()).text !== \"EOF\" && regex.test(str + nextToken.text)) {\n      lastToken = nextToken;\n      str += lastToken.text;\n      this.consume();\n    }\n    if (str === \"\") {\n      throw new ParseError(\"Invalid \" + modeName + \": '\" + firstToken.text + \"'\", firstToken);\n    }\n    return firstToken.range(lastToken, str);\n  }\n  /**\n   * Parses a color description.\n   */\n  parseColorGroup(optional) {\n    var res = this.parseStringGroup(\"color\", optional);\n    if (res == null) {\n      return null;\n    }\n    var match = /^(#[a-f0-9]{3,4}|#[a-f0-9]{6}|#[a-f0-9]{8}|[a-f0-9]{6}|[a-z]+)$/i.exec(res.text);\n    if (!match) {\n      throw new ParseError(\"Invalid color: '\" + res.text + \"'\", res);\n    }\n    var color = match[0];\n    if (/^[0-9a-f]{6}$/i.test(color)) {\n      // We allow a 6-digit HTML color spec without a leading \"#\".\n      // This follows the xcolor package's HTML color model.\n      // Predefined color names are all missed by this RegEx pattern.\n      color = \"#\" + color;\n    }\n    return {\n      type: \"color-token\",\n      mode: this.mode,\n      color\n    };\n  }\n  /**\n   * Parses a size specification, consisting of magnitude and unit.\n   */\n  parseSizeGroup(optional) {\n    var res;\n    var isBlank = false;\n    // don't expand before parseStringGroup\n    this.gullet.consumeSpaces();\n    if (!optional && this.gullet.future().text !== \"{\") {\n      res = this.parseRegexGroup(/^[-+]? *(?:$|\\d+|\\d+\\.\\d*|\\.\\d*) *[a-z]{0,2} *$/, \"size\");\n    } else {\n      res = this.parseStringGroup(\"size\", optional);\n    }\n    if (!res) {\n      return null;\n    }\n    if (!optional && res.text.length === 0) {\n      // Because we've tested for what is !optional, this block won't\n      // affect \\kern, \\hspace, etc. It will capture the mandatory arguments\n      // to \\genfrac and \\above.\n      res.text = \"0pt\"; // Enable \\above{}\n      isBlank = true; // This is here specifically for \\genfrac\n    }\n    var match = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(res.text);\n    if (!match) {\n      throw new ParseError(\"Invalid size: '\" + res.text + \"'\", res);\n    }\n    var data = {\n      number: +(match[1] + match[2]),\n      // sign + magnitude, cast to number\n      unit: match[3]\n    };\n    if (!validUnit(data)) {\n      throw new ParseError(\"Invalid unit: '\" + data.unit + \"'\", res);\n    }\n    return {\n      type: \"size\",\n      mode: this.mode,\n      value: data,\n      isBlank\n    };\n  }\n  /**\n   * Parses an URL, checking escaped letters and allowed protocols,\n   * and setting the catcode of % as an active character (as in \\hyperref).\n   */\n  parseUrlGroup(optional) {\n    this.gullet.lexer.setCatcode(\"%\", 13); // active character\n    this.gullet.lexer.setCatcode(\"~\", 12); // other character\n    var res = this.parseStringGroup(\"url\", optional);\n    this.gullet.lexer.setCatcode(\"%\", 14); // comment character\n    this.gullet.lexer.setCatcode(\"~\", 13); // active character\n    if (res == null) {\n      return null;\n    }\n    // hyperref package allows backslashes alone in href, but doesn't\n    // generate valid links in such cases; we interpret this as\n    // \"undefined\" behaviour, and keep them as-is. Some browser will\n    // replace backslashes with forward slashes.\n    var url = res.text.replace(/\\\\([#$%&~_^{}])/g, '$1');\n    return {\n      type: \"url\",\n      mode: this.mode,\n      url\n    };\n  }\n  /**\n   * Parses an argument with the mode specified.\n   */\n  parseArgumentGroup(optional, mode) {\n    var argToken = this.gullet.scanArgument(optional);\n    if (argToken == null) {\n      return null;\n    }\n    var outerMode = this.mode;\n    if (mode) {\n      // Switch to specified mode\n      this.switchMode(mode);\n    }\n    this.gullet.beginGroup();\n    var expression = this.parseExpression(false, \"EOF\");\n    // TODO: find an alternative way to denote the end\n    this.expect(\"EOF\"); // expect the end of the argument\n    this.gullet.endGroup();\n    var result = {\n      type: \"ordgroup\",\n      mode: this.mode,\n      loc: argToken.loc,\n      body: expression\n    };\n    if (mode) {\n      // Switch mode back\n      this.switchMode(outerMode);\n    }\n    return result;\n  }\n  /**\n   * Parses an ordinary group, which is either a single nucleus (like \"x\")\n   * or an expression in braces (like \"{x+y}\") or an implicit group, a group\n   * that starts at the current position, and ends right before a higher explicit\n   * group ends, or at EOF.\n   */\n  parseGroup(name,\n  // For error reporting.\n  breakOnTokenText) {\n    var firstToken = this.fetch();\n    var text = firstToken.text;\n    var result;\n    // Try to parse an open brace or \\begingroup\n    if (text === \"{\" || text === \"\\\\begingroup\") {\n      this.consume();\n      var groupEnd = text === \"{\" ? \"}\" : \"\\\\endgroup\";\n      this.gullet.beginGroup();\n      // If we get a brace, parse an expression\n      var expression = this.parseExpression(false, groupEnd);\n      var lastToken = this.fetch();\n      this.expect(groupEnd); // Check that we got a matching closing brace\n      this.gullet.endGroup();\n      result = {\n        type: \"ordgroup\",\n        mode: this.mode,\n        loc: SourceLocation.range(firstToken, lastToken),\n        body: expression,\n        // A group formed by \\begingroup...\\endgroup is a semi-simple group\n        // which doesn't affect spacing in math mode, i.e., is transparent.\n        // https://tex.stackexchange.com/questions/1930/when-should-one-\n        // use-begingroup-instead-of-bgroup\n        semisimple: text === \"\\\\begingroup\" || undefined\n      };\n    } else {\n      // If there exists a function with this name, parse the function.\n      // Otherwise, just return a nucleus\n      result = this.parseFunction(breakOnTokenText, name) || this.parseSymbol();\n      if (result == null && text[0] === \"\\\\\" && !implicitCommands.hasOwnProperty(text)) {\n        if (this.settings.throwOnError) {\n          throw new ParseError(\"Undefined control sequence: \" + text, firstToken);\n        }\n        result = this.formatUnsupportedCmd(text);\n        this.consume();\n      }\n    }\n    return result;\n  }\n  /**\n   * Form ligature-like combinations of characters for text mode.\n   * This includes inputs like \"--\", \"---\", \"``\" and \"''\".\n   * The result will simply replace multiple textord nodes with a single\n   * character in each value by a single textord node having multiple\n   * characters in its value.  The representation is still ASCII source.\n   * The group will be modified in place.\n   */\n  formLigatures(group) {\n    var n = group.length - 1;\n    for (var i = 0; i < n; ++i) {\n      var a = group[i];\n      if (a.type !== \"textord\") {\n        continue;\n      }\n      var v = a.text;\n      var next = group[i + 1];\n      if (!next || next.type !== \"textord\") {\n        continue;\n      }\n      if (v === \"-\" && next.text === \"-\") {\n        var afterNext = group[i + 2];\n        if (i + 1 < n && afterNext && afterNext.type === \"textord\" && afterNext.text === \"-\") {\n          group.splice(i, 3, {\n            type: \"textord\",\n            mode: \"text\",\n            loc: SourceLocation.range(a, afterNext),\n            text: \"---\"\n          });\n          n -= 2;\n        } else {\n          group.splice(i, 2, {\n            type: \"textord\",\n            mode: \"text\",\n            loc: SourceLocation.range(a, next),\n            text: \"--\"\n          });\n          n -= 1;\n        }\n      }\n      if ((v === \"'\" || v === \"`\") && next.text === v) {\n        group.splice(i, 2, {\n          type: \"textord\",\n          mode: \"text\",\n          loc: SourceLocation.range(a, next),\n          text: v + v\n        });\n        n -= 1;\n      }\n    }\n  }\n  /**\n   * Parse a single symbol out of the string. Here, we handle single character\n   * symbols and special functions like \\verb.\n   */\n  parseSymbol() {\n    var nucleus = this.fetch();\n    var text = nucleus.text;\n    if (/^\\\\verb[^a-zA-Z]/.test(text)) {\n      this.consume();\n      var arg = text.slice(5);\n      var star = arg.charAt(0) === \"*\";\n      if (star) {\n        arg = arg.slice(1);\n      }\n      // Lexer's tokenRegex is constructed to always have matching\n      // first/last characters.\n      if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) {\n        throw new ParseError(\"\\\\verb assertion failed --\\n                    please report what input caused this bug\");\n      }\n      arg = arg.slice(1, -1); // remove first and last char\n      return {\n        type: \"verb\",\n        mode: \"text\",\n        body: arg,\n        star\n      };\n    }\n    // At this point, we should have a symbol, possibly with accents.\n    // First expand any accented base symbol according to unicodeSymbols.\n    if (unicodeSymbols.hasOwnProperty(text[0]) && !symbols[this.mode][text[0]]) {\n      // This behavior is not strict (XeTeX-compatible) in math mode.\n      if (this.settings.strict && this.mode === \"math\") {\n        this.settings.reportNonstrict(\"unicodeTextInMathMode\", \"Accented Unicode text character \\\"\" + text[0] + \"\\\" used in \" + \"math mode\", nucleus);\n      }\n      text = unicodeSymbols[text[0]] + text.slice(1);\n    }\n    // Strip off any combining characters\n    var match = combiningDiacriticalMarksEndRegex.exec(text);\n    if (match) {\n      text = text.substring(0, match.index);\n      if (text === 'i') {\n        text = '\\u0131'; // dotless i, in math and text mode\n      } else if (text === 'j') {\n        text = '\\u0237'; // dotless j, in math and text mode\n      }\n    }\n    // Recognize base symbol\n    var symbol;\n    if (symbols[this.mode][text]) {\n      if (this.settings.strict && this.mode === 'math' && extraLatin.includes(text)) {\n        this.settings.reportNonstrict(\"unicodeTextInMathMode\", \"Latin-1/Unicode text character \\\"\" + text[0] + \"\\\" used in \" + \"math mode\", nucleus);\n      }\n      var group = symbols[this.mode][text].group;\n      var loc = SourceLocation.range(nucleus);\n      var s;\n      if (ATOMS.hasOwnProperty(group)) {\n        // TODO(ts)\n        var family = group;\n        s = {\n          type: \"atom\",\n          mode: this.mode,\n          family,\n          loc,\n          text\n        };\n      } else {\n        // TODO(ts)\n        s = {\n          type: group,\n          mode: this.mode,\n          loc,\n          text\n        };\n      }\n      // TODO(ts)\n      symbol = s;\n    } else if (text.charCodeAt(0) >= 0x80) {\n      // no symbol for e.g. ^\n      if (this.settings.strict) {\n        if (!supportedCodepoint(text.charCodeAt(0))) {\n          this.settings.reportNonstrict(\"unknownSymbol\", \"Unrecognized Unicode character \\\"\" + text[0] + \"\\\"\" + (\" (\" + text.charCodeAt(0) + \")\"), nucleus);\n        } else if (this.mode === \"math\") {\n          this.settings.reportNonstrict(\"unicodeTextInMathMode\", \"Unicode text character \\\"\" + text[0] + \"\\\" used in math mode\", nucleus);\n        }\n      }\n      // All nonmathematical Unicode characters are rendered as if they\n      // are in text mode (wrapped in \\text) because that's what it\n      // takes to render them in LaTeX.  Setting `mode: this.mode` is\n      // another natural choice (the user requested math mode), but\n      // this makes it more difficult for getCharacterMetrics() to\n      // distinguish Unicode characters without metrics and those for\n      // which we want to simulate the letter M.\n      symbol = {\n        type: \"textord\",\n        mode: \"text\",\n        loc: SourceLocation.range(nucleus),\n        text\n      };\n    } else {\n      return null; // EOF, ^, _, {, }, etc.\n    }\n    this.consume();\n    // Transform combining characters into accents\n    if (match) {\n      for (var i = 0; i < match[0].length; i++) {\n        var accent = match[0][i];\n        if (!unicodeAccents[accent]) {\n          throw new ParseError(\"Unknown accent ' \" + accent + \"'\", nucleus);\n        }\n        var command = unicodeAccents[accent][this.mode] || unicodeAccents[accent].text;\n        if (!command) {\n          throw new ParseError(\"Accent \" + accent + \" unsupported in \" + this.mode + \" mode\", nucleus);\n        }\n        symbol = {\n          type: \"accent\",\n          mode: this.mode,\n          loc: SourceLocation.range(nucleus),\n          label: command,\n          isStretchy: false,\n          isShifty: true,\n          // TODO(ts)\n          base: symbol\n        };\n      }\n    }\n    // TODO(ts)\n    return symbol;\n  }\n}\nParser.endOfExpression = new Set([\"}\", \"\\\\endgroup\", \"\\\\end\", \"\\\\right\", \"&\"]);\n\n/**\n * Provides a single function for parsing an expression using a Parser\n * TODO(emily): Remove this\n */\n/**\n * Parses an expression using a Parser, then returns the parsed result.\n */\nvar parseTree = function parseTree(toParse, settings) {\n  if (!(typeof toParse === 'string' || toParse instanceof String)) {\n    throw new TypeError('KaTeX can only parse string typed expression');\n  }\n  var parser = new Parser(toParse, settings);\n  // Blank out any \\df@tag to avoid spurious \"Duplicate \\tag\" errors\n  delete parser.gullet.macros.current[\"\\\\df@tag\"];\n  var tree = parser.parse();\n  // Prevent a color definition from persisting between calls to katex.render().\n  delete parser.gullet.macros.current[\"\\\\current@color\"];\n  delete parser.gullet.macros.current[\"\\\\color\"];\n  // If the input used \\tag, it will set the \\df@tag macro to the tag.\n  // In this case, we separately parse the tag and wrap the tree.\n  if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n    if (!settings.displayMode) {\n      throw new ParseError(\"\\\\tag works only in display equations\");\n    }\n    tree = [{\n      type: \"tag\",\n      mode: \"text\",\n      body: tree,\n      tag: parser.subparse([new Token(\"\\\\df@tag\")])\n    }];\n  }\n  return tree;\n};\n\n/* eslint no-console:0 */\n/**\n * Parse and build an expression, and place that expression in the DOM node\n * given.\n */\nvar render = function render(expression, baseNode, options) {\n  baseNode.textContent = \"\";\n  var node = renderToDomTree(expression, options).toNode();\n  baseNode.appendChild(node);\n};\n// KaTeX's styles don't work properly in quirks mode. Print out an error, and\n// disable rendering.\nif (typeof document !== \"undefined\") {\n  if (document.compatMode !== \"CSS1Compat\") {\n    typeof console !== \"undefined\" && console.warn(\"Warning: KaTeX doesn't work in quirks mode. Make sure your \" + \"website has a suitable doctype.\");\n    render = function render() {\n      throw new ParseError(\"KaTeX doesn't work in quirks mode.\");\n    };\n  }\n}\n/**\n * Parse and build an expression, and return the markup for that.\n */\nvar renderToString = function renderToString(expression, options) {\n  var markup = renderToDomTree(expression, options).toMarkup();\n  return markup;\n};\n/**\n * Parse an expression and return the parse tree.\n */\nvar generateParseTree = function generateParseTree(expression, options) {\n  var settings = new Settings(options);\n  return parseTree(expression, settings);\n};\n/**\n * If the given error is a KaTeX ParseError and options.throwOnError is false,\n * renders the invalid LaTeX as a span with hover title giving the KaTeX\n * error message.  Otherwise, simply throws the error.\n */\nvar renderError = function renderError(error, expression, options) {\n  if (options.throwOnError || !(error instanceof ParseError)) {\n    throw error;\n  }\n  var node = makeSpan([\"katex-error\"], [new SymbolNode(expression)]);\n  node.setAttribute(\"title\", error.toString());\n  node.setAttribute(\"style\", \"color:\" + options.errorColor);\n  return node;\n};\n/**\n * Generates and returns the katex build tree. This is used for advanced\n * use cases (like rendering to custom output).\n */\nvar renderToDomTree = function renderToDomTree(expression, options) {\n  var settings = new Settings(options);\n  try {\n    var tree = parseTree(expression, settings);\n    return buildTree(tree, expression, settings);\n  } catch (error) {\n    return renderError(error, expression, settings);\n  }\n};\n/**\n * Generates and returns the katex build tree, with just HTML (no MathML).\n * This is used for advanced use cases (like rendering to custom output).\n */\nvar renderToHTMLTree = function renderToHTMLTree(expression, options) {\n  var settings = new Settings(options);\n  try {\n    var tree = parseTree(expression, settings);\n    return buildHTMLTree(tree, expression, settings);\n  } catch (error) {\n    return renderError(error, expression, settings);\n  }\n};\nvar version = \"0.16.45\";\nvar __domTree = {\n  Span,\n  Anchor,\n  SymbolNode,\n  SvgNode,\n  PathNode,\n  LineNode\n};\n// CJS exports and ESM default export\nvar katex = {\n  /**\n   * Current KaTeX version\n   */\n  version,\n  /**\n   * Renders the given LaTeX into an HTML+MathML combination, and adds\n   * it as a child to the specified DOM node.\n   */\n  render,\n  /**\n   * Renders the given LaTeX into an HTML+MathML combination string,\n   * for sending to the client.\n   */\n  renderToString,\n  /**\n   * KaTeX error, usually during parsing.\n   */\n  ParseError,\n  /**\n   * The schema of Settings\n   */\n  SETTINGS_SCHEMA,\n  /**\n   * Parses the given LaTeX into KaTeX's internal parse tree structure,\n   * without rendering to HTML or MathML.\n   *\n   * NOTE: This method is not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __parse: generateParseTree,\n  /**\n   * Renders the given LaTeX into an HTML+MathML internal DOM tree\n   * representation, without flattening that representation to a string.\n   *\n   * NOTE: This method is not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __renderToDomTree: renderToDomTree,\n  /**\n   * Renders the given LaTeX into an HTML internal DOM tree representation,\n   * without MathML and without flattening that representation to a string.\n   *\n   * NOTE: This method is not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __renderToHTMLTree: renderToHTMLTree,\n  /**\n   * extends internal font metrics object with a new object\n   * each key in the new object represents a font name\n  */\n  __setFontMetrics: setFontMetrics,\n  /**\n   * adds a new symbol to builtin symbols table\n   */\n  __defineSymbol: defineSymbol,\n  /**\n   * adds a new function to builtin function list,\n   * which directly produce parse tree elements\n   * and have their own html/mathml builders\n   */\n  __defineFunction: defineFunction,\n  /**\n   * adds a new macro to builtin macro list\n   */\n  __defineMacro: defineMacro,\n  /**\n   * Expose the dom tree node types, which can be useful for type checking nodes.\n   *\n   * NOTE: These methods are not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __domTree\n};\n\nexport { ParseError, SETTINGS_SCHEMA, defineFunction as __defineFunction, defineMacro as __defineMacro, defineSymbol as __defineSymbol, __domTree, generateParseTree as __parse, renderToDomTree as __renderToDomTree, renderToHTMLTree as __renderToHTMLTree, setFontMetrics as __setFontMetrics, katex as default, render, renderToString, version };\n","'use strict';\n\n\nvar TYPED_OK =  (typeof Uint8Array !== 'undefined') &&\n                (typeof Uint16Array !== 'undefined') &&\n                (typeof Int32Array !== 'undefined');\n\nfunction _has(obj, key) {\n  return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexports.assign = function (obj /*from1, from2, from3, ...*/) {\n  var sources = Array.prototype.slice.call(arguments, 1);\n  while (sources.length) {\n    var source = sources.shift();\n    if (!source) { continue; }\n\n    if (typeof source !== 'object') {\n      throw new TypeError(source + 'must be non-object');\n    }\n\n    for (var p in source) {\n      if (_has(source, p)) {\n        obj[p] = source[p];\n      }\n    }\n  }\n\n  return obj;\n};\n\n\n// reduce buffer size, avoiding mem copy\nexports.shrinkBuf = function (buf, size) {\n  if (buf.length === size) { return buf; }\n  if (buf.subarray) { return buf.subarray(0, size); }\n  buf.length = size;\n  return buf;\n};\n\n\nvar fnTyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    if (src.subarray && dest.subarray) {\n      dest.set(src.subarray(src_offs, src_offs + len), dest_offs);\n      return;\n    }\n    // Fallback to ordinary array\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    var i, l, len, pos, chunk, result;\n\n    // calculate data length\n    len = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      len += chunks[i].length;\n    }\n\n    // join chunks\n    result = new Uint8Array(len);\n    pos = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      chunk = chunks[i];\n      result.set(chunk, pos);\n      pos += chunk.length;\n    }\n\n    return result;\n  }\n};\n\nvar fnUntyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    return [].concat.apply([], chunks);\n  }\n};\n\n\n// Enable/Disable typed arrays use, for testing\n//\nexports.setTyped = function (on) {\n  if (on) {\n    exports.Buf8  = Uint8Array;\n    exports.Buf16 = Uint16Array;\n    exports.Buf32 = Int32Array;\n    exports.assign(exports, fnTyped);\n  } else {\n    exports.Buf8  = Array;\n    exports.Buf16 = Array;\n    exports.Buf32 = Array;\n    exports.assign(exports, fnUntyped);\n  }\n};\n\nexports.setTyped(TYPED_OK);\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\nvar utils = require('../utils/common');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//var Z_FILTERED          = 1;\n//var Z_HUFFMAN_ONLY      = 2;\n//var Z_RLE               = 3;\nvar Z_FIXED               = 4;\n//var Z_DEFAULT_STRATEGY  = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nvar Z_BINARY              = 0;\nvar Z_TEXT                = 1;\n//var Z_ASCII             = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nvar STORED_BLOCK = 0;\nvar STATIC_TREES = 1;\nvar DYN_TREES    = 2;\n/* The three kinds of block type */\n\nvar MIN_MATCH    = 3;\nvar MAX_MATCH    = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\n\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nvar D_CODES       = 30;\n/* number of distance codes */\n\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\n\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\n\nvar MAX_BITS      = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar Buf_size      = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nvar MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nvar END_BLOCK   = 256;\n/* end of block literal code */\n\nvar REP_3_6     = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nvar REPZ_3_10   = 17;\n/* repeat a zero length 3-10 times  (3 bits of repeat count) */\n\nvar REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times  (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nvar extra_lbits =   /* extra bits for each length code */\n  [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];\n\nvar extra_dbits =   /* extra bits for each distance code */\n  [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];\n\nvar extra_blbits =  /* extra bits for each bit length code */\n  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];\n\nvar bl_order =\n  [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nvar DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nvar static_ltree  = new Array((L_CODES + 2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nvar static_dtree  = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nvar _dist_code    = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nvar _length_code  = new Array(MAX_MATCH - MIN_MATCH + 1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nvar base_length   = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nvar base_dist     = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n  this.static_tree  = static_tree;  /* static tree or NULL */\n  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */\n  this.extra_base   = extra_base;   /* base index for extra_bits */\n  this.elems        = elems;        /* max number of elements in the tree */\n  this.max_length   = max_length;   /* max bit length for the codes */\n\n  // show if `static_tree` has data or dummy - needed for monomorphic objects\n  this.has_stree    = static_tree && static_tree.length;\n}\n\n\nvar static_l_desc;\nvar static_d_desc;\nvar static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n  this.dyn_tree = dyn_tree;     /* the dynamic tree */\n  this.max_code = 0;            /* largest code with non zero frequency */\n  this.stat_desc = stat_desc;   /* the corresponding static tree */\n}\n\n\n\nfunction d_code(dist) {\n  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n}\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nfunction put_short(s, w) {\n//    put_byte(s, (uch)((w) & 0xff));\n//    put_byte(s, (uch)((ush)(w) >> 8));\n  s.pending_buf[s.pending++] = (w) & 0xff;\n  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n}\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nfunction send_bits(s, value, length) {\n  if (s.bi_valid > (Buf_size - length)) {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    put_short(s, s.bi_buf);\n    s.bi_buf = value >> (Buf_size - s.bi_valid);\n    s.bi_valid += length - Buf_size;\n  } else {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    s.bi_valid += length;\n  }\n}\n\n\nfunction send_code(s, c, tree) {\n  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n}\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nfunction bi_reverse(code, len) {\n  var res = 0;\n  do {\n    res |= code & 1;\n    code >>>= 1;\n    res <<= 1;\n  } while (--len > 0);\n  return res >>> 1;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nfunction bi_flush(s) {\n  if (s.bi_valid === 16) {\n    put_short(s, s.bi_buf);\n    s.bi_buf = 0;\n    s.bi_valid = 0;\n\n  } else if (s.bi_valid >= 8) {\n    s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n    s.bi_buf >>= 8;\n    s.bi_valid -= 8;\n  }\n}\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n *    above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n *     array bl_count contains the frequencies for each bit length.\n *     The length opt_len is updated; static_len is also updated if stree is\n *     not null.\n */\nfunction gen_bitlen(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc;    /* the tree descriptor */\n{\n  var tree            = desc.dyn_tree;\n  var max_code        = desc.max_code;\n  var stree           = desc.stat_desc.static_tree;\n  var has_stree       = desc.stat_desc.has_stree;\n  var extra           = desc.stat_desc.extra_bits;\n  var base            = desc.stat_desc.extra_base;\n  var max_length      = desc.stat_desc.max_length;\n  var h;              /* heap index */\n  var n, m;           /* iterate over the tree elements */\n  var bits;           /* bit length */\n  var xbits;          /* extra bits */\n  var f;              /* frequency */\n  var overflow = 0;   /* number of elements with bit length too large */\n\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    s.bl_count[bits] = 0;\n  }\n\n  /* In a first pass, compute the optimal bit lengths (which may\n   * overflow in the case of the bit length tree).\n   */\n  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n  for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {\n    n = s.heap[h];\n    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n    if (bits > max_length) {\n      bits = max_length;\n      overflow++;\n    }\n    tree[n * 2 + 1]/*.Len*/ = bits;\n    /* We overwrite tree[n].Dad which is no longer needed */\n\n    if (n > max_code) { continue; } /* not a leaf node */\n\n    s.bl_count[bits]++;\n    xbits = 0;\n    if (n >= base) {\n      xbits = extra[n - base];\n    }\n    f = tree[n * 2]/*.Freq*/;\n    s.opt_len += f * (bits + xbits);\n    if (has_stree) {\n      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n    }\n  }\n  if (overflow === 0) { return; }\n\n  // Trace((stderr,\"\\nbit length overflow\\n\"));\n  /* This happens for example on obj2 and pic of the Calgary corpus */\n\n  /* Find the first bit length which could increase: */\n  do {\n    bits = max_length - 1;\n    while (s.bl_count[bits] === 0) { bits--; }\n    s.bl_count[bits]--;      /* move one leaf down the tree */\n    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n    s.bl_count[max_length]--;\n    /* The brother of the overflow item also moves one step up,\n     * but this does not affect bl_count[max_length]\n     */\n    overflow -= 2;\n  } while (overflow > 0);\n\n  /* Now recompute all bit lengths, scanning in increasing frequency.\n   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n   * lengths instead of fixing only the wrong ones. This idea is taken\n   * from 'ar' written by Haruhiko Okumura.)\n   */\n  for (bits = max_length; bits !== 0; bits--) {\n    n = s.bl_count[bits];\n    while (n !== 0) {\n      m = s.heap[--h];\n      if (m > max_code) { continue; }\n      if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n        // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n        tree[m * 2 + 1]/*.Len*/ = bits;\n      }\n      n--;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n *     zero code length.\n */\nfunction gen_codes(tree, max_code, bl_count)\n//    ct_data *tree;             /* the tree to decorate */\n//    int max_code;              /* largest code with non zero frequency */\n//    ushf *bl_count;            /* number of codes at each bit length */\n{\n  var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */\n  var code = 0;              /* running code value */\n  var bits;                  /* bit index */\n  var n;                     /* code index */\n\n  /* The distribution counts are first used to generate the code values\n   * without bit reversal.\n   */\n  for (bits = 1; bits <= MAX_BITS; bits++) {\n    next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n  }\n  /* Check that the bit counts in bl_count are consistent. The last code\n   * must be all ones.\n   */\n  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n  //        \"inconsistent bit counts\");\n  //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n  for (n = 0;  n <= max_code; n++) {\n    var len = tree[n * 2 + 1]/*.Len*/;\n    if (len === 0) { continue; }\n    /* Now reverse the bits */\n    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n    //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n  }\n}\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nfunction tr_static_init() {\n  var n;        /* iterates over tree elements */\n  var bits;     /* bit counter */\n  var length;   /* length value */\n  var code;     /* code value */\n  var dist;     /* distance index */\n  var bl_count = new Array(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  // do check in _tr_init()\n  //if (static_init_done) return;\n\n  /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n  static_l_desc.static_tree = static_ltree;\n  static_l_desc.extra_bits = extra_lbits;\n  static_d_desc.static_tree = static_dtree;\n  static_d_desc.extra_bits = extra_dbits;\n  static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n  /* Initialize the mapping length (0..255) -> length code (0..28) */\n  length = 0;\n  for (code = 0; code < LENGTH_CODES - 1; code++) {\n    base_length[code] = length;\n    for (n = 0; n < (1 << extra_lbits[code]); n++) {\n      _length_code[length++] = code;\n    }\n  }\n  //Assert (length == 256, \"tr_static_init: length != 256\");\n  /* Note that the length 255 (match length 258) can be represented\n   * in two different ways: code 284 + 5 bits or code 285, so we\n   * overwrite length_code[255] to use the best encoding:\n   */\n  _length_code[length - 1] = code;\n\n  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n  dist = 0;\n  for (code = 0; code < 16; code++) {\n    base_dist[code] = dist;\n    for (n = 0; n < (1 << extra_dbits[code]); n++) {\n      _dist_code[dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: dist != 256\");\n  dist >>= 7; /* from now on, all distances are divided by 128 */\n  for (; code < D_CODES; code++) {\n    base_dist[code] = dist << 7;\n    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n      _dist_code[256 + dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n  /* Construct the codes of the static literal tree */\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    bl_count[bits] = 0;\n  }\n\n  n = 0;\n  while (n <= 143) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  while (n <= 255) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 9;\n    n++;\n    bl_count[9]++;\n  }\n  while (n <= 279) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 7;\n    n++;\n    bl_count[7]++;\n  }\n  while (n <= 287) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  /* Codes 286 and 287 do not exist, but we must include them in the\n   * tree construction to get a canonical Huffman tree (longest code\n   * all ones)\n   */\n  gen_codes(static_ltree, L_CODES + 1, bl_count);\n\n  /* The static distance tree is trivial: */\n  for (n = 0; n < D_CODES; n++) {\n    static_dtree[n * 2 + 1]/*.Len*/ = 5;\n    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n  }\n\n  // Now data ready and we can init static trees\n  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);\n  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);\n  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);\n\n  //static_init_done = true;\n}\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nfunction init_block(s) {\n  var n; /* iterates over tree elements */\n\n  /* Initialize the trees. */\n  for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n  s.opt_len = s.static_len = 0;\n  s.last_lit = s.matches = 0;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nfunction bi_windup(s)\n{\n  if (s.bi_valid > 8) {\n    put_short(s, s.bi_buf);\n  } else if (s.bi_valid > 0) {\n    //put_byte(s, (Byte)s->bi_buf);\n    s.pending_buf[s.pending++] = s.bi_buf;\n  }\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n}\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nfunction copy_block(s, buf, len, header)\n//DeflateState *s;\n//charf    *buf;    /* the input data */\n//unsigned len;     /* its length */\n//int      header;  /* true if block header must be written */\n{\n  bi_windup(s);        /* align on byte boundary */\n\n  if (header) {\n    put_short(s, len);\n    put_short(s, ~len);\n  }\n//  while (len--) {\n//    put_byte(s, *buf++);\n//  }\n  utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);\n  s.pending += len;\n}\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nfunction smaller(tree, n, m, depth) {\n  var _n2 = n * 2;\n  var _m2 = m * 2;\n  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n}\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nfunction pqdownheap(s, tree, k)\n//    deflate_state *s;\n//    ct_data *tree;  /* the tree to restore */\n//    int k;               /* node to move down */\n{\n  var v = s.heap[k];\n  var j = k << 1;  /* left son of k */\n  while (j <= s.heap_len) {\n    /* Set j to the smallest of the two sons: */\n    if (j < s.heap_len &&\n      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n      j++;\n    }\n    /* Exit if v is smaller than both sons */\n    if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n    /* Exchange v with the smallest son */\n    s.heap[k] = s.heap[j];\n    k = j;\n\n    /* And continue down the tree, setting j to the left son of k */\n    j <<= 1;\n  }\n  s.heap[k] = v;\n}\n\n\n// inlined manually\n// var SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nfunction compress_block(s, ltree, dtree)\n//    deflate_state *s;\n//    const ct_data *ltree; /* literal tree */\n//    const ct_data *dtree; /* distance tree */\n{\n  var dist;           /* distance of matched string */\n  var lc;             /* match length or unmatched char (if dist == 0) */\n  var lx = 0;         /* running index in l_buf */\n  var code;           /* the code to send */\n  var extra;          /* number of extra bits to send */\n\n  if (s.last_lit !== 0) {\n    do {\n      dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n      lc = s.pending_buf[s.l_buf + lx];\n      lx++;\n\n      if (dist === 0) {\n        send_code(s, lc, ltree); /* send a literal byte */\n        //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n      } else {\n        /* Here, lc is the match length - MIN_MATCH */\n        code = _length_code[lc];\n        send_code(s, code + LITERALS + 1, ltree); /* send the length code */\n        extra = extra_lbits[code];\n        if (extra !== 0) {\n          lc -= base_length[code];\n          send_bits(s, lc, extra);       /* send the extra length bits */\n        }\n        dist--; /* dist is now the match distance - 1 */\n        code = d_code(dist);\n        //Assert (code < D_CODES, \"bad d_code\");\n\n        send_code(s, code, dtree);       /* send the distance code */\n        extra = extra_dbits[code];\n        if (extra !== 0) {\n          dist -= base_dist[code];\n          send_bits(s, dist, extra);   /* send the extra distance bits */\n        }\n      } /* literal or match pair ? */\n\n      /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n      //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n      //       \"pendingBuf overflow\");\n\n    } while (lx < s.last_lit);\n  }\n\n  send_code(s, END_BLOCK, ltree);\n}\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n *     and corresponding code. The length opt_len is updated; static_len is\n *     also updated if stree is not null. The field max_code is set.\n */\nfunction build_tree(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc; /* the tree descriptor */\n{\n  var tree     = desc.dyn_tree;\n  var stree    = desc.stat_desc.static_tree;\n  var has_stree = desc.stat_desc.has_stree;\n  var elems    = desc.stat_desc.elems;\n  var n, m;          /* iterate over heap elements */\n  var max_code = -1; /* largest code with non zero frequency */\n  var node;          /* new node being created */\n\n  /* Construct the initial heap, with least frequent element in\n   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n   * heap[0] is not used.\n   */\n  s.heap_len = 0;\n  s.heap_max = HEAP_SIZE;\n\n  for (n = 0; n < elems; n++) {\n    if (tree[n * 2]/*.Freq*/ !== 0) {\n      s.heap[++s.heap_len] = max_code = n;\n      s.depth[n] = 0;\n\n    } else {\n      tree[n * 2 + 1]/*.Len*/ = 0;\n    }\n  }\n\n  /* The pkzip format requires that at least one distance code exists,\n   * and that at least one bit should be sent even if there is only one\n   * possible code. So to avoid special checks later on we force at least\n   * two codes of non zero frequency.\n   */\n  while (s.heap_len < 2) {\n    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n    tree[node * 2]/*.Freq*/ = 1;\n    s.depth[node] = 0;\n    s.opt_len--;\n\n    if (has_stree) {\n      s.static_len -= stree[node * 2 + 1]/*.Len*/;\n    }\n    /* node is 0 or 1 so it does not have extra bits */\n  }\n  desc.max_code = max_code;\n\n  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n   * establish sub-heaps of increasing lengths:\n   */\n  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n  /* Construct the Huffman tree by repeatedly combining the least two\n   * frequent nodes.\n   */\n  node = elems;              /* next internal node of the tree */\n  do {\n    //pqremove(s, tree, n);  /* n = node of least frequency */\n    /*** pqremove ***/\n    n = s.heap[1/*SMALLEST*/];\n    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n    /***/\n\n    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n    s.heap[--s.heap_max] = m;\n\n    /* Create a new node father of n and m */\n    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n    /* and insert the new node in the heap */\n    s.heap[1/*SMALLEST*/] = node++;\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n\n  } while (s.heap_len >= 2);\n\n  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n  /* At this point, the fields freq and dad are set. We can now\n   * generate the bit lengths.\n   */\n  gen_bitlen(s, desc);\n\n  /* The field len is now set, we can generate the bit codes */\n  gen_codes(tree, max_code, s.bl_count);\n}\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nfunction scan_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree;   /* the tree to be scanned */\n//    int max_code;    /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n    } else if (curlen !== 0) {\n\n      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n    } else if (count <= 10) {\n      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n    } else {\n      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n    }\n\n    count = 0;\n    prevlen = curlen;\n\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nfunction send_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree; /* the tree to be scanned */\n//    int max_code;       /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  /* tree[max_code+1].Len = -1; */  /* guard already set */\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n    } else if (curlen !== 0) {\n      if (curlen !== prevlen) {\n        send_code(s, curlen, s.bl_tree);\n        count--;\n      }\n      //Assert(count >= 3 && count <= 6, \" 3_6?\");\n      send_code(s, REP_3_6, s.bl_tree);\n      send_bits(s, count - 3, 2);\n\n    } else if (count <= 10) {\n      send_code(s, REPZ_3_10, s.bl_tree);\n      send_bits(s, count - 3, 3);\n\n    } else {\n      send_code(s, REPZ_11_138, s.bl_tree);\n      send_bits(s, count - 11, 7);\n    }\n\n    count = 0;\n    prevlen = curlen;\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nfunction build_bl_tree(s) {\n  var max_blindex;  /* index of last bit length code of non zero freq */\n\n  /* Determine the bit length frequencies for literal and distance trees */\n  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n  /* Build the bit length tree: */\n  build_tree(s, s.bl_desc);\n  /* opt_len now includes the length of the tree representations, except\n   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n   */\n\n  /* Determine the number of bit length codes to send. The pkzip format\n   * requires that at least 4 bit length codes be sent. (appnote.txt says\n   * 3 but the actual value used is 4.)\n   */\n  for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {\n    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n      break;\n    }\n  }\n  /* Update opt_len to include the bit length tree and counts */\n  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n  //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n  //        s->opt_len, s->static_len));\n\n  return max_blindex;\n}\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nfunction send_all_trees(s, lcodes, dcodes, blcodes)\n//    deflate_state *s;\n//    int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n  var rank;                    /* index in bl_order */\n\n  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n  //        \"too many codes\");\n  //Tracev((stderr, \"\\nbl counts: \"));\n  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n  send_bits(s, dcodes - 1,   5);\n  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */\n  for (rank = 0; rank < blcodes; rank++) {\n    //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n  }\n  //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n  //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n  //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n}\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n *    a) There are no non-portable control characters belonging to the\n *       \"black list\" (0..6, 14..25, 28..31).\n *    b) There is at least one printable character belonging to the\n *       \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n *   \"gray list\" that is ignored in this detection algorithm:\n *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nfunction detect_data_type(s) {\n  /* black_mask is the bit mask of black-listed bytes\n   * set bits 0..6, 14..25, and 28..31\n   * 0xf3ffc07f = binary 11110011111111111100000001111111\n   */\n  var black_mask = 0xf3ffc07f;\n  var n;\n\n  /* Check for non-textual (\"black-listed\") bytes. */\n  for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n    if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n      return Z_BINARY;\n    }\n  }\n\n  /* Check for textual (\"white-listed\") bytes. */\n  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n    return Z_TEXT;\n  }\n  for (n = 32; n < LITERALS; n++) {\n    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n      return Z_TEXT;\n    }\n  }\n\n  /* There are no \"black-listed\" or \"white-listed\" bytes:\n   * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n   */\n  return Z_BINARY;\n}\n\n\nvar static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nfunction _tr_init(s)\n{\n\n  if (!static_init_done) {\n    tr_static_init();\n    static_init_done = true;\n  }\n\n  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);\n  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);\n  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n\n  /* Initialize the first block of the first file: */\n  init_block(s);\n}\n\n\n/* ===========================================================================\n * Send a stored block\n */\nfunction _tr_stored_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */\n  copy_block(s, buf, stored_len, true); /* with header */\n}\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nfunction _tr_align(s) {\n  send_bits(s, STATIC_TREES << 1, 3);\n  send_code(s, END_BLOCK, static_ltree);\n  bi_flush(s);\n}\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nfunction _tr_flush_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block, or NULL if too old */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */\n  var max_blindex = 0;        /* index of last bit length code of non zero freq */\n\n  /* Build the Huffman trees unless a stored block is forced */\n  if (s.level > 0) {\n\n    /* Check if the file is binary or text */\n    if (s.strm.data_type === Z_UNKNOWN) {\n      s.strm.data_type = detect_data_type(s);\n    }\n\n    /* Construct the literal and distance trees */\n    build_tree(s, s.l_desc);\n    // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n\n    build_tree(s, s.d_desc);\n    // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n    /* At this point, opt_len and static_len are the total bit lengths of\n     * the compressed block data, excluding the tree representations.\n     */\n\n    /* Build the bit length tree for the above two trees, and get the index\n     * in bl_order of the last bit length code to send.\n     */\n    max_blindex = build_bl_tree(s);\n\n    /* Determine the best encoding. Compute the block lengths in bytes. */\n    opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n    static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n    // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n    //        s->last_lit));\n\n    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n  } else {\n    // Assert(buf != (char*)0, \"lost buf\");\n    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n  }\n\n  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n    /* 4: two words for the lengths */\n\n    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n     * Otherwise we can't have processed more than WSIZE input bytes since\n     * the last block flush, because compression would have been\n     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n     * transform a block into a stored block.\n     */\n    _tr_stored_block(s, buf, stored_len, last);\n\n  } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n    compress_block(s, static_ltree, static_dtree);\n\n  } else {\n    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n    compress_block(s, s.dyn_ltree, s.dyn_dtree);\n  }\n  // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n  /* The above check is made mod 2^32, for files larger than 512 MB\n   * and uLong implemented on 32 bits.\n   */\n  init_block(s);\n\n  if (last) {\n    bi_windup(s);\n  }\n  // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n  //       s->compressed_len-7*last));\n}\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nfunction _tr_tally(s, dist, lc)\n//    deflate_state *s;\n//    unsigned dist;  /* distance of matched string */\n//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n  //var out_length, in_length, dcode;\n\n  s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;\n  s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n  s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n  s.last_lit++;\n\n  if (dist === 0) {\n    /* lc is the unmatched char */\n    s.dyn_ltree[lc * 2]/*.Freq*/++;\n  } else {\n    s.matches++;\n    /* Here, lc is the match length - MIN_MATCH */\n    dist--;             /* dist = match distance - 1 */\n    //Assert((ush)dist < (ush)MAX_DIST(s) &&\n    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n    //       (ush)d_code(dist) < (ush)D_CODES,  \"_tr_tally: bad match\");\n\n    s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;\n    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n  }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n//  /* Try to guess if it is profitable to stop the current block here */\n//  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n//    /* Compute an upper bound for the compressed length */\n//    out_length = s.last_lit*8;\n//    in_length = s.strstart - s.block_start;\n//\n//    for (dcode = 0; dcode < D_CODES; dcode++) {\n//      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n//    }\n//    out_length >>>= 3;\n//    //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n//    //       s->last_lit, in_length, out_length,\n//    //       100L - out_length*100L/in_length));\n//    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n//      return true;\n//    }\n//  }\n//#endif\n\n  return (s.last_lit === s.lit_bufsize - 1);\n  /* We avoid equality with lit_bufsize because of wraparound at 64K\n   * on 16 bit machines and because stored blocks are restricted to\n   * 64K-1 bytes.\n   */\n}\n\nexports._tr_init  = _tr_init;\nexports._tr_stored_block = _tr_stored_block;\nexports._tr_flush_block  = _tr_flush_block;\nexports._tr_tally = _tr_tally;\nexports._tr_align = _tr_align;\n","'use strict';\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction adler32(adler, buf, len, pos) {\n  var s1 = (adler & 0xffff) |0,\n      s2 = ((adler >>> 16) & 0xffff) |0,\n      n = 0;\n\n  while (len !== 0) {\n    // Set limit ~ twice less than 5552, to keep\n    // s2 in 31-bits, because we force signed ints.\n    // in other case %= will fail.\n    n = len > 2000 ? 2000 : len;\n    len -= n;\n\n    do {\n      s1 = (s1 + buf[pos++]) |0;\n      s2 = (s2 + s1) |0;\n    } while (--n);\n\n    s1 %= 65521;\n    s2 %= 65521;\n  }\n\n  return (s1 | (s2 << 16)) |0;\n}\n\n\nmodule.exports = adler32;\n","'use strict';\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nfunction makeTable() {\n  var c, table = [];\n\n  for (var n = 0; n < 256; n++) {\n    c = n;\n    for (var k = 0; k < 8; k++) {\n      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n    }\n    table[n] = c;\n  }\n\n  return table;\n}\n\n// Create table on load. Just 255 signed longs. Not a problem.\nvar crcTable = makeTable();\n\n\nfunction crc32(crc, buf, len, pos) {\n  var t = crcTable,\n      end = pos + len;\n\n  crc ^= -1;\n\n  for (var i = pos; i < end; i++) {\n    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n  }\n\n  return (crc ^ (-1)); // >>> 0;\n}\n\n\nmodule.exports = crc32;\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n  2:      'need dictionary',     /* Z_NEED_DICT       2  */\n  1:      'stream end',          /* Z_STREAM_END      1  */\n  0:      '',                    /* Z_OK              0  */\n  '-1':   'file error',          /* Z_ERRNO         (-1) */\n  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */\n  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */\n  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */\n  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */\n  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils   = require('../utils/common');\nvar trees   = require('./trees');\nvar adler32 = require('./adler32');\nvar crc32   = require('./crc32');\nvar msg     = require('./messages');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\nvar Z_NO_FLUSH      = 0;\nvar Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\nvar Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\n//var Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\n//var Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\n//var Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n\n/* compression levels */\n//var Z_NO_COMPRESSION      = 0;\n//var Z_BEST_SPEED          = 1;\n//var Z_BEST_COMPRESSION    = 9;\nvar Z_DEFAULT_COMPRESSION = -1;\n\n\nvar Z_FILTERED            = 1;\nvar Z_HUFFMAN_ONLY        = 2;\nvar Z_RLE                 = 3;\nvar Z_FIXED               = 4;\nvar Z_DEFAULT_STRATEGY    = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\n//var Z_BINARY              = 0;\n//var Z_TEXT                = 1;\n//var Z_ASCII               = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n/*============================================================================*/\n\n\nvar MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_MEM_LEVEL = 8;\n\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nvar D_CODES       = 30;\n/* number of distance codes */\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\nvar MAX_BITS  = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\nvar MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nvar PRESET_DICT = 0x20;\n\nvar INIT_STATE = 42;\nvar EXTRA_STATE = 69;\nvar NAME_STATE = 73;\nvar COMMENT_STATE = 91;\nvar HCRC_STATE = 103;\nvar BUSY_STATE = 113;\nvar FINISH_STATE = 666;\n\nvar BS_NEED_MORE      = 1; /* block not completed, need more input or more output */\nvar BS_BLOCK_DONE     = 2; /* block flush performed */\nvar BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nvar BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */\n\nvar OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nfunction err(strm, errorCode) {\n  strm.msg = msg[errorCode];\n  return errorCode;\n}\n\nfunction rank(f) {\n  return ((f) << 1) - ((f) > 4 ? 9 : 0);\n}\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nfunction flush_pending(strm) {\n  var s = strm.state;\n\n  //_tr_flush_bits(s);\n  var len = s.pending;\n  if (len > strm.avail_out) {\n    len = strm.avail_out;\n  }\n  if (len === 0) { return; }\n\n  utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);\n  strm.next_out += len;\n  s.pending_out += len;\n  strm.total_out += len;\n  strm.avail_out -= len;\n  s.pending -= len;\n  if (s.pending === 0) {\n    s.pending_out = 0;\n  }\n}\n\n\nfunction flush_block_only(s, last) {\n  trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n  s.block_start = s.strstart;\n  flush_pending(s.strm);\n}\n\n\nfunction put_byte(s, b) {\n  s.pending_buf[s.pending++] = b;\n}\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nfunction putShortMSB(s, b) {\n//  put_byte(s, (Byte)(b >> 8));\n//  put_byte(s, (Byte)(b & 0xff));\n  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n  s.pending_buf[s.pending++] = b & 0xff;\n}\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read.  All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nfunction read_buf(strm, buf, start, size) {\n  var len = strm.avail_in;\n\n  if (len > size) { len = size; }\n  if (len === 0) { return 0; }\n\n  strm.avail_in -= len;\n\n  // zmemcpy(buf, strm->next_in, len);\n  utils.arraySet(buf, strm.input, strm.next_in, len, start);\n  if (strm.state.wrap === 1) {\n    strm.adler = adler32(strm.adler, buf, len, start);\n  }\n\n  else if (strm.state.wrap === 2) {\n    strm.adler = crc32(strm.adler, buf, len, start);\n  }\n\n  strm.next_in += len;\n  strm.total_in += len;\n\n  return len;\n}\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nfunction longest_match(s, cur_match) {\n  var chain_length = s.max_chain_length;      /* max hash chain length */\n  var scan = s.strstart; /* current string */\n  var match;                       /* matched string */\n  var len;                           /* length of current match */\n  var best_len = s.prev_length;              /* best match length so far */\n  var nice_match = s.nice_match;             /* stop if match long enough */\n  var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n  var _win = s.window; // shortcut\n\n  var wmask = s.w_mask;\n  var prev  = s.prev;\n\n  /* Stop when cur_match becomes <= limit. To simplify the code,\n   * we prevent matches with the string of window index 0.\n   */\n\n  var strend = s.strstart + MAX_MATCH;\n  var scan_end1  = _win[scan + best_len - 1];\n  var scan_end   = _win[scan + best_len];\n\n  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n   * It is easy to get rid of this optimization if necessary.\n   */\n  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n  /* Do not waste too much time if we already have a good match: */\n  if (s.prev_length >= s.good_match) {\n    chain_length >>= 2;\n  }\n  /* Do not look for matches beyond the end of the input. This is necessary\n   * to make deflate deterministic.\n   */\n  if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n  do {\n    // Assert(cur_match < s->strstart, \"no future\");\n    match = cur_match;\n\n    /* Skip to next match if the match length cannot increase\n     * or if the match length is less than 2.  Note that the checks below\n     * for insufficient lookahead only occur occasionally for performance\n     * reasons.  Therefore uninitialized memory will be accessed, and\n     * conditional jumps will be made that depend on those values.\n     * However the length of the match is limited to the lookahead, so\n     * the output of deflate is not affected by the uninitialized values.\n     */\n\n    if (_win[match + best_len]     !== scan_end  ||\n        _win[match + best_len - 1] !== scan_end1 ||\n        _win[match]                !== _win[scan] ||\n        _win[++match]              !== _win[scan + 1]) {\n      continue;\n    }\n\n    /* The check at best_len-1 can be removed because it will be made\n     * again later. (This heuristic is not always a win.)\n     * It is not necessary to compare scan[2] and match[2] since they\n     * are always equal when the other bytes match, given that\n     * the hash keys are equal and that HASH_BITS >= 8.\n     */\n    scan += 2;\n    match++;\n    // Assert(*scan == *match, \"match[2]?\");\n\n    /* We check for insufficient lookahead only every 8th comparison;\n     * the 256th check will be made at strstart+258.\n     */\n    do {\n      /*jshint noempty:false*/\n    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             scan < strend);\n\n    // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n    len = MAX_MATCH - (strend - scan);\n    scan = strend - MAX_MATCH;\n\n    if (len > best_len) {\n      s.match_start = cur_match;\n      best_len = len;\n      if (len >= nice_match) {\n        break;\n      }\n      scan_end1  = _win[scan + best_len - 1];\n      scan_end   = _win[scan + best_len];\n    }\n  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n  if (best_len <= s.lookahead) {\n    return best_len;\n  }\n  return s.lookahead;\n}\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n *    At least one byte has been read, or avail_in == 0; reads are\n *    performed for at least two bytes (required for the zip translate_eol\n *    option -- not supported here).\n */\nfunction fill_window(s) {\n  var _w_size = s.w_size;\n  var p, n, m, more, str;\n\n  //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n  do {\n    more = s.window_size - s.lookahead - s.strstart;\n\n    // JS ints have 32 bit, block below not needed\n    /* Deal with !@#$% 64K limit: */\n    //if (sizeof(int) <= 2) {\n    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n    //        more = wsize;\n    //\n    //  } else if (more == (unsigned)(-1)) {\n    //        /* Very unlikely, but possible on 16 bit machine if\n    //         * strstart == 0 && lookahead == 1 (input done a byte at time)\n    //         */\n    //        more--;\n    //    }\n    //}\n\n\n    /* If the window is almost full and there is insufficient lookahead,\n     * move the upper half to the lower one to make room in the upper half.\n     */\n    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n      utils.arraySet(s.window, s.window, _w_size, _w_size, 0);\n      s.match_start -= _w_size;\n      s.strstart -= _w_size;\n      /* we now have strstart >= MAX_DIST */\n      s.block_start -= _w_size;\n\n      /* Slide the hash table (could be avoided with 32 bit values\n       at the expense of memory usage). We slide even when level == 0\n       to keep the hash table consistent if we switch back to level > 0\n       later. (Using level 0 permanently is not an optimal usage of\n       zlib, so we don't care about this pathological case.)\n       */\n\n      n = s.hash_size;\n      p = n;\n      do {\n        m = s.head[--p];\n        s.head[p] = (m >= _w_size ? m - _w_size : 0);\n      } while (--n);\n\n      n = _w_size;\n      p = n;\n      do {\n        m = s.prev[--p];\n        s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n        /* If n is not on any hash chain, prev[n] is garbage but\n         * its value will never be used.\n         */\n      } while (--n);\n\n      more += _w_size;\n    }\n    if (s.strm.avail_in === 0) {\n      break;\n    }\n\n    /* If there was no sliding:\n     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n     *    more == window_size - lookahead - strstart\n     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n     * => more >= window_size - 2*WSIZE + 2\n     * In the BIG_MEM or MMAP case (not yet supported),\n     *   window_size == input_size + MIN_LOOKAHEAD  &&\n     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n     * Otherwise, window_size == 2*WSIZE so more >= 2.\n     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n     */\n    //Assert(more >= 2, \"more < 2\");\n    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n    s.lookahead += n;\n\n    /* Initialize the hash value now that we have some input: */\n    if (s.lookahead + s.insert >= MIN_MATCH) {\n      str = s.strstart - s.insert;\n      s.ins_h = s.window[str];\n\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;\n//#if MIN_MATCH != 3\n//        Call update_hash() MIN_MATCH-3 more times\n//#endif\n      while (s.insert) {\n        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n        s.prev[str & s.w_mask] = s.head[s.ins_h];\n        s.head[s.ins_h] = str;\n        str++;\n        s.insert--;\n        if (s.lookahead + s.insert < MIN_MATCH) {\n          break;\n        }\n      }\n    }\n    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n     * but this is not important since only literal bytes will be emitted.\n     */\n\n  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n  /* If the WIN_INIT bytes after the end of the current data have never been\n   * written, then zero those bytes in order to avoid memory check reports of\n   * the use of uninitialized (or uninitialised as Julian writes) bytes by\n   * the longest match routines.  Update the high water mark for the next\n   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match\n   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n   */\n//  if (s.high_water < s.window_size) {\n//    var curr = s.strstart + s.lookahead;\n//    var init = 0;\n//\n//    if (s.high_water < curr) {\n//      /* Previous high water mark below current data -- zero WIN_INIT\n//       * bytes or up to end of window, whichever is less.\n//       */\n//      init = s.window_size - curr;\n//      if (init > WIN_INIT)\n//        init = WIN_INIT;\n//      zmemzero(s->window + curr, (unsigned)init);\n//      s->high_water = curr + init;\n//    }\n//    else if (s->high_water < (ulg)curr + WIN_INIT) {\n//      /* High water mark at or above current data, but below current data\n//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n//       * to end of window, whichever is less.\n//       */\n//      init = (ulg)curr + WIN_INIT - s->high_water;\n//      if (init > s->window_size - s->high_water)\n//        init = s->window_size - s->high_water;\n//      zmemzero(s->window + s->high_water, (unsigned)init);\n//      s->high_water += init;\n//    }\n//  }\n//\n//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n//    \"not enough room for search\");\n}\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nfunction deflate_stored(s, flush) {\n  /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n   * to pending_buf_size, and each stored block has a 5 byte header:\n   */\n  var max_block_size = 0xffff;\n\n  if (max_block_size > s.pending_buf_size - 5) {\n    max_block_size = s.pending_buf_size - 5;\n  }\n\n  /* Copy as much as possible from input to output: */\n  for (;;) {\n    /* Fill the window as much as possible: */\n    if (s.lookahead <= 1) {\n\n      //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n      //  s->block_start >= (long)s->w_size, \"slide too late\");\n//      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n//        s.block_start >= s.w_size)) {\n//        throw  new Error(\"slide too late\");\n//      }\n\n      fill_window(s);\n      if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n\n      if (s.lookahead === 0) {\n        break;\n      }\n      /* flush the current block */\n    }\n    //Assert(s->block_start >= 0L, \"block gone\");\n//    if (s.block_start < 0) throw new Error(\"block gone\");\n\n    s.strstart += s.lookahead;\n    s.lookahead = 0;\n\n    /* Emit a stored block if pending_buf will be full: */\n    var max_start = s.block_start + max_block_size;\n\n    if (s.strstart === 0 || s.strstart >= max_start) {\n      /* strstart == 0 is possible when wraparound on 16-bit machine */\n      s.lookahead = s.strstart - max_start;\n      s.strstart = max_start;\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n\n\n    }\n    /* Flush if we may have to slide, otherwise block_start may become\n     * negative and the data will be gone:\n     */\n    if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n\n  s.insert = 0;\n\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n\n  if (s.strstart > s.block_start) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_NEED_MORE;\n}\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nfunction deflate_fast(s, flush) {\n  var hash_head;        /* head of the hash chain */\n  var bflush;           /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) {\n        break; /* flush the current block */\n      }\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     * At this point we have always match_length < MIN_MATCH\n     */\n    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n    }\n    if (s.match_length >= MIN_MATCH) {\n      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n      /*** _tr_tally_dist(s, s.strstart - s.match_start,\n                     s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n\n      /* Insert new strings in the hash table only if the match length\n       * is not too large. This saves time but degrades compression.\n       */\n      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n        s.match_length--; /* string at strstart already in table */\n        do {\n          s.strstart++;\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n          /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n           * always MIN_MATCH bytes ahead.\n           */\n        } while (--s.match_length !== 0);\n        s.strstart++;\n      } else\n      {\n        s.strstart += s.match_length;\n        s.match_length = 0;\n        s.ins_h = s.window[s.strstart];\n        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;\n\n//#if MIN_MATCH != 3\n//                Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n         * matter since it will be recomputed at next deflate call.\n         */\n      }\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nfunction deflate_slow(s, flush) {\n  var hash_head;          /* head of hash chain */\n  var bflush;              /* set if current block must be flushed */\n\n  var max_insert;\n\n  /* Process the input block. */\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     */\n    s.prev_length = s.match_length;\n    s.prev_match = s.match_start;\n    s.match_length = MIN_MATCH - 1;\n\n    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n\n      if (s.match_length <= 5 &&\n         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n        /* If prev_match is also MIN_MATCH, match_start is garbage\n         * but we will ignore the current match anyway.\n         */\n        s.match_length = MIN_MATCH - 1;\n      }\n    }\n    /* If there was a match at the previous step and the current\n     * match is not better, output the previous match:\n     */\n    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n      max_insert = s.strstart + s.lookahead - MIN_MATCH;\n      /* Do not insert strings in hash table beyond this. */\n\n      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n                     s.prev_length - MIN_MATCH, bflush);***/\n      bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n      /* Insert in hash table all strings up to the end of the match.\n       * strstart-1 and strstart are already inserted. If there is not\n       * enough lookahead, the last two strings are not inserted in\n       * the hash table.\n       */\n      s.lookahead -= s.prev_length - 1;\n      s.prev_length -= 2;\n      do {\n        if (++s.strstart <= max_insert) {\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n        }\n      } while (--s.prev_length !== 0);\n      s.match_available = 0;\n      s.match_length = MIN_MATCH - 1;\n      s.strstart++;\n\n      if (bflush) {\n        /*** FLUSH_BLOCK(s, 0); ***/\n        flush_block_only(s, false);\n        if (s.strm.avail_out === 0) {\n          return BS_NEED_MORE;\n        }\n        /***/\n      }\n\n    } else if (s.match_available) {\n      /* If there was no match at the previous position, output a\n       * single literal. If there was a match but the current match\n       * is longer, truncate the previous match to a single literal.\n       */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n      if (bflush) {\n        /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n        flush_block_only(s, false);\n        /***/\n      }\n      s.strstart++;\n      s.lookahead--;\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n    } else {\n      /* There is no previous match to compare with, wait for\n       * the next step to decide.\n       */\n      s.match_available = 1;\n      s.strstart++;\n      s.lookahead--;\n    }\n  }\n  //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n  if (s.match_available) {\n    //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n    s.match_available = 0;\n  }\n  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_BLOCK_DONE;\n}\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one.  Do not maintain a hash table.  (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nfunction deflate_rle(s, flush) {\n  var bflush;            /* set if current block must be flushed */\n  var prev;              /* byte at distance one to match */\n  var scan, strend;      /* scan goes up to strend for length of run */\n\n  var _win = s.window;\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the longest run, plus one for the unrolled loop.\n     */\n    if (s.lookahead <= MAX_MATCH) {\n      fill_window(s);\n      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* See how many times the previous byte repeats */\n    s.match_length = 0;\n    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n      scan = s.strstart - 1;\n      prev = _win[scan];\n      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n        strend = s.strstart + MAX_MATCH;\n        do {\n          /*jshint noempty:false*/\n        } while (prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 scan < strend);\n        s.match_length = MAX_MATCH - (strend - scan);\n        if (s.match_length > s.lookahead) {\n          s.match_length = s.lookahead;\n        }\n      }\n      //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n    }\n\n    /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n    if (s.match_length >= MIN_MATCH) {\n      //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n      s.strstart += s.match_length;\n      s.match_length = 0;\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nfunction deflate_huff(s, flush) {\n  var bflush;             /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we have a literal to write. */\n    if (s.lookahead === 0) {\n      fill_window(s);\n      if (s.lookahead === 0) {\n        if (flush === Z_NO_FLUSH) {\n          return BS_NEED_MORE;\n        }\n        break;      /* flush the current block */\n      }\n    }\n\n    /* Output a literal byte */\n    s.match_length = 0;\n    //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n    s.lookahead--;\n    s.strstart++;\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n  this.good_length = good_length;\n  this.max_lazy = max_lazy;\n  this.nice_length = nice_length;\n  this.max_chain = max_chain;\n  this.func = func;\n}\n\nvar configuration_table;\n\nconfiguration_table = [\n  /*      good lazy nice chain */\n  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */\n  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */\n  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */\n  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */\n\n  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */\n  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */\n  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */\n  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */\n  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */\n  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nfunction lm_init(s) {\n  s.window_size = 2 * s.w_size;\n\n  /*** CLEAR_HASH(s); ***/\n  zero(s.head); // Fill with NIL (= 0);\n\n  /* Set the default configuration parameters:\n   */\n  s.max_lazy_match = configuration_table[s.level].max_lazy;\n  s.good_match = configuration_table[s.level].good_length;\n  s.nice_match = configuration_table[s.level].nice_length;\n  s.max_chain_length = configuration_table[s.level].max_chain;\n\n  s.strstart = 0;\n  s.block_start = 0;\n  s.lookahead = 0;\n  s.insert = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  s.ins_h = 0;\n}\n\n\nfunction DeflateState() {\n  this.strm = null;            /* pointer back to this zlib stream */\n  this.status = 0;            /* as the name implies */\n  this.pending_buf = null;      /* output still pending */\n  this.pending_buf_size = 0;  /* size of pending_buf */\n  this.pending_out = 0;       /* next pending byte to output to the stream */\n  this.pending = 0;           /* nb of bytes in the pending buffer */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.gzhead = null;         /* gzip header information to write */\n  this.gzindex = 0;           /* where in extra, name, or comment */\n  this.method = Z_DEFLATED; /* can only be DEFLATED */\n  this.last_flush = -1;   /* value of flush param for previous deflate call */\n\n  this.w_size = 0;  /* LZ77 window size (32K by default) */\n  this.w_bits = 0;  /* log2(w_size)  (8..16) */\n  this.w_mask = 0;  /* w_size - 1 */\n\n  this.window = null;\n  /* Sliding window. Input bytes are read into the second half of the window,\n   * and move to the first half later to keep a dictionary of at least wSize\n   * bytes. With this organization, matches are limited to a distance of\n   * wSize-MAX_MATCH bytes, but this ensures that IO is always\n   * performed with a length multiple of the block size.\n   */\n\n  this.window_size = 0;\n  /* Actual size of window: 2*wSize, except when the user input buffer\n   * is directly used as sliding window.\n   */\n\n  this.prev = null;\n  /* Link to older string with same hash index. To limit the size of this\n   * array to 64K, this link is maintained only for the last 32K strings.\n   * An index in this array is thus a window index modulo 32K.\n   */\n\n  this.head = null;   /* Heads of the hash chains or NIL. */\n\n  this.ins_h = 0;       /* hash index of string to be inserted */\n  this.hash_size = 0;   /* number of elements in hash table */\n  this.hash_bits = 0;   /* log2(hash_size) */\n  this.hash_mask = 0;   /* hash_size-1 */\n\n  this.hash_shift = 0;\n  /* Number of bits by which ins_h must be shifted at each input\n   * step. It must be such that after MIN_MATCH steps, the oldest\n   * byte no longer takes part in the hash key, that is:\n   *   hash_shift * MIN_MATCH >= hash_bits\n   */\n\n  this.block_start = 0;\n  /* Window position at the beginning of the current output block. Gets\n   * negative when the window is moved backwards.\n   */\n\n  this.match_length = 0;      /* length of best match */\n  this.prev_match = 0;        /* previous match */\n  this.match_available = 0;   /* set if previous match exists */\n  this.strstart = 0;          /* start of string to insert */\n  this.match_start = 0;       /* start of matching string */\n  this.lookahead = 0;         /* number of valid bytes ahead in window */\n\n  this.prev_length = 0;\n  /* Length of the best match at previous step. Matches not greater than this\n   * are discarded. This is used in the lazy match evaluation.\n   */\n\n  this.max_chain_length = 0;\n  /* To speed up deflation, hash chains are never searched beyond this\n   * length.  A higher limit improves compression ratio but degrades the\n   * speed.\n   */\n\n  this.max_lazy_match = 0;\n  /* Attempt to find a better match only when the current match is strictly\n   * smaller than this value. This mechanism is used only for compression\n   * levels >= 4.\n   */\n  // That's alias to max_lazy_match, don't use directly\n  //this.max_insert_length = 0;\n  /* Insert new strings in the hash table only if the match length is not\n   * greater than this length. This saves time but degrades compression.\n   * max_insert_length is used only for compression levels <= 3.\n   */\n\n  this.level = 0;     /* compression level (1..9) */\n  this.strategy = 0;  /* favor or force Huffman coding*/\n\n  this.good_match = 0;\n  /* Use a faster search when the previous match is longer than this */\n\n  this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n              /* used by trees.c: */\n\n  /* Didn't use ct_data typedef below to suppress compiler warning */\n\n  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */\n  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */\n\n  // Use flat array of DOUBLE size, with interleaved fata,\n  // because JS does not support effective\n  this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);\n  this.dyn_dtree  = new utils.Buf16((2 * D_CODES + 1) * 2);\n  this.bl_tree    = new utils.Buf16((2 * BL_CODES + 1) * 2);\n  zero(this.dyn_ltree);\n  zero(this.dyn_dtree);\n  zero(this.bl_tree);\n\n  this.l_desc   = null;         /* desc. for literal tree */\n  this.d_desc   = null;         /* desc. for distance tree */\n  this.bl_desc  = null;         /* desc. for bit length tree */\n\n  //ush bl_count[MAX_BITS+1];\n  this.bl_count = new utils.Buf16(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */\n  this.heap = new utils.Buf16(2 * L_CODES + 1);  /* heap used to build the Huffman trees */\n  zero(this.heap);\n\n  this.heap_len = 0;               /* number of elements in the heap */\n  this.heap_max = 0;               /* element of largest frequency */\n  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n   * The same heap array is used to build all trees.\n   */\n\n  this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n  zero(this.depth);\n  /* Depth of each subtree used as tie breaker for trees of equal frequency\n   */\n\n  this.l_buf = 0;          /* buffer index for literals or lengths */\n\n  this.lit_bufsize = 0;\n  /* Size of match buffer for literals/lengths.  There are 4 reasons for\n   * limiting lit_bufsize to 64K:\n   *   - frequencies can be kept in 16 bit counters\n   *   - if compression is not successful for the first block, all input\n   *     data is still in the window so we can still emit a stored block even\n   *     when input comes from standard input.  (This can also be done for\n   *     all blocks if lit_bufsize is not greater than 32K.)\n   *   - if compression is not successful for a file smaller than 64K, we can\n   *     even emit a stored file instead of a stored block (saving 5 bytes).\n   *     This is applicable only for zip (not gzip or zlib).\n   *   - creating new Huffman trees less frequently may not provide fast\n   *     adaptation to changes in the input data statistics. (Take for\n   *     example a binary file with poorly compressible code followed by\n   *     a highly compressible string table.) Smaller buffer sizes give\n   *     fast adaptation but have of course the overhead of transmitting\n   *     trees more frequently.\n   *   - I can't count above 4\n   */\n\n  this.last_lit = 0;      /* running index in l_buf */\n\n  this.d_buf = 0;\n  /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n   * the same number of elements. To use different lengths, an extra flag\n   * array would be necessary.\n   */\n\n  this.opt_len = 0;       /* bit length of current block with optimal trees */\n  this.static_len = 0;    /* bit length of current block with static trees */\n  this.matches = 0;       /* number of string matches in current block */\n  this.insert = 0;        /* bytes at end of window left to insert */\n\n\n  this.bi_buf = 0;\n  /* Output buffer. bits are inserted starting at the bottom (least\n   * significant bits).\n   */\n  this.bi_valid = 0;\n  /* Number of valid bits in bi_buf.  All bits above the last valid bit\n   * are always zero.\n   */\n\n  // Used for window memory init. We safely ignore it for JS. That makes\n  // sense only for pointers and memory check tools.\n  //this.high_water = 0;\n  /* High water mark offset in window for initialized bytes -- bytes above\n   * this are set to zero in order to avoid memory check warnings when\n   * longest match routines access bytes past the input.  This is then\n   * updated to the new high water mark.\n   */\n}\n\n\nfunction deflateResetKeep(strm) {\n  var s;\n\n  if (!strm || !strm.state) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.total_in = strm.total_out = 0;\n  strm.data_type = Z_UNKNOWN;\n\n  s = strm.state;\n  s.pending = 0;\n  s.pending_out = 0;\n\n  if (s.wrap < 0) {\n    s.wrap = -s.wrap;\n    /* was made negative by deflate(..., Z_FINISH); */\n  }\n  s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n  strm.adler = (s.wrap === 2) ?\n    0  // crc32(0, Z_NULL, 0)\n  :\n    1; // adler32(0, Z_NULL, 0)\n  s.last_flush = Z_NO_FLUSH;\n  trees._tr_init(s);\n  return Z_OK;\n}\n\n\nfunction deflateReset(strm) {\n  var ret = deflateResetKeep(strm);\n  if (ret === Z_OK) {\n    lm_init(strm.state);\n  }\n  return ret;\n}\n\n\nfunction deflateSetHeader(strm, head) {\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n  strm.state.gzhead = head;\n  return Z_OK;\n}\n\n\nfunction deflateInit2(strm, level, method, windowBits, memLevel, strategy) {\n  if (!strm) { // === Z_NULL\n    return Z_STREAM_ERROR;\n  }\n  var wrap = 1;\n\n  if (level === Z_DEFAULT_COMPRESSION) {\n    level = 6;\n  }\n\n  if (windowBits < 0) { /* suppress zlib wrapper */\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n\n  else if (windowBits > 15) {\n    wrap = 2;           /* write gzip wrapper instead */\n    windowBits -= 16;\n  }\n\n\n  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n    strategy < 0 || strategy > Z_FIXED) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n\n  if (windowBits === 8) {\n    windowBits = 9;\n  }\n  /* until 256-byte window bug fixed */\n\n  var s = new DeflateState();\n\n  strm.state = s;\n  s.strm = strm;\n\n  s.wrap = wrap;\n  s.gzhead = null;\n  s.w_bits = windowBits;\n  s.w_size = 1 << s.w_bits;\n  s.w_mask = s.w_size - 1;\n\n  s.hash_bits = memLevel + 7;\n  s.hash_size = 1 << s.hash_bits;\n  s.hash_mask = s.hash_size - 1;\n  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n  s.window = new utils.Buf8(s.w_size * 2);\n  s.head = new utils.Buf16(s.hash_size);\n  s.prev = new utils.Buf16(s.w_size);\n\n  // Don't need mem init magic for JS.\n  //s.high_water = 0;  /* nothing written to s->window yet */\n\n  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n  s.pending_buf_size = s.lit_bufsize * 4;\n\n  //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n  //s->pending_buf = (uchf *) overlay;\n  s.pending_buf = new utils.Buf8(s.pending_buf_size);\n\n  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n  //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n  s.d_buf = 1 * s.lit_bufsize;\n\n  //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n  s.l_buf = (1 + 2) * s.lit_bufsize;\n\n  s.level = level;\n  s.strategy = strategy;\n  s.method = method;\n\n  return deflateReset(strm);\n}\n\nfunction deflateInit(strm, level) {\n  return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n}\n\n\nfunction deflate(strm, flush) {\n  var old_flush, s;\n  var beg, val; // for gzip header write only\n\n  if (!strm || !strm.state ||\n    flush > Z_BLOCK || flush < 0) {\n    return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n\n  if (!strm.output ||\n      (!strm.input && strm.avail_in !== 0) ||\n      (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n  }\n\n  s.strm = strm; /* just in case */\n  old_flush = s.last_flush;\n  s.last_flush = flush;\n\n  /* Write the header */\n  if (s.status === INIT_STATE) {\n\n    if (s.wrap === 2) { // GZIP header\n      strm.adler = 0;  //crc32(0L, Z_NULL, 0);\n      put_byte(s, 31);\n      put_byte(s, 139);\n      put_byte(s, 8);\n      if (!s.gzhead) { // s->gzhead == Z_NULL\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, OS_CODE);\n        s.status = BUSY_STATE;\n      }\n      else {\n        put_byte(s, (s.gzhead.text ? 1 : 0) +\n                    (s.gzhead.hcrc ? 2 : 0) +\n                    (!s.gzhead.extra ? 0 : 4) +\n                    (!s.gzhead.name ? 0 : 8) +\n                    (!s.gzhead.comment ? 0 : 16)\n        );\n        put_byte(s, s.gzhead.time & 0xff);\n        put_byte(s, (s.gzhead.time >> 8) & 0xff);\n        put_byte(s, (s.gzhead.time >> 16) & 0xff);\n        put_byte(s, (s.gzhead.time >> 24) & 0xff);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, s.gzhead.os & 0xff);\n        if (s.gzhead.extra && s.gzhead.extra.length) {\n          put_byte(s, s.gzhead.extra.length & 0xff);\n          put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n        }\n        if (s.gzhead.hcrc) {\n          strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);\n        }\n        s.gzindex = 0;\n        s.status = EXTRA_STATE;\n      }\n    }\n    else // DEFLATE header\n    {\n      var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n      var level_flags = -1;\n\n      if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n        level_flags = 0;\n      } else if (s.level < 6) {\n        level_flags = 1;\n      } else if (s.level === 6) {\n        level_flags = 2;\n      } else {\n        level_flags = 3;\n      }\n      header |= (level_flags << 6);\n      if (s.strstart !== 0) { header |= PRESET_DICT; }\n      header += 31 - (header % 31);\n\n      s.status = BUSY_STATE;\n      putShortMSB(s, header);\n\n      /* Save the adler32 of the preset dictionary: */\n      if (s.strstart !== 0) {\n        putShortMSB(s, strm.adler >>> 16);\n        putShortMSB(s, strm.adler & 0xffff);\n      }\n      strm.adler = 1; // adler32(0L, Z_NULL, 0);\n    }\n  }\n\n//#ifdef GZIP\n  if (s.status === EXTRA_STATE) {\n    if (s.gzhead.extra/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n\n      while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            break;\n          }\n        }\n        put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n        s.gzindex++;\n      }\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (s.gzindex === s.gzhead.extra.length) {\n        s.gzindex = 0;\n        s.status = NAME_STATE;\n      }\n    }\n    else {\n      s.status = NAME_STATE;\n    }\n  }\n  if (s.status === NAME_STATE) {\n    if (s.gzhead.name/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.name.length) {\n          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.gzindex = 0;\n        s.status = COMMENT_STATE;\n      }\n    }\n    else {\n      s.status = COMMENT_STATE;\n    }\n  }\n  if (s.status === COMMENT_STATE) {\n    if (s.gzhead.comment/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.comment.length) {\n          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.status = HCRC_STATE;\n      }\n    }\n    else {\n      s.status = HCRC_STATE;\n    }\n  }\n  if (s.status === HCRC_STATE) {\n    if (s.gzhead.hcrc) {\n      if (s.pending + 2 > s.pending_buf_size) {\n        flush_pending(strm);\n      }\n      if (s.pending + 2 <= s.pending_buf_size) {\n        put_byte(s, strm.adler & 0xff);\n        put_byte(s, (strm.adler >> 8) & 0xff);\n        strm.adler = 0; //crc32(0L, Z_NULL, 0);\n        s.status = BUSY_STATE;\n      }\n    }\n    else {\n      s.status = BUSY_STATE;\n    }\n  }\n//#endif\n\n  /* Flush as much pending output as possible */\n  if (s.pending !== 0) {\n    flush_pending(strm);\n    if (strm.avail_out === 0) {\n      /* Since avail_out is 0, deflate will be called again with\n       * more output space, but possibly with both pending and\n       * avail_in equal to zero. There won't be anything to do,\n       * but this is not an error situation so make sure we\n       * return OK instead of BUF_ERROR at next call of deflate:\n       */\n      s.last_flush = -1;\n      return Z_OK;\n    }\n\n    /* Make sure there is something to do and avoid duplicate consecutive\n     * flushes. For repeated and useless calls with Z_FINISH, we keep\n     * returning Z_STREAM_END instead of Z_BUF_ERROR.\n     */\n  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n    flush !== Z_FINISH) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* User must not provide more input after the first FINISH: */\n  if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* Start a new block or continue the current one.\n   */\n  if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n    (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n    var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n      (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n        configuration_table[s.level].func(s, flush));\n\n    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n      s.status = FINISH_STATE;\n    }\n    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n      if (strm.avail_out === 0) {\n        s.last_flush = -1;\n        /* avoid BUF_ERROR next call, see above */\n      }\n      return Z_OK;\n      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n       * of deflate should use the same flush parameter to make sure\n       * that the flush is complete. So we don't have to output an\n       * empty block here, this will be done at next call. This also\n       * ensures that for a very small output buffer, we emit at most\n       * one empty block.\n       */\n    }\n    if (bstate === BS_BLOCK_DONE) {\n      if (flush === Z_PARTIAL_FLUSH) {\n        trees._tr_align(s);\n      }\n      else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n        trees._tr_stored_block(s, 0, 0, false);\n        /* For a full flush, this empty block will be recognized\n         * as a special marker by inflate_sync().\n         */\n        if (flush === Z_FULL_FLUSH) {\n          /*** CLEAR_HASH(s); ***/             /* forget history */\n          zero(s.head); // Fill with NIL (= 0);\n\n          if (s.lookahead === 0) {\n            s.strstart = 0;\n            s.block_start = 0;\n            s.insert = 0;\n          }\n        }\n      }\n      flush_pending(strm);\n      if (strm.avail_out === 0) {\n        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n        return Z_OK;\n      }\n    }\n  }\n  //Assert(strm->avail_out > 0, \"bug2\");\n  //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n  if (flush !== Z_FINISH) { return Z_OK; }\n  if (s.wrap <= 0) { return Z_STREAM_END; }\n\n  /* Write the trailer */\n  if (s.wrap === 2) {\n    put_byte(s, strm.adler & 0xff);\n    put_byte(s, (strm.adler >> 8) & 0xff);\n    put_byte(s, (strm.adler >> 16) & 0xff);\n    put_byte(s, (strm.adler >> 24) & 0xff);\n    put_byte(s, strm.total_in & 0xff);\n    put_byte(s, (strm.total_in >> 8) & 0xff);\n    put_byte(s, (strm.total_in >> 16) & 0xff);\n    put_byte(s, (strm.total_in >> 24) & 0xff);\n  }\n  else\n  {\n    putShortMSB(s, strm.adler >>> 16);\n    putShortMSB(s, strm.adler & 0xffff);\n  }\n\n  flush_pending(strm);\n  /* If avail_out is zero, the application will call deflate again\n   * to flush the rest.\n   */\n  if (s.wrap > 0) { s.wrap = -s.wrap; }\n  /* write the trailer only once! */\n  return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n}\n\nfunction deflateEnd(strm) {\n  var status;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  status = strm.state.status;\n  if (status !== INIT_STATE &&\n    status !== EXTRA_STATE &&\n    status !== NAME_STATE &&\n    status !== COMMENT_STATE &&\n    status !== HCRC_STATE &&\n    status !== BUSY_STATE &&\n    status !== FINISH_STATE\n  ) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.state = null;\n\n  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n}\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nfunction deflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var s;\n  var str, n;\n  var wrap;\n  var avail;\n  var next;\n  var input;\n  var tmpDict;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n  wrap = s.wrap;\n\n  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n  if (wrap === 1) {\n    /* adler32(strm->adler, dictionary, dictLength); */\n    strm.adler = adler32(strm.adler, dictionary, dictLength, 0);\n  }\n\n  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */\n\n  /* if dictionary would fill window, just replace the history */\n  if (dictLength >= s.w_size) {\n    if (wrap === 0) {            /* already empty otherwise */\n      /*** CLEAR_HASH(s); ***/\n      zero(s.head); // Fill with NIL (= 0);\n      s.strstart = 0;\n      s.block_start = 0;\n      s.insert = 0;\n    }\n    /* use the tail */\n    // dictionary = dictionary.slice(dictLength - s.w_size);\n    tmpDict = new utils.Buf8(s.w_size);\n    utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);\n    dictionary = tmpDict;\n    dictLength = s.w_size;\n  }\n  /* insert dictionary into window and hash */\n  avail = strm.avail_in;\n  next = strm.next_in;\n  input = strm.input;\n  strm.avail_in = dictLength;\n  strm.next_in = 0;\n  strm.input = dictionary;\n  fill_window(s);\n  while (s.lookahead >= MIN_MATCH) {\n    str = s.strstart;\n    n = s.lookahead - (MIN_MATCH - 1);\n    do {\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n      s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n      s.head[s.ins_h] = str;\n      str++;\n    } while (--n);\n    s.strstart = str;\n    s.lookahead = MIN_MATCH - 1;\n    fill_window(s);\n  }\n  s.strstart += s.lookahead;\n  s.block_start = s.strstart;\n  s.insert = s.lookahead;\n  s.lookahead = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  strm.next_in = next;\n  strm.input = input;\n  strm.avail_in = avail;\n  s.wrap = wrap;\n  return Z_OK;\n}\n\n\nexports.deflateInit = deflateInit;\nexports.deflateInit2 = deflateInit2;\nexports.deflateReset = deflateReset;\nexports.deflateResetKeep = deflateResetKeep;\nexports.deflateSetHeader = deflateSetHeader;\nexports.deflate = deflate;\nexports.deflateEnd = deflateEnd;\nexports.deflateSetDictionary = deflateSetDictionary;\nexports.deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nexports.deflateBound = deflateBound;\nexports.deflateCopy = deflateCopy;\nexports.deflateParams = deflateParams;\nexports.deflatePending = deflatePending;\nexports.deflatePrime = deflatePrime;\nexports.deflateTune = deflateTune;\n*/\n","// String encode/decode helpers\n'use strict';\n\n\nvar utils = require('./common');\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nvar STR_APPLY_OK = true;\nvar STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new utils.Buf8(256);\nfor (var q = 0; q < 256; q++) {\n  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nexports.string2buf = function (str) {\n  var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n  // count binary size\n  for (m_pos = 0; m_pos < str_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n  }\n\n  // allocate buffer\n  buf = new utils.Buf8(buf_len);\n\n  // convert\n  for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    if (c < 0x80) {\n      /* one byte */\n      buf[i++] = c;\n    } else if (c < 0x800) {\n      /* two bytes */\n      buf[i++] = 0xC0 | (c >>> 6);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else if (c < 0x10000) {\n      /* three bytes */\n      buf[i++] = 0xE0 | (c >>> 12);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else {\n      /* four bytes */\n      buf[i++] = 0xf0 | (c >>> 18);\n      buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    }\n  }\n\n  return buf;\n};\n\n// Helper (used in 2 places)\nfunction buf2binstring(buf, len) {\n  // On Chrome, the arguments in a function call that are allowed is `65534`.\n  // If the length of the buffer is smaller than that, we can use this optimization,\n  // otherwise we will take a slower path.\n  if (len < 65534) {\n    if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {\n      return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));\n    }\n  }\n\n  var result = '';\n  for (var i = 0; i < len; i++) {\n    result += String.fromCharCode(buf[i]);\n  }\n  return result;\n}\n\n\n// Convert byte array to binary string\nexports.buf2binstring = function (buf) {\n  return buf2binstring(buf, buf.length);\n};\n\n\n// Convert binary string (typed, when possible)\nexports.binstring2buf = function (str) {\n  var buf = new utils.Buf8(str.length);\n  for (var i = 0, len = buf.length; i < len; i++) {\n    buf[i] = str.charCodeAt(i);\n  }\n  return buf;\n};\n\n\n// convert array to string\nexports.buf2string = function (buf, max) {\n  var i, out, c, c_len;\n  var len = max || buf.length;\n\n  // Reserve max possible length (2 words per char)\n  // NB: by unknown reasons, Array is significantly faster for\n  //     String.fromCharCode.apply than Uint16Array.\n  var utf16buf = new Array(len * 2);\n\n  for (out = 0, i = 0; i < len;) {\n    c = buf[i++];\n    // quick process ascii\n    if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n    c_len = _utf8len[c];\n    // skip 5 & 6 byte codes\n    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n    // apply mask on first byte\n    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n    // join the rest\n    while (c_len > 1 && i < len) {\n      c = (c << 6) | (buf[i++] & 0x3f);\n      c_len--;\n    }\n\n    // terminated by end of string?\n    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n    if (c < 0x10000) {\n      utf16buf[out++] = c;\n    } else {\n      c -= 0x10000;\n      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n      utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n    }\n  }\n\n  return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max   - length limit (mandatory);\nexports.utf8border = function (buf, max) {\n  var pos;\n\n  max = max || buf.length;\n  if (max > buf.length) { max = buf.length; }\n\n  // go back from last position, until start of sequence found\n  pos = max - 1;\n  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n  // Very small and broken sequence,\n  // return max, because we should return something anyway.\n  if (pos < 0) { return max; }\n\n  // If we came to start of buffer - that means buffer is too small,\n  // return max too.\n  if (pos === 0) { return max; }\n\n  return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n  /* next input byte */\n  this.input = null; // JS specific, because we have no pointers\n  this.next_in = 0;\n  /* number of bytes available at input */\n  this.avail_in = 0;\n  /* total number of input bytes read so far */\n  this.total_in = 0;\n  /* next output byte should be put there */\n  this.output = null; // JS specific, because we have no pointers\n  this.next_out = 0;\n  /* remaining free space at output */\n  this.avail_out = 0;\n  /* total number of bytes output so far */\n  this.total_out = 0;\n  /* last error message, NULL if no error */\n  this.msg = ''/*Z_NULL*/;\n  /* not visible by applications */\n  this.state = null;\n  /* best guess about the data type: binary or text */\n  this.data_type = 2/*Z_UNKNOWN*/;\n  /* adler32 value of the uncompressed data */\n  this.adler = 0;\n}\n\nmodule.exports = ZStream;\n","'use strict';\n\n\nvar zlib_deflate = require('./zlib/deflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\n\nvar toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nvar Z_NO_FLUSH      = 0;\nvar Z_FINISH        = 4;\n\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_SYNC_FLUSH    = 2;\n\nvar Z_DEFAULT_COMPRESSION = -1;\n\nvar Z_DEFAULT_STRATEGY    = 0;\n\nvar Z_DEFLATED  = 8;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array|Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param)  or if you\n * push a chunk with explicit flush (call [[Deflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n * - `header` (Object) - custom header for gzip\n *   - `text` (Boolean) - true if compressed data believed to be text\n *   - `time` (Number) - modification time, unix timestamp\n *   - `os` (Number) - operation system code\n *   - `extra` (Array) - array of bytes with extra data (max 65536)\n *   - `name` (String) - file name (binary string)\n *   - `comment` (String) - comment (binary string)\n *   - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true);  // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate(options) {\n  if (!(this instanceof Deflate)) return new Deflate(options);\n\n  this.options = utils.assign({\n    level: Z_DEFAULT_COMPRESSION,\n    method: Z_DEFLATED,\n    chunkSize: 16384,\n    windowBits: 15,\n    memLevel: 8,\n    strategy: Z_DEFAULT_STRATEGY,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  if (opt.raw && (opt.windowBits > 0)) {\n    opt.windowBits = -opt.windowBits;\n  }\n\n  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n    opt.windowBits += 16;\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status = zlib_deflate.deflateInit2(\n    this.strm,\n    opt.level,\n    opt.method,\n    opt.windowBits,\n    opt.memLevel,\n    opt.strategy\n  );\n\n  if (status !== Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  if (opt.header) {\n    zlib_deflate.deflateSetHeader(this.strm, opt.header);\n  }\n\n  if (opt.dictionary) {\n    var dict;\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      // If we need to compress text, change encoding to utf8.\n      dict = strings.string2buf(opt.dictionary);\n    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n      dict = new Uint8Array(opt.dictionary);\n    } else {\n      dict = opt.dictionary;\n    }\n\n    status = zlib_deflate.deflateSetDictionary(this.strm, dict);\n\n    if (status !== Z_OK) {\n      throw new Error(msg[status]);\n    }\n\n    this._dict_set = true;\n  }\n}\n\n/**\n * Deflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be\n *   converted to utf8 byte sequence.\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the compression context.\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * array format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nDeflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var status, _mode;\n\n  if (this.ended) { return false; }\n\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // If we need to compress text, change encoding to utf8.\n    strm.input = strings.string2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n    status = zlib_deflate.deflate(strm, _mode);    /* no bad return value */\n\n    if (status !== Z_STREAM_END && status !== Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n    if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) {\n      if (this.options.to === 'string') {\n        this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));\n      } else {\n        this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n      }\n    }\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);\n\n  // Finalize on the last chunk.\n  if (_mode === Z_FINISH) {\n    status = zlib_deflate.deflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === Z_SYNC_FLUSH) {\n    this.onEnd(Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): output data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === Z_OK) {\n    if (this.options.to === 'string') {\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , data = Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate(input, options) {\n  var deflator = new Deflate(options);\n\n  deflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (deflator.err) { throw deflator.msg || msg[deflator.err]; }\n\n  return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return deflate(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n  options = options || {};\n  options.gzip = true;\n  return deflate(input, options);\n}\n\n\nexports.Deflate = Deflate;\nexports.deflate = deflate;\nexports.deflateRaw = deflateRaw;\nexports.gzip = gzip;\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nvar BAD = 30;       /* got a data error -- remain here until reset */\nvar TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\n\n/*\n   Decode literal, length, and distance codes and write out the resulting\n   literal and match bytes until either not enough input or output is\n   available, an end-of-block is encountered, or a data error is encountered.\n   When large enough input and output buffers are supplied to inflate(), for\n   example, a 16K input buffer and a 64K output buffer, more than 95% of the\n   inflate execution time is spent in this routine.\n\n   Entry assumptions:\n\n        state.mode === LEN\n        strm.avail_in >= 6\n        strm.avail_out >= 258\n        start >= strm.avail_out\n        state.bits < 8\n\n   On return, state.mode is one of:\n\n        LEN -- ran out of enough output space or enough available input\n        TYPE -- reached end of block code, inflate() to interpret next block\n        BAD -- error in block data\n\n   Notes:\n\n    - The maximum input bits used by a length/distance pair is 15 bits for the\n      length code, 5 bits for the length extra, 15 bits for the distance code,\n      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.\n      Therefore if strm.avail_in >= 6, then there is enough input to avoid\n      checking for available input while decoding.\n\n    - The maximum bytes that a single length/distance pair can output is 258\n      bytes, which is the maximum length that can be coded.  inflate_fast()\n      requires strm.avail_out >= 258 for each loop to avoid checking for\n      output space.\n */\nmodule.exports = function inflate_fast(strm, start) {\n  var state;\n  var _in;                    /* local strm.input */\n  var last;                   /* have enough input while in < last */\n  var _out;                   /* local strm.output */\n  var beg;                    /* inflate()'s initial strm.output */\n  var end;                    /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n  var dmax;                   /* maximum distance from zlib header */\n//#endif\n  var wsize;                  /* window size or zero if not using window */\n  var whave;                  /* valid bytes in the window */\n  var wnext;                  /* window write index */\n  // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n  var s_window;               /* allocated sliding window, if wsize != 0 */\n  var hold;                   /* local strm.hold */\n  var bits;                   /* local strm.bits */\n  var lcode;                  /* local strm.lencode */\n  var dcode;                  /* local strm.distcode */\n  var lmask;                  /* mask for first level of length codes */\n  var dmask;                  /* mask for first level of distance codes */\n  var here;                   /* retrieved table entry */\n  var op;                     /* code bits, operation, extra bits, or */\n                              /*  window position, window bytes to copy */\n  var len;                    /* match length, unused bytes */\n  var dist;                   /* match distance */\n  var from;                   /* where to copy match from */\n  var from_source;\n\n\n  var input, output; // JS specific, because we have no pointers\n\n  /* copy state to local variables */\n  state = strm.state;\n  //here = state.here;\n  _in = strm.next_in;\n  input = strm.input;\n  last = _in + (strm.avail_in - 5);\n  _out = strm.next_out;\n  output = strm.output;\n  beg = _out - (start - strm.avail_out);\n  end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n  dmax = state.dmax;\n//#endif\n  wsize = state.wsize;\n  whave = state.whave;\n  wnext = state.wnext;\n  s_window = state.window;\n  hold = state.hold;\n  bits = state.bits;\n  lcode = state.lencode;\n  dcode = state.distcode;\n  lmask = (1 << state.lenbits) - 1;\n  dmask = (1 << state.distbits) - 1;\n\n\n  /* decode literals and length/distances until end-of-block or not enough\n     input data or output space */\n\n  top:\n  do {\n    if (bits < 15) {\n      hold += input[_in++] << bits;\n      bits += 8;\n      hold += input[_in++] << bits;\n      bits += 8;\n    }\n\n    here = lcode[hold & lmask];\n\n    dolen:\n    for (;;) { // Goto emulation\n      op = here >>> 24/*here.bits*/;\n      hold >>>= op;\n      bits -= op;\n      op = (here >>> 16) & 0xff/*here.op*/;\n      if (op === 0) {                          /* literal */\n        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n        //        \"inflate:         literal '%c'\\n\" :\n        //        \"inflate:         literal 0x%02x\\n\", here.val));\n        output[_out++] = here & 0xffff/*here.val*/;\n      }\n      else if (op & 16) {                     /* length base */\n        len = here & 0xffff/*here.val*/;\n        op &= 15;                           /* number of extra bits */\n        if (op) {\n          if (bits < op) {\n            hold += input[_in++] << bits;\n            bits += 8;\n          }\n          len += hold & ((1 << op) - 1);\n          hold >>>= op;\n          bits -= op;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", len));\n        if (bits < 15) {\n          hold += input[_in++] << bits;\n          bits += 8;\n          hold += input[_in++] << bits;\n          bits += 8;\n        }\n        here = dcode[hold & dmask];\n\n        dodist:\n        for (;;) { // goto emulation\n          op = here >>> 24/*here.bits*/;\n          hold >>>= op;\n          bits -= op;\n          op = (here >>> 16) & 0xff/*here.op*/;\n\n          if (op & 16) {                      /* distance base */\n            dist = here & 0xffff/*here.val*/;\n            op &= 15;                       /* number of extra bits */\n            if (bits < op) {\n              hold += input[_in++] << bits;\n              bits += 8;\n              if (bits < op) {\n                hold += input[_in++] << bits;\n                bits += 8;\n              }\n            }\n            dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n            if (dist > dmax) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD;\n              break top;\n            }\n//#endif\n            hold >>>= op;\n            bits -= op;\n            //Tracevv((stderr, \"inflate:         distance %u\\n\", dist));\n            op = _out - beg;                /* max distance in output */\n            if (dist > op) {                /* see if copy from window */\n              op = dist - op;               /* distance back in window */\n              if (op > whave) {\n                if (state.sane) {\n                  strm.msg = 'invalid distance too far back';\n                  state.mode = BAD;\n                  break top;\n                }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//                if (len <= op - whave) {\n//                  do {\n//                    output[_out++] = 0;\n//                  } while (--len);\n//                  continue top;\n//                }\n//                len -= op - whave;\n//                do {\n//                  output[_out++] = 0;\n//                } while (--op > whave);\n//                if (op === 0) {\n//                  from = _out - dist;\n//                  do {\n//                    output[_out++] = output[from++];\n//                  } while (--len);\n//                  continue top;\n//                }\n//#endif\n              }\n              from = 0; // window index\n              from_source = s_window;\n              if (wnext === 0) {           /* very common case */\n                from += wsize - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              else if (wnext < op) {      /* wrap around window */\n                from += wsize + wnext - op;\n                op -= wnext;\n                if (op < len) {         /* some from end of window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = 0;\n                  if (wnext < len) {  /* some from start of window */\n                    op = wnext;\n                    len -= op;\n                    do {\n                      output[_out++] = s_window[from++];\n                    } while (--op);\n                    from = _out - dist;      /* rest from output */\n                    from_source = output;\n                  }\n                }\n              }\n              else {                      /* contiguous in window */\n                from += wnext - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              while (len > 2) {\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                len -= 3;\n              }\n              if (len) {\n                output[_out++] = from_source[from++];\n                if (len > 1) {\n                  output[_out++] = from_source[from++];\n                }\n              }\n            }\n            else {\n              from = _out - dist;          /* copy direct from output */\n              do {                        /* minimum length is three */\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                len -= 3;\n              } while (len > 2);\n              if (len) {\n                output[_out++] = output[from++];\n                if (len > 1) {\n                  output[_out++] = output[from++];\n                }\n              }\n            }\n          }\n          else if ((op & 64) === 0) {          /* 2nd level distance code */\n            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n            continue dodist;\n          }\n          else {\n            strm.msg = 'invalid distance code';\n            state.mode = BAD;\n            break top;\n          }\n\n          break; // need to emulate goto via \"continue\"\n        }\n      }\n      else if ((op & 64) === 0) {              /* 2nd level length code */\n        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n        continue dolen;\n      }\n      else if (op & 32) {                     /* end-of-block */\n        //Tracevv((stderr, \"inflate:         end of block\\n\"));\n        state.mode = TYPE;\n        break top;\n      }\n      else {\n        strm.msg = 'invalid literal/length code';\n        state.mode = BAD;\n        break top;\n      }\n\n      break; // need to emulate goto via \"continue\"\n    }\n  } while (_in < last && _out < end);\n\n  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n  len = bits >> 3;\n  _in -= len;\n  bits -= len << 3;\n  hold &= (1 << bits) - 1;\n\n  /* update state and return */\n  strm.next_in = _in;\n  strm.next_out = _out;\n  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n  state.hold = hold;\n  state.bits = bits;\n  return;\n};\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = require('../utils/common');\n\nvar MAXBITS = 15;\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\nvar lbase = [ /* Length codes 257..285 base */\n  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n];\n\nvar lext = [ /* Length codes 257..285 extra */\n  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n];\n\nvar dbase = [ /* Distance codes 0..29 base */\n  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n  8193, 12289, 16385, 24577, 0, 0\n];\n\nvar dext = [ /* Distance codes 0..29 extra */\n  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n  28, 28, 29, 29, 64, 64\n];\n\nmodule.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)\n{\n  var bits = opts.bits;\n      //here = opts.here; /* table entry for duplication */\n\n  var len = 0;               /* a code's length in bits */\n  var sym = 0;               /* index of code symbols */\n  var min = 0, max = 0;          /* minimum and maximum code lengths */\n  var root = 0;              /* number of index bits for root table */\n  var curr = 0;              /* number of index bits for current table */\n  var drop = 0;              /* code bits to drop for sub-table */\n  var left = 0;                   /* number of prefix codes available */\n  var used = 0;              /* code entries in table used */\n  var huff = 0;              /* Huffman code */\n  var incr;              /* for incrementing code, index */\n  var fill;              /* index for replicating entries */\n  var low;               /* low bits for current root entry */\n  var mask;              /* mask for low root bits */\n  var next;             /* next available space in table */\n  var base = null;     /* base value table to use */\n  var base_index = 0;\n//  var shoextra;    /* extra bits table to use */\n  var end;                    /* use base and extra for symbol > end */\n  var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */\n  var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */\n  var extra = null;\n  var extra_index = 0;\n\n  var here_bits, here_op, here_val;\n\n  /*\n   Process a set of code lengths to create a canonical Huffman code.  The\n   code lengths are lens[0..codes-1].  Each length corresponds to the\n   symbols 0..codes-1.  The Huffman code is generated by first sorting the\n   symbols by length from short to long, and retaining the symbol order\n   for codes with equal lengths.  Then the code starts with all zero bits\n   for the first code of the shortest length, and the codes are integer\n   increments for the same length, and zeros are appended as the length\n   increases.  For the deflate format, these bits are stored backwards\n   from their more natural integer increment ordering, and so when the\n   decoding tables are built in the large loop below, the integer codes\n   are incremented backwards.\n\n   This routine assumes, but does not check, that all of the entries in\n   lens[] are in the range 0..MAXBITS.  The caller must assure this.\n   1..MAXBITS is interpreted as that code length.  zero means that that\n   symbol does not occur in this code.\n\n   The codes are sorted by computing a count of codes for each length,\n   creating from that a table of starting indices for each length in the\n   sorted table, and then entering the symbols in order in the sorted\n   table.  The sorted table is work[], with that space being provided by\n   the caller.\n\n   The length counts are used for other purposes as well, i.e. finding\n   the minimum and maximum length codes, determining if there are any\n   codes at all, checking for a valid set of lengths, and looking ahead\n   at length counts to determine sub-table sizes when building the\n   decoding tables.\n   */\n\n  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n  for (len = 0; len <= MAXBITS; len++) {\n    count[len] = 0;\n  }\n  for (sym = 0; sym < codes; sym++) {\n    count[lens[lens_index + sym]]++;\n  }\n\n  /* bound code lengths, force root to be within code lengths */\n  root = bits;\n  for (max = MAXBITS; max >= 1; max--) {\n    if (count[max] !== 0) { break; }\n  }\n  if (root > max) {\n    root = max;\n  }\n  if (max === 0) {                     /* no symbols to code at all */\n    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */\n    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;\n    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n    //table.op[opts.table_index] = 64;\n    //table.bits[opts.table_index] = 1;\n    //table.val[opts.table_index++] = 0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n    opts.bits = 1;\n    return 0;     /* no symbols, but wait for decoding to report error */\n  }\n  for (min = 1; min < max; min++) {\n    if (count[min] !== 0) { break; }\n  }\n  if (root < min) {\n    root = min;\n  }\n\n  /* check for an over-subscribed or incomplete set of lengths */\n  left = 1;\n  for (len = 1; len <= MAXBITS; len++) {\n    left <<= 1;\n    left -= count[len];\n    if (left < 0) {\n      return -1;\n    }        /* over-subscribed */\n  }\n  if (left > 0 && (type === CODES || max !== 1)) {\n    return -1;                      /* incomplete set */\n  }\n\n  /* generate offsets into symbol table for each length for sorting */\n  offs[1] = 0;\n  for (len = 1; len < MAXBITS; len++) {\n    offs[len + 1] = offs[len] + count[len];\n  }\n\n  /* sort symbols by length, by symbol order within each length */\n  for (sym = 0; sym < codes; sym++) {\n    if (lens[lens_index + sym] !== 0) {\n      work[offs[lens[lens_index + sym]]++] = sym;\n    }\n  }\n\n  /*\n   Create and fill in decoding tables.  In this loop, the table being\n   filled is at next and has curr index bits.  The code being used is huff\n   with length len.  That code is converted to an index by dropping drop\n   bits off of the bottom.  For codes where len is less than drop + curr,\n   those top drop + curr - len bits are incremented through all values to\n   fill the table with replicated entries.\n\n   root is the number of index bits for the root table.  When len exceeds\n   root, sub-tables are created pointed to by the root entry with an index\n   of the low root bits of huff.  This is saved in low to check for when a\n   new sub-table should be started.  drop is zero when the root table is\n   being filled, and drop is root when sub-tables are being filled.\n\n   When a new sub-table is needed, it is necessary to look ahead in the\n   code lengths to determine what size sub-table is needed.  The length\n   counts are used for this, and so count[] is decremented as codes are\n   entered in the tables.\n\n   used keeps track of how many table entries have been allocated from the\n   provided *table space.  It is checked for LENS and DIST tables against\n   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n   the initial root table size constants.  See the comments in inftrees.h\n   for more information.\n\n   sym increments through all symbols, and the loop terminates when\n   all codes of length max, i.e. all codes, have been processed.  This\n   routine permits incomplete codes, so another loop after this one fills\n   in the rest of the decoding tables with invalid code markers.\n   */\n\n  /* set up for code type */\n  // poor man optimization - use if-else instead of switch,\n  // to avoid deopts in old v8\n  if (type === CODES) {\n    base = extra = work;    /* dummy value--not used */\n    end = 19;\n\n  } else if (type === LENS) {\n    base = lbase;\n    base_index -= 257;\n    extra = lext;\n    extra_index -= 257;\n    end = 256;\n\n  } else {                    /* DISTS */\n    base = dbase;\n    extra = dext;\n    end = -1;\n  }\n\n  /* initialize opts for loop */\n  huff = 0;                   /* starting code */\n  sym = 0;                    /* starting code symbol */\n  len = min;                  /* starting code length */\n  next = table_index;              /* current table to fill in */\n  curr = root;                /* current table index bits */\n  drop = 0;                   /* current bits to drop from code for index */\n  low = -1;                   /* trigger new sub-table when len > root */\n  used = 1 << root;          /* use root table entries */\n  mask = used - 1;            /* mask for comparing low */\n\n  /* check available table space */\n  if ((type === LENS && used > ENOUGH_LENS) ||\n    (type === DISTS && used > ENOUGH_DISTS)) {\n    return 1;\n  }\n\n  /* process all codes and make table entries */\n  for (;;) {\n    /* create table entry */\n    here_bits = len - drop;\n    if (work[sym] < end) {\n      here_op = 0;\n      here_val = work[sym];\n    }\n    else if (work[sym] > end) {\n      here_op = extra[extra_index + work[sym]];\n      here_val = base[base_index + work[sym]];\n    }\n    else {\n      here_op = 32 + 64;         /* end of block */\n      here_val = 0;\n    }\n\n    /* replicate for those indices with low len bits equal to huff */\n    incr = 1 << (len - drop);\n    fill = 1 << curr;\n    min = fill;                 /* save offset to next table */\n    do {\n      fill -= incr;\n      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n    } while (fill !== 0);\n\n    /* backwards increment the len-bit code huff */\n    incr = 1 << (len - 1);\n    while (huff & incr) {\n      incr >>= 1;\n    }\n    if (incr !== 0) {\n      huff &= incr - 1;\n      huff += incr;\n    } else {\n      huff = 0;\n    }\n\n    /* go to next symbol, update count, len */\n    sym++;\n    if (--count[len] === 0) {\n      if (len === max) { break; }\n      len = lens[lens_index + work[sym]];\n    }\n\n    /* create new sub-table if needed */\n    if (len > root && (huff & mask) !== low) {\n      /* if first time, transition to sub-tables */\n      if (drop === 0) {\n        drop = root;\n      }\n\n      /* increment past last table */\n      next += min;            /* here min is 1 << curr */\n\n      /* determine length of next table */\n      curr = len - drop;\n      left = 1 << curr;\n      while (curr + drop < max) {\n        left -= count[curr + drop];\n        if (left <= 0) { break; }\n        curr++;\n        left <<= 1;\n      }\n\n      /* check for enough space */\n      used += 1 << curr;\n      if ((type === LENS && used > ENOUGH_LENS) ||\n        (type === DISTS && used > ENOUGH_DISTS)) {\n        return 1;\n      }\n\n      /* point entry in root table to sub-table */\n      low = huff & mask;\n      /*table.op[low] = curr;\n      table.bits[low] = root;\n      table.val[low] = next - opts.table_index;*/\n      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n    }\n  }\n\n  /* fill in remaining table entry if code is incomplete (guaranteed to have\n   at most one remaining entry, since if the code is incomplete, the\n   maximum code length that was allowed to get this far is one bit) */\n  if (huff !== 0) {\n    //table.op[next + huff] = 64;            /* invalid code marker */\n    //table.bits[next + huff] = len - drop;\n    //table.val[next + huff] = 0;\n    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n  }\n\n  /* set return parameters */\n  //opts.table_index += used;\n  opts.bits = root;\n  return 0;\n};\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils         = require('../utils/common');\nvar adler32       = require('./adler32');\nvar crc32         = require('./crc32');\nvar inflate_fast  = require('./inffast');\nvar inflate_table = require('./inftrees');\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\n//var Z_NO_FLUSH      = 0;\n//var Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\n//var Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\nvar Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\nvar Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nvar    HEAD = 1;       /* i: waiting for magic header */\nvar    FLAGS = 2;      /* i: waiting for method and flags (gzip) */\nvar    TIME = 3;       /* i: waiting for modification time (gzip) */\nvar    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */\nvar    EXLEN = 5;      /* i: waiting for extra length (gzip) */\nvar    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */\nvar    NAME = 7;       /* i: waiting for end of file name (gzip) */\nvar    COMMENT = 8;    /* i: waiting for end of comment (gzip) */\nvar    HCRC = 9;       /* i: waiting for header crc (gzip) */\nvar    DICTID = 10;    /* i: waiting for dictionary check value */\nvar    DICT = 11;      /* waiting for inflateSetDictionary() call */\nvar        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\nvar        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */\nvar        STORED = 14;    /* i: waiting for stored size (length and complement) */\nvar        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */\nvar        COPY = 16;      /* i/o: waiting for input or output to copy stored block */\nvar        TABLE = 17;     /* i: waiting for dynamic block table lengths */\nvar        LENLENS = 18;   /* i: waiting for code length code lengths */\nvar        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */\nvar            LEN_ = 20;      /* i: same as LEN below, but only first time in */\nvar            LEN = 21;       /* i: waiting for length/lit/eob code */\nvar            LENEXT = 22;    /* i: waiting for length extra bits */\nvar            DIST = 23;      /* i: waiting for distance code */\nvar            DISTEXT = 24;   /* i: waiting for distance extra bits */\nvar            MATCH = 25;     /* o: waiting for output space to copy string */\nvar            LIT = 26;       /* o: waiting for output space to write literal */\nvar    CHECK = 27;     /* i: waiting for 32-bit check value */\nvar    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */\nvar    DONE = 29;      /* finished check, done -- remain here until reset */\nvar    BAD = 30;       /* got a data error -- remain here until reset */\nvar    MEM = 31;       /* got an inflate() memory error -- remain here until reset */\nvar    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_WBITS = MAX_WBITS;\n\n\nfunction zswap32(q) {\n  return  (((q >>> 24) & 0xff) +\n          ((q >>> 8) & 0xff00) +\n          ((q & 0xff00) << 8) +\n          ((q & 0xff) << 24));\n}\n\n\nfunction InflateState() {\n  this.mode = 0;             /* current inflate mode */\n  this.last = false;          /* true if processing last block */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.havedict = false;      /* true if dictionary provided */\n  this.flags = 0;             /* gzip header method and flags (0 if zlib) */\n  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */\n  this.check = 0;             /* protected copy of check value */\n  this.total = 0;             /* protected copy of output count */\n  // TODO: may be {}\n  this.head = null;           /* where to save gzip header information */\n\n  /* sliding window */\n  this.wbits = 0;             /* log base 2 of requested window size */\n  this.wsize = 0;             /* window size or zero if not using window */\n  this.whave = 0;             /* valid bytes in the window */\n  this.wnext = 0;             /* window write index */\n  this.window = null;         /* allocated sliding window, if needed */\n\n  /* bit accumulator */\n  this.hold = 0;              /* input bit accumulator */\n  this.bits = 0;              /* number of bits in \"in\" */\n\n  /* for string and stored block copying */\n  this.length = 0;            /* literal or length of data to copy */\n  this.offset = 0;            /* distance back to copy string from */\n\n  /* for table and code decoding */\n  this.extra = 0;             /* extra bits needed */\n\n  /* fixed and dynamic code tables */\n  this.lencode = null;          /* starting table for length/literal codes */\n  this.distcode = null;         /* starting table for distance codes */\n  this.lenbits = 0;           /* index bits for lencode */\n  this.distbits = 0;          /* index bits for distcode */\n\n  /* dynamic table building */\n  this.ncode = 0;             /* number of code length code lengths */\n  this.nlen = 0;              /* number of length code lengths */\n  this.ndist = 0;             /* number of distance code lengths */\n  this.have = 0;              /* number of code lengths in lens[] */\n  this.next = null;              /* next available space in codes[] */\n\n  this.lens = new utils.Buf16(320); /* temporary storage for code lengths */\n  this.work = new utils.Buf16(288); /* work area for code table building */\n\n  /*\n   because we don't have pointers in js, we use lencode and distcode directly\n   as buffers so we don't need codes\n  */\n  //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */\n  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */\n  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */\n  this.sane = 0;                   /* if false, allow invalid distance too far */\n  this.back = 0;                   /* bits back of last unprocessed length/lit */\n  this.was = 0;                    /* initial length of match */\n}\n\nfunction inflateResetKeep(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  strm.total_in = strm.total_out = state.total = 0;\n  strm.msg = ''; /*Z_NULL*/\n  if (state.wrap) {       /* to support ill-conceived Java test suite */\n    strm.adler = state.wrap & 1;\n  }\n  state.mode = HEAD;\n  state.last = 0;\n  state.havedict = 0;\n  state.dmax = 32768;\n  state.head = null/*Z_NULL*/;\n  state.hold = 0;\n  state.bits = 0;\n  //state.lencode = state.distcode = state.next = state.codes;\n  state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);\n  state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);\n\n  state.sane = 1;\n  state.back = -1;\n  //Tracev((stderr, \"inflate: reset\\n\"));\n  return Z_OK;\n}\n\nfunction inflateReset(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  state.wsize = 0;\n  state.whave = 0;\n  state.wnext = 0;\n  return inflateResetKeep(strm);\n\n}\n\nfunction inflateReset2(strm, windowBits) {\n  var wrap;\n  var state;\n\n  /* get the state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  /* extract wrap request from windowBits parameter */\n  if (windowBits < 0) {\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n  else {\n    wrap = (windowBits >> 4) + 1;\n    if (windowBits < 48) {\n      windowBits &= 15;\n    }\n  }\n\n  /* set number of window bits, free window if different */\n  if (windowBits && (windowBits < 8 || windowBits > 15)) {\n    return Z_STREAM_ERROR;\n  }\n  if (state.window !== null && state.wbits !== windowBits) {\n    state.window = null;\n  }\n\n  /* update state and reset the rest of it */\n  state.wrap = wrap;\n  state.wbits = windowBits;\n  return inflateReset(strm);\n}\n\nfunction inflateInit2(strm, windowBits) {\n  var ret;\n  var state;\n\n  if (!strm) { return Z_STREAM_ERROR; }\n  //strm.msg = Z_NULL;                 /* in case we return an error */\n\n  state = new InflateState();\n\n  //if (state === Z_NULL) return Z_MEM_ERROR;\n  //Tracev((stderr, \"inflate: allocated\\n\"));\n  strm.state = state;\n  state.window = null/*Z_NULL*/;\n  ret = inflateReset2(strm, windowBits);\n  if (ret !== Z_OK) {\n    strm.state = null/*Z_NULL*/;\n  }\n  return ret;\n}\n\nfunction inflateInit(strm) {\n  return inflateInit2(strm, DEF_WBITS);\n}\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding.  Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter.  This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time.  However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nvar virgin = true;\n\nvar lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\nfunction fixedtables(state) {\n  /* build fixed huffman tables if first call (may not be thread safe) */\n  if (virgin) {\n    var sym;\n\n    lenfix = new utils.Buf32(512);\n    distfix = new utils.Buf32(32);\n\n    /* literal/length table */\n    sym = 0;\n    while (sym < 144) { state.lens[sym++] = 8; }\n    while (sym < 256) { state.lens[sym++] = 9; }\n    while (sym < 280) { state.lens[sym++] = 7; }\n    while (sym < 288) { state.lens[sym++] = 8; }\n\n    inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });\n\n    /* distance table */\n    sym = 0;\n    while (sym < 32) { state.lens[sym++] = 5; }\n\n    inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });\n\n    /* do this just once */\n    virgin = false;\n  }\n\n  state.lencode = lenfix;\n  state.lenbits = 9;\n  state.distcode = distfix;\n  state.distbits = 5;\n}\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning.  If window does not exist yet, create it.  This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nfunction updatewindow(strm, src, end, copy) {\n  var dist;\n  var state = strm.state;\n\n  /* if it hasn't been done already, allocate space for the window */\n  if (state.window === null) {\n    state.wsize = 1 << state.wbits;\n    state.wnext = 0;\n    state.whave = 0;\n\n    state.window = new utils.Buf8(state.wsize);\n  }\n\n  /* copy state->wsize or less output bytes into the circular window */\n  if (copy >= state.wsize) {\n    utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);\n    state.wnext = 0;\n    state.whave = state.wsize;\n  }\n  else {\n    dist = state.wsize - state.wnext;\n    if (dist > copy) {\n      dist = copy;\n    }\n    //zmemcpy(state->window + state->wnext, end - copy, dist);\n    utils.arraySet(state.window, src, end - copy, dist, state.wnext);\n    copy -= dist;\n    if (copy) {\n      //zmemcpy(state->window, end - copy, copy);\n      utils.arraySet(state.window, src, end - copy, copy, 0);\n      state.wnext = copy;\n      state.whave = state.wsize;\n    }\n    else {\n      state.wnext += dist;\n      if (state.wnext === state.wsize) { state.wnext = 0; }\n      if (state.whave < state.wsize) { state.whave += dist; }\n    }\n  }\n  return 0;\n}\n\nfunction inflate(strm, flush) {\n  var state;\n  var input, output;          // input/output buffers\n  var next;                   /* next input INDEX */\n  var put;                    /* next output INDEX */\n  var have, left;             /* available input and output */\n  var hold;                   /* bit buffer */\n  var bits;                   /* bits in bit buffer */\n  var _in, _out;              /* save starting available input and output */\n  var copy;                   /* number of stored or match bytes to copy */\n  var from;                   /* where to copy match bytes from */\n  var from_source;\n  var here = 0;               /* current decoding table entry */\n  var here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n  //var last;                   /* parent table entry */\n  var last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n  var len;                    /* length to copy for repeats, bits to drop */\n  var ret;                    /* return code */\n  var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */\n  var opts;\n\n  var n; // temporary var for NEED_BITS\n\n  var order = /* permutation of code lengths */\n    [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n\n  if (!strm || !strm.state || !strm.output ||\n      (!strm.input && strm.avail_in !== 0)) {\n    return Z_STREAM_ERROR;\n  }\n\n  state = strm.state;\n  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */\n\n\n  //--- LOAD() ---\n  put = strm.next_out;\n  output = strm.output;\n  left = strm.avail_out;\n  next = strm.next_in;\n  input = strm.input;\n  have = strm.avail_in;\n  hold = state.hold;\n  bits = state.bits;\n  //---\n\n  _in = have;\n  _out = left;\n  ret = Z_OK;\n\n  inf_leave: // goto emulation\n  for (;;) {\n    switch (state.mode) {\n      case HEAD:\n        if (state.wrap === 0) {\n          state.mode = TYPEDO;\n          break;\n        }\n        //=== NEEDBITS(16);\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */\n          state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          state.mode = FLAGS;\n          break;\n        }\n        state.flags = 0;           /* expect zlib header */\n        if (state.head) {\n          state.head.done = false;\n        }\n        if (!(state.wrap & 1) ||   /* check if zlib header allowed */\n          (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n          strm.msg = 'incorrect header check';\n          state.mode = BAD;\n          break;\n        }\n        if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n          strm.msg = 'unknown compression method';\n          state.mode = BAD;\n          break;\n        }\n        //--- DROPBITS(4) ---//\n        hold >>>= 4;\n        bits -= 4;\n        //---//\n        len = (hold & 0x0f)/*BITS(4)*/ + 8;\n        if (state.wbits === 0) {\n          state.wbits = len;\n        }\n        else if (len > state.wbits) {\n          strm.msg = 'invalid window size';\n          state.mode = BAD;\n          break;\n        }\n        state.dmax = 1 << len;\n        //Tracev((stderr, \"inflate:   zlib header ok\\n\"));\n        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n        state.mode = hold & 0x200 ? DICTID : TYPE;\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        break;\n      case FLAGS:\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.flags = hold;\n        if ((state.flags & 0xff) !== Z_DEFLATED) {\n          strm.msg = 'unknown compression method';\n          state.mode = BAD;\n          break;\n        }\n        if (state.flags & 0xe000) {\n          strm.msg = 'unknown header flags set';\n          state.mode = BAD;\n          break;\n        }\n        if (state.head) {\n          state.head.text = ((hold >> 8) & 1);\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = TIME;\n        /* falls through */\n      case TIME:\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (state.head) {\n          state.head.time = hold;\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC4(state.check, hold)\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          hbuf[2] = (hold >>> 16) & 0xff;\n          hbuf[3] = (hold >>> 24) & 0xff;\n          state.check = crc32(state.check, hbuf, 4, 0);\n          //===\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = OS;\n        /* falls through */\n      case OS:\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (state.head) {\n          state.head.xflags = (hold & 0xff);\n          state.head.os = (hold >> 8);\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = EXLEN;\n        /* falls through */\n      case EXLEN:\n        if (state.flags & 0x0400) {\n          //=== NEEDBITS(16); */\n          while (bits < 16) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.length = hold;\n          if (state.head) {\n            state.head.extra_len = hold;\n          }\n          if (state.flags & 0x0200) {\n            //=== CRC2(state.check, hold);\n            hbuf[0] = hold & 0xff;\n            hbuf[1] = (hold >>> 8) & 0xff;\n            state.check = crc32(state.check, hbuf, 2, 0);\n            //===//\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n        }\n        else if (state.head) {\n          state.head.extra = null/*Z_NULL*/;\n        }\n        state.mode = EXTRA;\n        /* falls through */\n      case EXTRA:\n        if (state.flags & 0x0400) {\n          copy = state.length;\n          if (copy > have) { copy = have; }\n          if (copy) {\n            if (state.head) {\n              len = state.head.extra_len - state.length;\n              if (!state.head.extra) {\n                // Use untyped array for more convenient processing later\n                state.head.extra = new Array(state.head.extra_len);\n              }\n              utils.arraySet(\n                state.head.extra,\n                input,\n                next,\n                // extra field is limited to 65536 bytes\n                // - no need for additional size check\n                copy,\n                /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n                len\n              );\n              //zmemcpy(state.head.extra + len, next,\n              //        len + copy > state.head.extra_max ?\n              //        state.head.extra_max - len : copy);\n            }\n            if (state.flags & 0x0200) {\n              state.check = crc32(state.check, input, copy, next);\n            }\n            have -= copy;\n            next += copy;\n            state.length -= copy;\n          }\n          if (state.length) { break inf_leave; }\n        }\n        state.length = 0;\n        state.mode = NAME;\n        /* falls through */\n      case NAME:\n        if (state.flags & 0x0800) {\n          if (have === 0) { break inf_leave; }\n          copy = 0;\n          do {\n            // TODO: 2 or 1 bytes?\n            len = input[next + copy++];\n            /* use constant limit because in js we should not preallocate memory */\n            if (state.head && len &&\n                (state.length < 65536 /*state.head.name_max*/)) {\n              state.head.name += String.fromCharCode(len);\n            }\n          } while (len && copy < have);\n\n          if (state.flags & 0x0200) {\n            state.check = crc32(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          if (len) { break inf_leave; }\n        }\n        else if (state.head) {\n          state.head.name = null;\n        }\n        state.length = 0;\n        state.mode = COMMENT;\n        /* falls through */\n      case COMMENT:\n        if (state.flags & 0x1000) {\n          if (have === 0) { break inf_leave; }\n          copy = 0;\n          do {\n            len = input[next + copy++];\n            /* use constant limit because in js we should not preallocate memory */\n            if (state.head && len &&\n                (state.length < 65536 /*state.head.comm_max*/)) {\n              state.head.comment += String.fromCharCode(len);\n            }\n          } while (len && copy < have);\n          if (state.flags & 0x0200) {\n            state.check = crc32(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          if (len) { break inf_leave; }\n        }\n        else if (state.head) {\n          state.head.comment = null;\n        }\n        state.mode = HCRC;\n        /* falls through */\n      case HCRC:\n        if (state.flags & 0x0200) {\n          //=== NEEDBITS(16); */\n          while (bits < 16) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          if (hold !== (state.check & 0xffff)) {\n            strm.msg = 'header crc mismatch';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n        }\n        if (state.head) {\n          state.head.hcrc = ((state.flags >> 9) & 1);\n          state.head.done = true;\n        }\n        strm.adler = state.check = 0;\n        state.mode = TYPE;\n        break;\n      case DICTID:\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        strm.adler = state.check = zswap32(hold);\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = DICT;\n        /* falls through */\n      case DICT:\n        if (state.havedict === 0) {\n          //--- RESTORE() ---\n          strm.next_out = put;\n          strm.avail_out = left;\n          strm.next_in = next;\n          strm.avail_in = have;\n          state.hold = hold;\n          state.bits = bits;\n          //---\n          return Z_NEED_DICT;\n        }\n        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n        state.mode = TYPE;\n        /* falls through */\n      case TYPE:\n        if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case TYPEDO:\n        if (state.last) {\n          //--- BYTEBITS() ---//\n          hold >>>= bits & 7;\n          bits -= bits & 7;\n          //---//\n          state.mode = CHECK;\n          break;\n        }\n        //=== NEEDBITS(3); */\n        while (bits < 3) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.last = (hold & 0x01)/*BITS(1)*/;\n        //--- DROPBITS(1) ---//\n        hold >>>= 1;\n        bits -= 1;\n        //---//\n\n        switch ((hold & 0x03)/*BITS(2)*/) {\n          case 0:                             /* stored block */\n            //Tracev((stderr, \"inflate:     stored block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = STORED;\n            break;\n          case 1:                             /* fixed block */\n            fixedtables(state);\n            //Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = LEN_;             /* decode codes */\n            if (flush === Z_TREES) {\n              //--- DROPBITS(2) ---//\n              hold >>>= 2;\n              bits -= 2;\n              //---//\n              break inf_leave;\n            }\n            break;\n          case 2:                             /* dynamic block */\n            //Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = TABLE;\n            break;\n          case 3:\n            strm.msg = 'invalid block type';\n            state.mode = BAD;\n        }\n        //--- DROPBITS(2) ---//\n        hold >>>= 2;\n        bits -= 2;\n        //---//\n        break;\n      case STORED:\n        //--- BYTEBITS() ---// /* go to byte boundary */\n        hold >>>= bits & 7;\n        bits -= bits & 7;\n        //---//\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n          strm.msg = 'invalid stored block lengths';\n          state.mode = BAD;\n          break;\n        }\n        state.length = hold & 0xffff;\n        //Tracev((stderr, \"inflate:       stored length %u\\n\",\n        //        state.length));\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = COPY_;\n        if (flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case COPY_:\n        state.mode = COPY;\n        /* falls through */\n      case COPY:\n        copy = state.length;\n        if (copy) {\n          if (copy > have) { copy = have; }\n          if (copy > left) { copy = left; }\n          if (copy === 0) { break inf_leave; }\n          //--- zmemcpy(put, next, copy); ---\n          utils.arraySet(output, input, next, copy, put);\n          //---//\n          have -= copy;\n          next += copy;\n          left -= copy;\n          put += copy;\n          state.length -= copy;\n          break;\n        }\n        //Tracev((stderr, \"inflate:       stored end\\n\"));\n        state.mode = TYPE;\n        break;\n      case TABLE:\n        //=== NEEDBITS(14); */\n        while (bits < 14) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n        //--- DROPBITS(5) ---//\n        hold >>>= 5;\n        bits -= 5;\n        //---//\n        state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n        //--- DROPBITS(5) ---//\n        hold >>>= 5;\n        bits -= 5;\n        //---//\n        state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n        //--- DROPBITS(4) ---//\n        hold >>>= 4;\n        bits -= 4;\n        //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n        if (state.nlen > 286 || state.ndist > 30) {\n          strm.msg = 'too many length or distance symbols';\n          state.mode = BAD;\n          break;\n        }\n//#endif\n        //Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n        state.have = 0;\n        state.mode = LENLENS;\n        /* falls through */\n      case LENLENS:\n        while (state.have < state.ncode) {\n          //=== NEEDBITS(3);\n          while (bits < 3) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n          //--- DROPBITS(3) ---//\n          hold >>>= 3;\n          bits -= 3;\n          //---//\n        }\n        while (state.have < 19) {\n          state.lens[order[state.have++]] = 0;\n        }\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        //state.next = state.codes;\n        //state.lencode = state.next;\n        // Switch to use dynamic table\n        state.lencode = state.lendyn;\n        state.lenbits = 7;\n\n        opts = { bits: state.lenbits };\n        ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n        state.lenbits = opts.bits;\n\n        if (ret) {\n          strm.msg = 'invalid code lengths set';\n          state.mode = BAD;\n          break;\n        }\n        //Tracev((stderr, \"inflate:       code lengths ok\\n\"));\n        state.have = 0;\n        state.mode = CODELENS;\n        /* falls through */\n      case CODELENS:\n        while (state.have < state.nlen + state.ndist) {\n          for (;;) {\n            here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          if (here_val < 16) {\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            state.lens[state.have++] = here_val;\n          }\n          else {\n            if (here_val === 16) {\n              //=== NEEDBITS(here.bits + 2);\n              n = here_bits + 2;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              if (state.have === 0) {\n                strm.msg = 'invalid bit length repeat';\n                state.mode = BAD;\n                break;\n              }\n              len = state.lens[state.have - 1];\n              copy = 3 + (hold & 0x03);//BITS(2);\n              //--- DROPBITS(2) ---//\n              hold >>>= 2;\n              bits -= 2;\n              //---//\n            }\n            else if (here_val === 17) {\n              //=== NEEDBITS(here.bits + 3);\n              n = here_bits + 3;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              len = 0;\n              copy = 3 + (hold & 0x07);//BITS(3);\n              //--- DROPBITS(3) ---//\n              hold >>>= 3;\n              bits -= 3;\n              //---//\n            }\n            else {\n              //=== NEEDBITS(here.bits + 7);\n              n = here_bits + 7;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              len = 0;\n              copy = 11 + (hold & 0x7f);//BITS(7);\n              //--- DROPBITS(7) ---//\n              hold >>>= 7;\n              bits -= 7;\n              //---//\n            }\n            if (state.have + copy > state.nlen + state.ndist) {\n              strm.msg = 'invalid bit length repeat';\n              state.mode = BAD;\n              break;\n            }\n            while (copy--) {\n              state.lens[state.have++] = len;\n            }\n          }\n        }\n\n        /* handle error breaks in while */\n        if (state.mode === BAD) { break; }\n\n        /* check for end-of-block code (better have one) */\n        if (state.lens[256] === 0) {\n          strm.msg = 'invalid code -- missing end-of-block';\n          state.mode = BAD;\n          break;\n        }\n\n        /* build code tables -- note: do not change the lenbits or distbits\n           values here (9 and 6) without reading the comments in inftrees.h\n           concerning the ENOUGH constants, which depend on those values */\n        state.lenbits = 9;\n\n        opts = { bits: state.lenbits };\n        ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        // state.next_index = opts.table_index;\n        state.lenbits = opts.bits;\n        // state.lencode = state.next;\n\n        if (ret) {\n          strm.msg = 'invalid literal/lengths set';\n          state.mode = BAD;\n          break;\n        }\n\n        state.distbits = 6;\n        //state.distcode.copy(state.codes);\n        // Switch to use dynamic table\n        state.distcode = state.distdyn;\n        opts = { bits: state.distbits };\n        ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        // state.next_index = opts.table_index;\n        state.distbits = opts.bits;\n        // state.distcode = state.next;\n\n        if (ret) {\n          strm.msg = 'invalid distances set';\n          state.mode = BAD;\n          break;\n        }\n        //Tracev((stderr, 'inflate:       codes ok\\n'));\n        state.mode = LEN_;\n        if (flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case LEN_:\n        state.mode = LEN;\n        /* falls through */\n      case LEN:\n        if (have >= 6 && left >= 258) {\n          //--- RESTORE() ---\n          strm.next_out = put;\n          strm.avail_out = left;\n          strm.next_in = next;\n          strm.avail_in = have;\n          state.hold = hold;\n          state.bits = bits;\n          //---\n          inflate_fast(strm, _out);\n          //--- LOAD() ---\n          put = strm.next_out;\n          output = strm.output;\n          left = strm.avail_out;\n          next = strm.next_in;\n          input = strm.input;\n          have = strm.avail_in;\n          hold = state.hold;\n          bits = state.bits;\n          //---\n\n          if (state.mode === TYPE) {\n            state.back = -1;\n          }\n          break;\n        }\n        state.back = 0;\n        for (;;) {\n          here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if (here_bits <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if (here_op && (here_op & 0xf0) === 0) {\n          last_bits = here_bits;\n          last_op = here_op;\n          last_val = here_val;\n          for (;;) {\n            here = state.lencode[last_val +\n                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((last_bits + here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          //--- DROPBITS(last.bits) ---//\n          hold >>>= last_bits;\n          bits -= last_bits;\n          //---//\n          state.back += last_bits;\n        }\n        //--- DROPBITS(here.bits) ---//\n        hold >>>= here_bits;\n        bits -= here_bits;\n        //---//\n        state.back += here_bits;\n        state.length = here_val;\n        if (here_op === 0) {\n          //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n          //        \"inflate:         literal '%c'\\n\" :\n          //        \"inflate:         literal 0x%02x\\n\", here.val));\n          state.mode = LIT;\n          break;\n        }\n        if (here_op & 32) {\n          //Tracevv((stderr, \"inflate:         end of block\\n\"));\n          state.back = -1;\n          state.mode = TYPE;\n          break;\n        }\n        if (here_op & 64) {\n          strm.msg = 'invalid literal/length code';\n          state.mode = BAD;\n          break;\n        }\n        state.extra = here_op & 15;\n        state.mode = LENEXT;\n        /* falls through */\n      case LENEXT:\n        if (state.extra) {\n          //=== NEEDBITS(state.extra);\n          n = state.extra;\n          while (bits < n) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n          //--- DROPBITS(state.extra) ---//\n          hold >>>= state.extra;\n          bits -= state.extra;\n          //---//\n          state.back += state.extra;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", state.length));\n        state.was = state.length;\n        state.mode = DIST;\n        /* falls through */\n      case DIST:\n        for (;;) {\n          here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if ((here_op & 0xf0) === 0) {\n          last_bits = here_bits;\n          last_op = here_op;\n          last_val = here_val;\n          for (;;) {\n            here = state.distcode[last_val +\n                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((last_bits + here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          //--- DROPBITS(last.bits) ---//\n          hold >>>= last_bits;\n          bits -= last_bits;\n          //---//\n          state.back += last_bits;\n        }\n        //--- DROPBITS(here.bits) ---//\n        hold >>>= here_bits;\n        bits -= here_bits;\n        //---//\n        state.back += here_bits;\n        if (here_op & 64) {\n          strm.msg = 'invalid distance code';\n          state.mode = BAD;\n          break;\n        }\n        state.offset = here_val;\n        state.extra = (here_op) & 15;\n        state.mode = DISTEXT;\n        /* falls through */\n      case DISTEXT:\n        if (state.extra) {\n          //=== NEEDBITS(state.extra);\n          n = state.extra;\n          while (bits < n) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n          //--- DROPBITS(state.extra) ---//\n          hold >>>= state.extra;\n          bits -= state.extra;\n          //---//\n          state.back += state.extra;\n        }\n//#ifdef INFLATE_STRICT\n        if (state.offset > state.dmax) {\n          strm.msg = 'invalid distance too far back';\n          state.mode = BAD;\n          break;\n        }\n//#endif\n        //Tracevv((stderr, \"inflate:         distance %u\\n\", state.offset));\n        state.mode = MATCH;\n        /* falls through */\n      case MATCH:\n        if (left === 0) { break inf_leave; }\n        copy = _out - left;\n        if (state.offset > copy) {         /* copy from window */\n          copy = state.offset - copy;\n          if (copy > state.whave) {\n            if (state.sane) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD;\n              break;\n            }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//          Trace((stderr, \"inflate.c too far\\n\"));\n//          copy -= state.whave;\n//          if (copy > state.length) { copy = state.length; }\n//          if (copy > left) { copy = left; }\n//          left -= copy;\n//          state.length -= copy;\n//          do {\n//            output[put++] = 0;\n//          } while (--copy);\n//          if (state.length === 0) { state.mode = LEN; }\n//          break;\n//#endif\n          }\n          if (copy > state.wnext) {\n            copy -= state.wnext;\n            from = state.wsize - copy;\n          }\n          else {\n            from = state.wnext - copy;\n          }\n          if (copy > state.length) { copy = state.length; }\n          from_source = state.window;\n        }\n        else {                              /* copy from output */\n          from_source = output;\n          from = put - state.offset;\n          copy = state.length;\n        }\n        if (copy > left) { copy = left; }\n        left -= copy;\n        state.length -= copy;\n        do {\n          output[put++] = from_source[from++];\n        } while (--copy);\n        if (state.length === 0) { state.mode = LEN; }\n        break;\n      case LIT:\n        if (left === 0) { break inf_leave; }\n        output[put++] = state.length;\n        left--;\n        state.mode = LEN;\n        break;\n      case CHECK:\n        if (state.wrap) {\n          //=== NEEDBITS(32);\n          while (bits < 32) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            // Use '|' instead of '+' to make sure that result is signed\n            hold |= input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          _out -= left;\n          strm.total_out += _out;\n          state.total += _out;\n          if (_out) {\n            strm.adler = state.check =\n                /*UPDATE(state.check, put - _out, _out);*/\n                (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));\n\n          }\n          _out = left;\n          // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n          if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n            strm.msg = 'incorrect data check';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          //Tracev((stderr, \"inflate:   check matches trailer\\n\"));\n        }\n        state.mode = LENGTH;\n        /* falls through */\n      case LENGTH:\n        if (state.wrap && state.flags) {\n          //=== NEEDBITS(32);\n          while (bits < 32) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          if (hold !== (state.total & 0xffffffff)) {\n            strm.msg = 'incorrect length check';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          //Tracev((stderr, \"inflate:   length matches trailer\\n\"));\n        }\n        state.mode = DONE;\n        /* falls through */\n      case DONE:\n        ret = Z_STREAM_END;\n        break inf_leave;\n      case BAD:\n        ret = Z_DATA_ERROR;\n        break inf_leave;\n      case MEM:\n        return Z_MEM_ERROR;\n      case SYNC:\n        /* falls through */\n      default:\n        return Z_STREAM_ERROR;\n    }\n  }\n\n  // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n  /*\n     Return from inflate(), updating the total counts and the check value.\n     If there was no progress during the inflate() call, return a buffer\n     error.  Call updatewindow() to create and/or update the window state.\n     Note: a memory error from inflate() is non-recoverable.\n   */\n\n  //--- RESTORE() ---\n  strm.next_out = put;\n  strm.avail_out = left;\n  strm.next_in = next;\n  strm.avail_in = have;\n  state.hold = hold;\n  state.bits = bits;\n  //---\n\n  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n                      (state.mode < CHECK || flush !== Z_FINISH))) {\n    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {\n      state.mode = MEM;\n      return Z_MEM_ERROR;\n    }\n  }\n  _in -= strm.avail_in;\n  _out -= strm.avail_out;\n  strm.total_in += _in;\n  strm.total_out += _out;\n  state.total += _out;\n  if (state.wrap && _out) {\n    strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n      (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));\n  }\n  strm.data_type = state.bits + (state.last ? 64 : 0) +\n                    (state.mode === TYPE ? 128 : 0) +\n                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n  if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {\n    ret = Z_BUF_ERROR;\n  }\n  return ret;\n}\n\nfunction inflateEnd(strm) {\n\n  if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  var state = strm.state;\n  if (state.window) {\n    state.window = null;\n  }\n  strm.state = null;\n  return Z_OK;\n}\n\nfunction inflateGetHeader(strm, head) {\n  var state;\n\n  /* check state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }\n\n  /* save header structure */\n  state.head = head;\n  head.done = false;\n  return Z_OK;\n}\n\nfunction inflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var state;\n  var dictid;\n  var ret;\n\n  /* check state */\n  if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  if (state.wrap !== 0 && state.mode !== DICT) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* check for correct dictionary identifier */\n  if (state.mode === DICT) {\n    dictid = 1; /* adler32(0, null, 0)*/\n    /* dictid = adler32(dictid, dictionary, dictLength); */\n    dictid = adler32(dictid, dictionary, dictLength, 0);\n    if (dictid !== state.check) {\n      return Z_DATA_ERROR;\n    }\n  }\n  /* copy dictionary to window using updatewindow(), which will amend the\n   existing dictionary if appropriate */\n  ret = updatewindow(strm, dictionary, dictLength, dictLength);\n  if (ret) {\n    state.mode = MEM;\n    return Z_MEM_ERROR;\n  }\n  state.havedict = 1;\n  // Tracev((stderr, \"inflate:   dictionary set\\n\"));\n  return Z_OK;\n}\n\nexports.inflateReset = inflateReset;\nexports.inflateReset2 = inflateReset2;\nexports.inflateResetKeep = inflateResetKeep;\nexports.inflateInit = inflateInit;\nexports.inflateInit2 = inflateInit2;\nexports.inflate = inflate;\nexports.inflateEnd = inflateEnd;\nexports.inflateGetHeader = inflateGetHeader;\nexports.inflateSetDictionary = inflateSetDictionary;\nexports.inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nexports.inflateCopy = inflateCopy;\nexports.inflateGetDictionary = inflateGetDictionary;\nexports.inflateMark = inflateMark;\nexports.inflatePrime = inflatePrime;\nexports.inflateSync = inflateSync;\nexports.inflateSyncPoint = inflateSyncPoint;\nexports.inflateUndermine = inflateUndermine;\n*/\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n\n  /* Allowed flush values; see deflate() and inflate() below for details */\n  Z_NO_FLUSH:         0,\n  Z_PARTIAL_FLUSH:    1,\n  Z_SYNC_FLUSH:       2,\n  Z_FULL_FLUSH:       3,\n  Z_FINISH:           4,\n  Z_BLOCK:            5,\n  Z_TREES:            6,\n\n  /* Return codes for the compression/decompression functions. Negative values\n  * are errors, positive values are used for special but normal events.\n  */\n  Z_OK:               0,\n  Z_STREAM_END:       1,\n  Z_NEED_DICT:        2,\n  Z_ERRNO:           -1,\n  Z_STREAM_ERROR:    -2,\n  Z_DATA_ERROR:      -3,\n  //Z_MEM_ERROR:     -4,\n  Z_BUF_ERROR:       -5,\n  //Z_VERSION_ERROR: -6,\n\n  /* compression levels */\n  Z_NO_COMPRESSION:         0,\n  Z_BEST_SPEED:             1,\n  Z_BEST_COMPRESSION:       9,\n  Z_DEFAULT_COMPRESSION:   -1,\n\n\n  Z_FILTERED:               1,\n  Z_HUFFMAN_ONLY:           2,\n  Z_RLE:                    3,\n  Z_FIXED:                  4,\n  Z_DEFAULT_STRATEGY:       0,\n\n  /* Possible values of the data_type field (though see inflate()) */\n  Z_BINARY:                 0,\n  Z_TEXT:                   1,\n  //Z_ASCII:                1, // = Z_TEXT (deprecated)\n  Z_UNKNOWN:                2,\n\n  /* The deflate compression method */\n  Z_DEFLATED:               8\n  //Z_NULL:                 null // Use -1 or null inline, depending on var type\n};\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n  /* true if compressed data believed to be text */\n  this.text       = 0;\n  /* modification time */\n  this.time       = 0;\n  /* extra flags (not used when writing a gzip file) */\n  this.xflags     = 0;\n  /* operating system */\n  this.os         = 0;\n  /* pointer to extra field or Z_NULL if none */\n  this.extra      = null;\n  /* extra field length (valid if extra != Z_NULL) */\n  this.extra_len  = 0; // Actually, we don't need it in JS,\n                       // but leave for few code modifications\n\n  //\n  // Setup limits is not necessary because in js we should not preallocate memory\n  // for inflate use constant limit in 65536 bytes\n  //\n\n  /* space at extra (only when reading header) */\n  // this.extra_max  = 0;\n  /* pointer to zero-terminated file name or Z_NULL */\n  this.name       = '';\n  /* space at name (only when reading header) */\n  // this.name_max   = 0;\n  /* pointer to zero-terminated comment or Z_NULL */\n  this.comment    = '';\n  /* space at comment (only when reading header) */\n  // this.comm_max   = 0;\n  /* true if there was or will be a header crc */\n  this.hcrc       = 0;\n  /* true when done reading gzip header (not used when writing a gzip file) */\n  this.done       = false;\n}\n\nmodule.exports = GZheader;\n","'use strict';\n\n\nvar zlib_inflate = require('./zlib/inflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar c            = require('./zlib/constants');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\nvar GZheader     = require('./zlib/gzheader');\n\nvar toString = Object.prototype.toString;\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you\n * push a chunk with explicit flush (call [[Inflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true);  // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate(options) {\n  if (!(this instanceof Inflate)) return new Inflate(options);\n\n  this.options = utils.assign({\n    chunkSize: 16384,\n    windowBits: 0,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  // Force window size for `raw` data, if not set directly,\n  // because we have no header for autodetect.\n  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n    opt.windowBits = -opt.windowBits;\n    if (opt.windowBits === 0) { opt.windowBits = -15; }\n  }\n\n  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n      !(options && options.windowBits)) {\n    opt.windowBits += 32;\n  }\n\n  // Gzip header has no info about windows size, we can do autodetect only\n  // for deflate. So, if window size not set, force it to max when gzip possible\n  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n    // bit 3 (16) -> gzipped data\n    // bit 4 (32) -> autodetect gzip/deflate\n    if ((opt.windowBits & 15) === 0) {\n      opt.windowBits |= 15;\n    }\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm   = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status  = zlib_inflate.inflateInit2(\n    this.strm,\n    opt.windowBits\n  );\n\n  if (status !== c.Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  this.header = new GZheader();\n\n  zlib_inflate.inflateGetHeader(this.strm, this.header);\n\n  // Setup dictionary\n  if (opt.dictionary) {\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      opt.dictionary = strings.string2buf(opt.dictionary);\n    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n      opt.dictionary = new Uint8Array(opt.dictionary);\n    }\n    if (opt.raw) { //In raw mode we need to set the dictionary early\n      status = zlib_inflate.inflateSetDictionary(this.strm, opt.dictionary);\n      if (status !== c.Z_OK) {\n        throw new Error(msg[status]);\n      }\n    }\n  }\n}\n\n/**\n * Inflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the decompression context.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nInflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var dictionary = this.options.dictionary;\n  var status, _mode;\n  var next_out_utf8, tail, utf8str;\n\n  // Flag to properly process Z_BUF_ERROR on testing inflate call\n  // when we check that all output data was flushed.\n  var allowBufError = false;\n\n  if (this.ended) { return false; }\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // Only binary strings can be decompressed on practice\n    strm.input = strings.binstring2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n\n    status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */\n\n    if (status === c.Z_NEED_DICT && dictionary) {\n      status = zlib_inflate.inflateSetDictionary(this.strm, dictionary);\n    }\n\n    if (status === c.Z_BUF_ERROR && allowBufError === true) {\n      status = c.Z_OK;\n      allowBufError = false;\n    }\n\n    if (status !== c.Z_STREAM_END && status !== c.Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n\n    if (strm.next_out) {\n      if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {\n\n        if (this.options.to === 'string') {\n\n          next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n          tail = strm.next_out - next_out_utf8;\n          utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n          // move tail\n          strm.next_out = tail;\n          strm.avail_out = chunkSize - tail;\n          if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }\n\n          this.onData(utf8str);\n\n        } else {\n          this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n        }\n      }\n    }\n\n    // When no more input data, we should check that internal inflate buffers\n    // are flushed. The only way to do it when avail_out = 0 - run one more\n    // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.\n    // Here we set flag to process this error properly.\n    //\n    // NOTE. Deflate does not return error in this case and does not needs such\n    // logic.\n    if (strm.avail_in === 0 && strm.avail_out === 0) {\n      allowBufError = true;\n    }\n\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);\n\n  if (status === c.Z_STREAM_END) {\n    _mode = c.Z_FINISH;\n  }\n\n  // Finalize on the last chunk.\n  if (_mode === c.Z_FINISH) {\n    status = zlib_inflate.inflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === c.Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === c.Z_SYNC_FLUSH) {\n    this.onEnd(c.Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): output data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === c.Z_OK) {\n    if (this.options.to === 'string') {\n      // Glue & convert here, until we teach pako to send\n      // utf8 aligned strings to onData\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])\n *   , output;\n *\n * try {\n *   output = pako.inflate(input);\n * } catch (err)\n *   console.log(err);\n * }\n * ```\n **/\nfunction inflate(input, options) {\n  var inflator = new Inflate(options);\n\n  inflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (inflator.err) { throw inflator.msg || msg[inflator.err]; }\n\n  return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return inflate(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nexports.Inflate = Inflate;\nexports.inflate = inflate;\nexports.inflateRaw = inflateRaw;\nexports.ungzip  = inflate;\n","// Top level file is just a mixin of submodules & constants\n'use strict';\n\nvar assign    = require('./lib/utils/common').assign;\n\nvar deflate   = require('./lib/deflate');\nvar inflate   = require('./lib/inflate');\nvar constants = require('./lib/zlib/constants');\n\nvar pako = {};\n\nassign(pako, deflate, inflate, constants);\n\nmodule.exports = pako;\n","\n\n\n\n;(function(){\nvar UTIF = {};\n\n// Make available for import by `require()`\nif (typeof module == \"object\") {module.exports = UTIF;}\nelse {self.UTIF = UTIF;}\n\nvar pako;\nif (typeof require == \"function\") {pako = require(\"pako\");}\nelse {pako = self.pako;}\n\nfunction log() { if (typeof process==\"undefined\" || process.env.NODE_ENV==\"development\") console.log.apply(console, arguments);  }\n\n(function(UTIF, pako){\n\t\n// Following lines add a JPEG decoder  to UTIF.JpegDecoder\n(function(){var V=\"function\"===typeof Symbol&&\"symbol\"===typeof Symbol.iterator?function(g){return typeof g}:function(g){return g&&\"function\"===typeof Symbol&&g.constructor===Symbol&&g!==Symbol.prototype?\"symbol\":typeof g},D=function(){function g(g){this.message=\"JPEG error: \"+g}g.prototype=Error();g.prototype.name=\"JpegError\";return g.constructor=g}(),P=function(){function g(g,D){this.message=g;this.g=D}g.prototype=Error();g.prototype.name=\"DNLMarkerError\";return g.constructor=g}();(function(){function g(){this.M=\nnull;this.B=-1}function W(a,d){for(var f=0,e=[],b,B,k=16;0<k&&!a[k-1];)k--;e.push({children:[],index:0});var l=e[0],r;for(b=0;b<k;b++){for(B=0;B<a[b];B++){l=e.pop();for(l.children[l.index]=d[f];0<l.index;)l=e.pop();l.index++;for(e.push(l);e.length<=b;)e.push(r={children:[],index:0}),l.children[l.index]=r.children,l=r;f++}b+1<k&&(e.push(r={children:[],index:0}),l.children[l.index]=r.children,l=r)}return e[0].children}function X(a,d,f,e,b,B,k,l,r){function n(){if(0<x)return x--,z>>x&1;z=a[d++];if(255===\nz){var c=a[d++];if(c){if(220===c&&g){d+=2;var b=a[d++]<<8|a[d++];if(0<b&&b!==f.g)throw new P(\"Found DNL marker (0xFFDC) while parsing scan data\",b);}throw new D(\"unexpected marker \"+(z<<8|c).toString(16));}}x=7;return z>>>7}function q(a){for(;;){a=a[n()];if(\"number\"===typeof a)return a;if(\"object\"!==(\"undefined\"===typeof a?\"undefined\":V(a)))throw new D(\"invalid huffman sequence\");}}function h(a){for(var c=0;0<a;)c=c<<1|n(),a--;return c}function c(a){if(1===a)return 1===n()?1:-1;var c=h(a);return c>=\n1<<a-1?c:c+(-1<<a)+1}function C(a,b){var d=q(a.D);d=0===d?0:c(d);a.a[b]=a.m+=d;for(d=1;64>d;){var h=q(a.o),k=h&15;h>>=4;if(0===k){if(15>h)break;d+=16}else d+=h,a.a[b+J[d]]=c(k),d++}}function w(a,d){var b=q(a.D);b=0===b?0:c(b)<<r;a.a[d]=a.m+=b}function p(a,c){a.a[c]|=n()<<r}function m(a,b){if(0<A)A--;else for(var d=B;d<=k;){var e=q(a.o),f=e&15;e>>=4;if(0===f){if(15>e){A=h(e)+(1<<e)-1;break}d+=16}else d+=e,a.a[b+J[d]]=c(f)*(1<<r),d++}}function t(a,d){for(var b=B,e=0,f;b<=k;){f=d+J[b];var l=0>a.a[f]?\n-1:1;switch(E){case 0:e=q(a.o);f=e&15;e>>=4;if(0===f)15>e?(A=h(e)+(1<<e),E=4):(e=16,E=1);else{if(1!==f)throw new D(\"invalid ACn encoding\");Q=c(f);E=e?2:3}continue;case 1:case 2:a.a[f]?a.a[f]+=l*(n()<<r):(e--,0===e&&(E=2===E?3:0));break;case 3:a.a[f]?a.a[f]+=l*(n()<<r):(a.a[f]=Q<<r,E=0);break;case 4:a.a[f]&&(a.a[f]+=l*(n()<<r))}b++}4===E&&(A--,0===A&&(E=0))}var g=9<arguments.length&&void 0!==arguments[9]?arguments[9]:!1,u=f.P,v=d,z=0,x=0,A=0,E=0,Q,K=e.length,F,L,M,I;var R=f.S?0===B?0===l?w:p:0===l?\nm:t:C;var G=0;var O=1===K?e[0].c*e[0].l:u*f.O;for(var S,T;G<O;){var U=b?Math.min(O-G,b):O;for(F=0;F<K;F++)e[F].m=0;A=0;if(1===K){var y=e[0];for(I=0;I<U;I++)R(y,64*((y.c+1)*(G/y.c|0)+G%y.c)),G++}else for(I=0;I<U;I++){for(F=0;F<K;F++)for(y=e[F],S=y.h,T=y.j,L=0;L<T;L++)for(M=0;M<S;M++)R(y,64*((y.c+1)*((G/u|0)*y.j+L)+(G%u*y.h+M)));G++}x=0;(y=N(a,d))&&y.f&&((0,_util.warn)(\"decodeScan - unexpected MCU data, current marker is: \"+y.f),d=y.offset);y=y&&y.F;if(!y||65280>=y)throw new D(\"marker was not found\");\nif(65488<=y&&65495>=y)d+=2;else break}(y=N(a,d))&&y.f&&((0,_util.warn)(\"decodeScan - unexpected Scan data, current marker is: \"+y.f),d=y.offset);return d-v}function Y(a,d){for(var f=d.c,e=d.l,b=new Int16Array(64),B=0;B<e;B++)for(var k=0;k<f;k++){var l=64*((d.c+1)*B+k),r=b,n=d.G,q=d.a;if(!n)throw new D(\"missing required Quantization Table.\");for(var h=0;64>h;h+=8){var c=q[l+h];var C=q[l+h+1];var w=q[l+h+2];var p=q[l+h+3];var m=q[l+h+4];var t=q[l+h+5];var g=q[l+h+6];var u=q[l+h+7];c*=n[h];if(0===(C|\nw|p|m|t|g|u))c=5793*c+512>>10,r[h]=c,r[h+1]=c,r[h+2]=c,r[h+3]=c,r[h+4]=c,r[h+5]=c,r[h+6]=c,r[h+7]=c;else{C*=n[h+1];w*=n[h+2];p*=n[h+3];m*=n[h+4];t*=n[h+5];g*=n[h+6];u*=n[h+7];var v=5793*c+128>>8;var z=5793*m+128>>8;var x=w;var A=g;m=2896*(C-u)+128>>8;u=2896*(C+u)+128>>8;p<<=4;t<<=4;v=v+z+1>>1;z=v-z;c=3784*x+1567*A+128>>8;x=1567*x-3784*A+128>>8;A=c;m=m+t+1>>1;t=m-t;u=u+p+1>>1;p=u-p;v=v+A+1>>1;A=v-A;z=z+x+1>>1;x=z-x;c=2276*m+3406*u+2048>>12;m=3406*m-2276*u+2048>>12;u=c;c=799*p+4017*t+2048>>12;p=4017*\np-799*t+2048>>12;t=c;r[h]=v+u;r[h+7]=v-u;r[h+1]=z+t;r[h+6]=z-t;r[h+2]=x+p;r[h+5]=x-p;r[h+3]=A+m;r[h+4]=A-m}}for(n=0;8>n;++n)c=r[n],C=r[n+8],w=r[n+16],p=r[n+24],m=r[n+32],t=r[n+40],g=r[n+48],u=r[n+56],0===(C|w|p|m|t|g|u)?(c=5793*c+8192>>14,c=-2040>c?0:2024<=c?255:c+2056>>4,q[l+n]=c,q[l+n+8]=c,q[l+n+16]=c,q[l+n+24]=c,q[l+n+32]=c,q[l+n+40]=c,q[l+n+48]=c,q[l+n+56]=c):(v=5793*c+2048>>12,z=5793*m+2048>>12,x=w,A=g,m=2896*(C-u)+2048>>12,u=2896*(C+u)+2048>>12,v=(v+z+1>>1)+4112,z=v-z,c=3784*x+1567*A+2048>>\n12,x=1567*x-3784*A+2048>>12,A=c,m=m+t+1>>1,t=m-t,u=u+p+1>>1,p=u-p,v=v+A+1>>1,A=v-A,z=z+x+1>>1,x=z-x,c=2276*m+3406*u+2048>>12,m=3406*m-2276*u+2048>>12,u=c,c=799*p+4017*t+2048>>12,p=4017*p-799*t+2048>>12,t=c,c=v+u,u=v-u,C=z+t,g=z-t,w=x+p,t=x-p,p=A+m,m=A-m,c=16>c?0:4080<=c?255:c>>4,C=16>C?0:4080<=C?255:C>>4,w=16>w?0:4080<=w?255:w>>4,p=16>p?0:4080<=p?255:p>>4,m=16>m?0:4080<=m?255:m>>4,t=16>t?0:4080<=t?255:t>>4,g=16>g?0:4080<=g?255:g>>4,u=16>u?0:4080<=u?255:u>>4,q[l+n]=c,q[l+n+8]=C,q[l+n+16]=w,q[l+n+24]=\np,q[l+n+32]=m,q[l+n+40]=t,q[l+n+48]=g,q[l+n+56]=u)}return d.a}function N(a,d){var f=2<arguments.length&&void 0!==arguments[2]?arguments[2]:d,e=a.length-1;f=f<d?f:d;if(d>=e)return null;var b=a[d]<<8|a[d+1];if(65472<=b&&65534>=b)return{f:null,F:b,offset:d};for(var B=a[f]<<8|a[f+1];!(65472<=B&&65534>=B);){if(++f>=e)return null;B=a[f]<<8|a[f+1]}return{f:b.toString(16),F:B,offset:f}}var J=new Uint8Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,\n57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]);g.prototype={parse:function(a){function d(){var d=a[k]<<8|a[k+1];k+=2;return d}function f(){var b=d();b=k+b-2;var c=N(a,b,k);c&&c.f&&((0,_util.warn)(\"readDataBlock - incorrect length, current marker is: \"+c.f),b=c.offset);b=a.subarray(k,b);k+=b.length;return b}function e(a){for(var b=Math.ceil(a.v/8/a.s),c=Math.ceil(a.g/8/a.u),d=0;d<a.b.length;d++){v=a.b[d];var e=Math.ceil(Math.ceil(a.v/8)*v.h/a.s),f=Math.ceil(Math.ceil(a.g/\n8)*v.j/a.u);v.a=new Int16Array(64*c*v.j*(b*v.h+1));v.c=e;v.l=f}a.P=b;a.O=c}var b=(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).N,B=void 0===b?null:b,k=0,l=null,r=0;b=[];var n=[],q=[],h=d();if(65496!==h)throw new D(\"SOI not found\");for(h=d();65497!==h;){switch(h){case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:case 65534:var c=f();65518===h&&65===c[0]&&100===\nc[1]&&111===c[2]&&98===c[3]&&101===c[4]&&(l={version:c[5]<<8|c[6],Y:c[7]<<8|c[8],Z:c[9]<<8|c[10],W:c[11]});break;case 65499:h=d()+k-2;for(var g;k<h;){var w=a[k++],p=new Uint16Array(64);if(0===w>>4)for(c=0;64>c;c++)g=J[c],p[g]=a[k++];else if(1===w>>4)for(c=0;64>c;c++)g=J[c],p[g]=d();else throw new D(\"DQT - invalid table spec\");b[w&15]=p}break;case 65472:case 65473:case 65474:if(m)throw new D(\"Only single frame JPEGs supported\");d();var m={};m.X=65473===h;m.S=65474===h;m.precision=a[k++];h=d();m.g=\nB||h;m.v=d();m.b=[];m.C={};c=a[k++];for(h=p=w=0;h<c;h++){g=a[k];var t=a[k+1]>>4;var H=a[k+1]&15;w<t&&(w=t);p<H&&(p=H);t=m.b.push({h:t,j:H,T:a[k+2],G:null});m.C[g]=t-1;k+=3}m.s=w;m.u=p;e(m);break;case 65476:g=d();for(h=2;h<g;){w=a[k++];p=new Uint8Array(16);for(c=t=0;16>c;c++,k++)t+=p[c]=a[k];H=new Uint8Array(t);for(c=0;c<t;c++,k++)H[c]=a[k];h+=17+t;(0===w>>4?q:n)[w&15]=W(p,H)}break;case 65501:d();var u=d();break;case 65498:c=1===++r&&!B;d();w=a[k++];g=[];for(h=0;h<w;h++){p=m.C[a[k++]];var v=m.b[p];\np=a[k++];v.D=q[p>>4];v.o=n[p&15];g.push(v)}h=a[k++];w=a[k++];p=a[k++];try{var z=X(a,k,m,g,u,h,w,p>>4,p&15,c);k+=z}catch(x){if(x instanceof P)return(0,_util.warn)('Attempting to re-parse JPEG image using \"scanLines\" parameter found in DNL marker (0xFFDC) segment.'),this.parse(a,{N:x.g});throw x;}break;case 65500:k+=4;break;case 65535:255!==a[k]&&k--;break;default:if(255===a[k-3]&&192<=a[k-2]&&254>=a[k-2])k-=3;else if((c=N(a,k-2))&&c.f)(0,_util.warn)(\"JpegImage.parse - unexpected data, current marker is: \"+\nc.f),k=c.offset;else throw new D(\"unknown marker \"+h.toString(16));}h=d()}this.width=m.v;this.height=m.g;this.A=l;this.b=[];for(h=0;h<m.b.length;h++){v=m.b[h];if(u=b[v.T])v.G=u;this.b.push({R:Y(m,v),U:v.h/m.s,V:v.j/m.u,c:v.c,l:v.l})}this.i=this.b.length},L:function(a,d){var f=this.width/a,e=this.height/d,b,g,k=this.b.length,l=a*d*k,r=new Uint8ClampedArray(l),n=new Uint32Array(a);for(g=0;g<k;g++){var q=this.b[g];var h=q.U*f;var c=q.V*e;var C=g;var w=q.R;var p=q.c+1<<3;for(b=0;b<a;b++)q=0|b*h,n[b]=\n(q&4294967288)<<3|q&7;for(h=0;h<d;h++)for(q=0|h*c,q=p*(q&4294967288)|(q&7)<<3,b=0;b<a;b++)r[C]=w[q+n[b]],C+=k}if(e=this.M)for(g=0;g<l;)for(f=q=0;q<k;q++,g++,f+=2)r[g]=(r[g]*e[f]>>8)+e[f+1];return r},w:function(){return this.A?!!this.A.W:3===this.i?0===this.B?!1:!0:1===this.B?!0:!1},I:function(a){for(var d,f,e,b=0,g=a.length;b<g;b+=3)d=a[b],f=a[b+1],e=a[b+2],a[b]=d-179.456+1.402*e,a[b+1]=d+135.459-.344*f-.714*e,a[b+2]=d-226.816+1.772*f;return a},K:function(a){for(var d,f,e,b,g=0,k=0,l=a.length;k<l;k+=\n4)d=a[k],f=a[k+1],e=a[k+2],b=a[k+3],a[g++]=-122.67195406894+f*(-6.60635669420364E-5*f+4.37130475926232E-4*e-5.4080610064599E-5*d+4.8449797120281E-4*b-.154362151871126)+e*(-9.57964378445773E-4*e+8.17076911346625E-4*d-.00477271405408747*b+1.53380253221734)+d*(9.61250184130688E-4*d-.00266257332283933*b+.48357088451265)+b*(-3.36197177618394E-4*b+.484791561490776),a[g++]=107.268039397724+f*(2.19927104525741E-5*f-6.40992018297945E-4*e+6.59397001245577E-4*d+4.26105652938837E-4*b-.176491792462875)+e*(-7.78269941513683E-4*\ne+.00130872261408275*d+7.70482631801132E-4*b-.151051492775562)+d*(.00126935368114843*d-.00265090189010898*b+.25802910206845)+b*(-3.18913117588328E-4*b-.213742400323665),a[g++]=-20.810012546947+f*(-5.70115196973677E-4*f-2.63409051004589E-5*e+.0020741088115012*d-.00288260236853442*b+.814272968359295)+e*(-1.53496057440975E-5*e-1.32689043961446E-4*d+5.60833691242812E-4*b-.195152027534049)+d*(.00174418132927582*d-.00255243321439347*b+.116935020465145)+b*(-3.43531996510555E-4*b+.24165260232407);return a.subarray(0,\ng)},J:function(a){for(var d,f,e,b=0,g=a.length;b<g;b+=4)d=a[b],f=a[b+1],e=a[b+2],a[b]=434.456-d-1.402*e,a[b+1]=119.541-d+.344*f+.714*e,a[b+2]=481.816-d-1.772*f;return a},H:function(a){for(var d,f,e,b,g=0,k=1/255,l=0,r=a.length;l<r;l+=4)d=a[l]*k,f=a[l+1]*k,e=a[l+2]*k,b=a[l+3]*k,a[g++]=255+d*(-4.387332384609988*d+54.48615194189176*f+18.82290502165302*e+212.25662451639585*b-285.2331026137004)+f*(1.7149763477362134*f-5.6096736904047315*e-17.873870861415444*b-5.497006427196366)+e*(-2.5217340131683033*\ne-21.248923337353073*b+17.5119270841813)-b*(21.86122147463605*b+189.48180835922747),a[g++]=255+d*(8.841041422036149*d+60.118027045597366*f+6.871425592049007*e+31.159100130055922*b-79.2970844816548)+f*(-15.310361306967817*f+17.575251261109482*e+131.35250912493976*b-190.9453302588951)+e*(4.444339102852739*e+9.8632861493405*b-24.86741582555878)-b*(20.737325471181034*b+187.80453709719578),a[g++]=255+d*(.8842522430003296*d+8.078677503112928*f+30.89978309703729*e-.23883238689178934*b-14.183576799673286)+\nf*(10.49593273432072*f+63.02378494754052*e+50.606957656360734*b-112.23884253719248)+e*(.03296041114873217*e+115.60384449646641*b-193.58209356861505)-b*(22.33816807309886*b+180.12613974708367);return a.subarray(0,g)},getData:function(a,d,f){if(4<this.i)throw new D(\"Unsupported color mode\");a=this.L(a,d);if(1===this.i&&f){f=a.length;d=new Uint8ClampedArray(3*f);for(var e=0,b=0;b<f;b++){var g=a[b];d[e++]=g;d[e++]=g;d[e++]=g}return d}if(3===this.i&&this.w())return this.I(a);if(4===this.i){if(this.w())return f?\nthis.K(a):this.J(a);if(f)return this.H(a)}return a}}; UTIF.JpegDecoder=g})()})();\n\n//UTIF.JpegDecoder = PDFJS.JpegImage;\n\n\nUTIF.encodeImage = function(rgba, w, h, metadata)\n{\n\tvar idf = { \"t256\":[w], \"t257\":[h], \"t258\":[8,8,8,8], \"t259\":[1], \"t262\":[2], \"t273\":[1000], // strips offset\n\t\t\t\t\"t277\":[4], \"t278\":[h], /* rows per strip */          \"t279\":[w*h*4], // strip byte counts\n\t\t\t\t\"t282\":[1], \"t283\":[1], \"t284\":[1], \"t286\":[0], \"t287\":[0], \"t296\":[1], \"t305\": [\"Photopea (UTIF.js)\"], \"t338\":[1]\n\t\t};\n\tif (metadata) for (var i in metadata) idf[i] = metadata[i];\n\t\n\tvar prfx = new Uint8Array(UTIF.encode([idf]));\n\tvar img = new Uint8Array(rgba);\n\tvar data = new Uint8Array(1000+w*h*4);\n\tfor(var i=0; i<prfx.length; i++) data[i] = prfx[i];\n\tfor(var i=0; i<img .length; i++) data[1000+i] = img[i];\n\treturn data.buffer;\n}\n\nUTIF.encode = function(ifds)\n{\n\tvar data = new Uint8Array(20000), offset = 4, bin = UTIF._binBE;\n\tdata[0]=77;  data[1]=77;  data[3]=42;\n\n\tvar ifdo = 8;\n\tbin.writeUint(data, offset, ifdo);  offset+=4;\n\tfor(var i=0; i<ifds.length; i++)\n\t{\n\t\tvar noffs = UTIF._writeIFD(bin, data, ifdo, ifds[i]);\n\t\tifdo = noffs[1];\n\t\tif(i<ifds.length-1) bin.writeUint(data, noffs[0], ifdo);\n\t}\n\treturn data.slice(0, ifdo).buffer;\n}\n//UTIF.encode._writeIFD\n\nUTIF.decode = function(buff)\n{\n\tUTIF.decode._decodeG3.allow2D = null;\n\tvar data = new Uint8Array(buff), offset = 0;\n\n\tvar id = UTIF._binBE.readASCII(data, offset, 2);  offset+=2;\n\tvar bin = id==\"II\" ? UTIF._binLE : UTIF._binBE;\n\tvar num = bin.readUshort(data, offset);  offset+=2;\n\n\tvar ifdo = bin.readUint(data, offset);  offset+=4;\n\tvar ifds = [];\n\twhile(true) {\n\t\tvar noff = UTIF._readIFD(bin, data, ifdo, ifds, 0, false);\n\t\tifdo = bin.readUint(data, noff);\n\t\tif(ifdo==0) break;\n\t}\n\treturn ifds;\n}\n\nUTIF.decodeImage = function(buff, img, ifds)\n{\n\tvar data = new Uint8Array(buff);\n\tvar id = UTIF._binBE.readASCII(data, 0, 2);\n\n\tif(img[\"t256\"]==null) return;\t// No width => probably not an image\n\timg.isLE = id==\"II\";\n\timg.width  = img[\"t256\"][0];  //delete img[\"t256\"];\n\timg.height = img[\"t257\"][0];  //delete img[\"t257\"];\n\n\tvar cmpr   = img[\"t259\"] ? img[\"t259\"][0] : 1;  //delete img[\"t259\"];\n\tvar fo = img[\"t266\"] ? img[\"t266\"][0] : 1;  //delete img[\"t266\"];\n\tif(img[\"t284\"] && img[\"t284\"][0]==2) log(\"PlanarConfiguration 2 should not be used!\");\n\n\tvar bipp;  // bits per pixel\n\tif(img[\"t258\"]) bipp = Math.min(32,img[\"t258\"][0])*img[\"t258\"].length;\n\telse            bipp = (img[\"t277\"]?img[\"t277\"][0]:1);  \n\t// Some .NEF files have t258==14, even though they use 16 bits per pixel\n\tif(cmpr==1 && img[\"t279\"]!=null && img[\"t278\"] && img[\"t262\"][0]==32803)  {\n\t\tbipp = Math.round((img[\"t279\"][0]*8)/(img.width*img[\"t278\"][0]));\n\t}\n\tvar bipl = Math.ceil(img.width*bipp/8)*8;\n\tvar soff = img[\"t273\"];  if(soff==null) soff = img[\"t324\"];\n\tvar bcnt = img[\"t279\"];  if(cmpr==1 && soff.length==1) bcnt = [img.height*(bipl>>>3)];  if(bcnt==null) bcnt = img[\"t325\"];\n\tvar bytes = new Uint8Array(img.height*(bipl>>>3)), bilen = 0;\n\n\tif(img[\"t322\"]!=null) // tiled\n\t{\n\t\tvar tw = img[\"t322\"][0], th = img[\"t323\"][0];\n\t\tvar tx = Math.floor((img.width  + tw - 1) / tw);\n\t\tvar ty = Math.floor((img.height + th - 1) / th);\n\t\tvar tbuff = new Uint8Array(Math.ceil(tw*th*bipp/8)|0);\n\t\tfor(var y=0; y<ty; y++)\n\t\t\tfor(var x=0; x<tx; x++)\n\t\t\t{\n\t\t\t\tvar i = y*tx+x;  for(var j=0; j<tbuff.length; j++) tbuff[j]=0;\n\t\t\t\tUTIF.decode._decompress(img,ifds, data, soff[i], bcnt[i], cmpr, tbuff, 0, fo);\n\t\t\t\t// Might be required for 7 too. Need to check\n\t\t\t\tif (cmpr==6) bytes = tbuff;\n\t\t\t\telse UTIF._copyTile(tbuff, Math.ceil(tw*bipp/8)|0, th, bytes, Math.ceil(img.width*bipp/8)|0, img.height, Math.ceil(x*tw*bipp/8)|0, y*th);\n\t\t\t}\n\t\tbilen = bytes.length*8;\n\t}\n\telse\t// stripped\n\t{\n\t\tvar rps = img[\"t278\"] ? img[\"t278\"][0] : img.height;   rps = Math.min(rps, img.height);\n\t\tfor(var i=0; i<soff.length; i++)\n\t\t{\n\t\t\tUTIF.decode._decompress(img,ifds, data, soff[i], bcnt[i], cmpr, bytes, Math.ceil(bilen/8)|0, fo);\n\t\t\tbilen += bipl * rps;\n\t\t}\n\t\tbilen = Math.min(bilen, bytes.length*8);\n\t}\n\timg.data = new Uint8Array(bytes.buffer, 0, Math.ceil(bilen/8)|0);\n}\n\nUTIF.decode._decompress = function(img,ifds, data, off, len, cmpr, tgt, toff, fo)  // fill order\n{\n\t//console.log(\"compression\", cmpr);\n\t//var time = Date.now();\n\tif(false) {}\n\telse if(cmpr==1 || (len==tgt.length && cmpr!=32767)) for(var j=0; j<len; j++) tgt[toff+j] = data[off+j];\n\telse if(cmpr==3) UTIF.decode._decodeG3 (data, off, len, tgt, toff, img.width, fo);\n\telse if(cmpr==4) UTIF.decode._decodeG4 (data, off, len, tgt, toff, img.width, fo);\n\telse if(cmpr==5) UTIF.decode._decodeLZW(data, off, tgt, toff);\n\telse if(cmpr==6) UTIF.decode._decodeOldJPEG(img, data, off, len, tgt, toff);\n\telse if(cmpr==7) UTIF.decode._decodeNewJPEG(img, data, off, len, tgt, toff);\n\telse if(cmpr==8) {  var src = new Uint8Array(data.buffer,off,len);  var bin = pako[\"inflate\"](src);  for(var i=0; i<bin.length; i++) tgt[toff+i]=bin[i];  }\n\telse if(cmpr==32767) UTIF.decode._decodeARW(img, data, off, len, tgt, toff);\n\telse if(cmpr==32773) UTIF.decode._decodePackBits(data, off, len, tgt, toff);\n\telse if(cmpr==32809) UTIF.decode._decodeThunder (data, off, len, tgt, toff);\n\telse if(cmpr==34713) //for(var j=0; j<len; j++) tgt[toff+j] = data[off+j];\n\t\tUTIF.decode._decodeNikon   (img,ifds, data, off, len, tgt, toff);\n\telse log(\"Unknown compression\", cmpr);\n\t\n\t//console.log(Date.now()-time);\n\t\n\tvar bps = (img[\"t258\"]?Math.min(32,img[\"t258\"][0]):1);\n\tvar noc = (img[\"t277\"]?img[\"t277\"][0]:1), bpp=(bps*noc)>>>3, h = (img[\"t278\"] ? img[\"t278\"][0] : img.height), bpl = Math.ceil(bps*noc*img.width/8);\n\t\n\t// convert to Little Endian  /*\n\tif(bps==16 && !img.isLE && img[\"t33422\"]==null)  // not DNG\n\t\tfor(var y=0; y<h; y++) {\n\t\t\t//console.log(\"fixing endianity\");\n\t\t\tvar roff = toff+y*bpl;\n\t\t\tfor(var x=1; x<bpl; x+=2) {  var t=tgt[roff+x];  tgt[roff+x]=tgt[roff+x-1];  tgt[roff+x-1]=t;  }\n\t\t}  //*/\n\n\tif(img[\"t317\"] && img[\"t317\"][0]==2)\n\t{\n\t\tfor(var y=0; y<h; y++)\n\t\t{\n\t\t\tvar ntoff = toff+y*bpl;\n\t\t\tif(bps==16) for(var j=bpp; j<bpl; j+=2) {\n\t\t\t\tvar nv = ((tgt[ntoff+j+1]<<8)|tgt[ntoff+j])  +  ((tgt[ntoff+j-bpp+1]<<8)|tgt[ntoff+j-bpp]);\n\t\t\t\ttgt[ntoff+j] = nv&255;  tgt[ntoff+j+1] = (nv>>>8)&255;  \n\t\t\t}\n\t\t\telse if(noc==3) for(var j=  3; j<bpl; j+=3)\n\t\t\t{\n\t\t\t\ttgt[ntoff+j  ] = (tgt[ntoff+j  ] + tgt[ntoff+j-3])&255;\n\t\t\t\ttgt[ntoff+j+1] = (tgt[ntoff+j+1] + tgt[ntoff+j-2])&255;\n\t\t\t\ttgt[ntoff+j+2] = (tgt[ntoff+j+2] + tgt[ntoff+j-1])&255;\n\t\t\t}\n\t\t\telse for(var j=bpp; j<bpl; j++) tgt[ntoff+j] = (tgt[ntoff+j] + tgt[ntoff+j-bpp])&255;\n\t\t}\n\t}\n}\n\nUTIF.decode._ljpeg_diff = function(data, prm, huff) {\n\tvar getbithuff   = UTIF.decode._getbithuff;\n\tvar len, diff;\n\tlen  = getbithuff(data, prm, huff[0], huff);\n\tdiff = getbithuff(data, prm, len, 0);\n\tif ((diff & (1 << (len-1))) == 0)  diff -= (1 << len) - 1;\n\treturn diff;\n}\nUTIF.decode._decodeARW = function(img, inp, off, src_length, tgt, toff) {\n\tvar raw_width = img[\"t256\"][0], height=img[\"t257\"][0], tiff_bps=img[\"t258\"][0];\n\tvar bin=(img.isLE ? UTIF._binLE : UTIF._binBE);\n\t//console.log(raw_width, height, tiff_bps, raw_width*height, src_length);\n\tvar arw2 = (raw_width*height == src_length) || (raw_width*height*1.5 == src_length);\n\t//arw2 = true;\n\t//console.log(\"ARW2: \", arw2, raw_width*height, src_length, tgt.length);\n\tif(!arw2) {  //\"sony_arw_load_raw\"; // not arw2\n\t\theight+=8;\n\t\tvar prm = [off,0,0,0];\n\t\tvar huff = new Uint16Array(32770);\n\t\tvar tab = [ 0xf11,0xf10,0xe0f,0xd0e,0xc0d,0xb0c,0xa0b,0x90a,0x809,\n\t\t\t0x708,0x607,0x506,0x405,0x304,0x303,0x300,0x202,0x201 ];\n\t\tvar i, c, n, col, row, sum=0;\n\t\tvar ljpeg_diff = UTIF.decode._ljpeg_diff;\n\n\t\thuff[0] = 15;\n\t\tfor (n=i=0; i < 18; i++) {\n\t\t\tvar lim = 32768 >>> (tab[i] >>> 8);\n\t\t\tfor(var c=0; c<lim; c++) huff[++n] = tab[i];\n\t\t}\n\t\tfor (col = raw_width; col--; )\n\t\t\tfor (row=0; row < height+1; row+=2) {\n\t\t\t\tif (row == height) row = 1;\n\t\t\t\tsum += ljpeg_diff(inp, prm, huff);\n\t\t\t\tif (row < height) {\n\t\t\t\t\tvar clr =  (sum)&4095;\n\t\t\t\t\tUTIF.decode._putsF(tgt, (row*raw_width+col)*tiff_bps, clr<<(16-tiff_bps));\n\t\t\t\t}\n\t\t\t}\n\t\treturn;\n\t}\n\tif(raw_width*height*1.5==src_length) {\n\t\t//console.log(\"weird compression\");\n\t\tfor(var i=0; i<src_length; i+=3) {  var b0=inp[off+i+0], b1=inp[off+i+1], b2=inp[off+i+2];  \n\t\t\ttgt[toff+i]=(b1<<4)|(b0>>>4);  tgt[toff+i+1]=(b0<<4)|(b2>>>4);  tgt[toff+i+2]=(b2<<4)|(b1>>>4);  }\n\t\treturn;\n\t}\n\t\n\tvar pix = new Uint16Array(16);\n\tvar row, col, val, max, min, imax, imin, sh, bit, i,    dp;\n\t\n\tvar data = new Uint8Array(raw_width+1);\n\tfor (row=0; row < height; row++) {\n\t\t//fread (data, 1, raw_width, ifp);\n\t\tfor(var j=0; j<raw_width; j++) data[j]=inp[off++];\n\t\tfor (dp=0, col=0; col < raw_width-30; dp+=16) {\n\t\t\tmax  = 0x7ff & (val = bin.readUint(data,dp));\n\t\t\tmin  = 0x7ff & (val >>> 11);\n\t\t\timax = 0x0f & (val >>> 22);\n\t\t\timin = 0x0f & (val >>> 26);\n\t\t\tfor (sh=0; sh < 4 && 0x80 << sh <= max-min; sh++);\n\t\t\tfor (bit=30, i=0; i < 16; i++)\n\t\t\t\tif      (i == imax) pix[i] = max;\n\t\t\t\telse if (i == imin) pix[i] = min;\n\t\t\t\telse {\n\t\t\t\t\tpix[i] = ((bin.readUshort(data, dp+(bit >> 3)) >>> (bit & 7) & 0x7f) << sh) + min;\n\t\t\t\t\tif (pix[i] > 0x7ff) pix[i] = 0x7ff;\n\t\t\t\t\tbit += 7;\n\t\t\t\t}\n\t\t\tfor (i=0; i < 16; i++, col+=2) {\n\t\t\t\t//RAW(row,col) = curve[pix[i] << 1] >> 2;\n\t\t\t\tvar clr =  pix[i]<<1;   //clr = 0xffff;\n\t\t\t\tUTIF.decode._putsF(tgt, (row*raw_width+col)*tiff_bps, clr<<(16-tiff_bps));\n\t\t\t}\n\t\t\tcol -= col & 1 ? 1:31;\n\t\t}\n\t}\n}\n\nUTIF.decode._decodeNikon = function(img,imgs, data, off, src_length, tgt, toff)\n{\n\tvar nikon_tree = [\n    [ 0, 0,1,5,1,1,1,1,1,1,2,0,0,0,0,0,0,\t/* 12-bit lossy */\n      5,4,3,6,2,7,1,0,8,9,11,10,12 ],\n    [ 0, 0,1,5,1,1,1,1,1,1,2,0,0,0,0,0,0,\t/* 12-bit lossy after split */\n      0x39,0x5a,0x38,0x27,0x16,5,4,3,2,1,0,11,12,12 ],\n    [ 0, 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0,  /* 12-bit lossless */\n      5,4,6,3,7,2,8,1,9,0,10,11,12 ],\n    [ 0, 0,1,4,3,1,1,1,1,1,2,0,0,0,0,0,0,\t/* 14-bit lossy */\n      5,6,4,7,8,3,9,2,1,0,10,11,12,13,14 ],\n    [ 0, 0,1,5,1,1,1,1,1,1,1,2,0,0,0,0,0,\t/* 14-bit lossy after split */\n      8,0x5c,0x4b,0x3a,0x29,7,6,5,4,3,2,1,0,13,14 ],\n    [ 0, 0,1,4,2,2,3,1,2,0,0,0,0,0,0,0,0,\t/* 14-bit lossless */\n      7,6,8,5,9,4,10,3,11,12,2,0,1,13,14 ] ];\n\t  \n\tvar raw_width = img[\"t256\"][0], height=img[\"t257\"][0], tiff_bps=img[\"t258\"][0];\n\t\n\tvar tree = 0, split = 0;\n\tvar make_decoder = UTIF.decode._make_decoder;\n\tvar getbithuff   = UTIF.decode._getbithuff;\n\t\n\tvar mn = imgs[0].exifIFD.makerNote, md = mn[\"t150\"]?mn[\"t150\"]:mn[\"t140\"], mdo=0;  //console.log(mn,md);\n\t//console.log(md[0].toString(16), md[1].toString(16), tiff_bps);\n\tvar ver0 = md[mdo++], ver1 = md[mdo++];\n\tif (ver0 == 0x49 || ver1 == 0x58)  mdo+=2110;\n\tif (ver0 == 0x46) tree = 2;\n\tif (tiff_bps == 14) tree += 3;\n\t\n\tvar vpred = [[0,0],[0,0]], bin=(img.isLE ? UTIF._binLE : UTIF._binBE);\n\tfor(var i=0; i<2; i++) for(var j=0; j<2; j++) {  vpred[i][j] = bin.readShort(md,mdo);  mdo+=2;   }  // not sure here ... [i][j] or [j][i]\n\t//console.log(vpred);\n\t\n\t\n\tvar max = 1 << tiff_bps & 0x7fff, step=0;\n\tvar csize = bin.readShort(md,mdo);  mdo+=2;\n\tif (csize > 1) step = Math.floor(max / (csize-1));\n\tif (ver0 == 0x44 && ver1 == 0x20 && step > 0)  split = bin.readShort(md,562);\n\t\n\t\n\tvar i;\n\tvar row, col;\n\tvar len, shl, diff;\n\tvar min_v = 0;\n\tvar hpred = [0,0];\n\tvar huff = make_decoder(nikon_tree[tree]);\n\t\n\t//var g_input_offset=0, bitbuf=0, vbits=0, reset=0;\n\tvar prm = [off,0,0,0];\n\t//console.log(split);  split = 170;\n\t\n\tfor (min_v=row=0; row < height; row++) {\n\t\tif (split && row == split) {\n\t\t\t//free (huff);\n\t\t\thuff = make_decoder (nikon_tree[tree+1]);\n\t\t\t//max_v += (min_v = 16) << 1;\n\t\t}\n\t\tfor (col=0; col < raw_width; col++) {\n\t\t\ti = getbithuff(data,prm,huff[0],huff);\n\t\t\tlen = i  & 15;\n\t\t\tshl = i >>> 4;\n\t\t\tdiff = (((getbithuff(data,prm,len-shl,0) << 1) + 1) << shl) >>> 1;\n\t\t\tif ((diff & (1 << (len-1))) == 0)\n\t\t\t\tdiff -= (1 << len) - (shl==0?1:0);\n\t\t\tif (col < 2) hpred[col] = vpred[row & 1][col] += diff;\n\t\t\telse         hpred[col & 1] += diff;\n\t\t\t\n\t\t\tvar clr = Math.min(Math.max(hpred[col & 1],0),(1<<tiff_bps)-1);\n\t\t\tvar bti = (row*raw_width+col)*tiff_bps;  \n\t\t\tUTIF.decode._putsF(tgt, bti, clr<<(16-tiff_bps));\n\t\t}\n\t}\n}\n// put 16 bits\nUTIF.decode._putsF= function(dt, pos, val) {  val = val<<(8-(pos&7));  var o=(pos>>>3);  dt[o]|=val>>>16;  dt[o+1]|=val>>>8;  dt[o+2]|=val;  }\n\n\nUTIF.decode._getbithuff = function(data,prm,nbits, huff) {\n\tvar zero_after_ff = 0;\n\tvar get_byte = UTIF.decode._get_byte;\n\tvar c;\n  \n\tvar off=prm[0], bitbuf=prm[1], vbits=prm[2], reset=prm[3];\n\n\t//if (nbits > 25) return 0;\n\t//if (nbits <  0) return bitbuf = vbits = reset = 0;\n\tif (nbits == 0 || vbits < 0) return 0; \n\twhile (!reset && vbits < nbits && (c = data[off++]) != -1 &&\n\t\t!(reset = zero_after_ff && c == 0xff && data[off++])) {\n\t\t//console.log(\"byte read into c\");\n\t\tbitbuf = (bitbuf << 8) + c;\n\t\tvbits += 8;\n\t} \n\tc = (bitbuf << (32-vbits)) >>> (32-nbits);\n\tif (huff) {\n\t\tvbits -= huff[c+1] >>> 8;  //console.log(c, huff[c]>>8);\n\t\tc =  huff[c+1]&255;\n\t} else\n\t\tvbits -= nbits;\n\tif (vbits < 0) throw \"e\";\n  \n\tprm[0]=off;  prm[1]=bitbuf;  prm[2]=vbits;  prm[3]=reset;\n  \n\treturn c;\n}\n\nUTIF.decode._make_decoder = function(source) {\n\tvar max, len, h, i, j;\n\tvar huff = [];\n\n\tfor (max=16; max!=0 && !source[max]; max--);\n\tvar si=17;\n\t\n\thuff[0] = max;\n\tfor (h=len=1; len <= max; len++)\n\t\tfor (i=0; i < source[len]; i++, ++si)\n\t\t\tfor (j=0; j < 1 << (max-len); j++)\n\t\t\t\tif (h <= 1 << max)\n\t\t\t\t\thuff[h++] = (len << 8) | source[si];\n\treturn huff;\n}\n\nUTIF.decode._decodeNewJPEG = function(img, data, off, len, tgt, toff)\n{\n\tvar tables = img[\"t347\"], tlen = tables ? tables.length : 0, buff = new Uint8Array(tlen + len);\n\t\n\tif (tables) {\n\t\tvar SOI = 216, EOI = 217, boff = 0;\n\t\tfor (var i=0; i<(tlen-1); i++)\n\t\t{\n\t\t\t// Skip EOI marker from JPEGTables\n\t\t\tif (tables[i]==255 && tables[i+1]==EOI) break;\n\t\t\tbuff[boff++] = tables[i];\n\t\t}\n\n\t\t// Skip SOI marker from data\n\t\tvar byte1 = data[off], byte2 = data[off + 1];\n\t\tif (byte1!=255 || byte2!=SOI)\n\t\t{\n\t\t\tbuff[boff++] = byte1;\n\t\t\tbuff[boff++] = byte2;\n\t\t}\n\t\tfor (var i=2; i<len; i++) buff[boff++] = data[off+i];\n\t}\n\telse for (var i=0; i<len; i++) buff[i] = data[off+i];\n\n\tif(img[\"t262\"][0]==32803 || img[\"t262\"][0]==34892) // lossless JPEG and lossy JPEG (used in DNG files)\n\t{\n\t\tvar bps = img[\"t258\"][0];//, dcdr = new LosslessJpegDecoder();\n\t\tvar out = UTIF.LosslessJpegDecode(buff), olen=out.length;  //console.log(olen);\n\t\t\n\t\tif(false) {}\n\t\telse if(bps==16) {\n\t\t\tif(img.isLE) for(var i=0; i<olen; i++ ) {  tgt[toff+(i<<1)] = (out[i]&255);  tgt[toff+(i<<1)+1] = (out[i]>>>8);  }\n\t\t\telse         for(var i=0; i<olen; i++ ) {  tgt[toff+(i<<1)] = (out[i]>>>8);  tgt[toff+(i<<1)+1] = (out[i]&255);  }\n\t\t}\n\t\telse if(bps==14 || bps==12) {  // 4 * 14 == 56 == 7 * 8\n\t\t\tvar rst = 16-bps;\n\t\t\tfor(var i=0; i<olen; i++) UTIF.decode._putsF(tgt, i*bps, out[i]<<rst);\n\t\t}\n\t\telse throw new Error(\"unsupported bit depth \"+bps);\n\t}\n\telse\n\t{\n\t\tvar parser = new UTIF.JpegDecoder();  parser.parse(buff);\n\t\tvar decoded = parser.getData(parser.width, parser.height);\n\t\tfor (var i=0; i<decoded.length; i++) tgt[toff + i] = decoded[i];\n\t}\n\n\t// PhotometricInterpretation is 6 (YCbCr) for JPEG, but after decoding we populate data in\n\t// RGB format, so updating the tag value\n\tif(img[\"t262\"][0] == 6)  img[\"t262\"][0] = 2;\n}\n\nUTIF.decode._decodeOldJPEGInit = function(img, data, off, len)\n{\n\tvar SOI = 216, EOI = 217, DQT = 219, DHT = 196, DRI = 221, SOF0 = 192, SOS = 218;\n\tvar joff = 0, soff = 0, tables, sosMarker, isTiled = false, i, j, k;\n\tvar jpgIchgFmt    = img[\"t513\"], jifoff = jpgIchgFmt ? jpgIchgFmt[0] : 0;\n\tvar jpgIchgFmtLen = img[\"t514\"], jiflen = jpgIchgFmtLen ? jpgIchgFmtLen[0] : 0;\n\tvar soffTag       = img[\"t324\"] || img[\"t273\"] || jpgIchgFmt;\n\tvar ycbcrss       = img[\"t530\"], ssx = 0, ssy = 0;\n\tvar spp           = img[\"t277\"]?img[\"t277\"][0]:1;\n\tvar jpgresint     = img[\"t515\"];\n\n\tif(soffTag)\n\t{\n\t\tsoff = soffTag[0];\n\t\tisTiled = (soffTag.length > 1);\n\t}\n\n\tif(!isTiled)\n\t{\n\t\tif(data[off]==255 && data[off+1]==SOI) return { jpegOffset: off };\n\t\tif(jpgIchgFmt!=null)\n\t\t{\n\t\t\tif(data[off+jifoff]==255 && data[off+jifoff+1]==SOI) joff = off+jifoff;\n\t\t\telse log(\"JPEGInterchangeFormat does not point to SOI\");\n\n\t\t\tif(jpgIchgFmtLen==null) log(\"JPEGInterchangeFormatLength field is missing\");\n\t\t\telse if(jifoff >= soff || (jifoff+jiflen) <= soff) log(\"JPEGInterchangeFormatLength field value is invalid\");\n\n\t\t\tif(joff != null) return { jpegOffset: joff };\n\t\t}\n\t}\n\n\tif(ycbcrss!=null) {  ssx = ycbcrss[0];  ssy = ycbcrss[1];  }\n\n\tif(jpgIchgFmt!=null)\n\t\tif(jpgIchgFmtLen!=null)\n\t\t\tif(jiflen >= 2 && (jifoff+jiflen) <= soff)\n\t\t\t{\n\t\t\t\tif(data[off+jifoff+jiflen-2]==255 && data[off+jifoff+jiflen-1]==SOI) tables = new Uint8Array(jiflen-2);\n\t\t\t\telse tables = new Uint8Array(jiflen);\n\n\t\t\t\tfor(i=0; i<tables.length; i++) tables[i] = data[off+jifoff+i];\n\t\t\t\tlog(\"Incorrect JPEG interchange format: using JPEGInterchangeFormat offset to derive tables\");\n\t\t\t}\n\t\t\telse log(\"JPEGInterchangeFormat+JPEGInterchangeFormatLength > offset to first strip or tile\");\n\n\tif(tables == null)\n\t{\n\t\tvar ooff = 0, out = [];\n\t\tout[ooff++] = 255; out[ooff++] = SOI;\n\n\t\tvar qtables = img[\"t519\"];\n\t\tif(qtables==null) throw new Error(\"JPEGQTables tag is missing\");\n\t\tfor(i=0; i<qtables.length; i++)\n\t\t{\n\t\t\tout[ooff++] = 255; out[ooff++] = DQT; out[ooff++] = 0; out[ooff++] = 67; out[ooff++] = i;\n\t\t\tfor(j=0; j<64; j++) out[ooff++] = data[off+qtables[i]+j];\n\t\t}\n\n\t\tfor(k=0; k<2; k++)\n\t\t{\n\t\t\tvar htables = img[(k == 0) ? \"t520\" : \"t521\"];\n\t\t\tif(htables==null) throw new Error(((k == 0) ? \"JPEGDCTables\" : \"JPEGACTables\") + \" tag is missing\");\n\t\t\tfor(i=0; i<htables.length; i++)\n\t\t\t{\n\t\t\t\tout[ooff++] = 255; out[ooff++] = DHT;\n\t\t\t\t//out[ooff++] = 0; out[ooff++] = 67; out[ooff++] = i;\n\t\t\t\tvar nc = 19;\n\t\t\t\tfor(j=0; j<16; j++) nc += data[off+htables[i]+j];\n\n\t\t\t\tout[ooff++] = (nc >>> 8); out[ooff++] = nc & 255;\n\t\t\t\tout[ooff++] = (i | (k << 4));\n\t\t\t\tfor(j=0; j<16; j++) out[ooff++] = data[off+htables[i]+j];\n\t\t\t\tfor(j=0; j<nc; j++) out[ooff++] = data[off+htables[i]+16+j];\n\t\t\t}\n\t\t}\n\n\t\tout[ooff++] = 255; out[ooff++] = SOF0;\n\t\tout[ooff++] = 0;  out[ooff++] = 8 + 3*spp;  out[ooff++] = 8;\n\t\tout[ooff++] = (img.height >>> 8) & 255;  out[ooff++] = img.height & 255;\n\t\tout[ooff++] = (img.width  >>> 8) & 255;  out[ooff++] = img.width  & 255;\n\t\tout[ooff++] = spp;\n\t\tif(spp==1) {  out[ooff++] = 1;  out[ooff++] = 17;  out[ooff++] = 0;  }\n\t\telse for(i=0; i<3; i++)\n\t\t{\n\t\t\tout[ooff++] = i + 1;\n\t\t\tout[ooff++] = (i != 0) ? 17 : (((ssx & 15) << 4) | (ssy & 15));\n\t\t\tout[ooff++] = i;\n\t\t}\n\n\t\tif(jpgresint!=null && jpgresint[0]!=0)\n\t\t{\n\t\t\tout[ooff++] = 255;  out[ooff++] = DRI;  out[ooff++] = 0;  out[ooff++] = 4;\n\t\t\tout[ooff++] = (jpgresint[0] >>> 8) & 255;\n\t\t\tout[ooff++] = jpgresint[0] & 255;\n\t\t}\n\n\t\ttables = new Uint8Array(out);\n\t}\n\n\tvar sofpos = -1;\n\ti = 0;\n\twhile(i < (tables.length - 1)) {\n\t\tif(tables[i]==255 && tables[i+1]==SOF0) {  sofpos = i; break;  }\n\t\ti++;\n\t}\n\n\tif(sofpos == -1)\n\t{\n\t\tvar tmptab = new Uint8Array(tables.length + 10 + 3*spp);\n\t\ttmptab.set(tables);\n\t\tvar tmpoff = tables.length;\n\t\tsofpos = tables.length;\n\t\ttables = tmptab;\n\n\t\ttables[tmpoff++] = 255; tables[tmpoff++] = SOF0;\n\t\ttables[tmpoff++] = 0;  tables[tmpoff++] = 8 + 3*spp;  tables[tmpoff++] = 8;\n\t\ttables[tmpoff++] = (img.height >>> 8) & 255;  tables[tmpoff++] = img.height & 255;\n\t\ttables[tmpoff++] = (img.width  >>> 8) & 255;  tables[tmpoff++] = img.width  & 255;\n\t\ttables[tmpoff++] = spp;\n\t\tif(spp==1) {  tables[tmpoff++] = 1;  tables[tmpoff++] = 17;  tables[tmpoff++] = 0;  }\n\t\telse for(i=0; i<3; i++)\n\t\t{\n\t\t\ttables[tmpoff++] = i + 1;\n\t\t\ttables[tmpoff++] = (i != 0) ? 17 : (((ssx & 15) << 4) | (ssy & 15));\n\t\t\ttables[tmpoff++] = i;\n\t\t}\n\t}\n\n\tif(data[soff]==255 && data[soff+1]==SOS)\n\t{\n\t\tvar soslen = (data[soff+2]<<8) | data[soff+3];\n\t\tsosMarker = new Uint8Array(soslen+2);\n\t\tsosMarker[0] = data[soff];  sosMarker[1] = data[soff+1]; sosMarker[2] = data[soff+2];  sosMarker[3] = data[soff+3];\n\t\tfor(i=0; i<(soslen-2); i++) sosMarker[i+4] = data[soff+i+4];\n\t}\n\telse\n\t{\n\t\tsosMarker = new Uint8Array(2 + 6 + 2*spp);\n\t\tvar sosoff = 0;\n\t\tsosMarker[sosoff++] = 255;  sosMarker[sosoff++] = SOS;\n\t\tsosMarker[sosoff++] = 0;  sosMarker[sosoff++] = 6 + 2*spp;  sosMarker[sosoff++] = spp;\n\t\tif(spp==1) {  sosMarker[sosoff++] = 1;  sosMarker[sosoff++] = 0;  }\n\t\telse for(i=0; i<3; i++)\n\t\t{\n\t\t\tsosMarker[sosoff++] = i+1;  sosMarker[sosoff++] = (i << 4) | i;\n\t\t}\n\t\tsosMarker[sosoff++] = 0;  sosMarker[sosoff++] = 63;  sosMarker[sosoff++] = 0;\n\t}\n\n\treturn { jpegOffset: off, tables: tables, sosMarker: sosMarker, sofPosition: sofpos };\n}\n\nUTIF.decode._decodeOldJPEG = function(img, data, off, len, tgt, toff)\n{\n\tvar i, dlen, tlen, buff, buffoff;\n\tvar jpegData = UTIF.decode._decodeOldJPEGInit(img, data, off, len);\n\n\tif(jpegData.jpegOffset!=null)\n\t{\n\t\tdlen = off+len-jpegData.jpegOffset;\n\t\tbuff = new Uint8Array(dlen);\n\t\tfor(i=0; i<dlen; i++) buff[i] = data[jpegData.jpegOffset+i];\n\t}\n\telse\n\t{\n\t\ttlen = jpegData.tables.length;\n\t\tbuff = new Uint8Array(tlen + jpegData.sosMarker.length + len + 2);\n\t\tbuff.set(jpegData.tables);\n\t\tbuffoff = tlen;\n\n\t\tbuff[jpegData.sofPosition+5] = (img.height >>> 8) & 255;  buff[jpegData.sofPosition+6] = img.height & 255;\n\t\tbuff[jpegData.sofPosition+7] = (img.width  >>> 8) & 255;  buff[jpegData.sofPosition+8] = img.width  & 255;\n\n\t\tif(data[off]!=255 || data[off+1]!=SOS)\n\t\t{\n\t\t\tbuff.set(jpegData.sosMarker, buffoff);\n\t\t\tbuffoff += sosMarker.length;\n\t\t}\n\t\tfor(i=0; i<len; i++) buff[buffoff++] = data[off+i];\n\t\tbuff[buffoff++] = 255;  buff[buffoff++] = EOI;\n\t}\n\n\tvar parser = new UTIF.JpegDecoder();  parser.parse(buff);\n\tvar decoded = parser.getData(parser.width, parser.height);\n\tfor (var i=0; i<decoded.length; i++) tgt[toff + i] = decoded[i];\n\n\t// PhotometricInterpretation is 6 (YCbCr) for JPEG, but after decoding we populate data in\n\t// RGB format, so updating the tag value\n\tif(img[\"t262\"] && img[\"t262\"][0] == 6)  img[\"t262\"][0] = 2;\n}\n\nUTIF.decode._decodePackBits = function(data, off, len, tgt, toff)\n{\n\tvar sa = new Int8Array(data.buffer), ta = new Int8Array(tgt.buffer), lim = off+len;\n\twhile(off<lim)\n\t{\n\t\tvar n = sa[off];  off++;\n\t\tif(n>=0  && n<128)    for(var i=0; i< n+1; i++) {  ta[toff]=sa[off];  toff++;  off++;   }\n\t\tif(n>=-127 && n<0) {  for(var i=0; i<-n+1; i++) {  ta[toff]=sa[off];  toff++;           }  off++;  }\n\t}\n}\n\nUTIF.decode._decodeThunder = function(data, off, len, tgt, toff)\n{\n\tvar d2 = [ 0, 1, 0, -1 ],  d3 = [ 0, 1, 2, 3, 0, -3, -2, -1 ];\n\tvar lim = off+len, qoff = toff*2, px = 0;\n\twhile(off<lim)\n\t{\n\t\tvar b = data[off], msk = (b>>>6), n = (b&63);  off++;\n\t\tif(msk==3) { px=(n&15);  tgt[qoff>>>1] |= (px<<(4*(1-qoff&1)));  qoff++;   }\n\t\tif(msk==0) for(var i=0; i<n; i++) {  tgt[qoff>>>1] |= (px<<(4*(1-qoff&1)));  qoff++;   }\n\t\tif(msk==2) for(var i=0; i<2; i++) {  var d=(n>>>(3*(1-i)))&7;  if(d!=4) { px+=d3[d];  tgt[qoff>>>1] |= (px<<(4*(1-qoff&1)));  qoff++; }  }\n\t\tif(msk==1) for(var i=0; i<3; i++) {  var d=(n>>>(2*(2-i)))&3;  if(d!=2) { px+=d2[d];  tgt[qoff>>>1] |= (px<<(4*(1-qoff&1)));  qoff++; }  }\n\t}\n}\n\nUTIF.decode._dmap = { \"1\":0,\"011\":1,\"000011\":2,\"0000011\":3, \"010\":-1,\"000010\":-2,\"0000010\":-3  };\nUTIF.decode._lens = ( function()\n{\n\tvar addKeys = function(lens, arr, i0, inc) {  for(var i=0; i<arr.length; i++) lens[arr[i]] = i0 + i*inc;  }\n\n\tvar termW = \"00110101,000111,0111,1000,1011,1100,1110,1111,10011,10100,00111,01000,001000,000011,110100,110101,\" // 15\n\t+ \"101010,101011,0100111,0001100,0001000,0010111,0000011,0000100,0101000,0101011,0010011,0100100,0011000,00000010,00000011,00011010,\" // 31\n\t+ \"00011011,00010010,00010011,00010100,00010101,00010110,00010111,00101000,00101001,00101010,00101011,00101100,00101101,00000100,00000101,00001010,\" // 47\n\t+ \"00001011,01010010,01010011,01010100,01010101,00100100,00100101,01011000,01011001,01011010,01011011,01001010,01001011,00110010,00110011,00110100\";\n\n\tvar termB = \"0000110111,010,11,10,011,0011,0010,00011,000101,000100,0000100,0000101,0000111,00000100,00000111,000011000,\" // 15\n\t+ \"0000010111,0000011000,0000001000,00001100111,00001101000,00001101100,00000110111,00000101000,00000010111,00000011000,000011001010,000011001011,000011001100,000011001101,000001101000,000001101001,\" // 31\n\t+ \"000001101010,000001101011,000011010010,000011010011,000011010100,000011010101,000011010110,000011010111,000001101100,000001101101,000011011010,000011011011,000001010100,000001010101,000001010110,000001010111,\" // 47\n\t+ \"000001100100,000001100101,000001010010,000001010011,000000100100,000000110111,000000111000,000000100111,000000101000,000001011000,000001011001,000000101011,000000101100,000001011010,000001100110,000001100111\";\n\n\tvar makeW = \"11011,10010,010111,0110111,00110110,00110111,01100100,01100101,01101000,01100111,011001100,011001101,011010010,011010011,011010100,011010101,011010110,\"\n\t+ \"011010111,011011000,011011001,011011010,011011011,010011000,010011001,010011010,011000,010011011\";\n\n\tvar makeB = \"0000001111,000011001000,000011001001,000001011011,000000110011,000000110100,000000110101,0000001101100,0000001101101,0000001001010,0000001001011,0000001001100,\"\n\t+ \"0000001001101,0000001110010,0000001110011,0000001110100,0000001110101,0000001110110,0000001110111,0000001010010,0000001010011,0000001010100,0000001010101,0000001011010,\"\n\t+ \"0000001011011,0000001100100,0000001100101\";\n\n\tvar makeA = \"00000001000,00000001100,00000001101,000000010010,000000010011,000000010100,000000010101,000000010110,000000010111,000000011100,000000011101,000000011110,000000011111\";\n\n\ttermW = termW.split(\",\");  termB = termB.split(\",\");  makeW = makeW.split(\",\");  makeB = makeB.split(\",\");  makeA = makeA.split(\",\");\n\n\tvar lensW = {}, lensB = {};\n\taddKeys(lensW, termW, 0, 1);  addKeys(lensW, makeW, 64,64);  addKeys(lensW, makeA, 1792,64);\n\taddKeys(lensB, termB, 0, 1);  addKeys(lensB, makeB, 64,64);  addKeys(lensB, makeA, 1792,64);\n\treturn [lensW, lensB];\n} )();\n\nUTIF.decode._decodeG4 = function(data, off, slen, tgt, toff, w, fo)\n{\n\tvar U = UTIF.decode, boff=off<<3, len=0, wrd=\"\";\t// previous starts with 1\n\tvar line=[], pline=[];  for(var i=0; i<w; i++) pline.push(0);  pline=U._makeDiff(pline);\n\tvar a0=0, a1=0, a2=0, b1=0, b2=0, clr=0;\n\tvar y=0, mode=\"\", toRead=0;\n\tvar bipl = Math.ceil(w/8)*8;\n\n\twhile((boff>>>3)<off+slen)\n\t{\n\t\tb1 = U._findDiff(pline, a0+(a0==0?0:1), 1-clr), b2 = U._findDiff(pline, b1, clr);\t// could be precomputed\n\t\tvar bit =0;\n\t\tif(fo==1) bit = (data[boff>>>3]>>>(7-(boff&7)))&1;\n\t\tif(fo==2) bit = (data[boff>>>3]>>>(  (boff&7)))&1;\n\t\tboff++;  wrd+=bit;\n\t\tif(mode==\"H\")\n\t\t{\n\t\t\tif(U._lens[clr][wrd]!=null)\n\t\t\t{\n\t\t\t\tvar dl=U._lens[clr][wrd];  wrd=\"\";  len+=dl;\n\t\t\t\tif(dl<64) {  U._addNtimes(line,len,clr);  a0+=len;  clr=1-clr;  len=0;  toRead--;  if(toRead==0) mode=\"\";  }\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wrd==\"0001\")  {  wrd=\"\";  U._addNtimes(line,b2-a0,clr);  a0=b2;   }\n\t\t\tif(wrd==\"001\" )  {  wrd=\"\";  mode=\"H\";  toRead=2;  }\n\t\t\tif(U._dmap[wrd]!=null) {  a1 = b1+U._dmap[wrd];  U._addNtimes(line, a1-a0, clr);  a0=a1;  wrd=\"\";  clr=1-clr;  }\n\t\t}\n\t\tif(line.length==w && mode==\"\")\n\t\t{\n\t\t\tU._writeBits(line, tgt, toff*8+y*bipl);\n\t\t\tclr=0;  y++;  a0=0;\n\t\t\tpline=U._makeDiff(line);  line=[];\n\t\t}\n\t\t//if(wrd.length>150) {  log(wrd);  break;  throw \"e\";  }\n\t}\n}\n\nUTIF.decode._findDiff = function(line, x, clr) {  for(var i=0; i<line.length; i+=2) if(line[i]>=x && line[i+1]==clr)  return line[i];  }\n\nUTIF.decode._makeDiff = function(line)\n{\n\tvar out = [];  if(line[0]==1) out.push(0,1);\n\tfor(var i=1; i<line.length; i++) if(line[i-1]!=line[i]) out.push(i, line[i]);\n\tout.push(line.length,0,line.length,1);  return out;\n}\n\nUTIF.decode._decodeG3 = function(data, off, slen, tgt, toff, w, fo)\n{\n\tvar U = UTIF.decode, boff=off<<3, len=0, wrd=\"\";\n\tvar line=[], pline=[];  for(var i=0; i<w; i++) line.push(0);\n\tvar a0=0, a1=0, a2=0, b1=0, b2=0, clr=0;\n\tvar y=-1, mode=\"\", toRead=0, is1D=false;\n\tvar bipl = Math.ceil(w/8)*8;\n\twhile((boff>>>3)<off+slen)\n\t{\n\t\tb1 = U._findDiff(pline, a0+(a0==0?0:1), 1-clr), b2 = U._findDiff(pline, b1, clr);\t// could be precomputed\n\t\tvar bit =0;\n\t\tif(fo==1) bit = (data[boff>>>3]>>>(7-(boff&7)))&1;\n\t\tif(fo==2) bit = (data[boff>>>3]>>>(  (boff&7)))&1;\n\t\tboff++;  wrd+=bit;\n\n\t\tif(is1D)\n\t\t{\n\t\t\tif(U._lens[clr][wrd]!=null)\n\t\t\t{\n\t\t\t\tvar dl=U._lens[clr][wrd];  wrd=\"\";  len+=dl;\n\t\t\t\tif(dl<64) {  U._addNtimes(line,len,clr);  clr=1-clr;  len=0;  }\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(mode==\"H\")\n\t\t\t{\n\t\t\t\tif(U._lens[clr][wrd]!=null)\n\t\t\t\t{\n\t\t\t\t\tvar dl=U._lens[clr][wrd];  wrd=\"\";  len+=dl;\n\t\t\t\t\tif(dl<64) {  U._addNtimes(line,len,clr);  a0+=len;  clr=1-clr;  len=0;  toRead--;  if(toRead==0) mode=\"\";  }\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(wrd==\"0001\")  {  wrd=\"\";  U._addNtimes(line,b2-a0,clr);  a0=b2;   }\n\t\t\t\tif(wrd==\"001\" )  {  wrd=\"\";  mode=\"H\";  toRead=2;  }\n\t\t\t\tif(U._dmap[wrd]!=null) {  a1 = b1+U._dmap[wrd];  U._addNtimes(line, a1-a0, clr);  a0=a1;  wrd=\"\";  clr=1-clr;  }\n\t\t\t}\n\t\t}\n\t\tif(wrd.endsWith(\"000000000001\")) // needed for some files\n\t\t{\n\t\t\tif(y>=0) U._writeBits(line, tgt, toff*8+y*bipl);\n\t\t\tif(fo==1) is1D = ((data[boff>>>3]>>>(7-(boff&7)))&1)==1;\n\t\t\tif(fo==2) is1D = ((data[boff>>>3]>>>(  (boff&7)))&1)==1;\n\t\t\tboff++;\n\t\t\tif(U._decodeG3.allow2D==null) U._decodeG3.allow2D=is1D;\n\t\t\tif(!U._decodeG3.allow2D) {  is1D = true;  boff--;  }\n\t\t\t//log(\"EOL\",y, \"next 1D:\", is1D);\n\t\t\twrd=\"\";  clr=0;  y++;  a0=0;\n\t\t\tpline=U._makeDiff(line);  line=[];\n\t\t}\n\t}\n\tif(line.length==w) U._writeBits(line, tgt, toff*8+y*bipl);\n}\n\nUTIF.decode._addNtimes = function(arr, n, val) {  for(var i=0; i<n; i++) arr.push(val);  }\n\nUTIF.decode._writeBits = function(bits, tgt, boff)\n{\n\tfor(var i=0; i<bits.length; i++) tgt[(boff+i)>>>3] |= (bits[i]<<(7-((boff+i)&7)));\n}\n\nUTIF.decode._decodeLZW = function(data, off, tgt, toff)\n{\n\tif(UTIF.decode._lzwTab==null)\n\t{\n\t\tvar tb=new Uint32Array(0xffff), tn=new Uint16Array(0xffff), chr=new Uint8Array(2e6);\n\t\tfor(var i=0; i<256; i++) { chr[i<<2]=i;  tb[i]=i<<2;  tn[i]=1;  }\n\t\tUTIF.decode._lzwTab = [tb,tn,chr];\n\t}\n\tvar copy = UTIF.decode._copyData;\n\tvar tab = UTIF.decode._lzwTab[0], tln=UTIF.decode._lzwTab[1], chr=UTIF.decode._lzwTab[2], totl = 258, chrl = 258<<2;\n\tvar bits = 9, boff = off<<3;  // offset in bits\n\n\tvar ClearCode = 256, EoiCode = 257;\n\tvar v = 0, Code = 0, OldCode = 0;\n\twhile(true)\n\t{\n\t\tv = (data[boff>>>3]<<16) | (data[(boff+8)>>>3]<<8) | data[(boff+16)>>>3];\n\t\tCode = ( v>>(24-(boff&7)-bits) )    &   ((1<<bits)-1);  boff+=bits;\n\n\t\tif(Code==EoiCode) break;\n\t\tif(Code==ClearCode)\n\t\t{\n\t\t\tbits=9;  totl = 258;  chrl = 258<<2;\n\n\t\t\tv = (data[boff>>>3]<<16) | (data[(boff+8)>>>3]<<8) | data[(boff+16)>>>3];\n\t\t\tCode = ( v>>(24-(boff&7)-bits) )    &   ((1<<bits)-1);  boff+=bits;\n\t\t\tif(Code==EoiCode) break;\n\t\t\ttgt[toff]=Code;  toff++;\n\t\t}\n\t\telse if(Code<totl)\n\t\t{\n\t\t\tvar cd = tab[Code], cl = tln[Code];\n\t\t\tcopy(chr,cd,tgt,toff,cl);  toff += cl;\n\n\t\t\tif(OldCode>=totl) {  tab[totl] = chrl;  chr[tab[totl]] = cd[0];  tln[totl]=1;  chrl=(chrl+1+3)&~0x03;  totl++;  }\n\t\t\telse\n\t\t\t{\n\t\t\t\ttab[totl] = chrl;\n\t\t\t\tvar nit = tab[OldCode], nil = tln[OldCode];\n\t\t\t\tcopy(chr,nit,chr,chrl,nil);\n\t\t\t\tchr[chrl+nil]=chr[cd];  nil++;\n\t\t\t\ttln[totl]=nil;  totl++;\n\n\t\t\t\tchrl=(chrl+nil+3)&~0x03;\n\t\t\t}\n\t\t\tif(totl+1==(1<<bits)) bits++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(OldCode>=totl) {  tab[totl] = chrl;  tln[totl]=0;  totl++;  }\n\t\t\telse\n\t\t\t{\n\t\t\t\ttab[totl] = chrl;\n\t\t\t\tvar nit = tab[OldCode], nil = tln[OldCode];\n\t\t\t\tcopy(chr,nit,chr,chrl,nil);\n\t\t\t\tchr[chrl+nil]=chr[chrl];  nil++;\n\t\t\t\ttln[totl]=nil;  totl++;\n\n\t\t\t\tcopy(chr,chrl,tgt,toff,nil);  toff += nil;\n\t\t\t\tchrl=(chrl+nil+3)&~0x03;\n\t\t\t}\n\t\t\tif(totl+1==(1<<bits)) bits++;\n\t\t}\n\t\tOldCode = Code;\n\t}\n}\n\nUTIF.decode._copyData = function(s,so,t,to,l) {  for(var i=0;i<l;i+=4) {  t[to+i]=s[so+i];  t[to+i+1]=s[so+i+1];  t[to+i+2]=s[so+i+2];  t[to+i+3]=s[so+i+3];  }  }\n\nUTIF.tags = {};\nUTIF.ttypes = {  256:3,257:3,258:3,   259:3, 262:3,  273:4,  274:3, 277:3,278:4,279:4, 282:5, 283:5, 284:3, 286:5,287:5, 296:3, 305:2, 306:2, 338:3, 513:4, 514:4, 34665:4  };\n\nUTIF._readIFD = function(bin, data, offset, ifds, depth, debug)\n{\n\tvar cnt = bin.readUshort(data, offset);  offset+=2;\n\tvar ifd = {};  ifds.push(ifd);\n\n\tif(debug) log(\"   \".repeat(depth),ifds.length-1,\">>>----------------\");\n\tfor(var i=0; i<cnt; i++)\n\t{\n\t\tvar tag  = bin.readUshort(data, offset);    offset+=2;\n\t\tvar type = bin.readUshort(data, offset);    offset+=2;\n\t\tvar num  = bin.readUint  (data, offset);    offset+=4;\n\t\tvar voff = bin.readUint  (data, offset);    offset+=4;\n\t\t//if(tag==33723) {type=1; num*=4;}//console.log(type,num,voff);//type = 1;  // IPTC/NAA\n\n\t\tvar arr = [];\n\t\t//ifd[\"t\"+tag+\"-\"+UTIF.tags[tag]] = arr;\n\t\tif(type== 1 || type==7) {  arr = new Uint8Array(data.buffer, (num<5 ? offset-4 : voff), num);  }\n\t\tif(type== 2) {  var o0 = (num<5 ? offset-4 : voff), c=data[o0];  \n\t\t\t\t\t\tif(c<128) arr.push( bin.readASCII(data, o0, num-1) );\n\t\t\t\t\t\telse      arr = new Uint8Array(data.buffer, o0, num-1);  }\n\t\tif(type== 3) {  for(var j=0; j<num; j++) arr.push(bin.readUshort(data, (num<3 ? offset-4 : voff)+2*j));  }\n\t\tif(type== 4) {  for(var j=0; j<num; j++) arr.push(bin.readUint  (data, (num<2 ? offset-4 : voff)+4*j));  }\n\t\tif(type== 5) {  for(var j=0; j<num; j++) arr.push(bin.readUint  (data, voff+j*8) / bin.readUint(data,voff+j*8+4));  }\n\t\tif(type== 8) {  for(var j=0; j<num; j++) arr.push(bin.readShort (data, (num<3 ? offset-4 : voff)+2*j));  }\n\t\tif(type== 9) {  for(var j=0; j<num; j++) arr.push(bin.readInt   (data, (num<2 ? offset-4 : voff)+4*j));  }\n\t\tif(type==10) {  for(var j=0; j<num; j++) arr.push(bin.readInt   (data, voff+j*8) / bin.readInt (data,voff+j*8+4));  }\n\t\tif(type==11) {  for(var j=0; j<num; j++) arr.push(bin.readFloat (data, voff+j*4));  }\n\t\tif(type==12) {  for(var j=0; j<num; j++) arr.push(bin.readDouble(data, voff+j*8));  }\n\t\t\n\t\tifd[\"t\"+tag] = arr;\n\t\t\n\t\tif(num!=0 && arr.length==0) {  log(\"unknown TIFF tag type: \", type, \"num:\",num);  }\n\t\tif(debug) log(\"   \".repeat(depth), tag, type, UTIF.tags[tag], arr);\n\t\t\n\t\tif(tag==330 && ifd[\"t272\"] && ifd[\"t272\"][0]==\"DSLR-A100\") {  } \n\t\t// ifd[\"t258\"]=[12];  ifd[\"t259\"]=[32767];  ifd[\"t273\"]=[offset+arr[0]];  ifd[\"t277\"]=[1];  ifd[\"t279\"]=[1];  ifd[\"t33421\"]=[2,2];  ifd[\"t33422\"]=[0,1,1,2];\n\t\telse if(tag==330 || tag==34665 || (tag==50740 && bin.readUshort(data,bin.readUint(arr,0))<300  )) {\n\t\t\tvar oarr = tag==50740 ? [bin.readUint(arr,0)] : arr;\n\t\t\tvar subfd = [];\n\t\t\tfor(var j=0; j<oarr.length; j++) UTIF._readIFD(bin, data, oarr[j], subfd, depth+1, debug);\n\t\t\tif(tag==  330) ifd.subIFD = subfd;\n\t\t\tif(tag==34665) ifd.exifIFD = subfd[0];\n\t\t\tif(tag==50740) ifd.dngPrvt = subfd[0];\n\t\t}\n\t\tif(tag==37500) {\n\t\t\tvar mn = arr;\n\t\t\t//console.log(bin.readASCII(mn,0,mn.length), mn);\n\t\t\tif(bin.readASCII(mn,0,5)==\"Nikon\")  ifd.makerNote = UTIF[\"decode\"](mn.slice(10).buffer)[0];\n\t\t\telse if(bin.readUshort(data,voff)<300){\n\t\t\t\tvar subsub=[];  UTIF._readIFD(bin, data, voff, subsub, depth+1, debug);\n\t\t\t\tifd.makerNote = subsub[0];\n\t\t\t}\n\t\t}\n\t}\n\tif(debug) log(\"   \".repeat(depth),\"<<<---------------\");\n\treturn offset;\n}\n\nUTIF._writeIFD = function(bin, data, offset, ifd)\n{\n\tvar keys = Object.keys(ifd);\n\tbin.writeUshort(data, offset, keys.length);  offset+=2;\n\n\tvar eoff = offset + keys.length*12 + 4;\n\n\tfor(var ki=0; ki<keys.length; ki++)\n\t{\n\t\tvar key = keys[ki];\n\t\tvar tag = parseInt(key.slice(1)), type = UTIF.ttypes[tag];  if(type==null) throw new Error(\"unknown type of tag: \"+tag);\n\t\tvar val = ifd[key];  if(type==2) val=val[0]+\"\\u0000\";  var num = val.length;\n\t\tbin.writeUshort(data, offset, tag );  offset+=2;\n\t\tbin.writeUshort(data, offset, type);  offset+=2;\n\t\tbin.writeUint  (data, offset, num );  offset+=4;\n\n\t\tvar dlen = [-1, 1, 1, 2, 4, 8, 0, 0, 0, 0, 0, 0, 8][type] * num;\n\t\tvar toff = offset;\n\t\tif(dlen>4) {  bin.writeUint(data, offset, eoff);  toff=eoff;  }\n\n\t\tif(type==2) {  bin.writeASCII(data, toff, val);   }\n\t\tif(type==3) {  for(var i=0; i<num; i++) bin.writeUshort(data, toff+2*i, val[i]);    }\n\t\tif(type==4) {  for(var i=0; i<num; i++) bin.writeUint  (data, toff+4*i, val[i]);    }\n\t\tif(type==5) {  for(var i=0; i<num; i++) {  bin.writeUint(data, toff+8*i, Math.round(val[i]*10000));  bin.writeUint(data, toff+8*i+4, 10000);  }   }\n\t\tif (type == 12) {  for (var i = 0; i < num; i++) bin.writeDouble(data, toff + 8 * i, val[i]); }\n\n\t\tif(dlen>4) {  dlen += (dlen&1);  eoff += dlen;  }\n\t\toffset += 4;\n\t}\n\treturn [offset, eoff];\n}\n\nUTIF.toRGBA8 = function(out)\n{\n\tvar w = out.width, h = out.height, area = w*h, qarea = area*4, data = out.data;\n\tvar img = new Uint8Array(area*4);\n\t//console.log(out);\n\t// 0: WhiteIsZero, 1: BlackIsZero, 2: RGB, 3: Palette color, 4: Transparency mask, 5: CMYK\n\tvar intp = (out[\"t262\"] ? out[\"t262\"][0]: 2), bps = (out[\"t258\"]?Math.min(32,out[\"t258\"][0]):1);\n\t//log(\"interpretation: \", intp, \"bps\", bps, out);\n\tif(false) {}\n\telse if(intp==0)\n\t{\n\t\tvar bpl = Math.ceil(bps*w/8);\n\t\tfor(var y=0; y<h; y++) {\n\t\t\tvar off = y*bpl, io = y*w;\n\t\t\tif(bps== 1) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=((data[off+(i>>3)])>>(7-  (i&7)))& 1;  img[qi]=img[qi+1]=img[qi+2]=( 1-px)*255;  img[qi+3]=255;    }\n\t\t\tif(bps== 4) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=((data[off+(i>>1)])>>(4-4*(i&1)))&15;  img[qi]=img[qi+1]=img[qi+2]=(15-px)* 17;  img[qi+3]=255;    }\n\t\t\tif(bps== 8) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=data[off+i];  img[qi]=img[qi+1]=img[qi+2]=255-px;  img[qi+3]=255;    }\n\t\t}\n\t}\n\telse if(intp==1)\n\t{\n\t\tvar bpl = Math.ceil(bps*w/8);\n\t\tfor(var y=0; y<h; y++) {\n\t\t\tvar off = y*bpl, io = y*w;\n\t\t\tif(bps== 1) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=((data[off+(i>>3)])>>(7-  (i&7)))&1;   img[qi]=img[qi+1]=img[qi+2]=(px)*255;  img[qi+3]=255;    }\n\t\t\tif(bps== 2) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=((data[off+(i>>2)])>>(6-2*(i&3)))&3;   img[qi]=img[qi+1]=img[qi+2]=(px)* 85;  img[qi+3]=255;    }\n\t\t\tif(bps== 8) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=data[off+i];  img[qi]=img[qi+1]=img[qi+2]=    px;  img[qi+3]=255;    }\n\t\t\tif(bps==16) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=data[off+(2*i+1)];  img[qi]=img[qi+1]=img[qi+2]= Math.min(255,px);  img[qi+3]=255;    } // ladoga.tif\n\t\t}\n\t}\n\telse if(intp==2)\n\t{\n\t\tvar smpls = out[\"t258\"]?out[\"t258\"].length : 3;\n\t\t\n\t\tif(bps== 8) \n\t\t{\n\t\t\tif(smpls==4) for(var i=0; i<qarea; i++) img[i] = data[i];\n\t\t\tif(smpls==3) for(var i=0; i< area; i++) {  var qi=i<<2, ti=i*3;  img[qi]=data[ti];  img[qi+1]=data[ti+1];  img[qi+2]=data[ti+2];  img[qi+3]=255;    }\n\t\t}\n\t\telse{  // 3x 16-bit channel\n\t\t\tif(smpls==4) for(var i=0; i<area; i++) {  var qi=i<<2, ti=i*8+1;  img[qi]=data[ti];  img[qi+1]=data[ti+2];  img[qi+2]=data[ti+4];  img[qi+3]=data[ti+6];    }\n\t\t\tif(smpls==3) for(var i=0; i<area; i++) {  var qi=i<<2, ti=i*6+1;  img[qi]=data[ti];  img[qi+1]=data[ti+2];  img[qi+2]=data[ti+4];  img[qi+3]=255;           }\n\t\t}\n\t}\n\telse if(intp==3)\n\t{\n\t\tvar map = out[\"t320\"];\n\t\tfor(var i=0; i<area; i++) {  var qi=i<<2, mi=data[i];  img[qi]=(map[mi]>>8);  img[qi+1]=(map[256+mi]>>8);  img[qi+2]=(map[512+mi]>>8);  img[qi+3]=255;    }\n\t}\n\telse if(intp==5) \n\t{\n\t\tvar smpls = out[\"t258\"]?out[\"t258\"].length : 4;\n\t\tvar gotAlpha = smpls>4 ? 1 : 0;\n\t\tfor(var i=0; i<area; i++) {\n\t\t\tvar qi=i<<2, si=i*smpls;  var C=255-data[si], M=255-data[si+1], Y=255-data[si+2], K=(255-data[si+3])*(1/255);\n\t\t\timg[qi]=~~(C*K+0.5);  img[qi+1]=~~(M*K+0.5);  img[qi+2]=~~(Y*K+0.5);  img[qi+3]=255*(1-gotAlpha)+data[si+4]*gotAlpha;\n\t\t}\n\t}\n\telse log(\"Unknown Photometric interpretation: \"+intp);\n\treturn img;\n}\n\nUTIF.replaceIMG = function(imgs)\n{\n\tif(imgs==null) imgs = document.getElementsByTagName(\"img\");\n\tvar sufs = [\"tif\",\"tiff\",\"dng\",\"cr2\",\"nef\"]\n\tfor (var i=0; i<imgs.length; i++)\n\t{\n\t\tvar img=imgs[i], src=img.getAttribute(\"src\");  if(src==null) continue;\n\t\tvar suff=src.split(\".\").pop().toLowerCase();\n\t\tif(sufs.indexOf(suff)==-1) continue;\n\t\tvar xhr = new XMLHttpRequest();  UTIF._xhrs.push(xhr);  UTIF._imgs.push(img);\n\t\txhr.open(\"GET\", src);  xhr.responseType = \"arraybuffer\";\n\t\txhr.onload = UTIF._imgLoaded;   xhr.send();\n\t}\n}\n\nUTIF._xhrs = [];  UTIF._imgs = [];\nUTIF._imgLoaded = function(e)\n{\n\tvar buff = e.target.response;\n\tvar ifds = UTIF.decode(buff);  //console.log(ifds);\n\tvar vsns = ifds, ma=0, page=vsns[0];  if(ifds[0].subIFD) vsns = vsns.concat(ifds[0].subIFD);\n\tfor(var i=0; i<vsns.length; i++) {\n\t\tvar img = vsns[i];\n\t\tif(img[\"t258\"]==null || img[\"t258\"].length<3) continue;\n\t\tvar ar = img[\"t256\"]*img[\"t257\"];\n\t\tif(ar>ma) {  ma=ar;  page=img;  }\n\t}\n\tUTIF.decodeImage(buff, page, ifds);\n\tvar rgba = UTIF.toRGBA8(page), w=page.width, h=page.height;\n\tvar ind = UTIF._xhrs.indexOf(e.target), img = UTIF._imgs[ind];\n\tUTIF._xhrs.splice(ind,1);  UTIF._imgs.splice(ind,1);\n\tvar cnv = document.createElement(\"canvas\");  cnv.width=w;  cnv.height=h;\n\tvar ctx = cnv.getContext(\"2d\"), imgd = ctx.createImageData(w,h);\n\tfor(var i=0; i<rgba.length; i++) imgd.data[i]=rgba[i];       ctx.putImageData(imgd,0,0);\n\timg.setAttribute(\"src\",cnv.toDataURL());\n}\n\n\nUTIF._binBE =\n{\n\tnextZero   : function(data, o) {  while(data[o]!=0) o++;  return o;  },\n\treadUshort : function(buff, p) {  return (buff[p]<< 8) |  buff[p+1];  },\n\treadShort  : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+1];  a[1]=buff[p+0];                                    return UTIF._binBE. i16[0];  },\n\treadInt    : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+3];  a[1]=buff[p+2];  a[2]=buff[p+1];  a[3]=buff[p+0];  return UTIF._binBE. i32[0];  },\n\treadUint   : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+3];  a[1]=buff[p+2];  a[2]=buff[p+1];  a[3]=buff[p+0];  return UTIF._binBE.ui32[0];  },\n\treadASCII  : function(buff, p, l) {  var s = \"\";   for(var i=0; i<l; i++) s += String.fromCharCode(buff[p+i]);   return s; },\n\treadFloat  : function(buff, p) {  var a=UTIF._binBE.ui8;  for(var i=0;i<4;i++) a[i]=buff[p+3-i];  return UTIF._binBE.fl32[0];  },\n\treadDouble : function(buff, p) {  var a=UTIF._binBE.ui8;  for(var i=0;i<8;i++) a[i]=buff[p+7-i];  return UTIF._binBE.fl64[0];  },\n\n\twriteUshort: function(buff, p, n) {  buff[p] = (n>> 8)&255;  buff[p+1] =  n&255;  },\n\twriteUint  : function(buff, p, n) {  buff[p] = (n>>24)&255;  buff[p+1] = (n>>16)&255;  buff[p+2] = (n>>8)&255;  buff[p+3] = (n>>0)&255;  },\n\twriteASCII : function(buff, p, s) {  for(var i = 0; i < s.length; i++)  buff[p+i] = s.charCodeAt(i);  },\n\twriteDouble: function(buff, p, n)\n\t{\n\t\tUTIF._binBE.fl64[0] = n;\n\t\tfor (var i = 0; i < 8; i++) buff[p + i] = UTIF._binBE.ui8[7 - i];\n\t}\n}\nUTIF._binBE.ui8  = new Uint8Array  (8);\nUTIF._binBE.i16  = new Int16Array  (UTIF._binBE.ui8.buffer);\nUTIF._binBE.i32  = new Int32Array  (UTIF._binBE.ui8.buffer);\nUTIF._binBE.ui32 = new Uint32Array (UTIF._binBE.ui8.buffer);\nUTIF._binBE.fl32 = new Float32Array(UTIF._binBE.ui8.buffer);\nUTIF._binBE.fl64 = new Float64Array(UTIF._binBE.ui8.buffer);\n\nUTIF._binLE =\n{\n\tnextZero   : UTIF._binBE.nextZero,\n\treadUshort : function(buff, p) {  return (buff[p+1]<< 8) |  buff[p];  },\n\treadShort  : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+0];  a[1]=buff[p+1];                                    return UTIF._binBE. i16[0];  },\n\treadInt    : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+0];  a[1]=buff[p+1];  a[2]=buff[p+2];  a[3]=buff[p+3];  return UTIF._binBE. i32[0];  },\n\treadUint   : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+0];  a[1]=buff[p+1];  a[2]=buff[p+2];  a[3]=buff[p+3];  return UTIF._binBE.ui32[0];  },\n\treadASCII  : UTIF._binBE.readASCII,\n\treadFloat  : function(buff, p) {  var a=UTIF._binBE.ui8;  for(var i=0;i<4;i++) a[i]=buff[p+  i];  return UTIF._binBE.fl32[0];  },\n\treadDouble : function(buff, p) {  var a=UTIF._binBE.ui8;  for(var i=0;i<8;i++) a[i]=buff[p+  i];  return UTIF._binBE.fl64[0];  }\n}\nUTIF._copyTile = function(tb, tw, th, b, w, h, xoff, yoff)\n{\n\t//log(\"copyTile\", tw, th,  w, h, xoff, yoff);\n\tvar xlim = Math.min(tw, w-xoff);\n\tvar ylim = Math.min(th, h-yoff);\n\tfor(var y=0; y<ylim; y++)\n\t{\n\t\tvar tof = (yoff+y)*w+xoff;\n\t\tvar sof = y*tw;\n\t\tfor(var x=0; x<xlim; x++) b[tof+x] = tb[sof+x];\n\t}\n}\n\nUTIF.LosslessJpegDecode = (function(){function t(Z){this.w=Z;this.N=0;this._=0;this.G=0}t.prototype={t:function(Z){this.N=Math.max(0,Math.min(this.w.length,Z))},i:function(){return this.w[this.N++]},l:function(){var Z=this.N;\nthis.N+=2;return this.w[Z]<<8|this.w[Z+1]},J:function(){if(this._==0){this.G=this.w[this.N];this.N+=1+(this.G+1>>>8);\nthis._=8}return this.G>>>--this._&1},Z:function(Z){var X=this._,s=this.G,E=Math.min(X,Z);Z-=E;X-=E;var Y=s>>>X&(1<<E)-1;\nwhile(Z>0){s=this.w[this.N];this.N+=1+(s+1>>>8);E=Math.min(8,Z);Z-=E;X=8-E;Y<<=E;Y|=s>>>X&(1<<E)-1}this._=X;\nthis.G=s;return Y}};var i={};i.X=function(){return[0,0,-1]};i.s=function(Z,X,s){Z[i.Y(Z,0,s)+2]=X};i.Y=function(Z,X,s){if(Z[X+2]!=-1)return 0;\nif(s==0)return X;for(var E=0;E<2;E++){if(Z[X+E]==0){Z[X+E]=Z.length;Z.push(0);Z.push(0);Z.push(-1)}var Y=i.Y(Z,Z[X+E],s-1);\nif(Y!=0)return Y}return 0};i.B=function(Z,X){var s=0,E=0,Y=0,B=X._,$=X.G,e=X.N;while(!0){if(B==0){$=X.w[e];\ne+=1+($+1>>>8);B=8}Y=$>>>--B&1;s=Z[s+Y];E=Z[s+2];if(E!=-1){X._=B;X.G=$;X.N=e;return E}}return-1};function l(Z){this.z=new t(Z);\nthis.D(this.z)}l.prototype={$:function(Z,X){this.Q=Z.i();this.F=Z.l();this.o=Z.l();var s=this.O=Z.i();\nthis.L=[];for(var E=0;E<s;E++){var Y=Z.i(),B=Z.i();Z.i();this.L[Y]=E}Z.t(Z.N+X-(6+s*3))},e:function(){var Z=0,X=this.z.i();\nif(this.H==null)this.H={};var s=this.H[X]=i.X(),E=[];for(var Y=0;Y<16;Y++){E[Y]=this.z.i();Z+=E[Y]}for(var Y=0;\nY<16;Y++)for(var B=0;B<E[Y];B++)i.s(s,this.z.i(),Y+1);return Z+17},W:function(Z){while(Z>0)Z-=this.e()},p:function(Z,X){var s=Z.i();\nif(!this.U){this.U=[]}for(var E=0;E<s;E++){var Y=Z.i(),B=Z.i();this.U[this.L[Y]]=this.H[B>>>4]}this.g=Z.i();\nZ.t(Z.N+X-(2+s*2))},D:function(Z){var X=!1,s=Z.l();if(s!==l.q)return;do{var s=Z.l(),E=Z.l()-2;switch(s){case l.m:this.$(Z,E);\nbreak;case l.K:this.W(E);break;case l.V:this.p(Z,E);X=!0;break;default:Z.t(Z.N+E);break}}while(!X)},I:function(Z,X){var s=i.B(X,Z);\nif(s==16)return-32768;var E=Z.Z(s);if((E&1<<s-1)==0)E-=(1<<s)-1;return E},B:function(Z,X){var s=this.z,E=this.O,Y=this.F,B=this.I,$=this.g,e=this.o*E,W=this.U;\nfor(var p=0;p<E;p++){Z[p]=B(s,W[p])+(1<<this.Q-1)}for(var D=E;D<e;D+=E){for(var p=0;p<E;p++)Z[D+p]=B(s,W[p])+Z[D+p-E]}var I=X;\nfor(var m=1;m<Y;m++){for(var p=0;p<E;p++){Z[I+p]=B(s,W[p])+Z[I+p-X]}for(var D=E;D<e;D+=E){for(var p=0;\np<E;p++){var K=I+D+p,q=Z[K-E];if($==6)q=Z[K-X]+(q-Z[K-E-X]>>>1);Z[K]=q+B(s,W[p])}}I+=X}}};l.m=65475;\nl.K=65476;l.q=65496;l.V=65498;function J(Z){var X=new l(Z),s=X.Q>8?Uint16Array:Uint8Array,E=new s(X.o*X.F*X.O),Y=X.o*X.O;\nX.B(E,Y);return E}return J}())\n\n\n\n\n})(UTIF, pako);\n})();","\n/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//const Z_FILTERED          = 1;\n//const Z_HUFFMAN_ONLY      = 2;\n//const Z_RLE               = 3;\nconst Z_FIXED$1               = 4;\n//const Z_DEFAULT_STRATEGY  = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nconst Z_BINARY              = 0;\nconst Z_TEXT                = 1;\n//const Z_ASCII             = 1; // = Z_TEXT\nconst Z_UNKNOWN$1             = 2;\n\n/*============================================================================*/\n\n\nfunction zero$1(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nconst STORED_BLOCK = 0;\nconst STATIC_TREES = 1;\nconst DYN_TREES    = 2;\n/* The three kinds of block type */\n\nconst MIN_MATCH$1    = 3;\nconst MAX_MATCH$1    = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nconst LENGTH_CODES$1  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nconst LITERALS$1      = 256;\n/* number of literal bytes 0..255 */\n\nconst L_CODES$1       = LITERALS$1 + 1 + LENGTH_CODES$1;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nconst D_CODES$1       = 30;\n/* number of distance codes */\n\nconst BL_CODES$1      = 19;\n/* number of codes used to transfer the bit lengths */\n\nconst HEAP_SIZE$1     = 2 * L_CODES$1 + 1;\n/* maximum heap size */\n\nconst MAX_BITS$1      = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst Buf_size      = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nconst MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nconst END_BLOCK   = 256;\n/* end of block literal code */\n\nconst REP_3_6     = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nconst REPZ_3_10   = 17;\n/* repeat a zero length 3-10 times  (3 bits of repeat count) */\n\nconst REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times  (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nconst extra_lbits =   /* extra bits for each length code */\n  new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]);\n\nconst extra_dbits =   /* extra bits for each distance code */\n  new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]);\n\nconst extra_blbits =  /* extra bits for each bit length code */\n  new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]);\n\nconst bl_order =\n  new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nconst DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nconst static_ltree  = new Array((L_CODES$1 + 2) * 2);\nzero$1(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nconst static_dtree  = new Array(D_CODES$1 * 2);\nzero$1(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nconst _dist_code    = new Array(DIST_CODE_LEN);\nzero$1(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nconst _length_code  = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1);\nzero$1(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nconst base_length   = new Array(LENGTH_CODES$1);\nzero$1(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nconst base_dist     = new Array(D_CODES$1);\nzero$1(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n  this.static_tree  = static_tree;  /* static tree or NULL */\n  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */\n  this.extra_base   = extra_base;   /* base index for extra_bits */\n  this.elems        = elems;        /* max number of elements in the tree */\n  this.max_length   = max_length;   /* max bit length for the codes */\n\n  // show if `static_tree` has data or dummy - needed for monomorphic objects\n  this.has_stree    = static_tree && static_tree.length;\n}\n\n\nlet static_l_desc;\nlet static_d_desc;\nlet static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n  this.dyn_tree = dyn_tree;     /* the dynamic tree */\n  this.max_code = 0;            /* largest code with non zero frequency */\n  this.stat_desc = stat_desc;   /* the corresponding static tree */\n}\n\n\n\nconst d_code = (dist) => {\n\n  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n};\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nconst put_short = (s, w) => {\n//    put_byte(s, (uch)((w) & 0xff));\n//    put_byte(s, (uch)((ush)(w) >> 8));\n  s.pending_buf[s.pending++] = (w) & 0xff;\n  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n};\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nconst send_bits = (s, value, length) => {\n\n  if (s.bi_valid > (Buf_size - length)) {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    put_short(s, s.bi_buf);\n    s.bi_buf = value >> (Buf_size - s.bi_valid);\n    s.bi_valid += length - Buf_size;\n  } else {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    s.bi_valid += length;\n  }\n};\n\n\nconst send_code = (s, c, tree) => {\n\n  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n};\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nconst bi_reverse = (code, len) => {\n\n  let res = 0;\n  do {\n    res |= code & 1;\n    code >>>= 1;\n    res <<= 1;\n  } while (--len > 0);\n  return res >>> 1;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nconst bi_flush = (s) => {\n\n  if (s.bi_valid === 16) {\n    put_short(s, s.bi_buf);\n    s.bi_buf = 0;\n    s.bi_valid = 0;\n\n  } else if (s.bi_valid >= 8) {\n    s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n    s.bi_buf >>= 8;\n    s.bi_valid -= 8;\n  }\n};\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n *    above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n *     array bl_count contains the frequencies for each bit length.\n *     The length opt_len is updated; static_len is also updated if stree is\n *     not null.\n */\nconst gen_bitlen = (s, desc) => {\n//    deflate_state *s;\n//    tree_desc *desc;    /* the tree descriptor */\n\n  const tree            = desc.dyn_tree;\n  const max_code        = desc.max_code;\n  const stree           = desc.stat_desc.static_tree;\n  const has_stree       = desc.stat_desc.has_stree;\n  const extra           = desc.stat_desc.extra_bits;\n  const base            = desc.stat_desc.extra_base;\n  const max_length      = desc.stat_desc.max_length;\n  let h;              /* heap index */\n  let n, m;           /* iterate over the tree elements */\n  let bits;           /* bit length */\n  let xbits;          /* extra bits */\n  let f;              /* frequency */\n  let overflow = 0;   /* number of elements with bit length too large */\n\n  for (bits = 0; bits <= MAX_BITS$1; bits++) {\n    s.bl_count[bits] = 0;\n  }\n\n  /* In a first pass, compute the optimal bit lengths (which may\n   * overflow in the case of the bit length tree).\n   */\n  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n  for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) {\n    n = s.heap[h];\n    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n    if (bits > max_length) {\n      bits = max_length;\n      overflow++;\n    }\n    tree[n * 2 + 1]/*.Len*/ = bits;\n    /* We overwrite tree[n].Dad which is no longer needed */\n\n    if (n > max_code) { continue; } /* not a leaf node */\n\n    s.bl_count[bits]++;\n    xbits = 0;\n    if (n >= base) {\n      xbits = extra[n - base];\n    }\n    f = tree[n * 2]/*.Freq*/;\n    s.opt_len += f * (bits + xbits);\n    if (has_stree) {\n      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n    }\n  }\n  if (overflow === 0) { return; }\n\n  // Tracev((stderr,\"\\nbit length overflow\\n\"));\n  /* This happens for example on obj2 and pic of the Calgary corpus */\n\n  /* Find the first bit length which could increase: */\n  do {\n    bits = max_length - 1;\n    while (s.bl_count[bits] === 0) { bits--; }\n    s.bl_count[bits]--;      /* move one leaf down the tree */\n    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n    s.bl_count[max_length]--;\n    /* The brother of the overflow item also moves one step up,\n     * but this does not affect bl_count[max_length]\n     */\n    overflow -= 2;\n  } while (overflow > 0);\n\n  /* Now recompute all bit lengths, scanning in increasing frequency.\n   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n   * lengths instead of fixing only the wrong ones. This idea is taken\n   * from 'ar' written by Haruhiko Okumura.)\n   */\n  for (bits = max_length; bits !== 0; bits--) {\n    n = s.bl_count[bits];\n    while (n !== 0) {\n      m = s.heap[--h];\n      if (m > max_code) { continue; }\n      if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n        // Tracev((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n        tree[m * 2 + 1]/*.Len*/ = bits;\n      }\n      n--;\n    }\n  }\n};\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n *     zero code length.\n */\nconst gen_codes = (tree, max_code, bl_count) => {\n//    ct_data *tree;             /* the tree to decorate */\n//    int max_code;              /* largest code with non zero frequency */\n//    ushf *bl_count;            /* number of codes at each bit length */\n\n  const next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */\n  let code = 0;              /* running code value */\n  let bits;                  /* bit index */\n  let n;                     /* code index */\n\n  /* The distribution counts are first used to generate the code values\n   * without bit reversal.\n   */\n  for (bits = 1; bits <= MAX_BITS$1; bits++) {\n    code = (code + bl_count[bits - 1]) << 1;\n    next_code[bits] = code;\n  }\n  /* Check that the bit counts in bl_count are consistent. The last code\n   * must be all ones.\n   */\n  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n  //        \"inconsistent bit counts\");\n  //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n  for (n = 0;  n <= max_code; n++) {\n    let len = tree[n * 2 + 1]/*.Len*/;\n    if (len === 0) { continue; }\n    /* Now reverse the bits */\n    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n    //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n  }\n};\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nconst tr_static_init = () => {\n\n  let n;        /* iterates over tree elements */\n  let bits;     /* bit counter */\n  let length;   /* length value */\n  let code;     /* code value */\n  let dist;     /* distance index */\n  const bl_count = new Array(MAX_BITS$1 + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  // do check in _tr_init()\n  //if (static_init_done) return;\n\n  /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n  static_l_desc.static_tree = static_ltree;\n  static_l_desc.extra_bits = extra_lbits;\n  static_d_desc.static_tree = static_dtree;\n  static_d_desc.extra_bits = extra_dbits;\n  static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n  /* Initialize the mapping length (0..255) -> length code (0..28) */\n  length = 0;\n  for (code = 0; code < LENGTH_CODES$1 - 1; code++) {\n    base_length[code] = length;\n    for (n = 0; n < (1 << extra_lbits[code]); n++) {\n      _length_code[length++] = code;\n    }\n  }\n  //Assert (length == 256, \"tr_static_init: length != 256\");\n  /* Note that the length 255 (match length 258) can be represented\n   * in two different ways: code 284 + 5 bits or code 285, so we\n   * overwrite length_code[255] to use the best encoding:\n   */\n  _length_code[length - 1] = code;\n\n  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n  dist = 0;\n  for (code = 0; code < 16; code++) {\n    base_dist[code] = dist;\n    for (n = 0; n < (1 << extra_dbits[code]); n++) {\n      _dist_code[dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: dist != 256\");\n  dist >>= 7; /* from now on, all distances are divided by 128 */\n  for (; code < D_CODES$1; code++) {\n    base_dist[code] = dist << 7;\n    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n      _dist_code[256 + dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n  /* Construct the codes of the static literal tree */\n  for (bits = 0; bits <= MAX_BITS$1; bits++) {\n    bl_count[bits] = 0;\n  }\n\n  n = 0;\n  while (n <= 143) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  while (n <= 255) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 9;\n    n++;\n    bl_count[9]++;\n  }\n  while (n <= 279) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 7;\n    n++;\n    bl_count[7]++;\n  }\n  while (n <= 287) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  /* Codes 286 and 287 do not exist, but we must include them in the\n   * tree construction to get a canonical Huffman tree (longest code\n   * all ones)\n   */\n  gen_codes(static_ltree, L_CODES$1 + 1, bl_count);\n\n  /* The static distance tree is trivial: */\n  for (n = 0; n < D_CODES$1; n++) {\n    static_dtree[n * 2 + 1]/*.Len*/ = 5;\n    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n  }\n\n  // Now data ready and we can init static trees\n  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1);\n  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES$1, MAX_BITS$1);\n  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES$1, MAX_BL_BITS);\n\n  //static_init_done = true;\n};\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nconst init_block = (s) => {\n\n  let n; /* iterates over tree elements */\n\n  /* Initialize the trees. */\n  for (n = 0; n < L_CODES$1;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < D_CODES$1;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < BL_CODES$1; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n  s.opt_len = s.static_len = 0;\n  s.sym_next = s.matches = 0;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nconst bi_windup = (s) =>\n{\n  if (s.bi_valid > 8) {\n    put_short(s, s.bi_buf);\n  } else if (s.bi_valid > 0) {\n    //put_byte(s, (Byte)s->bi_buf);\n    s.pending_buf[s.pending++] = s.bi_buf;\n  }\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n};\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nconst smaller = (tree, n, m, depth) => {\n\n  const _n2 = n * 2;\n  const _m2 = m * 2;\n  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n};\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nconst pqdownheap = (s, tree, k) => {\n//    deflate_state *s;\n//    ct_data *tree;  /* the tree to restore */\n//    int k;               /* node to move down */\n\n  const v = s.heap[k];\n  let j = k << 1;  /* left son of k */\n  while (j <= s.heap_len) {\n    /* Set j to the smallest of the two sons: */\n    if (j < s.heap_len &&\n      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n      j++;\n    }\n    /* Exit if v is smaller than both sons */\n    if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n    /* Exchange v with the smallest son */\n    s.heap[k] = s.heap[j];\n    k = j;\n\n    /* And continue down the tree, setting j to the left son of k */\n    j <<= 1;\n  }\n  s.heap[k] = v;\n};\n\n\n// inlined manually\n// const SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nconst compress_block = (s, ltree, dtree) => {\n//    deflate_state *s;\n//    const ct_data *ltree; /* literal tree */\n//    const ct_data *dtree; /* distance tree */\n\n  let dist;           /* distance of matched string */\n  let lc;             /* match length or unmatched char (if dist == 0) */\n  let sx = 0;         /* running index in sym_buf */\n  let code;           /* the code to send */\n  let extra;          /* number of extra bits to send */\n\n  if (s.sym_next !== 0) {\n    do {\n      dist = s.pending_buf[s.sym_buf + sx++] & 0xff;\n      dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8;\n      lc = s.pending_buf[s.sym_buf + sx++];\n      if (dist === 0) {\n        send_code(s, lc, ltree); /* send a literal byte */\n        //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n      } else {\n        /* Here, lc is the match length - MIN_MATCH */\n        code = _length_code[lc];\n        send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */\n        extra = extra_lbits[code];\n        if (extra !== 0) {\n          lc -= base_length[code];\n          send_bits(s, lc, extra);       /* send the extra length bits */\n        }\n        dist--; /* dist is now the match distance - 1 */\n        code = d_code(dist);\n        //Assert (code < D_CODES, \"bad d_code\");\n\n        send_code(s, code, dtree);       /* send the distance code */\n        extra = extra_dbits[code];\n        if (extra !== 0) {\n          dist -= base_dist[code];\n          send_bits(s, dist, extra);   /* send the extra distance bits */\n        }\n      } /* literal or match pair ? */\n\n      /* Check that the overlay between pending_buf and sym_buf is ok: */\n      //Assert(s->pending < s->lit_bufsize + sx, \"pendingBuf overflow\");\n\n    } while (sx < s.sym_next);\n  }\n\n  send_code(s, END_BLOCK, ltree);\n};\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n *     and corresponding code. The length opt_len is updated; static_len is\n *     also updated if stree is not null. The field max_code is set.\n */\nconst build_tree = (s, desc) => {\n//    deflate_state *s;\n//    tree_desc *desc; /* the tree descriptor */\n\n  const tree     = desc.dyn_tree;\n  const stree    = desc.stat_desc.static_tree;\n  const has_stree = desc.stat_desc.has_stree;\n  const elems    = desc.stat_desc.elems;\n  let n, m;          /* iterate over heap elements */\n  let max_code = -1; /* largest code with non zero frequency */\n  let node;          /* new node being created */\n\n  /* Construct the initial heap, with least frequent element in\n   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n   * heap[0] is not used.\n   */\n  s.heap_len = 0;\n  s.heap_max = HEAP_SIZE$1;\n\n  for (n = 0; n < elems; n++) {\n    if (tree[n * 2]/*.Freq*/ !== 0) {\n      s.heap[++s.heap_len] = max_code = n;\n      s.depth[n] = 0;\n\n    } else {\n      tree[n * 2 + 1]/*.Len*/ = 0;\n    }\n  }\n\n  /* The pkzip format requires that at least one distance code exists,\n   * and that at least one bit should be sent even if there is only one\n   * possible code. So to avoid special checks later on we force at least\n   * two codes of non zero frequency.\n   */\n  while (s.heap_len < 2) {\n    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n    tree[node * 2]/*.Freq*/ = 1;\n    s.depth[node] = 0;\n    s.opt_len--;\n\n    if (has_stree) {\n      s.static_len -= stree[node * 2 + 1]/*.Len*/;\n    }\n    /* node is 0 or 1 so it does not have extra bits */\n  }\n  desc.max_code = max_code;\n\n  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n   * establish sub-heaps of increasing lengths:\n   */\n  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n  /* Construct the Huffman tree by repeatedly combining the least two\n   * frequent nodes.\n   */\n  node = elems;              /* next internal node of the tree */\n  do {\n    //pqremove(s, tree, n);  /* n = node of least frequency */\n    /*** pqremove ***/\n    n = s.heap[1/*SMALLEST*/];\n    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n    /***/\n\n    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n    s.heap[--s.heap_max] = m;\n\n    /* Create a new node father of n and m */\n    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n    /* and insert the new node in the heap */\n    s.heap[1/*SMALLEST*/] = node++;\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n\n  } while (s.heap_len >= 2);\n\n  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n  /* At this point, the fields freq and dad are set. We can now\n   * generate the bit lengths.\n   */\n  gen_bitlen(s, desc);\n\n  /* The field len is now set, we can generate the bit codes */\n  gen_codes(tree, max_code, s.bl_count);\n};\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nconst scan_tree = (s, tree, max_code) => {\n//    deflate_state *s;\n//    ct_data *tree;   /* the tree to be scanned */\n//    int max_code;    /* and its largest code of non zero frequency */\n\n  let n;                     /* iterates over all tree elements */\n  let prevlen = -1;          /* last emitted length */\n  let curlen;                /* length of current code */\n\n  let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  let count = 0;             /* repeat count of the current code */\n  let max_count = 7;         /* max repeat count */\n  let min_count = 4;         /* min repeat count */\n\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n    } else if (curlen !== 0) {\n\n      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n    } else if (count <= 10) {\n      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n    } else {\n      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n    }\n\n    count = 0;\n    prevlen = curlen;\n\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n};\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nconst send_tree = (s, tree, max_code) => {\n//    deflate_state *s;\n//    ct_data *tree; /* the tree to be scanned */\n//    int max_code;       /* and its largest code of non zero frequency */\n\n  let n;                     /* iterates over all tree elements */\n  let prevlen = -1;          /* last emitted length */\n  let curlen;                /* length of current code */\n\n  let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  let count = 0;             /* repeat count of the current code */\n  let max_count = 7;         /* max repeat count */\n  let min_count = 4;         /* min repeat count */\n\n  /* tree[max_code+1].Len = -1; */  /* guard already set */\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n    } else if (curlen !== 0) {\n      if (curlen !== prevlen) {\n        send_code(s, curlen, s.bl_tree);\n        count--;\n      }\n      //Assert(count >= 3 && count <= 6, \" 3_6?\");\n      send_code(s, REP_3_6, s.bl_tree);\n      send_bits(s, count - 3, 2);\n\n    } else if (count <= 10) {\n      send_code(s, REPZ_3_10, s.bl_tree);\n      send_bits(s, count - 3, 3);\n\n    } else {\n      send_code(s, REPZ_11_138, s.bl_tree);\n      send_bits(s, count - 11, 7);\n    }\n\n    count = 0;\n    prevlen = curlen;\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n};\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nconst build_bl_tree = (s) => {\n\n  let max_blindex;  /* index of last bit length code of non zero freq */\n\n  /* Determine the bit length frequencies for literal and distance trees */\n  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n  /* Build the bit length tree: */\n  build_tree(s, s.bl_desc);\n  /* opt_len now includes the length of the tree representations, except\n   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n   */\n\n  /* Determine the number of bit length codes to send. The pkzip format\n   * requires that at least 4 bit length codes be sent. (appnote.txt says\n   * 3 but the actual value used is 4.)\n   */\n  for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) {\n    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n      break;\n    }\n  }\n  /* Update opt_len to include the bit length tree and counts */\n  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n  //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n  //        s->opt_len, s->static_len));\n\n  return max_blindex;\n};\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nconst send_all_trees = (s, lcodes, dcodes, blcodes) => {\n//    deflate_state *s;\n//    int lcodes, dcodes, blcodes; /* number of codes for each tree */\n\n  let rank;                    /* index in bl_order */\n\n  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n  //        \"too many codes\");\n  //Tracev((stderr, \"\\nbl counts: \"));\n  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n  send_bits(s, dcodes - 1,   5);\n  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */\n  for (rank = 0; rank < blcodes; rank++) {\n    //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n  }\n  //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n  //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n  //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n};\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n *    a) There are no non-portable control characters belonging to the\n *       \"block list\" (0..6, 14..25, 28..31).\n *    b) There is at least one printable character belonging to the\n *       \"allow list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n *   \"gray list\" that is ignored in this detection algorithm:\n *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nconst detect_data_type = (s) => {\n  /* block_mask is the bit mask of block-listed bytes\n   * set bits 0..6, 14..25, and 28..31\n   * 0xf3ffc07f = binary 11110011111111111100000001111111\n   */\n  let block_mask = 0xf3ffc07f;\n  let n;\n\n  /* Check for non-textual (\"block-listed\") bytes. */\n  for (n = 0; n <= 31; n++, block_mask >>>= 1) {\n    if ((block_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n      return Z_BINARY;\n    }\n  }\n\n  /* Check for textual (\"allow-listed\") bytes. */\n  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n    return Z_TEXT;\n  }\n  for (n = 32; n < LITERALS$1; n++) {\n    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n      return Z_TEXT;\n    }\n  }\n\n  /* There are no \"block-listed\" or \"allow-listed\" bytes:\n   * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n   */\n  return Z_BINARY;\n};\n\n\nlet static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nconst _tr_init$1 = (s) =>\n{\n\n  if (!static_init_done) {\n    tr_static_init();\n    static_init_done = true;\n  }\n\n  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);\n  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);\n  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n\n  /* Initialize the first block of the first file: */\n  init_block(s);\n};\n\n\n/* ===========================================================================\n * Send a stored block\n */\nconst _tr_stored_block$1 = (s, buf, stored_len, last) => {\n//DeflateState *s;\n//charf *buf;       /* input block */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n\n  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */\n  bi_windup(s);        /* align on byte boundary */\n  put_short(s, stored_len);\n  put_short(s, ~stored_len);\n  if (stored_len) {\n    s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending);\n  }\n  s.pending += stored_len;\n};\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nconst _tr_align$1 = (s) => {\n  send_bits(s, STATIC_TREES << 1, 3);\n  send_code(s, END_BLOCK, static_ltree);\n  bi_flush(s);\n};\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and write out the encoded block.\n */\nconst _tr_flush_block$1 = (s, buf, stored_len, last) => {\n//DeflateState *s;\n//charf *buf;       /* input block, or NULL if too old */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n\n  let opt_lenb, static_lenb;  /* opt_len and static_len in bytes */\n  let max_blindex = 0;        /* index of last bit length code of non zero freq */\n\n  /* Build the Huffman trees unless a stored block is forced */\n  if (s.level > 0) {\n\n    /* Check if the file is binary or text */\n    if (s.strm.data_type === Z_UNKNOWN$1) {\n      s.strm.data_type = detect_data_type(s);\n    }\n\n    /* Construct the literal and distance trees */\n    build_tree(s, s.l_desc);\n    // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n\n    build_tree(s, s.d_desc);\n    // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n    /* At this point, opt_len and static_len are the total bit lengths of\n     * the compressed block data, excluding the tree representations.\n     */\n\n    /* Build the bit length tree for the above two trees, and get the index\n     * in bl_order of the last bit length code to send.\n     */\n    max_blindex = build_bl_tree(s);\n\n    /* Determine the best encoding. Compute the block lengths in bytes. */\n    opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n    static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n    // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n    //        s->sym_next / 3));\n\n    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n  } else {\n    // Assert(buf != (char*)0, \"lost buf\");\n    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n  }\n\n  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n    /* 4: two words for the lengths */\n\n    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n     * Otherwise we can't have processed more than WSIZE input bytes since\n     * the last block flush, because compression would have been\n     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n     * transform a block into a stored block.\n     */\n    _tr_stored_block$1(s, buf, stored_len, last);\n\n  } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) {\n\n    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n    compress_block(s, static_ltree, static_dtree);\n\n  } else {\n    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n    compress_block(s, s.dyn_ltree, s.dyn_dtree);\n  }\n  // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n  /* The above check is made mod 2^32, for files larger than 512 MB\n   * and uLong implemented on 32 bits.\n   */\n  init_block(s);\n\n  if (last) {\n    bi_windup(s);\n  }\n  // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n  //       s->compressed_len-7*last));\n};\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nconst _tr_tally$1 = (s, dist, lc) => {\n//    deflate_state *s;\n//    unsigned dist;  /* distance of matched string */\n//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */\n\n  s.pending_buf[s.sym_buf + s.sym_next++] = dist;\n  s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8;\n  s.pending_buf[s.sym_buf + s.sym_next++] = lc;\n  if (dist === 0) {\n    /* lc is the unmatched char */\n    s.dyn_ltree[lc * 2]/*.Freq*/++;\n  } else {\n    s.matches++;\n    /* Here, lc is the match length - MIN_MATCH */\n    dist--;             /* dist = match distance - 1 */\n    //Assert((ush)dist < (ush)MAX_DIST(s) &&\n    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n    //       (ush)d_code(dist) < (ush)D_CODES,  \"_tr_tally: bad match\");\n\n    s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2]/*.Freq*/++;\n    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n  }\n\n  return (s.sym_next === s.sym_end);\n};\n\nvar _tr_init_1  = _tr_init$1;\nvar _tr_stored_block_1 = _tr_stored_block$1;\nvar _tr_flush_block_1  = _tr_flush_block$1;\nvar _tr_tally_1 = _tr_tally$1;\nvar _tr_align_1 = _tr_align$1;\n\nvar trees = {\n\t_tr_init: _tr_init_1,\n\t_tr_stored_block: _tr_stored_block_1,\n\t_tr_flush_block: _tr_flush_block_1,\n\t_tr_tally: _tr_tally_1,\n\t_tr_align: _tr_align_1\n};\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst adler32 = (adler, buf, len, pos) => {\n  let s1 = (adler & 0xffff) |0,\n      s2 = ((adler >>> 16) & 0xffff) |0,\n      n = 0;\n\n  while (len !== 0) {\n    // Set limit ~ twice less than 5552, to keep\n    // s2 in 31-bits, because we force signed ints.\n    // in other case %= will fail.\n    n = len > 2000 ? 2000 : len;\n    len -= n;\n\n    do {\n      s1 = (s1 + buf[pos++]) |0;\n      s2 = (s2 + s1) |0;\n    } while (--n);\n\n    s1 %= 65521;\n    s2 %= 65521;\n  }\n\n  return (s1 | (s2 << 16)) |0;\n};\n\n\nvar adler32_1 = adler32;\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nconst makeTable = () => {\n  let c, table = [];\n\n  for (var n = 0; n < 256; n++) {\n    c = n;\n    for (var k = 0; k < 8; k++) {\n      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n    }\n    table[n] = c;\n  }\n\n  return table;\n};\n\n// Create table on load. Just 255 signed longs. Not a problem.\nconst crcTable = new Uint32Array(makeTable());\n\n\nconst crc32 = (crc, buf, len, pos) => {\n  const t = crcTable;\n  const end = pos + len;\n\n  crc ^= -1;\n\n  for (let i = pos; i < end; i++) {\n    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n  }\n\n  return (crc ^ (-1)); // >>> 0;\n};\n\n\nvar crc32_1 = crc32;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar messages = {\n  2:      'need dictionary',     /* Z_NEED_DICT       2  */\n  1:      'stream end',          /* Z_STREAM_END      1  */\n  0:      '',                    /* Z_OK              0  */\n  '-1':   'file error',          /* Z_ERRNO         (-1) */\n  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */\n  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */\n  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */\n  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */\n  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar constants$2 = {\n\n  /* Allowed flush values; see deflate() and inflate() below for details */\n  Z_NO_FLUSH:         0,\n  Z_PARTIAL_FLUSH:    1,\n  Z_SYNC_FLUSH:       2,\n  Z_FULL_FLUSH:       3,\n  Z_FINISH:           4,\n  Z_BLOCK:            5,\n  Z_TREES:            6,\n\n  /* Return codes for the compression/decompression functions. Negative values\n  * are errors, positive values are used for special but normal events.\n  */\n  Z_OK:               0,\n  Z_STREAM_END:       1,\n  Z_NEED_DICT:        2,\n  Z_ERRNO:           -1,\n  Z_STREAM_ERROR:    -2,\n  Z_DATA_ERROR:      -3,\n  Z_MEM_ERROR:       -4,\n  Z_BUF_ERROR:       -5,\n  //Z_VERSION_ERROR: -6,\n\n  /* compression levels */\n  Z_NO_COMPRESSION:         0,\n  Z_BEST_SPEED:             1,\n  Z_BEST_COMPRESSION:       9,\n  Z_DEFAULT_COMPRESSION:   -1,\n\n\n  Z_FILTERED:               1,\n  Z_HUFFMAN_ONLY:           2,\n  Z_RLE:                    3,\n  Z_FIXED:                  4,\n  Z_DEFAULT_STRATEGY:       0,\n\n  /* Possible values of the data_type field (though see inflate()) */\n  Z_BINARY:                 0,\n  Z_TEXT:                   1,\n  //Z_ASCII:                1, // = Z_TEXT (deprecated)\n  Z_UNKNOWN:                2,\n\n  /* The deflate compression method */\n  Z_DEFLATED:               8\n  //Z_NULL:                 null // Use -1 or null inline, depending on var type\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = trees;\n\n\n\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n  Z_NO_FLUSH: Z_NO_FLUSH$2, Z_PARTIAL_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$3, Z_BLOCK: Z_BLOCK$1,\n  Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$1,\n  Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,\n  Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,\n  Z_UNKNOWN,\n  Z_DEFLATED: Z_DEFLATED$2\n} = constants$2;\n\n/*============================================================================*/\n\n\nconst MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nconst MAX_WBITS$1 = 15;\n/* 32K LZ77 window */\nconst DEF_MEM_LEVEL = 8;\n\n\nconst LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nconst LITERALS      = 256;\n/* number of literal bytes 0..255 */\nconst L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nconst D_CODES       = 30;\n/* number of distance codes */\nconst BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\nconst HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\nconst MAX_BITS  = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst MIN_MATCH = 3;\nconst MAX_MATCH = 258;\nconst MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nconst PRESET_DICT = 0x20;\n\nconst INIT_STATE    =  42;    /* zlib header -> BUSY_STATE */\n//#ifdef GZIP\nconst GZIP_STATE    =  57;    /* gzip header -> BUSY_STATE | EXTRA_STATE */\n//#endif\nconst EXTRA_STATE   =  69;    /* gzip extra block -> NAME_STATE */\nconst NAME_STATE    =  73;    /* gzip file name -> COMMENT_STATE */\nconst COMMENT_STATE =  91;    /* gzip comment -> HCRC_STATE */\nconst HCRC_STATE    = 103;    /* gzip header CRC -> BUSY_STATE */\nconst BUSY_STATE    = 113;    /* deflate -> FINISH_STATE */\nconst FINISH_STATE  = 666;    /* stream complete */\n\nconst BS_NEED_MORE      = 1; /* block not completed, need more input or more output */\nconst BS_BLOCK_DONE     = 2; /* block flush performed */\nconst BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nconst BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */\n\nconst OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nconst err = (strm, errorCode) => {\n  strm.msg = messages[errorCode];\n  return errorCode;\n};\n\nconst rank = (f) => {\n  return ((f) * 2) - ((f) > 4 ? 9 : 0);\n};\n\nconst zero = (buf) => {\n  let len = buf.length; while (--len >= 0) { buf[len] = 0; }\n};\n\n/* ===========================================================================\n * Slide the hash table when sliding the window down (could be avoided with 32\n * bit values at the expense of memory usage). We slide even when level == 0 to\n * keep the hash table consistent if we switch back to level > 0 later.\n */\nconst slide_hash = (s) => {\n  let n, m;\n  let p;\n  let wsize = s.w_size;\n\n  n = s.hash_size;\n  p = n;\n  do {\n    m = s.head[--p];\n    s.head[p] = (m >= wsize ? m - wsize : 0);\n  } while (--n);\n  n = wsize;\n//#ifndef FASTEST\n  p = n;\n  do {\n    m = s.prev[--p];\n    s.prev[p] = (m >= wsize ? m - wsize : 0);\n    /* If n is not on any hash chain, prev[n] is garbage but\n     * its value will never be used.\n     */\n  } while (--n);\n//#endif\n};\n\n/* eslint-disable new-cap */\nlet HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;\n// This hash causes less collisions, https://github.com/nodeca/pako/issues/135\n// But breaks binary compatibility\n//let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask;\nlet HASH = HASH_ZLIB;\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output, except for\n * some deflate_stored() output, goes through this function so some\n * applications may wish to modify it to avoid allocating a large\n * strm->next_out buffer and copying into it. (See also read_buf()).\n */\nconst flush_pending = (strm) => {\n  const s = strm.state;\n\n  //_tr_flush_bits(s);\n  let len = s.pending;\n  if (len > strm.avail_out) {\n    len = strm.avail_out;\n  }\n  if (len === 0) { return; }\n\n  strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out);\n  strm.next_out  += len;\n  s.pending_out  += len;\n  strm.total_out += len;\n  strm.avail_out -= len;\n  s.pending      -= len;\n  if (s.pending === 0) {\n    s.pending_out = 0;\n  }\n};\n\n\nconst flush_block_only = (s, last) => {\n  _tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n  s.block_start = s.strstart;\n  flush_pending(s.strm);\n};\n\n\nconst put_byte = (s, b) => {\n  s.pending_buf[s.pending++] = b;\n};\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nconst putShortMSB = (s, b) => {\n\n  //  put_byte(s, (Byte)(b >> 8));\n//  put_byte(s, (Byte)(b & 0xff));\n  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n  s.pending_buf[s.pending++] = b & 0xff;\n};\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read.  All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nconst read_buf = (strm, buf, start, size) => {\n\n  let len = strm.avail_in;\n\n  if (len > size) { len = size; }\n  if (len === 0) { return 0; }\n\n  strm.avail_in -= len;\n\n  // zmemcpy(buf, strm->next_in, len);\n  buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start);\n  if (strm.state.wrap === 1) {\n    strm.adler = adler32_1(strm.adler, buf, len, start);\n  }\n\n  else if (strm.state.wrap === 2) {\n    strm.adler = crc32_1(strm.adler, buf, len, start);\n  }\n\n  strm.next_in += len;\n  strm.total_in += len;\n\n  return len;\n};\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nconst longest_match = (s, cur_match) => {\n\n  let chain_length = s.max_chain_length;      /* max hash chain length */\n  let scan = s.strstart; /* current string */\n  let match;                       /* matched string */\n  let len;                           /* length of current match */\n  let best_len = s.prev_length;              /* best match length so far */\n  let nice_match = s.nice_match;             /* stop if match long enough */\n  const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n  const _win = s.window; // shortcut\n\n  const wmask = s.w_mask;\n  const prev  = s.prev;\n\n  /* Stop when cur_match becomes <= limit. To simplify the code,\n   * we prevent matches with the string of window index 0.\n   */\n\n  const strend = s.strstart + MAX_MATCH;\n  let scan_end1  = _win[scan + best_len - 1];\n  let scan_end   = _win[scan + best_len];\n\n  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n   * It is easy to get rid of this optimization if necessary.\n   */\n  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n  /* Do not waste too much time if we already have a good match: */\n  if (s.prev_length >= s.good_match) {\n    chain_length >>= 2;\n  }\n  /* Do not look for matches beyond the end of the input. This is necessary\n   * to make deflate deterministic.\n   */\n  if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n  do {\n    // Assert(cur_match < s->strstart, \"no future\");\n    match = cur_match;\n\n    /* Skip to next match if the match length cannot increase\n     * or if the match length is less than 2.  Note that the checks below\n     * for insufficient lookahead only occur occasionally for performance\n     * reasons.  Therefore uninitialized memory will be accessed, and\n     * conditional jumps will be made that depend on those values.\n     * However the length of the match is limited to the lookahead, so\n     * the output of deflate is not affected by the uninitialized values.\n     */\n\n    if (_win[match + best_len]     !== scan_end  ||\n        _win[match + best_len - 1] !== scan_end1 ||\n        _win[match]                !== _win[scan] ||\n        _win[++match]              !== _win[scan + 1]) {\n      continue;\n    }\n\n    /* The check at best_len-1 can be removed because it will be made\n     * again later. (This heuristic is not always a win.)\n     * It is not necessary to compare scan[2] and match[2] since they\n     * are always equal when the other bytes match, given that\n     * the hash keys are equal and that HASH_BITS >= 8.\n     */\n    scan += 2;\n    match++;\n    // Assert(*scan == *match, \"match[2]?\");\n\n    /* We check for insufficient lookahead only every 8th comparison;\n     * the 256th check will be made at strstart+258.\n     */\n    do {\n      /*jshint noempty:false*/\n    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             scan < strend);\n\n    // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n    len = MAX_MATCH - (strend - scan);\n    scan = strend - MAX_MATCH;\n\n    if (len > best_len) {\n      s.match_start = cur_match;\n      best_len = len;\n      if (len >= nice_match) {\n        break;\n      }\n      scan_end1  = _win[scan + best_len - 1];\n      scan_end   = _win[scan + best_len];\n    }\n  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n  if (best_len <= s.lookahead) {\n    return best_len;\n  }\n  return s.lookahead;\n};\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n *    At least one byte has been read, or avail_in == 0; reads are\n *    performed for at least two bytes (required for the zip translate_eol\n *    option -- not supported here).\n */\nconst fill_window = (s) => {\n\n  const _w_size = s.w_size;\n  let n, more, str;\n\n  //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n  do {\n    more = s.window_size - s.lookahead - s.strstart;\n\n    // JS ints have 32 bit, block below not needed\n    /* Deal with !@#$% 64K limit: */\n    //if (sizeof(int) <= 2) {\n    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n    //        more = wsize;\n    //\n    //  } else if (more == (unsigned)(-1)) {\n    //        /* Very unlikely, but possible on 16 bit machine if\n    //         * strstart == 0 && lookahead == 1 (input done a byte at time)\n    //         */\n    //        more--;\n    //    }\n    //}\n\n\n    /* If the window is almost full and there is insufficient lookahead,\n     * move the upper half to the lower one to make room in the upper half.\n     */\n    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n      s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0);\n      s.match_start -= _w_size;\n      s.strstart -= _w_size;\n      /* we now have strstart >= MAX_DIST */\n      s.block_start -= _w_size;\n      if (s.insert > s.strstart) {\n        s.insert = s.strstart;\n      }\n      slide_hash(s);\n      more += _w_size;\n    }\n    if (s.strm.avail_in === 0) {\n      break;\n    }\n\n    /* If there was no sliding:\n     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n     *    more == window_size - lookahead - strstart\n     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n     * => more >= window_size - 2*WSIZE + 2\n     * In the BIG_MEM or MMAP case (not yet supported),\n     *   window_size == input_size + MIN_LOOKAHEAD  &&\n     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n     * Otherwise, window_size == 2*WSIZE so more >= 2.\n     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n     */\n    //Assert(more >= 2, \"more < 2\");\n    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n    s.lookahead += n;\n\n    /* Initialize the hash value now that we have some input: */\n    if (s.lookahead + s.insert >= MIN_MATCH) {\n      str = s.strstart - s.insert;\n      s.ins_h = s.window[str];\n\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n      s.ins_h = HASH(s, s.ins_h, s.window[str + 1]);\n//#if MIN_MATCH != 3\n//        Call update_hash() MIN_MATCH-3 more times\n//#endif\n      while (s.insert) {\n        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n        s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n\n        s.prev[str & s.w_mask] = s.head[s.ins_h];\n        s.head[s.ins_h] = str;\n        str++;\n        s.insert--;\n        if (s.lookahead + s.insert < MIN_MATCH) {\n          break;\n        }\n      }\n    }\n    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n     * but this is not important since only literal bytes will be emitted.\n     */\n\n  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n  /* If the WIN_INIT bytes after the end of the current data have never been\n   * written, then zero those bytes in order to avoid memory check reports of\n   * the use of uninitialized (or uninitialised as Julian writes) bytes by\n   * the longest match routines.  Update the high water mark for the next\n   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match\n   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n   */\n//  if (s.high_water < s.window_size) {\n//    const curr = s.strstart + s.lookahead;\n//    let init = 0;\n//\n//    if (s.high_water < curr) {\n//      /* Previous high water mark below current data -- zero WIN_INIT\n//       * bytes or up to end of window, whichever is less.\n//       */\n//      init = s.window_size - curr;\n//      if (init > WIN_INIT)\n//        init = WIN_INIT;\n//      zmemzero(s->window + curr, (unsigned)init);\n//      s->high_water = curr + init;\n//    }\n//    else if (s->high_water < (ulg)curr + WIN_INIT) {\n//      /* High water mark at or above current data, but below current data\n//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n//       * to end of window, whichever is less.\n//       */\n//      init = (ulg)curr + WIN_INIT - s->high_water;\n//      if (init > s->window_size - s->high_water)\n//        init = s->window_size - s->high_water;\n//      zmemzero(s->window + s->high_water, (unsigned)init);\n//      s->high_water += init;\n//    }\n//  }\n//\n//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n//    \"not enough room for search\");\n};\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n *\n * In case deflateParams() is used to later switch to a non-zero compression\n * level, s->matches (otherwise unused when storing) keeps track of the number\n * of hash table slides to perform. If s->matches is 1, then one hash table\n * slide will be done when switching. If s->matches is 2, the maximum value\n * allowed here, then the hash table will be cleared, since two or more slides\n * is the same as a clear.\n *\n * deflate_stored() is written to minimize the number of times an input byte is\n * copied. It is most efficient with large input and output buffers, which\n * maximizes the opportunites to have a single copy from next_in to next_out.\n */\nconst deflate_stored = (s, flush) => {\n\n  /* Smallest worthy block size when not flushing or finishing. By default\n   * this is 32K. This can be as small as 507 bytes for memLevel == 1. For\n   * large input and output buffers, the stored block size will be larger.\n   */\n  let min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5;\n\n  /* Copy as many min_block or larger stored blocks directly to next_out as\n   * possible. If flushing, copy the remaining available input to next_out as\n   * stored blocks, if there is enough space.\n   */\n  let len, left, have, last = 0;\n  let used = s.strm.avail_in;\n  do {\n    /* Set len to the maximum size block that we can copy directly with the\n     * available input data and output space. Set left to how much of that\n     * would be copied from what's left in the window.\n     */\n    len = 65535/* MAX_STORED */;     /* maximum deflate stored block length */\n    have = (s.bi_valid + 42) >> 3;     /* number of header bytes */\n    if (s.strm.avail_out < have) {         /* need room for header */\n      break;\n    }\n      /* maximum stored block length that will fit in avail_out: */\n    have = s.strm.avail_out - have;\n    left = s.strstart - s.block_start;  /* bytes left in window */\n    if (len > left + s.strm.avail_in) {\n      len = left + s.strm.avail_in;   /* limit len to the input */\n    }\n    if (len > have) {\n      len = have;             /* limit len to the output */\n    }\n\n    /* If the stored block would be less than min_block in length, or if\n     * unable to copy all of the available input when flushing, then try\n     * copying to the window and the pending buffer instead. Also don't\n     * write an empty block when flushing -- deflate() does that.\n     */\n    if (len < min_block && ((len === 0 && flush !== Z_FINISH$3) ||\n                        flush === Z_NO_FLUSH$2 ||\n                        len !== left + s.strm.avail_in)) {\n      break;\n    }\n\n    /* Make a dummy stored block in pending to get the header bytes,\n     * including any pending bits. This also updates the debugging counts.\n     */\n    last = flush === Z_FINISH$3 && len === left + s.strm.avail_in ? 1 : 0;\n    _tr_stored_block(s, 0, 0, last);\n\n    /* Replace the lengths in the dummy stored block with len. */\n    s.pending_buf[s.pending - 4] = len;\n    s.pending_buf[s.pending - 3] = len >> 8;\n    s.pending_buf[s.pending - 2] = ~len;\n    s.pending_buf[s.pending - 1] = ~len >> 8;\n\n    /* Write the stored block header bytes. */\n    flush_pending(s.strm);\n\n//#ifdef ZLIB_DEBUG\n//    /* Update debugging counts for the data about to be copied. */\n//    s->compressed_len += len << 3;\n//    s->bits_sent += len << 3;\n//#endif\n\n    /* Copy uncompressed bytes from the window to next_out. */\n    if (left) {\n      if (left > len) {\n        left = len;\n      }\n      //zmemcpy(s->strm->next_out, s->window + s->block_start, left);\n      s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out);\n      s.strm.next_out += left;\n      s.strm.avail_out -= left;\n      s.strm.total_out += left;\n      s.block_start += left;\n      len -= left;\n    }\n\n    /* Copy uncompressed bytes directly from next_in to next_out, updating\n     * the check value.\n     */\n    if (len) {\n      read_buf(s.strm, s.strm.output, s.strm.next_out, len);\n      s.strm.next_out += len;\n      s.strm.avail_out -= len;\n      s.strm.total_out += len;\n    }\n  } while (last === 0);\n\n  /* Update the sliding window with the last s->w_size bytes of the copied\n   * data, or append all of the copied data to the existing window if less\n   * than s->w_size bytes were copied. Also update the number of bytes to\n   * insert in the hash tables, in the event that deflateParams() switches to\n   * a non-zero compression level.\n   */\n  used -= s.strm.avail_in;    /* number of input bytes directly copied */\n  if (used) {\n    /* If any input was used, then no unused input remains in the window,\n     * therefore s->block_start == s->strstart.\n     */\n    if (used >= s.w_size) {  /* supplant the previous history */\n      s.matches = 2;     /* clear hash */\n      //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size);\n      s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0);\n      s.strstart = s.w_size;\n      s.insert = s.strstart;\n    }\n    else {\n      if (s.window_size - s.strstart <= used) {\n        /* Slide the window down. */\n        s.strstart -= s.w_size;\n        //zmemcpy(s->window, s->window + s->w_size, s->strstart);\n        s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);\n        if (s.matches < 2) {\n          s.matches++;   /* add a pending slide_hash() */\n        }\n        if (s.insert > s.strstart) {\n          s.insert = s.strstart;\n        }\n      }\n      //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used);\n      s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart);\n      s.strstart += used;\n      s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used;\n    }\n    s.block_start = s.strstart;\n  }\n  if (s.high_water < s.strstart) {\n    s.high_water = s.strstart;\n  }\n\n  /* If the last block was written to next_out, then done. */\n  if (last) {\n    return BS_FINISH_DONE;\n  }\n\n  /* If flushing and all input has been consumed, then done. */\n  if (flush !== Z_NO_FLUSH$2 && flush !== Z_FINISH$3 &&\n    s.strm.avail_in === 0 && s.strstart === s.block_start) {\n    return BS_BLOCK_DONE;\n  }\n\n  /* Fill the window with any remaining input. */\n  have = s.window_size - s.strstart;\n  if (s.strm.avail_in > have && s.block_start >= s.w_size) {\n    /* Slide the window down. */\n    s.block_start -= s.w_size;\n    s.strstart -= s.w_size;\n    //zmemcpy(s->window, s->window + s->w_size, s->strstart);\n    s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);\n    if (s.matches < 2) {\n      s.matches++;       /* add a pending slide_hash() */\n    }\n    have += s.w_size;      /* more space now */\n    if (s.insert > s.strstart) {\n      s.insert = s.strstart;\n    }\n  }\n  if (have > s.strm.avail_in) {\n    have = s.strm.avail_in;\n  }\n  if (have) {\n    read_buf(s.strm, s.window, s.strstart, have);\n    s.strstart += have;\n    s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have;\n  }\n  if (s.high_water < s.strstart) {\n    s.high_water = s.strstart;\n  }\n\n  /* There was not enough avail_out to write a complete worthy or flushed\n   * stored block to next_out. Write a stored block to pending instead, if we\n   * have enough input for a worthy block, or if flushing and there is enough\n   * room for the remaining input as a stored block in the pending buffer.\n   */\n  have = (s.bi_valid + 42) >> 3;     /* number of header bytes */\n    /* maximum stored block length that will fit in pending: */\n  have = s.pending_buf_size - have > 65535/* MAX_STORED */ ? 65535/* MAX_STORED */ : s.pending_buf_size - have;\n  min_block = have > s.w_size ? s.w_size : have;\n  left = s.strstart - s.block_start;\n  if (left >= min_block ||\n     ((left || flush === Z_FINISH$3) && flush !== Z_NO_FLUSH$2 &&\n     s.strm.avail_in === 0 && left <= have)) {\n    len = left > have ? have : left;\n    last = flush === Z_FINISH$3 && s.strm.avail_in === 0 &&\n         len === left ? 1 : 0;\n    _tr_stored_block(s, s.block_start, len, last);\n    s.block_start += len;\n    flush_pending(s.strm);\n  }\n\n  /* We've done all we can with the available input and output. */\n  return last ? BS_FINISH_STARTED : BS_NEED_MORE;\n};\n\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nconst deflate_fast = (s, flush) => {\n\n  let hash_head;        /* head of the hash chain */\n  let bflush;           /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) {\n        break; /* flush the current block */\n      }\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     * At this point we have always match_length < MIN_MATCH\n     */\n    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n    }\n    if (s.match_length >= MIN_MATCH) {\n      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n      /*** _tr_tally_dist(s, s.strstart - s.match_start,\n                     s.match_length - MIN_MATCH, bflush); ***/\n      bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n\n      /* Insert new strings in the hash table only if the match length\n       * is not too large. This saves time but degrades compression.\n       */\n      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n        s.match_length--; /* string at strstart already in table */\n        do {\n          s.strstart++;\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n          /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n           * always MIN_MATCH bytes ahead.\n           */\n        } while (--s.match_length !== 0);\n        s.strstart++;\n      } else\n      {\n        s.strstart += s.match_length;\n        s.match_length = 0;\n        s.ins_h = s.window[s.strstart];\n        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n        s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);\n\n//#if MIN_MATCH != 3\n//                Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n         * matter since it will be recomputed at next deflate call.\n         */\n      }\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n  if (flush === Z_FINISH$3) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.sym_next) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nconst deflate_slow = (s, flush) => {\n\n  let hash_head;          /* head of hash chain */\n  let bflush;              /* set if current block must be flushed */\n\n  let max_insert;\n\n  /* Process the input block. */\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     */\n    s.prev_length = s.match_length;\n    s.prev_match = s.match_start;\n    s.match_length = MIN_MATCH - 1;\n\n    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n\n      if (s.match_length <= 5 &&\n         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n        /* If prev_match is also MIN_MATCH, match_start is garbage\n         * but we will ignore the current match anyway.\n         */\n        s.match_length = MIN_MATCH - 1;\n      }\n    }\n    /* If there was a match at the previous step and the current\n     * match is not better, output the previous match:\n     */\n    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n      max_insert = s.strstart + s.lookahead - MIN_MATCH;\n      /* Do not insert strings in hash table beyond this. */\n\n      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n                     s.prev_length - MIN_MATCH, bflush);***/\n      bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n      /* Insert in hash table all strings up to the end of the match.\n       * strstart-1 and strstart are already inserted. If there is not\n       * enough lookahead, the last two strings are not inserted in\n       * the hash table.\n       */\n      s.lookahead -= s.prev_length - 1;\n      s.prev_length -= 2;\n      do {\n        if (++s.strstart <= max_insert) {\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n        }\n      } while (--s.prev_length !== 0);\n      s.match_available = 0;\n      s.match_length = MIN_MATCH - 1;\n      s.strstart++;\n\n      if (bflush) {\n        /*** FLUSH_BLOCK(s, 0); ***/\n        flush_block_only(s, false);\n        if (s.strm.avail_out === 0) {\n          return BS_NEED_MORE;\n        }\n        /***/\n      }\n\n    } else if (s.match_available) {\n      /* If there was no match at the previous position, output a\n       * single literal. If there was a match but the current match\n       * is longer, truncate the previous match to a single literal.\n       */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n      bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n      if (bflush) {\n        /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n        flush_block_only(s, false);\n        /***/\n      }\n      s.strstart++;\n      s.lookahead--;\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n    } else {\n      /* There is no previous match to compare with, wait for\n       * the next step to decide.\n       */\n      s.match_available = 1;\n      s.strstart++;\n      s.lookahead--;\n    }\n  }\n  //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n  if (s.match_available) {\n    //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n    bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n    s.match_available = 0;\n  }\n  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n  if (flush === Z_FINISH$3) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.sym_next) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_BLOCK_DONE;\n};\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one.  Do not maintain a hash table.  (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nconst deflate_rle = (s, flush) => {\n\n  let bflush;            /* set if current block must be flushed */\n  let prev;              /* byte at distance one to match */\n  let scan, strend;      /* scan goes up to strend for length of run */\n\n  const _win = s.window;\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the longest run, plus one for the unrolled loop.\n     */\n    if (s.lookahead <= MAX_MATCH) {\n      fill_window(s);\n      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$2) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* See how many times the previous byte repeats */\n    s.match_length = 0;\n    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n      scan = s.strstart - 1;\n      prev = _win[scan];\n      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n        strend = s.strstart + MAX_MATCH;\n        do {\n          /*jshint noempty:false*/\n        } while (prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 scan < strend);\n        s.match_length = MAX_MATCH - (strend - scan);\n        if (s.match_length > s.lookahead) {\n          s.match_length = s.lookahead;\n        }\n      }\n      //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n    }\n\n    /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n    if (s.match_length >= MIN_MATCH) {\n      //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n      bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n      s.strstart += s.match_length;\n      s.match_length = 0;\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH$3) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.sym_next) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nconst deflate_huff = (s, flush) => {\n\n  let bflush;             /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we have a literal to write. */\n    if (s.lookahead === 0) {\n      fill_window(s);\n      if (s.lookahead === 0) {\n        if (flush === Z_NO_FLUSH$2) {\n          return BS_NEED_MORE;\n        }\n        break;      /* flush the current block */\n      }\n    }\n\n    /* Output a literal byte */\n    s.match_length = 0;\n    //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n    bflush = _tr_tally(s, 0, s.window[s.strstart]);\n    s.lookahead--;\n    s.strstart++;\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH$3) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.sym_next) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n};\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n\n  this.good_length = good_length;\n  this.max_lazy = max_lazy;\n  this.nice_length = nice_length;\n  this.max_chain = max_chain;\n  this.func = func;\n}\n\nconst configuration_table = [\n  /*      good lazy nice chain */\n  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */\n  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */\n  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */\n  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */\n\n  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */\n  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */\n  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */\n  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */\n  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */\n  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nconst lm_init = (s) => {\n\n  s.window_size = 2 * s.w_size;\n\n  /*** CLEAR_HASH(s); ***/\n  zero(s.head); // Fill with NIL (= 0);\n\n  /* Set the default configuration parameters:\n   */\n  s.max_lazy_match = configuration_table[s.level].max_lazy;\n  s.good_match = configuration_table[s.level].good_length;\n  s.nice_match = configuration_table[s.level].nice_length;\n  s.max_chain_length = configuration_table[s.level].max_chain;\n\n  s.strstart = 0;\n  s.block_start = 0;\n  s.lookahead = 0;\n  s.insert = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  s.ins_h = 0;\n};\n\n\nfunction DeflateState() {\n  this.strm = null;            /* pointer back to this zlib stream */\n  this.status = 0;            /* as the name implies */\n  this.pending_buf = null;      /* output still pending */\n  this.pending_buf_size = 0;  /* size of pending_buf */\n  this.pending_out = 0;       /* next pending byte to output to the stream */\n  this.pending = 0;           /* nb of bytes in the pending buffer */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.gzhead = null;         /* gzip header information to write */\n  this.gzindex = 0;           /* where in extra, name, or comment */\n  this.method = Z_DEFLATED$2; /* can only be DEFLATED */\n  this.last_flush = -1;   /* value of flush param for previous deflate call */\n\n  this.w_size = 0;  /* LZ77 window size (32K by default) */\n  this.w_bits = 0;  /* log2(w_size)  (8..16) */\n  this.w_mask = 0;  /* w_size - 1 */\n\n  this.window = null;\n  /* Sliding window. Input bytes are read into the second half of the window,\n   * and move to the first half later to keep a dictionary of at least wSize\n   * bytes. With this organization, matches are limited to a distance of\n   * wSize-MAX_MATCH bytes, but this ensures that IO is always\n   * performed with a length multiple of the block size.\n   */\n\n  this.window_size = 0;\n  /* Actual size of window: 2*wSize, except when the user input buffer\n   * is directly used as sliding window.\n   */\n\n  this.prev = null;\n  /* Link to older string with same hash index. To limit the size of this\n   * array to 64K, this link is maintained only for the last 32K strings.\n   * An index in this array is thus a window index modulo 32K.\n   */\n\n  this.head = null;   /* Heads of the hash chains or NIL. */\n\n  this.ins_h = 0;       /* hash index of string to be inserted */\n  this.hash_size = 0;   /* number of elements in hash table */\n  this.hash_bits = 0;   /* log2(hash_size) */\n  this.hash_mask = 0;   /* hash_size-1 */\n\n  this.hash_shift = 0;\n  /* Number of bits by which ins_h must be shifted at each input\n   * step. It must be such that after MIN_MATCH steps, the oldest\n   * byte no longer takes part in the hash key, that is:\n   *   hash_shift * MIN_MATCH >= hash_bits\n   */\n\n  this.block_start = 0;\n  /* Window position at the beginning of the current output block. Gets\n   * negative when the window is moved backwards.\n   */\n\n  this.match_length = 0;      /* length of best match */\n  this.prev_match = 0;        /* previous match */\n  this.match_available = 0;   /* set if previous match exists */\n  this.strstart = 0;          /* start of string to insert */\n  this.match_start = 0;       /* start of matching string */\n  this.lookahead = 0;         /* number of valid bytes ahead in window */\n\n  this.prev_length = 0;\n  /* Length of the best match at previous step. Matches not greater than this\n   * are discarded. This is used in the lazy match evaluation.\n   */\n\n  this.max_chain_length = 0;\n  /* To speed up deflation, hash chains are never searched beyond this\n   * length.  A higher limit improves compression ratio but degrades the\n   * speed.\n   */\n\n  this.max_lazy_match = 0;\n  /* Attempt to find a better match only when the current match is strictly\n   * smaller than this value. This mechanism is used only for compression\n   * levels >= 4.\n   */\n  // That's alias to max_lazy_match, don't use directly\n  //this.max_insert_length = 0;\n  /* Insert new strings in the hash table only if the match length is not\n   * greater than this length. This saves time but degrades compression.\n   * max_insert_length is used only for compression levels <= 3.\n   */\n\n  this.level = 0;     /* compression level (1..9) */\n  this.strategy = 0;  /* favor or force Huffman coding*/\n\n  this.good_match = 0;\n  /* Use a faster search when the previous match is longer than this */\n\n  this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n              /* used by trees.c: */\n\n  /* Didn't use ct_data typedef below to suppress compiler warning */\n\n  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */\n  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */\n\n  // Use flat array of DOUBLE size, with interleaved fata,\n  // because JS does not support effective\n  this.dyn_ltree  = new Uint16Array(HEAP_SIZE * 2);\n  this.dyn_dtree  = new Uint16Array((2 * D_CODES + 1) * 2);\n  this.bl_tree    = new Uint16Array((2 * BL_CODES + 1) * 2);\n  zero(this.dyn_ltree);\n  zero(this.dyn_dtree);\n  zero(this.bl_tree);\n\n  this.l_desc   = null;         /* desc. for literal tree */\n  this.d_desc   = null;         /* desc. for distance tree */\n  this.bl_desc  = null;         /* desc. for bit length tree */\n\n  //ush bl_count[MAX_BITS+1];\n  this.bl_count = new Uint16Array(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */\n  this.heap = new Uint16Array(2 * L_CODES + 1);  /* heap used to build the Huffman trees */\n  zero(this.heap);\n\n  this.heap_len = 0;               /* number of elements in the heap */\n  this.heap_max = 0;               /* element of largest frequency */\n  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n   * The same heap array is used to build all trees.\n   */\n\n  this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n  zero(this.depth);\n  /* Depth of each subtree used as tie breaker for trees of equal frequency\n   */\n\n  this.sym_buf = 0;        /* buffer for distances and literals/lengths */\n\n  this.lit_bufsize = 0;\n  /* Size of match buffer for literals/lengths.  There are 4 reasons for\n   * limiting lit_bufsize to 64K:\n   *   - frequencies can be kept in 16 bit counters\n   *   - if compression is not successful for the first block, all input\n   *     data is still in the window so we can still emit a stored block even\n   *     when input comes from standard input.  (This can also be done for\n   *     all blocks if lit_bufsize is not greater than 32K.)\n   *   - if compression is not successful for a file smaller than 64K, we can\n   *     even emit a stored file instead of a stored block (saving 5 bytes).\n   *     This is applicable only for zip (not gzip or zlib).\n   *   - creating new Huffman trees less frequently may not provide fast\n   *     adaptation to changes in the input data statistics. (Take for\n   *     example a binary file with poorly compressible code followed by\n   *     a highly compressible string table.) Smaller buffer sizes give\n   *     fast adaptation but have of course the overhead of transmitting\n   *     trees more frequently.\n   *   - I can't count above 4\n   */\n\n  this.sym_next = 0;      /* running index in sym_buf */\n  this.sym_end = 0;       /* symbol table full when sym_next reaches this */\n\n  this.opt_len = 0;       /* bit length of current block with optimal trees */\n  this.static_len = 0;    /* bit length of current block with static trees */\n  this.matches = 0;       /* number of string matches in current block */\n  this.insert = 0;        /* bytes at end of window left to insert */\n\n\n  this.bi_buf = 0;\n  /* Output buffer. bits are inserted starting at the bottom (least\n   * significant bits).\n   */\n  this.bi_valid = 0;\n  /* Number of valid bits in bi_buf.  All bits above the last valid bit\n   * are always zero.\n   */\n\n  // Used for window memory init. We safely ignore it for JS. That makes\n  // sense only for pointers and memory check tools.\n  //this.high_water = 0;\n  /* High water mark offset in window for initialized bytes -- bytes above\n   * this are set to zero in order to avoid memory check warnings when\n   * longest match routines access bytes past the input.  This is then\n   * updated to the new high water mark.\n   */\n}\n\n\n/* =========================================================================\n * Check for a valid deflate stream state. Return 0 if ok, 1 if not.\n */\nconst deflateStateCheck = (strm) => {\n\n  if (!strm) {\n    return 1;\n  }\n  const s = strm.state;\n  if (!s || s.strm !== strm || (s.status !== INIT_STATE &&\n//#ifdef GZIP\n                                s.status !== GZIP_STATE &&\n//#endif\n                                s.status !== EXTRA_STATE &&\n                                s.status !== NAME_STATE &&\n                                s.status !== COMMENT_STATE &&\n                                s.status !== HCRC_STATE &&\n                                s.status !== BUSY_STATE &&\n                                s.status !== FINISH_STATE)) {\n    return 1;\n  }\n  return 0;\n};\n\n\nconst deflateResetKeep = (strm) => {\n\n  if (deflateStateCheck(strm)) {\n    return err(strm, Z_STREAM_ERROR$2);\n  }\n\n  strm.total_in = strm.total_out = 0;\n  strm.data_type = Z_UNKNOWN;\n\n  const s = strm.state;\n  s.pending = 0;\n  s.pending_out = 0;\n\n  if (s.wrap < 0) {\n    s.wrap = -s.wrap;\n    /* was made negative by deflate(..., Z_FINISH); */\n  }\n  s.status =\n//#ifdef GZIP\n    s.wrap === 2 ? GZIP_STATE :\n//#endif\n    s.wrap ? INIT_STATE : BUSY_STATE;\n  strm.adler = (s.wrap === 2) ?\n    0  // crc32(0, Z_NULL, 0)\n  :\n    1; // adler32(0, Z_NULL, 0)\n  s.last_flush = -2;\n  _tr_init(s);\n  return Z_OK$3;\n};\n\n\nconst deflateReset = (strm) => {\n\n  const ret = deflateResetKeep(strm);\n  if (ret === Z_OK$3) {\n    lm_init(strm.state);\n  }\n  return ret;\n};\n\n\nconst deflateSetHeader = (strm, head) => {\n\n  if (deflateStateCheck(strm) || strm.state.wrap !== 2) {\n    return Z_STREAM_ERROR$2;\n  }\n  strm.state.gzhead = head;\n  return Z_OK$3;\n};\n\n\nconst deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {\n\n  if (!strm) { // === Z_NULL\n    return Z_STREAM_ERROR$2;\n  }\n  let wrap = 1;\n\n  if (level === Z_DEFAULT_COMPRESSION$1) {\n    level = 6;\n  }\n\n  if (windowBits < 0) { /* suppress zlib wrapper */\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n\n  else if (windowBits > 15) {\n    wrap = 2;           /* write gzip wrapper instead */\n    windowBits -= 16;\n  }\n\n\n  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$2 ||\n    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n    strategy < 0 || strategy > Z_FIXED || (windowBits === 8 && wrap !== 1)) {\n    return err(strm, Z_STREAM_ERROR$2);\n  }\n\n\n  if (windowBits === 8) {\n    windowBits = 9;\n  }\n  /* until 256-byte window bug fixed */\n\n  const s = new DeflateState();\n\n  strm.state = s;\n  s.strm = strm;\n  s.status = INIT_STATE;     /* to pass state test in deflateReset() */\n\n  s.wrap = wrap;\n  s.gzhead = null;\n  s.w_bits = windowBits;\n  s.w_size = 1 << s.w_bits;\n  s.w_mask = s.w_size - 1;\n\n  s.hash_bits = memLevel + 7;\n  s.hash_size = 1 << s.hash_bits;\n  s.hash_mask = s.hash_size - 1;\n  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n  s.window = new Uint8Array(s.w_size * 2);\n  s.head = new Uint16Array(s.hash_size);\n  s.prev = new Uint16Array(s.w_size);\n\n  // Don't need mem init magic for JS.\n  //s.high_water = 0;  /* nothing written to s->window yet */\n\n  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n  /* We overlay pending_buf and sym_buf. This works since the average size\n   * for length/distance pairs over any compressed block is assured to be 31\n   * bits or less.\n   *\n   * Analysis: The longest fixed codes are a length code of 8 bits plus 5\n   * extra bits, for lengths 131 to 257. The longest fixed distance codes are\n   * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest\n   * possible fixed-codes length/distance pair is then 31 bits total.\n   *\n   * sym_buf starts one-fourth of the way into pending_buf. So there are\n   * three bytes in sym_buf for every four bytes in pending_buf. Each symbol\n   * in sym_buf is three bytes -- two for the distance and one for the\n   * literal/length. As each symbol is consumed, the pointer to the next\n   * sym_buf value to read moves forward three bytes. From that symbol, up to\n   * 31 bits are written to pending_buf. The closest the written pending_buf\n   * bits gets to the next sym_buf symbol to read is just before the last\n   * code is written. At that time, 31*(n-2) bits have been written, just\n   * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at\n   * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1\n   * symbols are written.) The closest the writing gets to what is unread is\n   * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and\n   * can range from 128 to 32768.\n   *\n   * Therefore, at a minimum, there are 142 bits of space between what is\n   * written and what is read in the overlain buffers, so the symbols cannot\n   * be overwritten by the compressed data. That space is actually 139 bits,\n   * due to the three-bit fixed-code block header.\n   *\n   * That covers the case where either Z_FIXED is specified, forcing fixed\n   * codes, or when the use of fixed codes is chosen, because that choice\n   * results in a smaller compressed block than dynamic codes. That latter\n   * condition then assures that the above analysis also covers all dynamic\n   * blocks. A dynamic-code block will only be chosen to be emitted if it has\n   * fewer bits than a fixed-code block would for the same set of symbols.\n   * Therefore its average symbol length is assured to be less than 31. So\n   * the compressed data for a dynamic block also cannot overwrite the\n   * symbols from which it is being constructed.\n   */\n\n  s.pending_buf_size = s.lit_bufsize * 4;\n  s.pending_buf = new Uint8Array(s.pending_buf_size);\n\n  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n  //s->sym_buf = s->pending_buf + s->lit_bufsize;\n  s.sym_buf = s.lit_bufsize;\n\n  //s->sym_end = (s->lit_bufsize - 1) * 3;\n  s.sym_end = (s.lit_bufsize - 1) * 3;\n  /* We avoid equality with lit_bufsize*3 because of wraparound at 64K\n   * on 16 bit machines and because stored blocks are restricted to\n   * 64K-1 bytes.\n   */\n\n  s.level = level;\n  s.strategy = strategy;\n  s.method = method;\n\n  return deflateReset(strm);\n};\n\nconst deflateInit = (strm, level) => {\n\n  return deflateInit2(strm, level, Z_DEFLATED$2, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1);\n};\n\n\n/* ========================================================================= */\nconst deflate$2 = (strm, flush) => {\n\n  if (deflateStateCheck(strm) || flush > Z_BLOCK$1 || flush < 0) {\n    return strm ? err(strm, Z_STREAM_ERROR$2) : Z_STREAM_ERROR$2;\n  }\n\n  const s = strm.state;\n\n  if (!strm.output ||\n      (strm.avail_in !== 0 && !strm.input) ||\n      (s.status === FINISH_STATE && flush !== Z_FINISH$3)) {\n    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$2);\n  }\n\n  const old_flush = s.last_flush;\n  s.last_flush = flush;\n\n  /* Flush as much pending output as possible */\n  if (s.pending !== 0) {\n    flush_pending(strm);\n    if (strm.avail_out === 0) {\n      /* Since avail_out is 0, deflate will be called again with\n       * more output space, but possibly with both pending and\n       * avail_in equal to zero. There won't be anything to do,\n       * but this is not an error situation so make sure we\n       * return OK instead of BUF_ERROR at next call of deflate:\n       */\n      s.last_flush = -1;\n      return Z_OK$3;\n    }\n\n    /* Make sure there is something to do and avoid duplicate consecutive\n     * flushes. For repeated and useless calls with Z_FINISH, we keep\n     * returning Z_STREAM_END instead of Z_BUF_ERROR.\n     */\n  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n    flush !== Z_FINISH$3) {\n    return err(strm, Z_BUF_ERROR$1);\n  }\n\n  /* User must not provide more input after the first FINISH: */\n  if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n    return err(strm, Z_BUF_ERROR$1);\n  }\n\n  /* Write the header */\n  if (s.status === INIT_STATE && s.wrap === 0) {\n    s.status = BUSY_STATE;\n  }\n  if (s.status === INIT_STATE) {\n    /* zlib header */\n    let header = (Z_DEFLATED$2 + ((s.w_bits - 8) << 4)) << 8;\n    let level_flags = -1;\n\n    if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n      level_flags = 0;\n    } else if (s.level < 6) {\n      level_flags = 1;\n    } else if (s.level === 6) {\n      level_flags = 2;\n    } else {\n      level_flags = 3;\n    }\n    header |= (level_flags << 6);\n    if (s.strstart !== 0) { header |= PRESET_DICT; }\n    header += 31 - (header % 31);\n\n    putShortMSB(s, header);\n\n    /* Save the adler32 of the preset dictionary: */\n    if (s.strstart !== 0) {\n      putShortMSB(s, strm.adler >>> 16);\n      putShortMSB(s, strm.adler & 0xffff);\n    }\n    strm.adler = 1; // adler32(0L, Z_NULL, 0);\n    s.status = BUSY_STATE;\n\n    /* Compression must start with an empty pending buffer */\n    flush_pending(strm);\n    if (s.pending !== 0) {\n      s.last_flush = -1;\n      return Z_OK$3;\n    }\n  }\n//#ifdef GZIP\n  if (s.status === GZIP_STATE) {\n    /* gzip header */\n    strm.adler = 0;  //crc32(0L, Z_NULL, 0);\n    put_byte(s, 31);\n    put_byte(s, 139);\n    put_byte(s, 8);\n    if (!s.gzhead) { // s->gzhead == Z_NULL\n      put_byte(s, 0);\n      put_byte(s, 0);\n      put_byte(s, 0);\n      put_byte(s, 0);\n      put_byte(s, 0);\n      put_byte(s, s.level === 9 ? 2 :\n                  (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                   4 : 0));\n      put_byte(s, OS_CODE);\n      s.status = BUSY_STATE;\n\n      /* Compression must start with an empty pending buffer */\n      flush_pending(strm);\n      if (s.pending !== 0) {\n        s.last_flush = -1;\n        return Z_OK$3;\n      }\n    }\n    else {\n      put_byte(s, (s.gzhead.text ? 1 : 0) +\n                  (s.gzhead.hcrc ? 2 : 0) +\n                  (!s.gzhead.extra ? 0 : 4) +\n                  (!s.gzhead.name ? 0 : 8) +\n                  (!s.gzhead.comment ? 0 : 16)\n      );\n      put_byte(s, s.gzhead.time & 0xff);\n      put_byte(s, (s.gzhead.time >> 8) & 0xff);\n      put_byte(s, (s.gzhead.time >> 16) & 0xff);\n      put_byte(s, (s.gzhead.time >> 24) & 0xff);\n      put_byte(s, s.level === 9 ? 2 :\n                  (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                   4 : 0));\n      put_byte(s, s.gzhead.os & 0xff);\n      if (s.gzhead.extra && s.gzhead.extra.length) {\n        put_byte(s, s.gzhead.extra.length & 0xff);\n        put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n      }\n      if (s.gzhead.hcrc) {\n        strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0);\n      }\n      s.gzindex = 0;\n      s.status = EXTRA_STATE;\n    }\n  }\n  if (s.status === EXTRA_STATE) {\n    if (s.gzhead.extra/* != Z_NULL*/) {\n      let beg = s.pending;   /* start of bytes to update crc */\n      let left = (s.gzhead.extra.length & 0xffff) - s.gzindex;\n      while (s.pending + left > s.pending_buf_size) {\n        let copy = s.pending_buf_size - s.pending;\n        // zmemcpy(s.pending_buf + s.pending,\n        //    s.gzhead.extra + s.gzindex, copy);\n        s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending);\n        s.pending = s.pending_buf_size;\n        //--- HCRC_UPDATE(beg) ---//\n        if (s.gzhead.hcrc && s.pending > beg) {\n          strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n        }\n        //---//\n        s.gzindex += copy;\n        flush_pending(strm);\n        if (s.pending !== 0) {\n          s.last_flush = -1;\n          return Z_OK$3;\n        }\n        beg = 0;\n        left -= copy;\n      }\n      // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility\n      //              TypedArray.slice and TypedArray.from don't exist in IE10-IE11\n      let gzhead_extra = new Uint8Array(s.gzhead.extra);\n      // zmemcpy(s->pending_buf + s->pending,\n      //     s->gzhead->extra + s->gzindex, left);\n      s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending);\n      s.pending += left;\n      //--- HCRC_UPDATE(beg) ---//\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      //---//\n      s.gzindex = 0;\n    }\n    s.status = NAME_STATE;\n  }\n  if (s.status === NAME_STATE) {\n    if (s.gzhead.name/* != Z_NULL*/) {\n      let beg = s.pending;   /* start of bytes to update crc */\n      let val;\n      do {\n        if (s.pending === s.pending_buf_size) {\n          //--- HCRC_UPDATE(beg) ---//\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          //---//\n          flush_pending(strm);\n          if (s.pending !== 0) {\n            s.last_flush = -1;\n            return Z_OK$3;\n          }\n          beg = 0;\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.name.length) {\n          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n      //--- HCRC_UPDATE(beg) ---//\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      //---//\n      s.gzindex = 0;\n    }\n    s.status = COMMENT_STATE;\n  }\n  if (s.status === COMMENT_STATE) {\n    if (s.gzhead.comment/* != Z_NULL*/) {\n      let beg = s.pending;   /* start of bytes to update crc */\n      let val;\n      do {\n        if (s.pending === s.pending_buf_size) {\n          //--- HCRC_UPDATE(beg) ---//\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          //---//\n          flush_pending(strm);\n          if (s.pending !== 0) {\n            s.last_flush = -1;\n            return Z_OK$3;\n          }\n          beg = 0;\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.comment.length) {\n          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n      //--- HCRC_UPDATE(beg) ---//\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      //---//\n    }\n    s.status = HCRC_STATE;\n  }\n  if (s.status === HCRC_STATE) {\n    if (s.gzhead.hcrc) {\n      if (s.pending + 2 > s.pending_buf_size) {\n        flush_pending(strm);\n        if (s.pending !== 0) {\n          s.last_flush = -1;\n          return Z_OK$3;\n        }\n      }\n      put_byte(s, strm.adler & 0xff);\n      put_byte(s, (strm.adler >> 8) & 0xff);\n      strm.adler = 0; //crc32(0L, Z_NULL, 0);\n    }\n    s.status = BUSY_STATE;\n\n    /* Compression must start with an empty pending buffer */\n    flush_pending(strm);\n    if (s.pending !== 0) {\n      s.last_flush = -1;\n      return Z_OK$3;\n    }\n  }\n//#endif\n\n  /* Start a new block or continue the current one.\n   */\n  if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n    (flush !== Z_NO_FLUSH$2 && s.status !== FINISH_STATE)) {\n    let bstate = s.level === 0 ? deflate_stored(s, flush) :\n                 s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :\n                 s.strategy === Z_RLE ? deflate_rle(s, flush) :\n                 configuration_table[s.level].func(s, flush);\n\n    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n      s.status = FINISH_STATE;\n    }\n    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n      if (strm.avail_out === 0) {\n        s.last_flush = -1;\n        /* avoid BUF_ERROR next call, see above */\n      }\n      return Z_OK$3;\n      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n       * of deflate should use the same flush parameter to make sure\n       * that the flush is complete. So we don't have to output an\n       * empty block here, this will be done at next call. This also\n       * ensures that for a very small output buffer, we emit at most\n       * one empty block.\n       */\n    }\n    if (bstate === BS_BLOCK_DONE) {\n      if (flush === Z_PARTIAL_FLUSH) {\n        _tr_align(s);\n      }\n      else if (flush !== Z_BLOCK$1) { /* FULL_FLUSH or SYNC_FLUSH */\n\n        _tr_stored_block(s, 0, 0, false);\n        /* For a full flush, this empty block will be recognized\n         * as a special marker by inflate_sync().\n         */\n        if (flush === Z_FULL_FLUSH$1) {\n          /*** CLEAR_HASH(s); ***/             /* forget history */\n          zero(s.head); // Fill with NIL (= 0);\n\n          if (s.lookahead === 0) {\n            s.strstart = 0;\n            s.block_start = 0;\n            s.insert = 0;\n          }\n        }\n      }\n      flush_pending(strm);\n      if (strm.avail_out === 0) {\n        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n        return Z_OK$3;\n      }\n    }\n  }\n\n  if (flush !== Z_FINISH$3) { return Z_OK$3; }\n  if (s.wrap <= 0) { return Z_STREAM_END$3; }\n\n  /* Write the trailer */\n  if (s.wrap === 2) {\n    put_byte(s, strm.adler & 0xff);\n    put_byte(s, (strm.adler >> 8) & 0xff);\n    put_byte(s, (strm.adler >> 16) & 0xff);\n    put_byte(s, (strm.adler >> 24) & 0xff);\n    put_byte(s, strm.total_in & 0xff);\n    put_byte(s, (strm.total_in >> 8) & 0xff);\n    put_byte(s, (strm.total_in >> 16) & 0xff);\n    put_byte(s, (strm.total_in >> 24) & 0xff);\n  }\n  else\n  {\n    putShortMSB(s, strm.adler >>> 16);\n    putShortMSB(s, strm.adler & 0xffff);\n  }\n\n  flush_pending(strm);\n  /* If avail_out is zero, the application will call deflate again\n   * to flush the rest.\n   */\n  if (s.wrap > 0) { s.wrap = -s.wrap; }\n  /* write the trailer only once! */\n  return s.pending !== 0 ? Z_OK$3 : Z_STREAM_END$3;\n};\n\n\nconst deflateEnd = (strm) => {\n\n  if (deflateStateCheck(strm)) {\n    return Z_STREAM_ERROR$2;\n  }\n\n  const status = strm.state.status;\n\n  strm.state = null;\n\n  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$2) : Z_OK$3;\n};\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nconst deflateSetDictionary = (strm, dictionary) => {\n\n  let dictLength = dictionary.length;\n\n  if (deflateStateCheck(strm)) {\n    return Z_STREAM_ERROR$2;\n  }\n\n  const s = strm.state;\n  const wrap = s.wrap;\n\n  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n    return Z_STREAM_ERROR$2;\n  }\n\n  /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n  if (wrap === 1) {\n    /* adler32(strm->adler, dictionary, dictLength); */\n    strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0);\n  }\n\n  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */\n\n  /* if dictionary would fill window, just replace the history */\n  if (dictLength >= s.w_size) {\n    if (wrap === 0) {            /* already empty otherwise */\n      /*** CLEAR_HASH(s); ***/\n      zero(s.head); // Fill with NIL (= 0);\n      s.strstart = 0;\n      s.block_start = 0;\n      s.insert = 0;\n    }\n    /* use the tail */\n    // dictionary = dictionary.slice(dictLength - s.w_size);\n    let tmpDict = new Uint8Array(s.w_size);\n    tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0);\n    dictionary = tmpDict;\n    dictLength = s.w_size;\n  }\n  /* insert dictionary into window and hash */\n  const avail = strm.avail_in;\n  const next = strm.next_in;\n  const input = strm.input;\n  strm.avail_in = dictLength;\n  strm.next_in = 0;\n  strm.input = dictionary;\n  fill_window(s);\n  while (s.lookahead >= MIN_MATCH) {\n    let str = s.strstart;\n    let n = s.lookahead - (MIN_MATCH - 1);\n    do {\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n      s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n\n      s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n      s.head[s.ins_h] = str;\n      str++;\n    } while (--n);\n    s.strstart = str;\n    s.lookahead = MIN_MATCH - 1;\n    fill_window(s);\n  }\n  s.strstart += s.lookahead;\n  s.block_start = s.strstart;\n  s.insert = s.lookahead;\n  s.lookahead = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  strm.next_in = next;\n  strm.input = input;\n  strm.avail_in = avail;\n  s.wrap = wrap;\n  return Z_OK$3;\n};\n\n\nvar deflateInit_1 = deflateInit;\nvar deflateInit2_1 = deflateInit2;\nvar deflateReset_1 = deflateReset;\nvar deflateResetKeep_1 = deflateResetKeep;\nvar deflateSetHeader_1 = deflateSetHeader;\nvar deflate_2$1 = deflate$2;\nvar deflateEnd_1 = deflateEnd;\nvar deflateSetDictionary_1 = deflateSetDictionary;\nvar deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.deflateBound = deflateBound;\nmodule.exports.deflateCopy = deflateCopy;\nmodule.exports.deflateGetDictionary = deflateGetDictionary;\nmodule.exports.deflateParams = deflateParams;\nmodule.exports.deflatePending = deflatePending;\nmodule.exports.deflatePrime = deflatePrime;\nmodule.exports.deflateTune = deflateTune;\n*/\n\nvar deflate_1$2 = {\n\tdeflateInit: deflateInit_1,\n\tdeflateInit2: deflateInit2_1,\n\tdeflateReset: deflateReset_1,\n\tdeflateResetKeep: deflateResetKeep_1,\n\tdeflateSetHeader: deflateSetHeader_1,\n\tdeflate: deflate_2$1,\n\tdeflateEnd: deflateEnd_1,\n\tdeflateSetDictionary: deflateSetDictionary_1,\n\tdeflateInfo: deflateInfo\n};\n\nconst _has = (obj, key) => {\n  return Object.prototype.hasOwnProperty.call(obj, key);\n};\n\nvar assign = function (obj /*from1, from2, from3, ...*/) {\n  const sources = Array.prototype.slice.call(arguments, 1);\n  while (sources.length) {\n    const source = sources.shift();\n    if (!source) { continue; }\n\n    if (typeof source !== 'object') {\n      throw new TypeError(source + 'must be non-object');\n    }\n\n    for (const p in source) {\n      if (_has(source, p)) {\n        obj[p] = source[p];\n      }\n    }\n  }\n\n  return obj;\n};\n\n\n// Join array of chunks to single array.\nvar flattenChunks = (chunks) => {\n  // calculate data length\n  let len = 0;\n\n  for (let i = 0, l = chunks.length; i < l; i++) {\n    len += chunks[i].length;\n  }\n\n  // join chunks\n  const result = new Uint8Array(len);\n\n  for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {\n    let chunk = chunks[i];\n    result.set(chunk, pos);\n    pos += chunk.length;\n  }\n\n  return result;\n};\n\nvar common = {\n\tassign: assign,\n\tflattenChunks: flattenChunks\n};\n\n// String encode/decode helpers\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nlet STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nconst _utf8len = new Uint8Array(256);\nfor (let q = 0; q < 256; q++) {\n  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nvar string2buf = (str) => {\n  if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) {\n    return new TextEncoder().encode(str);\n  }\n\n  let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n  // count binary size\n  for (m_pos = 0; m_pos < str_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n  }\n\n  // allocate buffer\n  buf = new Uint8Array(buf_len);\n\n  // convert\n  for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    if (c < 0x80) {\n      /* one byte */\n      buf[i++] = c;\n    } else if (c < 0x800) {\n      /* two bytes */\n      buf[i++] = 0xC0 | (c >>> 6);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else if (c < 0x10000) {\n      /* three bytes */\n      buf[i++] = 0xE0 | (c >>> 12);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else {\n      /* four bytes */\n      buf[i++] = 0xf0 | (c >>> 18);\n      buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    }\n  }\n\n  return buf;\n};\n\n// Helper\nconst buf2binstring = (buf, len) => {\n  // On Chrome, the arguments in a function call that are allowed is `65534`.\n  // If the length of the buffer is smaller than that, we can use this optimization,\n  // otherwise we will take a slower path.\n  if (len < 65534) {\n    if (buf.subarray && STR_APPLY_UIA_OK) {\n      return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));\n    }\n  }\n\n  let result = '';\n  for (let i = 0; i < len; i++) {\n    result += String.fromCharCode(buf[i]);\n  }\n  return result;\n};\n\n\n// convert array to string\nvar buf2string = (buf, max) => {\n  const len = max || buf.length;\n\n  if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) {\n    return new TextDecoder().decode(buf.subarray(0, max));\n  }\n\n  let i, out;\n\n  // Reserve max possible length (2 words per char)\n  // NB: by unknown reasons, Array is significantly faster for\n  //     String.fromCharCode.apply than Uint16Array.\n  const utf16buf = new Array(len * 2);\n\n  for (out = 0, i = 0; i < len;) {\n    let c = buf[i++];\n    // quick process ascii\n    if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n    let c_len = _utf8len[c];\n    // skip 5 & 6 byte codes\n    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n    // apply mask on first byte\n    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n    // join the rest\n    while (c_len > 1 && i < len) {\n      c = (c << 6) | (buf[i++] & 0x3f);\n      c_len--;\n    }\n\n    // terminated by end of string?\n    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n    if (c < 0x10000) {\n      utf16buf[out++] = c;\n    } else {\n      c -= 0x10000;\n      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n      utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n    }\n  }\n\n  return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max   - length limit (mandatory);\nvar utf8border = (buf, max) => {\n\n  max = max || buf.length;\n  if (max > buf.length) { max = buf.length; }\n\n  // go back from last position, until start of sequence found\n  let pos = max - 1;\n  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n  // Very small and broken sequence,\n  // return max, because we should return something anyway.\n  if (pos < 0) { return max; }\n\n  // If we came to start of buffer - that means buffer is too small,\n  // return max too.\n  if (pos === 0) { return max; }\n\n  return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\nvar strings = {\n\tstring2buf: string2buf,\n\tbuf2string: buf2string,\n\tutf8border: utf8border\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n  /* next input byte */\n  this.input = null; // JS specific, because we have no pointers\n  this.next_in = 0;\n  /* number of bytes available at input */\n  this.avail_in = 0;\n  /* total number of input bytes read so far */\n  this.total_in = 0;\n  /* next output byte should be put there */\n  this.output = null; // JS specific, because we have no pointers\n  this.next_out = 0;\n  /* remaining free space at output */\n  this.avail_out = 0;\n  /* total number of bytes output so far */\n  this.total_out = 0;\n  /* last error message, NULL if no error */\n  this.msg = ''/*Z_NULL*/;\n  /* not visible by applications */\n  this.state = null;\n  /* best guess about the data type: binary or text */\n  this.data_type = 2/*Z_UNKNOWN*/;\n  /* adler32 value of the uncompressed data */\n  this.adler = 0;\n}\n\nvar zstream = ZStream;\n\nconst toString$1 = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n  Z_NO_FLUSH: Z_NO_FLUSH$1, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH: Z_FINISH$2,\n  Z_OK: Z_OK$2, Z_STREAM_END: Z_STREAM_END$2,\n  Z_DEFAULT_COMPRESSION,\n  Z_DEFAULT_STRATEGY,\n  Z_DEFLATED: Z_DEFLATED$1\n} = constants$2;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `header` (Object) - custom header for gzip\n *   - `text` (Boolean) - true if compressed data believed to be text\n *   - `time` (Number) - modification time, unix timestamp\n *   - `os` (Number) - operation system code\n *   - `extra` (Array) - array of bytes with extra data (max 65536)\n *   - `name` (String) - file name (binary string)\n *   - `comment` (String) - comment (binary string)\n *   - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n *   , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true);  // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate$1(options) {\n  this.options = common.assign({\n    level: Z_DEFAULT_COMPRESSION,\n    method: Z_DEFLATED$1,\n    chunkSize: 16384,\n    windowBits: 15,\n    memLevel: 8,\n    strategy: Z_DEFAULT_STRATEGY\n  }, options || {});\n\n  let opt = this.options;\n\n  if (opt.raw && (opt.windowBits > 0)) {\n    opt.windowBits = -opt.windowBits;\n  }\n\n  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n    opt.windowBits += 16;\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm = new zstream();\n  this.strm.avail_out = 0;\n\n  let status = deflate_1$2.deflateInit2(\n    this.strm,\n    opt.level,\n    opt.method,\n    opt.windowBits,\n    opt.memLevel,\n    opt.strategy\n  );\n\n  if (status !== Z_OK$2) {\n    throw new Error(messages[status]);\n  }\n\n  if (opt.header) {\n    deflate_1$2.deflateSetHeader(this.strm, opt.header);\n  }\n\n  if (opt.dictionary) {\n    let dict;\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      // If we need to compress text, change encoding to utf8.\n      dict = strings.string2buf(opt.dictionary);\n    } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') {\n      dict = new Uint8Array(opt.dictionary);\n    } else {\n      dict = opt.dictionary;\n    }\n\n    status = deflate_1$2.deflateSetDictionary(this.strm, dict);\n\n    if (status !== Z_OK$2) {\n      throw new Error(messages[status]);\n    }\n\n    this._dict_set = true;\n  }\n}\n\n/**\n * Deflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be\n *   converted to utf8 byte sequence.\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must\n * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending\n * buffers and call [[Deflate#onEnd]].\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nDeflate$1.prototype.push = function (data, flush_mode) {\n  const strm = this.strm;\n  const chunkSize = this.options.chunkSize;\n  let status, _flush_mode;\n\n  if (this.ended) { return false; }\n\n  if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n  else _flush_mode = flush_mode === true ? Z_FINISH$2 : Z_NO_FLUSH$1;\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // If we need to compress text, change encoding to utf8.\n    strm.input = strings.string2buf(data);\n  } else if (toString$1.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  for (;;) {\n    if (strm.avail_out === 0) {\n      strm.output = new Uint8Array(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n\n    // Make sure avail_out > 6 to avoid repeating markers\n    if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) {\n      this.onData(strm.output.subarray(0, strm.next_out));\n      strm.avail_out = 0;\n      continue;\n    }\n\n    status = deflate_1$2.deflate(strm, _flush_mode);\n\n    // Ended => flush and finish\n    if (status === Z_STREAM_END$2) {\n      if (strm.next_out > 0) {\n        this.onData(strm.output.subarray(0, strm.next_out));\n      }\n      status = deflate_1$2.deflateEnd(this.strm);\n      this.onEnd(status);\n      this.ended = true;\n      return status === Z_OK$2;\n    }\n\n    // Flush if out buffer full\n    if (strm.avail_out === 0) {\n      this.onData(strm.output);\n      continue;\n    }\n\n    // Flush if requested and has data\n    if (_flush_mode > 0 && strm.next_out > 0) {\n      this.onData(strm.output.subarray(0, strm.next_out));\n      strm.avail_out = 0;\n      continue;\n    }\n\n    if (strm.avail_in === 0) break;\n  }\n\n  return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array): output data.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate$1.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate$1.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === Z_OK$2) {\n    this.result = common.flattenChunks(this.chunks);\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate$1(input, options) {\n  const deflator = new Deflate$1(options);\n\n  deflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (deflator.err) { throw deflator.msg || messages[deflator.err]; }\n\n  return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw$1(input, options) {\n  options = options || {};\n  options.raw = true;\n  return deflate$1(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip$1(input, options) {\n  options = options || {};\n  options.gzip = true;\n  return deflate$1(input, options);\n}\n\n\nvar Deflate_1$1 = Deflate$1;\nvar deflate_2 = deflate$1;\nvar deflateRaw_1$1 = deflateRaw$1;\nvar gzip_1$1 = gzip$1;\nvar constants$1 = constants$2;\n\nvar deflate_1$1 = {\n\tDeflate: Deflate_1$1,\n\tdeflate: deflate_2,\n\tdeflateRaw: deflateRaw_1$1,\n\tgzip: gzip_1$1,\n\tconstants: constants$1\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nconst BAD$1 = 16209;       /* got a data error -- remain here until reset */\nconst TYPE$1 = 16191;      /* i: waiting for type bits, including last-flag bit */\n\n/*\n   Decode literal, length, and distance codes and write out the resulting\n   literal and match bytes until either not enough input or output is\n   available, an end-of-block is encountered, or a data error is encountered.\n   When large enough input and output buffers are supplied to inflate(), for\n   example, a 16K input buffer and a 64K output buffer, more than 95% of the\n   inflate execution time is spent in this routine.\n\n   Entry assumptions:\n\n        state.mode === LEN\n        strm.avail_in >= 6\n        strm.avail_out >= 258\n        start >= strm.avail_out\n        state.bits < 8\n\n   On return, state.mode is one of:\n\n        LEN -- ran out of enough output space or enough available input\n        TYPE -- reached end of block code, inflate() to interpret next block\n        BAD -- error in block data\n\n   Notes:\n\n    - The maximum input bits used by a length/distance pair is 15 bits for the\n      length code, 5 bits for the length extra, 15 bits for the distance code,\n      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.\n      Therefore if strm.avail_in >= 6, then there is enough input to avoid\n      checking for available input while decoding.\n\n    - The maximum bytes that a single length/distance pair can output is 258\n      bytes, which is the maximum length that can be coded.  inflate_fast()\n      requires strm.avail_out >= 258 for each loop to avoid checking for\n      output space.\n */\nvar inffast = function inflate_fast(strm, start) {\n  let _in;                    /* local strm.input */\n  let last;                   /* have enough input while in < last */\n  let _out;                   /* local strm.output */\n  let beg;                    /* inflate()'s initial strm.output */\n  let end;                    /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n  let dmax;                   /* maximum distance from zlib header */\n//#endif\n  let wsize;                  /* window size or zero if not using window */\n  let whave;                  /* valid bytes in the window */\n  let wnext;                  /* window write index */\n  // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n  let s_window;               /* allocated sliding window, if wsize != 0 */\n  let hold;                   /* local strm.hold */\n  let bits;                   /* local strm.bits */\n  let lcode;                  /* local strm.lencode */\n  let dcode;                  /* local strm.distcode */\n  let lmask;                  /* mask for first level of length codes */\n  let dmask;                  /* mask for first level of distance codes */\n  let here;                   /* retrieved table entry */\n  let op;                     /* code bits, operation, extra bits, or */\n                              /*  window position, window bytes to copy */\n  let len;                    /* match length, unused bytes */\n  let dist;                   /* match distance */\n  let from;                   /* where to copy match from */\n  let from_source;\n\n\n  let input, output; // JS specific, because we have no pointers\n\n  /* copy state to local variables */\n  const state = strm.state;\n  //here = state.here;\n  _in = strm.next_in;\n  input = strm.input;\n  last = _in + (strm.avail_in - 5);\n  _out = strm.next_out;\n  output = strm.output;\n  beg = _out - (start - strm.avail_out);\n  end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n  dmax = state.dmax;\n//#endif\n  wsize = state.wsize;\n  whave = state.whave;\n  wnext = state.wnext;\n  s_window = state.window;\n  hold = state.hold;\n  bits = state.bits;\n  lcode = state.lencode;\n  dcode = state.distcode;\n  lmask = (1 << state.lenbits) - 1;\n  dmask = (1 << state.distbits) - 1;\n\n\n  /* decode literals and length/distances until end-of-block or not enough\n     input data or output space */\n\n  top:\n  do {\n    if (bits < 15) {\n      hold += input[_in++] << bits;\n      bits += 8;\n      hold += input[_in++] << bits;\n      bits += 8;\n    }\n\n    here = lcode[hold & lmask];\n\n    dolen:\n    for (;;) { // Goto emulation\n      op = here >>> 24/*here.bits*/;\n      hold >>>= op;\n      bits -= op;\n      op = (here >>> 16) & 0xff/*here.op*/;\n      if (op === 0) {                          /* literal */\n        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n        //        \"inflate:         literal '%c'\\n\" :\n        //        \"inflate:         literal 0x%02x\\n\", here.val));\n        output[_out++] = here & 0xffff/*here.val*/;\n      }\n      else if (op & 16) {                     /* length base */\n        len = here & 0xffff/*here.val*/;\n        op &= 15;                           /* number of extra bits */\n        if (op) {\n          if (bits < op) {\n            hold += input[_in++] << bits;\n            bits += 8;\n          }\n          len += hold & ((1 << op) - 1);\n          hold >>>= op;\n          bits -= op;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", len));\n        if (bits < 15) {\n          hold += input[_in++] << bits;\n          bits += 8;\n          hold += input[_in++] << bits;\n          bits += 8;\n        }\n        here = dcode[hold & dmask];\n\n        dodist:\n        for (;;) { // goto emulation\n          op = here >>> 24/*here.bits*/;\n          hold >>>= op;\n          bits -= op;\n          op = (here >>> 16) & 0xff/*here.op*/;\n\n          if (op & 16) {                      /* distance base */\n            dist = here & 0xffff/*here.val*/;\n            op &= 15;                       /* number of extra bits */\n            if (bits < op) {\n              hold += input[_in++] << bits;\n              bits += 8;\n              if (bits < op) {\n                hold += input[_in++] << bits;\n                bits += 8;\n              }\n            }\n            dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n            if (dist > dmax) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD$1;\n              break top;\n            }\n//#endif\n            hold >>>= op;\n            bits -= op;\n            //Tracevv((stderr, \"inflate:         distance %u\\n\", dist));\n            op = _out - beg;                /* max distance in output */\n            if (dist > op) {                /* see if copy from window */\n              op = dist - op;               /* distance back in window */\n              if (op > whave) {\n                if (state.sane) {\n                  strm.msg = 'invalid distance too far back';\n                  state.mode = BAD$1;\n                  break top;\n                }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//                if (len <= op - whave) {\n//                  do {\n//                    output[_out++] = 0;\n//                  } while (--len);\n//                  continue top;\n//                }\n//                len -= op - whave;\n//                do {\n//                  output[_out++] = 0;\n//                } while (--op > whave);\n//                if (op === 0) {\n//                  from = _out - dist;\n//                  do {\n//                    output[_out++] = output[from++];\n//                  } while (--len);\n//                  continue top;\n//                }\n//#endif\n              }\n              from = 0; // window index\n              from_source = s_window;\n              if (wnext === 0) {           /* very common case */\n                from += wsize - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              else if (wnext < op) {      /* wrap around window */\n                from += wsize + wnext - op;\n                op -= wnext;\n                if (op < len) {         /* some from end of window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = 0;\n                  if (wnext < len) {  /* some from start of window */\n                    op = wnext;\n                    len -= op;\n                    do {\n                      output[_out++] = s_window[from++];\n                    } while (--op);\n                    from = _out - dist;      /* rest from output */\n                    from_source = output;\n                  }\n                }\n              }\n              else {                      /* contiguous in window */\n                from += wnext - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              while (len > 2) {\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                len -= 3;\n              }\n              if (len) {\n                output[_out++] = from_source[from++];\n                if (len > 1) {\n                  output[_out++] = from_source[from++];\n                }\n              }\n            }\n            else {\n              from = _out - dist;          /* copy direct from output */\n              do {                        /* minimum length is three */\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                len -= 3;\n              } while (len > 2);\n              if (len) {\n                output[_out++] = output[from++];\n                if (len > 1) {\n                  output[_out++] = output[from++];\n                }\n              }\n            }\n          }\n          else if ((op & 64) === 0) {          /* 2nd level distance code */\n            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n            continue dodist;\n          }\n          else {\n            strm.msg = 'invalid distance code';\n            state.mode = BAD$1;\n            break top;\n          }\n\n          break; // need to emulate goto via \"continue\"\n        }\n      }\n      else if ((op & 64) === 0) {              /* 2nd level length code */\n        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n        continue dolen;\n      }\n      else if (op & 32) {                     /* end-of-block */\n        //Tracevv((stderr, \"inflate:         end of block\\n\"));\n        state.mode = TYPE$1;\n        break top;\n      }\n      else {\n        strm.msg = 'invalid literal/length code';\n        state.mode = BAD$1;\n        break top;\n      }\n\n      break; // need to emulate goto via \"continue\"\n    }\n  } while (_in < last && _out < end);\n\n  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n  len = bits >> 3;\n  _in -= len;\n  bits -= len << 3;\n  hold &= (1 << bits) - 1;\n\n  /* update state and return */\n  strm.next_in = _in;\n  strm.next_out = _out;\n  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n  state.hold = hold;\n  state.bits = bits;\n  return;\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst MAXBITS = 15;\nconst ENOUGH_LENS$1 = 852;\nconst ENOUGH_DISTS$1 = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst CODES$1 = 0;\nconst LENS$1 = 1;\nconst DISTS$1 = 2;\n\nconst lbase = new Uint16Array([ /* Length codes 257..285 base */\n  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n]);\n\nconst lext = new Uint8Array([ /* Length codes 257..285 extra */\n  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n]);\n\nconst dbase = new Uint16Array([ /* Distance codes 0..29 base */\n  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n  8193, 12289, 16385, 24577, 0, 0\n]);\n\nconst dext = new Uint8Array([ /* Distance codes 0..29 extra */\n  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n  28, 28, 29, 29, 64, 64\n]);\n\nconst inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) =>\n{\n  const bits = opts.bits;\n      //here = opts.here; /* table entry for duplication */\n\n  let len = 0;               /* a code's length in bits */\n  let sym = 0;               /* index of code symbols */\n  let min = 0, max = 0;          /* minimum and maximum code lengths */\n  let root = 0;              /* number of index bits for root table */\n  let curr = 0;              /* number of index bits for current table */\n  let drop = 0;              /* code bits to drop for sub-table */\n  let left = 0;                   /* number of prefix codes available */\n  let used = 0;              /* code entries in table used */\n  let huff = 0;              /* Huffman code */\n  let incr;              /* for incrementing code, index */\n  let fill;              /* index for replicating entries */\n  let low;               /* low bits for current root entry */\n  let mask;              /* mask for low root bits */\n  let next;             /* next available space in table */\n  let base = null;     /* base value table to use */\n//  let shoextra;    /* extra bits table to use */\n  let match;                  /* use base and extra for symbol >= match */\n  const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */\n  const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */\n  let extra = null;\n\n  let here_bits, here_op, here_val;\n\n  /*\n   Process a set of code lengths to create a canonical Huffman code.  The\n   code lengths are lens[0..codes-1].  Each length corresponds to the\n   symbols 0..codes-1.  The Huffman code is generated by first sorting the\n   symbols by length from short to long, and retaining the symbol order\n   for codes with equal lengths.  Then the code starts with all zero bits\n   for the first code of the shortest length, and the codes are integer\n   increments for the same length, and zeros are appended as the length\n   increases.  For the deflate format, these bits are stored backwards\n   from their more natural integer increment ordering, and so when the\n   decoding tables are built in the large loop below, the integer codes\n   are incremented backwards.\n\n   This routine assumes, but does not check, that all of the entries in\n   lens[] are in the range 0..MAXBITS.  The caller must assure this.\n   1..MAXBITS is interpreted as that code length.  zero means that that\n   symbol does not occur in this code.\n\n   The codes are sorted by computing a count of codes for each length,\n   creating from that a table of starting indices for each length in the\n   sorted table, and then entering the symbols in order in the sorted\n   table.  The sorted table is work[], with that space being provided by\n   the caller.\n\n   The length counts are used for other purposes as well, i.e. finding\n   the minimum and maximum length codes, determining if there are any\n   codes at all, checking for a valid set of lengths, and looking ahead\n   at length counts to determine sub-table sizes when building the\n   decoding tables.\n   */\n\n  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n  for (len = 0; len <= MAXBITS; len++) {\n    count[len] = 0;\n  }\n  for (sym = 0; sym < codes; sym++) {\n    count[lens[lens_index + sym]]++;\n  }\n\n  /* bound code lengths, force root to be within code lengths */\n  root = bits;\n  for (max = MAXBITS; max >= 1; max--) {\n    if (count[max] !== 0) { break; }\n  }\n  if (root > max) {\n    root = max;\n  }\n  if (max === 0) {                     /* no symbols to code at all */\n    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */\n    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;\n    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n    //table.op[opts.table_index] = 64;\n    //table.bits[opts.table_index] = 1;\n    //table.val[opts.table_index++] = 0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n    opts.bits = 1;\n    return 0;     /* no symbols, but wait for decoding to report error */\n  }\n  for (min = 1; min < max; min++) {\n    if (count[min] !== 0) { break; }\n  }\n  if (root < min) {\n    root = min;\n  }\n\n  /* check for an over-subscribed or incomplete set of lengths */\n  left = 1;\n  for (len = 1; len <= MAXBITS; len++) {\n    left <<= 1;\n    left -= count[len];\n    if (left < 0) {\n      return -1;\n    }        /* over-subscribed */\n  }\n  if (left > 0 && (type === CODES$1 || max !== 1)) {\n    return -1;                      /* incomplete set */\n  }\n\n  /* generate offsets into symbol table for each length for sorting */\n  offs[1] = 0;\n  for (len = 1; len < MAXBITS; len++) {\n    offs[len + 1] = offs[len] + count[len];\n  }\n\n  /* sort symbols by length, by symbol order within each length */\n  for (sym = 0; sym < codes; sym++) {\n    if (lens[lens_index + sym] !== 0) {\n      work[offs[lens[lens_index + sym]]++] = sym;\n    }\n  }\n\n  /*\n   Create and fill in decoding tables.  In this loop, the table being\n   filled is at next and has curr index bits.  The code being used is huff\n   with length len.  That code is converted to an index by dropping drop\n   bits off of the bottom.  For codes where len is less than drop + curr,\n   those top drop + curr - len bits are incremented through all values to\n   fill the table with replicated entries.\n\n   root is the number of index bits for the root table.  When len exceeds\n   root, sub-tables are created pointed to by the root entry with an index\n   of the low root bits of huff.  This is saved in low to check for when a\n   new sub-table should be started.  drop is zero when the root table is\n   being filled, and drop is root when sub-tables are being filled.\n\n   When a new sub-table is needed, it is necessary to look ahead in the\n   code lengths to determine what size sub-table is needed.  The length\n   counts are used for this, and so count[] is decremented as codes are\n   entered in the tables.\n\n   used keeps track of how many table entries have been allocated from the\n   provided *table space.  It is checked for LENS and DIST tables against\n   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n   the initial root table size constants.  See the comments in inftrees.h\n   for more information.\n\n   sym increments through all symbols, and the loop terminates when\n   all codes of length max, i.e. all codes, have been processed.  This\n   routine permits incomplete codes, so another loop after this one fills\n   in the rest of the decoding tables with invalid code markers.\n   */\n\n  /* set up for code type */\n  // poor man optimization - use if-else instead of switch,\n  // to avoid deopts in old v8\n  if (type === CODES$1) {\n    base = extra = work;    /* dummy value--not used */\n    match = 20;\n\n  } else if (type === LENS$1) {\n    base = lbase;\n    extra = lext;\n    match = 257;\n\n  } else {                    /* DISTS */\n    base = dbase;\n    extra = dext;\n    match = 0;\n  }\n\n  /* initialize opts for loop */\n  huff = 0;                   /* starting code */\n  sym = 0;                    /* starting code symbol */\n  len = min;                  /* starting code length */\n  next = table_index;              /* current table to fill in */\n  curr = root;                /* current table index bits */\n  drop = 0;                   /* current bits to drop from code for index */\n  low = -1;                   /* trigger new sub-table when len > root */\n  used = 1 << root;          /* use root table entries */\n  mask = used - 1;            /* mask for comparing low */\n\n  /* check available table space */\n  if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n    (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n    return 1;\n  }\n\n  /* process all codes and make table entries */\n  for (;;) {\n    /* create table entry */\n    here_bits = len - drop;\n    if (work[sym] + 1 < match) {\n      here_op = 0;\n      here_val = work[sym];\n    }\n    else if (work[sym] >= match) {\n      here_op = extra[work[sym] - match];\n      here_val = base[work[sym] - match];\n    }\n    else {\n      here_op = 32 + 64;         /* end of block */\n      here_val = 0;\n    }\n\n    /* replicate for those indices with low len bits equal to huff */\n    incr = 1 << (len - drop);\n    fill = 1 << curr;\n    min = fill;                 /* save offset to next table */\n    do {\n      fill -= incr;\n      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n    } while (fill !== 0);\n\n    /* backwards increment the len-bit code huff */\n    incr = 1 << (len - 1);\n    while (huff & incr) {\n      incr >>= 1;\n    }\n    if (incr !== 0) {\n      huff &= incr - 1;\n      huff += incr;\n    } else {\n      huff = 0;\n    }\n\n    /* go to next symbol, update count, len */\n    sym++;\n    if (--count[len] === 0) {\n      if (len === max) { break; }\n      len = lens[lens_index + work[sym]];\n    }\n\n    /* create new sub-table if needed */\n    if (len > root && (huff & mask) !== low) {\n      /* if first time, transition to sub-tables */\n      if (drop === 0) {\n        drop = root;\n      }\n\n      /* increment past last table */\n      next += min;            /* here min is 1 << curr */\n\n      /* determine length of next table */\n      curr = len - drop;\n      left = 1 << curr;\n      while (curr + drop < max) {\n        left -= count[curr + drop];\n        if (left <= 0) { break; }\n        curr++;\n        left <<= 1;\n      }\n\n      /* check for enough space */\n      used += 1 << curr;\n      if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n        (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n        return 1;\n      }\n\n      /* point entry in root table to sub-table */\n      low = huff & mask;\n      /*table.op[low] = curr;\n      table.bits[low] = root;\n      table.val[low] = next - opts.table_index;*/\n      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n    }\n  }\n\n  /* fill in remaining table entry if code is incomplete (guaranteed to have\n   at most one remaining entry, since if the code is incomplete, the\n   maximum code length that was allowed to get this far is one bit) */\n  if (huff !== 0) {\n    //table.op[next + huff] = 64;            /* invalid code marker */\n    //table.bits[next + huff] = len - drop;\n    //table.val[next + huff] = 0;\n    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n  }\n\n  /* set return parameters */\n  //opts.table_index += used;\n  opts.bits = root;\n  return 0;\n};\n\n\nvar inftrees = inflate_table;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n\n\n\n\n\nconst CODES = 0;\nconst LENS = 1;\nconst DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n  Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES,\n  Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR,\n  Z_DEFLATED\n} = constants$2;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nconst    HEAD = 16180;       /* i: waiting for magic header */\nconst    FLAGS = 16181;      /* i: waiting for method and flags (gzip) */\nconst    TIME = 16182;       /* i: waiting for modification time (gzip) */\nconst    OS = 16183;         /* i: waiting for extra flags and operating system (gzip) */\nconst    EXLEN = 16184;      /* i: waiting for extra length (gzip) */\nconst    EXTRA = 16185;      /* i: waiting for extra bytes (gzip) */\nconst    NAME = 16186;       /* i: waiting for end of file name (gzip) */\nconst    COMMENT = 16187;    /* i: waiting for end of comment (gzip) */\nconst    HCRC = 16188;       /* i: waiting for header crc (gzip) */\nconst    DICTID = 16189;    /* i: waiting for dictionary check value */\nconst    DICT = 16190;      /* waiting for inflateSetDictionary() call */\nconst        TYPE = 16191;      /* i: waiting for type bits, including last-flag bit */\nconst        TYPEDO = 16192;    /* i: same, but skip check to exit inflate on new block */\nconst        STORED = 16193;    /* i: waiting for stored size (length and complement) */\nconst        COPY_ = 16194;     /* i/o: same as COPY below, but only first time in */\nconst        COPY = 16195;      /* i/o: waiting for input or output to copy stored block */\nconst        TABLE = 16196;     /* i: waiting for dynamic block table lengths */\nconst        LENLENS = 16197;   /* i: waiting for code length code lengths */\nconst        CODELENS = 16198;  /* i: waiting for length/lit and distance code lengths */\nconst            LEN_ = 16199;      /* i: same as LEN below, but only first time in */\nconst            LEN = 16200;       /* i: waiting for length/lit/eob code */\nconst            LENEXT = 16201;    /* i: waiting for length extra bits */\nconst            DIST = 16202;      /* i: waiting for distance code */\nconst            DISTEXT = 16203;   /* i: waiting for distance extra bits */\nconst            MATCH = 16204;     /* o: waiting for output space to copy string */\nconst            LIT = 16205;       /* o: waiting for output space to write literal */\nconst    CHECK = 16206;     /* i: waiting for 32-bit check value */\nconst    LENGTH = 16207;    /* i: waiting for 32-bit length (gzip) */\nconst    DONE = 16208;      /* finished check, done -- remain here until reset */\nconst    BAD = 16209;       /* got a data error -- remain here until reset */\nconst    MEM = 16210;       /* got an inflate() memory error -- remain here until reset */\nconst    SYNC = 16211;      /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nconst ENOUGH_LENS = 852;\nconst ENOUGH_DISTS = 592;\n//const ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst MAX_WBITS = 15;\n/* 32K LZ77 window */\nconst DEF_WBITS = MAX_WBITS;\n\n\nconst zswap32 = (q) => {\n\n  return  (((q >>> 24) & 0xff) +\n          ((q >>> 8) & 0xff00) +\n          ((q & 0xff00) << 8) +\n          ((q & 0xff) << 24));\n};\n\n\nfunction InflateState() {\n  this.strm = null;           /* pointer back to this zlib stream */\n  this.mode = 0;              /* current inflate mode */\n  this.last = false;          /* true if processing last block */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip,\n                                 bit 2 true to validate check value */\n  this.havedict = false;      /* true if dictionary provided */\n  this.flags = 0;             /* gzip header method and flags (0 if zlib), or\n                                 -1 if raw or no header yet */\n  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */\n  this.check = 0;             /* protected copy of check value */\n  this.total = 0;             /* protected copy of output count */\n  // TODO: may be {}\n  this.head = null;           /* where to save gzip header information */\n\n  /* sliding window */\n  this.wbits = 0;             /* log base 2 of requested window size */\n  this.wsize = 0;             /* window size or zero if not using window */\n  this.whave = 0;             /* valid bytes in the window */\n  this.wnext = 0;             /* window write index */\n  this.window = null;         /* allocated sliding window, if needed */\n\n  /* bit accumulator */\n  this.hold = 0;              /* input bit accumulator */\n  this.bits = 0;              /* number of bits in \"in\" */\n\n  /* for string and stored block copying */\n  this.length = 0;            /* literal or length of data to copy */\n  this.offset = 0;            /* distance back to copy string from */\n\n  /* for table and code decoding */\n  this.extra = 0;             /* extra bits needed */\n\n  /* fixed and dynamic code tables */\n  this.lencode = null;          /* starting table for length/literal codes */\n  this.distcode = null;         /* starting table for distance codes */\n  this.lenbits = 0;           /* index bits for lencode */\n  this.distbits = 0;          /* index bits for distcode */\n\n  /* dynamic table building */\n  this.ncode = 0;             /* number of code length code lengths */\n  this.nlen = 0;              /* number of length code lengths */\n  this.ndist = 0;             /* number of distance code lengths */\n  this.have = 0;              /* number of code lengths in lens[] */\n  this.next = null;              /* next available space in codes[] */\n\n  this.lens = new Uint16Array(320); /* temporary storage for code lengths */\n  this.work = new Uint16Array(288); /* work area for code table building */\n\n  /*\n   because we don't have pointers in js, we use lencode and distcode directly\n   as buffers so we don't need codes\n  */\n  //this.codes = new Int32Array(ENOUGH);       /* space for code tables */\n  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */\n  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */\n  this.sane = 0;                   /* if false, allow invalid distance too far */\n  this.back = 0;                   /* bits back of last unprocessed length/lit */\n  this.was = 0;                    /* initial length of match */\n}\n\n\nconst inflateStateCheck = (strm) => {\n\n  if (!strm) {\n    return 1;\n  }\n  const state = strm.state;\n  if (!state || state.strm !== strm ||\n    state.mode < HEAD || state.mode > SYNC) {\n    return 1;\n  }\n  return 0;\n};\n\n\nconst inflateResetKeep = (strm) => {\n\n  if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n  const state = strm.state;\n  strm.total_in = strm.total_out = state.total = 0;\n  strm.msg = ''; /*Z_NULL*/\n  if (state.wrap) {       /* to support ill-conceived Java test suite */\n    strm.adler = state.wrap & 1;\n  }\n  state.mode = HEAD;\n  state.last = 0;\n  state.havedict = 0;\n  state.flags = -1;\n  state.dmax = 32768;\n  state.head = null/*Z_NULL*/;\n  state.hold = 0;\n  state.bits = 0;\n  //state.lencode = state.distcode = state.next = state.codes;\n  state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS);\n  state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS);\n\n  state.sane = 1;\n  state.back = -1;\n  //Tracev((stderr, \"inflate: reset\\n\"));\n  return Z_OK$1;\n};\n\n\nconst inflateReset = (strm) => {\n\n  if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n  const state = strm.state;\n  state.wsize = 0;\n  state.whave = 0;\n  state.wnext = 0;\n  return inflateResetKeep(strm);\n\n};\n\n\nconst inflateReset2 = (strm, windowBits) => {\n  let wrap;\n\n  /* get the state */\n  if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n  const state = strm.state;\n\n  /* extract wrap request from windowBits parameter */\n  if (windowBits < 0) {\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n  else {\n    wrap = (windowBits >> 4) + 5;\n    if (windowBits < 48) {\n      windowBits &= 15;\n    }\n  }\n\n  /* set number of window bits, free window if different */\n  if (windowBits && (windowBits < 8 || windowBits > 15)) {\n    return Z_STREAM_ERROR$1;\n  }\n  if (state.window !== null && state.wbits !== windowBits) {\n    state.window = null;\n  }\n\n  /* update state and reset the rest of it */\n  state.wrap = wrap;\n  state.wbits = windowBits;\n  return inflateReset(strm);\n};\n\n\nconst inflateInit2 = (strm, windowBits) => {\n\n  if (!strm) { return Z_STREAM_ERROR$1; }\n  //strm.msg = Z_NULL;                 /* in case we return an error */\n\n  const state = new InflateState();\n\n  //if (state === Z_NULL) return Z_MEM_ERROR;\n  //Tracev((stderr, \"inflate: allocated\\n\"));\n  strm.state = state;\n  state.strm = strm;\n  state.window = null/*Z_NULL*/;\n  state.mode = HEAD;     /* to pass state test in inflateReset2() */\n  const ret = inflateReset2(strm, windowBits);\n  if (ret !== Z_OK$1) {\n    strm.state = null/*Z_NULL*/;\n  }\n  return ret;\n};\n\n\nconst inflateInit = (strm) => {\n\n  return inflateInit2(strm, DEF_WBITS);\n};\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding.  Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter.  This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time.  However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nlet virgin = true;\n\nlet lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\n\nconst fixedtables = (state) => {\n\n  /* build fixed huffman tables if first call (may not be thread safe) */\n  if (virgin) {\n    lenfix = new Int32Array(512);\n    distfix = new Int32Array(32);\n\n    /* literal/length table */\n    let sym = 0;\n    while (sym < 144) { state.lens[sym++] = 8; }\n    while (sym < 256) { state.lens[sym++] = 9; }\n    while (sym < 280) { state.lens[sym++] = 7; }\n    while (sym < 288) { state.lens[sym++] = 8; }\n\n    inftrees(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });\n\n    /* distance table */\n    sym = 0;\n    while (sym < 32) { state.lens[sym++] = 5; }\n\n    inftrees(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });\n\n    /* do this just once */\n    virgin = false;\n  }\n\n  state.lencode = lenfix;\n  state.lenbits = 9;\n  state.distcode = distfix;\n  state.distbits = 5;\n};\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning.  If window does not exist yet, create it.  This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nconst updatewindow = (strm, src, end, copy) => {\n\n  let dist;\n  const state = strm.state;\n\n  /* if it hasn't been done already, allocate space for the window */\n  if (state.window === null) {\n    state.wsize = 1 << state.wbits;\n    state.wnext = 0;\n    state.whave = 0;\n\n    state.window = new Uint8Array(state.wsize);\n  }\n\n  /* copy state->wsize or less output bytes into the circular window */\n  if (copy >= state.wsize) {\n    state.window.set(src.subarray(end - state.wsize, end), 0);\n    state.wnext = 0;\n    state.whave = state.wsize;\n  }\n  else {\n    dist = state.wsize - state.wnext;\n    if (dist > copy) {\n      dist = copy;\n    }\n    //zmemcpy(state->window + state->wnext, end - copy, dist);\n    state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);\n    copy -= dist;\n    if (copy) {\n      //zmemcpy(state->window, end - copy, copy);\n      state.window.set(src.subarray(end - copy, end), 0);\n      state.wnext = copy;\n      state.whave = state.wsize;\n    }\n    else {\n      state.wnext += dist;\n      if (state.wnext === state.wsize) { state.wnext = 0; }\n      if (state.whave < state.wsize) { state.whave += dist; }\n    }\n  }\n  return 0;\n};\n\n\nconst inflate$2 = (strm, flush) => {\n\n  let state;\n  let input, output;          // input/output buffers\n  let next;                   /* next input INDEX */\n  let put;                    /* next output INDEX */\n  let have, left;             /* available input and output */\n  let hold;                   /* bit buffer */\n  let bits;                   /* bits in bit buffer */\n  let _in, _out;              /* save starting available input and output */\n  let copy;                   /* number of stored or match bytes to copy */\n  let from;                   /* where to copy match bytes from */\n  let from_source;\n  let here = 0;               /* current decoding table entry */\n  let here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n  //let last;                   /* parent table entry */\n  let last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n  let len;                    /* length to copy for repeats, bits to drop */\n  let ret;                    /* return code */\n  const hbuf = new Uint8Array(4);    /* buffer for gzip header crc calculation */\n  let opts;\n\n  let n; // temporary variable for NEED_BITS\n\n  const order = /* permutation of code lengths */\n    new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]);\n\n\n  if (inflateStateCheck(strm) || !strm.output ||\n      (!strm.input && strm.avail_in !== 0)) {\n    return Z_STREAM_ERROR$1;\n  }\n\n  state = strm.state;\n  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */\n\n\n  //--- LOAD() ---\n  put = strm.next_out;\n  output = strm.output;\n  left = strm.avail_out;\n  next = strm.next_in;\n  input = strm.input;\n  have = strm.avail_in;\n  hold = state.hold;\n  bits = state.bits;\n  //---\n\n  _in = have;\n  _out = left;\n  ret = Z_OK$1;\n\n  inf_leave: // goto emulation\n  for (;;) {\n    switch (state.mode) {\n      case HEAD:\n        if (state.wrap === 0) {\n          state.mode = TYPEDO;\n          break;\n        }\n        //=== NEEDBITS(16);\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */\n          if (state.wbits === 0) {\n            state.wbits = 15;\n          }\n          state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32_1(state.check, hbuf, 2, 0);\n          //===//\n\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          state.mode = FLAGS;\n          break;\n        }\n        if (state.head) {\n          state.head.done = false;\n        }\n        if (!(state.wrap & 1) ||   /* check if zlib header allowed */\n          (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n          strm.msg = 'incorrect header check';\n          state.mode = BAD;\n          break;\n        }\n        if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n          strm.msg = 'unknown compression method';\n          state.mode = BAD;\n          break;\n        }\n        //--- DROPBITS(4) ---//\n        hold >>>= 4;\n        bits -= 4;\n        //---//\n        len = (hold & 0x0f)/*BITS(4)*/ + 8;\n        if (state.wbits === 0) {\n          state.wbits = len;\n        }\n        if (len > 15 || len > state.wbits) {\n          strm.msg = 'invalid window size';\n          state.mode = BAD;\n          break;\n        }\n\n        // !!! pako patch. Force use `options.windowBits` if passed.\n        // Required to always use max window size by default.\n        state.dmax = 1 << state.wbits;\n        //state.dmax = 1 << len;\n\n        state.flags = 0;               /* indicate zlib header */\n        //Tracev((stderr, \"inflate:   zlib header ok\\n\"));\n        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n        state.mode = hold & 0x200 ? DICTID : TYPE;\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        break;\n      case FLAGS:\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.flags = hold;\n        if ((state.flags & 0xff) !== Z_DEFLATED) {\n          strm.msg = 'unknown compression method';\n          state.mode = BAD;\n          break;\n        }\n        if (state.flags & 0xe000) {\n          strm.msg = 'unknown header flags set';\n          state.mode = BAD;\n          break;\n        }\n        if (state.head) {\n          state.head.text = ((hold >> 8) & 1);\n        }\n        if ((state.flags & 0x0200) && (state.wrap & 4)) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32_1(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = TIME;\n        /* falls through */\n      case TIME:\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (state.head) {\n          state.head.time = hold;\n        }\n        if ((state.flags & 0x0200) && (state.wrap & 4)) {\n          //=== CRC4(state.check, hold)\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          hbuf[2] = (hold >>> 16) & 0xff;\n          hbuf[3] = (hold >>> 24) & 0xff;\n          state.check = crc32_1(state.check, hbuf, 4, 0);\n          //===\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = OS;\n        /* falls through */\n      case OS:\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (state.head) {\n          state.head.xflags = (hold & 0xff);\n          state.head.os = (hold >> 8);\n        }\n        if ((state.flags & 0x0200) && (state.wrap & 4)) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32_1(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = EXLEN;\n        /* falls through */\n      case EXLEN:\n        if (state.flags & 0x0400) {\n          //=== NEEDBITS(16); */\n          while (bits < 16) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.length = hold;\n          if (state.head) {\n            state.head.extra_len = hold;\n          }\n          if ((state.flags & 0x0200) && (state.wrap & 4)) {\n            //=== CRC2(state.check, hold);\n            hbuf[0] = hold & 0xff;\n            hbuf[1] = (hold >>> 8) & 0xff;\n            state.check = crc32_1(state.check, hbuf, 2, 0);\n            //===//\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n        }\n        else if (state.head) {\n          state.head.extra = null/*Z_NULL*/;\n        }\n        state.mode = EXTRA;\n        /* falls through */\n      case EXTRA:\n        if (state.flags & 0x0400) {\n          copy = state.length;\n          if (copy > have) { copy = have; }\n          if (copy) {\n            if (state.head) {\n              len = state.head.extra_len - state.length;\n              if (!state.head.extra) {\n                // Use untyped array for more convenient processing later\n                state.head.extra = new Uint8Array(state.head.extra_len);\n              }\n              state.head.extra.set(\n                input.subarray(\n                  next,\n                  // extra field is limited to 65536 bytes\n                  // - no need for additional size check\n                  next + copy\n                ),\n                /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n                len\n              );\n              //zmemcpy(state.head.extra + len, next,\n              //        len + copy > state.head.extra_max ?\n              //        state.head.extra_max - len : copy);\n            }\n            if ((state.flags & 0x0200) && (state.wrap & 4)) {\n              state.check = crc32_1(state.check, input, copy, next);\n            }\n            have -= copy;\n            next += copy;\n            state.length -= copy;\n          }\n          if (state.length) { break inf_leave; }\n        }\n        state.length = 0;\n        state.mode = NAME;\n        /* falls through */\n      case NAME:\n        if (state.flags & 0x0800) {\n          if (have === 0) { break inf_leave; }\n          copy = 0;\n          do {\n            // TODO: 2 or 1 bytes?\n            len = input[next + copy++];\n            /* use constant limit because in js we should not preallocate memory */\n            if (state.head && len &&\n                (state.length < 65536 /*state.head.name_max*/)) {\n              state.head.name += String.fromCharCode(len);\n            }\n          } while (len && copy < have);\n\n          if ((state.flags & 0x0200) && (state.wrap & 4)) {\n            state.check = crc32_1(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          if (len) { break inf_leave; }\n        }\n        else if (state.head) {\n          state.head.name = null;\n        }\n        state.length = 0;\n        state.mode = COMMENT;\n        /* falls through */\n      case COMMENT:\n        if (state.flags & 0x1000) {\n          if (have === 0) { break inf_leave; }\n          copy = 0;\n          do {\n            len = input[next + copy++];\n            /* use constant limit because in js we should not preallocate memory */\n            if (state.head && len &&\n                (state.length < 65536 /*state.head.comm_max*/)) {\n              state.head.comment += String.fromCharCode(len);\n            }\n          } while (len && copy < have);\n          if ((state.flags & 0x0200) && (state.wrap & 4)) {\n            state.check = crc32_1(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          if (len) { break inf_leave; }\n        }\n        else if (state.head) {\n          state.head.comment = null;\n        }\n        state.mode = HCRC;\n        /* falls through */\n      case HCRC:\n        if (state.flags & 0x0200) {\n          //=== NEEDBITS(16); */\n          while (bits < 16) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          if ((state.wrap & 4) && hold !== (state.check & 0xffff)) {\n            strm.msg = 'header crc mismatch';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n        }\n        if (state.head) {\n          state.head.hcrc = ((state.flags >> 9) & 1);\n          state.head.done = true;\n        }\n        strm.adler = state.check = 0;\n        state.mode = TYPE;\n        break;\n      case DICTID:\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        strm.adler = state.check = zswap32(hold);\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = DICT;\n        /* falls through */\n      case DICT:\n        if (state.havedict === 0) {\n          //--- RESTORE() ---\n          strm.next_out = put;\n          strm.avail_out = left;\n          strm.next_in = next;\n          strm.avail_in = have;\n          state.hold = hold;\n          state.bits = bits;\n          //---\n          return Z_NEED_DICT$1;\n        }\n        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n        state.mode = TYPE;\n        /* falls through */\n      case TYPE:\n        if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case TYPEDO:\n        if (state.last) {\n          //--- BYTEBITS() ---//\n          hold >>>= bits & 7;\n          bits -= bits & 7;\n          //---//\n          state.mode = CHECK;\n          break;\n        }\n        //=== NEEDBITS(3); */\n        while (bits < 3) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.last = (hold & 0x01)/*BITS(1)*/;\n        //--- DROPBITS(1) ---//\n        hold >>>= 1;\n        bits -= 1;\n        //---//\n\n        switch ((hold & 0x03)/*BITS(2)*/) {\n          case 0:                             /* stored block */\n            //Tracev((stderr, \"inflate:     stored block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = STORED;\n            break;\n          case 1:                             /* fixed block */\n            fixedtables(state);\n            //Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = LEN_;             /* decode codes */\n            if (flush === Z_TREES) {\n              //--- DROPBITS(2) ---//\n              hold >>>= 2;\n              bits -= 2;\n              //---//\n              break inf_leave;\n            }\n            break;\n          case 2:                             /* dynamic block */\n            //Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = TABLE;\n            break;\n          case 3:\n            strm.msg = 'invalid block type';\n            state.mode = BAD;\n        }\n        //--- DROPBITS(2) ---//\n        hold >>>= 2;\n        bits -= 2;\n        //---//\n        break;\n      case STORED:\n        //--- BYTEBITS() ---// /* go to byte boundary */\n        hold >>>= bits & 7;\n        bits -= bits & 7;\n        //---//\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n          strm.msg = 'invalid stored block lengths';\n          state.mode = BAD;\n          break;\n        }\n        state.length = hold & 0xffff;\n        //Tracev((stderr, \"inflate:       stored length %u\\n\",\n        //        state.length));\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = COPY_;\n        if (flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case COPY_:\n        state.mode = COPY;\n        /* falls through */\n      case COPY:\n        copy = state.length;\n        if (copy) {\n          if (copy > have) { copy = have; }\n          if (copy > left) { copy = left; }\n          if (copy === 0) { break inf_leave; }\n          //--- zmemcpy(put, next, copy); ---\n          output.set(input.subarray(next, next + copy), put);\n          //---//\n          have -= copy;\n          next += copy;\n          left -= copy;\n          put += copy;\n          state.length -= copy;\n          break;\n        }\n        //Tracev((stderr, \"inflate:       stored end\\n\"));\n        state.mode = TYPE;\n        break;\n      case TABLE:\n        //=== NEEDBITS(14); */\n        while (bits < 14) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n        //--- DROPBITS(5) ---//\n        hold >>>= 5;\n        bits -= 5;\n        //---//\n        state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n        //--- DROPBITS(5) ---//\n        hold >>>= 5;\n        bits -= 5;\n        //---//\n        state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n        //--- DROPBITS(4) ---//\n        hold >>>= 4;\n        bits -= 4;\n        //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n        if (state.nlen > 286 || state.ndist > 30) {\n          strm.msg = 'too many length or distance symbols';\n          state.mode = BAD;\n          break;\n        }\n//#endif\n        //Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n        state.have = 0;\n        state.mode = LENLENS;\n        /* falls through */\n      case LENLENS:\n        while (state.have < state.ncode) {\n          //=== NEEDBITS(3);\n          while (bits < 3) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n          //--- DROPBITS(3) ---//\n          hold >>>= 3;\n          bits -= 3;\n          //---//\n        }\n        while (state.have < 19) {\n          state.lens[order[state.have++]] = 0;\n        }\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        //state.next = state.codes;\n        //state.lencode = state.next;\n        // Switch to use dynamic table\n        state.lencode = state.lendyn;\n        state.lenbits = 7;\n\n        opts = { bits: state.lenbits };\n        ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n        state.lenbits = opts.bits;\n\n        if (ret) {\n          strm.msg = 'invalid code lengths set';\n          state.mode = BAD;\n          break;\n        }\n        //Tracev((stderr, \"inflate:       code lengths ok\\n\"));\n        state.have = 0;\n        state.mode = CODELENS;\n        /* falls through */\n      case CODELENS:\n        while (state.have < state.nlen + state.ndist) {\n          for (;;) {\n            here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          if (here_val < 16) {\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            state.lens[state.have++] = here_val;\n          }\n          else {\n            if (here_val === 16) {\n              //=== NEEDBITS(here.bits + 2);\n              n = here_bits + 2;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              if (state.have === 0) {\n                strm.msg = 'invalid bit length repeat';\n                state.mode = BAD;\n                break;\n              }\n              len = state.lens[state.have - 1];\n              copy = 3 + (hold & 0x03);//BITS(2);\n              //--- DROPBITS(2) ---//\n              hold >>>= 2;\n              bits -= 2;\n              //---//\n            }\n            else if (here_val === 17) {\n              //=== NEEDBITS(here.bits + 3);\n              n = here_bits + 3;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              len = 0;\n              copy = 3 + (hold & 0x07);//BITS(3);\n              //--- DROPBITS(3) ---//\n              hold >>>= 3;\n              bits -= 3;\n              //---//\n            }\n            else {\n              //=== NEEDBITS(here.bits + 7);\n              n = here_bits + 7;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              len = 0;\n              copy = 11 + (hold & 0x7f);//BITS(7);\n              //--- DROPBITS(7) ---//\n              hold >>>= 7;\n              bits -= 7;\n              //---//\n            }\n            if (state.have + copy > state.nlen + state.ndist) {\n              strm.msg = 'invalid bit length repeat';\n              state.mode = BAD;\n              break;\n            }\n            while (copy--) {\n              state.lens[state.have++] = len;\n            }\n          }\n        }\n\n        /* handle error breaks in while */\n        if (state.mode === BAD) { break; }\n\n        /* check for end-of-block code (better have one) */\n        if (state.lens[256] === 0) {\n          strm.msg = 'invalid code -- missing end-of-block';\n          state.mode = BAD;\n          break;\n        }\n\n        /* build code tables -- note: do not change the lenbits or distbits\n           values here (9 and 6) without reading the comments in inftrees.h\n           concerning the ENOUGH constants, which depend on those values */\n        state.lenbits = 9;\n\n        opts = { bits: state.lenbits };\n        ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        // state.next_index = opts.table_index;\n        state.lenbits = opts.bits;\n        // state.lencode = state.next;\n\n        if (ret) {\n          strm.msg = 'invalid literal/lengths set';\n          state.mode = BAD;\n          break;\n        }\n\n        state.distbits = 6;\n        //state.distcode.copy(state.codes);\n        // Switch to use dynamic table\n        state.distcode = state.distdyn;\n        opts = { bits: state.distbits };\n        ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        // state.next_index = opts.table_index;\n        state.distbits = opts.bits;\n        // state.distcode = state.next;\n\n        if (ret) {\n          strm.msg = 'invalid distances set';\n          state.mode = BAD;\n          break;\n        }\n        //Tracev((stderr, 'inflate:       codes ok\\n'));\n        state.mode = LEN_;\n        if (flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case LEN_:\n        state.mode = LEN;\n        /* falls through */\n      case LEN:\n        if (have >= 6 && left >= 258) {\n          //--- RESTORE() ---\n          strm.next_out = put;\n          strm.avail_out = left;\n          strm.next_in = next;\n          strm.avail_in = have;\n          state.hold = hold;\n          state.bits = bits;\n          //---\n          inffast(strm, _out);\n          //--- LOAD() ---\n          put = strm.next_out;\n          output = strm.output;\n          left = strm.avail_out;\n          next = strm.next_in;\n          input = strm.input;\n          have = strm.avail_in;\n          hold = state.hold;\n          bits = state.bits;\n          //---\n\n          if (state.mode === TYPE) {\n            state.back = -1;\n          }\n          break;\n        }\n        state.back = 0;\n        for (;;) {\n          here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if (here_bits <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if (here_op && (here_op & 0xf0) === 0) {\n          last_bits = here_bits;\n          last_op = here_op;\n          last_val = here_val;\n          for (;;) {\n            here = state.lencode[last_val +\n                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((last_bits + here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          //--- DROPBITS(last.bits) ---//\n          hold >>>= last_bits;\n          bits -= last_bits;\n          //---//\n          state.back += last_bits;\n        }\n        //--- DROPBITS(here.bits) ---//\n        hold >>>= here_bits;\n        bits -= here_bits;\n        //---//\n        state.back += here_bits;\n        state.length = here_val;\n        if (here_op === 0) {\n          //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n          //        \"inflate:         literal '%c'\\n\" :\n          //        \"inflate:         literal 0x%02x\\n\", here.val));\n          state.mode = LIT;\n          break;\n        }\n        if (here_op & 32) {\n          //Tracevv((stderr, \"inflate:         end of block\\n\"));\n          state.back = -1;\n          state.mode = TYPE;\n          break;\n        }\n        if (here_op & 64) {\n          strm.msg = 'invalid literal/length code';\n          state.mode = BAD;\n          break;\n        }\n        state.extra = here_op & 15;\n        state.mode = LENEXT;\n        /* falls through */\n      case LENEXT:\n        if (state.extra) {\n          //=== NEEDBITS(state.extra);\n          n = state.extra;\n          while (bits < n) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n          //--- DROPBITS(state.extra) ---//\n          hold >>>= state.extra;\n          bits -= state.extra;\n          //---//\n          state.back += state.extra;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", state.length));\n        state.was = state.length;\n        state.mode = DIST;\n        /* falls through */\n      case DIST:\n        for (;;) {\n          here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if ((here_op & 0xf0) === 0) {\n          last_bits = here_bits;\n          last_op = here_op;\n          last_val = here_val;\n          for (;;) {\n            here = state.distcode[last_val +\n                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((last_bits + here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          //--- DROPBITS(last.bits) ---//\n          hold >>>= last_bits;\n          bits -= last_bits;\n          //---//\n          state.back += last_bits;\n        }\n        //--- DROPBITS(here.bits) ---//\n        hold >>>= here_bits;\n        bits -= here_bits;\n        //---//\n        state.back += here_bits;\n        if (here_op & 64) {\n          strm.msg = 'invalid distance code';\n          state.mode = BAD;\n          break;\n        }\n        state.offset = here_val;\n        state.extra = (here_op) & 15;\n        state.mode = DISTEXT;\n        /* falls through */\n      case DISTEXT:\n        if (state.extra) {\n          //=== NEEDBITS(state.extra);\n          n = state.extra;\n          while (bits < n) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n          //--- DROPBITS(state.extra) ---//\n          hold >>>= state.extra;\n          bits -= state.extra;\n          //---//\n          state.back += state.extra;\n        }\n//#ifdef INFLATE_STRICT\n        if (state.offset > state.dmax) {\n          strm.msg = 'invalid distance too far back';\n          state.mode = BAD;\n          break;\n        }\n//#endif\n        //Tracevv((stderr, \"inflate:         distance %u\\n\", state.offset));\n        state.mode = MATCH;\n        /* falls through */\n      case MATCH:\n        if (left === 0) { break inf_leave; }\n        copy = _out - left;\n        if (state.offset > copy) {         /* copy from window */\n          copy = state.offset - copy;\n          if (copy > state.whave) {\n            if (state.sane) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD;\n              break;\n            }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//          Trace((stderr, \"inflate.c too far\\n\"));\n//          copy -= state.whave;\n//          if (copy > state.length) { copy = state.length; }\n//          if (copy > left) { copy = left; }\n//          left -= copy;\n//          state.length -= copy;\n//          do {\n//            output[put++] = 0;\n//          } while (--copy);\n//          if (state.length === 0) { state.mode = LEN; }\n//          break;\n//#endif\n          }\n          if (copy > state.wnext) {\n            copy -= state.wnext;\n            from = state.wsize - copy;\n          }\n          else {\n            from = state.wnext - copy;\n          }\n          if (copy > state.length) { copy = state.length; }\n          from_source = state.window;\n        }\n        else {                              /* copy from output */\n          from_source = output;\n          from = put - state.offset;\n          copy = state.length;\n        }\n        if (copy > left) { copy = left; }\n        left -= copy;\n        state.length -= copy;\n        do {\n          output[put++] = from_source[from++];\n        } while (--copy);\n        if (state.length === 0) { state.mode = LEN; }\n        break;\n      case LIT:\n        if (left === 0) { break inf_leave; }\n        output[put++] = state.length;\n        left--;\n        state.mode = LEN;\n        break;\n      case CHECK:\n        if (state.wrap) {\n          //=== NEEDBITS(32);\n          while (bits < 32) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            // Use '|' instead of '+' to make sure that result is signed\n            hold |= input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          _out -= left;\n          strm.total_out += _out;\n          state.total += _out;\n          if ((state.wrap & 4) && _out) {\n            strm.adler = state.check =\n                /*UPDATE_CHECK(state.check, put - _out, _out);*/\n                (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out));\n\n          }\n          _out = left;\n          // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n          if ((state.wrap & 4) && (state.flags ? hold : zswap32(hold)) !== state.check) {\n            strm.msg = 'incorrect data check';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          //Tracev((stderr, \"inflate:   check matches trailer\\n\"));\n        }\n        state.mode = LENGTH;\n        /* falls through */\n      case LENGTH:\n        if (state.wrap && state.flags) {\n          //=== NEEDBITS(32);\n          while (bits < 32) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          if ((state.wrap & 4) && hold !== (state.total & 0xffffffff)) {\n            strm.msg = 'incorrect length check';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          //Tracev((stderr, \"inflate:   length matches trailer\\n\"));\n        }\n        state.mode = DONE;\n        /* falls through */\n      case DONE:\n        ret = Z_STREAM_END$1;\n        break inf_leave;\n      case BAD:\n        ret = Z_DATA_ERROR$1;\n        break inf_leave;\n      case MEM:\n        return Z_MEM_ERROR$1;\n      case SYNC:\n        /* falls through */\n      default:\n        return Z_STREAM_ERROR$1;\n    }\n  }\n\n  // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n  /*\n     Return from inflate(), updating the total counts and the check value.\n     If there was no progress during the inflate() call, return a buffer\n     error.  Call updatewindow() to create and/or update the window state.\n     Note: a memory error from inflate() is non-recoverable.\n   */\n\n  //--- RESTORE() ---\n  strm.next_out = put;\n  strm.avail_out = left;\n  strm.next_in = next;\n  strm.avail_in = have;\n  state.hold = hold;\n  state.bits = bits;\n  //---\n\n  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n                      (state.mode < CHECK || flush !== Z_FINISH$1))) {\n    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;\n  }\n  _in -= strm.avail_in;\n  _out -= strm.avail_out;\n  strm.total_in += _in;\n  strm.total_out += _out;\n  state.total += _out;\n  if ((state.wrap & 4) && _out) {\n    strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/\n      (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out));\n  }\n  strm.data_type = state.bits + (state.last ? 64 : 0) +\n                    (state.mode === TYPE ? 128 : 0) +\n                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n  if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) {\n    ret = Z_BUF_ERROR;\n  }\n  return ret;\n};\n\n\nconst inflateEnd = (strm) => {\n\n  if (inflateStateCheck(strm)) {\n    return Z_STREAM_ERROR$1;\n  }\n\n  let state = strm.state;\n  if (state.window) {\n    state.window = null;\n  }\n  strm.state = null;\n  return Z_OK$1;\n};\n\n\nconst inflateGetHeader = (strm, head) => {\n\n  /* check state */\n  if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n  const state = strm.state;\n  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; }\n\n  /* save header structure */\n  state.head = head;\n  head.done = false;\n  return Z_OK$1;\n};\n\n\nconst inflateSetDictionary = (strm, dictionary) => {\n  const dictLength = dictionary.length;\n\n  let state;\n  let dictid;\n  let ret;\n\n  /* check state */\n  if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n  state = strm.state;\n\n  if (state.wrap !== 0 && state.mode !== DICT) {\n    return Z_STREAM_ERROR$1;\n  }\n\n  /* check for correct dictionary identifier */\n  if (state.mode === DICT) {\n    dictid = 1; /* adler32(0, null, 0)*/\n    /* dictid = adler32(dictid, dictionary, dictLength); */\n    dictid = adler32_1(dictid, dictionary, dictLength, 0);\n    if (dictid !== state.check) {\n      return Z_DATA_ERROR$1;\n    }\n  }\n  /* copy dictionary to window using updatewindow(), which will amend the\n   existing dictionary if appropriate */\n  ret = updatewindow(strm, dictionary, dictLength, dictLength);\n  if (ret) {\n    state.mode = MEM;\n    return Z_MEM_ERROR$1;\n  }\n  state.havedict = 1;\n  // Tracev((stderr, \"inflate:   dictionary set\\n\"));\n  return Z_OK$1;\n};\n\n\nvar inflateReset_1 = inflateReset;\nvar inflateReset2_1 = inflateReset2;\nvar inflateResetKeep_1 = inflateResetKeep;\nvar inflateInit_1 = inflateInit;\nvar inflateInit2_1 = inflateInit2;\nvar inflate_2$1 = inflate$2;\nvar inflateEnd_1 = inflateEnd;\nvar inflateGetHeader_1 = inflateGetHeader;\nvar inflateSetDictionary_1 = inflateSetDictionary;\nvar inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.inflateCodesUsed = inflateCodesUsed;\nmodule.exports.inflateCopy = inflateCopy;\nmodule.exports.inflateGetDictionary = inflateGetDictionary;\nmodule.exports.inflateMark = inflateMark;\nmodule.exports.inflatePrime = inflatePrime;\nmodule.exports.inflateSync = inflateSync;\nmodule.exports.inflateSyncPoint = inflateSyncPoint;\nmodule.exports.inflateUndermine = inflateUndermine;\nmodule.exports.inflateValidate = inflateValidate;\n*/\n\nvar inflate_1$2 = {\n\tinflateReset: inflateReset_1,\n\tinflateReset2: inflateReset2_1,\n\tinflateResetKeep: inflateResetKeep_1,\n\tinflateInit: inflateInit_1,\n\tinflateInit2: inflateInit2_1,\n\tinflate: inflate_2$1,\n\tinflateEnd: inflateEnd_1,\n\tinflateGetHeader: inflateGetHeader_1,\n\tinflateSetDictionary: inflateSetDictionary_1,\n\tinflateInfo: inflateInfo\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n  /* true if compressed data believed to be text */\n  this.text       = 0;\n  /* modification time */\n  this.time       = 0;\n  /* extra flags (not used when writing a gzip file) */\n  this.xflags     = 0;\n  /* operating system */\n  this.os         = 0;\n  /* pointer to extra field or Z_NULL if none */\n  this.extra      = null;\n  /* extra field length (valid if extra != Z_NULL) */\n  this.extra_len  = 0; // Actually, we don't need it in JS,\n                       // but leave for few code modifications\n\n  //\n  // Setup limits is not necessary because in js we should not preallocate memory\n  // for inflate use constant limit in 65536 bytes\n  //\n\n  /* space at extra (only when reading header) */\n  // this.extra_max  = 0;\n  /* pointer to zero-terminated file name or Z_NULL */\n  this.name       = '';\n  /* space at name (only when reading header) */\n  // this.name_max   = 0;\n  /* pointer to zero-terminated comment or Z_NULL */\n  this.comment    = '';\n  /* space at comment (only when reading header) */\n  // this.comm_max   = 0;\n  /* true if there was or will be a header crc */\n  this.hcrc       = 0;\n  /* true when done reading gzip header (not used when writing a gzip file) */\n  this.done       = false;\n}\n\nvar gzheader = GZheader;\n\nconst toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n  Z_NO_FLUSH, Z_FINISH,\n  Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR\n} = constants$2;\n\n/* ===========================================================================*/\n\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true);  // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate$1(options) {\n  this.options = common.assign({\n    chunkSize: 1024 * 64,\n    windowBits: 15,\n    to: ''\n  }, options || {});\n\n  const opt = this.options;\n\n  // Force window size for `raw` data, if not set directly,\n  // because we have no header for autodetect.\n  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n    opt.windowBits = -opt.windowBits;\n    if (opt.windowBits === 0) { opt.windowBits = -15; }\n  }\n\n  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n      !(options && options.windowBits)) {\n    opt.windowBits += 32;\n  }\n\n  // Gzip header has no info about windows size, we can do autodetect only\n  // for deflate. So, if window size not set, force it to max when gzip possible\n  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n    // bit 3 (16) -> gzipped data\n    // bit 4 (32) -> autodetect gzip/deflate\n    if ((opt.windowBits & 15) === 0) {\n      opt.windowBits |= 15;\n    }\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm   = new zstream();\n  this.strm.avail_out = 0;\n\n  let status  = inflate_1$2.inflateInit2(\n    this.strm,\n    opt.windowBits\n  );\n\n  if (status !== Z_OK) {\n    throw new Error(messages[status]);\n  }\n\n  this.header = new gzheader();\n\n  inflate_1$2.inflateGetHeader(this.strm, this.header);\n\n  // Setup dictionary\n  if (opt.dictionary) {\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      opt.dictionary = strings.string2buf(opt.dictionary);\n    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n      opt.dictionary = new Uint8Array(opt.dictionary);\n    }\n    if (opt.raw) { //In raw mode we need to set the dictionary early\n      status = inflate_1$2.inflateSetDictionary(this.strm, opt.dictionary);\n      if (status !== Z_OK) {\n        throw new Error(messages[status]);\n      }\n    }\n  }\n}\n\n/**\n * Inflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer): input data\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE\n *   flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,\n *   `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. If end of stream detected,\n * [[Inflate#onEnd]] will be called.\n *\n * `flush_mode` is not needed for normal operation, because end of stream\n * detected automatically. You may try to use it for advanced things, but\n * this functionality was not tested.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nInflate$1.prototype.push = function (data, flush_mode) {\n  const strm = this.strm;\n  const chunkSize = this.options.chunkSize;\n  const dictionary = this.options.dictionary;\n  let status, _flush_mode, last_avail_out;\n\n  if (this.ended) return false;\n\n  if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n  else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH;\n\n  // Convert data if needed\n  if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  for (;;) {\n    if (strm.avail_out === 0) {\n      strm.output = new Uint8Array(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n\n    status = inflate_1$2.inflate(strm, _flush_mode);\n\n    if (status === Z_NEED_DICT && dictionary) {\n      status = inflate_1$2.inflateSetDictionary(strm, dictionary);\n\n      if (status === Z_OK) {\n        status = inflate_1$2.inflate(strm, _flush_mode);\n      } else if (status === Z_DATA_ERROR) {\n        // Replace code with more verbose\n        status = Z_NEED_DICT;\n      }\n    }\n\n    // Skip snyc markers if more data follows and not raw mode\n    while (strm.avail_in > 0 &&\n           status === Z_STREAM_END &&\n           strm.state.wrap > 0 &&\n           data[strm.next_in] !== 0)\n    {\n      inflate_1$2.inflateReset(strm);\n      status = inflate_1$2.inflate(strm, _flush_mode);\n    }\n\n    switch (status) {\n      case Z_STREAM_ERROR:\n      case Z_DATA_ERROR:\n      case Z_NEED_DICT:\n      case Z_MEM_ERROR:\n        this.onEnd(status);\n        this.ended = true;\n        return false;\n    }\n\n    // Remember real `avail_out` value, because we may patch out buffer content\n    // to align utf8 strings boundaries.\n    last_avail_out = strm.avail_out;\n\n    if (strm.next_out) {\n      if (strm.avail_out === 0 || status === Z_STREAM_END) {\n\n        if (this.options.to === 'string') {\n\n          let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n          let tail = strm.next_out - next_out_utf8;\n          let utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n          // move tail & realign counters\n          strm.next_out = tail;\n          strm.avail_out = chunkSize - tail;\n          if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);\n\n          this.onData(utf8str);\n\n        } else {\n          this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));\n        }\n      }\n    }\n\n    // Must repeat iteration if out buffer is full\n    if (status === Z_OK && last_avail_out === 0) continue;\n\n    // Finalize if end of stream reached.\n    if (status === Z_STREAM_END) {\n      status = inflate_1$2.inflateEnd(this.strm);\n      this.onEnd(status);\n      this.ended = true;\n      return true;\n    }\n\n    if (strm.avail_in === 0) break;\n  }\n\n  return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|String): output data. When string output requested,\n *   each chunk will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate$1.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate$1.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === Z_OK) {\n    if (this.options.to === 'string') {\n      this.result = this.chunks.join('');\n    } else {\n      this.result = common.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako');\n * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));\n * let output;\n *\n * try {\n *   output = pako.inflate(input);\n * } catch (err) {\n *   console.log(err);\n * }\n * ```\n **/\nfunction inflate$1(input, options) {\n  const inflator = new Inflate$1(options);\n\n  inflator.push(input);\n\n  // That will never happens, if you don't cheat with options :)\n  if (inflator.err) throw inflator.msg || messages[inflator.err];\n\n  return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw$1(input, options) {\n  options = options || {};\n  options.raw = true;\n  return inflate$1(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nvar Inflate_1$1 = Inflate$1;\nvar inflate_2 = inflate$1;\nvar inflateRaw_1$1 = inflateRaw$1;\nvar ungzip$1 = inflate$1;\nvar constants = constants$2;\n\nvar inflate_1$1 = {\n\tInflate: Inflate_1$1,\n\tinflate: inflate_2,\n\tinflateRaw: inflateRaw_1$1,\n\tungzip: ungzip$1,\n\tconstants: constants\n};\n\nconst { Deflate, deflate, deflateRaw, gzip } = deflate_1$1;\n\nconst { Inflate, inflate, inflateRaw, ungzip } = inflate_1$1;\n\n\n\nvar Deflate_1 = Deflate;\nvar deflate_1 = deflate;\nvar deflateRaw_1 = deflateRaw;\nvar gzip_1 = gzip;\nvar Inflate_1 = Inflate;\nvar inflate_1 = inflate;\nvar inflateRaw_1 = inflateRaw;\nvar ungzip_1 = ungzip;\nvar constants_1 = constants$2;\n\nvar pako = {\n\tDeflate: Deflate_1,\n\tdeflate: deflate_1,\n\tdeflateRaw: deflateRaw_1,\n\tgzip: gzip_1,\n\tInflate: Inflate_1,\n\tinflate: inflate_1,\n\tinflateRaw: inflateRaw_1,\n\tungzip: ungzip_1,\n\tconstants: constants_1\n};\n\nexport { Deflate_1 as Deflate, Inflate_1 as Inflate, constants_1 as constants, pako as default, deflate_1 as deflate, deflateRaw_1 as deflateRaw, gzip_1 as gzip, inflate_1 as inflate, inflateRaw_1 as inflateRaw, ungzip_1 as ungzip };\n","// based on https://github.com/jpeg-js/jpeg-js\r\n/*\r\n   Copyright 2011 notmasteryet\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n*/\r\nvar dctZigZag = new Int32Array([\r\n    0,\r\n    1, 8,\r\n    16, 9, 2,\r\n    3, 10, 17, 24,\r\n    32, 25, 18, 11, 4,\r\n    5, 12, 19, 26, 33, 40,\r\n    48, 41, 34, 27, 20, 13, 6,\r\n    7, 14, 21, 28, 35, 42, 49, 56,\r\n    57, 50, 43, 36, 29, 22, 15,\r\n    23, 30, 37, 44, 51, 58,\r\n    59, 52, 45, 38, 31,\r\n    39, 46, 53, 60,\r\n    61, 54, 47,\r\n    55, 62,\r\n    63\r\n]);\r\nvar dctCos1 = 4017; // cos(pi/16)\r\nvar dctSin1 = 799; // sin(pi/16)\r\nvar dctCos3 = 3406; // cos(3*pi/16)\r\nvar dctSin3 = 2276; // sin(3*pi/16)\r\nvar dctCos6 = 1567; // cos(6*pi/16)\r\nvar dctSin6 = 3784; // sin(6*pi/16)\r\nvar dctSqrt2 = 5793; // sqrt(2)\r\nvar dctSqrt1d2 = 2896; // sqrt(2) / 2\r\nvar maxResolutionInMP = 100; // Don't decode more than 100 megapixels\r\nvar maxMemoryUsageBytes = 64 * 1024 * 1024; // Don't decode if memory footprint is more than 64MB\r\nvar totalBytesAllocated = 0; // avoid unexpected OOMs from untrusted content.\r\nfunction requestMemoryAllocation(increaseAmount) {\r\n    var totalMemoryImpactBytes = totalBytesAllocated + increaseAmount;\r\n    if (totalMemoryImpactBytes > maxMemoryUsageBytes) {\r\n        var exceededAmount = Math.ceil((totalMemoryImpactBytes - maxMemoryUsageBytes) / 1024 / 1024);\r\n        throw new Error(\"Max memory limit exceeded by at least \".concat(exceededAmount, \"MB\"));\r\n    }\r\n    totalBytesAllocated = totalMemoryImpactBytes;\r\n}\r\nfunction buildHuffmanTable(codeLengths, values) {\r\n    var length = 16;\r\n    while (length > 0 && !codeLengths[length - 1])\r\n        length--;\r\n    var code = [{ children: [], index: 0 }];\r\n    var k = 0;\r\n    var p = code[0];\r\n    for (var i = 0; i < length; i++) {\r\n        for (var j = 0; j < codeLengths[i]; j++) {\r\n            p = code.pop();\r\n            p.children[p.index] = values[k];\r\n            while (p.index > 0) {\r\n                if (code.length === 0)\r\n                    throw new Error('Could not recreate Huffman Table');\r\n                p = code.pop();\r\n            }\r\n            p.index++;\r\n            code.push(p);\r\n            while (code.length <= i) {\r\n                var q = { children: [], index: 0 };\r\n                code.push(q);\r\n                p.children[p.index] = q.children;\r\n                p = q;\r\n            }\r\n            k++;\r\n        }\r\n        if (i + 1 < length) {\r\n            // p here points to last code\r\n            var q = { children: [], index: 0 };\r\n            code.push(q);\r\n            p.children[p.index] = q.children;\r\n            p = q;\r\n        }\r\n    }\r\n    return code[0].children;\r\n}\r\nfunction decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) {\r\n    var mcusPerLine = frame.mcusPerLine;\r\n    var progressive = frame.progressive;\r\n    var startOffset = offset;\r\n    var bitsData = 0;\r\n    var bitsCount = 0;\r\n    function readBit() {\r\n        if (bitsCount > 0) {\r\n            bitsCount--;\r\n            return (bitsData >> bitsCount) & 1;\r\n        }\r\n        bitsData = data[offset++];\r\n        if (bitsData == 0xFF) {\r\n            var nextByte = data[offset++];\r\n            if (nextByte)\r\n                throw new Error(\"unexpected marker: \".concat(((bitsData << 8) | nextByte).toString(16)));\r\n            // unstuff 0\r\n        }\r\n        bitsCount = 7;\r\n        return bitsData >>> 7;\r\n    }\r\n    function decodeHuffman(tree) {\r\n        var node = tree;\r\n        while (true) {\r\n            node = node[readBit()];\r\n            if (typeof node === 'number')\r\n                return node;\r\n            if (node === undefined)\r\n                throw new Error('invalid huffman sequence');\r\n        }\r\n    }\r\n    function receive(length) {\r\n        var n = 0;\r\n        while (length > 0) {\r\n            n = (n << 1) | readBit();\r\n            length--;\r\n        }\r\n        return n;\r\n    }\r\n    function receiveAndExtend(length) {\r\n        var n = receive(length);\r\n        if (n >= 1 << (length - 1))\r\n            return n;\r\n        return n + (-1 << length) + 1;\r\n    }\r\n    function decodeBaseline(component, zz) {\r\n        var t = decodeHuffman(component.huffmanTableDC);\r\n        var diff = t === 0 ? 0 : receiveAndExtend(t);\r\n        zz[0] = (component.pred += diff);\r\n        var k = 1;\r\n        while (k < 64) {\r\n            var rs = decodeHuffman(component.huffmanTableAC);\r\n            var s = rs & 15;\r\n            var r = rs >> 4;\r\n            if (s === 0) {\r\n                if (r < 15)\r\n                    break;\r\n                k += 16;\r\n                continue;\r\n            }\r\n            k += r;\r\n            var z = dctZigZag[k];\r\n            zz[z] = receiveAndExtend(s);\r\n            k++;\r\n        }\r\n    }\r\n    function decodeDCFirst(component, zz) {\r\n        var t = decodeHuffman(component.huffmanTableDC);\r\n        var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);\r\n        zz[0] = (component.pred += diff);\r\n    }\r\n    function decodeDCSuccessive(_component, zz) {\r\n        zz[0] |= readBit() << successive;\r\n    }\r\n    var eobrun = 0;\r\n    function decodeACFirst(component, zz) {\r\n        if (eobrun > 0) {\r\n            eobrun--;\r\n            return;\r\n        }\r\n        var k = spectralStart, e = spectralEnd;\r\n        while (k <= e) {\r\n            var rs = decodeHuffman(component.huffmanTableAC);\r\n            var s = rs & 15;\r\n            var r = rs >> 4;\r\n            if (s === 0) {\r\n                if (r < 15) {\r\n                    eobrun = receive(r) + (1 << r) - 1;\r\n                    break;\r\n                }\r\n                k += 16;\r\n                continue;\r\n            }\r\n            k += r;\r\n            var z = dctZigZag[k];\r\n            zz[z] = receiveAndExtend(s) * (1 << successive);\r\n            k++;\r\n        }\r\n    }\r\n    var successiveACState = 0;\r\n    var successiveACNextValue = 0;\r\n    function decodeACSuccessive(component, zz) {\r\n        var k = spectralStart;\r\n        var e = spectralEnd;\r\n        var r = 0;\r\n        while (k <= e) {\r\n            var z = dctZigZag[k];\r\n            var direction = zz[z] < 0 ? -1 : 1;\r\n            switch (successiveACState) {\r\n                case 0: // initial state\r\n                    var rs = decodeHuffman(component.huffmanTableAC);\r\n                    var s = rs & 15;\r\n                    r = rs >> 4; // this was new variable in old code\r\n                    if (s === 0) {\r\n                        if (r < 15) {\r\n                            eobrun = receive(r) + (1 << r);\r\n                            successiveACState = 4;\r\n                        }\r\n                        else {\r\n                            r = 16;\r\n                            successiveACState = 1;\r\n                        }\r\n                    }\r\n                    else {\r\n                        if (s !== 1)\r\n                            throw new Error('invalid ACn encoding');\r\n                        successiveACNextValue = receiveAndExtend(s);\r\n                        successiveACState = r ? 2 : 3;\r\n                    }\r\n                    continue;\r\n                case 1: // skipping r zero items\r\n                case 2:\r\n                    if (zz[z]) {\r\n                        zz[z] += (readBit() << successive) * direction;\r\n                    }\r\n                    else {\r\n                        r--;\r\n                        if (r === 0)\r\n                            successiveACState = successiveACState == 2 ? 3 : 0;\r\n                    }\r\n                    break;\r\n                case 3: // set value for a zero item\r\n                    if (zz[z]) {\r\n                        zz[z] += (readBit() << successive) * direction;\r\n                    }\r\n                    else {\r\n                        zz[z] = successiveACNextValue << successive;\r\n                        successiveACState = 0;\r\n                    }\r\n                    break;\r\n                case 4: // eob\r\n                    if (zz[z]) {\r\n                        zz[z] += (readBit() << successive) * direction;\r\n                    }\r\n                    break;\r\n            }\r\n            k++;\r\n        }\r\n        if (successiveACState === 4) {\r\n            eobrun--;\r\n            if (eobrun === 0)\r\n                successiveACState = 0;\r\n        }\r\n    }\r\n    function decodeMcu(component, decode, mcu, row, col) {\r\n        var mcuRow = (mcu / mcusPerLine) | 0;\r\n        var mcuCol = mcu % mcusPerLine;\r\n        var blockRow = mcuRow * component.v + row;\r\n        var blockCol = mcuCol * component.h + col;\r\n        // If the block is missing, just skip it.\r\n        if (component.blocks[blockRow] === undefined)\r\n            return;\r\n        decode(component, component.blocks[blockRow][blockCol]);\r\n    }\r\n    function decodeBlock(component, decode, mcu) {\r\n        var blockRow = (mcu / component.blocksPerLine) | 0;\r\n        var blockCol = mcu % component.blocksPerLine;\r\n        // If the block is missing, just skip it.\r\n        if (component.blocks[blockRow] === undefined)\r\n            return;\r\n        decode(component, component.blocks[blockRow][blockCol]);\r\n    }\r\n    var componentsLength = components.length;\r\n    var component;\r\n    var decodeFn;\r\n    if (progressive) {\r\n        if (spectralStart === 0) {\r\n            decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;\r\n        }\r\n        else {\r\n            decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;\r\n        }\r\n    }\r\n    else {\r\n        decodeFn = decodeBaseline;\r\n    }\r\n    var mcu = 0;\r\n    var mcuExpected;\r\n    if (componentsLength == 1) {\r\n        mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;\r\n    }\r\n    else {\r\n        mcuExpected = mcusPerLine * frame.mcusPerColumn;\r\n    }\r\n    if (!resetInterval)\r\n        resetInterval = mcuExpected;\r\n    var h;\r\n    var v;\r\n    var marker;\r\n    while (mcu < mcuExpected) {\r\n        // reset interval stuff\r\n        for (var i = 0; i < componentsLength; i++)\r\n            components[i].pred = 0;\r\n        eobrun = 0;\r\n        if (componentsLength == 1) {\r\n            component = components[0];\r\n            for (var n = 0; n < resetInterval; n++) {\r\n                decodeBlock(component, decodeFn, mcu);\r\n                mcu++;\r\n            }\r\n        }\r\n        else {\r\n            for (var n = 0; n < resetInterval; n++) {\r\n                for (var i = 0; i < componentsLength; i++) {\r\n                    component = components[i];\r\n                    h = component.h;\r\n                    v = component.v;\r\n                    for (var j = 0; j < v; j++) {\r\n                        for (var k = 0; k < h; k++) {\r\n                            decodeMcu(component, decodeFn, mcu, j, k);\r\n                        }\r\n                    }\r\n                }\r\n                mcu++;\r\n                // If we've reached our expected MCU's, stop decoding\r\n                if (mcu === mcuExpected)\r\n                    break;\r\n            }\r\n        }\r\n        if (mcu === mcuExpected) {\r\n            // Skip trailing bytes at the end of the scan - until we reach the next marker\r\n            do {\r\n                if (data[offset] === 0xFF) {\r\n                    if (data[offset + 1] !== 0x00) {\r\n                        break;\r\n                    }\r\n                }\r\n                offset += 1;\r\n            } while (offset < data.length - 2);\r\n        }\r\n        // find marker\r\n        bitsCount = 0;\r\n        marker = (data[offset] << 8) | data[offset + 1];\r\n        if (marker < 0xFF00)\r\n            throw new Error('marker was not found');\r\n        if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx\r\n            offset += 2;\r\n        }\r\n        else {\r\n            break;\r\n        }\r\n    }\r\n    return offset - startOffset;\r\n}\r\nfunction buildComponentData(component) {\r\n    var lines = [];\r\n    var blocksPerLine = component.blocksPerLine;\r\n    var blocksPerColumn = component.blocksPerColumn;\r\n    var samplesPerLine = blocksPerLine << 3;\r\n    // Only 1 used per invocation of this function and garbage collected after invocation, so no need to account for its memory footprint.\r\n    var R = new Int32Array(64);\r\n    var r = new Uint8Array(64);\r\n    // A port of poppler's IDCT method which in turn is taken from:\r\n    //   Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,\r\n    //   \"Practical Fast 1-D DCT Algorithms with 11 Multiplications\",\r\n    //   IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,\r\n    //   988-991.\r\n    function quantizeAndInverse(zz, dataOut, dataIn) {\r\n        var qt = component.quantizationTable;\r\n        var p = dataIn;\r\n        // dequant\r\n        for (var i = 0; i < 64; i++) {\r\n            p[i] = zz[i] * qt[i];\r\n        }\r\n        // inverse DCT on rows\r\n        for (var i = 0; i < 8; ++i) {\r\n            var row = 8 * i;\r\n            // check for all-zero AC coefficients\r\n            if (p[1 + row] == 0 && p[2 + row] == 0 && p[3 + row] == 0 &&\r\n                p[4 + row] == 0 && p[5 + row] == 0 && p[6 + row] == 0 &&\r\n                p[7 + row] == 0) {\r\n                var t_1 = (dctSqrt2 * p[0 + row] + 512) >> 10;\r\n                p[0 + row] = t_1;\r\n                p[1 + row] = t_1;\r\n                p[2 + row] = t_1;\r\n                p[3 + row] = t_1;\r\n                p[4 + row] = t_1;\r\n                p[5 + row] = t_1;\r\n                p[6 + row] = t_1;\r\n                p[7 + row] = t_1;\r\n                continue;\r\n            }\r\n            // stage 4\r\n            var v0 = (dctSqrt2 * p[0 + row] + 128) >> 8;\r\n            var v1 = (dctSqrt2 * p[4 + row] + 128) >> 8;\r\n            var v2 = p[2 + row];\r\n            var v3 = p[6 + row];\r\n            var v4 = (dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128) >> 8;\r\n            var v7 = (dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128) >> 8;\r\n            var v5 = p[3 + row] << 4;\r\n            var v6 = p[5 + row] << 4;\r\n            // stage 3\r\n            var t = (v0 - v1 + 1) >> 1;\r\n            v0 = (v0 + v1 + 1) >> 1;\r\n            v1 = t;\r\n            t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;\r\n            v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;\r\n            v3 = t;\r\n            t = (v4 - v6 + 1) >> 1;\r\n            v4 = (v4 + v6 + 1) >> 1;\r\n            v6 = t;\r\n            t = (v7 + v5 + 1) >> 1;\r\n            v5 = (v7 - v5 + 1) >> 1;\r\n            v7 = t;\r\n            // stage 2\r\n            t = (v0 - v3 + 1) >> 1;\r\n            v0 = (v0 + v3 + 1) >> 1;\r\n            v3 = t;\r\n            t = (v1 - v2 + 1) >> 1;\r\n            v1 = (v1 + v2 + 1) >> 1;\r\n            v2 = t;\r\n            t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;\r\n            v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;\r\n            v7 = t;\r\n            t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;\r\n            v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;\r\n            v6 = t;\r\n            // stage 1\r\n            p[0 + row] = v0 + v7;\r\n            p[7 + row] = v0 - v7;\r\n            p[1 + row] = v1 + v6;\r\n            p[6 + row] = v1 - v6;\r\n            p[2 + row] = v2 + v5;\r\n            p[5 + row] = v2 - v5;\r\n            p[3 + row] = v3 + v4;\r\n            p[4 + row] = v3 - v4;\r\n        }\r\n        // inverse DCT on columns\r\n        for (var i = 0; i < 8; ++i) {\r\n            var col = i;\r\n            // check for all-zero AC coefficients\r\n            if (p[1 * 8 + col] == 0 && p[2 * 8 + col] == 0 && p[3 * 8 + col] == 0 &&\r\n                p[4 * 8 + col] == 0 && p[5 * 8 + col] == 0 && p[6 * 8 + col] == 0 &&\r\n                p[7 * 8 + col] == 0) {\r\n                var t_2 = (dctSqrt2 * dataIn[i + 0] + 8192) >> 14;\r\n                p[0 * 8 + col] = t_2;\r\n                p[1 * 8 + col] = t_2;\r\n                p[2 * 8 + col] = t_2;\r\n                p[3 * 8 + col] = t_2;\r\n                p[4 * 8 + col] = t_2;\r\n                p[5 * 8 + col] = t_2;\r\n                p[6 * 8 + col] = t_2;\r\n                p[7 * 8 + col] = t_2;\r\n                continue;\r\n            }\r\n            // stage 4\r\n            var v0 = (dctSqrt2 * p[0 * 8 + col] + 2048) >> 12;\r\n            var v1 = (dctSqrt2 * p[4 * 8 + col] + 2048) >> 12;\r\n            var v2 = p[2 * 8 + col];\r\n            var v3 = p[6 * 8 + col];\r\n            var v4 = (dctSqrt1d2 * (p[1 * 8 + col] - p[7 * 8 + col]) + 2048) >> 12;\r\n            var v7 = (dctSqrt1d2 * (p[1 * 8 + col] + p[7 * 8 + col]) + 2048) >> 12;\r\n            var v5 = p[3 * 8 + col];\r\n            var v6 = p[5 * 8 + col];\r\n            // stage 3\r\n            var t = (v0 - v1 + 1) >> 1;\r\n            v0 = (v0 + v1 + 1) >> 1;\r\n            v1 = t;\r\n            t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;\r\n            v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;\r\n            v3 = t;\r\n            t = (v4 - v6 + 1) >> 1;\r\n            v4 = (v4 + v6 + 1) >> 1;\r\n            v6 = t;\r\n            t = (v7 + v5 + 1) >> 1;\r\n            v5 = (v7 - v5 + 1) >> 1;\r\n            v7 = t;\r\n            // stage 2\r\n            t = (v0 - v3 + 1) >> 1;\r\n            v0 = (v0 + v3 + 1) >> 1;\r\n            v3 = t;\r\n            t = (v1 - v2 + 1) >> 1;\r\n            v1 = (v1 + v2 + 1) >> 1;\r\n            v2 = t;\r\n            t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;\r\n            v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;\r\n            v7 = t;\r\n            t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;\r\n            v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;\r\n            v6 = t;\r\n            // stage 1\r\n            p[0 * 8 + col] = v0 + v7;\r\n            p[7 * 8 + col] = v0 - v7;\r\n            p[1 * 8 + col] = v1 + v6;\r\n            p[6 * 8 + col] = v1 - v6;\r\n            p[2 * 8 + col] = v2 + v5;\r\n            p[5 * 8 + col] = v2 - v5;\r\n            p[3 * 8 + col] = v3 + v4;\r\n            p[4 * 8 + col] = v3 - v4;\r\n        }\r\n        // convert to 8-bit integers\r\n        for (var i = 0; i < 64; ++i) {\r\n            var sample = 128 + ((p[i] + 8) >> 4);\r\n            dataOut[i] = sample < 0 ? 0 : sample > 0xFF ? 0xFF : sample;\r\n        }\r\n    }\r\n    requestMemoryAllocation(samplesPerLine * blocksPerColumn * 8);\r\n    for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {\r\n        var scanLine = blockRow << 3;\r\n        for (var i = 0; i < 8; i++)\r\n            lines.push(new Uint8Array(samplesPerLine));\r\n        for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {\r\n            quantizeAndInverse(component.blocks[blockRow][blockCol], r, R);\r\n            var offset = 0;\r\n            var sample = blockCol << 3;\r\n            for (var j = 0; j < 8; j++) {\r\n                var line = lines[scanLine + j];\r\n                for (var i = 0; i < 8; i++)\r\n                    line[sample + i] = r[offset++];\r\n            }\r\n        }\r\n    }\r\n    return lines;\r\n}\r\nfunction clampTo8bit(a) {\r\n    return a < 0 ? 0 : a > 255 ? 255 : a;\r\n}\r\nfunction parse(data) {\r\n    var self = {\r\n        width: 0,\r\n        height: 0,\r\n        comments: [],\r\n        adobe: undefined,\r\n        components: [],\r\n        exifBuffer: undefined,\r\n        jfif: undefined,\r\n    };\r\n    var maxResolutionInPixels = maxResolutionInMP * 1000 * 1000;\r\n    var offset = 0;\r\n    function readUint16() {\r\n        var value = (data[offset] << 8) | data[offset + 1];\r\n        offset += 2;\r\n        return value;\r\n    }\r\n    function readDataBlock() {\r\n        var length = readUint16();\r\n        var array = data.subarray(offset, offset + length - 2);\r\n        offset += array.length;\r\n        return array;\r\n    }\r\n    function prepareComponents(frame) {\r\n        var maxH = 0, maxV = 0;\r\n        for (var componentId in frame.components) {\r\n            if (frame.components.hasOwnProperty(componentId)) {\r\n                var component = frame.components[componentId];\r\n                if (maxH < component.h)\r\n                    maxH = component.h;\r\n                if (maxV < component.v)\r\n                    maxV = component.v;\r\n            }\r\n        }\r\n        var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / maxH);\r\n        var mcusPerColumn = Math.ceil(frame.scanLines / 8 / maxV);\r\n        for (var componentId in frame.components) {\r\n            if (frame.components.hasOwnProperty(componentId)) {\r\n                var component = frame.components[componentId];\r\n                var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / maxH);\r\n                var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / maxV);\r\n                var blocksPerLineForMcu = mcusPerLine * component.h;\r\n                var blocksPerColumnForMcu = mcusPerColumn * component.v;\r\n                var blocksToAllocate = blocksPerColumnForMcu * blocksPerLineForMcu;\r\n                var blocks = [];\r\n                // Each block is a Int32Array of length 64 (4 x 64 = 256 bytes)\r\n                requestMemoryAllocation(blocksToAllocate * 256);\r\n                for (var i = 0; i < blocksPerColumnForMcu; i++) {\r\n                    var row = [];\r\n                    for (var j = 0; j < blocksPerLineForMcu; j++) {\r\n                        row.push(new Int32Array(64));\r\n                    }\r\n                    blocks.push(row);\r\n                }\r\n                component.blocksPerLine = blocksPerLine;\r\n                component.blocksPerColumn = blocksPerColumn;\r\n                component.blocks = blocks;\r\n            }\r\n        }\r\n        frame.maxH = maxH;\r\n        frame.maxV = maxV;\r\n        frame.mcusPerLine = mcusPerLine;\r\n        frame.mcusPerColumn = mcusPerColumn;\r\n    }\r\n    var jfif = null;\r\n    var adobe = null;\r\n    var frame = undefined;\r\n    var resetInterval = 0;\r\n    var quantizationTables = [];\r\n    var frames = [];\r\n    var huffmanTablesAC = [];\r\n    var huffmanTablesDC = [];\r\n    var fileMarker = readUint16();\r\n    var malformedDataOffset = -1;\r\n    if (fileMarker != 0xFFD8) { // SOI (Start of Image)\r\n        throw new Error('SOI not found');\r\n    }\r\n    fileMarker = readUint16();\r\n    while (fileMarker != 0xFFD9) { // EOI (End of image)\r\n        switch (fileMarker) {\r\n            case 0xFF00: break;\r\n            case 0xFFE0: // APP0 (Application Specific)\r\n            case 0xFFE1: // APP1\r\n            case 0xFFE2: // APP2\r\n            case 0xFFE3: // APP3\r\n            case 0xFFE4: // APP4\r\n            case 0xFFE5: // APP5\r\n            case 0xFFE6: // APP6\r\n            case 0xFFE7: // APP7\r\n            case 0xFFE8: // APP8\r\n            case 0xFFE9: // APP9\r\n            case 0xFFEA: // APP10\r\n            case 0xFFEB: // APP11\r\n            case 0xFFEC: // APP12\r\n            case 0xFFED: // APP13\r\n            case 0xFFEE: // APP14\r\n            case 0xFFEF: // APP15\r\n            case 0xFFFE: { // COM (Comment)\r\n                var appData = readDataBlock();\r\n                if (fileMarker === 0xFFFE) {\r\n                    var comment = '';\r\n                    for (var ii = 0; ii < appData.byteLength; ii++) {\r\n                        comment += String.fromCharCode(appData[ii]);\r\n                    }\r\n                    self.comments.push(comment);\r\n                }\r\n                if (fileMarker === 0xFFE0) {\r\n                    if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 &&\r\n                        appData[3] === 0x46 && appData[4] === 0) { // 'JFIF\\x00'\r\n                        jfif = {\r\n                            version: { major: appData[5], minor: appData[6] },\r\n                            densityUnits: appData[7],\r\n                            xDensity: (appData[8] << 8) | appData[9],\r\n                            yDensity: (appData[10] << 8) | appData[11],\r\n                            thumbWidth: appData[12],\r\n                            thumbHeight: appData[13],\r\n                            thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])\r\n                        };\r\n                    }\r\n                }\r\n                // TODO APP1 - Exif\r\n                if (fileMarker === 0xFFE1) {\r\n                    if (appData[0] === 0x45 &&\r\n                        appData[1] === 0x78 &&\r\n                        appData[2] === 0x69 &&\r\n                        appData[3] === 0x66 &&\r\n                        appData[4] === 0) { // 'EXIF\\x00'\r\n                        self.exifBuffer = appData.subarray(5, appData.length);\r\n                    }\r\n                }\r\n                if (fileMarker === 0xFFEE) {\r\n                    if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F &&\r\n                        appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) { // 'Adobe\\x00'\r\n                        adobe = {\r\n                            version: appData[6],\r\n                            flags0: (appData[7] << 8) | appData[8],\r\n                            flags1: (appData[9] << 8) | appData[10],\r\n                            transformCode: appData[11]\r\n                        };\r\n                    }\r\n                }\r\n                break;\r\n            }\r\n            case 0xFFDB: { // DQT (Define Quantization Tables)\r\n                var quantizationTablesLength = readUint16();\r\n                var quantizationTablesEnd = quantizationTablesLength + offset - 2;\r\n                while (offset < quantizationTablesEnd) {\r\n                    var quantizationTableSpec = data[offset++];\r\n                    requestMemoryAllocation(64 * 4);\r\n                    var tableData = new Int32Array(64);\r\n                    if ((quantizationTableSpec >> 4) === 0) { // 8 bit values\r\n                        for (var j = 0; j < 64; j++) {\r\n                            var z = dctZigZag[j];\r\n                            tableData[z] = data[offset++];\r\n                        }\r\n                    }\r\n                    else if ((quantizationTableSpec >> 4) === 1) { //16 bit\r\n                        for (var j = 0; j < 64; j++) {\r\n                            var z = dctZigZag[j];\r\n                            tableData[z] = readUint16();\r\n                        }\r\n                    }\r\n                    else\r\n                        throw new Error('DQT: invalid table spec');\r\n                    quantizationTables[quantizationTableSpec & 15] = tableData;\r\n                }\r\n                break;\r\n            }\r\n            case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)\r\n            case 0xFFC1: // SOF1 (Start of Frame, Extended DCT)\r\n            case 0xFFC2: { // SOF2 (Start of Frame, Progressive DCT)\r\n                readUint16(); // skip data length\r\n                frame = {\r\n                    extended: (fileMarker === 0xFFC1),\r\n                    progressive: (fileMarker === 0xFFC2),\r\n                    precision: data[offset++],\r\n                    scanLines: readUint16(),\r\n                    samplesPerLine: readUint16(),\r\n                    components: {},\r\n                    componentsOrder: [],\r\n                    maxH: 0,\r\n                    maxV: 0,\r\n                    mcusPerLine: 0,\r\n                    mcusPerColumn: 0,\r\n                };\r\n                var pixelsInFrame = frame.scanLines * frame.samplesPerLine;\r\n                if (pixelsInFrame > maxResolutionInPixels) {\r\n                    var exceededAmount = Math.ceil((pixelsInFrame - maxResolutionInPixels) / 1e6);\r\n                    throw new Error(\"maxResolutionInMP limit exceeded by \".concat(exceededAmount, \"MP\"));\r\n                }\r\n                var componentsCount = data[offset++];\r\n                for (var i = 0; i < componentsCount; i++) {\r\n                    var componentId = data[offset];\r\n                    var h = data[offset + 1] >> 4;\r\n                    var v = data[offset + 1] & 15;\r\n                    var qId = data[offset + 2];\r\n                    frame.componentsOrder.push(componentId);\r\n                    frame.components[componentId] = {\r\n                        h: h,\r\n                        v: v,\r\n                        quantizationIdx: qId,\r\n                        blocksPerColumn: 0,\r\n                        blocksPerLine: 0,\r\n                        blocks: [],\r\n                        pred: 0,\r\n                    };\r\n                    offset += 3;\r\n                }\r\n                prepareComponents(frame);\r\n                frames.push(frame);\r\n                break;\r\n            }\r\n            case 0xFFC4: { // DHT (Define Huffman Tables)\r\n                var huffmanLength = readUint16();\r\n                for (var i = 2; i < huffmanLength;) {\r\n                    var huffmanTableSpec = data[offset++];\r\n                    var codeLengths = new Uint8Array(16);\r\n                    var codeLengthSum = 0;\r\n                    for (var j = 0; j < 16; j++, offset++) {\r\n                        codeLengthSum += (codeLengths[j] = data[offset]);\r\n                    }\r\n                    requestMemoryAllocation(16 + codeLengthSum);\r\n                    var huffmanValues = new Uint8Array(codeLengthSum);\r\n                    for (var j = 0; j < codeLengthSum; j++, offset++) {\r\n                        huffmanValues[j] = data[offset];\r\n                    }\r\n                    i += 17 + codeLengthSum;\r\n                    var index = huffmanTableSpec & 15;\r\n                    var table = (huffmanTableSpec >> 4) === 0 ? huffmanTablesDC : huffmanTablesAC;\r\n                    table[index] = buildHuffmanTable(codeLengths, huffmanValues);\r\n                }\r\n                break;\r\n            }\r\n            case 0xFFDD: // DRI (Define Restart Interval)\r\n                readUint16(); // skip data length\r\n                resetInterval = readUint16();\r\n                break;\r\n            case 0xFFDC: // Number of Lines marker\r\n                readUint16(); // skip data length\r\n                readUint16(); // Ignore this data since it represents the image height\r\n                break;\r\n            case 0xFFDA: { // SOS (Start of Scan)\r\n                readUint16(); // skip data length\r\n                var selectorsCount = data[offset++];\r\n                var components = [];\r\n                for (var i = 0; i < selectorsCount; i++) {\r\n                    var component = frame.components[data[offset++]];\r\n                    var tableSpec = data[offset++];\r\n                    component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];\r\n                    component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];\r\n                    components.push(component);\r\n                }\r\n                var spectralStart = data[offset++];\r\n                var spectralEnd = data[offset++];\r\n                var successiveApproximation = data[offset++];\r\n                var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15);\r\n                offset += processed;\r\n                break;\r\n            }\r\n            case 0xFFFF: // Fill bytes\r\n                if (data[offset] !== 0xFF) { // Avoid skipping a valid marker.\r\n                    offset--;\r\n                }\r\n                break;\r\n            default: {\r\n                if (data[offset - 3] == 0xFF && data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {\r\n                    // could be incorrect encoding -- last 0xFF byte of the previous\r\n                    // block was eaten by the encoder\r\n                    offset -= 3;\r\n                    break;\r\n                }\r\n                else if (fileMarker === 0xE0 || fileMarker == 0xE1) {\r\n                    // Recover from malformed APP1 markers popular in some phone models.\r\n                    // See https://github.com/eugeneware/jpeg-js/issues/82\r\n                    if (malformedDataOffset !== -1) {\r\n                        throw new Error(\"first unknown JPEG marker at offset \".concat(malformedDataOffset.toString(16), \", second unknown JPEG marker \").concat(fileMarker.toString(16), \" at offset \").concat((offset - 1).toString(16)));\r\n                    }\r\n                    malformedDataOffset = offset - 1;\r\n                    var nextOffset = readUint16();\r\n                    if (data[offset + nextOffset - 2] === 0xFF) {\r\n                        offset += nextOffset - 2;\r\n                        break;\r\n                    }\r\n                }\r\n                throw new Error('unknown JPEG marker ' + fileMarker.toString(16));\r\n            }\r\n        }\r\n        fileMarker = readUint16();\r\n    }\r\n    if (frames.length != 1)\r\n        throw new Error('only single frame JPEGs supported');\r\n    // set each frame's components quantization table\r\n    for (var i = 0; i < frames.length; i++) {\r\n        var cp = frames[i].components;\r\n        for (var j in cp) { // TODO: don't use `in`\r\n            cp[j].quantizationTable = quantizationTables[cp[j].quantizationIdx];\r\n            delete cp[j].quantizationIdx; // TODO: why ???\r\n        }\r\n    }\r\n    self.width = frame.samplesPerLine;\r\n    self.height = frame.scanLines;\r\n    self.jfif = jfif;\r\n    self.adobe = adobe;\r\n    self.components = [];\r\n    for (var i = 0; i < frame.componentsOrder.length; i++) {\r\n        var component = frame.components[frame.componentsOrder[i]];\r\n        self.components.push({\r\n            lines: buildComponentData(component),\r\n            scaleX: component.h / frame.maxH,\r\n            scaleY: component.v / frame.maxV\r\n        });\r\n    }\r\n    return self;\r\n}\r\nfunction getData(decoded) {\r\n    var offset = 0;\r\n    var colorTransform = false;\r\n    var width = decoded.width;\r\n    var height = decoded.height;\r\n    var dataLength = width * height * decoded.components.length;\r\n    requestMemoryAllocation(dataLength);\r\n    var data = new Uint8Array(dataLength);\r\n    switch (decoded.components.length) {\r\n        case 1: {\r\n            var component1 = decoded.components[0];\r\n            for (var y = 0; y < height; y++) {\r\n                var component1Line = component1.lines[0 | (y * component1.scaleY)];\r\n                for (var x = 0; x < width; x++) {\r\n                    var Y = component1Line[0 | (x * component1.scaleX)];\r\n                    data[offset++] = Y;\r\n                }\r\n            }\r\n            break;\r\n        }\r\n        case 2: {\r\n            // PDF might compress two component data in custom colorspace\r\n            var component1 = decoded.components[0];\r\n            var component2 = decoded.components[1];\r\n            for (var y = 0; y < height; y++) {\r\n                var component1Line = component1.lines[0 | (y * component1.scaleY)];\r\n                var component2Line = component2.lines[0 | (y * component2.scaleY)];\r\n                for (var x = 0; x < width; x++) {\r\n                    var Y1 = component1Line[0 | (x * component1.scaleX)];\r\n                    data[offset++] = Y1;\r\n                    var Y2 = component2Line[0 | (x * component2.scaleX)];\r\n                    data[offset++] = Y2;\r\n                }\r\n            }\r\n            break;\r\n        }\r\n        case 3: {\r\n            // The default transform for three components is true\r\n            colorTransform = true;\r\n            // The adobe transform marker overrides any previous setting\r\n            if (decoded.adobe && decoded.adobe.transformCode)\r\n                colorTransform = true;\r\n            var component1 = decoded.components[0];\r\n            var component2 = decoded.components[1];\r\n            var component3 = decoded.components[2];\r\n            for (var y = 0; y < height; y++) {\r\n                var component1Line = component1.lines[0 | (y * component1.scaleY)];\r\n                var component2Line = component2.lines[0 | (y * component2.scaleY)];\r\n                var component3Line = component3.lines[0 | (y * component3.scaleY)];\r\n                for (var x = 0; x < width; x++) {\r\n                    var Y = void 0, Cb = void 0, Cr = void 0, R = void 0, G = void 0, B = void 0;\r\n                    if (!colorTransform) {\r\n                        R = component1Line[0 | (x * component1.scaleX)];\r\n                        G = component2Line[0 | (x * component2.scaleX)];\r\n                        B = component3Line[0 | (x * component3.scaleX)];\r\n                    }\r\n                    else {\r\n                        Y = component1Line[0 | (x * component1.scaleX)];\r\n                        Cb = component2Line[0 | (x * component2.scaleX)];\r\n                        Cr = component3Line[0 | (x * component3.scaleX)];\r\n                        R = clampTo8bit(Y + 1.402 * (Cr - 128));\r\n                        G = clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));\r\n                        B = clampTo8bit(Y + 1.772 * (Cb - 128));\r\n                    }\r\n                    data[offset++] = R;\r\n                    data[offset++] = G;\r\n                    data[offset++] = B;\r\n                }\r\n            }\r\n            break;\r\n        }\r\n        case 4: {\r\n            if (!decoded.adobe)\r\n                throw new Error('Unsupported color mode (4 components)');\r\n            // The default transform for four components is false\r\n            colorTransform = false;\r\n            // The adobe transform marker overrides any previous setting\r\n            if (decoded.adobe && decoded.adobe.transformCode)\r\n                colorTransform = true;\r\n            var component1 = decoded.components[0];\r\n            var component2 = decoded.components[1];\r\n            var component3 = decoded.components[2];\r\n            var component4 = decoded.components[3];\r\n            for (var y = 0; y < height; y++) {\r\n                var component1Line = component1.lines[0 | (y * component1.scaleY)];\r\n                var component2Line = component2.lines[0 | (y * component2.scaleY)];\r\n                var component3Line = component3.lines[0 | (y * component3.scaleY)];\r\n                var component4Line = component4.lines[0 | (y * component4.scaleY)];\r\n                for (var x = 0; x < width; x++) {\r\n                    var Y = void 0, Cb = void 0, Cr = void 0, K = void 0, C = void 0, M = void 0, Ye = void 0;\r\n                    if (!colorTransform) {\r\n                        C = component1Line[0 | (x * component1.scaleX)];\r\n                        M = component2Line[0 | (x * component2.scaleX)];\r\n                        Ye = component3Line[0 | (x * component3.scaleX)];\r\n                        K = component4Line[0 | (x * component4.scaleX)];\r\n                    }\r\n                    else {\r\n                        Y = component1Line[0 | (x * component1.scaleX)];\r\n                        Cb = component2Line[0 | (x * component2.scaleX)];\r\n                        Cr = component3Line[0 | (x * component3.scaleX)];\r\n                        K = component4Line[0 | (x * component4.scaleX)];\r\n                        C = 255 - clampTo8bit(Y + 1.402 * (Cr - 128));\r\n                        M = 255 - clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));\r\n                        Ye = 255 - clampTo8bit(Y + 1.772 * (Cb - 128));\r\n                    }\r\n                    data[offset++] = 255 - C;\r\n                    data[offset++] = 255 - M;\r\n                    data[offset++] = 255 - Ye;\r\n                    data[offset++] = 255 - K;\r\n                }\r\n            }\r\n            break;\r\n        }\r\n        default:\r\n            throw new Error('Unsupported color mode');\r\n    }\r\n    return data;\r\n}\r\nexport function decodeJpeg(encoded, createImageData) {\r\n    totalBytesAllocated = 0;\r\n    if (encoded.length === 0)\r\n        throw new Error('Empty jpeg buffer');\r\n    var decoded = parse(encoded);\r\n    requestMemoryAllocation(decoded.width * decoded.height * 4);\r\n    var data = getData(decoded);\r\n    var imageData = createImageData(decoded.width, decoded.height);\r\n    var width = imageData.width;\r\n    var height = imageData.height;\r\n    var imageDataArray = imageData.data;\r\n    var i = 0;\r\n    var j = 0;\r\n    switch (decoded.components.length) {\r\n        case 1:\r\n            for (var y = 0; y < height; y++) {\r\n                for (var x = 0; x < width; x++) {\r\n                    var Y = data[i++];\r\n                    imageDataArray[j++] = Y;\r\n                    imageDataArray[j++] = Y;\r\n                    imageDataArray[j++] = Y;\r\n                    imageDataArray[j++] = 255;\r\n                }\r\n            }\r\n            break;\r\n        case 3:\r\n            for (var y = 0; y < height; y++) {\r\n                for (var x = 0; x < width; x++) {\r\n                    var R = data[i++];\r\n                    var G = data[i++];\r\n                    var B = data[i++];\r\n                    imageDataArray[j++] = R;\r\n                    imageDataArray[j++] = G;\r\n                    imageDataArray[j++] = B;\r\n                    imageDataArray[j++] = 255;\r\n                }\r\n            }\r\n            break;\r\n        case 4:\r\n            for (var y = 0; y < height; y++) {\r\n                for (var x = 0; x < width; x++) {\r\n                    var C = data[i++];\r\n                    var M = data[i++];\r\n                    var Y = data[i++];\r\n                    var K = data[i++];\r\n                    var R = 255 - clampTo8bit(C * (1 - K / 255) + K);\r\n                    var G = 255 - clampTo8bit(M * (1 - K / 255) + K);\r\n                    var B = 255 - clampTo8bit(Y * (1 - K / 255) + K);\r\n                    imageDataArray[j++] = R;\r\n                    imageDataArray[j++] = G;\r\n                    imageDataArray[j++] = B;\r\n                    imageDataArray[j++] = 255;\r\n                }\r\n            }\r\n            break;\r\n        default:\r\n            throw new Error('Unsupported color mode');\r\n    }\r\n    return imageData;\r\n}\r\n//# sourceMappingURL=jpeg.js.map","import { deflate as deflateSync } from 'pako';\r\nimport { decodeJpeg } from './jpeg';\r\nexport var MOCK_HANDLERS = false;\r\nexport var RAW_IMAGE_DATA = false;\r\nexport var fromBlendMode = {};\r\nexport var toBlendMode = {\r\n    'pass': 'pass through',\r\n    'norm': 'normal',\r\n    'diss': 'dissolve',\r\n    'dark': 'darken',\r\n    'mul ': 'multiply',\r\n    'idiv': 'color burn',\r\n    'lbrn': 'linear burn',\r\n    'dkCl': 'darker color',\r\n    'lite': 'lighten',\r\n    'scrn': 'screen',\r\n    'div ': 'color dodge',\r\n    'lddg': 'linear dodge',\r\n    'lgCl': 'lighter color',\r\n    'over': 'overlay',\r\n    'sLit': 'soft light',\r\n    'hLit': 'hard light',\r\n    'vLit': 'vivid light',\r\n    'lLit': 'linear light',\r\n    'pLit': 'pin light',\r\n    'hMix': 'hard mix',\r\n    'diff': 'difference',\r\n    'smud': 'exclusion',\r\n    'fsub': 'subtract',\r\n    'fdiv': 'divide',\r\n    'hue ': 'hue',\r\n    'sat ': 'saturation',\r\n    'colr': 'color',\r\n    'lum ': 'luminosity',\r\n};\r\nObject.keys(toBlendMode).forEach(function (key) { return fromBlendMode[toBlendMode[key]] = key; });\r\nexport var layerColors = [\r\n    'none', 'red', 'orange', 'yellow', 'green', 'blue', 'violet', 'gray'\r\n];\r\nexport var largeAdditionalInfoKeys = [\r\n    // from documentation\r\n    'LMsk', 'Lr16', 'Lr32', 'Layr', 'Mt16', 'Mt32', 'Mtrn', 'Alph', 'FMsk', 'lnk2', 'FEid', 'FXid', 'PxSD',\r\n    // from guessing\r\n    'cinf',\r\n];\r\nexport function revMap(map) {\r\n    var result = {};\r\n    Object.keys(map).forEach(function (key) { return result[map[key]] = key; });\r\n    return result;\r\n}\r\nexport function createEnum(prefix, def, map) {\r\n    var rev = revMap(map);\r\n    var decode = function (val) {\r\n        var value = val.split('.')[1];\r\n        if (value && !rev[value])\r\n            throw new Error(\"Unrecognized value for enum: '\".concat(val, \"'\"));\r\n        return rev[value] || def;\r\n    };\r\n    var encode = function (val) {\r\n        if (val && !map[val])\r\n            throw new Error(\"Invalid value for enum: '\".concat(val, \"'\"));\r\n        return \"\".concat(prefix, \".\").concat(map[val] || map[def]);\r\n    };\r\n    return { decode: decode, encode: encode };\r\n}\r\nexport var ColorSpace;\r\n(function (ColorSpace) {\r\n    ColorSpace[ColorSpace[\"RGB\"] = 0] = \"RGB\";\r\n    ColorSpace[ColorSpace[\"HSB\"] = 1] = \"HSB\";\r\n    ColorSpace[ColorSpace[\"CMYK\"] = 2] = \"CMYK\";\r\n    ColorSpace[ColorSpace[\"Lab\"] = 7] = \"Lab\";\r\n    ColorSpace[ColorSpace[\"Grayscale\"] = 8] = \"Grayscale\";\r\n})(ColorSpace || (ColorSpace = {}));\r\nexport var LayerMaskFlags;\r\n(function (LayerMaskFlags) {\r\n    LayerMaskFlags[LayerMaskFlags[\"PositionRelativeToLayer\"] = 1] = \"PositionRelativeToLayer\";\r\n    LayerMaskFlags[LayerMaskFlags[\"LayerMaskDisabled\"] = 2] = \"LayerMaskDisabled\";\r\n    LayerMaskFlags[LayerMaskFlags[\"InvertLayerMaskWhenBlending\"] = 4] = \"InvertLayerMaskWhenBlending\";\r\n    LayerMaskFlags[LayerMaskFlags[\"LayerMaskFromRenderingOtherData\"] = 8] = \"LayerMaskFromRenderingOtherData\";\r\n    LayerMaskFlags[LayerMaskFlags[\"MaskHasParametersAppliedToIt\"] = 16] = \"MaskHasParametersAppliedToIt\";\r\n})(LayerMaskFlags || (LayerMaskFlags = {}));\r\nexport var MaskParams;\r\n(function (MaskParams) {\r\n    MaskParams[MaskParams[\"UserMaskDensity\"] = 1] = \"UserMaskDensity\";\r\n    MaskParams[MaskParams[\"UserMaskFeather\"] = 2] = \"UserMaskFeather\";\r\n    MaskParams[MaskParams[\"VectorMaskDensity\"] = 4] = \"VectorMaskDensity\";\r\n    MaskParams[MaskParams[\"VectorMaskFeather\"] = 8] = \"VectorMaskFeather\";\r\n})(MaskParams || (MaskParams = {}));\r\nexport function offsetForChannel(channelId, cmyk) {\r\n    switch (channelId) {\r\n        case 0 /* ChannelID.Color0 */: return 0;\r\n        case 1 /* ChannelID.Color1 */: return 1;\r\n        case 2 /* ChannelID.Color2 */: return 2;\r\n        case 3 /* ChannelID.Color3 */: return cmyk ? 3 : channelId + 1;\r\n        case -1 /* ChannelID.Transparency */: return cmyk ? 4 : 3;\r\n        default: return channelId + 1;\r\n    }\r\n}\r\nexport function clamp(value, min, max) {\r\n    return value < min ? min : (value > max ? max : value);\r\n}\r\nexport function hasAlpha(data) {\r\n    var size = data.width * data.height * 4;\r\n    for (var i = 3; i < size; i += 4) {\r\n        if (data.data[i] !== 255) {\r\n            return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\nexport function resetImageData(_a) {\r\n    var data = _a.data;\r\n    var alpha = (data instanceof Float32Array) ? 1.0 : ((data instanceof Uint16Array) ? 0xffff : 0xff);\r\n    for (var p = 0, size = data.length | 0; p < size; p = (p + 4) | 0) {\r\n        data[p + 0] = 0;\r\n        data[p + 1] = 0;\r\n        data[p + 2] = 0;\r\n        data[p + 3] = alpha;\r\n    }\r\n}\r\nexport function imageDataToCanvas(pixelData) {\r\n    var canvas = createCanvas(pixelData.width, pixelData.height);\r\n    var imageData;\r\n    if (pixelData.data instanceof Uint8ClampedArray) {\r\n        imageData = pixelData;\r\n    }\r\n    else {\r\n        imageData = createImageData(pixelData.width, pixelData.height);\r\n        var src = pixelData.data;\r\n        var dst = imageData.data;\r\n        if (src instanceof Float32Array) {\r\n            for (var i = 0, size = src.length; i < size; i += 4) {\r\n                dst[i + 0] = Math.round(Math.pow(src[i + 0], 1.0 / 2.2) * 255);\r\n                dst[i + 1] = Math.round(Math.pow(src[i + 1], 1.0 / 2.2) * 255);\r\n                dst[i + 2] = Math.round(Math.pow(src[i + 2], 1.0 / 2.2) * 255);\r\n                dst[i + 3] = Math.round(src[i + 3] * 255);\r\n            }\r\n        }\r\n        else {\r\n            var shift = (src instanceof Uint16Array) ? 8 : 0;\r\n            for (var i = 0, size = src.length; i < size; i++) {\r\n                dst[i] = src[i] >>> shift;\r\n            }\r\n        }\r\n    }\r\n    canvas.getContext('2d').putImageData(imageData, 0, 0);\r\n    return canvas;\r\n}\r\nexport function decodeBitmap(input, output, width, height) {\r\n    if (!(input instanceof Uint8Array || input instanceof Uint8ClampedArray))\r\n        throw new Error('Invalid bit depth');\r\n    for (var y = 0, p = 0, o = 0; y < height; y++) {\r\n        for (var x = 0; x < width;) {\r\n            var b = input[o++];\r\n            for (var i = 0; i < 8 && x < width; i++, x++, p += 4) {\r\n                var v = b & 0x80 ? 0 : 255;\r\n                b = b << 1;\r\n                output[p + 0] = v;\r\n                output[p + 1] = v;\r\n                output[p + 2] = v;\r\n                output[p + 3] = 255;\r\n            }\r\n        }\r\n    }\r\n}\r\nexport function writeDataRaw(data, offset, width, height) {\r\n    if (!width || !height)\r\n        return undefined;\r\n    var array = new Uint8Array(width * height);\r\n    for (var i = 0; i < array.length; i++) {\r\n        array[i] = data.data[i * 4 + offset];\r\n    }\r\n    return array;\r\n}\r\nexport function writeDataRLE(buffer, _a, offsets, large) {\r\n    var data = _a.data, width = _a.width, height = _a.height;\r\n    if (!width || !height)\r\n        return undefined;\r\n    var stride = (4 * width) | 0;\r\n    var ol = 0;\r\n    var o = (offsets.length * (large ? 4 : 2) * height) | 0;\r\n    for (var _i = 0, offsets_1 = offsets; _i < offsets_1.length; _i++) {\r\n        var offset = offsets_1[_i];\r\n        for (var y = 0, p = offset | 0; y < height; y++) {\r\n            var strideStart = (y * stride) | 0;\r\n            var strideEnd = (strideStart + stride) | 0;\r\n            var lastIndex = (strideEnd + offset - 4) | 0;\r\n            var lastIndex2 = (lastIndex - 4) | 0;\r\n            var startOffset = o;\r\n            for (p = (strideStart + offset) | 0; p < strideEnd; p = (p + 4) | 0) {\r\n                if (p < lastIndex2) {\r\n                    var value1 = data[p];\r\n                    p = (p + 4) | 0;\r\n                    var value2 = data[p];\r\n                    p = (p + 4) | 0;\r\n                    var value3 = data[p];\r\n                    if (value1 === value2 && value1 === value3) {\r\n                        var count = 3;\r\n                        while (count < 128 && p < lastIndex && data[(p + 4) | 0] === value1) {\r\n                            count = (count + 1) | 0;\r\n                            p = (p + 4) | 0;\r\n                        }\r\n                        buffer[o++] = 1 - count;\r\n                        buffer[o++] = value1;\r\n                    }\r\n                    else {\r\n                        var countIndex = o;\r\n                        var writeLast = true;\r\n                        var count = 1;\r\n                        buffer[o++] = 0;\r\n                        buffer[o++] = value1;\r\n                        while (p < lastIndex && count < 128) {\r\n                            p = (p + 4) | 0;\r\n                            value1 = value2;\r\n                            value2 = value3;\r\n                            value3 = data[p];\r\n                            if (value1 === value2 && value1 === value3) {\r\n                                p = (p - 12) | 0;\r\n                                writeLast = false;\r\n                                break;\r\n                            }\r\n                            else {\r\n                                count++;\r\n                                buffer[o++] = value1;\r\n                            }\r\n                        }\r\n                        if (writeLast) {\r\n                            if (count < 127) {\r\n                                buffer[o++] = value2;\r\n                                buffer[o++] = value3;\r\n                                count += 2;\r\n                            }\r\n                            else if (count < 128) {\r\n                                buffer[o++] = value2;\r\n                                count++;\r\n                                p = (p - 4) | 0;\r\n                            }\r\n                            else {\r\n                                p = (p - 8) | 0;\r\n                            }\r\n                        }\r\n                        buffer[countIndex] = count - 1;\r\n                    }\r\n                }\r\n                else if (p === lastIndex) {\r\n                    buffer[o++] = 0;\r\n                    buffer[o++] = data[p];\r\n                }\r\n                else { // p === lastIndex2\r\n                    buffer[o++] = 1;\r\n                    buffer[o++] = data[p];\r\n                    p = (p + 4) | 0;\r\n                    buffer[o++] = data[p];\r\n                }\r\n            }\r\n            var length_1 = o - startOffset;\r\n            if (large) {\r\n                buffer[ol++] = (length_1 >> 24) & 0xff;\r\n                buffer[ol++] = (length_1 >> 16) & 0xff;\r\n            }\r\n            buffer[ol++] = (length_1 >> 8) & 0xff;\r\n            buffer[ol++] = length_1 & 0xff;\r\n        }\r\n    }\r\n    return buffer.slice(0, o);\r\n}\r\nexport function writeDataZipWithoutPrediction(_a, offsets) {\r\n    var data = _a.data, width = _a.width, height = _a.height;\r\n    var size = width * height;\r\n    var channel = new Uint8Array(size);\r\n    var buffers = [];\r\n    var totalLength = 0;\r\n    for (var _i = 0, offsets_2 = offsets; _i < offsets_2.length; _i++) {\r\n        var offset = offsets_2[_i];\r\n        for (var i = 0, o = offset; i < size; i++, o += 4) {\r\n            channel[i] = data[o];\r\n        }\r\n        var buffer = deflateSync(channel);\r\n        buffers.push(buffer);\r\n        totalLength += buffer.byteLength;\r\n    }\r\n    if (buffers.length > 0) {\r\n        var buffer = new Uint8Array(totalLength);\r\n        var offset = 0;\r\n        for (var _b = 0, buffers_1 = buffers; _b < buffers_1.length; _b++) {\r\n            var b = buffers_1[_b];\r\n            buffer.set(b, offset);\r\n            offset += b.byteLength;\r\n        }\r\n        return buffer;\r\n    }\r\n    else {\r\n        return buffers[0];\r\n    }\r\n}\r\nexport function createCanvasFromData(data) {\r\n    var canvas = createCanvas(100, 100);\r\n    try {\r\n        var context_1 = canvas.getContext('2d');\r\n        var imageData = decodeJpeg(data, function (w, h) { return context_1.createImageData(w, h); });\r\n        canvas.width = imageData.width;\r\n        canvas.height = imageData.height;\r\n        context_1.putImageData(imageData, 0, 0);\r\n    }\r\n    catch (e) {\r\n        console.error('JPEG decompression error', e.message);\r\n    }\r\n    return canvas;\r\n}\r\nexport var createCanvas = function () {\r\n    throw new Error('Canvas not initialized, use initializeCanvas method to set up createCanvas method');\r\n};\r\nvar tempCanvas = undefined;\r\nexport var createImageData = function (width, height) {\r\n    if (!tempCanvas)\r\n        tempCanvas = createCanvas(1, 1);\r\n    return tempCanvas.getContext('2d').createImageData(width, height);\r\n};\r\nif (typeof document !== 'undefined') {\r\n    createCanvas = function (width, height) {\r\n        var canvas = document.createElement('canvas');\r\n        canvas.width = width;\r\n        canvas.height = height;\r\n        return canvas;\r\n    };\r\n}\r\nexport function initializeCanvas(createCanvasMethod, createImageDataMethod) {\r\n    createCanvas = createCanvasMethod;\r\n    createImageData = createImageDataMethod || createImageData;\r\n}\r\n//# sourceMappingURL=helpers.js.map","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n","function charLengthInBytes(code) {\r\n    if ((code & 0xffffff80) === 0) {\r\n        return 1;\r\n    }\r\n    else if ((code & 0xfffff800) === 0) {\r\n        return 2;\r\n    }\r\n    else if ((code & 0xffff0000) === 0) {\r\n        return 3;\r\n    }\r\n    else {\r\n        return 4;\r\n    }\r\n}\r\nexport function stringLengthInBytes(value) {\r\n    var result = 0;\r\n    for (var i = 0; i < value.length; i++) {\r\n        var code = value.charCodeAt(i);\r\n        // high surrogate\r\n        if (code >= 0xd800 && code <= 0xdbff) {\r\n            if ((i + 1) < value.length) {\r\n                var extra = value.charCodeAt(i + 1);\r\n                // low surrogate\r\n                if ((extra & 0xfc00) === 0xdc00) {\r\n                    i++;\r\n                    result += charLengthInBytes(((code & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            result += charLengthInBytes(code);\r\n        }\r\n    }\r\n    return result;\r\n}\r\nfunction writeCharacter(buffer, offset, code) {\r\n    var length = charLengthInBytes(code);\r\n    switch (length) {\r\n        case 1:\r\n            buffer[offset] = code;\r\n            break;\r\n        case 2:\r\n            buffer[offset] = ((code >> 6) & 0x1f) | 0xc0;\r\n            buffer[offset + 1] = (code & 0x3f) | 0x80;\r\n            break;\r\n        case 3:\r\n            buffer[offset] = ((code >> 12) & 0x0f) | 0xe0;\r\n            buffer[offset + 1] = ((code >> 6) & 0x3f) | 0x80;\r\n            buffer[offset + 2] = (code & 0x3f) | 0x80;\r\n            break;\r\n        default:\r\n            buffer[offset] = ((code >> 18) & 0x07) | 0xf0;\r\n            buffer[offset + 1] = ((code >> 12) & 0x3f) | 0x80;\r\n            buffer[offset + 2] = ((code >> 6) & 0x3f) | 0x80;\r\n            buffer[offset + 3] = (code & 0x3f) | 0x80;\r\n            break;\r\n    }\r\n    return length;\r\n}\r\nexport function encodeStringTo(buffer, offset, value) {\r\n    for (var i = 0; i < value.length; i++) {\r\n        var code = value.charCodeAt(i);\r\n        // high surrogate\r\n        if (code >= 0xd800 && code <= 0xdbff) {\r\n            if ((i + 1) < value.length) {\r\n                var extra = value.charCodeAt(i + 1);\r\n                // low surrogate\r\n                if ((extra & 0xfc00) === 0xdc00) {\r\n                    i++;\r\n                    var fullCode = ((code & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\r\n                    offset += writeCharacter(buffer, offset, fullCode);\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            offset += writeCharacter(buffer, offset, code);\r\n        }\r\n    }\r\n    return offset;\r\n}\r\nexport function encodeString(value) {\r\n    if (value.length > 1000 && typeof TextEncoder !== 'undefined') {\r\n        return (new TextEncoder()).encode(value);\r\n    }\r\n    var buffer = new Uint8Array(stringLengthInBytes(value));\r\n    encodeStringTo(buffer, 0, value);\r\n    return buffer;\r\n}\r\nfunction continuationByte(buffer, index) {\r\n    if (index >= buffer.length) {\r\n        throw Error('Invalid byte index');\r\n    }\r\n    var continuationByte = buffer[index];\r\n    if ((continuationByte & 0xC0) === 0x80) {\r\n        return continuationByte & 0x3F;\r\n    }\r\n    else {\r\n        throw Error('Invalid continuation byte');\r\n    }\r\n}\r\nexport function decodeString(value) {\r\n    if (value.byteLength > 1000 && typeof TextDecoder !== 'undefined') {\r\n        return (new TextDecoder()).decode(value);\r\n    }\r\n    var result = [];\r\n    for (var i = 0; i < value.length;) {\r\n        var byte1 = value[i++];\r\n        var code = void 0;\r\n        if ((byte1 & 0x80) === 0) {\r\n            code = byte1;\r\n        }\r\n        else if ((byte1 & 0xe0) === 0xc0) {\r\n            var byte2 = continuationByte(value, i++);\r\n            code = ((byte1 & 0x1f) << 6) | byte2;\r\n            if (code < 0x80) {\r\n                throw Error('Invalid continuation byte');\r\n            }\r\n        }\r\n        else if ((byte1 & 0xf0) === 0xe0) {\r\n            var byte2 = continuationByte(value, i++);\r\n            var byte3 = continuationByte(value, i++);\r\n            code = ((byte1 & 0x0f) << 12) | (byte2 << 6) | byte3;\r\n            if (code < 0x0800) {\r\n                throw Error('Invalid continuation byte');\r\n            }\r\n            if (code >= 0xd800 && code <= 0xdfff) {\r\n                throw Error(\"Lone surrogate U+\".concat(code.toString(16).toUpperCase(), \" is not a scalar value\"));\r\n            }\r\n        }\r\n        else if ((byte1 & 0xf8) === 0xf0) {\r\n            var byte2 = continuationByte(value, i++);\r\n            var byte3 = continuationByte(value, i++);\r\n            var byte4 = continuationByte(value, i++);\r\n            code = ((byte1 & 0x0f) << 0x12) | (byte2 << 0x0c) | (byte3 << 0x06) | byte4;\r\n            if (code < 0x010000 || code > 0x10ffff) {\r\n                throw Error('Invalid continuation byte');\r\n            }\r\n        }\r\n        else {\r\n            throw Error('Invalid UTF-8 detected');\r\n        }\r\n        if (code > 0xffff) {\r\n            code -= 0x10000;\r\n            result.push(String.fromCharCode(code >>> 10 & 0x3ff | 0xd800));\r\n            code = 0xdc00 | code & 0x3ff;\r\n        }\r\n        result.push(String.fromCharCode(code));\r\n    }\r\n    return result.join('');\r\n}\r\n//# sourceMappingURL=utf8.js.map","var __assign = (this && this.__assign) || function () {\r\n    __assign = Object.assign || function(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n                t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\nvar __rest = (this && this.__rest) || function (s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n};\r\nimport { createEnum } from './helpers';\r\nimport { readSignature, readUnicodeString, readUint32, readUint8, readFloat64, readBytes, readAsciiString, readInt32, readFloat32, readInt32LE, readUnicodeStringWithLengthLE } from './psdReader';\r\nimport { writeSignature, writeBytes, writeUint32, writeFloat64, writeUint8, writeUnicodeStringWithPadding, writeInt32, writeFloat32, writeUnicodeString, writeInt32LE, writeUnicodeStringWithoutLengthLE } from './psdWriter';\r\nfunction revMap(map) {\r\n    var result = {};\r\n    Object.keys(map).forEach(function (key) { return result[map[key]] = key; });\r\n    return result;\r\n}\r\nvar unitsMap = {\r\n    '#Ang': 'Angle',\r\n    '#Rsl': 'Density',\r\n    '#Rlt': 'Distance',\r\n    '#Nne': 'None',\r\n    '#Prc': 'Percent',\r\n    '#Pxl': 'Pixels',\r\n    '#Mlm': 'Millimeters',\r\n    '#Pnt': 'Points',\r\n    'RrPi': 'Picas',\r\n    'RrIn': 'Inches',\r\n    'RrCm': 'Centimeters',\r\n};\r\nvar unitsMapRev = revMap(unitsMap);\r\nvar logErrors = false;\r\nexport function setLogErrors(value) {\r\n    logErrors = value;\r\n}\r\nfunction makeType(name, classID) {\r\n    return { name: name, classID: classID };\r\n}\r\nvar nullType = makeType('', 'null');\r\nvar USE_CHINESE = false; // Testing\r\nvar fieldToExtType = {\r\n    strokeStyleContent: makeType('', 'solidColorLayer'),\r\n    printProofSetup: makeType(USE_CHINESE ? '校样设置' : 'Proof Setup', 'proofSetup'),\r\n    Grad: makeType(USE_CHINESE ? '渐变' : 'Gradient', 'Grdn'),\r\n    Trnf: makeType(USE_CHINESE ? '变换' : 'Transform', 'Trnf'),\r\n    patternFill: makeType('', 'patternFill'),\r\n    ebbl: makeType('', 'ebbl'),\r\n    SoFi: makeType('', 'SoFi'),\r\n    GrFl: makeType('', 'GrFl'),\r\n    sdwC: makeType('', 'RGBC'),\r\n    hglC: makeType('', 'RGBC'),\r\n    'Clr ': makeType('', 'RGBC'),\r\n    'tintColor': makeType('', 'RGBC'),\r\n    Ofst: makeType('', 'Pnt '),\r\n    ChFX: makeType('', 'ChFX'),\r\n    MpgS: makeType('', 'ShpC'),\r\n    DrSh: makeType('', 'DrSh'),\r\n    IrSh: makeType('', 'IrSh'),\r\n    OrGl: makeType('', 'OrGl'),\r\n    IrGl: makeType('', 'IrGl'),\r\n    TrnS: makeType('', 'ShpC'),\r\n    Ptrn: makeType('', 'Ptrn'),\r\n    FrFX: makeType('', 'FrFX'),\r\n    phase: makeType('', 'Pnt '),\r\n    frameStep: nullType,\r\n    duration: nullType,\r\n    workInTime: nullType,\r\n    workOutTime: nullType,\r\n    audioClipGroupList: nullType,\r\n    bounds: makeType('', 'Rctn'),\r\n    customEnvelopeWarp: makeType('', 'customEnvelopeWarp'),\r\n    warp: makeType('', 'warp'),\r\n    'Sz  ': makeType('', 'Pnt '),\r\n    origin: makeType('', 'Pnt '),\r\n    autoExpandOffset: makeType('', 'Pnt '),\r\n    keyOriginShapeBBox: makeType('', 'unitRect'),\r\n    Vrsn: nullType,\r\n    psVersion: nullType,\r\n    docDefaultNewArtboardBackgroundColor: makeType('', 'RGBC'),\r\n    artboardRect: makeType('', 'classFloatRect'),\r\n    keyOriginRRectRadii: makeType('', 'radii'),\r\n    keyOriginBoxCorners: nullType,\r\n    rectangleCornerA: makeType('', 'Pnt '),\r\n    rectangleCornerB: makeType('', 'Pnt '),\r\n    rectangleCornerC: makeType('', 'Pnt '),\r\n    rectangleCornerD: makeType('', 'Pnt '),\r\n    compInfo: nullType,\r\n    quiltWarp: makeType('', 'quiltWarp'),\r\n    generatorSettings: nullType,\r\n    crema: nullType,\r\n    FrIn: nullType,\r\n    blendOptions: nullType,\r\n    FXRf: nullType,\r\n    Lefx: nullType,\r\n    time: nullType,\r\n    animKey: nullType,\r\n    timeScope: nullType,\r\n    inTime: nullType,\r\n    outTime: nullType,\r\n    sheetStyle: nullType,\r\n    translation: nullType,\r\n    Skew: nullType,\r\n    boundingBox: makeType('', 'boundingBox'),\r\n    'Lnk ': makeType('', 'ExternalFileLink'),\r\n    frameReader: makeType('', 'FrameReader'),\r\n    effectParams: makeType('', 'motionTrackEffectParams'),\r\n    Impr: makeType('None', 'none'),\r\n    Anch: makeType('', 'Pnt '),\r\n    'Fwd ': makeType('', 'Pnt '),\r\n    'Bwd ': makeType('', 'Pnt '),\r\n    FlrC: makeType('', 'Pnt '),\r\n    meshBoundaryPath: makeType('', 'pathClass'),\r\n    filterFX: makeType('', 'filterFXStyle'),\r\n    Fltr: makeType('', 'rigidTransform'),\r\n    FrgC: makeType('', 'RGBC'),\r\n    BckC: makeType('', 'RGBC'),\r\n    sdwM: makeType('Parameters', 'adaptCorrectTones'),\r\n    hglM: makeType('Parameters', 'adaptCorrectTones'),\r\n    customShape: makeType('', 'customShape'),\r\n    origFXRefPoint: nullType,\r\n    FXRefPoint: nullType,\r\n    ClMg: makeType('', 'ClMg'),\r\n};\r\nvar fieldToArrayExtType = {\r\n    'Crv ': makeType('', 'CrPt'),\r\n    Clrs: makeType('', 'Clrt'),\r\n    Trns: makeType('', 'TrnS'),\r\n    keyDescriptorList: nullType,\r\n    solidFillMulti: makeType('', 'SoFi'),\r\n    gradientFillMulti: makeType('', 'GrFl'),\r\n    dropShadowMulti: makeType('', 'DrSh'),\r\n    innerShadowMulti: makeType('', 'IrSh'),\r\n    frameFXMulti: makeType('', 'FrFX'),\r\n    FrIn: nullType,\r\n    FSts: nullType,\r\n    LaSt: nullType,\r\n    sheetTimelineOptions: nullType,\r\n    trackList: makeType('', 'animationTrack'),\r\n    globalTrackList: makeType('', 'animationTrack'),\r\n    keyList: nullType,\r\n    audioClipGroupList: nullType,\r\n    audioClipList: nullType,\r\n    countObjectList: makeType('', 'countObject'),\r\n    countGroupList: makeType('', 'countGroup'),\r\n    slices: makeType('', 'slice'),\r\n    'Pts ': makeType('', 'Pthp'),\r\n    SbpL: makeType('', 'SbpL'),\r\n    pathComponents: makeType('', 'PaCm'),\r\n    filterFXList: makeType('', 'filterFX'),\r\n    puppetShapeList: makeType('', 'puppetShape'),\r\n    channelDenoise: makeType('', 'channelDenoiseParams'),\r\n    ShrP: makeType('', 'Pnt '),\r\n    layerSettings: nullType,\r\n    list: nullType,\r\n    Adjs: makeType('', 'CrvA'),\r\n};\r\nvar typeToField = {\r\n    'TEXT': [\r\n        'Txt ', 'printerName', 'Nm  ', 'Idnt', 'blackAndWhitePresetFileName', 'LUT3DFileName',\r\n        'presetFileName', 'curvesPresetFileName', 'mixerPresetFileName', 'placed', 'description', 'reason',\r\n        'artboardPresetName', 'json', 'clipID', 'relPath', 'fullPath', 'mediaDescriptor', 'Msge',\r\n        'altTag', 'url', 'cellText', 'preset', 'KnNm', 'FPth', 'comment', 'originalPath',\r\n    ],\r\n    'tdta': [\r\n        'EngineData', 'LUT3DFileData', 'indexArray', 'originalVertexArray', 'deformedVertexArray',\r\n        'LqMe',\r\n    ],\r\n    'long': [\r\n        'TextIndex', 'RndS', 'Mdpn', 'Smth', 'Lctn', 'strokeStyleVersion', 'LaID', 'Vrsn', 'Cnt ',\r\n        'Brgh', 'Cntr', 'means', 'vibrance', 'Strt', 'bwPresetKind', 'comp', 'compID', 'originalCompID',\r\n        'curvesPresetKind', 'mixerPresetKind', 'uOrder', 'vOrder', 'PgNm', 'totalPages', 'Crop',\r\n        'numerator', 'denominator', 'frameCount', 'Annt', 'keyOriginType', 'unitValueQuadVersion',\r\n        'keyOriginIndex', 'major', 'minor', 'fix', 'docDefaultNewArtboardBackgroundType', 'artboardBackgroundType',\r\n        'numModifyingFX', 'deformNumRows', 'deformNumCols', 'FrID', 'FrDl', 'FsID', 'LCnt', 'AFrm', 'AFSt',\r\n        'numBefore', 'numAfter', 'Spcn', 'minOpacity', 'maxOpacity', 'BlnM', 'sheetID', 'gblA', 'globalAltitude',\r\n        'descVersion', 'frameReaderType', 'LyrI', 'zoomOrigin', 'fontSize', 'Rds ', 'sliceID',\r\n        'topOutset', 'leftOutset', 'bottomOutset', 'rightOutset', 'filterID', 'meshQuality',\r\n        'meshExpansion', 'meshRigidity', 'VrsM', 'VrsN', 'NmbG', 'WLMn', 'WLMx', 'AmMn', 'AmMx', 'SclH', 'SclV',\r\n        'Lvl ', 'TlNm', 'TlOf', 'FlRs', 'Thsh', 'ShrS', 'ShrE', 'FlRs', 'Vrnc', 'Strg', 'ExtS', 'ExtD',\r\n        'HrzS', 'VrtS', 'NmbR', 'EdgF', 'Ang1', 'Ang2', 'Ang3', 'Ang4', 'lastAppliedComp', 'capturedInfo',\r\n    ],\r\n    'enum': [\r\n        'textGridding', 'Ornt', 'warpStyle', 'warpRotate', 'Inte', 'Bltn', 'ClrS', 'BlrQ',\r\n        'bvlT', 'bvlS', 'bvlD', 'Md  ', 'glwS', 'GrdF', 'GlwT', 'RplS', 'BlrM', 'SmBM',\r\n        'strokeStyleLineCapType', 'strokeStyleLineJoinType', 'strokeStyleLineAlignment',\r\n        'strokeStyleBlendMode', 'PntT', 'Styl', 'lookupType', 'LUTFormat', 'dataOrder',\r\n        'tableOrder', 'enableCompCore', 'enableCompCoreGPU', 'compCoreSupport', 'compCoreGPUSupport', 'Engn',\r\n        'enableCompCoreThreads', 'gs99', 'FrDs', 'trackID', 'animInterpStyle', 'horzAlign',\r\n        'vertAlign', 'bgColorType', 'shapeOperation', 'UndA', 'Wvtp', 'Drct', 'WndM', 'Edg ', 'FlCl', 'IntE',\r\n        'IntC', 'Cnvr', 'Fl  ', 'Dstr', 'MztT', 'Lns ', 'ExtT', 'DspM', 'ExtR', 'ZZTy', 'SphM', 'SmBQ', 'placedLayerOCIOConversion', 'gradientsInterpolationMethod',\r\n    ],\r\n    'bool': [\r\n        'PstS', 'printSixteenBit', 'masterFXSwitch', 'enab', 'uglg', 'antialiasGloss',\r\n        'useShape', 'useTexture', 'uglg', 'antialiasGloss', 'useShape', 'Vsbl',\r\n        'useTexture', 'Algn', 'Rvrs', 'Dthr', 'Invr', 'VctC', 'ShTr', 'layerConceals',\r\n        'strokeEnabled', 'fillEnabled', 'strokeStyleScaleLock', 'strokeStyleStrokeAdjust',\r\n        'hardProof', 'MpBl', 'paperWhite', 'useLegacy', 'Auto', 'Lab ', 'useTint', 'keyShapeInvalidated',\r\n        'autoExpandEnabled', 'autoNestEnabled', 'autoPositionEnabled', 'shrinkwrapOnSaveEnabled',\r\n        'present', 'showInDialog', 'overprint', 'sheetDisclosed', 'lightsDisclosed', 'meshesDisclosed',\r\n        'materialsDisclosed', 'hasMotion', 'muted', 'Effc', 'selected', 'autoScope', 'fillCanvas',\r\n        'cellTextIsHTML', 'Smoo', 'Clsp', 'validAtPosition', 'rigidType', 'hasoptions', 'filterMaskEnable',\r\n        'filterMaskLinked', 'filterMaskExtendWithWhite', 'removeJPEGArtifact', 'Mnch', 'ExtF', 'ExtM',\r\n        'moreAccurate', 'GpuY', 'LIWy', 'Cnty',\r\n    ],\r\n    'doub': [\r\n        'warpValue', 'warpPerspective', 'warpPerspectiveOther', 'Intr', 'Wdth', 'Hght',\r\n        'strokeStyleMiterLimit', 'strokeStyleResolution', 'layerTime', 'keyOriginResolution',\r\n        'xx', 'xy', 'yx', 'yy', 'tx', 'ty', 'FrGA', 'frameRate', 'audioLevel', 'rotation',\r\n        'X   ', 'Y   ', 'redFloat', 'greenFloat', 'blueFloat', 'imageResolution',\r\n        'PuX0', 'PuX1', 'PuX2', 'PuX3', 'PuY0', 'PuY1', 'PuY2', 'PuY3'\r\n    ],\r\n    'UntF': [\r\n        'sdwO', 'hglO', 'lagl', 'Lald', 'srgR', 'blur', 'Sftn', 'Opct', 'Dstn', 'Angl',\r\n        'Ckmt', 'Nose', 'Inpr', 'ShdN', 'strokeStyleLineWidth', 'strokeStyleLineDashOffset',\r\n        'strokeStyleOpacity', 'H   ', 'Top ', 'Left', 'Btom', 'Rght', 'Rslt',\r\n        'topRight', 'topLeft', 'bottomLeft', 'bottomRight', 'ClNs', 'Shrp',\r\n    ],\r\n    'VlLs': [\r\n        'Crv ', 'Clrs', 'Mnm ', 'Mxm ', 'Trns', 'pathList', 'strokeStyleLineDashSet', 'FrLs', 'slices',\r\n        'LaSt', 'Trnf', 'nonAffineTransform', 'keyDescriptorList', 'guideIndeces', 'gradientFillMulti',\r\n        'solidFillMulti', 'frameFXMulti', 'innerShadowMulti', 'dropShadowMulti', 'FrIn', 'FSts', 'FsFr',\r\n        'sheetTimelineOptions', 'audioClipList', 'trackList', 'globalTrackList', 'keyList', 'audioClipList',\r\n        'warpValues', 'selectedPin', 'Pts ', 'SbpL', 'pathComponents', 'pinOffsets', 'posFinalPins',\r\n        'pinVertexIndices', 'PinP', 'PnRt', 'PnOv', 'PnDp', 'filterFXList', 'puppetShapeList', 'ShrP',\r\n        'channelDenoise', 'Mtrx', 'layerSettings', 'list', 'compList', 'Adjs',\r\n    ],\r\n    'ObAr': ['meshPoints', 'quiltSliceX', 'quiltSliceY'],\r\n    'obj ': ['null', 'Chnl'],\r\n    'Pth ': ['DspF'],\r\n};\r\nvar channels = [\r\n    'Rd  ', 'Grn ', 'Bl  ', 'Yllw', 'Ylw ', 'Cyn ', 'Mgnt', 'Blck', 'Gry ', 'Lmnc', 'A   ', 'B   ',\r\n];\r\nvar fieldToArrayType = {\r\n    'Mnm ': 'long',\r\n    'Mxm ': 'long',\r\n    FrLs: 'long',\r\n    strokeStyleLineDashSet: 'UntF',\r\n    Trnf: 'doub',\r\n    nonAffineTransform: 'doub',\r\n    keyDescriptorList: 'Objc',\r\n    gradientFillMulti: 'Objc',\r\n    solidFillMulti: 'Objc',\r\n    frameFXMulti: 'Objc',\r\n    innerShadowMulti: 'Objc',\r\n    dropShadowMulti: 'Objc',\r\n    LaSt: 'Objc',\r\n    FrIn: 'Objc',\r\n    FSts: 'Objc',\r\n    FsFr: 'long',\r\n    blendOptions: 'Objc',\r\n    sheetTimelineOptions: 'Objc',\r\n    keyList: 'Objc',\r\n    warpValues: 'doub',\r\n    selectedPin: 'long',\r\n    'Pts ': 'Objc',\r\n    SbpL: 'Objc',\r\n    pathComponents: 'Objc',\r\n    pinOffsets: 'doub',\r\n    posFinalPins: 'doub',\r\n    pinVertexIndices: 'long',\r\n    PinP: 'doub',\r\n    PnRt: 'long',\r\n    PnOv: 'bool',\r\n    PnDp: 'doub',\r\n    filterFXList: 'Objc',\r\n    puppetShapeList: 'Objc',\r\n    ShrP: 'Objc',\r\n    channelDenoise: 'Objc',\r\n    Mtrx: 'long',\r\n    compList: 'long',\r\n    Chnl: 'enum',\r\n};\r\nvar fieldToType = {};\r\nfor (var _i = 0, _a = Object.keys(typeToField); _i < _a.length; _i++) {\r\n    var type = _a[_i];\r\n    for (var _b = 0, _c = typeToField[type]; _b < _c.length; _b++) {\r\n        var field = _c[_b];\r\n        fieldToType[field] = type;\r\n    }\r\n}\r\nfor (var _d = 0, _e = Object.keys(fieldToExtType); _d < _e.length; _d++) {\r\n    var field = _e[_d];\r\n    if (!fieldToType[field])\r\n        fieldToType[field] = 'Objc';\r\n}\r\nfor (var _f = 0, _g = Object.keys(fieldToArrayExtType); _f < _g.length; _f++) {\r\n    var field = _g[_f];\r\n    fieldToArrayType[field] = 'Objc';\r\n}\r\nfunction getTypeByKey(key, value, root, parent) {\r\n    if (key === 'presetKind') {\r\n        return typeof value === 'string' ? 'enum' : 'long';\r\n    }\r\n    if (key === 'null' && root === 'slices') {\r\n        return 'TEXT';\r\n    }\r\n    else if (key === 'groupID') {\r\n        return root === 'slices' ? 'long' : 'TEXT';\r\n    }\r\n    else if (key === 'Sz  ') {\r\n        return ('Wdth' in value) ? 'Objc' : (('units' in value) ? 'UntF' : 'doub');\r\n    }\r\n    else if (key === 'Type') {\r\n        return typeof value === 'string' ? 'enum' : 'long';\r\n    }\r\n    else if (key === 'AntA') {\r\n        return typeof value === 'string' ? 'enum' : 'bool';\r\n    }\r\n    else if ((key === 'Hrzn' || key === 'Vrtc') && (parent.Type === 'keyType.Pstn' || parent._classID === 'Ofst')) {\r\n        return 'long';\r\n    }\r\n    else if (key === 'Hrzn' || key === 'Vrtc' || key === 'Top ' || key === 'Left' || key === 'Btom' || key === 'Rght') {\r\n        if (root === 'slices')\r\n            return 'long';\r\n        return typeof value === 'number' ? 'doub' : 'UntF';\r\n    }\r\n    else if (key === 'Vrsn') {\r\n        return typeof value === 'number' ? 'long' : 'Objc';\r\n    }\r\n    else if (key === 'Rd  ' || key === 'Grn ' || key === 'Bl  ') {\r\n        return root === 'artd' ? 'long' : 'doub';\r\n    }\r\n    else if (key === 'Trnf') {\r\n        return Array.isArray(value) ? 'VlLs' : 'Objc';\r\n    }\r\n    else {\r\n        return fieldToType[key];\r\n    }\r\n}\r\nexport function readAsciiStringOrClassId(reader) {\r\n    var length = readInt32(reader);\r\n    return readAsciiString(reader, length || 4);\r\n}\r\nfunction writeAsciiStringOrClassId(writer, value) {\r\n    if (value.length === 4 && value !== 'warp' && value !== 'time' && value !== 'hold' && value !== 'list') {\r\n        // write classId\r\n        writeInt32(writer, 0);\r\n        writeSignature(writer, value);\r\n    }\r\n    else {\r\n        // write ascii string\r\n        writeInt32(writer, value.length);\r\n        for (var i = 0; i < value.length; i++) {\r\n            writeUint8(writer, value.charCodeAt(i));\r\n        }\r\n    }\r\n}\r\nexport function readDescriptorStructure(reader, includeClass) {\r\n    var struct = readClassStructure(reader);\r\n    var object = includeClass ? { _name: struct.name, _classID: struct.classID } : {};\r\n    // console.log('>> ', struct);\r\n    var itemsCount = readUint32(reader);\r\n    for (var i = 0; i < itemsCount; i++) {\r\n        var key = readAsciiStringOrClassId(reader);\r\n        var type = readSignature(reader);\r\n        // console.log(`> '${key}' '${type}'`);\r\n        var data = readOSType(reader, type, includeClass);\r\n        // if (!getTypeByKey(key, data)) console.log(`> '${key}' '${type}'`, data);\r\n        object[key] = data;\r\n    }\r\n    return object;\r\n}\r\nexport function writeDescriptorStructure(writer, name, classId, value, root) {\r\n    if (logErrors && !classId)\r\n        console.log('Missing classId for: ', name, classId, value);\r\n    // write class structure\r\n    writeUnicodeStringWithPadding(writer, name);\r\n    writeAsciiStringOrClassId(writer, classId);\r\n    var keys = Object.keys(value);\r\n    var keyCount = keys.length;\r\n    if ('_name' in value)\r\n        keyCount--;\r\n    if ('_classID' in value)\r\n        keyCount--;\r\n    writeUint32(writer, keyCount);\r\n    for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\r\n        var key = keys_1[_i];\r\n        if (key === '_name' || key === '_classID')\r\n            continue;\r\n        var type = getTypeByKey(key, value[key], root, value);\r\n        var extType = fieldToExtType[key];\r\n        if (key === 'bounds' && root === 'text') {\r\n            extType = makeType('', 'bounds');\r\n        }\r\n        else if (key === 'origin') {\r\n            type = root === 'slices' ? 'enum' : 'Objc';\r\n        }\r\n        else if ((key === 'Cyn ' || key === 'Mgnt' || key === 'Ylw ' || key === 'Blck') && value._classID === 'CMYC') {\r\n            type = 'doub';\r\n        }\r\n        else if (/^PN[a-z][a-z]$/.test(key)) {\r\n            type = 'TEXT';\r\n        }\r\n        else if (/^PT[a-z][a-z]$/.test(key)) {\r\n            type = 'long';\r\n        }\r\n        else if (/^PF[a-z][a-z]$/.test(key)) {\r\n            type = 'doub';\r\n        }\r\n        else if ((key === 'Rds ' || key === 'Thsh') && typeof value[key] === 'number' && value._classID === 'SmrB') {\r\n            type = 'doub';\r\n        }\r\n        else if (key === 'ClSz' || key === 'Rds ' || key === 'Amnt') {\r\n            type = typeof value[key] === 'number' ? 'long' : 'UntF';\r\n        }\r\n        else if ((key === 'sdwM' || key === 'hglM') && typeof value[key] === 'string') {\r\n            type = 'enum';\r\n        }\r\n        else if (key === 'blur' && typeof value[key] === 'string') {\r\n            type = 'enum';\r\n        }\r\n        else if (key === 'Hght' && typeof value[key] === 'number' && value._classID === 'Embs') {\r\n            type = 'long';\r\n        }\r\n        else if (key === 'Angl' && typeof value[key] === 'number' && (value._classID === 'Embs' || value._classID === 'smartSharpen' || value._classID === 'Twrl' || value._classID === 'MtnB')) {\r\n            type = 'long';\r\n        }\r\n        else if (key === 'Angl' && typeof value[key] === 'number') {\r\n            type = 'doub'; // ???\r\n        }\r\n        else if (key === 'bounds' && root === 'slices') {\r\n            type = 'Objc';\r\n            extType = makeType('', 'Rct1');\r\n        }\r\n        else if (key === 'Scl ') {\r\n            if (typeof value[key] === 'object' && 'Hrzn' in value[key]) {\r\n                type = 'Objc';\r\n                extType = nullType;\r\n            }\r\n            else if (typeof value[key] === 'number') {\r\n                type = 'long';\r\n            }\r\n            else {\r\n                type = 'UntF';\r\n            }\r\n        }\r\n        else if (key === 'audioClipGroupList' && keys.length === 1) {\r\n            type = 'VlLs';\r\n        }\r\n        else if ((key === 'Strt' || key === 'Brgh') && 'H   ' in value) {\r\n            type = 'doub';\r\n        }\r\n        else if (key === 'Wdth' && typeof value[key] === 'object') {\r\n            type = 'UntF';\r\n        }\r\n        else if (key === 'Ofst' && typeof value[key] === 'number') {\r\n            type = 'long';\r\n        }\r\n        else if (key === 'Strt' && typeof value[key] === 'object') {\r\n            type = 'Objc';\r\n            extType = nullType;\r\n        }\r\n        else if (channels.indexOf(key) !== -1) {\r\n            type = (classId === 'RGBC' && root !== 'artd') ? 'doub' : 'long';\r\n        }\r\n        else if (key === 'profile') {\r\n            type = classId === 'printOutput' ? 'TEXT' : 'tdta';\r\n        }\r\n        else if (key === 'strokeStyleContent') {\r\n            if (value[key]['Clr ']) {\r\n                extType = makeType('', 'solidColorLayer');\r\n            }\r\n            else if (value[key].Grad) {\r\n                extType = makeType('', 'gradientLayer');\r\n            }\r\n            else if (value[key].Ptrn) {\r\n                extType = makeType('', 'patternLayer');\r\n            }\r\n            else {\r\n                logErrors && console.log('Invalid strokeStyleContent value', value[key]);\r\n            }\r\n        }\r\n        else if (key === 'bounds' && root === 'quiltWarp') {\r\n            extType = makeType('', 'classFloatRect');\r\n        }\r\n        if (extType && extType.classID === 'RGBC') {\r\n            if ('H   ' in value[key])\r\n                extType = { classID: 'HSBC', name: '' };\r\n            // TODO: other color spaces\r\n        }\r\n        writeAsciiStringOrClassId(writer, key);\r\n        writeSignature(writer, type || 'long');\r\n        writeOSType(writer, type || 'long', value[key], key, extType, root);\r\n        if (logErrors && !type)\r\n            console.log(\"Missing descriptor field type for: '\".concat(key, \"' in\"), value);\r\n    }\r\n}\r\nfunction readOSType(reader, type, includeClass) {\r\n    switch (type) {\r\n        case 'obj ': // Reference\r\n            return readReferenceStructure(reader);\r\n        case 'Objc': // Descriptor\r\n        case 'GlbO': // GlobalObject same as Descriptor\r\n            return readDescriptorStructure(reader, includeClass);\r\n        case 'VlLs': { // List\r\n            var length_1 = readInt32(reader);\r\n            var items = [];\r\n            for (var i = 0; i < length_1; i++) {\r\n                var itemType = readSignature(reader);\r\n                // console.log('  >', itemType);\r\n                items.push(readOSType(reader, itemType, includeClass));\r\n            }\r\n            return items;\r\n        }\r\n        case 'doub': // Double\r\n            return readFloat64(reader);\r\n        case 'UntF': { // Unit double\r\n            var units = readSignature(reader);\r\n            var value = readFloat64(reader);\r\n            if (!unitsMap[units])\r\n                throw new Error(\"Invalid units: \".concat(units));\r\n            return { units: unitsMap[units], value: value };\r\n        }\r\n        case 'UnFl': { // Unit float\r\n            var units = readSignature(reader);\r\n            var value = readFloat32(reader);\r\n            if (!unitsMap[units])\r\n                throw new Error(\"Invalid units: \".concat(units));\r\n            return { units: unitsMap[units], value: value };\r\n        }\r\n        case 'TEXT': // String\r\n            return readUnicodeString(reader);\r\n        case 'enum': { // Enumerated\r\n            var enumType = readAsciiStringOrClassId(reader);\r\n            var value = readAsciiStringOrClassId(reader);\r\n            return \"\".concat(enumType, \".\").concat(value);\r\n        }\r\n        case 'long': // Integer\r\n            return readInt32(reader);\r\n        case 'comp': { // Large Integer\r\n            var low = readUint32(reader);\r\n            var high = readUint32(reader);\r\n            return { low: low, high: high };\r\n        }\r\n        case 'bool': // Boolean\r\n            return !!readUint8(reader);\r\n        case 'type': // Class\r\n        case 'GlbC': // Class\r\n            return readClassStructure(reader);\r\n        case 'alis': { // Alias\r\n            var length_2 = readInt32(reader);\r\n            return readAsciiString(reader, length_2);\r\n        }\r\n        case 'tdta': { // Raw Data\r\n            var length_3 = readInt32(reader);\r\n            return readBytes(reader, length_3);\r\n        }\r\n        case 'ObAr': { // Object array\r\n            readInt32(reader); // version: 16\r\n            readUnicodeString(reader); // name: ''\r\n            readAsciiStringOrClassId(reader); // 'rationalPoint'\r\n            var length_4 = readInt32(reader);\r\n            var items = [];\r\n            for (var i = 0; i < length_4; i++) {\r\n                var type1 = readAsciiStringOrClassId(reader); // type Hrzn | Vrtc\r\n                readSignature(reader); // UnFl\r\n                readSignature(reader); // units ? '#Pxl'\r\n                var valuesCount = readInt32(reader);\r\n                var values = [];\r\n                for (var j = 0; j < valuesCount; j++) {\r\n                    values.push(readFloat64(reader));\r\n                }\r\n                items.push({ type: type1, values: values });\r\n            }\r\n            return items;\r\n        }\r\n        case 'Pth ': { // File path\r\n            /*const length =*/ readInt32(reader); // total size of all fields below\r\n            var sig = readSignature(reader);\r\n            /*const pathSize =*/ readInt32LE(reader); // the same as length\r\n            var charsCount = readInt32LE(reader);\r\n            var path = readUnicodeStringWithLengthLE(reader, charsCount);\r\n            return { sig: sig, path: path };\r\n        }\r\n        default:\r\n            throw new Error(\"Invalid TySh descriptor OSType: \".concat(type, \" at \").concat(reader.offset.toString(16)));\r\n    }\r\n}\r\nvar ObArTypes = {\r\n    meshPoints: 'rationalPoint',\r\n    quiltSliceX: 'UntF',\r\n    quiltSliceY: 'UntF',\r\n};\r\nfunction writeOSType(writer, type, value, key, extType, root) {\r\n    switch (type) {\r\n        case 'obj ': // Reference\r\n            writeReferenceStructure(writer, key, value);\r\n            break;\r\n        case 'Objc': // Descriptor\r\n        case 'GlbO': { // GlobalObject same as Descriptor\r\n            if (typeof value !== 'object')\r\n                throw new Error(\"Invalid struct value: \".concat(JSON.stringify(value), \", key: \").concat(key));\r\n            if (!extType)\r\n                throw new Error(\"Missing ext type for: '\".concat(key, \"' (\").concat(JSON.stringify(value), \")\"));\r\n            var name_1 = value._name || extType.name;\r\n            var classID = value._classID || extType.classID;\r\n            writeDescriptorStructure(writer, name_1, classID, value, root);\r\n            break;\r\n        }\r\n        case 'VlLs': // List\r\n            if (!Array.isArray(value))\r\n                throw new Error(\"Invalid list value: \".concat(JSON.stringify(value), \", key: \").concat(key));\r\n            writeInt32(writer, value.length);\r\n            for (var i = 0; i < value.length; i++) {\r\n                var type_1 = fieldToArrayType[key];\r\n                writeSignature(writer, type_1 || 'long');\r\n                writeOSType(writer, type_1 || 'long', value[i], \"\".concat(key, \"[]\"), fieldToArrayExtType[key], root);\r\n                if (logErrors && !type_1)\r\n                    console.log(\"Missing descriptor array type for: '\".concat(key, \"' in\"), value);\r\n            }\r\n            break;\r\n        case 'doub': // Double\r\n            if (typeof value !== 'number')\r\n                throw new Error(\"Invalid number value: \".concat(JSON.stringify(value), \", key: \").concat(key));\r\n            writeFloat64(writer, value);\r\n            break;\r\n        case 'UntF': // Unit double\r\n            if (!unitsMapRev[value.units])\r\n                throw new Error(\"Invalid units: \".concat(value.units, \" in \").concat(key));\r\n            writeSignature(writer, unitsMapRev[value.units]);\r\n            writeFloat64(writer, value.value);\r\n            break;\r\n        case 'UnFl': // Unit float\r\n            if (!unitsMapRev[value.units])\r\n                throw new Error(\"Invalid units: \".concat(value.units, \" in \").concat(key));\r\n            writeSignature(writer, unitsMapRev[value.units]);\r\n            writeFloat32(writer, value.value);\r\n            break;\r\n        case 'TEXT': // String\r\n            writeUnicodeStringWithPadding(writer, value);\r\n            break;\r\n        case 'enum': { // Enumerated\r\n            if (typeof value !== 'string')\r\n                throw new Error(\"Invalid enum value: \".concat(JSON.stringify(value), \", key: \").concat(key));\r\n            var _a = value.split('.'), _type = _a[0], val = _a[1];\r\n            writeAsciiStringOrClassId(writer, _type);\r\n            writeAsciiStringOrClassId(writer, val);\r\n            break;\r\n        }\r\n        case 'long': // Integer\r\n            if (typeof value !== 'number')\r\n                throw new Error(\"Invalid integer value: \".concat(JSON.stringify(value), \", key: \").concat(key));\r\n            writeInt32(writer, value);\r\n            break;\r\n        // case 'comp': // Large Integer\r\n        // \twriteLargeInteger(reader);\r\n        case 'bool': // Boolean\r\n            if (typeof value !== 'boolean')\r\n                throw new Error(\"Invalid boolean value: \".concat(JSON.stringify(value), \", key: \").concat(key));\r\n            writeUint8(writer, value ? 1 : 0);\r\n            break;\r\n        // case 'type': // Class\r\n        // case 'GlbC': // Class\r\n        // \twriteClassStructure(reader);\r\n        // case 'alis': // Alias\r\n        // \twriteAliasStructure(reader);\r\n        case 'tdta': // Raw Data\r\n            writeInt32(writer, value.byteLength);\r\n            writeBytes(writer, value);\r\n            break;\r\n        case 'ObAr': { // Object array\r\n            writeInt32(writer, 16); // version\r\n            writeUnicodeStringWithPadding(writer, ''); // name\r\n            var type_2 = ObArTypes[key];\r\n            if (!type_2)\r\n                throw new Error(\"Not implemented ObArType for: \".concat(key));\r\n            writeAsciiStringOrClassId(writer, type_2);\r\n            writeInt32(writer, value.length);\r\n            for (var i = 0; i < value.length; i++) {\r\n                writeAsciiStringOrClassId(writer, value[i].type); // Hrzn | Vrtc\r\n                writeSignature(writer, 'UnFl');\r\n                writeSignature(writer, '#Pxl');\r\n                writeInt32(writer, value[i].values.length);\r\n                for (var j = 0; j < value[i].values.length; j++) {\r\n                    writeFloat64(writer, value[i].values[j]);\r\n                }\r\n            }\r\n            break;\r\n        }\r\n        case 'Pth ': { // File path\r\n            var length_5 = 4 + 4 + 4 + value.path.length * 2;\r\n            writeInt32(writer, length_5);\r\n            writeSignature(writer, value.sig);\r\n            writeInt32LE(writer, length_5);\r\n            writeInt32LE(writer, value.path.length);\r\n            writeUnicodeStringWithoutLengthLE(writer, value.path);\r\n            break;\r\n        }\r\n        default:\r\n            throw new Error(\"Not implemented descriptor OSType: \".concat(type));\r\n    }\r\n}\r\nfunction readReferenceStructure(reader) {\r\n    var itemsCount = readInt32(reader);\r\n    var items = [];\r\n    for (var i = 0; i < itemsCount; i++) {\r\n        var type = readSignature(reader);\r\n        switch (type) {\r\n            case 'prop': { // Property\r\n                readClassStructure(reader);\r\n                var keyID = readAsciiStringOrClassId(reader);\r\n                items.push(keyID);\r\n                break;\r\n            }\r\n            case 'Clss': // Class\r\n                items.push(readClassStructure(reader));\r\n                break;\r\n            case 'Enmr': { // Enumerated Reference\r\n                readClassStructure(reader);\r\n                var typeID = readAsciiStringOrClassId(reader);\r\n                var value = readAsciiStringOrClassId(reader);\r\n                items.push(\"\".concat(typeID, \".\").concat(value));\r\n                break;\r\n            }\r\n            case 'rele': { // Offset\r\n                // const { name, classID } =\r\n                readClassStructure(reader);\r\n                items.push(readUint32(reader));\r\n                break;\r\n            }\r\n            case 'Idnt': // Identifier\r\n                items.push(readInt32(reader));\r\n                break;\r\n            case 'indx': // Index\r\n                items.push(readInt32(reader));\r\n                break;\r\n            case 'name': { // Name\r\n                readClassStructure(reader);\r\n                items.push(readUnicodeString(reader));\r\n                break;\r\n            }\r\n            default:\r\n                throw new Error(\"Invalid descriptor reference type: \".concat(type));\r\n        }\r\n    }\r\n    return items;\r\n}\r\nfunction writeReferenceStructure(writer, _key, items) {\r\n    writeInt32(writer, items.length);\r\n    for (var i = 0; i < items.length; i++) {\r\n        var value = items[i];\r\n        var type = 'unknown';\r\n        if (typeof value === 'string') {\r\n            if (/^[a-z ]+\\.[a-z ]+$/i.test(value)) {\r\n                type = 'Enmr';\r\n            }\r\n            else {\r\n                type = 'name';\r\n            }\r\n        }\r\n        writeSignature(writer, type);\r\n        switch (type) {\r\n            // case 'prop': // Property\r\n            // case 'Clss': // Class\r\n            case 'Enmr': { // Enumerated Reference\r\n                var _a = value.split('.'), typeID = _a[0], enumValue = _a[1];\r\n                writeClassStructure(writer, '\\0', typeID);\r\n                writeAsciiStringOrClassId(writer, typeID);\r\n                writeAsciiStringOrClassId(writer, enumValue);\r\n                break;\r\n            }\r\n            // case 'rele': // Offset\r\n            // case 'Idnt': // Identifier\r\n            // case 'indx': // Index\r\n            case 'name': { // Name\r\n                writeClassStructure(writer, '\\0', 'Lyr ');\r\n                writeUnicodeString(writer, value + '\\0');\r\n                break;\r\n            }\r\n            default:\r\n                throw new Error(\"Invalid descriptor reference type: \".concat(type));\r\n        }\r\n    }\r\n    return items;\r\n}\r\nfunction readClassStructure(reader) {\r\n    var name = readUnicodeString(reader);\r\n    var classID = readAsciiStringOrClassId(reader);\r\n    return { name: name, classID: classID };\r\n}\r\nfunction writeClassStructure(writer, name, classID) {\r\n    writeUnicodeString(writer, name);\r\n    writeAsciiStringOrClassId(writer, classID);\r\n}\r\nexport function readVersionAndDescriptor(reader, includeClass) {\r\n    if (includeClass === void 0) { includeClass = false; }\r\n    var version = readUint32(reader);\r\n    if (version !== 16)\r\n        throw new Error(\"Invalid descriptor version: \".concat(version));\r\n    var desc = readDescriptorStructure(reader, includeClass);\r\n    // console.log(require('util').inspect(desc, false, 99, true));\r\n    return desc;\r\n}\r\nexport function writeVersionAndDescriptor(writer, name, classID, descriptor, root) {\r\n    if (root === void 0) { root = ''; }\r\n    writeUint32(writer, 16); // version\r\n    writeDescriptorStructure(writer, name, classID, descriptor, root);\r\n}\r\nexport function horzVrtcToXY(hv) {\r\n    return { x: hv.Hrzn, y: hv.Vrtc };\r\n}\r\nexport function xyToHorzVrtc(xy) {\r\n    return { Hrzn: xy.x, Vrtc: xy.y };\r\n}\r\nexport function descBoundsToBounds(desc) {\r\n    return {\r\n        top: parseUnits(desc['Top ']),\r\n        left: parseUnits(desc.Left),\r\n        right: parseUnits(desc.Rght),\r\n        bottom: parseUnits(desc.Btom),\r\n    };\r\n}\r\nexport function boundsToDescBounds(bounds) {\r\n    var _a;\r\n    return _a = {\r\n            Left: unitsValue(bounds.left, 'bounds.left')\r\n        },\r\n        _a['Top '] = unitsValue(bounds.top, 'bounds.top'),\r\n        _a.Rght = unitsValue(bounds.right, 'bounds.right'),\r\n        _a.Btom = unitsValue(bounds.bottom, 'bounds.bottom'),\r\n        _a;\r\n}\r\nfunction parseFxObject(fx) {\r\n    var stroke = {\r\n        enabled: !!fx.enab,\r\n        position: FStl.decode(fx.Styl),\r\n        fillType: FrFl.decode(fx.PntT),\r\n        blendMode: BlnM.decode(fx['Md  ']),\r\n        opacity: parsePercent(fx.Opct),\r\n        size: parseUnits(fx['Sz  ']),\r\n    };\r\n    if (fx.present !== undefined)\r\n        stroke.present = fx.present;\r\n    if (fx.showInDialog !== undefined)\r\n        stroke.showInDialog = fx.showInDialog;\r\n    if (fx.overprint !== undefined)\r\n        stroke.overprint = fx.overprint;\r\n    if (fx['Clr '])\r\n        stroke.color = parseColor(fx['Clr ']);\r\n    if (fx.Grad)\r\n        stroke.gradient = parseGradientContent(fx);\r\n    if (fx.Ptrn)\r\n        stroke.pattern = parsePatternContent(fx);\r\n    return stroke;\r\n}\r\nfunction serializeFxObject(stroke) {\r\n    var FrFX = {};\r\n    FrFX.enab = !!stroke.enabled;\r\n    if (stroke.present !== undefined)\r\n        FrFX.present = !!stroke.present;\r\n    if (stroke.showInDialog !== undefined)\r\n        FrFX.showInDialog = !!stroke.showInDialog;\r\n    FrFX.Styl = FStl.encode(stroke.position);\r\n    FrFX.PntT = FrFl.encode(stroke.fillType);\r\n    FrFX['Md  '] = BlnM.encode(stroke.blendMode);\r\n    FrFX.Opct = unitsPercent(stroke.opacity);\r\n    FrFX['Sz  '] = unitsValue(stroke.size, 'size');\r\n    if (stroke.color)\r\n        FrFX['Clr '] = serializeColor(stroke.color);\r\n    if (stroke.gradient)\r\n        FrFX = __assign(__assign({}, FrFX), serializeGradientContent(stroke.gradient));\r\n    if (stroke.pattern)\r\n        FrFX = __assign(__assign({}, FrFX), serializePatternContent(stroke.pattern));\r\n    if (stroke.overprint !== undefined)\r\n        FrFX.overprint = !!stroke.overprint;\r\n    return FrFX;\r\n}\r\nexport function serializeEffects(e, log, multi) {\r\n    var _a, _b, _c;\r\n    var info = multi ? {\r\n        'Scl ': unitsPercentF((_a = e.scale) !== null && _a !== void 0 ? _a : 1),\r\n        masterFXSwitch: !e.disabled,\r\n    } : {\r\n        masterFXSwitch: !e.disabled,\r\n        'Scl ': unitsPercentF((_b = e.scale) !== null && _b !== void 0 ? _b : 1),\r\n    };\r\n    var arrayKeys = ['dropShadow', 'innerShadow', 'solidFill', 'gradientOverlay', 'stroke'];\r\n    for (var _i = 0, arrayKeys_1 = arrayKeys; _i < arrayKeys_1.length; _i++) {\r\n        var key = arrayKeys_1[_i];\r\n        if (e[key] && !Array.isArray(e[key]))\r\n            throw new Error(\"\".concat(key, \" should be an array\"));\r\n    }\r\n    var useMulti = function (arr) { return !!arr && arr.length > 1 && multi; };\r\n    var useSingle = function (arr) { return !!arr && arr.length >= 1 && (!multi || arr.length === 1); };\r\n    if (useSingle(e.dropShadow))\r\n        info.DrSh = serializeEffectObject(e.dropShadow[0], 'dropShadow', log);\r\n    if (useMulti(e.dropShadow))\r\n        info.dropShadowMulti = e.dropShadow.map(function (i) { return serializeEffectObject(i, 'dropShadow', log); });\r\n    if (useSingle(e.innerShadow))\r\n        info.IrSh = serializeEffectObject(e.innerShadow[0], 'innerShadow', log);\r\n    if (useMulti(e.innerShadow))\r\n        info.innerShadowMulti = e.innerShadow.map(function (i) { return serializeEffectObject(i, 'innerShadow', log); });\r\n    if (e.outerGlow)\r\n        info.OrGl = serializeEffectObject(e.outerGlow, 'outerGlow', log);\r\n    if (useMulti(e.solidFill))\r\n        info.solidFillMulti = e.solidFill.map(function (i) { return serializeEffectObject(i, 'solidFill', log); });\r\n    if (useMulti(e.gradientOverlay))\r\n        info.gradientFillMulti = e.gradientOverlay.map(function (i) { return serializeEffectObject(i, 'gradientOverlay', log); });\r\n    if (useMulti(e.stroke))\r\n        info.frameFXMulti = e.stroke.map(function (i) { return serializeFxObject(i); });\r\n    if (e.innerGlow)\r\n        info.IrGl = serializeEffectObject(e.innerGlow, 'innerGlow', log);\r\n    if (e.bevel)\r\n        info.ebbl = serializeEffectObject(e.bevel, 'bevel', log);\r\n    if (useSingle(e.solidFill))\r\n        info.SoFi = serializeEffectObject(e.solidFill[0], 'solidFill', log);\r\n    if (e.patternOverlay)\r\n        info.patternFill = serializeEffectObject(e.patternOverlay, 'patternOverlay', log);\r\n    if (useSingle(e.gradientOverlay))\r\n        info.GrFl = serializeEffectObject(e.gradientOverlay[0], 'gradientOverlay', log);\r\n    if (e.satin)\r\n        info.ChFX = serializeEffectObject(e.satin, 'satin', log);\r\n    if (useSingle(e.stroke))\r\n        info.FrFX = serializeFxObject((_c = e.stroke) === null || _c === void 0 ? void 0 : _c[0]);\r\n    if (multi) {\r\n        info.numModifyingFX = 0;\r\n        for (var _d = 0, _e = Object.keys(e); _d < _e.length; _d++) {\r\n            var key = _e[_d];\r\n            var value = e[key];\r\n            if (Array.isArray(value)) {\r\n                for (var _f = 0, value_1 = value; _f < value_1.length; _f++) {\r\n                    var effect = value_1[_f];\r\n                    if (effect.enabled)\r\n                        info.numModifyingFX++;\r\n                }\r\n            }\r\n            else if (value.enabled) {\r\n                info.numModifyingFX++;\r\n            }\r\n        }\r\n    }\r\n    return info;\r\n}\r\nexport function parseEffects(info, log) {\r\n    var effects = {};\r\n    var masterFXSwitch = info.masterFXSwitch, DrSh = info.DrSh, dropShadowMulti = info.dropShadowMulti, IrSh = info.IrSh, innerShadowMulti = info.innerShadowMulti, OrGl = info.OrGl, IrGl = info.IrGl, ebbl = info.ebbl, SoFi = info.SoFi, solidFillMulti = info.solidFillMulti, patternFill = info.patternFill, GrFl = info.GrFl, gradientFillMulti = info.gradientFillMulti, ChFX = info.ChFX, FrFX = info.FrFX, frameFXMulti = info.frameFXMulti, numModifyingFX = info.numModifyingFX, rest = __rest(info, [\"masterFXSwitch\", \"DrSh\", \"dropShadowMulti\", \"IrSh\", \"innerShadowMulti\", \"OrGl\", \"IrGl\", \"ebbl\", \"SoFi\", \"solidFillMulti\", \"patternFill\", \"GrFl\", \"gradientFillMulti\", \"ChFX\", \"FrFX\", \"frameFXMulti\", \"numModifyingFX\"]);\r\n    if (!masterFXSwitch)\r\n        effects.disabled = true;\r\n    if (info['Scl '])\r\n        effects.scale = parsePercent(info['Scl ']);\r\n    if (DrSh)\r\n        effects.dropShadow = [parseEffectObject(DrSh, log)];\r\n    if (dropShadowMulti)\r\n        effects.dropShadow = dropShadowMulti.map(function (i) { return parseEffectObject(i, log); });\r\n    if (IrSh)\r\n        effects.innerShadow = [parseEffectObject(IrSh, log)];\r\n    if (innerShadowMulti)\r\n        effects.innerShadow = innerShadowMulti.map(function (i) { return parseEffectObject(i, log); });\r\n    if (OrGl)\r\n        effects.outerGlow = parseEffectObject(OrGl, log);\r\n    if (IrGl)\r\n        effects.innerGlow = parseEffectObject(IrGl, log);\r\n    if (ebbl)\r\n        effects.bevel = parseEffectObject(ebbl, log);\r\n    if (SoFi)\r\n        effects.solidFill = [parseEffectObject(SoFi, log)];\r\n    if (solidFillMulti)\r\n        effects.solidFill = solidFillMulti.map(function (i) { return parseEffectObject(i, log); });\r\n    if (patternFill)\r\n        effects.patternOverlay = parseEffectObject(patternFill, log);\r\n    if (GrFl)\r\n        effects.gradientOverlay = [parseEffectObject(GrFl, log)];\r\n    if (gradientFillMulti)\r\n        effects.gradientOverlay = gradientFillMulti.map(function (i) { return parseEffectObject(i, log); });\r\n    if (ChFX)\r\n        effects.satin = parseEffectObject(ChFX, log);\r\n    if (FrFX)\r\n        effects.stroke = [parseFxObject(FrFX)];\r\n    if (frameFXMulti)\r\n        effects.stroke = frameFXMulti.map(function (i) { return parseFxObject(i); });\r\n    if (log && Object.keys(rest).length > 1)\r\n        console.log('Unhandled effect keys:', rest);\r\n    return effects;\r\n}\r\nfunction parseKeyList(keyList, logMissingFeatures) {\r\n    var keys = [];\r\n    for (var j = 0; j < keyList.length; j++) {\r\n        var key = keyList[j];\r\n        var _a = key.time, denominator = _a.denominator, numerator = _a.numerator, selected = key.selected, animKey = key.animKey;\r\n        var time = { numerator: numerator, denominator: denominator };\r\n        var interpolation = animInterpStyleEnum.decode(key.animInterpStyle);\r\n        switch (animKey.Type) {\r\n            case 'keyType.Opct':\r\n                keys.push({ interpolation: interpolation, time: time, selected: selected, type: 'opacity', value: parsePercent(animKey.Opct) });\r\n                break;\r\n            case 'keyType.Pstn':\r\n                keys.push({ interpolation: interpolation, time: time, selected: selected, type: 'position', x: animKey.Hrzn, y: animKey.Vrtc });\r\n                break;\r\n            case 'keyType.Trnf':\r\n                keys.push({\r\n                    interpolation: interpolation,\r\n                    time: time,\r\n                    selected: selected,\r\n                    type: 'transform',\r\n                    scale: horzVrtcToXY(animKey['Scl ']), skew: horzVrtcToXY(animKey.Skew), rotation: animKey.rotation, translation: horzVrtcToXY(animKey.translation)\r\n                });\r\n                break;\r\n            case 'keyType.sheetStyle': {\r\n                var key_1 = { interpolation: interpolation, time: time, selected: selected, type: 'style' };\r\n                if (animKey.sheetStyle.Lefx)\r\n                    key_1.style = parseEffects(animKey.sheetStyle.Lefx, logMissingFeatures);\r\n                keys.push(key_1);\r\n                break;\r\n            }\r\n            case 'keyType.globalLighting': {\r\n                keys.push({\r\n                    interpolation: interpolation,\r\n                    time: time,\r\n                    selected: selected,\r\n                    type: 'globalLighting',\r\n                    globalAngle: animKey.gblA, globalAltitude: animKey.globalAltitude\r\n                });\r\n                break;\r\n            }\r\n            default: throw new Error(\"Unsupported keyType value\");\r\n        }\r\n    }\r\n    return keys;\r\n}\r\nfunction serializeKeyList(keys) {\r\n    var keyList = [];\r\n    for (var j = 0; j < keys.length; j++) {\r\n        var key = keys[j];\r\n        var time = key.time, _a = key.selected, selected = _a === void 0 ? false : _a, interpolation = key.interpolation;\r\n        var animInterpStyle = animInterpStyleEnum.encode(interpolation);\r\n        var animKey = void 0;\r\n        switch (key.type) {\r\n            case 'opacity':\r\n                animKey = { Type: 'keyType.Opct', Opct: unitsPercent(key.value) };\r\n                break;\r\n            case 'position':\r\n                animKey = { Type: 'keyType.Pstn', Hrzn: key.x, Vrtc: key.y };\r\n                break;\r\n            case 'transform':\r\n                animKey = { Type: 'keyType.Trnf', 'Scl ': xyToHorzVrtc(key.scale), Skew: xyToHorzVrtc(key.skew), rotation: key.rotation, translation: xyToHorzVrtc(key.translation) };\r\n                break;\r\n            case 'style':\r\n                animKey = { Type: 'keyType.sheetStyle', sheetStyle: { Vrsn: 1, blendOptions: {} } };\r\n                if (key.style)\r\n                    animKey.sheetStyle = { Vrsn: 1, Lefx: serializeEffects(key.style, false, false), blendOptions: {} };\r\n                break;\r\n            case 'globalLighting': {\r\n                animKey = { Type: 'keyType.globalLighting', gblA: key.globalAngle, globalAltitude: key.globalAltitude };\r\n                break;\r\n            }\r\n            default: throw new Error(\"Unsupported keyType value\");\r\n        }\r\n        keyList.push({ Vrsn: 1, animInterpStyle: animInterpStyle, time: time, animKey: animKey, selected: selected });\r\n    }\r\n    return keyList;\r\n}\r\nexport function parseTrackList(trackList, logMissingFeatures) {\r\n    var tracks = [];\r\n    for (var i = 0; i < trackList.length; i++) {\r\n        var tr = trackList[i];\r\n        var track = {\r\n            type: stdTrackID.decode(tr.trackID),\r\n            enabled: tr.enab,\r\n            keys: parseKeyList(tr.keyList, logMissingFeatures),\r\n        };\r\n        if (tr.effectParams) {\r\n            track.effectParams = {\r\n                fillCanvas: tr.effectParams.fillCanvas,\r\n                zoomOrigin: tr.effectParams.zoomOrigin,\r\n                keys: parseKeyList(tr.effectParams.keyList, logMissingFeatures),\r\n            };\r\n        }\r\n        tracks.push(track);\r\n    }\r\n    return tracks;\r\n}\r\nexport function serializeTrackList(tracks) {\r\n    var trackList = [];\r\n    for (var i = 0; i < tracks.length; i++) {\r\n        var t = tracks[i];\r\n        trackList.push(__assign(__assign({ trackID: stdTrackID.encode(t.type), Vrsn: 1, enab: !!t.enabled, Effc: !!t.effectParams }, (t.effectParams ? {\r\n            effectParams: {\r\n                keyList: serializeKeyList(t.keys),\r\n                fillCanvas: t.effectParams.fillCanvas,\r\n                zoomOrigin: t.effectParams.zoomOrigin,\r\n            }\r\n        } : {})), { keyList: serializeKeyList(t.keys) }));\r\n    }\r\n    return trackList;\r\n}\r\nfunction parseEffectObject(obj, reportErrors) {\r\n    var result = {};\r\n    for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {\r\n        var key = _a[_i];\r\n        var val = obj[key];\r\n        switch (key) {\r\n            case 'enab':\r\n                result.enabled = !!val;\r\n                break;\r\n            case 'uglg':\r\n                result.useGlobalLight = !!val;\r\n                break;\r\n            case 'AntA':\r\n                result.antialiased = !!val;\r\n                break;\r\n            case 'Algn':\r\n                result.align = !!val;\r\n                break;\r\n            case 'Dthr':\r\n                result.dither = !!val;\r\n                break;\r\n            case 'Invr':\r\n                result.invert = !!val;\r\n                break;\r\n            case 'Rvrs':\r\n                result.reverse = !!val;\r\n                break;\r\n            case 'Clr ':\r\n                result.color = parseColor(val);\r\n                break;\r\n            case 'hglC':\r\n                result.highlightColor = parseColor(val);\r\n                break;\r\n            case 'sdwC':\r\n                result.shadowColor = parseColor(val);\r\n                break;\r\n            case 'Styl':\r\n                result.position = FStl.decode(val);\r\n                break;\r\n            case 'Md  ':\r\n                result.blendMode = BlnM.decode(val);\r\n                break;\r\n            case 'hglM':\r\n                result.highlightBlendMode = BlnM.decode(val);\r\n                break;\r\n            case 'sdwM':\r\n                result.shadowBlendMode = BlnM.decode(val);\r\n                break;\r\n            case 'bvlS':\r\n                result.style = BESl.decode(val);\r\n                break;\r\n            case 'bvlD':\r\n                result.direction = BESs.decode(val);\r\n                break;\r\n            case 'bvlT':\r\n                result.technique = bvlT.decode(val);\r\n                break;\r\n            case 'GlwT':\r\n                result.technique = BETE.decode(val);\r\n                break;\r\n            case 'glwS':\r\n                result.source = IGSr.decode(val);\r\n                break;\r\n            case 'Type':\r\n                result.type = GrdT.decode(val);\r\n                break;\r\n            case 'gs99':\r\n                result.interpolationMethod = gradientInterpolationMethodType.decode(val);\r\n                break;\r\n            case 'Opct':\r\n                result.opacity = parsePercent(val);\r\n                break;\r\n            case 'hglO':\r\n                result.highlightOpacity = parsePercent(val);\r\n                break;\r\n            case 'sdwO':\r\n                result.shadowOpacity = parsePercent(val);\r\n                break;\r\n            case 'lagl':\r\n                result.angle = parseAngle(val);\r\n                break;\r\n            case 'Angl':\r\n                result.angle = parseAngle(val);\r\n                break;\r\n            case 'Lald':\r\n                result.altitude = parseAngle(val);\r\n                break;\r\n            case 'Sftn':\r\n                result.soften = parseUnits(val);\r\n                break;\r\n            case 'srgR':\r\n                result.strength = parsePercent(val);\r\n                break;\r\n            case 'blur':\r\n                result.size = parseUnits(val);\r\n                break;\r\n            case 'Nose':\r\n                result.noise = parsePercent(val);\r\n                break;\r\n            case 'Inpr':\r\n                result.range = parsePercent(val);\r\n                break;\r\n            case 'Ckmt':\r\n                result.choke = parseUnits(val);\r\n                break;\r\n            case 'ShdN':\r\n                result.jitter = parsePercent(val);\r\n                break;\r\n            case 'Dstn':\r\n                result.distance = parseUnits(val);\r\n                break;\r\n            case 'Scl ':\r\n                result.scale = parsePercent(val);\r\n                break;\r\n            case 'Ptrn':\r\n                result.pattern = { name: val['Nm  '], id: val.Idnt };\r\n                break;\r\n            case 'phase':\r\n                result.phase = { x: val.Hrzn, y: val.Vrtc };\r\n                break;\r\n            case 'Ofst':\r\n                result.offset = { x: parsePercent(val.Hrzn), y: parsePercent(val.Vrtc) };\r\n                break;\r\n            case 'MpgS':\r\n            case 'TrnS':\r\n                result.contour = {\r\n                    name: val['Nm  '],\r\n                    curve: val['Crv '].map(function (p) { return ({ x: p.Hrzn, y: p.Vrtc }); }),\r\n                };\r\n                break;\r\n            case 'Grad':\r\n                result.gradient = parseGradient(val);\r\n                break;\r\n            case 'useTexture':\r\n            case 'useShape':\r\n            case 'layerConceals':\r\n            case 'present':\r\n            case 'showInDialog':\r\n            case 'antialiasGloss':\r\n                result[key] = val;\r\n                break;\r\n            case '_name':\r\n            case '_classID':\r\n                break;\r\n            default:\r\n                reportErrors && console.log(\"Invalid effect key: '\".concat(key, \"', value:\"), val);\r\n        }\r\n    }\r\n    return result;\r\n}\r\nfunction serializeEffectObject(obj, objName, reportErrors) {\r\n    var result = {\r\n        enab: false,\r\n    };\r\n    if (objName === 'dropShadow') {\r\n        result.TrnS = { 'Nm  ': '', 'Crv ': [] };\r\n    }\r\n    for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {\r\n        var objKey = _a[_i];\r\n        var key = objKey;\r\n        var val = obj[key];\r\n        switch (key) {\r\n            case 'enabled':\r\n                result.enab = !!val;\r\n                break;\r\n            case 'useGlobalLight':\r\n                result.uglg = !!val;\r\n                break;\r\n            case 'antialiased':\r\n                result.AntA = !!val;\r\n                break;\r\n            case 'align':\r\n                result.Algn = !!val;\r\n                break;\r\n            case 'dither':\r\n                result.Dthr = !!val;\r\n                break;\r\n            case 'invert':\r\n                result.Invr = !!val;\r\n                break;\r\n            case 'reverse':\r\n                result.Rvrs = !!val;\r\n                break;\r\n            case 'color':\r\n                result['Clr '] = serializeColor(val);\r\n                break;\r\n            case 'highlightColor':\r\n                result.hglC = serializeColor(val);\r\n                break;\r\n            case 'shadowColor':\r\n                result.sdwC = serializeColor(val);\r\n                break;\r\n            case 'position':\r\n                result.Styl = FStl.encode(val);\r\n                break;\r\n            case 'blendMode':\r\n                result['Md  '] = BlnM.encode(val);\r\n                break;\r\n            case 'highlightBlendMode':\r\n                result.hglM = BlnM.encode(val);\r\n                break;\r\n            case 'shadowBlendMode':\r\n                result.sdwM = BlnM.encode(val);\r\n                break;\r\n            case 'style':\r\n                result.bvlS = BESl.encode(val);\r\n                break;\r\n            case 'direction':\r\n                result.bvlD = BESs.encode(val);\r\n                break;\r\n            case 'technique':\r\n                if (objName === 'bevel') {\r\n                    result.bvlT = bvlT.encode(val);\r\n                }\r\n                else {\r\n                    result.GlwT = BETE.encode(val);\r\n                }\r\n                break;\r\n            case 'source':\r\n                result.glwS = IGSr.encode(val);\r\n                break;\r\n            case 'type':\r\n                result.Type = GrdT.encode(val);\r\n                break;\r\n            case 'interpolationMethod':\r\n                result.gs99 = gradientInterpolationMethodType.encode(val);\r\n                break;\r\n            case 'opacity':\r\n                result.Opct = unitsPercent(val);\r\n                break;\r\n            case 'highlightOpacity':\r\n                result.hglO = unitsPercent(val);\r\n                break;\r\n            case 'shadowOpacity':\r\n                result.sdwO = unitsPercent(val);\r\n                break;\r\n            case 'angle':\r\n                if (objName === 'gradientOverlay' || objName === 'patternFill') {\r\n                    result.Angl = unitsAngle(val);\r\n                }\r\n                else {\r\n                    result.lagl = unitsAngle(val);\r\n                }\r\n                break;\r\n            case 'altitude':\r\n                result.Lald = unitsAngle(val);\r\n                break;\r\n            case 'soften':\r\n                result.Sftn = unitsValue(val, key);\r\n                break;\r\n            case 'strength':\r\n                result.srgR = unitsPercent(val);\r\n                break;\r\n            case 'size':\r\n                result.blur = unitsValue(val, key);\r\n                break;\r\n            case 'noise':\r\n                result.Nose = unitsPercent(val);\r\n                break;\r\n            case 'range':\r\n                result.Inpr = unitsPercent(val);\r\n                break;\r\n            case 'choke':\r\n                result.Ckmt = unitsValue(val, key);\r\n                break;\r\n            case 'jitter':\r\n                result.ShdN = unitsPercent(val);\r\n                break;\r\n            case 'distance':\r\n                result.Dstn = unitsValue(val, key);\r\n                break;\r\n            case 'scale':\r\n                result['Scl '] = unitsPercent(val);\r\n                break;\r\n            case 'pattern':\r\n                result.Ptrn = { 'Nm  ': val.name, Idnt: val.id };\r\n                break;\r\n            case 'phase':\r\n                result.phase = { Hrzn: val.x, Vrtc: val.y };\r\n                break;\r\n            case 'offset':\r\n                result.Ofst = { Hrzn: unitsPercent(val.x), Vrtc: unitsPercent(val.y) };\r\n                break;\r\n            case 'contour': {\r\n                result[objName === 'satin' ? 'MpgS' : 'TrnS'] = {\r\n                    'Nm  ': val.name,\r\n                    'Crv ': val.curve.map(function (p) { return ({ Hrzn: p.x, Vrtc: p.y }); }),\r\n                };\r\n                break;\r\n            }\r\n            case 'gradient':\r\n                result.Grad = serializeGradient(val);\r\n                break;\r\n            case 'useTexture':\r\n            case 'useShape':\r\n            case 'layerConceals':\r\n            case 'present':\r\n            case 'showInDialog':\r\n            case 'antialiasGloss':\r\n                result[key] = val;\r\n                break;\r\n            default:\r\n                reportErrors && console.log(\"Invalid effect key: '\".concat(key, \"', value:\"), val);\r\n        }\r\n    }\r\n    return result;\r\n}\r\nfunction parseGradient(grad) {\r\n    if (grad.GrdF === 'GrdF.CstS') {\r\n        var samples_1 = grad.Intr || 4096;\r\n        return {\r\n            type: 'solid',\r\n            name: grad['Nm  '],\r\n            smoothness: grad.Intr / 4096,\r\n            colorStops: grad.Clrs.map(function (s) { return ({\r\n                color: parseColor(s['Clr ']),\r\n                location: s.Lctn / samples_1,\r\n                midpoint: s.Mdpn / 100,\r\n            }); }),\r\n            opacityStops: grad.Trns.map(function (s) { return ({\r\n                opacity: parsePercent(s.Opct),\r\n                location: s.Lctn / samples_1,\r\n                midpoint: s.Mdpn / 100,\r\n            }); }),\r\n        };\r\n    }\r\n    else {\r\n        return {\r\n            type: 'noise',\r\n            name: grad['Nm  '],\r\n            roughness: grad.Smth / 4096,\r\n            colorModel: ClrS.decode(grad.ClrS),\r\n            randomSeed: grad.RndS,\r\n            restrictColors: !!grad.VctC,\r\n            addTransparency: !!grad.ShTr,\r\n            min: grad['Mnm '].map(function (x) { return x / 100; }),\r\n            max: grad['Mxm '].map(function (x) { return x / 100; }),\r\n        };\r\n    }\r\n}\r\nfunction serializeGradient(grad) {\r\n    var _a, _b;\r\n    if (grad.type === 'solid') {\r\n        var samples_2 = Math.round(((_a = grad.smoothness) !== null && _a !== void 0 ? _a : 1) * 4096);\r\n        return {\r\n            'Nm  ': grad.name || '',\r\n            GrdF: 'GrdF.CstS',\r\n            Intr: samples_2,\r\n            Clrs: grad.colorStops.map(function (s) {\r\n                var _a;\r\n                return ({\r\n                    'Clr ': serializeColor(s.color),\r\n                    Type: 'Clry.UsrS',\r\n                    Lctn: Math.round(s.location * samples_2),\r\n                    Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),\r\n                });\r\n            }),\r\n            Trns: grad.opacityStops.map(function (s) {\r\n                var _a;\r\n                return ({\r\n                    Opct: unitsPercent(s.opacity),\r\n                    Lctn: Math.round(s.location * samples_2),\r\n                    Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),\r\n                });\r\n            }),\r\n        };\r\n    }\r\n    else {\r\n        return {\r\n            GrdF: 'GrdF.ClNs',\r\n            'Nm  ': grad.name || '',\r\n            ShTr: !!grad.addTransparency,\r\n            VctC: !!grad.restrictColors,\r\n            ClrS: ClrS.encode(grad.colorModel),\r\n            RndS: grad.randomSeed || 0,\r\n            Smth: Math.round(((_b = grad.roughness) !== null && _b !== void 0 ? _b : 1) * 4096),\r\n            'Mnm ': (grad.min || [0, 0, 0, 0]).map(function (x) { return x * 100; }),\r\n            'Mxm ': (grad.max || [1, 1, 1, 1]).map(function (x) { return x * 100; }),\r\n        };\r\n    }\r\n}\r\nfunction parseGradientContent(descriptor) {\r\n    var result = parseGradient(descriptor.Grad);\r\n    result.style = GrdT.decode(descriptor.Type);\r\n    if (descriptor.Dthr !== undefined)\r\n        result.dither = descriptor.Dthr;\r\n    if (descriptor.gradientsInterpolationMethod !== undefined)\r\n        result.interpolationMethod = gradientInterpolationMethodType.decode(descriptor.gradientsInterpolationMethod);\r\n    if (descriptor.Rvrs !== undefined)\r\n        result.reverse = descriptor.Rvrs;\r\n    if (descriptor.Angl !== undefined)\r\n        result.angle = parseAngle(descriptor.Angl);\r\n    if (descriptor['Scl '] !== undefined)\r\n        result.scale = parsePercent(descriptor['Scl ']);\r\n    if (descriptor.Algn !== undefined)\r\n        result.align = descriptor.Algn;\r\n    if (descriptor.Ofst !== undefined) {\r\n        result.offset = {\r\n            x: parsePercent(descriptor.Ofst.Hrzn),\r\n            y: parsePercent(descriptor.Ofst.Vrtc)\r\n        };\r\n    }\r\n    return result;\r\n}\r\nfunction parsePatternContent(descriptor) {\r\n    var result = {\r\n        name: descriptor.Ptrn['Nm  '],\r\n        id: descriptor.Ptrn.Idnt,\r\n    };\r\n    if (descriptor.Lnkd !== undefined)\r\n        result.linked = descriptor.Lnkd;\r\n    if (descriptor.phase !== undefined)\r\n        result.phase = { x: descriptor.phase.Hrzn, y: descriptor.phase.Vrtc };\r\n    return result;\r\n}\r\nexport function parseVectorContent(descriptor) {\r\n    if ('Grad' in descriptor) {\r\n        return parseGradientContent(descriptor);\r\n    }\r\n    else if ('Ptrn' in descriptor) {\r\n        return __assign({ type: 'pattern' }, parsePatternContent(descriptor));\r\n    }\r\n    else if ('Clr ' in descriptor) {\r\n        return { type: 'color', color: parseColor(descriptor['Clr ']) };\r\n    }\r\n    else {\r\n        throw new Error('Invalid vector content');\r\n    }\r\n}\r\nfunction serializeGradientContent(content) {\r\n    var result = {};\r\n    if (content.dither !== undefined)\r\n        result.Dthr = content.dither;\r\n    if (content.interpolationMethod !== undefined)\r\n        result.gradientsInterpolationMethod = gradientInterpolationMethodType.encode(content.interpolationMethod);\r\n    if (content.reverse !== undefined)\r\n        result.Rvrs = content.reverse;\r\n    if (content.angle !== undefined)\r\n        result.Angl = unitsAngle(content.angle);\r\n    result.Type = GrdT.encode(content.style);\r\n    if (content.align !== undefined)\r\n        result.Algn = content.align;\r\n    if (content.scale !== undefined)\r\n        result['Scl '] = unitsPercent(content.scale);\r\n    if (content.offset) {\r\n        result.Ofst = {\r\n            Hrzn: unitsPercent(content.offset.x),\r\n            Vrtc: unitsPercent(content.offset.y),\r\n        };\r\n    }\r\n    result.Grad = serializeGradient(content);\r\n    return result;\r\n}\r\nfunction serializePatternContent(content) {\r\n    var result = {\r\n        Ptrn: {\r\n            'Nm  ': content.name || '',\r\n            Idnt: content.id || '',\r\n        }\r\n    };\r\n    if (content.linked !== undefined)\r\n        result.Lnkd = !!content.linked;\r\n    if (content.phase !== undefined)\r\n        result.phase = { Hrzn: content.phase.x, Vrtc: content.phase.y };\r\n    return result;\r\n}\r\nexport function serializeVectorContent(content) {\r\n    if (content.type === 'color') {\r\n        return { key: 'SoCo', descriptor: { 'Clr ': serializeColor(content.color) } };\r\n    }\r\n    else if (content.type === 'pattern') {\r\n        return { key: 'PtFl', descriptor: serializePatternContent(content) };\r\n    }\r\n    else {\r\n        return { key: 'GdFl', descriptor: serializeGradientContent(content) };\r\n    }\r\n}\r\nexport function parseColor(color) {\r\n    if ('H   ' in color) {\r\n        return { h: parsePercentOrAngle(color['H   ']), s: color.Strt, b: color.Brgh };\r\n    }\r\n    else if ('Rd  ' in color) {\r\n        return { r: color['Rd  '], g: color['Grn '], b: color['Bl  '] };\r\n    }\r\n    else if ('Cyn ' in color) {\r\n        return { c: color['Cyn '], m: color.Mgnt, y: color['Ylw '], k: color.Blck };\r\n    }\r\n    else if ('Gry ' in color) {\r\n        return { k: color['Gry '] };\r\n    }\r\n    else if ('Lmnc' in color) {\r\n        return { l: color.Lmnc, a: color['A   '], b: color['B   '] };\r\n    }\r\n    else if ('redFloat' in color) {\r\n        return { fr: color.redFloat, fg: color.greenFloat, fb: color.blueFloat };\r\n    }\r\n    else {\r\n        throw new Error('Unsupported color descriptor');\r\n    }\r\n}\r\nexport function serializeColor(color) {\r\n    if (!color) {\r\n        return { _name: '', _classID: 'RGBC', 'Rd  ': 0, 'Grn ': 0, 'Bl  ': 0 };\r\n    }\r\n    else if ('r' in color) {\r\n        return { _name: '', _classID: 'RGBC', 'Rd  ': color.r || 0, 'Grn ': color.g || 0, 'Bl  ': color.b || 0 };\r\n    }\r\n    else if ('fr' in color) {\r\n        return { _name: '', _classID: 'RGBC', redFloat: color.fr, greenFloat: color.fg, blueFloat: color.fb };\r\n    }\r\n    else if ('h' in color) {\r\n        return { _name: '', _classID: 'HSBC', 'H   ': unitsAngle(color.h * 360), Strt: color.s || 0, Brgh: color.b || 0 };\r\n    }\r\n    else if ('c' in color) {\r\n        return { _name: '', _classID: 'CMYC', 'Cyn ': color.c || 0, Mgnt: color.m || 0, 'Ylw ': color.y || 0, Blck: color.k || 0 };\r\n    }\r\n    else if ('l' in color) {\r\n        return { _name: '', _classID: 'LABC', Lmnc: color.l || 0, 'A   ': color.a || 0, 'B   ': color.b || 0 };\r\n    }\r\n    else if ('k' in color) {\r\n        return { _name: '', _classID: 'GRYC', 'Gry ': color.k };\r\n    }\r\n    else {\r\n        throw new Error('Invalid color value');\r\n    }\r\n}\r\nexport function parseAngle(x) {\r\n    if (x === undefined)\r\n        return 0;\r\n    if (x.units !== 'Angle')\r\n        throw new Error(\"Invalid units: \".concat(x.units));\r\n    return x.value;\r\n}\r\nexport function parsePercent(x) {\r\n    if (x === undefined)\r\n        return 1;\r\n    if (x.units !== 'Percent')\r\n        throw new Error(\"Invalid units: \".concat(x.units));\r\n    return x.value / 100;\r\n}\r\nexport function parsePercentOrAngle(x) {\r\n    if (x === undefined)\r\n        return 1;\r\n    if (x.units === 'Percent')\r\n        return x.value / 100;\r\n    if (x.units === 'Angle')\r\n        return x.value / 360;\r\n    throw new Error(\"Invalid units: \".concat(x.units));\r\n}\r\nexport function parseUnits(_a) {\r\n    var units = _a.units, value = _a.value;\r\n    if (units !== 'Pixels' && units !== 'Millimeters' && units !== 'Points' && units !== 'None' &&\r\n        units !== 'Picas' && units !== 'Inches' && units !== 'Centimeters' && units !== 'Density') {\r\n        throw new Error(\"Invalid units: \".concat(JSON.stringify({ units: units, value: value })));\r\n    }\r\n    return { value: value, units: units };\r\n}\r\nexport function parseUnitsOrNumber(value, units) {\r\n    if (units === void 0) { units = 'Pixels'; }\r\n    if (typeof value === 'number')\r\n        return { value: value, units: units };\r\n    return parseUnits(value);\r\n}\r\nexport function parseUnitsToNumber(_a, expectedUnits) {\r\n    var units = _a.units, value = _a.value;\r\n    if (units !== expectedUnits)\r\n        throw new Error(\"Invalid units: \".concat(JSON.stringify({ units: units, value: value })));\r\n    return value;\r\n}\r\nexport function unitsAngle(value) {\r\n    return { units: 'Angle', value: value || 0 };\r\n}\r\nexport function unitsPercent(value) {\r\n    return { units: 'Percent', value: Math.round((value || 0) * 100) };\r\n}\r\nexport function unitsPercentF(value) {\r\n    return { units: 'Percent', value: (value || 0) * 100 };\r\n}\r\nexport function unitsValue(x, key) {\r\n    if (x == null)\r\n        return { units: 'Pixels', value: 0 };\r\n    if (typeof x !== 'object')\r\n        throw new Error(\"Invalid value: \".concat(JSON.stringify(x), \" (key: \").concat(key, \") (should have value and units)\"));\r\n    var units = x.units, value = x.value;\r\n    if (typeof value !== 'number')\r\n        throw new Error(\"Invalid value in \".concat(JSON.stringify(x), \" (key: \").concat(key, \")\"));\r\n    if (units !== 'Pixels' && units !== 'Millimeters' && units !== 'Points' && units !== 'None' &&\r\n        units !== 'Picas' && units !== 'Inches' && units !== 'Centimeters' && units !== 'Density') {\r\n        throw new Error(\"Invalid units in \".concat(JSON.stringify(x), \" (key: \").concat(key, \")\"));\r\n    }\r\n    return { units: units, value: value };\r\n}\r\nexport function frac(_a) {\r\n    var numerator = _a.numerator, denominator = _a.denominator;\r\n    return { numerator: numerator, denominator: denominator };\r\n}\r\nexport var textGridding = createEnum('textGridding', 'none', {\r\n    none: 'None',\r\n    round: 'Rnd ',\r\n});\r\nexport var Ornt = createEnum('Ornt', 'horizontal', {\r\n    horizontal: 'Hrzn',\r\n    vertical: 'Vrtc',\r\n});\r\nexport var Annt = createEnum('Annt', 'sharp', {\r\n    none: 'Anno',\r\n    sharp: 'antiAliasSharp',\r\n    crisp: 'AnCr',\r\n    strong: 'AnSt',\r\n    smooth: 'AnSm',\r\n    platform: 'antiAliasPlatformGray',\r\n    platformLCD: 'antiAliasPlatformLCD',\r\n});\r\nexport var warpStyle = createEnum('warpStyle', 'none', {\r\n    none: 'warpNone',\r\n    arc: 'warpArc',\r\n    arcLower: 'warpArcLower',\r\n    arcUpper: 'warpArcUpper',\r\n    arch: 'warpArch',\r\n    bulge: 'warpBulge',\r\n    shellLower: 'warpShellLower',\r\n    shellUpper: 'warpShellUpper',\r\n    flag: 'warpFlag',\r\n    wave: 'warpWave',\r\n    fish: 'warpFish',\r\n    rise: 'warpRise',\r\n    fisheye: 'warpFisheye',\r\n    inflate: 'warpInflate',\r\n    squeeze: 'warpSqueeze',\r\n    twist: 'warpTwist',\r\n    cylinder: 'warpCylinder',\r\n    custom: 'warpCustom',\r\n});\r\nexport var BlnM = createEnum('BlnM', 'normal', {\r\n    'normal': 'Nrml',\r\n    'dissolve': 'Dslv',\r\n    'darken': 'Drkn',\r\n    'multiply': 'Mltp',\r\n    'color burn': 'CBrn',\r\n    'linear burn': 'linearBurn',\r\n    'darker color': 'darkerColor',\r\n    'lighten': 'Lghn',\r\n    'screen': 'Scrn',\r\n    'color dodge': 'CDdg',\r\n    'linear dodge': 'linearDodge',\r\n    'lighter color': 'lighterColor',\r\n    'overlay': 'Ovrl',\r\n    'soft light': 'SftL',\r\n    'hard light': 'HrdL',\r\n    'vivid light': 'vividLight',\r\n    'linear light': 'linearLight',\r\n    'pin light': 'pinLight',\r\n    'hard mix': 'hardMix',\r\n    'difference': 'Dfrn',\r\n    'exclusion': 'Xclu',\r\n    'subtract': 'blendSubtraction',\r\n    'divide': 'blendDivide',\r\n    'hue': 'H   ',\r\n    'saturation': 'Strt',\r\n    'color': 'Clr ',\r\n    'luminosity': 'Lmns',\r\n    // used in ABR\r\n    'linear height': 'linearHeight',\r\n    'height': 'Hght',\r\n    'subtraction': 'Sbtr', // 2nd version of subtract ?\r\n});\r\nexport var BESl = createEnum('BESl', 'inner bevel', {\r\n    'inner bevel': 'InrB',\r\n    'outer bevel': 'OtrB',\r\n    'emboss': 'Embs',\r\n    'pillow emboss': 'PlEb',\r\n    'stroke emboss': 'strokeEmboss',\r\n});\r\nexport var bvlT = createEnum('bvlT', 'smooth', {\r\n    'smooth': 'SfBL',\r\n    'chisel hard': 'PrBL',\r\n    'chisel soft': 'Slmt',\r\n});\r\nexport var BESs = createEnum('BESs', 'up', {\r\n    up: 'In  ',\r\n    down: 'Out ',\r\n});\r\nexport var BETE = createEnum('BETE', 'softer', {\r\n    softer: 'SfBL',\r\n    precise: 'PrBL',\r\n});\r\nexport var IGSr = createEnum('IGSr', 'edge', {\r\n    edge: 'SrcE',\r\n    center: 'SrcC',\r\n});\r\nexport var GrdT = createEnum('GrdT', 'linear', {\r\n    linear: 'Lnr ',\r\n    radial: 'Rdl ',\r\n    angle: 'Angl',\r\n    reflected: 'Rflc',\r\n    diamond: 'Dmnd',\r\n});\r\nexport var animInterpStyleEnum = createEnum('animInterpStyle', 'linear', {\r\n    linear: 'Lnr ',\r\n    hold: 'hold',\r\n});\r\nexport var stdTrackID = createEnum('stdTrackID', 'opacity', {\r\n    opacity: 'opacityTrack',\r\n    style: 'styleTrack',\r\n    sheetTransform: 'sheetTransformTrack',\r\n    sheetPosition: 'sheetPositionTrack',\r\n    globalLighting: 'globalLightingTrack',\r\n});\r\nexport var gradientInterpolationMethodType = createEnum('gradientInterpolationMethodType', 'perceptual', {\r\n    perceptual: 'Perc',\r\n    linear: 'Lnr ',\r\n    classic: 'Gcls',\r\n    smooth: 'Smoo',\r\n    // TODO: stripes\r\n});\r\nexport var ClrS = createEnum('ClrS', 'rgb', {\r\n    rgb: 'RGBC',\r\n    hsb: 'HSBl',\r\n    lab: 'LbCl',\r\n    hsl: 'HSLC',\r\n});\r\nexport var FStl = createEnum('FStl', 'outside', {\r\n    outside: 'OutF',\r\n    center: 'CtrF',\r\n    inside: 'InsF'\r\n});\r\nexport var FrFl = createEnum('FrFl', 'color', {\r\n    color: 'SClr',\r\n    gradient: 'GrFl',\r\n    pattern: 'Ptrn',\r\n});\r\nexport var ESliceType = createEnum('ESliceType', 'image', {\r\n    image: 'Img ',\r\n    noImage: 'noImage',\r\n});\r\nexport var ESliceHorzAlign = createEnum('ESliceHorzAlign', 'default', {\r\n    default: 'default',\r\n});\r\nexport var ESliceVertAlign = createEnum('ESliceVertAlign', 'default', {\r\n    default: 'default',\r\n});\r\nexport var ESliceOrigin = createEnum('ESliceOrigin', 'userGenerated', {\r\n    userGenerated: 'userGenerated',\r\n    autoGenerated: 'autoGenerated',\r\n    layer: 'layer',\r\n});\r\nexport var ESliceBGColorType = createEnum('ESliceBGColorType', 'none', {\r\n    none: 'None',\r\n    matte: 'matte',\r\n    color: 'Clr ',\r\n});\r\nexport var strokeStyleLineCapType = createEnum('strokeStyleLineCapType', 'butt', {\r\n    butt: 'strokeStyleButtCap',\r\n    round: 'strokeStyleRoundCap',\r\n    square: 'strokeStyleSquareCap',\r\n});\r\nexport var strokeStyleLineJoinType = createEnum('strokeStyleLineJoinType', 'miter', {\r\n    miter: 'strokeStyleMiterJoin',\r\n    round: 'strokeStyleRoundJoin',\r\n    bevel: 'strokeStyleBevelJoin',\r\n});\r\nexport var strokeStyleLineAlignment = createEnum('strokeStyleLineAlignment', 'inside', {\r\n    inside: 'strokeStyleAlignInside',\r\n    center: 'strokeStyleAlignCenter',\r\n    outside: 'strokeStyleAlignOutside',\r\n});\r\nexport var BlrM = createEnum('BlrM', 'ispinmage', {\r\n    spin: 'Spn ',\r\n    zoom: 'Zm  ',\r\n});\r\nexport var BlrQ = createEnum('BlrQ', 'good', {\r\n    draft: 'Drft',\r\n    good: 'Gd  ',\r\n    best: 'Bst ',\r\n});\r\nexport var SmBM = createEnum('SmBM', 'normal', {\r\n    normal: 'SBMN',\r\n    'edge only': 'SBME',\r\n    'overlay edge': 'SBMO',\r\n});\r\nexport var SmBQ = createEnum('SmBQ', 'medium', {\r\n    low: 'SBQL',\r\n    medium: 'SBQM',\r\n    high: 'SBQH',\r\n});\r\nexport var DspM = createEnum('DspM', 'stretch to fit', {\r\n    'stretch to fit': 'StrF',\r\n    'tile': 'Tile',\r\n});\r\nexport var UndA = createEnum('UndA', 'repeat edge pixels', {\r\n    'wrap around': 'WrpA',\r\n    'repeat edge pixels': 'RptE',\r\n});\r\nexport var Cnvr = createEnum('Cnvr', 'rectangular to polar', {\r\n    'rectangular to polar': 'RctP',\r\n    'polar to rectangular': 'PlrR',\r\n});\r\nexport var RplS = createEnum('RplS', 'medium', {\r\n    small: 'Sml ',\r\n    medium: 'Mdm ',\r\n    large: 'Lrg ',\r\n});\r\nexport var SphM = createEnum('SphM', 'normal', {\r\n    'normal': 'Nrml',\r\n    'horizontal only': 'HrzO',\r\n    'vertical only': 'VrtO',\r\n});\r\nexport var Wvtp = createEnum('Wvtp', 'sine', {\r\n    sine: 'WvSn',\r\n    triangle: 'WvTr',\r\n    square: 'WvSq',\r\n});\r\nexport var ZZTy = createEnum('ZZTy', 'pond ripples', {\r\n    'around center': 'ArnC',\r\n    'out from center': 'OtFr',\r\n    'pond ripples': 'PndR',\r\n});\r\nexport var Dstr = createEnum('Dstr', 'uniform', {\r\n    uniform: 'Unfr',\r\n    gaussian: 'Gsn ',\r\n});\r\nexport var Chnl = createEnum('Chnl', 'composite', {\r\n    red: 'Rd  ',\r\n    green: 'Grn ',\r\n    blue: 'Bl  ',\r\n    composite: 'Cmps',\r\n});\r\nexport var MztT = createEnum('MztT', 'fine dots', {\r\n    'fine dots': 'FnDt',\r\n    'medium dots': 'MdmD',\r\n    'grainy dots': 'GrnD',\r\n    'coarse dots': 'CrsD',\r\n    'short lines': 'ShrL',\r\n    'medium lines': 'MdmL',\r\n    'long lines': 'LngL',\r\n    'short strokes': 'ShSt',\r\n    'medium strokes': 'MdmS',\r\n    'long strokes': 'LngS',\r\n});\r\nexport var Lns = createEnum('Lns ', '50-300mm zoom', {\r\n    '50-300mm zoom': 'Zm  ',\r\n    '32mm prime': 'Nkn ',\r\n    '105mm prime': 'Nkn1',\r\n    'movie prime': 'PnVs',\r\n});\r\nexport var blurType = createEnum('blurType', 'gaussian blur', {\r\n    'gaussian blur': 'GsnB',\r\n    'lens blur': 'lensBlur',\r\n    'motion blur': 'MtnB',\r\n});\r\nexport var DfsM = createEnum('DfsM', 'normal', {\r\n    'normal': 'Nrml',\r\n    'darken only': 'DrkO',\r\n    'lighten only': 'LghO',\r\n    'anisotropic': 'anisotropic',\r\n});\r\nexport var ExtT = createEnum('ExtT', 'blocks', {\r\n    blocks: 'Blks',\r\n    pyramids: 'Pyrm',\r\n});\r\nexport var ExtR = createEnum('ExtR', 'random', {\r\n    random: 'Rndm',\r\n    'level-based': 'LvlB',\r\n});\r\nexport var FlCl = createEnum('FlCl', 'background color', {\r\n    'background color': 'FlBc',\r\n    'foreground color': 'FlFr',\r\n    'inverse image': 'FlIn',\r\n    'unaltered image': 'FlSm',\r\n});\r\nexport var CntE = createEnum('CntE', 'upper', {\r\n    lower: 'Lwr ',\r\n    upper: 'Upr ',\r\n});\r\nexport var WndM = createEnum('WndM', 'wind', {\r\n    wind: 'Wnd ',\r\n    blast: 'Blst',\r\n    stagger: 'Stgr',\r\n});\r\nexport var Drct = createEnum('Drct', 'from the right', {\r\n    left: 'Left',\r\n    right: 'Rght',\r\n});\r\nexport var IntE = createEnum('IntE', 'odd lines', {\r\n    'odd lines': 'ElmO',\r\n    'even lines': 'ElmE',\r\n});\r\nexport var IntC = createEnum('IntC', 'interpolation', {\r\n    duplication: 'CrtD',\r\n    interpolation: 'CrtI',\r\n});\r\nexport var FlMd = createEnum('FlMd', 'wrap around', {\r\n    'set to transparent': 'Bckg',\r\n    'repeat edge pixels': 'Rpt ',\r\n    'wrap around': 'Wrp ',\r\n});\r\nexport var prjM = createEnum('prjM', 'fisheye', {\r\n    'fisheye': 'fisP',\r\n    'perspective': 'perP',\r\n    'auto': 'auto',\r\n    'full spherical': 'fusP',\r\n});\r\nexport var presetKindType = createEnum('presetKindType', 'presetKindCustom', {\r\n    custom: 'presetKindCustom',\r\n    default: 'presetKindDefault',\r\n});\r\n//# sourceMappingURL=descriptor.js.map","var __assign = (this && this.__assign) || function () {\r\n    __assign = Object.assign || function(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n                t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\nimport { toByteArray } from 'base64-js';\r\nimport { readUnicodeString, readUint32, readUint16, readUint8, readFloat64, readBytes, skipBytes, readFloat32, readInt16, readFixedPoint32, readSignature, checkSignature, readSection, readColor, readInt32, readAsciiString } from './psdReader';\r\nimport { writeUnicodeString, writeUint32, writeUint8, writeFloat64, writeUint16, writeBytes, writeInt16, writeFloat32, writeFixedPoint32, writeUnicodeStringWithPadding, writeColor, writeSignature, writeSection, writeInt32, writeAsciiString, } from './psdWriter';\r\nimport { createCanvasFromData, createEnum, MOCK_HANDLERS } from './helpers';\r\nimport { decodeString, encodeString } from './utf8';\r\nimport { ESliceBGColorType, ESliceHorzAlign, ESliceOrigin, ESliceType, ESliceVertAlign, frac, parseTrackList, readVersionAndDescriptor, serializeTrackList, writeVersionAndDescriptor } from './descriptor';\r\nexport var resourceHandlers = [];\r\nexport var resourceHandlersMap = {};\r\nfunction addHandler(key, has, read, write) {\r\n    var handler = { key: key, has: has, read: read, write: write };\r\n    resourceHandlers.push(handler);\r\n    resourceHandlersMap[handler.key] = handler;\r\n}\r\nvar LOG_MOCK_HANDLERS = false;\r\nvar RESOLUTION_UNITS = [undefined, 'PPI', 'PPCM'];\r\nvar MEASUREMENT_UNITS = [undefined, 'Inches', 'Centimeters', 'Points', 'Picas', 'Columns'];\r\nvar hex = '0123456789abcdef';\r\nfunction charToNibble(code) {\r\n    return code <= 57 ? code - 48 : code - 87;\r\n}\r\nfunction byteAt(value, index) {\r\n    return (charToNibble(value.charCodeAt(index)) << 4) | charToNibble(value.charCodeAt(index + 1));\r\n}\r\nfunction readUtf8String(reader, length) {\r\n    var buffer = readBytes(reader, length);\r\n    return decodeString(buffer);\r\n}\r\nfunction writeUtf8String(writer, value) {\r\n    var buffer = encodeString(value);\r\n    writeBytes(writer, buffer);\r\n}\r\nfunction readEncodedString(reader) {\r\n    var length = readUint8(reader);\r\n    var buffer = readBytes(reader, length);\r\n    var notAscii = false;\r\n    for (var i = 0; i < buffer.byteLength; i++) {\r\n        if (buffer[i] & 0x80) {\r\n            notAscii = true;\r\n            break;\r\n        }\r\n    }\r\n    if (notAscii) {\r\n        var decoder = new TextDecoder('gbk');\r\n        return decoder.decode(buffer);\r\n    }\r\n    else {\r\n        return decodeString(buffer);\r\n    }\r\n}\r\nfunction writeEncodedString(writer, value) {\r\n    var ascii = '';\r\n    for (var i = 0, code = value.codePointAt(i++); code !== undefined; code = value.codePointAt(i++)) {\r\n        ascii += code > 0x7f ? '?' : String.fromCodePoint(code);\r\n    }\r\n    var buffer = encodeString(ascii);\r\n    writeUint8(writer, buffer.byteLength);\r\n    writeBytes(writer, buffer);\r\n}\r\nMOCK_HANDLERS && addHandler(1028, // IPTC-NAA record\r\nfunction (// IPTC-NAA record\r\ntarget) { return target._ir1028 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1028', left());\r\n    target._ir1028 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1028);\r\n});\r\naddHandler(1061, function (target) { return target.captionDigest !== undefined; }, function (reader, target) {\r\n    var captionDigest = '';\r\n    for (var i = 0; i < 16; i++) {\r\n        var byte = readUint8(reader);\r\n        captionDigest += hex[byte >> 4];\r\n        captionDigest += hex[byte & 0xf];\r\n    }\r\n    target.captionDigest = captionDigest;\r\n}, function (writer, target) {\r\n    for (var i = 0; i < 16; i++) {\r\n        writeUint8(writer, byteAt(target.captionDigest, i * 2));\r\n    }\r\n});\r\naddHandler(1060, function (target) { return target.xmpMetadata !== undefined; }, function (reader, target, left) {\r\n    target.xmpMetadata = readUtf8String(reader, left());\r\n}, function (writer, target) {\r\n    writeUtf8String(writer, target.xmpMetadata);\r\n});\r\nvar Inte = createEnum('Inte', 'perceptual', {\r\n    'perceptual': 'Img ',\r\n    'saturation': 'Grp ',\r\n    'relative colorimetric': 'Clrm',\r\n    'absolute colorimetric': 'AClr',\r\n});\r\nMOCK_HANDLERS && addHandler(1085, // Windows DEVMODE. Variable OS specific info for Windows.\r\nfunction (// Windows DEVMODE. Variable OS specific info for Windows.\r\ntarget) { return target._ir1085 !== undefined; }, function (reader, target, left) {\r\n    target._ir1085 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1085);\r\n});\r\naddHandler(1082, function (target) { return target.printInformation !== undefined; }, function (reader, target) {\r\n    var _a, _b;\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.printInformation = {\r\n        printerName: desc.printerName || '',\r\n        renderingIntent: Inte.decode((_a = desc.Inte) !== null && _a !== void 0 ? _a : 'Inte.Img '),\r\n    };\r\n    var info = target.printInformation;\r\n    if (desc.PstS !== undefined)\r\n        info.printerManagesColors = desc.PstS;\r\n    if (desc['Nm  '] !== undefined)\r\n        info.printerProfile = desc['Nm  '];\r\n    if (desc.MpBl !== undefined)\r\n        info.blackPointCompensation = desc.MpBl;\r\n    if (desc.printSixteenBit !== undefined)\r\n        info.printSixteenBit = desc.printSixteenBit;\r\n    if (desc.hardProof !== undefined)\r\n        info.hardProof = desc.hardProof;\r\n    if (desc.printProofSetup) {\r\n        if ('Bltn' in desc.printProofSetup) {\r\n            info.proofSetup = { builtin: desc.printProofSetup.Bltn.split('.')[1] };\r\n        }\r\n        else {\r\n            info.proofSetup = {\r\n                profile: desc.printProofSetup.profile,\r\n                renderingIntent: Inte.decode((_b = desc.printProofSetup.Inte) !== null && _b !== void 0 ? _b : 'Inte.Img '),\r\n                blackPointCompensation: !!desc.printProofSetup.MpBl,\r\n                paperWhite: !!desc.printProofSetup.paperWhite,\r\n            };\r\n        }\r\n    }\r\n}, function (writer, target) {\r\n    var _a, _b;\r\n    var info = target.printInformation;\r\n    var desc = {};\r\n    if (info.printerManagesColors) {\r\n        desc.PstS = true;\r\n    }\r\n    else {\r\n        if (info.hardProof !== undefined)\r\n            desc.hardProof = !!info.hardProof;\r\n        desc.ClrS = 'ClrS.RGBC'; // TODO: ???\r\n        desc['Nm  '] = (_a = info.printerProfile) !== null && _a !== void 0 ? _a : 'CIE RGB';\r\n    }\r\n    desc.Inte = Inte.encode(info.renderingIntent);\r\n    if (!info.printerManagesColors)\r\n        desc.MpBl = !!info.blackPointCompensation;\r\n    desc.printSixteenBit = !!info.printSixteenBit;\r\n    desc.printerName = info.printerName || '';\r\n    if (info.proofSetup && 'profile' in info.proofSetup) {\r\n        desc.printProofSetup = {\r\n            profile: info.proofSetup.profile || '',\r\n            Inte: Inte.encode(info.proofSetup.renderingIntent),\r\n            MpBl: !!info.proofSetup.blackPointCompensation,\r\n            paperWhite: !!info.proofSetup.paperWhite,\r\n        };\r\n    }\r\n    else {\r\n        desc.printProofSetup = {\r\n            Bltn: ((_b = info.proofSetup) === null || _b === void 0 ? void 0 : _b.builtin) ? \"builtinProof.\".concat(info.proofSetup.builtin) : 'builtinProof.proofCMYK',\r\n        };\r\n    }\r\n    writeVersionAndDescriptor(writer, '', 'printOutput', desc);\r\n});\r\nMOCK_HANDLERS && addHandler(1083, // Print style\r\nfunction (// Print style\r\ntarget) { return target._ir1083 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1083', left());\r\n    target._ir1083 = readBytes(reader, left());\r\n    // TODO:\r\n    // const desc = readVersionAndDescriptor(reader);\r\n    // console.log('1083', require('util').inspect(desc, false, 99, true));\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1083);\r\n});\r\naddHandler(1005, function (target) { return target.resolutionInfo !== undefined; }, function (reader, target) {\r\n    var horizontalResolution = readFixedPoint32(reader);\r\n    var horizontalResolutionUnit = readUint16(reader);\r\n    var widthUnit = readUint16(reader);\r\n    var verticalResolution = readFixedPoint32(reader);\r\n    var verticalResolutionUnit = readUint16(reader);\r\n    var heightUnit = readUint16(reader);\r\n    target.resolutionInfo = {\r\n        horizontalResolution: horizontalResolution,\r\n        horizontalResolutionUnit: RESOLUTION_UNITS[horizontalResolutionUnit] || 'PPI',\r\n        widthUnit: MEASUREMENT_UNITS[widthUnit] || 'Inches',\r\n        verticalResolution: verticalResolution,\r\n        verticalResolutionUnit: RESOLUTION_UNITS[verticalResolutionUnit] || 'PPI',\r\n        heightUnit: MEASUREMENT_UNITS[heightUnit] || 'Inches',\r\n    };\r\n}, function (writer, target) {\r\n    var info = target.resolutionInfo;\r\n    writeFixedPoint32(writer, info.horizontalResolution || 0);\r\n    writeUint16(writer, Math.max(1, RESOLUTION_UNITS.indexOf(info.horizontalResolutionUnit)));\r\n    writeUint16(writer, Math.max(1, MEASUREMENT_UNITS.indexOf(info.widthUnit)));\r\n    writeFixedPoint32(writer, info.verticalResolution || 0);\r\n    writeUint16(writer, Math.max(1, RESOLUTION_UNITS.indexOf(info.verticalResolutionUnit)));\r\n    writeUint16(writer, Math.max(1, MEASUREMENT_UNITS.indexOf(info.heightUnit)));\r\n});\r\nvar printScaleStyles = ['centered', 'size to fit', 'user defined'];\r\naddHandler(1062, function (target) { return target.printScale !== undefined; }, function (reader, target) {\r\n    target.printScale = {\r\n        style: printScaleStyles[readInt16(reader)],\r\n        x: readFloat32(reader),\r\n        y: readFloat32(reader),\r\n        scale: readFloat32(reader),\r\n    };\r\n}, function (writer, target) {\r\n    var _a = target.printScale, style = _a.style, x = _a.x, y = _a.y, scale = _a.scale;\r\n    writeInt16(writer, Math.max(0, printScaleStyles.indexOf(style)));\r\n    writeFloat32(writer, x || 0);\r\n    writeFloat32(writer, y || 0);\r\n    writeFloat32(writer, scale || 0);\r\n});\r\naddHandler(1006, function (target) { return target.alphaChannelNames !== undefined; }, function (reader, target, left) {\r\n    if (!target.alphaChannelNames) { // skip if the unicode versions are already read\r\n        target.alphaChannelNames = [];\r\n        while (left() > 0) {\r\n            var value = readEncodedString(reader);\r\n            // const value = readPascalString(reader, 1);\r\n            target.alphaChannelNames.push(value);\r\n        }\r\n    }\r\n    else {\r\n        skipBytes(reader, left());\r\n    }\r\n}, function (writer, target) {\r\n    for (var _i = 0, _a = target.alphaChannelNames; _i < _a.length; _i++) {\r\n        var name_1 = _a[_i];\r\n        writeEncodedString(writer, name_1);\r\n        // writePascalString(writer, name, 1);\r\n    }\r\n});\r\naddHandler(1045, function (target) { return target.alphaChannelNames !== undefined; }, function (reader, target, left) {\r\n    target.alphaChannelNames = [];\r\n    while (left() > 0) {\r\n        target.alphaChannelNames.push(readUnicodeString(reader));\r\n    }\r\n}, function (writer, target) {\r\n    for (var _i = 0, _a = target.alphaChannelNames; _i < _a.length; _i++) {\r\n        var name_2 = _a[_i];\r\n        writeUnicodeStringWithPadding(writer, name_2);\r\n    }\r\n});\r\nMOCK_HANDLERS && addHandler(1077, function (target) { return target._ir1077 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1077', left());\r\n    target._ir1077 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1077);\r\n});\r\naddHandler(1053, function (target) { return target.alphaIdentifiers !== undefined; }, function (reader, target, left) {\r\n    target.alphaIdentifiers = [];\r\n    while (left() >= 4) {\r\n        target.alphaIdentifiers.push(readUint32(reader));\r\n    }\r\n}, function (writer, target) {\r\n    for (var _i = 0, _a = target.alphaIdentifiers; _i < _a.length; _i++) {\r\n        var id = _a[_i];\r\n        writeUint32(writer, id);\r\n    }\r\n});\r\naddHandler(1010, function (target) { return target.backgroundColor !== undefined; }, function (reader, target) { return target.backgroundColor = readColor(reader); }, function (writer, target) { return writeColor(writer, target.backgroundColor); });\r\naddHandler(1037, function (target) { return target.globalAngle !== undefined; }, function (reader, target) { return target.globalAngle = readInt32(reader); }, function (writer, target) { return writeInt32(writer, target.globalAngle); });\r\naddHandler(1049, function (target) { return target.globalAltitude !== undefined; }, function (reader, target) { return target.globalAltitude = readUint32(reader); }, function (writer, target) { return writeUint32(writer, target.globalAltitude); });\r\naddHandler(1011, function (target) { return target.printFlags !== undefined; }, function (reader, target) {\r\n    target.printFlags = {\r\n        labels: !!readUint8(reader),\r\n        cropMarks: !!readUint8(reader),\r\n        colorBars: !!readUint8(reader),\r\n        registrationMarks: !!readUint8(reader),\r\n        negative: !!readUint8(reader),\r\n        flip: !!readUint8(reader),\r\n        interpolate: !!readUint8(reader),\r\n        caption: !!readUint8(reader),\r\n        printFlags: !!readUint8(reader),\r\n    };\r\n}, function (writer, target) {\r\n    var flags = target.printFlags;\r\n    writeUint8(writer, flags.labels ? 1 : 0);\r\n    writeUint8(writer, flags.cropMarks ? 1 : 0);\r\n    writeUint8(writer, flags.colorBars ? 1 : 0);\r\n    writeUint8(writer, flags.registrationMarks ? 1 : 0);\r\n    writeUint8(writer, flags.negative ? 1 : 0);\r\n    writeUint8(writer, flags.flip ? 1 : 0);\r\n    writeUint8(writer, flags.interpolate ? 1 : 0);\r\n    writeUint8(writer, flags.caption ? 1 : 0);\r\n    writeUint8(writer, flags.printFlags ? 1 : 0);\r\n});\r\naddHandler(1034, // Copyright flag\r\nfunction (// Copyright flag\r\ntarget) { return target.copyrighted !== undefined; }, function (reader, target) {\r\n    target.copyrighted = !!readUint8(reader);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.copyrighted ? 1 : 0);\r\n});\r\naddHandler(1035, // URL\r\nfunction (// URL\r\ntarget) { return target.url !== undefined; }, function (reader, target, left) {\r\n    target.url = readAsciiString(reader, left());\r\n}, function (writer, target) {\r\n    writeAsciiString(writer, target.url);\r\n});\r\nMOCK_HANDLERS && addHandler(10000, // Print flags\r\nfunction (// Print flags\r\ntarget) { return target._ir10000 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 10000', left());\r\n    target._ir10000 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir10000);\r\n});\r\nMOCK_HANDLERS && addHandler(1013, // Color halftoning\r\nfunction (// Color halftoning\r\ntarget) { return target._ir1013 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1013', left());\r\n    target._ir1013 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1013);\r\n});\r\nMOCK_HANDLERS && addHandler(1016, // Color transfer functions\r\nfunction (// Color transfer functions\r\ntarget) { return target._ir1016 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1016', left());\r\n    target._ir1016 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1016);\r\n});\r\naddHandler(1080, // Count Information\r\nfunction (// Count Information\r\ntarget) { return target.countInformation !== undefined; }, function (reader, target) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.countInformation = desc.countGroupList.map(function (g) { return ({\r\n        color: { r: g['Rd  '], g: g['Grn '], b: g['Bl  '] },\r\n        name: g['Nm  '],\r\n        size: g['Rds '],\r\n        fontSize: g.fontSize,\r\n        visible: g.Vsbl,\r\n        points: g.countObjectList.map(function (p) { return ({ x: p['X   '], y: p['Y   '] }); }),\r\n    }); });\r\n}, function (writer, target) {\r\n    var desc = {\r\n        Vrsn: 1,\r\n        countGroupList: target.countInformation.map(function (g) { return ({\r\n            'Rd  ': g.color.r,\r\n            'Grn ': g.color.g,\r\n            'Bl  ': g.color.b,\r\n            'Nm  ': g.name,\r\n            'Rds ': g.size,\r\n            fontSize: g.fontSize,\r\n            Vsbl: g.visible,\r\n            countObjectList: g.points.map(function (p) { return ({ 'X   ': p.x, 'Y   ': p.y }); }),\r\n        }); }),\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'Cnt ', desc);\r\n});\r\naddHandler(1024, function (target) { return target.layerState !== undefined; }, function (reader, target) { return target.layerState = readUint16(reader); }, function (writer, target) { return writeUint16(writer, target.layerState); });\r\naddHandler(1026, function (target) { return target.layersGroup !== undefined; }, function (reader, target, left) {\r\n    target.layersGroup = [];\r\n    while (left() > 0) {\r\n        target.layersGroup.push(readUint16(reader));\r\n    }\r\n}, function (writer, target) {\r\n    for (var _i = 0, _a = target.layersGroup; _i < _a.length; _i++) {\r\n        var g = _a[_i];\r\n        writeUint16(writer, g);\r\n    }\r\n});\r\naddHandler(1072, function (target) { return target.layerGroupsEnabledId !== undefined; }, function (reader, target, left) {\r\n    target.layerGroupsEnabledId = [];\r\n    while (left() > 0) {\r\n        target.layerGroupsEnabledId.push(readUint8(reader));\r\n    }\r\n}, function (writer, target) {\r\n    for (var _i = 0, _a = target.layerGroupsEnabledId; _i < _a.length; _i++) {\r\n        var id = _a[_i];\r\n        writeUint8(writer, id);\r\n    }\r\n});\r\naddHandler(1069, function (target) { return target.layerSelectionIds !== undefined; }, function (reader, target) {\r\n    var count = readUint16(reader);\r\n    target.layerSelectionIds = [];\r\n    while (count--) {\r\n        target.layerSelectionIds.push(readUint32(reader));\r\n    }\r\n}, function (writer, target) {\r\n    writeUint16(writer, target.layerSelectionIds.length);\r\n    for (var _i = 0, _a = target.layerSelectionIds; _i < _a.length; _i++) {\r\n        var id = _a[_i];\r\n        writeUint32(writer, id);\r\n    }\r\n});\r\naddHandler(1032, function (target) { return target.gridAndGuidesInformation !== undefined; }, function (reader, target) {\r\n    var version = readUint32(reader);\r\n    var horizontal = readUint32(reader);\r\n    var vertical = readUint32(reader);\r\n    var count = readUint32(reader);\r\n    if (version !== 1)\r\n        throw new Error(\"Invalid 1032 resource version: \".concat(version));\r\n    target.gridAndGuidesInformation = {\r\n        grid: { horizontal: horizontal, vertical: vertical },\r\n        guides: [],\r\n    };\r\n    for (var i = 0; i < count; i++) {\r\n        target.gridAndGuidesInformation.guides.push({\r\n            location: readUint32(reader) / 32,\r\n            direction: readUint8(reader) ? 'horizontal' : 'vertical'\r\n        });\r\n    }\r\n}, function (writer, target) {\r\n    var info = target.gridAndGuidesInformation;\r\n    var grid = info.grid || { horizontal: 18 * 32, vertical: 18 * 32 };\r\n    var guides = info.guides || [];\r\n    writeUint32(writer, 1);\r\n    writeUint32(writer, grid.horizontal);\r\n    writeUint32(writer, grid.vertical);\r\n    writeUint32(writer, guides.length);\r\n    for (var _i = 0, guides_1 = guides; _i < guides_1.length; _i++) {\r\n        var g = guides_1[_i];\r\n        writeUint32(writer, g.location * 32);\r\n        writeUint8(writer, g.direction === 'horizontal' ? 1 : 0);\r\n    }\r\n});\r\naddHandler(1065, // Layer Comps\r\nfunction (// Layer Comps\r\ntarget) { return target.layerComps !== undefined; }, function (reader, target) {\r\n    var desc = readVersionAndDescriptor(reader, true);\r\n    // console.log('CompList', require('util').inspect(desc, false, 99, true));\r\n    target.layerComps = { list: [] };\r\n    for (var _i = 0, _a = desc.list; _i < _a.length; _i++) {\r\n        var item = _a[_i];\r\n        target.layerComps.list.push({\r\n            id: item.compID,\r\n            name: item['Nm  '],\r\n            capturedInfo: item.capturedInfo,\r\n        });\r\n        if ('comment' in item)\r\n            target.layerComps.list[target.layerComps.list.length - 1].comment = item.comment;\r\n    }\r\n    if ('lastAppliedComp' in desc)\r\n        target.layerComps.lastApplied = desc.lastAppliedComp;\r\n}, function (writer, target) {\r\n    var layerComps = target.layerComps;\r\n    var desc = { list: [] };\r\n    for (var _i = 0, _a = layerComps.list; _i < _a.length; _i++) {\r\n        var item = _a[_i];\r\n        var t = {};\r\n        t._classID = 'Comp';\r\n        t['Nm  '] = item.name;\r\n        if ('comment' in item)\r\n            t.comment = item.comment;\r\n        t.compID = item.id;\r\n        t.capturedInfo = item.capturedInfo;\r\n        desc.list.push(t);\r\n    }\r\n    if ('lastApplied' in layerComps)\r\n        desc.lastAppliedComp = layerComps.lastApplied;\r\n    // console.log('CompList', require('util').inspect(desc, false, 99, true));\r\n    writeVersionAndDescriptor(writer, '', 'CompList', desc);\r\n});\r\nMOCK_HANDLERS && addHandler(1092, // ???\r\nfunction (// ???\r\ntarget) { return target._ir1092 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1092', left());\r\n    // 16 bytes, seems to be 4 integers\r\n    target._ir1092 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1092);\r\n});\r\n// 0 - normal, 7 - multiply, 8 - screen, 23 - difference\r\nvar onionSkinsBlendModes = [\r\n    'normal', undefined, undefined, undefined, undefined, undefined, undefined, 'multiply',\r\n    'screen', undefined, undefined, undefined, undefined, undefined, undefined, undefined,\r\n    undefined, undefined, undefined, undefined, undefined, undefined, undefined, 'difference',\r\n];\r\naddHandler(1078, // Onion Skins\r\nfunction (// Onion Skins\r\ntarget) { return target.onionSkins !== undefined; }, function (reader, target) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    // console.log('1078', require('util').inspect(desc, false, 99, true));\r\n    target.onionSkins = {\r\n        enabled: desc.enab,\r\n        framesBefore: desc.numBefore,\r\n        framesAfter: desc.numAfter,\r\n        frameSpacing: desc.Spcn,\r\n        minOpacity: desc.minOpacity / 100,\r\n        maxOpacity: desc.maxOpacity / 100,\r\n        blendMode: onionSkinsBlendModes[desc.BlnM] || 'normal',\r\n    };\r\n}, function (writer, target) {\r\n    var onionSkins = target.onionSkins;\r\n    var desc = {\r\n        Vrsn: 1,\r\n        enab: onionSkins.enabled,\r\n        numBefore: onionSkins.framesBefore,\r\n        numAfter: onionSkins.framesAfter,\r\n        Spcn: onionSkins.frameSpacing,\r\n        minOpacity: (onionSkins.minOpacity * 100) | 0,\r\n        maxOpacity: (onionSkins.maxOpacity * 100) | 0,\r\n        BlnM: Math.max(0, onionSkinsBlendModes.indexOf(onionSkins.blendMode)),\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\naddHandler(1075, // Timeline Information\r\nfunction (// Timeline Information\r\ntarget) { return target.timelineInformation !== undefined; }, function (reader, target) {\r\n    var _a, _b;\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.timelineInformation = {\r\n        enabled: desc.enab,\r\n        frameStep: frac(desc.frameStep),\r\n        frameRate: desc.frameRate,\r\n        time: frac(desc.time),\r\n        duration: frac(desc.duration),\r\n        workInTime: frac(desc.workInTime),\r\n        workOutTime: frac(desc.workOutTime),\r\n        repeats: desc.LCnt,\r\n        hasMotion: desc.hasMotion,\r\n        globalTracks: parseTrackList(desc.globalTrackList, !!reader.logMissingFeatures),\r\n    };\r\n    if ((_b = (_a = desc.audioClipGroupList) === null || _a === void 0 ? void 0 : _a.audioClipGroupList) === null || _b === void 0 ? void 0 : _b.length) {\r\n        target.timelineInformation.audioClipGroups = desc.audioClipGroupList.audioClipGroupList.map(function (g) { return ({\r\n            id: g.groupID,\r\n            muted: g.muted,\r\n            audioClips: g.audioClipList.map(function (_a) {\r\n                var clipID = _a.clipID, timeScope = _a.timeScope, muted = _a.muted, audioLevel = _a.audioLevel, frameReader = _a.frameReader;\r\n                return ({\r\n                    id: clipID,\r\n                    start: frac(timeScope.Strt),\r\n                    duration: frac(timeScope.duration),\r\n                    inTime: frac(timeScope.inTime),\r\n                    outTime: frac(timeScope.outTime),\r\n                    muted: muted,\r\n                    audioLevel: audioLevel,\r\n                    frameReader: {\r\n                        type: frameReader.frameReaderType,\r\n                        mediaDescriptor: frameReader.mediaDescriptor,\r\n                        link: {\r\n                            name: frameReader['Lnk ']['Nm  '],\r\n                            fullPath: frameReader['Lnk '].fullPath,\r\n                            relativePath: frameReader['Lnk '].relPath,\r\n                        },\r\n                    },\r\n                });\r\n            }),\r\n        }); });\r\n    }\r\n}, function (writer, target) {\r\n    var _a;\r\n    var timeline = target.timelineInformation;\r\n    var desc = {\r\n        Vrsn: 1,\r\n        enab: timeline.enabled,\r\n        frameStep: timeline.frameStep,\r\n        frameRate: timeline.frameRate,\r\n        time: timeline.time,\r\n        duration: timeline.duration,\r\n        workInTime: timeline.workInTime,\r\n        workOutTime: timeline.workOutTime,\r\n        LCnt: timeline.repeats,\r\n        globalTrackList: serializeTrackList(timeline.globalTracks),\r\n        audioClipGroupList: {\r\n            audioClipGroupList: (_a = timeline.audioClipGroups) === null || _a === void 0 ? void 0 : _a.map(function (a) { return ({\r\n                groupID: a.id,\r\n                muted: a.muted,\r\n                audioClipList: a.audioClips.map(function (c) { return ({\r\n                    clipID: c.id,\r\n                    timeScope: {\r\n                        Vrsn: 1,\r\n                        Strt: c.start,\r\n                        duration: c.duration,\r\n                        inTime: c.inTime,\r\n                        outTime: c.outTime,\r\n                    },\r\n                    frameReader: {\r\n                        frameReaderType: c.frameReader.type,\r\n                        descVersion: 1,\r\n                        'Lnk ': {\r\n                            descVersion: 1,\r\n                            'Nm  ': c.frameReader.link.name,\r\n                            fullPath: c.frameReader.link.fullPath,\r\n                            relPath: c.frameReader.link.relativePath,\r\n                        },\r\n                        mediaDescriptor: c.frameReader.mediaDescriptor,\r\n                    },\r\n                    muted: c.muted,\r\n                    audioLevel: c.audioLevel,\r\n                }); }),\r\n            }); }),\r\n        },\r\n        hasMotion: timeline.hasMotion,\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'null', desc, 'anim');\r\n});\r\naddHandler(1076, // Sheet Disclosure\r\nfunction (// Sheet Disclosure\r\ntarget) { return target.sheetDisclosure !== undefined; }, function (reader, target) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.sheetDisclosure = {};\r\n    if (desc.sheetTimelineOptions) {\r\n        target.sheetDisclosure.sheetTimelineOptions = desc.sheetTimelineOptions.map(function (o) { return ({\r\n            sheetID: o.sheetID,\r\n            sheetDisclosed: o.sheetDisclosed,\r\n            lightsDisclosed: o.lightsDisclosed,\r\n            meshesDisclosed: o.meshesDisclosed,\r\n            materialsDisclosed: o.materialsDisclosed,\r\n        }); });\r\n    }\r\n}, function (writer, target) {\r\n    var disclosure = target.sheetDisclosure;\r\n    var desc = { Vrsn: 1 };\r\n    if (disclosure.sheetTimelineOptions) {\r\n        desc.sheetTimelineOptions = disclosure.sheetTimelineOptions.map(function (d) { return ({\r\n            Vrsn: 2,\r\n            sheetID: d.sheetID,\r\n            sheetDisclosed: d.sheetDisclosed,\r\n            lightsDisclosed: d.lightsDisclosed,\r\n            meshesDisclosed: d.meshesDisclosed,\r\n            materialsDisclosed: d.materialsDisclosed,\r\n        }); });\r\n    }\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\naddHandler(1054, // URL List\r\nfunction (// URL List\r\ntarget) { return target.urlsList !== undefined; }, function (reader, target) {\r\n    var count = readUint32(reader);\r\n    target.urlsList = [];\r\n    for (var i = 0; i < count; i++) {\r\n        var long = readSignature(reader);\r\n        if (long !== 'slic' && reader.throwForMissingFeatures)\r\n            throw new Error('Unknown long');\r\n        var id = readUint32(reader);\r\n        var url = readUnicodeString(reader);\r\n        target.urlsList.push({ id: id, url: url, ref: 'slice' });\r\n    }\r\n}, function (writer, target) {\r\n    var list = target.urlsList;\r\n    writeUint32(writer, list.length);\r\n    for (var i = 0; i < list.length; i++) {\r\n        writeSignature(writer, 'slic');\r\n        writeUint32(writer, list[i].id);\r\n        writeUnicodeString(writer, list[i].url);\r\n    }\r\n});\r\nfunction boundsToBounds(bounds) {\r\n    return { 'Top ': bounds.top, Left: bounds.left, Btom: bounds.bottom, Rght: bounds.right };\r\n}\r\nfunction boundsFromBounds(bounds) {\r\n    return { top: bounds['Top '], left: bounds.Left, bottom: bounds.Btom, right: bounds.Rght };\r\n}\r\nfunction clamped(array, index) {\r\n    return array[Math.max(0, Math.min(array.length - 1, index))];\r\n}\r\nvar sliceOrigins = ['autoGenerated', 'layer', 'userGenerated'];\r\nvar sliceTypes = ['noImage', 'image'];\r\nvar sliceAlignments = ['default'];\r\naddHandler(1050, // Slices\r\nfunction (// Slices\r\ntarget) { return target.slices ? target.slices.length : 0; }, function (reader, target) {\r\n    var version = readUint32(reader);\r\n    if (version === 6) {\r\n        if (!target.slices)\r\n            target.slices = [];\r\n        var top_1 = readInt32(reader);\r\n        var left = readInt32(reader);\r\n        var bottom = readInt32(reader);\r\n        var right = readInt32(reader);\r\n        var groupName = readUnicodeString(reader);\r\n        var count = readUint32(reader);\r\n        target.slices.push({ bounds: { top: top_1, left: left, bottom: bottom, right: right }, groupName: groupName, slices: [] });\r\n        var slices_1 = target.slices[target.slices.length - 1].slices;\r\n        for (var i = 0; i < count; i++) {\r\n            var id = readUint32(reader);\r\n            var groupId = readUint32(reader);\r\n            var origin_1 = clamped(sliceOrigins, readUint32(reader));\r\n            var associatedLayerId = origin_1 == 'layer' ? readUint32(reader) : 0;\r\n            var name_3 = readUnicodeString(reader);\r\n            var type = clamped(sliceTypes, readUint32(reader));\r\n            var left_1 = readInt32(reader);\r\n            var top_2 = readInt32(reader);\r\n            var right_1 = readInt32(reader);\r\n            var bottom_1 = readInt32(reader);\r\n            var url = readUnicodeString(reader);\r\n            var target_1 = readUnicodeString(reader);\r\n            var message = readUnicodeString(reader);\r\n            var altTag = readUnicodeString(reader);\r\n            var cellTextIsHTML = !!readUint8(reader);\r\n            var cellText = readUnicodeString(reader);\r\n            var horizontalAlignment = clamped(sliceAlignments, readUint32(reader));\r\n            var verticalAlignment = clamped(sliceAlignments, readUint32(reader));\r\n            var a = readUint8(reader);\r\n            var r = readUint8(reader);\r\n            var g = readUint8(reader);\r\n            var b = readUint8(reader);\r\n            var backgroundColorType = ((a + r + g + b) === 0) ? 'none' : (a === 0 ? 'matte' : 'color');\r\n            slices_1.push({\r\n                id: id,\r\n                groupId: groupId,\r\n                origin: origin_1,\r\n                associatedLayerId: associatedLayerId,\r\n                name: name_3,\r\n                target: target_1,\r\n                message: message,\r\n                altTag: altTag,\r\n                cellTextIsHTML: cellTextIsHTML,\r\n                cellText: cellText,\r\n                horizontalAlignment: horizontalAlignment,\r\n                verticalAlignment: verticalAlignment,\r\n                type: type,\r\n                url: url,\r\n                bounds: { top: top_2, left: left_1, bottom: bottom_1, right: right_1 },\r\n                backgroundColorType: backgroundColorType,\r\n                backgroundColor: { r: r, g: g, b: b, a: a },\r\n            });\r\n        }\r\n        var desc = readVersionAndDescriptor(reader);\r\n        desc.slices.forEach(function (d) {\r\n            var slice = slices_1.find(function (s) { return d.sliceID == s.id; });\r\n            if (slice) {\r\n                slice.topOutset = d.topOutset;\r\n                slice.leftOutset = d.leftOutset;\r\n                slice.bottomOutset = d.bottomOutset;\r\n                slice.rightOutset = d.rightOutset;\r\n            }\r\n        });\r\n    }\r\n    else if (version === 7 || version === 8) {\r\n        var desc = readVersionAndDescriptor(reader);\r\n        if (!target.slices)\r\n            target.slices = [];\r\n        target.slices.push({\r\n            groupName: desc.baseName,\r\n            bounds: boundsFromBounds(desc.bounds),\r\n            slices: desc.slices.map(function (s) { return (__assign(__assign({}, (s['Nm  '] ? { name: s['Nm  '] } : {})), { id: s.sliceID, groupId: s.groupID, associatedLayerId: 0, origin: ESliceOrigin.decode(s.origin), type: ESliceType.decode(s.Type), bounds: boundsFromBounds(s.bounds), url: s.url, target: s.null, message: s.Msge, altTag: s.altTag, cellTextIsHTML: s.cellTextIsHTML, cellText: s.cellText, horizontalAlignment: ESliceHorzAlign.decode(s.horzAlign), verticalAlignment: ESliceVertAlign.decode(s.vertAlign), backgroundColorType: ESliceBGColorType.decode(s.bgColorType), backgroundColor: s.bgColor ? { r: s.bgColor['Rd  '], g: s.bgColor['Grn '], b: s.bgColor['Bl  '], a: s.bgColor.alpha } : { r: 0, g: 0, b: 0, a: 0 }, topOutset: s.topOutset || 0, leftOutset: s.leftOutset || 0, bottomOutset: s.bottomOutset || 0, rightOutset: s.rightOutset || 0 })); }),\r\n        });\r\n    }\r\n    else {\r\n        throw new Error(\"Invalid slices version (\".concat(version, \")\"));\r\n    }\r\n}, function (writer, target, index) {\r\n    var _a = target.slices[index], bounds = _a.bounds, groupName = _a.groupName, slices = _a.slices;\r\n    writeUint32(writer, 6); // version\r\n    writeInt32(writer, bounds.top);\r\n    writeInt32(writer, bounds.left);\r\n    writeInt32(writer, bounds.bottom);\r\n    writeInt32(writer, bounds.right);\r\n    writeUnicodeString(writer, groupName);\r\n    writeUint32(writer, slices.length);\r\n    for (var i = 0; i < slices.length; i++) {\r\n        var slice = slices[i];\r\n        var _b = slice.backgroundColor, a = _b.a, r = _b.r, g = _b.g, b = _b.b;\r\n        if (slice.backgroundColorType === 'none') {\r\n            a = r = g = b = 0;\r\n        }\r\n        else if (slice.backgroundColorType === 'matte') {\r\n            a = 0;\r\n            r = g = b = 255;\r\n        }\r\n        writeUint32(writer, slice.id);\r\n        writeUint32(writer, slice.groupId);\r\n        writeUint32(writer, sliceOrigins.indexOf(slice.origin));\r\n        if (slice.origin === 'layer')\r\n            writeUint32(writer, slice.associatedLayerId);\r\n        writeUnicodeString(writer, slice.name || '');\r\n        writeUint32(writer, sliceTypes.indexOf(slice.type));\r\n        writeInt32(writer, slice.bounds.left);\r\n        writeInt32(writer, slice.bounds.top);\r\n        writeInt32(writer, slice.bounds.right);\r\n        writeInt32(writer, slice.bounds.bottom);\r\n        writeUnicodeString(writer, slice.url);\r\n        writeUnicodeString(writer, slice.target);\r\n        writeUnicodeString(writer, slice.message);\r\n        writeUnicodeString(writer, slice.altTag);\r\n        writeUint8(writer, slice.cellTextIsHTML ? 1 : 0);\r\n        writeUnicodeString(writer, slice.cellText);\r\n        writeUint32(writer, sliceAlignments.indexOf(slice.horizontalAlignment));\r\n        writeUint32(writer, sliceAlignments.indexOf(slice.verticalAlignment));\r\n        writeUint8(writer, a);\r\n        writeUint8(writer, r);\r\n        writeUint8(writer, g);\r\n        writeUint8(writer, b);\r\n    }\r\n    var desc = {\r\n        bounds: boundsToBounds(bounds),\r\n        slices: [],\r\n    };\r\n    slices.forEach(function (s) {\r\n        var slice = __assign(__assign({ sliceID: s.id, groupID: s.groupId, origin: ESliceOrigin.encode(s.origin), Type: ESliceType.encode(s.type), bounds: boundsToBounds(s.bounds) }, (s.name ? { 'Nm  ': s.name } : {})), { url: s.url, null: s.target, Msge: s.message, altTag: s.altTag, cellTextIsHTML: s.cellTextIsHTML, cellText: s.cellText, horzAlign: ESliceHorzAlign.encode(s.horizontalAlignment), vertAlign: ESliceVertAlign.encode(s.verticalAlignment), bgColorType: ESliceBGColorType.encode(s.backgroundColorType) });\r\n        if (s.backgroundColorType === 'color') {\r\n            var _a = s.backgroundColor, r = _a.r, g = _a.g, b = _a.b, a = _a.a;\r\n            slice.bgColor = { 'Rd  ': r, 'Grn ': g, 'Bl  ': b, alpha: a };\r\n        }\r\n        slice.topOutset = s.topOutset || 0;\r\n        slice.leftOutset = s.leftOutset || 0;\r\n        slice.bottomOutset = s.bottomOutset || 0;\r\n        slice.rightOutset = s.rightOutset || 0;\r\n        desc.slices.push(slice);\r\n    });\r\n    writeVersionAndDescriptor(writer, '', 'null', desc, 'slices');\r\n});\r\naddHandler(1064, function (target) { return target.pixelAspectRatio !== undefined; }, function (reader, target) {\r\n    if (readUint32(reader) > 2)\r\n        throw new Error('Invalid pixelAspectRatio version');\r\n    target.pixelAspectRatio = { aspect: readFloat64(reader) };\r\n}, function (writer, target) {\r\n    writeUint32(writer, 2); // version\r\n    writeFloat64(writer, target.pixelAspectRatio.aspect);\r\n});\r\naddHandler(1041, function (target) { return target.iccUntaggedProfile !== undefined; }, function (reader, target) {\r\n    target.iccUntaggedProfile = !!readUint8(reader);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.iccUntaggedProfile ? 1 : 0);\r\n});\r\nMOCK_HANDLERS && addHandler(1039, // ICC Profile\r\nfunction (// ICC Profile\r\ntarget) { return target._ir1039 !== undefined; }, function (reader, target, left) {\r\n    // TODO: this is raw bytes, just return as a byte array\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1039', left());\r\n    target._ir1039 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1039);\r\n});\r\naddHandler(1044, function (target) { return target.idsSeedNumber !== undefined; }, function (reader, target) { return target.idsSeedNumber = readUint32(reader); }, function (writer, target) { return writeUint32(writer, target.idsSeedNumber); });\r\naddHandler(1036, function (target) { return target.thumbnail !== undefined || target.thumbnailRaw !== undefined; }, function (reader, target, left) {\r\n    var format = readUint32(reader); // 1 = kJpegRGB, 0 = kRawRGB\r\n    var width = readUint32(reader);\r\n    var height = readUint32(reader);\r\n    readUint32(reader); // widthBytes = (width * bits_per_pixel + 31) / 32 * 4.\r\n    readUint32(reader); // totalSize = widthBytes * height * planes\r\n    readUint32(reader); // sizeAfterCompression\r\n    var bitsPerPixel = readUint16(reader); // 24\r\n    var planes = readUint16(reader); // 1\r\n    if (format !== 1 || bitsPerPixel !== 24 || planes !== 1) {\r\n        reader.logMissingFeatures && reader.log(\"Invalid thumbnail data (format: \".concat(format, \", bitsPerPixel: \").concat(bitsPerPixel, \", planes: \").concat(planes, \")\"));\r\n        skipBytes(reader, left());\r\n        return;\r\n    }\r\n    var size = left();\r\n    var data = readBytes(reader, size);\r\n    if (reader.useRawThumbnail) {\r\n        target.thumbnailRaw = { width: width, height: height, data: data };\r\n    }\r\n    else if (data.byteLength) {\r\n        target.thumbnail = createCanvasFromData(data);\r\n    }\r\n}, function (writer, target) {\r\n    var _a;\r\n    var width = 0;\r\n    var height = 0;\r\n    var data = new Uint8Array(0);\r\n    if (target.thumbnailRaw) {\r\n        width = target.thumbnailRaw.width;\r\n        height = target.thumbnailRaw.height;\r\n        data = target.thumbnailRaw.data;\r\n    }\r\n    else {\r\n        try {\r\n            var dataUrl = (_a = target.thumbnail.toDataURL('image/jpeg', 1)) === null || _a === void 0 ? void 0 : _a.substring('data:image/jpeg;base64,'.length);\r\n            if (dataUrl) {\r\n                data = toByteArray(dataUrl); // this sometimes fails for some reason, maybe some browser bugs\r\n                width = target.thumbnail.width;\r\n                height = target.thumbnail.height;\r\n            }\r\n        }\r\n        catch (_b) { }\r\n    }\r\n    var bitsPerPixel = 24;\r\n    var widthBytes = Math.floor((width * bitsPerPixel + 31) / 32) * 4;\r\n    var planes = 1;\r\n    var totalSize = widthBytes * height * planes;\r\n    var sizeAfterCompression = data.length;\r\n    writeUint32(writer, 1); // 1 = kJpegRGB\r\n    writeUint32(writer, width);\r\n    writeUint32(writer, height);\r\n    writeUint32(writer, widthBytes);\r\n    writeUint32(writer, totalSize);\r\n    writeUint32(writer, sizeAfterCompression);\r\n    writeUint16(writer, bitsPerPixel);\r\n    writeUint16(writer, planes);\r\n    writeBytes(writer, data);\r\n});\r\naddHandler(1057, function (target) { return target.versionInfo !== undefined; }, function (reader, target, left) {\r\n    var version = readUint32(reader);\r\n    if (version !== 1)\r\n        throw new Error('Invalid versionInfo version');\r\n    target.versionInfo = {\r\n        hasRealMergedData: !!readUint8(reader),\r\n        writerName: readUnicodeString(reader),\r\n        readerName: readUnicodeString(reader),\r\n        fileVersion: readUint32(reader),\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var versionInfo = target.versionInfo;\r\n    writeUint32(writer, 1); // version\r\n    writeUint8(writer, versionInfo.hasRealMergedData ? 1 : 0);\r\n    writeUnicodeString(writer, versionInfo.writerName);\r\n    writeUnicodeString(writer, versionInfo.readerName);\r\n    writeUint32(writer, versionInfo.fileVersion);\r\n});\r\nMOCK_HANDLERS && addHandler(1058, // EXIF data 1.\r\nfunction (// EXIF data 1.\r\ntarget) { return target._ir1058 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1058', left());\r\n    target._ir1058 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1058);\r\n});\r\naddHandler(7000, function (target) { return target.imageReadyVariables !== undefined; }, function (reader, target, left) {\r\n    target.imageReadyVariables = readUtf8String(reader, left());\r\n}, function (writer, target) {\r\n    writeUtf8String(writer, target.imageReadyVariables);\r\n});\r\naddHandler(7001, function (target) { return target.imageReadyDataSets !== undefined; }, function (reader, target, left) {\r\n    target.imageReadyDataSets = readUtf8String(reader, left());\r\n}, function (writer, target) {\r\n    writeUtf8String(writer, target.imageReadyDataSets);\r\n});\r\naddHandler(1088, function (target) { return target.pathSelectionState !== undefined; }, function (reader, target, _left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.pathSelectionState = desc['null'];\r\n}, function (writer, target) {\r\n    var desc = { 'null': target.pathSelectionState };\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\nMOCK_HANDLERS && addHandler(1025, function (target) { return target._ir1025 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1025', left());\r\n    target._ir1025 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1025);\r\n});\r\nvar FrmD = createEnum('FrmD', '', {\r\n    auto: 'Auto',\r\n    none: 'None',\r\n    dispose: 'Disp',\r\n});\r\naddHandler(4000, // Plug-In resource(s)\r\nfunction (// Plug-In resource(s)\r\ntarget) { return target.animations !== undefined; }, function (reader, target, left) {\r\n    var key = readSignature(reader);\r\n    if (key === 'mani') {\r\n        checkSignature(reader, 'IRFR');\r\n        readSection(reader, 1, function (left) {\r\n            var _loop_1 = function () {\r\n                checkSignature(reader, '8BIM');\r\n                var key_1 = readSignature(reader);\r\n                readSection(reader, 1, function (left) {\r\n                    if (key_1 === 'AnDs') {\r\n                        var desc = readVersionAndDescriptor(reader);\r\n                        target.animations = {\r\n                            // desc.AFSt ???\r\n                            frames: desc.FrIn.map(function (x) { return ({\r\n                                id: x.FrID,\r\n                                delay: (x.FrDl || 0) / 100,\r\n                                dispose: x.FrDs ? FrmD.decode(x.FrDs) : 'auto', // missing == auto\r\n                                // x.FrGA ???\r\n                            }); }),\r\n                            animations: desc.FSts.map(function (x) { return ({\r\n                                id: x.FsID,\r\n                                frames: x.FsFr,\r\n                                repeats: x.LCnt,\r\n                                activeFrame: x.AFrm || 0,\r\n                            }); }),\r\n                        };\r\n                        // console.log('#4000 AnDs', require('util').inspect(desc, false, 99, true));\r\n                        // console.log('#4000 AnDs:result', require('util').inspect(target.animations, false, 99, true));\r\n                    }\r\n                    else if (key_1 === 'Roll') {\r\n                        var bytes = readBytes(reader, left());\r\n                        reader.logDevFeatures && reader.log('#4000 Roll', bytes);\r\n                    }\r\n                    else {\r\n                        reader.logMissingFeatures && reader.log('Unhandled subsection in #4000', key_1);\r\n                    }\r\n                });\r\n            };\r\n            while (left() > 0) {\r\n                _loop_1();\r\n            }\r\n        });\r\n    }\r\n    else if (key === 'mopt') {\r\n        var bytes = readBytes(reader, left());\r\n        reader.logDevFeatures && reader.log('#4000 mopt', bytes);\r\n    }\r\n    else {\r\n        reader.logMissingFeatures && reader.log('Unhandled key in #4000:', key);\r\n    }\r\n}, function (writer, target) {\r\n    if (target.animations) {\r\n        writeSignature(writer, 'mani');\r\n        writeSignature(writer, 'IRFR');\r\n        writeSection(writer, 1, function () {\r\n            writeSignature(writer, '8BIM');\r\n            writeSignature(writer, 'AnDs');\r\n            writeSection(writer, 1, function () {\r\n                var desc = {\r\n                    // AFSt: 0, // ???\r\n                    FrIn: [],\r\n                    FSts: [],\r\n                };\r\n                for (var i = 0; i < target.animations.frames.length; i++) {\r\n                    var f = target.animations.frames[i];\r\n                    var frame = {\r\n                        FrID: f.id,\r\n                    };\r\n                    if (f.delay)\r\n                        frame.FrDl = (f.delay * 100) | 0;\r\n                    frame.FrDs = FrmD.encode(f.dispose);\r\n                    // if (i === 0) frame.FrGA = 30; // ???\r\n                    desc.FrIn.push(frame);\r\n                }\r\n                for (var i = 0; i < target.animations.animations.length; i++) {\r\n                    var a = target.animations.animations[i];\r\n                    var anim = {\r\n                        FsID: a.id,\r\n                        AFrm: a.activeFrame | 0,\r\n                        FsFr: a.frames,\r\n                        LCnt: a.repeats | 0,\r\n                    };\r\n                    desc.FSts.push(anim);\r\n                }\r\n                writeVersionAndDescriptor(writer, '', 'null', desc);\r\n            });\r\n            // writeSignature(writer, '8BIM');\r\n            // writeSignature(writer, 'Roll');\r\n            // writeSection(writer, 1, () => {\r\n            // \twriteZeros(writer, 8);\r\n            // });\r\n        });\r\n    }\r\n});\r\n// TODO: Unfinished\r\nMOCK_HANDLERS && addHandler(4001, // Plug-In resource(s)\r\nfunction (// Plug-In resource(s)\r\ntarget) { return target._ir4001 !== undefined; }, function (reader, target, left) {\r\n    if (MOCK_HANDLERS) {\r\n        LOG_MOCK_HANDLERS && console.log('image resource 4001', left());\r\n        target._ir4001 = readBytes(reader, left());\r\n        return;\r\n    }\r\n    var key = readSignature(reader);\r\n    if (key === 'mfri') {\r\n        var version = readUint32(reader);\r\n        if (version !== 2)\r\n            throw new Error('Invalid mfri version');\r\n        var length_1 = readUint32(reader);\r\n        var bytes = readBytes(reader, length_1);\r\n        reader.logDevFeatures && reader.log('mfri', bytes);\r\n    }\r\n    else if (key === 'mset') {\r\n        var desc = readVersionAndDescriptor(reader);\r\n        reader.logDevFeatures && reader.log('mset', desc);\r\n    }\r\n    else {\r\n        reader.logMissingFeatures && reader.log('Unhandled key in #4001', key);\r\n    }\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir4001);\r\n});\r\n// TODO: Unfinished\r\nMOCK_HANDLERS && addHandler(4002, // Plug-In resource(s)\r\nfunction (// Plug-In resource(s)\r\ntarget) { return target._ir4002 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 4002', left());\r\n    target._ir4002 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir4002);\r\n});\r\n//# sourceMappingURL=imageResources.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n};\r\nimport { inflate as inflateSync } from 'pako';\r\nimport { resetImageData, offsetForChannel, decodeBitmap, createImageData, toBlendMode, RAW_IMAGE_DATA, largeAdditionalInfoKeys, imageDataToCanvas } from './helpers';\r\nimport { infoHandlersMap } from './additionalInfo';\r\nimport { resourceHandlersMap } from './imageResources';\r\nexport var supportedColorModes = [0 /* ColorMode.Bitmap */, 1 /* ColorMode.Grayscale */, 3 /* ColorMode.RGB */, 2 /* ColorMode.Indexed */];\r\nvar colorModes = ['bitmap', 'grayscale', 'indexed', 'RGB', 'CMYK', 'multichannel', 'duotone', 'lab'];\r\nfunction setupGrayscale(data) {\r\n    var size = data.width * data.height * 4;\r\n    for (var i = 0; i < size; i += 4) {\r\n        var c = data.data[i];\r\n        data.data[i + 1] = c;\r\n        data.data[i + 2] = c;\r\n    }\r\n}\r\nexport function createReader(buffer, offset, length) {\r\n    var view = new DataView(buffer, offset, length);\r\n    return { view: view, offset: 0, strict: false, debug: false, large: false, globalAlpha: false, log: console.log };\r\n}\r\nexport function warnOrThrow(reader, message) {\r\n    if (reader.strict)\r\n        throw new Error(message);\r\n    if (reader.debug)\r\n        reader.log(message);\r\n}\r\nexport function readUint8(reader) {\r\n    reader.offset += 1;\r\n    return reader.view.getUint8(reader.offset - 1);\r\n}\r\nexport function peekUint8(reader) {\r\n    return reader.view.getUint8(reader.offset);\r\n}\r\nexport function readInt16(reader) {\r\n    reader.offset += 2;\r\n    return reader.view.getInt16(reader.offset - 2, false);\r\n}\r\nexport function readUint16(reader) {\r\n    reader.offset += 2;\r\n    return reader.view.getUint16(reader.offset - 2, false);\r\n}\r\nexport function readUint16LE(reader) {\r\n    reader.offset += 2;\r\n    return reader.view.getUint16(reader.offset - 2, true);\r\n}\r\nexport function readInt32(reader) {\r\n    reader.offset += 4;\r\n    return reader.view.getInt32(reader.offset - 4, false);\r\n}\r\nexport function readInt32LE(reader) {\r\n    reader.offset += 4;\r\n    return reader.view.getInt32(reader.offset - 4, true);\r\n}\r\nexport function readUint32(reader) {\r\n    reader.offset += 4;\r\n    return reader.view.getUint32(reader.offset - 4, false);\r\n}\r\nexport function readFloat32(reader) {\r\n    reader.offset += 4;\r\n    return reader.view.getFloat32(reader.offset - 4, false);\r\n}\r\nexport function readFloat64(reader) {\r\n    reader.offset += 8;\r\n    return reader.view.getFloat64(reader.offset - 8, false);\r\n}\r\n// 32-bit fixed-point number 16.16\r\nexport function readFixedPoint32(reader) {\r\n    return readInt32(reader) / (1 << 16);\r\n}\r\n// 32-bit fixed-point number 8.24\r\nexport function readFixedPointPath32(reader) {\r\n    return readInt32(reader) / (1 << 24);\r\n}\r\nexport function readBytes(reader, length) {\r\n    var start = reader.view.byteOffset + reader.offset;\r\n    reader.offset += length;\r\n    if ((start + length) > reader.view.buffer.byteLength) {\r\n        // fix for broken PSD files that are missing part of file at the end\r\n        warnOrThrow(reader, 'Reading bytes exceeding buffer length');\r\n        if (length > (100 * 1024 * 1024))\r\n            throw new Error('Reading past end of file'); // limit to 100MB\r\n        var result = new Uint8Array(length);\r\n        var len = Math.min(length, reader.view.byteLength - start);\r\n        if (len > 0)\r\n            result.set(new Uint8Array(reader.view.buffer, start, len));\r\n        return result;\r\n    }\r\n    else {\r\n        return new Uint8Array(reader.view.buffer, start, length);\r\n    }\r\n}\r\nexport function readSignature(reader) {\r\n    return readShortString(reader, 4);\r\n}\r\nexport function validSignatureAt(reader, offset) {\r\n    var sig = String.fromCharCode(reader.view.getUint8(offset))\r\n        + String.fromCharCode(reader.view.getUint8(offset + 1))\r\n        + String.fromCharCode(reader.view.getUint8(offset + 2))\r\n        + String.fromCharCode(reader.view.getUint8(offset + 3));\r\n    return sig == '8BIM' || sig == '8B64';\r\n}\r\nexport function readPascalString(reader, padTo) {\r\n    var length = readUint8(reader);\r\n    var text = length ? readShortString(reader, length) : '';\r\n    while (++length % padTo) { // starts with length + 1 so we count the size byte too\r\n        reader.offset++;\r\n    }\r\n    return text;\r\n}\r\nexport function readUnicodeString(reader) {\r\n    var length = readUint32(reader);\r\n    return readUnicodeStringWithLength(reader, length);\r\n}\r\nexport function readUnicodeStringWithLength(reader, length) {\r\n    var text = '';\r\n    while (length--) {\r\n        var value = readUint16(reader);\r\n        if (value || length > 0) { // remove trailing \\0\r\n            text += String.fromCharCode(value);\r\n        }\r\n    }\r\n    return text;\r\n}\r\nexport function readUnicodeStringWithLengthLE(reader, length) {\r\n    var text = '';\r\n    while (length--) {\r\n        var value = readUint16LE(reader);\r\n        if (value || length > 0) { // remove trailing \\0\r\n            text += String.fromCharCode(value);\r\n        }\r\n    }\r\n    return text;\r\n}\r\nexport function readAsciiString(reader, length) {\r\n    var text = '';\r\n    while (length--) {\r\n        text += String.fromCharCode(readUint8(reader));\r\n    }\r\n    return text;\r\n}\r\nexport function skipBytes(reader, count) {\r\n    reader.offset += count;\r\n}\r\nexport function checkSignature(reader, a, b) {\r\n    var offset = reader.offset;\r\n    var signature = readSignature(reader);\r\n    if (signature !== a && signature !== b) {\r\n        throw new Error(\"Invalid signature: '\".concat(signature, \"' at 0x\").concat(offset.toString(16)));\r\n    }\r\n}\r\nfunction readShortString(reader, length) {\r\n    var buffer = readBytes(reader, length);\r\n    var result = '';\r\n    for (var i = 0; i < buffer.length; i++) {\r\n        result += String.fromCharCode(buffer[i]);\r\n    }\r\n    return result;\r\n}\r\nfunction isValidSignature(sig) {\r\n    return sig === '8BIM' || sig === 'MeSa' || sig === 'AgHg' || sig === 'PHUT' || sig === 'DCSR';\r\n}\r\nexport function readPsd(reader, readOptions) {\r\n    var _a;\r\n    if (readOptions === void 0) { readOptions = {}; }\r\n    // header\r\n    checkSignature(reader, '8BPS');\r\n    var version = readUint16(reader);\r\n    if (version !== 1 && version !== 2)\r\n        throw new Error(\"Invalid PSD file version: \".concat(version));\r\n    skipBytes(reader, 6);\r\n    var channels = readUint16(reader);\r\n    var height = readUint32(reader);\r\n    var width = readUint32(reader);\r\n    var bitsPerChannel = readUint16(reader);\r\n    var colorMode = readUint16(reader);\r\n    var maxSize = version === 1 ? 30000 : 300000;\r\n    if (width > maxSize || height > maxSize)\r\n        throw new Error(\"Invalid size: \".concat(width, \"x\").concat(height));\r\n    if (channels > 16)\r\n        throw new Error(\"Invalid channel count: \".concat(channels));\r\n    if (![1, 8, 16, 32].includes(bitsPerChannel))\r\n        throw new Error(\"Invalid bitsPerChannel: \".concat(bitsPerChannel));\r\n    if (supportedColorModes.indexOf(colorMode) === -1)\r\n        throw new Error(\"Color mode not supported: \".concat((_a = colorModes[colorMode]) !== null && _a !== void 0 ? _a : colorMode));\r\n    var psd = { width: width, height: height, channels: channels, bitsPerChannel: bitsPerChannel, colorMode: colorMode };\r\n    Object.assign(reader, readOptions);\r\n    reader.large = version === 2;\r\n    reader.globalAlpha = false;\r\n    // color mode data\r\n    readSection(reader, 1, function (left) {\r\n        if (!left())\r\n            return;\r\n        if (colorMode === 2 /* ColorMode.Indexed */) {\r\n            // should have 256 colors here saved as 8bit channels RGB\r\n            if (left() != 768)\r\n                throw new Error('Invalid color palette size');\r\n            psd.palette = [];\r\n            for (var i = 0; i < 256; i++)\r\n                psd.palette.push({ r: readUint8(reader), g: 0, b: 0 });\r\n            for (var i = 0; i < 256; i++)\r\n                psd.palette[i].g = readUint8(reader);\r\n            for (var i = 0; i < 256; i++)\r\n                psd.palette[i].b = readUint8(reader);\r\n        }\r\n        else {\r\n            // TODO: unknown format for duotone, also seems to have some data here for 32bit colors\r\n            // if (options.throwForMissingFeatures) throw new Error('Color mode data not supported');\r\n        }\r\n        skipBytes(reader, left());\r\n    });\r\n    // image resources\r\n    var imageResources = {};\r\n    readSection(reader, 1, function (left) {\r\n        var _loop_1 = function () {\r\n            realignWithSignature(reader, isValidSignature);\r\n            var id = readUint16(reader);\r\n            readPascalString(reader, 2); // name\r\n            readSection(reader, 2, function (left) {\r\n                var handler = resourceHandlersMap[id];\r\n                var skip = id === 1036 && !!reader.skipThumbnail;\r\n                if (handler && !skip) {\r\n                    try {\r\n                        handler.read(reader, imageResources, left);\r\n                    }\r\n                    catch (e) {\r\n                        if (reader.throwForMissingFeatures)\r\n                            throw e;\r\n                        skipBytes(reader, left());\r\n                    }\r\n                }\r\n                else {\r\n                    // options.logMissingFeatures && console.log(`Unhandled image resource: ${id} (${left()})`);\r\n                    skipBytes(reader, left());\r\n                }\r\n            });\r\n        };\r\n        while (left() > 0) {\r\n            _loop_1();\r\n        }\r\n    });\r\n    var layersGroup = imageResources.layersGroup, layerGroupsEnabledId = imageResources.layerGroupsEnabledId, rest = __rest(imageResources, [\"layersGroup\", \"layerGroupsEnabledId\"]);\r\n    if (Object.keys(rest)) {\r\n        psd.imageResources = rest;\r\n    }\r\n    // layer and mask info\r\n    readSection(reader, 1, function (left) {\r\n        readSection(reader, 2, function (left) {\r\n            readLayerInfo(reader, psd, imageResources);\r\n            skipBytes(reader, left());\r\n        }, undefined, reader.large);\r\n        // SAI does not include this section\r\n        if (left() > 0) {\r\n            var globalLayerMaskInfo = readGlobalLayerMaskInfo(reader);\r\n            if (globalLayerMaskInfo)\r\n                psd.globalLayerMaskInfo = globalLayerMaskInfo;\r\n        }\r\n        else {\r\n            // revert back to end of section if exceeded section limits\r\n            // opt.logMissingFeatures && console.log('reverting to end of section');\r\n            skipBytes(reader, left());\r\n        }\r\n        while (left() > 0) {\r\n            // sometimes there are empty bytes here\r\n            while (left() && peekUint8(reader) === 0) {\r\n                // opt.logMissingFeatures && console.log('skipping 0 byte');\r\n                skipBytes(reader, 1);\r\n            }\r\n            if (left() >= 12) {\r\n                readAdditionalLayerInfo(reader, psd, psd, imageResources);\r\n            }\r\n            else {\r\n                // opt.logMissingFeatures && console.log('skipping leftover bytes', left());\r\n                skipBytes(reader, left());\r\n            }\r\n        }\r\n    }, undefined, reader.large);\r\n    var hasChildren = psd.children && psd.children.length;\r\n    var skipComposite = reader.skipCompositeImageData && (reader.skipLayerImageData || hasChildren);\r\n    if (!skipComposite) {\r\n        readImageData(reader, psd);\r\n    }\r\n    // TODO: show converted color mode instead of original PSD file color mode\r\n    //       but add option to preserve file color mode (need to return image data instead of canvas in that case)\r\n    // psd.colorMode = ColorMode.RGB; // we convert all color modes to RGB\r\n    return psd;\r\n}\r\nexport function readLayerInfo(reader, psd, imageResources) {\r\n    var _a, _b;\r\n    var _c = imageResources.layersGroup, layersGroup = _c === void 0 ? [] : _c, _d = imageResources.layerGroupsEnabledId, layerGroupsEnabledId = _d === void 0 ? [] : _d;\r\n    var layerCount = readInt16(reader);\r\n    if (layerCount < 0) {\r\n        reader.globalAlpha = true;\r\n        layerCount = -layerCount;\r\n    }\r\n    var layers = [];\r\n    var layerChannels = [];\r\n    for (var i = 0; i < layerCount; i++) {\r\n        var _e = readLayerRecord(reader, psd, imageResources), layer = _e.layer, channels = _e.channels;\r\n        if (layersGroup[i] !== undefined)\r\n            layer.linkGroup = layersGroup[i];\r\n        if (layerGroupsEnabledId[i] !== undefined)\r\n            layer.linkGroupEnabled = !!layerGroupsEnabledId[i];\r\n        layers.push(layer);\r\n        layerChannels.push(channels);\r\n    }\r\n    for (var i = 0; i < layerCount; i++) {\r\n        readLayerChannelImageData(reader, psd, layers[i], layerChannels[i]);\r\n    }\r\n    if (!psd.children)\r\n        psd.children = [];\r\n    var stack = [psd];\r\n    for (var i = layers.length - 1; i >= 0; i--) {\r\n        var l = layers[i];\r\n        var type = l.sectionDivider ? l.sectionDivider.type : 0 /* SectionDividerType.Other */;\r\n        if (type === 1 /* SectionDividerType.OpenFolder */ || type === 2 /* SectionDividerType.ClosedFolder */) {\r\n            l.opened = type === 1 /* SectionDividerType.OpenFolder */;\r\n            l.children = [];\r\n            if ((_a = l.sectionDivider) === null || _a === void 0 ? void 0 : _a.key) {\r\n                l.blendMode = (_b = toBlendMode[l.sectionDivider.key]) !== null && _b !== void 0 ? _b : l.blendMode;\r\n            }\r\n            stack[stack.length - 1].children.unshift(l);\r\n            stack.push(l);\r\n        }\r\n        else if (type === 3 /* SectionDividerType.BoundingSectionDivider */) {\r\n            stack.pop();\r\n            // this was workaround because I didn't know what `lsdk` section was, now it's probably not needed anymore\r\n            // } else if (l.name === '</Layer group>' && !l.sectionDivider && !l.top && !l.left && !l.bottom && !l.right) {\r\n            // \t// sometimes layer group terminator doesn't have sectionDivider, so we just guess here (PS bug ?)\r\n            // \tstack.pop();\r\n        }\r\n        else {\r\n            stack[stack.length - 1].children.unshift(l);\r\n        }\r\n    }\r\n}\r\nfunction readLayerRecord(reader, psd, imageResources) {\r\n    var layer = {};\r\n    layer.top = readInt32(reader);\r\n    layer.left = readInt32(reader);\r\n    layer.bottom = readInt32(reader);\r\n    layer.right = readInt32(reader);\r\n    var channelCount = readUint16(reader);\r\n    var channels = [];\r\n    for (var i = 0; i < channelCount; i++) {\r\n        var id = readInt16(reader);\r\n        var length_1 = readUint32(reader);\r\n        if (reader.large) {\r\n            if (length_1 !== 0)\r\n                throw new Error('Sizes larger than 4GB are not supported');\r\n            length_1 = readUint32(reader);\r\n        }\r\n        channels.push({ id: id, length: length_1 });\r\n    }\r\n    checkSignature(reader, '8BIM');\r\n    var blendMode = readSignature(reader);\r\n    if (!toBlendMode[blendMode])\r\n        throw new Error(\"Invalid blend mode: '\".concat(blendMode, \"'\"));\r\n    layer.blendMode = toBlendMode[blendMode];\r\n    layer.opacity = readUint8(reader) / 0xff;\r\n    layer.clipping = readUint8(reader) === 1;\r\n    var flags = readUint8(reader);\r\n    layer.transparencyProtected = (flags & 0x01) !== 0;\r\n    layer.hidden = (flags & 0x02) !== 0;\r\n    if (flags & 0x20)\r\n        layer.effectsOpen = true;\r\n    // 0x04 - obsolete\r\n    // 0x08 - 1 for Photoshop 5.0 and later, tells if bit 4 has useful information\r\n    // 0x10 - pixel data irrelevant to appearance of document\r\n    // 0x20 - effects/filters panel is expanded\r\n    skipBytes(reader, 1);\r\n    readSection(reader, 1, function (left) {\r\n        readLayerMaskData(reader, layer);\r\n        var blendingRanges = readLayerBlendingRanges(reader);\r\n        if (blendingRanges)\r\n            layer.blendingRanges = blendingRanges;\r\n        layer.name = readPascalString(reader, 1); // should be padded to 4, but is not sometimes\r\n        // HACK: fix for sometimes layer.name string not being padded correctly, just skip until we get valid signature\r\n        while (left() > 4 && !validSignatureAt(reader, reader.offset))\r\n            reader.offset++;\r\n        while (left() >= 12)\r\n            readAdditionalLayerInfo(reader, layer, psd, imageResources);\r\n        skipBytes(reader, left());\r\n    });\r\n    return { layer: layer, channels: channels };\r\n}\r\nfunction readLayerMaskData(reader, layer) {\r\n    return readSection(reader, 1, function (left) {\r\n        if (!left())\r\n            return undefined;\r\n        var mask = {};\r\n        layer.mask = mask;\r\n        mask.top = readInt32(reader);\r\n        mask.left = readInt32(reader);\r\n        mask.bottom = readInt32(reader);\r\n        mask.right = readInt32(reader);\r\n        mask.defaultColor = readUint8(reader);\r\n        var flags = readUint8(reader);\r\n        mask.positionRelativeToLayer = (flags & 1 /* LayerMaskFlags.PositionRelativeToLayer */) !== 0;\r\n        mask.disabled = (flags & 2 /* LayerMaskFlags.LayerMaskDisabled */) !== 0;\r\n        mask.fromVectorData = (flags & 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */) !== 0;\r\n        if (left() >= 18) {\r\n            var realMask = {};\r\n            layer.realMask = realMask;\r\n            var realFlags = readUint8(reader);\r\n            realMask.positionRelativeToLayer = (realFlags & 1 /* LayerMaskFlags.PositionRelativeToLayer */) !== 0;\r\n            realMask.disabled = (realFlags & 2 /* LayerMaskFlags.LayerMaskDisabled */) !== 0;\r\n            realMask.fromVectorData = (realFlags & 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */) !== 0;\r\n            realMask.defaultColor = readUint8(reader); // Real user mask background. 0 or 255.\r\n            realMask.top = readInt32(reader);\r\n            realMask.left = readInt32(reader);\r\n            realMask.bottom = readInt32(reader);\r\n            realMask.right = readInt32(reader);\r\n        }\r\n        if (flags & 16 /* LayerMaskFlags.MaskHasParametersAppliedToIt */) {\r\n            var params = readUint8(reader);\r\n            if (params & 1 /* MaskParams.UserMaskDensity */)\r\n                mask.userMaskDensity = readUint8(reader) / 0xff;\r\n            if (params & 2 /* MaskParams.UserMaskFeather */)\r\n                mask.userMaskFeather = readFloat64(reader);\r\n            if (params & 4 /* MaskParams.VectorMaskDensity */)\r\n                mask.vectorMaskDensity = readUint8(reader) / 0xff;\r\n            if (params & 8 /* MaskParams.VectorMaskFeather */)\r\n                mask.vectorMaskFeather = readFloat64(reader);\r\n        }\r\n        skipBytes(reader, left());\r\n    });\r\n}\r\nfunction readBlendingRange(reader) {\r\n    return [readUint8(reader), readUint8(reader), readUint8(reader), readUint8(reader)];\r\n}\r\nfunction readLayerBlendingRanges(reader) {\r\n    return readSection(reader, 1, function (left) {\r\n        var compositeGrayBlendSource = readBlendingRange(reader);\r\n        var compositeGraphBlendDestinationRange = readBlendingRange(reader);\r\n        var ranges = [];\r\n        while (left() > 0) {\r\n            var sourceRange = readBlendingRange(reader);\r\n            var destRange = readBlendingRange(reader);\r\n            ranges.push({ sourceRange: sourceRange, destRange: destRange });\r\n        }\r\n        return { compositeGrayBlendSource: compositeGrayBlendSource, compositeGraphBlendDestinationRange: compositeGraphBlendDestinationRange, ranges: ranges };\r\n    });\r\n}\r\nfunction readLayerChannelImageData(reader, psd, layer, channels) {\r\n    if (reader.skipLayerImageData)\r\n        return;\r\n    var _a = psd.colorMode, colorMode = _a === void 0 ? 3 /* ColorMode.RGB */ : _a, _b = psd.bitsPerChannel, bitsPerChannel = _b === void 0 ? 8 : _b;\r\n    layer.rawData = { colorMode: colorMode, bitsPerChannel: bitsPerChannel, channels: [], large: reader.large };\r\n    for (var _i = 0, channels_1 = channels; _i < channels_1.length; _i++) {\r\n        var channel = channels_1[_i];\r\n        var start = reader.offset;\r\n        var compression = 0 /* Compression.RawData */;\r\n        var data = undefined;\r\n        if (channel.length === 1)\r\n            throw new Error('Invalid channel length');\r\n        if (channel.length) {\r\n            compression = readUint16(reader);\r\n            // try to fix broken files where there's 1 byte shift of channel\r\n            if (compression > 3) {\r\n                reader.offset -= 1;\r\n                compression = readUint16(reader);\r\n            }\r\n            // try to fix broken files where there's 1 byte shift of channel\r\n            if (compression > 3) {\r\n                reader.offset -= 3;\r\n                compression = readUint16(reader);\r\n            }\r\n            if (compression > 3)\r\n                throw new Error(\"Invalid compression: \".concat(compression));\r\n            if (channel.length > 2) {\r\n                data = readBytes(reader, channel.length - 2);\r\n            }\r\n        }\r\n        reader.offset = start + channel.length;\r\n        layer.rawData.channels.push({ id: channel.id, compression: compression, data: data });\r\n    }\r\n    if (!reader.useRawData) {\r\n        decodeLayerImageData(layer, !!reader.useImageData, !!reader.throwForMissingFeatures);\r\n    }\r\n}\r\nfunction resetAlpha(_a, cmyk) {\r\n    var data = _a.data;\r\n    var alpha = (data instanceof Float32Array) ? 1.0 : ((data instanceof Uint16Array) ? 0xffff : 0xff);\r\n    var offset = (cmyk ? 4 : 3) | 0;\r\n    var length = data.length | 0;\r\n    var step = (cmyk ? 5 : 4) | 0;\r\n    for (var p = offset; p < length; p = (p + step) | 0) {\r\n        data[p] = alpha;\r\n    }\r\n}\r\nexport function decodeLayerImageData(layer, useImageData, throwForMissingFeatures) {\r\n    if (!layer.rawData)\r\n        return;\r\n    var _a = layer.rawData, colorMode = _a.colorMode, bitsPerChannel = _a.bitsPerChannel, channels = _a.channels, large = _a.large;\r\n    var layerWidth = (layer.right || 0) - (layer.left || 0);\r\n    var layerHeight = (layer.bottom || 0) - (layer.top || 0);\r\n    var cmyk = colorMode === 4 /* ColorMode.CMYK */;\r\n    var imageData;\r\n    var initializedAlpha = false;\r\n    if (layerWidth && layerHeight) {\r\n        if (cmyk) {\r\n            if (bitsPerChannel !== 8)\r\n                throw new Error('bitsPerChannel Not supproted');\r\n            imageData = { width: layerWidth, height: layerHeight, data: new Uint8ClampedArray(layerWidth * layerHeight * 5) };\r\n        }\r\n        else {\r\n            imageData = createImageDataBitDepth(layerWidth, layerHeight, bitsPerChannel);\r\n        }\r\n    }\r\n    if (RAW_IMAGE_DATA) { // TODO: use layer.rawData instead\r\n        layer.imageDataRaw = [];\r\n        layer.imageDataRawCompression = [];\r\n    }\r\n    for (var _i = 0, channels_2 = channels; _i < channels_2.length; _i++) {\r\n        var _b = channels_2[_i], id = _b.id, compression = _b.compression, data = _b.data;\r\n        if (!data)\r\n            continue;\r\n        var dataReader = createReader(data.buffer, data.byteOffset, data.byteLength);\r\n        if (id === -2 /* ChannelID.UserMask */ || id === -3 /* ChannelID.RealUserMask */) {\r\n            var mask = id === -2 /* ChannelID.UserMask */ ? layer.mask : layer.realMask;\r\n            if (!mask)\r\n                throw new Error(\"Missing layer \".concat(id === -2 /* ChannelID.UserMask */ ? 'mask' : 'real mask', \" data\"));\r\n            var maskWidth = (mask.right || 0) - (mask.left || 0);\r\n            var maskHeight = (mask.bottom || 0) - (mask.top || 0);\r\n            if (maskWidth < 0 || maskHeight < 0 || maskWidth > 30000 || maskHeight > 30000)\r\n                throw new Error('Invalid mask size');\r\n            if (maskWidth && maskHeight) {\r\n                var maskData = createImageDataBitDepth(maskWidth, maskHeight, bitsPerChannel);\r\n                readData(dataReader, data.byteLength, maskData, compression, maskWidth, maskHeight, bitsPerChannel, 0, large, 4);\r\n                if (RAW_IMAGE_DATA) { // TODO: use layer.rawData instead\r\n                    if (id === -2 /* ChannelID.UserMask */) {\r\n                        layer.maskDataRawCompression = compression;\r\n                        layer.maskDataRaw = data;\r\n                    }\r\n                    else {\r\n                        layer.realMaskDataRawCompression = compression;\r\n                        layer.realMaskDataRaw = data;\r\n                    }\r\n                }\r\n                setupGrayscale(maskData);\r\n                resetAlpha(maskData, false);\r\n                if (useImageData) {\r\n                    mask.imageData = maskData;\r\n                }\r\n                else {\r\n                    mask.canvas = imageDataToCanvas(maskData);\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            var offset = offsetForChannel(id, cmyk);\r\n            var targetData = imageData;\r\n            if (offset < 0) {\r\n                targetData = undefined;\r\n                if (throwForMissingFeatures) {\r\n                    throw new Error(\"Channel not supported: \".concat(id));\r\n                }\r\n            }\r\n            readData(dataReader, data.byteLength, targetData, compression, layerWidth, layerHeight, bitsPerChannel, offset, large, cmyk ? 5 : 4);\r\n            if (RAW_IMAGE_DATA) { // TODO: use layer.rawData instead\r\n                layer.imageDataRawCompression[id] = compression;\r\n                layer.imageDataRaw[id] = data;\r\n            }\r\n            if (targetData && colorMode === 1 /* ColorMode.Grayscale */) {\r\n                setupGrayscale(targetData);\r\n            }\r\n        }\r\n        if (id === -1 /* ChannelID.Transparency */) {\r\n            initializedAlpha = true;\r\n        }\r\n    }\r\n    if (imageData) {\r\n        if (!initializedAlpha)\r\n            resetAlpha(imageData, cmyk);\r\n        if (cmyk) {\r\n            var cmykData = imageData;\r\n            imageData = createImageData(cmykData.width, cmykData.height);\r\n            cmykToRgb(cmykData, imageData, false);\r\n        }\r\n        if (useImageData) {\r\n            layer.imageData = imageData;\r\n        }\r\n        else {\r\n            layer.canvas = imageDataToCanvas(imageData);\r\n        }\r\n    }\r\n    delete layer.rawData;\r\n}\r\nfunction readData(reader, length, pixels, compression, width, height, bitDepth, offset, large, step) {\r\n    if (!length)\r\n        return;\r\n    if (compression === 0 /* Compression.RawData */) {\r\n        if (length !== (width * height * Math.floor(bitDepth / 8))) {\r\n            reader.log(\"Invalid length (\".concat(length, \", \").concat(width * height * Math.floor(bitDepth / 8), \")\"));\r\n        }\r\n        var data = readBytes(reader, length);\r\n        readDataRaw(data, pixels, bitDepth, step, offset);\r\n    }\r\n    else if (compression === 1 /* Compression.RleCompressed */) {\r\n        // const reader = createReader(data.buffer, data.byteOffset, data.byteLength);\r\n        readDataRLE(reader, pixels, width, height, bitDepth, step, [offset], large);\r\n    }\r\n    else if (compression === 2 /* Compression.ZipWithoutPrediction */) {\r\n        var data = readBytes(reader, length);\r\n        readDataZip(data, pixels, width, height, bitDepth, step, offset, false);\r\n    }\r\n    else if (compression === 3 /* Compression.ZipWithPrediction */) {\r\n        var data = readBytes(reader, length);\r\n        readDataZip(data, pixels, width, height, bitDepth, step, offset, true);\r\n    }\r\n    else {\r\n        throw new Error(\"Invalid Compression type: \".concat(compression));\r\n    }\r\n}\r\nexport function readGlobalLayerMaskInfo(reader) {\r\n    return readSection(reader, 1, function (left) {\r\n        if (!left())\r\n            return undefined;\r\n        var overlayColorSpace = readUint16(reader);\r\n        var colorSpace1 = readUint16(reader);\r\n        var colorSpace2 = readUint16(reader);\r\n        var colorSpace3 = readUint16(reader);\r\n        var colorSpace4 = readUint16(reader);\r\n        var opacity = readUint16(reader) / 0xff;\r\n        var kind = readUint8(reader);\r\n        skipBytes(reader, left()); // 3 bytes of padding ?\r\n        return { overlayColorSpace: overlayColorSpace, colorSpace1: colorSpace1, colorSpace2: colorSpace2, colorSpace3: colorSpace3, colorSpace4: colorSpace4, opacity: opacity, kind: kind };\r\n    });\r\n}\r\nvar fixOffsets = [0, 1, -1, 2, -2, 3, -3, 4, -4];\r\nfunction realignWithSignature(reader, isValid) {\r\n    var sigOffset = reader.offset;\r\n    var sig = '';\r\n    // attempt to fix broken document by realigning with the signature\r\n    for (var _i = 0, fixOffsets_1 = fixOffsets; _i < fixOffsets_1.length; _i++) {\r\n        var offset = fixOffsets_1[_i];\r\n        try {\r\n            reader.offset = sigOffset + offset;\r\n            sig = readSignature(reader);\r\n        }\r\n        catch (_a) { }\r\n        if (isValid(sig))\r\n            break;\r\n    }\r\n    if (!isValid(sig)) {\r\n        throw new Error(\"Invalid signature: '\".concat(sig, \"' at 0x\").concat((sigOffset).toString(16)));\r\n    }\r\n    return sig;\r\n}\r\nfunction isValidAdditionalInfoSignature(sig) {\r\n    return sig === '8BIM' || sig === '8B64';\r\n}\r\nexport function readAdditionalLayerInfo(reader, target, psd, imageResources) {\r\n    var sig = realignWithSignature(reader, isValidAdditionalInfoSignature);\r\n    var key = readSignature(reader);\r\n    // `largeAdditionalInfoKeys` fallback, because some keys don't have 8B64 signature even when they are 64bit\r\n    var u64 = sig === '8B64' || (reader.large && largeAdditionalInfoKeys.indexOf(key) !== -1);\r\n    readSection(reader, 2, function (left) {\r\n        var handler = infoHandlersMap[key];\r\n        if (handler) {\r\n            try {\r\n                handler.read(reader, target, left, psd, imageResources);\r\n            }\r\n            catch (e) {\r\n                if (reader.throwForMissingFeatures)\r\n                    throw e;\r\n            }\r\n        }\r\n        else {\r\n            reader.logMissingFeatures && reader.log(\"Unhandled additional info: \".concat(key));\r\n            skipBytes(reader, left());\r\n        }\r\n        if (left()) {\r\n            reader.logMissingFeatures && reader.log(\"Unread \".concat(left(), \" bytes left for additional info: \").concat(key));\r\n            skipBytes(reader, left());\r\n        }\r\n    }, false, u64);\r\n}\r\nexport function createImageDataBitDepth(width, height, bitDepth, channels) {\r\n    if (channels === void 0) { channels = 4; }\r\n    if (bitDepth === 1 || bitDepth === 8) {\r\n        if (channels === 4) {\r\n            return createImageData(width, height);\r\n        }\r\n        else {\r\n            return { width: width, height: height, data: new Uint8ClampedArray(width * height * channels) };\r\n        }\r\n    }\r\n    else if (bitDepth === 16) {\r\n        return { width: width, height: height, data: new Uint16Array(width * height * channels) };\r\n    }\r\n    else if (bitDepth === 32) {\r\n        return { width: width, height: height, data: new Float32Array(width * height * channels) };\r\n    }\r\n    else {\r\n        throw new Error(\"Invalid bitDepth (\".concat(bitDepth, \")\"));\r\n    }\r\n}\r\nfunction readImageData(reader, psd) {\r\n    var _a;\r\n    var compression = readUint16(reader);\r\n    var bitsPerChannel = (_a = psd.bitsPerChannel) !== null && _a !== void 0 ? _a : 8;\r\n    if (supportedColorModes.indexOf(psd.colorMode) === -1)\r\n        throw new Error(\"Color mode not supported: \".concat(psd.colorMode));\r\n    if (compression !== 0 /* Compression.RawData */ && compression !== 1 /* Compression.RleCompressed */)\r\n        throw new Error(\"Compression type not supported: \".concat(compression));\r\n    var imageData = createImageDataBitDepth(psd.width, psd.height, bitsPerChannel);\r\n    resetImageData(imageData);\r\n    switch (psd.colorMode) {\r\n        case 0 /* ColorMode.Bitmap */: {\r\n            if (bitsPerChannel !== 1)\r\n                throw new Error('Invalid bitsPerChannel for bitmap color mode');\r\n            var bytes = void 0;\r\n            if (compression === 0 /* Compression.RawData */) {\r\n                bytes = readBytes(reader, Math.ceil(psd.width / 8) * psd.height);\r\n            }\r\n            else if (compression === 1 /* Compression.RleCompressed */) {\r\n                bytes = new Uint8Array(psd.width * psd.height);\r\n                readDataRLE(reader, { data: bytes, width: psd.width, height: psd.height }, psd.width, psd.height, 8, 1, [0], reader.large);\r\n            }\r\n            else {\r\n                throw new Error(\"Bitmap compression not supported: \".concat(compression));\r\n            }\r\n            decodeBitmap(bytes, imageData.data, psd.width, psd.height);\r\n            break;\r\n        }\r\n        case 3 /* ColorMode.RGB */:\r\n        case 1 /* ColorMode.Grayscale */: {\r\n            var channels = psd.colorMode === 1 /* ColorMode.Grayscale */ ? [0] : [0, 1, 2];\r\n            if (psd.channels && psd.channels > 3) {\r\n                for (var i = 3; i < psd.channels; i++) {\r\n                    // TODO: store these channels in additional image data\r\n                    channels.push(i);\r\n                }\r\n            }\r\n            else if (reader.globalAlpha) {\r\n                channels.push(3);\r\n            }\r\n            if (compression === 0 /* Compression.RawData */) {\r\n                for (var i = 0; i < channels.length; i++) {\r\n                    var data = readBytes(reader, psd.width * psd.height * Math.floor(bitsPerChannel / 8));\r\n                    readDataRaw(data, imageData, bitsPerChannel, 4, channels[i]);\r\n                }\r\n            }\r\n            else if (compression === 1 /* Compression.RleCompressed */) {\r\n                var start = reader.offset;\r\n                readDataRLE(reader, imageData, psd.width, psd.height, bitsPerChannel, 4, channels, reader.large);\r\n                if (RAW_IMAGE_DATA)\r\n                    psd.imageDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start, reader.offset - start);\r\n            }\r\n            if (psd.colorMode === 1 /* ColorMode.Grayscale */) {\r\n                setupGrayscale(imageData);\r\n            }\r\n            break;\r\n        }\r\n        case 2 /* ColorMode.Indexed */: {\r\n            if (bitsPerChannel !== 8)\r\n                throw new Error('bitsPerChannel Not supproted');\r\n            if (psd.channels !== 1)\r\n                throw new Error('Invalid channel count');\r\n            if (!psd.palette)\r\n                throw new Error('Missing color palette');\r\n            if (compression === 0 /* Compression.RawData */) {\r\n                throw new Error(\"Not implemented\");\r\n            }\r\n            else if (compression === 1 /* Compression.RleCompressed */) {\r\n                var indexedImageData = {\r\n                    width: imageData.width,\r\n                    height: imageData.height,\r\n                    data: new Uint8Array(imageData.width * imageData.height),\r\n                };\r\n                readDataRLE(reader, indexedImageData, psd.width, psd.height, bitsPerChannel, 1, [0], reader.large);\r\n                indexedToRgb(indexedImageData, imageData, psd.palette);\r\n            }\r\n            else {\r\n                throw new Error(\"Not implemented\");\r\n            }\r\n            break;\r\n        }\r\n        case 4 /* ColorMode.CMYK */: {\r\n            if (bitsPerChannel !== 8)\r\n                throw new Error('bitsPerChannel Not supproted');\r\n            if (psd.channels !== 4)\r\n                throw new Error(\"Invalid channel count\");\r\n            var channels = [0, 1, 2, 3];\r\n            if (reader.globalAlpha)\r\n                channels.push(4);\r\n            if (compression === 0 /* Compression.RawData */) {\r\n                throw new Error(\"Not implemented\");\r\n                // TODO: ...\r\n                // for (let i = 0; i < channels.length; i++) {\r\n                // \treadDataRaw(reader, imageData, channels[i], psd.width, psd.height);\r\n                // }\r\n            }\r\n            else if (compression === 1 /* Compression.RleCompressed */) {\r\n                var cmykImageData = {\r\n                    width: imageData.width,\r\n                    height: imageData.height,\r\n                    data: new Uint8Array(imageData.width * imageData.height * 5),\r\n                };\r\n                var start = reader.offset;\r\n                readDataRLE(reader, cmykImageData, psd.width, psd.height, bitsPerChannel, 5, channels, reader.large);\r\n                cmykToRgb(cmykImageData, imageData, true);\r\n                if (RAW_IMAGE_DATA)\r\n                    psd.imageDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start, reader.offset - start);\r\n            }\r\n            else {\r\n                throw new Error(\"Not implemented\");\r\n            }\r\n            break;\r\n        }\r\n        default: throw new Error(\"Color mode not supported: \".concat(psd.colorMode));\r\n    }\r\n    // remove weird white matte\r\n    if (reader.globalAlpha) {\r\n        if (psd.bitsPerChannel !== 8)\r\n            throw new Error('bitsPerChannel Not supproted');\r\n        var p = imageData.data;\r\n        var size = imageData.width * imageData.height * 4;\r\n        for (var i = 0; i < size; i += 4) {\r\n            var pa = p[i + 3];\r\n            if (pa != 0 && pa != 255) {\r\n                var a = pa / 255;\r\n                var ra = 1 / a;\r\n                var invA = 255 * (1 - ra);\r\n                p[i + 0] = p[i + 0] * ra + invA;\r\n                p[i + 1] = p[i + 1] * ra + invA;\r\n                p[i + 2] = p[i + 2] * ra + invA;\r\n            }\r\n        }\r\n    }\r\n    if (reader.useImageData) {\r\n        psd.imageData = imageData;\r\n    }\r\n    else {\r\n        psd.canvas = imageDataToCanvas(imageData);\r\n    }\r\n}\r\nfunction cmykToRgb(cmyk, rgb, reverseAlpha) {\r\n    var size = rgb.width * rgb.height * 4;\r\n    var srcData = cmyk.data;\r\n    var dstData = rgb.data;\r\n    for (var src = 0, dst = 0; dst < size; src += 5, dst += 4) {\r\n        var c = srcData[src];\r\n        var m = srcData[src + 1];\r\n        var y = srcData[src + 2];\r\n        var k = srcData[src + 3];\r\n        dstData[dst] = ((((c * k) | 0) / 255) | 0);\r\n        dstData[dst + 1] = ((((m * k) | 0) / 255) | 0);\r\n        dstData[dst + 2] = ((((y * k) | 0) / 255) | 0);\r\n        dstData[dst + 3] = reverseAlpha ? 255 - srcData[src + 4] : srcData[src + 4];\r\n    }\r\n    // for (let src = 0, dst = 0; dst < size; src += 5, dst += 4) {\r\n    // \tconst c = 1 - (srcData[src + 0] / 255);\r\n    // \tconst m = 1 - (srcData[src + 1] / 255);\r\n    // \tconst y = 1 - (srcData[src + 2] / 255);\r\n    // \t// const k = srcData[src + 3] / 255;\r\n    // \tdstData[dst + 0] = ((1 - c * 0.8) * 255) | 0;\r\n    // \tdstData[dst + 1] = ((1 - m * 0.8) * 255) | 0;\r\n    // \tdstData[dst + 2] = ((1 - y * 0.8) * 255) | 0;\r\n    // \tdstData[dst + 3] = reverseAlpha ? 255 - srcData[src + 4] : srcData[src + 4];\r\n    // }\r\n}\r\nfunction indexedToRgb(indexed, rgb, palette) {\r\n    var size = indexed.width * indexed.height;\r\n    var srcData = indexed.data;\r\n    var dstData = rgb.data;\r\n    for (var src = 0, dst = 0; src < size; src++, dst += 4) {\r\n        var c = palette[srcData[src]];\r\n        dstData[dst + 0] = c.r;\r\n        dstData[dst + 1] = c.g;\r\n        dstData[dst + 2] = c.b;\r\n        dstData[dst + 3] = 255;\r\n    }\r\n}\r\nfunction verifyCompatible(a, b) {\r\n    if ((a.byteLength / a.length) !== (b.byteLength / b.length)) {\r\n        throw new Error('Invalid array types');\r\n    }\r\n}\r\nfunction bytesToArray(bytes, bitDepth) {\r\n    if (bitDepth === 8) {\r\n        return bytes;\r\n    }\r\n    else if (bitDepth === 16) {\r\n        // PSD files store 16-bit channel data in big-endian byte order.\r\n        // Swap each pair of bytes so that Uint16Array (native-endian) reads the correct values.\r\n        for (var i = 0; i < bytes.byteLength; i += 2) {\r\n            var tmp = bytes[i];\r\n            bytes[i] = bytes[i + 1];\r\n            bytes[i + 1] = tmp;\r\n        }\r\n        if (bytes.byteOffset % 2) {\r\n            var result = new Uint16Array(bytes.byteLength / 2);\r\n            new Uint8Array(result.buffer, result.byteOffset, result.byteLength).set(bytes);\r\n            return result;\r\n        }\r\n        else {\r\n            return new Uint16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 2);\r\n        }\r\n    }\r\n    else if (bitDepth === 32) {\r\n        if (bytes.byteOffset % 4) {\r\n            var result = new Float32Array(bytes.byteLength / 4);\r\n            new Uint8Array(result.buffer, result.byteOffset, result.byteLength).set(bytes);\r\n            return result;\r\n        }\r\n        else {\r\n            return new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);\r\n        }\r\n    }\r\n    else {\r\n        throw new Error(\"Invalid bitDepth (\".concat(bitDepth, \")\"));\r\n    }\r\n}\r\nfunction copyChannelToPixelData(pixelData, channel, offset, step) {\r\n    verifyCompatible(pixelData.data, channel);\r\n    var size = pixelData.width * pixelData.height;\r\n    var data = pixelData.data;\r\n    for (var i = 0, p = offset | 0; i < size; i++, p = (p + step) | 0) {\r\n        data[p] = channel[i];\r\n    }\r\n}\r\nfunction readDataRaw(buffer, pixelData, bitDepth, step, offset) {\r\n    if (bitDepth == 32) {\r\n        for (var i = 0; i < buffer.byteLength; i += 4) {\r\n            var a = buffer[i + 0];\r\n            var b = buffer[i + 1];\r\n            var c = buffer[i + 2];\r\n            var d = buffer[i + 3];\r\n            buffer[i + 0] = d;\r\n            buffer[i + 1] = c;\r\n            buffer[i + 2] = b;\r\n            buffer[i + 3] = a;\r\n        }\r\n    }\r\n    var array = bytesToArray(buffer, bitDepth);\r\n    if (pixelData && offset < step) {\r\n        copyChannelToPixelData(pixelData, array, offset, step);\r\n    }\r\n}\r\nfunction decodePredicted(data, width, height, mod) {\r\n    for (var y = 0; y < height; y++) {\r\n        var offset = y * width;\r\n        for (var x = 1, o = offset + 1; x < width; x++, o++) {\r\n            data[o] = (data[o - 1] + data[o]) % mod;\r\n        }\r\n    }\r\n}\r\nexport function readDataZip(compressed, pixelData, width, height, bitDepth, step, offset, prediction) {\r\n    var decompressed = inflateSync(compressed);\r\n    if (pixelData && offset < step) {\r\n        var array = bytesToArray(decompressed, bitDepth);\r\n        if (bitDepth === 8) {\r\n            if (prediction)\r\n                decodePredicted(decompressed, width, height, 0x100);\r\n            copyChannelToPixelData(pixelData, decompressed, offset, step);\r\n        }\r\n        else if (bitDepth === 16) {\r\n            if (prediction)\r\n                decodePredicted(array, width, height, 0x10000);\r\n            copyChannelToPixelData(pixelData, array, offset, step);\r\n        }\r\n        else if (bitDepth === 32) {\r\n            if (prediction)\r\n                decodePredicted(decompressed, width * 4, height, 0x100);\r\n            var di = offset;\r\n            var dst = new Uint32Array(pixelData.data.buffer, pixelData.data.byteOffset, pixelData.data.length);\r\n            for (var y = 0; y < height; y++) {\r\n                var a = width * 4 * y;\r\n                for (var x = 0; x < width; x++, a++, di += step) {\r\n                    var b = a + width;\r\n                    var c = b + width;\r\n                    var d = c + width;\r\n                    dst[di] = ((decompressed[a] << 24) | (decompressed[b] << 16) | (decompressed[c] << 8) | decompressed[d]) >>> 0;\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            throw new Error('Invalid bitDepth');\r\n        }\r\n    }\r\n}\r\nexport function readDataRLE(reader, pixelData, width, height, _bitDepth, step, offsets, large) {\r\n    var data = pixelData && pixelData.data;\r\n    var lengths;\r\n    if (large) {\r\n        lengths = new Uint32Array(offsets.length * height);\r\n        for (var o = 0, li = 0; o < offsets.length; o++) {\r\n            for (var y = 0; y < height; y++, li++) {\r\n                lengths[li] = readUint32(reader);\r\n            }\r\n        }\r\n    }\r\n    else {\r\n        lengths = new Uint16Array(offsets.length * height);\r\n        for (var o = 0, li = 0; o < offsets.length; o++) {\r\n            for (var y = 0; y < height; y++, li++) {\r\n                lengths[li] = readUint16(reader);\r\n            }\r\n        }\r\n    }\r\n    // if (bitDepth !== 1 && bitDepth !== 8) throw new Error(`Invalid bit depth (${bitDepth})`);\r\n    var extraLimit = (step - 1) | 0; // 3 for rgb, 4 for cmyk\r\n    for (var c = 0, li = 0; c < offsets.length; c++) {\r\n        var offset = offsets[c] | 0;\r\n        var extra = c > extraLimit || offset > extraLimit;\r\n        if (!data || extra) {\r\n            for (var y = 0; y < height; y++, li++) {\r\n                skipBytes(reader, lengths[li]);\r\n            }\r\n        }\r\n        else {\r\n            for (var y = 0, p = offset | 0; y < height; y++, li++) {\r\n                var length_2 = lengths[li];\r\n                var buffer = readBytes(reader, length_2);\r\n                for (var i = 0, x = 0; i < length_2; i++) {\r\n                    var header = buffer[i];\r\n                    if (header > 128) {\r\n                        var value = buffer[++i];\r\n                        header = (256 - header) | 0;\r\n                        for (var j = 0; j <= header && x < width; j = (j + 1) | 0, x = (x + 1) | 0) {\r\n                            data[p] = value;\r\n                            p = (p + step) | 0;\r\n                        }\r\n                    }\r\n                    else if (header < 128) {\r\n                        for (var j = 0; j <= header && x < width; j = (j + 1) | 0, x = (x + 1) | 0) {\r\n                            data[p] = buffer[++i];\r\n                            p = (p + step) | 0;\r\n                        }\r\n                    }\r\n                    else {\r\n                        // ignore 128\r\n                    }\r\n                    // This showed up on some images from non-photoshop programs, ignoring it seems to work just fine.\r\n                    // if (i >= length) throw new Error(`Invalid RLE data: exceeded buffer size ${i}/${length}`);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\nexport function readSection(reader, round, func, skipEmpty, eightBytes) {\r\n    if (skipEmpty === void 0) { skipEmpty = true; }\r\n    if (eightBytes === void 0) { eightBytes = false; }\r\n    var length = readUint32(reader);\r\n    if (eightBytes) {\r\n        if (length !== 0)\r\n            throw new Error('Sizes larger than 4GB are not supported');\r\n        length = readUint32(reader);\r\n    }\r\n    if (length <= 0 && skipEmpty)\r\n        return undefined;\r\n    var end = reader.offset + length;\r\n    if (end > reader.view.byteLength)\r\n        throw new Error('Section exceeds file size');\r\n    var result = func(function () { return end - reader.offset; });\r\n    if (reader.offset !== end) {\r\n        if (reader.offset > end) {\r\n            warnOrThrow(reader, 'Exceeded section limits');\r\n        }\r\n        else {\r\n            warnOrThrow(reader, \"Unread section data\"); // : ${end - reader.offset} bytes at 0x${reader.offset.toString(16)}`);\r\n        }\r\n    }\r\n    while (length % round) {\r\n        length++;\r\n        end++;\r\n    }\r\n    // while (end % round) end++;\r\n    reader.offset = end;\r\n    return result;\r\n}\r\nexport function readColor(reader) {\r\n    var colorSpace = readUint16(reader);\r\n    switch (colorSpace) {\r\n        case 0 /* ColorSpace.RGB */: {\r\n            var r = readUint16(reader) / 257;\r\n            var g = readUint16(reader) / 257;\r\n            var b = readUint16(reader) / 257;\r\n            skipBytes(reader, 2);\r\n            return { r: r, g: g, b: b };\r\n        }\r\n        case 1 /* ColorSpace.HSB */: {\r\n            var h = readUint16(reader) / 0xffff;\r\n            var s = readUint16(reader) / 0xffff;\r\n            var b = readUint16(reader) / 0xffff;\r\n            skipBytes(reader, 2);\r\n            return { h: h, s: s, b: b };\r\n        }\r\n        case 2 /* ColorSpace.CMYK */: {\r\n            var c = readUint16(reader) / 257;\r\n            var m = readUint16(reader) / 257;\r\n            var y = readUint16(reader) / 257;\r\n            var k = readUint16(reader) / 257;\r\n            return { c: c, m: m, y: y, k: k };\r\n        }\r\n        case 7 /* ColorSpace.Lab */: {\r\n            var l = readInt16(reader) / 10000;\r\n            var ta = readInt16(reader);\r\n            var tb = readInt16(reader);\r\n            var a = ta < 0 ? (ta / 12800) : (ta / 12700);\r\n            var b = tb < 0 ? (tb / 12800) : (tb / 12700);\r\n            skipBytes(reader, 2);\r\n            return { l: l, a: a, b: b };\r\n        }\r\n        case 8 /* ColorSpace.Grayscale */: {\r\n            var k = readUint16(reader) * 255 / 10000;\r\n            skipBytes(reader, 6);\r\n            return { k: k };\r\n        }\r\n        default:\r\n            throw new Error('Invalid color space');\r\n    }\r\n}\r\nexport function readPattern(reader) {\r\n    var length = readUint32(reader);\r\n    while (length % 4)\r\n        length++;\r\n    var end = reader.offset + length;\r\n    var version = readUint32(reader);\r\n    if (version !== 1)\r\n        throw new Error(\"Invalid pattern version: \".concat(version));\r\n    var colorMode = readUint32(reader);\r\n    var x = readInt16(reader);\r\n    var y = readInt16(reader);\r\n    // we only support RGB and grayscale for now\r\n    if (colorMode !== 3 /* ColorMode.RGB */ && colorMode !== 1 /* ColorMode.Grayscale */ && colorMode !== 2 /* ColorMode.Indexed */) {\r\n        throw new Error(\"Unsupported pattern color mode: \".concat(colorMode));\r\n    }\r\n    var name = readUnicodeString(reader);\r\n    var id = readPascalString(reader, 1);\r\n    var palette = [];\r\n    if (colorMode === 2 /* ColorMode.Indexed */) {\r\n        for (var i = 0; i < 256; i++) {\r\n            palette.push({\r\n                r: readUint8(reader),\r\n                g: readUint8(reader),\r\n                b: readUint8(reader),\r\n            });\r\n        }\r\n        skipBytes(reader, 4); // no idea what this is\r\n    }\r\n    // virtual memory array list\r\n    var version2 = readUint32(reader);\r\n    if (version2 !== 3)\r\n        throw new Error(\"Invalid pattern VMAL version: \".concat(version2));\r\n    readUint32(reader); // length\r\n    var top = readUint32(reader);\r\n    var left = readUint32(reader);\r\n    var bottom = readUint32(reader);\r\n    var right = readUint32(reader);\r\n    var channelsCount = readUint32(reader);\r\n    var width = right - left;\r\n    var height = bottom - top;\r\n    var data = new Uint8Array(width * height * 4);\r\n    for (var i = 3; i < data.byteLength; i += 4) {\r\n        data[i] = 255;\r\n    }\r\n    for (var i = 0, ch = 0; i < (channelsCount + 2); i++) {\r\n        var has = readUint32(reader);\r\n        if (!has)\r\n            continue;\r\n        var length_3 = readUint32(reader);\r\n        var pixelDepth = readUint32(reader);\r\n        var ctop = readUint32(reader);\r\n        var cleft = readUint32(reader);\r\n        var cbottom = readUint32(reader);\r\n        var cright = readUint32(reader);\r\n        var pixelDepth2 = readUint16(reader);\r\n        var compressionMode = readUint8(reader); // 0 - raw, 1 - rle\r\n        var dataLength = length_3 - (4 + 16 + 2 + 1);\r\n        var cdata = readBytes(reader, dataLength);\r\n        if (pixelDepth !== 8 || pixelDepth2 !== 8) {\r\n            throw new Error('16bit pixel depth not supported for patterns');\r\n        }\r\n        var w = cright - cleft;\r\n        var h = cbottom - ctop;\r\n        var ox = cleft - left;\r\n        var oy = ctop - top;\r\n        if (compressionMode === 0) {\r\n            if (colorMode === 3 /* ColorMode.RGB */ && ch < 3) {\r\n                for (var y_1 = 0; y_1 < h; y_1++) {\r\n                    for (var x_1 = 0; x_1 < w; x_1++) {\r\n                        var src = x_1 + y_1 * w;\r\n                        var dst = (ox + x_1 + (y_1 + oy) * width) * 4;\r\n                        data[dst + ch] = cdata[src];\r\n                    }\r\n                }\r\n            }\r\n            if (colorMode === 1 /* ColorMode.Grayscale */ && ch < 1) {\r\n                for (var y_2 = 0; y_2 < h; y_2++) {\r\n                    for (var x_2 = 0; x_2 < w; x_2++) {\r\n                        var src = x_2 + y_2 * w;\r\n                        var dst = (ox + x_2 + (y_2 + oy) * width) * 4;\r\n                        var value = cdata[src];\r\n                        data[dst + 0] = value;\r\n                        data[dst + 1] = value;\r\n                        data[dst + 2] = value;\r\n                    }\r\n                }\r\n            }\r\n            if (colorMode === 2 /* ColorMode.Indexed */) {\r\n                // TODO:\r\n                throw new Error('Indexed pattern color mode not implemented');\r\n            }\r\n        }\r\n        else if (compressionMode === 1) {\r\n            var pixelData = { data: data, width: width, height: height };\r\n            var tempData = { data: new Uint8Array(w * h), width: w, height: h };\r\n            var cdataReader = createReader(cdata.buffer, cdata.byteOffset, cdata.byteLength);\r\n            if (colorMode === 3 /* ColorMode.RGB */ && ch < 3) {\r\n                readDataRLE(cdataReader, tempData, w, h, 8, 1, [0], false);\r\n                copyChannelToRGBA(tempData, pixelData, ox, oy, ch);\r\n            }\r\n            if (colorMode === 1 /* ColorMode.Grayscale */ && ch < 1) {\r\n                readDataRLE(cdataReader, tempData, w, h, 8, 1, [0], false);\r\n                copyChannelToRGBA(tempData, pixelData, ox, oy, 0);\r\n                setupGrayscale(pixelData);\r\n            }\r\n            if (colorMode === 2 /* ColorMode.Indexed */) {\r\n                // TODO:\r\n                throw new Error('Indexed pattern color mode not implemented');\r\n            }\r\n        }\r\n        else {\r\n            throw new Error('Invalid pattern compression mode');\r\n        }\r\n        ch++;\r\n    }\r\n    reader.offset = end;\r\n    return { id: id, name: name, x: x, y: y, bounds: { x: left, y: top, w: width, h: height }, data: data };\r\n}\r\nfunction copyChannelToRGBA(srcData, dstData, ox, oy, offset) {\r\n    var w = srcData.width;\r\n    var h = srcData.height;\r\n    var width = dstData.width;\r\n    for (var y = 0; y < h; y++) {\r\n        for (var x = 0; x < w; x++) {\r\n            var src = x + y * w;\r\n            var dst = (ox + x + (y + oy) * width) * 4;\r\n            var value = srcData.data[src];\r\n            dstData.data[dst + offset] = value;\r\n        }\r\n    }\r\n}\r\n//# sourceMappingURL=psdReader.js.map","import { toBlendMode, fromBlendMode } from './helpers';\r\nimport { checkSignature, readSignature, skipBytes, readUint16, readUint8, readUint32, readFixedPoint32, readColor } from './psdReader';\r\nimport { writeSignature, writeUint16, writeZeros, writeFixedPoint32, writeUint8, writeUint32, writeColor } from './psdWriter';\r\nvar bevelStyles = [\r\n    undefined, 'outer bevel', 'inner bevel', 'emboss', 'pillow emboss', 'stroke emboss'\r\n];\r\nfunction readBlendMode(reader) {\r\n    checkSignature(reader, '8BIM');\r\n    return toBlendMode[readSignature(reader)] || 'normal';\r\n}\r\nfunction writeBlendMode(writer, mode) {\r\n    writeSignature(writer, '8BIM');\r\n    writeSignature(writer, fromBlendMode[mode] || 'norm');\r\n}\r\nfunction readFixedPoint8(reader) {\r\n    return readUint8(reader) / 0xff;\r\n}\r\nfunction writeFixedPoint8(writer, value) {\r\n    writeUint8(writer, Math.round(value * 0xff) | 0);\r\n}\r\nexport function readEffects(reader) {\r\n    var version = readUint16(reader);\r\n    if (version !== 0)\r\n        throw new Error(\"Invalid effects layer version: \".concat(version));\r\n    var effectsCount = readUint16(reader);\r\n    var effects = {};\r\n    for (var i = 0; i < effectsCount; i++) {\r\n        checkSignature(reader, '8BIM');\r\n        var type = readSignature(reader);\r\n        switch (type) {\r\n            case 'cmnS': { // common state (see See Effects layer, common state info)\r\n                var size = readUint32(reader);\r\n                var version_1 = readUint32(reader);\r\n                var visible = !!readUint8(reader);\r\n                skipBytes(reader, 2);\r\n                if (size !== 7 || version_1 !== 0 || !visible)\r\n                    throw new Error(\"Invalid effects common state\");\r\n                break;\r\n            }\r\n            case 'dsdw': // drop shadow (see See Effects layer, drop shadow and inner shadow info)\r\n            case 'isdw': { // inner shadow (see See Effects layer, drop shadow and inner shadow info)\r\n                var blockSize = readUint32(reader);\r\n                var version_2 = readUint32(reader);\r\n                if (blockSize !== 41 && blockSize !== 51)\r\n                    throw new Error(\"Invalid shadow size: \".concat(blockSize));\r\n                if (version_2 !== 0 && version_2 !== 2)\r\n                    throw new Error(\"Invalid shadow version: \".concat(version_2));\r\n                var size = readFixedPoint32(reader);\r\n                readFixedPoint32(reader); // intensity\r\n                var angle = readFixedPoint32(reader);\r\n                var distance = readFixedPoint32(reader);\r\n                var color = readColor(reader);\r\n                var blendMode = readBlendMode(reader);\r\n                var enabled = !!readUint8(reader);\r\n                var useGlobalLight = !!readUint8(reader);\r\n                var opacity = readFixedPoint8(reader);\r\n                if (blockSize >= 51)\r\n                    readColor(reader); // native color\r\n                var shadowInfo = {\r\n                    size: { units: 'Pixels', value: size },\r\n                    distance: { units: 'Pixels', value: distance },\r\n                    angle: angle,\r\n                    color: color,\r\n                    blendMode: blendMode,\r\n                    enabled: enabled,\r\n                    useGlobalLight: useGlobalLight,\r\n                    opacity: opacity\r\n                };\r\n                if (type === 'dsdw') {\r\n                    effects.dropShadow = [shadowInfo];\r\n                }\r\n                else {\r\n                    effects.innerShadow = [shadowInfo];\r\n                }\r\n                break;\r\n            }\r\n            case 'oglw': { // outer glow (see See Effects layer, outer glow info)\r\n                var blockSize = readUint32(reader);\r\n                var version_3 = readUint32(reader);\r\n                if (blockSize !== 32 && blockSize !== 42)\r\n                    throw new Error(\"Invalid outer glow size: \".concat(blockSize));\r\n                if (version_3 !== 0 && version_3 !== 2)\r\n                    throw new Error(\"Invalid outer glow version: \".concat(version_3));\r\n                var size = readFixedPoint32(reader);\r\n                readFixedPoint32(reader); // intensity\r\n                var color = readColor(reader);\r\n                var blendMode = readBlendMode(reader);\r\n                var enabled = !!readUint8(reader);\r\n                var opacity = readFixedPoint8(reader);\r\n                if (blockSize >= 42)\r\n                    readColor(reader); // native color\r\n                effects.outerGlow = {\r\n                    size: { units: 'Pixels', value: size },\r\n                    color: color,\r\n                    blendMode: blendMode,\r\n                    enabled: enabled,\r\n                    opacity: opacity\r\n                };\r\n                break;\r\n            }\r\n            case 'iglw': { // inner glow (see See Effects layer, inner glow info)\r\n                var blockSize = readUint32(reader);\r\n                var version_4 = readUint32(reader);\r\n                if (blockSize !== 32 && blockSize !== 43)\r\n                    throw new Error(\"Invalid inner glow size: \".concat(blockSize));\r\n                if (version_4 !== 0 && version_4 !== 2)\r\n                    throw new Error(\"Invalid inner glow version: \".concat(version_4));\r\n                var size = readFixedPoint32(reader);\r\n                readFixedPoint32(reader); // intensity\r\n                var color = readColor(reader);\r\n                var blendMode = readBlendMode(reader);\r\n                var enabled = !!readUint8(reader);\r\n                var opacity = readFixedPoint8(reader);\r\n                if (blockSize >= 43) {\r\n                    readUint8(reader); // inverted\r\n                    readColor(reader); // native color\r\n                }\r\n                effects.innerGlow = {\r\n                    size: { units: 'Pixels', value: size },\r\n                    color: color,\r\n                    blendMode: blendMode,\r\n                    enabled: enabled,\r\n                    opacity: opacity\r\n                };\r\n                break;\r\n            }\r\n            case 'bevl': { // bevel (see See Effects layer, bevel info)\r\n                var blockSize = readUint32(reader);\r\n                var version_5 = readUint32(reader);\r\n                if (blockSize !== 58 && blockSize !== 78)\r\n                    throw new Error(\"Invalid bevel size: \".concat(blockSize));\r\n                if (version_5 !== 0 && version_5 !== 2)\r\n                    throw new Error(\"Invalid bevel version: \".concat(version_5));\r\n                var angle = readFixedPoint32(reader);\r\n                var strength = readFixedPoint32(reader);\r\n                var size = readFixedPoint32(reader);\r\n                var highlightBlendMode = readBlendMode(reader);\r\n                var shadowBlendMode = readBlendMode(reader);\r\n                var highlightColor = readColor(reader);\r\n                var shadowColor = readColor(reader);\r\n                var style = bevelStyles[readUint8(reader)] || 'inner bevel';\r\n                var highlightOpacity = readFixedPoint8(reader);\r\n                var shadowOpacity = readFixedPoint8(reader);\r\n                var enabled = !!readUint8(reader);\r\n                var useGlobalLight = !!readUint8(reader);\r\n                var direction = readUint8(reader) ? 'down' : 'up';\r\n                if (blockSize >= 78) {\r\n                    readColor(reader); // real highlight color\r\n                    readColor(reader); // real shadow color\r\n                }\r\n                effects.bevel = {\r\n                    size: { units: 'Pixels', value: size },\r\n                    angle: angle,\r\n                    strength: strength,\r\n                    highlightBlendMode: highlightBlendMode,\r\n                    shadowBlendMode: shadowBlendMode,\r\n                    highlightColor: highlightColor,\r\n                    shadowColor: shadowColor,\r\n                    style: style,\r\n                    highlightOpacity: highlightOpacity,\r\n                    shadowOpacity: shadowOpacity,\r\n                    enabled: enabled,\r\n                    useGlobalLight: useGlobalLight,\r\n                    direction: direction,\r\n                };\r\n                break;\r\n            }\r\n            case 'sofi': { // solid fill (Photoshop 7.0) (see See Effects layer, solid fill (added in Photoshop 7.0))\r\n                var size = readUint32(reader);\r\n                var version_6 = readUint32(reader);\r\n                if (size !== 34)\r\n                    throw new Error(\"Invalid effects solid fill info size: \".concat(size));\r\n                if (version_6 !== 2)\r\n                    throw new Error(\"Invalid effects solid fill info version: \".concat(version_6));\r\n                var blendMode = readBlendMode(reader);\r\n                var color = readColor(reader);\r\n                var opacity = readFixedPoint8(reader);\r\n                var enabled = !!readUint8(reader);\r\n                readColor(reader); // native color\r\n                effects.solidFill = [{ blendMode: blendMode, color: color, opacity: opacity, enabled: enabled }];\r\n                break;\r\n            }\r\n            default:\r\n                throw new Error(\"Invalid effect type: '\".concat(type, \"'\"));\r\n        }\r\n    }\r\n    return effects;\r\n}\r\nfunction writeShadowInfo(writer, shadow) {\r\n    var _a;\r\n    writeUint32(writer, 51);\r\n    writeUint32(writer, 2);\r\n    writeFixedPoint32(writer, shadow.size && shadow.size.value || 0);\r\n    writeFixedPoint32(writer, 0); // intensity\r\n    writeFixedPoint32(writer, shadow.angle || 0);\r\n    writeFixedPoint32(writer, shadow.distance && shadow.distance.value || 0);\r\n    writeColor(writer, shadow.color);\r\n    writeBlendMode(writer, shadow.blendMode);\r\n    writeUint8(writer, shadow.enabled ? 1 : 0);\r\n    writeUint8(writer, shadow.useGlobalLight ? 1 : 0);\r\n    writeFixedPoint8(writer, (_a = shadow.opacity) !== null && _a !== void 0 ? _a : 1);\r\n    writeColor(writer, shadow.color); // native color\r\n}\r\nexport function writeEffects(writer, effects) {\r\n    var _a, _b, _c, _d, _e, _f;\r\n    var dropShadow = (_a = effects.dropShadow) === null || _a === void 0 ? void 0 : _a[0];\r\n    var innerShadow = (_b = effects.innerShadow) === null || _b === void 0 ? void 0 : _b[0];\r\n    var outerGlow = effects.outerGlow;\r\n    var innerGlow = effects.innerGlow;\r\n    var bevel = effects.bevel;\r\n    var solidFill = (_c = effects.solidFill) === null || _c === void 0 ? void 0 : _c[0];\r\n    var count = 1;\r\n    if (dropShadow)\r\n        count++;\r\n    if (innerShadow)\r\n        count++;\r\n    if (outerGlow)\r\n        count++;\r\n    if (innerGlow)\r\n        count++;\r\n    if (bevel)\r\n        count++;\r\n    if (solidFill)\r\n        count++;\r\n    writeUint16(writer, 0);\r\n    writeUint16(writer, count);\r\n    writeSignature(writer, '8BIM');\r\n    writeSignature(writer, 'cmnS');\r\n    writeUint32(writer, 7); // size\r\n    writeUint32(writer, 0); // version\r\n    writeUint8(writer, 1); // visible\r\n    writeZeros(writer, 2);\r\n    if (dropShadow) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'dsdw');\r\n        writeShadowInfo(writer, dropShadow);\r\n    }\r\n    if (innerShadow) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'isdw');\r\n        writeShadowInfo(writer, innerShadow);\r\n    }\r\n    if (outerGlow) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'oglw');\r\n        writeUint32(writer, 42);\r\n        writeUint32(writer, 2);\r\n        writeFixedPoint32(writer, ((_d = outerGlow.size) === null || _d === void 0 ? void 0 : _d.value) || 0);\r\n        writeFixedPoint32(writer, 0); // intensity\r\n        writeColor(writer, outerGlow.color);\r\n        writeBlendMode(writer, outerGlow.blendMode);\r\n        writeUint8(writer, outerGlow.enabled ? 1 : 0);\r\n        writeFixedPoint8(writer, outerGlow.opacity || 0);\r\n        writeColor(writer, outerGlow.color);\r\n    }\r\n    if (innerGlow) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'iglw');\r\n        writeUint32(writer, 43);\r\n        writeUint32(writer, 2);\r\n        writeFixedPoint32(writer, ((_e = innerGlow.size) === null || _e === void 0 ? void 0 : _e.value) || 0);\r\n        writeFixedPoint32(writer, 0); // intensity\r\n        writeColor(writer, innerGlow.color);\r\n        writeBlendMode(writer, innerGlow.blendMode);\r\n        writeUint8(writer, innerGlow.enabled ? 1 : 0);\r\n        writeFixedPoint8(writer, innerGlow.opacity || 0);\r\n        writeUint8(writer, 0); // inverted\r\n        writeColor(writer, innerGlow.color);\r\n    }\r\n    if (bevel) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'bevl');\r\n        writeUint32(writer, 78);\r\n        writeUint32(writer, 2);\r\n        writeFixedPoint32(writer, bevel.angle || 0);\r\n        writeFixedPoint32(writer, bevel.strength || 0);\r\n        writeFixedPoint32(writer, ((_f = bevel.size) === null || _f === void 0 ? void 0 : _f.value) || 0);\r\n        writeBlendMode(writer, bevel.highlightBlendMode);\r\n        writeBlendMode(writer, bevel.shadowBlendMode);\r\n        writeColor(writer, bevel.highlightColor);\r\n        writeColor(writer, bevel.shadowColor);\r\n        var style = bevelStyles.indexOf(bevel.style);\r\n        writeUint8(writer, style <= 0 ? 1 : style);\r\n        writeFixedPoint8(writer, bevel.highlightOpacity || 0);\r\n        writeFixedPoint8(writer, bevel.shadowOpacity || 0);\r\n        writeUint8(writer, bevel.enabled ? 1 : 0);\r\n        writeUint8(writer, bevel.useGlobalLight ? 1 : 0);\r\n        writeUint8(writer, bevel.direction === 'down' ? 1 : 0);\r\n        writeColor(writer, bevel.highlightColor);\r\n        writeColor(writer, bevel.shadowColor);\r\n    }\r\n    if (solidFill) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'sofi');\r\n        writeUint32(writer, 34);\r\n        writeUint32(writer, 2);\r\n        writeBlendMode(writer, solidFill.blendMode);\r\n        writeColor(writer, solidFill.color);\r\n        writeFixedPoint8(writer, solidFill.opacity || 0);\r\n        writeUint8(writer, solidFill.enabled ? 1 : 0);\r\n        writeColor(writer, solidFill.color);\r\n    }\r\n}\r\n//# sourceMappingURL=effectsHelpers.js.map","function isWhitespace(char) {\r\n    // ' ', '\\n', '\\r', '\\t'\r\n    return char === 32 || char === 10 || char === 13 || char === 9;\r\n}\r\nfunction isNumber(char) {\r\n    // 0123456789.-\r\n    return (char >= 48 && char <= 57) || char === 46 || char === 45;\r\n}\r\nexport function parseEngineData(data) {\r\n    var index = 0;\r\n    function skipWhitespace() {\r\n        while (index < data.length && isWhitespace(data[index])) {\r\n            index++;\r\n        }\r\n    }\r\n    function getTextByte() {\r\n        var byte = data[index];\r\n        index++;\r\n        if (byte === 92) { // \\\r\n            byte = data[index];\r\n            index++;\r\n        }\r\n        return byte;\r\n    }\r\n    function getText() {\r\n        var result = '';\r\n        if (data[index] === 41) { // )\r\n            index++;\r\n            return result;\r\n        }\r\n        // Strings start with utf-16 BOM\r\n        if (data[index] !== 0xFE || data[index + 1] !== 0xFF) {\r\n            throw new Error('Invalid utf-16 BOM');\r\n        }\r\n        index += 2;\r\n        // ), ( and \\ characters are escaped in ascii manner, remove the escapes before interpreting\r\n        // the bytes as utf-16\r\n        while (index < data.length && data[index] !== 41) { // )\r\n            var high = getTextByte();\r\n            var low = getTextByte();\r\n            var char = (high << 8) | low;\r\n            result += String.fromCharCode(char);\r\n        }\r\n        index++;\r\n        return result;\r\n    }\r\n    var root = null;\r\n    var stack = [];\r\n    function pushContainer(value) {\r\n        if (!stack.length) {\r\n            stack.push(value);\r\n            root = value;\r\n        }\r\n        else {\r\n            pushValue(value);\r\n            stack.push(value);\r\n        }\r\n    }\r\n    function pushValue(value) {\r\n        if (!stack.length)\r\n            throw new Error('Invalid data');\r\n        var top = stack[stack.length - 1];\r\n        if (typeof top === 'string') {\r\n            stack[stack.length - 2][top] = value;\r\n            pop();\r\n        }\r\n        else if (Array.isArray(top)) {\r\n            top.push(value);\r\n        }\r\n        else {\r\n            throw new Error('Invalid data');\r\n        }\r\n    }\r\n    function pushProperty(name) {\r\n        if (!stack.length)\r\n            pushContainer({});\r\n        var top = stack[stack.length - 1];\r\n        if (top && typeof top === 'string') {\r\n            if (name === 'nil') {\r\n                pushValue(null);\r\n            }\r\n            else {\r\n                pushValue(\"/\".concat(name));\r\n            }\r\n        }\r\n        else if (top && typeof top === 'object') {\r\n            stack.push(name);\r\n        }\r\n        else {\r\n            throw new Error('Invalid data');\r\n        }\r\n    }\r\n    function pop() {\r\n        if (!stack.length)\r\n            throw new Error('Invalid data');\r\n        stack.pop();\r\n    }\r\n    skipWhitespace();\r\n    var dataLength = data.length;\r\n    while (dataLength > 0 && data[dataLength - 1] === 0)\r\n        dataLength--; // trim 0 bytes from end\r\n    while (index < dataLength) {\r\n        var i = index;\r\n        var char = data[i];\r\n        if (char === 60 && data[i + 1] === 60) { // <<\r\n            index += 2;\r\n            pushContainer({});\r\n        }\r\n        else if (char === 62 && data[i + 1] === 62) { // >>\r\n            index += 2;\r\n            pop();\r\n        }\r\n        else if (char === 47) { // /\r\n            index += 1;\r\n            var start = index;\r\n            while (index < data.length && !isWhitespace(data[index])) {\r\n                index++;\r\n            }\r\n            var name_1 = '';\r\n            for (var i_1 = start; i_1 < index; i_1++) {\r\n                name_1 += String.fromCharCode(data[i_1]);\r\n            }\r\n            pushProperty(name_1);\r\n        }\r\n        else if (char === 40) { // (\r\n            index += 1;\r\n            pushValue(getText());\r\n        }\r\n        else if (char === 91) { // [\r\n            index += 1;\r\n            pushContainer([]);\r\n        }\r\n        else if (char === 93) { // ]\r\n            index += 1;\r\n            pop();\r\n        }\r\n        else if (char === 110 && data[i + 1] === 117 && data[i + 2] === 108 && data[i + 3] === 108) { // null\r\n            index += 4;\r\n            pushValue(null);\r\n        }\r\n        else if (char === 116 && data[i + 1] === 114 && data[i + 2] === 117 && data[i + 3] === 101) { // true\r\n            index += 4;\r\n            pushValue(true);\r\n        }\r\n        else if (char === 102 && data[i + 1] === 97 && data[i + 2] === 108 && data[i + 3] === 115 && data[i + 4] === 101) { // false\r\n            index += 5;\r\n            pushValue(false);\r\n        }\r\n        else if (isNumber(char)) {\r\n            var value = '';\r\n            while (index < data.length && isNumber(data[index])) {\r\n                value += String.fromCharCode(data[index]);\r\n                index++;\r\n            }\r\n            pushValue(parseFloat(value));\r\n        }\r\n        else {\r\n            index += 1;\r\n            console.log(\"Invalid token '\".concat(String.fromCharCode(char), \"' (\").concat(char, \") at \").concat(index)\r\n            // + ` near '${String.fromCharCode.apply(null, data.slice(index - 10, index + 20) as any)}'`\r\n            // + ` data [${Array.from(data.slice(index - 10, index + 20)).join(', ')}]`\r\n            );\r\n            // throw new Error(`Invalid token ${String.fromCharCode(char)} at ${index}`);\r\n        }\r\n        skipWhitespace();\r\n    }\r\n    return root;\r\n}\r\nvar floatKeys = [\r\n    'Axis', 'XY', 'Zone', 'WordSpacing', 'FirstLineIndent', 'GlyphSpacing', 'StartIndent', 'EndIndent', 'SpaceBefore',\r\n    'SpaceAfter', 'LetterSpacing', 'Values', 'GridSize', 'GridLeading', 'PointBase', 'BoxBounds', 'TransformPoint0', 'TransformPoint1',\r\n    'TransformPoint2', 'FontSize', 'Leading', 'HorizontalScale', 'VerticalScale', 'BaselineShift', 'Tsume',\r\n    'OutlineWidth', 'AutoLeading',\r\n];\r\nvar intArrays = ['RunLengthArray'];\r\n// TODO: handle /nil\r\nexport function serializeEngineData(data, condensed) {\r\n    if (condensed === void 0) { condensed = false; }\r\n    var buffer = new Uint8Array(1024);\r\n    var offset = 0;\r\n    var indent = 0;\r\n    function write(value) {\r\n        if (offset >= buffer.length) {\r\n            var newBuffer = new Uint8Array(buffer.length * 2);\r\n            newBuffer.set(buffer);\r\n            buffer = newBuffer;\r\n        }\r\n        buffer[offset] = value;\r\n        offset++;\r\n    }\r\n    function writeString(value) {\r\n        for (var i = 0; i < value.length; i++) {\r\n            write(value.charCodeAt(i));\r\n        }\r\n    }\r\n    function writeIndent() {\r\n        if (condensed) {\r\n            writeString(' ');\r\n        }\r\n        else {\r\n            for (var i = 0; i < indent; i++) {\r\n                writeString('\\t');\r\n            }\r\n        }\r\n    }\r\n    function writeProperty(key, value) {\r\n        writeIndent();\r\n        writeString(\"/\".concat(key));\r\n        writeValue(value, key, true);\r\n        if (!condensed)\r\n            writeString('\\n');\r\n    }\r\n    function serializeInt(value) {\r\n        return value.toString();\r\n    }\r\n    function serializeFloat(value) {\r\n        return value.toFixed(5)\r\n            .replace(/(\\d)0+$/g, '$1')\r\n            .replace(/^0+\\.([1-9])/g, '.$1')\r\n            .replace(/^-0+\\.0(\\d)/g, '-.0$1');\r\n    }\r\n    function serializeNumber(value, key) {\r\n        var isFloat = (key && floatKeys.indexOf(key) !== -1) || (value | 0) !== value;\r\n        return isFloat ? serializeFloat(value) : serializeInt(value);\r\n    }\r\n    function getKeys(value) {\r\n        var keys = Object.keys(value);\r\n        if (keys.indexOf('98') !== -1)\r\n            keys.unshift.apply(keys, keys.splice(keys.indexOf('99'), 1));\r\n        if (keys.indexOf('99') !== -1)\r\n            keys.unshift.apply(keys, keys.splice(keys.indexOf('99'), 1));\r\n        return keys;\r\n    }\r\n    function writeStringByte(value) {\r\n        if (value === 40 || value === 41 || value === 92) { // ( ) \\\r\n            write(92); // \\\r\n        }\r\n        write(value);\r\n    }\r\n    function writeValue(value, key, inProperty) {\r\n        if (inProperty === void 0) { inProperty = false; }\r\n        function writePrefix() {\r\n            if (inProperty) {\r\n                writeString(' ');\r\n            }\r\n            else {\r\n                writeIndent();\r\n            }\r\n        }\r\n        if (value === null) {\r\n            writePrefix();\r\n            writeString(condensed ? '/nil' : 'null');\r\n        }\r\n        else if (typeof value === 'number') {\r\n            writePrefix();\r\n            writeString(serializeNumber(value, key));\r\n        }\r\n        else if (typeof value === 'boolean') {\r\n            writePrefix();\r\n            writeString(value ? 'true' : 'false');\r\n        }\r\n        else if (typeof value === 'string') {\r\n            writePrefix();\r\n            if ((key === '99' || key === '98') && value.charAt(0) === '/') {\r\n                writeString(value);\r\n            }\r\n            else {\r\n                writeString('(');\r\n                write(0xfe);\r\n                write(0xff);\r\n                for (var i = 0; i < value.length; i++) {\r\n                    var code = value.charCodeAt(i);\r\n                    writeStringByte((code >> 8) & 0xff);\r\n                    writeStringByte(code & 0xff);\r\n                }\r\n                writeString(')');\r\n            }\r\n        }\r\n        else if (Array.isArray(value)) {\r\n            writePrefix();\r\n            if (value.every(function (x) { return typeof x === 'number'; })) {\r\n                writeString('[');\r\n                var intArray = intArrays.indexOf(key) !== -1;\r\n                for (var _i = 0, value_1 = value; _i < value_1.length; _i++) {\r\n                    var x = value_1[_i];\r\n                    writeString(' ');\r\n                    writeString(intArray ? serializeNumber(x) : serializeFloat(x));\r\n                }\r\n                writeString(' ]');\r\n            }\r\n            else {\r\n                writeString('[');\r\n                if (!condensed)\r\n                    writeString('\\n');\r\n                for (var _a = 0, value_2 = value; _a < value_2.length; _a++) {\r\n                    var x = value_2[_a];\r\n                    writeValue(x, key);\r\n                    if (!condensed)\r\n                        writeString('\\n');\r\n                }\r\n                writeIndent();\r\n                writeString(']');\r\n            }\r\n        }\r\n        else if (typeof value === 'object') {\r\n            if (inProperty && !condensed)\r\n                writeString('\\n');\r\n            writeIndent();\r\n            writeString('<<');\r\n            if (!condensed)\r\n                writeString('\\n');\r\n            indent++;\r\n            for (var _b = 0, _c = getKeys(value); _b < _c.length; _b++) {\r\n                var key_1 = _c[_b];\r\n                writeProperty(key_1, value[key_1]);\r\n            }\r\n            indent--;\r\n            writeIndent();\r\n            writeString('>>');\r\n        }\r\n        return undefined;\r\n    }\r\n    if (condensed) {\r\n        if (typeof data === 'object') {\r\n            for (var _i = 0, _a = getKeys(data); _i < _a.length; _i++) {\r\n                var key = _a[_i];\r\n                writeProperty(key, data[key]);\r\n            }\r\n        }\r\n    }\r\n    else {\r\n        writeString('\\n\\n');\r\n        writeValue(data);\r\n    }\r\n    return buffer.slice(0, offset);\r\n}\r\n//# sourceMappingURL=engineData.js.map","var __assign = (this && this.__assign) || function () {\r\n    __assign = Object.assign || function(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n                t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\nvar defaultFont = {\r\n    name: 'MyriadPro-Regular',\r\n    script: 0,\r\n    type: 0,\r\n    synthetic: 0,\r\n};\r\nvar defaultParagraphStyle = {\r\n    justification: 'left',\r\n    firstLineIndent: 0,\r\n    startIndent: 0,\r\n    endIndent: 0,\r\n    spaceBefore: 0,\r\n    spaceAfter: 0,\r\n    autoHyphenate: true,\r\n    hyphenatedWordSize: 6,\r\n    preHyphen: 2,\r\n    postHyphen: 2,\r\n    consecutiveHyphens: 8,\r\n    zone: 36,\r\n    wordSpacing: [0.8, 1, 1.33],\r\n    letterSpacing: [0, 0, 0],\r\n    glyphSpacing: [1, 1, 1],\r\n    autoLeading: 1.2,\r\n    leadingType: 0,\r\n    hanging: false,\r\n    burasagari: false,\r\n    kinsokuOrder: 0,\r\n    everyLineComposer: false,\r\n};\r\nvar defaultStyle = {\r\n    font: defaultFont,\r\n    fontSize: 12,\r\n    fauxBold: false,\r\n    fauxItalic: false,\r\n    autoLeading: true,\r\n    leading: 0,\r\n    horizontalScale: 1,\r\n    verticalScale: 1,\r\n    tracking: 0,\r\n    autoKerning: true,\r\n    kerning: 0,\r\n    baselineShift: 0,\r\n    fontCaps: 0,\r\n    fontBaseline: 0,\r\n    underline: false,\r\n    strikethrough: false,\r\n    ligatures: true,\r\n    dLigatures: false,\r\n    baselineDirection: 2,\r\n    tsume: 0,\r\n    styleRunAlignment: 2,\r\n    language: 0,\r\n    noBreak: false,\r\n    fillColor: { r: 0, g: 0, b: 0 },\r\n    strokeColor: { r: 0, g: 0, b: 0 },\r\n    fillFlag: true,\r\n    strokeFlag: false,\r\n    fillFirst: true,\r\n    yUnderline: 1,\r\n    outlineWidth: 1,\r\n    characterDirection: 0,\r\n    hindiNumbers: false,\r\n    kashida: 1,\r\n    diacriticPos: 2,\r\n};\r\nvar defaultGridInfo = {\r\n    isOn: false,\r\n    show: false,\r\n    size: 18,\r\n    leading: 22,\r\n    color: { r: 0, g: 0, b: 255 },\r\n    leadingFillColor: { r: 0, g: 0, b: 255 },\r\n    alignLineHeightToGridFlags: false,\r\n};\r\nvar paragraphStyleKeys = [\r\n    'justification', 'firstLineIndent', 'startIndent', 'endIndent', 'spaceBefore', 'spaceAfter',\r\n    'autoHyphenate', 'hyphenatedWordSize', 'preHyphen', 'postHyphen', 'consecutiveHyphens',\r\n    'zone', 'wordSpacing', 'letterSpacing', 'glyphSpacing', 'autoLeading', 'leadingType',\r\n    'hanging', 'burasagari', 'kinsokuOrder', 'everyLineComposer',\r\n];\r\nvar styleKeys = [\r\n    'font', 'fontSize', 'fauxBold', 'fauxItalic', 'autoLeading', 'leading', 'horizontalScale',\r\n    'verticalScale', 'tracking', 'autoKerning', 'kerning', 'baselineShift', 'fontCaps', 'fontBaseline',\r\n    'underline', 'strikethrough', 'ligatures', 'dLigatures', 'baselineDirection', 'tsume',\r\n    'styleRunAlignment', 'language', 'noBreak', 'fillColor', 'strokeColor', 'fillFlag',\r\n    'strokeFlag', 'fillFirst', 'yUnderline', 'outlineWidth', 'characterDirection', 'hindiNumbers',\r\n    'kashida', 'diacriticPos',\r\n];\r\nvar antialias = ['none', 'crisp', 'strong', 'smooth', 'sharp'];\r\nvar justification = [\r\n    'left',\r\n    'right',\r\n    'center',\r\n    'justify-left',\r\n    'justify-right',\r\n    'justify-center',\r\n    'justify-all', // 6\r\n];\r\nfunction upperFirst(value) {\r\n    return value.substring(0, 1).toUpperCase() + value.substring(1);\r\n}\r\nfunction decodeColor(color) {\r\n    var c = color.Values;\r\n    switch (color.Type) {\r\n        case 0: return { k: c[1] * 255 }; // grayscale (alpha?)\r\n        case 1: return c[0] === 1 ?\r\n            { r: c[1] * 255, g: c[2] * 255, b: c[3] * 255 } : // rgb\r\n            { r: c[1] * 255, g: c[2] * 255, b: c[3] * 255, a: c[0] * 255 }; // rgba\r\n        case 2: return { c: c[1] * 255, m: c[2] * 255, y: c[3] * 255, k: c[4] * 255 }; // cmyk (alpha?)\r\n        default: throw new Error('Unknown color type in text layer');\r\n    }\r\n}\r\nfunction encodeColor(color) {\r\n    if (!color) {\r\n        return { Type: 1, Values: [0, 0, 0, 0] };\r\n    }\r\n    else if ('r' in color) {\r\n        return { Type: 1, Values: ['a' in color ? color.a / 255 : 1, color.r / 255, color.g / 255, color.b / 255] };\r\n    }\r\n    else if ('c' in color) {\r\n        return { Type: 2, Values: [1, color.c / 255, color.m / 255, color.y / 255, color.k / 255] };\r\n    }\r\n    else if ('k' in color) {\r\n        return { Type: 0, Values: [1, color.k / 255] };\r\n    }\r\n    else {\r\n        throw new Error('Invalid color type in text layer');\r\n    }\r\n}\r\nfunction arraysEqual(a, b) {\r\n    if (!a || !b)\r\n        return false;\r\n    if (a.length !== b.length)\r\n        return false;\r\n    for (var i = 0; i < a.length; i++)\r\n        if (a[i] !== b[i])\r\n            return false;\r\n    return true;\r\n}\r\nfunction objectsEqual(a, b) {\r\n    if (!a || !b)\r\n        return false;\r\n    for (var _i = 0, _a = Object.keys(a); _i < _a.length; _i++) {\r\n        var key = _a[_i];\r\n        if (a[key] !== b[key])\r\n            return false;\r\n    }\r\n    for (var _b = 0, _c = Object.keys(b); _b < _c.length; _b++) {\r\n        var key = _c[_b];\r\n        if (a[key] !== b[key])\r\n            return false;\r\n    }\r\n    return true;\r\n}\r\nfunction findOrAddFont(fonts, font) {\r\n    for (var i = 0; i < fonts.length; i++) {\r\n        if (fonts[i].name === font.name)\r\n            return i;\r\n    }\r\n    fonts.push(font);\r\n    return fonts.length - 1;\r\n}\r\nfunction decodeObject(obj, keys, fonts) {\r\n    var result = {};\r\n    for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\r\n        var key = keys_1[_i];\r\n        var Key = upperFirst(key);\r\n        if (obj[Key] === undefined)\r\n            continue;\r\n        if (key === 'justification') {\r\n            result[key] = justification[obj[Key]];\r\n        }\r\n        else if (key === 'font') {\r\n            result[key] = fonts[obj[Key]];\r\n        }\r\n        else if (key === 'fillColor' || key === 'strokeColor') {\r\n            result[key] = decodeColor(obj[Key]);\r\n        }\r\n        else {\r\n            result[key] = obj[Key];\r\n        }\r\n    }\r\n    return result;\r\n}\r\nfunction encodeObject(obj, keys, fonts) {\r\n    var _a;\r\n    var result = {};\r\n    for (var _i = 0, keys_2 = keys; _i < keys_2.length; _i++) {\r\n        var key = keys_2[_i];\r\n        var Key = upperFirst(key);\r\n        if (obj[key] === undefined)\r\n            continue;\r\n        if (key === 'justification') {\r\n            result[Key] = justification.indexOf((_a = obj[key]) !== null && _a !== void 0 ? _a : 'left');\r\n        }\r\n        else if (key === 'font') {\r\n            result[Key] = findOrAddFont(fonts, obj[key]);\r\n        }\r\n        else if (key === 'fillColor' || key === 'strokeColor') {\r\n            result[Key] = encodeColor(obj[key]);\r\n        }\r\n        else {\r\n            result[Key] = obj[key];\r\n        }\r\n    }\r\n    return result;\r\n}\r\nfunction decodeParagraphStyle(obj, fonts) {\r\n    return decodeObject(obj, paragraphStyleKeys, fonts);\r\n}\r\nfunction decodeStyle(obj, fonts) {\r\n    return decodeObject(obj, styleKeys, fonts);\r\n}\r\nfunction encodeParagraphStyle(obj, fonts) {\r\n    return encodeObject(obj, paragraphStyleKeys, fonts);\r\n}\r\nfunction encodeStyle(obj, fonts) {\r\n    return encodeObject(obj, styleKeys, fonts);\r\n}\r\nfunction deduplicateValues(base, runs, keys) {\r\n    if (!runs.length)\r\n        return;\r\n    var _loop_1 = function (key) {\r\n        var value = runs[0].style[key];\r\n        if (value !== undefined) {\r\n            var identical = false;\r\n            if (Array.isArray(value)) {\r\n                identical = runs.every(function (r) { return arraysEqual(r.style[key], value); });\r\n            }\r\n            else if (typeof value === 'object') {\r\n                identical = runs.every(function (r) { return objectsEqual(r.style[key], value); });\r\n            }\r\n            else {\r\n                identical = runs.every(function (r) { return r.style[key] === value; });\r\n            }\r\n            if (identical) {\r\n                base[key] = value;\r\n            }\r\n        }\r\n        var styleValue = base[key];\r\n        if (styleValue !== undefined) {\r\n            for (var _a = 0, runs_1 = runs; _a < runs_1.length; _a++) {\r\n                var r = runs_1[_a];\r\n                var same = false;\r\n                if (Array.isArray(value)) {\r\n                    same = arraysEqual(r.style[key], value);\r\n                }\r\n                else if (typeof value === 'object') {\r\n                    same = objectsEqual(r.style[key], value);\r\n                }\r\n                else {\r\n                    same = r.style[key] === value;\r\n                }\r\n                if (same)\r\n                    delete r.style[key];\r\n            }\r\n        }\r\n    };\r\n    for (var _i = 0, keys_3 = keys; _i < keys_3.length; _i++) {\r\n        var key = keys_3[_i];\r\n        _loop_1(key);\r\n    }\r\n    if (runs.every(function (x) { return Object.keys(x.style).length === 0; })) {\r\n        runs.length = 0;\r\n    }\r\n}\r\nexport function decodeEngineData(engineData) {\r\n    var _a, _b, _c, _d, _e, _f;\r\n    // console.log('engineData', require('util').inspect(engineData, false, 99, true));\r\n    var engineDict = engineData.EngineDict;\r\n    var resourceDict = engineData.ResourceDict;\r\n    var fonts = resourceDict.FontSet.map(function (f) { return ({\r\n        name: f.Name,\r\n        script: f.Script,\r\n        type: f.FontType,\r\n        synthetic: f.Synthetic,\r\n    }); });\r\n    var text = engineDict.Editor.Text.replace(/\\r/g, '\\n');\r\n    var removedCharacters = 0;\r\n    while (/\\n$/.test(text)) {\r\n        text = text.substring(0, text.length - 1);\r\n        removedCharacters++;\r\n    }\r\n    var result = {\r\n        text: text,\r\n        antiAlias: (_a = antialias[engineDict.AntiAlias]) !== null && _a !== void 0 ? _a : 'smooth',\r\n        useFractionalGlyphWidths: !!engineDict.UseFractionalGlyphWidths,\r\n        superscriptSize: resourceDict.SuperscriptSize,\r\n        superscriptPosition: resourceDict.SuperscriptPosition,\r\n        subscriptSize: resourceDict.SubscriptSize,\r\n        subscriptPosition: resourceDict.SubscriptPosition,\r\n        smallCapSize: resourceDict.SmallCapSize,\r\n    };\r\n    // shape\r\n    var photoshop = (_f = (_e = (_d = (_c = (_b = engineDict.Rendered) === null || _b === void 0 ? void 0 : _b.Shapes) === null || _c === void 0 ? void 0 : _c.Children) === null || _d === void 0 ? void 0 : _d[0]) === null || _e === void 0 ? void 0 : _e.Cookie) === null || _f === void 0 ? void 0 : _f.Photoshop;\r\n    if (photoshop) {\r\n        result.shapeType = photoshop.ShapeType === 1 ? 'box' : 'point';\r\n        if (photoshop.PointBase)\r\n            result.pointBase = photoshop.PointBase;\r\n        if (photoshop.BoxBounds)\r\n            result.boxBounds = photoshop.BoxBounds;\r\n    }\r\n    // paragraph style\r\n    // const theNormalParagraphSheet = resourceDict.TheNormalParagraphSheet;\r\n    // const paragraphSheetSet = resourceDict.ParagraphSheetSet;\r\n    // const paragraphProperties = paragraphSheetSet[theNormalParagraphSheet].Properties;\r\n    var paragraphRun = engineDict.ParagraphRun;\r\n    result.paragraphStyle = {}; // decodeParagraphStyle(paragraphProperties, fonts);\r\n    result.paragraphStyleRuns = [];\r\n    for (var i = 0; i < paragraphRun.RunArray.length; i++) {\r\n        var run_1 = paragraphRun.RunArray[i];\r\n        var length_1 = paragraphRun.RunLengthArray[i];\r\n        var style = decodeParagraphStyle(run_1.ParagraphSheet.Properties, fonts);\r\n        // const adjustments = {\r\n        //   axis: run.Adjustments.Axis,\r\n        //   xy: run.Adjustments.XY,\r\n        // };\r\n        result.paragraphStyleRuns.push({ length: length_1, style: style /*, adjustments*/ });\r\n    }\r\n    for (var counter = removedCharacters; result.paragraphStyleRuns.length && counter > 0; counter--) {\r\n        if (--result.paragraphStyleRuns[result.paragraphStyleRuns.length - 1].length === 0) {\r\n            result.paragraphStyleRuns.pop();\r\n        }\r\n    }\r\n    deduplicateValues(result.paragraphStyle, result.paragraphStyleRuns, paragraphStyleKeys);\r\n    if (!result.paragraphStyleRuns.length)\r\n        delete result.paragraphStyleRuns;\r\n    // style\r\n    // const theNormalStyleSheet = resourceDict.TheNormalStyleSheet;\r\n    // const styleSheetSet = resourceDict.StyleSheetSet;\r\n    // const styleSheetData = styleSheetSet[theNormalStyleSheet].StyleSheetData;\r\n    var styleRun = engineDict.StyleRun;\r\n    result.style = {}; // decodeStyle(styleSheetData, fonts);\r\n    result.styleRuns = [];\r\n    for (var i = 0; i < styleRun.RunArray.length; i++) {\r\n        var length_2 = styleRun.RunLengthArray[i];\r\n        var style = decodeStyle(styleRun.RunArray[i].StyleSheet.StyleSheetData, fonts);\r\n        if (!style.font)\r\n            style.font = fonts[0];\r\n        result.styleRuns.push({ length: length_2, style: style });\r\n    }\r\n    for (var counter = removedCharacters; result.styleRuns.length && counter > 0; counter--) {\r\n        if (--result.styleRuns[result.styleRuns.length - 1].length === 0) {\r\n            result.styleRuns.pop();\r\n        }\r\n    }\r\n    deduplicateValues(result.style, result.styleRuns, styleKeys);\r\n    if (!result.styleRuns.length)\r\n        delete result.styleRuns;\r\n    return result;\r\n}\r\nexport function encodeEngineData(data) {\r\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;\r\n    var text = \"\".concat((data.text || '').replace(/\\r?\\n/g, '\\r'), \"\\r\");\r\n    var fonts = [\r\n        { name: 'AdobeInvisFont', script: 0, type: 0, synthetic: 0 },\r\n    ];\r\n    var defFont = ((_a = data.style) === null || _a === void 0 ? void 0 : _a.font) || ((_c = (_b = data.styleRuns) === null || _b === void 0 ? void 0 : _b.find(function (s) { return s.style.font; })) === null || _c === void 0 ? void 0 : _c.style.font) || defaultFont;\r\n    var paragraphRunArray = [];\r\n    var paragraphRunLengthArray = [];\r\n    var paragraphRuns = data.paragraphStyleRuns;\r\n    if (paragraphRuns && paragraphRuns.length) {\r\n        var leftLength_1 = text.length;\r\n        for (var _i = 0, paragraphRuns_1 = paragraphRuns; _i < paragraphRuns_1.length; _i++) {\r\n            var run_2 = paragraphRuns_1[_i];\r\n            var runLength = Math.min(run_2.length, leftLength_1);\r\n            leftLength_1 -= runLength;\r\n            if (!runLength)\r\n                continue; // ignore 0 size runs\r\n            // extend last run if it's only for trailing \\r\r\n            if (leftLength_1 === 1 && run_2 === paragraphRuns[paragraphRuns.length - 1]) {\r\n                runLength++;\r\n                leftLength_1--;\r\n            }\r\n            paragraphRunLengthArray.push(runLength);\r\n            paragraphRunArray.push({\r\n                ParagraphSheet: {\r\n                    DefaultStyleSheet: 0,\r\n                    Properties: encodeParagraphStyle(__assign(__assign(__assign({}, defaultParagraphStyle), data.paragraphStyle), run_2.style), fonts),\r\n                },\r\n                Adjustments: { Axis: [1, 0, 1], XY: [0, 0] },\r\n            });\r\n        }\r\n        if (leftLength_1) {\r\n            paragraphRunLengthArray.push(leftLength_1);\r\n            paragraphRunArray.push({\r\n                ParagraphSheet: {\r\n                    DefaultStyleSheet: 0,\r\n                    Properties: encodeParagraphStyle(__assign(__assign({}, defaultParagraphStyle), data.paragraphStyle), fonts),\r\n                },\r\n                Adjustments: { Axis: [1, 0, 1], XY: [0, 0] },\r\n            });\r\n        }\r\n    }\r\n    else {\r\n        for (var i = 0, last = 0; i < text.length; i++) {\r\n            if (text.charCodeAt(i) === 13) { // \\r\r\n                paragraphRunLengthArray.push(i - last + 1);\r\n                paragraphRunArray.push({\r\n                    ParagraphSheet: {\r\n                        DefaultStyleSheet: 0,\r\n                        Properties: encodeParagraphStyle(__assign(__assign({}, defaultParagraphStyle), data.paragraphStyle), fonts),\r\n                    },\r\n                    Adjustments: { Axis: [1, 0, 1], XY: [0, 0] },\r\n                });\r\n                last = i + 1;\r\n            }\r\n        }\r\n    }\r\n    var styleSheetData = encodeStyle(__assign(__assign({}, defaultStyle), { font: defFont }), fonts);\r\n    var styleRuns = data.styleRuns || [{ length: text.length, style: data.style || {} }];\r\n    var styleRunArray = [];\r\n    var styleRunLengthArray = [];\r\n    var leftLength = text.length;\r\n    for (var _o = 0, styleRuns_1 = styleRuns; _o < styleRuns_1.length; _o++) {\r\n        var run_3 = styleRuns_1[_o];\r\n        var runLength = Math.min(run_3.length, leftLength);\r\n        leftLength -= runLength;\r\n        if (!runLength)\r\n            continue; // ignore 0 size runs\r\n        // extend last run if it's only for trailing \\r\r\n        if (leftLength === 1 && run_3 === styleRuns[styleRuns.length - 1]) {\r\n            runLength++;\r\n            leftLength--;\r\n        }\r\n        styleRunLengthArray.push(runLength);\r\n        styleRunArray.push({\r\n            StyleSheet: {\r\n                StyleSheetData: encodeStyle(__assign(__assign({ kerning: 0, autoKerning: true, fillColor: { r: 0, g: 0, b: 0 } }, data.style), run_3.style), fonts),\r\n            },\r\n        });\r\n    }\r\n    // add extra run to the end if existing ones didn't fill it up\r\n    if (leftLength && styleRuns.length) {\r\n        styleRunLengthArray.push(leftLength);\r\n        styleRunArray.push({\r\n            StyleSheet: {\r\n                StyleSheetData: encodeStyle(__assign({ kerning: 0, autoKerning: true, fillColor: { r: 0, g: 0, b: 0 } }, data.style), fonts),\r\n            },\r\n        });\r\n    }\r\n    var gridInfo = __assign(__assign({}, defaultGridInfo), data.gridInfo);\r\n    var WritingDirection = data.orientation === 'vertical' ? 2 : 0;\r\n    var Procession = data.orientation === 'vertical' ? 1 : 0;\r\n    var ShapeType = data.shapeType === 'box' ? 1 : 0;\r\n    var Photoshop = {\r\n        ShapeType: ShapeType,\r\n    };\r\n    if (ShapeType === 0) {\r\n        Photoshop.PointBase = data.pointBase || [0, 0];\r\n    }\r\n    else {\r\n        Photoshop.BoxBounds = data.boxBounds || [0, 0, 0, 0];\r\n    }\r\n    // needed for correct order of properties\r\n    Photoshop.Base = {\r\n        ShapeType: ShapeType,\r\n        TransformPoint0: [1, 0],\r\n        TransformPoint1: [0, 1],\r\n        TransformPoint2: [0, 0],\r\n    };\r\n    var defaultResources = {\r\n        KinsokuSet: [\r\n            {\r\n                Name: 'PhotoshopKinsokuHard',\r\n                NoStart: '、。，．・：；？！ー―’”）〕］｝〉》」』】ヽヾゝゞ々ぁぃぅぇぉっゃゅょゎァィゥェォッャュョヮヵヶ゛゜?!)]},.:;℃℉¢％‰',\r\n                NoEnd: '‘“（〔［｛〈《「『【([{￥＄£＠§〒＃',\r\n                Keep: '―‥',\r\n                Hanging: '、。.,',\r\n            },\r\n            {\r\n                Name: 'PhotoshopKinsokuSoft',\r\n                NoStart: '、。，．・：；？！’”）〕］｝〉》」』】ヽヾゝゞ々',\r\n                NoEnd: '‘“（〔［｛〈《「『【',\r\n                Keep: '―‥',\r\n                Hanging: '、。.,',\r\n            },\r\n        ],\r\n        MojiKumiSet: [\r\n            { InternalName: 'Photoshop6MojiKumiSet1' },\r\n            { InternalName: 'Photoshop6MojiKumiSet2' },\r\n            { InternalName: 'Photoshop6MojiKumiSet3' },\r\n            { InternalName: 'Photoshop6MojiKumiSet4' },\r\n        ],\r\n        TheNormalStyleSheet: 0,\r\n        TheNormalParagraphSheet: 0,\r\n        ParagraphSheetSet: [\r\n            {\r\n                Name: 'Normal RGB',\r\n                DefaultStyleSheet: 0,\r\n                Properties: encodeParagraphStyle(__assign(__assign({}, defaultParagraphStyle), data.paragraphStyle), fonts),\r\n            },\r\n        ],\r\n        StyleSheetSet: [\r\n            {\r\n                Name: 'Normal RGB',\r\n                StyleSheetData: styleSheetData,\r\n            },\r\n        ],\r\n        FontSet: fonts.map(function (f) { return ({\r\n            Name: f.name,\r\n            Script: f.script || 0,\r\n            FontType: f.type || 0,\r\n            Synthetic: f.synthetic || 0,\r\n        }); }),\r\n        SuperscriptSize: (_d = data.superscriptSize) !== null && _d !== void 0 ? _d : 0.583,\r\n        SuperscriptPosition: (_e = data.superscriptPosition) !== null && _e !== void 0 ? _e : 0.333,\r\n        SubscriptSize: (_f = data.subscriptSize) !== null && _f !== void 0 ? _f : 0.583,\r\n        SubscriptPosition: (_g = data.subscriptPosition) !== null && _g !== void 0 ? _g : 0.333,\r\n        SmallCapSize: (_h = data.smallCapSize) !== null && _h !== void 0 ? _h : 0.7,\r\n    };\r\n    var engineData = {\r\n        EngineDict: {\r\n            Editor: { Text: text },\r\n            ParagraphRun: {\r\n                DefaultRunData: {\r\n                    ParagraphSheet: { DefaultStyleSheet: 0, Properties: {} },\r\n                    Adjustments: { Axis: [1, 0, 1], XY: [0, 0] },\r\n                },\r\n                RunArray: paragraphRunArray,\r\n                RunLengthArray: paragraphRunLengthArray,\r\n                IsJoinable: 1,\r\n            },\r\n            StyleRun: {\r\n                DefaultRunData: { StyleSheet: { StyleSheetData: {} } },\r\n                RunArray: styleRunArray,\r\n                RunLengthArray: styleRunLengthArray,\r\n                IsJoinable: 2,\r\n            },\r\n            GridInfo: {\r\n                GridIsOn: !!gridInfo.isOn,\r\n                ShowGrid: !!gridInfo.show,\r\n                GridSize: (_j = gridInfo.size) !== null && _j !== void 0 ? _j : 18,\r\n                GridLeading: (_k = gridInfo.leading) !== null && _k !== void 0 ? _k : 22,\r\n                GridColor: encodeColor(gridInfo.color),\r\n                GridLeadingFillColor: encodeColor(gridInfo.color),\r\n                AlignLineHeightToGridFlags: !!gridInfo.alignLineHeightToGridFlags,\r\n            },\r\n            AntiAlias: antialias.indexOf((_l = data.antiAlias) !== null && _l !== void 0 ? _l : 'sharp'),\r\n            UseFractionalGlyphWidths: (_m = data.useFractionalGlyphWidths) !== null && _m !== void 0 ? _m : true,\r\n            Rendered: {\r\n                Version: 1,\r\n                Shapes: {\r\n                    WritingDirection: WritingDirection,\r\n                    Children: [\r\n                        {\r\n                            ShapeType: ShapeType,\r\n                            Procession: Procession,\r\n                            Lines: { WritingDirection: WritingDirection, Children: [] },\r\n                            Cookie: { Photoshop: Photoshop },\r\n                        },\r\n                    ],\r\n                },\r\n            },\r\n        },\r\n        ResourceDict: __assign({}, defaultResources),\r\n        DocumentResources: __assign({}, defaultResources),\r\n    };\r\n    // console.log('encodeEngineData', require('util').inspect(engineData, false, 99, true));\r\n    return engineData;\r\n}\r\n//# sourceMappingURL=text.js.map","/// Engine data 2 experiments\r\n// /test/engineData2.json:1109 is character codes\r\nvar keysColor = {\r\n    '0': {\r\n        uproot: true,\r\n        children: {\r\n            '0': { name: 'Type' },\r\n            '1': { name: 'Values' },\r\n        },\r\n    },\r\n};\r\nvar keysStyleSheet = {\r\n    '0': { name: 'Font' },\r\n    '1': { name: 'FontSize' },\r\n    '2': { name: 'FauxBold' },\r\n    '3': { name: 'FauxItalic' },\r\n    '4': { name: 'AutoLeading' },\r\n    '5': { name: 'Leading' },\r\n    '6': { name: 'HorizontalScale' },\r\n    '7': { name: 'VerticalScale' },\r\n    '8': { name: 'Tracking' },\r\n    '9': { name: 'BaselineShift' },\r\n    // '10': ???\r\n    '11': { name: 'Kerning?' },\r\n    '12': { name: 'FontCaps' },\r\n    '13': { name: 'FontBaseline' },\r\n    '15': { name: 'Strikethrough?' },\r\n    '16': { name: 'Underline?' },\r\n    '18': { name: 'Ligatures' },\r\n    '19': { name: 'DLigatures' },\r\n    // '20': ???\r\n    // '21': ???\r\n    // '22': ???\r\n    '23': { name: 'Fractions' },\r\n    '24': { name: 'Ordinals' },\r\n    // '25': ???\r\n    // '26': ???\r\n    // '27': ???\r\n    '28': { name: 'StylisticAlternates' },\r\n    // '29': ???\r\n    '30': { name: 'OldStyle?' },\r\n    '35': { name: 'BaselineDirection' },\r\n    '38': { name: 'Language' },\r\n    '52': { name: 'NoBreak' },\r\n    '53': { name: 'FillColor', children: keysColor },\r\n    '54': { name: 'StrokeColor', children: keysColor },\r\n    '55': { children: { '99': { uproot: true } } },\r\n    // '68': ???\r\n    // '70': ???\r\n    // '71': ???\r\n    // '72': ???\r\n    // '73': ???\r\n    '79': { children: keysColor },\r\n    // '85': ???\r\n    // '87': ???\r\n    // '88': ???\r\n};\r\nvar keysParagraph = {\r\n    '0': { name: 'Justification' },\r\n    '1': { name: 'FirstLineIndent' },\r\n    '2': { name: 'StartIndent' },\r\n    '3': { name: 'EndIndent' },\r\n    '4': { name: 'SpaceBefore' },\r\n    '5': { name: 'SpaceAfter' },\r\n    '7': { name: 'AutoLeading' },\r\n    '9': { name: 'AutoHyphenate' },\r\n    '10': { name: 'HyphenatedWordSize' },\r\n    '11': { name: 'PreHyphen' },\r\n    '12': { name: 'PostHyphen' },\r\n    '13': { name: 'ConsecutiveHyphens?' },\r\n    '14': { name: 'Zone' },\r\n    '15': { name: 'HypenateCapitalizedWords' },\r\n    '17': { name: 'WordSpacing' },\r\n    '18': { name: 'LetterSpacing' },\r\n    '19': { name: 'GlyphSpacing' },\r\n    '32': { name: 'StyleSheet', children: keysStyleSheet },\r\n};\r\nvar keysStyleSheetData = {\r\n    name: 'StyleSheetData',\r\n    children: keysStyleSheet,\r\n};\r\nvar keysRoot = {\r\n    '0': {\r\n        name: 'ResourceDict',\r\n        children: {\r\n            '1': {\r\n                name: 'FontSet',\r\n                children: {\r\n                    '0': {\r\n                        uproot: true,\r\n                        children: {\r\n                            '0': {\r\n                                uproot: true,\r\n                                children: {\r\n                                    '0': {\r\n                                        uproot: true,\r\n                                        children: {\r\n                                            '0': { name: 'Name' },\r\n                                            '2': { name: 'FontType' },\r\n                                        },\r\n                                    },\r\n                                },\r\n                            },\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n            '2': {\r\n                name: '2',\r\n                children: {},\r\n            },\r\n            '3': {\r\n                name: 'MojiKumiSet',\r\n                children: {\r\n                    '0': {\r\n                        uproot: true,\r\n                        children: {\r\n                            '0': {\r\n                                uproot: true,\r\n                                children: {\r\n                                    '0': { name: 'InternalName' },\r\n                                },\r\n                            },\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n            '4': {\r\n                name: 'KinsokuSet',\r\n                children: {\r\n                    '0': {\r\n                        uproot: true,\r\n                        children: {\r\n                            '0': {\r\n                                uproot: true,\r\n                                children: {\r\n                                    '0': { name: 'Name' },\r\n                                    '5': {\r\n                                        uproot: true,\r\n                                        children: {\r\n                                            '0': { name: 'NoStart' },\r\n                                            '1': { name: 'NoEnd' },\r\n                                            '2': { name: 'Keep' },\r\n                                            '3': { name: 'Hanging' },\r\n                                            '4': { name: 'Name' },\r\n                                        },\r\n                                    },\r\n                                },\r\n                            },\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n            '5': {\r\n                name: 'StyleSheetSet',\r\n                children: {\r\n                    '0': {\r\n                        uproot: true,\r\n                        children: {\r\n                            '0': {\r\n                                uproot: true,\r\n                                children: {\r\n                                    '0': { name: 'Name' },\r\n                                    '6': keysStyleSheetData,\r\n                                },\r\n                            },\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n            '6': {\r\n                name: 'ParagraphSheetSet',\r\n                children: {\r\n                    '0': {\r\n                        uproot: true,\r\n                        children: {\r\n                            '0': {\r\n                                uproot: true,\r\n                                children: {\r\n                                    '0': { name: 'Name' },\r\n                                    '5': {\r\n                                        name: 'Properties',\r\n                                        children: keysParagraph,\r\n                                    },\r\n                                    '6': { name: 'DefaultStyleSheet' },\r\n                                },\r\n                            },\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n            '8': {\r\n                name: 'TextFrameSet',\r\n                children: {\r\n                    '0': {\r\n                        uproot: true,\r\n                        children: {\r\n                            '0': {\r\n                                name: 'path',\r\n                                children: {\r\n                                    '0': { name: 'name' },\r\n                                    '1': {\r\n                                        name: 'bezierCurve',\r\n                                        children: {\r\n                                            '0': { name: 'controlPoints' },\r\n                                        },\r\n                                    },\r\n                                    '2': {\r\n                                        name: 'data',\r\n                                        children: {\r\n                                            '0': { name: 'type' },\r\n                                            '1': { name: 'orientation' },\r\n                                            '2': { name: 'frameMatrix' },\r\n                                            '4': { name: '4' },\r\n                                            '6': { name: 'textRange' },\r\n                                            '7': { name: 'rowGutter' },\r\n                                            '8': { name: 'columnGutter' },\r\n                                            '9': { name: '9' },\r\n                                            '10': {\r\n                                                name: 'baselineAlignment',\r\n                                                children: {\r\n                                                    '0': { name: 'flag' },\r\n                                                    '1': { name: 'min' },\r\n                                                },\r\n                                            },\r\n                                            '11': {\r\n                                                name: 'pathData',\r\n                                                children: {\r\n                                                    '1': { name: '1' },\r\n                                                    '0': { name: 'reversed' },\r\n                                                    '2': { name: '2' },\r\n                                                    '3': { name: '3' },\r\n                                                    '4': { name: 'spacing' },\r\n                                                    '5': { name: '5' },\r\n                                                    '6': { name: '6' },\r\n                                                    '7': { name: '7' },\r\n                                                    '18': { name: '18' },\r\n                                                },\r\n                                            },\r\n                                            '12': { name: '12' },\r\n                                            '13': { name: '13' },\r\n                                        },\r\n                                    },\r\n                                    '3': { name: '3' },\r\n                                    '97': { name: 'uuid' },\r\n                                },\r\n                            },\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n            '9': {\r\n                name: 'Predefined',\r\n                children: {\r\n                    '0': {\r\n                        children: { '0': { uproot: true } },\r\n                    },\r\n                    '1': {\r\n                        children: { '0': { uproot: true } },\r\n                    },\r\n                },\r\n            },\r\n        },\r\n    },\r\n    '1': {\r\n        name: 'EngineDict',\r\n        children: {\r\n            '0': {\r\n                name: '0',\r\n                children: {\r\n                    // 0: ???\r\n                    // 1: ???\r\n                    // 2: ???\r\n                    '3': { name: 'SuperscriptSize' },\r\n                    '4': { name: 'SuperscriptPosition' },\r\n                    '5': { name: 'SubscriptSize' },\r\n                    '6': { name: 'SubscriptPosition' },\r\n                    '7': { name: 'SmallCapSize' },\r\n                    '8': { name: 'UseFractionalGlyphWidths' },\r\n                    '15': { children: { '0': { uproot: true } } },\r\n                    // 16: ???\r\n                    // 17: ???\r\n                },\r\n            },\r\n            '1': {\r\n                name: 'Editors?',\r\n                children: {\r\n                    '0': {\r\n                        name: 'Editor',\r\n                        children: {\r\n                            '0': { name: 'Text' },\r\n                            '5': {\r\n                                name: 'ParagraphRun',\r\n                                children: {\r\n                                    '0': {\r\n                                        name: 'RunArray',\r\n                                        children: {\r\n                                            '0': {\r\n                                                name: 'ParagraphSheet',\r\n                                                children: {\r\n                                                    '0': {\r\n                                                        uproot: true,\r\n                                                        children: {\r\n                                                            '0': { name: '0' },\r\n                                                            '5': {\r\n                                                                name: '5',\r\n                                                                children: keysParagraph,\r\n                                                            },\r\n                                                            '6': { name: '6' },\r\n                                                        },\r\n                                                    },\r\n                                                },\r\n                                            },\r\n                                            '1': { name: 'RunLength' },\r\n                                        },\r\n                                    },\r\n                                },\r\n                            },\r\n                            '6': {\r\n                                name: 'StyleRun',\r\n                                children: {\r\n                                    '0': {\r\n                                        name: 'RunArray',\r\n                                        children: {\r\n                                            '0': {\r\n                                                name: 'StyleSheet',\r\n                                                children: {\r\n                                                    '0': {\r\n                                                        uproot: true,\r\n                                                        children: {\r\n                                                            '6': keysStyleSheetData,\r\n                                                        },\r\n                                                    },\r\n                                                },\r\n                                            },\r\n                                            '1': { name: 'RunLength' },\r\n                                        },\r\n                                    },\r\n                                },\r\n                            },\r\n                        },\r\n                    },\r\n                    '1': {\r\n                        name: 'FontVectorData ???',\r\n                        // children: {\r\n                        // \t'0': {},\r\n                        // \t'2': {\r\n                        // \t\t// '5'\r\n                        // \t\t// '6'\r\n                        // \t},\r\n                        // }\r\n                        //     \"1\": [ // this is probably bounding box? there seem to be many of them nested\r\n                        //       0,\r\n                        //       0,\r\n                        //       999,\r\n                        //       176.30014\r\n                        //     ],\r\n                        // various types: /PC, /F, /R, /L, /S, /G\r\n                    },\r\n                },\r\n            },\r\n            '2': {\r\n                name: 'StyleSheet',\r\n                children: keysStyleSheet,\r\n            },\r\n            '3': {\r\n                name: 'ParagraphSheet',\r\n                children: keysParagraph,\r\n            },\r\n        },\r\n    },\r\n};\r\nfunction decodeObj(obj, keys) {\r\n    var _a, _b;\r\n    if (obj === null)\r\n        return obj;\r\n    if (Array.isArray(obj))\r\n        return obj.map(function (x) { return decodeObj(x, keys); });\r\n    if (typeof obj !== 'object')\r\n        return obj;\r\n    var result = {};\r\n    for (var _i = 0, _c = Object.keys(obj); _i < _c.length; _i++) {\r\n        var key = _c[_i];\r\n        if (keys[key]) {\r\n            if (keys[key].uproot) {\r\n                if (key !== '99')\r\n                    result = decodeObj(obj[key], (_a = keys[key].children) !== null && _a !== void 0 ? _a : {});\r\n                if (obj['99'])\r\n                    result._type = obj['99'];\r\n                break;\r\n            }\r\n            else {\r\n                result[keys[key].name || key] = decodeObj(obj[key], (_b = keys[key].children) !== null && _b !== void 0 ? _b : {});\r\n            }\r\n        }\r\n        else if (key === '99') {\r\n            result._type = obj[key];\r\n        }\r\n        else {\r\n            result[key] = decodeObj(obj[key], {});\r\n        }\r\n    }\r\n    return result;\r\n}\r\nexport function decodeEngineData2(data) {\r\n    return decodeObj(data, keysRoot);\r\n}\r\n//# sourceMappingURL=engineData2.js.map","var __assign = (this && this.__assign) || function () {\r\n    __assign = Object.assign || function(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n                t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\nimport { fromByteArray, toByteArray } from 'base64-js';\r\nimport { readEffects, writeEffects } from './effectsHelpers';\r\nimport { clamp, createEnum, layerColors, MOCK_HANDLERS } from './helpers';\r\nimport { readSignature, readUnicodeString, skipBytes, readUint32, readUint8, readFloat64, readUint16, readBytes, readInt16, checkSignature, readFloat32, readFixedPointPath32, readSection, readColor, readInt32, readPascalString, readUnicodeStringWithLength, readAsciiString, readPattern, readLayerInfo } from './psdReader';\r\nimport { writeZeros, writeSignature, writeBytes, writeUint32, writeUint16, writeFloat64, writeUint8, writeInt16, writeFloat32, writeFixedPointPath32, writeUnicodeString, writeSection, writeUnicodeStringWithPadding, writeColor, writePascalString, writeInt32 } from './psdWriter';\r\nimport { Annt, BlnM, parsePercent, parseUnits, parseUnitsOrNumber, strokeStyleLineAlignment, strokeStyleLineCapType, strokeStyleLineJoinType, textGridding, unitsPercent, unitsValue, warpStyle, writeVersionAndDescriptor, readVersionAndDescriptor, Ornt, horzVrtcToXY, xyToHorzVrtc, serializeEffects, parseEffects, parseColor, serializeColor, serializeVectorContent, parseVectorContent, parseTrackList, serializeTrackList, BlrM, BlrQ, SmBQ, SmBM, DspM, UndA, Cnvr, RplS, SphM, Wvtp, ZZTy, Dstr, Chnl, MztT, Lns, blurType, DfsM, ExtT, ExtR, FlCl, CntE, WndM, Drct, IntE, IntC, FlMd, unitsPercentF, frac, ClrS, descBoundsToBounds, boundsToDescBounds, presetKindType, gradientInterpolationMethodType } from './descriptor';\r\nimport { serializeEngineData, parseEngineData } from './engineData';\r\nimport { encodeEngineData, decodeEngineData } from './text';\r\nimport { decodeEngineData2 } from './engineData2';\r\nvar fromAtoZ = 'abcdefghijklmnopqrstuvwxyz';\r\nexport var infoHandlers = [];\r\nexport var infoHandlersMap = {};\r\nfunction addHandler(key, has, read, write) {\r\n    var handler = { key: key, has: has, read: read, write: write };\r\n    infoHandlers.push(handler);\r\n    infoHandlersMap[handler.key] = handler;\r\n}\r\nfunction addHandlerAlias(key, target) {\r\n    infoHandlersMap[key] = infoHandlersMap[target];\r\n}\r\nfunction hasKey(key) {\r\n    return function (target) { return target[key] !== undefined; };\r\n}\r\nfunction readLength64(reader) {\r\n    if (readUint32(reader))\r\n        throw new Error(\"Resource size above 4 GB limit at \".concat(reader.offset.toString(16)));\r\n    return readUint32(reader);\r\n}\r\nfunction writeLength64(writer, length) {\r\n    writeUint32(writer, 0);\r\n    writeUint32(writer, length);\r\n}\r\naddHandler('TySh', hasKey('text'), function (reader, target, leftBytes) {\r\n    if (readInt16(reader) !== 1)\r\n        throw new Error(\"Invalid TySh version\");\r\n    var transform = [];\r\n    for (var i = 0; i < 6; i++)\r\n        transform.push(readFloat64(reader));\r\n    if (readInt16(reader) !== 50)\r\n        throw new Error(\"Invalid TySh text version\");\r\n    var text = readVersionAndDescriptor(reader);\r\n    // console.log(require('util').inspect(text, false, 99, false), 'utf8');\r\n    if (readInt16(reader) !== 1)\r\n        throw new Error(\"Invalid TySh warp version\");\r\n    var warp = readVersionAndDescriptor(reader);\r\n    // console.log(require('util').inspect(warp, false, 99, false), 'utf8');\r\n    target.text = {\r\n        transform: transform,\r\n        left: readFloat32(reader),\r\n        top: readFloat32(reader),\r\n        right: readFloat32(reader),\r\n        bottom: readFloat32(reader),\r\n        text: text['Txt '].replace(/\\r/g, '\\n'),\r\n        index: text.TextIndex || 0,\r\n        gridding: textGridding.decode(text.textGridding),\r\n        antiAlias: Annt.decode(text.AntA),\r\n        orientation: Ornt.decode(text.Ornt),\r\n        warp: {\r\n            style: warpStyle.decode(warp.warpStyle),\r\n            value: warp.warpValue || 0,\r\n            perspective: warp.warpPerspective || 0,\r\n            perspectiveOther: warp.warpPerspectiveOther || 0,\r\n            rotate: Ornt.decode(warp.warpRotate),\r\n        },\r\n    };\r\n    if (text.bounds)\r\n        target.text.bounds = descBoundsToBounds(text.bounds);\r\n    if (text.boundingBox)\r\n        target.text.boundingBox = descBoundsToBounds(text.boundingBox);\r\n    if (text.EngineData) {\r\n        var engineData = parseEngineData(text.EngineData);\r\n        var textData = decodeEngineData(engineData);\r\n        // console.log(require('util').inspect(engineData, false, 99, false), 'utf8');\r\n        // require('fs').writeFileSync(`layer-${target.name}.txt`, require('util').inspect(engineData, false, 99, false), 'utf8');\r\n        // const before = parseEngineData(text.EngineData);\r\n        // const after = encodeEngineData(engineData);\r\n        // require('fs').writeFileSync('before.txt', require('util').inspect(before, false, 99, false), 'utf8');\r\n        // require('fs').writeFileSync('after.txt', require('util').inspect(after, false, 99, false), 'utf8');\r\n        // console.log(require('util').inspect(parseEngineData(text.EngineData), false, 99, true));\r\n        target.text = __assign(__assign({}, target.text), textData);\r\n        // console.log(require('util').inspect(target.text, false, 99, true));\r\n    }\r\n    skipBytes(reader, leftBytes());\r\n}, function (writer, target) {\r\n    var text = target.text;\r\n    var warp = text.warp || {};\r\n    var transform = text.transform || [1, 0, 0, 1, 0, 0];\r\n    var textDescriptor = __assign(__assign(__assign({ 'Txt ': (text.text || '').replace(/\\r?\\n/g, '\\r'), textGridding: textGridding.encode(text.gridding), Ornt: Ornt.encode(text.orientation), AntA: Annt.encode(text.antiAlias) }, (text.bounds ? { bounds: boundsToDescBounds(text.bounds) } : {})), (text.boundingBox ? { boundingBox: boundsToDescBounds(text.boundingBox) } : {})), { TextIndex: text.index || 0, EngineData: serializeEngineData(encodeEngineData(text)) });\r\n    writeInt16(writer, 1); // version\r\n    for (var i = 0; i < 6; i++) {\r\n        writeFloat64(writer, transform[i]);\r\n    }\r\n    writeInt16(writer, 50); // text version\r\n    writeVersionAndDescriptor(writer, '', 'TxLr', textDescriptor, 'text');\r\n    writeInt16(writer, 1); // warp version\r\n    writeVersionAndDescriptor(writer, '', 'warp', encodeWarp(warp));\r\n    writeFloat32(writer, text.left);\r\n    writeFloat32(writer, text.top);\r\n    writeFloat32(writer, text.right);\r\n    writeFloat32(writer, text.bottom);\r\n    // writeZeros(writer, 2);\r\n});\r\n// vector fills\r\naddHandler('SoCo', function (target) { return target.vectorFill !== undefined && target.vectorStroke === undefined &&\r\n    target.vectorFill.type === 'color'; }, function (reader, target) {\r\n    var descriptor = readVersionAndDescriptor(reader);\r\n    target.vectorFill = parseVectorContent(descriptor);\r\n}, function (writer, target) {\r\n    var descriptor = serializeVectorContent(target.vectorFill).descriptor;\r\n    writeVersionAndDescriptor(writer, '', 'null', descriptor);\r\n});\r\naddHandler('GdFl', function (target) { return target.vectorFill !== undefined && target.vectorStroke === undefined &&\r\n    (target.vectorFill.type === 'solid' || target.vectorFill.type === 'noise'); }, function (reader, target, left) {\r\n    var descriptor = readVersionAndDescriptor(reader);\r\n    target.vectorFill = parseVectorContent(descriptor);\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var descriptor = serializeVectorContent(target.vectorFill).descriptor;\r\n    writeVersionAndDescriptor(writer, '', 'null', descriptor);\r\n});\r\naddHandler('PtFl', function (target) { return target.vectorFill !== undefined && target.vectorStroke === undefined &&\r\n    target.vectorFill.type === 'pattern'; }, function (reader, target) {\r\n    var descriptor = readVersionAndDescriptor(reader);\r\n    target.vectorFill = parseVectorContent(descriptor);\r\n}, function (writer, target) {\r\n    var descriptor = serializeVectorContent(target.vectorFill).descriptor;\r\n    writeVersionAndDescriptor(writer, '', 'null', descriptor);\r\n});\r\naddHandler('vscg', function (target) { return target.vectorFill !== undefined && target.vectorStroke !== undefined; }, function (reader, target, left) {\r\n    readSignature(reader); // key\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.vectorFill = parseVectorContent(desc);\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a = serializeVectorContent(target.vectorFill), descriptor = _a.descriptor, key = _a.key;\r\n    writeSignature(writer, key);\r\n    writeVersionAndDescriptor(writer, '', 'null', descriptor);\r\n});\r\nexport function readBezierKnot(reader, width, height) {\r\n    var y0 = readFixedPointPath32(reader) * height;\r\n    var x0 = readFixedPointPath32(reader) * width;\r\n    var y1 = readFixedPointPath32(reader) * height;\r\n    var x1 = readFixedPointPath32(reader) * width;\r\n    var y2 = readFixedPointPath32(reader) * height;\r\n    var x2 = readFixedPointPath32(reader) * width;\r\n    return [x0, y0, x1, y1, x2, y2];\r\n}\r\nfunction writeBezierKnot(writer, points, width, height) {\r\n    writeFixedPointPath32(writer, points[1] / height); // y0\r\n    writeFixedPointPath32(writer, points[0] / width); // x0\r\n    writeFixedPointPath32(writer, points[3] / height); // y1\r\n    writeFixedPointPath32(writer, points[2] / width); // x1\r\n    writeFixedPointPath32(writer, points[5] / height); // y2\r\n    writeFixedPointPath32(writer, points[4] / width); // x2\r\n}\r\nexport var booleanOperations = ['exclude', 'combine', 'subtract', 'intersect'];\r\nexport function readVectorMask(reader, vectorMask, width, height, size) {\r\n    var end = reader.offset + size;\r\n    var paths = vectorMask.paths;\r\n    var path = undefined;\r\n    while ((end - reader.offset) >= 26) {\r\n        var selector = readUint16(reader);\r\n        switch (selector) {\r\n            case 0: // Closed subpath length record\r\n            case 3: { // Open subpath length record\r\n                readUint16(reader); // count\r\n                var boolOp = readInt16(reader);\r\n                var flags = readUint16(reader); // bit 1 always 1 ?\r\n                skipBytes(reader, 18);\r\n                path = {\r\n                    open: selector === 3,\r\n                    knots: [],\r\n                    fillRule: flags === 2 ? 'non-zero' : 'even-odd',\r\n                };\r\n                if (boolOp !== -1)\r\n                    path.operation = booleanOperations[boolOp];\r\n                paths.push(path);\r\n                break;\r\n            }\r\n            case 1: // Closed subpath Bezier knot, linked\r\n            case 2: // Closed subpath Bezier knot, unlinked\r\n            case 4: // Open subpath Bezier knot, linked\r\n            case 5: // Open subpath Bezier knot, unlinked\r\n                path.knots.push({ linked: (selector === 1 || selector === 4), points: readBezierKnot(reader, width, height) });\r\n                break;\r\n            case 6: // Path fill rule record\r\n                skipBytes(reader, 24);\r\n                break;\r\n            case 7: { // Clipboard record\r\n                // TODO: check if these need to be multiplied by document size\r\n                var top_1 = readFixedPointPath32(reader);\r\n                var left = readFixedPointPath32(reader);\r\n                var bottom = readFixedPointPath32(reader);\r\n                var right = readFixedPointPath32(reader);\r\n                var resolution = readFixedPointPath32(reader);\r\n                skipBytes(reader, 4);\r\n                vectorMask.clipboard = { top: top_1, left: left, bottom: bottom, right: right, resolution: resolution };\r\n                break;\r\n            }\r\n            case 8: // Initial fill rule record\r\n                vectorMask.fillStartsWithAllPixels = !!readUint16(reader);\r\n                skipBytes(reader, 22);\r\n                break;\r\n            default: throw new Error('Invalid vmsk section');\r\n        }\r\n    }\r\n    return paths;\r\n}\r\naddHandler('vmsk', hasKey('vectorMask'), function (reader, target, left, _a) {\r\n    var width = _a.width, height = _a.height;\r\n    if (readUint32(reader) !== 3)\r\n        throw new Error('Invalid vmsk version');\r\n    target.vectorMask = { paths: [] };\r\n    var vectorMask = target.vectorMask;\r\n    var flags = readUint32(reader);\r\n    vectorMask.invert = (flags & 1) !== 0;\r\n    vectorMask.notLink = (flags & 2) !== 0;\r\n    vectorMask.disable = (flags & 4) !== 0;\r\n    readVectorMask(reader, vectorMask, width, height, left());\r\n    // drawBezierPaths(vectorMask.paths, width, height, 'out.png');\r\n    skipBytes(reader, left());\r\n}, function (writer, target, _a) {\r\n    var width = _a.width, height = _a.height;\r\n    var vectorMask = target.vectorMask;\r\n    var flags = (vectorMask.invert ? 1 : 0) |\r\n        (vectorMask.notLink ? 2 : 0) |\r\n        (vectorMask.disable ? 4 : 0);\r\n    writeUint32(writer, 3); // version\r\n    writeUint32(writer, flags);\r\n    // initial entry\r\n    writeUint16(writer, 6);\r\n    writeZeros(writer, 24);\r\n    var clipboard = vectorMask.clipboard;\r\n    if (clipboard) {\r\n        writeUint16(writer, 7);\r\n        writeFixedPointPath32(writer, clipboard.top);\r\n        writeFixedPointPath32(writer, clipboard.left);\r\n        writeFixedPointPath32(writer, clipboard.bottom);\r\n        writeFixedPointPath32(writer, clipboard.right);\r\n        writeFixedPointPath32(writer, clipboard.resolution);\r\n        writeZeros(writer, 4);\r\n    }\r\n    writeUint16(writer, 8);\r\n    writeUint16(writer, vectorMask.fillStartsWithAllPixels ? 1 : 0);\r\n    writeZeros(writer, 22);\r\n    for (var _i = 0, _b = vectorMask.paths; _i < _b.length; _i++) {\r\n        var path = _b[_i];\r\n        writeUint16(writer, path.open ? 3 : 0);\r\n        writeUint16(writer, path.knots.length);\r\n        writeUint16(writer, path.operation ? booleanOperations.indexOf(path.operation) : -1); // -1 for undefined\r\n        writeUint16(writer, path.fillRule === 'non-zero' ? 2 : 1);\r\n        writeZeros(writer, 18); // TODO: these are sometimes non-zero\r\n        var linkedKnot = path.open ? 4 : 1;\r\n        var unlinkedKnot = path.open ? 5 : 2;\r\n        for (var _c = 0, _d = path.knots; _c < _d.length; _c++) {\r\n            var _e = _d[_c], linked = _e.linked, points = _e.points;\r\n            writeUint16(writer, linked ? linkedKnot : unlinkedKnot);\r\n            writeBezierKnot(writer, points, width, height);\r\n        }\r\n    }\r\n});\r\n// TODO: need to write vmsk if has outline ?\r\naddHandlerAlias('vsms', 'vmsk');\r\n// addHandlerAlias('vmsk', 'vsms');\r\naddHandler('vowv', // something with vectors?\r\nhasKey('vowv'), function (reader, target) {\r\n    target.vowv = readUint32(reader); // always 2 ????\r\n}, function (writer, target) {\r\n    writeUint32(writer, target.vowv);\r\n});\r\naddHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left) {\r\n    if (readInt32(reader) !== 1)\r\n        throw new Error(\"Invalid vogk version\");\r\n    var desc = readVersionAndDescriptor(reader);\r\n    // console.log(require('util').inspect(desc, false, 99, true));\r\n    target.vectorOrigination = { keyDescriptorList: [] };\r\n    for (var _i = 0, _a = desc.keyDescriptorList; _i < _a.length; _i++) {\r\n        var i = _a[_i];\r\n        var item = {};\r\n        if (i.keyShapeInvalidated != null)\r\n            item.keyShapeInvalidated = i.keyShapeInvalidated;\r\n        if (i.keyOriginType != null)\r\n            item.keyOriginType = i.keyOriginType;\r\n        if (i.keyOriginResolution != null)\r\n            item.keyOriginResolution = i.keyOriginResolution;\r\n        if (i.keyOriginShapeBBox) {\r\n            item.keyOriginShapeBoundingBox = {\r\n                top: parseUnitsOrNumber(i.keyOriginShapeBBox['Top ']),\r\n                left: parseUnitsOrNumber(i.keyOriginShapeBBox.Left),\r\n                bottom: parseUnitsOrNumber(i.keyOriginShapeBBox.Btom),\r\n                right: parseUnitsOrNumber(i.keyOriginShapeBBox.Rght),\r\n            };\r\n        }\r\n        var rectRadii = i.keyOriginRRectRadii;\r\n        if (rectRadii) {\r\n            item.keyOriginRRectRadii = {\r\n                topRight: parseUnits(rectRadii.topRight),\r\n                topLeft: parseUnits(rectRadii.topLeft),\r\n                bottomLeft: parseUnits(rectRadii.bottomLeft),\r\n                bottomRight: parseUnits(rectRadii.bottomRight),\r\n            };\r\n        }\r\n        var corners = i.keyOriginBoxCorners;\r\n        if (corners) {\r\n            item.keyOriginBoxCorners = [\r\n                { x: corners.rectangleCornerA.Hrzn, y: corners.rectangleCornerA.Vrtc },\r\n                { x: corners.rectangleCornerB.Hrzn, y: corners.rectangleCornerB.Vrtc },\r\n                { x: corners.rectangleCornerC.Hrzn, y: corners.rectangleCornerC.Vrtc },\r\n                { x: corners.rectangleCornerD.Hrzn, y: corners.rectangleCornerD.Vrtc },\r\n            ];\r\n        }\r\n        var trnf = i.Trnf;\r\n        if (trnf) {\r\n            item.transform = [trnf.xx, trnf.xy, trnf.yx, trnf.yy, trnf.tx, trnf.ty];\r\n        }\r\n        target.vectorOrigination.keyDescriptorList.push(item);\r\n    }\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    target;\r\n    var orig = target.vectorOrigination;\r\n    var desc = { keyDescriptorList: [] };\r\n    for (var i = 0; i < orig.keyDescriptorList.length; i++) {\r\n        var item = orig.keyDescriptorList[i];\r\n        desc.keyDescriptorList.push({}); // we're adding keyOriginIndex at the end\r\n        var out = desc.keyDescriptorList[desc.keyDescriptorList.length - 1];\r\n        if (item.keyOriginType != null)\r\n            out.keyOriginType = item.keyOriginType;\r\n        if (item.keyOriginResolution != null)\r\n            out.keyOriginResolution = item.keyOriginResolution;\r\n        var radii = item.keyOriginRRectRadii;\r\n        if (radii) {\r\n            out.keyOriginRRectRadii = {\r\n                unitValueQuadVersion: 1,\r\n                topRight: unitsValue(radii.topRight, 'topRight'),\r\n                topLeft: unitsValue(radii.topLeft, 'topLeft'),\r\n                bottomLeft: unitsValue(radii.bottomLeft, 'bottomLeft'),\r\n                bottomRight: unitsValue(radii.bottomRight, 'bottomRight'),\r\n            };\r\n        }\r\n        var box = item.keyOriginShapeBoundingBox;\r\n        if (box) {\r\n            out.keyOriginShapeBBox = {\r\n                unitValueQuadVersion: 1,\r\n                'Top ': unitsValue(box.top, 'top'),\r\n                Left: unitsValue(box.left, 'left'),\r\n                Btom: unitsValue(box.bottom, 'bottom'),\r\n                Rght: unitsValue(box.right, 'right'),\r\n            };\r\n        }\r\n        var corners = item.keyOriginBoxCorners;\r\n        if (corners && corners.length === 4) {\r\n            out.keyOriginBoxCorners = {\r\n                rectangleCornerA: { Hrzn: corners[0].x, Vrtc: corners[0].y },\r\n                rectangleCornerB: { Hrzn: corners[1].x, Vrtc: corners[1].y },\r\n                rectangleCornerC: { Hrzn: corners[2].x, Vrtc: corners[2].y },\r\n                rectangleCornerD: { Hrzn: corners[3].x, Vrtc: corners[3].y },\r\n            };\r\n        }\r\n        var transform = item.transform;\r\n        if (transform && transform.length === 6) {\r\n            out.Trnf = {\r\n                xx: transform[0],\r\n                xy: transform[1],\r\n                yx: transform[2],\r\n                yy: transform[3],\r\n                tx: transform[4],\r\n                ty: transform[5],\r\n            };\r\n        }\r\n        if (item.keyShapeInvalidated != null)\r\n            out.keyShapeInvalidated = item.keyShapeInvalidated;\r\n        out.keyOriginIndex = i;\r\n    }\r\n    writeInt32(writer, 1); // version\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\naddHandler('lmfx', function (target) { return target.effects !== undefined && hasMultiEffects(target.effects); }, function (reader, target, left) {\r\n    var version = readUint32(reader);\r\n    if (version !== 0)\r\n        throw new Error('Invalid lmfx version');\r\n    var desc = readVersionAndDescriptor(reader);\r\n    // console.log('READ', require('util').inspect(desc, false, 99, true));\r\n    // discard if read in 'lrFX' or 'lfx2' section\r\n    target.effects = parseEffects(desc, !!reader.logMissingFeatures);\r\n    skipBytes(reader, left());\r\n}, function (writer, target, _, options) {\r\n    var desc = serializeEffects(target.effects, !!options.logMissingFeatures, true);\r\n    // console.log('WRITE', require('util').inspect(desc, false, 99, true));\r\n    writeUint32(writer, 0); // version\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\naddHandler('lrFX', hasKey('effects'), function (reader, target, left) {\r\n    if (!target.effects)\r\n        target.effects = readEffects(reader);\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeEffects(writer, target.effects);\r\n});\r\naddHandler('luni', hasKey('name'), function (reader, target, left) {\r\n    if (left() > 4) {\r\n        var length_1 = readUint32(reader);\r\n        if (left() >= (length_1 * 2)) {\r\n            target.name = readUnicodeStringWithLength(reader, length_1);\r\n        }\r\n        else {\r\n            if (reader.logDevFeatures)\r\n                reader.log('name in luni section is too long');\r\n        }\r\n    }\r\n    else {\r\n        if (reader.logDevFeatures)\r\n            reader.log('empty luni section');\r\n    }\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeUnicodeString(writer, target.name);\r\n    // writeUint16(writer, 0); // padding (but not extending string length)\r\n});\r\naddHandler('lnsr', hasKey('nameSource'), function (reader, target) { return target.nameSource = readSignature(reader); }, function (writer, target) { return writeSignature(writer, target.nameSource); });\r\naddHandler('lyid', hasKey('id'), function (reader, target) {\r\n    target.id = readUint32(reader);\r\n}, function (writer, target, _psd, options) {\r\n    var id = target.id;\r\n    while (options.layerIds.has(id))\r\n        id += 100; // make sure we don't have duplicate layer ids\r\n    writeUint32(writer, id);\r\n    options.layerIds.add(id);\r\n    options.layerToId.set(target, id);\r\n});\r\naddHandler('lsct', hasKey('sectionDivider'), function (reader, target, left) {\r\n    target.sectionDivider = { type: readUint32(reader) };\r\n    if (left()) {\r\n        checkSignature(reader, '8BIM');\r\n        target.sectionDivider.key = readSignature(reader);\r\n    }\r\n    if (left()) {\r\n        target.sectionDivider.subType = readUint32(reader);\r\n    }\r\n}, function (writer, target) {\r\n    writeUint32(writer, target.sectionDivider.type);\r\n    if (target.sectionDivider.key) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, target.sectionDivider.key);\r\n        if (target.sectionDivider.subType !== undefined) {\r\n            writeUint32(writer, target.sectionDivider.subType);\r\n        }\r\n    }\r\n});\r\n// it seems lsdk is used when there's a layer is nested more than 6 levels, but I don't know why?\r\n// maybe some limitation of old version of PS?\r\naddHandlerAlias('lsdk', 'lsct');\r\naddHandler('clbl', hasKey('blendClippendElements'), function (reader, target) {\r\n    target.blendClippendElements = !!readUint8(reader);\r\n    skipBytes(reader, 3);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.blendClippendElements ? 1 : 0);\r\n    writeZeros(writer, 3);\r\n});\r\naddHandler('infx', hasKey('blendInteriorElements'), function (reader, target) {\r\n    target.blendInteriorElements = !!readUint8(reader);\r\n    skipBytes(reader, 3);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.blendInteriorElements ? 1 : 0);\r\n    writeZeros(writer, 3);\r\n});\r\naddHandler('knko', hasKey('knockout'), function (reader, target) {\r\n    target.knockout = !!readUint8(reader);\r\n    skipBytes(reader, 3);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.knockout ? 1 : 0);\r\n    writeZeros(writer, 3);\r\n});\r\naddHandler('lmgm', hasKey('layerMaskAsGlobalMask'), function (reader, target) {\r\n    target.layerMaskAsGlobalMask = !!readUint8(reader);\r\n    skipBytes(reader, 3);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.layerMaskAsGlobalMask ? 1 : 0);\r\n    writeZeros(writer, 3);\r\n});\r\naddHandler('lspf', hasKey('protected'), function (reader, target) {\r\n    var flags = readUint32(reader);\r\n    target.protected = {\r\n        transparency: (flags & 0x01) !== 0,\r\n        composite: (flags & 0x02) !== 0,\r\n        position: (flags & 0x04) !== 0,\r\n    };\r\n    if (flags & 0x08)\r\n        target.protected.artboards = true;\r\n}, function (writer, target) {\r\n    var flags = (target.protected.transparency ? 0x01 : 0) |\r\n        (target.protected.composite ? 0x02 : 0) |\r\n        (target.protected.position ? 0x04 : 0) |\r\n        (target.protected.artboards ? 0x08 : 0);\r\n    writeUint32(writer, flags);\r\n});\r\naddHandler('lclr', hasKey('layerColor'), function (reader, target) {\r\n    var color = readUint16(reader);\r\n    skipBytes(reader, 6);\r\n    target.layerColor = layerColors[color];\r\n}, function (writer, target) {\r\n    var index = layerColors.indexOf(target.layerColor);\r\n    writeUint16(writer, index === -1 ? 0 : index);\r\n    writeZeros(writer, 6);\r\n});\r\naddHandler('shmd', // Metadata setting\r\nfunction (// Metadata setting\r\ntarget) { return target.timestamp !== undefined || target.animationFrames !== undefined || target.animationFrameFlags !== undefined || target.timeline !== undefined || target.comps !== undefined; }, function (reader, target, left) {\r\n    var count = readUint32(reader);\r\n    var _loop_1 = function (i) {\r\n        checkSignature(reader, '8BIM');\r\n        var key = readSignature(reader);\r\n        readUint8(reader); // copy\r\n        skipBytes(reader, 3);\r\n        readSection(reader, 1, function (left) {\r\n            if (key === 'cust') {\r\n                var desc = readVersionAndDescriptor(reader);\r\n                // console.log('cust', target.name, require('util').inspect(desc, false, 99, true));\r\n                if (desc.layerTime !== undefined)\r\n                    target.timestamp = desc.layerTime;\r\n            }\r\n            else if (key === 'mlst') {\r\n                var desc = readVersionAndDescriptor(reader);\r\n                // console.log('mlst', target.name, require('util').inspect(desc, false, 99, true));\r\n                target.animationFrames = [];\r\n                for (var i_1 = 0; i_1 < desc.LaSt.length; i_1++) {\r\n                    var f = desc.LaSt[i_1];\r\n                    var frame = { frames: f.FrLs };\r\n                    if (f.enab !== undefined)\r\n                        frame.enable = f.enab;\r\n                    if (f.Ofst)\r\n                        frame.offset = horzVrtcToXY(f.Ofst);\r\n                    if (f.FXRf)\r\n                        frame.referencePoint = horzVrtcToXY(f.FXRf);\r\n                    if (f.Lefx)\r\n                        frame.effects = parseEffects(f.Lefx, !!reader.logMissingFeatures);\r\n                    if (f.blendOptions && f.blendOptions.Opct)\r\n                        frame.opacity = parsePercent(f.blendOptions.Opct);\r\n                    target.animationFrames.push(frame);\r\n                }\r\n            }\r\n            else if (key === 'mdyn') {\r\n                // frame flags\r\n                readUint16(reader); // unknown\r\n                var propagate = readUint8(reader);\r\n                var flags = readUint8(reader);\r\n                target.animationFrameFlags = {\r\n                    propagateFrameOne: !propagate,\r\n                    unifyLayerPosition: (flags & 1) !== 0,\r\n                    unifyLayerStyle: (flags & 2) !== 0,\r\n                    unifyLayerVisibility: (flags & 4) !== 0,\r\n                };\r\n            }\r\n            else if (key === 'tmln') {\r\n                var desc = readVersionAndDescriptor(reader);\r\n                var timeScope = desc.timeScope;\r\n                // console.log('tmln', target.name, target.id, require('util').inspect(desc, false, 99, true));\r\n                var timeline = {\r\n                    start: frac(timeScope.Strt),\r\n                    duration: frac(timeScope.duration),\r\n                    inTime: frac(timeScope.inTime),\r\n                    outTime: frac(timeScope.outTime),\r\n                    autoScope: desc.autoScope,\r\n                    audioLevel: desc.audioLevel,\r\n                };\r\n                if (desc.trackList) {\r\n                    timeline.tracks = parseTrackList(desc.trackList, !!reader.logMissingFeatures);\r\n                }\r\n                target.timeline = timeline;\r\n                // console.log('tmln:result', target.name, target.id, require('util').inspect(timeline, false, 99, true));\r\n            }\r\n            else if (key === 'cmls') {\r\n                var desc = readVersionAndDescriptor(reader);\r\n                // console.log('cmls', require('util').inspect(desc, false, 99, true));\r\n                target.comps = {\r\n                    settings: [],\r\n                };\r\n                if (desc.origFXRefPoint)\r\n                    target.comps.originalEffectsReferencePoint = { x: desc.origFXRefPoint.Hrzn, y: desc.origFXRefPoint.Vrtc };\r\n                for (var _i = 0, _a = desc.layerSettings; _i < _a.length; _i++) {\r\n                    var item = _a[_i];\r\n                    target.comps.settings.push({ compList: item.compList });\r\n                    var t = target.comps.settings[target.comps.settings.length - 1];\r\n                    if ('enab' in item)\r\n                        t.enabled = item.enab;\r\n                    if (item.Ofst)\r\n                        t.offset = { x: item.Ofst.Hrzn, y: item.Ofst.Vrtc };\r\n                    if (item.FXRefPoint)\r\n                        t.effectsReferencePoint = { x: item.FXRefPoint.Hrzn, y: item.FXRefPoint.Vrtc };\r\n                }\r\n            }\r\n            else if (key === 'extn') {\r\n                var desc = readVersionAndDescriptor(reader);\r\n                // console.log(require('util').inspect(desc, false, 99, true));\r\n                desc; // TODO: save this\r\n                reader.logMissingFeatures && reader.log('Unhandled \"shmd\" section key', key);\r\n            }\r\n            else {\r\n                reader.logMissingFeatures && reader.log('Unhandled \"shmd\" section key', key);\r\n            }\r\n            skipBytes(reader, left());\r\n        });\r\n    };\r\n    for (var i = 0; i < count; i++) {\r\n        _loop_1(i);\r\n    }\r\n    skipBytes(reader, left());\r\n}, function (writer, target, _, options) {\r\n    var animationFrames = target.animationFrames, animationFrameFlags = target.animationFrameFlags, timestamp = target.timestamp, timeline = target.timeline, comps = target.comps;\r\n    var count = 0;\r\n    if (animationFrames)\r\n        count++;\r\n    if (animationFrameFlags)\r\n        count++;\r\n    if (timeline)\r\n        count++;\r\n    if (timestamp !== undefined)\r\n        count++;\r\n    if (comps)\r\n        count++;\r\n    writeUint32(writer, count);\r\n    if (animationFrames) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'mlst');\r\n        writeUint8(writer, 0); // copy (always false)\r\n        writeZeros(writer, 3);\r\n        writeSection(writer, 2, function () {\r\n            var _a;\r\n            var desc = {\r\n                LaID: (_a = target.id) !== null && _a !== void 0 ? _a : 0,\r\n                LaSt: [],\r\n            };\r\n            for (var i = 0; i < animationFrames.length; i++) {\r\n                var f = animationFrames[i];\r\n                var frame = {};\r\n                if (f.enable !== undefined)\r\n                    frame.enab = f.enable;\r\n                frame.FrLs = f.frames;\r\n                if (f.offset)\r\n                    frame.Ofst = xyToHorzVrtc(f.offset);\r\n                if (f.referencePoint)\r\n                    frame.FXRf = xyToHorzVrtc(f.referencePoint);\r\n                if (f.effects)\r\n                    frame.Lefx = serializeEffects(f.effects, false, false);\r\n                if (f.opacity !== undefined)\r\n                    frame.blendOptions = { Opct: unitsPercent(f.opacity) };\r\n                desc.LaSt.push(frame);\r\n            }\r\n            writeVersionAndDescriptor(writer, '', 'null', desc);\r\n        }, true);\r\n    }\r\n    if (animationFrameFlags) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'mdyn');\r\n        writeUint8(writer, 0); // copy (always false)\r\n        writeZeros(writer, 3);\r\n        writeSection(writer, 2, function () {\r\n            writeUint16(writer, 0); // unknown\r\n            writeUint8(writer, animationFrameFlags.propagateFrameOne ? 0x0 : 0xf);\r\n            writeUint8(writer, (animationFrameFlags.unifyLayerPosition ? 1 : 0) |\r\n                (animationFrameFlags.unifyLayerStyle ? 2 : 0) |\r\n                (animationFrameFlags.unifyLayerVisibility ? 4 : 0));\r\n        });\r\n    }\r\n    if (timeline) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'tmln');\r\n        writeUint8(writer, 0); // copy (always false)\r\n        writeZeros(writer, 3);\r\n        writeSection(writer, 2, function () {\r\n            var desc = {\r\n                Vrsn: 1,\r\n                timeScope: {\r\n                    Vrsn: 1,\r\n                    Strt: timeline.start,\r\n                    duration: timeline.duration,\r\n                    inTime: timeline.inTime,\r\n                    outTime: timeline.outTime,\r\n                },\r\n                autoScope: timeline.autoScope,\r\n                audioLevel: timeline.audioLevel,\r\n            };\r\n            if (timeline.tracks) {\r\n                desc.trackList = serializeTrackList(timeline.tracks);\r\n            }\r\n            var id = options.layerToId.get(target) || target.id;\r\n            if (!id)\r\n                throw new Error('You need to provide layer.id value whan writing document with animations');\r\n            desc.LyrI = id;\r\n            // console.log('WRITE:tmln', target.name, target.id, require('util').inspect(desc, false, 99, true));\r\n            writeVersionAndDescriptor(writer, '', 'null', desc, 'anim');\r\n        }, true);\r\n    }\r\n    if (timestamp !== undefined) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'cust');\r\n        writeUint8(writer, 0); // copy (always false)\r\n        writeZeros(writer, 3);\r\n        writeSection(writer, 2, function () {\r\n            var desc = {\r\n                layerTime: timestamp,\r\n            };\r\n            writeVersionAndDescriptor(writer, '', 'metadata', desc);\r\n        }, true);\r\n    }\r\n    if (comps) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'cmls');\r\n        writeUint8(writer, 0); // copy (always false)\r\n        writeZeros(writer, 3);\r\n        writeSection(writer, 2, function () {\r\n            var id = options.layerToId.get(target) || target.id;\r\n            if (!id)\r\n                throw new Error('You need to provide layer.id value whan writing document with layer comps');\r\n            var desc = {};\r\n            if (comps.originalEffectsReferencePoint) {\r\n                desc.origFXRefPoint = { Hrzn: comps.originalEffectsReferencePoint.x, Vrtc: comps.originalEffectsReferencePoint.y };\r\n            }\r\n            desc.LyrI = id;\r\n            desc.layerSettings = [];\r\n            for (var _i = 0, _a = comps.settings; _i < _a.length; _i++) {\r\n                var item = _a[_i];\r\n                var t = {};\r\n                if (item.enabled !== undefined)\r\n                    t.enab = item.enabled;\r\n                if (item.offset)\r\n                    t.Ofst = { Hrzn: item.offset.x, Vrtc: item.offset.y };\r\n                if (item.effectsReferencePoint)\r\n                    t.FXRefPoint = { Hrzn: item.effectsReferencePoint.x, Vrtc: item.effectsReferencePoint.y };\r\n                t.compList = item.compList;\r\n                desc.layerSettings.push(t);\r\n            }\r\n            // console.log('cmls', require('util').inspect(desc, false, 99, true));\r\n            writeVersionAndDescriptor(writer, '', 'null', desc);\r\n        }, true);\r\n    }\r\n});\r\naddHandler('PxSc', function () { return false; }, function (reader, target) {\r\n    var desc = readVersionAndDescriptor(reader, true);\r\n    // console.log('PxSc', require('util').inspect(desc, false, 99, true));\r\n    if (desc.pixelSourceType === 1986285651) {\r\n        target.pixelSource = {\r\n            type: 'vdPS',\r\n            origin: { x: desc.origin.Hrzn, y: desc.origin.Vrtc },\r\n            interpretation: {\r\n                interpretAlpha: desc.interpretation.interpretAlpha.split('.')[1],\r\n                profile: desc.interpretation.profile,\r\n            },\r\n            frameReader: {\r\n                type: 'QTFR',\r\n                link: {\r\n                    name: desc.frameReader['Lnk ']['Nm  '],\r\n                    fullPath: desc.frameReader['Lnk '].fullPath,\r\n                    originalPath: desc.frameReader['Lnk '].originalPath,\r\n                    relativePath: desc.frameReader['Lnk '].relPath,\r\n                    alias: desc.frameReader['Lnk '].alis,\r\n                },\r\n                mediaDescriptor: desc.frameReader.mediaDescriptor,\r\n            },\r\n            showAlteredVideo: desc.showAlteredVideo,\r\n        };\r\n    }\r\n    else {\r\n        reader.log(\"Unknown pixelSourceType\");\r\n    }\r\n}, function (writer, target) {\r\n    var source = target.pixelSource;\r\n    var desc = {\r\n        _name: '',\r\n        _classID: 'PixelSource',\r\n        pixelSourceType: 1986285651,\r\n        descVersion: 1,\r\n        origin: { Hrzn: source.origin.x, Vrtc: source.origin.y },\r\n        interpretation: {\r\n            _name: '',\r\n            _classID: 'footageInterpretation',\r\n            Vrsn: 1,\r\n            interpretAlpha: \"alphaInterpretation.\".concat(source.interpretation.interpretAlpha),\r\n            profile: source.interpretation.profile,\r\n        },\r\n        frameReader: {\r\n            _name: '',\r\n            _classID: 'FrameReader',\r\n            frameReaderType: 1364477522,\r\n            descVersion: 1,\r\n            'Lnk ': {\r\n                _name: '',\r\n                _classID: 'ExternalFileLink',\r\n                descVersion: 2,\r\n                'Nm  ': source.frameReader.link.name,\r\n                fullPath: source.frameReader.link.fullPath,\r\n                originalPath: source.frameReader.link.originalPath,\r\n                alis: source.frameReader.link.alias,\r\n                relPath: source.frameReader.link.relativePath,\r\n            },\r\n            mediaDescriptor: source.frameReader.mediaDescriptor,\r\n        },\r\n        showAlteredVideo: source.showAlteredVideo,\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'PixelSource', desc);\r\n});\r\naddHandler('vstk', hasKey('vectorStroke'), function (reader, target, left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    // console.log(require('util').inspect(desc, false, 99, true));\r\n    target.vectorStroke = {\r\n        strokeEnabled: desc.strokeEnabled,\r\n        fillEnabled: desc.fillEnabled,\r\n        lineWidth: parseUnits(desc.strokeStyleLineWidth),\r\n        lineDashOffset: parseUnits(desc.strokeStyleLineDashOffset),\r\n        miterLimit: desc.strokeStyleMiterLimit,\r\n        lineCapType: strokeStyleLineCapType.decode(desc.strokeStyleLineCapType),\r\n        lineJoinType: strokeStyleLineJoinType.decode(desc.strokeStyleLineJoinType),\r\n        lineAlignment: strokeStyleLineAlignment.decode(desc.strokeStyleLineAlignment),\r\n        scaleLock: desc.strokeStyleScaleLock,\r\n        strokeAdjust: desc.strokeStyleStrokeAdjust,\r\n        lineDashSet: desc.strokeStyleLineDashSet.map(parseUnits),\r\n        blendMode: BlnM.decode(desc.strokeStyleBlendMode),\r\n        opacity: parsePercent(desc.strokeStyleOpacity),\r\n        content: parseVectorContent(desc.strokeStyleContent),\r\n        resolution: desc.strokeStyleResolution,\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a, _b, _c;\r\n    var stroke = target.vectorStroke;\r\n    var desc = {\r\n        strokeStyleVersion: 2,\r\n        strokeEnabled: !!stroke.strokeEnabled,\r\n        fillEnabled: !!stroke.fillEnabled,\r\n        strokeStyleLineWidth: stroke.lineWidth || { value: 3, units: 'Points' },\r\n        strokeStyleLineDashOffset: stroke.lineDashOffset || { value: 0, units: 'Points' },\r\n        strokeStyleMiterLimit: (_a = stroke.miterLimit) !== null && _a !== void 0 ? _a : 100,\r\n        strokeStyleLineCapType: strokeStyleLineCapType.encode(stroke.lineCapType),\r\n        strokeStyleLineJoinType: strokeStyleLineJoinType.encode(stroke.lineJoinType),\r\n        strokeStyleLineAlignment: strokeStyleLineAlignment.encode(stroke.lineAlignment),\r\n        strokeStyleScaleLock: !!stroke.scaleLock,\r\n        strokeStyleStrokeAdjust: !!stroke.strokeAdjust,\r\n        strokeStyleLineDashSet: stroke.lineDashSet || [],\r\n        strokeStyleBlendMode: BlnM.encode(stroke.blendMode),\r\n        strokeStyleOpacity: unitsPercent((_b = stroke.opacity) !== null && _b !== void 0 ? _b : 1),\r\n        strokeStyleContent: serializeVectorContent(stroke.content || { type: 'color', color: { r: 0, g: 0, b: 0 } }).descriptor,\r\n        strokeStyleResolution: (_c = stroke.resolution) !== null && _c !== void 0 ? _c : 72,\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'strokeStyle', desc);\r\n});\r\naddHandler('artb', // per-layer arboard info\r\nhasKey('artboard'), function (reader, target, left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    var rect = desc.artboardRect;\r\n    target.artboard = {\r\n        rect: { top: rect['Top '], left: rect.Left, bottom: rect.Btom, right: rect.Rght },\r\n        guideIndices: desc.guideIndeces,\r\n        presetName: desc.artboardPresetName,\r\n        color: parseColor(desc['Clr ']),\r\n        backgroundType: desc.artboardBackgroundType,\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a;\r\n    var artboard = target.artboard;\r\n    var rect = artboard.rect;\r\n    var desc = {\r\n        artboardRect: { 'Top ': rect.top, Left: rect.left, Btom: rect.bottom, Rght: rect.right },\r\n        guideIndeces: artboard.guideIndices || [],\r\n        artboardPresetName: artboard.presetName || '',\r\n        'Clr ': serializeColor(artboard.color),\r\n        artboardBackgroundType: (_a = artboard.backgroundType) !== null && _a !== void 0 ? _a : 1,\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'artboard', desc);\r\n});\r\naddHandler('sn2P', hasKey('usingAlignedRendering'), function (reader, target) { return target.usingAlignedRendering = !!readUint32(reader); }, function (writer, target) { return writeUint32(writer, target.usingAlignedRendering ? 1 : 0); });\r\nvar placedLayerTypes = ['unknown', 'vector', 'raster', 'image stack'];\r\nfunction parseWarp(warp) {\r\n    var _a, _b, _c, _d, _e, _f;\r\n    var result = __assign(__assign({ style: warpStyle.decode(warp.warpStyle) }, (warp.warpValues ? { values: warp.warpValues } : { value: warp.warpValue || 0 })), { perspective: warp.warpPerspective || 0, perspectiveOther: warp.warpPerspectiveOther || 0, rotate: Ornt.decode(warp.warpRotate), bounds: warp.bounds && {\r\n            top: parseUnitsOrNumber(warp.bounds['Top ']),\r\n            left: parseUnitsOrNumber(warp.bounds.Left),\r\n            bottom: parseUnitsOrNumber(warp.bounds.Btom),\r\n            right: parseUnitsOrNumber(warp.bounds.Rght),\r\n        }, uOrder: warp.uOrder, vOrder: warp.vOrder });\r\n    if (warp.deformNumRows != null || warp.deformNumCols != null) {\r\n        result.deformNumRows = warp.deformNumRows;\r\n        result.deformNumCols = warp.deformNumCols;\r\n    }\r\n    var envelopeWarp = warp.customEnvelopeWarp;\r\n    if (envelopeWarp) {\r\n        result.customEnvelopeWarp = {\r\n            meshPoints: [],\r\n        };\r\n        var xs = ((_a = envelopeWarp.meshPoints.find(function (i) { return i.type === 'Hrzn'; })) === null || _a === void 0 ? void 0 : _a.values) || [];\r\n        var ys = ((_b = envelopeWarp.meshPoints.find(function (i) { return i.type === 'Vrtc'; })) === null || _b === void 0 ? void 0 : _b.values) || [];\r\n        for (var i = 0; i < xs.length; i++) {\r\n            result.customEnvelopeWarp.meshPoints.push({ x: xs[i], y: ys[i] });\r\n        }\r\n        if (envelopeWarp.quiltSliceX || envelopeWarp.quiltSliceY) {\r\n            result.customEnvelopeWarp.quiltSliceX = ((_d = (_c = envelopeWarp.quiltSliceX) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.values) || [];\r\n            result.customEnvelopeWarp.quiltSliceY = ((_f = (_e = envelopeWarp.quiltSliceY) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.values) || [];\r\n        }\r\n    }\r\n    return result;\r\n}\r\nfunction isQuiltWarp(warp) {\r\n    var _a, _b;\r\n    return warp.deformNumCols != null || warp.deformNumRows != null ||\r\n        ((_a = warp.customEnvelopeWarp) === null || _a === void 0 ? void 0 : _a.quiltSliceX) || ((_b = warp.customEnvelopeWarp) === null || _b === void 0 ? void 0 : _b.quiltSliceY);\r\n}\r\nfunction encodeWarp(warp) {\r\n    var bounds = warp.bounds;\r\n    var desc = __assign(__assign({ warpStyle: warpStyle.encode(warp.style) }, (warp.values ? { warpValues: warp.values } : { warpValue: warp.value || 0 })), { warpPerspective: warp.perspective || 0, warpPerspectiveOther: warp.perspectiveOther || 0, warpRotate: Ornt.encode(warp.rotate), bounds: /*1 ? { // testing\r\n            _classID: 'classFloatRect',\r\n            'Top ': bounds && bounds.top && bounds.top.value || 0,\r\n            Left: bounds && bounds.left && bounds.left.value || 0,\r\n            Btom: bounds && bounds.bottom && bounds.bottom.value || 0,\r\n            Rght: bounds && bounds.right && bounds.right.value || 0,\r\n        } :*/ {\r\n            'Top ': unitsValue(bounds && bounds.top || { units: 'Pixels', value: 0 }, 'bounds.top'),\r\n            Left: unitsValue(bounds && bounds.left || { units: 'Pixels', value: 0 }, 'bounds.left'),\r\n            Btom: unitsValue(bounds && bounds.bottom || { units: 'Pixels', value: 0 }, 'bounds.bottom'),\r\n            Rght: unitsValue(bounds && bounds.right || { units: 'Pixels', value: 0 }, 'bounds.right'),\r\n        }, uOrder: warp.uOrder || 0, vOrder: warp.vOrder || 0 });\r\n    var isQuilt = isQuiltWarp(warp);\r\n    if (isQuilt) {\r\n        var desc2 = desc;\r\n        desc2.deformNumRows = warp.deformNumRows || 0;\r\n        desc2.deformNumCols = warp.deformNumCols || 0;\r\n    }\r\n    var customEnvelopeWarp = warp.customEnvelopeWarp;\r\n    if (customEnvelopeWarp) {\r\n        var meshPoints = customEnvelopeWarp.meshPoints || [];\r\n        if (isQuilt) {\r\n            var desc2 = desc;\r\n            desc2.customEnvelopeWarp = {\r\n                _name: '',\r\n                _classID: 'customEnvelopeWarp',\r\n                quiltSliceX: [{\r\n                        type: 'quiltSliceX',\r\n                        values: customEnvelopeWarp.quiltSliceX || [],\r\n                    }],\r\n                quiltSliceY: [{\r\n                        type: 'quiltSliceY',\r\n                        values: customEnvelopeWarp.quiltSliceY || [],\r\n                    }],\r\n                meshPoints: [\r\n                    { type: 'Hrzn', values: meshPoints.map(function (p) { return p.x; }) },\r\n                    { type: 'Vrtc', values: meshPoints.map(function (p) { return p.y; }) },\r\n                ],\r\n            };\r\n        }\r\n        else {\r\n            desc.customEnvelopeWarp = {\r\n                _name: '',\r\n                _classID: 'customEnvelopeWarp',\r\n                meshPoints: [\r\n                    { type: 'Hrzn', values: meshPoints.map(function (p) { return p.x; }) },\r\n                    { type: 'Vrtc', values: meshPoints.map(function (p) { return p.y; }) },\r\n                ],\r\n            };\r\n        }\r\n    }\r\n    return desc;\r\n}\r\naddHandler('PlLd', hasKey('placedLayer'), function (reader, target, left) {\r\n    if (readSignature(reader) !== 'plcL')\r\n        throw new Error(\"Invalid PlLd signature\");\r\n    if (readInt32(reader) !== 3)\r\n        throw new Error(\"Invalid PlLd version\");\r\n    var id = readPascalString(reader, 1);\r\n    var pageNumber = readInt32(reader);\r\n    var totalPages = readInt32(reader); // TODO: check how this works ?\r\n    readInt32(reader); // anitAliasPolicy 16\r\n    var placedLayerType = readInt32(reader); // 0 = unknown, 1 = vector, 2 = raster, 3 = image stack\r\n    if (!placedLayerTypes[placedLayerType])\r\n        throw new Error('Invalid PlLd type');\r\n    var transform = [];\r\n    for (var i = 0; i < 8; i++)\r\n        transform.push(readFloat64(reader)); // x, y of 4 corners of the transform\r\n    var warpVersion = readInt32(reader);\r\n    if (warpVersion !== 0)\r\n        throw new Error(\"Invalid Warp version \".concat(warpVersion));\r\n    var warp = readVersionAndDescriptor(reader);\r\n    target.placedLayer = target.placedLayer || {\r\n        id: id,\r\n        type: placedLayerTypes[placedLayerType],\r\n        pageNumber: pageNumber,\r\n        totalPages: totalPages,\r\n        transform: transform,\r\n        warp: parseWarp(warp),\r\n    };\r\n    // console.log('PlLd warp', require('util').inspect(warp, false, 99, true));\r\n    // console.log('PlLd', require('util').inspect(target.placedLayer, false, 99, true));\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var placed = target.placedLayer;\r\n    writeSignature(writer, 'plcL');\r\n    writeInt32(writer, 3); // version\r\n    if (!placed.id || typeof placed.id !== 'string' || !/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/.test(placed.id)) {\r\n        throw new Error('Placed layer ID must be in a GUID format (example: 20953ddb-9391-11ec-b4f1-c15674f50bc4)');\r\n    }\r\n    writePascalString(writer, placed.id, 1);\r\n    writeInt32(writer, 1); // pageNumber\r\n    writeInt32(writer, 1); // totalPages\r\n    writeInt32(writer, 16); // anitAliasPolicy\r\n    if (placedLayerTypes.indexOf(placed.type) === -1)\r\n        throw new Error('Invalid placedLayer type');\r\n    writeInt32(writer, placedLayerTypes.indexOf(placed.type));\r\n    for (var i = 0; i < 8; i++)\r\n        writeFloat64(writer, placed.transform[i]);\r\n    writeInt32(writer, 0); // warp version\r\n    var warp = getWarpFromPlacedLayer(placed);\r\n    var isQuilt = isQuiltWarp(warp);\r\n    var type = isQuilt ? 'quiltWarp' : 'warp';\r\n    writeVersionAndDescriptor(writer, '', type, encodeWarp(warp), type);\r\n});\r\nfunction uint8ToFloat32(array) {\r\n    return new Float32Array(array.buffer.slice(array.byteOffset), 0, array.byteLength / 4);\r\n}\r\nfunction uint8ToUint32(array) {\r\n    return new Uint32Array(array.buffer.slice(array.byteOffset), 0, array.byteLength / 4);\r\n}\r\nfunction toUint8(array) {\r\n    return new Uint8Array(array.buffer, array.byteOffset, array.byteLength);\r\n}\r\nfunction arrayToPoints(array) {\r\n    var points = [];\r\n    for (var i = 0; i < array.length; i += 2) {\r\n        points.push({ x: array[i], y: array[i + 1] });\r\n    }\r\n    return points;\r\n}\r\nfunction pointsToArray(points) {\r\n    var array = [];\r\n    for (var i = 0; i < points.length; i++) {\r\n        array.push(points[i].x, points[i].y);\r\n    }\r\n    return array;\r\n}\r\nfunction uint8ToPoints(array) {\r\n    return arrayToPoints(uint8ToFloat32(array));\r\n}\r\nfunction hrznVrtcToPoint(desc) {\r\n    return {\r\n        x: parseUnits(desc.Hrzn),\r\n        y: parseUnits(desc.Vrtc),\r\n    };\r\n}\r\nfunction pointToHrznVrtc(point) {\r\n    return {\r\n        _name: '',\r\n        _classID: 'Pnt ',\r\n        Hrzn: unitsValue(point.x, 'x'),\r\n        Vrtc: unitsValue(point.y, 'y'),\r\n    };\r\n}\r\nfunction parseFilterFXItem(f, options) {\r\n    var base = {\r\n        name: f['Nm  '],\r\n        opacity: parsePercent(f.blendOptions.Opct),\r\n        blendMode: BlnM.decode(f.blendOptions['Md  ']),\r\n        enabled: f.enab,\r\n        hasOptions: f.hasoptions,\r\n        foregroundColor: parseColor(f.FrgC),\r\n        backgroundColor: parseColor(f.BckC),\r\n    };\r\n    if ('Fltr' in f) {\r\n        switch (f.Fltr._classID) {\r\n            case 'boxblur': return __assign(__assign({}, base), { type: 'box blur', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                } });\r\n            case 'GsnB': return __assign(__assign({}, base), { type: 'gaussian blur', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                } });\r\n            case 'MtnB': return __assign(__assign({}, base), { type: 'motion blur', filter: {\r\n                    angle: f.Fltr.Angl,\r\n                    distance: parseUnits(f.Fltr.Dstn),\r\n                } });\r\n            case 'RdlB': return __assign(__assign({}, base), { type: 'radial blur', filter: {\r\n                    amount: f.Fltr.Amnt,\r\n                    method: BlrM.decode(f.Fltr.BlrM),\r\n                    quality: BlrQ.decode(f.Fltr.BlrQ),\r\n                } });\r\n            case 'shapeBlur': return __assign(__assign({}, base), { type: 'shape blur', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                    customShape: { name: f.Fltr.customShape['Nm  '], id: f.Fltr.customShape.Idnt },\r\n                } });\r\n            case 'SmrB': return __assign(__assign({}, base), { type: 'smart blur', filter: {\r\n                    radius: f.Fltr['Rds '],\r\n                    threshold: f.Fltr.Thsh,\r\n                    quality: SmBQ.decode(f.Fltr.SmBQ),\r\n                    mode: SmBM.decode(f.Fltr.SmBM),\r\n                } });\r\n            case 'surfaceBlur': return __assign(__assign({}, base), { type: 'surface blur', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                    threshold: f.Fltr.Thsh,\r\n                } });\r\n            case 'Dspl': return __assign(__assign({}, base), { type: 'displace', filter: {\r\n                    horizontalScale: f.Fltr.HrzS,\r\n                    verticalScale: f.Fltr.VrtS,\r\n                    displacementMap: DspM.decode(f.Fltr.DspM),\r\n                    undefinedAreas: UndA.decode(f.Fltr.UndA),\r\n                    displacementFile: {\r\n                        signature: f.Fltr.DspF.sig,\r\n                        path: f.Fltr.DspF.path, // TODO: this is decoded incorrectly ???\r\n                    },\r\n                } });\r\n            case 'Pnch': return __assign(__assign({}, base), { type: 'pinch', filter: {\r\n                    amount: f.Fltr.Amnt,\r\n                } });\r\n            case 'Plr ': return __assign(__assign({}, base), { type: 'polar coordinates', filter: {\r\n                    conversion: Cnvr.decode(f.Fltr.Cnvr),\r\n                } });\r\n            case 'Rple': return __assign(__assign({}, base), { type: 'ripple', filter: {\r\n                    amount: f.Fltr.Amnt,\r\n                    size: RplS.decode(f.Fltr.RplS),\r\n                } });\r\n            case 'Shr ': return __assign(__assign({}, base), { type: 'shear', filter: {\r\n                    shearPoints: f.Fltr.ShrP.map(function (p) { return ({ x: p.Hrzn, y: p.Vrtc }); }),\r\n                    shearStart: f.Fltr.ShrS,\r\n                    shearEnd: f.Fltr.ShrE,\r\n                    undefinedAreas: UndA.decode(f.Fltr.UndA),\r\n                } });\r\n            case 'Sphr': return __assign(__assign({}, base), { type: 'spherize', filter: {\r\n                    amount: f.Fltr.Amnt,\r\n                    mode: SphM.decode(f.Fltr.SphM),\r\n                } });\r\n            case 'Twrl': return __assign(__assign({}, base), { type: 'twirl', filter: {\r\n                    angle: f.Fltr.Angl,\r\n                } });\r\n            case 'Wave': return __assign(__assign({}, base), { type: 'wave', filter: {\r\n                    numberOfGenerators: f.Fltr.NmbG,\r\n                    type: Wvtp.decode(f.Fltr.Wvtp),\r\n                    wavelength: { min: f.Fltr.WLMn, max: f.Fltr.WLMx },\r\n                    amplitude: { min: f.Fltr.AmMn, max: f.Fltr.AmMx },\r\n                    scale: { x: f.Fltr.SclH, y: f.Fltr.SclV },\r\n                    randomSeed: f.Fltr.RndS,\r\n                    undefinedAreas: UndA.decode(f.Fltr.UndA),\r\n                } });\r\n            case 'ZgZg': return __assign(__assign({}, base), { type: 'zigzag', filter: {\r\n                    amount: f.Fltr.Amnt,\r\n                    ridges: f.Fltr.NmbR,\r\n                    style: ZZTy.decode(f.Fltr.ZZTy),\r\n                } });\r\n            case 'AdNs': return __assign(__assign({}, base), { type: 'add noise', filter: {\r\n                    amount: parsePercent(f.Fltr.Nose),\r\n                    distribution: Dstr.decode(f.Fltr.Dstr),\r\n                    monochromatic: f.Fltr.Mnch,\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'DstS': return __assign(__assign({}, base), { type: 'dust and scratches', filter: {\r\n                    radius: f.Fltr['Rds '],\r\n                    threshold: f.Fltr.Thsh,\r\n                } });\r\n            case 'Mdn ': return __assign(__assign({}, base), { type: 'median', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                } });\r\n            case 'denoise': return __assign(__assign({}, base), { type: 'reduce noise', filter: {\r\n                    preset: f.Fltr.preset,\r\n                    removeJpegArtifact: f.Fltr.removeJPEGArtifact,\r\n                    reduceColorNoise: parsePercent(f.Fltr.ClNs),\r\n                    sharpenDetails: parsePercent(f.Fltr.Shrp),\r\n                    channelDenoise: f.Fltr.channelDenoise.map(function (c) { return (__assign({ channels: c.Chnl.map(Chnl.decode), amount: c.Amnt }, (c.EdgF ? { preserveDetails: c.EdgF } : {}))); }),\r\n                } });\r\n            case 'ClrH': return __assign(__assign({}, base), { type: 'color halftone', filter: {\r\n                    radius: f.Fltr['Rds '],\r\n                    angle1: f.Fltr.Ang1,\r\n                    angle2: f.Fltr.Ang2,\r\n                    angle3: f.Fltr.Ang3,\r\n                    angle4: f.Fltr.Ang4,\r\n                } });\r\n            case 'Crst': return __assign(__assign({}, base), { type: 'crystallize', filter: {\r\n                    cellSize: f.Fltr.ClSz,\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'Mztn': return __assign(__assign({}, base), { type: 'mezzotint', filter: {\r\n                    type: MztT.decode(f.Fltr.MztT),\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'Msc ': return __assign(__assign({}, base), { type: 'mosaic', filter: {\r\n                    cellSize: parseUnits(f.Fltr.ClSz),\r\n                } });\r\n            case 'Pntl': return __assign(__assign({}, base), { type: 'pointillize', filter: {\r\n                    cellSize: f.Fltr.ClSz,\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'Clds': return __assign(__assign({}, base), { type: 'clouds', filter: {\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'DfrC': return __assign(__assign({}, base), { type: 'difference clouds', filter: {\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'Fbrs': return __assign(__assign({}, base), { type: 'fibers', filter: {\r\n                    variance: f.Fltr.Vrnc,\r\n                    strength: f.Fltr.Strg,\r\n                    randomSeed: f.Fltr.RndS,\r\n                } });\r\n            case 'LnsF': return __assign(__assign({}, base), { type: 'lens flare', filter: {\r\n                    brightness: f.Fltr.Brgh,\r\n                    position: { x: f.Fltr.FlrC.Hrzn, y: f.Fltr.FlrC.Vrtc },\r\n                    lensType: Lns.decode(f.Fltr['Lns ']),\r\n                } });\r\n            case 'smartSharpen': return __assign(__assign({}, base), { type: 'smart sharpen', filter: {\r\n                    amount: parsePercent(f.Fltr.Amnt),\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                    threshold: f.Fltr.Thsh,\r\n                    angle: f.Fltr.Angl,\r\n                    moreAccurate: f.Fltr.moreAccurate,\r\n                    blur: blurType.decode(f.Fltr.blur),\r\n                    preset: f.Fltr.preset,\r\n                    shadow: {\r\n                        fadeAmount: parsePercent(f.Fltr.sdwM.Amnt),\r\n                        tonalWidth: parsePercent(f.Fltr.sdwM.Wdth),\r\n                        radius: f.Fltr.sdwM['Rds '],\r\n                    },\r\n                    highlight: {\r\n                        fadeAmount: parsePercent(f.Fltr.hglM.Amnt),\r\n                        tonalWidth: parsePercent(f.Fltr.hglM.Wdth),\r\n                        radius: f.Fltr.hglM['Rds '],\r\n                    },\r\n                } });\r\n            case 'UnsM': return __assign(__assign({}, base), { type: 'unsharp mask', filter: {\r\n                    amount: parsePercent(f.Fltr.Amnt),\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                    threshold: f.Fltr.Thsh,\r\n                } });\r\n            case 'Dfs ': return __assign(__assign({}, base), { type: 'diffuse', filter: {\r\n                    mode: DfsM.decode(f.Fltr['Md  ']),\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'Embs': return __assign(__assign({}, base), { type: 'emboss', filter: {\r\n                    angle: f.Fltr.Angl,\r\n                    height: f.Fltr.Hght,\r\n                    amount: f.Fltr.Amnt,\r\n                } });\r\n            case 'Extr': return __assign(__assign({}, base), { type: 'extrude', filter: {\r\n                    type: ExtT.decode(f.Fltr.ExtT),\r\n                    size: f.Fltr.ExtS,\r\n                    depth: f.Fltr.ExtD,\r\n                    depthMode: ExtR.decode(f.Fltr.ExtR),\r\n                    randomSeed: f.Fltr.FlRs,\r\n                    solidFrontFaces: f.Fltr.ExtF,\r\n                    maskIncompleteBlocks: f.Fltr.ExtM,\r\n                } });\r\n            case 'Tls ': return __assign(__assign({}, base), { type: 'tiles', filter: {\r\n                    numberOfTiles: f.Fltr.TlNm,\r\n                    maximumOffset: f.Fltr.TlOf,\r\n                    fillEmptyAreaWith: FlCl.decode(f.Fltr.FlCl),\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'TrcC': return __assign(__assign({}, base), { type: 'trace contour', filter: {\r\n                    level: f.Fltr['Lvl '],\r\n                    edge: CntE.decode(f.Fltr['Edg ']),\r\n                } });\r\n            case 'Wnd ': return __assign(__assign({}, base), { type: 'wind', filter: {\r\n                    method: WndM.decode(f.Fltr.WndM),\r\n                    direction: Drct.decode(f.Fltr.Drct),\r\n                } });\r\n            case 'Dntr': return __assign(__assign({}, base), { type: 'de-interlace', filter: {\r\n                    eliminate: IntE.decode(f.Fltr.IntE),\r\n                    newFieldsBy: IntC.decode(f.Fltr.IntC),\r\n                } });\r\n            case 'Cstm': return __assign(__assign({}, base), { type: 'custom', filter: {\r\n                    scale: f.Fltr['Scl '],\r\n                    offset: f.Fltr.Ofst,\r\n                    matrix: f.Fltr.Mtrx,\r\n                } });\r\n            case 'HghP': return __assign(__assign({}, base), { type: 'high pass', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                } });\r\n            case 'Mxm ': return __assign(__assign({}, base), { type: 'maximum', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                } });\r\n            case 'Mnm ': return __assign(__assign({}, base), { type: 'minimum', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                } });\r\n            case 'Ofst': return __assign(__assign({}, base), { type: 'offset', filter: {\r\n                    horizontal: f.Fltr.Hrzn,\r\n                    vertical: f.Fltr.Vrtc,\r\n                    undefinedAreas: FlMd.decode(f.Fltr['Fl  ']),\r\n                } });\r\n            case 'rigidTransform': return __assign(__assign({}, base), { type: 'puppet', filter: {\r\n                    rigidType: f.Fltr.rigidType,\r\n                    bounds: [\r\n                        { x: f.Fltr.PuX0, y: f.Fltr.PuY0, },\r\n                        { x: f.Fltr.PuX1, y: f.Fltr.PuY1, },\r\n                        { x: f.Fltr.PuX2, y: f.Fltr.PuY2, },\r\n                        { x: f.Fltr.PuX3, y: f.Fltr.PuY3, },\r\n                    ],\r\n                    puppetShapeList: f.Fltr.puppetShapeList.map(function (p) { return ({\r\n                        rigidType: p.rigidType,\r\n                        // TODO: VrsM\r\n                        // TODO: VrsN\r\n                        originalVertexArray: uint8ToPoints(p.originalVertexArray),\r\n                        deformedVertexArray: uint8ToPoints(p.deformedVertexArray),\r\n                        indexArray: Array.from(uint8ToUint32(p.indexArray)),\r\n                        pinOffsets: arrayToPoints(p.pinOffsets),\r\n                        posFinalPins: arrayToPoints(p.posFinalPins),\r\n                        pinVertexIndices: p.pinVertexIndices,\r\n                        selectedPin: p.selectedPin,\r\n                        pinPosition: arrayToPoints(p.PinP),\r\n                        pinRotation: p.PnRt,\r\n                        pinOverlay: p.PnOv,\r\n                        pinDepth: p.PnDp,\r\n                        meshQuality: p.meshQuality,\r\n                        meshExpansion: p.meshExpansion,\r\n                        meshRigidity: p.meshRigidity,\r\n                        imageResolution: p.imageResolution,\r\n                        meshBoundaryPath: {\r\n                            pathComponents: p.meshBoundaryPath.pathComponents.map(function (c) { return ({\r\n                                shapeOperation: c.shapeOperation.split('.')[1],\r\n                                paths: c.SbpL.map(function (t) { return ({\r\n                                    closed: t.Clsp,\r\n                                    points: t['Pts '].map(function (pt) { return ({\r\n                                        anchor: hrznVrtcToPoint(pt.Anch),\r\n                                        forward: hrznVrtcToPoint(pt['Fwd ']),\r\n                                        backward: hrznVrtcToPoint(pt['Bwd ']),\r\n                                        smooth: pt.Smoo,\r\n                                    }); }),\r\n                                }); }),\r\n                            }); }),\r\n                        },\r\n                    }); }),\r\n                } });\r\n            case 'PbPl': {\r\n                var parameters = [];\r\n                var Flrt = f.Fltr;\r\n                for (var i = 0; i < fromAtoZ.length; i++) {\r\n                    if (!Flrt[\"PN\".concat(fromAtoZ[i], \"a\")])\r\n                        break;\r\n                    for (var j = 0; j < fromAtoZ.length; j++) {\r\n                        if (!Flrt[\"PN\".concat(fromAtoZ[i]).concat(fromAtoZ[j])])\r\n                            break;\r\n                        parameters.push({\r\n                            name: Flrt[\"PN\".concat(fromAtoZ[i]).concat(fromAtoZ[j])],\r\n                            value: Flrt[\"PF\".concat(fromAtoZ[i]).concat(fromAtoZ[j])]\r\n                        });\r\n                    }\r\n                }\r\n                return __assign(__assign({}, base), { type: 'oil paint plugin', filter: {\r\n                        name: f.Fltr.KnNm,\r\n                        gpu: f.Fltr.GpuY,\r\n                        lighting: f.Fltr.LIWy,\r\n                        parameters: parameters,\r\n                    } });\r\n            }\r\n            // case 2089: return {\r\n            // \t...base,\r\n            // \ttype: 'adaptive wide angle',\r\n            // \tparams: {\r\n            // \t\tcorrection: prjM.decode(f.Fltr.prjM),\r\n            // \t\tfocalLength: f.Fltr.focL,\r\n            // \t\tcropFactor: f.Fltr.CrpF,\r\n            // \t\timageScale: f.Fltr.imgS,\r\n            // \t\timageX: f.Fltr.imgX,\r\n            // \t\timageY: f.Fltr.imgY,\r\n            // \t},\r\n            // };\r\n            case 'HsbP': return __assign(__assign({}, base), { type: 'hsb/hsl', filter: {\r\n                    inputMode: ClrS.decode(f.Fltr.Inpt),\r\n                    rowOrder: ClrS.decode(f.Fltr.Otpt),\r\n                } });\r\n            case 'oilPaint': return __assign(__assign({}, base), { type: 'oil paint', filter: {\r\n                    lightingOn: f.Fltr.lightingOn,\r\n                    stylization: f.Fltr.stylization,\r\n                    cleanliness: f.Fltr.cleanliness,\r\n                    brushScale: f.Fltr.brushScale,\r\n                    microBrush: f.Fltr.microBrush,\r\n                    lightDirection: f.Fltr.LghD,\r\n                    specularity: f.Fltr.specularity,\r\n                } });\r\n            case 'LqFy':\r\n                {\r\n                    return __assign(__assign({}, base), { type: 'liquify', filter: {\r\n                            liquifyMesh: f.Fltr.LqMe,\r\n                        } });\r\n                }\r\n                ;\r\n            case 'perspectiveWarpTransform':\r\n                {\r\n                    return __assign(__assign({}, base), { type: 'perspective warp', filter: {\r\n                            vertices: f.Fltr.vertices.map(hrznVrtcToPoint),\r\n                            warpedVertices: f.Fltr.warpedVertices.map(hrznVrtcToPoint),\r\n                            quads: f.Fltr.quads.map(function (q) { return q.indices; }),\r\n                        } });\r\n                }\r\n                ;\r\n            case 'Crvs':\r\n                {\r\n                    return __assign(__assign({}, base), { type: 'curves', filter: __assign({ presetKind: presetKindType.decode(f.Fltr.presetKind) }, (f.Fltr.Adjs ? {\r\n                            adjustments: f.Fltr.Adjs.map(function (a) {\r\n                                var channels = a.Chnl.map(Chnl.decode);\r\n                                if (a['Crv ']) {\r\n                                    return {\r\n                                        channels: channels,\r\n                                        curve: a['Crv '].map(function (c) {\r\n                                            var point = { x: c.Hrzn, y: c.Vrtc };\r\n                                            if (c.Cnty)\r\n                                                point.curved = true;\r\n                                            return point;\r\n                                        }),\r\n                                    };\r\n                                }\r\n                                else if (a.Mpng) {\r\n                                    return { channels: channels, values: a.Mpng };\r\n                                }\r\n                                else {\r\n                                    throw new Error(\"Unknown curve adjustment\");\r\n                                }\r\n                            })\r\n                        } : {})) });\r\n                }\r\n                ;\r\n            case 'BrgC':\r\n                {\r\n                    return __assign(__assign({}, base), { type: 'brightness/contrast', filter: {\r\n                            brightness: f.Fltr.Brgh,\r\n                            contrast: f.Fltr.Cntr,\r\n                            useLegacy: !!f.Fltr.useLegacy,\r\n                        } });\r\n                }\r\n                ;\r\n            default:\r\n                if (options.throwForMissingFeatures) {\r\n                    // console.log('FILTER', require('util').inspect(f, false, 99, true));\r\n                    throw new Error(\"Unknown filter classId: \".concat(f.Fltr._classID));\r\n                }\r\n                return undefined;\r\n        }\r\n    }\r\n    else {\r\n        switch (f.filterID) {\r\n            case 1098281575: return __assign(__assign({}, base), { type: 'average' });\r\n            case 1114403360: return __assign(__assign({}, base), { type: 'blur' });\r\n            case 1114403405: return __assign(__assign({}, base), { type: 'blur more' });\r\n            case 1148416099: return __assign(__assign({}, base), { type: 'despeckle' });\r\n            case 1180922912: return __assign(__assign({}, base), { type: 'facet' });\r\n            case 1181902701: return __assign(__assign({}, base), { type: 'fragment' });\r\n            case 1399353968: return __assign(__assign({}, base), { type: 'sharpen' });\r\n            case 1399353925: return __assign(__assign({}, base), { type: 'sharpen edges' });\r\n            case 1399353933: return __assign(__assign({}, base), { type: 'sharpen more' });\r\n            case 1181639749: return __assign(__assign({}, base), { type: 'find edges' });\r\n            case 1399616122: return __assign(__assign({}, base), { type: 'solarize' });\r\n            case 1314149187: return __assign(__assign({}, base), { type: 'ntsc colors' });\r\n            case 1231976050: return __assign(__assign({}, base), { type: 'invert' });\r\n            default:\r\n                if (options.throwForMissingFeatures) {\r\n                    // console.log('FILTER', require('util').inspect(f, false, 99, true));\r\n                    throw new Error(\"Unknown filterID: \".concat(f.filterID));\r\n                }\r\n        }\r\n    }\r\n}\r\nfunction parseFilterFX(desc, options) {\r\n    return {\r\n        enabled: desc.enab,\r\n        validAtPosition: desc.validAtPosition,\r\n        maskEnabled: desc.filterMaskEnable,\r\n        maskLinked: desc.filterMaskLinked,\r\n        maskExtendWithWhite: desc.filterMaskExtendWithWhite,\r\n        list: desc.filterFXList.map(function (x) { return parseFilterFXItem(x, options); }).filter(function (x) { return !!x; }),\r\n    };\r\n}\r\nfunction uvRadius(t) {\r\n    return unitsValue(t.radius, 'radius');\r\n}\r\nfunction serializeFilterFXItem(f) {\r\n    var base = {\r\n        _name: '',\r\n        _classID: 'filterFX',\r\n        'Nm  ': f.name,\r\n        blendOptions: {\r\n            _name: '',\r\n            _classID: 'blendOptions',\r\n            Opct: unitsPercentF(f.opacity),\r\n            'Md  ': BlnM.encode(f.blendMode),\r\n        },\r\n        enab: f.enabled,\r\n        hasoptions: f.hasOptions,\r\n        FrgC: serializeColor(f.foregroundColor),\r\n        BckC: serializeColor(f.backgroundColor),\r\n    };\r\n    switch (f.type) {\r\n        case 'average': return __assign(__assign({}, base), { filterID: 1098281575 });\r\n        case 'blur': return __assign(__assign({}, base), { filterID: 1114403360 });\r\n        case 'blur more': return __assign(__assign({}, base), { filterID: 1114403405 });\r\n        case 'box blur': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Box Blur',\r\n                _classID: 'boxblur',\r\n                'Rds ': uvRadius(f.filter),\r\n            }, filterID: 697 });\r\n        case 'gaussian blur': return __assign(__assign({}, base), { Fltr: {\r\n                // _name: '高斯模糊', // Testing\r\n                _name: 'Gaussian Blur',\r\n                _classID: 'GsnB',\r\n                'Rds ': uvRadius(f.filter),\r\n            }, filterID: 1198747202 });\r\n        case 'motion blur': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Motion Blur',\r\n                _classID: 'MtnB',\r\n                Angl: f.filter.angle,\r\n                Dstn: unitsValue(f.filter.distance, 'distance'),\r\n            }, filterID: 1299476034 });\r\n        case 'radial blur': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Radial Blur',\r\n                _classID: 'RdlB',\r\n                Amnt: f.filter.amount,\r\n                BlrM: BlrM.encode(f.filter.method),\r\n                BlrQ: BlrQ.encode(f.filter.quality),\r\n            }, filterID: 1382313026 });\r\n        case 'shape blur': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Shape Blur',\r\n                _classID: 'shapeBlur',\r\n                'Rds ': uvRadius(f.filter),\r\n                customShape: {\r\n                    _name: '',\r\n                    _classID: 'customShape',\r\n                    'Nm  ': f.filter.customShape.name,\r\n                    Idnt: f.filter.customShape.id,\r\n                }\r\n            }, filterID: 702 });\r\n        case 'smart blur': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Smart Blur',\r\n                _classID: 'SmrB',\r\n                'Rds ': f.filter.radius,\r\n                Thsh: f.filter.threshold,\r\n                SmBQ: SmBQ.encode(f.filter.quality),\r\n                SmBM: SmBM.encode(f.filter.mode),\r\n            }, filterID: 1399681602 });\r\n        case 'surface blur': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Surface Blur',\r\n                _classID: 'surfaceBlur',\r\n                'Rds ': uvRadius(f.filter),\r\n                Thsh: f.filter.threshold,\r\n            }, filterID: 701 });\r\n        case 'displace': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Displace',\r\n                _classID: 'Dspl',\r\n                HrzS: f.filter.horizontalScale,\r\n                VrtS: f.filter.verticalScale,\r\n                DspM: DspM.encode(f.filter.displacementMap),\r\n                UndA: UndA.encode(f.filter.undefinedAreas),\r\n                DspF: {\r\n                    sig: f.filter.displacementFile.signature,\r\n                    path: f.filter.displacementFile.path,\r\n                },\r\n            }, filterID: 1148416108 });\r\n        case 'pinch': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Pinch',\r\n                _classID: 'Pnch',\r\n                Amnt: f.filter.amount,\r\n            }, filterID: 1349411688 });\r\n        case 'polar coordinates': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Polar Coordinates',\r\n                _classID: 'Plr ',\r\n                Cnvr: Cnvr.encode(f.filter.conversion),\r\n            }, filterID: 1349284384 });\r\n        case 'ripple': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Ripple',\r\n                _classID: 'Rple',\r\n                Amnt: f.filter.amount,\r\n                RplS: RplS.encode(f.filter.size),\r\n            }, filterID: 1383099493 });\r\n        case 'shear': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Shear',\r\n                _classID: 'Shr ',\r\n                ShrP: f.filter.shearPoints.map(function (p) { return ({ _name: '', _classID: 'Pnt ', Hrzn: p.x, Vrtc: p.y }); }),\r\n                UndA: UndA.encode(f.filter.undefinedAreas),\r\n                ShrS: f.filter.shearStart,\r\n                ShrE: f.filter.shearEnd,\r\n            }, filterID: 1399353888 });\r\n        case 'spherize': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Spherize',\r\n                _classID: 'Sphr',\r\n                Amnt: f.filter.amount,\r\n                SphM: SphM.encode(f.filter.mode),\r\n            }, filterID: 1399875698 });\r\n        case 'twirl': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Twirl',\r\n                _classID: 'Twrl',\r\n                Angl: f.filter.angle,\r\n            }, filterID: 1417114220 });\r\n        case 'wave': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Wave',\r\n                _classID: 'Wave',\r\n                Wvtp: Wvtp.encode(f.filter.type),\r\n                NmbG: f.filter.numberOfGenerators,\r\n                WLMn: f.filter.wavelength.min,\r\n                WLMx: f.filter.wavelength.max,\r\n                AmMn: f.filter.amplitude.min,\r\n                AmMx: f.filter.amplitude.max,\r\n                SclH: f.filter.scale.x,\r\n                SclV: f.filter.scale.y,\r\n                UndA: UndA.encode(f.filter.undefinedAreas),\r\n                RndS: f.filter.randomSeed,\r\n            }, filterID: 1466005093 });\r\n        case 'zigzag': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'ZigZag',\r\n                _classID: 'ZgZg',\r\n                Amnt: f.filter.amount,\r\n                NmbR: f.filter.ridges,\r\n                ZZTy: ZZTy.encode(f.filter.style),\r\n            }, filterID: 1516722791 });\r\n        case 'add noise': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Add Noise',\r\n                _classID: 'AdNs',\r\n                Dstr: Dstr.encode(f.filter.distribution),\r\n                Nose: unitsPercentF(f.filter.amount),\r\n                Mnch: f.filter.monochromatic,\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1097092723 });\r\n        case 'despeckle': return __assign(__assign({}, base), { filterID: 1148416099 });\r\n        case 'dust and scratches': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Dust & Scratches',\r\n                _classID: 'DstS',\r\n                'Rds ': f.filter.radius,\r\n                Thsh: f.filter.threshold,\r\n            }, filterID: 1148417107 });\r\n        case 'median': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Median',\r\n                _classID: 'Mdn ',\r\n                'Rds ': uvRadius(f.filter),\r\n            }, filterID: 1298427424 });\r\n        case 'reduce noise': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Reduce Noise',\r\n                _classID: 'denoise',\r\n                ClNs: unitsPercentF(f.filter.reduceColorNoise),\r\n                Shrp: unitsPercentF(f.filter.sharpenDetails),\r\n                removeJPEGArtifact: f.filter.removeJpegArtifact,\r\n                channelDenoise: f.filter.channelDenoise.map(function (c) { return (__assign({ _name: '', _classID: 'channelDenoiseParams', Chnl: c.channels.map(function (i) { return Chnl.encode(i); }), Amnt: c.amount }, (c.preserveDetails ? { EdgF: c.preserveDetails } : {}))); }),\r\n                preset: f.filter.preset,\r\n            }, filterID: 633 });\r\n        case 'color halftone': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Color Halftone',\r\n                _classID: 'ClrH',\r\n                'Rds ': f.filter.radius,\r\n                Ang1: f.filter.angle1,\r\n                Ang2: f.filter.angle2,\r\n                Ang3: f.filter.angle3,\r\n                Ang4: f.filter.angle4,\r\n            }, filterID: 1131180616 });\r\n        case 'crystallize': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Crystallize',\r\n                _classID: 'Crst',\r\n                ClSz: f.filter.cellSize,\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1131574132 });\r\n        case 'facet': return __assign(__assign({}, base), { filterID: 1180922912 });\r\n        case 'fragment': return __assign(__assign({}, base), { filterID: 1181902701 });\r\n        case 'mezzotint': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Mezzotint',\r\n                _classID: 'Mztn',\r\n                MztT: MztT.encode(f.filter.type),\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1299870830 });\r\n        case 'mosaic': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Mosaic',\r\n                _classID: 'Msc ',\r\n                ClSz: unitsValue(f.filter.cellSize, 'cellSize'),\r\n            }, filterID: 1299407648 });\r\n        case 'pointillize': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Pointillize',\r\n                _classID: 'Pntl',\r\n                ClSz: f.filter.cellSize,\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1349416044 });\r\n        case 'clouds': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Clouds',\r\n                _classID: 'Clds',\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1131177075 });\r\n        case 'difference clouds': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Difference Clouds',\r\n                _classID: 'DfrC',\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1147564611 });\r\n        case 'fibers': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Fibers',\r\n                _classID: 'Fbrs',\r\n                Vrnc: f.filter.variance,\r\n                Strg: f.filter.strength,\r\n                RndS: f.filter.randomSeed,\r\n            }, filterID: 1180856947 });\r\n        case 'lens flare': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Lens Flare',\r\n                _classID: 'LnsF',\r\n                Brgh: f.filter.brightness,\r\n                FlrC: {\r\n                    _name: '',\r\n                    _classID: 'Pnt ',\r\n                    Hrzn: f.filter.position.x,\r\n                    Vrtc: f.filter.position.y,\r\n                },\r\n                'Lns ': Lns.encode(f.filter.lensType),\r\n            }, filterID: 1282306886 });\r\n        case 'sharpen': return __assign(__assign({}, base), { filterID: 1399353968 });\r\n        case 'sharpen edges': return __assign(__assign({}, base), { filterID: 1399353925 });\r\n        case 'sharpen more': return __assign(__assign({}, base), { filterID: 1399353933 });\r\n        case 'smart sharpen': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Smart Sharpen',\r\n                _classID: 'smartSharpen',\r\n                Amnt: unitsPercentF(f.filter.amount),\r\n                'Rds ': uvRadius(f.filter),\r\n                Thsh: f.filter.threshold,\r\n                Angl: f.filter.angle,\r\n                moreAccurate: f.filter.moreAccurate,\r\n                blur: blurType.encode(f.filter.blur),\r\n                preset: f.filter.preset,\r\n                sdwM: {\r\n                    _name: 'Parameters',\r\n                    _classID: 'adaptCorrectTones',\r\n                    Amnt: unitsPercentF(f.filter.shadow.fadeAmount),\r\n                    Wdth: unitsPercentF(f.filter.shadow.tonalWidth),\r\n                    'Rds ': f.filter.shadow.radius,\r\n                },\r\n                hglM: {\r\n                    _name: 'Parameters',\r\n                    _classID: 'adaptCorrectTones',\r\n                    Amnt: unitsPercentF(f.filter.highlight.fadeAmount),\r\n                    Wdth: unitsPercentF(f.filter.highlight.tonalWidth),\r\n                    'Rds ': f.filter.highlight.radius,\r\n                },\r\n            }, filterID: 698 });\r\n        case 'unsharp mask': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Unsharp Mask',\r\n                _classID: 'UnsM',\r\n                Amnt: unitsPercentF(f.filter.amount),\r\n                'Rds ': uvRadius(f.filter),\r\n                Thsh: f.filter.threshold,\r\n            }, filterID: 1433301837 });\r\n        case 'diffuse': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Diffuse',\r\n                _classID: 'Dfs ',\r\n                'Md  ': DfsM.encode(f.filter.mode),\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1147564832 });\r\n        case 'emboss': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Emboss',\r\n                _classID: 'Embs',\r\n                Angl: f.filter.angle,\r\n                Hght: f.filter.height,\r\n                Amnt: f.filter.amount,\r\n            }, filterID: 1164796531 });\r\n        case 'extrude': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Extrude',\r\n                _classID: 'Extr',\r\n                ExtS: f.filter.size,\r\n                ExtD: f.filter.depth,\r\n                ExtF: f.filter.solidFrontFaces,\r\n                ExtM: f.filter.maskIncompleteBlocks,\r\n                ExtT: ExtT.encode(f.filter.type),\r\n                ExtR: ExtR.encode(f.filter.depthMode),\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1165522034 });\r\n        case 'find edges': return __assign(__assign({}, base), { filterID: 1181639749 });\r\n        case 'solarize': return __assign(__assign({}, base), { filterID: 1399616122 });\r\n        case 'tiles': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Tiles',\r\n                _classID: 'Tls ',\r\n                TlNm: f.filter.numberOfTiles,\r\n                TlOf: f.filter.maximumOffset,\r\n                FlCl: FlCl.encode(f.filter.fillEmptyAreaWith),\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1416393504 });\r\n        case 'trace contour': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Trace Contour',\r\n                _classID: 'TrcC',\r\n                'Lvl ': f.filter.level,\r\n                'Edg ': CntE.encode(f.filter.edge),\r\n            }, filterID: 1416782659 });\r\n        case 'wind': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Wind',\r\n                _classID: 'Wnd ',\r\n                WndM: WndM.encode(f.filter.method),\r\n                Drct: Drct.encode(f.filter.direction),\r\n            }, filterID: 1466852384 });\r\n        case 'de-interlace': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'De-Interlace',\r\n                _classID: 'Dntr',\r\n                IntE: IntE.encode(f.filter.eliminate),\r\n                IntC: IntC.encode(f.filter.newFieldsBy),\r\n            }, filterID: 1148089458 });\r\n        case 'ntsc colors': return __assign(__assign({}, base), { filterID: 1314149187 });\r\n        case 'invert': return __assign(__assign({}, base), { filterID: 1231976050 });\r\n        case 'custom': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Custom',\r\n                _classID: 'Cstm',\r\n                'Scl ': f.filter.scale,\r\n                Ofst: f.filter.offset,\r\n                Mtrx: f.filter.matrix,\r\n            }, filterID: 1131639917 });\r\n        case 'high pass': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'High Pass',\r\n                _classID: 'HghP',\r\n                'Rds ': uvRadius(f.filter),\r\n            }, filterID: 1214736464 });\r\n        case 'maximum': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Maximum',\r\n                _classID: 'Mxm ',\r\n                'Rds ': uvRadius(f.filter),\r\n            }, filterID: 1299737888 });\r\n        case 'minimum': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Minimum',\r\n                _classID: 'Mnm ',\r\n                'Rds ': uvRadius(f.filter),\r\n            }, filterID: 1299082528 });\r\n        case 'offset': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Offset',\r\n                _classID: 'Ofst',\r\n                Hrzn: f.filter.horizontal,\r\n                Vrtc: f.filter.vertical,\r\n                'Fl  ': FlMd.encode(f.filter.undefinedAreas),\r\n            }, filterID: 1332114292 });\r\n        case 'puppet': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Rigid Transform',\r\n                _classID: 'rigidTransform',\r\n                'null': ['Ordn.Trgt'],\r\n                rigidType: f.filter.rigidType,\r\n                puppetShapeList: f.filter.puppetShapeList.map(function (p) { return ({\r\n                    _name: '',\r\n                    _classID: 'puppetShape',\r\n                    rigidType: p.rigidType,\r\n                    VrsM: 1,\r\n                    VrsN: 0,\r\n                    originalVertexArray: toUint8(new Float32Array(pointsToArray(p.originalVertexArray))),\r\n                    deformedVertexArray: toUint8(new Float32Array(pointsToArray(p.deformedVertexArray))),\r\n                    indexArray: toUint8(new Uint32Array(p.indexArray)),\r\n                    pinOffsets: pointsToArray(p.pinOffsets),\r\n                    posFinalPins: pointsToArray(p.posFinalPins),\r\n                    pinVertexIndices: p.pinVertexIndices,\r\n                    PinP: pointsToArray(p.pinPosition),\r\n                    PnRt: p.pinRotation,\r\n                    PnOv: p.pinOverlay,\r\n                    PnDp: p.pinDepth,\r\n                    meshQuality: p.meshQuality,\r\n                    meshExpansion: p.meshExpansion,\r\n                    meshRigidity: p.meshRigidity,\r\n                    imageResolution: p.imageResolution,\r\n                    meshBoundaryPath: {\r\n                        _name: '',\r\n                        _classID: 'pathClass',\r\n                        pathComponents: p.meshBoundaryPath.pathComponents.map(function (c) { return ({\r\n                            _name: '',\r\n                            _classID: 'PaCm',\r\n                            shapeOperation: \"shapeOperation.\".concat(c.shapeOperation),\r\n                            SbpL: c.paths.map(function (path) { return ({\r\n                                _name: '',\r\n                                _classID: 'Sbpl',\r\n                                Clsp: path.closed,\r\n                                'Pts ': path.points.map(function (pt) { return ({\r\n                                    _name: '',\r\n                                    _classID: 'Pthp',\r\n                                    Anch: pointToHrznVrtc(pt.anchor),\r\n                                    'Fwd ': pointToHrznVrtc(pt.forward),\r\n                                    'Bwd ': pointToHrznVrtc(pt.backward),\r\n                                    Smoo: pt.smooth,\r\n                                }); }),\r\n                            }); }),\r\n                        }); }),\r\n                    },\r\n                    selectedPin: p.selectedPin,\r\n                }); }),\r\n                PuX0: f.filter.bounds[0].x,\r\n                PuX1: f.filter.bounds[1].x,\r\n                PuX2: f.filter.bounds[2].x,\r\n                PuX3: f.filter.bounds[3].x,\r\n                PuY0: f.filter.bounds[0].y,\r\n                PuY1: f.filter.bounds[1].y,\r\n                PuY2: f.filter.bounds[2].y,\r\n                PuY3: f.filter.bounds[3].y,\r\n            }, filterID: 991 });\r\n        case 'oil paint plugin': {\r\n            var params = {};\r\n            for (var i = 0; i < f.filter.parameters.length; i++) {\r\n                var _a = f.filter.parameters[i], name_1 = _a.name, value = _a.value;\r\n                var suffix = \"\".concat(fromAtoZ[Math.floor(i / fromAtoZ.length)]).concat(fromAtoZ[i % fromAtoZ.length]);\r\n                params[\"PN\".concat(suffix)] = name_1;\r\n                params[\"PT\".concat(suffix)] = 0;\r\n                params[\"PF\".concat(suffix)] = value;\r\n            }\r\n            return __assign(__assign({}, base), { Fltr: __assign({ _name: 'Oil Paint Plugin', _classID: 'PbPl', KnNm: f.filter.name, GpuY: f.filter.gpu, LIWy: f.filter.lighting, FPth: '1' }, params), filterID: 1348620396 });\r\n        }\r\n        case 'oil paint': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Oil Paint',\r\n                _classID: 'oilPaint',\r\n                lightingOn: f.filter.lightingOn,\r\n                stylization: f.filter.stylization,\r\n                cleanliness: f.filter.cleanliness,\r\n                brushScale: f.filter.brushScale,\r\n                microBrush: f.filter.microBrush,\r\n                LghD: f.filter.lightDirection,\r\n                specularity: f.filter.specularity,\r\n            }, filterID: 1122 });\r\n        case 'liquify': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Liquify',\r\n                _classID: 'LqFy',\r\n                LqMe: f.filter.liquifyMesh,\r\n            }, filterID: 1282492025 });\r\n        case 'perspective warp': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Perspective Warp',\r\n                _classID: 'perspectiveWarpTransform',\r\n                vertices: f.filter.vertices.map(pointToHrznVrtc),\r\n                warpedVertices: f.filter.warpedVertices.map(pointToHrznVrtc),\r\n                quads: f.filter.quads.map(function (indices) { return ({ indices: indices }); }),\r\n            }, filterID: 442 });\r\n        case 'curves': return __assign(__assign({}, base), { Fltr: __assign({ _name: 'Curves', _classID: 'Crvs', presetKind: presetKindType.encode(f.filter.presetKind) }, (f.filter.adjustments ? {\r\n                Adjs: f.filter.adjustments.map(function (a) { return 'curve' in a ? {\r\n                    _name: '',\r\n                    _classID: 'CrvA',\r\n                    Chnl: a.channels.map(Chnl.encode),\r\n                    'Crv ': a.curve.map(function (c) { return (__assign({ _name: '', _classID: 'Pnt ', Hrzn: c.x, Vrtc: c.y }, (c.curved ? { Cnty: true } : {}))); }),\r\n                } : {\r\n                    _name: '',\r\n                    _classID: 'CrvA',\r\n                    Chnl: a.channels.map(Chnl.encode),\r\n                    Mpng: a.values,\r\n                }; })\r\n            } : {})), filterID: 1131574899 });\r\n        case 'brightness/contrast': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Brightness/Contrast',\r\n                _classID: 'BrgC',\r\n                Brgh: f.filter.brightness,\r\n                Cntr: f.filter.contrast,\r\n                useLegacy: !!f.filter.useLegacy,\r\n            }, filterID: 1114793795 });\r\n        // case 'hsb/hsl': return {\r\n        // TODO: ...\r\n        // };\r\n        default: throw new Error(\"Unknow filter type: \".concat(f.type));\r\n    }\r\n}\r\n// let t: any;\r\nfunction getWarpFromPlacedLayer(placed) {\r\n    if (placed.warp)\r\n        return placed.warp;\r\n    if (!placed.width || !placed.height)\r\n        throw new Error('You must provide width and height of the linked image in placedLayer');\r\n    var w = placed.width;\r\n    var h = placed.height;\r\n    var x0 = 0, x1 = w / 3, x2 = w * 2 / 3, x3 = w;\r\n    var y0 = 0, y1 = h / 3, y2 = h * 2 / 3, y3 = h;\r\n    return {\r\n        style: 'custom',\r\n        value: 0,\r\n        perspective: 0,\r\n        perspectiveOther: 0,\r\n        rotate: 'horizontal',\r\n        bounds: {\r\n            top: { value: 0, units: 'Pixels' },\r\n            left: { value: 0, units: 'Pixels' },\r\n            bottom: { value: h, units: 'Pixels' },\r\n            right: { value: w, units: 'Pixels' },\r\n        },\r\n        uOrder: 4,\r\n        vOrder: 4,\r\n        customEnvelopeWarp: {\r\n            meshPoints: [\r\n                { x: x0, y: y0 }, { x: x1, y: y0 }, { x: x2, y: y0 }, { x: x3, y: y0 },\r\n                { x: x0, y: y1 }, { x: x1, y: y1 }, { x: x2, y: y1 }, { x: x3, y: y1 },\r\n                { x: x0, y: y2 }, { x: x1, y: y2 }, { x: x2, y: y2 }, { x: x3, y: y2 },\r\n                { x: x0, y: y3 }, { x: x1, y: y3 }, { x: x2, y: y3 }, { x: x3, y: y3 },\r\n            ],\r\n        },\r\n    };\r\n}\r\naddHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {\r\n    if (readSignature(reader) !== 'soLD')\r\n        throw new Error(\"Invalid SoLd type\");\r\n    var version = readInt32(reader);\r\n    if (version !== 4 && version !== 5)\r\n        throw new Error(\"Invalid SoLd version\");\r\n    var desc = readVersionAndDescriptor(reader, true);\r\n    // console.log('SoLd', require('util').inspect(desc, false, 99, true));\r\n    // console.log('SoLd.warp', require('util').inspect(desc.warp, false, 99, true));\r\n    // console.log('SoLd.quiltWarp', require('util').inspect(desc.quiltWarp, false, 99, true));\r\n    // desc.filterFX!.filterFXList[0].Fltr.puppetShapeList[0].meshBoundaryPath.pathComponents[0].SbpL[0]['Pts '] = [];\r\n    // console.log('read', require('util').inspect(desc.filterFX, false, 99, true));\r\n    // console.log('filterFXList[0]', require('util').inspect((desc as any).filterFX.filterFXList[0], false, 99, true));\r\n    // t = desc;\r\n    target.placedLayer = {\r\n        id: desc.Idnt,\r\n        placed: desc.placed,\r\n        type: placedLayerTypes[desc.Type],\r\n        pageNumber: desc.PgNm,\r\n        totalPages: desc.totalPages,\r\n        frameStep: frac(desc.frameStep),\r\n        duration: frac(desc.duration),\r\n        frameCount: desc.frameCount,\r\n        transform: desc.Trnf,\r\n        width: desc['Sz  '].Wdth,\r\n        height: desc['Sz  '].Hght,\r\n        resolution: parseUnits(desc.Rslt),\r\n        warp: parseWarp((desc.quiltWarp || desc.warp)),\r\n    };\r\n    if (desc.nonAffineTransform && desc.nonAffineTransform.some(function (x, i) { return x !== desc.Trnf[i]; })) {\r\n        target.placedLayer.nonAffineTransform = desc.nonAffineTransform;\r\n    }\r\n    if (desc.Crop)\r\n        target.placedLayer.crop = desc.Crop;\r\n    if (desc.comp)\r\n        target.placedLayer.comp = desc.comp;\r\n    if (desc.compInfo) {\r\n        target.placedLayer.compInfo = {\r\n            compID: desc.compInfo.compID,\r\n            originalCompID: desc.compInfo.originalCompID,\r\n        };\r\n    }\r\n    if (desc.filterFX)\r\n        target.placedLayer.filter = parseFilterFX(desc.filterFX, reader);\r\n    // console.log('filter', require('util').inspect(target.placedLayer.filter, false, 99, true));\r\n    skipBytes(reader, left()); // HACK\r\n}, function (writer, target) {\r\n    var _a, _b;\r\n    writeSignature(writer, 'soLD');\r\n    writeInt32(writer, 4); // version\r\n    var placed = target.placedLayer;\r\n    if (!placed.id || typeof placed.id !== 'string' || !/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/.test(placed.id)) {\r\n        throw new Error('Placed layer ID must be in a GUID format (example: 20953ddb-9391-11ec-b4f1-c15674f50bc4)');\r\n    }\r\n    var desc = __assign(__assign({ Idnt: placed.id, placed: (_a = placed.placed) !== null && _a !== void 0 ? _a : placed.id, PgNm: placed.pageNumber || 1, totalPages: placed.totalPages || 1 }, (placed.crop ? { Crop: placed.crop } : {})), { frameStep: placed.frameStep || { numerator: 0, denominator: 600 }, duration: placed.duration || { numerator: 0, denominator: 600 }, frameCount: placed.frameCount || 0, Annt: 16, Type: placedLayerTypes.indexOf(placed.type), Trnf: placed.transform, nonAffineTransform: (_b = placed.nonAffineTransform) !== null && _b !== void 0 ? _b : placed.transform, \r\n        // quiltWarp: {} as any,\r\n        warp: encodeWarp(getWarpFromPlacedLayer(placed)), 'Sz  ': {\r\n            _name: '',\r\n            _classID: 'Pnt ',\r\n            Wdth: placed.width || 0,\r\n            Hght: placed.height || 0, // TODO: find size ?\r\n        }, Rslt: placed.resolution ? unitsValue(placed.resolution, 'resolution') : { units: 'Density', value: 72 } });\r\n    if (placed.filter) {\r\n        desc.filterFX = {\r\n            _name: '',\r\n            _classID: 'filterFXStyle',\r\n            enab: placed.filter.enabled,\r\n            validAtPosition: placed.filter.validAtPosition,\r\n            filterMaskEnable: placed.filter.maskEnabled,\r\n            filterMaskLinked: placed.filter.maskLinked,\r\n            filterMaskExtendWithWhite: placed.filter.maskExtendWithWhite,\r\n            filterFXList: placed.filter.list.map(function (f) { return serializeFilterFXItem(f); }),\r\n        };\r\n    }\r\n    // TODO:\r\n    // desc.comp = -1;\r\n    // desc.compInfo = { _name: '', _classID: 'null', compID: -1, originalCompID: -1 } as any;\r\n    // desc.ClMg = {\r\n    // \t_name: '',\r\n    // \t_classID: 'ClMg',\r\n    // \tplacedLayerOCIOConversion: 'placedLayerOCIOConversion.placedLayerOCIOConvertEmbedded'\r\n    // } as any;\r\n    // if (JSON.stringify(t) !== JSON.stringify(desc)) {\r\n    // \tconsole.log('read', require('util').inspect(t, false, 99, true));\r\n    // \tconsole.log('write', require('util').inspect(desc, false, 99, true));\r\n    // \tconsole.error('DIFFERENT');\r\n    // \t// throw new Error('DIFFERENT');\r\n    // }\r\n    if (placed.warp && isQuiltWarp(placed.warp)) {\r\n        var quiltWarp = encodeWarp(placed.warp);\r\n        desc.quiltWarp = quiltWarp;\r\n        desc.warp = {\r\n            warpStyle: 'warpStyle.warpNone',\r\n            warpValue: quiltWarp.warpValue,\r\n            warpPerspective: quiltWarp.warpPerspective,\r\n            warpPerspectiveOther: quiltWarp.warpPerspectiveOther,\r\n            warpRotate: quiltWarp.warpRotate,\r\n            bounds: quiltWarp.bounds,\r\n            uOrder: quiltWarp.uOrder,\r\n            vOrder: quiltWarp.vOrder,\r\n        };\r\n    }\r\n    else {\r\n        delete desc.quiltWarp;\r\n    }\r\n    if (placed.comp)\r\n        desc.comp = placed.comp;\r\n    if (placed.compInfo)\r\n        desc.compInfo = placed.compInfo;\r\n    writeVersionAndDescriptor(writer, '', 'null', desc, desc.quiltWarp ? 'quiltWarp' : 'warp');\r\n});\r\naddHandlerAlias('SoLE', 'SoLd');\r\naddHandler('fxrp', hasKey('referencePoint'), function (reader, target) {\r\n    target.referencePoint = {\r\n        x: readFloat64(reader),\r\n        y: readFloat64(reader),\r\n    };\r\n}, function (writer, target) {\r\n    writeFloat64(writer, target.referencePoint.x);\r\n    writeFloat64(writer, target.referencePoint.y);\r\n});\r\naddHandler('Lr16', function () { return false; }, function (reader, _target, _left, psd, imageResources) {\r\n    readLayerInfo(reader, psd, imageResources);\r\n}, function (_writer, _target) {\r\n});\r\naddHandler('Lr32', function () { return false; }, function (reader, _target, _left, psd, imageResources) {\r\n    readLayerInfo(reader, psd, imageResources);\r\n}, function (_writer, _target) {\r\n});\r\naddHandler('LMsk', hasKey('userMask'), function (reader, target) {\r\n    target.userMask = {\r\n        colorSpace: readColor(reader),\r\n        opacity: readUint16(reader) / 0xff,\r\n    };\r\n    var flag = readUint8(reader);\r\n    if (flag !== 128)\r\n        throw new Error('Invalid flag value');\r\n    skipBytes(reader, 1);\r\n}, function (writer, target) {\r\n    var userMask = target.userMask;\r\n    writeColor(writer, userMask.colorSpace);\r\n    writeUint16(writer, clamp(userMask.opacity, 0, 1) * 0xff);\r\n    writeUint8(writer, 128);\r\n    writeZeros(writer, 1);\r\n});\r\nif (MOCK_HANDLERS) {\r\n    addHandler('Patt', function (target) { return target._Patt !== undefined; }, function (reader, target, left) {\r\n        // console.log('additional info: Patt');\r\n        target._Patt = readBytes(reader, left());\r\n    }, function (writer, target) { return false && writeBytes(writer, target._Patt); });\r\n}\r\nelse {\r\n    addHandler('Patt', // TODO: handle also Pat2 & Pat3\r\n    function (// TODO: handle also Pat2 & Pat3\r\n    target) { return !target; }, function (reader, target, left) {\r\n        if (!left())\r\n            return;\r\n        skipBytes(reader, left());\r\n        return; // not supported yet\r\n        target;\r\n        readPattern;\r\n        // if (!target.patterns) target.patterns = [];\r\n        // target.patterns.push(readPattern(reader));\r\n        // skipBytes(reader, left());\r\n    }, function (_writer, _target) {\r\n    });\r\n}\r\n/*\r\ninterface CAIDesc {\r\n    _name: '';\r\n    _classID: 'null';\r\n    enab: boolean;\r\n    generationalGuid: string;\r\n}\r\n\r\naddHandler(\r\n    'CAI ', // content credentials ? something to do with generative tech\r\n    () => false,\r\n    (reader, _target, left) => {\r\n        const version = readUint32(reader); // 3\r\n        const desc = readVersionAndDescriptor(reader, true) as CAIDesc;\r\n        console.log('CAI version', version);\r\n        console.log('CAI', require('util').inspect(desc, false, 99, true));\r\n        console.log('CAI left', readBytes(reader, left())); // 8 bytes left, all zeroes\r\n    },\r\n    (_writer, _target) => {\r\n    },\r\n);\r\n// */\r\nif (MOCK_HANDLERS) {\r\n    addHandler('CAI ', function (target) { return target._CAI_ !== undefined; }, function (reader, target, left) {\r\n        target._CAI_ = readBytes(reader, left());\r\n    }, function (writer, target) {\r\n        writeBytes(writer, target._CAI_);\r\n    });\r\n}\r\n// interface OCIODescriptor {\r\n// \t_name: '';\r\n// \t_classID: 'documentColorManagementInfo';\r\n// \t'Knd ': 'icc';\r\n// \tocio_display_view: {\r\n// \t\t_name: '';\r\n// \t\t_classID: 'viewColorManagementInfo';\r\n// \t\tdisplay: string;\r\n// \t\tview: string;\r\n// \t};\r\n// }\r\nif (MOCK_HANDLERS) {\r\n    addHandler('OCIO', // document color management info\r\n    function (// document color management info\r\n    target) { return target._OCIO !== undefined; }, function (reader, target, left) {\r\n        // const desc = readVersionAndDescriptor(reader, true) as OCIODescriptor;\r\n        // console.log('OCIO', require('util').inspect(desc, false, 99, true));\r\n        target._OCIO = readBytes(reader, left());\r\n    }, function (writer, target) {\r\n        writeBytes(writer, target._OCIO);\r\n    });\r\n}\r\n// interface GenIDescriptor {\r\n//  _name: '';\r\n//  _classID: 'genTechInfo';\r\n// \tisUsingGenTech: number;\r\n//  externalModelList?: [];\r\n// }\r\nif (MOCK_HANDLERS) {\r\n    addHandler('GenI', // generative tech\r\n    function (// generative tech\r\n    target) { return target._GenI !== undefined; }, function (reader, target, left) {\r\n        var desc = readVersionAndDescriptor(reader, true); // as GenIDescriptor;\r\n        console.log('GenI', require('util').inspect(desc, false, 99, true));\r\n        target._GenI = readBytes(reader, left());\r\n    }, function (writer, target) {\r\n        writeBytes(writer, target._GenI);\r\n    });\r\n}\r\nfunction readRect(reader) {\r\n    var top = readInt32(reader);\r\n    var left = readInt32(reader);\r\n    var bottom = readInt32(reader);\r\n    var right = readInt32(reader);\r\n    return { top: top, left: left, bottom: bottom, right: right };\r\n}\r\nfunction writeRect(writer, rect) {\r\n    writeInt32(writer, rect.top);\r\n    writeInt32(writer, rect.left);\r\n    writeInt32(writer, rect.bottom);\r\n    writeInt32(writer, rect.right);\r\n}\r\naddHandler('Anno', function (target) { return target.annotations !== undefined; }, function (reader, target, left) {\r\n    var major = readUint16(reader);\r\n    var minor = readUint16(reader);\r\n    if (major !== 2 || minor !== 1)\r\n        throw new Error('Invalid Anno version');\r\n    var count = readUint32(reader);\r\n    var annotations = [];\r\n    for (var i = 0; i < count; i++) {\r\n        /*const length =*/ readUint32(reader);\r\n        var type = readSignature(reader);\r\n        var open_1 = !!readUint8(reader);\r\n        /*const flags =*/ readUint8(reader); // always 28\r\n        /*const optionalBlocks =*/ readUint16(reader);\r\n        var iconLocation = readRect(reader);\r\n        var popupLocation = readRect(reader);\r\n        var color = readColor(reader);\r\n        var author = readPascalString(reader, 2);\r\n        var name_2 = readPascalString(reader, 2);\r\n        var date = readPascalString(reader, 2);\r\n        /*const contentLength =*/ readUint32(reader);\r\n        /*const dataType =*/ readSignature(reader);\r\n        var dataLength = readUint32(reader);\r\n        var data = void 0;\r\n        if (type === 'txtA') {\r\n            if (dataLength >= 2 && readUint16(reader) === 0xfeff) {\r\n                data = readUnicodeStringWithLength(reader, (dataLength - 2) / 2);\r\n            }\r\n            else {\r\n                reader.offset -= 2;\r\n                data = readAsciiString(reader, dataLength);\r\n            }\r\n            data = data.replace(/\\r/g, '\\n');\r\n        }\r\n        else if (type === 'sndA') {\r\n            data = readBytes(reader, dataLength);\r\n        }\r\n        else {\r\n            throw new Error('Unknown annotation type');\r\n        }\r\n        annotations.push({\r\n            type: type === 'txtA' ? 'text' : 'sound',\r\n            open: open_1,\r\n            iconLocation: iconLocation,\r\n            popupLocation: popupLocation,\r\n            color: color,\r\n            author: author,\r\n            name: name_2,\r\n            date: date,\r\n            data: data,\r\n        });\r\n    }\r\n    target.annotations = annotations;\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var annotations = target.annotations;\r\n    writeUint16(writer, 2);\r\n    writeUint16(writer, 1);\r\n    writeUint32(writer, annotations.length);\r\n    for (var _i = 0, annotations_1 = annotations; _i < annotations_1.length; _i++) {\r\n        var annotation = annotations_1[_i];\r\n        var sound = annotation.type === 'sound';\r\n        if (sound && !(annotation.data instanceof Uint8Array))\r\n            throw new Error('Sound annotation data should be Uint8Array');\r\n        if (!sound && typeof annotation.data !== 'string')\r\n            throw new Error('Text annotation data should be string');\r\n        var lengthOffset = writer.offset;\r\n        writeUint32(writer, 0); // length\r\n        writeSignature(writer, sound ? 'sndA' : 'txtA');\r\n        writeUint8(writer, annotation.open ? 1 : 0);\r\n        writeUint8(writer, 28);\r\n        writeUint16(writer, 1);\r\n        writeRect(writer, annotation.iconLocation);\r\n        writeRect(writer, annotation.popupLocation);\r\n        writeColor(writer, annotation.color);\r\n        writePascalString(writer, annotation.author || '', 2);\r\n        writePascalString(writer, annotation.name || '', 2);\r\n        writePascalString(writer, annotation.date || '', 2);\r\n        var contentOffset = writer.offset;\r\n        writeUint32(writer, 0); // content length\r\n        writeSignature(writer, sound ? 'sndM' : 'txtC');\r\n        writeUint32(writer, 0); // data length\r\n        var dataOffset = writer.offset;\r\n        if (sound) {\r\n            writeBytes(writer, annotation.data);\r\n        }\r\n        else {\r\n            writeUint16(writer, 0xfeff); // unicode string indicator\r\n            var text = annotation.data.replace(/\\n/g, '\\r');\r\n            for (var i = 0; i < text.length; i++)\r\n                writeUint16(writer, text.charCodeAt(i));\r\n        }\r\n        writer.view.setUint32(lengthOffset, writer.offset - lengthOffset, false);\r\n        writer.view.setUint32(contentOffset, writer.offset - contentOffset, false);\r\n        writer.view.setUint32(dataOffset - 4, writer.offset - dataOffset, false);\r\n    }\r\n});\r\nfunction createLnkHandler(tag) {\r\n    addHandler(tag, function (target) {\r\n        var psd = target;\r\n        if (!psd.linkedFiles || !psd.linkedFiles.length)\r\n            return false;\r\n        if (tag === 'lnkE' && !psd.linkedFiles.some(function (f) { return f.linkedFile; }))\r\n            return false;\r\n        return true;\r\n    }, function (reader, target, left, _psd) {\r\n        var psd = target;\r\n        psd.linkedFiles = psd.linkedFiles || [];\r\n        while (left() > 8) {\r\n            var size = readLength64(reader);\r\n            var startOffset = reader.offset;\r\n            var type = readSignature(reader);\r\n            // liFD - linked file data\r\n            // liFE - linked file external\r\n            // liFA - linked file alias\r\n            var version = readInt32(reader);\r\n            var id = readPascalString(reader, 1);\r\n            var name_3 = readUnicodeString(reader);\r\n            var fileType = readSignature(reader).trim(); // '    ' if empty\r\n            var fileCreator = readSignature(reader).trim(); // '    ' or '\\0\\0\\0\\0' if empty\r\n            var dataSize = readLength64(reader);\r\n            var hasFileOpenDescriptor = readUint8(reader);\r\n            var fileOpenDescriptor = hasFileOpenDescriptor ? readVersionAndDescriptor(reader) : undefined;\r\n            var linkedFileDescriptor = type === 'liFE' ? readVersionAndDescriptor(reader) : undefined;\r\n            var file = { id: id, name: name_3 };\r\n            if (fileType)\r\n                file.type = fileType;\r\n            if (fileCreator)\r\n                file.creator = fileCreator;\r\n            if (fileOpenDescriptor) {\r\n                file.descriptor = {\r\n                    compInfo: {\r\n                        compID: fileOpenDescriptor.compInfo.compID,\r\n                        originalCompID: fileOpenDescriptor.compInfo.originalCompID,\r\n                    }\r\n                };\r\n            }\r\n            if (type === 'liFE' && version > 3) {\r\n                var year = readInt32(reader);\r\n                var month = readUint8(reader);\r\n                var day = readUint8(reader);\r\n                var hour = readUint8(reader);\r\n                var minute = readUint8(reader);\r\n                var seconds = readFloat64(reader);\r\n                var wholeSeconds = Math.floor(seconds);\r\n                var ms = (seconds - wholeSeconds) * 1000;\r\n                file.time = (new Date(Date.UTC(year, month, day, hour, minute, wholeSeconds, ms))).toISOString();\r\n            }\r\n            var fileSize = type === 'liFE' ? readLength64(reader) : 0;\r\n            if (type === 'liFA')\r\n                skipBytes(reader, 8);\r\n            if (type === 'liFD')\r\n                file.data = readBytes(reader, dataSize); // seems to be a typo in docs\r\n            if (version >= 5)\r\n                file.childDocumentID = readUnicodeString(reader);\r\n            if (version >= 6)\r\n                file.assetModTime = readFloat64(reader);\r\n            if (version >= 7)\r\n                file.assetLockedState = readUint8(reader);\r\n            if (type === 'liFE' && version === 2)\r\n                file.data = readBytes(reader, fileSize);\r\n            if (reader.skipLinkedFilesData)\r\n                file.data = undefined;\r\n            if (tag === 'lnkE') {\r\n                file.linkedFile = {\r\n                    fileSize: fileSize,\r\n                    name: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor['Nm  ']) || '',\r\n                    fullPath: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor.fullPath) || '',\r\n                    originalPath: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor.originalPath) || '',\r\n                    relativePath: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor.relPath) || '',\r\n                };\r\n            }\r\n            psd.linkedFiles.push(file);\r\n            while (size % 4)\r\n                size++;\r\n            reader.offset = startOffset + size;\r\n        }\r\n        skipBytes(reader, left()); // ?\r\n    }, function (writer, target) {\r\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j;\r\n        var psd = target;\r\n        for (var _i = 0, _k = psd.linkedFiles; _i < _k.length; _i++) {\r\n            var file = _k[_i];\r\n            if ((tag === 'lnkE') !== !!file.linkedFile)\r\n                continue;\r\n            var version = 2;\r\n            if (file.assetLockedState != null)\r\n                version = 7;\r\n            else if (file.assetModTime != null)\r\n                version = 6;\r\n            else if (file.childDocumentID != null)\r\n                version = 5;\r\n            else if (tag === 'lnkE')\r\n                version = 3;\r\n            writeLength64(writer, 0);\r\n            var sizeOffset = writer.offset;\r\n            writeSignature(writer, (tag === 'lnkE') ? 'liFE' : (file.data ? 'liFD' : 'liFA'));\r\n            writeInt32(writer, version);\r\n            if (!file.id || typeof file.id !== 'string' || !/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/.test(file.id)) {\r\n                throw new Error('Linked file ID must be in a GUID format (example: 20953ddb-9391-11ec-b4f1-c15674f50bc4)');\r\n            }\r\n            writePascalString(writer, file.id, 1);\r\n            writeUnicodeStringWithPadding(writer, file.name || '');\r\n            writeSignature(writer, file.type ? \"\".concat(file.type, \"    \").substring(0, 4) : '    ');\r\n            writeSignature(writer, file.creator ? \"\".concat(file.creator, \"    \").substring(0, 4) : '\\0\\0\\0\\0');\r\n            writeLength64(writer, file.data ? file.data.byteLength : 0);\r\n            if (file.descriptor && file.descriptor.compInfo) {\r\n                var desc = {\r\n                    compInfo: {\r\n                        compID: file.descriptor.compInfo.compID,\r\n                        originalCompID: file.descriptor.compInfo.originalCompID,\r\n                    },\r\n                };\r\n                writeUint8(writer, 1);\r\n                writeVersionAndDescriptor(writer, '', 'null', desc);\r\n            }\r\n            else {\r\n                writeUint8(writer, 0);\r\n            }\r\n            if (tag === 'lnkE') {\r\n                var desc = {\r\n                    descVersion: 2,\r\n                    'Nm  ': (_b = (_a = file.linkedFile) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : '',\r\n                    fullPath: (_d = (_c = file.linkedFile) === null || _c === void 0 ? void 0 : _c.fullPath) !== null && _d !== void 0 ? _d : '',\r\n                    originalPath: (_f = (_e = file.linkedFile) === null || _e === void 0 ? void 0 : _e.originalPath) !== null && _f !== void 0 ? _f : '',\r\n                    relPath: (_h = (_g = file.linkedFile) === null || _g === void 0 ? void 0 : _g.relativePath) !== null && _h !== void 0 ? _h : '',\r\n                };\r\n                writeVersionAndDescriptor(writer, '', 'ExternalFileLink', desc);\r\n                var time = file.time ? new Date(file.time) : new Date();\r\n                writeInt32(writer, time.getUTCFullYear());\r\n                writeUint8(writer, time.getUTCMonth());\r\n                writeUint8(writer, time.getUTCDate());\r\n                writeUint8(writer, time.getUTCHours());\r\n                writeUint8(writer, time.getUTCMinutes());\r\n                writeFloat64(writer, time.getUTCSeconds() + time.getUTCMilliseconds() / 1000);\r\n            }\r\n            if (file.data) {\r\n                writeBytes(writer, file.data);\r\n            }\r\n            else {\r\n                writeLength64(writer, ((_j = file.linkedFile) === null || _j === void 0 ? void 0 : _j.fileSize) || 0);\r\n            }\r\n            if (version >= 5)\r\n                writeUnicodeStringWithPadding(writer, file.childDocumentID || '');\r\n            if (version >= 6)\r\n                writeFloat64(writer, file.assetModTime || 0);\r\n            if (version >= 7)\r\n                writeUint8(writer, file.assetLockedState || 0);\r\n            var size = writer.offset - sizeOffset;\r\n            writer.view.setUint32(sizeOffset - 4, size, false); // write size\r\n            while (size % 4) {\r\n                size++;\r\n                writeUint8(writer, 0);\r\n            }\r\n        }\r\n    });\r\n}\r\ncreateLnkHandler('lnk2');\r\ncreateLnkHandler('lnkE');\r\naddHandlerAlias('lnkD', 'lnk2');\r\naddHandlerAlias('lnk3', 'lnk2');\r\naddHandler('pths', hasKey('pathList'), function (reader, target) {\r\n    var desc = readVersionAndDescriptor(reader, true);\r\n    // console.log(require('util').inspect(desc, false, 99, true));\r\n    // if (options.throwForMissingFeatures && desc?.pathList?.length) throw new Error('non-empty pathList in `pths`');\r\n    desc;\r\n    target.pathList = []; // TODO: read paths\r\n}, function (writer, _target) {\r\n    var desc = {\r\n        pathList: [], // TODO: write paths\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'pathsDataClass', desc);\r\n});\r\naddHandler('lyvr', hasKey('version'), function (reader, target) { return target.version = readUint32(reader); }, function (writer, target) { return writeUint32(writer, target.version); });\r\naddHandler('lfxs', function () { return false; }, // TODO: not sure when we actually need to write this section\r\n// NOTE: this might be insufficient\r\n// target => target.effects !== undefined && (\r\n// \t!!target.effects.dropShadow?.some(e => e.choke) ||\r\n// \t!!target.effects.innerShadow?.some(e => e.choke) ||\r\n// \t!!target.effects.outerGlow?.choke ||\r\n// \t!!target.effects.innerGlow?.choke\r\n// ),\r\nfunction (reader, target, left) {\r\n    var version = readUint32(reader);\r\n    if (version !== 0)\r\n        throw new Error(\"Invalid lfxs version\");\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.effects = parseEffects(desc, !!reader.logMissingFeatures);\r\n    skipBytes(reader, left());\r\n}, function (writer, target, _, options) {\r\n    var desc = serializeEffects(target.effects, !!options.logMissingFeatures, true);\r\n    writeUint32(writer, 0); // version\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\nfunction adjustmentType(type) {\r\n    return function (target) { return !!target.adjustment && target.adjustment.type === type; };\r\n}\r\naddHandler('brit', adjustmentType('brightness/contrast'), function (reader, target, left) {\r\n    if (!target.adjustment) { // ignore if got one from CgEd block\r\n        target.adjustment = {\r\n            type: 'brightness/contrast',\r\n            brightness: readInt16(reader),\r\n            contrast: readInt16(reader),\r\n            meanValue: readInt16(reader),\r\n            labColorOnly: !!readUint8(reader),\r\n            useLegacy: true,\r\n        };\r\n    }\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a;\r\n    var info = target.adjustment;\r\n    writeInt16(writer, info.brightness || 0);\r\n    writeInt16(writer, info.contrast || 0);\r\n    writeInt16(writer, (_a = info.meanValue) !== null && _a !== void 0 ? _a : 127);\r\n    writeUint8(writer, info.labColorOnly ? 1 : 0);\r\n    writeZeros(writer, 1);\r\n});\r\nfunction readLevelsChannel(reader) {\r\n    var shadowInput = readInt16(reader);\r\n    var highlightInput = readInt16(reader);\r\n    var shadowOutput = readInt16(reader);\r\n    var highlightOutput = readInt16(reader);\r\n    var midtoneInput = readInt16(reader) / 100;\r\n    return { shadowInput: shadowInput, highlightInput: highlightInput, shadowOutput: shadowOutput, highlightOutput: highlightOutput, midtoneInput: midtoneInput };\r\n}\r\nfunction writeLevelsChannel(writer, channel) {\r\n    writeInt16(writer, channel.shadowInput);\r\n    writeInt16(writer, channel.highlightInput);\r\n    writeInt16(writer, channel.shadowOutput);\r\n    writeInt16(writer, channel.highlightOutput);\r\n    writeInt16(writer, Math.round(channel.midtoneInput * 100));\r\n}\r\naddHandler('levl', adjustmentType('levels'), function (reader, target, left) {\r\n    if (readUint16(reader) !== 2)\r\n        throw new Error('Invalid levl version');\r\n    target.adjustment = __assign(__assign({}, target.adjustment), { type: 'levels', rgb: readLevelsChannel(reader), red: readLevelsChannel(reader), green: readLevelsChannel(reader), blue: readLevelsChannel(reader) });\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    var defaultChannel = {\r\n        shadowInput: 0,\r\n        highlightInput: 255,\r\n        shadowOutput: 0,\r\n        highlightOutput: 255,\r\n        midtoneInput: 1,\r\n    };\r\n    writeUint16(writer, 2); // version\r\n    writeLevelsChannel(writer, info.rgb || defaultChannel);\r\n    writeLevelsChannel(writer, info.red || defaultChannel);\r\n    writeLevelsChannel(writer, info.blue || defaultChannel);\r\n    writeLevelsChannel(writer, info.green || defaultChannel);\r\n    for (var i = 0; i < 59; i++)\r\n        writeLevelsChannel(writer, defaultChannel);\r\n});\r\nfunction readCurveChannel(reader) {\r\n    var nodes = readUint16(reader);\r\n    var channel = [];\r\n    for (var j = 0; j < nodes; j++) {\r\n        var output = readInt16(reader);\r\n        var input = readInt16(reader);\r\n        channel.push({ input: input, output: output });\r\n    }\r\n    return channel;\r\n}\r\nfunction writeCurveChannel(writer, channel) {\r\n    writeUint16(writer, channel.length);\r\n    for (var _i = 0, channel_1 = channel; _i < channel_1.length; _i++) {\r\n        var n = channel_1[_i];\r\n        writeUint16(writer, n.output);\r\n        writeUint16(writer, n.input);\r\n    }\r\n}\r\naddHandler('curv', adjustmentType('curves'), function (reader, target, left) {\r\n    readUint8(reader);\r\n    if (readUint16(reader) !== 1)\r\n        throw new Error('Invalid curv version');\r\n    readUint16(reader);\r\n    var channels = readUint16(reader);\r\n    var info = { type: 'curves' };\r\n    if (channels & 1)\r\n        info.rgb = readCurveChannel(reader);\r\n    if (channels & 2)\r\n        info.red = readCurveChannel(reader);\r\n    if (channels & 4)\r\n        info.green = readCurveChannel(reader);\r\n    if (channels & 8)\r\n        info.blue = readCurveChannel(reader);\r\n    target.adjustment = __assign(__assign({}, target.adjustment), info);\r\n    // ignoring, duplicate information\r\n    // checkSignature(reader, 'Crv ');\r\n    // const cVersion = readUint16(reader);\r\n    // readUint16(reader);\r\n    // const channelCount = readUint16(reader);\r\n    // for (let i = 0; i < channelCount; i++) {\r\n    // \tconst index = readUint16(reader);\r\n    // \tconst nodes = readUint16(reader);\r\n    // \tfor (let j = 0; j < nodes; j++) {\r\n    // \t\tconst output = readInt16(reader);\r\n    // \t\tconst input = readInt16(reader);\r\n    // \t}\r\n    // }\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    var rgb = info.rgb, red = info.red, green = info.green, blue = info.blue;\r\n    var channels = 0;\r\n    var channelCount = 0;\r\n    if (rgb && rgb.length) {\r\n        channels |= 1;\r\n        channelCount++;\r\n    }\r\n    if (red && red.length) {\r\n        channels |= 2;\r\n        channelCount++;\r\n    }\r\n    if (green && green.length) {\r\n        channels |= 4;\r\n        channelCount++;\r\n    }\r\n    if (blue && blue.length) {\r\n        channels |= 8;\r\n        channelCount++;\r\n    }\r\n    writeUint8(writer, 0);\r\n    writeUint16(writer, 1); // version\r\n    writeUint16(writer, 0);\r\n    writeUint16(writer, channels);\r\n    if (rgb && rgb.length)\r\n        writeCurveChannel(writer, rgb);\r\n    if (red && red.length)\r\n        writeCurveChannel(writer, red);\r\n    if (green && green.length)\r\n        writeCurveChannel(writer, green);\r\n    if (blue && blue.length)\r\n        writeCurveChannel(writer, blue);\r\n    writeSignature(writer, 'Crv ');\r\n    writeUint16(writer, 4); // version\r\n    writeUint16(writer, 0);\r\n    writeUint16(writer, channelCount);\r\n    if (rgb && rgb.length) {\r\n        writeUint16(writer, 0);\r\n        writeCurveChannel(writer, rgb);\r\n    }\r\n    if (red && red.length) {\r\n        writeUint16(writer, 1);\r\n        writeCurveChannel(writer, red);\r\n    }\r\n    if (green && green.length) {\r\n        writeUint16(writer, 2);\r\n        writeCurveChannel(writer, green);\r\n    }\r\n    if (blue && blue.length) {\r\n        writeUint16(writer, 3);\r\n        writeCurveChannel(writer, blue);\r\n    }\r\n});\r\naddHandler('expA', adjustmentType('exposure'), function (reader, target, left) {\r\n    if (readUint16(reader) !== 1)\r\n        throw new Error('Invalid expA version');\r\n    target.adjustment = __assign(__assign({}, target.adjustment), { type: 'exposure', exposure: readFloat32(reader), offset: readFloat32(reader), gamma: readFloat32(reader) });\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    writeUint16(writer, 1); // version\r\n    writeFloat32(writer, info.exposure);\r\n    writeFloat32(writer, info.offset);\r\n    writeFloat32(writer, info.gamma);\r\n    writeZeros(writer, 2);\r\n});\r\naddHandler('vibA', adjustmentType('vibrance'), function (reader, target, left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.adjustment = { type: 'vibrance' };\r\n    if (desc.vibrance !== undefined)\r\n        target.adjustment.vibrance = desc.vibrance;\r\n    if (desc.Strt !== undefined)\r\n        target.adjustment.saturation = desc.Strt;\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    var desc = {};\r\n    if (info.vibrance !== undefined)\r\n        desc.vibrance = info.vibrance;\r\n    if (info.saturation !== undefined)\r\n        desc.Strt = info.saturation;\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\nfunction readHueChannel(reader) {\r\n    return {\r\n        a: readInt16(reader),\r\n        b: readInt16(reader),\r\n        c: readInt16(reader),\r\n        d: readInt16(reader),\r\n        hue: readInt16(reader),\r\n        saturation: readInt16(reader),\r\n        lightness: readInt16(reader),\r\n    };\r\n}\r\nfunction writeHueChannel(writer, channel) {\r\n    var c = channel || {};\r\n    writeInt16(writer, c.a || 0);\r\n    writeInt16(writer, c.b || 0);\r\n    writeInt16(writer, c.c || 0);\r\n    writeInt16(writer, c.d || 0);\r\n    writeInt16(writer, c.hue || 0);\r\n    writeInt16(writer, c.saturation || 0);\r\n    writeInt16(writer, c.lightness || 0);\r\n}\r\naddHandler('hue2', adjustmentType('hue/saturation'), function (reader, target, left) {\r\n    if (readUint16(reader) !== 2)\r\n        throw new Error('Invalid hue2 version');\r\n    target.adjustment = __assign(__assign({}, target.adjustment), { type: 'hue/saturation', master: readHueChannel(reader), reds: readHueChannel(reader), yellows: readHueChannel(reader), greens: readHueChannel(reader), cyans: readHueChannel(reader), blues: readHueChannel(reader), magentas: readHueChannel(reader) });\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    writeUint16(writer, 2); // version\r\n    writeHueChannel(writer, info.master);\r\n    writeHueChannel(writer, info.reds);\r\n    writeHueChannel(writer, info.yellows);\r\n    writeHueChannel(writer, info.greens);\r\n    writeHueChannel(writer, info.cyans);\r\n    writeHueChannel(writer, info.blues);\r\n    writeHueChannel(writer, info.magentas);\r\n});\r\nfunction readColorBalance(reader) {\r\n    return {\r\n        cyanRed: readInt16(reader),\r\n        magentaGreen: readInt16(reader),\r\n        yellowBlue: readInt16(reader),\r\n    };\r\n}\r\nfunction writeColorBalance(writer, value) {\r\n    writeInt16(writer, value.cyanRed || 0);\r\n    writeInt16(writer, value.magentaGreen || 0);\r\n    writeInt16(writer, value.yellowBlue || 0);\r\n}\r\naddHandler('blnc', adjustmentType('color balance'), function (reader, target, left) {\r\n    target.adjustment = {\r\n        type: 'color balance',\r\n        shadows: readColorBalance(reader),\r\n        midtones: readColorBalance(reader),\r\n        highlights: readColorBalance(reader),\r\n        preserveLuminosity: !!readUint8(reader),\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    writeColorBalance(writer, info.shadows || {});\r\n    writeColorBalance(writer, info.midtones || {});\r\n    writeColorBalance(writer, info.highlights || {});\r\n    writeUint8(writer, info.preserveLuminosity ? 1 : 0);\r\n    writeZeros(writer, 1);\r\n});\r\naddHandler('blwh', adjustmentType('black & white'), function (reader, target, left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.adjustment = {\r\n        type: 'black & white',\r\n        reds: desc['Rd  '],\r\n        yellows: desc.Yllw,\r\n        greens: desc['Grn '],\r\n        cyans: desc['Cyn '],\r\n        blues: desc['Bl  '],\r\n        magentas: desc.Mgnt,\r\n        useTint: !!desc.useTint,\r\n        presetKind: desc.bwPresetKind,\r\n        presetFileName: desc.blackAndWhitePresetFileName,\r\n    };\r\n    if (desc.tintColor !== undefined)\r\n        target.adjustment.tintColor = parseColor(desc.tintColor);\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    var desc = {\r\n        'Rd  ': info.reds || 0,\r\n        Yllw: info.yellows || 0,\r\n        'Grn ': info.greens || 0,\r\n        'Cyn ': info.cyans || 0,\r\n        'Bl  ': info.blues || 0,\r\n        Mgnt: info.magentas || 0,\r\n        useTint: !!info.useTint,\r\n        tintColor: serializeColor(info.tintColor),\r\n        bwPresetKind: info.presetKind || 0,\r\n        blackAndWhitePresetFileName: info.presetFileName || '',\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\naddHandler('phfl', adjustmentType('photo filter'), function (reader, target, left) {\r\n    var version = readUint16(reader);\r\n    if (version !== 2 && version !== 3)\r\n        throw new Error('Invalid phfl version');\r\n    var color;\r\n    if (version === 2) {\r\n        color = readColor(reader);\r\n    }\r\n    else { // version 3\r\n        // TODO: test this, this is probably wrong\r\n        color = {\r\n            l: readInt32(reader) / 100,\r\n            a: readInt32(reader) / 100,\r\n            b: readInt32(reader) / 100,\r\n        };\r\n    }\r\n    target.adjustment = {\r\n        type: 'photo filter',\r\n        color: color,\r\n        density: readUint32(reader) / 100,\r\n        preserveLuminosity: !!readUint8(reader),\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    writeUint16(writer, 2); // version\r\n    writeColor(writer, info.color || { l: 0, a: 0, b: 0 });\r\n    writeUint32(writer, (info.density || 0) * 100);\r\n    writeUint8(writer, info.preserveLuminosity ? 1 : 0);\r\n    writeZeros(writer, 3);\r\n});\r\nfunction readMixrChannel(reader) {\r\n    var red = readInt16(reader);\r\n    var green = readInt16(reader);\r\n    var blue = readInt16(reader);\r\n    skipBytes(reader, 2);\r\n    var constant = readInt16(reader);\r\n    return { red: red, green: green, blue: blue, constant: constant };\r\n}\r\nfunction writeMixrChannel(writer, channel) {\r\n    var c = channel || {};\r\n    writeInt16(writer, c.red);\r\n    writeInt16(writer, c.green);\r\n    writeInt16(writer, c.blue);\r\n    writeZeros(writer, 2);\r\n    writeInt16(writer, c.constant);\r\n}\r\naddHandler('mixr', adjustmentType('channel mixer'), function (reader, target, left) {\r\n    if (readUint16(reader) !== 1)\r\n        throw new Error('Invalid mixr version');\r\n    var adjustment = target.adjustment = __assign(__assign({}, target.adjustment), { type: 'channel mixer', monochrome: !!readUint16(reader) });\r\n    if (!adjustment.monochrome) {\r\n        adjustment.red = readMixrChannel(reader);\r\n        adjustment.green = readMixrChannel(reader);\r\n        adjustment.blue = readMixrChannel(reader);\r\n    }\r\n    adjustment.gray = readMixrChannel(reader);\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    writeUint16(writer, 1); // version\r\n    writeUint16(writer, info.monochrome ? 1 : 0);\r\n    if (info.monochrome) {\r\n        writeMixrChannel(writer, info.gray);\r\n        writeZeros(writer, 3 * 5 * 2);\r\n    }\r\n    else {\r\n        writeMixrChannel(writer, info.red);\r\n        writeMixrChannel(writer, info.green);\r\n        writeMixrChannel(writer, info.blue);\r\n        writeMixrChannel(writer, info.gray);\r\n    }\r\n});\r\nvar colorLookupType = createEnum('colorLookupType', '3DLUT', {\r\n    '3dlut': '3DLUT',\r\n    abstractProfile: 'abstractProfile',\r\n    deviceLinkProfile: 'deviceLinkProfile',\r\n});\r\nvar LUTFormatType = createEnum('LUTFormatType', 'look', {\r\n    look: 'LUTFormatLOOK',\r\n    cube: 'LUTFormatCUBE',\r\n    '3dl': 'LUTFormat3DL',\r\n});\r\nvar colorLookupOrder = createEnum('colorLookupOrder', 'rgb', {\r\n    rgb: 'rgbOrder',\r\n    bgr: 'bgrOrder',\r\n});\r\naddHandler('clrL', adjustmentType('color lookup'), function (reader, target, left) {\r\n    if (readUint16(reader) !== 1)\r\n        throw new Error('Invalid clrL version');\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.adjustment = { type: 'color lookup' };\r\n    var info = target.adjustment;\r\n    if (desc.lookupType !== undefined)\r\n        info.lookupType = colorLookupType.decode(desc.lookupType);\r\n    if (desc['Nm  '] !== undefined)\r\n        info.name = desc['Nm  '];\r\n    if (desc.Dthr !== undefined)\r\n        info.dither = desc.Dthr;\r\n    if (desc.profile !== undefined)\r\n        info.profile = desc.profile;\r\n    if (desc.LUTFormat !== undefined)\r\n        info.lutFormat = LUTFormatType.decode(desc.LUTFormat);\r\n    if (desc.dataOrder !== undefined)\r\n        info.dataOrder = colorLookupOrder.decode(desc.dataOrder);\r\n    if (desc.tableOrder !== undefined)\r\n        info.tableOrder = colorLookupOrder.decode(desc.tableOrder);\r\n    if (desc.LUT3DFileData !== undefined)\r\n        info.lut3DFileData = desc.LUT3DFileData;\r\n    if (desc.LUT3DFileName !== undefined)\r\n        info.lut3DFileName = desc.LUT3DFileName;\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    var desc = {};\r\n    if (info.lookupType !== undefined)\r\n        desc.lookupType = colorLookupType.encode(info.lookupType);\r\n    if (info.name !== undefined)\r\n        desc['Nm  '] = info.name;\r\n    if (info.dither !== undefined)\r\n        desc.Dthr = info.dither;\r\n    if (info.profile !== undefined)\r\n        desc.profile = info.profile;\r\n    if (info.lutFormat !== undefined)\r\n        desc.LUTFormat = LUTFormatType.encode(info.lutFormat);\r\n    if (info.dataOrder !== undefined)\r\n        desc.dataOrder = colorLookupOrder.encode(info.dataOrder);\r\n    if (info.tableOrder !== undefined)\r\n        desc.tableOrder = colorLookupOrder.encode(info.tableOrder);\r\n    if (info.lut3DFileData !== undefined)\r\n        desc.LUT3DFileData = info.lut3DFileData;\r\n    if (info.lut3DFileName !== undefined)\r\n        desc.LUT3DFileName = info.lut3DFileName;\r\n    writeUint16(writer, 1); // version\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\naddHandler('nvrt', adjustmentType('invert'), function (reader, target, left) {\r\n    target.adjustment = { type: 'invert' };\r\n    skipBytes(reader, left());\r\n}, function () {\r\n    // nothing to write here\r\n});\r\naddHandler('post', adjustmentType('posterize'), function (reader, target, left) {\r\n    target.adjustment = {\r\n        type: 'posterize',\r\n        levels: readUint16(reader),\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a;\r\n    var info = target.adjustment;\r\n    writeUint16(writer, (_a = info.levels) !== null && _a !== void 0 ? _a : 4);\r\n    writeZeros(writer, 2);\r\n});\r\naddHandler('thrs', adjustmentType('threshold'), function (reader, target, left) {\r\n    target.adjustment = {\r\n        type: 'threshold',\r\n        level: readUint16(reader),\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a;\r\n    var info = target.adjustment;\r\n    writeUint16(writer, (_a = info.level) !== null && _a !== void 0 ? _a : 128);\r\n    writeZeros(writer, 2);\r\n});\r\nvar grdmColorModels = ['', '', '', 'rgb', 'hsb', '', 'lab'];\r\naddHandler('grdm', adjustmentType('gradient map'), function (reader, target, left) {\r\n    var version = readUint16(reader);\r\n    if (version !== 1 && version !== 3)\r\n        throw new Error('Invalid grdm version');\r\n    var info = {\r\n        type: 'gradient map',\r\n        gradientType: 'solid',\r\n    };\r\n    info.reverse = !!readUint8(reader);\r\n    info.dither = !!readUint8(reader);\r\n    var hasMethod = !!readUint8(reader);\r\n    reader.offset--;\r\n    if (hasMethod) {\r\n        var method = readSignature(reader);\r\n        info.method = gradientInterpolationMethodType.decode(method);\r\n    }\r\n    info.name = readUnicodeString(reader);\r\n    info.colorStops = [];\r\n    info.opacityStops = [];\r\n    var stopsCount = readUint16(reader);\r\n    for (var i = 0; i < stopsCount; i++) {\r\n        info.colorStops.push({\r\n            location: readUint32(reader),\r\n            midpoint: readUint32(reader) / 100,\r\n            color: readColor(reader),\r\n        });\r\n        skipBytes(reader, 2);\r\n    }\r\n    var opacityStopsCount = readUint16(reader);\r\n    for (var i = 0; i < opacityStopsCount; i++) {\r\n        info.opacityStops.push({\r\n            location: readUint32(reader),\r\n            midpoint: readUint32(reader) / 100,\r\n            opacity: readUint16(reader) / 0xff,\r\n        });\r\n    }\r\n    var expansionCount = readUint16(reader);\r\n    if (expansionCount !== 2)\r\n        throw new Error('Invalid grdm expansion count');\r\n    var interpolation = readUint16(reader);\r\n    info.smoothness = interpolation / 4096;\r\n    var length = readUint16(reader);\r\n    if (length !== 32)\r\n        throw new Error('Invalid grdm length');\r\n    info.gradientType = readUint16(reader) ? 'noise' : 'solid';\r\n    info.randomSeed = readUint32(reader);\r\n    info.addTransparency = !!readUint16(reader);\r\n    info.restrictColors = !!readUint16(reader);\r\n    info.roughness = readUint32(reader) / 4096;\r\n    info.colorModel = (grdmColorModels[readUint16(reader)] || 'rgb');\r\n    info.min = [\r\n        readUint16(reader) / 0x8000,\r\n        readUint16(reader) / 0x8000,\r\n        readUint16(reader) / 0x8000,\r\n        readUint16(reader) / 0x8000,\r\n    ];\r\n    info.max = [\r\n        readUint16(reader) / 0x8000,\r\n        readUint16(reader) / 0x8000,\r\n        readUint16(reader) / 0x8000,\r\n        readUint16(reader) / 0x8000,\r\n    ];\r\n    skipBytes(reader, left());\r\n    for (var _i = 0, _a = info.colorStops; _i < _a.length; _i++) {\r\n        var s = _a[_i];\r\n        s.location /= interpolation;\r\n    }\r\n    for (var _b = 0, _c = info.opacityStops; _b < _c.length; _b++) {\r\n        var s = _c[_b];\r\n        s.location /= interpolation;\r\n    }\r\n    target.adjustment = info;\r\n}, function (writer, target) {\r\n    var _a, _b, _c;\r\n    var info = target.adjustment;\r\n    writeUint16(writer, info.method !== undefined ? 3 : 1); // version\r\n    writeUint8(writer, info.reverse ? 1 : 0);\r\n    writeUint8(writer, info.dither ? 1 : 0);\r\n    if (info.method !== undefined) {\r\n        writeSignature(writer, gradientInterpolationMethodType.encode(info.method));\r\n    }\r\n    writeUnicodeStringWithPadding(writer, info.name || '');\r\n    writeUint16(writer, info.colorStops && info.colorStops.length || 0);\r\n    var interpolation = Math.round(((_a = info.smoothness) !== null && _a !== void 0 ? _a : 1) * 4096);\r\n    for (var _i = 0, _d = info.colorStops || []; _i < _d.length; _i++) {\r\n        var s = _d[_i];\r\n        writeUint32(writer, Math.round(s.location * interpolation));\r\n        writeUint32(writer, Math.round(s.midpoint * 100));\r\n        writeColor(writer, s.color);\r\n        writeZeros(writer, 2);\r\n    }\r\n    writeUint16(writer, info.opacityStops && info.opacityStops.length || 0);\r\n    for (var _e = 0, _f = info.opacityStops || []; _e < _f.length; _e++) {\r\n        var s = _f[_e];\r\n        writeUint32(writer, Math.round(s.location * interpolation));\r\n        writeUint32(writer, Math.round(s.midpoint * 100));\r\n        writeUint16(writer, Math.round(s.opacity * 0xff));\r\n    }\r\n    writeUint16(writer, 2); // expansion count\r\n    writeUint16(writer, interpolation);\r\n    writeUint16(writer, 32); // length\r\n    writeUint16(writer, info.gradientType === 'noise' ? 1 : 0);\r\n    writeUint32(writer, info.randomSeed || 0);\r\n    writeUint16(writer, info.addTransparency ? 1 : 0);\r\n    writeUint16(writer, info.restrictColors ? 1 : 0);\r\n    writeUint32(writer, Math.round(((_b = info.roughness) !== null && _b !== void 0 ? _b : 1) * 4096));\r\n    var colorModel = grdmColorModels.indexOf((_c = info.colorModel) !== null && _c !== void 0 ? _c : 'rgb');\r\n    writeUint16(writer, colorModel === -1 ? 3 : colorModel);\r\n    for (var i = 0; i < 4; i++)\r\n        writeUint16(writer, Math.round((info.min && info.min[i] || 0) * 0x8000));\r\n    for (var i = 0; i < 4; i++)\r\n        writeUint16(writer, Math.round((info.max && info.max[i] || 0) * 0x8000));\r\n    writeZeros(writer, 4);\r\n});\r\nfunction readSelectiveColors(reader) {\r\n    return {\r\n        c: readInt16(reader),\r\n        m: readInt16(reader),\r\n        y: readInt16(reader),\r\n        k: readInt16(reader),\r\n    };\r\n}\r\nfunction writeSelectiveColors(writer, cmyk) {\r\n    var c = cmyk || {};\r\n    writeInt16(writer, c.c);\r\n    writeInt16(writer, c.m);\r\n    writeInt16(writer, c.y);\r\n    writeInt16(writer, c.k);\r\n}\r\naddHandler('selc', adjustmentType('selective color'), function (reader, target) {\r\n    if (readUint16(reader) !== 1)\r\n        throw new Error('Invalid selc version');\r\n    var mode = readUint16(reader) ? 'absolute' : 'relative';\r\n    skipBytes(reader, 8);\r\n    target.adjustment = {\r\n        type: 'selective color',\r\n        mode: mode,\r\n        reds: readSelectiveColors(reader),\r\n        yellows: readSelectiveColors(reader),\r\n        greens: readSelectiveColors(reader),\r\n        cyans: readSelectiveColors(reader),\r\n        blues: readSelectiveColors(reader),\r\n        magentas: readSelectiveColors(reader),\r\n        whites: readSelectiveColors(reader),\r\n        neutrals: readSelectiveColors(reader),\r\n        blacks: readSelectiveColors(reader),\r\n    };\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    writeUint16(writer, 1); // version\r\n    writeUint16(writer, info.mode === 'absolute' ? 1 : 0);\r\n    writeZeros(writer, 8);\r\n    writeSelectiveColors(writer, info.reds);\r\n    writeSelectiveColors(writer, info.yellows);\r\n    writeSelectiveColors(writer, info.greens);\r\n    writeSelectiveColors(writer, info.cyans);\r\n    writeSelectiveColors(writer, info.blues);\r\n    writeSelectiveColors(writer, info.magentas);\r\n    writeSelectiveColors(writer, info.whites);\r\n    writeSelectiveColors(writer, info.neutrals);\r\n    writeSelectiveColors(writer, info.blacks);\r\n});\r\naddHandler('CgEd', function (target) {\r\n    var a = target.adjustment;\r\n    if (!a)\r\n        return false;\r\n    return (a.type === 'brightness/contrast' && !a.useLegacy) ||\r\n        ((a.type === 'levels' || a.type === 'curves' || a.type === 'exposure' || a.type === 'channel mixer' ||\r\n            a.type === 'hue/saturation') && a.presetFileName !== undefined);\r\n}, function (reader, target, left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    if (desc.Vrsn !== 1)\r\n        throw new Error('Invalid CgEd version');\r\n    // this section can specify preset file name for other adjustment types\r\n    if ('presetFileName' in desc) {\r\n        target.adjustment = __assign(__assign({}, target.adjustment), { presetKind: desc.presetKind, presetFileName: desc.presetFileName });\r\n    }\r\n    else if ('curvesPresetFileName' in desc) {\r\n        target.adjustment = __assign(__assign({}, target.adjustment), { presetKind: desc.curvesPresetKind, presetFileName: desc.curvesPresetFileName });\r\n    }\r\n    else if ('mixerPresetFileName' in desc) {\r\n        target.adjustment = __assign(__assign({}, target.adjustment), { presetKind: desc.mixerPresetKind, presetFileName: desc.mixerPresetFileName });\r\n    }\r\n    else {\r\n        target.adjustment = {\r\n            type: 'brightness/contrast',\r\n            brightness: desc.Brgh,\r\n            contrast: desc.Cntr,\r\n            meanValue: desc.means,\r\n            useLegacy: !!desc.useLegacy,\r\n            labColorOnly: !!desc['Lab '],\r\n            auto: !!desc.Auto,\r\n        };\r\n    }\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a, _b, _c, _d;\r\n    var info = target.adjustment;\r\n    if (info.type === 'levels' || info.type === 'exposure' || info.type === 'hue/saturation') {\r\n        var desc = {\r\n            Vrsn: 1,\r\n            presetKind: (_a = info.presetKind) !== null && _a !== void 0 ? _a : 1,\r\n            presetFileName: info.presetFileName || '',\r\n        };\r\n        writeVersionAndDescriptor(writer, '', 'null', desc);\r\n    }\r\n    else if (info.type === 'curves') {\r\n        var desc = {\r\n            Vrsn: 1,\r\n            curvesPresetKind: (_b = info.presetKind) !== null && _b !== void 0 ? _b : 1,\r\n            curvesPresetFileName: info.presetFileName || '',\r\n        };\r\n        writeVersionAndDescriptor(writer, '', 'null', desc);\r\n    }\r\n    else if (info.type === 'channel mixer') {\r\n        var desc = {\r\n            Vrsn: 1,\r\n            mixerPresetKind: (_c = info.presetKind) !== null && _c !== void 0 ? _c : 1,\r\n            mixerPresetFileName: info.presetFileName || '',\r\n        };\r\n        writeVersionAndDescriptor(writer, '', 'null', desc);\r\n    }\r\n    else if (info.type === 'brightness/contrast') {\r\n        var desc = {\r\n            Vrsn: 1,\r\n            Brgh: info.brightness || 0,\r\n            Cntr: info.contrast || 0,\r\n            means: (_d = info.meanValue) !== null && _d !== void 0 ? _d : 127,\r\n            'Lab ': !!info.labColorOnly,\r\n            useLegacy: !!info.useLegacy,\r\n            Auto: !!info.auto,\r\n        };\r\n        writeVersionAndDescriptor(writer, '', 'null', desc);\r\n    }\r\n    else {\r\n        throw new Error('Unhandled CgEd case');\r\n    }\r\n});\r\nfunction getTextLayersSortedByIndex(psd) {\r\n    var layers = [];\r\n    function collect(layer) {\r\n        var _a;\r\n        if (layer.children) {\r\n            for (var _i = 0, _b = layer.children; _i < _b.length; _i++) {\r\n                var child = _b[_i];\r\n                if (((_a = child.text) === null || _a === void 0 ? void 0 : _a.index) !== undefined) {\r\n                    layers[child.text.index] = child;\r\n                }\r\n                collect(child);\r\n            }\r\n        }\r\n    }\r\n    collect(psd);\r\n    return layers;\r\n}\r\naddHandler('Txt2', hasKey('engineData'), function (reader, target, left, psd) {\r\n    var data = readBytes(reader, left());\r\n    target.engineData = fromByteArray(data);\r\n    var layersByIndex = getTextLayersSortedByIndex(psd);\r\n    var engineData = parseEngineData(data);\r\n    var engineData2 = decodeEngineData2(engineData);\r\n    var TextFrameSet = engineData2.ResourceDict.TextFrameSet;\r\n    if (TextFrameSet) {\r\n        for (var i = 0; i < TextFrameSet.length; i++) {\r\n            var layer = layersByIndex[i];\r\n            if (TextFrameSet[i].path && (layer === null || layer === void 0 ? void 0 : layer.text)) {\r\n                layer.text.textPath = TextFrameSet[i].path;\r\n            }\r\n        }\r\n    }\r\n    // console.log(require('util').inspect(engineData, false, 99, true));\r\n    // require('fs').writeFileSync('test_data.bin', data);\r\n    // require('fs').writeFileSync('test_data.txt', require('util').inspect(engineData, false, 99, false), 'utf8');\r\n    // require('fs').writeFileSync('test_data.json', JSON.stringify(engineData2, null, 2), 'utf8');\r\n}, function (writer, target) {\r\n    var buffer = toByteArray(target.engineData);\r\n    writeBytes(writer, buffer);\r\n});\r\naddHandler('FEid', hasKey('filterEffectsMasks'), function (reader, target, leftBytes) {\r\n    var version = readInt32(reader);\r\n    if (version < 1 || version > 3)\r\n        throw new Error(\"Invalid filterEffects version \".concat(version));\r\n    target.filterEffectsMasks = [];\r\n    while (leftBytes() > 8) {\r\n        if (readUint32(reader))\r\n            throw new Error('filterEffects: 64 bit length is not supported');\r\n        var length_2 = readUint32(reader);\r\n        var end = reader.offset + length_2;\r\n        var id = readPascalString(reader, 1);\r\n        var effectVersion = readInt32(reader);\r\n        if (effectVersion !== 1)\r\n            throw new Error(\"Invalid filterEffect version \".concat(effectVersion));\r\n        if (readUint32(reader))\r\n            throw new Error('filterEffect: 64 bit length is not supported');\r\n        /*const effectLength =*/ readUint32(reader);\r\n        // const endOfEffect = reader.offset + effectLength;\r\n        var top_2 = readInt32(reader);\r\n        var left = readInt32(reader);\r\n        var bottom = readInt32(reader);\r\n        var right = readInt32(reader);\r\n        var depth = readInt32(reader);\r\n        var maxChannels = readInt32(reader);\r\n        var channels = [];\r\n        // 0 -> R, 1 -> G, 2 -> B, 25 -> A\r\n        for (var i = 0; i < (maxChannels + 2); i++) { // channels + user mask + sheet mask\r\n            var exists = readInt32(reader);\r\n            if (exists) {\r\n                if (readUint32(reader))\r\n                    throw new Error('filterEffect: 64 bit length is not supported');\r\n                var channelLength = readUint32(reader);\r\n                if (!channelLength)\r\n                    throw new Error('filterEffect: Empty channel');\r\n                var compressionMode = readUint16(reader);\r\n                var data = readBytes(reader, channelLength - 2);\r\n                channels.push({ compressionMode: compressionMode, data: data });\r\n            }\r\n            else {\r\n                channels.push(undefined);\r\n            }\r\n        }\r\n        target.filterEffectsMasks.push({ id: id, top: top_2, left: left, bottom: bottom, right: right, depth: depth, channels: channels });\r\n        if (reader.offset < end && readUint8(reader)) {\r\n            var top_3 = readInt32(reader);\r\n            var left_1 = readInt32(reader);\r\n            var bottom_1 = readInt32(reader);\r\n            var right_1 = readInt32(reader);\r\n            if (readUint32(reader))\r\n                throw new Error('filterEffect: 64 bit length is not supported');\r\n            var extraLength = readUint32(reader);\r\n            var compressionMode = readUint16(reader);\r\n            var data = readBytes(reader, extraLength - 2);\r\n            target.filterEffectsMasks[target.filterEffectsMasks.length - 1].extra = { top: top_3, left: left_1, bottom: bottom_1, right: right_1, compressionMode: compressionMode, data: data };\r\n        }\r\n        reader.offset = end;\r\n        var len = length_2;\r\n        while (len % 4) {\r\n            reader.offset++;\r\n            len++;\r\n        }\r\n    }\r\n}, function (writer, target) {\r\n    var _a;\r\n    writeInt32(writer, 3); // version\r\n    for (var _i = 0, _b = target.filterEffectsMasks; _i < _b.length; _i++) {\r\n        var mask = _b[_i];\r\n        writeUint32(writer, 0);\r\n        writeUint32(writer, 0);\r\n        var lengthOffset = writer.offset;\r\n        writePascalString(writer, mask.id, 1);\r\n        writeInt32(writer, 1); // version\r\n        writeUint32(writer, 0);\r\n        writeUint32(writer, 0);\r\n        var length2Offset = writer.offset;\r\n        writeInt32(writer, mask.top);\r\n        writeInt32(writer, mask.left);\r\n        writeInt32(writer, mask.bottom);\r\n        writeInt32(writer, mask.right);\r\n        writeInt32(writer, mask.depth);\r\n        var maxChannels = Math.max(0, mask.channels.length - 2);\r\n        writeInt32(writer, maxChannels);\r\n        for (var i = 0; i < (maxChannels + 2); i++) {\r\n            var channel = mask.channels[i];\r\n            writeInt32(writer, channel ? 1 : 0);\r\n            if (channel) {\r\n                writeUint32(writer, 0);\r\n                writeUint32(writer, channel.data.length + 2);\r\n                writeUint16(writer, channel.compressionMode);\r\n                writeBytes(writer, channel.data);\r\n            }\r\n        }\r\n        writer.view.setUint32(length2Offset - 4, writer.offset - length2Offset, false);\r\n        var extra = (_a = target.filterEffectsMasks[target.filterEffectsMasks.length - 1]) === null || _a === void 0 ? void 0 : _a.extra;\r\n        if (extra) {\r\n            writeUint8(writer, 1);\r\n            writeInt32(writer, extra.top);\r\n            writeInt32(writer, extra.left);\r\n            writeInt32(writer, extra.bottom);\r\n            writeInt32(writer, extra.right);\r\n            writeUint32(writer, 0);\r\n            writeUint32(writer, extra.data.byteLength + 2);\r\n            writeUint16(writer, extra.compressionMode);\r\n            writeBytes(writer, extra.data);\r\n        }\r\n        var length_3 = writer.offset - lengthOffset;\r\n        writer.view.setUint32(lengthOffset - 4, length_3, false);\r\n        while (length_3 % 4) {\r\n            writeZeros(writer, 1);\r\n            length_3++;\r\n        }\r\n    }\r\n});\r\naddHandlerAlias('FXid', 'FEid');\r\naddHandler('FMsk', hasKey('filterMask'), function (reader, target) {\r\n    target.filterMask = {\r\n        colorSpace: readColor(reader),\r\n        opacity: readUint16(reader) / 0xff,\r\n    };\r\n}, function (writer, target) {\r\n    var _a;\r\n    writeColor(writer, target.filterMask.colorSpace);\r\n    writeUint16(writer, clamp((_a = target.filterMask.opacity) !== null && _a !== void 0 ? _a : 1, 0, 1) * 0xff);\r\n});\r\naddHandler('artd', // document-wide artboard info\r\nfunction (// document-wide artboard info\r\ntarget) { return target.artboards !== undefined; }, function (reader, target, left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.artboards = {\r\n        count: desc['Cnt '],\r\n        autoExpandOffset: { horizontal: desc.autoExpandOffset.Hrzn, vertical: desc.autoExpandOffset.Vrtc },\r\n        origin: { horizontal: desc.origin.Hrzn, vertical: desc.origin.Vrtc },\r\n        autoExpandEnabled: desc.autoExpandEnabled,\r\n        autoNestEnabled: desc.autoNestEnabled,\r\n        autoPositionEnabled: desc.autoPositionEnabled,\r\n        shrinkwrapOnSaveEnabled: !!desc.shrinkwrapOnSaveEnabled,\r\n        docDefaultNewArtboardBackgroundColor: parseColor(desc.docDefaultNewArtboardBackgroundColor),\r\n        docDefaultNewArtboardBackgroundType: desc.docDefaultNewArtboardBackgroundType,\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a, _b, _c, _d, _e;\r\n    var artb = target.artboards;\r\n    var desc = {\r\n        'Cnt ': artb.count,\r\n        autoExpandOffset: artb.autoExpandOffset ? { Hrzn: artb.autoExpandOffset.horizontal, Vrtc: artb.autoExpandOffset.vertical } : { Hrzn: 0, Vrtc: 0 },\r\n        origin: artb.origin ? { Hrzn: artb.origin.horizontal, Vrtc: artb.origin.vertical } : { Hrzn: 0, Vrtc: 0 },\r\n        autoExpandEnabled: (_a = artb.autoExpandEnabled) !== null && _a !== void 0 ? _a : true,\r\n        autoNestEnabled: (_b = artb.autoNestEnabled) !== null && _b !== void 0 ? _b : true,\r\n        autoPositionEnabled: (_c = artb.autoPositionEnabled) !== null && _c !== void 0 ? _c : true,\r\n        shrinkwrapOnSaveEnabled: (_d = artb.shrinkwrapOnSaveEnabled) !== null && _d !== void 0 ? _d : true,\r\n        docDefaultNewArtboardBackgroundColor: serializeColor(artb.docDefaultNewArtboardBackgroundColor),\r\n        docDefaultNewArtboardBackgroundType: (_e = artb.docDefaultNewArtboardBackgroundType) !== null && _e !== void 0 ? _e : 1,\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'null', desc, 'artd');\r\n});\r\nexport function hasMultiEffects(effects) {\r\n    return Object.keys(effects).map(function (key) { return effects[key]; }).some(function (v) { return Array.isArray(v) && v.length > 1; });\r\n}\r\naddHandler('lfx2', function (target) { return target.effects !== undefined && !hasMultiEffects(target.effects); }, function (reader, target, left) {\r\n    var version = readUint32(reader);\r\n    if (version !== 0)\r\n        throw new Error(\"Invalid lfx2 version\");\r\n    var desc = readVersionAndDescriptor(reader);\r\n    // console.log('READ', require('util').inspect(desc, false, 99, true));\r\n    // TODO: don't discard if we got it from lmfx\r\n    // discard if read in 'lrFX' section\r\n    target.effects = parseEffects(desc, !!reader.logMissingFeatures);\r\n    skipBytes(reader, left());\r\n}, function (writer, target, _, options) {\r\n    var desc = serializeEffects(target.effects, !!options.logMissingFeatures, true);\r\n    // console.log('WRITE', require('util').inspect(desc, false, 99, true));\r\n    writeUint32(writer, 0); // version\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\naddHandler('cinf', hasKey('compositorUsed'), function (reader, target, left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    // console.log(require('util').inspect(desc, false, 99, true));\r\n    function enumValue(desc) {\r\n        return desc.split('.')[1];\r\n    }\r\n    target.compositorUsed = {\r\n        description: desc.description,\r\n        reason: desc.reason,\r\n        engine: enumValue(desc.Engn),\r\n    };\r\n    if (desc.Vrsn)\r\n        target.compositorUsed.version = desc.Vrsn;\r\n    if (desc.psVersion)\r\n        target.compositorUsed.photoshopVersion = desc.psVersion;\r\n    if (desc.enableCompCore)\r\n        target.compositorUsed.enableCompCore = enumValue(desc.enableCompCore);\r\n    if (desc.enableCompCoreGPU)\r\n        target.compositorUsed.enableCompCoreGPU = enumValue(desc.enableCompCoreGPU);\r\n    if (desc.enableCompCoreThreads)\r\n        target.compositorUsed.enableCompCoreThreads = enumValue(desc.enableCompCoreThreads);\r\n    if (desc.compCoreSupport)\r\n        target.compositorUsed.compCoreSupport = enumValue(desc.compCoreSupport);\r\n    if (desc.compCoreGPUSupport)\r\n        target.compositorUsed.compCoreGPUSupport = enumValue(desc.compCoreGPUSupport);\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var cinf = target.compositorUsed;\r\n    var desc = {\r\n        Vrsn: cinf.version || { major: 1, minor: 0, fix: 0 },\r\n    };\r\n    if (cinf.photoshopVersion)\r\n        desc.psVersion = cinf.photoshopVersion;\r\n    desc.description = cinf.description;\r\n    desc.reason = cinf.reason;\r\n    desc.Engn = \"Engn.\".concat(cinf.engine);\r\n    if (cinf.enableCompCore)\r\n        desc.enableCompCore = \"enable.\".concat(cinf.enableCompCore);\r\n    if (cinf.enableCompCoreGPU)\r\n        desc.enableCompCoreGPU = \"enable.\".concat(cinf.enableCompCoreGPU);\r\n    if (cinf.enableCompCoreThreads)\r\n        desc.enableCompCoreThreads = \"enable.\".concat(cinf.enableCompCoreThreads);\r\n    if (cinf.compCoreSupport)\r\n        desc.compCoreSupport = \"reason.\".concat(cinf.compCoreSupport);\r\n    if (cinf.compCoreGPUSupport)\r\n        desc.compCoreGPUSupport = \"reason.\".concat(cinf.compCoreGPUSupport);\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\n// extension settings ?, ignore it\r\naddHandler('extn', function (target) { return target._extn !== undefined; }, function (reader, target) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    // console.log(require('util').inspect(desc, false, 99, true));\r\n    if (MOCK_HANDLERS)\r\n        target._extn = desc;\r\n}, function (writer, target) {\r\n    // TODO: need to add correct types for desc fields (resources/src.psd)\r\n    if (MOCK_HANDLERS)\r\n        writeVersionAndDescriptor(writer, '', 'null', target._extn);\r\n});\r\naddHandler('iOpa', hasKey('fillOpacity'), function (reader, target) {\r\n    target.fillOpacity = readUint8(reader) / 0xff;\r\n    skipBytes(reader, 3);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.fillOpacity * 0xff);\r\n    writeZeros(writer, 3);\r\n});\r\naddHandler('brst', hasKey('channelBlendingRestrictions'), function (reader, target, left) {\r\n    target.channelBlendingRestrictions = [];\r\n    while (left() > 4) {\r\n        target.channelBlendingRestrictions.push(readInt32(reader));\r\n    }\r\n}, function (writer, target) {\r\n    for (var _i = 0, _a = target.channelBlendingRestrictions; _i < _a.length; _i++) {\r\n        var channel = _a[_i];\r\n        writeInt32(writer, channel);\r\n    }\r\n});\r\naddHandler('tsly', hasKey('transparencyShapesLayer'), function (reader, target) {\r\n    target.transparencyShapesLayer = !!readUint8(reader);\r\n    skipBytes(reader, 3);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.transparencyShapesLayer ? 1 : 0);\r\n    writeZeros(writer, 3);\r\n});\r\n//# sourceMappingURL=additionalInfo.js.map","var __assign = (this && this.__assign) || function () {\r\n    __assign = Object.assign || function(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n                t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\nimport { hasAlpha, createCanvas, writeDataRLE, offsetForChannel, createImageData, fromBlendMode, clamp, largeAdditionalInfoKeys, RAW_IMAGE_DATA, writeDataZipWithoutPrediction, imageDataToCanvas } from './helpers';\r\nimport { infoHandlers } from './additionalInfo';\r\nimport { resourceHandlers } from './imageResources';\r\nexport function createWriter(size) {\r\n    if (size === void 0) { size = 4096; }\r\n    var buffer = new ArrayBuffer(size);\r\n    var view = new DataView(buffer);\r\n    var offset = 0;\r\n    return { buffer: buffer, view: view, offset: offset, tempBuffer: undefined };\r\n}\r\nexport function getWriterBuffer(writer) {\r\n    return writer.buffer.slice(0, writer.offset);\r\n}\r\nexport function getWriterBufferNoCopy(writer) {\r\n    return new Uint8Array(writer.buffer, 0, writer.offset);\r\n}\r\nexport function writeUint8(writer, value) {\r\n    var offset = addSize(writer, 1);\r\n    writer.view.setUint8(offset, value);\r\n}\r\nexport function writeInt16(writer, value) {\r\n    var offset = addSize(writer, 2);\r\n    writer.view.setInt16(offset, value, false);\r\n}\r\nexport function writeUint16(writer, value) {\r\n    var offset = addSize(writer, 2);\r\n    writer.view.setUint16(offset, value, false);\r\n}\r\nexport function writeUint16LE(writer, value) {\r\n    var offset = addSize(writer, 2);\r\n    writer.view.setUint16(offset, value, true);\r\n}\r\nexport function writeInt32(writer, value) {\r\n    var offset = addSize(writer, 4);\r\n    writer.view.setInt32(offset, value, false);\r\n}\r\nexport function writeInt32LE(writer, value) {\r\n    var offset = addSize(writer, 4);\r\n    writer.view.setInt32(offset, value, true);\r\n}\r\nexport function writeUint32(writer, value) {\r\n    var offset = addSize(writer, 4);\r\n    writer.view.setUint32(offset, value, false);\r\n}\r\nexport function writeFloat32(writer, value) {\r\n    var offset = addSize(writer, 4);\r\n    writer.view.setFloat32(offset, value, false);\r\n}\r\nexport function writeFloat64(writer, value) {\r\n    var offset = addSize(writer, 8);\r\n    writer.view.setFloat64(offset, value, false);\r\n}\r\n// 32-bit fixed-point number 16.16\r\nexport function writeFixedPoint32(writer, value) {\r\n    writeInt32(writer, value * (1 << 16));\r\n}\r\n// 32-bit fixed-point number 8.24\r\nexport function writeFixedPointPath32(writer, value) {\r\n    writeInt32(writer, value * (1 << 24));\r\n}\r\nexport function writeBytes(writer, buffer) {\r\n    if (buffer) {\r\n        ensureSize(writer, writer.offset + buffer.length);\r\n        var bytes = new Uint8Array(writer.buffer);\r\n        bytes.set(buffer, writer.offset);\r\n        writer.offset += buffer.length;\r\n    }\r\n}\r\nexport function writeZeros(writer, count) {\r\n    for (var i = 0; i < count; i++) {\r\n        writeUint8(writer, 0);\r\n    }\r\n}\r\nexport function writeSignature(writer, signature) {\r\n    if (signature.length !== 4)\r\n        throw new Error(\"Invalid signature: '\".concat(signature, \"'\"));\r\n    for (var i = 0; i < 4; i++) {\r\n        writeUint8(writer, signature.charCodeAt(i));\r\n    }\r\n}\r\nexport function writeAsciiString(writer, text) {\r\n    for (var i = 0; i < text.length; i++) {\r\n        writeUint8(writer, text.charCodeAt(i));\r\n    }\r\n}\r\nexport function writePascalString(writer, text, padTo) {\r\n    var length = text.length;\r\n    if (length > 255)\r\n        throw new Error(\"String too long\");\r\n    writeUint8(writer, length);\r\n    for (var i = 0; i < length; i++) {\r\n        var code = text.charCodeAt(i);\r\n        // writeUint8(writer, code); // for testing\r\n        writeUint8(writer, code < 128 ? code : '?'.charCodeAt(0));\r\n    }\r\n    while (++length % padTo) {\r\n        writeUint8(writer, 0);\r\n    }\r\n}\r\nexport function writeUnicodeStringWithoutLength(writer, text) {\r\n    for (var i = 0; i < text.length; i++) {\r\n        writeUint16(writer, text.charCodeAt(i));\r\n    }\r\n}\r\nexport function writeUnicodeStringWithoutLengthLE(writer, text) {\r\n    for (var i = 0; i < text.length; i++) {\r\n        writeUint16LE(writer, text.charCodeAt(i));\r\n    }\r\n}\r\nexport function writeUnicodeString(writer, text) {\r\n    writeUint32(writer, text.length);\r\n    writeUnicodeStringWithoutLength(writer, text);\r\n}\r\nexport function writeUnicodeStringWithPadding(writer, text) {\r\n    writeUint32(writer, text.length + 1);\r\n    for (var i = 0; i < text.length; i++) {\r\n        writeUint16(writer, text.charCodeAt(i));\r\n    }\r\n    writeUint16(writer, 0);\r\n}\r\nfunction getLargestLayerSize(layers) {\r\n    if (layers === void 0) { layers = []; }\r\n    var max = 0;\r\n    for (var _i = 0, layers_1 = layers; _i < layers_1.length; _i++) {\r\n        var layer = layers_1[_i];\r\n        if (layer.canvas || layer.imageData) {\r\n            var _a = getLayerDimentions(layer), width = _a.width, height = _a.height;\r\n            max = Math.max(max, 2 * height + 2 * width * height);\r\n        }\r\n        if (layer.children) {\r\n            max = Math.max(max, getLargestLayerSize(layer.children));\r\n        }\r\n    }\r\n    return max;\r\n}\r\nexport function writeSection(writer, round, func, writeTotalLength, large) {\r\n    if (writeTotalLength === void 0) { writeTotalLength = false; }\r\n    if (large === void 0) { large = false; }\r\n    if (large)\r\n        writeUint32(writer, 0);\r\n    var offset = writer.offset;\r\n    writeUint32(writer, 0);\r\n    func();\r\n    var length = writer.offset - offset - 4;\r\n    var len = length;\r\n    while (len % round) {\r\n        writeUint8(writer, 0);\r\n        len++;\r\n    }\r\n    // while (writer.offset % round) {\r\n    // \twriteUint8(writer, 0);\r\n    // \tlen++;\r\n    // }\r\n    if (writeTotalLength) {\r\n        length = len;\r\n    }\r\n    writer.view.setUint32(offset, length, false);\r\n}\r\nfunction verifyBitCount(target) {\r\n    var _a;\r\n    (_a = target.children) === null || _a === void 0 ? void 0 : _a.forEach(verifyBitCount);\r\n    var data = target.imageData;\r\n    if (data && (data.data instanceof Uint32Array || data.data instanceof Uint16Array)) {\r\n        throw new Error('imageData has incorrect bitDepth');\r\n    }\r\n    if ('mask' in target && target.mask) {\r\n        var data_1 = target.mask.imageData;\r\n        if (data_1 && (data_1.data instanceof Uint32Array || data_1.data instanceof Uint16Array)) {\r\n            throw new Error('mask imageData has incorrect bitDepth');\r\n        }\r\n    }\r\n}\r\nexport function writePsd(writer, psd, options) {\r\n    var _a;\r\n    if (options === void 0) { options = {}; }\r\n    if (!(+psd.width > 0 && +psd.height > 0))\r\n        throw new Error('Invalid document size');\r\n    if ((psd.width > 30000 || psd.height > 30000) && !options.psb)\r\n        throw new Error('Document size is too large (max is 30000x30000, use PSB format instead)');\r\n    var bitsPerChannel = (_a = psd.bitsPerChannel) !== null && _a !== void 0 ? _a : 8;\r\n    if (bitsPerChannel !== 8)\r\n        throw new Error('bitsPerChannel other than 8 are not supported for writing');\r\n    verifyBitCount(psd);\r\n    var imageResources = __assign({}, psd.imageResources);\r\n    var opt = __assign(__assign({}, options), { layerIds: new Set(), layerToId: new Map() });\r\n    if (opt.generateThumbnail) {\r\n        imageResources.thumbnail = createThumbnail(psd);\r\n    }\r\n    var imageData = psd.imageData;\r\n    if (!imageData && psd.canvas) {\r\n        imageData = psd.canvas.getContext('2d').getImageData(0, 0, psd.canvas.width, psd.canvas.height);\r\n    }\r\n    if (imageData && (psd.width !== imageData.width || psd.height !== imageData.height))\r\n        throw new Error('Document canvas must have the same size as document');\r\n    var globalAlpha = !!imageData && hasAlpha(imageData);\r\n    var maxBufferSize = Math.max(getLargestLayerSize(psd.children), 4 * 2 * psd.width * psd.height + 2 * psd.height);\r\n    writer.tempBuffer = new Uint8Array(maxBufferSize);\r\n    // header\r\n    writeSignature(writer, '8BPS');\r\n    writeUint16(writer, options.psb ? 2 : 1); // version\r\n    writeZeros(writer, 6);\r\n    writeUint16(writer, globalAlpha ? 4 : 3); // channels\r\n    writeUint32(writer, psd.height);\r\n    writeUint32(writer, psd.width);\r\n    writeUint16(writer, bitsPerChannel); // bits per channel\r\n    writeUint16(writer, 3 /* ColorMode.RGB */); // we only support saving RGB right now\r\n    // color mode data\r\n    writeSection(writer, 1, function () {\r\n        var _a, _b, _c;\r\n        if (psd.palette) {\r\n            for (var i = 0; i < 256; i++)\r\n                writeUint8(writer, ((_a = psd.palette[i]) === null || _a === void 0 ? void 0 : _a.r) || 0);\r\n            for (var i = 0; i < 256; i++)\r\n                writeUint8(writer, ((_b = psd.palette[i]) === null || _b === void 0 ? void 0 : _b.g) || 0);\r\n            for (var i = 0; i < 256; i++)\r\n                writeUint8(writer, ((_c = psd.palette[i]) === null || _c === void 0 ? void 0 : _c.b) || 0);\r\n        }\r\n        // TODO: other data?\r\n    });\r\n    var layers = [];\r\n    addChildren(layers, psd.children);\r\n    if (!layers.length)\r\n        layers.push({});\r\n    // image resources\r\n    imageResources.layersGroup = layers.map(function (l) { return l.linkGroup || 0; });\r\n    imageResources.layerGroupsEnabledId = layers.map(function (l) { return l.linkGroupEnabled == false ? 0 : 1; });\r\n    writeSection(writer, 1, function () {\r\n        var _loop_1 = function (handler) {\r\n            var has = handler.has(imageResources);\r\n            var count = has === false ? 0 : (has === true ? 1 : has);\r\n            var _loop_2 = function (i) {\r\n                writeSignature(writer, '8BIM');\r\n                writeUint16(writer, handler.key);\r\n                writePascalString(writer, '', 2);\r\n                writeSection(writer, 2, function () { return handler.write(writer, imageResources, i); });\r\n            };\r\n            for (var i = 0; i < count; i++) {\r\n                _loop_2(i);\r\n            }\r\n        };\r\n        for (var _i = 0, resourceHandlers_1 = resourceHandlers; _i < resourceHandlers_1.length; _i++) {\r\n            var handler = resourceHandlers_1[_i];\r\n            _loop_1(handler);\r\n        }\r\n    });\r\n    // layer and mask info\r\n    writeSection(writer, 2, function () {\r\n        writeLayerInfo(writer, layers, psd, globalAlpha, opt);\r\n        writeGlobalLayerMaskInfo(writer, psd.globalLayerMaskInfo);\r\n        writeAdditionalLayerInfo(writer, psd, psd, opt);\r\n    }, undefined, !!opt.psb);\r\n    // image data\r\n    var channels = globalAlpha ? [0, 1, 2, 3] : [0, 1, 2];\r\n    var width = imageData ? imageData.width : psd.width;\r\n    var height = imageData ? imageData.height : psd.height;\r\n    var data = { data: new Uint8Array(width * height * 4), width: width, height: height };\r\n    writeUint16(writer, 1 /* Compression.RleCompressed */); // Photoshop doesn't support zip compression of composite image data\r\n    if (RAW_IMAGE_DATA && psd.imageDataRaw) {\r\n        console.log('writing raw image data');\r\n        writeBytes(writer, psd.imageDataRaw);\r\n    }\r\n    else {\r\n        if (imageData)\r\n            data.data.set(new Uint8Array(imageData.data.buffer, imageData.data.byteOffset, imageData.data.byteLength));\r\n        // add weird white matte\r\n        if (globalAlpha) {\r\n            var size = data.width * data.height * 4;\r\n            var p = data.data;\r\n            for (var i = 0; i < size; i += 4) {\r\n                var pa = p[i + 3];\r\n                if (pa != 0 && pa != 255) {\r\n                    var a = pa / 255;\r\n                    var ra = 255 * (1 - a);\r\n                    p[i + 0] = p[i + 0] * a + ra;\r\n                    p[i + 1] = p[i + 1] * a + ra;\r\n                    p[i + 2] = p[i + 2] * a + ra;\r\n                }\r\n            }\r\n        }\r\n        writeBytes(writer, writeDataRLE(writer.tempBuffer, data, channels, !!options.psb));\r\n    }\r\n}\r\nfunction writeLayerInfo(writer, layers, psd, globalAlpha, options) {\r\n    writeSection(writer, 4, function () {\r\n        var _a;\r\n        writeInt16(writer, globalAlpha ? -layers.length : layers.length);\r\n        var layersData = layers.map(function (l, i) { return getChannels(writer.tempBuffer, l, i === 0, options); });\r\n        var _loop_3 = function (layerData) {\r\n            var layer = layerData.layer, top_1 = layerData.top, left = layerData.left, bottom = layerData.bottom, right = layerData.right, channels = layerData.channels;\r\n            writeInt32(writer, top_1);\r\n            writeInt32(writer, left);\r\n            writeInt32(writer, bottom);\r\n            writeInt32(writer, right);\r\n            writeUint16(writer, channels.length);\r\n            for (var _e = 0, channels_1 = channels; _e < channels_1.length; _e++) {\r\n                var c = channels_1[_e];\r\n                writeInt16(writer, c.channelId);\r\n                if (options.psb)\r\n                    writeUint32(writer, 0);\r\n                writeUint32(writer, c.length);\r\n            }\r\n            writeSignature(writer, '8BIM');\r\n            writeSignature(writer, fromBlendMode[layer.blendMode] || 'norm');\r\n            writeUint8(writer, Math.round(clamp((_a = layer.opacity) !== null && _a !== void 0 ? _a : 1, 0, 1) * 255));\r\n            writeUint8(writer, layer.clipping ? 1 : 0);\r\n            var flags = 0x08; // 1 for Photoshop 5.0 and later, tells if bit 4 has useful information\r\n            if (layer.transparencyProtected)\r\n                flags |= 0x01;\r\n            if (layer.hidden)\r\n                flags |= 0x02;\r\n            if (layer.vectorMask || (layer.sectionDivider && layer.sectionDivider.type !== 0 /* SectionDividerType.Other */) || layer.adjustment) {\r\n                flags |= 0x10; // pixel data irrelevant to appearance of document\r\n            }\r\n            if (layer.effectsOpen)\r\n                flags |= 0x20;\r\n            writeUint8(writer, flags);\r\n            writeUint8(writer, 0); // filler\r\n            writeSection(writer, 1, function () {\r\n                writeLayerMaskData(writer, layer, layerData);\r\n                writeLayerBlendingRanges(writer, layer);\r\n                writePascalString(writer, (layer.name || '').substring(0, 255), 4);\r\n                writeAdditionalLayerInfo(writer, layer, psd, options);\r\n            });\r\n        };\r\n        // layer records\r\n        for (var _i = 0, layersData_1 = layersData; _i < layersData_1.length; _i++) {\r\n            var layerData = layersData_1[_i];\r\n            _loop_3(layerData);\r\n        }\r\n        // layer channel image data\r\n        for (var _b = 0, layersData_2 = layersData; _b < layersData_2.length; _b++) {\r\n            var layerData = layersData_2[_b];\r\n            for (var _c = 0, _d = layerData.channels; _c < _d.length; _c++) {\r\n                var channel = _d[_c];\r\n                writeUint16(writer, channel.compression);\r\n                if (channel.buffer) {\r\n                    writeBytes(writer, channel.buffer);\r\n                }\r\n            }\r\n        }\r\n    }, true, options.psb);\r\n}\r\nfunction writeLayerMaskData(writer, _a, layerData) {\r\n    var mask = _a.mask, realMask = _a.realMask;\r\n    writeSection(writer, 1, function () {\r\n        if (!mask && !realMask)\r\n            return;\r\n        var params = 0, flags = 0, realFlags = 0;\r\n        if (mask) {\r\n            if (mask.userMaskDensity !== undefined)\r\n                params |= 1 /* MaskParams.UserMaskDensity */;\r\n            if (mask.userMaskFeather !== undefined)\r\n                params |= 2 /* MaskParams.UserMaskFeather */;\r\n            if (mask.vectorMaskDensity !== undefined)\r\n                params |= 4 /* MaskParams.VectorMaskDensity */;\r\n            if (mask.vectorMaskFeather !== undefined)\r\n                params |= 8 /* MaskParams.VectorMaskFeather */;\r\n            if (mask.disabled)\r\n                flags |= 2 /* LayerMaskFlags.LayerMaskDisabled */;\r\n            if (mask.positionRelativeToLayer)\r\n                flags |= 1 /* LayerMaskFlags.PositionRelativeToLayer */;\r\n            if (mask.fromVectorData)\r\n                flags |= 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */;\r\n            if (params)\r\n                flags |= 16 /* LayerMaskFlags.MaskHasParametersAppliedToIt */;\r\n        }\r\n        var m = layerData.mask || {};\r\n        writeInt32(writer, m.top || 0);\r\n        writeInt32(writer, m.left || 0);\r\n        writeInt32(writer, m.bottom || 0);\r\n        writeInt32(writer, m.right || 0);\r\n        writeUint8(writer, mask && mask.defaultColor || 0);\r\n        writeUint8(writer, flags);\r\n        if (realMask) {\r\n            if (realMask.disabled)\r\n                realFlags |= 2 /* LayerMaskFlags.LayerMaskDisabled */;\r\n            if (realMask.positionRelativeToLayer)\r\n                realFlags |= 1 /* LayerMaskFlags.PositionRelativeToLayer */;\r\n            if (realMask.fromVectorData)\r\n                realFlags |= 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */;\r\n            var r = layerData.realMask || {};\r\n            writeUint8(writer, realFlags);\r\n            writeUint8(writer, realMask.defaultColor || 0);\r\n            writeInt32(writer, r.top || 0);\r\n            writeInt32(writer, r.left || 0);\r\n            writeInt32(writer, r.bottom || 0);\r\n            writeInt32(writer, r.right || 0);\r\n        }\r\n        if (params && mask) {\r\n            writeUint8(writer, params);\r\n            if (mask.userMaskDensity !== undefined)\r\n                writeUint8(writer, Math.round(mask.userMaskDensity * 0xff));\r\n            if (mask.userMaskFeather !== undefined)\r\n                writeFloat64(writer, mask.userMaskFeather);\r\n            if (mask.vectorMaskDensity !== undefined)\r\n                writeUint8(writer, Math.round(mask.vectorMaskDensity * 0xff));\r\n            if (mask.vectorMaskFeather !== undefined)\r\n                writeFloat64(writer, mask.vectorMaskFeather);\r\n        }\r\n        writeZeros(writer, 2);\r\n    });\r\n}\r\nfunction writerBlendingRange(writer, range) {\r\n    writeUint8(writer, range[0]);\r\n    writeUint8(writer, range[1]);\r\n    writeUint8(writer, range[2]);\r\n    writeUint8(writer, range[3]);\r\n}\r\nfunction writeLayerBlendingRanges(writer, layer) {\r\n    writeSection(writer, 1, function () {\r\n        var ranges = layer.blendingRanges;\r\n        if (ranges) {\r\n            writerBlendingRange(writer, ranges.compositeGrayBlendSource);\r\n            writerBlendingRange(writer, ranges.compositeGraphBlendDestinationRange);\r\n            for (var _i = 0, _a = ranges.ranges; _i < _a.length; _i++) {\r\n                var r = _a[_i];\r\n                writerBlendingRange(writer, r.sourceRange);\r\n                writerBlendingRange(writer, r.destRange);\r\n            }\r\n        }\r\n    });\r\n}\r\nfunction writeGlobalLayerMaskInfo(writer, info) {\r\n    writeSection(writer, 1, function () {\r\n        if (info) {\r\n            writeUint16(writer, info.overlayColorSpace);\r\n            writeUint16(writer, info.colorSpace1);\r\n            writeUint16(writer, info.colorSpace2);\r\n            writeUint16(writer, info.colorSpace3);\r\n            writeUint16(writer, info.colorSpace4);\r\n            writeUint16(writer, info.opacity * 0xff);\r\n            writeUint8(writer, info.kind);\r\n            writeZeros(writer, 3);\r\n        }\r\n    });\r\n}\r\nfunction writeAdditionalLayerInfo(writer, target, psd, options) {\r\n    var _loop_4 = function (handler) {\r\n        var key = handler.key;\r\n        if (key === 'Txt2' && options.invalidateTextLayers)\r\n            return \"continue\";\r\n        if (key === 'vmsk' && options.psb)\r\n            key = 'vsms';\r\n        if (handler.has(target)) {\r\n            var large = options.psb && largeAdditionalInfoKeys.indexOf(key) !== -1;\r\n            var writeTotalLength = key !== 'Txt2' && key !== 'cinf' && key !== 'extn' && key !== 'CAI ' && key !== 'OCIO';\r\n            var fourBytes = key === 'Txt2' || key === 'luni' || key === 'vmsk' || key === 'artb' || key === 'artd' ||\r\n                key === 'vogk' || key === 'SoLd' || key === 'lnk2' || key === 'vscg' || key === 'vsms' || key === 'GdFl' ||\r\n                key === 'lmfx' || key === 'lrFX' || key === 'cinf' || key === 'PlLd' || key === 'Anno' || key === 'CAI ' || key === 'OCIO' || key === 'GenI' || key === 'FEid' || key === 'curv' || key === 'CgEd' || key === 'vibA' || key === 'blwh' || key === 'grdm';\r\n            writeSignature(writer, large ? '8B64' : '8BIM');\r\n            writeSignature(writer, key);\r\n            writeSection(writer, fourBytes ? 4 : 2, function () {\r\n                handler.write(writer, target, psd, options);\r\n            }, writeTotalLength, large);\r\n        }\r\n    };\r\n    for (var _i = 0, infoHandlers_1 = infoHandlers; _i < infoHandlers_1.length; _i++) {\r\n        var handler = infoHandlers_1[_i];\r\n        _loop_4(handler);\r\n    }\r\n}\r\nfunction addChildren(layers, children) {\r\n    if (!children)\r\n        return;\r\n    // const layerIds: number[] = [2];\r\n    // const timestamps: number[] = [1740120767.0230637];\r\n    for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {\r\n        var c = children_1[_i];\r\n        if (c.children && c.canvas)\r\n            throw new Error(\"Invalid layer, cannot have both 'canvas' and 'children' properties\");\r\n        if (c.children && c.imageData)\r\n            throw new Error(\"Invalid layer, cannot have both 'imageData' and 'children' properties\");\r\n        if (c.children) {\r\n            layers.push({\r\n                name: '</Layer group>',\r\n                sectionDivider: {\r\n                    type: 3 /* SectionDividerType.BoundingSectionDivider */,\r\n                },\r\n                // blendingRanges: children[0].blendingRanges,\r\n                // nameSource: 'lset',\r\n                // id: layerIds.shift(),\r\n                // protected: {\r\n                // \ttransparency: false,\r\n                // \tcomposite: false,\r\n                // \tposition: false,\r\n                // },\r\n                // layerColor: 'red',\r\n                // timestamp: timestamps.shift(),\r\n                // referencePoint: { x: 0, y: 0 },\r\n            });\r\n            addChildren(layers, c.children);\r\n            layers.push(__assign(__assign({}, c), { blendMode: c.blendMode === 'pass through' ? 'normal' : c.blendMode, sectionDivider: {\r\n                    type: c.opened === false ? 2 /* SectionDividerType.ClosedFolder */ : 1 /* SectionDividerType.OpenFolder */,\r\n                    key: fromBlendMode[c.blendMode] || 'pass',\r\n                    subType: 0,\r\n                } }));\r\n        }\r\n        else {\r\n            layers.push(__assign({}, c));\r\n        }\r\n    }\r\n}\r\nfunction resizeBuffer(writer, size) {\r\n    var newLength = writer.buffer.byteLength;\r\n    do {\r\n        newLength *= 2;\r\n    } while (size > newLength);\r\n    var newBuffer = new ArrayBuffer(newLength);\r\n    var newBytes = new Uint8Array(newBuffer);\r\n    var oldBytes = new Uint8Array(writer.buffer);\r\n    newBytes.set(oldBytes);\r\n    writer.buffer = newBuffer;\r\n    writer.view = new DataView(writer.buffer);\r\n}\r\nfunction ensureSize(writer, size) {\r\n    if (size > writer.buffer.byteLength) {\r\n        resizeBuffer(writer, size);\r\n    }\r\n}\r\nfunction addSize(writer, size) {\r\n    var offset = writer.offset;\r\n    ensureSize(writer, writer.offset += size);\r\n    return offset;\r\n}\r\nfunction createThumbnail(psd) {\r\n    var canvas = createCanvas(10, 10);\r\n    var scale = 1;\r\n    if (psd.width > psd.height) {\r\n        canvas.width = 160;\r\n        canvas.height = Math.floor(psd.height * (canvas.width / psd.width));\r\n        scale = canvas.width / psd.width;\r\n    }\r\n    else {\r\n        canvas.height = 160;\r\n        canvas.width = Math.floor(psd.width * (canvas.height / psd.height));\r\n        scale = canvas.height / psd.height;\r\n    }\r\n    var context = canvas.getContext('2d');\r\n    context.scale(scale, scale);\r\n    if (psd.imageData) {\r\n        context.drawImage(imageDataToCanvas(psd.imageData), 0, 0);\r\n    }\r\n    else if (psd.canvas) {\r\n        context.drawImage(psd.canvas, 0, 0);\r\n    }\r\n    return canvas;\r\n}\r\nfunction getMaskChannels(tempBuffer, layerData, layer, mask, options, realMask) {\r\n    var top = mask.top | 0;\r\n    var left = mask.left | 0;\r\n    var right = mask.right | 0;\r\n    var bottom = mask.bottom | 0;\r\n    var _a = getLayerDimentions(mask), width = _a.width, height = _a.height;\r\n    var imageData = mask.imageData;\r\n    if (!imageData && mask.canvas && width && height) {\r\n        imageData = mask.canvas.getContext('2d').getImageData(0, 0, width, height);\r\n    }\r\n    if (imageData && (imageData.width !== width || imageData.height !== height)) {\r\n        throw new Error('Invalid imageData dimentions');\r\n    }\r\n    right = left + width;\r\n    bottom = top + height;\r\n    var buffer;\r\n    var compression;\r\n    if (RAW_IMAGE_DATA && layer[realMask ? 'realMaskDataRaw' : 'maskDataRaw']) {\r\n        buffer = layer[realMask ? 'realMaskDataRaw' : 'maskDataRaw'];\r\n        compression = layer[realMask ? 'realMaskDataRawCompression' : 'maskDataRawCompression'];\r\n    }\r\n    else if (!imageData) {\r\n        buffer = new Uint8Array(0);\r\n        compression = 1 /* Compression.RleCompressed */;\r\n    }\r\n    else if (options.compress) {\r\n        buffer = writeDataZipWithoutPrediction(imageData, [0]);\r\n        compression = 2 /* Compression.ZipWithoutPrediction */;\r\n    }\r\n    else {\r\n        buffer = writeDataRLE(tempBuffer, imageData, [0], !!options.psb);\r\n        compression = 1 /* Compression.RleCompressed */;\r\n    }\r\n    layerData.channels.push({ channelId: realMask ? -3 /* ChannelID.RealUserMask */ : -2 /* ChannelID.UserMask */, compression: compression, buffer: buffer, length: 2 + buffer.length });\r\n    layerData[realMask ? 'realMask' : 'mask'] = { top: top, left: left, right: right, bottom: bottom };\r\n}\r\nfunction getChannels(tempBuffer, layer, background, options) {\r\n    var layerData = getLayerChannels(tempBuffer, layer, background, options);\r\n    if (layer.mask)\r\n        getMaskChannels(tempBuffer, layerData, layer, layer.mask, options, false);\r\n    if (layer.realMask)\r\n        getMaskChannels(tempBuffer, layerData, layer, layer.realMask, options, true);\r\n    return layerData;\r\n}\r\nfunction getLayerDimentions(_a) {\r\n    var _b, _c, _d, _e;\r\n    var canvas = _a.canvas, imageData = _a.imageData;\r\n    // this way in case canvas/imageData are incorrect objects without width/height properties\r\n    var width = (_c = (_b = imageData === null || imageData === void 0 ? void 0 : imageData.width) !== null && _b !== void 0 ? _b : canvas === null || canvas === void 0 ? void 0 : canvas.width) !== null && _c !== void 0 ? _c : 0;\r\n    var height = (_e = (_d = imageData === null || imageData === void 0 ? void 0 : imageData.height) !== null && _d !== void 0 ? _d : canvas === null || canvas === void 0 ? void 0 : canvas.height) !== null && _e !== void 0 ? _e : 0;\r\n    return { width: width, height: height };\r\n}\r\nfunction cropImageData(data, left, top, width, height) {\r\n    if (data.data instanceof Uint32Array || data.data instanceof Uint16Array) {\r\n        throw new Error('imageData has incorrect bit depth');\r\n    }\r\n    var croppedData = createImageData(width, height);\r\n    var srcData = data.data;\r\n    var dstData = croppedData.data;\r\n    for (var y = 0; y < height; y++) {\r\n        for (var x = 0; x < width; x++) {\r\n            var src = ((x + left) + (y + top) * data.width) * 4;\r\n            var dst = (x + y * width) * 4;\r\n            dstData[dst] = srcData[src];\r\n            dstData[dst + 1] = srcData[src + 1];\r\n            dstData[dst + 2] = srcData[src + 2];\r\n            dstData[dst + 3] = srcData[src + 3];\r\n        }\r\n    }\r\n    return croppedData;\r\n}\r\nfunction getLayerChannels(tempBuffer, layer, background, options) {\r\n    var _a;\r\n    var top = layer.top | 0;\r\n    var left = layer.left | 0;\r\n    var right = layer.right | 0;\r\n    var bottom = layer.bottom | 0;\r\n    var channels = [\r\n        { channelId: -1 /* ChannelID.Transparency */, compression: 0 /* Compression.RawData */, buffer: undefined, length: 2 },\r\n        { channelId: 0 /* ChannelID.Color0 */, compression: 0 /* Compression.RawData */, buffer: undefined, length: 2 },\r\n        { channelId: 1 /* ChannelID.Color1 */, compression: 0 /* Compression.RawData */, buffer: undefined, length: 2 },\r\n        { channelId: 2 /* ChannelID.Color2 */, compression: 0 /* Compression.RawData */, buffer: undefined, length: 2 },\r\n    ];\r\n    var _b = getLayerDimentions(layer), width = _b.width, height = _b.height;\r\n    if (!(layer.canvas || layer.imageData) || !width || !height) {\r\n        right = left;\r\n        bottom = top;\r\n        return { layer: layer, top: top, left: left, right: right, bottom: bottom, channels: channels };\r\n    }\r\n    right = left + width;\r\n    bottom = top + height;\r\n    var data = layer.imageData || layer.canvas.getContext('2d').getImageData(0, 0, width, height);\r\n    if (options.trimImageData) {\r\n        var trimmed = trimData(data);\r\n        if (trimmed.left !== 0 || trimmed.top !== 0 || trimmed.right !== data.width || trimmed.bottom !== data.height) {\r\n            left += trimmed.left;\r\n            top += trimmed.top;\r\n            right -= (data.width - trimmed.right);\r\n            bottom -= (data.height - trimmed.bottom);\r\n            width = right - left;\r\n            height = bottom - top;\r\n            if (!width || !height)\r\n                return { layer: layer, top: top, left: left, right: right, bottom: bottom, channels: channels };\r\n            data = cropImageData(data, trimmed.left, trimmed.top, width, height);\r\n        }\r\n    }\r\n    var channelIds = [\r\n        0 /* ChannelID.Color0 */,\r\n        1 /* ChannelID.Color1 */,\r\n        2 /* ChannelID.Color2 */,\r\n    ];\r\n    if (!background || options.noBackground || layer.mask || hasAlpha(data) || (RAW_IMAGE_DATA && ((_a = layer.imageDataRaw) === null || _a === void 0 ? void 0 : _a['-1']))) {\r\n        channelIds.unshift(-1 /* ChannelID.Transparency */);\r\n    }\r\n    channels = channelIds.map(function (channelId) {\r\n        var offset = offsetForChannel(channelId, false); // TODO: psd.colorMode === ColorMode.CMYK);\r\n        var buffer;\r\n        var compression;\r\n        if (RAW_IMAGE_DATA && layer.imageDataRaw) {\r\n            // console.log('written raw layer image data');\r\n            buffer = layer.imageDataRaw[channelId];\r\n            compression = layer.imageDataRawCompression[channelId];\r\n        }\r\n        else if (options.compress) {\r\n            buffer = writeDataZipWithoutPrediction(data, [offset]);\r\n            compression = 2 /* Compression.ZipWithoutPrediction */;\r\n        }\r\n        else {\r\n            buffer = writeDataRLE(tempBuffer, data, [offset], !!options.psb);\r\n            compression = 1 /* Compression.RleCompressed */;\r\n        }\r\n        return { channelId: channelId, compression: compression, buffer: buffer, length: 2 + buffer.length };\r\n    });\r\n    return { layer: layer, top: top, left: left, right: right, bottom: bottom, channels: channels };\r\n}\r\nfunction isRowEmpty(_a, y, left, right) {\r\n    var data = _a.data, width = _a.width;\r\n    var start = ((y * width + left) * 4 + 3) | 0;\r\n    var end = (start + (right - left) * 4) | 0;\r\n    for (var i = start; i < end; i = (i + 4) | 0) {\r\n        if (data[i] !== 0) {\r\n            return false;\r\n        }\r\n    }\r\n    return true;\r\n}\r\nfunction isColEmpty(_a, x, top, bottom) {\r\n    var data = _a.data, width = _a.width;\r\n    var stride = (width * 4) | 0;\r\n    var start = (top * stride + x * 4 + 3) | 0;\r\n    for (var y = top, i = start; y < bottom; y++, i = (i + stride) | 0) {\r\n        if (data[i] !== 0) {\r\n            return false;\r\n        }\r\n    }\r\n    return true;\r\n}\r\nfunction trimData(data) {\r\n    var top = 0;\r\n    var left = 0;\r\n    var right = data.width;\r\n    var bottom = data.height;\r\n    while (top < bottom && isRowEmpty(data, top, left, right))\r\n        top++;\r\n    while (bottom > top && isRowEmpty(data, bottom - 1, left, right))\r\n        bottom--;\r\n    while (left < right && isColEmpty(data, left, top, bottom))\r\n        left++;\r\n    while (right > left && isColEmpty(data, right - 1, top, bottom))\r\n        right--;\r\n    return { top: top, left: left, right: right, bottom: bottom };\r\n}\r\nexport function writeColor(writer, color) {\r\n    if (!color) {\r\n        writeUint16(writer, 0 /* ColorSpace.RGB */);\r\n        writeZeros(writer, 8);\r\n    }\r\n    else if ('r' in color) {\r\n        writeUint16(writer, 0 /* ColorSpace.RGB */);\r\n        writeUint16(writer, Math.round(color.r * 257));\r\n        writeUint16(writer, Math.round(color.g * 257));\r\n        writeUint16(writer, Math.round(color.b * 257));\r\n        writeUint16(writer, 0);\r\n    }\r\n    else if ('fr' in color) {\r\n        writeUint16(writer, 0 /* ColorSpace.RGB */);\r\n        writeUint16(writer, Math.round(color.fr * 255 * 257));\r\n        writeUint16(writer, Math.round(color.fg * 255 * 257));\r\n        writeUint16(writer, Math.round(color.fb * 255 * 257));\r\n        writeUint16(writer, 0);\r\n    }\r\n    else if ('l' in color) {\r\n        writeUint16(writer, 7 /* ColorSpace.Lab */);\r\n        writeInt16(writer, Math.round(color.l * 10000));\r\n        writeInt16(writer, Math.round(color.a < 0 ? (color.a * 12800) : (color.a * 12700)));\r\n        writeInt16(writer, Math.round(color.b < 0 ? (color.b * 12800) : (color.b * 12700)));\r\n        writeUint16(writer, 0);\r\n    }\r\n    else if ('h' in color) {\r\n        writeUint16(writer, 1 /* ColorSpace.HSB */);\r\n        writeUint16(writer, Math.round(color.h * 0xffff));\r\n        writeUint16(writer, Math.round(color.s * 0xffff));\r\n        writeUint16(writer, Math.round(color.b * 0xffff));\r\n        writeUint16(writer, 0);\r\n    }\r\n    else if ('c' in color) {\r\n        writeUint16(writer, 2 /* ColorSpace.CMYK */);\r\n        writeUint16(writer, Math.round(color.c * 257));\r\n        writeUint16(writer, Math.round(color.m * 257));\r\n        writeUint16(writer, Math.round(color.y * 257));\r\n        writeUint16(writer, Math.round(color.k * 257));\r\n    }\r\n    else {\r\n        writeUint16(writer, 8 /* ColorSpace.Grayscale */);\r\n        writeUint16(writer, Math.round(color.k * 10000 / 255));\r\n        writeZeros(writer, 6);\r\n    }\r\n}\r\n//# sourceMappingURL=psdWriter.js.map","var __assign = (this && this.__assign) || function () {\r\n    __assign = Object.assign || function(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n                t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\nimport { BlnM, parseAngle, parsePercent, parseUnitsToNumber, readVersionAndDescriptor } from './descriptor';\r\nimport { checkSignature, createReader, readBytes, readDataRLE, readInt16, readInt32, readPascalString, readPattern, readSignature, readUint16, readUint32, readUint8, skipBytes } from './psdReader';\r\nvar dynamicsControl = ['off', 'fade', 'pen pressure', 'pen tilt', 'stylus wheel', 'initial direction', 'direction', 'initial rotation', 'rotation'];\r\nvar dynamicBrushShapeShapes = ['round point', 'round blunt', 'round curve', 'round angle', 'round fan', 'flat point', 'flat blunt', 'flat curve', 'flat angle', 'flat fan'];\r\nvar tipsBrushShapeShapes = ['erodible point', 'erodible flat', 'erodible round', 'erodible square', 'erodible triangle', 'custom'];\r\nvar toBrushType = {\r\n    _: 'brush',\r\n    MixB: 'mixer brush',\r\n    SmTl: 'smudge brush',\r\n    // PbTl\r\n    // ErTl\r\n};\r\nfunction parseDynamics(desc) {\r\n    return {\r\n        control: dynamicsControl[desc.bVTy],\r\n        steps: desc.fStp,\r\n        jitter: parsePercent(desc.jitter),\r\n        minimum: parsePercent(desc['Mnm ']),\r\n    };\r\n}\r\nfunction parseBrushShape(desc) {\r\n    switch (desc._classID) {\r\n        case 'computedBrush': {\r\n            return {\r\n                type: 'computed',\r\n                size: parseUnitsToNumber(desc.Dmtr, 'Pixels'),\r\n                angle: parseAngle(desc.Angl),\r\n                roundness: parsePercent(desc.Rndn),\r\n                spacingOn: desc.Intr,\r\n                spacing: parsePercent(desc.Spcn),\r\n                flipX: desc.flipX,\r\n                flipY: desc.flipY,\r\n                hardness: parsePercent(desc.Hrdn),\r\n            };\r\n        }\r\n        case 'sampledBrush': {\r\n            return {\r\n                type: 'sampled',\r\n                size: parseUnitsToNumber(desc.Dmtr, 'Pixels'),\r\n                angle: parseAngle(desc.Angl),\r\n                roundness: parsePercent(desc.Rndn),\r\n                spacingOn: desc.Intr,\r\n                spacing: parsePercent(desc.Spcn),\r\n                flipX: desc.flipX,\r\n                flipY: desc.flipY,\r\n                name: desc['Nm  '],\r\n                sampledData: desc.sampledData,\r\n            };\r\n        }\r\n        case 'dBrush':\r\n            return {\r\n                type: 'dynamic',\r\n                shape: dynamicBrushShapeShapes[desc['Shp ']],\r\n                angle: parseAngle(desc.Angl),\r\n                size: parseUnitsToNumber(desc.Dmtr, 'Pixels'),\r\n                density: parsePercent(desc.Dnst),\r\n                length: parsePercent(desc.Lngt),\r\n                clumping: parsePercent(desc.clumping),\r\n                thickness: parsePercent(desc.thickness),\r\n                stiffness: parsePercent(desc.stiffness),\r\n                physics: desc.physics,\r\n                spacing: parsePercent(desc.Spcn),\r\n                spacingOn: desc.Intr,\r\n                flipX: desc.flipX,\r\n                flipY: desc.flipY,\r\n            };\r\n        case 'dTips': {\r\n            return __assign(__assign({ type: 'tips', angle: parseAngle(desc.Angl), size: parseUnitsToNumber(desc.Dmtr, 'Pixels'), shape: dynamicBrushShapeShapes[desc['Shp ']], physics: desc.physics, spacing: parsePercent(desc.Spcn), spacingOn: desc.Intr, flipX: desc.flipX, flipY: desc.flipY, \r\n                // tips:\r\n                tipsType: tipsBrushShapeShapes[desc.dtipsType], tipsLengthRatio: parsePercent(desc.dtipsLengthRatio), tipsHardness: parsePercent(desc.dtipsHardness) }, (desc.dtipsGridSize && desc.dtipsErodibleTipHeightMap ? {\r\n                tipsGridSize: desc.dtipsGridSize,\r\n                tipsErodibleTipHeightMap: parseHeightmap(desc.dtipsErodibleTipHeightMap),\r\n            } : {})), { \r\n                // airbrush\r\n                tipsAirbrushCutoffAngle: desc.dtipsAirbrushCutoffAngle, tipsAirbrushGranularity: parsePercent(desc.dtipsAirbrushGranularity), tipsAirbrushStreakiness: parsePercent(desc.dtipsAirbrushStreakiness), tipsAirbrushSplatSize: parsePercent(desc.dtipsAirbrushSplatSize), tipsAirbrushSplatCount: desc.dtipsAirbrushSplatCount });\r\n        }\r\n        default:\r\n            console.log(require('util').inspect(desc, false, 99, true));\r\n            throw new Error(\"Unknown brush classId: \".concat(desc._classID));\r\n    }\r\n}\r\nfunction parseHeightmap(array) {\r\n    var result = [];\r\n    for (var i = 0; i < array.byteLength; i++) {\r\n        result.push(array[i]);\r\n    }\r\n    return result;\r\n    // const view = new DataView(array.buffer, array.byteOffset, array.byteLength);\r\n    // const result: number[] = [];\r\n    // for (let i = 0, len = (array.byteLength / 4) | 0; i < len; i++) {\r\n    // \tresult.push(view.getInt32(i * 4)); ????\r\n    // }\r\n    // return result;\r\n}\r\nexport function readAbr(buffer, options) {\r\n    var _a, _b, _c, _d;\r\n    if (options === void 0) { options = {}; }\r\n    var reader = createReader(buffer.buffer, buffer.byteOffset, buffer.byteLength);\r\n    var version = readInt16(reader);\r\n    var samples = [];\r\n    var brushes = [];\r\n    var patterns = [];\r\n    if (version === 1 || version === 2) {\r\n        throw new Error(\"Unsupported ABR version (\".concat(version, \")\")); // TODO: ...\r\n    }\r\n    else if (version === 6 || version === 7 || version === 9 || version === 10) {\r\n        var minorVersion = readInt16(reader);\r\n        if (minorVersion !== 1 && minorVersion !== 2)\r\n            throw new Error('Unsupported ABR minor version');\r\n        while (reader.offset < reader.view.byteLength) {\r\n            checkSignature(reader, '8BIM');\r\n            var type = readSignature(reader);\r\n            var size = readUint32(reader);\r\n            var end = reader.offset + size;\r\n            switch (type) {\r\n                case 'samp': {\r\n                    while (reader.offset < end) {\r\n                        var brushLength = readUint32(reader);\r\n                        while (brushLength & 3)\r\n                            brushLength++; // pad to 4 byte alignment\r\n                        var brushEnd = reader.offset + brushLength;\r\n                        var id = readPascalString(reader, 1);\r\n                        // v1 - Skip the Int16 bounds rectangle and the unknown Int16.\r\n                        // v2 - Skip the unknown bytes.\r\n                        skipBytes(reader, minorVersion === 1 ? 10 : 264);\r\n                        var y = readInt32(reader);\r\n                        var x = readInt32(reader);\r\n                        var h = readInt32(reader) - y;\r\n                        var w = readInt32(reader) - x;\r\n                        if (w <= 0 || h <= 0)\r\n                            throw new Error('Invalid bounds');\r\n                        var bithDepth = readInt16(reader);\r\n                        var compression = readUint8(reader); // 0 - raw, 1 - RLE\r\n                        var alpha = new Uint8Array(w * h);\r\n                        if (bithDepth === 8) {\r\n                            if (compression === 0) {\r\n                                alpha.set(readBytes(reader, alpha.byteLength));\r\n                            }\r\n                            else if (compression === 1) {\r\n                                readDataRLE(reader, { width: w, height: h, data: alpha }, w, h, bithDepth, 1, [0], false);\r\n                            }\r\n                            else {\r\n                                throw new Error('Invalid compression');\r\n                            }\r\n                        }\r\n                        else if (bithDepth === 16) {\r\n                            if (compression === 0) {\r\n                                for (var i = 0; i < alpha.byteLength; i++) {\r\n                                    alpha[i] = readUint16(reader) >> 8; // convert to 8bit values\r\n                                }\r\n                            }\r\n                            else if (compression === 1) {\r\n                                throw new Error('not implemented (16bit RLE)'); // TODO: ...\r\n                            }\r\n                            else {\r\n                                throw new Error('Invalid compression');\r\n                            }\r\n                        }\r\n                        else {\r\n                            throw new Error('Invalid depth');\r\n                        }\r\n                        samples.push({ id: id, bounds: { x: x, y: y, w: w, h: h }, alpha: alpha });\r\n                        reader.offset = brushEnd;\r\n                    }\r\n                    break;\r\n                }\r\n                case 'desc': {\r\n                    var desc = readVersionAndDescriptor(reader, true);\r\n                    // console.log(require('util').inspect(desc, false, 99, true));\r\n                    // require('fs').writeFileSync('test.log', require('util').inspect(desc, false, 99, false), 'utf8');\r\n                    for (var _i = 0, _e = desc.Brsh; _i < _e.length; _i++) {\r\n                        var brush = _e[_i];\r\n                        var b = {\r\n                            name: brush['Nm  '],\r\n                            shape: parseBrushShape(brush.Brsh),\r\n                            spacing: parsePercent(brush.Spcn),\r\n                            // TODO: brushGroup ???\r\n                            wetEdges: brush.Wtdg,\r\n                            noise: brush.Nose,\r\n                            // TODO: TxtC ??? smoothing / build-up ?\r\n                            // TODO: 'Rpt ' ???\r\n                            useBrushSize: brush.useBrushSize, // ???\r\n                        };\r\n                        if (brush.interpretation != null)\r\n                            b.interpretation = brush.interpretation;\r\n                        if (brush.protectTexture != null)\r\n                            b.protectTexture = brush.protectTexture;\r\n                        if (brush.useTipDynamics) {\r\n                            b.shapeDynamics = {\r\n                                tiltScale: parsePercent(brush.tiltScale),\r\n                                sizeDynamics: parseDynamics(brush.szVr),\r\n                                angleDynamics: parseDynamics(brush.angleDynamics),\r\n                                roundnessDynamics: parseDynamics(brush.roundnessDynamics),\r\n                                flipX: brush.flipX,\r\n                                flipY: brush.flipY,\r\n                                brushProjection: brush.brushProjection,\r\n                                minimumDiameter: parsePercent(brush.minimumDiameter),\r\n                                minimumRoundness: parsePercent(brush.minimumRoundness),\r\n                            };\r\n                        }\r\n                        if (brush.useScatter) {\r\n                            b.scatter = {\r\n                                count: brush['Cnt '],\r\n                                bothAxes: brush.bothAxes,\r\n                                countDynamics: parseDynamics(brush.countDynamics),\r\n                                scatterDynamics: parseDynamics(brush.scatterDynamics),\r\n                            };\r\n                        }\r\n                        if (brush.useTexture && brush.Txtr) {\r\n                            b.texture = {\r\n                                id: brush.Txtr.Idnt,\r\n                                name: brush.Txtr['Nm  '],\r\n                                blendMode: BlnM.decode(brush.textureBlendMode),\r\n                                depth: parsePercent(brush.textureDepth),\r\n                                depthMinimum: parsePercent(brush.minimumDepth),\r\n                                depthDynamics: parseDynamics(brush.textureDepthDynamics),\r\n                                scale: parsePercent(brush.textureScale),\r\n                                invert: brush.InvT,\r\n                                brightness: brush.textureBrightness,\r\n                                contrast: brush.textureContrast,\r\n                                textureEachTip: !!brush.TxtC,\r\n                            };\r\n                        }\r\n                        var db = brush.dualBrush;\r\n                        if (db && db.useDualBrush) {\r\n                            b.dualBrush = {\r\n                                flip: db.Flip,\r\n                                shape: parseBrushShape(db.Brsh),\r\n                                blendMode: BlnM.decode(db.BlnM),\r\n                                useScatter: db.useScatter,\r\n                                spacing: parsePercent(db.Spcn),\r\n                                count: db['Cnt '],\r\n                                bothAxes: db.bothAxes,\r\n                                countDynamics: parseDynamics(db.countDynamics),\r\n                                scatterDynamics: parseDynamics(db.scatterDynamics),\r\n                            };\r\n                        }\r\n                        if (brush.useColorDynamics) {\r\n                            b.colorDynamics = {\r\n                                foregroundBackground: parseDynamics(brush.clVr),\r\n                                hue: parsePercent(brush['H   ']),\r\n                                saturation: parsePercent(brush.Strt),\r\n                                brightness: parsePercent(brush.Brgh),\r\n                                purity: parsePercent(brush.purity),\r\n                                perTip: brush.colorDynamicsPerTip,\r\n                            };\r\n                        }\r\n                        if (brush.usePaintDynamics) {\r\n                            b.transfer = {\r\n                                flowDynamics: parseDynamics(brush.prVr),\r\n                                opacityDynamics: parseDynamics(brush.opVr),\r\n                                wetnessDynamics: parseDynamics(brush.wtVr),\r\n                                mixDynamics: parseDynamics(brush.mxVr),\r\n                            };\r\n                        }\r\n                        if (brush.useBrushPose) {\r\n                            b.brushPose = {\r\n                                overrideAngle: brush.overridePoseAngle,\r\n                                overrideTiltX: brush.overridePoseTiltX,\r\n                                overrideTiltY: brush.overridePoseTiltY,\r\n                                overridePressure: brush.overridePosePressure,\r\n                                pressure: parsePercent(brush.brushPosePressure),\r\n                                tiltX: brush.brushPoseTiltX,\r\n                                tiltY: brush.brushPoseTiltY,\r\n                                angle: brush.brushPoseAngle,\r\n                            };\r\n                        }\r\n                        var to = brush.toolOptions;\r\n                        if (to) {\r\n                            b.toolOptions = {\r\n                                type: toBrushType[to._classID] || 'brush',\r\n                                brushPreset: to.brushPreset,\r\n                                flow: (_a = to.flow) !== null && _a !== void 0 ? _a : 100,\r\n                                smooth: (_b = to.Smoo) !== null && _b !== void 0 ? _b : 0,\r\n                                mode: BlnM.decode(to['Md  '] || 'BlnM.Nrml'),\r\n                                opacity: (_c = to.Opct) !== null && _c !== void 0 ? _c : 100,\r\n                                smoothing: !!to.smoothing,\r\n                                smoothingValue: to.smoothingValue || 0,\r\n                                smoothingRadiusMode: !!to.smoothingRadiusMode,\r\n                                smoothingCatchup: !!to.smoothingCatchup,\r\n                                smoothingCatchupAtEnd: !!to.smoothingCatchupAtEnd,\r\n                                smoothingZoomCompensation: !!to.smoothingZoomCompensation,\r\n                                pressureSmoothing: !!to.pressureSmoothing,\r\n                                usePressureOverridesSize: !!to.usePressureOverridesSize,\r\n                                usePressureOverridesOpacity: !!to.usePressureOverridesOpacity,\r\n                                useLegacy: !!to.useLegacy,\r\n                            };\r\n                            if (to.prVr)\r\n                                b.toolOptions.flowDynamics = parseDynamics(to.prVr);\r\n                            if (to.opVr)\r\n                                b.toolOptions.opacityDynamics = parseDynamics(to.opVr);\r\n                            if (to.szVr)\r\n                                b.toolOptions.sizeDynamics = parseDynamics(to.szVr);\r\n                            if ('wetness' in to)\r\n                                b.toolOptions.wetness = to.wetness;\r\n                            if ('dryness' in to)\r\n                                b.toolOptions.dryness = to.dryness;\r\n                            if ('mix' in to)\r\n                                b.toolOptions.mix = to.mix;\r\n                            if ('autoFill' in to)\r\n                                b.toolOptions.autoFill = to.autoFill;\r\n                            if ('autoClean' in to)\r\n                                b.toolOptions.autoClean = to.autoClean;\r\n                            if ('loadSolidColorOnly' in to)\r\n                                b.toolOptions.loadSolidColorOnly = to.loadSolidColorOnly;\r\n                            if ('sampleAllLayers' in to)\r\n                                b.toolOptions.sampleAllLayers = to.sampleAllLayers;\r\n                            if ('SmdF' in to)\r\n                                b.toolOptions.smudgeFingerPainting = to.SmdF;\r\n                            if ('SmdS' in to)\r\n                                b.toolOptions.smudgeSampleAllLayers = to.SmdS;\r\n                            if ('Prs ' in to)\r\n                                b.toolOptions.strength = to['Prs '];\r\n                            if ('SmdF' in to)\r\n                                b.toolOptions.smudgeFingerPainting = to.SmdF;\r\n                            if ('SmdS' in to)\r\n                                b.toolOptions.smudgeSampleAllLayers = to.SmdS;\r\n                        }\r\n                        brushes.push(b);\r\n                    }\r\n                    break;\r\n                }\r\n                case 'patt': {\r\n                    while (reader.offset < end) {\r\n                        patterns.push(readPattern(reader));\r\n                    }\r\n                    reader.offset = end;\r\n                    break;\r\n                }\r\n                case 'phry': {\r\n                    // TODO: what is this ?\r\n                    var desc = readVersionAndDescriptor(reader);\r\n                    // example:\r\n                    // hierarchy: [\r\n                    // \t{\r\n                    // \t\t'Nm  ': 'PRE_EXPORT ',\r\n                    // \t\tzuid: '965209f2-6f35-9a40-aa43-485684382172'\r\n                    // \t},\r\n                    // \t{},\r\n                    //  ...\r\n                    // ]\r\n                    if (options.logMissingFeatures) {\r\n                        if ((_d = desc.hierarchy) === null || _d === void 0 ? void 0 : _d.length) {\r\n                            // console.log('unhandled phry section', desc);\r\n                        }\r\n                    }\r\n                    break;\r\n                }\r\n                default:\r\n                    throw new Error(\"Invalid brush type: \".concat(type));\r\n            }\r\n            // align to 4 bytes\r\n            while (size % 4) {\r\n                reader.offset++;\r\n                size++;\r\n            }\r\n        }\r\n    }\r\n    else {\r\n        throw new Error(\"Unsupported ABR version (\".concat(version, \")\"));\r\n    }\r\n    return { samples: samples, patterns: patterns, brushes: brushes };\r\n}\r\n//# sourceMappingURL=abr.js.map","var __assign = (this && this.__assign) || function () {\r\n    __assign = Object.assign || function(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n                t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\nimport { readVectorMask } from './additionalInfo';\r\nimport { readUint32, checkSignature, createReader, readPascalString, readUnicodeString } from './psdReader';\r\nexport function readCsh(buffer) {\r\n    var reader = createReader(buffer.buffer, buffer.byteOffset, buffer.byteLength);\r\n    var csh = { shapes: [] };\r\n    checkSignature(reader, 'cush');\r\n    if (readUint32(reader) !== 2)\r\n        throw new Error('Invalid version');\r\n    var count = readUint32(reader);\r\n    for (var i = 0; i < count; i++) {\r\n        var name_1 = readUnicodeString(reader);\r\n        while (reader.offset % 4)\r\n            reader.offset++; // pad to 4byte bounds\r\n        if (readUint32(reader) !== 1)\r\n            throw new Error('Invalid shape version');\r\n        var size = readUint32(reader);\r\n        var end = reader.offset + size;\r\n        var id = readPascalString(reader, 1);\r\n        // this might not be correct ???\r\n        var y1 = readUint32(reader);\r\n        var x1 = readUint32(reader);\r\n        var y2 = readUint32(reader);\r\n        var x2 = readUint32(reader);\r\n        var width = x2 - x1;\r\n        var height = y2 - y1;\r\n        var mask = { paths: [] };\r\n        readVectorMask(reader, mask, width, height, end - reader.offset);\r\n        csh.shapes.push(__assign({ name: name_1, id: id, width: width, height: height }, mask));\r\n        reader.offset = end;\r\n    }\r\n    return csh;\r\n}\r\n//# sourceMappingURL=csh.js.map","export var ColorMode;\r\n(function (ColorMode) {\r\n    ColorMode[ColorMode[\"Bitmap\"] = 0] = \"Bitmap\";\r\n    ColorMode[ColorMode[\"Grayscale\"] = 1] = \"Grayscale\";\r\n    ColorMode[ColorMode[\"Indexed\"] = 2] = \"Indexed\";\r\n    ColorMode[ColorMode[\"RGB\"] = 3] = \"RGB\";\r\n    ColorMode[ColorMode[\"CMYK\"] = 4] = \"CMYK\";\r\n    ColorMode[ColorMode[\"Multichannel\"] = 7] = \"Multichannel\";\r\n    ColorMode[ColorMode[\"Duotone\"] = 8] = \"Duotone\";\r\n    ColorMode[ColorMode[\"Lab\"] = 9] = \"Lab\";\r\n})(ColorMode || (ColorMode = {}));\r\nexport var SectionDividerType;\r\n(function (SectionDividerType) {\r\n    SectionDividerType[SectionDividerType[\"Other\"] = 0] = \"Other\";\r\n    SectionDividerType[SectionDividerType[\"OpenFolder\"] = 1] = \"OpenFolder\";\r\n    SectionDividerType[SectionDividerType[\"ClosedFolder\"] = 2] = \"ClosedFolder\";\r\n    SectionDividerType[SectionDividerType[\"BoundingSectionDivider\"] = 3] = \"BoundingSectionDivider\";\r\n})(SectionDividerType || (SectionDividerType = {}));\r\nexport var LayerCompCapturedInfo;\r\n(function (LayerCompCapturedInfo) {\r\n    LayerCompCapturedInfo[LayerCompCapturedInfo[\"None\"] = 0] = \"None\";\r\n    LayerCompCapturedInfo[LayerCompCapturedInfo[\"Visibility\"] = 1] = \"Visibility\";\r\n    LayerCompCapturedInfo[LayerCompCapturedInfo[\"Position\"] = 2] = \"Position\";\r\n    LayerCompCapturedInfo[LayerCompCapturedInfo[\"Appearance\"] = 4] = \"Appearance\";\r\n})(LayerCompCapturedInfo || (LayerCompCapturedInfo = {}));\r\nexport var ChannelID;\r\n(function (ChannelID) {\r\n    ChannelID[ChannelID[\"Color0\"] = 0] = \"Color0\";\r\n    ChannelID[ChannelID[\"Color1\"] = 1] = \"Color1\";\r\n    ChannelID[ChannelID[\"Color2\"] = 2] = \"Color2\";\r\n    ChannelID[ChannelID[\"Color3\"] = 3] = \"Color3\";\r\n    ChannelID[ChannelID[\"Transparency\"] = -1] = \"Transparency\";\r\n    ChannelID[ChannelID[\"UserMask\"] = -2] = \"UserMask\";\r\n    ChannelID[ChannelID[\"RealUserMask\"] = -3] = \"RealUserMask\";\r\n})(ChannelID || (ChannelID = {}));\r\nexport var Compression;\r\n(function (Compression) {\r\n    Compression[Compression[\"RawData\"] = 0] = \"RawData\";\r\n    Compression[Compression[\"RleCompressed\"] = 1] = \"RleCompressed\";\r\n    Compression[Compression[\"ZipWithoutPrediction\"] = 2] = \"ZipWithoutPrediction\";\r\n    Compression[Compression[\"ZipWithPrediction\"] = 3] = \"ZipWithPrediction\";\r\n})(Compression || (Compression = {}));\r\n//# sourceMappingURL=psd.js.map","import { writePsd as writePsdInternal, getWriterBuffer, createWriter, getWriterBufferNoCopy } from './psdWriter';\r\nimport { readPsd as readPsdInternal, createReader, decodeLayerImageData } from './psdReader';\r\nimport { fromByteArray } from 'base64-js';\r\nexport * from './abr';\r\nexport * from './csh';\r\nexport { initializeCanvas } from './helpers';\r\nexport * from './psd';\r\nexport var byteArrayToBase64 = fromByteArray;\r\nexport function readPsd(buffer, options) {\r\n    var reader = 'buffer' in buffer ?\r\n        createReader(buffer.buffer, buffer.byteOffset, buffer.byteLength) :\r\n        createReader(buffer);\r\n    return readPsdInternal(reader, options);\r\n}\r\nexport function writePsd(psd, options) {\r\n    var writer = createWriter();\r\n    writePsdInternal(writer, psd, options);\r\n    return getWriterBuffer(writer);\r\n}\r\nexport function writePsdUint8Array(psd, options) {\r\n    var writer = createWriter();\r\n    writePsdInternal(writer, psd, options);\r\n    return getWriterBufferNoCopy(writer);\r\n}\r\nexport function writePsdBuffer(psd, options) {\r\n    if (typeof Buffer === 'undefined') {\r\n        throw new Error('Buffer not supported on this platform');\r\n    }\r\n    return Buffer.from(writePsdUint8Array(psd, options));\r\n}\r\nexport function decodeLayerPixels(layer, useImageData) {\r\n    decodeLayerImageData(layer, useImageData);\r\n}\r\n//# sourceMappingURL=index.js.map","/* @license\nPapa Parse\nv5.5.3\nhttps://github.com/mholt/PapaParse\nLicense: MIT\n*/\n((e,t)=>{\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof module&&\"undefined\"!=typeof exports?module.exports=t():e.Papa=t()})(this,function r(){var n=\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:void 0!==n?n:{};var d,s=!n.document&&!!n.postMessage,a=n.IS_PAPA_WORKER||!1,o={},h=0,v={};function u(e){this._handle=null,this._finished=!1,this._completed=!1,this._halted=!1,this._input=null,this._baseIndex=0,this._partialLine=\"\",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},function(e){var t=b(e);t.chunkSize=parseInt(t.chunkSize),e.step||e.chunk||(t.chunkSize=null);this._handle=new i(t),(this._handle.streamer=this)._config=t}.call(this,e),this.parseChunk=function(t,e){var i=parseInt(this._config.skipFirstNLines)||0;if(this.isFirstChunk&&0<i){let e=this._config.newline;e||(r=this._config.quoteChar||'\"',e=this._handle.guessLineEndings(t,r)),t=[...t.split(e).slice(i)].join(e)}this.isFirstChunk&&U(this._config.beforeFirstChunk)&&void 0!==(r=this._config.beforeFirstChunk(t))&&(t=r),this.isFirstChunk=!1,this._halted=!1;var i=this._partialLine+t,r=(this._partialLine=\"\",this._handle.parse(i,this._baseIndex,!this._finished));if(!this._handle.paused()&&!this._handle.aborted()){t=r.meta.cursor,i=(this._finished||(this._partialLine=i.substring(t-this._baseIndex),this._baseIndex=t),r&&r.data&&(this._rowCount+=r.data.length),this._finished||this._config.preview&&this._rowCount>=this._config.preview);if(a)n.postMessage({results:r,workerId:v.WORKER_ID,finished:i});else if(U(this._config.chunk)&&!e){if(this._config.chunk(r,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);this._completeResults=r=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(r.data),this._completeResults.errors=this._completeResults.errors.concat(r.errors),this._completeResults.meta=r.meta),this._completed||!i||!U(this._config.complete)||r&&r.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),i||r&&r.meta.paused||this._nextChunk(),r}this._halted=!0},this._sendError=function(e){U(this._config.error)?this._config.error(e):a&&this._config.error&&n.postMessage({workerId:v.WORKER_ID,error:e,finished:!1})}}function f(e){var r;(e=e||{}).chunkSize||(e.chunkSize=v.RemoteChunkSize),u.call(this,e),this._nextChunk=s?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)this._chunkLoaded();else{if(r=new XMLHttpRequest,this._config.withCredentials&&(r.withCredentials=this._config.withCredentials),s||(r.onload=y(this._chunkLoaded,this),r.onerror=y(this._chunkError,this)),r.open(this._config.downloadRequestBody?\"POST\":\"GET\",this._input,!s),this._config.downloadRequestHeaders){var e,t=this._config.downloadRequestHeaders;for(e in t)r.setRequestHeader(e,t[e])}var i;this._config.chunkSize&&(i=this._start+this._config.chunkSize-1,r.setRequestHeader(\"Range\",\"bytes=\"+this._start+\"-\"+i));try{r.send(this._config.downloadRequestBody)}catch(e){this._chunkError(e.message)}s&&0===r.status&&this._chunkError()}},this._chunkLoaded=function(){4===r.readyState&&(r.status<200||400<=r.status?this._chunkError():(this._start+=this._config.chunkSize||r.responseText.length,this._finished=!this._config.chunkSize||this._start>=(e=>null!==(e=e.getResponseHeader(\"Content-Range\"))?parseInt(e.substring(e.lastIndexOf(\"/\")+1)):-1)(r),this.parseChunk(r.responseText)))},this._chunkError=function(e){e=r.statusText||e;this._sendError(new Error(e))}}function l(e){(e=e||{}).chunkSize||(e.chunkSize=v.LocalChunkSize),u.call(this,e);var i,r,n=\"undefined\"!=typeof FileReader;this.stream=function(e){this._input=e,r=e.slice||e.webkitSlice||e.mozSlice,n?((i=new FileReader).onload=y(this._chunkLoaded,this),i.onerror=y(this._chunkError,this)):i=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount<this._config.preview)||this._readChunk()},this._readChunk=function(){var e=this._input,t=(this._config.chunkSize&&(t=Math.min(this._start+this._config.chunkSize,this._input.size),e=r.call(e,this._start,t)),i.readAsText(e,this._config.encoding));n||this._chunkLoaded({target:{result:t}})},this._chunkLoaded=function(e){this._start+=this._config.chunkSize,this._finished=!this._config.chunkSize||this._start>=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(i.error)}}function c(e){var i;u.call(this,e=e||{}),this.stream=function(e){return i=e,this._nextChunk()},this._nextChunk=function(){var e,t;if(!this._finished)return e=this._config.chunkSize,i=e?(t=i.substring(0,e),i.substring(e)):(t=i,\"\"),this._finished=!i,this.parseChunk(t)}}function p(e){u.call(this,e=e||{});var t=[],i=!0,r=!1;this.pause=function(){u.prototype.pause.apply(this,arguments),this._input.pause()},this.resume=function(){u.prototype.resume.apply(this,arguments),this._input.resume()},this.stream=function(e){this._input=e,this._input.on(\"data\",this._streamData),this._input.on(\"end\",this._streamEnd),this._input.on(\"error\",this._streamError)},this._checkIsFinished=function(){r&&1===t.length&&(this._finished=!0)},this._nextChunk=function(){this._checkIsFinished(),t.length?this.parseChunk(t.shift()):i=!0},this._streamData=y(function(e){try{t.push(\"string\"==typeof e?e:e.toString(this._config.encoding)),i&&(i=!1,this._checkIsFinished(),this.parseChunk(t.shift()))}catch(e){this._streamError(e)}},this),this._streamError=y(function(e){this._streamCleanUp(),this._sendError(e)},this),this._streamEnd=y(function(){this._streamCleanUp(),r=!0,this._streamData(\"\")},this),this._streamCleanUp=y(function(){this._input.removeListener(\"data\",this._streamData),this._input.removeListener(\"end\",this._streamEnd),this._input.removeListener(\"error\",this._streamError)},this)}function i(m){var n,s,a,t,o=Math.pow(2,53),h=-o,u=/^\\s*-?(\\d+\\.?|\\.\\d+|\\d+\\.\\d+)([eE][-+]?\\d+)?\\s*$/,d=/^((\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z)))$/,i=this,r=0,f=0,l=!1,e=!1,c=[],p={data:[],errors:[],meta:{}};function y(e){return\"greedy\"===m.skipEmptyLines?\"\"===e.join(\"\").trim():1===e.length&&0===e[0].length}function g(){if(p&&a&&(k(\"Delimiter\",\"UndetectableDelimiter\",\"Unable to auto-detect delimiting character; defaulted to '\"+v.DefaultDelimiter+\"'\"),a=!1),m.skipEmptyLines&&(p.data=p.data.filter(function(e){return!y(e)})),_()){if(p)if(Array.isArray(p.data[0])){for(var e=0;_()&&e<p.data.length;e++)p.data[e].forEach(t);p.data.splice(0,1)}else p.data.forEach(t);function t(e,t){U(m.transformHeader)&&(e=m.transformHeader(e,t)),c.push(e)}}function i(e,t){for(var i=m.header?{}:[],r=0;r<e.length;r++){var n=r,s=e[r],s=((e,t)=>(e=>(m.dynamicTypingFunction&&void 0===m.dynamicTyping[e]&&(m.dynamicTyping[e]=m.dynamicTypingFunction(e)),!0===(m.dynamicTyping[e]||m.dynamicTyping)))(e)?\"true\"===t||\"TRUE\"===t||\"false\"!==t&&\"FALSE\"!==t&&((e=>{if(u.test(e)){e=parseFloat(e);if(h<e&&e<o)return 1}})(t)?parseFloat(t):d.test(t)?new Date(t):\"\"===t?null:t):t)(n=m.header?r>=c.length?\"__parsed_extra\":c[r]:n,s=m.transform?m.transform(s,n):s);\"__parsed_extra\"===n?(i[n]=i[n]||[],i[n].push(s)):i[n]=s}return m.header&&(r>c.length?k(\"FieldMismatch\",\"TooManyFields\",\"Too many fields: expected \"+c.length+\" fields but parsed \"+r,f+t):r<c.length&&k(\"FieldMismatch\",\"TooFewFields\",\"Too few fields: expected \"+c.length+\" fields but parsed \"+r,f+t)),i}var r;p&&(m.header||m.dynamicTyping||m.transform)&&(r=1,!p.data.length||Array.isArray(p.data[0])?(p.data=p.data.map(i),r=p.data.length):p.data=i(p.data,0),m.header&&p.meta&&(p.meta.fields=c),f+=r)}function _(){return m.header&&0===c.length}function k(e,t,i,r){e={type:e,code:t,message:i};void 0!==r&&(e.row=r),p.errors.push(e)}U(m.step)&&(t=m.step,m.step=function(e){p=e,_()?g():(g(),0!==p.data.length&&(r+=e.data.length,m.preview&&r>m.preview?s.abort():(p.data=p.data[0],t(p,i))))}),this.parse=function(e,t,i){var r=m.quoteChar||'\"',r=(m.newline||(m.newline=this.guessLineEndings(e,r)),a=!1,m.delimiter?U(m.delimiter)&&(m.delimiter=m.delimiter(e),p.meta.delimiter=m.delimiter):((r=((e,t,i,r,n)=>{var s,a,o,h;n=n||[\",\",\"\\t\",\"|\",\";\",v.RECORD_SEP,v.UNIT_SEP];for(var u=0;u<n.length;u++){for(var d,f=n[u],l=0,c=0,p=0,g=(o=void 0,new E({comments:r,delimiter:f,newline:t,preview:10}).parse(e)),_=0;_<g.data.length;_++)i&&y(g.data[_])?p++:(d=g.data[_].length,c+=d,void 0===o?o=d:0<d&&(l+=Math.abs(d-o),o=d));0<g.data.length&&(c/=g.data.length-p),(void 0===a||l<=a)&&(void 0===h||h<c)&&1.99<c&&(a=l,s=f,h=c)}return{successful:!!(m.delimiter=s),bestDelimiter:s}})(e,m.newline,m.skipEmptyLines,m.comments,m.delimitersToGuess)).successful?m.delimiter=r.bestDelimiter:(a=!0,m.delimiter=v.DefaultDelimiter),p.meta.delimiter=m.delimiter),b(m));return m.preview&&m.header&&r.preview++,n=e,s=new E(r),p=s.parse(n,t,i),g(),l?{meta:{paused:!0}}:p||{meta:{paused:!1}}},this.paused=function(){return l},this.pause=function(){l=!0,s.abort(),n=U(m.chunk)?\"\":n.substring(s.getCharIndex())},this.resume=function(){i.streamer._halted?(l=!1,i.streamer.parseChunk(n,!0)):setTimeout(i.resume,3)},this.aborted=function(){return e},this.abort=function(){e=!0,s.abort(),p.meta.aborted=!0,U(m.complete)&&m.complete(p),n=\"\"},this.guessLineEndings=function(e,t){e=e.substring(0,1048576);var t=new RegExp(P(t)+\"([^]*?)\"+P(t),\"gm\"),i=(e=e.replace(t,\"\")).split(\"\\r\"),t=e.split(\"\\n\"),e=1<t.length&&t[0].length<i[0].length;if(1===i.length||e)return\"\\n\";for(var r=0,n=0;n<i.length;n++)\"\\n\"===i[n][0]&&r++;return r>=i.length/2?\"\\r\\n\":\"\\r\"}}function P(e){return e.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}function E(C){var S=(C=C||{}).delimiter,O=C.newline,x=C.comments,I=C.step,A=C.preview,T=C.fastMode,D=null,L=!1,F=null==C.quoteChar?'\"':C.quoteChar,j=F;if(void 0!==C.escapeChar&&(j=C.escapeChar),(\"string\"!=typeof S||-1<v.BAD_DELIMITERS.indexOf(S))&&(S=\",\"),x===S)throw new Error(\"Comment character same as delimiter\");!0===x?x=\"#\":(\"string\"!=typeof x||-1<v.BAD_DELIMITERS.indexOf(x))&&(x=!1),\"\\n\"!==O&&\"\\r\"!==O&&\"\\r\\n\"!==O&&(O=\"\\n\");var z=0,M=!1;this.parse=function(i,t,r){if(\"string\"!=typeof i)throw new Error(\"Input must be a string\");var n=i.length,e=S.length,s=O.length,a=x.length,o=U(I),h=[],u=[],d=[],f=z=0;if(!i)return w();if(T||!1!==T&&-1===i.indexOf(F)){for(var l=i.split(O),c=0;c<l.length;c++){if(d=l[c],z+=d.length,c!==l.length-1)z+=O.length;else if(r)return w();if(!x||d.substring(0,a)!==x){if(o){if(h=[],k(d.split(S)),R(),M)return w()}else k(d.split(S));if(A&&A<=c)return h=h.slice(0,A),w(!0)}}return w()}for(var p=i.indexOf(S,z),g=i.indexOf(O,z),_=new RegExp(P(j)+P(F),\"g\"),m=i.indexOf(F,z);;)if(i[z]===F)for(m=z,z++;;){if(-1===(m=i.indexOf(F,m+1)))return r||u.push({type:\"Quotes\",code:\"MissingQuotes\",message:\"Quoted field unterminated\",row:h.length,index:z}),E();if(m===n-1)return E(i.substring(z,m).replace(_,F));if(F===j&&i[m+1]===j)m++;else if(F===j||0===m||i[m-1]!==j){-1!==p&&p<m+1&&(p=i.indexOf(S,m+1));var y=v(-1===(g=-1!==g&&g<m+1?i.indexOf(O,m+1):g)?p:Math.min(p,g));if(i.substr(m+1+y,e)===S){d.push(i.substring(z,m).replace(_,F)),i[z=m+1+y+e]!==F&&(m=i.indexOf(F,z)),p=i.indexOf(S,z),g=i.indexOf(O,z);break}y=v(g);if(i.substring(m+1+y,m+1+y+s)===O){if(d.push(i.substring(z,m).replace(_,F)),b(m+1+y+s),p=i.indexOf(S,z),m=i.indexOf(F,z),o&&(R(),M))return w();if(A&&h.length>=A)return w(!0);break}u.push({type:\"Quotes\",code:\"InvalidQuotes\",message:\"Trailing quote on quoted field is malformed\",row:h.length,index:z}),m++}}else if(x&&0===d.length&&i.substring(z,z+a)===x){if(-1===g)return w();z=g+s,g=i.indexOf(O,z),p=i.indexOf(S,z)}else if(-1!==p&&(p<g||-1===g))d.push(i.substring(z,p)),z=p+e,p=i.indexOf(S,z);else{if(-1===g)break;if(d.push(i.substring(z,g)),b(g+s),o&&(R(),M))return w();if(A&&h.length>=A)return w(!0)}return E();function k(e){h.push(e),f=z}function v(e){var t=0;return t=-1!==e&&(e=i.substring(m+1,e))&&\"\"===e.trim()?e.length:t}function E(e){return r||(void 0===e&&(e=i.substring(z)),d.push(e),z=n,k(d),o&&R()),w()}function b(e){z=e,k(d),d=[],g=i.indexOf(O,z)}function w(e){if(C.header&&!t&&h.length&&!L){var s=h[0],a=Object.create(null),o=new Set(s);let n=!1;for(let r=0;r<s.length;r++){let i=s[r];if(a[i=U(C.transformHeader)?C.transformHeader(i,r):i]){let e,t=a[i];for(;e=i+\"_\"+t,t++,o.has(e););o.add(e),s[r]=e,a[i]++,n=!0,(D=null===D?{}:D)[e]=i}else a[i]=1,s[r]=i;o.add(i)}n&&console.warn(\"Duplicate headers found and renamed.\"),L=!0}return{data:h,errors:u,meta:{delimiter:S,linebreak:O,aborted:M,truncated:!!e,cursor:f+(t||0),renamedHeaders:D}}}function R(){I(w()),h=[],u=[]}},this.abort=function(){M=!0},this.getCharIndex=function(){return z}}function g(e){var t=e.data,i=o[t.workerId],r=!1;if(t.error)i.userError(t.error,t.file);else if(t.results&&t.results.data){var n={abort:function(){r=!0,_(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},pause:m,resume:m};if(U(i.userStep)){for(var s=0;s<t.results.data.length&&(i.userStep({data:t.results.data[s],errors:t.results.errors,meta:t.results.meta},n),!r);s++);delete t.results}else U(i.userChunk)&&(i.userChunk(t.results,n,t.file),delete t.results)}t.finished&&!r&&_(t.workerId,t.results)}function _(e,t){var i=o[e];U(i.userComplete)&&i.userComplete(t),i.terminate(),delete o[e]}function m(){throw new Error(\"Not implemented.\")}function b(e){if(\"object\"!=typeof e||null===e)return e;var t,i=Array.isArray(e)?[]:{};for(t in e)i[t]=b(e[t]);return i}function y(e,t){return function(){e.apply(t,arguments)}}function U(e){return\"function\"==typeof e}return v.parse=function(e,t){var i=(t=t||{}).dynamicTyping||!1;U(i)&&(t.dynamicTypingFunction=i,i={});if(t.dynamicTyping=i,t.transform=!!U(t.transform)&&t.transform,!t.worker||!v.WORKERS_SUPPORTED)return i=null,v.NODE_STREAM_INPUT,\"string\"==typeof e?(e=(e=>65279!==e.charCodeAt(0)?e:e.slice(1))(e),i=new(t.download?f:c)(t)):!0===e.readable&&U(e.read)&&U(e.on)?i=new p(t):(n.File&&e instanceof File||e instanceof Object)&&(i=new l(t)),i.stream(e);(i=(()=>{var e;return!!v.WORKERS_SUPPORTED&&(e=(()=>{var e=n.URL||n.webkitURL||null,t=r.toString();return v.BLOB_URL||(v.BLOB_URL=e.createObjectURL(new Blob([\"var global = (function() { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } return {}; })(); global.IS_PAPA_WORKER=true; \",\"(\",t,\")();\"],{type:\"text/javascript\"})))})(),(e=new n.Worker(e)).onmessage=g,e.id=h++,o[e.id]=e)})()).userStep=t.step,i.userChunk=t.chunk,i.userComplete=t.complete,i.userError=t.error,t.step=U(t.step),t.chunk=U(t.chunk),t.complete=U(t.complete),t.error=U(t.error),delete t.worker,i.postMessage({input:e,config:t,workerId:i.id})},v.unparse=function(e,t){var n=!1,_=!0,m=\",\",y=\"\\r\\n\",s='\"',a=s+s,i=!1,r=null,o=!1,h=((()=>{if(\"object\"==typeof t){if(\"string\"!=typeof t.delimiter||v.BAD_DELIMITERS.filter(function(e){return-1!==t.delimiter.indexOf(e)}).length||(m=t.delimiter),\"boolean\"!=typeof t.quotes&&\"function\"!=typeof t.quotes&&!Array.isArray(t.quotes)||(n=t.quotes),\"boolean\"!=typeof t.skipEmptyLines&&\"string\"!=typeof t.skipEmptyLines||(i=t.skipEmptyLines),\"string\"==typeof t.newline&&(y=t.newline),\"string\"==typeof t.quoteChar&&(s=t.quoteChar),\"boolean\"==typeof t.header&&(_=t.header),Array.isArray(t.columns)){if(0===t.columns.length)throw new Error(\"Option columns is empty\");r=t.columns}void 0!==t.escapeChar&&(a=t.escapeChar+s),t.escapeFormulae instanceof RegExp?o=t.escapeFormulae:\"boolean\"==typeof t.escapeFormulae&&t.escapeFormulae&&(o=/^[=+\\-@\\t\\r].*$/)}})(),new RegExp(P(s),\"g\"));\"string\"==typeof e&&(e=JSON.parse(e));if(Array.isArray(e)){if(!e.length||Array.isArray(e[0]))return u(null,e,i);if(\"object\"==typeof e[0])return u(r||Object.keys(e[0]),e,i)}else if(\"object\"==typeof e)return\"string\"==typeof e.data&&(e.data=JSON.parse(e.data)),Array.isArray(e.data)&&(e.fields||(e.fields=e.meta&&e.meta.fields||r),e.fields||(e.fields=Array.isArray(e.data[0])?e.fields:\"object\"==typeof e.data[0]?Object.keys(e.data[0]):[]),Array.isArray(e.data[0])||\"object\"==typeof e.data[0]||(e.data=[e.data])),u(e.fields||[],e.data||[],i);throw new Error(\"Unable to serialize unrecognized input\");function u(e,t,i){var r=\"\",n=(\"string\"==typeof e&&(e=JSON.parse(e)),\"string\"==typeof t&&(t=JSON.parse(t)),Array.isArray(e)&&0<e.length),s=!Array.isArray(t[0]);if(n&&_){for(var a=0;a<e.length;a++)0<a&&(r+=m),r+=k(e[a],a);0<t.length&&(r+=y)}for(var o=0;o<t.length;o++){var h=(n?e:t[o]).length,u=!1,d=n?0===Object.keys(t[o]).length:0===t[o].length;if(i&&!n&&(u=\"greedy\"===i?\"\"===t[o].join(\"\").trim():1===t[o].length&&0===t[o][0].length),\"greedy\"===i&&n){for(var f=[],l=0;l<h;l++){var c=s?e[l]:l;f.push(t[o][c])}u=\"\"===f.join(\"\").trim()}if(!u){for(var p=0;p<h;p++){0<p&&!d&&(r+=m);var g=n&&s?e[p]:p;r+=k(t[o][g],p)}o<t.length-1&&(!i||0<h&&!d)&&(r+=y)}}return r}function k(e,t){var i,r;return null==e?\"\":e.constructor===Date?JSON.stringify(e).slice(1,25):(r=!1,o&&\"string\"==typeof e&&o.test(e)&&(e=\"'\"+e,r=!0),i=e.toString().replace(h,a),(r=r||!0===n||\"function\"==typeof n&&n(e,t)||Array.isArray(n)&&n[t]||((e,t)=>{for(var i=0;i<t.length;i++)if(-1<e.indexOf(t[i]))return!0;return!1})(i,v.BAD_DELIMITERS)||-1<i.indexOf(m)||\" \"===i.charAt(0)||\" \"===i.charAt(i.length-1))?s+i+s:i)}},v.RECORD_SEP=String.fromCharCode(30),v.UNIT_SEP=String.fromCharCode(31),v.BYTE_ORDER_MARK=\"\\ufeff\",v.BAD_DELIMITERS=[\"\\r\",\"\\n\",'\"',v.BYTE_ORDER_MARK],v.WORKERS_SUPPORTED=!s&&!!n.Worker,v.NODE_STREAM_INPUT=1,v.LocalChunkSize=10485760,v.RemoteChunkSize=5242880,v.DefaultDelimiter=\",\",v.Parser=E,v.ParserHandle=i,v.NetworkStreamer=f,v.FileStreamer=l,v.StringStreamer=c,v.ReadableStreamStreamer=p,n.jQuery&&((d=n.jQuery).fn.parse=function(o){var i=o.config||{},h=[];return this.each(function(e){if(!(\"INPUT\"===d(this).prop(\"tagName\").toUpperCase()&&\"file\"===d(this).attr(\"type\").toLowerCase()&&n.FileReader)||!this.files||0===this.files.length)return!0;for(var t=0;t<this.files.length;t++)h.push({file:this.files[t],inputElem:this,instanceConfig:d.extend({},i)})}),e(),this;function e(){if(0===h.length)U(o.complete)&&o.complete();else{var e,t,i,r,n=h[0];if(U(o.before)){var s=o.before(n.file,n.inputElem);if(\"object\"==typeof s){if(\"abort\"===s.action)return e=\"AbortError\",t=n.file,i=n.inputElem,r=s.reason,void(U(o.error)&&o.error({name:e},t,i,r));if(\"skip\"===s.action)return void u();\"object\"==typeof s.config&&(n.instanceConfig=d.extend(n.instanceConfig,s.config))}else if(\"skip\"===s)return void u()}var a=n.instanceConfig.complete;n.instanceConfig.complete=function(e){U(a)&&a(e,n.file,n.inputElem),u()},v.parse(n.file,n.instanceConfig)}}function u(){h.splice(0,1),e()}}),a&&(n.onmessage=function(e){e=e.data;void 0===v.WORKER_ID&&e&&(v.WORKER_ID=e.workerId);\"string\"==typeof e.input?n.postMessage({workerId:v.WORKER_ID,results:v.parse(e.input,e.config),finished:!0}):(n.File&&e.input instanceof File||e.input instanceof Object)&&(e=v.parse(e.input,e.config))&&n.postMessage({workerId:v.WORKER_ID,results:e,finished:!0})}),(f.prototype=Object.create(u.prototype)).constructor=f,(l.prototype=Object.create(u.prototype)).constructor=l,(c.prototype=Object.create(c.prototype)).constructor=c,(p.prototype=Object.create(u.prototype)).constructor=p,v});"],"names":["isExternalUsable","s","en","tr","APP_BASE_META","BASE_RE","readAppBase","doc","d","raw","_b","_a","seg","appBase","withAppBase","path","underApiBase","apiBase","base","apiRootOr","localesVersion","ref","localesKnown","BUILTIN_LOCALES","BUILTIN_LABELS","localeLabel","code","name","messages","extras","inflight","TAG","plausibleLocale","normalizeLocaleCode","v","primary","isBuiltinLocale","k","cleanStrings","out","registerLocale","opt","setLocales","list","o","unregisterPluginLocales","plugin","changed","resetLocales","source","availableLocales","hasLocale","c","acceptableLocale","localeTable","builtin","extra","ensureLocaleStrings","localeOwnTable","pack","localeStrings","e","pending","doFetch","p","strings","res","body","still","setLocalesFromBranding","b","opts","rows","listed","r","bare","loadLocales","FALLBACK","resolveLocale","explicit","detectLocale","nav","wanted","tag","INTERNAL_DIR_NAMES","DRAFTS_DIR_NAME","KEEP_MARKER_NAME","DIRS","segments","at","isInternalName","isInternalPath","segs","listingAddress","wire","w","draftKeyOf","lower","xs","x","kinds","shallowRef","limits","takeServerRules","caps","l","editKindsKnown","isOfficeExt","ext","isTextualMime","mime","m","baseOf","parts","extOfName","dot","isTextEditable","file","serverLimit","runeCount","clipRunes","max","chars","rtlCodes","computed","row","localeDir","syncDocumentDir","root","apply","want","mo","stop","watch","dirOfElement","el","host","inlineSign","dir","inlineKeyStep","key","physical","inlineStartX","inlineEndX","openAlongInline","anchor","size","viewport","margin","a","left","flipped","clampAlongInline","LRI","RLI","FSI","PDI","LTR_RUNS","wrapped","depth","i","isolateLtrRuns","text","offset","whole","before","after","foreignText","isolateValue","contentDir","kind","foreignWith","t","wordsIn","locale","vars","said","acc","STATUS_KEYS","statusWords","status","statusWordsWith","statusIsTelling","messageOf","fields","serverSaid","data","fieldsOf","parsed","refusalCode","refusalWords","refusalWordsWith","requestFailure","server","err","hint","serverWords","say","own","looksTechnical","networkFailure","cause","splitTechnicalTail","sayFailure","fallback","shown","detail","opFailure","op","jobFailure","admin","withDetail","sentence","tail","DRAFT_LIMIT","DRAFT_TARGET_TAKEN","DRAFT_FOLDER_GONE","refusalField","isDraftLimit","isDraftFolderGone","draftLimitOf","draftsClient","transport","one","call","url","init","fail","type","as","draftFolderLabel","targetDir","storage","rel","CLDR_ORDER","ENGLISH_CATEGORIES","rulesCache","rulesFor","lang","hit","rules","categoriesCache","SAMPLE_MAX","pluralCategories","seen","n","pluralCategory","abs","pluralChoiceIndex","choice","choicesLength","cats","TIME_ZONE_TIERS","resolveTimeZone","sources","tier","isValidTimeZone","TIMEZONE_VIEWER_LS_KEY","TIMEZONE_ACCOUNT_LS_KEY","FALLBACK_ZONES","deviceTimeZone","tz","supportedTimeZones","fn","zonedDayNumber","zone","activeTimeZone","get","y","day","readValid","writeOrClear","value","hasWindow","viewerZone","ownedTier","entries","owner","cur","pick","hostTier","accountTier","rememberingOwners","resolved","resolvedTimeZone","EXPLORER_CLOCK","timeZoneSourcesFor","timeZoneSources","resolvedTimeZoneFor","activeTimeZoneFor","viewerTimeZone","setViewerTimeZone","valid","setHostTimeZone","setAccountTimeZone","accountTimeZoneOf","accountZoneControl","rememberedAccountTimeZone","releaseTimeZoneOwner","tagCache","localeTag","BYTE_UNIT_KEYS","BYTE_UNIT_EN","formatByteSize","bytes","empty","label","idx","digits","num","fmt","numberFormatter","nfCache","min","dtfCache","zonedFormatter","formatInstant","DAY","dayFormatters","formatCalendarDay","toDate","ms","instantOf","DATE_PART","TIME_PART","formatWhen","date","formatWhenFull","EXPLORER_LOCALE","COUNT_VARS","countedKey","has","counter","cat","form","entry","table","pickMessage","mine","EN","enForm","interpolate","render","rtl","isolated","translate","useLocale","localeRef","lookup","clock","getCurrentInstance","inject","formatSize","formatNodeSize","nodeSizeHint","nodeDisplayName","node","formatDate","formatDateFull","formatMonthYear","zonedYearMonth","downSince","folded","connectionDown","connectionDownSince","connectionFolded","noteRequestFailed","now","noteRequestSucceeded","resetConnectionNotice","kindOfMethod","method","resolveEndpoints","config","derive","autoSegment","manager","E2E_ANSWERS","asE2eAnswer","resolveToken","normalizeAuth","auth","UI_SAVE_CHUNK","useFileApi","endpoints","authConf","lastBearer","authHeaders","h","token","creds","authHeadersSync","credentialsMode","jsonFetch","rawRequest","headers","draftsBase","drafts","permissionsUrl","sub","listPermissions","resolveEmail","email","searchUsers","q","searchGroups","updateGroupPermission","id","level","deleteGroupPermission","addPermission","updatePermission","deletePermission","invitePermission","shareMail","shareMessage","share","qs","params","sp","managerUrl","action","sep","index","search","filter","narrow","globalSearch","query","globalSearchPage","matchNames","names","signal","quotaMe","storageUsage","appStoreStatus","subfolders","newFolder","newFile","newFileCheck","rename","item","renameQueued","move","items","target","deleteItems","allowedAt","permissions","part","_","j","copy","transferNamed","sourceDir","moveAsync","deleteAsync","restore","restoreQueued","ids","withScreenLang","listTrash","storageName","page","restoreBatch","purgeBatch","trashEmptyPreview","purgeTrash","tpl","purgeVersion","uploadMultipart","files","onProgress","fd","f","resolve","reject","xhr","ev","downloadUrl","previewUrl","fetchBlob","blob","fetchArrayBuffer","capabilities","myPermissions","me","fillTemplate","appUIUrl","pluginLicense","pluginUICall","view","pluginUISave","CHUNK","put","u","session","next","final","end","reader","held","heldBytes","done","all","rest","last","fetchResponse","pluginUIRead","pluginActions","pluginActionRun","pluginView","section","pluginViewEvent","pluginUsers","opsCancel","e2eEscrowChallenge","e2eEscrowUsed","payload","fetchHead","got","take","e2eCleanup","e2eAllowedAt","asks","e2eRequest","createShare","listShares","revokeShare","uuid","archiveList","password","archiveExtract","options","archiveCreate","archiveAdd","versionsUrl","listVersions","nodeId","restoreVersion","versionId","snapshotCurrent","snapshotVersion","commentsUrl","listComments","addComment","deleteComment","wsTicket","newId","STORE_KEY","resumeExpiry","expiresAt","uploadFingerprint","defaultResumeStorage","read","store","write","pruneResume","rec","until","loadResume","saveResume","clearResume","listResume","resumableState","state","markUnsupported","isStagedUnsupported","useUploadChunked","api","DEFAULT_CHUNK","stagedBase","available","threshold","shouldChunk","resumableFor","listResumable","discardResumable","uploadId","uploadFile","src","total","bookmarks","job","cancelled","inFlight","chunkExpiry","acked","report","chunkSize","bookmark","st","begun","MAX_ATTEMPTS","lastErr","attempt","sleep","putChunk","commitQs","result","waitForOp","asError","_c","start","opId","tmpl","delay","misses","TransferFailedError","MAX_OP_POLL_MISSES","message","useSelection","selected","click","mod","aIdx","bIdx","lo","hi","clear","selectAll","add","remove","isEmpty","nodes","isTypingTarget","RESERVED_COMBOS","isReservedCombo","combo","SHORTCUT_ACTIONS","HANDLER_KEY","SHORTCUTS_LS_KEY","readOverrides","overrides","writeOverrides","defOf","effectiveCombo","setShortcutOverride","def","resetShortcut","resetAllShortcuts","findShortcutConflict","excludeId","KEY_TOKEN_MAP","MODIFIER_KEYS","keyToken","mapped","comboFromEvent","printableSymbol","useShortcutList","fixed","isMacLike","comboLabel","MENU_ACTION_SHORTCUTS","menuShortcutHint","menuKey","shortcutHint","eventMatchesShortcut","fired","useKeyboardShortcuts","rootEl","handlers","comboMap","onKey","inForm","onMounted","onBeforeUnmount","useSystemDark","mq","dark","onChange","PLUGIN_PAGE_SEGMENT","pluginPagePath","pluginPageUrl","isPagePlacement","placement","isOpenRequest","openHashFor","qualified","cut","openTargetFor","req","hash","POLL_MS","RETAIN_MS","normalizeOp","vals","str","rawStatus","opType","outputs","open","usePendingOps","ops","announced","settledAt","firstPollDone","hasActive","timer","startPolling","poll","stopPolling","incoming","localIds","visibleIncoming","visibleIds","local","merged","register","dismiss","stateKeysOf","prefix","appliesItemOf","mimeMatches","pattern","appliesMatches","rule","exts","mimes","wantState","banState","it","ok","appliesToNodes","labelOf","direct","labelIn","appTextOr","ours","gatedNeedWords","need","pluginActionKey","isPluginActionKey","pluginActionWrites","refusedReadOnly","LEVEL_RANK","pluginActionNeed","levelAllows","permOf","pluginActionsFor","actions","selection","pluginMenuRows","ctx","allowed","offered","greyed","gate","hasIcon","byApp","first","why","PLUGIN_ACTIONS_TTL_MS","cache","invalidatePluginActions","entryFor","usePluginActions","enabled","loaded","error","isEnabled","views","openRules","refresh","force","on","actionsFor","byKey","run","targets","PING_INTERVAL_MS","MAX_BACKOFF_MS","MAX_RETRIES","RealtimeClient","__publicField","ticket","ws","msg","_f","_e","_j","_i","active","obj","burstDebounce","runStartedAt","untilCeiling","listeners","announceAppUpdated","app","version","onAppUpdated","RELOAD_DEBOUNCE_MS","RELOAD_MAX_WAIT_MS","POLL_INTERVAL_MS","useRealtime","presenceUsers","connected","degraded","client","pendingSubscribe","everConnected","debouncedReload","pollTimer","onPresence","onFallback","subscribe","setFocus","MAX_CACHED","thumbKey","useThumbs","shallowReactive","order","failed","resolveUrl","load","evict","toRaw","old","monacoPromise","highlightPromise","monacoCached","highlightCached","preloadEditor","common$2","ensureMonaco","ensureHighlight","getMonaco","getHighlight","useMonacoLoader","props","__props","showPhoto","initials","hue","_createElementBlock","_normalizeClass","_Fragment","_openBlock","_hoisted_3","EXPAND_KEY","others","expanded","toggleExpanded","keyOf","_hoisted_1","_renderList","_createVNode","PresenceAvatar","_createElementVNode","_toDisplayString","_hoisted_4","_createBlock","_hoisted_6","_createTextVNode","_unref","_hoisted_8","_hoisted_9","TRAY","EYE","STAR_PATH","PIN","PANEL","BIN","BOOKMARK","GLYPHS","DIRECTIONAL","SVG_CACHE","actionIconSvg","cached","glyph","svg","actionIconKeys","LATE_ROWS_DIVIDER_KEY","visibleMenuRows","heldMenuRows","opened","placed","late","divider","POPUP_BASE_Z","popupLayer","openers","top","opener","guard","z","positioned","cs","openerCandidates","emit","__emit","hintFor","iconFor","layerZ","targetNodes","menuEl","anchorX","anchorY","prevFocus","show","openedRows","sheetHeight","nextTick","sheetEl","clampToViewport","focusItem","rect","vw","vh","room","hide","sheetDragging","sheetDragY","menuItems","moveFocus","delta","sheetDragStart","onSheetDragStart","t0","onSheetDragMove","onSheetDragEnd","shouldClose","sheetStyle","style","visibleActions","prefersDark","themeClass","__expose","_Teleport","_Transition","_hoisted_5","$event","_hoisted_10","_normalizeStyle","_hoisted_12","_hoisted_15","_hoisted_16","_hoisted_17","DENSITY_LS_KEY","SELBAR_MORE_BTN_W","HEADER_MENU_EVENT","density","adoptStoredDensity","onDensityStorage","toggleDensity","searchEl","localSearch","debounce","onSearchInput","focusSearch","mode","toolbarItems","BAR_ICON_KEYS","hasSelection","barSplit","icons","restCount","selBarEl","measureEl","selMoreBtnEl","selMoreRef","visibleActionCount","visibleBarItems","foldedBarItems","barMenuItems","recalcFold","cont","meas","gap","widths","avail","moreW","used","count","foldRo","openBarMore","selSlot","selSlotOwned","selBodyEl","selPrimaryEl","findPrimary","pane","owned","releaseSelSlot","prev","resolveSelSlot","existing","slot","head","syncSlotActive","reobserveSelection","domSelCount","selMo","selTick","recountSelection","scheduleRecount","cb","selectedCount","selectionLabel","clearSelection","fire","coarse","coarseMq","syncCoarse","moreBtnEl","moreRef","offersView","utilityActions","narrowActions","util","writable","paletteCombo","withKey","navToggleLabel","drivePlaceholder","onSearchKeydown","hostOwnsUtilities","publishHeaderMenu","onMoreSelect","menuActions","openMore","$slots","_hoisted_2","_renderSlot","_ctx","_hoisted_29","_cache","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_38","_hoisted_13","_hoisted_14","_hoisted_19","_hoisted_20","_hoisted_23","_hoisted_26","ContextMenu","_hoisted_42","TTL_MS","isTagKind","keyOfName","tagItemsOf","invalidateTagCache","changeListeners","onTagsChanged","announceTagsChanged","fetchAllTags","tags","fetchTaggedPage","strip","uid","tipId","tipOf","chosenHelp","isOn","picked","optionOff","choose","edgeEnabled","step","to","group","buttons","tabIndexOf","_resolveDynamicComponent","_hoisted_7","openTitle","canEditTeam","legacy","loading","adding","newTag","newKind","addForm","kindOptions","palette","colorFor","arr","canRemove","buildHeaders","absorb","persist","previous","answer","closeAdd","tagMax","clipped","onFieldBlur","TagKindIcon","ChoiceButtons","EXT_FAMILIES","reg","family","PACKAGE_EXTS","isStorageRow","iconFamilyFor","FILE_BASE","iconSvg","TILE_CACHE","iconTile","tile","fileIconTile","isEncryptedFile","encryptedFileTile","LOCKED_FILE","LOCKED_FILE_TILE","isEncryptedFolder","LOCKED_FOLDER","LOCKED_FOLDER_TILE","encryptedFolderTile","EXT_TYPE_KEYS","FAMILY_TYPE_KEYS","typeLabelKey","typeLabelFor","extensionLabel","BLOCK","ZERO_BLOCK","SivAuthError","ab","dbl","carry","xorInto","dst","off","xor16","aesBlock","block","cmac","complete","s2v","ad","padded","counterFrom","ctr","importSivKey","half","mac","ctrKey","k1","k2","sivEncrypt","plaintext","sivDecrypt","sealed","diff","E2E_NAMES_ALG","E2E_NAMES_ENC","E2E_NAMES_LONG_DEFAULT","E2E_NAME_MAX_BYTES","E2E_NAME_KEY_BYTES","E2E_DIR_ID_BYTES","E2E_LONG_SUFFIX","E2E_SIDECAR_SUFFIX","DIR_ID_LABEL","SIV_TAG","B64URL","H","D","SIDECAR_RE","LONG_RE","LONGDIR_RE","DIR_RE","MIN_ENC_LEN","b64urlEncode","b64urlDecode","std","normalizeName","namePlainProblem","generateNameKeyBytes","generateDirId","generateRootId","importNameKey","long","rootId","sha256b64url","deriveDirId","parentId","plain","classifyStoredName","stored","dirIdOf","effectiveDirId","encryptName","problem","encoded","dirId","suffix","decryptEncoded","decryptName","decryptStoredName","readSidecar","extensionOf","E2E_STREAM_CHUNK_LOG2","E2E_STREAM_MIN_CHUNK_LOG2","E2E_STREAM_MAX_CHUNK_LOG2","E2E_STREAM_PREFIX_LEN","E2E_STREAM_TAG_LEN","E2E_FILE_VERSION_STREAM","MAX_CHUNK_INDEX","IV_LEN","HEADER_LEN","WRAP_IV_OFF","WRAPPED_DEK_OFF","WRAPPED_DEK_LEN","PREFIX_OFF","LOG2_OFF","DEK_LEN","FOLDER_MAGIC","validChunkLog2","chunkBytes","log2","streamNonce","streamChunkCount","plainSize","streamCiphertextSize","streamPlaintextSize","cipherSize","full","randomStreamPrefix","ByteQueue","asBytes","chunk","ByteStreamReader","stream","ended","ctl","reason","prependBytes","sent","collectBytes","limit","sealChunk","openChunk","ct","E2eDecryptError","createStreamEncryptor","createStreamDecryptor","decryptStreamBytes","piece","randomDek","importDek","buildStreamFolderHeader","parseStreamFolderHeader","streamFolderFileSize","unwrapFolderDek","fmk","wrapIV","encryptFolderFileStream","rawDek","dek","wrappedDek","header","decryptStreamFolderFileBytes","V1_MAX_TOTAL","decryptFolderFileStream","inner","decryptFile","E2E_FOLDER_HEADER_LEN","VAULT_FEATURE","VAULT_FORMAT","VAULT_MIN_PACK_LOG2","VAULT_MAX_PACK_LOG2","VAULT_DEFAULT_PACK_LOG2","VAULT_LARGE_PACK_LOG2","VAULT_WRITER_PACK_LOG2","VAULT_ID_LEN","VAULT_ENTRIES_WRITE_MAX","validReaderPackLog2","loadVaultKeys","keys","E2E_MARKER_NAME","E2E_MAGIC","E2E_VERSION","E2E_MARKER_VERSION","E2E_MARKER_VERSION_FEATURES","E2E_KNOWN_FEATURES","E2E_DEFAULT_ITERATIONS","E2E_MIN_ITERATIONS","E2E_MAX_ITERATIONS","E2E_MAX_FILE_BYTES","E2E_MIN_PASSWORD_LEN","E2E_RECOVERY_KEY_BYTES","E2E_ESCROW_ALG","VERIFY_PLAINTEXT","MAGIC_BYTES","DATA_IV_OFF","FMK_LEN","RK_INFO","RK_SALT_LEN","bytesToB64","b64ToBytes","buf","joinIvCt","iv","gcmSeal","sealBlob","openBlob","b64","gcmOpen","pt","deriveKek","salt","iterations","material","deriveKekBits","bits","importFmk","importFmkFor","marker","markerIsVault","B32_ALPHABET","formatRecoveryKey","generateRecoveryKey","parseRecoveryKey","clean","ch","deriveRecoveryKek","sealRecoverySlot","recoveryKey","rkek","importEscrowPublicKey","spkiB64","importEscrowPrivateKey","pkcs8B64","escrowKeyId","sealEscrowSlot","escrowSpkiB64","pub","createMarker","iter","kek","verify","sealNamesSlot","createEncryptedFolder","rawFmk","createVault","packLog2","importVaultFmk","cryptoRandom","sealIndexFile","encodeIndexBody","writer","vindex","vaultId","upgradeMarkerV1","rawKek","addEscrowSlot","escrowPublicKey","hasSlots","proof","esc","declineEscrowSlot","when","escrowOfferState","installationKid","parseMarkerDetailed","unsupported","vs","vaultSlotProblem","validNamesSlot","vaultIdOf","parseMarker","markerHasNames","unlockNameKey","enableNames","finishNames","E2E_CHOOSABLE_LEVELS","E2E_DEFAULT_LEVEL","choosableLevels","encryptionLevel","canRaiseToNames","markerHasRecovery","markerHasEscrow","escrowAvailability","verifyPassword","fmkFromKek","unlockWithPassword","unlockWithPasswordDetailed","unlockWithRecoveryKey","fmkRaw","unlockWithEscrowKey","privateKey","hasMagic","encryptFile","content","dataIV","fmkRawFrom","cred","passwordSlot","newPassword","passwordChangeNeedsRekey","rekeyPending","changePassword","E2eRekeyEscrowError","startRekey","oldRaw","newRaw","oldFmk","newFmk","reuse","namesSlot","nkRaw","unlockPrevious","rewrapFileKey","rewrapped","conversionPending","startConversion","cleanup","conv","finishConversion","finishRekey","decryptFileAny","createKeyRing","nameKeys","previousKeys","stripAdapter","parentDirOf","displayParentDirOf","filterInternalEntries","SHOW_HIDDEN_LS_KEY","readShowHidden","showHiddenFiles","setShowHiddenFiles","filterHiddenEntries","showHidden","filterListing","isStorageRootDir","dirname","isTrashListing","makeTrashRow","adapter","injectTrashRow","trashVisible","hydrateTrashRow","storages","newest","VIRTUAL_SEGMENTS","TAG_SEGMENT_PREFIX","TAG_KIND_PREFIXES","makeTagSegment","tagViewOfSegment","segment","tagOfSegment","tagKindOfPath","tagOfPath","virtualSegmentLabel","isVirtualViewPath","byFoldersFirst","bd","emptyCols","readCols","specs","specOf","spec","hidden","reorderColumns","from","columnDropBand","movable","createColumnStore","specsOf","backing","lead","known","width","setWidth","px","widthsAreAuto","freeze","setHidden","set","band","reset","customised","layout","candidates","metrics","padding","check","menu","leadSpec","visible","cells","chrome","auto","leadAuto","give","leadFloor","memoryBacking","initial","box","ready","persistable","viewPrefsReady","folderMemoryEnabled","setFolderMemoryEnabled","_on","nowSec","isViewMode","isSortKey","isSortDir","colsSaySomething","folderMap","readFolderMap","COLUMNS","FOLDER_CAP","kept","folderKey","storageRef","relPath","ROOT_FOLDER_KEY","SEEDED","folderPrefs","_t","seed","folderIsRemembered","rememberedCount","rememberFolder","patch","scheduleSave","touchFolder","forgetFolder","forgetAllFolders","personDefault","instanceDefault","normalisePersonDefault","readInstanceFolderDefault","hid","personFolderDefault","setPersonFolderDefault","mirrorDefault","applyToAllFolders","instanceFolderDefault","setInstanceFolderDefault","defaultFolderView","resolveFolderView","FIXED_TRACKS","NAME_MIN","NAME_AUTO","EXPLORER_METRICS","defaultCols","folderColumnStore","defaultColumns","columnOrder","genericReorder","genericDropBand","moveColumn","moveColumnBy","neighbour","canMoveColumn","columnWidth","setColumnWidth","freezeWidths","columnHidden","setColumnHidden","resetColumns","columnsCustomised","tableLayout","MIRRORS","OWNED_KEYS","stamp","foreign","takeForeign","currentDoc","viewPrefsSlot","namespace","SAVE_DEBOUNCE_MS","saveTimer","saveDirty","flushSave","attachViewPrefsStore","readDoc","watchForFreshDocuments","detachViewPrefsStore","resetState","viewPrefsAttached","applied","onViewPrefsApplied","announceApplied","theirs","migrated","REFRESH_THROTTLE_MS","lastRefresh","watching","refreshViewPrefs","__resetViewPrefs","__flushViewPrefs","SORT_KEYS","SORT_LS_KEY","DEFAULT_KEY","defaultSortDir","readStored","setSortLocale","modifiedMs","compareNames","nameCompare","typeLabel","byActiveKey","dirWord","am","bm","liveStores","followed","createSortStore","defaultSort","setSort","applySort","toggleSortDir","chooseSortKey","compareNodesFn","compareInOrderFn","defaultStore","SORT_STORE_KEY","useSortStore","activeSortKey","activeSortDir","was","viewPrefsHttpTransport","credentials","attachViewPrefsHttp","TABLE_ENV","provideTableEnv","env","provide","useTableEnv","gateOnService","callerAdmin","onlyOfficeUsable","SHARING_PERMS","ALL_SHARING","sharingHeld","canShareAny","isDir","appStoreAsks","hostHasPage","callerIsApp","appStoreRowShown","publicLinksOff","insideEncrypted","jobOpenOf","UI_PROFILES","DEFAULT_UI_PROFILE","warned","resolveUiProfile","__resetUiProfileWarnings","wireJoinPath","wireParentPath","slash","wireBaseName","trimWire","isBelowRoot","segmentsBelow","storedName","createE2eNameView","ring","markers","markerValues","pendingSegments","bump","loadMarker","markerFor","markerCached","setMarker","forget","dirIds","namesOn","rootOf","best","cacheFor","parentIdOf","nk","dirWire","up","decode","parentWire","fk","running","sidecar","remember","enc","decodePath","parent","plainNameOf","displayDirOf","rootRel","below","decorate","decorateOne","listingRoot","fxe","displayDir","segmentLabel","pk","displayPath","writesEncrypted","rr","nameForWrite","plainName","dirIdFor","E2E_NAME_VIEW","e2eNameView","shownNames","nameRows","named","keep","map","fmtTime","rtf","_withModifiers","EMPTY_FILTERS","foldText","nameNeedle","pathActive","peopleOf","filtersActive","activeFilterCount","TYPE_FAMILIES","matchesType","AROUND_MS","parseAnchor","modifiedWindow","g","span","matchesModified","MB","sizeBounds","matchesSize","nameMatches","needle","matchesPath","inside","ownerIdOf","ownedByViewer","ownerNameOf","deleterIdOf","deletedByViewer","deleterNameOf","arrivedFromOutside","peopleOptions","matchesPeople","applyFilters","saving","mapStatus","jobs","clampPercent","opObjects","opPercent","bytesTotal","bytesDone","objects","failureOf","DRAWN_KINDS","mapKind","isPluginJob","mayCancel","percentOf","nameOf","itemsOf","lockOf","anyLocked","lockedRefusal","lockReasonText","lock","lockWords","who","lockUntilText","NAMED","linkStateOf","linkWords","linkWordsFor","isUnopenableLink","isUnavailable","unavailableWordsFor","personName","personInitial","normRotation","MIN_FIELD_FRAC","clamp01","clampFrac","rectFromPoints","fracToPixel","pixelToFrac","W","pointToFrac","unrotatedSize","rot","renderedToPage","X","Y","pageToRendered","fracToPdf","ph","right","bottom","round","pdfToFrac","topLeft","bottomRight","fitPageWidth","byHeight","SIGN_FONTS","DEFAULT_SIGN_FONT","signFont","isSignFontKey","PDF_RULE_KINDS","isRuleKind","normalizeRule","ruleInputMode","ruleMaxLength","applyRule","neg","ruleError","PDF_FIELD_TYPES","isDrawnType","catalogue","more","normalizeStampLines","linesOf","field","stampExample","line","assignee","ex","DEFAULT_FIELD_SIZE","SIGNER_PALETTE","isFieldType","allowedTypes","normalizeFields","isPlaced","unplacedFields","defineField","newFieldId","normalizeFormats","normalizeDateLabels","dateChoices","formats","orders","separators","formatFor","separator","exact","splitFormat","orderTokens","dateExample","normalizeSigners","signerColor","signers","isFieldOf","signer","hasValue","fillValues","applyFillValues","given","byId","seeded","withFont","font","withValue","placeField","copyToPage","todayIso","walkNodes","visit","initialValues","fp","multiSafe","pp","FIELD_TYPES","boolIsDecision","storageFieldOf","looksLikeEmail","hasAnswer","valueStrings","conditionMet","cond","values","have","visibleFields","pass","scope","scopedValues","fieldRequired","formFields","hiddenKeys","stripHiddenValues","missingRequired","SURFACE_CHANGE_DEBOUNCE_MS","usePluginSurface","events","current","busy","failure","invalidKeys","footer","errors","setSurface","keepValues","updateValues","changeTimer","cancelChange","scheduleChange","post","seq","event","actionId","blocking","_d","toast","go","press","missing","rowAction","SIGNATURE_MODES","SIGNATURE_UPLOAD_MAX_BYTES","SIGNATURE_MAX_WIDTH","SIGNATURE_MAX_HEIGHT","SIGNATURE_DEFAULT_WIDTH","SIGNATURE_DEFAULT_HEIGHT","SIGNATURE_INK","SIGNATURE_FONT_DEFAULT","isSignatureMode","signatureModes","isSignatureValue","signatureFontOf","padSize","height","fitWithin","maxW","maxH","stripDataUrl","uploadVerdict","fitFontSize","measure","maxWidth","maxHeight","ROW","placeListUnder","above","comboId","listId","optId","trigger","panel","place","carried","flagged","typed","typedAt","selectedIndex","isInvalid","formBound","syncValidity","enabledFrom","CARRIED_TOKENS","readCarried","placePanel","onOutside","close","listen","scrollActive","refocus","typeahead","onTrigger","onInvalid","ChevronDown","Check","showAdvanced","revealed","basic","advanced","help","optionLabel","alias","bool","errorText","choiceOptions","yes","no","choiceValue","setChoice","isChoice","inputType","toggleReveal","ChoiceSelect","_hoisted_21","_hoisted_22","fieldErrors","StorageFields","stateOf","tables","tableColumnBacking","says","tableSort","setTableSort","sort","usable","CELL_GAP","ROW_PAD","CHECK_TRACK","PIN_LEAD_ROOM","PIN_MENU_ROOM","DRAG_SLOP","CLICK_SWALLOW_MS","colById","leadId","ownStore","candidateCols","LEAD_CHECK","menuContent","listEl","listWidth","ro","pendingWidth","widthFrame","scrolledX","onListScroll","visibleCols","tableStyle","leadWidth","pinLead","menuWidth","pinMenu","rootStyle","colStyle","menuStyle","colClass","controlled","localSort","activeSort","paged","closedWhy","isSortable","toggleSort","col","sortArrow","ariaSort","sortTitle","valueOf","compareValues","ae","be","sortedRows","slots","useSlots","emptyText","emptyShown","rowCount","bodyHasContent","spanCols","cellValue","cellText","cellTitle","rowClasses","rowClickable","resizing","freezeBeforeEdit","isResizable","resizeNow","resizeMin","resizeMax","onResizeStart","onResizeMove","onResizeEnd","onResizeKey","onResizeReset","dragState","dragCol","dropAt","dragEndedAt","isMovable","onHeadPointerDown","onHeadPointerMove","onHeadPointerUp","onDragKey","onDragAbort","armed","endDrag","dropGapRange","drawn","drawnCells","sign","applyColumnDrop","beforeId","restFull","steppableCols","stepColumn","canStepColumn","onHeadKey","onHeadClickCapture","colMenuOpen","colMenuX","colMenuY","colMenuAnchor","colMenuEl","colMenuThemeClass","nudge","menuCols","canResetCols","openColMenu","clampColMenu","pad","closeColMenu","onColMenuKey","toggleCol","onResetColumns","totalPages","currentPage","showPager","rangeLabel","inst","onRowClick","onRowAction","_mergeProps","ci","_hoisted_18","ri","ItemCheck","_hoisted_24","RowActions","_hoisted_25","_hoisted_27","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_36","_hoisted_40","_hoisted_43","_hoisted_44","formatSurfaceCell","format","hasActions","cell","columns","actionsOf","DataTable","pct","COMMAS","SEMICOLONS","separatorRe","re","cls","splitList","isListSeparatorKey","suggestions","showSuggest","lookupOff","notice","lastQuery","people","freeEntry","personLabel","onInput","commit","onKeydown","onBlur","_hoisted_11","len","DRIVES","splitWire","trimSlashes","joinWire","parentOfWire","multiDrive","labelOfWire","drivesLabel","crumbsOfWire","permAllowsWrite","perm","isAtOrInside","child","ancestor","ca","cr","aa","ar","blockedReason","candidate","moving","norm","vaultOfWire","roots","vaultBlocked","dest","vaultOf","vaultDeadEnd","destinationRows","driveRows","initialLocation","multi","only","stack","pushModal","popModal","isTopModal","FOCUSABLE","ambientLocale","cardEl","modalSeq","titleId","lateFocus","wired","focusTimer","focusFirst","card","preferred","within","sel","unwire","home","asking","keepEl","requestClose","stopAndClose","downOnBackdrop","onBackdropDown","onBackdrop","started","here","pickingFile","learnedVaults","learnVault","isOpen","goTo","resp","inVault","isVault","dead","crumbs","hereBlocked","hereVault","hereWritable","canChoose","reasonIsRefusal","dialogTitle","confirmLabel","targetName","rowIcon","rowTitle","openRow","Modal","openAt","onPick","DestinationPickerModal","exposed","release","modes","offeredFonts","startFont","fromValue","canvas","uploadError","preview","valueUrl","ctxOf","dpr","prepareCanvas","drawing","pointOf","kx","ky","onDown","onMove","onUp","exportCanvas","ensureFont","fonts","renderTyped","pickFont","fileInput","onFile","input","verdict","img","fit","uploadErrorText","fetchOk","fetchViewerArrayBuffer","fetchViewerText","DEFAULT_BRAND_NAME","HEX","normalizeAccent","shade","hex","shift","hx","inkOn","lin","accentStyleOf","accent","rgb","usePublicBranding","branding","whitelabel","logo","footerText","hidePoweredBy","themeDefault","locales","accentStyle","origin","defaultPdfWorkerUrl","loadPdfjs","workerUrl","pdf","lib","ANYONE","setLabel","assign","setRequired","setRuleKind","setRuleBound","which","setFormat","setFont","setStyle","styleOptions","asksFont","lineCatalogue","pickedLines","lineOptions","setLines","linePreview","assigneeLabel","assigneeOptions","sg","ruleOptions","dateFormats","formatOptions","pickedFormat","dateParts","dateCaptions","caption","pickedPair","pickedOrder","pickedSeparator","orderOptions","separatorOptions","dateShown","setOrder","setSeparator","ln","editing","defining","placingStep","lastEmitted","publish","seedLater","reseed","drag","byPage","fieldColor","cardStyle","color","ink","signerLabel","fieldLabel","same","pages","zoom","containerEl","containerW","containerH","pageLayout","pdfDoc","observer","resizeObs","pageEls","rendered","canvases","fitWidth","pageWidth","disconnect","vp","observe","setPageEl","renderPage","wantW","meta","scale","fresh","live","rerenderVisible","zoomIn","zoomOut","zoomFit","measurePane","applyPaneSize","sizeLater","srcKey","placing","ghost","fracAt","dragRect","fracIn","pickType","addField","defaultAssignee","patchField","removeField","placingId","pickPending","placePending","unplace","pendingLabel","onPageDown","bindWindow","onFieldDown","onHandleDown","onWindowMove","dx","dy","onWindowUp","unbindWindow","publishes","dragged","dragging","selectedField","copyTarget","revealSelected","pageEl","padFor","setValue","onFieldTap","onTextInput","shaped","ruleOf","padField","padModes","padFonts","padValue","onPadValue","sigSrc","ruleHint","ruleMessage","fontClassOf","checkIcon","ty","PdfFieldEditor","_hoisted_28","_withKeys","_hoisted_39","_hoisted_41","SurfaceSignaturePad","onFormValues","onPdfValue","textOf","tp","toneOf","tone","errorOf","_component_SurfaceRenderer","SurfaceForm","SurfaceSteps","SurfaceList","SurfaceProgress","SurfacePeoplePicker","SurfacePinInput","SurfaceFileChooser","SurfacePreview","SurfacePdfFields","SurfaceRenderer","hasSteps","found","BACK_IDS","isBackAction","stepFooter","stepped","back","arranged","ordered","isPrimary","BRIDGE_VERSION","HELLO","PORT","METHODS","LIMITS","isHello","isRequest","isKnownMethod","BRIDGE_CAPS","BridgeFailure","transferables","CODE_TOKEN","createAppBridge","win","port","loads","destroyed","hseq","windowStart","windowCount","withinRate","transfer","onPortMessage","onWindowMessage","frame","cw","request","timeoutMs","PREF_KEYS","ACCOUNT_KEYS","LOOK_KEYS","PREF_LS_KEYS","PREFS_PUT_DEBOUNCE_MS","SESSION_LS_KEY","readSessionHint","hasSession","cfg","rememberSession","present","sealSessionless","personalMirrors","registerPersonalMirror","personalForgets","registerPersonalForget","forgetPersonalPrefs","remote","hydrated","settle","configured","settled","settleWaiters","configurePrefs","prefsConfigured","prefsSettled","onPrefsSettled","waiting","currentPrefs","prefsHydrated","onPrefs","announce","snapshot","localPref","setLocalPref","localPrefs","withBody","headersNow","sanitize","hydratePrefs","flush","leaving","savePref","setAccountPref","accountFetch","flushPrefs","flushPrefsOnHide","resetPrefs","appStateMax","utf8","appStateGet","AppStateTooLarge","appStateSet","appSeenVersion","markAppSeen","GESTURE_MS","CONSENT_ARM_MS","systemDark","bridge","dirty","closeAsk","closeBusy","generation","liveUI","newer","updatedNote","grants","appVersion","TOKENS","themeInfo","tokens","extOf","fileInfos","grant","fileAt","toBody","confirmAsk","consentAsk","gestureSpentAt","hostGestureAt","activationLive","ua","onHostGesture","gestureNow","consent","askConsent","consentArmed","consentArmTimer","clipboardQuestion","jobQuestion","downloadQuestion","answerConsent","downloadName","tooLarge","chunksOf","saveToDisk","picker","handle","saveAsAsk","saveAsPending","learnedStorages","saveAsStart","saveAsStorages","askFolder","startAt","answerSaveAs","saveAsTitle","actionLabel","isStream","answerConfirm","buildFrame","mount","unmount","answerClose","offUpdated","HOST_GESTURES","notifyUpdated","requestSave","confirmClose","notifyClosing","reload","reloadNewer","dismissNote","PluginConfirmModal","loadError","sectionId","appFiles","toggle","AppFrame","SurfaceConversation","SurfaceFooterButtons","formatDateOf","shownPath","single","isMulti","lockLine","linkNote","unavailableNote","isFile","multiTotal","multiSize","etag","thumb","pluginSections","headName","headCaption","previewSrc","headIcon","canTag","shortHash","formatDateStr","copyText","effectivePerm","mayShare","linksOff","canManagePerms","permLabel","versionsState","versions","confirmVersionId","snapshotFirst","versionWork","versionBusy","sharesState","shares","refreshSeq","loadVersions","askRestore","confirmRestore","takeSnapshot","tab","peopleState","peopleSeq","loadPeople","grantPerson","nameOfPerson","initialOfPerson","shareBusy","createLink","activityUsable","commentsState","comments","commentDraft","commentBusy","commentNodeId","commentSeq","loadComments","sendComment","removeComment","relativeTime","iso","diffS","units","unit","secs","_hoisted_37","_hoisted_46","_hoisted_47","_hoisted_48","TagPicker","PluginInspectorSection","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_80","_hoisted_81","_hoisted_82","_hoisted_83","_hoisted_84","_hoisted_85","_hoisted_86","_hoisted_89","_hoisted_90","_hoisted_91","_hoisted_92","_hoisted_93","_hoisted_94","_hoisted_95","_hoisted_96","_hoisted_97","_hoisted_98","_hoisted_99","_hoisted_101","_hoisted_102","_hoisted_103","_hoisted_104","LONG_PRESS_MS","TAP_WINDOW_MS","MOVE_TOLERANCE_PX","ITEM_CONTROL_SELECTOR","clickMod","touch","checkMod","onControl","control","useRowTouch","onLongPress","longPressed","tapEndedAt","startedOnItem","stopTimer","onTouchStart","onTouchMove","onTouchEnd","tapped","isTap","TOUCH_SLOP","EDGE_PX","useReorderDrag","dragKey","dropGap","reordering","endedAt","gapAt","onPointerDown","gesture","abort","scroller","cancelEmulatedClick","onClickCapture","storageOrderKey","keysOf","parseStorageOrder","serializeStorageOrder","defaultStorageOrder","orderStorages","saved","rank","rankOf","moveStorage","dropStorageAt","sortStoragesByName","mergeStorageOrder","visibleKeys","visibleKey","queuedWrite","queuedRaw","readMirror","saveStorageOrder","sendNow","useStorageOrder","driverName","TAG_PEEK","showLabels","sharedSet","IDENTITY_VIEWS","appRows","activeReadOnly","newShown","viewLabel","isActiveDest","tagsExpanded","allTags","tagGroups","hiddenTagCount","anyGroupLong","tagIsActive","showTags","newBtnEl","newMenuRef","newActions","openNewMenu","onNewSelect","quotaPercent","quotaText","toggleLabel","canReorder","rowEls","setRowEl","navEl","storageMenuRef","menuSheet","indexOfKey","storageActions","alreadySorted","openStorageMenu","sheet","point","onStorageContextMenu","reorder","echoOff","swallowMenuEcho","anywhere","swallow","inMenu","onStorageKeydown","commitOrder","focusKey","onStorageMenuSelect","onStorageClickCapture","onStoragePointerDown","args","StorageTags","NAME_FILTER_DEBOUNCE_MS","nameIsLocal","useServerNameFilter","match","answered","unanswered","cancel","ask","getCurrentScope","onScopeDispose","FE_DND_MIME","FE_DND_SRC_MIME","native","NATIVE_DRAG_TTL_MS","beginNativeDrag","endNativeDrag","activeNativeDrag","hasInternalDrag","internalDragItems","internalDragOrigin","canDownloadUrlDrag","authKindOf","downloadUrlPayload","createDragLinks","mint","refreshBelow","usableAbove","failPause","links","pausedUntil","queued","supported","remaining","oldest","warm","paused","sayDragProgress","afterDrop","THUMB_NOTES","ICONS","WORDS","thumbNoteOf","thumbNoteWords","note","words","MAX_BYTES","MAX_FILE_BYTES","MAX_INFLIGHT","MAX_LINES","MAX_LINE_CHARS","MAX_ROWS","MAX_COLS","TABLE_EXTS","isTrashRow","previewKindFor","drawsAsPage","drawsAsVideo","PAPER_FAMILIES","drawsOnPaper","PICTURE_FAMILIES","BADGES","thumbTypeBadge","badge","KEYWORDS","TEXT_MARKER","bareToken","toLine","indent","splitCells","quoted","separatorFor","firstLine","parsePreview","truncated","bad","lines","cols","KEY_SEP","createFilePreviews","queue","controllers","bound","readHead","chunks","joined","ctrl","pump","enqueue","ensureObserver","kindFor","io","dateBucketFor","today","ym","groupingActive","groupByDate","runs","side","firsts","setNodeStarred","starred","NEAR","cbs","whenNearViewport","near","stopWaiting","closeTip","mark","tip","tipOpen","tipDir","placeTip","openTip","onEnter","onLeave","pressedBy","onTap","$attrs","prints","ThumbTile","snippetSegments","snippet","matchedInContent","matched","applyDragGhost","dt","folderPreviews","onCardEnter","lockTitleOf","linkOf","unavailableOf","firstDirPath","firstFilePath","grouped","headingBefore","thumbOf","previews","previewKind","previewFor","bindPreview","canStar","isSelected","onCheckClick","onClick","onDbl","onCtx","onMenuButton","onItemDragStart","dropTargetPath","onItemDragOver","onItemDragLeave","onItemDrop","displayDate","captionFor","keepGlyph","cardSnippet","snippetTitle","li","StarButton","val","FolderMosaic","si","filtering","storageFilter","recentFilter","starredFilter","shownStorages","shownRecent","shownStarred","filteredEmpty","NO_SELECTION","storageTile","storageCaption","lastOpen","openNode","GridView","draftFilter","tileFor","folderOf","whenOf","rowActions","countLine","_withCtx","connectionsBase","connectionsOrigin","publicUrl","told","useConnections","drivers","realm","canManage","denial","statusOf","createStorage","created","updateStorage","updated","deleteStorage","testStorage","descriptor","driver","defaults","driverNames","isPlainHttp","webdavUrl","gioUri","user","netUseArgs","netUseCommand","verb","letter","WEBCLIENT_KEY","WEBCLIENT_LIMIT_COMMANDS","hostOf","pathOf","guideUser","userOf","buildWebdavGuide","secret","facts","clients","notes","buildS3Guide","endpoint","bucket","akid","pathStyle","buildSftpGuide","portFlag","buildFtpsGuide","pasv","buildNfsGuide","GUIDE_BUILDERS","GUIDE_NAMES","guideName","guideProtocols","buildGuide","protocol","builder","activeClient","copied","copyTimer","ta","blockId","isCode","useS3Keys","connection","errorHint","canMint","create","setDisabled","disabled","dismissSecret","guideKey","bucketChoices","confirmRevoke","conn","scopeOf","shortDate","revoke","useSSHKeys","canAdd","hasUsableKey","showKeys","pasted","confirmRemove","submit","fingerprintOf","drop","useNFSExports","exports","dismissPath","guideExport","storageChoices","readOnly","allowCidrs","mountLine","copyLine","useTokens","setPermissions","confirming","FULL_SCOPES","scopeState","rootPath","expiresInDays","commentLevel","commentOptions","commentsOf","noScope","buildScopes","defaultLabel","labelPlaceholder","scopes","usedLabel","writes","toggleComments","copySecret","fmtDate","_vModelCheckbox","guideUserName","osDark","themeResolved","protocols","guideStorage","protocolChoices","nfs","s3","sftp","guide","_g","_h","_k","_m","_l","_o","_n","_q","_p","_s","_r","_u","_v","_w","_x","_y","_z","S3KeysPanel","SSHKeysPanel","NFSExportsPanel","TokensPanel","ConnectionGuideView","emptyAdvSearch","pathBase","tagToken","negated","advQueryString","tok","advFilterParams","advSearchEmpty","parseTagList","advSearchTruncated","returned","groups","incomplete","coveragePercent","coverageMessage","coverageByStorage","info","coverageNotice","searching","crossStorage","listingTickets","latest","goingTo","newestRun","awaited","pendingAnswers","waiters","wake","capMs","MENU_ANSWERS_PREFIX","VERSION","MENU_ANSWERS_MAX_ROWS","MENU_ANSWERS_MAX_STORAGES","MENU_ANSWERS_MAX_CHARS","MENU_ANSWERS_MAX_AGE_MS","MENU_ANSWERS_FRESH_MS","FLUSH_MS","E2E_WORDS","QUESTIONS","storageOf","normal","parentOf","familyOf","validAnswer","menuScopeId","probeStorage","ls","menuAnswerStore","rev","buckets","era","epoch","sig","disposed","indexKey","bucketKey","schedule","flushNow","readIndex","sweep","nextSig","levels","clearMenuAnswers","hasCeiling","needsMeasuredDrives","storageLine","measured","drives","counted","partial","figure","CUSTOM_THEME_PREFIX","THEME_LS_KEY","LEGACY_THEME_LS_KEY","DEFAULT_THEME_ID","THEMES","customThemes","setCustomThemes","defs","themeId","themeById","applyStoredPalette","useCustomThemes","allThemes","themeName","theme","allTokenKeys","plausibleThemeId","readStoredThemeId","setTheme","applyInstanceDefault","useThemeState","THEME_MODE_LS_KEY","MODE_VALUES","readStoredThemeMode","themeMode","setThemeMode","resolveSessionLook","useThemeModeState","applyThemeToEl","STYLE_ATTR","cssDecls","PUBLIC_PAGE_TOKENS","LOGIN_PAGE_TOKENS","PAGE_TOKENS","DERIVED_PUBLIC_PAGE","publicPageTokens","variant","PUBLIC_PAGE_SET","withoutPublicPage","generateThemeCss","light","pageLight","pageDark","pageDarkSelectors","darkSelectors","autoDarkSelectors","syncThemeStyle","css","cardVars","th","MODES","shownMode","DEFAULT_ID","ThemePalette","useExplorerTimeZone","deps","asked","RING_R","history","hasError","overall","runningCount","RING_C","ringOffset","ringSpin","pctText","badgeAria","KIND_ICONS","kindLabel","outputModeLabel","outputModeTitle","statusText","canOpen","chipText","onDocPointerDown","onDocKeydown","DONE_LINGER_MS","HISTORY_CAP","toOperation","terminal","useOperations","retired","lingerTimers","clearTimer","tm","retire","scheduleLinger","acts","sync","retry","clearHistory","revealRequests","reveal","errorCount","overallPercent","sum","TOUR_LS_KEY","TOUR_DONE","TOUR_DELAY_MS","TOUR_ACCOUNT_WAIT_MS","seenHere","tourSeen","accountWriteQueued","markTourSeen","offerTourOnce","delayMs","waitMs","giveUp","unwait","decide","resetTourState","dragIndex","overIndex","onDragStart","onDragOver","onDragLeave","onDrop","onDragEnd","onTabMiddleDown","onAux","E2E_LOCK","pw","OVERFLOW_THRESHOLD","confinedRel","floorLabel","adapterPrefix","e2eLabel","floor","homeCrumb","trail","homeIsCurrent","collapsed","leadCrumbs","middleCrumbs","tailCrumbs","overflowOpen","moreWrapEl","subOpen","subWrapEl","anyMenuOpen","closeMenus","onOverflowPick","crumb","toggleSub","onDocClick","onHomeClick","onHomeContext","onContext","onHomeDrop","onCrumbDrop","onCrumbDragOver","pathDraft","pathInput","startEdit","trimmed","submitPath","cancelEdit","findLabel","GROUPS","TYPE_OPTIONS","MODIFIED_OPTIONS","SIZE_OPTIONS","peopleChoices","optionsFor","chipLabel","chosen","activeCount","sortKey","sortAscending","ranked","sortKeyLabel","sortDirLabel","pickSortKey","flipSortDir","openSortMenu","actionRows","runAction","openPop","pos","panelEl","anchorEls","setAnchorEl","openGroup","popOptions","popTitle","popChecked","popLabel","popPick","r2","restoreFocus","clearAll","localName","nameTimer","onNameInput","clearName","onDocPointer","offers","trashTimeLeft","ttl","onRowDbl","onRowCtx","onRowMenu","isPinnedSpecial","fullDate","printSrc","typeColumnShown","isPlainDir","locationLabel","remainingLabel","rowSnippet","rowInContent","onSort","deleterLabel","ownerLabel","deleterTitle","ownerTitle","nameTitle","loc","rowAttrs","attrs","rowClass","rememberedFolders","thisFolderRemembered","onApplyToAll","onForgetFolder","pinned","groupLabels","actor","actorSelf","actorId","tableGroups","metaFor","pictured","PEEK_DELAY_MS","PEEK_TTL_MS","PEEK_ROWS","useFolderPeek","enter","pointerType","my","leave","OPEN_GUARD_MS","ownPath","ownRows","ownLoading","ownError","ownPerm","e2eLock","ownE2eRoot","paneUnlockBusy","paneUnlockErr","paneLocked","onPaneUnlock","loadFolder","panePath","paneRows","paneLoading","paneError","atVirtualRoot","requested","e2eRootHere","paneWire","paneAdapter","onCrumbNavigate","adapterPath","peek","peekSrc","peekEnd","nameFilter","displayFiles","paneStarredIds","filtersOn","paneFilterMode","paneFindLabel","paneSubfolders","openedAt","withinOpenGuard","onViewClick","onRowOpen","onViewDbl","onViewContext","onBgContext","onBgClick","onRowDragStart","dropBg","acceptDrag","handleDropPayload","targetWire","onViewDropInto","onBgDragOver","onBgDragLeave","onBgDrop","goUp","getPath","visibleNodes","rowPaths","dirPerm","e2eRoot","Breadcrumb","ViewSwitcher","FilterBar","E2eLockScreen","ListView","GalleryView","FolderPeek","useTabs","tabs","activeId","activeTab","activeIndex","hasMultiple","vm","rawSplit","split","viewMode","syncActive","openTab","closeTab","wasActive","activate","setSplit","numberedName","sameId","recoverMoved","encodedOf","runNamePass","rootWire","prog","dirs","taken","moved","expectOf","runConversion","isRoot","resolvers","registerE2eNameResolver","resolveE2eName","cmd","FXE_MAGIC","FXE_VERSION","FXE_EXTENSION","FXE_MAX_HEADER_BYTES","FXE_KNOWN_FEATURES","FXE_FIXED_LEN","isFxeName","hiddenFxeName","isHiddenFxeName","fxeStoredName","original","fxeSlots","fxeHasRecovery","encodeFxePrefix","json","hasFxeMagic","FxeFormatError","fxeHeaderLength","isB64Of","parseFxeHeader","prefixLength","what","readFxe","keysFromFmk","nameBytes","unlockFxe","rekeyedFxeKey","createFxe","nfc","made","dekSealed","decryptFxeBody","changeFxePassword","replaceFxeHeader","oldBody","E2E_MIME","e2eMimeForExt","E2E_BLOB_SAVE_LIMIT","streamingSaveAvailable","SaveCancelled","SaveNeedsGesture","SaveTooLarge","pickSaveTarget","fsaTarget","blobTarget","U32","U16","CRC_TABLE","crcTable","crc32","crc","Rec","dosTime","FLAG_UTF8","FLAG_DESCRIPTOR","MADE_BY","MODE_FILE","MODE_DIR","localHeader","dataDescriptor","centralHeader","force64","bigSize","bigOff","extraLen","endRecords","cdOffset","cdSize","need64","eocd64Offset","zipEntryName","zipChunks","cd","time","createZipStream","gen","streamUploadSource","winStart","streamToFile","FXE_ACTION_KEYS","isFxeActionKey","isFxeRow","fxeEncryptTarget","useE2eFiles","ringVer","urls","revokeAll","encryptTarget","encryptBusy","encryptError","encryptProgress","unlockTarget","unlockIntent","unlockBusy","unlockError","unlockProgress","unlockNeedsSave","unlockHasRecovery","unlockEscrow","unlockEscrowKid","pwTarget","pwBusy","pwError","tooBig","fetchBody","takenIn","freeName","uploadStream","onAbort","trash","decryptWords","readHeader","keyFits","realName","menuRows","encryptable","startEncrypt","closeEncrypt","purgeOriginal","submitEncrypt","purge","fxePath","askUnlock","intent","peekSlots","announceEscrow","priv","nonce","closeUnlock","previewWith","failAndMaybeForget","download","refusedForSize","saveDecrypted","startRemove","shellArg","tooBigFile","tooBigFolder","folder","closeTooBig","into","removeWith","submitUnlock","formatBytes","startPassword","closePassword","submitPassword","via","downloadFolderFile","tooBigHere","downloadDecryptedZip","plainFiles","fileEntry","walk","dirNode","folderUploadSource","convertLarge","expect","progress","rewrapLarge","dispatch","downloadEncryptedCopy","vaultRelOf","useE2eVault","readKnown","strips","reactive","engine","writeKnown","shared","e2eVaultEngine","isVaultRow","onPageHide","minutes","KNOWN_KEY","KNOWN_MAX","leadText","reasonMax","PERM_LEVELS","rowMillis","nodeRowToFileNode","isSymlink","hostReadOnly","LEVELS","isLevel","withListingLevel","listingLevel","fallbackRowLevel","virtual","folderLevel","openSurface","TrashEmptyBusy","TRASH_EMPTY_POLL_MS","parse","emptyTrashAndFollow","pollMs","look","wireAdapterOf","resolveTransfer","cross","archiveTicketUrl","MANAGER_TAIL","absoluteTicketUrl","ticketUrl","requestArchive","paths","requestFileLink","DOWNLOAD_FRAME_TTL_MS","triggerFileNavigation","downloadArchive","hitRelPath","hitStorageName","hitToNode","drive","mtime","hitItem","groupHitsByAccount","hits","localError","upload","useDraftSave","question","save","confirm","shownError","sayUndo","slotTakenBy","afterActionWords","phase","outcome","useDialogRequest","inDialog","STORAGE_WATCH_MS","STORAGE_WATCH_GIVE_UP","scanEnd","createStorageWatch","giveUpAfter","followers","reading","stopped","unreadable","tick","lost","follow","title","sections","chooseSection","SurfaceSections","subtitle","BUILTIN_VIEWER","ONLYOFFICE_VIEWER","OFFICE_OPEN_KINDS","officeOpensKind","openHandlerId","normalizeOpenChoice","isOfficeHandler","openKindOf","viewerViews","appViewersFor","openHandlersFor","isOff","pickOpenHandler","personal","find","pickAppViewer","readAll","validKind","validHandler","openWithChoices","openWithChoice","send","setOpenWithChoice","clearOpenWithChoices","followOpenWithChoices","always","handlerLabel","pluginLabelOf","refElement","fixedViewport","anchorUnderEndEdge","gutter","notificationText","e2eName","e2e","join","useNotificationText","TRASH_VIEW_PATH","sameRowPath","cleanPath","resolveNotificationTarget","openOf","isNotificationClickable","rowOpens","explorerHashPath","explorerPathOf","qualifiedFromHash","decoded","notificationRoute","shareHref","notificationHref","clickable","unread","severityLabel","sev","severityTone","UNREAD_BADGE_MAX","unreadBadgeLabel","unreadBadgeCount","PANEL_W","buttonLabel","btnEl","syncPos","onPanelOpen","openItem","seeAll","manage","Popover","PopoverButton","UnreadBadge","PopoverPanel","NotificationRow","toggleUnread","markOne","PRODUCT_NAME","PLACEHOLDER","shortCommit","productVersionLine","displayName","avatarUrl","Menu","MenuButton","MenuItems","MenuItem","ProductVersion","userSettingsApi","prefs","FEED_LIMIT","NOTIFY_POLL_MS","createNotificationFeed","feed","feedLoading","mineTotal","mineLimit","mineOffset","mineUnreadOnly","mineLoading","mineError","mineSeq","panelOpen","feedCount","feedSeq","unreadCount","hasUnread","refreshFeed","fetchUnread","syncUnread","acceptCount","fetchMine","setMinePage","setMineUnreadFilter","openPanel","closePanel","markRead","lists","wasUnread","markAllRead","notificationsTransport","EXPLORER_DRAWN_ROWS","EXPLORER_ROW_PREFIX","accountMenuRows","explorer","omit","explorerRowKey","lazySurface","loader","defineAsyncComponent","VIEW_MODE_KEY","MANAGER_SEARCH_PAGE","CAPABILITIES_TRIES","SETTINGS_ROW","PLUGIN_OPENING_GRACE_MS","INSPECTOR_LS_KEY","SIDENAV_LS_KEY","ADV_CONTENT_LIMIT","NAV_PAGE","MENU_PREFETCH_MAX","ACCESS_SPREAD_MS","FLASH_TOAST_MS","ERROR_TOAST_MS","STICKY_TOAST_MS","TRASH_PAGE","PATH_LS_KEY","MENU_ANSWER_WAIT_MS","DRAGOUT_PREFETCH_MAX_BYTES","DRAGOUT_PREFETCH_MAX_ITEMS","STANDALONE_ROUTE","TABS_LS_BASE","e2eEscrowDocsUrl","E2E_SEARCH_MAX_DIRS","loadVaultStrip","E2eVaultStrip","PreviewModal","QuickLook","UserSettingsDialog","TimeZoneDialog","PermissionsModal","AdvancedSearch","CommandPalette","NewDocumentModal","ArchiveCreateModal","OnboardingTour","ShortcutSettings","EncryptedFolderModal","E2eSettingsModal","E2eChangePasswordModal","RecoveryKeyModal","E2eRecoveryUnlockModal","E2eFileEncryptModal","E2eFileUnlockModal","fetchedPermissions","heldPermissions","heldByFolder","ownPermissionsAsked","loadOwnPermissions","accountLocale","vault","showToast","vaultDropKeys","vaultLocked","vaultChanged","askVaultName","vaultNameQuestion","answerVaultName","vaultAskPath","vaultListing","withoutVaultLayout","paneApi","vaultRefused","inspectorApi","vaultOnVisible","realtime","news","onAccessChanged","realtimeDegraded","realtimeRoom","qualify","currentPath","thumbs","chunked","opUndo","pendingOps","undo","purgedRows","purgeJobRows","markPurging","trashMode","loadTrash","flashToast","undoToast","pluginOpLabel","appFrameView","onSurfaceOpen","splitPaneRef","rootPathProp","rootFloor","initialFloorPath","tickets","isNewestLoad","dirReadOnly","notFoundPath","loadErrorPath","retryLoad","searchQuery","searchTruncated","coverageMap","catalogRuns","catalogWatcher","catalogWatch","catalogBusy","trashOrigin","trashActive","navView","navViewOrigin","crossFolderView","serverOrderedView","folderMemoryOn","currentFolderKey","makeFolderKey","defaultViewMode","applyFolderView","wantView","buildAuthHeaders","rdy","navTag","navTagKind","NAV_VIEW_DIRNAME","virtualViewOf","soleStorageName","multiStorageRoot","canGoUp","filterRowMode","displayOrder","previewables","previewPosition","previewTarget","onPreviewNav","e2eActive","showPreview","e2eFiles","e2eUnlocked","e2eFetchDecrypted","onPreviewSaved","focusFiles","clipboard","capabilitiesData","capabilitiesSettled","loadCapabilities","showTimeZone","meOnce","fetchMeOnce","tzOwner","notifFeed","notifTimer","notifManageHref","href","accountPerson","onNotifManage","markFirstLoad","firstLoad","revealNotification","openPluginHome","address","wireToVirtual","openAppTarget","onNotificationOpen","adoptAccountLocale","accountLocaleAsked","person","explorerMenuRows","runExplorerMenuRow","onOwnHeaderMenu","accountRows","hostRows","SETTINGS_DIALOG_ROWS","onAccountSelect","settingsOpen","settingsHost","themeModePref","setThemeModePref","shareMaxTtlDays","pluginsEnabled","pluginViewTickets","pluginOpeningLate","pluginOpeningTimer","openingPluginView","stillOpening","pluginViewShown","appFrameFiles","nodeCanEdit","pluginViewList","pluginOpenRules","openOpts","effectiveOnlyOfficeBase","builtinOpenOnly","openHandlersOf","personalOpenChoice","previewAppChoice","previewHandler","vaultPreviewing","previewAppViewer","previewInOffice","openWithLabel","openWithRows","openWithTarget","openWithHandlers","openWithKind","openWithCurrent","openWithChosen","previewNode","stopFollowingOpenWith","pluginInspectorViews","pluginHomeApps","closeNavDrawer","pluginConfirm","pluginActionRows","selReadOnly","rowPerm","pluginOutputModeOf","onPluginAction","runPluginAction","onPluginConfirmed","openPluginPage","reportMutationError","context","toastIt","failureText","refuseInDialog","shell","onPluginOpQueued","dirRel","onOpenOpOutput","_id","starOverrides","showRecents","showTagPicker","tagPickerNode","recentRefreshKey","isStarred","setStarOverride","starredIds","onStarChange","starableNodes","identitySurfaces","selectionAllStarred","toggleStar","loadNavView","markRecent","openTagPickerFor","openTagView","loadTagView","onNodeTagsChanged","loadNavTags","offTagsChanged","onRecentOpen","onRecentContext","onContextTarget","serverQueues","effectiveOnlyOfficeConfigEndpoint","effectiveDrawioUrl","override","newDocTypes","canNewDocument","draftsEnabled","draftCount","draftRows","draftLimit","draftsLoading","draftBusyKey","refreshDraftCount","loadDraftRows","afterDraftsChanged","openDraft","appChoice","previewOpenAs","previewMode","sayDraftSaved","draftListSave","saveDraftFromList","discardDraftFromList","onPreviewDraftSaved","onPreviewDraftDiscarded","openDraftsFromNewDocument","showNewDocument","uploadJobs","fileInputEl","showNewFolder","showRename","showDelete","showArchiveCreate","showArchiveExtract","showArchivePassword","archiveTargets","archiveTarget","archiveDestinationDir","archiveCreateBusy","archiveExtracting","archiveError","archiveInPane","archivePasswordError","archivePasswordAction","archiveSuggestedName","ARCHIVE_CREATE_FORMATS","archiveAllowedFormats","archiveDefaultFormat","archiveEncryption","archiveSuggestedFolder","renameTarget","renameReq","newFolderReq","deleteReq","renameBusy","renameError","newFolderBusy","newFolderError","deleteBusy","deleteError","mutationInPane","previewOpenAsExt","showPerm","permTarget","showDestPicker","destPickerMode","destPickerTargets","destPickerVaultRoots","destPickerVaultFrom","destPickerBusy","showInspector","persistInspector","toggleInspector","openInspector","closeInspector","uiProfile","simpleUi","infoPanelToggle","sideNavExpanded","persistSideNav","navDrawerOpen","sideNavEnabled","navVisible","isNarrow","navOffersTrash","navToggleOn","toggleSideNav","sharedStorageNames","connectionsEnabled","mySharesEnabled","appStoreVisible","appStoreAsk","isApp","appStoreEnabled","showConnections","showTokens","openConnections","openTokens","closeOverlays","anyOverlayOpen","onConnectionsError","allowedViewModes","watchEffect","driveFilters","advFilters","advScope","listingOrder","clearDriveFilters","setDriveFilters","showAdvSearch","advKnownTags","advPathBase","advContentAvailable","searchNarrow","searchRanLocally","advFetchRows","e2eSearchInside","e2eNames","advTarget","virtualToWire","advSearchCount","openAdvancedSearch","advSearchSeed","applyAdvancedSearch","onToolbarSearch","driveScopeLabel","paletteSeed","openPaletteWith","showPalette","permInitialTab","openFileRequest","requestFilesHeld","onInspectorShareCreated","quotaMine","quotaDrives","quotaSnapshot","homeStorages","loadQuota","nodeRowToFileNodePure","navMore","navMoreBusy","navSortParam","fetchNavRows","loadMoreNav","fetchTagRows","homeRecent","homeStarred","homeLoading","storageOrder","navStorages","onReorderStorages","loadHome","forgetFolderPerm","probeTrashPolicy","navTags","navTagsLoaded","openNavDest","openNavStorage","loadSharedStorages","folderLabelOf","onInspectorManage","permCanEdit","inVirtualView","nodeReadOnly","PERM_RANK","selPerm","weakest","ungated","rowAnswers","menuAnswers","menuSig","policy","attachMenuAnswers","prefetchMenuAnswers","folderAllowed","folderAsking","folderGen","askFolderAllowed","byFolder","perms","answers","folderHeldAt","permHeldAt","pathsIn","permHeld","e2eAnswers","e2eAsking","e2eGen","forgetE2eAnswers","e2eAskKey","askE2eAnswers","e2eKnownAt","e2eOn","permsOn","accessTimer","e2eAnswerAt","pathIn","canWriteHere","emptyCanUpload","sharingAt","permTargetSharing","ctxRef","toolbarRef","isCoarse","narrowRO","syncCoarsePointer","toastTimer","dragEndWaiting","slotFreed","coverageShown","atStorageRoot","catalogAll","_gone","dismissToast","runToastAction","act","splitVirtualPath","virtualStorageRows","toggleHiddenFiles","refreshAll","loadListing","asView","writePersistedPath","arriveAt","vaultRoot","tgt","rowsHere","arrivedVault","paneToUser","adv","ranLocally","vr","listedDir","listedRoot","arrived","hydrateTrashRowShared","leaveNotFound","trashRetentionDays","trashCanEmpty","trashEmptying","showTrashConfirm","trashEmptyRun","trashEmptyUnwatched","trashBannerText","trashPreview","trashPreviewError","trashPreviewAsk","openTrashConfirm","trashEmptyProgress","emptyTrash","trashTotal","trashLoaded","trashSummary","trashMoreBusy","trashShownText","nf","trashRowsOf","trashPurging","loadMoreTrash","wireBasename","wireParent","sameDir","pre","wireJoin","movedNamesCollide","registerMoveUndo","originWire","collides","movedPaths","persistMode","hashPersistEnabled","safeDecode","readLsPath","readHashPath","readPersistedPath","fromHash","onHashChange","fromPersist","showShortcutsHelp","hitDrives","foreignAccountOf","hook","paletteHitItem","e2eNameHits","paletteGlobalSearch","accounts","openSearchHit","targetRel","reportHookFailure","onPaletteOpenHit","paletteHitCan","dragOut","dragLinksSupported","onPaletteWarmHit","warmDragLink","downloadSearchHit","downloadSelection","onPaletteDragHit","handDragOut","onPaletteDropInside","cancelShellDrag","paneIsActive","psel","splitSelection","paneCtxTargets","pn","onPaneOpen","paneCut","paneCopy","copyToClipboard","panePaste","paste","quickLookToggle","newTabHere","closeTabById","tabsActiveId","nextTab","prevTab","triggerUpload","dispatchItemAction","activeTargets","offeredOn","onCopyPath","link","gone","e2eOpenPreview","e2eLocked","previewModeForExt","handler","VIEW_DEFAULT_EXTS","restoreBusy","restoreSelection","summary","restored","openNodeInNewTab","absolutePageUrl","ctxMode","breadcrumbCtxPath","breadcrumbCtxLabel","selectionMode","onToolbarAction","desktopSync","keptPairs","keptKnown","refreshKept","keepActive","refreshKeepStatus","ds","keepPokeTimer","keepAlive","onKeepPoke","keepRemoteOf","remoteInside","keepStateOf","keepBadgeFor","keepStripLabel","keepStripPercent","keepActionsFor","ctxUnlistedTargets","ctxOpenSeq","openCtxMenu","contextActions","onContextCanvas","onCrumbContext","onPaneMenu","activePane","selectionActionList","any","trimmedPath","ACTION_PERMS","gateByPermissions","needs","selectionActionListAll","vaultActionList","tagsLabel","isArchive","isArchiveFile","singleHasId","allStarred","accessLabel","openExt","openGate","fxeTarget","e2eUnlockedRootRow","e2eConvertAnswerIs","ARCHIVE_EXTENSIONS","toolbarActions","onContextAction","actingInPane","tg","e2eOpenConvert","openE2eRequest","startArchiveExtraction","inPane","duplicate","openNodeInTab","pasting","vk","vaultTransferKind","plan","e2eTransferNamed","downloadFile","e2eDownload","archivePreparing","e2eDownloadDecrypted","shownName","onDestinationPicked","transferItems","onDocumentCreated","archiveRequestCode","archiveRequestError","byCode","submitArchiveCreate","opsCenter","preparing","sayPreparing","submitArchiveExtract","submitArchivePassword","closeArchivePassword","cancelPendingOp","archive","submitNewFolder","wireName","e2eWireName","submitRename","oldPath","oldName","newPath","E2eNameRefused","purgeSelection","handed","sid","confirmDelete","vt","nodeIds","restoreUndo","onFilePicked","uploadFiles","prepared","e2eEncryptUploads","e2eUploadSources","chunkedUpload","e2eUploadNames","legacyUpload","percent","registered","dragCounter","dragOver","isExternalFileDrag","hasFile","onDragEnter","onDropUpload","d1Origin","d1Here","d1Items","onWindowDragOver","onWindowDrop","onGlobalPointerUp","dragOutQuiet","clippedPaths","onPaneClickRow","onPaneItemDragStart","prepareDragOut","dragLinks","dragNeedsLink","onRowPointerWarm","splitDisplayOrder","dragOutReadyKey","dragOutBusy","dragOutPrefetchTimer","quiet","moveSourcesAsync","opLabel","originOverride","onItemDropInto","dndOrigin","onCrumbDropInto","onCancelUpload","onDismissUpload","onNavigate","effectiveViewerBaseUrl","showThemeGallery","activeThemeId","setActiveTheme","themeOsDark","themeResolvedDark","showShortcutSettings","quickLookOpen","quickLookTarget","quickLookNav","onlyFiles","quickLookOpenFull","retryUploadJob","showTour","cancelTourOffer","startTour","onTourClose","onTourRestartEvent","tabsStorageKey","tabsApi","tabsRestored","activeSplit","tabLabel","virtualLabel","tabItems","tb","tabsVisible","applyTabLocation","activateTab","onListAuxClick","onListMiddleDown","mainPaneRef","splitFilters","splitFolderKey","sto","paneRowVisible","splitOffered","hostBodyState","splitVisible","toggleSplit","closeSplit","onPaneNavigate","onPaneOpenTrash","paneViewMode","setPaneViewMode","displayedViewMode","setDisplayedViewMode","setPaneMain","mainPaneFocus","activePaneId","heldSelection","paneInEncrypted","activePanePath","panePathOf","panePathsOf","heldValid","inspectorHeld","inspectorNodes","inspectorSharing","inspectorInEncrypted","inspectorHeldIn","inspectorDirLabel","inspectorDirCount","inspectorDirPerm","paneClamp","onPaneTransfer","e2eRing","e2eRingVer","e2eEscrowPub","e2eEscrowKid","e2eUrls","recoveryKeyValue","recoveryKeyFolder","recoveryKeyVariant","showRecoveryKey","fxePreviewing","e2eUnregisterNames","rootHint","e2eUnsupported","e2eUnlockBusy","e2eUnlockErr","showEncFolder","e2eCreateBusy","newFolderE2e","e2eRequestFor","requestEncryptedFolder","onE2eRequestSent","e2eMarker","showRecoveryUnlock","e2eRecoverBusy","e2eRecoverErr","e2eUpgradeOffer","e2eUpgradePw","e2eUpgradeBusy","e2eEscrowOffer","e2eEscrowOfferMode","e2eEscrowPw","e2eEscrowBusy","e2eEscrowErr","e2eKek","e2eRevokeAll","e2eUnlockRoot","markerText","e2eAdoptKeys","e2eUnlock","openRecoveryUnlock","showE2eSettings","e2eRecoveryInHand","showPwChange","e2eMimeFor","e2ePreviewSrc","sidecars","e2eKnowRootOf","encNames","submitEncryptedFolder","submitVault","folderMade","markerFile","newDirWire","vaultPath","vaultStrip","vaultDeleting","vaultUnder","vaultForgetUrls","e2eRecoverUnlock","e2eOpenPasswordChange","e2eDoUpgrade","e2eEscrowOfferState","e2eOpenEscrowOffer","e2eWriteMarker","e2eAcceptEscrow","e2eDeclineEscrow","e2eCloseEscrowOffer","e2eDeclineUpgrade","dec","e2eIsDir","e2eNamesErr","e2eNamesProgress","fetched","e2eNamesBusy","e2eNamesStop","e2eLevel","e2eNamesOn","e2eCanRaise","e2ePlainNamed","e2eRaiseLevel","e2eConvTarget","e2eConvRunning","e2eConvErr","e2eConvProgress","e2eConvStop","e2eConvAbort","e2eConvLarge","e2eConvPending","e2eCanConvert","e2eConvFindNested","submitConvertFolder","e2eRunConversion","_dir","e2eStopConversion","e2eSettingsPassword","e2eSettingsEscrow","pwMode","pwErr","e2eRekeyBusy","e2eRekeyErr","e2eRekeyProgress","e2eRekeyPending","e2ePwNeedsRekey","e2eClosePasswordChange","e2eSubmitPassword","e2eRunRekey","e2eWriteBack","e2eRekeyPass","e2eTrimWire","zipName","e2eDownloadEncryptedInstead","closeRecoveryKey","Toolbar","NotificationBell","AccountMenu","SideNav","TabBar","FilePane","PresenceBar","_isRef","_hoisted_45","HomeView","DraftsView","_hoisted_79","InspectorPanel","ConnectionsPanel","UploadProgress","PendingOpsTray","OperationsCenter","NewFolderModal","ArchiveExtractModal","ArchivePasswordModal","E2eRequestModal","E2eTooBigModal","RenameModal","DeleteConfirmModal","OpenWithDialog","DraftConflictModal","AppFrameModal","PluginViewModal","_B","_A","RecentlyOpened","_hoisted_100","ShortcutsHelp","NotificationsPanel","ThemeGallery","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","seal","construct","func","thisArg","_len","_key","Func","_len2","_key2","arrayForEach","unapply","arrayLastIndexOf","arrayPop","arrayPush","arraySplice","arrayIsArray","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","numberToString","booleanToString","bigintToString","symbolToString","objectHasOwnProperty","objectToString","regExpTest","typeErrorCreate","unconstruct","_len3","_key3","_len4","_key4","addToSet","array","transformCaseFunc","element","lcElement","cleanArray","clone","object","newObject","property","stringifyValue","valueAsRecord","valueToString","lookupGetter","stringified","prop","desc","fallbackValue","isRegex","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","html","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","CUSTOM_ELEMENT","EXPRESSIONS","NODE_TYPE","getGlobal","_createTrustedTypesPolicy","trustedTypes","purifyHostElement","ATTR_NAME","policyName","scriptUrl","_createHooksMap","createDOMPurify","window","DOMPurify","document","originalDocument","currentScript","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","template","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","FORBID_TAGS","FORBID_ATTR","EXTRA_ELEMENT_HANDLING","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","SAFE_FOR_XML","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","SANITIZE_NAMED_PROPS_PREFIX","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","_parseConfig","customElementHandling","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","tagName","parentTagName","_forceRemove","_removeAttribute","_initDocument","leadingWhitespace","matches","dirtyPayload","_createNodeIterator","_isClobbered","_isNode","_executeHooks","currentNode","_sanitizeElements","_isBasicCustomElement","parentNode","childNodes","childCount","childClone","expr","_isValidAttribute","lcTag","lcName","nameIsPermitted","RESERVED_CUSTOM_ELEMENT_NAMES","_sanitizeAttributes","attributes","hookEvent","attr","namespaceURI","attrValue","initValue","_sanitizeShadowDOM2","fragment","shadowNode","shadowIterator","importedNode","returnNode","nn","nodeIterator","serializedHTML","entryPoint","hookFunction","purify","DOCUMENT_TAGS","DOCUMENT_ATTRS","POLICY","purifier","instance","_node","cleanStyle","cleanStyleSheet","unsafeCss","declaration","escapeText","sanitizeHtml","renderer","Md","markdownToSafeHtml","md","ONLYOFFICE_API_PATH","DRAWIO_EMBED_QUERY","DEFAULT_PROBE_TIMEOUT_MS","trimBase","domLoadScript","finish","tid","domLoadFramed","onMessage","domReachable","domDeps","browserProbeURL","service","probeExternalFromBrowser","mechanism","elapsed","reached","OFFICE_DOWNLOAD_ERROR","officeEventEndsTheEditor","channel","officeErrorCode","XML_ENTITIES","officeErrorText","description","officeDiagnoseEndpoint","configEndpoint","REASON_KEYS","officeDiagnosisText","fetchOfficeDiagnosis","ARCHIVE_PREVIEW_CACHE_TTL_MS","createArchivePreviewCache","ttlMs","keepBtn","bothBtn","officeSessionEndpoint","diagnoseEndpoint","officeSession","outsideAction","edited","change","outsideDocumentName","basename","documentFolderOf","changeTouches","useDocumentWatch","where","OFFICE_FRAME_PROTOCOL","OFFICE_FRAME_VERSION","OFFICE_FRAME_SANDBOX","OFFICE_FRAME_ALLOW","OFFICE_FRAME_HELLO_MS","SESSION_RE","envelope","parseFrameHello","parseFrameEvent","rawCode","rawText","warnedInPage","warnEditorInPage","frameOriginOf","frameSetting","newFrameSession","buildOfficeFrame","linkOfficeFrame","helloTaken","documents","closed","shutPort","hello","MAX_TEXT_BYTES","OFFICE_MOUNT_ID","ONLYOFFICE_SCRIPT_ID","archivePreviewCache","picksViewer","IMAGE","VIDEO","AUDIO","CODE_LANGS","TEXT_PLAIN","VIEWER_MAP","Viewer3D","EpubViewer","MermaidViewer","DrawioViewer","TiffViewer","PsdViewer","IpynbViewer","CsvViewer","ArchiveViewer","appView","appFrameRef","appDirty","appLabel","onAppSaved","draftTouched","livePath","onAppDirty","wantEdit","viewerCmp","viewerLoadError","pdfFallbackToNative","loadViewerFor","extension","onPdfFallback","viewerProps","openInNewTab","buildAndOpenStandalone","openEditInNewTab","EDITING_VIEWERS","canEditKind","csvOfficeNote","editNeeds","editTitle","showChrome","viewerEl","tileHtml","counterText","savedMeta","noteSaved","utf8Size","metaLine","draftKey","canNav","chevGutter","FILL_KINDS","starNodeId","stageModifier","ZOOM_STEPS","imgEl","canZoom","measureFit","imageStyle","stepZoom","resetZoom","zoomLabel","canZoomIn","canZoomOut","isFullscreen","onFullscreenChange","toggleFullscreen","onGroundClick","fetchError","fetchErrorDetail","fallbackKey","showFetchError","mdDirty","mdSaving","mdReRenderTimer","mdAutosaveTimer","onMdInput","renderMarkdown","saveMarkdown","fetchText","markdownHtml","markdownEl","markdownUnavailable","enrichMarkdown","blocks","mermaid","katex","isMermaid","isMath","wrap","katex$1","codeHtml","highlightCode","language","hljs","monacoEl","monacoEditor","codeAutosaveTimer","monacoReady","monacoUnavailable","saveOk","saveError","codeDirty","disposeMonaco","monacoLanguageFor","tryMountMonaco","monaco","editable","saveCode","runOrchestration","officeError","officeDiagnosis","officeGen","disposeOnlyOfficeEditor","mountOnlyOfficeEditor","codeLanguage","officeEl","officeEditor","diagnoseOfficeDownload","officeUnconfigured","officeConfigError","setOfficeEdited","officeKey","officeToken","documentServerUrl","mountOfficeFrame","loadOnlyOfficeScript","mountId","officeHostEl","onOfficeEvent","onOfficeEdited","docWatch","formatOnlyOfficeError","closeDeadOfficeEditor","officeFrameEl","officeFrameLink","onFrameEvent","officeEdited","outsideAsk","outsideAskOpen","outsideNote","outsideNoteTimer","outsideSeen","outsideOrigin","serverSeq","sessionEndpoint","checkOutsideOnServer","authedFetch","takeChange","tellServer","outsideName","outsideNoteText","sayOutside","takeOutside","outsidePath","onOutsideChoose","script","draftsApi","draft","draftSaved","draftActive","draftFolder","savedFolder","draftSavedNote","draftNoteTimer","draftBusy","draftError","showDraftClose","onDraft","liveFile","sayDraft","draftSave","flushEditors","afterSave","saveDraftToDisk","onCloseSave","onCloseKeep","onCloseDiscard","onBeforeUnload","_hoisted_88","DraftCloseModal","OutsideChangeModal","LIMIT","inputDomId","fold","ALIASES","offsetMinutes","namePart","offsetAliases","hh","mm","forms","clockFor","fallbackZone","buildIndex","fz","defaultHay","city","region","genericLocal","genericEn","haystack","ensureIndex","inputEl","startTick","stopTick","scrollBox","oy","measureDrop","ir","MIN","MAX","useAbove","score","terms","term","scored","display","rowTime","openList","scrollActiveIntoView","closeList","moveActive","normalizeUsername","ACCOUNT_CHECK_DELAY_MS","accountChecker","ans","DENSITY_KEY","applyAccountDensity","getDensity","setDensity","downscaleImageToDataURL","maxPx","maxBytes","bitmap","loadImage","quality","uri","WEBHOOK_EVENTS","DIGEST_EVENT","eventSlug","webhookEventKey","userEventKey","AVATAR_MAX_BYTES","AVATAR_MAX_PX","currentLocale","UserIcon","SlidersHorizontal","Bell","ShieldCheck","Sparkles","headingId","appViews","appRules","appsKnown","appsLoading","loadAppHandlers","fetchIt","stopFollowingChoices","handlerName","appChoiceRows","changeAppChoice","username","avatarError","avatarInput","savingProfile","serverRefusal","checked","checkAccount","emailError","usernameError","profileInvalid","avatarInitial","hydrateProfile","onAvatarFile","saveProfile","refusal","localeOptions","pickLocale","themeOptions","openTriggerOptions","resolvedDark","pickTheme","paletteId","pickPalette","setCorePalette","timeZone","savingTz","deviceZone","tzInputId","tzFallback","tzInForce","tzNow","tzTimer","refreshTzNow","pickTimeZone","FV_VIEWS","FV_SORTS","fvPerson","fvInstance","fvFoldersKept","fvInheritView","fvInheritSort","pickFolderView","pickFolderSort","pickFolderDir","resetDefaultColumns","pickDensity","compact","openTrigger","pickOpenTrigger","vaultIdle","vaultIdleBusy","vaultIdleShown","vaultIdleOptions","loadVaultIdle","pickVaultIdle","quota","quotaLine","startPage","pickStartPage","permission","browserOn","savingNotif","notifPrefs","inAppOn","mutedEvents","offeredEvents","offs","patchSettings","inApp","muted","urgent","digest","urgentSet","adminEvents","adminUrgent","anyHeld","hasUrgentSwitch","setUrgent","setInApp","setEventOn","setBrowser","askPermission","pushState","pushBusy","pushOn","pushDevices","pushCanSwitch","pushChip","pushWhy","loadPush","togglePush","testPush","removePushDevice","pushAdded","installingApp","installApp","currentPassword","newPasswordConfirm","savingPassword","totpEnabled","totpStage","totpQr","totpSecret","totpRecoveryCodes","totpCode","totpBusy","setTotpEnabled","startTotp","verifyTotp","resetTotp","disableTotp","profileSaveVisible","TimeZonePicker","_hoisted_87","_hoisted_105","_hoisted_106","_hoisted_107","_hoisted_109","_hoisted_110","_hoisted_111","_hoisted_112","_hoisted_113","_hoisted_114","_hoisted_115","_hoisted_116","_hoisted_117","_hoisted_118","_hoisted_119","_hoisted_120","_hoisted_122","_hoisted_124","_hoisted_125","_hoisted_126","_hoisted_127","_hoisted_128","_hoisted_121","_hoisted_129","_hoisted_130","_hoisted_131","_hoisted_133","_hoisted_134","_hoisted_135","_hoisted_136","_hoisted_138","_hoisted_139","_hoisted_140","_hoisted_141","_hoisted_142","_hoisted_143","_hoisted_144","_hoisted_145","_hoisted_146","_hoisted_147","_hoisted_148","_hoisted_149","_hoisted_151","_hoisted_152","_hoisted_153","_hoisted_154","_hoisted_155","_hoisted_156","_hoisted_157","_hoisted_158","_hoisted_159","_hoisted_161","_hoisted_162","_hoisted_163","_hoisted_164","_hoisted_165","_hoisted_166","_hoisted_167","_hoisted_168","_hoisted_169","_hoisted_170","_hoisted_171","_hoisted_174","_hoisted_175","_hoisted_176","_hoisted_178","_hoisted_179","_hoisted_180","_hoisted_181","_hoisted_182","_hoisted_184","_hoisted_185","_hoisted_186","_hoisted_187","_hoisted_188","_hoisted_189","_hoisted_190","_hoisted_191","_hoisted_192","_hoisted_193","_hoisted_194","_hoisted_195","_hoisted_196","_hoisted_197","_hoisted_198","_hoisted_199","_hoisted_200","_hoisted_201","_hoisted_202","_hoisted_204","_hoisted_205","_hoisted_206","_hoisted_207","_hoisted_208","_hoisted_209","_hoisted_210","_hoisted_211","_hoisted_212","_hoisted_213","_hoisted_214","_hoisted_215","_hoisted_216","_hoisted_217","_hoisted_218","_hoisted_219","_hoisted_220","_hoisted_221","_hoisted_222","_hoisted_223","_hoisted_224","WEB_PUSH_NOTE_KEY","base64UrlToBytes","bin","BROWSERS","SYSTEMS","deviceLabel","subtleSha256","defaultStorage","sameKey","bodyOf","activeWorker","createWebPush","noteKey","sha256","lastStatus","notificationApi","noted","fetchStatus","currentSubscription","subscribeWith","publicKey","thisDevice","enable","disable","reconcile","forgetDevice","isLinkEntry","pruneMegaMenu","entryIsCurrent","stepFocus","stepAlongBar","isPlainClick","openId","panelId","topControls","panelLinks","entryId","topButton","openAndFocus","onTopKey","controls","onPanelKey","onItemClick","onFocusOut","currentKey","PANEL_SEARCH_KINDS","PANEL_SEARCH_PREFIXES","PANEL_SEARCH_PREFIX_ORDER","PANEL_SEARCH_GROUP_CAP","PANEL_SEARCH_FILES_CAP","PANEL_SEARCH_PREFIXED_CAP","panelWords","parsePanelQuery","word","withPanelPrefix","startsWord","hay","wordScore","weight","panelScore","aliases","phrase","panelExact","panelSearchGroups","byKind","cap","panelSearchRows","REMOTE_MIN","DEBOUNCE_MS","layer","remoteItems","fileItems","wantsRemote","wantsFiles","recentList","loadRecent","forgetAll","GROUP_KEYS","offersAllFiles","optionId","liveText","showEmpty","layerStyle","returnFocus","onTriggerKey","setPrefix","clearQuery","onInputKey","onDocKey","onResize","keyHint","extLocked","endsWithExt","stemEnd","retypeDocName","finalDocName","docNameProblem","satisfied","withheld","madeByApps","withheldText","svc","selectedType","labelFor","pickingDest","dirCache","canWrite","loadDir","destLabel","destWritable","destChecked","nameTouched","collision","draftLimitHit","finalName","nameProblem","nameError","extHint","checkName","checkSeq","checkTimer","refreshDestination","scheduleCheck","defaultDestination","nextType","prevType","onTileKey","onOuterClose","canCreate","reselectOnMouseUp","selectStem","onNameFocus","onNameMouseDown","onNameMouseUp","publicLayoutFor","dropExtAllowed","allow","checkDropFiles","uploadsLeft","maxMb","PublicLinkError","shareRoot","requestRoot","pageRoot","publicLinkClient","pin","usePublicLink","pinFailure","lockMessage","jobId","_plugin","_view","pinBusy","submitPin","shareDownloadUrl","shareNoJsUrl","usePublicShare","GATEWAY_GAVE_UP","usePublicRequest","uploads","patchRange","sentAll","unconfirmed","accepted","refused","publicPageUrl","publicPageClient","usePublicPage","PUBLIC_TEXT","loadPublicText","providePublicText","COUNTERS","publicSentence","usePublicText","showBody","expiry","visits","badgeKind","badgeTone","ownMark","pluginNote","LogoMark","PublicPinGate","PublicLanguagePicker","unavailable","isImage","uploaderName","askName","sendFiles","nameMax","over","limitsOf","accept","mb","onPicked","chooseLocale","wordsArrived","apiRoot","brand","resolvedTheme","refusedText","shareInfo","requestInfo","fromSurface","subject","navigate","PublicShell","PublicShareBody","PublicRequestBody","embedded","bodyTag","jobPhase","jobWords","pageViews","followJobOpen","onJobSettled","followJob","jobTitle","jobText","activeSection","uiRef","uiPlacement","uiChecked","uiFiles","findUI","showsDocument","archiveFormatLabel","anyOverridden","capturingId","conflict","reserved","beginCapture","cancelCapture","attemptAssign","clash","confirmConflictTake","dismissConflict","dismissReserved","onReset","onResetAll","onWindowKeydown","onClose","NAV_KEYS","hintSegments","LABEL","HINT","lv","password2","ack","dropVersions","dropTrash","offerVault","packOptions","E2eLevelPicker","hasEscrow","escrowUnavailableReason","recoveryValue","escrowValue","localErr","nothingAvailable","deepFreeze","Response$1","escapeHTML","inherit$1","SPAN_CLOSE","emitsWrappingTags","scopeToCSSClass","pieces","HTMLRenderer","parseTree","className","newNode","TokenTree","TokenTreeEmitter","emitter","lookahead","concat","anyNumberOfTimes","optional","stripOptionsFromArgs","either","countMatchGroups","startsWith","lexeme","BACKREF_RE","_rewriteBackreferences","regexps","joinWith","numCaptures","regex","MATCH_NOTHING_RE","IDENT_RE","UNDERSCORE_IDENT_RE","NUMBER_RE","C_NUMBER_RE","BINARY_NUMBER_RE","RE_STARTERS_RE","SHEBANG","beginShebang","BACKSLASH_ESCAPE","APOS_STRING_MODE","QUOTE_STRING_MODE","PHRASAL_WORDS_MODE","COMMENT","begin","modeOptions","ENGLISH_WORD","C_LINE_COMMENT_MODE","C_BLOCK_COMMENT_MODE","HASH_COMMENT_MODE","NUMBER_MODE","C_NUMBER_MODE","BINARY_NUMBER_MODE","REGEXP_MODE","TITLE_MODE","UNDERSCORE_TITLE_MODE","METHOD_GUARD","skipIfHasPrecedingDot","response","scopeClassName","_parent","beginKeywords","compileIllegal","compileMatch","compileRelevance","beforeMatchExt","originalMode","COMMON_KEYWORDS","DEFAULT_KEYWORD_SCOPE","compileKeywords","rawKeywords","caseInsensitive","scopeName","compiledKeywords","compileList","keywordList","keyword","pair","scoreForKeyword","providedScore","commonKeyword","seenDeprecations","warn","deprecated","MultiClassError","remapScopeNames","regexes","scopeNames","positions","beginMultiClass","endMultiClass","scopeSugar","MultiClass","compileLanguage","langRe","global","MultiRegex","terminators","matchData","ResumableMultiRegex","matcher","m2","buildModeRegex","compileMode","cmode","keywordPattern","expandOrCloneMode","dependencyOnParent","HTMLInjectionError","escape","inherit","NO_MATCH","MAX_KEYWORD_HITS","HLJS","languages","plugins","SAFE_MODE","LANGUAGE_NOT_FOUND","PLAINTEXT_LANGUAGE","shouldNotHighlight","languageName","blockLanguage","classes","getLanguage","_class","highlight","codeOrLanguageName","optionsOrCode","ignoreIllegals","_highlight","codeToHighlight","continuation","keywordHits","keywordData","matchText","processKeywords","modeBuffer","lastIndex","keywordRelevance","relevance","cssClass","emitKeyword","processSubLanguage","continuations","highlightAuto","processBuffer","emitMultiClass","klass","startNewMode","endOfMode","matchPlusRemainder","Response","doIgnore","resumeScanAtSamePosition","doBeginMatch","newMode","beforeCallbacks","doEndMatch","endMode","processContinuations","lastMatch","processLexeme","textBeforeMatch","processed","beforeMatch","processedCount","justTextHighlightResult","languageSubset","results","autoDetection","sorted","secondBest","updateClassName","currentLang","resultLang","highlightElement","configure","userOptions","initHighlighting","highlightAll","initHighlightingOnLoad","wantsHighlight","boot","registerLanguage","languageDefinition","error$1","registerAliases","unregisterLanguage","listLanguages","aliasList","upgradePluginAPI","addPlugin","removePlugin","deprecateHighlightBlock","core","TAG_NAME_RE","XML_IDENT_RE","XML_META_KEYWORDS","XML_META_PAR_KEYWORDS","APOS_META_STRING_MODE","QUOTE_META_STRING_MODE","TAG_INTERNALS","xml_1","bash","VAR","BRACED_VAR","SUBST","HERE_DOC","QUOTE_STRING","ESCAPED_QUOTE","APOS_STRING","ESCAPED_APOS","ARITHMETIC","SH_LIKE_SHELLS","KNOWN_SHEBANG","FUNCTION","LITERALS","PATH_MODE","SHELL_BUILT_INS","BASH_BUILT_INS","ZSH_BUILT_INS","GNU_CORE_UTILS","bash_1","DECLTYPE_AUTO_RE","NAMESPACE_RE","FUNCTION_TYPE_RE","TYPES","STRINGS","NUMBERS","PREPROCESSOR","FUNCTION_TITLE","EXPRESSION_CONTAINS","EXPRESSION_CONTEXT","FUNCTION_DECLARATION","c_1","cpp","CPP_PRIMITIVE_TYPES","RESERVED_KEYWORDS","RESERVED_TYPES","TYPE_HINTS","FUNCTION_HINTS","CPP_KEYWORDS","FUNCTION_DISPATCH","cpp_1","csharp","BUILT_IN_KEYWORDS","FUNCTION_MODIFIERS","LITERAL_KEYWORDS","NORMAL_KEYWORDS","CONTEXTUAL_KEYWORDS","RAW_STRING","VERBATIM_STRING","VERBATIM_STRING_NO_LF","SUBST_NO_LF","INTERPOLATED_STRING","INTERPOLATED_VERBATIM_STRING","INTERPOLATED_VERBATIM_STRING_NO_LF","STRING","GENERIC_MODIFIER","TYPE_IDENT_RE","AT_IDENTIFIER","csharp_1","HTML_TAGS","SVG_TAGS","TAGS","MEDIA_FEATURES","PSEUDO_CLASSES","PSEUDO_ELEMENTS","ATTRIBUTES","VENDOR_PREFIX","AT_MODIFIERS","AT_PROPERTY_RE","css_1","markdown","INLINE_HTML","HORIZONTAL_RULE","CODE","LIST","LINK_REFERENCE","URL_SCHEME","LINK","BOLD","ITALIC","BOLD_WITHOUT_ITALIC","ITALIC_WITHOUT_BOLD","CONTAINABLE","markdown_1","diff_1","ruby","RUBY_METHOD_RE","CLASS_NAME_RE","CLASS_NAME_WITH_NAMESPACE_RE","RUBY_KEYWORDS","YARDOCTAG","IRB_OBJECT","COMMENT_MODES","decimal","NUMBER","PARAMS","RUBY_DEFAULT_CONTAINS","IRB_DEFAULT","ruby_1","go_1","graphql","GQL_NAME","graphql_1","ini","COMMENTS","VARIABLES","ARRAY","BARE_KEY","QUOTED_KEY_DOUBLE_QUOTE","QUOTED_KEY_SINGLE_QUOTE","ANY_KEY","DOTTED_KEY","ini_1","decimalDigits","frac","hexDigits","NUMERIC","recurRegex","substitution","java","JAVA_IDENT_RE","GENERIC_IDENT_RE","ANNOTATION","java_1","ERROR_TYPES","BUILT_IN_GLOBALS","BUILT_IN_VARIABLES","BUILT_INS","javascript","hasClosingTag","IDENT_RE$1","FRAGMENT","XML_SELF_CLOSING","XML_TAG","afterMatchIndex","nextChar","afterMatch","KEYWORDS$1","decimalInteger","HTML_TEMPLATE","CSS_TEMPLATE","GRAPHQL_TEMPLATE","TEMPLATE_STRING","SUBST_INTERNALS","SUBST_AND_COMMENTS","PARAMS_CONTAINS","CLASS_OR_EXTENDS","CLASS_REFERENCE","USE_STRICT","FUNCTION_DEFINITION","UPPER_CASE_CONSTANT","noneOf","FUNCTION_CALL","PROPERTY_ACCESS","GETTER_OR_SETTER","FUNC_LEAD_IN_RE","FUNCTION_VARIABLE","javascript_1","ATTRIBUTE","PUNCTUATION","LITERALS_MODE","json_1","kotlin","KEYWORDS_WITH_LABEL","VARIABLE","ANNOTATION_USE_SITE","KOTLIN_NUMBER_MODE","KOTLIN_NESTED_COMMENT","KOTLIN_PAREN_TYPE","KOTLIN_PAREN_TYPE2","kotlin_1","PSEUDO_SELECTORS","less","PSEUDO_SELECTORS$1","INTERP_IDENT_RE","RULES","VALUE_MODES","STRING_MODE","IDENT_MODE","AT_KEYWORDS","PARENS_MODE","VALUE_WITH_RULESETS","MIXIN_GUARD_MODE","RULE_MODE","AT_RULE_MODE","VAR_RULE_MODE","SELECTOR_MODE","PSEUDO_SELECTOR_MODE","less_1","lua","OPENING_LONG_BRACKET","CLOSING_LONG_BRACKET","LONG_BRACKETS","lua_1","makefile","FUNC","ASSIGNMENT","META","TARGET","makefile_1","perl","REGEX_MODIFIERS","PERL_KEYWORDS","METHOD","ATTR","STRING_CONTAINS","REGEX_DELIMS","PAIRED_DOUBLE_RE","middle","PAIRED_RE","PERL_DEFAULT_CONTAINS","perl_1","objectivec","API_CLASS","IDENTIFIER_RE","CLASS_KEYWORDS","objectivec_1","php","NOT_PERL_ETC","PASCAL_CASE_CLASS_NAME_RE","UPCASE_NAME_RE","SINGLE_QUOTED","DOUBLE_QUOTED","HEREDOC","NOWDOC","WHITESPACE","KWS","normalizeKeywords","CONSTRUCTOR_CALL","CONSTANT_REFERENCE","LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON","NAMED_ARGUMENT","PARAMS_MODE","FUNCTION_INVOKE","ATTRIBUTE_CONTAINS","php_1","phpTemplate","phpTemplate_1","plaintext_1","python","RESERVED_WORDS","PROMPT","LITERAL_BRACKET","digitpart","pointfloat","COMMENT_TYPE","python_1","pythonRepl","pythonRepl_1","NUMBER_TYPES_RE","OPERATORS_RE","PUNCTUATION_RE","r_1","rust","RAW_IDENTIFIER","NUMBER_SUFFIX","BUILTINS","rust_1","scss","PSEUDO_ELEMENTS$1","PSEUDO_CLASSES$1","scss_1","shell_1","sql","COMMENT_MODE","QUOTED_IDENTIFIER","MULTI_WORD_TYPES","NON_RESERVED_WORDS","RESERVED_FUNCTIONS","POSSIBLE_WITHOUT_PARENS","COMBOS","FUNCTIONS","OPERATOR","kws_to_regex","kw","MULTI_WORD_KEYWORDS","reduceRelevancy","exceptions","qualifyFn","sql_1","keywordWrapper","dotKeywords","optionalDotKeywords","keywordTypes","keywords","literals","precedencegroupKeywords","numberSignKeywords","builtIns","operatorHead","operatorCharacter","operator","identifierHead","identifierCharacter","identifier","typeIdentifier","keywordAttributes","availabilityKeywords","swift","BLOCK_COMMENT","DOT_KEYWORD","KEYWORD_GUARD","PLAIN_KEYWORDS","REGEX_KEYWORDS","KEYWORD","KEYWORD_MODES","BUILT_IN_GUARD","BUILT_IN","OPERATOR_GUARD","OPERATORS","ESCAPED_CHARACTER","rawDelimiter","ESCAPED_NEWLINE","INTERPOLATION","MULTILINE_STRING","SINGLE_LINE_STRING","REGEXP_CONTENTS","BARE_REGEXP_LITERAL","EXTENDED_REGEXP_LITERAL","REGEXP","IMPLICIT_PARAMETER","PROPERTY_WRAPPER_PROJECTION","IDENTIFIERS","AVAILABLE_ATTRIBUTE","KEYWORD_ATTRIBUTE","USER_DEFINED_ATTRIBUTE","TYPE","GENERIC_ARGUMENTS","TUPLE_ELEMENT_NAME","TUPLE","GENERIC_PARAMETERS","FUNCTION_PARAMETER_NAME","FUNCTION_PARAMETERS","FUNCTION_OR_MACRO","INIT_SUBSCRIPT","OPERATOR_DECLARATION","PRECEDENCEGROUP","CLASS_FUNC_DECLARATION","CLASS_VAR_DECLARATION","TYPE_DECLARATION","interpolation","submodes","swift_1","yaml","URI_CHARACTERS","KEY","TEMPLATE_VARIABLES","SINGLE_QUOTE_STRING","CONTAINER_STRING","TIMESTAMP","VALUE_CONTAINER","OBJECT","yaml_1","typescript","tsLanguage","INTERFACE","TS_SPECIFIC_KEYWORDS","DECORATOR","swapMode","replacement","indx","ATTRIBUTE_HIGHLIGHT","OPTIONAL_KEY_OR_ARGUMENT","functionDeclaration","typescript_1","vbnet","CHARACTER","MM_DD_YYYY","YYYY_MM_DD","TIME_12H","TIME_24H","DATE","DOC_COMMENT","vbnet_1","wasm","LINE_COMMENT","FUNCTION_REFERENCE","ARGUMENT","PARENS","MATH_OPERATIONS","wasm_1","require$$0","require$$1","require$$2","require$$3","require$$4","require$$5","require$$6","require$$7","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","require$$21","require$$22","require$$23","require$$24","require$$25","require$$26","require$$27","require$$28","require$$29","require$$30","require$$31","require$$32","require$$33","require$$34","require$$35","require$$36","common","VAULT_PACK_HEADER_LEN","VAULT_INDEX_HEADER_LEN","VAULT_TAG_LEN","VAULT_INDEX_MIN_SIZE","VAULT_INDEX_READ_MAX","VAULT_INDEX_WRITE_MAX","VAULT_INDEX_WARN","VAULT_KIND_PACK","VAULT_KIND_INDEX","VAULT_KEEP_GENERATIONS","VAULT_RETENTION_MS","VAULT_ENTRIES_WARN","VAULT_ENTRIES_READ_MAX","VAULT_MAX_DEPTH","VAULT_NAME_MAX","VAULT_CHUNK_LOG2","VAULT_MIN_CHUNK_LOG2","VAULT_MAX_CHUNK_LOG2","VAULT_DELETE_MAX","VAULT_UVARINT_MAX","VAULT_ENTRY_FOLDER","VAULT_ENTRY_FILE","VAULT_CONTENT_NONE","VAULT_CONTENT_STREAM","VAULT_MAGIC","VAULT_INFO_INDEX","VAULT_INFO_CONTENT","VaultFormatError","bufferView","toHex","fromHex","compareBytes","concatBytes","UTF8","UTF8_STRICT","utf8Decode","uvarint","low","ByteWriter","ByteReader","bitLength","padme","L","E","S","indexFileSize","bodyLen","validIndexFileSize","packPath","indexPath","generationHex","packDataSize","streamBodySize","vaultNameProblem","isVaultFmk","hkdfParams","deriveAes","usages","sealId","contentKey","contentId","deriveVaultKeyBits","buildPackHeader","openPack","packBytes","mapBodySpan","extents","xe","chunkSpan","joinVaultPath","splitVaultPath","cloneTree","tree","childrenOf","kids","canonicalOrder","packTableOf","depthOf","grave","packs","packPos","hexId","decodeIndexPlaintext","packEnd","flags","packCount","packUsed","entryCount","isFolder","lastName","chain","hasExt","nameLen","ck","length","extLen","parentPath","graveCount","died","emptyIndexState","liveBytesByPack","indexHeaderGeneration","dv","buildIndexHeader","checkIndexHeader","openIndexFile","VaultDamagedError","DAMAGED_RETRY_MS","loadLatestGeneration","tryOpen","defaultSleep","older","createRollbackGuard","vaultRollbackGuard","vaultChunkNonce","VaultContentError","readFileRange","fetchRange","readWholeFile","fileStream","VaultPackRetry","VaultWriteError","vaultLimitStatus","indexBytes","normalizeVaultPath","abortError","VaultWriter","clampTime","contentSize","np","chunkReader","mergeFresh","retries","deleted","sortedGrave","random","__webpack_modules__","module","__unused_webpack_exports","__webpack_require__","isCallable","tryToString","$TypeError","argument","isPossiblePrototype","$String","WeakMapHelpers","weakmap","wellKnownSymbol","defineProperty","UNSCOPABLES","ArrayPrototype","isPrototypeOf","Prototype","isObject","classof","globalThis","uncurryThisAccessor","ArrayBuffer","TypeError","O","NATIVE_ARRAY_BUFFER","arrayBufferByteLength","DataView","isDetached","uncurryThis","toIndex","notDetached","detachTransferable","PROPER_STRUCTURED_CLONE_TRANSFER","structuredClone","ArrayBufferPrototype","DataViewPrototype","slice","maxByteLength","getInt8","setInt8","arrayBuffer","newLength","preserveResizability","byteLength","newByteLength","fixedLength","newBuffer","copyLength","DESCRIPTORS","hasOwn","createNonEnumerableProperty","defineBuiltIn","defineBuiltInAccessor","InternalStateModule","enforceInternalState","getInternalState","Int8Array","Int8ArrayPrototype","Uint8ClampedArray","Uint8ClampedArrayPrototype","TypedArray","TypedArrayPrototype","ObjectPrototype","TO_STRING_TAG","TYPED_ARRAY_TAG","TYPED_ARRAY_CONSTRUCTOR","NATIVE_ARRAY_BUFFER_VIEWS","TYPED_ARRAY_TAG_REQUIRED","NAME","Constructor","TypedArrayConstructorsList","BigIntArrayConstructorsList","isView","getTypedArrayConstructor","proto","isTypedArray","aTypedArray","aTypedArrayConstructor","C","exportTypedArrayMethod","forced","TypedArrayConstructor","exportTypedArrayStaticMethod","lengthOfArrayLike","$length","toIndexedObject","toAbsoluteIndex","createMethod","IS_INCLUDES","$this","fromIndex","isArray","SILENT_ON_NON_WRITABLE_LENGTH_SET","commonAlphabet","base64Alphabet","base64UrlAlphabet","inverse","characters","anObject","iteratorClose","iterator","ENTRIES","toString","stringSlice","TO_STRING_TAG_SUPPORT","classofRaw","$Object","CORRECT_ARGUMENTS","tryGet","ownKeys","getOwnPropertyDescriptorModule","definePropertyModule","fails","F","createPropertyDescriptor","makeBuiltIn","defineGlobalProperty","simple","getBuiltInNodeModule","$ArrayBuffer","$MessageChannel","detach","WorkerThreads","buffer","$detach","transferable","EXISTS","MAX_SAFE_INTEGER","ENVIRONMENT","navigator","userAgent","process","Deno","v8","userAgentStartsWith","string","$Error","replace","TEST","arg","V8_OR_CHAKRA_STACK_ENTRY","IS_V8_OR_CHAKRA_STACK","dropEntries","copyConstructorProperties","isForced","GLOBAL","STATIC","FORCED","targetProperty","sourceProperty","exec","NATIVE_BIND","FunctionPrototype","aCallable","bind","that","test","getDescriptor","PROPER","CONFIGURABLE","uncurryThisWithBind","alphabet","IS_NODE","aFunction","getIteratorDirect","getIteratorMethod","stringHandling","getMethod","isNullOrUndefined","Iterators","ITERATOR","usingIterator","iteratorMethod","V","P","toIntegerOrInfinity","INVALID_SIZE","$RangeError","SetRecord","intSize","numSize","toObject","hasOwnProperty","getBuiltIn","createElement","dummy","Wrapper","NewTarget","NewTargetPrototype","functionToString","NATIVE_WEAK_MAP","sharedKey","OBJECT_ALREADY_INITIALIZED","WeakMap","enforce","getterFor","metadata","STATE","documentAll","feature","detection","normalize","POLYFILL","NATIVE","USE_SYMBOL_AS_UID","$Symbol","record","ITERATOR_INSTEAD_OF_RECORD","isArrayIteratorMethod","getIterator","Result","ResultPrototype","iterable","unboundFunction","AS_ENTRIES","IS_RECORD","IS_ITERATOR","INTERRUPTED","iterFn","condition","$iterator","callFn","iters","innerResult","innerError","defineBuiltIns","IteratorPrototype","createIterResultObject","iteratorCloseAll","ITERATOR_HELPER","WRAP_FOR_VALID_ITERATOR","NORMAL","THROW","setInternalState","createIteratorProxyPrototype","returnMethod","WrapForValidIteratorPrototype","IteratorHelperPrototype","nextHandler","RETURN_HANDLER_RESULT","IteratorProxy","methodName","METHOD_NAME","ExpectedError","Iterator","CLOSED","IS_PURE","BUGGY_SAFARI_ITERATORS","PrototypeOfArrayIteratorPrototype","arrayIterator","NEW_ITERATOR_PROTOTYPE","toLength","CONFIGURABLE_FUNCTION_NAME","inspectSource","CONFIGURABLE_LENGTH","TEMPLATE","MapPrototype","ceil","unsafeInt","PromiseCapability","$$resolve","$$reject","$default","definePropertiesModule","enumBugKeys","documentCreateElement","GT","LT","PROTOTYPE","SCRIPT","IE_PROTO","EmptyConstructor","scriptTag","NullProtoObjectViaActiveX","activeXDocument","temp","NullProtoObjectViaIFrame","iframe","JS","iframeDocument","NullProtoObject","Properties","__unused_webpack_module","V8_PROTOTYPE_DEFINE_BUG","objectKeys","IE8_DOM_DEFINE","toPropertyKey","$defineProperty","$getOwnPropertyDescriptor","ENUMERABLE","WRITABLE","Attributes","propertyIsEnumerableModule","internalObjectKeys","CORRECT_PROTOTYPE_GETTER","constructor","indexOf","push","$propertyIsEnumerable","NASHORN_BUG","requireObjectCoercible","aPossiblePrototype","CORRECT_SETTER","setter","pref","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","getOwnPropertySymbols","$SyntaxError","$parseInt","fromCharCode","codePoints","IS_4_HEX_DIGITS","IS_C0_CONTROL_CODE","unterminated","chr","twoChars","fourHexDigits","SetHelpers","iterate","Set","aSet","getSetRecord","iterateSet","iterateSimple","other","otherRec","SetPrototype","forEach","interruptible","createSetLike","createSetLikeWithInfinitySize","callback","baseSet","setLike","keysIter","SHARED","V8","V8_VERSION","symbol","integer","toPrimitive","prim","number","IndexedObject","trunc","isSymbol","ordinaryToPrimitive","TO_PRIMITIVE","exoticToPrim","postfix","anObjectOrUndefined","aString","base64Map","getAlphabetOption","SyntaxError","skipAsciiWhitespace","decodeBase64Chunk","throwOnExtraBits","chunkLength","triplet","writeBytes","elements","written","elementsLength","maxLength","lastChunkHandling","stringLength","remainingBytes","Uint8Array","params2","NATIVE_SYMBOL","passed","required","WeakMapPrototype","Symbol","WellKnownSymbolsStore","createWellKnownSymbol","$","$transfer","$includes","addToUnscopables","BROKEN_ON_SPARSE","BROKEN_ON_SPARSE_WITH_FROM_INDEX","setArrayLength","doesNotExceedSafeInteger","INCORRECT_TO_LENGTH","properErrorOnNonWritableLength","argCount","anInstance","createProperty","CONSTRUCTOR","NativeIterator","IteratorConstructor","defineIteratorPrototypeAccessor","notANaN","toPositiveInteger","createIteratorProxy","iteratorHelperThrowsOnInvalidIterator","iteratorHelperWithoutClosingOnEarlyError","DROP_WITHOUT_THROWING_ON_INVALID_ITERATOR","dropWithoutClosingOnEarlyError","everyWithoutClosingOnEarlyError","predicate","callWithSafeIterationClosing","FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR","filterWithoutClosingOnEarlyError","findWithoutClosingOnEarlyError","getIteratorFlattenable","throwsOnIteratorWithoutReturn","FLAT_MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR","flatMapWithoutClosingOnEarlyError","mapper","forEachWithoutClosingOnEarlyError","MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR","mapWithoutClosingOnEarlyError","someWithoutClosingOnEarlyError","TAKE_WITHOUT_THROWING_ON_INVALID_ITERATOR","takeWithoutClosingOnEarlyError","parseJSONString","JSON","Number","nativeParse","enumerableOwnProperties","IS_DIGIT","IS_NON_ZERO_DIGIT","IS_NUMBER_START","IS_WHITESPACE","PRIMITIVE","$parse","reviver","Context","endIndex","internalize","holder","unmodified","elementRecordsLen","nodeIsArray","internalizeProperty","nextIndex","fork","expectKeypair","expectElement","startIndex","fractionStartIndex","exponentStartIndex","NO_SOURCE_SUPPORT","PROPER_BASE_PARSE","isRawJSON","arraySlice","NATIVE_RAW_JSON","$stringify","charAt","charCodeAt","surrogates","leadingSurrogates","trailingSurrogates","MARK","MARK_LENGTH","WRONG_SYMBOLS_CONVERSION","ILL_FORMED_UNICODE","stringifyWithProperSymbolsConversion","replacer","$replacer","getReplacerFunction","fixIllFormedJSON","rawLength","keysLength","space","replacerFunction","rawStrings","MapHelpers","callbackfn","hasKey","$Infinity","$NaN","pow","POW_2_1023","MAX_DOUBLE","MAX_ULP","NOT_A_NUMBER","MINUS_INFINITY","PLUS_INFINITY","MINUS_ZERO","FINITE","twosum","numbers","partials","overflow","tmp","actuallyUsedPartials","newPromiseCapabilityModule","perform","Promise","ACCEPT_ARGUMENTS","promiseCapability","difference","setMethodAcceptSetLike","SET_LIKE_INCORRECT_BEHAVIOR","intersection","INCORRECT","isDisjointFrom","isSubsetOf","isSupersetOf","symmetricDifference","setMethodGetKeysBeforeCloning","union","ArrayBufferViewCore","isBigIntArray","toBigInt","PROPER_ORDER","THROW_ON_NEGATIVE_FRACTIONAL_INDEX","relativeIndex","actualIndex","numericValue","A","arrayFromConstructorAndList","$fromBase64","INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS","anUint8Array","$fromHex","throwsOnLengthTrackingView","rab","omitPadding","$Array","aWeakMap","aWeakKey","inheritIfRequired","normalizeStringArgument","DOMExceptionConstants","clearErrorStack","DOM_EXCEPTION","Error","NativeDOMException","$DOMException","DOMExceptionPrototype","argumentsLength","ERROR_HAS_STACK","DOM_EXCEPTION_HAS_STACK","BUGGY_DESCRIPTOR","FORCED_CONSTRUCTOR","PolyfilledDOMException","PolyfilledDOMExceptionPrototype","constant","constantName","validateArgumentsLength","$URLSearchParams","URLSearchParamsPrototype","append","$delete","$value","entriesLength","getAll","$has","USE_NATIVE_URL","URL","urlString","__webpack_module_cache__","moduleId","cachedModule","definition","isNodeJS","BBOX_INIT","F32_BBOX_INIT","FONT_IDENTITY_MATRIX","LINE_FACTOR","RenderingIntentFlag","AnnotationMode","AnnotationEditorPrefix","AnnotationEditorType","AnnotationEditorParamsType","PermissionFlag","TextRenderingMode","ImageKind","AnnotationType","AnnotationBorderStyleType","VerbosityLevel","OPS","DrawOPS","PasswordResponses","verbosity","setVerbosityLevel","getVerbosityLevel","unreachable","assert","_isValidProtocol","createValidAbsoluteUrl","baseUrl","dots","stringToUTF8String","absoluteUrl","updateUrlHash","allowRel","stripPath","shadow","nonSerializable","BaseException","PasswordException","UnknownErrorException","details","InvalidPDFException","ResponseException","FormatError","AbortException","bytesToString","MAX_ARGUMENT_COUNT","strBuf","chunkEnd","stringToBytes","isLittleEndian","buffer8","FeatureTest","platform","Util","dm","transform","minMax","m1","p0","p1","m0","m3","m4","m5","pI","pI1","output","r0","r1","r3","a0","a2","a1","a3","b0","b2","b1","b3","m1r0","m1r2","m2r1","m2r3","matrix","second","rect1","rect2","xLow","xHigh","yLow","yHigh","x0","y0","x1","y1","x2","y2","x3","y3","__privateMethod","_Util_static","getExtremum_fn","getExtremumOnCurve_fn","mt","tt","ttt","sqrtDelta","__privateAdd","NormalizeRegex","NormalizationMap","normalizeUnicode","p2","getUuid","AnnotationPrefix","_isValidExplicitDest","validRef","validName","argsLen","allowNull","makeArr","makeMap","makeObj","ac","MathClamp","XfaText","xfa","XfaLayer","storedData","option","linkService","isHTMLAnchorElement","parameters","rootHtml","isNotForRichText","rootDiv","textDivs","childHtml","SVG_NS","_PixelsPerInch","PixelsPerInch","fetchData","isValidFetchUrl","PageViewport","viewBox","userUnit","rotation","offsetX","offsetY","dontFlip","centerX","centerY","rotateA","rotateB","rotateC","rotateD","offsetCanvasX","offsetCanvasY","dims","RenderingCancelledException","extraDelay","isDataScheme","ii","isPdfFile","filename","getFilenameFromUrl","getPdfFilenameFromUrl","defaultFilename","newURL","pdfRegex","getLast","hashFilename","StatTimer","_started","__privateGet","longest","noContextMenu","stopEvent","PDFDateString","_regex","__privateSet","year","month","hour","minute","universalTimeRelation","offsetHour","offsetMinute","getXfaPageViewport","xfaPage","getRGBA","getRGB","rgba","getColorValues","colors","computedColor","getCurrentTransform","getCurrentTransformInverse","setLayerDimensions","div","mustFlip","mustRotate","pageHeight","useRound","widthStr","heightStr","OutputScale","pixelRatio","maxPixels","maxDim","capAreaFactor","maxAreaScale","maxWidthScale","maxHeightScale","maxScale","winPixels","SupportedImageMimeTypes","ColorScheme","CSSConstants","applyOpacity","opacity","white","RGBToHSL","HSLToRGB","hsl","computeLuminance","contrastRatio","hsl1","hsl2","lum1","lum2","contrastCache","findContrastColor","baseColor","fixedColor","cachedValue","baseHSL","fixedHSL","isFixedColorDark","minContrast","PRECISION","mid","renderRichText","container","makePathFromDrawOPS","_EditorToolbar","editor","_EditorToolbar_instances","_toolbar","_colorPicker","_editor","_buttons","_altText","_comment","_commentButtonDivider","_signatureDescriptionButton","_l10nRemove","editToolbar","_EditorToolbar_static","pointerDown_fn","position","editorType","_uiManager","button","addListenersToElement_fn","altText","divider_get","comment","beforeElement","colorPicker","signatureManager","tool","beforeSelector","focusIn_fn","focusOut_fn","EditorToolbar","FloatingToolbar","uiManager","_FloatingToolbar_instances","boxes","isLTR","getLastPoint_fn","render_fn","makeButton_fn","lastY","lastX","buttonClass","l10nId","labelL10nId","clickHandler","bindEvents","_CurrentPointers","pointerId","_pointerIds","_pointerId","_pointerType","timeStamp","_moveTimestamp","CurrentPointers","IdManager","__privateWrapper","_ImageManager","_ImageManager_instances","_baseId","image","promise","lastModified","get_fn","blobPromise","offscreen","rawData","mustRemoveAspectRatioPromise","fileReader","imageElement","imagePromise","ImageManager","CommandManager","maxSize","_commands","_locked","_maxSize","_position","mustExec","overwriteIfSameType","keepUndo","KeyboardManager","callbacks","_KeyboardManager_instances","isMac","isMacKey","self","serialize_fn","bubbles","checker","_ColorManager","RGB","ColorManager","_AnnotationEditorUIManager","viewer","viewerAlert","altTextManager","commentManager","eventBus","pdfDocument","pageColors","highlightColors","enableHighlightFloatingButton","enableUpdatedAddImage","enableNewAltTextWhenAddingImage","mlManager","editorUndoBar","supportsPinchToZoom","_AnnotationEditorUIManager_instances","_abortController","_activeEditor","_allEditableAnnotations","_allEditors","_allLayers","_savedAllLayers","_altTextManager","_annotationStorage","_changedExistingAnnotations","_commandManager","_commentManager","_copyPasteAC","_currentDrawingSession","_currentPageIndex","_deletedAnnotationsElementIds","_draggingEditors","_editorTypes","_editorsToRescale","_enableHighlightFloatingButton","_enableUpdatedAddImage","_enableNewAltTextWhenAddingImage","_filterFactory","_focusMainContainerTimeoutId","_focusManagerAC","_highlightColors","_highlightWhenShiftUp","_floatingToolbar","_idManager","_isEnabled","_isPointerDown","_isWaiting","_keyboardManagerAC","_lastActiveElement","_mainHighlightColorPicker","_missingCanvases","_mlManager","_mode","_selectedEditors","_selectedTextNode","_signatureManager","_pageColors","_showAllStates","_pdfDocument","_previousStates","_translation","_translationTimeoutId","_container","_viewer","_viewerAlert","_updateModeCapability","evt","beforeUnload_fn","addSelectionListener_fn","addDragAndDropListeners_fn","addKeyboardManager_fn","arrowChecker","textInputChecker","_self","small","big","hasHCM","isNameForHCM","colorName","firstTime","posX","posY","pageIndex","savedData","visibility","pageNumber","onEditorsRendered","layerX","layerY","pagesRotation","methodOfCreation","anchorNode","anchorOffset","focusNode","focusOffset","textLayer","getAnchorElementForSelection_fn","getLayerForTextLayer_fn","isNoneMode","annotationId","storedValue","messageId","onSelectEnd_fn","activeElement","lastEditor","lastActiveElement","removeKeyboardManager_fn","editors","serialized","clipboardData","newEditors","deserializedEditor","addEditorToLayer_fn","selectEditors_fn","oldPageIndex","newPageIndex","promises","isEditing","addFocusManager_fn","addCopyPasteListeners_fn","dispatchUpdateStates_fn","isEmpty_fn","removeFocusManager_fn","removeCopyPasteListeners_fn","types","dispatchUpdateUI_fn","editId","isFromUser","isFromKeyboard","mustEnterInEditMode","editComment","disableAll_fn","enableAll_fn","editorClass","elementIds","allComments","annotationElementId","hasComment","annotation","popupRef","contentsObj","updateButton","mustWait","lastSelectedEditor_get","ed","drawingEditor","noCommit","totalX","totalY","TIME_TO_WAIT","mustBeAddedInUndoStack","newX","newY","savedX","savedY","savedPageIndex","tx","parentWidth","parentHeight","rotator","range","editorId","currentLayer","displayFloatingToolbar_fn","selectionChange_fn","activeLayer","pointerup","AnnotationEditorUIManager","_AltText","_AltText_instances","_altTextDecorative","_altTextButton","_altTextButtonLabel","_altTextTooltip","_altTextTooltipTimeout","_altTextWasFromKeyBoard","_badge","_guessedText","_textWithDisclaimer","_useNewAltTextFlow","_l10nNewButton","l10n","label_get","setState_fn","guessedText","isForCopying","decorative","textWithDisclaimer","tooltip","DELAY_TO_SHOW_TOOLTIP","AltText","Comment","_Comment_instances","_commentStandaloneButton","_commentToolbarButton","_commentWasFromKeyBoard","_initialText","_richText","_text","_date","_deleted","_popupPosition","parentX","parentY","hasPopup","parentDimensions","richText","isStandalone","_TouchManager","isPinchingDisabled","isPinchingStopped","onPinchStart","onPinching","onPinchEnd","_TouchManager_instances","_isPinching","_isPinchingStopped","_isPinchingDisabled","_onPinchStart","_onPinching","_onPinchEnd","_pointerDownAC","_signal","_touchInfo","_touchManagerAC","_touchMoveAC","onTouchStart_fn","pointerDownAC","cancelPointerDown","onTouchMove_fn","onTouchEnd_fn","touch0","touch1","screen0X","screen0Y","screen1X","screen1Y","touchInfo","pTouch0X","pTouch0Y","pTouch1X","pTouch1Y","prevGapX","prevGapY","currGapX","currGapY","distance","pDistance","TouchManager","_AnnotationEditor","_AnnotationEditor_instances","_accessibilityData","_allResizerDivs","_disabled","_dragPointerId","_dragPointerType","_resizersDiv","_lastPointerCoords","_savedDimensions","_fakeAnnotation","_focusAC","_focusedResizerName","_hasBeenClicked","_initialRect","_isEditing","_isInEditMode","_isResizerEnabledForKeyboard","_moveInDOMTimeout","_prevDragX","_prevDragY","_telemetryTimeouts","_touchManager","_isDraggable","_zIndex","pageX","pageY","resize","fakeEditor","FakeEditor","_type","_value","stopResizing_fn","baseX","baseY","translate_fn","bx","by","_borderLineWidth","_AnnotationEditor_static","rotatePoint_fn","parentScale","toolbarButtons","editToolbarDiv","trY","blX","blY","trX","contents","addFocusListeners_fn","touchPinchStartCallback_fn","touchPinchCallback_fn","touchPinchEndCallback_fn","setUpDragSession_fn","selectOnPointerEvent_fn","shiftX","shiftY","creationDate","modificationDate","focus","innerHeight","innerWidth","_angle","timeout","createResizers_fn","children","boundResizerKeydown","resizerKeydown_fn","boundResizerBlur","resizerBlur_fn","resizerFocus_fn","firstPosition","nextFirstPosition","setResizerTabIndex_fn","resizerPointermove_fn","annotationLayer","firstElementChild","angle","getRotationMatrix_fn","resizerPointerdown_fn","savedDraggable","savedParentCursor","savedCursor","pointerUpCallback","addResizeToUndoStack_fn","resize_fn","savedWidth","savedHeight","newWidth","newHeight","minWidth","minHeight","rotationMatrix","transf","invRotationMatrix","invTransf","getPoint","getOpposite","isDiagonal","isHorizontal","oppositePoint","transfOppositePoint","oppositeX","oppositeY","ratioX","ratioY","deltaX","deltaY","screenX","screenY","lastScreenX","lastScreenY","oldDiag","_origin","prevDistance","factor","transfCenterPoint","newTransfCenterPoint","hasDraggingStarted","cancelDrag","AnnotationEditor","SEED","MASK_HIGH","MASK_LOW","MurmurHash3_64","blockCounts","tailLength","dataUint32","h1","h2","C1","C2","C1_LOW","C2_LOW","SerializableEmpty","AnnotationStorage","_AnnotationStorage_instances","_modified","_modifiedIds","_editorsMap","_storage","defaultValue","modified","setModified_fn","PrintAnnotationStorage","hasBitmap","stats","typeToEditor","numberOfEditedComments","numberOfDeletedComments","editorStats","counters","_serializable","serializable","FORCED_DEPENDENCY_LABEL","expandBBox","minX","minY","maxX","maxY","EMPTY_BBOX","BBoxReader","bboxes","coords","_bboxes","_coords","ensureDebugMetadata","CanvasBBoxTracker","operationsCount","_CanvasBBoxTracker_instances","_baseTransformStack","_clipBox","_pendingBBox","_canvasWidth","_canvasHeight","_bboxesCoords","initializeBBoxes_fn","opIdx","onSavePopped","lastSave","clipBox","bbox","preserve","dependencyLists","dependencies","depIdx","depName","fallbackIdx","getMeasure","dependencyName","dependencyNames","oldBBoxes","CanvasDependencyTracker","bboxTracker","recordDebugMetadata","_simple","_incremental","_namedDependencies","_pendingDependencies","_fontBBoxTrustworthy","_debugMetadata","_recordDebugMetadataDepenencyAfterRestore","_bboxTracker","dep","fontBBox","isBBoxTrustworthy","computedBBox","pendingDependencies","incremental","needsCleanup","_CanvasNestedDependencyTracker","dependencyTracker","ignoreBBoxes","_dependencyTracker","_opIdx","_ignoreBBoxes","_nestingLevel","_savesLevel","CanvasNestedDependencyTracker","Dependencies","_CanvasImagesTracker","_capacity","_count","_CoordsArray","newCoords","finalBBox","rotationAngle","sin","cos","finalBBoxWidth","finalBBoxHeight","sin2","cos2","cosSin","denom","CanvasImagesTracker","FontLoader","ownerDocument","styleElement","_systemFonts","nativeFontFace","styleSheet","disableFontFace","_inspectFont","loadedName","fontFace","hasFonts","completeRequest","loadingRequests","otherRequest","testFont","int32","string32","spliceString","insert","chunk1","chunk2","called","isFontReady","loadTestFontId","CFF_CHECKSUM_OFFSET","XXXX_VALUE","checksum","FontFaceObject","translatedData","inspectFont","charProcOperatorList","_fontData","objs","character","objId","cmds","CSS_FONT_INFO","SYSTEM_FONT_INFO","_FONT_INFO","FONT_INFO","PATTERN_INFO","CssFontInfo","_CssFontInfo_instances","_buffer","_decoder","readString_fn","SystemFontInfo","_SystemFontInfo_instances","styleLength","weightLength","FontInfo","_FontInfo_instances","readBoolean_fn","readNumber_fn","readArray_fn","getDataOffsets_fn","stringsLength","systemFontInfoLength","cssFontInfoLength","cssFontInfoData","systemFontInfoData","byteOffset","bitOffset","arrLen","lookupName","increment","PatternInfo","dataView","hasBBox","hasBackground","nCoord","nColor","nStop","stops","background","shadingType","bounds","FontPathInfo","getUrlProp","getDataProp","getFactoryUrlProp","isRefProxy","isNameProxy","isValidExplicitDest","LoopbackPort","_listeners","_deferred","listener","rmAbort","CallbackKind","StreamKind","onFn","wrapReason","MessageHandler","sourceName","comObj","_MessageHandler_instances","_messageAC","onMessage_fn","actionName","ah","transfers","callbackId","capability","queueingStrategy","streamId","controller","startCapability","pullCapability","cancelCapability","processStreamMessage_fn","createStreamSink_fn","streamSink","lastDesiredSize","streamController","deleteStreamController_fn","dataReason","BaseBinaryDataFactory","cMapUrl","standardFontDataUrl","wasmUrl","_errorStr","DOMBinaryDataFactory","BaseCanvasFactory","enableHWA","_enableHWA","canvasAndContext","DOMCanvasFactory","BaseFilterFactory","maps","fgColor","bgColor","filterName","newFgColor","newBgColor","keepHCM","DOMFilterFactory","docId","_DOMFilterFactory_instances","_baseUrl","__cache","__defs","_docId","_document","__hcmCache","cache_get","tableR","tableG","tableB","createTables_fn","createUrl_fn","createFilter_fn","addTransferMapConversion_fn","hcmCache_get","fgRGB","getRGB_fn","bgRGB","defs_get","addGrayConversion_fn","getSteps","tableA","addTransferMapAlphaConversion_fn","addLuminosityConversion_fn","fgGray","bgGray","newFgRGB","newBgRGB","fg","bg","newStart","newStep","mapR","mapG","mapB","bufferR","bufferG","bufferB","feColorMatrix","appendFeFunc_fn","feComponentTransfer","feFunc","rTable","gTable","bTable","aTable","require","node_utils_fetchData","NodeFilterFactory","NodeCanvasFactory","NodeBinaryDataFactory","MESH_WGSL","WebGPU","_WebGPU_instances","_initPromise","_device","_meshPipeline","_preferredFormat","initGPU_fn","shaderModule","posData","colData","vertexCount","backgroundColor","paddedWidth","paddedHeight","borderSize","device","scaleX","scaleY","posBuffer","colBuffer","uniformBuffer","bindGroup","gpuCtx","clearValue","commandEncoder","renderPass","_webGPU","initGPU","isGPUReady","loadMeshShader","drawMeshWithGPU","PathType","applyBoundingBox","BaseShadingPattern","RadialAxialShadingPattern","IR","dist","grad","firstPoint","secondPoint","colorStop","reversedStops","pathType","precision","n1","n2","ps","ownerBBox","tmpCanvas","tmpCtx","domMatrix","drawTriangle","p3","c1","c2","c3","rowSize","c1r","c1g","c1b","c2r","c2g","c2b","c3r","c3g","c3b","xa","car","cag","cab","xb","cbr","cbg","cbb","x1_","x2_","MeshShadingPattern","combinedScale","canvasFactory","boundsWidth","boundsHeight","matrixScaleX","matrixScaleY","temporaryPatternCanvas","DummyShadingPattern","getShadingPattern","PaintType","_TilingPattern","canvasGraphicsFactory","baseTransform","absXStep","absYStep","nXFirst","nXLast","nYFirst","nYLast","clippedBBox","inv","dimx","dimy","graphics","useEOFill","bboxWidth","bboxHeight","combinedScaleX","combinedScaleY","xstep","ystep","canvasWidth","canvasHeight","redrawHorizontally","redrawVertically","dimx2","dimy2","xSize","ySize","tmpCanvas2","tmpCtx2","jj","realOutputSize","clip","paintType","fillStyle","strokeStyle","TilingPattern","convertBlackAndWhiteToRGBA","srcPos","nonBlackColor","inverseDecode","black","zeroMapping","oneMapping","widthInSource","widthRemainder","xorMask","srcLength","destPos","elem","MIN_FONT_SIZE","MAX_FONT_SIZE","EXECUTION_TIME","EXECUTION_STEPS","FULL_CHUNK_HEIGHT","SCALE_MATRIX","XY","mirrorContextOperations","destCtx","cp1x","cp1y","cp2x","cp2y","drawImageAtIntegerCoords","srcImg","srcX","srcY","srcW","srcH","destX","destY","destW","destH","tlX","rTlX","tlY","rTlY","brX","rWidth","brY","rHeight","CanvasExtraState","xStrokePad","yStrokePad","intersect","putBinaryImageData","imgData","partialChunkHeight","fullChunks","totalChunks","chunkImgData","thisChunkHeight","elemsInThisChunk","dest32","dest32DataLength","fullSrcDiff","srcDiff","kEnd","kEndUnrolled","mask","srcByte","putBinaryImageMask","copyCtxState","sourceCtx","properties","resetCtxToDefault","getImageSmoothingEnabled","actualScale","LINE_CAP_STYLES","LINE_JOIN_STYLES","NORMAL_CLIP","EO_CLIP","_CanvasGraphics","canvasCtx","commonObjs","filterFactory","optionalContentConfig","markedContentStack","annotationCanvasMap","imagesTracker","_CanvasGraphics_instances","transparency","savedFillStyle","transparentCanvas","operatorList","executionStartIdx","continueCallback","stepper","operationsFilter","argsArray","fnArray","argsArrayLen","chunkOperations","endTime","steps","fnId","fnArgs","depObjId","objsPool","restoreInitialState_fn","drawFilter_fn","inverseTransform","widthScale","heightScale","scaleSteps","hs","nw","nh","readEntry","writeEntry","paintWidth","paintHeight","fillColor","isPatternFill","currentTransform","cacheKey","scaled","maskCanvas","mainKey","cachedImage","maskToCanvas","drawnWidth","drawnHeight","fillCanvas","fillCtx","scaledEntry","scaleResult","dashArray","dashPhase","flatness","states","smask","inSMaskMode","subtype","backdrop","transferMap","hasFilter","preparedEntry","srcEntry","sCtx","pCtx","scratchCanvas","dirtyBox","suspendedCtx","layerCtx","layerBox","layerOffsetX","layerOffsetY","layerWidth","layerHeight","maskCtx","maskOffsetX","maskOffsetY","maskX","maskY","outerExtraSize","tilingDims","consumePath","strokeColor","needRestore","tileIdx","fontSize","spacing","leading","fontRefName","fontObj","typeface","bold","italic","browserFontSize","rise","patternFillTransform","patternStrokeTransform","textRenderingMode","fillStrokeMode","isAddToPathSet","patternFill","patternStroke","scaledPath","getScaledPath_fn","invPatternTransform","glyphs","fontSizeScale","charSpacing","wordSpacing","fontDirection","textHScale","glyphsLength","vertical","spacingDir","defaultVMetrics","widthAdvanceScale","simpleFillText","needsFill","needsStroke","lineWidth","joinedChars","restoreNeeded","scaledX","scaledY","vmetric","vx","vy","measuredWidth","characterScaleX","scaledAccentX","scaledAccentY","charWidth","fontMatrix","isTextInvisible","spacingLength","xWidth","yWidth","llx","lly","urx","ury","renderingOpIdx","currentCtx","canvasBounds","groupCtx","currentMtx","hasOwnCanvas","viewportScale","skewX","skewY","trans","images","imgToPaint","inlineImgCanvas","absDet","normX","normY","scaledLineWidth","scaledXLineWidth","scaledYLineWidth","baseArea","saveRestore","dashes","hcmFilterId","savedFilter","CanvasGraphics","BasePDFStream","PDFStreamReader","PDFStreamRangeReader","_PDFStreamReader","_PDFStreamRangeReader","BasePDFStreamReader","BasePDFStreamRangeReader","getFilenameFromContentDispositionHeader","contentDisposition","needsEncodingFixup","toParamRegExp","rfc2616unquote","rfc5987decode","rfc2047decode","fixupEncoding","rfc2231getparam","attributePattern","textdecode","encoding","decoder","contentDispositionStr","quot","quotindex","extvalue","encodingend","charset","createHeaders","isHttp","httpHeaders","getResponseOrigin","validateRangeRequestCapabilities","responseHeaders","rangeChunkSize","disableRange","rv","extractFilenameFromHeader","createResponseError","ensureResponseOrigin","rangeOrigin","fetchUrl","withCredentials","abortController","ensureResponseStatus","getArrayBuffer","PDFFetchStream","PDFFetchStreamReader","PDFFetchStreamRangeReader","disableStream","contentLength","isRangeSupported","responseOrigin","transport_stream_getArrayBuffer","endRequests","PDFDataTransportStream","PDFDataTransportStreamReader","PDFDataTransportStreamRangeReader","_PDFDataTransportStream_instances","pdfDataRangeTransport","initialData","progressiveDone","onReceiveData_fn","rangeReader","_endRequests","contentDispositionFilename","OK_RESPONSE","PARTIAL_CONTENT_RESPONSE","network_getArrayBuffer","PDFNetworkStream","PDFNetworkStreamReader","PDFNetworkStreamRangeReader","_PDFNetworkStream_instances","_pendingRequests","pendingRequest","onStateChange_fn","onProgress_fn","xhrStatus","rangeHeader","_PDFNetworkStreamReader_instances","onHeadersReceived_fn","onDone_fn","onError_fn","fullRequestXhr","rawResponseHeaders","_PDFNetworkStreamRangeReader_instances","getReadableStream","fs","Readable","readStream","PDFNodeStream","PDFNodeStreamReader","PDFNodeStreamRangeReader","stat","readableStream","getNetworkStream","GlobalWorkerOptions","_port","_src","Metadata","parsedData","_map","_data","INTERNAL","OptionalContentGroup","renderingIntent","usage","rbGroups","_isDisplay","_isPrint","_userSet","_visible","print","internal","userSet","OptionalContentConfig","_OptionalContentConfig_instances","_cachedGetHash","_groups","_initialHash","_order","evaluateVisibilityExpression_fn","preserveRB","rbGroup","otherId","PagesMapper","_PagesMapper_instances","_pageNumberToId","_prevPageNumbers","_pagesNumber","_clipboard","_savedData","selectedPages","pagesToMove","ensureInit_fn","pageNumberToId","prevIdToPageNumber","buildIdToPageNumber_fn","movedCount","mappedPagesToMove","removedBeforeTarget","pagesNumber","remainingLen","adjustedTarget","updatePrevPageNumbers_fn","pagesToDelete","newN","newPageNumberToId","sourceIndex","destIndex","pagesToCopy","copiedPageNumbers","copiedPageIds","idToPageNumber","nCopy","pageNumbers","extractParams","includePages","pageIndices","extractedPageNumbers","usedIds","deletedPageNumbers","pasteIndex","prevPageNumbers","pasteEnd","idsIndices","oldPositions","INITIAL_DATA","dataObj","PDFObjects","_objs","MAX_TEXT_DIVS_TO_RENDER","DEFAULT_FONT_SIZE","_TextLayer","textContentSource","_TextLayer_instances","_capability","_disableProcessItems","_fontInspectorEnabled","_imagesHandler","_lang","_layoutTextParams","_pageHeight","_pageWidth","_reader","_rootContainer","_rotation","_scale","_styleCache","_textContentItemsStr","_textContentSource","_textDivs","_textDivProperties","_transform","_TextLayer_static","ensureMinFontSizeComputed_fn","_minFontSize","_pendingTextLayers","isWindows","isFirefox","processItems_fn","onBefore","getCtx_fn","layout_fn","abortEx","_ascentCache","_canvasContexts","_canvasCtxFonts","textContentItemsStr","appendText_fn","geom","textDiv","textDivProperties","fontFamily","fontHeight","fontAscent","getAscent_fn","divStyle","shouldScaleText","absScaleX","absScaleY","br","ensureCtxFont_fn","cachedAscent","ascent","descent","ratio","TextLayer","RENDERING_CANCELLED_TIMEOUT","getDocument","task","PDFDocumentLoadingTask","rangeTransport","PDFDataRangeTransport","worker","PDFWorker","docBaseUrl","cMapPacked","iccUrl","ignoreErrors","maxImageSize","isOffscreenCanvasSupported","isImageDecoderSupported","canvasMaxAreaInBytes","fontExtraProperties","enableXfa","disableAutoFetch","pdfBug","CanvasFactory","FilterFactory","BinaryDataFactory","gpuPromise","useWasm","pagesMapper","useSystemFonts","useWorkerFetch","transportFactory","docParams","transportParams","hasGPU","workerIdPromise","networkStream","NetworkStream","workerId","messageHandler","WorkerTransport","_PDFDocumentLoadingTask","_listener","PDFDocumentProxy","pdfInfo","pageIndexesToSkip","pageInfos","keepLoadedFonts","_PDFPageProxy","pageInfo","_PDFPageProxy_instances","_pendingCleanup","_pagesMapper","canvasContext","annotationMode","optionalContentConfigPromise","printAnnotationStorage","recordImages","recordOperations","intentArgs","intentState","intentPrint","recordForDebugger","shouldRecordOperations","shouldRecordImages","internalRenderTask","recordedBBoxes","tryCleanup_fn","InternalRenderTask","renderTask","operatorListChanged","opListTask","includeMarkedContent","disableNormalization","textContent","waitOn","resetStats","success","operatorListChunk","annotationStorageSerializable","modifiedIds","curCacheKey","curIntentState","renderTasks","PDFPageProxy","_PDFWorker","_PDFWorker_instances","_messageHandler","_webWorker","_workerPorts","initializeFromPort_fn","initialize_fn","cachedPort","_PDFWorker_static","mainThreadWorkerMessageHandler_get","_fakeWorkerId","_isWorkerDisabled","resolve_fn","setupFakeWorker_fn","workerSrc","terminateEarly","sendTest","testObj","WorkerMessageHandler","workerHandler","otherUrl","wrapper","loadingTask","factory","_WorkerTransport_instances","_fullReader","_methodPromises","_networkStream","_pageCache","_pagePromises","_pageRefCache","_passwordCapability","_pageIndex","isOpList","annotationStorage","modifiedIdsHash","cacheKeyBuf","terminated","sink","readyReason","isStreamingSupported","updatePassword","exportedData","exportedError","fontData","imageRef","pageProxy","imageData","cachedPromise","cacheSimpleMethod_fn","refStr","RenderTask","separateAnnots","_InternalRenderTask","useRequestAnimationFrame","_rAF","_canvasInUse","build","_ColorPicker","_ColorPicker_instances","_button","_buttonSwatch","_defaultColor","_dropdown","_dropdownWasFromKeyboard","_isMainColorPicker","_eventBus","_openDropdownAC","_l10nColor","openDropdown_fn","keyDown_fn","swatch","dropdown","getDropdownRoot_fn","colorSelect_fn","isDropdownVisible_get","ColorPicker","_BasicColorPicker","_input","_hasAlpha","colorType","colorAndOpacityType","opacityType","hasAlpha","alphaHex","BasicColorPicker","makeColorComp","scaleAndClamp","ColorConverters","G","components","BaseSVGFactory","skipDimensions","DOMSVGFactory","annotation_layer_DEFAULT_FONT_SIZE","GetElementsByNameSet","TIMEZONE_OFFSET","AnnotationElementFactory","LinkAnnotationElement","TextAnnotationElement","TextWidgetAnnotationElement","RadioButtonWidgetAnnotationElement","CheckboxWidgetAnnotationElement","PushButtonWidgetAnnotationElement","ChoiceWidgetAnnotationElement","SignatureWidgetAnnotationElement","WidgetAnnotationElement","PopupAnnotationElement","FreeTextAnnotationElement","LineAnnotationElement","SquareAnnotationElement","CircleAnnotationElement","PolylineAnnotationElement","CaretAnnotationElement","InkAnnotationElement","PolygonAnnotationElement","HighlightAnnotationElement","UnderlineAnnotationElement","SquigglyAnnotationElement","StrikeOutAnnotationElement","StampAnnotationElement","FileAttachmentAnnotationElement","AnnotationElement","_AnnotationElement","isRenderable","ignoreBorder","createQuadrilaterals","_AnnotationElement_instances","_updates","_hasBorder","_popupElement","quadPoints","inkLists","inkList","popup","newPopup","setRectEdited_fn","horizontalRadius","verticalRadius","radius","borderColor","setColor","jsName","styleName","colorArray","jsEvent","commonActions","eventProxy","rectBlX","rectBlY","rectTrX","rectTrY","svgBuffer","borderWidth","svgFactory","clipPath","rectWidth","rectHeight","popupData","skipId","fieldObj","exportValues","exportValue","domElement","triggers","currentRect","EditorAnnotationElement","_LinkAnnotationElement_instances","isBound","bindAttachment_fn","bindSetOCGState_fn","destination","overlaidText","setInternalLink_fn","resetForm","otherClickAction","resetFormFields","resetFormRefs","include","allFields","fieldIds","fieldName","allIds","attachment","elementData","baseName","eventName","valueGetter","getter","TEXT_ALIGNMENT","fontColor","computedFontSize","BORDER_SIZE","roundToOneDecimal","numberOfLines","lineHeight","isRequired","keyInStorage","maxLen","fieldFormattedValues","datetimeFormat","datetimeType","timeStep","hasDateOrTime","blurListener","formattedValue","charLimit","commitKey","_blurListener","selectionStart","selectionEnd","selStart","selEnd","combWidth","checkbox","curChecked","radio","pdfButtonValue","linkElement","selectElement","addAnEmptyEntry","fixDisplayValue","newValue","optionElement","removeEmptyEntry","noneOptionElement","getValue","isExport","multiple","selectedValues","getItems","displayValue","selectChild","indices","hasCommentManager","_PopupAnnotationElement_instances","createPopup_fn","PopupElement","titleObj","parentRect","_PopupElement_instances","_boundKeyDown","_boundHide","hide_fn","_boundShow","show_fn","_boundToggle","toggle_fn","_color","_contentsObj","_dateObj","_elements","_parentRect","_pinned","_popup","_popupAbortController","_commentButton","_commentButtonPosition","_rect","_titleObj","_wasVisible","_firstElement","_commentText","addEventListeners_fn","setCommentButtonPosition_fn","hasOwnButton","togglePopup","showPopup","hidePopup","parentContainer","updateColor_fn","updateCommentButtonPosition_fn","html_get","makePopupContent_fn","fontSize_get","fontColor_get","popupLines","popupContent","lineAttributes","setPosition_fn","useParentRect","normalizedRect","popupLeft","popupTop","lineSpan","_line","_square","square","_circle","circle","_polyline","vertices","borderStyle","points","polyline","_InkAnnotationElement_instances","_polylinesGroupElement","_polylines","getTransform_fn","thickness","underline","strikeout","_FileAttachmentAnnotationElement_instances","_trigger","download_fn","_AnnotationLayer","accessibilityManager","annotationEditorUIManager","structTreeLayer","_AnnotationLayer_instances","_accessibilityManager","_annotationCanvasMap","_editableAnnotations","_structTreeLayer","_linkService","_hasAriaAttributesFromStructTree","annotations","popupToElements","popupAnnotations","elementParams","isPopupAnnotation","addElementsToDOM_fn","setAnnotationCanvasMap_fn","contentElement","ariaAttributes","top1","bot1","mid1","top2","bot2","mid2","centerX1","centerX2","firstChild","editableAnnotation","AnnotationLayer","EOL_PATTERN","_FreeTextEditor","_FreeTextEditor_instances","_content","_editorDivId","_editModeAC","_fontSize","updateFontSize_fn","savedText","newText","extractText_fn","setText","setContent_fn","setEditorDimensions_fn","_FreeTextEditor_static","deserializeContent_fn","startContainer","startOffset","bufferBefore","bufferAfter","getNodeContent_fn","newRange","beforeLength","textPosition","serializeContent_fn","hasElementChanged_fn","setFontsize","savedFontsize","savedColor","prevChild","savedDisplay","savedVisibility","FreeTextEditor","Outline","_bbox","sx","sy","_FreeDrawOutliner","scaleFactor","innerMargin","_FreeDrawOutliner_instances","_box","_bottom","_innerMargin","_isLTR","_top","_last","_lastX","_lastY","_min","_min_dist","_scaleFactor","_thickness","_points","_MIN_DIST","_MIN","diffX","diffY","diffD","K","nX","nY","thX","thY","toSVGPathTwoPoints_fn","toSVGPathEnd_fn","toSVGPathStart_fn","outline","FreeDrawOutline","getOutlineTwoPoints_fn","N","getOutlineEnd_fn","getOutlineStart_fn","_MIN_DIFF","getLastCoords_fn","lastTop","lastBottom","lastTopX","lastTopY","lastBottomX","lastBottomY","FreeDrawOutliner","_FreeDrawOutline_instances","_outline","computeMinMax_fn","outliner","firstPointX","firstPointY","lastPointX","lastPointY","ltrCallback","bezierBbox","HighlightOutliner","_HighlightOutliner_instances","_firstPoint","_lastPoint","_verticalEdges","_intervals","EPSILON","shiftedMinX","shiftedMinY","lastEdge","lastPoint","edge","outlineVerticalEdges","breakEdge_fn","insert_fn","remove_fn","getOutlines_fn","edges","allEdges","edge1","edge2","outlines","HighlightOutline","binarySearch_fn","y4","_outlines","polygon","prevX","prevY","FreeHighlightOutliner","FreeHighlightOutline","_HighlightEditor","_HighlightEditor_instances","_anchorNode","_anchorOffset","_boxes","_clipPathId","_focusOutlines","_focusNode","_focusOffset","_highlightDiv","_highlightOutlines","_isFreeHighlight","_outlineId","_methodOfCreation","createFreeOutlines_fn","addToDrawLayer_fn","createOutlines_fn","updateThickness_fn","getRotation_fn","cleanDrawLayer_fn","mustBeSelected","drawLayer","_HighlightEditor_static","rotateBbox_fn","keydown_fn","highlightDiv","direction","setCaret_fn","endHighlight_fn","highlightMove_fn","clipPathId","serializeBoxes_fn","serializeOutlines_fn","outlinerForOutline","highlightOutlines","highlightId","setColorAndOpacity","opa","savedOpacity","savedThickness","setThickness","changeThickness_fn","HighlightEditor","DrawingOptions","_svgProperties","_DrawingEditor","_DrawingEditor_instances","_drawOutlines","_mustBeCommitted","createDrawOutlines_fn","p1Keys","_options","propertyName","_currentDraw","_drawingOptions","savedValue","updateBbox_fn","opacityName","convertToDrawSpace_fn","rotateBox_fn","drawDiv","_parentWidth","_parentHeight","_currentDrawingAC","_currentDrawingOptions","draw","drawId","lastElement","isAborted","_pageX","_pageY","_innerWidth","drawOutlines","drawingOptions","createDrawing_fn","convertToParentSpace_fn","pW","pH","parentRotation","DrawingEditor","InkDrawOutliner","_InkDrawOutliner_instances","_lines","_lastSVGPath","_lastIndex","InkDrawOutline","normalizePoint_fn","firstX","firstY","secondX","secondY","c1x","c1y","c2x","c2y","_InkDrawOutline_instances","_currentRotation","_parentScale","computeBbox_fn","serializedLines","serializedPoints","getBBoxWithNoMargin_fn","rescaleFn","newLines","oldMarginX","oldMarginY","getMarginComponents_fn","newMarginX","newMarginY","diffMarginX","diffMarginY","marginX","marginY","s1x","s1y","s2x","s2y","newParentWidth","newParentHeight","InkDrawingOptions","viewerParameters","_InkEditor","_InkEditor_instances","_drawId","stroke","InkEditor","ContourDrawOutline","BASE_HEADER_LENGTH","POINTS_PROPERTIES_NUMBER","SignatureExtractor","fontStyle","fontWeight","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","fontBoundingBoxAscent","fontBoundingBoxDescent","SCALE","uint8Buf","_SignatureExtractor_static","toUint8_fn","histogram","getHistogram_fn","guessThreshold_fn","contourList","findContours_fn","getGrayPixels_fn","bilateralFilter_fn","_PARAMETERS","mustSmooth","areContours","curves","linesAndPoints","xScale","yScale","newCurves","reducedPoints","douglasPeucker_fn","newPoints","minDiff","maxDiff","outlinesLength","bufferType","headerLength","BufferCtor","diffs","signatureData","readable","numberOfDrawings","diffsOffset","neighborIndexToId_fn","i0","j0","_neighborIdToIndex","clockwiseNonZero_fn","kk","shiftI","shiftJ","counterClockwiseNonZero_fn","nbd","lnbd","contours","ij","pix","i2","j2","isHole","contour","contour0","i1","j1","i3","j3","i4","j4","ij3","douglasPeuckerHelper_fn","ax","ay","abx","aby","nabx","naby","invS","phi","cosPhi","sinPhi","tmax","poly","partialPhi","dmax","sigmaS","sigmaR","kernelSize","kernel","sigmaS2","halfSize","rangeValues","sigmaR2","center","M","spos","originalBitmap","prevWidth","prevHeight","isteps","grayImage","SignatureOptions","DrawnSignatureOptions","_SignatureEditor","_isExtracted","_description","_signatureData","_signatureUUID","hasDescriptionStats","_isCopy","heightInPage","toolbar","outlineData","fontInfo","SignatureEditor","StampEditor","_StampEditor_instances","_bitmap","_bitmapId","_bitmapPromise","_bitmapUrl","_bitmapFile","_bitmapFileName","_canvas","_missingCanvas","_resizeTimeoutId","_isSvg","_hasBeenAddedInUndoStack","hasAltTextStats","updateAltTextData","getBitmap_fn","createCanvas_fn","bitmapId","drawBitmap_fn","maxDataDimension","maxPreviewDimension","createImageData","bitmapWidth","bitmapHeight","outputScale","scaledWidth","scaledHeight","scaleBitmap_fn","boxDim","boxDimWidth","boxDimHeight","patternCtx","dataWidth","dataHeight","offscreenCtx","missingCanvas","structParent","bitmapUrl","isSvg","accessibilityData","serializeBitmap_fn","changes","area","prevData","getBitmapFetched_fn","fromId","getBitmapDone_fn","MAX_RATIO","toUrl","isSamePageIndex","isSameAltText","_AnnotationEditorLayer","_AnnotationEditorLayer_instances","_allowClick","_annotationLayer","_clickAC","_editorFocusTimeoutId","_editors","_hadPointerDown","_isDisabling","_isEnabling","_drawingAC","_focusedElement","_textLayer","_textSelectionAC","_textLayerDblClickAC","_lastPointerDownTimestamp","editorTypes","cleanup_fn","classList","annotationElementIds","allEditorsIterator_get","clientX","clientY","lastPointerDownTimestamp","needFakeAnnotation","changedAnnotations","resetAnnotations","textLayerPointerDown_fn","currentEditorType_get","getCenterPoint_fn","createNewEditor_fn","isCentered","currentMode","relatedTarget","oldRotation","AnnotationEditorLayer","_DrawLayer","_DrawLayer_instances","_mapping","_toUpdate","isPathUpdatable","hasClip","createSVG_fn","pathId","createClipPath_fn","use","mustRemoveSelfIntersections","maskId","use1","use2","elementOrId","rootClass","updateProperties_fn","_DrawLayer_static","setBox_fn","pathElement","clipPathUse","DrawLayer","percentage","_TextLayerImages","minSize","coordinates","getPageCanvas","_TextLayerImages_instances","_coordinates","_coordinatesByElement","_getPageCanvas","_minSize","createImagePlaceholder_fn","imgElement","activeImage","_activeImage","pageCanvas","imageX1","imageY1","imageX2","imageY2","TextLayerImages","isExpired","indexes","nextAt","planCollection","repackCandidates","liveS","liveAll","VAULT_LOCK_HEADER","VaultApiError","vaultApiBase","vaultWire","createVaultApi","http","listedTime","idleMinutes","VAULT_HEARTBEAT_MS","VAULT_LOST_AFTER_MS","VAULT_IDLE_LOCK_MS","VAULT_STATE_POLL_MS","VAULT_COMMIT_EVERY_MS","realClock","VaultWriteLock","once","VaultIdleLock","onLock","vaultLockLabel","os","SEARCH_MAX","stripWire","createVaultEngine","sessions","relOf","sessionOf","toRow","kidsOf","indexSource","fetchRangeOf","newStrip","setState","syncDeadlines","lockIdle","noteHolder","commitTimeOf","how","closeAll","onVisible","onEvent","freshBeforeOpen","readBytes","again","readUrl","fr","onLockLost","ensureLock","releaseLock","VaultReadOnlyError","sinkFor","tried","labels","readOnlyWords","newWriter","packsAt","lastCommit","collect","serverNow","roomFor","planned","suggested","there","mkdir","newName","wires","toDirWire","toDir","takeOver","continueFromShown","idlePrefs","openRoots","deadline","holderName","inputId","inForce","inForceZone","STOCK_EXPIRY_DAYS","clampExpiryOptions","days","maxDays","defaultExpiryDays","validUntilLine","ttlCeilingHint","shareDetailLine","mailMissing","mailRowShown","localeCode","pathParts","titleTile","toggleSection","inherited","storageRbac","noAccount","recipientLang","recipientLangChoices","pickRecipientLang","createRole","inviteResult","groupSuggestions","searchTimer","levelLabel","levelChoices","createRoleChoices","rbacGate","peopleShown","addBlocked","sharePwd","shareExpiry","shareResult","shareErr","shareMailTo","shareMailBusy","shareMailNotice","shareKind","downloadShares","dropShares","expiryLabel","expiryOptions","expiryChoices","ttlHint","dropExpiry","shareMaxDl","maxDlOptions","maxDlChoices","shareCli","sharePs","dropPwd","dropShowAdv","dropMaxFiles","dropMaxSizeMB","dropAllowedExt","dropAskName","dropBusy","dropErr","dropResult","dropMailTo","dropMailBusy","dropMailNotice","splitEmails","reloadShares","onEmailInput","gr","pickGroup","groupOwnerAsk","grantGroup","lvl","pickUser","submitEmail","addr","inviteCreateUser","gotoShareWithMail","isGroup","groupOwnerAskName","answerGroupOwner","setLevel","changeLevel","newLevel","removeGrant","glabel","ginitial","gtitle","gkey","expiresInSeconds","toggleLink","linkOn","sendLinkMail","sendShareMail","createDropLink","drop_settings","sendDropMail","canShare","shareSheet","dropSheet","loadSheet","validUntil","primaryLink","otherDownloadShares","otherDropShares","whoLine","linkDetail","linkSummary","peopleSummary","dropSummary","nativeShare","_hoisted_132","_hoisted_137","queryEl","tagsRaw","knownTagGroups","pickTag","excludeRaw","aroundDate","aroundSpan","sizeFrom","sizeTo","sizeUnit","pathMode","SPAN_OPTIONS","modifiedChoices","typeChoices","sizeChoices","unitChoices","UNIT_FACTOR","scopeOptions","SCOPE_ICON","PATH_MODES","PEOPLE_FIXED","ownerFilterable","submitted","countError","nothingToAsk","wireQuery","counting","peopleLabel","scheduleCount","countLabel","EVERYWHERE_MIN_CHARS","EVERYWHERE_LIMIT","EVERYWHERE_DEBOUNCE_MS","SAVED_LS_KEY","SAVED_MAX","iconHtml","matchScore","sc","gotoItems","commandItems","everywhere","everywhereLoading","everywhereFailed","everywhereFailure","everywhereTimer","everywhereSeq","scheduleEverywhere","hitCrumb","hitItems","can","downloadHit","warmHit","onHitDragStart","onBackdropDragOver","onBackdropDrop","savedSearches","readSavedSearches","writeSavedSearches","saveSearch","removeSavedSearch","flat","savedItems","fileOffset","hitOffset","savedOffset","cmdOffset","confirmPassword","encryptNames","compression","solid","dictionarySizeMB","allFormats","availableFormats","formatChoices","DICTIONARY_SIZES_MB","dictionaryChoices","supportsEncryption","formatFromName","stripArchiveExtension","detected","PAD","GAP","hintCombos","STEPS","activeSteps","stepIdx","resolveSteps","spot","targetEl","stepDesc","sTop","sBottom","sLeft","sRight","clampX","clampY","midX","midY","toRight","toLeft","beside","placeRaf","onViewportChange","skip","levelHint","raise","useRecovery","recovery","pw1","pw2","rotate","rekey","hideName","purgeOthersAck","storedExample","purging","escrow","escrowOffered","escrowNote","SUPPORTED_EXTS","isSupported","onModelError","typeTile","_component_model_viewer","EPUB_STEP_TIMEOUT_MS","containerRef","toc","book","rendition","withTimeout","Epub","surface","dragStart","renderToken","cachedMermaid","ensureMermaid","myToken","svgEl","onWheel","onPointerMove","onPointerUp","_vShow","iframeRef","drawioBase","iframeSrc","pendingXml","loadXml","disabledPane","drawioOrigin","fromDrawio","bootIfReady","canvasEl","pageCount","pageDims","UTIF","ifds","ensureUtif","paint","ifd","pageLabel","layers","agPsd","ensureAgPsd","flattenLayers","psd","composite","renderedSources","renderedMarkdown","mdRenderer","ensureMd","joinSource","nb","langOk","outputText","outputImage","outputHtml","codeCount","mdCount","PAGE_SIZE","ROW_LIMIT","firstRowHeader","detectedDelim","userDelim","detectDelimiter","sample","sampleLines","semi","comma","parseWith","delim","papaparse_min","dataRows","filtered","cellOf","nx","ny","visibleRows","SLOW_LISTING_MS","currentDir","passwordNeeded","passwordError","slow","listing","slowTimer","fmtSize","stopListing","ArchiveError","archiveErrorText","totalSize","fileCount","visibleEntries","fullPath","dirPath","breadcrumbs","entryTile","ParseError","underlined","uppercase","hyphenate","ESCAPE_LOOKUP","ESCAPE_REGEX","getBaseElem","characterNodesTypes","isCharacterBox","protocolFromUrl","SETTINGS_SCHEMA","getDefaultValue","schema","defaultType","Settings","optionValue","errorCode","errorMsg","strict","trust","Style","cramped","styles","sup","fracNum","fracDen","cramp","text$1","Dc","T","Tc","Sc","SS","SSc","Style$1","scriptData","scriptFromCodepoint","codepoint","allBlocks","supportedCodepoint","doubleBrushStroke","svgPath","hLinePad","sqrtMain","extraVinculum","sqrtSize1","sqrtSize2","sqrtSize3","sqrtSize4","phasePath","sqrtTall","viewBoxHeight","vertSegment","sqrtPath","innerPath","tallDelim","midHeight","frag","markup","toText","ptPerUnit","relativeUnit","validUnit","calculateSize","sizeValue","unitOptions","makeEm","createClass","initNode","toNode","invalidAttributeNameRegex","toMarkup","Span","attribute","Anchor","Img","alt","iCombinations","SymbolNode","skew","needsSpan","escaped","SvgNode","svgNS","PathNode","pathName","alternate","LineNode","assertSymbolDomNode","assertSpan","hasHtmlDomChildren","fontMetricsData","sigmasAndXis","extraCharacterMap","setFontMetrics","fontName","getCharacterMetrics","fontMetricsBySizeIndex","getGlobalMetrics","sizeIndex","ATOMS","NON_ATOMS","symbols","defineSymbol","acceptUnicodeChar","math","main","ams","mathord","punct","textord","ligatures","mathTextSymbols","textSymbols","_ch","letters","_i2","_ch2","wideChar","_i3","_ch3","_i4","_ch4","extraLatin","_i5","_ch5","wideLatinLetterData","wideNumeralData","wideCharacterFont","codePoint","lookupSymbol","makeSymbol","symbolNode","mathsym","boldsymbol","makeOrd","isFont","fontOrFamily","wideFontName","wideFontClass","fontClasses","fontMap","retrieveTextFontName","makeFragment","_fontName","_fontName2","_fontName3","canCombine","tryCombineChars","sizeElementFromChildren","maxFontSize","makeSpan","makeSvgSpan","makeLineSpan","makeAnchor","wrapFragment","getVListChildrenAndDepth","oldChildren","_depth","currPos","makeVList","pstrutSize","pstrut","realChildren","minPos","maxPos","_child","_elem","childWrap","vlist","emptySpan","depthStrut","topStrut","vtable","makeGlue","measurement","fontShape","baseFontName","fontStylesName","svgData","staticSvg","svgNode","thinspace","mediumspace","thickspace","spacings","tightSpacings","_functions","_htmlGroupBuilders","_mathmlGroupBuilders","defineFunction","_ref","htmlBuilder","mathmlBuilder","defineFunctionBuilders","_ref2","normalizeArgument","ordargument","binLeftCanceller","binRightCanceller","styleMap$1","DomEnum","buildExpression$1","expression","isRealGroup","surrounding","buildGroup$1","glueOptions","dummyPrev","dummyNext","_traverseNonSpaceNodes","_tightSpacings$prevTy","_spacings$prevType","getTypeOfDomTree","partialGroup","checkPartialGroup","nonspace","_getOutermostNode","makeNullDelimiter","moreClasses","baseOptions","groupNode","multiplier","buildHTMLUnbreakable","strut","buildHTML","eqnNum","nobreak","tagChild","htmlNode","newDocumentFragment","MathNode","TextNode","SpaceNode","noVariantSymbols","rowLikeTypes","makeText","makeRow","getVariant","isNumberPunctuation","buildExpression","isOrdgroup","buildGroup","lastGroup","_group","lastChild","buildExpressionRow","buildMathML","texExpression","isDisplayMode","forMathmlOnly","semantics","wrapperClass","sizeStyleMap","sizeMultipliers","sizeAtStyle","Options","wantSize","oldOptions","optionsFromSettings","settings","displayWrap","buildTree","katexNode","mathMLNode","_htmlNode","buildHTMLTree","stretchyCodePoint","stretchyMathML","katexImagesData","wideAccentLabels","stretchySvg","buildSvgSpan_","viewBoxWidth","grp","numChars","_height","imgIndex","spans","_minWidth","_viewBoxHeight","_height2","numSvgChildren","widthClasses","aligns","align1","_path","_svgNode","_span","stretchyEnclose","topPad","bottomPad","totalHeight","assertNodeType","assertSymbolNodeType","typedNode","checkSymbolNodeType","getBaseSymbol","htmlBuilder$a","supSubGroup","mustShift","_getBaseSymbol$skew","_getBaseSymbol","accentBelow","clearance","accentBody","accentFull","accentWrap","mathmlBuilder$9","accentNode","NON_STRETCHY_ACCENT_REGEX","isStretchy","isShifty","parser","funcName","innerGroup","kern","paddedNode","optArgs","newOptions","upperGroup","arrowPrefix","lowerGroup","arrowBody","arrowShift","upperShift","lowerShift","arrowNode","upperNode","lowerNode","_lowerNode","htmlBuilder$9","mathmlBuilder$8","binrelClass","atom","_ref3","baseArg","shiftedArg","mclass","baseOp","supsub","cdArrowFunctionName","newCell","isStartOfArrow","isLabelEnd","endChar","cdArrow","arrowChar","leftLabel","bareArrow","sizedArrow","rightLabel","arrowGroup","arrow","parseCD","parsedRows","rowNodes","labelNum","inLabel","wrappedArrow","htmlBuilder$8","mathmlBuilder$7","breakOnTokenText","newLine","globalMap","checkControlSequence","getRHS","letCommand","macro","numArgs","delimiters","_ref4","getMetrics","styleWrap","toStyle","delimSizeMultiplier","centerSpan","makeSmallDelim","mathrmSize","makeLargeDelim","makeGlyphSpan","sizeClass","corner","makeInner","lapInEms","lap","verts","doubleVerts","makeStackedDelim","heightTotal","repeat","svgLabel","topMetrics","topHeightTotal","repeatMetrics","repeatHeightTotal","bottomMetrics","bottomHeightTotal","middleHeightTotal","middleFactor","middleMetrics","repeatCount","realHeightTotal","axisHeight","pathStr","_innerHeight","vbPad","emPad","sqrtSvg","sqrtName","pathNode","makeSqrtImage","traverseSequence","stackLargeDelimiterSequence","sizeMultiplier","spanHeight","texHeight","advanceWidth","sizeToMaxHeight","stackLargeDelimiters","stackAlwaysDelimiters","stackNeverDelimiters","makeSizedDelim","stackNeverDelimiterSequence","stackAlwaysDelimiterSequence","delimTypeToFont","delimKind","sequence","delimType","heightDepth","makeCustomSizedDelim","makeLeftRightDelim","delimiterFactor","delimiterExtend","maxDistFromAxis","delimiterSizes","checkDelimiter","symDelim","assertParsed","innerDepth","hadMiddle","leftDelim","middleDelim","isMiddle","rightDelim","colorOptions","leftNode","rightNode","textNode","middleNode","htmlBuilder$7","imgShift","isSingleChar","lineWeight","angleHeight","ruleThickness","mathmlBuilder$6","fboxsep","thk","_ref5","_ref6","_environments","defineEnvironment","_macros","defineMacro","SourceLocation","lexer","Token","endToken","getHLines","hlineInfo","nxt","validateAmsEnvironmentContext","gatherEnvironments","getAutoTag","parseArray","hskipBeforeAndAfter","addJot","arraystretch","colSeparationType","autoTag","singleRow","emptySingleRow","maxNumCols","leqno","stretch","rowGaps","hLinesBeforeRow","beginRow","endRow","cellBody","dCellStyle","envName","htmlBuilder$6","nr","nc","hlines","arraycolsep","localMultiplier","baselineskip","jot","arrayskip","arstrutHeight","arstrutDepth","setHLinePos","hlinesInGap","inrow","outrow","elt","rowGap","colDescriptions","colSep","colDescrNum","tagSpans","rw","tagSpan","_colDescr3","colDescr","firstSeparator","_colDescr","lineType","_shift","sepwidth","_colDescr$pregap","_colDescr2","colElems","_shift2","colVList","colSpan","_colDescr$postgap","_colDescr4","tableBody","vListElems","hline","lineShift","eqnNumCol","tagCol","alignMap","mathmlBuilder$5","tbl","glue","menclose","align","columnLines","prevTypeWasAlign","iStart","iEnd","_cols","rowLines","alignedHandler","separationType","isSplit","numMaths","numCols","emptyGroup","arg0","isAligned","styling","ordgroup","curMaths","pregap","symNode","colalign","nde","colAlign","environments","nameGroup","_args","endNameToken","htmlBuilder$5","mathmlBuilder$4","fontAliases","htmlBuilder$4","nstyle","dstyle","numerm","hStrut","dStrut","denomm","ruleWidth","ruleSpacing","numShift","denomShift","midShift","candidateClearance","delimSize","mathmlBuilder$3","withDelims","leftOp","rightOp","wrapWithStyle","numer","hasBarLine","continued","replaceWith","stylArray","delimFromValue","delimString","barNode","barSize","styl","textOrd","htmlBuilder$3","braceBody","vSpan","mathmlBuilder$2","trustContext","firstEquals","sizeData","totalheight","attributeStr","keyVal","mathFunction","muUnit","dimension","fix","outerMode","chooseMathStyle","assembleSupSub","supGroup","subGroup","slant","baseShift","subIsSingleCharacter","finalGroup","spacer","noSuccessor","htmlBuilder$2","hasLimits","large","stash","oval","mathmlBuilder$1","singleCharBigOps","fName","singleCharIntegrals","htmlBuilder$1","childText","isAllString","defaultRuleThickness","phantom","amount","sizingGroup","sizeFuncs","smashHeight","smashDepth","tbArg","smashedNode","theta","lineClearance","minDelimiterHeight","delimDepth","rootm","toShift","rootVList","rootVListWrap","styleMap","newStyle","styleAttributes","htmlBuilderDelegate","delegate","_delegate","isSup","builderDelegate","valueBase","valueSup","valueSub","supm","subm","supShift","subShift","isCharBox","_newOptions","minSupShift","marginRight","marginLeft","isOiint","psi","vlistElem","_vlistElem","isBrace","isOver","nodeType","_base2","_base","defaultVariant","cssSpace","regularSpace","ord","padNode","textFontFamilies","textFontWeights","textFontShapes","optionsWithFont","mpadded","makeVerb","functions","spaceRegexString","controlWordRegexString","controlSymbolRegexString","controlWordWhitespaceRegexString","controlSpaceRegexString","combiningDiacriticalMarkString","combiningDiacriticalMarksEndRegex","tokenRegexString","Lexer","char","nlIndex","Namespace","builtins","globalMacros","undefs","undef","macros","nextToken","digitToNumber","digit","newcommand","existsOK","nonexistsOK","skipIfExists","exists","argText","dotsByToken","dotsbGroups","thedots","spaceAfterDots","latexRaiseA","braketHelper","middleDouble","oldMiddle","oldMiddleDouble","midMacro","double","doubled","implicitCommands","MacroExpander","isOptional","delims","isDelimited","expandableOnly","topToken","expansion","oldStackLength","catcode","stripped","bodyLexer","unicodeSubRegEx","uSubsAndSups","unicodeAccents","unicodeSymbols","Parser","consume","oldToken","breakOnInfix","lex","numerNode","denomNode","numerBody","denomBody","symbolToken","textordArray","colorNode","superscript","subscript","prime","primes","isSub","subsupTokens","funcData","totalArgs","argType","_group2","modeName","argToken","firstToken","lastToken","isBlank","groupEnd","afterNext","nucleus","star","command","toParse","baseNode","renderToDomTree","renderToString","generateParseTree","renderError","renderToHTMLTree","__domTree","TYPED_OK","_has","fnTyped","src_offs","dest_offs","fnUntyped","utils","Z_FIXED","Z_BINARY","Z_TEXT","Z_UNKNOWN","zero","STORED_BLOCK","STATIC_TREES","DYN_TREES","MIN_MATCH","MAX_MATCH","LENGTH_CODES","L_CODES","D_CODES","BL_CODES","HEAP_SIZE","MAX_BITS","Buf_size","MAX_BL_BITS","END_BLOCK","REP_3_6","REPZ_3_10","REPZ_11_138","extra_lbits","extra_dbits","extra_blbits","bl_order","DIST_CODE_LEN","static_ltree","static_dtree","_dist_code","_length_code","base_length","base_dist","StaticTreeDesc","static_tree","extra_bits","extra_base","elems","max_length","static_l_desc","static_d_desc","static_bl_desc","TreeDesc","dyn_tree","stat_desc","d_code","put_short","send_bits","send_code","bi_reverse","bi_flush","gen_bitlen","max_code","stree","has_stree","xbits","gen_codes","bl_count","next_code","tr_static_init","init_block","bi_windup","copy_block","smaller","_n2","_m2","pqdownheap","compress_block","ltree","dtree","lc","lx","build_tree","scan_tree","prevlen","curlen","nextlen","max_count","min_count","send_tree","build_bl_tree","max_blindex","send_all_trees","lcodes","dcodes","blcodes","detect_data_type","black_mask","static_init_done","_tr_init","_tr_stored_block","stored_len","_tr_align","_tr_flush_block","opt_lenb","static_lenb","_tr_tally","trees","adler32","adler","s1","s2","adler32_1","makeTable","crc32_1","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_OK","Z_STREAM_END","Z_STREAM_ERROR","Z_DATA_ERROR","Z_BUF_ERROR","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_DEFAULT_STRATEGY","Z_DEFLATED","MAX_MEM_LEVEL","MAX_WBITS","DEF_MEM_LEVEL","MIN_LOOKAHEAD","PRESET_DICT","INIT_STATE","EXTRA_STATE","NAME_STATE","COMMENT_STATE","HCRC_STATE","BUSY_STATE","FINISH_STATE","BS_NEED_MORE","BS_BLOCK_DONE","BS_FINISH_STARTED","BS_FINISH_DONE","OS_CODE","strm","flush_pending","flush_block_only","put_byte","putShortMSB","read_buf","longest_match","cur_match","chain_length","scan","best_len","nice_match","_win","wmask","strend","scan_end1","scan_end","fill_window","_w_size","deflate_stored","max_block_size","max_start","deflate_fast","hash_head","bflush","deflate_slow","max_insert","deflate_rle","deflate_huff","Config","good_length","max_lazy","nice_length","max_chain","configuration_table","lm_init","DeflateState","deflateResetKeep","deflateReset","ret","deflateSetHeader","deflateInit2","windowBits","memLevel","strategy","deflateInit","deflate","old_flush","beg","level_flags","bstate","deflateEnd","deflateSetDictionary","dictionary","dictLength","tmpDict","deflate_1","STR_APPLY_OK","STR_APPLY_UIA_OK","_utf8len","m_pos","str_len","buf_len","buf2binstring","c_len","utf16buf","ZStream","zstream","zlib_deflate","Z_SYNC_FLUSH","Deflate","dict","deflator","deflateRaw","gzip","BAD","inffast","_in","_out","wsize","whave","wnext","s_window","hold","lcode","dcode","lmask","dmask","from_source","dolen","dodist","MAXBITS","ENOUGH_LENS","ENOUGH_DISTS","CODES","LENS","DISTS","lbase","lext","dbase","dext","inftrees","lens","lens_index","codes","table_index","work","sym","curr","huff","incr","fill","base_index","extra_index","here_bits","here_op","here_val","inflate_fast","inflate_table","Z_TREES","Z_NEED_DICT","Z_MEM_ERROR","HEAD","FLAGS","TIME","OS","EXLEN","EXTRA","HCRC","DICTID","DICT","TYPEDO","STORED","COPY_","COPY","TABLE","LENLENS","CODELENS","LEN_","LEN","LENEXT","DIST","DISTEXT","MATCH","LIT","CHECK","LENGTH","DONE","MEM","SYNC","DEF_WBITS","zswap32","InflateState","inflateResetKeep","inflateReset","inflateReset2","inflateInit2","inflateInit","virgin","lenfix","distfix","fixedtables","updatewindow","inflate","last_bits","last_op","last_val","hbuf","inf_leave","inflateEnd","inflateGetHeader","inflateSetDictionary","dictid","inflate_1","constants","GZheader","gzheader","zlib_inflate","Inflate","next_out_utf8","utf8str","allowBufError","inflator","inflateRaw","pako","pako_1","log","B","J","Q","I","R","U","idf","prfx","ifdo","noffs","buff","noff","cmpr","fo","bipp","bipl","soff","bcnt","bilen","tw","tbuff","rps","toff","bps","noc","bpp","bpl","roff","ntoff","nv","prm","getbithuff","inp","src_length","raw_width","tiff_bps","arw2","ljpeg_diff","lim","clr","imax","imin","sh","bit","dp","imgs","nikon_tree","make_decoder","mn","mdo","ver0","ver1","vpred","csize","shl","hpred","bti","nbits","zero_after_ff","bitbuf","vbits","tlen","SOI","EOI","boff","byte1","byte2","olen","rst","DQT","DHT","DRI","SOF0","SOS","joff","sosMarker","isTiled","jpgIchgFmt","jifoff","jpgIchgFmtLen","jiflen","soffTag","ycbcrss","ssx","ssy","spp","jpgresint","ooff","qtables","htables","sofpos","tmptab","tmpoff","soslen","sosoff","dlen","buffoff","jpegData","sa","d2","d3","qoff","msk","addKeys","inc","termW","termB","makeW","makeB","makeA","lensW","lensB","slen","wrd","pline","toRead","dl","is1D","tn","tln","totl","chrl","ClearCode","EoiCode","Code","OldCode","cl","nit","nil","so","debug","cnt","voff","o0","oarr","subfd","subsub","eoff","ki","qarea","intp","qi","smpls","ti","mi","gotAlpha","sufs","suff","vsns","ma","ind","cnv","imgd","xoff","yoff","xlim","ylim","tof","sof","Z","Z_FIXED$1","Z_UNKNOWN$1","zero$1","MIN_MATCH$1","MAX_MATCH$1","LENGTH_CODES$1","LITERALS$1","L_CODES$1","D_CODES$1","BL_CODES$1","HEAP_SIZE$1","MAX_BITS$1","block_mask","_tr_init$1","_tr_stored_block$1","_tr_align$1","_tr_flush_block$1","_tr_tally$1","_tr_init_1","_tr_stored_block_1","_tr_flush_block_1","_tr_tally_1","_tr_align_1","constants$2","Z_NO_FLUSH$2","Z_FULL_FLUSH$1","Z_FINISH$3","Z_BLOCK$1","Z_OK$3","Z_STREAM_END$3","Z_STREAM_ERROR$2","Z_DATA_ERROR$2","Z_BUF_ERROR$1","Z_DEFAULT_COMPRESSION$1","Z_DEFAULT_STRATEGY$1","Z_DEFLATED$2","MAX_WBITS$1","GZIP_STATE","slide_hash","HASH","min_block","deflateStateCheck","deflate$2","gzhead_extra","deflateInit_1","deflateInit2_1","deflateReset_1","deflateResetKeep_1","deflateSetHeader_1","deflate_2$1","deflateEnd_1","deflateSetDictionary_1","deflateInfo","deflate_1$2","flattenChunks","string2buf","buf2string","utf8border","toString$1","Z_NO_FLUSH$1","Z_FINISH$2","Z_OK$2","Z_STREAM_END$2","Z_DEFLATED$1","Deflate$1","flush_mode","_flush_mode","deflate$1","deflate_2","deflate_1$1","BAD$1","TYPE$1","ENOUGH_LENS$1","ENOUGH_DISTS$1","CODES$1","LENS$1","DISTS$1","Z_FINISH$1","Z_OK$1","Z_STREAM_END$1","Z_NEED_DICT$1","Z_STREAM_ERROR$1","Z_DATA_ERROR$1","Z_MEM_ERROR$1","inflateStateCheck","inflate$2","inflateReset_1","inflateReset2_1","inflateResetKeep_1","inflateInit_1","inflateInit2_1","inflate_2$1","inflateEnd_1","inflateGetHeader_1","inflateSetDictionary_1","inflateInfo","inflate_1$2","Inflate$1","last_avail_out","inflate$1","inflate_2","inflate_1$1","dctZigZag","dctCos1","dctSin1","dctCos3","dctSin3","dctCos6","dctSin6","dctSqrt2","dctSqrt1d2","maxResolutionInMP","maxMemoryUsageBytes","totalBytesAllocated","requestMemoryAllocation","increaseAmount","totalMemoryImpactBytes","exceededAmount","buildHuffmanTable","codeLengths","decodeScan","resetInterval","spectralStart","spectralEnd","successivePrev","successive","mcusPerLine","progressive","bitsData","bitsCount","readBit","nextByte","decodeHuffman","receive","receiveAndExtend","decodeBaseline","component","zz","rs","decodeDCFirst","decodeDCSuccessive","_component","eobrun","decodeACFirst","successiveACState","successiveACNextValue","decodeACSuccessive","decodeMcu","mcu","mcuRow","mcuCol","blockRow","blockCol","decodeBlock","componentsLength","decodeFn","mcuExpected","buildComponentData","blocksPerLine","blocksPerColumn","samplesPerLine","quantizeAndInverse","dataOut","dataIn","qt","t_1","v0","v1","v2","v3","v4","v7","v5","v6","t_2","scanLine","clampTo8bit","maxResolutionInPixels","readUint16","readDataBlock","prepareComponents","maxV","componentId","mcusPerColumn","blocksPerLineForMcu","blocksPerColumnForMcu","blocksToAllocate","jfif","adobe","quantizationTables","frames","huffmanTablesAC","huffmanTablesDC","fileMarker","malformedDataOffset","appData","quantizationTablesLength","quantizationTablesEnd","quantizationTableSpec","tableData","pixelsInFrame","componentsCount","qId","huffmanLength","huffmanTableSpec","codeLengthSum","huffmanValues","selectorsCount","tableSpec","successiveApproximation","nextOffset","cp","getData","colorTransform","dataLength","component1","component1Line","component2","component2Line","Y1","Y2","component3","component3Line","Cb","Cr","component4","component4Line","Ye","decodeJpeg","imageDataArray","RAW_IMAGE_DATA","fromBlendMode","toBlendMode","layerColors","largeAdditionalInfoKeys","revMap","createEnum","encode","ColorSpace","LayerMaskFlags","MaskParams","offsetForChannel","channelId","cmyk","clamp","resetImageData","alpha","imageDataToCanvas","pixelData","createCanvas","decodeBitmap","writeDataRLE","offsets","stride","ol","offsets_1","strideStart","strideEnd","lastIndex2","value1","value2","value3","countIndex","writeLast","length_1","writeDataZipWithoutPrediction","buffers","totalLength","offsets_2","deflateSync","buffers_1","createCanvasFromData","context_1","tempCanvas","initializeCanvas","createCanvasMethod","createImageDataMethod","toByteArray_1","toByteArray","fromByteArray_1","fromByteArray","revLookup","Arr","getLens","validLen","placeHoldersLen","_byteLength","curByte","tripletToBase64","encodeChunk","uint8","extraBytes","maxChunkLength","len2","charLengthInBytes","stringLengthInBytes","writeCharacter","encodeStringTo","fullCode","encodeString","continuationByte","decodeString","byte3","byte4","__assign","__rest","unitsMap","unitsMapRev","makeType","classID","nullType","fieldToExtType","fieldToArrayExtType","typeToField","channels","fieldToArrayType","fieldToType","getTypeByKey","readAsciiStringOrClassId","readInt32","readAsciiString","writeAsciiStringOrClassId","writeInt32","writeSignature","writeUint8","readDescriptorStructure","includeClass","struct","readClassStructure","itemsCount","readUint32","readSignature","readOSType","writeDescriptorStructure","classId","writeUnicodeStringWithPadding","keyCount","writeUint32","keys_1","extType","writeOSType","readReferenceStructure","itemType","readFloat64","readFloat32","readUnicodeString","enumType","high","readUint8","length_2","length_3","length_4","type1","valuesCount","readInt32LE","charsCount","readUnicodeStringWithLengthLE","ObArTypes","writeReferenceStructure","name_1","type_1","writeFloat64","writeFloat32","type_2","length_5","writeInt32LE","writeUnicodeStringWithoutLengthLE","keyID","typeID","enumValue","writeClassStructure","writeUnicodeString","readVersionAndDescriptor","writeVersionAndDescriptor","horzVrtcToXY","hv","xyToHorzVrtc","xy","descBoundsToBounds","parseUnits","boundsToDescBounds","unitsValue","parseFxObject","fx","FStl","FrFl","BlnM","parsePercent","parseColor","parseGradientContent","parsePatternContent","serializeFxObject","FrFX","unitsPercent","serializeColor","serializeGradientContent","serializePatternContent","serializeEffects","unitsPercentF","arrayKeys","arrayKeys_1","useMulti","useSingle","serializeEffectObject","value_1","effect","parseEffects","effects","masterFXSwitch","DrSh","dropShadowMulti","IrSh","innerShadowMulti","OrGl","IrGl","ebbl","SoFi","solidFillMulti","GrFl","gradientFillMulti","ChFX","frameFXMulti","parseEffectObject","parseKeyList","keyList","logMissingFeatures","denominator","numerator","animKey","animInterpStyleEnum","key_1","serializeKeyList","animInterpStyle","parseTrackList","trackList","tracks","track","stdTrackID","serializeTrackList","reportErrors","BESl","BESs","bvlT","BETE","IGSr","GrdT","gradientInterpolationMethodType","parseAngle","parseGradient","objName","objKey","unitsAngle","serializeGradient","samples_1","ClrS","samples_2","parseVectorContent","serializeVectorContent","parsePercentOrAngle","parseUnitsOrNumber","parseUnitsToNumber","expectedUnits","textGridding","Ornt","Annt","warpStyle","ESliceType","ESliceHorzAlign","ESliceVertAlign","ESliceOrigin","ESliceBGColorType","strokeStyleLineCapType","strokeStyleLineJoinType","strokeStyleLineAlignment","BlrM","BlrQ","SmBM","SmBQ","DspM","UndA","Cnvr","RplS","SphM","Wvtp","ZZTy","Dstr","Chnl","MztT","Lns","blurType","DfsM","ExtT","ExtR","FlCl","CntE","WndM","Drct","IntE","IntC","FlMd","presetKindType","resourceHandlers","resourceHandlersMap","addHandler","RESOLUTION_UNITS","MEASUREMENT_UNITS","charToNibble","byteAt","readUtf8String","writeUtf8String","readEncodedString","notAscii","writeEncodedString","ascii","captionDigest","byte","Inte","horizontalResolution","readFixedPoint32","horizontalResolutionUnit","widthUnit","verticalResolution","verticalResolutionUnit","heightUnit","writeFixedPoint32","writeUint16","printScaleStyles","readInt16","writeInt16","skipBytes","name_2","readColor","writeColor","writeAsciiString","horizontal","grid","guides","guides_1","layerComps","onionSkinsBlendModes","onionSkins","clipID","timeScope","audioLevel","frameReader","timeline","disclosure","boundsToBounds","boundsFromBounds","clamped","sliceOrigins","sliceTypes","sliceAlignments","top_1","groupName","slices_1","groupId","origin_1","associatedLayerId","name_3","left_1","top_2","right_1","bottom_1","target_1","altTag","cellTextIsHTML","horizontalAlignment","verticalAlignment","backgroundColorType","slices","bitsPerPixel","planes","dataUrl","widthBytes","sizeAfterCompression","versionInfo","_left","FrmD","checkSignature","readSection","_loop_1","writeSection","anim","supportedColorModes","colorModes","setupGrayscale","createReader","warnOrThrow","peekUint8","readUint16LE","readFixedPointPath32","readShortString","validSignatureAt","readPascalString","padTo","readUnicodeStringWithLength","signature","isValidSignature","readPsd","readOptions","bitsPerChannel","colorMode","imageResources","realignWithSignature","readLayerInfo","globalLayerMaskInfo","readGlobalLayerMaskInfo","readAdditionalLayerInfo","hasChildren","skipComposite","readImageData","layersGroup","layerGroupsEnabledId","layerCount","layerChannels","readLayerRecord","readLayerChannelImageData","channelCount","blendMode","readLayerMaskData","blendingRanges","readLayerBlendingRanges","realMask","realFlags","readBlendingRange","compositeGrayBlendSource","compositeGraphBlendDestinationRange","ranges","sourceRange","destRange","channels_1","decodeLayerImageData","resetAlpha","useImageData","throwForMissingFeatures","initializedAlpha","createImageDataBitDepth","channels_2","dataReader","maskWidth","maskHeight","maskData","readData","targetData","cmykData","cmykToRgb","pixels","bitDepth","readDataRaw","readDataRLE","readDataZip","overlayColorSpace","colorSpace1","colorSpace2","colorSpace3","colorSpace4","fixOffsets","isValid","sigOffset","fixOffsets_1","isValidAdditionalInfoSignature","u64","infoHandlersMap","indexedImageData","indexedToRgb","cmykImageData","pa","ra","invA","reverseAlpha","srcData","dstData","indexed","verifyCompatible","bytesToArray","copyChannelToPixelData","decodePredicted","compressed","prediction","decompressed","inflateSync","di","_bitDepth","lengths","extraLimit","skipEmpty","eightBytes","colorSpace","readPattern","version2","channelsCount","pixelDepth","ctop","cleft","cbottom","cright","pixelDepth2","compressionMode","cdata","ox","y_1","x_1","y_2","x_2","tempData","cdataReader","copyChannelToRGBA","bevelStyles","readBlendMode","writeBlendMode","readFixedPoint8","writeFixedPoint8","readEffects","effectsCount","version_1","blockSize","version_2","useGlobalLight","shadowInfo","version_3","version_4","version_5","strength","highlightBlendMode","shadowBlendMode","highlightColor","shadowColor","highlightOpacity","shadowOpacity","version_6","writeShadowInfo","writeEffects","dropShadow","innerShadow","outerGlow","innerGlow","bevel","solidFill","writeZeros","isWhitespace","isNumber","parseEngineData","skipWhitespace","getTextByte","getText","pushContainer","pushValue","pop","pushProperty","i_1","floatKeys","intArrays","serializeEngineData","condensed","writeString","writeIndent","writeProperty","writeValue","serializeInt","serializeFloat","serializeNumber","isFloat","getKeys","writeStringByte","inProperty","writePrefix","intArray","value_2","defaultFont","defaultParagraphStyle","defaultStyle","defaultGridInfo","paragraphStyleKeys","styleKeys","antialias","justification","upperFirst","decodeColor","encodeColor","arraysEqual","objectsEqual","findOrAddFont","decodeObject","Key","encodeObject","keys_2","decodeParagraphStyle","decodeStyle","encodeParagraphStyle","encodeStyle","deduplicateValues","identical","styleValue","runs_1","keys_3","decodeEngineData","engineData","engineDict","resourceDict","removedCharacters","photoshop","paragraphRun","run_1","styleRun","encodeEngineData","defFont","paragraphRunArray","paragraphRunLengthArray","paragraphRuns","leftLength_1","paragraphRuns_1","run_2","runLength","styleSheetData","styleRuns","styleRunArray","styleRunLengthArray","leftLength","styleRuns_1","run_3","gridInfo","WritingDirection","Procession","ShapeType","Photoshop","defaultResources","keysColor","keysStyleSheet","keysParagraph","keysStyleSheetData","keysRoot","decodeObj","decodeEngineData2","fromAtoZ","infoHandlers","addHandlerAlias","readLength64","writeLength64","leftBytes","warp","textData","textDescriptor","encodeWarp","readBezierKnot","writeBezierKnot","writeFixedPointPath32","booleanOperations","readVectorMask","vectorMask","selector","boolOp","resolution","linkedKnot","unlinkedKnot","linked","rectRadii","corners","trnf","orig","radii","hasMultiEffects","_psd","propagate","animationFrames","animationFrameFlags","timestamp","comps","artboard","placedLayerTypes","parseWarp","envelopeWarp","ys","isQuiltWarp","isQuilt","desc2","customEnvelopeWarp","meshPoints","placedLayerType","warpVersion","writePascalString","getWarpFromPlacedLayer","uint8ToFloat32","uint8ToUint32","toUint8","arrayToPoints","pointsToArray","uint8ToPoints","hrznVrtcToPoint","pointToHrznVrtc","parseFilterFXItem","Flrt","parseFilterFX","uvRadius","serializeFilterFXItem","quiltWarp","_target","_writer","flag","userMask","readRect","writeRect","major","minor","open_1","iconLocation","popupLocation","author","annotations_1","sound","lengthOffset","contentOffset","dataOffset","createLnkHandler","fileType","fileCreator","dataSize","hasFileOpenDescriptor","fileOpenDescriptor","linkedFileDescriptor","seconds","wholeSeconds","fileSize","sizeOffset","adjustmentType","readLevelsChannel","shadowInput","highlightInput","shadowOutput","highlightOutput","midtoneInput","writeLevelsChannel","defaultChannel","readCurveChannel","writeCurveChannel","channel_1","red","green","blue","readHueChannel","writeHueChannel","readColorBalance","writeColorBalance","readMixrChannel","writeMixrChannel","adjustment","colorLookupType","LUTFormatType","colorLookupOrder","grdmColorModels","hasMethod","stopsCount","opacityStopsCount","expansionCount","colorModel","readSelectiveColors","writeSelectiveColors","getTextLayersSortedByIndex","layersByIndex","engineData2","TextFrameSet","effectVersion","maxChannels","channelLength","top_3","extraLength","length2Offset","artb","cinf","createWriter","getWriterBuffer","getWriterBufferNoCopy","addSize","writeUint16LE","ensureSize","writeUnicodeStringWithoutLength","getLargestLayerSize","layers_1","getLayerDimentions","writeTotalLength","verifyBitCount","data_1","writePsd","createThumbnail","globalAlpha","maxBufferSize","addChildren","_loop_2","resourceHandlers_1","writeLayerInfo","writeGlobalLayerMaskInfo","writeAdditionalLayerInfo","layersData","getChannels","_loop_3","layerData","writeLayerMaskData","writeLayerBlendingRanges","layersData_1","layersData_2","writerBlendingRange","_loop_4","fourBytes","infoHandlers_1","children_1","resizeBuffer","newBytes","oldBytes","getMaskChannels","tempBuffer","getLayerChannels","cropImageData","croppedData","trimData","channelIds","isRowEmpty","isColEmpty","dynamicsControl","dynamicBrushShapeShapes","tipsBrushShapeShapes","toBrushType","parseDynamics","parseBrushShape","parseHeightmap","readAbr","samples","brushes","patterns","minorVersion","brushLength","brushEnd","bithDepth","brush","db","readCsh","csh","ColorMode","SectionDividerType","LayerCompCapturedInfo","ChannelID","Compression","byteArrayToBase64","readPsdInternal","writePsdInternal","writePsdUint8Array","writePsdBuffer","decodeLayerPixels","this"],"mappings":"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AAO,KACX,EACQC,EAAa,CACjB,MAAO,UACP,IAAK,OACL,SAAU,CACR,CACE,MAAO,gBACP,UAAW,UAEb/1B,EAAK,YACLu1B,EAEN,EACQS,EAAiB,CACrB,OACA,OACA,MACA,KACA,MACA,MACA,OACA,OACA,MACJ,EACQC,EAAgBj2B,EAAK,QAAQ,CACjC,OAAQ,IAAIg2B,EAAe,KAAK,GAAG,CAAC,IACpC,UAAW,EACf,CAAG,EACKE,EAAW,CACf,UAAW,WACX,MAAO,4BACP,YAAa,GACb,SAAU,CAAEl2B,EAAK,QAAQA,EAAK,WAAY,CAAE,MAAO,YAAY,CAAE,CAAC,EAClE,UAAW,CACf,EAEQz1E,EAAW,CACf,KACA,OACA,OACA,OACA,KACA,OACA,MACA,QACA,QACA,KACA,KACA,OACA,OACA,OACA,SACA,WACA,QACJ,EAEQ4rG,EAAW,CACf,OACA,OACJ,EAGQC,EAAY,CAAE,MAAO,gBAAgB,EAGrCC,EAAkB,CACtB,QACA,KACA,WACA,OACA,OACA,OACA,SACA,UACA,OACA,MACA,WACA,SACA,QACA,OACA,QACA,OACA,QACA,OACJ,EAEQC,EAAiB,CACrB,QACA,OACA,UACA,SACA,UACA,UACA,OACA,SACA,OACA,MACA,QACA,SACA,UACA,SACA,OACA,YACA,SACA,OACA,OACA,UACA,SACA,SACJ,EAEQC,EAAgB,CACpB,WACA,KACA,UACA,MACA,MACA,QACA,QACA,gBACA,WACA,UACA,eACA,YACA,aACA,YACA,WACA,UACA,aACA,OACA,UACA,SACA,SACA,SACA,UACA,KACA,KACA,QACA,YACA,SACA,QACA,UACA,UACA,OACA,OACA,QACA,MACA,SACA,OACA,QACA,QACA,SACA,SACA,QACA,SACA,SACA,OACA,UACA,SACA,aACA,SACA,UACA,WACA,QACA,OACA,SACA,QACA,QACA,WACA,UACA,OACA,MACA,WACA,aACA,QACA,OACA,cACA,UACA,SACA,MACJ,EAEQC,EAAiB,CACrB,QACA,QACA,QACA,QACA,KACA,KACA,KACA,MACA,YACA,KACA,KACA,QACA,SACA,QACA,SACA,KACA,WACA,KACA,QACA,QACA,OACA,QACA,WACA,OACA,QACA,SACA,SACA,MACA,QACA,OACA,SACA,MACA,SACA,MACA,OACA,OACA,OACA,SACA,KACA,SACA,KACA,QACA,MACA,KACA,UACA,YACA,YACA,YACA,YACA,OACA,OACA,QACA,MACA,MACA,OACA,KACA,QACA,WACA,OACA,KACA,OACA,WACA,SACA,OACA,UACA,KACA,OACA,MACA,OACA,SAEA,SACA,SACA,KACA,OACA,UACA,OACA,QACA,QACA,UACA,QACA,WACA,SACA,MACA,WACA,SACA,MACA,QACA,OACA,SACA,OACA,MACA,OACA,UAEA,MACA,QACA,SACA,SACA,QACA,MACA,SACA,KACJ,EAEE,MAAO,CACL,KAAM,OACN,QAAS,CACP,KACA,OAEF,SAAU,CACR,SAAU,wBACV,QAASjsG,EACT,QAAS4rG,EACT,SAAU,CACR,GAAGE,EACH,GAAGC,EAEH,MACA,QACA,GAAGC,EACH,GAAGC,IAGP,SAAU,CACRP,EACAj2B,EAAK,QAAO,EACZk2B,EACAH,EACAzK,EACAoK,EACAU,EACAT,EACAC,EACAC,EACAC,EACAP,EAEN,CACA,CAEA,OAAAkB,GAAiBnB,mDCjZjB,SAASv+L,EAAEipK,EAAM,CACf,MAAMwqB,EAAQxqB,EAAK,MAIb0rB,EAAsB1rB,EAAK,QAAQ,KAAM,IAAK,CAAE,SAAU,CAAE,CAAE,MAAO,MAAM,CAAE,CAAE,CAAE,EACjF02B,EAAmB,qBACnBC,EAAe,kBAEfC,EAAmB,IACrBF,EAAmB,IACnBlM,EAAM,SAASmM,CAAY,EAC3B,gBAAkBnM,EAAM,SAJC,UAI4B,EACvD,IAGIqM,EAAQ,CACZ,UAAW,OACX,SAAU,CACR,CAAE,MAAO,oBAAoB,EAC7B,CAAE,MAAO,uBAAuB,EAGtC,EAKQC,EAAU,CACd,UAAW,SACX,SAAU,CACR,CACE,MAAO,cACP,IAAK,IACL,QAAS,MACT,SAAU,CAAE92B,EAAK,gBAAgB,GAEnC,CACE,MAAO,eAXa,uDAWyB,MAC7C,IAAK,IACL,QAAS,KAEXA,EAAK,kBAAkB,CACrB,MAAO,mCACP,IAAK,qBACb,CAAO,EAEP,EAEQ+2B,EAAU,CACd,UAAW,SACX,SAAU,CACR,CAAE,MAAO,cAAc,EACvB,CAAE,MAAO,iFAAiF,EAC1F,CAAE,MAAO,kHAAkH,EAC3H,CAAE,MAAO,wDAAwD,GAEnE,UAAW,CACf,EAEQC,EAAe,CACnB,UAAW,OACX,MAAO,eACP,IAAK,IACL,SAAU,CAAE,QACR,yGACwD,EAC5D,SAAU,CACR,CACE,MAAO,OACP,UAAW,GAEbh3B,EAAK,QAAQ82B,EAAS,CAAE,UAAW,QAAQ,CAAE,EAC7C,CACE,UAAW,SACX,MAAO,SAETpL,EACA1rB,EAAK,qBAEX,EAEQisB,EAAa,CACjB,UAAW,QACX,MAAOzB,EAAM,SAASmM,CAAY,EAAI32B,EAAK,SAC3C,UAAW,CACf,EAEQi3B,EAAiBzM,EAAM,SAASmM,CAAY,EAAI32B,EAAK,SAAW,UAoFhEz1E,EAAW,CACf,QAnFiB,CACjB,MACA,OACA,QACA,OACA,WACA,UACA,KACA,OACA,OACA,SACA,MACA,UACA,OACA,KACA,SACA,WACA,WACA,SACA,SACA,SACA,gBACA,SACA,SACA,UACA,QACA,WACA,QACA,WACA,WACA,UACA,WACA,YACA,iBACA,gBAEA,UACA,UACA,WACA,gBACA,eAEA,SACJ,EAyCI,KAvCc,CACd,QACA,SACA,SACA,WACA,MACA,QACA,OACA,OACA,OACA,QACA,UACA,WACA,aACA,aACA,aACA,aACA,cACA,cACA,eACA,WACA,WACA,WACA,YACA,YACA,YACA,aAEA,QACA,SACA,YAEA,UACA,OACA,WACJ,EAKI,QAAS,kBAET,SAAU,kzBASd,EAEQ2sG,EAAsB,CAC1BF,EACAH,EACAnL,EACA1rB,EAAK,qBACL+2B,EACAD,CACJ,EAEQK,EAAqB,CAIzB,SAAU,CACR,CACE,MAAO,IACP,IAAK,KAEP,CACE,MAAO,KACP,IAAK,MAEP,CACE,cAAe,wBACf,IAAK,MAGT,SAAU5sG,EACV,SAAU2sG,EAAoB,OAAO,CACnC,CACE,MAAO,KACP,IAAK,KACL,SAAU3sG,EACV,SAAU2sG,EAAoB,OAAO,CAAE,MAAM,CAAE,EAC/C,UAAW,EAEnB,CAAK,EACD,UAAW,CACf,EAEQE,EAAuB,CAC3B,MAAO,IAAMR,EAAmB,eAAiBK,EACjD,YAAa,GACb,IAAK,QACL,WAAY,GACZ,SAAU1sG,EACV,QAAS,iBACT,SAAU,CACR,CACE,MAAOmsG,EACP,SAAUnsG,EACV,UAAW,GAEb,CACE,MAAO0sG,EACP,YAAa,GACb,SAAU,CAAEj3B,EAAK,QAAQisB,EAAY,CAAE,UAAW,gBAAgB,CAAE,CAAC,EACrE,UAAW,GAIb,CACE,UAAW,EACX,MAAO,KAET,CACE,UAAW,SACX,MAAO,KACP,IAAK,KACL,SAAU1hG,EACV,UAAW,EACX,SAAU,CACRmhG,EACA1rB,EAAK,qBACL82B,EACAC,EACAF,EAEA,CACE,MAAO,KACP,IAAK,KACL,SAAUtsG,EACV,UAAW,EACX,SAAU,CACR,OACAmhG,EACA1rB,EAAK,qBACL82B,EACAC,EACAF,MAKRA,EACAnL,EACA1rB,EAAK,qBACLg3B,EAEN,EAEE,MAAO,CACL,KAAM,IACN,QAAS,CAAE,GAAG,EACd,SAAUzsG,EAGV,kBAAmB,GACnB,QAAS,KACT,SAAU,CAAA,EAAG,OACX4sG,EACAC,EACAF,EACA,CACEF,EACA,CACE,MAAOh3B,EAAK,SAAW,KACvB,SAAUz1E,GAEZ,CACE,UAAW,QACX,cAAe,0BACf,IAAK,WACL,SAAU,CACR,CAAE,cAAe,oBAAoB,EACrCy1E,EAAK,YAGjB,CAAO,EACH,QAAS,CACP,aAAcg3B,EACd,QAASF,EACT,SAAUvsG,EAEhB,CACA,CAEA,OAAA8sG,GAAiBtgM,mDCrUjB,SAASugM,EAAIt3B,EAAM,CACjB,MAAMwqB,EAAQxqB,EAAK,MAIb0rB,EAAsB1rB,EAAK,QAAQ,KAAM,IAAK,CAAE,SAAU,CAAE,CAAE,MAAO,MAAM,CAAE,CAAE,CAAE,EACjF02B,EAAmB,qBACnBC,EAAe,kBAEfC,EAAmB,cACrBF,EAAmB,IACnBlM,EAAM,SAASmM,CAAY,EAC3B,gBAAkBnM,EAAM,SAJC,UAI4B,EACvD,IAEI+M,EAAsB,CAC1B,UAAW,OACX,MAAO,oBACX,EAKQT,EAAU,CACd,UAAW,SACX,SAAU,CACR,CACE,MAAO,cACP,IAAK,IACL,QAAS,MACT,SAAU,CAAE92B,EAAK,gBAAgB,GAEnC,CACE,MAAO,eAXa,uDAWyB,MAC7C,IAAK,IACL,QAAS,KAEXA,EAAK,kBAAkB,CACrB,MAAO,mCACP,IAAK,qBACb,CAAO,EAEP,EAEQ+2B,EAAU,CACd,UAAW,SACX,SAAU,CAER,CAAE,MACA,gVAoBF,CAAE,MACA,gKAgBJ,UAAW,CACf,EAEQC,EAAe,CACnB,UAAW,OACX,MAAO,eACP,IAAK,IACL,SAAU,CAAE,QACR,wFACuC,EAC3C,SAAU,CACR,CACE,MAAO,OACP,UAAW,GAEbh3B,EAAK,QAAQ82B,EAAS,CAAE,UAAW,QAAQ,CAAE,EAC7C,CACE,UAAW,SACX,MAAO,SAETpL,EACA1rB,EAAK,qBAEX,EAEQisB,EAAa,CACjB,UAAW,QACX,MAAOzB,EAAM,SAASmM,CAAY,EAAI32B,EAAK,SAC3C,UAAW,CACf,EAEQi3B,EAAiBzM,EAAM,SAASmM,CAAY,EAAI32B,EAAK,SAAW,UAGhEw3B,EAAoB,CACxB,UACA,UACA,MACA,SACA,MACA,gBACA,gBACA,kBACA,OACA,SACA,QACA,QACA,OACA,QACA,QACA,WACA,YACA,WACA,QACA,UACA,gBACA,YACA,YACA,YACA,WACA,WACA,UACA,SACA,KACA,kBACA,OACA,OACA,WACA,SACA,SACA,QACA,QACA,MACA,SACA,OACA,KACA,SACA,SACA,SACA,UACA,YACA,MACA,WACA,MACA,SACA,UACA,WACA,KACA,QACA,WACA,UACA,YACA,SACA,WACA,WACA,sBACA,WACA,SACA,SACA,gBACA,iBACA,SACA,SACA,eACA,WACA,OACA,eACA,QACA,mBACA,2BACA,OACA,MACA,UACA,SACA,WACA,QACA,QACA,UACA,WACA,QACA,MACA,QACJ,EAGQC,EAAiB,CACrB,OACA,OACA,WACA,WACA,UACA,SACA,QACA,MACA,OACA,QACA,OACA,UACA,WACA,SACA,QACA,QACJ,EAEQC,EAAa,CACjB,MACA,WACA,UACA,mBACA,SACA,UACA,qBACA,yBACA,qBACA,QACA,aACA,WACA,WACA,SACA,YACA,mBACA,gBACA,UACA,QACA,aACA,WACA,WACA,QACA,WACA,gBACA,gBACA,OACA,UACA,iBACA,QACA,kBACA,wBACA,cACA,MACA,gBACA,cACA,eACA,qBACA,aACA,QACA,cACA,eACA,cACA,SACA,YACA,QACA,cACA,aACA,gBACA,qBACA,qBACA,gBACA,UACA,SACA,WACA,UACA,cACJ,EAEQC,EAAiB,CACrB,QACA,MACA,OACA,QACA,WACA,OACA,OACA,QACA,SACA,OACA,OACA,MACA,OACA,MACA,OACA,OACA,UACA,OACA,WACA,OACA,MACA,OACA,QACA,OACA,UACA,UACA,QACA,OACA,QACA,SACA,SACA,SACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WACA,OACA,UACA,QACA,MACA,QACA,YACA,cACA,4BACA,aACA,cACA,SACA,SACA,SACA,SACA,SACA,OACA,OACA,MACA,SACA,UACA,OACA,UACA,QACA,MACA,OACA,WACA,UACA,OACA,SACA,MACA,SACA,QACA,SACA,SACA,SACA,SACA,SACA,UACA,SACA,UACA,UACA,UACA,UACA,UACA,SACA,SACA,OACA,MACA,OACA,YACA,gBACA,UACA,UACA,WACA,QACA,UACA,UACJ,EAaQC,EAAe,CACnB,KAAMH,EACN,QAASD,EACT,QAde,CACf,OACA,QACA,UACA,UACA,MACJ,EASI,SANe,CAAE,SAAS,EAO1B,YAAaE,CACjB,EAEQG,EAAoB,CACxB,UAAW,oBACX,UAAW,EACX,SAAU,CAER,MAAOF,CAAc,EACvB,MAAOnN,EAAM,OACX,KACA,eACA,SACA,UACA,aACA,YACAxqB,EAAK,SACLwqB,EAAM,UAAU,kBAAkB,CAAC,CACzC,EAEQ0M,EAAsB,CAC1BW,EACAb,EACAO,EACA7L,EACA1rB,EAAK,qBACL+2B,EACAD,CACJ,EAEQK,EAAqB,CAIzB,SAAU,CACR,CACE,MAAO,IACP,IAAK,KAEP,CACE,MAAO,KACP,IAAK,MAEP,CACE,cAAe,wBACf,IAAK,MAGT,SAAUS,EACV,SAAUV,EAAoB,OAAO,CACnC,CACE,MAAO,KACP,IAAK,KACL,SAAUU,EACV,SAAUV,EAAoB,OAAO,CAAE,MAAM,CAAE,EAC/C,UAAW,EAEnB,CAAK,EACD,UAAW,CACf,EAEQE,EAAuB,CAC3B,UAAW,WACX,MAAO,IAAMR,EAAmB,eAAiBK,EACjD,YAAa,GACb,IAAK,QACL,WAAY,GACZ,SAAUW,EACV,QAAS,iBACT,SAAU,CACR,CACE,MAAOlB,EACP,SAAUkB,EACV,UAAW,GAEb,CACE,MAAOX,EACP,YAAa,GACb,SAAU,CAAEhL,CAAU,EACtB,UAAW,GAIb,CACE,MAAO,KACP,UAAW,GAGb,CACE,MAAO,IACP,eAAgB,GAChB,SAAU,CACR6K,EACAC,IAKJ,CACE,UAAW,EACX,MAAO,KAET,CACE,UAAW,SACX,MAAO,KACP,IAAK,KACL,SAAUa,EACV,UAAW,EACX,SAAU,CACRlM,EACA1rB,EAAK,qBACL82B,EACAC,EACAQ,EAEA,CACE,MAAO,KACP,IAAK,KACL,SAAUK,EACV,UAAW,EACX,SAAU,CACR,OACAlM,EACA1rB,EAAK,qBACL82B,EACAC,EACAQ,MAKRA,EACA7L,EACA1rB,EAAK,qBACLg3B,EAEN,EAEE,MAAO,CACL,KAAM,MACN,QAAS,CACP,KACA,MACA,MACA,MACA,KACA,MACA,OAEF,SAAUY,EACV,QAAS,KACT,iBAAkB,CAAE,oBAAqB,UAAU,EACnD,SAAU,CAAA,EAAG,OACXT,EACAC,EACAS,EACAX,EACA,CACEF,EACA,CACE,MAAO,8NACP,IAAK,IACL,SAAUY,EACV,SAAU,CACR,OACAL,IAGJ,CACE,MAAOv3B,EAAK,SAAW,KACvB,SAAU43B,GAEZ,CACE,MAAO,CAEL,wDACA,MACA,OAEF,UAAW,CACT,EAAG,UACH,EAAG,eAGf,CAAO,CACP,CACA,CAEA,OAAAE,GAAiBR,mDCnlBjB,SAASS,EAAO/3B,EAAM,CACpB,MAAMg4B,EAAoB,CACxB,OACA,OACA,OACA,UACA,WACA,SACA,UACA,OACA,QACA,MACA,OACA,OACA,QACA,SACA,QACA,QACA,SACA,QACA,OACA,QACJ,EACQC,EAAqB,CACzB,SACA,UACA,YACA,SACA,WACA,YACA,WACA,QACA,SACA,WACA,SACA,UACA,MACA,SACA,SACJ,EACQC,EAAmB,CACvB,UACA,QACA,OACA,MACJ,EACQC,EAAkB,CACtB,WACA,KACA,OACA,QACA,OACA,QACA,QACA,QACA,WACA,KACA,OACA,QACA,WACA,SACA,UACA,QACA,MACA,UACA,OACA,KACA,WACA,KACA,YACA,WACA,KACA,OACA,YACA,MACA,WACA,MACA,WACA,SACA,UACA,YACA,SACA,WACA,SACA,MACA,SACA,SACA,SACA,SACA,aACA,SACA,SACA,SACA,OACA,QACA,MACA,SACA,YACA,SACA,QACA,UACA,OACA,WACA,OACJ,EACQC,EAAsB,CAC1B,MACA,QACA,MACA,YACA,OACA,QACA,QACA,KACA,aACA,UACA,SACA,OACA,OACA,MACA,SACA,QACA,OACA,OACA,OACA,MACA,SACA,MACA,UACA,KACA,KACA,UACA,UACA,SACA,SACA,WACA,SACA,SACA,MACA,YACA,UACA,MACA,OACA,QACA,OACA,OACJ,EAEQ7tG,EAAW,CACf,QAAS4tG,EAAgB,OAAOC,CAAmB,EACnD,SAAUJ,EACV,QAASE,CACb,EACQjM,EAAajsB,EAAK,QAAQA,EAAK,WAAY,CAAE,MAAO,qBAAsB,EAC1E+2B,EAAU,CACd,UAAW,SACX,SAAU,CACR,CAAE,MAAO,eAAgB,EACzB,CAAE,MAAO,iEAAoE,EAC7E,CAAE,MAAO,qFAA0F,GAErG,UAAW,CACf,EACQsB,EAAa,CACjB,UAAW,SACX,MAAO,4BACP,UAAW,CACf,EACQC,EAAkB,CACtB,UAAW,SACX,MAAO,KACP,IAAK,IACL,SAAU,CAAE,CAAE,MAAO,IAAI,CAAE,CAC/B,EACQC,EAAwBv4B,EAAK,QAAQs4B,EAAiB,CAAE,QAAS,KAAM,EACvE7C,EAAQ,CACZ,UAAW,QACX,MAAO,KACP,IAAK,KACL,SAAUlrG,CACd,EACQiuG,EAAcx4B,EAAK,QAAQy1B,EAAO,CAAE,QAAS,KAAM,EACnDgD,EAAsB,CAC1B,UAAW,SACX,MAAO,MACP,IAAK,IACL,QAAS,KACT,SAAU,CACR,CAAE,MAAO,MAAM,EACf,CAAE,MAAO,MAAM,EACfz4B,EAAK,iBACLw4B,EAEN,EACQE,EAA+B,CACnC,UAAW,SACX,MAAO,OACP,IAAK,IACL,SAAU,CACR,CAAE,MAAO,MAAM,EACf,CAAE,MAAO,MAAM,EACf,CAAE,MAAO,IAAI,EACbjD,EAEN,EACQkD,EAAqC34B,EAAK,QAAQ04B,EAA8B,CACpF,QAAS,KACT,SAAU,CACR,CAAE,MAAO,MAAM,EACf,CAAE,MAAO,MAAM,EACf,CAAE,MAAO,IAAI,EACbF,EAEN,CAAG,EACD/C,EAAM,SAAW,CACfiD,EACAD,EACAH,EACAt4B,EAAK,iBACLA,EAAK,kBACL+2B,EACA/2B,EAAK,oBACT,EACEw4B,EAAY,SAAW,CACrBG,EACAF,EACAF,EACAv4B,EAAK,iBACLA,EAAK,kBACL+2B,EACA/2B,EAAK,QAAQA,EAAK,qBAAsB,CAAE,QAAS,IAAI,CAAE,CAC7D,EACE,MAAM44B,EAAS,CAAE,SAAU,CACzBP,EACAK,EACAD,EACAH,EACAt4B,EAAK,iBACLA,EAAK,iBACT,CAAG,EAEK64B,EAAmB,CACvB,MAAO,IACP,IAAK,IACL,SAAU,CACR,CAAE,cAAe,QAAQ,EACzB5M,EAEN,EACQ6M,EAAgB94B,EAAK,SAAW,KAAOA,EAAK,SAAW,aAAeA,EAAK,SAAW,iBACtF+4B,EAAgB,CAGpB,MAAO,IAAM/4B,EAAK,SAClB,UAAW,CACf,EAEE,MAAO,CACL,KAAM,KACN,QAAS,CACP,KACA,MAEF,SAAUz1E,EACV,QAAS,KACT,SAAU,CACRy1E,EAAK,QACH,MACA,IACA,CACE,YAAa,GACb,SAAU,CACR,CACE,UAAW,SACX,SAAU,CACR,CACE,MAAO,MACP,UAAW,GAEb,CAAE,MAAO,UAAU,EACnB,CACE,MAAO,MACP,IAAK,UAOjBA,EAAK,oBACLA,EAAK,qBACL,CACE,UAAW,OACX,MAAO,IACP,IAAK,IACL,SAAU,CAAE,QAAS,qFAAqF,GAE5G44B,EACA7B,EACA,CACE,cAAe,kBACf,UAAW,EACX,IAAK,QACL,QAAS,UACT,SAAU,CACR,CAAE,cAAe,aAAa,EAC9B9K,EACA4M,EACA74B,EAAK,oBACLA,EAAK,uBAGT,CACE,cAAe,YACf,UAAW,EACX,IAAK,QACL,QAAS,SACT,SAAU,CACRisB,EACAjsB,EAAK,oBACLA,EAAK,uBAGT,CACE,cAAe,SACf,UAAW,EACX,IAAK,QACL,QAAS,SACT,SAAU,CACRisB,EACA4M,EACA74B,EAAK,oBACLA,EAAK,uBAGT,CAEE,UAAW,OACX,MAAO,oBACP,aAAc,GACd,IAAK,MACL,WAAY,GACZ,SAAU,CACR,CACE,UAAW,SACX,MAAO,IACP,IAAK,OAIX,CAGE,cAAe,8BACf,UAAW,GAEb,CACE,UAAW,WACX,MAAO,IAAM84B,EAAgB,SAAW94B,EAAK,SAAW,wBACxD,YAAa,GACb,IAAK,WACL,WAAY,GACZ,SAAUz1E,EACV,SAAU,CAER,CACE,cAAe0tG,EAAmB,KAAK,GAAG,EAC1C,UAAW,GAEb,CACE,MAAOj4B,EAAK,SAAW,wBACvB,YAAa,GACb,SAAU,CACRA,EAAK,WACL64B,GAEF,UAAW,GAEb,CAAE,MAAO,MAAM,EACf,CACE,UAAW,SACX,MAAO,KACP,IAAK,KACL,aAAc,GACd,WAAY,GACZ,SAAUtuG,EACV,UAAW,EACX,SAAU,CACRquG,EACA7B,EACA/2B,EAAK,uBAGTA,EAAK,oBACLA,EAAK,uBAGT+4B,EAEN,CACA,CAEA,OAAAC,GAAiBjB,mDC3ZjB,MAAMn1F,EAASo9D,IACN,CACL,UAAW,CACT,MAAO,OACP,MAAO,cAET,cAAeA,EAAK,qBACpB,SAAU,CACR,MAAO,SACP,MAAO,mDAET,kBAAmB,CACjB,UAAW,WACX,MAAO,gBAET,wBAAyB,CACvB,MAAO,gBACP,MAAO,KACP,IAAK,KACL,QAAS,IACT,SAAU,CACRA,EAAK,iBACLA,EAAK,oBAGT,gBAAiB,CACf,MAAO,SACP,MAAOA,EAAK,UAAY,kGASxB,UAAW,GAEb,aAAc,CACZ,UAAW,OACX,MAAO,4BAEb,GAGMi5B,EAAY,CAChB,IACA,OACA,UACA,UACA,QACA,QACA,IACA,aACA,OACA,SACA,SACA,UACA,OACA,OACA,KACA,MACA,UACA,MACA,MACA,KACA,KACA,KACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,SACA,SACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,OACA,MACA,SACA,KACA,WACA,SACA,IACA,UACA,IACA,QACA,OACA,UACA,SACA,SACA,OACA,SACA,UACA,MACA,QACA,QACA,KACA,WACA,QACA,KACA,QACA,OACA,KACA,KACA,MACA,OACF,EAEMC,EAAW,CACf,OACA,IACA,SACA,OACA,UACA,MACA,SACA,SACA,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,UACA,iBACA,UACA,UACA,eACA,WACA,qBACA,SACA,eACA,iBACA,iBACA,OACA,SACA,UACA,QACA,OACA,OACA,UACA,WACA,OACA,OACA,MACA,WACA,QACA,gBACA,UACF,EAEMC,EAAO,CACX,GAAGF,EACH,GAAGC,CACL,EAKME,EAAiB,CACrB,YACA,cACA,eACA,QACA,cACA,cACA,sBACA,gBACA,eACA,eACA,gBACA,OACA,SACA,QACA,kBACA,aACA,cACA,iBACA,kBACA,UACA,uBACA,mBACA,yBACA,+BACA,aACA,OACA,YACA,SACA,QAEA,YACA,YACA,aACA,YACF,EAAE,KAAI,EAAG,QAAO,EAGVC,EAAiB,CACrB,SACA,WACA,QACA,UACA,UACA,UACA,UACA,MACA,WACA,OACA,QACA,UACA,QACA,cACA,gBACA,aACA,SACA,QACA,gBACA,eACA,MACA,OACA,eACA,QACA,gBACA,WACA,UACA,KACA,OACA,aACA,eACA,OACA,OACA,aACA,MACA,YACA,UACA,iBACA,eACA,mBACA,cACA,aACA,eACA,WACA,eACA,OACA,oBACA,YACA,aACA,WACA,QACA,OACA,QACA,SACA,gBACA,eACA,QACA,UACA,OACF,EAAE,KAAI,EAAG,QAAO,EAGVC,EAAkB,CACtB,QACA,WACA,SACA,MACA,aACA,eACA,aACA,gBACA,SACA,OACA,cACA,YACA,UACA,gBACF,EAAE,KAAI,EAAG,QAAO,EAEVC,EAAa,CACjB,eACA,gBACA,cACA,aACA,qBACA,MACA,cACA,YACA,wBACA,kBACA,sBACA,qBACA,sBACA,4BACA,iBACA,uBACA,kBACA,sBACA,wBACA,qBACA,4BACA,aACA,eACA,kBACA,sBACA,aACA,wBACA,wBACA,kBACA,mBACA,mBACA,oBACA,sBACA,wBACA,wBACA,oBACA,kBACA,iBACA,aACA,SACA,eACA,qBACA,mBACA,yBACA,yBACA,yBACA,qBACA,2BACA,2BACA,2BACA,qBACA,qBACA,gBACA,sBACA,4BACA,6BACA,sBACA,sBACA,kBACA,eACA,wBACA,0BACA,eACA,sBACA,sBACA,qBACA,sBACA,qBACA,gBACA,sBACA,oBACA,0BACA,0BACA,0BACA,sBACA,4BACA,4BACA,4BACA,sBACA,sBACA,cACA,oBACA,oBACA,oBACA,gBACA,eACA,qBACA,qBACA,qBACA,iBACA,0BACA,4BACA,eACA,aACA,mBACA,yBACA,0BACA,mBACA,mBACA,eACA,SACA,YACA,uBACA,gBACA,WACA,iBACA,YACA,oBACA,aACA,WACA,aACA,aACA,cACA,eACA,eACA,eACA,cACA,QACA,OACA,YACA,YACA,QACA,sBACA,8BACA,gBACA,kBACA,eACA,eACA,cACA,aACA,cACA,oBACA,oBACA,oBACA,cACA,eACA,UACA,UACA,+BACA,2BACA,gCACA,yBACA,0BACA,YACA,iBACA,iBACA,UACA,qBACA,oBACA,gBACA,cACA,MACA,YACA,aACA,SACA,KACA,KACA,YACA,UACA,oBACA,cACA,oBACA,eACA,OACA,eACA,YACA,SACA,OACA,aACA,iBACA,YACA,YACA,cACA,YACA,QACA,cACA,gBACA,OACA,OACA,eACA,cACA,wBACA,eACA,yBACA,sBACA,eACA,YACA,mBACA,cACA,iBACA,eACA,aACA,iBACA,0BACA,4BACA,uBACA,wBACA,eACA,0BACA,oBACA,0BACA,qBACA,yBACA,uBACA,wBACA,0BACA,cACA,sBACA,MACA,+BACA,6BACA,OACA,YACA,oBACA,iBACA,iBACA,cACA,kBACA,oBACA,WACA,WACA,eACA,iBACA,gBACA,sBACA,wBACA,qBACA,sBACA,SACA,sBACA,wBACA,UACA,OACA,oBACA,kBACA,mBACA,WACA,iBACA,uBACA,cACA,QACA,aACA,cACA,kBACA,oBACA,eACA,mBACA,qBACA,YACA,kBACA,gBACA,eACA,UACA,OACA,iBACA,iBACA,aACA,cACA,mBACA,aACA,mBACA,sBACA,kBACA,SACA,eACA,mBACA,qBACA,gBACA,gBACA,oBACA,sBACA,cACA,eACA,aACA,cACA,SACA,aACA,aACA,eACA,QACA,OACA,cACA,mBACA,qBACA,qBACA,oBACA,qBACA,oBACA,YACA,iBACA,aACA,YACA,cACA,gBACA,cACA,YACA,YACA,oBACA,aACA,aACA,aACA,iBACA,aACA,kBACA,YACA,iBACA,aACA,kBACA,YACA,iBACA,WACA,YACA,WACA,YACA,SACA,OACA,SACA,aACA,kBACA,SACA,gBACA,kBACA,cACA,kBACA,gBACA,UACA,QACA,UACA,UACA,gBACA,iBACA,gBACA,gBACA,WACA,kBACA,iBACA,uBACA,kBACA,gBACA,aACA,aACA,UACA,sBACA,4BACA,6BACA,wBACA,wBACA,UACA,gBACA,oBACA,sBACA,iBACA,iBACA,qBACA,uBACA,eACA,gBACA,cACA,OACA,mBACA,oBACA,oBACA,cACA,QACA,cACA,eACA,cACA,qBACA,gBACA,cACA,aACA,iBACA,WACA,kBACA,sBACA,qBACA,SACA,IACA,SACA,OACA,aACA,cACA,QACA,SACA,UACA,aACA,gBACA,QACA,kBACA,gBACA,sBACA,0BACA,4BACA,uBACA,uBACA,2BACA,6BACA,qBACA,sBACA,oBACA,iBACA,uBACA,2BACA,6BACA,wBACA,wBACA,4BACA,8BACA,sBACA,uBACA,qBACA,oBACA,mBACA,mBACA,kBACA,uBACA,uBACA,kBACA,mBACA,kBACA,wBACA,eACA,gBACA,kBACA,QACA,WACA,MACA,aACA,eACA,SACA,mBACA,oBACA,iBACA,kBACA,oBACA,iBACA,eACA,WACA,eACA,aACA,iBACA,kBACA,cACA,uBACA,kBACA,wBACA,uBACA,uBACA,2BACA,wBACA,4BACA,gBACA,sBACA,yBACA,sBACA,cACA,eACA,mBACA,gBACA,iBACA,cACA,mBACA,iBACA,wBACA,0BACA,YACA,iBACA,kBACA,iBACA,MACA,eACA,YACA,gBACA,mBACA,kBACA,aACA,sBACA,mBACA,sBACA,sBACA,6BACA,YACA,eACA,cACA,cACA,gBACA,iBACA,gBACA,qBACA,sBACA,qBACA,uBACA,aACA,gBACA,iBACA,eACA,cACA,cACA,aACA,eACA,eACA,cACA,uBACA,SACA,QACA,cACA,aACA,eACA,YACA,eACA,IACA,IACA,UACA,MACF,EAAE,KAAI,EAAG,QAAO,EAUhB,SAAS92F,EAAIu9D,EAAM,CACjB,MAAMwqB,EAAQxqB,EAAK,MACb9/F,EAAQ0iC,EAAMo9D,CAAI,EAClBw5B,EAAgB,CAAE,MAAO,8BAA8B,EACvDC,EAAe,kBACfC,EAAiB,oBACjBhP,EAAW,0BACXoM,EAAU,CACd92B,EAAK,iBACLA,EAAK,iBACT,EAEE,MAAO,CACL,KAAM,MACN,iBAAkB,GAClB,QAAS,UACT,SAAU,CAAE,iBAAkB,SAAS,EACvC,iBAAkB,CAGhB,iBAAkB,cAAc,EAClC,SAAU,CACR9/F,EAAM,cACNs5H,EAGAt5H,EAAM,gBACN,CACE,UAAW,cACX,MAAO,kBACP,UAAW,GAEb,CACE,UAAW,iBACX,MAAO,MAAQwqH,EACf,UAAW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AM,SAAW6F,EACjBD,EAAO,SAAWC,EASlB,MAAMC,EAAc,CAClB,CACE,MAAO,SACP,OAAQ,CACN,IAAK,IACL,SAAUD,IAGd,CACE,UAAW,cACX,MAAO,KAfW,QAeY,IAbX,kCAakC,IAZtC,iDAYyD,WACxE,OAAQ,CACN,IAAK,IACL,SAAUP,EACV,SAAUO,GAGlB,EAEE,OAAAJ,EAAc,QAAQD,CAAU,EAEzB,CACL,KAAM,OACN,QAAS,CACP,KACA,UACA,UACA,OACA,OAEF,SAAUF,EACV,QAAS,OACT,SAAU,CAAE/6B,EAAK,QAAQ,CAAE,OAAQ,MAAM,CAAE,CAAC,EACzC,OAAOu7B,CAAW,EAClB,OAAOL,CAAa,EACpB,OAAOI,CAAqB,CACnC,CACA,CAEA,OAAAE,GAAiBb,mDCtbjB,SAAS1vI,EAAG+0G,EAAM,CAyEhB,MAAMz1E,EAAW,CACf,QA5BU,CACV,QACA,OACA,OACA,QACA,WACA,UACA,QACA,OACA,cACA,MACA,OACA,KACA,OACA,KACA,SACA,YACA,MACA,UACA,QACA,SACA,SACA,SACA,SACA,OACA,KACJ,EAGI,KAnDY,CACZ,OACA,OACA,YACA,aACA,QACA,UACA,UACA,OACA,QACA,QACA,QACA,SACA,QACA,SACA,SACA,SACA,MACA,OACA,UACA,MACJ,EA+BI,QA3Ee,CACf,OACA,QACA,OACA,KACJ,EAuEI,SAtEgB,CAChB,SACA,MACA,QACA,UACA,OACA,OACA,MACA,OACA,MACA,QACA,QACA,UACA,OACA,UACA,QACJ,CAuDA,EACE,MAAO,CACL,KAAM,KACN,QAAS,CAAE,QAAQ,EACnB,SAAUA,EACV,QAAS,KACT,SAAU,CACRy1E,EAAK,oBACLA,EAAK,qBACL,CACE,UAAW,SACX,SAAU,CACRA,EAAK,kBACLA,EAAK,iBACL,CACE,MAAO,IACP,IAAK,OAIX,CACE,UAAW,SACX,SAAU,CACR,CACE,MAAO,6DACP,UAAW,GAEb,CACE,MAAO,sFACP,UAAW,GAEb,CACE,MAAO,wBACP,UAAW,GAEb,CACE,MAAO,uCACP,UAAW,GAEb,CACE,MAAO,wDACP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/L,EAAQ,CAAC,CAC9C,CACH,CAGA,SAASm/L,EAAK78B,EAAM,CAClB,MAAMwqB,EAAQxqB,EAAK,MACb88B,EAAgB,iCAChBC,EAAmBD,EACrBH,EAAW,OAASG,EAAgB,kBAAoBA,EAAgB,WAAY,OAAQ,CAAC,EAsE3FvyG,EAAW,CACf,QAtEoB,CACpB,eACA,WACA,UACA,MACA,SACA,KACA,SACA,MACA,QACA,WACA,UACA,YACA,SACA,SACA,QACA,OACA,OACA,OACA,QACA,YACA,QACA,aACA,WACA,OACA,SACA,UACA,UACA,SACA,MACA,SACA,WACA,SACA,YACA,SACA,UACA,SACA,WACA,UACA,KACA,SACA,QACA,UACA,OACA,MACJ,EA0BI,QAnBe,CACf,QACA,OACA,MACJ,EAgBI,KAdY,CACZ,OACA,UACA,OACA,QACA,MACA,OACA,QACA,QACJ,EAMI,SA1BgB,CAChB,QACA,MACJ,CAwBA,EAEQyyG,EAAa,CACjB,UAAW,OACX,MAAO,IAAMF,EACb,SAAU,CACR,CACE,MAAO,KACP,IAAK,KACL,SAAU,CAAE,MAAM,GAG1B,EACQzB,EAAS,CACb,UAAW,SACX,MAAO,KACP,IAAK,KACL,SAAU9wG,EACV,UAAW,EACX,SAAU,CAAEy1E,EAAK,oBAAoB,EACrC,WAAY,EAChB,EAEE,MAAO,CACL,KAAM,OACN,QAAS,CAAE,KAAK,EAChB,SAAUz1E,EACV,QAAS,QACT,SAAU,CACRy1E,EAAK,QACH,UACA,OACA,CACE,UAAW,EACX,SAAU,CACR,CAEE,MAAO,OACP,UAAW,GAEb,CACE,UAAW,SACX,MAAO,iBAMf,CACE,MAAO,wBACP,SAAU,SACV,UAAW,GAEbA,EAAK,oBACLA,EAAK,qBACL,CACE,MAAO,MACP,IAAK,MACL,UAAW,SACX,SAAU,CAAEA,EAAK,gBAAgB,GAEnCA,EAAK,iBACLA,EAAK,kBACL,CACE,MAAO,CACL,oDACA,MACA88B,GAEF,UAAW,CACT,EAAG,UACH,EAAG,gBAGP,CAEE,MAAO,aACP,MAAO,WAET,CACE,MAAO,CACLtS,EAAM,OAAO,WAAYsS,CAAa,EACtC,MACAA,EACA,MACA,UAEF,UAAW,CACT,EAAG,OACH,EAAG,WACH,EAAG,aAGP,CACE,MAAO,CACL,SACA,MACAA,GAEF,UAAW,CACT,EAAG,UACH,EAAG,eAEL,SAAU,CACRzB,EACAr7B,EAAK,oBACLA,EAAK,uBAGT,CAGE,cAAe,wBACf,UAAW,GAEb,CACE,MAAO,CACL,MAAQ+8B,EAAmB,QAC3B/8B,EAAK,oBACL,aAEF,UAAW,CAAE,EAAG,gBAAgB,EAChC,SAAUz1E,EACV,SAAU,CACR,CACE,UAAW,SACX,MAAO,KACP,IAAK,KACL,SAAUA,EACV,UAAW,EACX,SAAU,CACRyyG,EACAh9B,EAAK,iBACLA,EAAK,kBACL08B,EACA18B,EAAK,uBAGTA,EAAK,oBACLA,EAAK,uBAGT08B,EACAM,EAEN,CACA,CAEA,OAAAC,GAAiBJ,mDClSjB,MAAMnS,EAAW,2BACXngG,EAAW,CACf,KACA,KACA,KACA,KACA,MACA,QACA,UACA,MACA,MACA,WACA,KACA,SACA,OACA,OACA,QACA,QACA,aACA,OACA,QACA,OACA,UACA,MACA,SACA,WACA,SACA,SACA,MACA,QACA,QACA,QAIA,WACA,QACA,QACA,SACA,SACA,OACA,SACA,UAEA,OACF,EACM4rG,EAAW,CACf,OACA,QACA,OACA,YACA,MACA,UACF,EAGMU,EAAQ,CAEZ,SACA,WACA,UACA,SAEA,OACA,OACA,SACA,SAEA,SACA,SAEA,QACA,eACA,eACA,YACA,aACA,oBACA,aACA,aACA,cACA,cACA,gBACA,iBAEA,MACA,MACA,UACA,UAEA,cACA,oBACA,UACA,WACA,OAEA,UACA,YACA,oBACA,gBAEA,UACA,QAEA,OAEA,aACF,EAEMqG,EAAc,CAClB,QACA,YACA,gBACA,aACA,iBACA,cACA,YACA,UACF,EAEMC,EAAmB,CACvB,cACA,aACA,gBACA,eAEA,UACA,UAEA,OACA,WACA,QACA,aACA,WACA,YACA,qBACA,YACA,qBACA,SACA,UACF,EAEMC,EAAqB,CACzB,YACA,OACA,QACA,UACA,SACA,WACA,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ACP,MAAO,KACP,IAAK,KACL,QAAS,IACT,SAAU,CACRA,EAAK,iBACLA,EAAK,oBAGT,gBAAiB,CACf,MAAO,SACP,MAAOA,EAAK,UAAY,kGASxB,UAAW,GAEb,aAAc,CACZ,UAAW,OACX,MAAO,4BAEb,GAGMi5B,EAAY,CAChB,IACA,OACA,UACA,UACA,QACA,QACA,IACA,aACA,OACA,SACA,SACA,UACA,OACA,OACA,KACA,MACA,UACA,MACA,MACA,KACA,KACA,KACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,SACA,SACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,OACA,MACA,SACA,KACA,WACA,SACA,IACA,UACA,IACA,QACA,OACA,UACA,SACA,SACA,OACA,SACA,UACA,MACA,QACA,QACA,KACA,WACA,QACA,KACA,QACA,OACA,KACA,KACA,MACA,OACF,EAEMC,EAAW,CACf,OACA,IACA,SACA,OACA,UACA,MACA,SACA,SACA,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,UACA,iBACA,UACA,UACA,eACA,WACA,qBACA,SACA,eACA,iBACA,iBACA,OACA,SACA,UACA,QACA,OACA,OACA,UACA,WACA,OACA,OACA,MACA,WACA,QACA,gBACA,UACF,EAEMC,EAAO,CACX,GAAGF,EACH,GAAGC,CACL,EAKME,EAAiB,CACrB,YACA,cACA,eACA,QACA,cACA,cACA,sBACA,gBACA,eACA,eACA,gBACA,OACA,SACA,QACA,kBACA,aACA,cACA,iBACA,kBACA,UACA,uBACA,mBACA,yBACA,+BACA,aACA,OACA,YACA,SACA,QAEA,YACA,YACA,aACA,YACF,EAAE,KAAI,EAAG,QAAO,EAGVC,EAAiB,CACrB,SACA,WACA,QACA,UACA,UACA,UACA,UACA,MACA,WACA,OACA,QACA,UACA,QACA,cACA,gBACA,aACA,SACA,QACA,gBACA,eACA,MACA,OACA,eACA,QACA,gBACA,WACA,UACA,KACA,OACA,aACA,eACA,OACA,OACA,aACA,MACA,YACA,UACA,iBACA,eACA,mBACA,cACA,aACA,eACA,WACA,eACA,OACA,oBACA,YACA,aACA,WACA,QACA,OACA,QACA,SACA,gBACA,eACA,QACA,UACA,OACF,EAAE,KAAI,EAAG,QAAO,EAGVC,EAAkB,CACtB,QACA,WACA,SACA,MACA,aACA,eACA,aACA,gBACA,SACA,OACA,cACA,YACA,UACA,gBACF,EAAE,KAAI,EAAG,QAAO,EAEVC,EAAa,CACjB,eACA,gBACA,cACA,aACA,qBACA,MACA,cACA,YACA,wBACA,kBACA,sBACA,qBACA,sBACA,4BACA,iBACA,uBACA,kBACA,sBACA,wBACA,qBACA,4BACA,aACA,eACA,kBACA,sBACA,aACA,wBACA,wBACA,kBACA,mBACA,mBACA,oBACA,sBACA,wBACA,wBACA,oBACA,kBACA,iBACA,aACA,SACA,eACA,qBACA,mBACA,yBACA,yBACA,yBACA,qBACA,2BACA,2BACA,2BACA,qBACA,qBACA,gBACA,sBACA,4BACA,6BACA,sBACA,sBACA,kBACA,eACA,wBACA,0BACA,eACA,sBACA,sBACA,qBACA,sBACA,qBACA,gBACA,sBACA,oBACA,0BACA,0BACA,0BACA,sBACA,4BACA,4BACA,4BACA,sBACA,sBACA,cACA,oBACA,oBACA,oBACA,gBACA,eACA,qBACA,qBACA,qBACA,iBACA,0BACA,4BACA,eACA,aACA,mBACA,yBACA,0BACA,mBACA,mBACA,eACA,SACA,YACA,uBACA,gBACA,WACA,iBACA,YACA,oBACA,aACA,WACA,aACA,aACA,cACA,eACA,eACA,eACA,cACA,QACA,OACA,YACA,YACA,QACA,sBACA,8BACA,gBACA,kBACA,eACA,eACA,cACA,aACA,cACA,oBACA,oBACA,oBACA,cACA,eACA,UACA,UACA,+BACA,2BACA,gCACA,yBACA,0BACA,YACA,iBACA,iBACA,UACA,qBACA,oBACA,gBACA,cACA,MACA,YACA,aACA,SACA,KACA,KACA,YACA,UACA,oBACA,cACA,oBACA,eACA,OACA,eACA,YACA,SACA,OACA,aACA,iBACA,YACA,YACA,cACA,YACA,QACA,cACA,gBACA,OACA,OACA,eACA,cACA,wBACA,eACA,yBACA,sBACA,eACA,YACA,mBACA,cACA,iBACA,eACA,aACA,iBACA,0BACA,4BACA,uBACA,wBACA,eACA,0BACA,oBACA,0BACA,qBACA,yBACA,uBACA,wBACA,0BACA,cACA,sBACA,MACA,+BACA,6BACA,OACA,YACA,oBACA,iBACA,iBACA,cACA,kBACA,oBACA,WACA,WACA,eACA,iBACA,gBACA,sBACA,wBACA,qBACA,sBACA,SACA,sBACA,wBACA,UACA,OACA,oBACA,kBACA,mBACA,WACA,iBACA,uBACA,cACA,QACA,aACA,cACA,kBACA,oBACA,eACA,mBACA,qBACA,YACA,kBACA,gBACA,eACA,UACA,OACA,iBACA,iBACA,aACA,cACA,mBACA,aACA,mBACA,sBACA,kBACA,SACA,eACA,mBACA,qBACA,gBACA,gBACA,oBACA,sBACA,cACA,eACA,aACA,cACA,SACA,aACA,aACA,eACA,QACA,OACA,cACA,mBACA,qBACA,qBACA,oBACA,qBACA,oBACA,YACA,iBACA,aACA,YACA,cACA,gBACA,cACA,YACA,YACA,oBACA,aACA,aACA,aACA,iBACA,aACA,kBACA,YACA,iBACA,aACA,kBACA,YACA,iBACA,WACA,YACA,WACA,YACA,SACA,OACA,SACA,aACA,kBACA,SACA,gBACA,kBACA,cACA,kBACA,gBACA,UACA,QACA,UACA,UACA,gBACA,iBACA,gBACA,gBACA,WACA,kBACA,iBACA,uBACA,kBACA,gBACA,aACA,aACA,UACA,sBACA,4BACA,6BACA,wBACA,wBACA,UACA,gBACA,oBACA,sBACA,iBACA,iBACA,qBACA,uBACA,eACA,gBACA,cACA,OACA,mBACA,oBACA,oBACA,cACA,QACA,cACA,eACA,cACA,qBACA,gBACA,cACA,aACA,iBACA,WACA,kBACA,sBACA,qBACA,SACA,IACA,SACA,OACA,aACA,cACA,QACA,SACA,UACA,aACA,gBACA,QACA,kBACA,gBACA,sBACA,0BACA,4BACA,uBACA,uBACA,2BACA,6BACA,qBACA,sBACA,oBACA,iBACA,uBACA,2BACA,6BACA,wBACA,wBACA,4BACA,8BACA,sBACA,uBACA,qBACA,oBACA,mBACA,mBACA,kBACA,uBACA,uBACA,kBACA,mBACA,kBACA,wBACA,eACA,gBACA,kBACA,QACA,WACA,MACA,aACA,eACA,SACA,mBACA,oBACA,iBACA,kBACA,oBACA,iBACA,eACA,WACA,eACA,aACA,iBACA,kBACA,cACA,uBACA,kBACA,wBACA,uBACA,uBACA,2BACA,wBACA,4BACA,gBACA,sBACA,yBACA,sBACA,cACA,eACA,mBACA,gBACA,iBACA,cACA,mBACA,iBACA,wBACA,0BACA,YACA,iBACA,kBACA,iBACA,MACA,eACA,YACA,gBACA,mBACA,kBACA,aACA,sBACA,mBACA,sBACA,sBACA,6BACA,YACA,eACA,cACA,cACA,gBACA,iBACA,gBACA,qBACA,sBACA,qBACA,uBACA,aACA,gBACA,iBACA,eACA,cACA,cACA,aACA,eACA,eACA,cACA,uBACA,SACA,QACA,cACA,aACA,eACA,YACA,eACA,IACA,IACA,UACA,MACF,EAAE,KAAI,EAAG,QAAO,EAGV0G,EAAmB5G,EAAe,OAAOC,CAAe,EAAE,KAAI,EAAG,QAAO,EAY9E,SAAS4G,EAAKlgC,EAAM,CAClB,MAAM9/F,EAAQ0iC,EAAMo9D,CAAI,EAClBmgC,EAAqBF,EAErBxG,EAAe,kBACf/O,EAAW,UACX0V,EAAkB,IAAM1V,EAAW,QAAUA,EAAW,OAIxD2V,EAAQ,CAAA,EAAUC,EAAc,CAAA,EAEhCC,EAAc,SAASxpM,EAAG,CAC9B,MAAO,CAEL,UAAW,SACX,MAAO,KAAOA,EAAI,MAAQA,CAChC,CACA,EAEQypM,EAAa,SAASlrM,EAAMi2L,EAAO+F,EAAW,CAClD,MAAO,CACL,UAAWh8L,EACX,MAAOi2L,EACP,UAAW+F,CACjB,CA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,QACA,WACA,UACA,WACA,MACA,QACA,WACA,UACA,UACA,SACA,MACA,KACA,OACA,OACA,OACA,QACA,WACA,aACA,YACA,cACA,WACA,aACA,MACA,OACA,OACA,SACA,OACA,MACA,QACA,QACA,SACA,QACA,MACA,UACA,OACA,SACA,WACA,OACA,WACA,WACA,WACA,gBACA,gBACA,aACA,WACA,eACA,eACA,YACA,cACA,UACA,cACA,iBACA,mBACA,cACA,WACA,WACA,WACA,gBACA,gBACA,aACA,cACA,aACA,QACA,OACA,SACA,OACA,OACA,KACA,MACA,KACA,QACA,MACA,QACA,OACA,OACA,OACA,OACA,KACA,UACA,SACA,OACA,SACA,QACA,YACA,MACA,QACA,KACA,KACA,MACA,SACA,QACA,SACA,SACA,SACA,SACA,KACA,KACA,OACA,KACA,MACA,MACA,OACA,UACA,KACA,MACA,MACA,OACA,UACA,OACA,MACA,MACA,QACA,SACA,YACA,OACA,MACA,KACA,YACA,KACA,KACA,OACA,OACA,UACA,WACA,WACA,WACA,OACA,OACA,MACA,SACA,UACA,QACA,SACA,UACA,YACA,SACA,QACA,MACA,SACA,OACA,UACA,SACA,SACA,SACA,QACA,OACA,WACA,aACA,YACA,UACA,cACA,cACA,WACA,aACA,aACA,QACA,SACA,SACA,UACA,WACA,WACA,MACA,QACA,SACA,aACA,OACA,SACA,QACA,UACA,OACA,QACA,OACA,QACA,QACA,MACA,SACA,UACA,UACA,UACA,UACA,UACA,SACA,WACA,OACA,UACA,MACA,OACA,OACA,QACA,KACA,WACA,KACA,UACA,QACA,QACA,SACA,SACA,SACA,UACA,QACA,QACA,MACA,QACA,SACA,MACA,OACA,UACA,YACA,OACA,OACA,QACA,QACA,MACA,MACA,KACJ,EAGQw3G,EAAkB,uBAClBC,EAAgB,CACpB,SAAU,SACV,QAASz3G,EAAS,KAAK,GAAG,CAC9B,EACQkrG,EAAQ,CACZ,UAAW,QACX,MAAO,UACP,IAAK,MA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OAAAC,GAAiBX,mDC/ejB,SAASY,EAAW1iC,EAAM,CACxB,MAAM2iC,EAAY,CAChB,UAAW,WACX,MAAO,sEACX,EACQC,EAAgB,yBAuJhBr4G,EAAW,CACf,oBAAqB,CACnB,OACA,SAEF,SAAUq4G,EACV,QA3IU,CACV,QACA,SACA,SACA,UACA,QACA,SACA,MACA,QACA,WACA,SACA,UACA,KACA,KACA,SACA,OACA,OACA,OACA,QACA,SACA,MACA,OACA,UACA,WACA,WACA,WACA,SACA,WACA,SACA,WACA,SACA,YACA,OACA,gBACA,KACA,SACA,YACA,WACA,WACA,SACA,OACA,OACA,KACA,MACA,QACA,SACA,QACA,SACA,WACA,SACA,UACA,kBACA,WACA,aACA,UACA,OACA,YACA,OACA,SACA,SACA,WACA,mBACA,cACA,WACA,YACA,YACA,YACA,UACA,WACA,UACA,QACA,uBACA,WACA,oBACA,oBACA,kBACA,cACA,kBACA,WACA,WACA,YACA,oBACA,eACA,sBACA,gBACA,SACA,SACA,SACA,oBACA,UACA,WACA,mBACA,kBACA,QACA,eACA,4BACA,iBACA,oBACA,2BACA,YACA,eACA,gBACA,UACA,aACA,uBACA,0BACA,wBACA,uBACA,gBACA,mBACA,YACA,aACA,gBACA,iBACA,eACJ,EAyBI,QAxBe,CACf,QACA,OACA,QACA,OACA,MACA,MACA,KACA,MACJ,EAgBI,SAfgB,CAChB,kBACA,mBACA,gBACA,iBACA,eACJ,EAUI,KA/JY,CACZ,MACA,QACA,OACA,WACA,SACA,QACA,OACA,SACA,UACA,UACA,OACA,OACA,OACA,OACA,OACJ,CAgJA,EACQC,EAAiB,CACrB,SAAUD,EACV,QAAS,CACP,aACA,SACA,YACA,kBAEN,EACE,MAAO,CACL,KAAM,cACN,QAAS,CACP,KACA,OACA,QACA,UACA,iBAEF,SAAUr4G,EACV,QAAS,KACT,SAAU,CACRo4G,EACA3iC,EAAK,oBACLA,EAAK,qBACLA,EAAK,cACLA,EAAK,kBACLA,EAAK,iBACL,CACE,UAAW,SACX,SAAU,CACR,CACE,MAAO,KACP,IAAK,IACL,QAAS,MACT,SAAU,CAAEA,EAAK,gBAAgB,KAIvC,CACE,UAAW,OACX,MAAO,eACP,IAAK,IACL,SAAU,CAAE,QACR,gFAC+B,EACnC,SAAU,CACR,CACE,MAAO,OACP,UAAW,GAEbA,EAAK,QAAQA,EAAK,kBAAmB,CAAE,UAAW,SAAU,EAC5D,CACE,UAAW,SACX,MAAO,QACP,IAAK,IACL,QAAS,OAEXA,EAAK,oBACLA,EAAK,uBAGT,CACE,UAAW,QACX,MAAO,IAAM6iC,EAAe,QAAQ,KAAK,GAAG,EAAI,OAChD,IAAK,SACL,WAAY,GACZ,SAAUA,EACV,SAAU,CAAE7iC,EAAK,qBAAqB,GAExC,CACE,MAAO,MAAQA,EAAK,oBACpB,UAAW,GAGnB,CACA,CAEA,OAAA8iC,GAAiBJ,mDChPjB,SAASK,EAAI/iC,EAAM,CACjB,MAAMwqB,EAAQxqB,EAAK,MAGbgjC,EAAe,yBACftY,EAAWF,EAAM,OACrB,2CACAwY,CAAY,EAERC,EAA4BzY,EAAM,OACtC,yEACAwY,CAAY,EACRE,EAAiB1Y,EAAM,OAC3B,SACAwY,CAAY,EACRtD,EAAW,CACf,MAAO,WACP,MAAO,OAAShV,CACpB,EACQsM,EAAe,CACnB,MAAO,OACP,SAAU,CACR,CAAE,MAAO,SAAU,UAAW,EAAE,EAChC,CAAE,MAAO,MAAM,EAEf,CAAE,MAAO,MAAO,UAAW,EAAG,EAC9B,CAAE,MAAO,KAAK,EAEpB,EACQvB,EAAQ,CACZ,MAAO,QACP,SAAU,CACR,CAAE,MAAO,OAAO,EAChB,CACE,MAAO,OACP,IAAK,MAGb,EACQ0N,EAAgBnjC,EAAK,QAAQA,EAAK,iBAAkB,CAAE,QAAS,KAAO,EACtEojC,EAAgBpjC,EAAK,QAAQA,EAAK,kBAAmB,CACzD,QAAS,KACT,SAAUA,EAAK,kBAAkB,SAAS,OAAOy1B,CAAK,CAC1D,CAAG,EAEK4N,EAAU,CACd,MAAO,+BACP,IAAK,gBACL,SAAUrjC,EAAK,kBAAkB,SAAS,OAAOy1B,CAAK,EACtD,WAAY,CAAC/6L,EAAGkkE,IAAS,CAAEA,EAAK,KAAK,YAAclkE,EAAE,CAAC,GAAKA,EAAE,CAAC,CAAE,EAChE,SAAU,CAACA,EAAGkkE,IAAS,CAAMA,EAAK,KAAK,cAAgBlkE,EAAE,CAAC,GAAGkkE,EAAK,YAAW,CAAG,CACpF,EAEQ0kI,EAAStjC,EAAK,kBAAkB,CACpC,MAAO,qBACP,IAAK,eACT,CAAG,EAEKujC,EAAa;AAAA,GACb3K,EAAS,CACb,MAAO,SACP,SAAU,CACRwK,EACAD,EACAE,EACAC,EAEN,EACQlI,EAAS,CACb,MAAO,SACP,SAAU,CACR,CAAE,MAAO,6BAA6B,EACtC,CAAE,MAAO,+BAA+B,EACxC,CAAE,MAAO,2CAA2C,EAEpD,CAAE,MAAO,4EAA4E,GAEvF,UAAW,CACf,EACQjF,EAAW,CACf,QACA,OACA,MACJ,EACQqN,EAAM,CAGV,YACA,UACA,WACA,eACA,2BACA,WACA,aACA,gBACA,YAGA,MACA,OACA,OACA,UACA,eACA,QACA,UACA,eAMA,QACA,WACA,MACA,KACA,SACA,OACA,UACA,QACA,WACA,OACA,QACA,QACA,QACA,QACA,WACA,UACA,UACA,KACA,SACA,OACA,SACA,QACA,aACA,SACA,aACA,QACA,YACA,WACA,OACA,OACA,UACA,QACA,UACA,QACA,MACA,UACA,OACA,SACA,OACA,KACA,aACA,aACA,YACA,MACA,UACA,YACA,QACA,WACA,OACA,UACA,QACA,MACA,QACA,SACA,KACA,UACA,YACA,SACA,WACA,OACA,SACA,SACA,SACA,QACA,QACA,MACA,QACA,MACA,MACA,OACA,QACA,MACA,OACJ,EAEQnG,EAAY,CAGhB,UACA,iBACA,qBACA,kBACA,gBACA,cACA,iBACA,2BACA,yBACA,kBACA,yBACA,eACA,YACA,oBACA,sBACA,kBACA,gBACA,iBACA,YACA,qBACA,iBACA,eACA,mBACA,2BACA,mBACA,kBACA,gBACA,iBACA,mBACA,mBACA,uBACA,sBACA,gBACA,oBACA,iBACA,aACA,iBACA,yBACA,2BACA,kCACA,6BACA,0BACA,oBACA,4BACA,yBACA,w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M,CACvB,MAAO,CACL,KAAM,aACN,QAAS,CACP,OACA,OAEF,kBAAmB,EACvB,CACA,CAEA,OAAAokC,GAAiBlpK,mDCXjB,SAASmpK,EAAOrkC,EAAM,CACpB,MAAMwqB,EAAQxqB,EAAK,MACb0qB,EAAW,WAAA,sCAAA,GAAoC,EAC/C4Z,EAAiB,CACrB,MACA,KACA,SACA,QACA,QACA,QACA,OACA,QACA,WACA,MACA,MACA,OACA,OACA,SACA,UACA,MACA,OACA,SACA,KACA,SACA,KACA,KACA,SACA,QACA,cACA,MACA,KACA,OACA,QACA,SACA,MACA,QACA,OACA,OACJ,EAsGQ/5G,EAAW,CACf,SAAU,sBACV,QAAS+5G,EACT,SAvGgB,CAChB,aACA,MACA,MACA,MACA,QACA,MACA,OACA,aACA,YACA,QACA,WACA,MACA,cACA,UACA,UACA,UACA,OACA,MACA,SACA,YACA,OACA,OACA,SACA,QACA,SACA,YACA,UACA,UACA,UACA,OACA,OACA,MACA,KACA,QACA,MACA,aACA,aACA,OACA,MACA,OACA,SACA,MACA,MACA,aACA,MACA,OACA,SACA,MACA,OACA,MACA,MACA,QACA,WACA,QACA,OACA,WACA,QACA,MACA,UACA,QACA,SACA,eACA,MACA,MACA,QACA,QACA,OACA,OACA,KACJ,EAkCI,QAhCe,CACf,YACA,WACA,QACA,OACA,iBACA,MACJ,EA0BI,KArBY,CACZ,MACA,WACA,YACA,OACA,OACA,UACA,UACA,WACA,WACA,MACA,QACA,OACA,OACJ,CAQA,EAEQC,EAAS,CACb,UAAW,OACX,MAAO,gBACX,EAEQ9O,EAAQ,CACZ,UAAW,QACX,MAAO,KACP,IAAK,KACL,SAAUlrG,EACV,QAAS,GACb,EAEQi6G,EAAkB,CACtB,MAAO,OACP,UAAW,CACf,EAEQ5L,EAAS,CACb,UAAW,SACX,SAAU,CAAE54B,EAAK,gBAAgB,EACjC,SAAU,CACR,CACE,MAAO,yCACP,IAAK,MACL,SAAU,CACRA,EAAK,iBACLukC,GAEF,UAAW,IAEb,CACE,MAAO,yCACP,IAAK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QACjBza,EAAsBH,EAAM,OAAO4a,EAAgBplC,EAAK,mBAAmB,EAC3E0qB,EAAWF,EAAM,OAAO4a,EAAgBplC,EAAK,QAAQ,EAErD+jC,EAAkB,CACtB,UAAW,wBACX,UAAW,EACX,MAAOvZ,EAAM,OACX,KACA,oCACAE,EACAF,EAAM,UAAU,OAAO,CAAC,CAC9B,EACQ6a,EAAgB,wCAChB96G,EAAW,CACf,WACA,KACA,QACA,QACA,SACA,MACA,QACA,QACA,WACA,QACA,KACA,MACA,OACA,OACA,SACA,QACA,QACA,KACA,MACA,KACA,OACA,KACA,MACA,OACA,QACA,QACA,MACA,OACA,MACA,WACA,OACA,MACA,MACA,SACA,OACA,OACA,SACA,SACA,QACA,QACA,OACA,MACA,OACA,SACA,QACA,SACA,UACA,MACA,UACA,QACA,QACA,OACJ,EACQ4rG,EAAW,CACf,OACA,QACA,OACA,OACA,KACA,KACJ,EACQmP,EAAW,CAEf,QAEA,OACA,OACA,QACA,OACA,OACA,KACA,QACA,SACA,UACA,QACA,QACA,YACA,aACA,KACA,MACA,QACA,QACA,OACA,OACA,UACA,WACA,SACA,eACA,sBACA,oBACA,iBACA,WAEA,UACA,aACA,YACA,SACA,OACA,OACA,UACA,iBACA,gBACA,mBACA,OACA,YACA,SACA,QACA,UACA,eACA,iBACA,eACA,QACA,kBACA,eACA,cACA,SACA,WACA,UACA,aACA,OACA,iBACA,eACA,OACA,SACA,WACA,eACA,aACA,kBACJ,EACQzO,EAAQ,CACZ,KACA,MACA,MACA,MACA,OACA,QACA,KACA,MACA,MACA,MACA,OACA,QACA,MACA,MACA,MACA,OACA,OACA,MACA,SACA,SACA,SACA,KACJ,EACE,MAAO,CACL,KAAM,OACN,QAAS,CAAE,IAAI,EACf,SAAU,CACR,SAAU72B,EAAK,SAAW,KAC1B,KAAM62B,EACN,QAAStsG,EACT,QAAS4rG,EACT,SAAUmP,GAEZ,QAAS,KACT,SAAU,CACRtlC,EAAK,oBACLA,EAAK,QAAQ,OAAQ,OAAQ,CAAE,SAAU,CAAE,MAAM,EAAI,EACrDA,EAAK,QAAQA,EAAK,kBAAmB,CACnC,MAAO,MACP,QAAS,IACjB,CAAO,EACD,CACE,UAAW,SAEX,MAAO,gCAET,CACE,MAAO,SACP,SAAU,CACR,CAAE,MAAO,0BAA0B,EACnC,CACE,MAAO,MACP,IAAK,IACL,SAAU,CACR,CACE,MAAO,cACP,MAAO,qCAMjB,CACE,UAAW,SACX,SAAU,CACR,CAAE,MAAO,gBAAkBqlC,CAAa,EACxC,CAAE,MAAO,iBAAmBA,CAAa,EACzC,CAAE,MAAO,uBAAyBA,CAAa,EAC/C,CAAE,MAAO,kDACEA,CAAa,GAE1B,UAAW,GAEb,CACE,MAAO,CACL,KACA,MACA1a,GAEF,UAAW,CACT,EAAG,UACH,EAAG,mBAGP,CACE,UAAW,OACX,MAAO,SACP,IAAK,MACL,SAAU,CACR,CACE,UAAW,SACX,MAAO,IACP,IAAK,IACL,SAAU,CACR3qB,EAAK,qBAKb,CACE,MAAO,CACL,MACA,MACA,cACA2qB,GAEF,UAAW,CACT,EAAG,UACH,EAAG,UACH,EAAG,aAIP,CACE,MAAO,CACL,MACA,MACAA,EACA,MACA,MAEF,UAAW,CACT,EAAG,UACH,EAAG,WACH,EAAG,YAGP,CACE,MAAO,CACL,OACA,MACAA,GAEF,UAAW,CACT,EAAG,UACH,EAAG,gBAGP,CACE,MAAO,CACL,uCACA,MACAA,GAEF,UAAW,CACT,EAAG,UACH,EAAG,gBAGP,CACE,MAAO3qB,EAAK,SAAW,KACvB,SAAU,CACR,QAAS,OACT,SAAUslC,EACV,KAAMzO,IAGV,CACE,UAAW,cACX,MAAO,MAETkN,EAEN,CACA,CAEA,OAAAwB,GAAiBJ,mDCrUjB,MAAMviG,EAASo9D,IACN,CACL,UAAW,CACT,MAAO,OACP,MAAO,cAET,cAAeA,EAAK,qBACpB,SAAU,CACR,MAAO,SACP,MAAO,mDAET,kBAAmB,CACjB,UAAW,WACX,MAAO,gBAET,wBAAyB,CACvB,MAAO,gBACP,MAAO,KACP,IAAK,KACL,QAAS,IACT,SAAU,CACRA,EAAK,iBACLA,EAAK,oBAGT,gBAAiB,CACf,MAAO,SACP,MAAOA,EAAK,UAAY,kGASxB,UAAW,GAEb,aAAc,CACZ,UAAW,OACX,MAAO,4BAEb,GAGMi5B,EAAY,CAChB,IACA,OACA,UACA,UACA,QACA,QACA,IACA,aACA,OACA,SACA,SACA,UACA,OACA,OACA,KACA,MACA,UACA,MACA,MACA,KACA,KACA,KACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,SACA,SACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,OACA,MACA,SACA,KACA,WACA,SACA,IACA,UACA,IACA,QACA,OACA,UACA,SACA,SACA,OACA,SACA,UACA,MACA,QACA,QACA,KACA,WACA,QACA,KACA,QACA,OACA,KACA,KACA,MACA,OACF,EAEMC,EAAW,CACf,OACA,IACA,SACA,OACA,UACA,MACA,SACA,SACA,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,UACA,iBACA,UACA,UACA,eACA,WACA,qBACA,SACA,eACA,iBACA,iBACA,OACA,SACA,UACA,QACA,OACA,OACA,UACA,WACA,OACA,OACA,MACA,WACA,QACA,gBACA,UACF,EAEMC,EAAO,CACX,GAAGF,EACH,GAAGC,CACL,EAKME,EAAiB,CACrB,YACA,cACA,eACA,QACA,cACA,cACA,sBACA,gBACA,eACA,eACA,gBACA,OACA,SACA,QACA,kBACA,aACA,cACA,iBACA,kBACA,UACA,uBACA,mBACA,yBACA,+BACA,aACA,OACA,YACA,SACA,QAEA,YACA,YACA,aACA,YACF,EAAE,KAAI,EAAG,QAAO,EAGVC,EAAiB,CACrB,SACA,WACA,QACA,UACA,UACA,UACA,UACA,MACA,WACA,OACA,QACA,UACA,QACA,cACA,gBACA,aACA,SACA,QACA,gBACA,eACA,MACA,OACA,eACA,QACA,gBACA,WACA,UACA,KACA,OACA,aACA,eACA,OACA,OACA,aACA,MACA,YACA,UACA,iBACA,eACA,mBACA,cACA,aACA,eACA,WACA,eACA,OACA,oBACA,YACA,aACA,WACA,QACA,OACA,QACA,SACA,gBACA,eACA,QACA,UACA,OACF,EAAE,KAAI,EAAG,QAAO,EAGVC,EAAkB,CACtB,QACA,WACA,SACA,MACA,aACA,eACA,aACA,gBACA,SACA,OACA,cACA,YACA,UACA,gBACF,EAAE,KAAI,EAAG,QAAO,EAEVC,EAAa,CACjB,eACA,gBACA,cACA,aACA,qBACA,MACA,cACA,YACA,wBACA,kBACA,sBACA,qBACA,sBACA,4BACA,iBACA,uBACA,kBACA,sBACA,wBACA,qBACA,4BACA,aACA,eACA,kBACA,sBACA,aACA,wBACA,wBACA,kBACA,mBACA,mBACA,oBACA,sBACA,wBACA,wBACA,oBACA,kBACA,iBACA,aACA,SACA,eACA,qBACA,mBACA,yBACA,yBACA,yBACA,qBACA,2BACA,2BACA,2BACA,qBACA,qBACA,gBACA,sBACA,4BACA,6BACA,sBACA,sBACA,kBACA,eACA,wBACA,0BACA,eACA,sBACA,sBACA,qBACA,sBACA,qBACA,gBACA,sBACA,oBACA,0BACA,0BACA,0BACA,sBACA,4BACA,4BACA,4BACA,sBACA,sBACA,cACA,oBACA,oBACA,oBACA,gBACA,eACA,qBACA,qBACA,qBACA,iBACA,0BACA,4BACA,eACA,aACA,mBACA,yBACA,0BACA,mBACA,mBACA,eACA,SACA,YACA,uBACA,gBACA,WACA,iBACA,YACA,oBACA,aACA,WACA,aACA,aACA,cACA,eACA,eACA,eACA,cACA,QACA,OACA,YACA,YACA,QACA,sBACA,8BACA,gBACA,kBACA,eACA,eACA,cACA,aACA,cACA,oBACA,oBACA,oBACA,cACA,eACA,UACA,UACA,+BACA,2BACA,gCACA,yBACA,0BACA,YACA,iBACA,iBACA,UACA,qBACA,oBACA,gBACA,cACA,MACA,YACA,aACA,SACA,KACA,KACA,YACA,UACA,oBACA,cACA,oBACA,eACA,OACA,eACA,YACA,SACA,OACA,aACA,iBACA,YACA,YACA,cACA,YACA,QACA,cACA,gBACA,OACA,OACA,eACA,cACA,wBACA,eACA,yBACA,sBACA,eACA,YACA,mBACA,cACA,iBACA,eACA,aACA,iBACA,0BACA,4BACA,uBACA,wBACA,eACA,0BACA,oBACA,0BACA,qBACA,yBACA,uBACA,wBACA,0BACA,cACA,sBACA,MACA,+BACA,6BACA,OACA,YACA,oBACA,iBACA,iBACA,cACA,kBACA,oBACA,WACA,WACA,eACA,iBACA,gBACA,sBACA,wBACA,qBACA,sBACA,SACA,sBACA,wBACA,UACA,OACA,oBACA,kBACA,mBACA,WACA,iBACA,uBACA,cACA,QACA,aACA,cACA,kBACA,oBACA,eACA,mBACA,qBACA,YACA,kBACA,gBACA,eACA,UACA,OACA,iBACA,iBACA,aACA,cACA,mBACA,aACA,mBACA,sBACA,kBACA,SACA,eACA,mBACA,qBACA,gBACA,gBACA,oBACA,sBACA,cACA,eACA,aACA,cACA,SACA,aACA,aACA,eACA,QACA,OACA,cACA,mBACA,qBACA,qBACA,oBACA,qBACA,oBACA,YACA,iBACA,aACA,YACA,cACA,gBACA,cACA,YACA,YACA,oBACA,aACA,aACA,aACA,iBACA,aACA,kBACA,YACA,iBACA,aACA,kBACA,YACA,iBACA,WACA,YACA,WACA,YACA,SACA,OACA,SACA,aACA,kBACA,SACA,gBACA,kBACA,cACA,kBACA,gBACA,UACA,QACA,UACA,UACA,gBACA,iBACA,gBACA,gBACA,WACA,kBACA,iBACA,uBACA,kBACA,gBACA,aACA,aACA,UACA,sBACA,4BACA,6BACA,wBACA,wBACA,UACA,gBACA,oBACA,sBACA,iBACA,iBACA,qBACA,uBACA,eACA,gBACA,cACA,OACA,mBACA,oBACA,oBACA,cACA,QACA,cACA,eACA,cACA,qBACA,gBACA,cACA,aACA,iBACA,WACA,kBACA,sBACA,qBACA,SACA,IACA,SACA,OACA,aACA,cACA,QACA,SACA,UACA,aACA,gBACA,QACA,kBACA,gBACA,sBACA,0BACA,4BACA,uBACA,uBACA,2BACA,6BACA,qBACA,sBACA,oBACA,iBACA,uBACA,2BACA,6BACA,wBACA,wBACA,4BACA,8BACA,sBACA,uBACA,qBACA,oBACA,mBACA,mBACA,kBACA,uBACA,uBACA,kBACA,mBACA,kBACA,wBACA,eACA,gBACA,kBACA,QACA,WACA,MACA,aACA,eACA,SACA,mBACA,oBACA,iBACA,kBACA,oBACA,iBACA,eACA,WACA,eACA,aACA,iBACA,kBACA,cACA,uBACA,kBACA,wBACA,uBACA,uBACA,2BACA,wBACA,4BACA,gBACA,sBACA,yBACA,sBACA,cACA,eACA,mBACA,gBACA,iBACA,cACA,mBACA,iBACA,wBACA,0BACA,YACA,iBACA,kBACA,iBACA,MACA,eACA,YACA,gBACA,mBACA,kBACA,aACA,sBACA,mBACA,sBACA,sBACA,6BACA,YACA,eACA,cACA,cACA,gBACA,iBACA,gBACA,qBACA,sBACA,qBACA,uBACA,aACA,gBACA,iBACA,eACA,cACA,cACA,aACA,eACA,eACA,cACA,uBACA,SACA,QACA,cACA,aACA,eACA,YACA,eACA,IACA,IACA,UACA,MACF,EAAE,KAAI,EAAG,QAAO,EAYhB,SAASiM,EAAKxlC,EAAM,CAClB,MAAM9/F,EAAQ0iC,EAAMo9D,CAAI,EAClBylC,EAAoBnM,EACpBoM,EAAmBrM,EAEnBN,EAAgB,WAChBU,EAAe,kBAEfiG,EAAW,CACf,UAAW,WACX,MAAO,OAHQ,0BAGY,OAC3B,UAAW,CACf,EAEE,MAAO,CACL,KAAM,OACN,iBAAkB,GAClB,QAAS,SACT,SAAU,CACR1/B,EAAK,oBACLA,EAAK,qBAGL9/F,EAAM,gBACN,CACE,UAAW,cACX,MAAO,kBACP,UAAW,GAEb,CACE,UAAW,iBACX,MAAO,oBACP,UAAW,GAEbA,EAAM,wBACN,CACE,UAAW,eACX,MAAO,OAASi5H,EAAK,KAAK,GAAG,EAAI,OAEjC,UAAW,GAEb,CACE,UAAW,kBACX,MAAO,KAAOuM,EAAiB,KAAK,GAAG,EAAI,KAE7C,CACE,UAAW,kBACX,MAAO,SAAWD,EAAkB,KAAK,GAAG,EAAI,KAElD/F,EACA,CACE,MAAO,KACP,IAAK,KACL,SAAU,CAAEx/H,EAAM,eAAe,GAEnCA,EAAM,aACN,CACE,UAAW,YACX,MAAO,OAASq5H,EAAW,KAAK,GAAG,EAAI,QAEzC,CAAE,MAAO,4oCAA4oC,EACrpC,CACE,MAAO,IACP,IAAK,QACL,UAAW,EACX,SAAU,CACRr5H,EAAM,cACNw/H,EACAx/H,EAAM,SACNA,EAAM,gBACN8/F,EAAK,kBACLA,EAAK,iBACL9/F,EAAM,UACNA,EAAM,oBAMV,CACE,MAAO,oBACP,SAAU,CACR,SAAU64H,EACV,QAAS,qBAGb,CACE,MAAO,IACP,IAAK,OACL,YAAa,GACb,SAAU,CACR,SAAU,UACV,QAASU,EACT,UAAWL,EAAe,KAAK,GAAG,GAEpC,SAAU,CACR,CACE,MAAOL,EACP,UAAW,WAEb,CACE,MAAO,eACP,UAAW,aAEb2G,EACA1/B,EAAK,kBACLA,EAAK,iBACL9/F,EAAM,SACNA,EAAM,kBAGVA,EAAM,kBAEZ,CACA,CAEA,OAAAylI,GAAiBH,mDCj6BjB,SAASvrE,EAAM+lC,EAAM,CACnB,MAAO,CACL,KAAM,gBACN,QAAS,CACP,UACA,gBAEF,SAAU,CACR,CACE,UAAW,cAIX,MAAO,qCACP,OAAQ,CACN,IAAK,gBACL,YAAa,SAIvB,CACA,CAEA,OAAA4lC,GAAiB3rE,mDCVjB,SAAS4rE,EAAI7lC,EAAM,CACjB,MAAMwqB,EAAQxqB,EAAK,MACb8lC,EAAe9lC,EAAK,QAAQ,KAAM,GAAG,EACrC44B,EAAS,CACb,MAAO,SACP,SAAU,CACR,CACE,MAAO,IACP,IAAK,IACL,SAAU,CAAE,CAAE,MAAO,IAAI,CAAE,GAGnC,EACQmN,EAAoB,CACxB,MAAO,IACP,IAAK,IACL,SAAU,CAAE,CAAE,MAAO,IAAI,CAAE,CAC/B,EAEQ5P,EAAW,CACf,OACA,QAGA,SACJ,EAEQ6P,EAAmB,CACvB,mBACA,eACA,gBACA,kBACJ,EAEQnP,EAAQ,CACZ,SACA,SACA,OACA,UACA,OACA,YACA,OACA,OACA,MACA,WACA,UACA,QACA,MACA,UACA,WACA,QACA,QACA,WACA,UACA,OACA,MACA,WACA,OACA,YACA,UACA,UACA,WACJ,EAEQoP,EAAqB,CACzB,MACA,MACA,YACA,OACA,QACA,QACA,OACA,MACJ,EAGQ3B,EAAiB,CACrB,MACA,OACA,MACA,WACA,QACA,MACA,MACA,MACA,QACA,YACA,wBACA,KACA,aACA,OACA,aACA,KACA,OACA,SACA,gBACA,MACA,QACA,cACA,kBACA,UACA,SACA,SACA,OACA,UACA,OACA,KACA,OACA,SACA,cACA,WACA,OACA,OACA,OACA,UACA,OACA,cACA,YACA,mBACA,QACA,aACA,OACA,QACA,WACA,UACA,UACA,SACA,SACA,YACA,UACA,aACA,WACA,UACA,OACA,OACA,gBACA,MACA,OACA,QACA,YACA,aACA,SACA,QACA,OACA,YACA,UACA,kBACA,eACA,kCACA,eACA,eACA,cACA,iBACA,eACA,oBACA,eACA,eACA,mCACA,eACA,SACA,QACA,OACA,MACA,aACA,MACA,UACA,WACA,UACA,UACA,SACA,SACA,aACA,QACA,WACA,gBACA,aACA,WACA,SACA,OACA,UACA,OACA,UACA,OACA,QACA,MACA,YACA,gBACA,WACA,SACA,SACA,QACA,SACA,OACA,UACA,SACA,MACA,WACA,UACA,QACA,QACA,SACA,cACA,QACA,QACA,MACA,UACA,YACA,OACA,OACA,OACA,WACA,SACA,MACA,SACA,QACA,QACA,WACA,SACA,SACA,OACA,OACA,WACA,KACA,YACA,UACA,QACA,QACA,cACA,SACA,MACA,UACA,YACA,eACA,WACA,OACA,KACA,OACA,aACA,gBACA,cACA,cACA,iBACA,aACA,aACA,uBACA,aACA,MACA,WACA,QACA,aACA,UACA,OACA,UACA,OACA,OACA,aACA,UACA,KACA,QACA,YACA,iBACA,MACA,QACA,QACA,QACA,eACA,kBACA,UACA,MACA,SACA,QACA,SACA,MACA,SACA,MACA,WACA,SACA,QACA,WACA,WACA,UACA,QACA,QACA,MACA,KACA,OACA,YACA,MACA,YACA,QACA,OACA,SACA,UACA,eACA,oBACA,KACA,SACA,MACA,OACA,KACA,MACA,OACA,OACA,KACA,QACA,MACA,QACA,OACA,WACA,UACA,YACA,YACA,UACA,MACA,UACA,eACA,kBACA,kBACA,SACA,UACA,WACA,iBACA,QACA,WACA,YACA,UACA,UACA,YACA,MACA,QACA,OACA,QACA,OACA,YACA,MACA,aACA,cACA,YACA,YACA,aACA,iBACA,UACA,aACA,WACA,WACA,WACA,UACA,SACA,SACA,UACA,SACA,QACA,WACA,SACA,MACA,aACA,OACA,UACA,YACA,QACA,SACA,SACA,SACA,OACA,SACA,YACA,eACA,MACA,OACA,UACA,MACA,OACA,OACA,WACA,OACA,WACA,eACA,MACA,eACA,WACA,aACA,OACA,QACA,SACA,aACA,cACA,cACA,SACA,YACA,kBACA,WACA,MACA,YACA,SACA,cACA,cACA,QACA,cACA,MACA,OACA,OACA,OACA,YACA,gBACA,kBACA,KACA,WACA,YACA,kBACA,cACA,QACA,UACA,OACA,aACA,OACA,WACA,UACA,QACA,SACA,UACA,SACA,SACA,QACA,OACA,QACA,QACA,SACA,WACA,UACA,WACA,YACA,UACA,UACA,aACA,OACA,WACA,QACA,eACA,SACA,OACA,SACA,UACA,MACJ,EAKQ4B,EAAqB,CACzB,MACA,OACA,YACA,OACA,OACA,MACA,OACA,OACA,UACA,WACA,OACA,MACA,OACA,QACA,YACA,aACA,YACA,aACA,QACA,UACA,MACA,UACA,cACA,QACA,aACA,gBACA,cACA,cACA,iBACA,aACA,aACA,uBACA,aACA,MACA,aACA,OACA,UACA,KACA,MACA,QACA,QACA,MACA,MACA,MACA,YACA,QACA,SACA,eACA,kBACA,kBACA,WACA,iBACA,QACA,OACA,YACA,YACA,aACA,iBACA,UACA,aACA,WACA,WACA,WACA,aACA,MACA,OACA,OAC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,WACA,cACA,cACA,OACA,WACA,WACA,WACA,UACA,UACA,kBACA,SACA,iBACA,UACA,WACA,gBACA,SACA,SACA,WACA,WACA,SACA,MACA,OACA,SACA,SACA,YACA,QACA,SACA,SACA,QACA,QACA,OACA,MACA,YACA,kBACA,oBACA,UACA,MACA,OACA,QACA,QACA,SACF,EAMMC,EAAW,CACf,QACA,MACA,MACF,EAGMC,EAA0B,CAC9B,aACA,gBACA,aACA,OACA,YACA,OACA,OACF,EAIMC,EAAqB,CACzB,gBACA,UACA,aACA,QACA,UACA,SACA,SACA,QACA,UACA,eACA,YACA,YACA,MACA,gBACA,WACA,QACA,YACA,kBACA,UACF,EAGMC,EAAW,CACf,MACA,MACA,MACA,SACA,mBACA,aACA,OACA,aACA,YACA,4BACA,MACA,MACA,cACA,eACA,eACA,eACA,sBACA,QACA,WACA,gBACA,WACA,SACA,OACA,oCACA,YACA,OACA,gBACA,iBACA,uBACA,2BACA,oBACA,aACA,0BACA,KACF,EAGMC,EAAexd,EACnB,oBACA,kBACA,iBACA,iBACA,iBACA,mCACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,UACF,EAGMyd,EAAoBzd,EACxBwd,EACA,kBACA,kBACA,kBACA,kBACA,iBAGF,EAGME,EAAW9d,EAAO4d,EAAcC,EAAmB,GAAG,EAGtDE,EAAiB3d,EACrB,YACA,uDACA,yDACA,yDACA,kBACA,+DACA,yDACA,+BACA,yDACA,yDACA,8BAMF,EAGM4d,EAAsB5d,EAC1B2d,EACA,KACA,wDACF,EAGME,EAAaje,EAAO+d,EAAgBC,EAAqB,GAAG,EAG5DE,EAAiBle,EAAO,QAASge,EAAqB,GAAG,EAKzDG,EAAoB,CACxB,WACA,cACAne,EAAO,eAAgBI,EAAO,QAAS,QAAS,GAAG,EAAG,IAAI,EAC1D,oBACA,kBACA,sBACA,WACA,eACA,SACA,gBACA,WACA,eACA,gBACA,WACA,gBACA,YACA,OACA,UACA,oBACA,YAC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AAQ,GAE/BgV,EAGA,CACE,UAAW,SACX,MAAOnrC,EAAK,YAAc,MAC1B,UAAW,GAEbqrC,EACArP,EACAiP,EACArS,CACJ,EAEQ0H,EAAc,CAAE,GAAG19F,CAAK,EAC9B,OAAA09F,EAAY,IAAG,EACfA,EAAY,KAAK4K,CAAgB,EACjCE,EAAgB,SAAW9K,EAEpB,CACL,KAAM,OACN,iBAAkB,GAClB,QAAS,CAAE,KAAK,EAChB,SAAU19F,CACd,CACA,CAEA,OAAA0oG,GAAiBT,mDCpNjB,MAAMngB,EAAW,2BACXngG,EAAW,CACf,KACA,KACA,KACA,KACA,MACA,QACA,UACA,MACA,MACA,WACA,KACA,SACA,OACA,OACA,QACA,QACA,aACA,OACA,QACA,OACA,UACA,MACA,SACA,WACA,SACA,SACA,MACA,QACA,QACA,QAIA,WACA,QACA,QACA,SACA,SACA,OACA,SACA,UAEA,OACF,EACM4rG,EAAW,CACf,OACA,QACA,OACA,YACA,MACA,UACF,EAGMU,EAAQ,CAEZ,SACA,WACA,UACA,SAEA,OACA,OACA,SACA,SAEA,SACA,SAEA,QACA,eACA,eACA,YACA,aACA,oBACA,aACA,aACA,cACA,cACA,gBACA,iBAEA,MACA,MACA,UACA,UAEA,cACA,oBACA,UACA,WACA,OAEA,UACA,YACA,oBACA,gBAEA,UACA,QAEA,OAEA,aACF,EAEMqG,EAAc,CAClB,QACA,YACA,gBACA,aACA,iBACA,cACA,YACA,UACF,EAEMC,EAAmB,CACvB,cACA,aACA,gBACA,eAEA,UACA,UAEA,OACA,WACA,QACA,aACA,WACA,YACA,qBACA,YACA,qBACA,SACA,UACF,EAEMC,EAAqB,CACzB,YACA,OACA,QACA,UACA,SACA,WACA,eACA,iBACA,SACA,QACF,EAEMC,EAAY,CAAA,EAAG,OACnBF,EACAtG,EACAqG,CACF,EAWA,SAASI,EAAWt9B,EAAM,CACxB,MAAMwqB,EAAQxqB,EAAK,MAQbu9B,EAAgB,CAAC52G,GAAO,CAAE,MAAA1oF,EAAK,IAAO,CAC1C,MAAMnF,GAAM,KAAO6tF,GAAM,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S,OAAS,EAAG,EAAG,MAAO,EACxC,KAAQ,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACxC,KAAQ,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACxC,MAAS,CAAC,EAAG,OAAS,EAAG,EAAG,MAAO,EACnC,MAAS,CAAC,EAAG,OAAS,EAAG,EAAG,MAAO,EACnC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG,EAAG,MAAO,EACzC,MAAS,CAAC,OAAS,OAAS,EAAG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AM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACpC,GAAM,CAAC,QAAU,OAAS,EAAG,EAAG,IAAK,EACrC,GAAM,CAAC,QAAU,OAAS,EAAG,EAAG,IAAK,EACrC,GAAM,CAAC,QAAU,OAAS,EAAG,EAAG,IAAK,EACrC,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACpC,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACpC,GAAM,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACpC,GAAM,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACpC,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,OAAS,EAAG,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,EAAG,EAAG,EAAG,IAAK,EACzB,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,OAAS,EAAG,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,KAAQ,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAChC,KAAQ,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAChC,KAAQ,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAChC,KAAQ,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,CAC1C,CACA,EA+BIC,GAAe,CACjB,MAAO,CAAC,IAAO,IAAO,GAAK,EAE3B,MAAO,CAAC,EAAO,EAAO,CAAK,EAE3B,QAAS,CAAC,EAAO,EAAO,CAAK,EAE7B,OAAQ,CAAC,EAAO,EAAO,CAAK,EAE5B,QAAS,CAAC,KAAO,KAAO,IAAK,EAE7B,KAAM,CAAC,EAAO,MAAO,KAAK,EAE1B,WAAY,CAAC,EAAO,EAAO,CAAK,EAEhC,KAAM,CAAC,KAAO,KAAO,IAAK,EAE1B,KAAM,CAAC,KAAO,KAAO,IAAK,EAE1B,KAAM,CAAC,KAAO,KAAO,IAAK,EAE1B,OAAQ,CAAC,KAAO,KAAO,KAAK,EAE5B,OAAQ,CAAC,KAAO,KAAO,IAAK,EAE5B,KAAM,CAAC,KAAO,KAAO,IAAK,EAE1B,KAAM,CAAC,KAAO,KAAO,IAAK,EAE1B,KAAM,CAAC,KAAO,KAAO,IAAK,EAE1B,KAAM,CAAC,IAAO,KAAO,EAAK,EAE1B,KAAM,CAAC,KAAO,KAAO,EAAK,EAE1B,QAAS,CAAC,KAAO,KAAO,IAAK,EAE7B,QAAS,CAAC,IAAO,KAAO,EAAK,EAE7B,OAAQ,CAAC,KAAO,IAAO,IAAK,EAE5B,OAAQ,CAAC,KAAO,MAAO,IAAK,EAE5B,WAAY,CAAC,IAAO,IAAO,GAAK,EAOhC,qBAAsB,CAAC,IAAM,KAAO,IAAK,EAEzC,cAAe,CAAC,KAAO,KAAO,IAAK,EAEnC,cAAe,CAAC,KAAO,KAAO,IAAK,EAEnC,cAAe,CAAC,GAAK,GAAK,EAAG,EAE7B,cAAe,CAAC,GAAK,KAAO,IAAK,EAEjC,cAAe,CAAC,GAAK,KAAO,IAAK,EAIjC,kBAAmB,CAAC,IAAM,IAAM,GAAI,EAKpC,QAAS,CAAC,GAAM,GAAM,EAAI,EAG1B,cAAe,CAAC,GAAK,GAAK,EAAG,EAG7B,eAAgB,CAAC,IAAM,IAAM,GAAI,EAEjC,QAAS,CAAC,GAAK,GAAK,EAAG,EAEvB,SAAU,CAAC,IAAM,IAAM,GAAI,CAC7B,EAQIC,GAAoB,CAEtB,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IAEL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,GACP,EAKA,SAASC,GAAeC,EAAU/nR,EAAS,CACzC2nR,GAAgBI,CAAQ,EAAI/nR,CAC9B,CAQA,SAASgoR,GAAoB1nE,EAAW1oM,EAAM34B,EAAM,CAClD,GAAI,CAAC0oS,GAAgB/vQ,CAAI,EACvB,MAAM,IAAI,MAAM,oCAAsCA,EAAO,GAAG,EAElE,IAAI7hB,EAAKuqN,EAAU,WAAW,CAAC,EAC3BtgN,EAAU2nR,GAAgB/vQ,CAAI,EAAE7hB,CAAE,EAkBtC,GAjBI,CAACiK,GAAWsgN,EAAU,CAAC,IAAKunE,KAC9B9xR,EAAK8xR,GAAkBvnE,EAAU,CAAC,CAAC,EAAE,WAAW,CAAC,EACjDtgN,EAAU2nR,GAAgB/vQ,CAAI,EAAE7hB,CAAE,GAEhC,CAACiK,GAAW/gB,IAAS,QASnBslS,GAAmBxuR,CAAE,IACvBiK,EAAU2nR,GAAgB/vQ,CAAI,EAAE,EAAE,GAGlC5X,EACF,MAAO,CACL,MAAOA,EAAQ,CAAC,EAChB,OAAQA,EAAQ,CAAC,EACjB,OAAQA,EAAQ,CAAC,EACjB,KAAMA,EAAQ,CAAC,EACf,MAAOA,EAAQ,CAAC,CACtB,CAEA,CACA,IAAIioR,GAAyB,CAAA,EAI7B,SAASC,IAAiBt7T,EAAM,CAC9B,IAAIu7T,EAQJ,GAPIv7T,GAAQ,EACVu7T,EAAY,EACHv7T,GAAQ,EACjBu7T,EAAY,EAEZA,EAAY,EAEV,CAACF,GAAuBE,CAAS,EAAG,CACtC,IAAInoR,EAAUioR,GAAuBE,CAAS,EAAI,CAChD,WAAYP,GAAa,KAAKO,CAAS,EAAI,EACjD,EACI,QAAS77T,KAAOs7T,GACVA,GAAa,eAAet7T,CAAG,IACjC0zC,EAAQ1zC,CAAG,EAAIs7T,GAAat7T,CAAG,EAAE67T,CAAS,EAGhD,CACA,OAAOF,GAAuBE,CAAS,CACzC,CAuBA,IAAIC,IAAQ,CACV,IAAO,EACP,MAAS,EACT,MAAS,EACT,KAAQ,EACR,MAAS,EACT,IAAO,CACT,EACIC,IAAY,CACd,eAAgB,EAChB,QAAW,EACX,WAAY,EACZ,QAAW,EACX,QAAW,CACb,EACIC,GAAU,CACZ,KAAQ,CAAA,EACR,KAAQ,CAAA,CACV,EAEA,SAASC,EAAatpS,EAAM24B,EAAM3xB,EAAOyqL,EAASrrN,EAAMmjU,EAAmB,CACzEF,GAAQrpS,CAAI,EAAE55B,CAAI,EAAI,CACpB,KAAAuyD,EACA,MAAA3xB,EACA,QAAAyqL,CACJ,EACM83G,GAAqB93G,IACvB43G,GAAQrpS,CAAI,EAAEyxL,CAAO,EAAI43G,GAAQrpS,CAAI,EAAE55B,CAAI,EAE/C,CAIA,IAAIojU,EAAO,OACP76T,GAAO,OAEP86T,GAAO,OACPC,GAAM,MAEN/1P,GAAS,eACT41G,GAAM,MACNvqH,GAAQ,QACR9rB,GAAQ,QACRy2R,GAAU,UACVl4T,GAAK,WACLme,GAAO,OACPg6S,GAAQ,QACR12T,GAAM,MACNmqQ,GAAU,UACVwsD,GAAU,UAGdP,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,UAAW,EAAI,EACvDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,SAAU,EAAI,EACtDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,SAAU,EAAI,EACtDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,QAAS,EAAI,EACrDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,QAAQ,EAChDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,WAAY,EAAI,EACxDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,WAAY,EAAI,EACxDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,UAAW,EAAI,EACvDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,QAAS,EAAI,EACrDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,OAAQ,EAAI,EACpDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,OAAQ,EAAI,EACpDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,UAAW,EAAI,EACvDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,YAAY,EACpDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,WAAY,EAAI,EACxDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,UAAW,EAAI,EACvDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,eAAgB,EAAI,EAC5Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,eAAgB,EAAI,EAC5Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,UAAW,EAAI,EACvDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,UAAW,EAAI,EACvDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,OAAQ,EAAI,EACpDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,WAAY,EAAI,EACxDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,UAAW,EAAI,EACvDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,UAAW,EAAI,EACvDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,QAAQ,EAEhDo2T,EAAaE,EAAMC,GAAMG,GAAO,IAAU,SAAS,EACnDN,EAAaE,EAAMC,GAAMG,GAAO,IAAU,SAAS,EAGnDN,EAAaE,EAAMC,GAAMG,GAAO,IAAU,GAAQ,EAClDN,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,GAAQ,EAEpDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,KAAK,EACjDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,KAAK,EACjDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,KAAK,EACjDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,KAAK,EACjDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,UAAW,EAAI,EAC3DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,WAAY,EAAI,EAC5DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,SAAU,EAAI,EAC1DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,WAAY,EAAI,EAC5DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,UAAW,EAAI,EAC3DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,SAAU,EAAI,EAC1DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,QAAS,EAAI,EACzDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,YAAa,EAAI,EAC7DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,aAAc,EAAI,EAC9DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,OAAQ,EAAI,EACxDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,UAAW,EAAI,EAC3DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,gBAAiB,EAAI,EACjEP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,OAAQ,EAAI,EACxDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,cAAe,EAAI,EAC/DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,OAAQ,EAAI,EACxDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,cAAe,EAAI,EAC/DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,MAAO,EAAI,EACvDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,KAAK,EACjDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,MAAO,EAAI,EACvDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,KAAK,EAEjDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,OAAO,EACnDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,OAAO,EACnDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,cAAc,EAC1DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,QAAQ,EACpDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,QAAQ,EACpDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,iBAAiB,EAE7DP,EAAaE,EAAMC,GAAMzqQ,GAAO,IAAU,eAAgB,EAAI,EAC9DsqQ,EAAaE,EAAMC,GAAM75S,GAAM,IAAU,eAAgB,EAAI,EAC7D05S,EAAaE,EAAMC,GAAMzqQ,GAAO,IAAU,WAAY,EAAI,EAC1DsqQ,EAAaE,EAAMC,GAAM75S,GAAM,IAAU,WAAY,EAAI,EAEzD05S,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,OAAQ,EAAI,EACpD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,WAAY,EAAI,EACxD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,UAAW,EAAI,EACvD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,UAAW,EAAI,EACvD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,OAAO,EAC/C+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,UAAW,EAAI,EACvD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,YAAa,EAAI,EACzD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,WAAY,EAAI,EACxD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,WAAW,EACnD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,OAAQ,EAAI,EACpD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,SAAS,EACjD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,OAAO,EAE/C+/I,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,kBAAmB,EAAI,EAC/Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,cAAe,EAAI,EAC3Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,kBAAmB,EAAI,EAC/Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,mBAAoB,EAAI,EAChEo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,eAAgB,EAAI,EAC5Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,mBAAoB,EAAI,EAChEo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,mBAAoB,EAAI,EAChEo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,uBAAwB,EAAI,EACpEo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,mBAAoB,EAAI,EAChEo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,uBAAwB,EAAI,EACpEo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,WAAY,EAAI,EACxDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,eAAgB,EAAI,EAC5Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,YAAa,EAAI,EACzDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,kBAAmB,EAAI,EAC/Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,mBAAoB,EAAI,EAChEo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,YAAa,EAAI,EACzDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,kBAAmB,EAAI,EAC/Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,mBAAoB,EAAI,EAChEo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,YAAa,EAAI,EACzDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,oBAAqB,EAAI,EACjEo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,qBAAsB,EAAI,EAClEo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,YAAa,EAAI,EACzDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,sBAAuB,EAAI,EAEnEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,UAAW,EAAI,EAEtDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAc,EACrDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,UAAU,EACjDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,SAAU,EAAI,EACrDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,UAAW,EAAI,EACtDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAc,EACrDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,UAAW,EAAI,EACtDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,aAAc,EAAI,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,UAAW,EAAI,EAEtDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,YAAa,EAAI,EACxDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,aAAc,EAAI,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,gBAAiB,EAAI,EAC5Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,SAAU,EAAI,EACrDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAc,EACrDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,SAAU,EAAI,EACrDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,WAAY,EAAI,EACvDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,WAAY,EAAI,EACvDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,iBAAiB,EACxDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,oBAAqB,EAAI,EAChEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAe,EAAI,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,iBAAiB,EACxDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAgB,EAAI,EAC3Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,kBAAkB,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,SAAU,EAAI,EACrDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAc,EACrDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,UAAU,EACjDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,SAAU,EAAI,EACrDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,UAAW,EAAI,EACtDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAc,EACrDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,UAAW,EAAI,EACtDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,aAAc,EAAI,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,UAAW,EAAI,EAEtDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,YAAa,EAAI,EACxDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,aAAc,EAAI,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,gBAAiB,EAAI,EAE5Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,UAAW,EAAI,EACtDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,mBAAmB,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAe,EAAI,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,WAAY,EAAI,EACvDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,kBAAkB,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,qBAAsB,EAAI,EACjEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAe,EACtDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAe,EAAI,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,iBAAiB,EACxDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAgB,EAAI,EAC3Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,kBAAkB,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,WAAY,EAAI,EACvDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,aAAc,EAAI,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,aAAc,EAAI,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAe,EACtDo2T,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,SAAS,EAChD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,SAAS,EAEhD+/I,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAgB,EAAI,EAC3Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,gBAAiB,EAAI,EAC5Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAgB,EAAI,EAC3Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,gBAAiB,EAAI,EAC5Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,oBAAqB,EAAI,EAChEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,oBAAqB,EAAI,EAEhEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAe,EACtDo2T,EAAaE,EAAME,GAAKG,GAAS,IAAU,UAAU,EACrDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,gBAAgB,EAC3DP,EAAaE,EAAME,GAAKG,GAAS,IAAU,WAAW,EACtDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,YAAY,EACvDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,YAAY,EACvDP,EAAa36T,GAAM+6T,GAAKG,GAAS,IAAU,YAAY,EACvDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,kBAAmB,EAAI,EAClEP,EAAaE,EAAME,GAAKG,GAAS,IAAU,WAAW,EACtDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,OAAO,EAClDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,SAAU,EAAI,EACzDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,SAAU,EAAI,EACzDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,aAAa,EACxDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,iBAAiB,EAC5DP,EAAaE,EAAME,GAAKG,GAAS,IAAU,qBAAqB,EAChEP,EAAaE,EAAME,GAAKG,GAAS,IAAU,eAAe,EAC1DP,EAAaE,EAAME,GAAKG,GAAS,IAAU,gBAAgB,EAC3DP,EAAaE,EAAME,GAAKG,GAAS,IAAU,WAAW,EACtDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,mBAAoB,EAAI,EACnEP,EAAaE,EAAME,GAAKG,GAAS,IAAU,eAAgB,EAAI,EAE/DP,EAAaE,EAAME,GAAKG,GAAS,IAAU,QAAS,EAAI,EACxDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,GAAQ,EACpDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,UAAU,EACrDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,YAAY,EACvDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,UAAU,EACrDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,OAAO,EAClDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,WAAW,EAEtDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,QAAS,EAAI,EACxDP,EAAa36T,GAAM+6T,GAAKG,GAAS,IAAU,QAAS,EAAI,EACxDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,cAAe,EAAI,EAC9DP,EAAa36T,GAAM+6T,GAAKG,GAAS,IAAU,aAAa,EAExDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,SAAU,EAAI,EACzDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,WAAY,EAAI,EAC3DP,EAAaE,EAAME,GAAKG,GAAS,IAAU,UAAW,EAAI,EAE1DP,EAAaE,EAAME,GAAKG,GAAS,IAAU,YAAa,EAAI,EAC5DP,EAAaE,EAAME,GAAKG,GAAS,IAAU,YAAY,EAEvDP,EAAaE,EAAME,GAAK95S,GAAM,IAAU,cAAe,EAAI,EAC3D05S,EAAaE,EAAME,GAAK1qQ,GAAO,IAAU,cAAe,EAAI,EAC5DsqQ,EAAaE,EAAME,GAAK95S,GAAM,IAAU,cAAe,EAAI,EAC3D05S,EAAaE,EAAME,GAAK1qQ,GAAO,IAAU,cAAe,EAAI,EAE5DsqQ,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,SAAU,EAAI,EACrDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,aAAc,EAAI,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,gBAAiB,EAAI,EAC5Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,YAAa,EAAI,EACxDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAgB,EAAI,EAC3Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,aAAc,EAAI,EACzDo2T,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,WAAW,EAClD+/I,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,QAAS,EAAI,EACpDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,YAAa,EAAI,EACxDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAe,EAAI,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAgB,EAAI,EAC3Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,YAAY,EACnDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,iBAAkB,EAAI,EAC7Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,kBAAmB,EAAI,EAC9Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,YAAa,EAAI,EACxDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAe,EAAI,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAe,EAAI,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,WAAY,EAAI,EACvDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,aAAc,EAAI,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,gBAAiB,EAAI,EAC5Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,gBAAiB,EAAI,EAC5Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,YAAa,EAAI,EACxDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAgB,EAAI,EAC3Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,mBAAmB,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,kBAAkB,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,UAAW,EAAI,EACtDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,WAAY,EAAI,EACvDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAc,EACrDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAc,EACrDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,WAAY,EAAI,EACvDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,WAAY,EAAI,EACvDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,SAAU,EAAI,EACrDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,aAAc,EAAI,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAgB,EAAI,EAC3Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,WAAY,EAAI,EACvDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAe,EAAI,EAC1Do2T,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,UAAU,EACjD+/I,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,QAAS,EAAI,EACpDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,YAAa,EAAI,EACxDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAe,EAAI,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAgB,EAAI,EAC3Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,WAAY,EAAI,EACvDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,WAAY,EAAI,EACvDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAe,EAAI,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,YAAY,EACnDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAe,EACtDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAe,EAAI,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,WAAY,EAAI,EACvDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,aAAc,EAAI,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,gBAAiB,EAAI,EAC5Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,gBAAiB,EAAI,EAC5Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,YAAa,EAAI,EACxDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAgB,EAAI,EAC3Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,oBAAoB,EAC3Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,mBAAmB,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,UAAW,EAAI,EACtDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,YAAY,EACnDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,iBAAiB,EACxDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,YAAa,EAAI,EACxDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAe,EAAI,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,aAAa,EACpDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,qBAAqB,EAG5Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAe,EAAI,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAe,EACtDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,sBAAsB,EAG7Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,YAAa,EAAI,EACxDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,UAAU,EACjDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,SAAS,EAChDo2T,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,OAAO,EAC9C+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,OAAO,EAC9C+/I,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,UAAW,EAAI,EACtDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,QAAQ,EAChDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,UAAW,EAAI,EAEtDo2T,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,YAAa,EAAI,EACxD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,iBAAiB,EACxD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,QAAS,EAAI,EACpD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,QAAS,EAAI,EACpD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,mBAAoB,EAAI,EAC/D+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,aAAc,EAAI,EACzD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,YAAa,EAAI,EACxD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,kBAAmB,EAAI,EAC9D+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,WAAY,EAAI,EACvD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,WAAY,EAAI,EACvD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,mBAAoB,EAAI,EAC/D+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,oBAAqB,EAAI,EAChE+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,eAAgB,EAAI,EAC3D+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,aAAc,EAAI,EACzD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,gBAAiB,EAAI,EAC5D+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,eAAgB,EAAI,EAC3D+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,aAAa,EACpD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,aAAc,EAAI,EACzD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,aAAa,EACpD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,aAAa,EACpD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,aAAc,EAAI,EAIzD+/I,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,mBAAoB,EAAI,EAE/Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,kBAAmB,EAAI,EAC9Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,mBAAoB,EAAI,EAC/Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,oBAAqB,EAAI,EAChEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAgB,EAAI,EAC3Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,qBAAsB,EAAI,EACjEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,kBAAmB,EAAI,EAC9Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,kBAAmB,EAAI,EAC9Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,sBAAuB,EAAI,EAClEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,mBAAoB,EAAI,EAE/Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,oBAAqB,EAAI,EAChEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,QAAS,EAAI,EACpDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAgB,EAAI,EAC3Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,kBAAmB,EAAI,EAC9Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,oBAAqB,EAAI,EAChEo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,WAAY,EAAI,EACxDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,YAAa,EAAI,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,aAAc,EAAI,EACzDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,wBAAyB,EAAI,EACpEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,qBAAsB,EAAI,EACjEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,oBAAqB,EAAI,EAChEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,sBAAuB,EAAI,EAClEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,mBAAoB,EAAI,EAC/Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,mBAAoB,EAAI,EAC/Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,oBAAqB,EAAI,EAEhEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,qBAAsB,EAAI,EACjEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,QAAS,EAAI,EACpDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,mBAAoB,EAAI,EAC/Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,mBAAoB,EAAI,EAC/Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,qBAAsB,EAAI,EACjEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,oBAAqB,EAAI,EAChEo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,WAAW,EAClDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,gBAAiB,EAAI,EAC5Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,eAAe,EACtDo2T,EAAaE,EAAMC,GAAMI,GAAS,IAAU,GAAG,EAC/CP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,KAAK,EAC5CP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,KAAK,EAC5CP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,cAAc,EACrDP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,KAAK,EAC5CP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,KAAK,EAC5CP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,KAAK,EAC5CP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,KAAK,EAC5CP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,kBAAkB,EACzDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,UAAW,EAAI,EAC3DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,UAAW,EAAI,EAC3DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,SAAS,EACrDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,YAAY,EACxDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,UAAW,EAAI,EAC3DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,UAAW,EAAI,EAC3DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,UAAW,EAAI,EAC3DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,WAAY,EAAI,EAC5DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,OAAQ,EAAI,EACxDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,OAAQ,EAAI,EACxDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,UAAW,EAAI,EAC3DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,YAAa,EAAI,EAC7DP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,QAAS,EAAI,EACzDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,QAAS,EAAI,EACzDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,UAAW,EAAI,EAC3DP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,GAAQ,EAC/CP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,GAAQ,EAC/CP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,GAAQ,EAC/CP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,GAAQ,EAC/CP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,GAAQ,EAC/CP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,GAAQ,EAC/CP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,GAAQ,EAC/CP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,GAAQ,EAC/CP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,GAAQ,EAC/CP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,GAAQ,EAC/CP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,GAAQ,EAC/CP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,GAAQ,EAC/CP,EAAaE,EAAMC,GAAMI,GAAS,IAAK,GAAQ,EAC/CP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,QAAS,EAAI,EACzDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,QAAQ,EACpDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,OAAO,EACnDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,OAAO,EACnDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,YAAY,EACxDP,EAAaE,EAAME,GAAKG,GAAS,IAAU,cAAc,EACzDP,EAAaE,EAAMC,GAAME,GAAS,IAAU,UAAW,EAAI,EAC3DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,SAAU,EAAI,EAC1DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,UAAW,EAAI,EAC3DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,UAAW,EAAI,EAC3DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,YAAa,EAAI,EAC7DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,SAAU,EAAI,EAC1DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,QAAS,EAAI,EACzDL,EAAaE,EAAMC,GAAME,GAAS,IAAU,UAAW,EAAI,EAC3DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,SAAU,EAAI,EAC1DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,UAAW,EAAI,EAC3DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,WAAY,EAAI,EAC5DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,OAAQ,EAAI,EACxDL,EAAaE,EAAMC,GAAME,GAAS,IAAU,OAAQ,EAAI,EACxDL,EAAaE,EAAMC,GAAME,GAAS,IAAU,OAAQ,EAAI,EACxDL,EAAaE,EAAMC,GAAME,GAAS,IAAU,YAAa,EAAI,EAC7DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,OAAQ,EAAI,EACxDL,EAAaE,EAAMC,GAAME,GAAS,IAAU,QAAS,EAAI,EACzDL,EAAaE,EAAMC,GAAME,GAAS,IAAU,UAAW,EAAI,EAC3DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,QAAS,EAAI,EACzDL,EAAaE,EAAMC,GAAME,GAAS,IAAU,YAAa,EAAI,EAC7DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,QAAS,EAAI,EACzDL,EAAaE,EAAMC,GAAME,GAAS,IAAU,QAAS,EAAI,EACzDL,EAAaE,EAAMC,GAAME,GAAS,IAAU,QAAS,EAAI,EACzDL,EAAaE,EAAMC,GAAME,GAAS,IAAU,UAAW,EAAI,EAC3DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,eAAgB,EAAI,EAChEL,EAAaE,EAAMC,GAAME,GAAS,IAAU,aAAc,EAAI,EAC9DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,UAAW,EAAI,EAC3DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,WAAY,EAAI,EAC5DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,aAAc,EAAI,EAC9DL,EAAaE,EAAMC,GAAME,GAAS,IAAU,WAAY,EAAI,EAC5DL,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,IAAK,EAAI,EACjD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAK,GAAG,EACtC+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,IAAK,EAAI,EACjD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,SAAU,EAAI,EACtD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,SAAU,EAAI,EACtD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,QAAS,EAAI,EACrD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,OAAQ,EAAI,EACpD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,UAAW,EAAI,EACvD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,QAAS,EAAI,EACrD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,QAAS,EAAI,EACrD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,aAAc,EAAI,EAC1D+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,QAAQ,EAChD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,OAAO,EAC/C+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,UAAW,EAAI,EACvD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,QAAS,EAAI,EACrD+/I,EAAaE,EAAMC,GAAMI,GAAS,IAAU,QAAQ,EACpDP,EAAaE,EAAMC,GAAM75S,GAAM,IAAU,WAAY,EAAI,EACzD05S,EAAaE,EAAMC,GAAM75S,GAAM,IAAU,SAAS,EAClD05S,EAAaE,EAAMC,GAAM75S,GAAM,IAAU,SAAS,EAClD05S,EAAaE,EAAMC,GAAMzqQ,GAAO,IAAK,GAAG,EACxCsqQ,EAAaE,EAAMC,GAAMzqQ,GAAO,IAAK,GAAG,EACxCsqQ,EAAaE,EAAMC,GAAMzqQ,GAAO,IAAU,WAAY,EAAI,EAC1DsqQ,EAAaE,EAAMC,GAAMzqQ,GAAO,IAAU,SAAS,EACnDsqQ,EAAaE,EAAMC,GAAMzqQ,GAAO,IAAU,SAAS,EACnDsqQ,EAAaE,EAAMC,GAAMv2T,GAAK,IAAK,GAAG,EACtCo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAK,GAAG,EACtCo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,WAAY,EAAI,EACxDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,SAAU,EAAI,EACtDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,MAAM,EAC9Co2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,QAAS,EAAI,EACrDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,QAAQ,EAChDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAK,OAAQ,EAAI,EAC/Co2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,OAAQ,EAAI,EACpDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,QAAQ,EAChDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,WAAY,EAAI,EACxDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,WAAY,EAAI,EACxDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,aAAc,EAAI,EAC1Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,aAAc,EAAI,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAe,EAAI,EAC1Do2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,cAAe,EAAI,EAC1Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,UAAU,EAClDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,cAAe,EAAI,EAC3Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,MAAM,EAC9Co2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,QAAS,EAAI,EACrDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAK,OAAQ,EAAI,EAC/Co2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,eAAgB,EAAI,EAC5Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,MAAM,EAC9Co2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,SAAU,EAAI,EACrDo2T,EAAaE,EAAME,GAAKx2T,GAAK,IAAU,SAAU,EAAI,EACrDo2T,EAAaE,EAAMC,GAAMpsD,GAAS,IAAU,KAAK,EACjDisD,EAAaE,EAAMC,GAAMpsD,GAAS,IAAU,SAAS,EAErDisD,EAAaE,EAAMC,GAAMpsD,GAAS,IAAU,gBAAgB,EAC5DisD,EAAa36T,GAAM86T,GAAMpsD,GAAS,IAAU,KAAK,EACjDisD,EAAa36T,GAAM86T,GAAMpsD,GAAS,IAAU,GAAG,EAC/CisD,EAAa36T,GAAM86T,GAAMpsD,GAAS,IAAU,SAAS,EACrDisD,EAAa36T,GAAM86T,GAAMpsD,GAAS,IAAU,gBAAgB,EAC5DisD,EAAaE,EAAMC,GAAMpsD,GAAS,KAAM,WAAW,EACnDisD,EAAaE,EAAMC,GAAMpsD,GAAS,KAAM,cAAc,EACtDisD,EAAaE,EAAMC,GAAMG,GAAO,IAAK,GAAG,EACxCN,EAAaE,EAAMC,GAAMG,GAAO,IAAK,GAAG,EACxCN,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,aAAc,EAAI,EACzD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,WAAY,EAAI,EACvD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,SAAU,EAAI,EACtD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,UAAW,EAAI,EACvD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,WAAY,EAAI,EACxD+/I,EAAaE,EAAMC,GAAMI,GAAS,IAAU,YAAa,EAAI,EAC7DP,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,WAAY,EAAI,EACxD+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,gBAAiB,EAAI,EAC5D+/I,EAAaE,EAAME,GAAKngJ,GAAK,IAAU,WAAY,EAAI,EACvD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,iBAAiB,EACzD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,mBAAmB,EAC3D+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,UAAU,EAClD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,WAAW,EACnD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,QAAQ,EAChD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,gBAAgB,EACxD+/I,EAAaE,EAAMC,GAAMlgJ,GAAK,IAAU,iBAAiB,EACzD+/I,EAAaE,EAAMC,GAAM75S,GAAM,IAAK,KAAK,EACzC05S,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,KAAK,EAC5CP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,iBAAiB,EACxDP,EAAaE,EAAMC,GAAMzqQ,GAAO,IAAK,KAAK,EAC1CsqQ,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,KAAK,EAC5CP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,kBAAkB,EACzDP,EAAaE,EAAMC,GAAM75S,GAAM,IAAK,UAAU,EAC9C05S,EAAaE,EAAMC,GAAMzqQ,GAAO,IAAK,UAAU,EAC/CsqQ,EAAaE,EAAMC,GAAM75S,GAAM,IAAK,WAAY,EAAI,EACpD05S,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,WAAY,EAAI,EACvDP,EAAaE,EAAMC,GAAMzqQ,GAAO,IAAK,WAAY,EAAI,EACrDsqQ,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,WAAY,EAAI,EACvDP,EAAaE,EAAMC,GAAM75S,GAAM,IAAK,WAAY,EAAI,EACpD05S,EAAaE,EAAMC,GAAMzqQ,GAAO,IAAK,WAAY,EAAI,EACrDsqQ,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,aAAc,EAAI,EACzDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,gBAAiB,EAAI,EAC5DP,EAAaE,EAAMC,GAAM75S,GAAM,IAAU,WAAY,EAAI,EACzD05S,EAAaE,EAAMC,GAAMzqQ,GAAO,IAAU,WAAY,EAAI,EAC1DsqQ,EAAaE,EAAMC,GAAM75S,GAAM,IAAU,UAAW,EAAI,EACxD05S,EAAaE,EAAMC,GAAMzqQ,GAAO,IAAU,UAAW,EAAI,EACzDsqQ,EAAaE,EAAMC,GAAMI,GAAS,KAAM,aAAa,EACrDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,GAAG,EAC/CP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,QAAQ,EACpDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,YAAa,EAAI,EACxDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,KAAK,EACjDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,QAAQ,EACpDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,cAAc,EAC1DP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,kBAAkB,EACzDP,EAAa36T,GAAM86T,GAAMI,GAAS,KAAM,iBAAiB,EACzDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAK,mBAAmB,EAC1DP,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,YAAa,EAAI,EACzDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,YAAa,EAAI,EACzDo2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,cAAe,EAAI,EAC3Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,cAAe,EAAI,EAC3Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,gBAAiB,EAAI,EAC7Do2T,EAAaE,EAAMC,GAAMv2T,GAAK,IAAU,gBAAiB,EAAI,EAC7Do2T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,UAAU,EACjD63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,UAAU,EACjD63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,YAAY,EACnD63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,YAAY,EACnD63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,UAAU,EACjD63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,UAAU,EACjD63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,OAAO,EAC9C63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,SAAS,EAChD63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,QAAQ,EAC/C63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,SAAS,EAChD63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,QAAQ,EAC/C63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,OAAO,EAC9C63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,aAAa,EACpD63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,YAAY,EACnD63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,WAAW,EAClD63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,QAAQ,EAC/C63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,SAAS,EAChD63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,UAAU,EACjD63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,YAAY,EACnD63T,EAAaE,EAAMC,GAAMh4T,GAAI,IAAU,YAAY,EACnD63T,EAAa36T,GAAM86T,GAAMv2R,GAAO,IAAU,gBAAgB,EAC1Do2R,EAAaE,EAAMC,GAAMv2R,GAAO,IAAU,gBAAgB,EAC1Do2R,EAAa36T,GAAM86T,GAAMv2R,GAAO,IAAU,UAAW,EAAI,EACzDo2R,EAAaE,EAAMC,GAAMv2R,GAAO,IAAU,UAAW,EAAI,EACzDo2R,EAAaE,EAAMC,GAAMv2R,GAAO,IAAU,WAAY,EAAI,EAC1Do2R,EAAaE,EAAMC,GAAMv2R,GAAO,IAAU,UAAW,EAAI,EAEzDo2R,EAAaE,EAAMC,GAAMI,GAAS,IAAU,YAAY,EACxDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,YAAY,EACxDP,EAAaE,EAAMC,GAAM91P,GAAQ,IAAU,SAAS,EACpD21P,EAAaE,EAAMC,GAAM91P,GAAQ,IAAU,SAAS,EACpD21P,EAAaE,EAAMC,GAAM91P,GAAQ,IAAU,QAAQ,EACnD21P,EAAaE,EAAMC,GAAM91P,GAAQ,IAAU,SAAS,EACpD21P,EAAaE,EAAMC,GAAM91P,GAAQ,IAAU,OAAO,EAClD21P,EAAaE,EAAMC,GAAM91P,GAAQ,IAAU,SAAS,EACpD21P,EAAaE,EAAMC,GAAM91P,GAAQ,IAAU,SAAS,EACpD21P,EAAaE,EAAMC,GAAM91P,GAAQ,IAAU,OAAO,EAClD21P,EAAaE,EAAMC,GAAM91P,GAAQ,IAAU,OAAO,EAClD21P,EAAaE,EAAMC,GAAM91P,GAAQ,IAAU,OAAO,EAClD21P,EAAaE,EAAMC,GAAM91P,GAAQ,IAAU,YAAY,EAEvD21P,EAAaE,EAAMC,GAAME,GAAS,IAAU,UAAU,EACtDL,EAAaE,EAAMC,GAAME,GAAS,IAAU,UAAU,EACtDL,EAAaE,EAAMC,GAAMI,GAAS,IAAU,GAAQ,EACpDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,GAAQ,EACpDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,MAAO,EAAI,EACvDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,MAAO,EAAI,EACvDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,OAAQ,EAAI,EACxDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,OAAQ,EAAI,EACxDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,OAAQ,EAAI,EACxDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,MAAO,EAAI,EACvDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,OAAQ,EAAI,EACxDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,OAAQ,EAAI,EACxDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,MAAO,EAAI,EACvDP,EAAa36T,GAAM86T,GAAM91P,GAAQ,IAAU,KAAK,EAChD21P,EAAa36T,GAAM86T,GAAM91P,GAAQ,IAAU,KAAK,EAChD21P,EAAa36T,GAAM86T,GAAM91P,GAAQ,IAAU,KAAK,EAChD21P,EAAa36T,GAAM86T,GAAM91P,GAAQ,IAAU,KAAK,EAChD21P,EAAa36T,GAAM86T,GAAM91P,GAAQ,IAAU,KAAK,EAChD21P,EAAa36T,GAAM86T,GAAM91P,GAAQ,IAAU,KAAK,EAChD21P,EAAa36T,GAAM86T,GAAM91P,GAAQ,IAAU,KAAK,EAChD21P,EAAa36T,GAAM86T,GAAM91P,GAAQ,IAAU,KAAK,EAChD21P,EAAa36T,GAAM86T,GAAM91P,GAAQ,IAAU,KAAK,EAChD21P,EAAa36T,GAAM86T,GAAM91P,GAAQ,IAAU,KAAK,EAChD21P,EAAa36T,GAAM86T,GAAM91P,GAAQ,IAAU,KAAK,EAChD21P,EAAa36T,GAAM86T,GAAM91P,GAAQ,IAAU,KAAK,EAChD21P,EAAa36T,GAAM86T,GAAM91P,GAAQ,IAAU,eAAe,EAE1D,IAAIm2P,GAAY,CACd,KAAM,GACN,MAAO,GACP,KAAM,GACN,KAAM,EACR,EACAR,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,KAAM,EAAI,EACtDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,cAAc,EAC1DP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,MAAO,EAAI,EACvDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,cAAc,EAC1DP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,IAAK,EAAI,EACrDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,iBAAiB,EAC7DP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,IAAK,EAAI,EACrDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,kBAAkB,EAC9DP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,KAAM,EAAI,EACtDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,oBAAoB,EAChEP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,KAAM,EAAI,EACtDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,qBAAqB,EAEjEP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,WAAY,EAAI,EAC5DP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,UAAU,EAEtDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,eAAgB,EAAI,EAGhEP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,UAAU,EACtDP,EAAaE,EAAMC,GAAMI,GAAS,IAAU,iBAAkB,EAAI,EAClEP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,UAAU,EACtDP,EAAa36T,GAAM86T,GAAMI,GAAS,IAAU,iBAAkB,EAAI,EAClEP,EAAaE,EAAME,GAAKG,GAAS,IAAU,WAAW,EACtDP,EAAa36T,GAAM+6T,GAAKG,GAAS,IAAU,WAAW,EAItD,QADIE,GAAkB,iBACbt7T,GAAI,EAAGA,GAAIs7T,GAAgB,OAAQt7T,KAAK,CAC/C,IAAIqoC,GAAKizR,GAAgB,OAAOt7T,EAAC,EACjC66T,EAAaE,EAAMC,GAAMI,GAAS/yR,GAAIA,EAAE,CAC1C,CAGA,QADIkzR,GAAc,4BACT10S,GAAK,EAAGA,GAAK00S,GAAY,OAAQ10S,KAAM,CAC9C,IAAI20S,GAAMD,GAAY,OAAO10S,EAAE,EAC/Bg0S,EAAa36T,GAAM86T,GAAMI,GAASI,GAAKA,EAAG,CAC5C,CAGA,QADIC,GAAU,uDACLC,GAAM,EAAGA,GAAMD,GAAQ,OAAQC,KAAO,CAC7C,IAAIC,GAAOF,GAAQ,OAAOC,EAAG,EAC7Bb,EAAaE,EAAMC,GAAME,GAASS,GAAMA,EAAI,EAC5Cd,EAAa36T,GAAM86T,GAAMI,GAASO,GAAMA,EAAI,CAC9C,CAEAd,EAAaE,EAAME,GAAKG,GAAS,IAAK,GAAQ,EAC9CP,EAAa36T,GAAM+6T,GAAKG,GAAS,IAAK,GAAQ,EAC9CP,EAAaE,EAAME,GAAKG,GAAS,IAAK,GAAQ,EAC9CP,EAAa36T,GAAM+6T,GAAKG,GAAS,IAAK,GAAQ,EAC9CP,EAAaE,EAAME,GAAKG,GAAS,IAAK,GAAQ,EAC9CP,EAAa36T,GAAM+6T,GAAKG,GAAS,IAAK,GAAQ,EAC9CP,EAAaE,EAAME,GAAKG,GAAS,IAAK,GAAQ,EAC9CP,EAAa36T,GAAM+6T,GAAKG,GAAS,IAAK,GAAQ,EAC9CP,EAAaE,EAAME,GAAKG,GAAS,IAAK,GAAQ,EAC9CP,EAAa36T,GAAM+6T,GAAKG,GAAS,IAAK,GAAQ,EAC9CP,EAAaE,EAAME,GAAKG,GAAS,IAAK,GAAQ,EAC9CP,EAAa36T,GAAM+6T,GAAKG,GAAS,IAAK,GAAQ,EAC9CP,EAAaE,EAAME,GAAKG,GAAS,IAAK,GAAQ,EAC9CP,EAAa36T,GAAM+6T,GAAKG,GAAS,IAAK,GAAQ,EAC9CP,EAAaE,EAAMC,GAAME,GAAS,IAAK,GAAQ,EAC/CL,EAAa36T,GAAM86T,GAAME,GAAS,IAAK,GAAQ,EAO/C,QADIU,GAAW,GACNC,GAAM,EAAGA,GAAMJ,GAAQ,OAAQI,KAAO,CAC7C,IAAIC,GAAOL,GAAQ,OAAOI,EAAG,EAI7BD,GAAW,OAAO,aAAa,MAAQ,MAASC,EAAG,EACnDhB,EAAaE,EAAMC,GAAME,GAASY,GAAMF,EAAQ,EAChDf,EAAa36T,GAAM86T,GAAMI,GAASU,GAAMF,EAAQ,EAChDA,GAAW,OAAO,aAAa,MAAQ,MAASC,EAAG,EACnDhB,EAAaE,EAAMC,GAAME,GAASY,GAAMF,EAAQ,EAChDf,EAAa36T,GAAM86T,GAAMI,GAASU,GAAMF,EAAQ,EAChDA,GAAW,OAAO,aAAa,MAAQ,MAASC,EAAG,EACnDhB,EAAaE,EAAMC,GAAME,GAASY,GAAMF,EAAQ,EAChDf,EAAa36T,GAAM86T,GAAMI,GAASU,GAAMF,EAAQ,EAChDA,GAAW,OAAO,aAAa,MAAQ,MAASC,EAAG,EACnDhB,EAAaE,EAAMC,GAAME,GAASY,GAAMF,EAAQ,EAChDf,EAAa36T,GAAM86T,GAAMI,GAASU,GAAMF,EAAQ,EAChDA,GAAW,OAAO,aAAa,MAAQ,MAASC,EAAG,EACnDhB,EAAaE,EAAMC,GAAME,GAASY,GAAMF,EAAQ,EAChDf,EAAa36T,GAAM86T,GAAMI,GAASU,GAAMF,EAAQ,EAChDA,GAAW,OAAO,aAAa,MAAQ,MAASC,EAAG,EACnDhB,EAAaE,EAAMC,GAAME,GAASY,GAAMF,EAAQ,EAChDf,EAAa36T,GAAM86T,GAAMI,GAASU,GAAMF,EAAQ,EAChDA,GAAW,OAAO,aAAa,MAAQ,MAASC,EAAG,EACnDhB,EAAaE,EAAMC,GAAME,GAASY,GAAMF,EAAQ,EAChDf,EAAa36T,GAAM86T,GAAMI,GAASU,GAAMF,EAAQ,EAChDA,GAAW,OAAO,aAAa,MAAQ,MAASC,EAAG,EACnDhB,EAAaE,EAAMC,GAAME,GAASY,GAAMF,EAAQ,EAChDf,EAAa36T,GAAM86T,GAAMI,GAASU,GAAMF,EAAQ,EAChDA,GAAW,OAAO,aAAa,MAAQ,MAASC,EAAG,EACnDhB,EAAaE,EAAMC,GAAME,GAASY,GAAMF,EAAQ,EAChDf,EAAa36T,GAAM86T,GAAMI,GAASU,GAAMF,EAAQ,EAC5CC,GAAM,KAGRD,GAAW,OAAO,aAAa,MAAQ,MAASC,EAAG,EACnDhB,EAAaE,EAAMC,GAAME,GAASY,GAAMF,EAAQ,EAChDf,EAAa36T,GAAM86T,GAAMI,GAASU,GAAMF,EAAQ,EAChDA,GAAW,OAAO,aAAa,MAAQ,MAASC,EAAG,EACnDhB,EAAaE,EAAMC,GAAME,GAASY,GAAMF,EAAQ,EAChDf,EAAa36T,GAAM86T,GAAMI,GAASU,GAAMF,EAAQ,EAGpD,CAEAA,GAAW,KACXf,EAAaE,EAAMC,GAAME,GAAS,IAAKU,EAAQ,EAC/Cf,EAAa36T,GAAM86T,GAAMI,GAAS,IAAKQ,EAAQ,EAE/C,QAASG,GAAM,EAAGA,GAAM,GAAIA,KAAO,CACjC,IAAIC,GAAOD,GAAI,SAAQ,EACvBH,GAAW,OAAO,aAAa,MAAQ,MAASG,EAAG,EACnDlB,EAAaE,EAAMC,GAAME,GAASc,GAAMJ,EAAQ,EAChDf,EAAa36T,GAAM86T,GAAMI,GAASY,GAAMJ,EAAQ,EAChDA,GAAW,OAAO,aAAa,MAAQ,MAASG,EAAG,EACnDlB,EAAaE,EAAMC,GAAME,GAASc,GAAMJ,EAAQ,EAChDf,EAAa36T,GAAM86T,GAAMI,GAASY,GAAMJ,EAAQ,EAChDA,GAAW,OAAO,aAAa,MAAQ,MAASG,EAAG,EACnDlB,EAAaE,EAAMC,GAAME,GAASc,GAAMJ,EAAQ,EAChDf,EAAa36T,GAAM86T,GAAMI,GAASY,GAAMJ,EAAQ,EAChDA,GAAW,OAAO,aAAa,MAAQ,MAASG,EAAG,EACnDlB,EAAaE,EAAMC,GAAME,GAASc,GAAMJ,EAAQ,EAChDf,EAAa36T,GAAM86T,GAAMI,GAASY,GAAMJ,EAAQ,CAClD,CAMA,QADIK,GAAa,MACRC,GAAM,EAAGA,GAAMD,GAAW,OAAQC,KAAO,CAChD,IAAIC,GAAOF,GAAW,OAAOC,EAAG,EAChCrB,EAAaE,EAAMC,GAAME,GAASiB,GAAMA,EAAI,EAC5CtB,EAAa36T,GAAM86T,GAAMI,GAASe,GAAMA,EAAI,CAC9C,CAkBA,IAAIC,GAAsB,CAAC,CAAC,SAAU,SAAU,WAAW,EAE3D,CAAC,SAAU,SAAU,WAAW,EAEhC,CAAC,aAAc,SAAU,aAAa,EAEtC,CAAC,aAAc,SAAU,aAAa,EAEtC,CAAC,aAAc,aAAc,iBAAiB,EAE9C,CAAC,aAAc,aAAc,iBAAiB,EAI9C,CAAC,UAAW,UAAW,gBAAgB,EAEvC,CAAC,GAAI,GAAI,EAAE,EAEX,CAAC,GAAI,GAAI,EAAE,EAEX,CAAC,GAAI,GAAI,EAAE,EAEX,CAAC,WAAY,WAAY,iBAAiB,EAE1C,CAAC,WAAY,WAAY,iBAAiB,EAE1C,CAAC,SAAU,SAAU,aAAa,EAElC,CAAC,SAAU,SAAU,aAAa,EAGlC,CAAC,eAAgB,eAAgB,iBAAiB,EAElD,CAAC,eAAgB,eAAgB,iBAAiB,EAElD,CAAC,SAAU,SAAU,mBAAmB,EAExC,CAAC,SAAU,SAAU,mBAAmB,EAExC,CAAC,aAAc,aAAc,gBAAgB,EAE7C,CAAC,aAAc,aAAc,gBAAgB,EAE7C,CAAC,WAAY,WAAY,kBAAkB,EAE3C,CAAC,WAAY,WAAY,kBAAkB,EAE3C,CAAC,GAAI,GAAI,EAAE,EAEX,CAAC,GAAI,GAAI,EAAE,EAEX,CAAC,SAAU,SAAU,oBAAoB,EAEzC,CAAC,SAAU,SAAU,oBAAoB,CACzC,EACIC,GAAkB,CAAC,CAAC,SAAU,SAAU,WAAW,EAEvD,CAAC,GAAI,GAAI,EAAE,EAEX,CAAC,SAAU,SAAU,mBAAmB,EAExC,CAAC,aAAc,aAAc,gBAAgB,EAE7C,CAAC,SAAU,SAAU,oBAAoB,CACzC,EACIC,IAAoB,CAACV,EAAUrqS,IAAS,CAE1C,IAAI+M,EAAIs9R,EAAS,WAAW,CAAC,EACzBpnH,EAAIonH,EAAS,WAAW,CAAC,EACzBW,GAAaj+R,EAAI,OAAU,MAASk2K,EAAI,OAAU,MAClDriM,EAAIof,IAAS,OAAS,EAAI,EAC9B,GAAI,QAAWgrS,GAAaA,EAAY,OAAS,CAG/C,IAAIv8T,EAAI,KAAK,OAAOu8T,EAAY,QAAW,EAAE,EAC7C,MAAO,CAACH,GAAoBp8T,CAAC,EAAE,CAAC,EAAGo8T,GAAoBp8T,CAAC,EAAEmS,CAAC,CAAC,CAC9D,SAAW,QAAWoqT,GAAaA,GAAa,OAAS,CAEvD,IAAI11S,EAAK,KAAK,OAAO01S,EAAY,QAAW,EAAE,EAC9C,MAAO,CAACF,GAAgBx1S,CAAE,EAAE,CAAC,EAAGw1S,GAAgBx1S,CAAE,EAAE1U,CAAC,CAAC,CACxD,KAAO,IAAIoqT,IAAc,QAAWA,IAAc,OAEhD,MAAO,CAACH,GAAoB,CAAC,EAAE,CAAC,EAAGA,GAAoB,CAAC,EAAEjqT,CAAC,CAAC,EACvD,GAAI,OAAUoqT,GAAaA,EAAY,OAE5C,MAAO,CAAC,GAAI,EAAE,EAGd,MAAM,IAAIjI,GAAW,0BAA4BsH,CAAQ,EAE7D,EAOIY,GAAe,SAAsBx1T,EAEzCqzT,EAAU9oS,EAAM,CAEd,GAAIqpS,GAAQrpS,CAAI,EAAEvqB,CAAK,EAAG,CACxB,IAAIknM,EAAc0sH,GAAQrpS,CAAI,EAAEvqB,CAAK,EAAE,QACnCknM,IACFlnM,EAAQknM,EAEZ,CACA,MAAO,CACL,MAAAlnM,EACA,QAASszT,GAAoBtzT,EAAOqzT,EAAU9oS,CAAI,CACtD,CACA,EAWIkrS,GAAa,SAAoBz1T,EAAOqzT,EAAU9oS,EAAMla,EAASq7K,EAAS,CAC5E,IAAI9mL,EAAS4wT,GAAax1T,EAAOqzT,EAAU9oS,CAAI,EAC3C+gB,EAAU1mC,EAAO,QACrB5E,EAAQ4E,EAAO,MACf,IAAI8wT,EACJ,GAAIpqR,EAAS,CACX,IAAI48N,EAAS58N,EAAQ,QACjB/gB,IAAS,QAAUla,GAAWA,EAAQ,OAAS,YACjD63P,EAAS,GAEXwtD,EAAa,IAAItD,GAAWpyT,EAAOsrC,EAAQ,OAAQA,EAAQ,MAAO48N,EAAQ58N,EAAQ,KAAMA,EAAQ,MAAOogJ,CAAO,CAChH,MAEE,OAAO,QAAY,KAAe,QAAQ,KAAK,yBAA2B,QAAU1rL,EAAQ,eAAiBqzT,EAAW,eAAiB9oS,EAAO,IAAI,EACpJmrS,EAAa,IAAItD,GAAWpyT,EAAO,EAAG,EAAG,EAAG,EAAG,EAAG0rL,CAAO,EAE3D,GAAIr7K,EAAS,CACXqlT,EAAW,YAAcrlT,EAAQ,eAC7BA,EAAQ,MAAM,WAChBqlT,EAAW,QAAQ,KAAK,QAAQ,EAElC,IAAIxzP,EAAQ7xD,EAAQ,SAAQ,EACxB6xD,IACFwzP,EAAW,MAAM,MAAQxzP,EAE7B,CACA,OAAOwzP,CACT,EAKIC,GAAU,SAAiB31T,EAAOuqB,EAAMla,EAASq7K,EAAS,CAW5D,OAVIA,IAAY,SACdA,EAAU,CAAA,GASRr7K,EAAQ,OAAS,cAAgBmlT,GAAax1T,EAAO,YAAauqB,CAAI,EAAE,QACnEkrS,GAAWz1T,EAAO,YAAauqB,EAAMla,EAASq7K,EAAQ,OAAO,CAAC,QAAQ,CAAC,CAAC,EACtE1rL,IAAU,MAAQ4zT,GAAQrpS,CAAI,EAAEvqB,CAAK,EAAE,OAAS,OAClDy1T,GAAWz1T,EAAO,eAAgBuqB,EAAMla,EAASq7K,CAAO,EAExD+pI,GAAWz1T,EAAO,cAAeuqB,EAAMla,EAASq7K,EAAQ,OAAO,CAAC,OAAO,CAAC,CAAC,CAEpF,EAOIkqI,IAAa,SAAoB51T,EAAOuqB,EAAMla,EAASq7K,EAAStuL,EAAM,CACxE,OAAIA,IAAS,WAAao4T,GAAax1T,EAAO,kBAAmBuqB,CAAI,EAAE,QAC9D,CACL,SAAU,kBACV,UAAW,YACjB,EAIW,CACL,SAAU,YACV,UAAW,QACjB,CAEA,EAIIsrS,GAAU,SAAiBtkS,EAAOlhB,EAASjT,EAAM,CACnD,IAAImtB,EAAOgH,EAAM,KACbr4B,EAAOq4B,EAAM,KACbm6J,EAAU,CAAC,MAAM,EAEjBoqI,EAASvrS,IAAS,QAAUA,IAAS,QAAUla,EAAQ,KACvD0lT,EAAeD,EAASzlT,EAAQ,KAAOA,EAAQ,WAC/C2lT,EAAe,GACfC,EAAgB,GAIpB,GAHI/8T,EAAK,WAAW,CAAC,IAAM,QACzB,CAAC88T,EAAcC,CAAa,EAAIX,IAAkBp8T,EAAMqxB,CAAI,GAE1DyrS,EAAa,OAAS,EAExB,OAAOP,GAAWv8T,EAAM88T,EAAczrS,EAAMla,EAASq7K,EAAQ,OAAOuqI,CAAa,CAAC,EAC7E,GAAIF,EAAc,CACvB,IAAI1C,EACA6C,EACJ,GAAIH,IAAiB,aAAc,CACjC,IAAInzC,EAAWgzC,IAAW18T,EAAMqxB,EAAMla,EAASq7K,EAAStuL,CAAI,EAC5Di2T,EAAWzwC,EAAS,SACpBszC,EAAc,CAACtzC,EAAS,SAAS,CACnC,MAAWkzC,GACTzC,EAAW8C,GAAQJ,CAAY,EAAE,SACjCG,EAAc,CAACH,CAAY,IAE3B1C,EAAW+C,GAAqBL,EAAc1lT,EAAQ,WAAYA,EAAQ,SAAS,EACnF6lT,EAAc,CAACH,EAAc1lT,EAAQ,WAAYA,EAAQ,SAAS,GAEpE,GAAImlT,GAAat8T,EAAMm6T,EAAU9oS,CAAI,EAAE,QACrC,OAAOkrS,GAAWv8T,EAAMm6T,EAAU9oS,EAAMla,EAASq7K,EAAQ,OAAOwqI,CAAW,CAAC,EACvE,GAAI7B,GAAU,eAAen7T,CAAI,GAAKm6T,EAAS,MAAM,EAAG,EAAE,IAAM,aAAc,CAGnF,QADIp9T,EAAQ,CAAA,EACH+C,EAAI,EAAGA,EAAIE,EAAK,OAAQF,IAC/B/C,EAAM,KAAKw/T,GAAWv8T,EAAKF,CAAC,EAAGq6T,EAAU9oS,EAAMla,EAASq7K,EAAQ,OAAOwqI,CAAW,CAAC,CAAC,EAEtF,OAAOG,GAAapgU,CAAK,CAC3B,CACF,CAEA,GAAImH,IAAS,UACX,OAAOq4T,GAAWv8T,EAAM,cAAeqxB,EAAMla,EAASq7K,EAAQ,OAAO,CAAC,YAAY,CAAC,CAAC,EAC/E,GAAItuL,IAAS,UAAW,CAC7B,IAAI8lD,EAAO0wQ,GAAQrpS,CAAI,EAAErxB,CAAI,GAAK06T,GAAQrpS,CAAI,EAAErxB,CAAI,EAAE,KACtD,GAAIgqD,IAAS,MAAO,CAClB,IAAIozQ,EAAYF,GAAqB,QAAS/lT,EAAQ,WAAYA,EAAQ,SAAS,EACnF,OAAOolT,GAAWv8T,EAAMo9T,EAAW/rS,EAAMla,EAASq7K,EAAQ,OAAO,QAASr7K,EAAQ,WAAYA,EAAQ,SAAS,CAAC,CAClH,SAAW6yC,IAAS,QAAU,CAACA,EAAM,CACnC,IAAIqzQ,EAAaH,GAAqB,SAAU/lT,EAAQ,WAAYA,EAAQ,SAAS,EACrF,OAAOolT,GAAWv8T,EAAMq9T,EAAYhsS,EAAMla,EAASq7K,EAAQ,OAAOr7K,EAAQ,WAAYA,EAAQ,SAAS,CAAC,CAC1G,KAAO,CAEL,IAAImmT,EAAaJ,GAAqBlzQ,EAAM7yC,EAAQ,WAAYA,EAAQ,SAAS,EAEjF,OAAOolT,GAAWv8T,EAAMs9T,EAAYjsS,EAAMla,EAASq7K,EAAQ,OAAO8qI,EAAYnmT,EAAQ,WAAYA,EAAQ,SAAS,CAAC,CACtH,CACF,KACE,OAAM,IAAI,MAAM,oBAAsBjT,EAAO,aAAa,CAE9D,EAMIq5T,IAAa,CAAChqS,EAAMxe,IAAS,CAC/B,GAAIwjT,GAAYhlS,EAAK,OAAO,IAAMglS,GAAYxjT,EAAK,OAAO,GAAKwe,EAAK,OAASxe,EAAK,MAAQwe,EAAK,cAAgBxe,EAAK,aAAewe,EAAK,SAAW,GAAKA,EAAK,SAAS,YAAY,EAChL,MAAO,GAIT,GAAIA,EAAK,QAAQ,SAAW,EAAG,CAC7B,IAAIqoC,EAAMroC,EAAK,QAAQ,CAAC,EACxB,GAAIqoC,IAAQ,QAAUA,IAAQ,OAC5B,MAAO,EAEX,CACA,QAASl9D,KAAO,OAAO,KAAK60B,EAAK,KAAK,EACpC,GAAIA,EAAK,MAAM70B,CAAG,IAAMqW,EAAK,MAAMrW,CAAG,EACpC,MAAO,GAGX,QAASqrJ,KAAQ,OAAO,KAAKh1I,EAAK,KAAK,EACrC,GAAIwe,EAAK,MAAMw2H,CAAI,IAAMh1I,EAAK,MAAMg1I,CAAI,EACtC,MAAO,GAGX,MAAO,EACT,EAKIyzK,GAAkBhgU,GAAS,CAC7B,QAASsC,EAAI,EAAGA,EAAItC,EAAM,OAAS,EAAGsC,IAAK,CACzC,IAAIyzB,EAAO/1B,EAAMsC,CAAC,EACdiV,EAAOvX,EAAMsC,EAAI,CAAC,EAClByzB,aAAgB2lS,IAAcnkT,aAAgBmkT,IAAcqE,IAAWhqS,EAAMxe,CAAI,IACnFwe,EAAK,MAAQxe,EAAK,KAClBwe,EAAK,OAAS,KAAK,IAAIA,EAAK,OAAQxe,EAAK,MAAM,EAC/Cwe,EAAK,MAAQ,KAAK,IAAIA,EAAK,MAAOxe,EAAK,KAAK,EAI5Cwe,EAAK,OAASxe,EAAK,OACnBvX,EAAM,OAAOsC,EAAI,EAAG,CAAC,EACrBA,IAEJ,CACA,OAAOtC,CACT,EAKIigU,GAA0B,SAAiCx4D,EAAM,CAInE,QAHI52M,EAAS,EACTxuD,EAAQ,EACR69T,EAAc,EACT59T,EAAI,EAAGA,EAAImlQ,EAAK,SAAS,OAAQnlQ,IAAK,CAC7C,IAAI29D,EAAQwnM,EAAK,SAASnlQ,CAAC,EACvB29D,EAAM,OAASpP,IACjBA,EAASoP,EAAM,QAEbA,EAAM,MAAQ59D,IAChBA,EAAQ49D,EAAM,OAEZA,EAAM,YAAcigQ,IACtBA,EAAcjgQ,EAAM,YAExB,CACAwnM,EAAK,OAAS52M,EACd42M,EAAK,MAAQplQ,EACbolQ,EAAK,YAAcy4D,CACrB,EASIC,GAAW,SAAkBnrI,EAASszD,EAAU3uO,EAASuY,EAAO,CAClE,IAAIgyB,EAAO,IAAIk3Q,GAAKpmI,EAASszD,EAAU3uO,EAASuY,CAAK,EACrD,OAAA+tS,GAAwB/7Q,CAAI,EACrBA,CACT,EAGIk8Q,GAAc,CAACprI,EAASszD,EAAU3uO,EAASuY,IAAU,IAAIkpS,GAAKpmI,EAASszD,EAAU3uO,EAASuY,CAAK,EAC/FmuS,GAAe,SAAsBryI,EAAWr0K,EAASsiR,EAAW,CACtE,IAAI7xO,EAAO+1Q,GAAS,CAACnyI,CAAS,EAAG,CAAA,EAAIr0K,CAAO,EAC5C,OAAAywC,EAAK,OAAS,KAAK,IAAI6xO,GAAatiR,EAAQ,cAAc,qBAAsBA,EAAQ,gBAAgB,EACxGywC,EAAK,MAAM,kBAAoB0wQ,GAAO1wQ,EAAK,MAAM,EACjDA,EAAK,YAAc,EACZA,CACT,EAKIk2Q,IAAa,SAAoBnmM,EAAM66D,EAASszD,EAAU3uO,EAAS,CACrE,IAAIpY,EAAS,IAAI+5T,GAAOnhM,EAAM66D,EAASszD,EAAU3uO,CAAO,EACxD,OAAAsmT,GAAwB1+T,CAAM,EACvBA,CACT,EAIIo+T,GAAe,SAAsBr3E,EAAU,CACjD,IAAI7vF,EAAW,IAAI9G,GAAiB22F,CAAQ,EAC5C,OAAA23E,GAAwBxnK,CAAQ,EACzBA,CACT,EAKI8nK,GAAe,SAAsB1lS,EAAOlhB,EAAS,CACvD,OAAIkhB,aAAiB82H,GACZwuK,GAAS,CAAA,EAAI,CAACtlS,CAAK,EAAGlhB,CAAO,EAE/BkhB,CACT,EAKI2lS,IAA2B,SAAkChuT,EAAQ,CACvE,GAAIA,EAAO,eAAiB,kBAAmB,CAO7C,QANIiuT,EAAcjuT,EAAO,SACrB81O,EAAW,CAACm4E,EAAY,CAAC,CAAC,EAG1BC,EAAS,CAACD,EAAY,CAAC,EAAE,MAAQA,EAAY,CAAC,EAAE,KAAK,MACrDE,EAAUD,EACLp+T,EAAI,EAAGA,EAAIm+T,EAAY,OAAQn+T,IAAK,CAC3C,IAAI09B,EAAO,CAACygS,EAAYn+T,CAAC,EAAE,MAAQq+T,EAAUF,EAAYn+T,CAAC,EAAE,KAAK,MAC7Dd,EAAOw+B,GAAQygS,EAAYn+T,EAAI,CAAC,EAAE,KAAK,OAASm+T,EAAYn+T,EAAI,CAAC,EAAE,KAAK,OAC5Eq+T,EAAUA,EAAU3gS,EACpBsoN,EAAS,KAAK,CACZ,KAAM,OACN,KAAA9mP,CACR,CAAO,EACD8mP,EAAS,KAAKm4E,EAAYn+T,CAAC,CAAC,CAC9B,CACA,MAAO,CACL,SAAAgmP,EACA,MAAOo4E,CACb,CACE,CACA,IAAIr+T,EACJ,GAAImQ,EAAO,eAAiB,MAAO,CAIjC,QADIi2C,EAASj2C,EAAO,aACX2W,EAAK,EAAGA,EAAK3W,EAAO,SAAS,OAAQ2W,IAAM,CAClD,IAAI82C,EAAQztD,EAAO,SAAS2W,CAAE,EAC9Bs/B,GAAUwX,EAAM,OAAS,OAASA,EAAM,KAAOA,EAAM,KAAK,OAASA,EAAM,KAAK,KAChF,CACA59D,EAAQomD,CACV,SAAWj2C,EAAO,eAAiB,SACjCnQ,EAAQ,CAACmQ,EAAO,iBACX,CACL,IAAI2rR,EAAa3rR,EAAO,SAAS,CAAC,EAClC,GAAI2rR,EAAW,OAAS,OACtB,MAAM,IAAI,MAAM,oCAAoC,EAEtD,GAAI3rR,EAAO,eAAiB,QAC1BnQ,EAAQ,CAAC87R,EAAW,KAAK,MAAQ3rR,EAAO,qBAC/BA,EAAO,eAAiB,gBACjCnQ,EAAQ,CAAC87R,EAAW,KAAK,UAEzB,OAAM,IAAI,MAAM,wBAA0B3rR,EAAO,aAAe,GAAG,CAEvE,CACA,MAAO,CACL,SAAUA,EAAO,SACjB,MAAAnQ,CACJ,CACA,EAOIu+T,GAAY,SAAmBpuT,EAAQmH,EAAS,CAalD,OAZI,CACF,SAAA2uO,EACA,MAAAjmP,CACJ,EAAMm+T,IAAyBhuT,CAAM,EAQ/BquT,EAAa,EACRv+T,EAAI,EAAGA,EAAIgmP,EAAS,OAAQhmP,IAAK,CACxC,IAAI29D,EAAQqoL,EAAShmP,CAAC,EACtB,GAAI29D,EAAM,OAAS,OAAQ,CACzB,IAAIwnM,EAAOxnM,EAAM,KACjB4gQ,EAAa,KAAK,IAAIA,EAAYp5D,EAAK,YAAaA,EAAK,MAAM,CACjE,CACF,CACAo5D,GAAc,EACd,IAAIC,EAASX,GAAS,CAAC,QAAQ,EAAG,CAAA,CAAE,EACpCW,EAAO,MAAM,OAAShG,GAAO+F,CAAU,EAMvC,QAJIE,EAAe,CAAA,EACfC,EAAS3+T,EACT4+T,EAAS5+T,EACTs+T,EAAUt+T,EACL27T,EAAM,EAAGA,EAAM11E,EAAS,OAAQ01E,IAAO,CAC9C,IAAIkD,EAAS54E,EAAS01E,CAAG,EACzB,GAAIkD,EAAO,OAAS,OAClBP,GAAWO,EAAO,SACb,CACL,IAAIC,EAAQD,EAAO,KACflsI,EAAUksI,EAAO,gBAAkB,CAAA,EACnChvS,EAAQgvS,EAAO,cAAgB,CAAA,EAC/BE,EAAYjB,GAASnrI,EAAS,CAAC8rI,EAAQK,CAAK,EAAG,OAAWjvS,CAAK,EACnEkvS,EAAU,MAAM,IAAMtG,GAAO,CAAC+F,EAAaF,EAAUQ,EAAM,KAAK,EAC5DD,EAAO,aACTE,EAAU,MAAM,WAAaF,EAAO,YAElCA,EAAO,cACTE,EAAU,MAAM,YAAcF,EAAO,aAEvCH,EAAa,KAAKK,CAAS,EAC3BT,GAAWQ,EAAM,OAASA,EAAM,KAClC,CACAH,EAAS,KAAK,IAAIA,EAAQL,CAAO,EACjCM,EAAS,KAAK,IAAIA,EAAQN,CAAO,CACnC,CAIA,IAAIU,EAAQlB,GAAS,CAAC,OAAO,EAAGY,CAAY,EAC5CM,EAAM,MAAM,OAASvG,GAAOmG,CAAM,EAElC,IAAInkU,EACJ,GAAIkkU,EAAS,EAAG,CAMd,IAAIM,EAAYnB,GAAS,CAAA,EAAI,EAAE,EAC3BoB,EAAapB,GAAS,CAAC,OAAO,EAAG,CAACmB,CAAS,CAAC,EAChDC,EAAW,MAAM,OAASzG,GAAO,CAACkG,CAAM,EAGxC,IAAIQ,EAAWrB,GAAS,CAAC,SAAS,EAAG,CAAC,IAAIzE,GAAW,GAAQ,CAAC,CAAC,EAC/D5+T,EAAO,CAACqjU,GAAS,CAAC,SAAS,EAAG,CAACkB,EAAOG,CAAQ,CAAC,EAAGrB,GAAS,CAAC,SAAS,EAAG,CAACoB,CAAU,CAAC,CAAC,CACvF,MACEzkU,EAAO,CAACqjU,GAAS,CAAC,SAAS,EAAG,CAACkB,CAAK,CAAC,CAAC,EAExC,IAAII,EAAStB,GAAS,CAAC,SAAS,EAAGrjU,CAAI,EACvC,OAAIA,EAAK,SAAW,GAClB2kU,EAAO,QAAQ,KAAK,UAAU,EAEhCA,EAAO,OAASR,EAChBQ,EAAO,MAAQ,CAACT,EACTS,CACT,EAIIC,GAAW,CAACC,EAAahoT,IAAY,CAEvC,IAAIuL,EAAOi7S,GAAS,CAAC,QAAQ,EAAG,CAAA,EAAIxmT,CAAO,EACvCnY,EAAOm5T,GAAcgH,EAAahoT,CAAO,EAC7C,OAAAuL,EAAK,MAAM,YAAc41S,GAAOt5T,CAAI,EAC7B0jB,CACT,EAEIw6S,GAAuB,SAA8Br8C,EAAY+qB,EAAYwzB,EAAW,CAC1F,IAAIC,EAAe,GACnB,OAAQx+C,EAAU,CAChB,IAAK,QACHw+C,EAAe,MACf,MACF,IAAK,SACHA,EAAe,OACf,MACF,IAAK,SACHA,EAAe,YACf,MACF,IAAK,SACHA,EAAe,aACf,MACF,QACEA,EAAex+C,CAErB,CACE,IAAIy+C,EACJ,OAAI1zB,IAAe,UAAYwzB,IAAc,SAC3CE,EAAiB,aACR1zB,IAAe,SACxB0zB,EAAiB,OACR1zB,IAAe,SACxB0zB,EAAiB,SAEjBA,EAAiB,UAEZD,EAAe,IAAMC,CAC9B,EAOIrC,GAAU,CAEZ,OAAU,CACR,QAAS,OACT,SAAU,WACd,EACE,OAAU,CACR,QAAS,SACT,SAAU,cACd,EACE,OAAU,CACR,QAAS,SACT,SAAU,aACd,EACE,OAAU,CACR,QAAS,SACT,SAAU,aACd,EACE,WAAc,CACZ,QAAS,SACT,SAAU,aACd,EACE,SAAY,CACV,QAAS,oBACT,SAAU,kBACd,EAKE,OAAU,CACR,QAAS,gBACT,SAAU,aACd,EACE,QAAW,CACT,QAAS,SACT,SAAU,qBACd,EACE,SAAY,CACV,QAAS,UACT,SAAU,iBACd,EACE,QAAW,CACT,QAAS,SACT,SAAU,gBACd,EACE,OAAU,CACR,QAAS,aACT,SAAU,mBACd,EACE,OAAU,CACR,QAAS,YACT,SAAU,oBACd,CACA,EACIsC,GAAU,CAEZ,IAAK,CAAC,MAAO,KAAO,IAAK,EAEzB,WAAY,CAAC,aAAc,KAAO,IAAK,EAEvC,WAAY,CAAC,aAAc,MAAO,IAAK,EACvC,YAAa,CAAC,cAAe,MAAO,IAAK,EACzC,YAAa,CAAC,cAAe,KAAM,IAAK,CAC1C,EACIC,GAAY,SAAmB14T,EAAOqQ,EAAS,CAEjD,GAAI,CAACsiT,EAAUjoR,EAAO6c,CAAM,EAAIkxQ,GAAQz4T,CAAK,EACzCjQ,EAAO,IAAI2iU,GAASC,CAAQ,EAC5BgG,EAAU,IAAInG,GAAQ,CAACziU,CAAI,EAAG,CAChC,MAASyhU,GAAO9mR,CAAK,EACrB,OAAU8mR,GAAOjqQ,CAAM,EAEvB,MAAS,SAAWiqQ,GAAO9mR,CAAK,EAChC,QAAW,OAAS,IAAOA,EAAQ,IAAM,IAAO6c,EAChD,oBAAuB,UAC3B,CAAG,EACG3M,EAAOk8Q,GAAY,CAAC,SAAS,EAAG,CAAC6B,CAAO,EAAGtoT,CAAO,EACtD,OAAAuqC,EAAK,OAAS2M,EACd3M,EAAK,MAAM,OAAS42Q,GAAOjqQ,CAAM,EACjC3M,EAAK,MAAM,MAAQ42Q,GAAO9mR,CAAK,EACxBkQ,CACT,EAEIg+Q,GAAY,CACd,OAAQ,EACR,KAAM,IACR,EACIC,GAAc,CAChB,OAAQ,EACR,KAAM,IACR,EACIC,GAAa,CACf,OAAQ,EACR,KAAM,IACR,EAEIC,IAAW,CACb,KAAM,CACJ,IAAKH,GACL,KAAMC,GACN,KAAMC,GACN,OAAQF,EACZ,EACE,IAAK,CACH,KAAMA,GACN,IAAKA,GACL,KAAME,GACN,OAAQF,EACZ,EACE,KAAM,CACJ,KAAMC,GACN,IAAKA,GACL,MAAOA,GACP,OAAQA,EACZ,EACE,KAAM,CACJ,KAAMC,GACN,IAAKA,GACL,MAAOA,GACP,OAAQA,EACZ,EACE,MAAO,CAAA,EACP,OAAQ,CACN,IAAKF,GACL,KAAMC,GACN,KAAMC,GACN,OAAQF,EACZ,EACE,OAAQ,CACN,KAAMA,GACN,IAAKA,GACL,KAAME,GACN,MAAOF,GACP,OAAQA,GACR,OAAQA,GACR,OAAQA,EACZ,EACE,OAAQ,CACN,KAAMA,GACN,IAAKA,GACL,KAAMC,GACN,KAAMC,GACN,MAAOF,GACP,OAAQA,GACR,OAAQA,EACZ,CACA,EAEII,IAAgB,CAClB,KAAM,CACJ,IAAKJ,EACT,EACE,IAAK,CACH,KAAMA,GACN,IAAKA,EACT,EACE,KAAM,CAAA,EACN,KAAM,CAAA,EACN,MAAO,CAAA,EACP,OAAQ,CACN,IAAKA,EACT,EACE,OAAQ,CAAA,EACR,OAAQ,CACN,IAAKA,EACT,CACA,EAOIK,GAAa,CAAA,EAKbC,GAAqB,CAAA,EAKrBC,GAAuB,CAAA,EAC3B,SAASC,GAAeC,EAAM,CAsB5B,OArBI,CACF,KAAAj8T,EACA,MAAA2M,EACA,MAAA+Y,EACA,QAAA6oH,EACA,YAAA2tL,EACA,cAAAC,CACJ,EAAMF,EAEA3+T,EAAO,CACT,KAAA0C,EACA,QAAS0lB,EAAM,QACf,SAAUA,EAAM,SAChB,kBAAmB,CAAC,CAACA,EAAM,kBAC3B,cAAe,CAAC,CAACA,EAAM,cACvB,cAAeA,EAAM,gBAAkB,OAAY,GAAOA,EAAM,cAChE,gBAAiBA,EAAM,iBAAmB,EAC1C,MAAO,CAAC,CAACA,EAAM,MACf,UAAW,CAAC,CAACA,EAAM,UACnB,QAAA6oH,CACJ,EACW3yI,EAAI,EAAGA,EAAI+Q,EAAM,OAAQ,EAAE/Q,EAClCigU,GAAWlvT,EAAM/Q,CAAC,CAAC,EAAI0B,EAErB0C,IACEk8T,IACFJ,GAAmB97T,CAAI,EAAIk8T,GAEzBC,IACFJ,GAAqB/7T,CAAI,EAAIm8T,GAGnC,CAMA,SAASC,GAAuBC,EAAO,CACrC,GAAI,CACF,KAAAr8T,EACA,YAAAk8T,EACA,cAAAC,CACJ,EAAME,EACJL,GAAe,CACb,KAAAh8T,EACA,MAAO,CAAA,EACP,MAAO,CACL,QAAS,CACf,EACI,SAAU,CACR,MAAM,IAAI,MAAM,yBAAyB,CAC3C,EACA,YAAAk8T,EACA,cAAAC,CACJ,CAAG,CACH,CACA,IAAIG,GAAoB,SAA2Bx9G,EAAK,CACtD,OAAOA,EAAI,OAAS,YAAcA,EAAI,KAAK,SAAW,EAAIA,EAAI,KAAK,CAAC,EAAIA,CAC1E,EAGIy9G,GAAc,SAAqBz9G,EAAK,CAC1C,OAAOA,EAAI,OAAS,WAAaA,EAAI,KAAO,CAACA,CAAG,CAClD,EAWI09G,IAAmB,IAAI,IAAI,CAAC,WAAY,OAAQ,QAAS,OAAQ,MAAO,QAAQ,CAAC,EACjFC,IAAoB,IAAI,IAAI,CAAC,YAAa,OAAQ,SAAU,QAAQ,CAAC,EACrEC,IAAa,CACf,QAAWtK,GAAQ,QACnB,KAAQA,GAAQ,KAChB,OAAUA,GAAQ,OAClB,aAAgBA,GAAQ,YAC1B,EACIuK,IAAU,CACZ,KAAM,OACN,IAAK,MACL,KAAM,OACN,KAAM,OACN,MAAO,QACP,OAAQ,SACR,OAAQ,SACR,OAAQ,QACV,EASIC,GAAoB,SAAyBC,EAAY5pT,EAAS6pT,EAAaC,EAAa,CAC1FA,IAAgB,SAClBA,EAAc,CAAC,KAAM,IAAI,GAI3B,QADIhjO,EAAS,CAAA,EACJn+F,EAAI,EAAGA,EAAIihU,EAAW,OAAQjhU,IAAK,CAC1C,IAAIyhO,EAAS2/F,GAAaH,EAAWjhU,CAAC,EAAGqX,CAAO,EAChD,GAAIoqN,aAAkBpyE,GAAkB,CACtC,IAAI22F,EAAWvkB,EAAO,SACtBtjI,EAAO,KAAK,GAAG6nJ,CAAQ,CACzB,MACE7nJ,EAAO,KAAKsjI,CAAM,CAEtB,CAKA,GAHAi8F,GAAgBv/N,CAAM,EAGlB,CAAC+iO,EACH,OAAO/iO,EAET,IAAIkjO,EAAchqT,EAClB,GAAI4pT,EAAW,SAAW,EAAG,CAC3B,IAAI70T,EAAO60T,EAAW,CAAC,EACnB70T,EAAK,OAAS,SAChBi1T,EAAchqT,EAAQ,WAAWjL,EAAK,IAAI,EACjCA,EAAK,OAAS,YACvBi1T,EAAchqT,EAAQ,YAAYypT,IAAW10T,EAAK,KAAK,CAAC,EAE5D,CAIA,IAAIk1T,EAAYzD,GAAS,CAACsD,EAAY,CAAC,GAAK,UAAU,EAAG,CAAA,EAAI9pT,CAAO,EAChEkqT,EAAY1D,GAAS,CAACsD,EAAY,CAAC,GAAK,WAAW,EAAG,CAAA,EAAI9pT,CAAO,EAMjEu/F,EAASsqN,IAAgB,OAC7B,OAAAM,GAAuBrjO,EAAQ,CAAC/xF,EAAMqnB,IAAS,CAC7C,IAAIgvJ,EAAWhvJ,EAAK,QAAQ,CAAC,EACzBrvB,EAAOgI,EAAK,QAAQ,CAAC,EACrBq2K,IAAa,QAAUo+I,IAAkB,IAAIz8T,CAAI,EACnDqvB,EAAK,QAAQ,CAAC,EAAI,OACTrvB,IAAS,QAAUw8T,IAAiB,IAAIn+I,CAAQ,IACzDr2K,EAAK,QAAQ,CAAC,EAAI,OAEtB,EAAG,CACD,KAAMk1T,CACV,EAAKC,EAAW3qN,CAAM,EACpB4qN,GAAuBrjO,EAAQ,CAAC/xF,EAAMqnB,IAAS,CAC7C,IAAIguS,EAAuBC,EACvBj/I,EAAWk/I,GAAiBluS,CAAI,EAChCrvB,EAAOu9T,GAAiBv1T,CAAI,EAE5BurN,EAAQl1C,GAAYr+K,EAAOgI,EAAK,SAAS,QAAQ,GAAKq1T,EAAwBzB,IAAcv9I,CAAQ,IAAM,KAAO,OAASg/I,EAAsBr9T,CAAI,GAAKs9T,EAAqB3B,IAASt9I,CAAQ,IAAM,KAAO,OAASi/I,EAAmBt9T,CAAI,EAAI,KACpP,GAAIuzN,EAEF,OAAOynG,GAASznG,EAAO0pG,CAAW,CAEtC,EAAG,CACD,KAAMC,CACV,EAAKC,EAAW3qN,CAAM,EACbzY,CACT,EAMIqjO,GAAyB,SAA+BxkT,EAAOmyM,EAAU17L,EAAMxe,EAAM2hG,EAAQ,CAC3F3hG,GAEF+H,EAAM,KAAK/H,CAAI,EAGjB,QADIjV,EAAI,EACDA,EAAIgd,EAAM,OAAQhd,IAAK,CAC5B,IAAIoM,EAAO4Q,EAAMhd,CAAC,EACd4hU,EAAeC,GAAkBz1T,CAAI,EACzC,GAAIw1T,EAAc,CAGhBJ,GAAuBI,EAAa,SAAUzyG,EAAU17L,EAAM,KAAMmjF,CAAM,EAC1E,QACF,CAGA,IAAIkrN,EAAW,CAAC11T,EAAK,SAAS,QAAQ,EACtC,GAAI01T,EAAU,CACZ,IAAIvmT,EAAS4zM,EAAS/iN,EAAMqnB,EAAK,IAAI,EACjClY,IACEkY,EAAK,YACPA,EAAK,YAAYlY,CAAM,GAGvByB,EAAM,QAAQzB,CAAM,EACpBvb,KAGN,CACI8hU,EACFruS,EAAK,KAAOrnB,EACHwqG,GAAUxqG,EAAK,SAAS,SAAS,IAC1CqnB,EAAK,KAAOoqS,GAAS,CAAC,UAAU,CAAC,GAEnCpqS,EAAK,aAAeljB,GAASlL,GAAK,CAChC2X,EAAM,OAAOzM,EAAQ,EAAG,EAAGlL,CAAC,EAC5BrF,GACF,GAAGA,CAAC,CACN,CACIiV,GACF+H,EAAM,IAAG,CAEb,EAEI6kT,GAAoB,SAA2Bz1T,EAAM,CACvD,OAAIA,aAAgBijJ,IAAoBjjJ,aAAgB4sT,IAAU5sT,aAAgB0sT,IAAQ1sT,EAAK,SAAS,WAAW,EAC1GA,EAEF,IACT,EAEI21T,GAAoB,SAA0B31T,EAAM0iF,EAAM,CAC5D,IAAI8yO,EAAeC,GAAkBz1T,CAAI,EACzC,GAAIw1T,EAAc,CAChB,IAAI57E,EAAW47E,EAAa,SAC5B,GAAI57E,EAAS,OAAQ,CACnB,GAAIl3J,IAAS,QACX,OAAOizO,GAAkB/7E,EAASA,EAAS,OAAS,CAAC,EAAG,OAAO,EAC1D,GAAIl3J,IAAS,OAClB,OAAOizO,GAAkB/7E,EAAS,CAAC,EAAG,MAAM,CAEhD,CACF,CACA,OAAO55O,CACT,EAGIu1T,GAAmB,SAA0Bv1T,EAAM0iF,EAAM,CAC3D,GAAI,CAAC1iF,EACH,OAAO,KAEL0iF,IACF1iF,EAAO21T,GAAkB31T,EAAM0iF,CAAI,GAIrC,IAAI48F,EAAYt/K,EAAK,QAAQ,CAAC,EAC9B,OAAO20T,IAAQr1I,CAAS,GAAK,IAC/B,EACIs2I,GAAoB,SAA2B3qT,EAASq7K,EAAS,CACnE,IAAIuvI,EAAc,CAAC,eAAe,EAAE,OAAO5qT,EAAQ,mBAAmB,EACtE,OAAOwmT,GAASnrI,EAAQ,OAAOuvI,CAAW,CAAC,CAC7C,EAMIb,GAAe,SAAoB7oS,EAAOlhB,EAAS6qT,EAAa,CAClE,GAAI,CAAC3pS,EACH,OAAOslS,GAAQ,EAEjB,GAAIqC,GAAmB3nS,EAAM,IAAI,EAAG,CAGlC,IAAI4pS,EAAYjC,GAAmB3nS,EAAM,IAAI,EAAEA,EAAOlhB,CAAO,EAG7D,GAAI6qT,GAAe7qT,EAAQ,OAAS6qT,EAAY,KAAM,CACpDC,EAAYtE,GAASxmT,EAAQ,cAAc6qT,CAAW,EAAG,CAACC,CAAS,EAAG9qT,CAAO,EAC7E,IAAI+qT,EAAa/qT,EAAQ,eAAiB6qT,EAAY,eACtDC,EAAU,QAAUC,EACpBD,EAAU,OAASC,CACrB,CACA,OAAOD,CACT,KACE,OAAM,IAAI7N,GAAW,+BAAiC/7R,EAAM,KAAO,GAAG,CAE1E,EAOA,SAAS8pS,GAAqBr8E,EAAU3uO,EAAS,CAE/C,IAAIld,EAAO0jU,GAAS,CAAC,MAAM,EAAG73E,EAAU3uO,CAAO,EAI3CirT,EAAQzE,GAAS,CAAC,OAAO,CAAC,EAC9B,OAAAyE,EAAM,MAAM,OAAS9J,GAAOr+T,EAAK,OAASA,EAAK,KAAK,EAChDA,EAAK,QACPmoU,EAAM,MAAM,cAAgB9J,GAAO,CAACr+T,EAAK,KAAK,GAEhDA,EAAK,SAAS,QAAQmoU,CAAK,EACpBnoU,CACT,CAKA,SAASooU,GAAUjsH,EAAMj/L,EAAS,CAEhC,IAAIlc,EAAM,KACNm7M,EAAK,SAAW,GAAKA,EAAK,CAAC,EAAE,OAAS,QACxCn7M,EAAMm7M,EAAK,CAAC,EAAE,IACdA,EAAOA,EAAK,CAAC,EAAE,MAGjB,IAAI2qH,EAAaD,GAAkB1qH,EAAMj/L,EAAS,MAAM,EACpDmrT,EACAvB,EAAW,SAAW,GAAKA,EAAW,CAAC,EAAE,SAAS,KAAK,IAEzDuB,EAASvB,EAAW,IAAG,GAUzB,QARIj7E,EAAW,CAAA,EAOX/oP,EAAQ,CAAA,EACH+C,EAAI,EAAGA,EAAIihU,EAAW,OAAQjhU,IAErC,GADA/C,EAAM,KAAKgkU,EAAWjhU,CAAC,CAAC,EACpBihU,EAAWjhU,CAAC,EAAE,SAAS,MAAM,GAAKihU,EAAWjhU,CAAC,EAAE,SAAS,MAAM,GAAKihU,EAAWjhU,CAAC,EAAE,SAAS,YAAY,EAAG,CAI5G,QADIyiU,EAAU,GACPziU,EAAIihU,EAAW,OAAS,GAAKA,EAAWjhU,EAAI,CAAC,EAAE,SAAS,QAAQ,GAAK,CAACihU,EAAWjhU,EAAI,CAAC,EAAE,SAAS,SAAS,GAC/GA,IACA/C,EAAM,KAAKgkU,EAAWjhU,CAAC,CAAC,EACpBihU,EAAWjhU,CAAC,EAAE,SAAS,SAAS,IAClCyiU,EAAU,IAITA,IACHz8E,EAAS,KAAKq8E,GAAqBplU,EAAOoa,CAAO,CAAC,EAClDpa,EAAQ,CAAA,EAEZ,MAAWgkU,EAAWjhU,CAAC,EAAE,SAAS,SAAS,IAEzC/C,EAAM,IAAG,EACLA,EAAM,OAAS,IACjB+oP,EAAS,KAAKq8E,GAAqBplU,EAAOoa,CAAO,CAAC,EAClDpa,EAAQ,CAAA,GAGV+oP,EAAS,KAAKi7E,EAAWjhU,CAAC,CAAC,GAG3B/C,EAAM,OAAS,GACjB+oP,EAAS,KAAKq8E,GAAqBplU,EAAOoa,CAAO,CAAC,EAGpD,IAAIqrT,EACAvnU,GACFunU,EAAWL,GAAqBrB,GAAkB7lU,EAAKkc,EAAS,EAAI,EAAGA,CAAO,EAC9EqrT,EAAS,QAAU,CAAC,KAAK,EACzB18E,EAAS,KAAK08E,CAAQ,GACbF,GACTx8E,EAAS,KAAKw8E,CAAM,EAEtB,IAAIG,EAAW9E,GAAS,CAAC,YAAY,EAAG73E,CAAQ,EAIhD,GAHA28E,EAAS,aAAa,cAAe,MAAM,EAGvCD,EAAU,CACZ,IAAIJ,EAAQI,EAAS,SAAS,CAAC,EAC/BJ,EAAM,MAAM,OAAS9J,GAAOmK,EAAS,OAASA,EAAS,KAAK,EACxDA,EAAS,QACXL,EAAM,MAAM,cAAgB9J,GAAO,CAACmK,EAAS,KAAK,EAEtD,CACA,OAAOA,CACT,CAWA,SAASC,GAAoB58E,EAAU,CACrC,OAAO,IAAI32F,GAAiB22F,CAAQ,CACtC,CAMA,MAAM68E,EAAS,CACb,YAAYz+T,EAAM4hP,EAAUtzD,EAAS,CACnC,KAAK,KAAOtuL,EACZ,KAAK,WAAa,CAAA,EAClB,KAAK,SAAW4hP,GAAY,CAAA,EAC5B,KAAK,QAAUtzD,GAAW,CAAA,CAC5B,CAKA,aAAa/6L,EAAMqP,EAAO,CACxB,KAAK,WAAWrP,CAAI,EAAIqP,CAC1B,CAIA,aAAarP,EAAM,CACjB,OAAO,KAAK,WAAWA,CAAI,CAC7B,CAIA,QAAS,CACP,IAAIyU,EAAO,SAAS,gBAAgB,qCAAsC,KAAK,IAAI,EACnF,QAAS0pJ,KAAQ,KAAK,WAChB,OAAO,UAAU,eAAe,KAAK,KAAK,WAAYA,CAAI,GAC5D1pJ,EAAK,aAAa0pJ,EAAM,KAAK,WAAWA,CAAI,CAAC,EAG7C,KAAK,QAAQ,OAAS,IACxB1pJ,EAAK,UAAYqsT,GAAY,KAAK,OAAO,GAE3C,QAASz4T,EAAI,EAAGA,EAAI,KAAK,SAAS,OAAQA,IAGxC,GAAI,KAAK,SAASA,CAAC,YAAa8iU,IAAY,KAAK,SAAS9iU,EAAI,CAAC,YAAa8iU,GAAU,CAEpF,QADI5iU,EAAO,KAAK,SAASF,CAAC,EAAE,SAAW,KAAK,SAAS,EAAEA,CAAC,EAAE,OAAM,EACzD,KAAK,SAASA,EAAI,CAAC,YAAa8iU,IACrC5iU,GAAQ,KAAK,SAAS,EAAEF,CAAC,EAAE,OAAM,EAEnCoM,EAAK,YAAY,IAAI02T,GAAS5iU,CAAI,EAAE,OAAM,CAAE,CAC9C,MACEkM,EAAK,YAAY,KAAK,SAASpM,CAAC,EAAE,QAAQ,EAG9C,OAAOoM,CACT,CAIA,UAAW,CACT,IAAI4rT,EAAS,IAAM,KAAK,KAExB,QAASliK,KAAQ,KAAK,WAChB,OAAO,UAAU,eAAe,KAAK,KAAK,WAAYA,CAAI,IAC5DkiK,GAAU,IAAMliK,EAAO,KACvBkiK,GAAUnmI,GAAO,KAAK,WAAW/7B,CAAI,CAAC,EACtCkiK,GAAU,KAGV,KAAK,QAAQ,OAAS,IACxBA,GAAU,YAAenmI,GAAO4mI,GAAY,KAAK,OAAO,CAAC,EAAI,KAE/DT,GAAU,IACV,QAASh4T,EAAI,EAAGA,EAAI,KAAK,SAAS,OAAQA,IACxCg4T,GAAU,KAAK,SAASh4T,CAAC,EAAE,SAAQ,EAErC,OAAAg4T,GAAU,KAAO,KAAK,KAAO,IACtBA,CACT,CAIA,QAAS,CACP,OAAO,KAAK,SAAS,IAAIr6P,GAASA,EAAM,OAAM,CAAE,EAAE,KAAK,EAAE,CAC3D,CACF,CAIA,MAAMmlQ,EAAS,CACb,YAAY5iU,EAAM,CAChB,KAAK,KAAOA,CACd,CAIA,QAAS,CACP,OAAO,SAAS,eAAe,KAAK,IAAI,CAC1C,CAKA,UAAW,CACT,OAAO2xL,GAAO,KAAK,QAAQ,CAC7B,CAKA,QAAS,CACP,OAAO,KAAK,IACd,CACF,CAKA,MAAMkxI,EAAU,CAId,YAAYrxR,EAAO,CACjB,KAAK,MAAQA,EAKTA,GAAS,QAAWA,GAAS,OAC/B,KAAK,UAAY,IACRA,GAAS,OAAUA,GAAS,MACrC,KAAK,UAAY,IACRA,GAAS,OAAUA,GAAS,MACrC,KAAK,UAAY,IACRA,GAAS,OAAUA,GAAS,MACrC,KAAK,UAAY,KACRA,GAAS,SAAYA,GAAS,QACvC,KAAK,UAAY,KACRA,GAAS,QAAWA,GAAS,OACtC,KAAK,UAAY,KACRA,GAAS,QAAWA,GAAS,OACtC,KAAK,UAAY,KACRA,GAAS,QAAWA,GAAS,OACtC,KAAK,UAAY,KAEjB,KAAK,UAAY,IAErB,CAIA,QAAS,CACP,GAAI,KAAK,UACP,OAAO,SAAS,eAAe,KAAK,SAAS,EAE7C,IAAItlC,EAAO,SAAS,gBAAgB,qCAAsC,QAAQ,EAClF,OAAAA,EAAK,aAAa,QAASosT,GAAO,KAAK,KAAK,CAAC,EACtCpsT,CAEX,CAIA,UAAW,CACT,OAAI,KAAK,UACA,UAAY,KAAK,UAAY,WAE7B,kBAAqBosT,GAAO,KAAK,KAAK,EAAI,KAErD,CAIA,QAAS,CACP,OAAI,KAAK,UACA,KAAK,UAEL,GAEX,CACF,CAOA,IAAIwK,IAAmB,IAAI,IAAI,CAAC,UAAW,SAAS,CAAC,EACjDC,IAAe,IAAI,IAAI,CAAC,OAAQ,QAAQ,CAAC,EAKzCC,GAAW,SAAkBhjU,EAAMqxB,EAAMla,EAAS,CACpD,OAAIujT,GAAQrpS,CAAI,EAAErxB,CAAI,GAAK06T,GAAQrpS,CAAI,EAAErxB,CAAI,EAAE,SAAWA,EAAK,WAAW,CAAC,IAAM,OAAU,EAAEm7T,GAAU,eAAen7T,CAAI,GAAKmX,IAAYA,EAAQ,YAAcA,EAAQ,WAAW,MAAM,EAAG,CAAC,IAAM,MAAQA,EAAQ,MAAQA,EAAQ,KAAK,MAAM,EAAG,CAAC,IAAM,SACvPnX,EAAO06T,GAAQrpS,CAAI,EAAErxB,CAAI,EAAE,SAEtB,IAAI4iU,GAAS5iU,CAAI,CAC1B,EAKIijU,GAAU,SAAiBhpU,EAAM,CACnC,OAAIA,EAAK,SAAW,EACXA,EAAK,CAAC,EAEN,IAAI0oU,GAAS,OAAQ1oU,CAAI,CAEpC,EAIIipU,GAAa,SAAoB7qS,EAAOlhB,EAAS,CAInD,GAAIA,EAAQ,aAAe,SACzB,MAAO,YACF,GAAIA,EAAQ,aAAe,SAChC,OAAIA,EAAQ,YAAc,UAAYA,EAAQ,aAAe,SACpD,yBACEA,EAAQ,YAAc,SACxB,oBACEA,EAAQ,aAAe,SACzB,kBAEA,aAEJ,GAAIA,EAAQ,YAAc,UAAYA,EAAQ,aAAe,SAClE,MAAO,cACF,GAAIA,EAAQ,YAAc,SAC/B,MAAO,SACF,GAAIA,EAAQ,aAAe,SAChC,MAAO,OAET,IAAI6yC,EAAO7yC,EAAQ,KACnB,GAAI,CAAC6yC,GAAQA,IAAS,aACpB,OAAO,KAET,IAAI34B,EAAOgH,EAAM,KACjB,GAAI2xB,IAAS,SACX,MAAO,SACF,GAAIA,IAAS,aAClB,OAAO3xB,EAAM,OAAS,UAAY,OAAS,cACtC,GAAI2xB,IAAS,SAClB,MAAO,OACF,GAAIA,IAAS,SAClB,MAAO,gBACF,GAAIA,IAAS,WAClB,MAAO,oBACF,GAAIA,IAAS,WAClB,MAAO,UACF,GAAIA,IAAS,WAAaA,IAAS,UAExC,MAAO,SACF,GAAIA,IAAS,SAClB,MAAO,aACF,GAAIA,IAAS,SAClB,MAAO,YAET,IAAIhqD,EAAOq4B,EAAM,KACjB,GAAIyqS,IAAiB,IAAI9iU,CAAI,EAC3B,OAAO,KAET,GAAI06T,GAAQrpS,CAAI,EAAErxB,CAAI,EAAG,CACvB,IAAIguM,EAAc0sH,GAAQrpS,CAAI,EAAErxB,CAAI,EAAE,QAClCguM,IACFhuM,EAAOguM,EAEX,CACA,IAAImsH,EAAW8C,GAAQjzQ,CAAI,EAAE,SAC7B,OAAIowQ,GAAoBp6T,EAAMm6T,EAAU9oS,CAAI,EACnC4rS,GAAQjzQ,CAAI,EAAE,QAEhB,IACT,EAMA,SAASm5Q,GAAoB9qS,EAAO,CAClC,GAAI,CAACA,EACH,MAAO,GAET,GAAIA,EAAM,OAAS,MAAQA,EAAM,SAAS,SAAW,EAAG,CACtD,IAAIolC,EAAQplC,EAAM,SAAS,CAAC,EAC5B,OAAOolC,aAAiBmlQ,IAAYnlQ,EAAM,OAAS,GACrD,SAAWplC,EAAM,OAAS,MAAQA,EAAM,SAAS,SAAW,GAAKA,EAAM,aAAa,WAAW,IAAM,QAAUA,EAAM,aAAa,QAAQ,IAAM,OAASA,EAAM,aAAa,QAAQ,IAAM,MAAO,CAC/L,IAAIqmS,EAASrmS,EAAM,SAAS,CAAC,EAC7B,OAAOqmS,aAAkBkE,IAAYlE,EAAO,OAAS,GACvD,KACE,OAAO,EAEX,CAMA,IAAI0E,GAAkB,SAAyBrC,EAAY5pT,EAASksT,EAAY,CAC9E,GAAItC,EAAW,SAAW,EAAG,CAC3B,IAAI1oS,EAAQirS,GAAWvC,EAAW,CAAC,EAAG5pT,CAAO,EAC7C,OAAIksT,GAAchrS,aAAiBsqS,IAAYtqS,EAAM,OAAS,OAG5DA,EAAM,aAAa,SAAU,KAAK,EAClCA,EAAM,aAAa,SAAU,KAAK,GAE7B,CAACA,CAAK,CACf,CAGA,QAFI4lE,EAAS,CAAA,EACTslO,EACKzjU,EAAI,EAAGA,EAAIihU,EAAW,OAAQjhU,IAAK,CAC1C,IAAI0jU,EAASF,GAAWvC,EAAWjhU,CAAC,EAAGqX,CAAO,EAC9C,GAAIqsT,aAAkBb,IAAYY,aAAqBZ,IAErD,GAAIa,EAAO,OAAS,SAAWD,EAAU,OAAS,SAAWC,EAAO,aAAa,aAAa,IAAMD,EAAU,aAAa,aAAa,EAAG,CACzIA,EAAU,SAAS,KAAK,GAAGC,EAAO,QAAQ,EAC1C,QAEF,SAAWA,EAAO,OAAS,MAAQD,EAAU,OAAS,KAAM,CAC1DA,EAAU,SAAS,KAAK,GAAGC,EAAO,QAAQ,EAC1C,QAEF,SAAWL,GAAoBK,CAAM,GAAKD,EAAU,OAAS,KAAM,CACjEA,EAAU,SAAS,KAAK,GAAGC,EAAO,QAAQ,EAC1C,QAEF,SAAWA,EAAO,OAAS,MAAQL,GAAoBI,CAAS,EAC9DC,EAAO,SAAW,CAAC,GAAGD,EAAU,SAAU,GAAGC,EAAO,QAAQ,EAC5DvlO,EAAO,IAAG,WAGAulO,EAAO,OAAS,QAAUA,EAAO,OAAS,SAAWA,EAAO,SAAS,QAAU,IAAMD,EAAU,OAAS,MAAQJ,GAAoBI,CAAS,GAAI,CAC3J,IAAIvsU,EAAOwsU,EAAO,SAAS,CAAC,EACxBxsU,aAAgB2rU,IAAY3rU,EAAK,OAAS,OAC5CA,EAAK,SAAW,CAAC,GAAGusU,EAAU,SAAU,GAAGvsU,EAAK,QAAQ,EACxDinG,EAAO,IAAG,EAGd,SAAWslO,EAAU,OAAS,MAAQA,EAAU,SAAS,SAAW,EAAG,CACrE,IAAIE,EAAYF,EAAU,SAAS,CAAC,EACpC,GAAIE,aAAqBb,IAAYa,EAAU,OAAS,MAAaD,EAAO,OAAS,MAAQA,EAAO,OAAS,MAAQA,EAAO,OAAS,MAAO,CAC1I,IAAI/lQ,EAAQ+lQ,EAAO,SAAS,CAAC,EACzB/lQ,aAAiBmlQ,IAAYnlQ,EAAM,KAAK,OAAS,IAEnDA,EAAM,KAAOA,EAAM,KAAK,MAAM,EAAG,CAAC,EAAI,IAAWA,EAAM,KAAK,MAAM,CAAC,EACnEwgC,EAAO,IAAG,EAEd,CACF,EAEFA,EAAO,KAAKulO,CAAM,EAClBD,EAAYC,CACd,CACA,OAAOvlO,CACT,EAKIylO,GAAqB,SAA4B3C,EAAY5pT,EAASksT,EAAY,CACpF,OAAOJ,GAAQG,GAAgBrC,EAAY5pT,EAASksT,CAAU,CAAC,CACjE,EAKIC,GAAa,SAAoBjrS,EAAOlhB,EAAS,CACnD,GAAI,CAACkhB,EACH,OAAO,IAAIsqS,GAAS,MAAM,EAE5B,GAAI1C,GAAqB5nS,EAAM,IAAI,EAAG,CAGpC,IAAIhd,EAAS4kT,GAAqB5nS,EAAM,IAAI,EAAEA,EAAOlhB,CAAO,EAE5D,OAAOkE,CACT,KACE,OAAM,IAAI+4S,GAAW,+BAAiC/7R,EAAM,KAAO,GAAG,CAE1E,EASA,SAASsrS,GAAYvtH,EAAMwtH,EAAezsT,EAAS0sT,EAAeC,EAAe,CAC/E,IAAI/C,EAAaqC,GAAgBhtH,EAAMj/L,CAAO,EAO1CgxQ,EACA44C,EAAW,SAAW,GAAKA,EAAW,CAAC,YAAa4B,IAAYI,IAAa,IAAIhC,EAAW,CAAC,EAAE,IAAI,EACrG54C,EAAU44C,EAAW,CAAC,EAEtB54C,EAAU,IAAIw6C,GAAS,OAAQ5B,CAAU,EAG3C,IAAIjmF,EAAa,IAAI6nF,GAAS,aAAc,CAAC,IAAIC,GAASgB,CAAa,CAAC,CAAC,EACzE9oF,EAAW,aAAa,WAAY,mBAAmB,EACvD,IAAIipF,EAAY,IAAIpB,GAAS,YAAa,CAACx6C,EAASrtC,CAAU,CAAC,EAC3D+/E,EAAO,IAAI8H,GAAS,OAAQ,CAACoB,CAAS,CAAC,EAC3ClJ,EAAK,aAAa,QAAS,oCAAoC,EAC3DgJ,GACFhJ,EAAK,aAAa,UAAW,OAAO,EAMtC,IAAImJ,EAAeF,EAAgB,QAAU,eAE7C,OAAOnG,GAAS,CAACqG,CAAY,EAAG,CAACnJ,CAAI,CAAC,CACxC,CAQA,IAAIoJ,IAAe,CAGnB,CAAC,EAAG,EAAG,CAAC,EAER,CAAC,EAAG,EAAG,CAAC,EAER,CAAC,EAAG,EAAG,CAAC,EAER,CAAC,EAAG,EAAG,CAAC,EAER,CAAC,EAAG,EAAG,CAAC,EAER,CAAC,EAAG,EAAG,CAAC,EAER,CAAC,EAAG,EAAG,CAAC,EAER,CAAC,EAAG,EAAG,CAAC,EAER,CAAC,EAAG,EAAG,CAAC,EAER,CAAC,GAAI,EAAG,CAAC,EAET,CAAC,GAAI,GAAI,CAAC,CACV,EACIC,GAAkB,CAGtB,GAAK,GAAK,GAAK,GAAK,GAAK,EAAK,IAAK,KAAM,MAAO,MAAO,KAAK,EACxDC,GAAc,SAAqBnlU,EAAM0wB,EAAO,CAClD,OAAOA,EAAM,KAAO,EAAI1wB,EAAOilU,IAAajlU,EAAO,CAAC,EAAE0wB,EAAM,KAAO,CAAC,CACtE,EAQA,MAAM00S,EAAQ,CACZ,YAAY5iU,EAAM,CAChB,KAAK,MAAQA,EAAK,MAClB,KAAK,MAAQA,EAAK,MAClB,KAAK,KAAOA,EAAK,MAAQ4iU,GAAQ,SACjC,KAAK,SAAW5iU,EAAK,UAAY,KAAK,KACtC,KAAK,QAAU,CAAC,CAACA,EAAK,QACtB,KAAK,KAAOA,EAAK,MAAQ,GACzB,KAAK,WAAaA,EAAK,YAAc,GACrC,KAAK,WAAaA,EAAK,YAAc,GACrC,KAAK,UAAYA,EAAK,WAAa,GACnC,KAAK,eAAiB0iU,GAAgB,KAAK,KAAO,CAAC,EACnD,KAAK,QAAU1iU,EAAK,QACpB,KAAK,iBAAmBA,EAAK,iBAC7B,KAAK,aAAe,MACtB,CAKA,OAAO08J,EAAW,CAChB,IAAI18J,EAAO,CACT,MAAO,KAAK,MACZ,KAAM,KAAK,KACX,SAAU,KAAK,SACf,MAAO,KAAK,MACZ,QAAS,KAAK,QACd,KAAM,KAAK,KACX,WAAY,KAAK,WACjB,WAAY,KAAK,WACjB,UAAW,KAAK,UAChB,QAAS,KAAK,QACd,iBAAkB,KAAK,gBAC7B,EACI,cAAO,OAAOA,EAAM08J,CAAS,EACtB,IAAIkmK,GAAQ5iU,CAAI,CACzB,CAKA,YAAYkuB,EAAO,CACjB,OAAI,KAAK,QAAUA,EACV,KAEA,KAAK,OAAO,CACjB,MAAOA,EACP,KAAMy0S,GAAY,KAAK,SAAUz0S,CAAK,CAC9C,CAAO,CAEL,CAKA,oBAAqB,CACnB,OAAO,KAAK,YAAY,KAAK,MAAM,MAAK,CAAE,CAC5C,CAKA,WAAW1wB,EAAM,CACf,OAAI,KAAK,OAASA,GAAQ,KAAK,WAAaA,EACnC,KAEA,KAAK,OAAO,CACjB,MAAO,KAAK,MAAM,KAAI,EACtB,KAAMA,EACN,SAAUA,EACV,eAAgBklU,GAAgBllU,EAAO,CAAC,CAChD,CAAO,CAEL,CAKA,gBAAgB0wB,EAAO,CACrBA,EAAQA,GAAS,KAAK,MAAM,KAAI,EAChC,IAAI20S,EAAWF,GAAYC,GAAQ,SAAU10S,CAAK,EAClD,OAAI,KAAK,OAAS20S,GAAY,KAAK,WAAaD,GAAQ,UAAY,KAAK,QAAU10S,EAC1E,KAEA,KAAK,OAAO,CACjB,MAAOA,EACP,KAAM20S,CACd,CAAO,CAEL,CAKA,kBAAmB,CACjB,IAAIrlU,EACJ,OAAQ,KAAK,MAAM,GAAE,CACnB,IAAK,GACL,IAAK,GACHA,EAAO,EACP,MACF,IAAK,GACL,IAAK,GACHA,EAAO,EACP,MACF,QACEA,EAAO,CAEf,CACI,OAAO,KAAK,OAAO,CACjB,MAAO,KAAK,MAAM,KAAI,EACtB,KAAMA,CACZ,CAAK,CACH,CAIA,UAAUgqE,EAAO,CACf,OAAO,KAAK,OAAO,CACjB,MAAOA,CACb,CAAK,CACH,CAIA,aAAc,CACZ,OAAO,KAAK,OAAO,CACjB,QAAS,EACf,CAAK,CACH,CAKA,SAAShf,EAAM,CACb,OAAO,KAAK,OAAO,CACjB,KAAAA,CACN,CAAK,CACH,CAIA,mBAAmB62N,EAAY,CAC7B,OAAO,KAAK,OAAO,CACjB,WAAAA,EACA,KAAM,EACZ,CAAK,CACH,CAIA,mBAAmB+qB,EAAY,CAC7B,OAAO,KAAK,OAAO,CACjB,WAAAA,EACA,KAAM,EACZ,CAAK,CACH,CAIA,kBAAkBwzB,EAAW,CAC3B,OAAO,KAAK,OAAO,CACjB,UAAAA,EACA,KAAM,EACZ,CAAK,CACH,CAKA,cAAckF,EAAY,CACxB,OAAIA,EAAW,OAAS,KAAK,KACpB,CAAC,SAAU,aAAeA,EAAW,KAAM,OAAS,KAAK,IAAI,EAE7D,CAAA,CAEX,CAKA,mBAAoB,CAClB,OAAI,KAAK,OAASF,GAAQ,SACjB,CAAC,SAAU,aAAe,KAAK,KAAM,OAASA,GAAQ,QAAQ,EAE9D,CAAA,CAEX,CAIA,aAAc,CACZ,OAAK,KAAK,eACR,KAAK,aAAe9J,IAAiB,KAAK,IAAI,GAEzC,KAAK,YACd,CAIA,UAAW,CACT,OAAI,KAAK,QACA,cAEA,KAAK,KAEhB,CACF,CAOA8J,GAAQ,SAAW,EAEnB,IAAIG,GAAsB,SAA6BC,EAAU,CAC/D,OAAO,IAAIJ,GAAQ,CACjB,MAAOI,EAAS,YAAclO,GAAQ,QAAUA,GAAQ,KACxD,QAASkO,EAAS,QAClB,iBAAkBA,EAAS,gBAC/B,CAAG,CACH,EACIC,GAAc,SAAqBv4T,EAAMs4T,EAAU,CACrD,GAAIA,EAAS,YAAa,CACxB,IAAIhyI,EAAU,CAAC,eAAe,EAC1BgyI,EAAS,OACXhyI,EAAQ,KAAK,OAAO,EAElBgyI,EAAS,OACXhyI,EAAQ,KAAK,OAAO,EAEtBtmL,EAAOyxT,GAASnrI,EAAS,CAACtmL,CAAI,CAAC,CACjC,CACA,OAAOA,CACT,EACIw4T,IAAY,SAAmBtuH,EAAM2qH,EAAYyD,EAAU,CAC7D,IAAIrtT,EAAUotT,GAAoBC,CAAQ,EACtCG,EACJ,GAAIH,EAAS,SAAW,SACtB,OAAOb,GAAYvtH,EAAM2qH,EAAY5pT,EAASqtT,EAAS,YAAa,EAAI,EACnE,GAAIA,EAAS,SAAW,OAAQ,CACrC,IAAI/B,EAAWJ,GAAUjsH,EAAMj/L,CAAO,EACtCwtT,EAAYhH,GAAS,CAAC,OAAO,EAAG,CAAC8E,CAAQ,CAAC,CAC5C,KAAO,CACL,IAAImC,EAAajB,GAAYvtH,EAAM2qH,EAAY5pT,EAASqtT,EAAS,YAAa,EAAK,EAC/EK,EAAYxC,GAAUjsH,EAAMj/L,CAAO,EACvCwtT,EAAYhH,GAAS,CAAC,OAAO,EAAG,CAACiH,EAAYC,CAAS,CAAC,CACzD,CACA,OAAOJ,GAAYE,EAAWH,CAAQ,CACxC,EACIM,IAAgB,SAAuB1uH,EAAM2qH,EAAYyD,EAAU,CACrE,IAAIrtT,EAAUotT,GAAoBC,CAAQ,EACtC/B,EAAWJ,GAAUjsH,EAAMj/L,CAAO,EAClCwtT,EAAYhH,GAAS,CAAC,OAAO,EAAG,CAAC8E,CAAQ,CAAC,EAC9C,OAAOgC,GAAYE,EAAWH,CAAQ,CACxC,EAOIO,IAAoB,CACtB,QAAS,IACT,UAAW,IACX,UAAW,IACX,OAAQ,IACR,cAAe,IACf,eAAgB,IAChB,WAAY,IACZ,eAAgB,IAChB,gBAAiB,IACjB,YAAa,IACb,WAAY,IACZ,UAAW,IACX,aAAc,IACd,YAAa,IACb,UAAW,IACX,WAAY,IACZ,mBAAoB,IACpB,oBAAqB,IACrB,gBAAiB,IACjB,eAAgB,IAChB,YAAa,IACb,gBAAiB,IACjB,eAAgB,IAChB,iBAAkB,IAClB,gBAAiB,IACjB,WAAY,IACZ,gBAAiB,IACjB,eAAgB,IAChB,gBAAiB,IACjB,QAAS,IACT,kBAAmB,IACnB,iBAAkB,IAClB,mBAAoB,IACpB,mBAAoB,IACpB,kBAAmB,IACnB,mBAAoB,IACpB,WAAY,IACZ,QAAS,IACT,iBAAkB,IAClB,kBAAmB,IAEnB,iBAAkB,IAElB,iBAAkB,IAClB,gBAAiB,IACjB,gBAAiB,GACnB,EACIC,GAAiB,SAAwBh8T,EAAO,CAClD,IAAIkD,EAAO,IAAIy2T,GAAS,KAAM,CAAC,IAAIC,GAASmC,IAAkB/7T,EAAM,QAAQ,MAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EACzF,OAAAkD,EAAK,aAAa,WAAY,MAAM,EAC7BA,CACT,EA2BI+4T,IAAkB,CAEpB,eAAgB,CAAC,CAAC,YAAY,EAAG,KAAO,IAAK,UAAU,EACvD,cAAe,CAAC,CAAC,WAAW,EAAG,KAAO,IAAK,UAAU,EACrD,gBAAiB,CAAC,CAAC,YAAY,EAAG,KAAO,IAAK,UAAU,EACxD,eAAgB,CAAC,CAAC,WAAW,EAAG,KAAO,IAAK,UAAU,EACtD,YAAa,CAAC,CAAC,YAAY,EAAG,MAAO,IAAK,UAAU,EACpD,iBAAkB,CAAC,CAAC,YAAY,EAAG,EAAK,IAAK,UAAU,EAEvD,WAAY,CAAC,CAAC,WAAW,EAAG,MAAO,IAAK,UAAU,EAClD,gBAAiB,CAAC,CAAC,WAAW,EAAG,EAAK,IAAK,UAAU,EACrD,eAAgB,CAAC,CAAC,kBAAkB,EAAG,KAAO,IAAK,UAAU,EAC7D,YAAa,CAAC,CAAC,kBAAkB,EAAG,MAAO,IAAK,UAAU,EAC1D,WAAY,CAAC,CAAC,iBAAiB,EAAG,MAAO,IAAK,UAAU,EACxD,gBAAiB,CAAC,CAAC,aAAa,EAAG,KAAO,IAAK,UAAU,EACzD,eAAgB,CAAC,CAAC,aAAa,EAAG,KAAO,IAAK,UAAU,EACxD,iBAAkB,CAAC,CAAC,iBAAiB,EAAG,KAAO,IAAK,UAAU,EAC9D,iBAAkB,CAAC,CAAC,cAAc,EAAG,KAAO,IAAK,UAAU,EAC3D,gBAAiB,CAAC,CAAC,cAAc,EAAG,KAAO,IAAK,UAAU,EAC1D,kBAAmB,CAAC,CAAC,kBAAkB,EAAG,KAAO,IAAK,UAAU,EAChE,WAAY,CAAC,CAAC,WAAW,EAAG,KAAO,IAAK,UAAU,EAClD,gBAAiB,CAAC,CAAC,WAAW,EAAG,EAAK,IAAK,UAAU,EACrD,kBAAmB,CAAC,CAAC,kBAAkB,EAAG,KAAO,IAAK,UAAU,EAChE,mBAAoB,CAAC,CAAC,mBAAmB,EAAG,KAAO,IAAK,UAAU,EAClE,mBAAoB,CAAC,CAAC,YAAa,YAAY,EAAG,KAAO,GAAG,EAC5D,UAAW,CAAC,CAAC,YAAa,WAAY,YAAY,EAAG,IAAK,GAAG,EAC7D,WAAY,CAAC,CAAC,iBAAkB,gBAAiB,iBAAiB,EAAG,IAAK,GAAG,EAC7E,oBAAqB,CAAC,CAAC,YAAa,YAAY,EAAG,KAAO,GAAG,EAC7D,gBAAiB,CAAC,CAAC,YAAa,YAAY,EAAG,KAAM,GAAG,EACxD,gBAAiB,CAAC,CAAC,kBAAmB,kBAAkB,EAAG,KAAM,GAAG,EACpE,mBAAoB,CAAC,CAAC,sBAAuB,kBAAkB,EAAG,KAAM,GAAG,EAC3E,mBAAoB,CAAC,CAAC,kBAAmB,sBAAsB,EAAG,KAAM,GAAG,EAC3E,eAAgB,CAAC,CAAC,YAAa,WAAW,EAAG,KAAM,GAAG,EACtD,gBAAiB,CAAC,CAAC,WAAY,YAAY,EAAG,KAAM,GAAG,EACvD,gBAAiB,CAAC,CAAC,kBAAmB,kBAAkB,EAAG,KAAO,GAAG,EACrE,iBAAkB,CAAC,CAAC,kBAAmB,kBAAkB,EAAG,KAAO,GAAG,EACtE,YAAa,CAAC,CAAC,kBAAmB,kBAAkB,EAAG,IAAK,GAAG,EAC/D,aAAc,CAAC,CAAC,mBAAoB,mBAAmB,EAAG,IAAK,GAAG,EAClE,UAAW,CAAC,CAAC,YAAa,YAAY,EAAG,KAAO,GAAG,EACnD,WAAY,CAAC,CAAC,iBAAkB,iBAAiB,EAAG,KAAO,GAAG,EAC9D,QAAS,CAAC,CAAC,aAAc,YAAY,EAAG,IAAK,GAAG,EAChD,QAAS,CAAC,CAAC,aAAc,aAAa,EAAG,KAAM,GAAG,EAKlD,iBAAkB,CAAC,CAAC,oBAAqB,oBAAoB,EAAG,KAAM,GAAG,EACzE,kBAAmB,CAAC,CAAC,2BAA4B,2BAA2B,EAAG,KAAM,GAAG,EACxF,iBAAkB,CAAC,CAAC,2BAA4B,2BAA2B,EAAG,KAAM,GAAG,CACzF,EACIC,IAAmB,IAAI,IAAI,CAAC,UAAW,YAAa,YAAa,QAAQ,CAAC,EAC1EC,GAAc,SAAqB9sS,EAAOlhB,EAAS,CAErD,SAASiuT,GAAgB,CACvB,IAAIC,EAAe,IACfr8T,EAAQqvB,EAAM,MAAM,MAAM,CAAC,EAC/B,GAAI6sS,IAAiB,IAAIl8T,CAAK,EAAG,CAI/B,IAAIs8T,EAAMjtS,EAGNktS,EAAWD,EAAI,KAAK,OAAS,WAAaA,EAAI,KAAK,KAAK,OAAS,EACjE/N,EACAkC,EACA+L,EACJ,GAAID,EAAW,EACTv8T,IAAU,WAAaA,IAAU,aACnCuuT,EAAgB,IAChB8N,EAAe,KACfG,EAAU,IACV/L,EAAWzwT,EAAQ,MAEnBuuT,EAAgB,IAChB8N,EAAe,KACfG,EAAU,IACV/L,EAAW,cAER,CACL,IAAIgM,EAAW,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAAEF,CAAQ,EACtCv8T,IAAU,WAAaA,IAAU,aACnCq8T,EAAe,CAAC,EAAG,KAAM,KAAM,KAAM,IAAI,EAAEI,CAAQ,EACnDlO,EAAgB,CAAC,EAAG,IAAK,IAAK,IAAK,GAAG,EAAEkO,CAAQ,EAChDD,EAAU,CAAC,EAAG,IAAM,GAAK,GAAK,IAAM,GAAI,EAAEC,CAAQ,EAClDhM,EAAWzwT,EAAQy8T,IAEnBJ,EAAe,CAAC,EAAG,IAAK,KAAM,KAAM,IAAI,EAAEI,CAAQ,EAClDlO,EAAgB,CAAC,EAAG,IAAK,IAAK,IAAK,GAAG,EAAEkO,CAAQ,EAChDD,EAAU,CAAC,EAAG,IAAM,KAAO,GAAK,KAAO,GAAI,EAAEC,CAAQ,EACrDhM,EAAW,QAAUgM,EAEzB,CACA,IAAI5uU,EAAO,IAAI2iU,GAASC,CAAQ,EAC5BgG,EAAU,IAAInG,GAAQ,CAACziU,CAAI,EAAG,CAChC,MAAS,OACT,OAAUyhU,GAAOkN,CAAO,EACxB,QAAW,OAASH,EAAe,IAAM9N,EACzC,oBAAuB,MAC/B,CAAO,EACD,MAAO,CACL,KAAMqG,GAAY,CAAA,EAAI,CAAC6B,CAAO,EAAGtoT,CAAO,EACxC,SAAU,EACV,OAAQquT,CAChB,CACI,KAAO,CACL,IAAIE,EAAQ,CAAA,EACRlkU,EAAOyjU,IAAgBj8T,CAAK,EAC5B,CAAC46G,EAAO+hN,EAAWC,CAAc,EAAIpkU,EACrCqkU,EAAWD,EAAiB,IAC5BE,EAAiBliN,EAAM,OACvBmiN,EACAC,EACJ,GAAIF,IAAmB,EAAG,CAExB,IAAIG,EAASzkU,EAAK,CAAC,EACnBukU,EAAe,CAAC,WAAW,EAC3BC,EAAS,CAACC,CAAM,CAClB,SAAWH,IAAmB,EAC5BC,EAAe,CAAC,iBAAkB,iBAAiB,EACnDC,EAAS,CAAC,WAAY,UAAU,UACvBF,IAAmB,EAC5BC,EAAe,CAAC,aAAc,eAAgB,aAAa,EAC3DC,EAAS,CAAC,WAAY,WAAY,UAAU,MAE5C,OAAM,IAAI,MAAM;AAAA,sBAAiFF,EAAiB,YAAY,EAEhI,QAAShmU,EAAI,EAAGA,EAAIgmU,EAAgBhmU,IAAK,CACvC,IAAIomU,EAAQ,IAAI1M,GAAS51M,EAAM9jH,CAAC,CAAC,EAC7BqmU,EAAW,IAAI7M,GAAQ,CAAC4M,CAAK,EAAG,CAClC,MAAS,QACT,OAAU5N,GAAOuN,CAAQ,EACzB,QAAW,OAASR,EAAe,IAAMO,EACzC,oBAAuBI,EAAOlmU,CAAC,EAAI,QAC7C,CAAS,EACGsmU,EAAQxI,GAAY,CAACmI,EAAajmU,CAAC,CAAC,EAAG,CAACqmU,CAAQ,EAAGhvT,CAAO,EAC9D,GAAI2uT,IAAmB,EACrB,MAAO,CACL,KAAMM,EACN,SAAUT,EACV,OAAQE,CACpB,EAEUO,EAAM,MAAM,OAAS9N,GAAOuN,CAAQ,EACpCH,EAAM,KAAKU,CAAK,CAEpB,CACA,MAAO,CACL,KAAMzI,GAAS,CAAC,UAAU,EAAG+H,EAAOvuT,CAAO,EAC3C,SAAUwuT,EACV,OAAQE,CAChB,CACI,CACF,CACA,GAAI,CACF,KAAAnkR,EACA,SAAA6lM,EACA,OAAAl5L,CACJ,EAAM+2Q,EAAa,EAGjB,OAAA1jR,EAAK,OAAS2M,EACd3M,EAAK,MAAM,OAAS42Q,GAAOjqQ,CAAM,EAC7Bk5L,EAAW,IACb7lM,EAAK,MAAM,SAAW42Q,GAAO/wE,CAAQ,GAEhC7lM,CACT,EACI2kR,IAAkB,SAAyB9hS,EAAOv7B,EAAOs9T,EAAQC,EAAWpvT,EAAS,CAEvF,IAAI6sD,EACAwiQ,EAAcjiS,EAAM,OAASA,EAAM,MAAQ+hS,EAASC,EACxD,GAAI,kBAAkB,KAAKv9T,CAAK,GAE9B,GADAg7D,EAAM25P,GAAS,CAAC,WAAY30T,CAAK,EAAG,CAAA,EAAImO,CAAO,EAC3CnO,IAAU,OAAQ,CACpB,IAAIggE,EAAQ7xD,EAAQ,OAASA,EAAQ,SAAQ,EACzC6xD,IACFhF,EAAI,MAAM,YAAcgF,EAE5B,MACK,CAIL,IAAIskB,EAAQ,CAAA,EACR,eAAe,KAAKtkF,CAAK,GAC3BskF,EAAM,KAAK,IAAIqsO,GAAS,CACtB,GAAM,IACN,GAAM,IACN,GAAM,OACN,GAAM,OACN,eAAgB,SACxB,CAAO,CAAC,EAEA,aAAa,KAAK3wT,CAAK,GACzBskF,EAAM,KAAK,IAAIqsO,GAAS,CACtB,GAAM,IACN,GAAM,OACN,GAAM,OACN,GAAM,IACN,eAAgB,SACxB,CAAO,CAAC,EAEJ,IAAI8F,EAAU,IAAInG,GAAQhsO,EAAO,CAC/B,MAAS,OACT,OAAUgrO,GAAOkO,CAAW,CAClC,CAAK,EACDxiQ,EAAM45P,GAAY,CAAA,EAAI,CAAC6B,CAAO,EAAGtoT,CAAO,CAC1C,CACA,OAAA6sD,EAAI,OAASwiQ,EACbxiQ,EAAI,MAAM,OAASs0P,GAAOkO,CAAW,EAC9BxiQ,CACT,EAMA,SAASyiQ,GAAev6T,EAAMhI,EAAM,CAClC,GAAI,CAACgI,GAAQA,EAAK,OAAShI,EACzB,MAAM,IAAI,MAAM,yBAA2BA,EAAO,cAAgBgI,EAAO,gBAAkBA,EAAK,KAAO,OAAOA,CAAI,EAAE,EAEtH,OAAOA,CACT,CAKA,SAASw6T,GAAqBx6T,EAAM,CAClC,IAAIy6T,EAAYC,GAAoB16T,CAAI,EACxC,GAAI,CAACy6T,EACH,MAAM,IAAI,MAAM,gDAAkDz6T,EAAO,gBAAkBA,EAAK,KAAO,OAAOA,CAAI,EAAE,EAEtH,OAAOy6T,CACT,CAKA,SAASC,GAAoB16T,EAAM,CACjC,OAAIA,IAASA,EAAK,OAAS,QAAUuuT,IAAU,eAAevuT,EAAK,IAAI,GAC9DA,EAEF,IACT,CAEA,IAAI26T,GAAgBxuS,GAAS,CAC3B,GAAIA,aAAiB6gS,GACnB,OAAO7gS,EAET,GAAIyhS,IAAmBzhS,CAAK,GAAKA,EAAM,SAAS,SAAW,EACzD,OAAOwuS,GAAcxuS,EAAM,SAAS,CAAC,CAAC,CAE1C,EAGIyuS,GAAgB,CAACxB,EAAKnuT,IAAY,CAEpC,IAAIngB,EACAqhC,EACA0uS,EACAzB,GAAOA,EAAI,OAAS,UAStBjtS,EAAQouS,GAAenB,EAAI,KAAM,QAAQ,EAEzCtuU,EAAOqhC,EAAM,KAEbitS,EAAI,KAAOtuU,EAGX+vU,EAAclN,IAAWqH,GAAaoE,EAAKnuT,CAAO,CAAC,EAEnDmuT,EAAI,KAAOjtS,IAEXA,EAAQouS,GAAenB,EAAK,QAAQ,EACpCtuU,EAAOqhC,EAAM,MAGf,IAAIp+B,EAAOinU,GAAalqU,EAAMmgB,EAAQ,mBAAkB,CAAE,EAEtD6vT,EAAY3uS,EAAM,UAAYu8R,GAAe59T,CAAI,EAMjDmiU,EAAO,EACX,GAAI6N,EAAW,CACb,IAAIC,EAAqBC,EAGzB/N,GAAQ8N,GAAuBC,EAAiBL,GAAc5sU,CAAI,IAAM,KAAO,OAASitU,EAAe,OAAS,KAAOD,EAAsB,CAC/I,CACA,IAAIE,EAAc9uS,EAAM,QAAU,MAE9B+uS,EAAYD,EAAcltU,EAAK,OAASA,EAAK,MAAQ,KAAK,IAAIA,EAAK,OAAQkd,EAAQ,YAAW,EAAG,OAAO,EAExGkwT,EACJ,GAAKhvS,EAAM,WAgETgvS,EAAalC,GAAY9sS,EAAOlhB,CAAO,EACvCkwT,EAAajJ,GAAU,CACrB,aAAc,gBACd,SAAU,CAAC,CACT,KAAM,OACN,KAAMnkU,CACd,EAAS,CACD,KAAM,OACN,KAAMotU,EACN,eAAgB,CAAC,WAAW,EAC5B,aAAclO,EAAO,EAAI,CACvB,MAAO,eAAiBb,GAAO,EAAIa,CAAI,EAAI,IAC3C,WAAYb,GAAO,EAAIa,CAAI,CACrC,EAAY,MACZ,CAAO,CACP,CAAK,MA/EoB,CACrB,IAAIn0P,EACAxzB,EACAnZ,EAAM,QAAU,SAMlB2sC,EAASw6P,GAAU,MAAOroT,CAAO,EACjCq6B,EAAQ+tR,GAAQ,IAAI,CAAC,IAErBv6P,EAAS23P,GAAQ,CAEf,KAAMtkS,EAAM,KACZ,KAAMA,EAAM,KACpB,EAASlhB,EAAS,SAAS,EACrB6tD,EAAS40P,IAAoB50P,CAAM,EAGnCA,EAAO,OAAS,EAChBxzB,EAAQwzB,EAAO,MACXmiQ,IACFC,GAAapiQ,EAAO,QAGxBqiQ,EAAa1J,GAAS,CAAC,aAAa,EAAG,CAAC34P,CAAM,CAAC,EAI/C,IAAIsiQ,EAAajvS,EAAM,QAAU,gBAC7BivS,IACFD,EAAW,QAAQ,KAAK,aAAa,EACrCD,EAAYntU,EAAK,QAGnB,IAAImF,EAAO+5T,EAKNmO,IACHloU,GAAQoyC,EAAQ,GAElB61R,EAAW,MAAM,KAAO/O,GAAOl5T,CAAI,EAG/Bi5B,EAAM,QAAU,kBAClBgvS,EAAW,MAAM,IAAM,QAEzBA,EAAajJ,GAAU,CACrB,aAAc,gBACd,SAAU,CAAC,CACT,KAAM,OACN,KAAMnkU,CACd,EAAS,CACD,KAAM,OACN,KAAM,CAACmtU,CACf,EAAS,CACD,KAAM,OACN,KAAMC,CACd,CAAO,CACP,CAAK,CACH,CAkBA,IAAIE,EAAa5J,GAAS,CAAC,OAAQ,QAAQ,EAAG,CAAC0J,CAAU,EAAGlwT,CAAO,EACnE,OAAI4vT,GAGFA,EAAY,SAAS,CAAC,EAAIQ,EAG1BR,EAAY,OAAS,KAAK,IAAIQ,EAAW,OAAQR,EAAY,MAAM,EAEnEA,EAAY,QAAQ,CAAC,EAAI,OAClBA,GAEAQ,CAEX,EACIC,GAAkB,CAACnvS,EAAOlhB,IAAY,CACxC,IAAIswT,EAAapvS,EAAM,WAAa2sS,GAAe3sS,EAAM,KAAK,EAAI,IAAIsqS,GAAS,KAAM,CAACK,GAAS3qS,EAAM,MAAOA,EAAM,IAAI,CAAC,CAAC,EACpHnsB,EAAO,IAAIy2T,GAAS,QAAS,CAACW,GAAWjrS,EAAM,KAAMlhB,CAAO,EAAGswT,CAAU,CAAC,EAC9E,OAAAv7T,EAAK,aAAa,SAAU,MAAM,EAC3BA,CACT,EACIw7T,IAA4B,IAAI,OAAO,CAAC,UAAW,UAAW,SAAU,UAAW,QAAS,UAAW,UAAW,QAAS,QAAS,QAAS,YAAY,EAAE,IAAI1iQ,GAAU,KAAOA,CAAM,EAAE,KAAK,GAAG,CAAC,EAErMk7P,GAAe,CACb,KAAM,SACN,MAAO,CAAC,UAAW,UAAW,SAAU,UAAW,QAAS,UAAW,UAAW,QAAS,QAAS,QAAS,aAAc,cAAe,YAAa,cAAe,mBAAoB,kBAAmB,mBAAoB,uBAAwB,cAAe,oBAAqB,oBAAqB,oBAAoB,EACtU,MAAO,CACL,QAAS,CACb,EACE,QAAS,CAAClkM,EAASvzC,IAAS,CAC1B,IAAIzxF,EAAOwpU,GAAkB/3O,EAAK,CAAC,CAAC,EAChCk/O,EAAa,CAACD,IAA0B,KAAK1rM,EAAQ,QAAQ,EAC7D4rM,EAAW,CAACD,GAAc3rM,EAAQ,WAAa,aAAeA,EAAQ,WAAa,eAAiBA,EAAQ,WAAa,cAC7H,MAAO,CACL,KAAM,SACN,KAAMA,EAAQ,OAAO,KACrB,MAAOA,EAAQ,SACf,WAAY2rM,EACZ,SAAUC,EACV,KAAM5wU,CACZ,CACE,EACA,YAAa8vU,GACb,cAAeU,EACjB,CAAC,EAEDtH,GAAe,CACb,KAAM,SACN,MAAO,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,eAAe,EAC3G,MAAO,CACL,QAAS,EACT,cAAe,GACf,cAAe,GAEf,SAAU,CAAC,WAAW,CAC1B,EACE,QAAS,CAAClkM,EAASvzC,IAAS,CAC1B,IAAIzxF,EAAOyxF,EAAK,CAAC,EACbp3D,EAAO2qG,EAAQ,OAAO,KAC1B,OAAI3qG,IAAS,SACX2qG,EAAQ,OAAO,SAAS,gBAAgB,oBAAqB,kBAAoBA,EAAQ,SAAW,0BAA0B,EAC9H3qG,EAAO,QAEF,CACL,KAAM,SACN,KAAMA,EACN,MAAO2qG,EAAQ,SACf,WAAY,GACZ,SAAU,GACV,KAAMhlI,CACZ,CACE,EACA,YAAa8vU,GACb,cAAeU,EACjB,CAAC,EAGDtH,GAAe,CACb,KAAM,cACN,MAAO,CAAC,mBAAoB,oBAAqB,wBAAyB,eAAgB,qBAAsB,UAAU,EAC1H,MAAO,CACL,QAAS,CACb,EACE,QAAS,CAACC,EAAM13O,IAAS,CACvB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQ3H,EACAnpU,EAAOyxF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,cACN,KAAMo/O,EAAO,KACb,MAAOC,EACP,KAAM9wU,CACZ,CACE,EACA,YAAa,CAACqhC,EAAOlhB,IAAY,CAE/B,IAAI4wT,EAAa7G,GAAa7oS,EAAM,KAAMlhB,CAAO,EAC7CkwT,EAAalC,GAAY9sS,EAAOlhB,CAAO,EACvC6wT,EAAO3vS,EAAM,QAAU,WAAa,IAAO,EAE3CwmS,EAAQT,GAAU,CACpB,aAAc,MACd,aAAc2J,EAAW,OACzB,SAAU,CAAC,CACT,KAAM,OACN,KAAMV,EACN,eAAgB,CAAC,WAAW,CACpC,EAAS,CACD,KAAM,OACN,KAAMW,CACd,EAAS,CACD,KAAM,OACN,KAAMD,CACd,CAAO,CACP,CAAK,EACD,OAAOpK,GAAS,CAAC,OAAQ,aAAa,EAAG,CAACkB,CAAK,EAAG1nT,CAAO,CAC3D,EACA,cAAe,CAACkhB,EAAOlhB,IAAY,CACjC,IAAIswT,EAAazC,GAAe3sS,EAAM,KAAK,EACvCnsB,EAAO,IAAIy2T,GAAS,SAAU,CAACW,GAAWjrS,EAAM,KAAMlhB,CAAO,EAAGswT,CAAU,CAAC,EAC/E,OAAAv7T,EAAK,aAAa,cAAe,MAAM,EAChCA,CACT,CACF,CAAC,EAGD,IAAI+7T,GAAa5vS,GAAS,CACxB,IAAInsB,EAAO,IAAIy2T,GAAS,UAAWtqS,EAAQ,CAACA,CAAK,EAAI,EAAE,EACvD,OAAAnsB,EAAK,aAAa,QAAS,QAAQ,EACnCA,EAAK,aAAa,SAAU,OAAO,EAC5BA,CACT,EAEAg0T,GAAe,CACb,KAAM,SACN,MAAO,CAAC,eAAgB,gBAAiB,eAAgB,gBAAiB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,YAAa,sBAAuB,oBAAqB,qBAAsB,mBAAoB,uBAAwB,uBAAwB,eAAgB,uBAAwB,sBAAuB,YAG/W,qBAAsB,sBAAuB,qBAE7C,mBAAoB,kBAAmB,iBAAiB,EACxD,MAAO,CACL,QAAS,EACT,gBAAiB,CACrB,EACE,QAAQC,EAAM13O,EAAMy/O,EAAS,CAC3B,GAAI,CACF,OAAAL,EACA,SAAAC,CACN,EAAQ3H,EACJ,MAAO,CACL,KAAM,SACN,KAAM0H,EAAO,KACb,MAAOC,EACP,KAAMr/O,EAAK,CAAC,EACZ,MAAOy/O,EAAQ,CAAC,CACtB,CACE,EACA,YAAY7vS,EAAOlhB,EAAS,CAC1B,IAAIuY,EAAQvY,EAAQ,MAKhBgxT,EAAahxT,EAAQ,YAAYuY,EAAM,IAAG,CAAE,EAC5C04S,EAAarK,GAAamD,GAAa7oS,EAAM,KAAM8vS,EAAYhxT,CAAO,EAAGA,CAAO,EAChFkxT,EAAchwS,EAAM,MAAM,MAAM,EAAG,CAAC,IAAM,MAAQ,IAAM,KAC5D+vS,EAAW,QAAQ,KAAKC,EAAc,YAAY,EAClD,IAAIC,EACAjwS,EAAM,QAER8vS,EAAahxT,EAAQ,YAAYuY,EAAM,IAAG,CAAE,EAC5C44S,EAAavK,GAAamD,GAAa7oS,EAAM,MAAO8vS,EAAYhxT,CAAO,EAAGA,CAAO,EACjFmxT,EAAW,QAAQ,KAAKD,EAAc,YAAY,GAEpD,IAAIE,EAAYpD,GAAY9sS,EAAOlhB,CAAO,EAGtCqxT,EAAa,CAACrxT,EAAQ,YAAW,EAAG,WAAa,GAAMoxT,EAAU,OAEjEE,EAAa,CAACtxT,EAAQ,YAAW,EAAG,WAAa,GAAMoxT,EAAU,OAAS,MAC1EH,EAAW,MAAQ,KAAQ/vS,EAAM,QAAU,wBAC7CowS,GAAcL,EAAW,OAG3B,IAAIvJ,EACJ,GAAIyJ,EAAY,CACd,IAAII,EAAa,CAACvxT,EAAQ,cAAc,WAAamxT,EAAW,OAAS,GAAMC,EAAU,OAAS,KAClG1J,EAAQT,GAAU,CAChB,aAAc,kBACd,SAAU,CAAC,CACT,KAAM,OACN,KAAMgK,EACN,MAAOK,CACjB,EAAW,CACD,KAAM,OACN,KAAMF,EACN,MAAOC,CACjB,EAAW,CACD,KAAM,OACN,KAAMF,EACN,MAAOI,CACjB,CAAS,CACT,CAAO,CACH,MACE7J,EAAQT,GAAU,CAChB,aAAc,kBACd,SAAU,CAAC,CACT,KAAM,OACN,KAAMgK,EACN,MAAOK,CACjB,EAAW,CACD,KAAM,OACN,KAAMF,EACN,MAAOC,CACjB,CAAS,CACT,CAAO,EAGH,OAAA3J,EAAM,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,QAAQ,KAAK,WAAW,EAC3DlB,GAAS,CAAC,OAAQ,SAAS,EAAG,CAACkB,CAAK,EAAG1nT,CAAO,CACvD,EACA,cAAckhB,EAAOlhB,EAAS,CAC5B,IAAIwxT,EAAY3D,GAAe3sS,EAAM,KAAK,EAC1CswS,EAAU,aAAa,UAAWtwS,EAAM,MAAM,OAAO,CAAC,IAAM,IAAM,SAAW,OAAO,EACpF,IAAInsB,EACJ,GAAImsB,EAAM,KAAM,CACd,IAAIuwS,EAAYX,GAAW3E,GAAWjrS,EAAM,KAAMlhB,CAAO,CAAC,EAC1D,GAAIkhB,EAAM,MAAO,CACf,IAAIwwS,EAAYZ,GAAW3E,GAAWjrS,EAAM,MAAOlhB,CAAO,CAAC,EAC3DjL,EAAO,IAAIy2T,GAAS,aAAc,CAACgG,EAAWE,EAAWD,CAAS,CAAC,CACrE,MACE18T,EAAO,IAAIy2T,GAAS,QAAS,CAACgG,EAAWC,CAAS,CAAC,CAEvD,SAAWvwS,EAAM,MAAO,CACtB,IAAIywS,EAAab,GAAW3E,GAAWjrS,EAAM,MAAOlhB,CAAO,CAAC,EAC5DjL,EAAO,IAAIy2T,GAAS,SAAU,CAACgG,EAAWG,CAAU,CAAC,CACvD,MAGE58T,EAAO+7T,GAAU,EACjB/7T,EAAO,IAAIy2T,GAAS,QAAS,CAACgG,EAAWz8T,CAAI,CAAC,EAEhD,OAAOA,CACT,CACF,CAAC,EAED,SAAS68T,GAAc1wS,EAAOlhB,EAAS,CACrC,IAAI45M,EAAW+vG,GAAkBzoS,EAAM,KAAMlhB,EAAS,EAAI,EAC1D,OAAOwmT,GAAS,CAACtlS,EAAM,MAAM,EAAG04L,EAAU55M,CAAO,CACnD,CACA,SAAS6xT,GAAgB3wS,EAAOlhB,EAAS,CACvC,IAAIjL,EACAq4B,EAAQ6+R,GAAgB/qS,EAAM,KAAMlhB,CAAO,EAC/C,OAAIkhB,EAAM,SAAW,SACnBnsB,EAAO,IAAIy2T,GAAS,UAAWp+R,CAAK,EAC3BlM,EAAM,SAAW,OACtBA,EAAM,gBACRnsB,EAAOq4B,EAAM,CAAC,EACdr4B,EAAK,KAAO,MAEZA,EAAO,IAAIy2T,GAAS,KAAMp+R,CAAK,GAG7BlM,EAAM,gBACRnsB,EAAOq4B,EAAM,CAAC,EACdr4B,EAAK,KAAO,MAEZA,EAAO,IAAIy2T,GAAS,KAAMp+R,CAAK,EAI7BlM,EAAM,SAAW,QACnBnsB,EAAK,WAAW,OAAS,SACzBA,EAAK,WAAW,OAAS,UAChBmsB,EAAM,SAAW,UAC1BnsB,EAAK,WAAW,OAAS,MACzBA,EAAK,WAAW,OAAS,UAChBmsB,EAAM,SAAW,SAAWA,EAAM,SAAW,UACtDnsB,EAAK,WAAW,OAAS,MACzBA,EAAK,WAAW,OAAS,OAChBmsB,EAAM,SAAW,WAC1BnsB,EAAK,WAAW,OAAS,WACzBA,EAAK,WAAW,MAAQ,cAKrBA,CACT,CAEAg0T,GAAe,CACb,KAAM,SACN,MAAO,CAAC,YAAa,YAAa,YAAa,aAAc,cAAe,cAAe,aAAa,EACxG,MAAO,CACL,QAAS,EACT,UAAW,EACf,EACE,QAAQC,EAAM13O,EAAM,CAClB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQ3H,EACAlmU,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,SACN,KAAMo/O,EAAO,KACb,OAAQ,IAAMC,EAAS,MAAM,CAAC,EAE9B,KAAMrH,GAAYxmU,CAAI,EACtB,eAAgB26T,GAAe36T,CAAI,CACzC,CACE,EACA,YAAa8uU,GACb,cAAeC,EACjB,CAAC,EACD,IAAIC,GAAcjmH,GAAO,CAKvB,IAAIkmH,EAAOlmH,EAAI,OAAS,YAAcA,EAAI,KAAK,OAASA,EAAI,KAAK,CAAC,EAAIA,EACtE,OAAIkmH,EAAK,OAAS,SAAWA,EAAK,SAAW,OAASA,EAAK,SAAW,OAC7D,IAAMA,EAAK,OAEX,MAEX,EAGAhJ,GAAe,CACb,KAAM,SACN,MAAO,CAAC,WAAW,EACnB,MAAO,CACL,QAAS,CACb,EACE,QAAQK,EAAO93O,EAAM,CACnB,GAAI,CACF,OAAAo/O,CACN,EAAQtH,EACJ,MAAO,CACL,KAAM,SACN,KAAMsH,EAAO,KACb,OAAQoB,GAAYxgP,EAAK,CAAC,CAAC,EAC3B,KAAMg4O,GAAYh4O,EAAK,CAAC,CAAC,EACzB,eAAgBmsO,GAAensO,EAAK,CAAC,CAAC,CAC5C,CACE,CACF,CAAC,EAEDy3O,GAAe,CACb,KAAM,SACN,MAAO,CAAC,aAAc,YAAa,YAAY,EAC/C,MAAO,CACL,QAAS,CACb,EACE,QAAQiJ,EAAO1gP,EAAM,CACnB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQqB,EACAC,EAAU3gP,EAAK,CAAC,EAChB4gP,EAAa5gP,EAAK,CAAC,EACnB6gP,EACAxB,IAAa,aAEfwB,EAASL,GAAYG,CAAO,EAE5BE,EAAS,OAEX,IAAIC,EAAS,CACX,KAAM,KACN,KAAMH,EAAQ,KACd,OAAQ,GACR,mBAAoB,GACpB,eAAgB,GAChB,OAAQ,GACR,kBAAmBtB,IAAa,aAChC,KAAMrH,GAAY2I,CAAO,CAC/B,EACQI,EAAS,CACX,KAAM,SACN,KAAMH,EAAW,KACjB,KAAME,EACN,IAAKzB,IAAa,aAAe,KAAOuB,EACxC,IAAKvB,IAAa,aAAeuB,EAAa,IACpD,EACI,MAAO,CACL,KAAM,SACN,KAAMxB,EAAO,KACb,OAAAyB,EACA,KAAM,CAACE,CAAM,EACb,eAAgB5U,GAAe4U,CAAM,CAC3C,CACE,EACA,YAAaT,GACb,cAAeC,EACjB,CAAC,EAMD9I,GAAe,CACb,KAAM,MACN,MAAO,CAAC,OAAO,EACf,MAAO,CACL,QAAS,EACT,cAAe,EACnB,EACE,QAAQC,EAAM13O,EAAM,CAClB,GAAI,CACF,OAAAo/O,CACN,EAAQ1H,EACJ,MAAO,CACL,KAAM,MACN,KAAM0H,EAAO,KACb,OAAQoB,GAAYxgP,EAAK,CAAC,CAAC,EAC3B,KAAMg4O,GAAYh4O,EAAK,CAAC,CAAC,CAC/B,CACE,EACA,YAAYpwD,EAAOlhB,EAAS,CAC1B,IAAI45M,EAAW+vG,GAAkBzoS,EAAM,KAAMlhB,EAAS,EAAI,EACtDjL,EAAOyxT,GAAS,CAACtlS,EAAM,MAAM,EAAG04L,EAAU55M,CAAO,EACrD,OAAAjL,EAAK,MAAM,WAAa,uBACjBA,CACT,EACA,cAAcmsB,EAAO3I,EAAO,CAC1B,IAAI6U,EAAQ6+R,GAAgB/qS,EAAM,KAAM3I,CAAK,EAEzCxjB,EAAO,IAAIy2T,GAAS,SAAUp+R,CAAK,EACvC,OAAAr4B,EAAK,aAAa,QAAS,mCAAmC,EACvDA,CACT,CACF,CAAC,EAED,IAAIu9T,IAAsB,CACxB,IAAK,mBACL,IAAK,kBACL,IAAK,kBACL,EAAK,YACL,EAAK,cACL,IAAK,SACL,IAAK,UACP,EACIC,GAAU,KAKL,CACL,KAAM,UACN,KAAM,CAAA,EACN,KAAM,OACN,MAAO,SACX,GAEIC,GAAiBz9T,GACZA,EAAK,OAAS,WAAaA,EAAK,OAAS,IAE9C09T,IAAa,CAAC19T,EAAM29T,KACd39T,EAAK,OAAS,WAAaA,EAAK,OAAS,SAAWA,EAAK,OAAS29T,EAE5E,SAASC,IAAQC,EAAWzrB,EAAQupB,EAAQ,CAG1C,IAAIC,EAAW2B,IAAoBM,CAAS,EAC5C,OAAQjC,EAAQ,CACd,IAAK,mBACL,IAAK,kBACH,OAAOD,EAAO,aAAaC,EAAU,CAACxpB,EAAO,CAAC,CAAC,EAAG,CAACA,EAAO,CAAC,CAAC,CAAC,EAC/D,IAAK,YACL,IAAK,cACH,CACE,IAAI0rB,EAAYnC,EAAO,aAAa,aAAc,CAACvpB,EAAO,CAAC,CAAC,EAAG,EAAE,EAC7D2rB,EAAY,CACd,KAAM,OACN,KAAMnC,EACN,KAAM,OACN,OAAQ,KAClB,EACYoC,EAAarC,EAAO,aAAa,QAAS,CAACoC,CAAS,EAAG,EAAE,EACzDE,EAAatC,EAAO,aAAa,cAAe,CAACvpB,EAAO,CAAC,CAAC,EAAG,EAAE,EAC/D8rB,EAAa,CACf,KAAM,WACN,KAAM,OACN,KAAM,CAACJ,EAAWE,EAAYC,CAAU,CAClD,EACQ,OAAOtC,EAAO,aAAa,eAAgB,CAACuC,CAAU,EAAG,CAAA,CAAE,CAC7D,CACF,IAAK,kBACH,OAAOvC,EAAO,aAAa,kBAAmB,CAAA,EAAI,CAAA,CAAE,EACtD,IAAK,SACH,CACE,IAAIwC,EAAQ,CACV,KAAM,UACN,KAAM,SACN,KAAM,MAChB,EACQ,OAAOxC,EAAO,aAAa,QAAS,CAACwC,CAAK,EAAG,CAAA,CAAE,CACjD,CACF,QACE,MAAO,CACL,KAAM,UACN,KAAM,IACN,KAAM,MACd,CACA,CACA,CACA,SAASC,IAAQzC,EAAQ,CAEvB,IAAI0C,EAAa,CAAA,EAIjB,IAHA1C,EAAO,OAAO,WAAU,EACxBA,EAAO,OAAO,OAAO,IAAI,OAAQ,aAAa,EAC9CA,EAAO,OAAO,WAAU,IACX,CAGX0C,EAAW,KAAK1C,EAAO,gBAAgB,GAAO,MAAM,CAAC,EACrDA,EAAO,OAAO,SAAQ,EACtBA,EAAO,OAAO,WAAU,EACxB,IAAI9yT,EAAO8yT,EAAO,MAAK,EAAG,KAC1B,GAAI9yT,IAAS,KAAOA,IAAS,OAC3B8yT,EAAO,QAAO,UACL9yT,IAAS,QAAS,CACvBw1T,EAAWA,EAAW,OAAS,CAAC,EAAE,SAAW,GAC/CA,EAAW,IAAG,EAEhB,KACF,KACE,OAAM,IAAInW,GAAW,iCAAkCyT,EAAO,SAAS,CAE3E,CAIA,QAHIlqU,EAAM,CAAA,EACN1D,EAAO,CAAC0D,CAAG,EAENmC,EAAI,EAAGA,EAAIyqU,EAAW,OAAQzqU,IAAK,CAK1C,QAHI0qU,EAAWD,EAAWzqU,CAAC,EAEvBq7D,EAAOuuQ,GAAO,EACTz3T,EAAI,EAAGA,EAAIu4T,EAAS,OAAQv4T,IACnC,GAAI,CAAC03T,GAAea,EAASv4T,CAAC,CAAC,EAE7BkpD,EAAK,KAAK,KAAKqvQ,EAASv4T,CAAC,CAAC,MACrB,CAGLtU,EAAI,KAAKw9D,CAAI,EAGblpD,GAAK,EACL,IAAI83T,EAAYrD,GAAqB8D,EAASv4T,CAAC,CAAC,EAAE,KAE9CqsS,EAAS,IAAI,MAAM,CAAC,EAYxB,GAXAA,EAAO,CAAC,EAAI,CACV,KAAM,WACN,KAAM,OACN,KAAM,CAAA,CAChB,EACQA,EAAO,CAAC,EAAI,CACV,KAAM,WACN,KAAM,OACN,KAAM,CAAA,CAChB,EAEY,OAAM,SAASyrB,CAAS,EAAU,GAAI,OAAO,SAASA,CAAS,EAKjE,QAASU,EAAW,EAAGA,EAAW,EAAGA,IAAY,CAE/C,QADIC,EAAU,GACLvyU,EAAI8Z,EAAI,EAAG9Z,EAAIqyU,EAAS,OAAQryU,IAAK,CAC5C,GAAIyxU,IAAWY,EAASryU,CAAC,EAAG4xU,CAAS,EAAG,CACtCW,EAAU,GACVz4T,EAAI9Z,EACJ,KACF,CACA,GAAIwxU,GAAea,EAASryU,CAAC,CAAC,EAC5B,MAAM,IAAIi8T,GAAW,aAAe2V,EAAY,qCAAsCS,EAASryU,CAAC,CAAC,EAEnGmmT,EAAOmsB,CAAQ,EAAE,KAAK,KAAKD,EAASryU,CAAC,CAAC,CACxC,CACA,GAAIuyU,EAEF,MAAM,IAAItW,GAAW,aAAe2V,EAAY,qCAAsCS,EAASv4T,CAAC,CAAC,CAErG,KAEA,OAAM,IAAImiT,GAAW,oCAAuCoW,EAASv4T,CAAC,CAAC,EAGzE,IAAIo4T,EAAQP,IAAQC,EAAWzrB,EAAQupB,CAAM,EAGzC8C,EAAe,CACjB,KAAM,UACN,KAAM,CAACN,CAAK,EACZ,KAAM,OACN,MAAO,SACjB,EACQ1sU,EAAI,KAAKgtU,CAAY,EAIrBxvQ,EAAOuuQ,GAAO,CAChB,CAEE5pU,EAAI,IAAM,EAGZnC,EAAI,KAAKw9D,CAAI,EAIbx9D,EAAI,MAAK,EAEXA,EAAM,CAAA,EACN1D,EAAK,KAAK0D,CAAG,CACf,CAEAkqU,EAAO,OAAO,SAAQ,EAEtBA,EAAO,OAAO,SAAQ,EAEtB,IAAIt6O,EAAO,IAAI,MAAMtzF,EAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CACxC,KAAM,QACN,MAAO,IACP,OAAQ,IAER,QAAS,GACb,CAAG,EACD,MAAO,CACL,KAAM,QACN,KAAM,OACN,KAAAA,EACA,aAAc,EACd,OAAQ,GACR,QAAS,CAAC,IAAI,EACd,KAAAszF,EACA,kBAAmB,KACnB,gBAAiB,IAAI,MAAMtzF,EAAK,OAAS,CAAC,EAAE,KAAK,CAAA,CAAE,CACvD,CACA,CAMAimU,GAAe,CACb,KAAM,UACN,MAAO,CAAC,aAAc,aAAa,EACnC,MAAO,CACL,QAAS,CACb,EACE,QAAQC,EAAM13O,EAAM,CAClB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQ3H,EACJ,MAAO,CACL,KAAM,UACN,KAAM0H,EAAO,KACb,KAAMC,EAAS,MAAM,CAAC,EACtB,MAAOr/O,EAAK,CAAC,CACnB,CACE,EACA,YAAYpwD,EAAOlhB,EAAS,CAC1B,IAAIgxT,EAAahxT,EAAQ,YAAYA,EAAQ,MAAM,KAAK,EACpDnO,EAAQ+0T,GAAamD,GAAa7oS,EAAM,MAAO8vS,EAAYhxT,CAAO,EAAGA,CAAO,EAChF,OAAAnO,EAAM,QAAQ,KAAK,YAAcqvB,EAAM,IAAI,EAC3CrvB,EAAM,MAAM,OAASsvT,GAAO,GAAMtvT,EAAM,KAAK,EAG7CA,EAAM,OAAS,EACfA,EAAM,MAAQ,EACPA,CACT,EACA,cAAcqvB,EAAOlhB,EAAS,CAC5B,IAAInO,EAAQ,IAAI25T,GAAS,OAAQ,CAACW,GAAWjrS,EAAM,MAAOlhB,CAAO,CAAC,CAAC,EACnE,OAAAnO,EAAQ,IAAI25T,GAAS,UAAW,CAAC35T,CAAK,CAAC,EACvCA,EAAM,aAAa,QAAS,GAAG,EAC3BqvB,EAAM,OAAS,QACjBrvB,EAAM,aAAa,SAAU,SAAS,EAIxCA,EAAM,aAAa,UAAW,OAAO,EACrCA,EAAQ,IAAI25T,GAAS,SAAU,CAAC35T,CAAK,CAAC,EACtCA,EAAM,aAAa,eAAgB,OAAO,EAC1CA,EAAM,aAAa,cAAe,GAAG,EAC9BA,CACT,CACF,CAAC,EACDk3T,GAAe,CACb,KAAM,gBACN,MAAO,CAAC,cAAc,EACtB,MAAO,CACL,QAAS,CACb,EACE,QAAQK,EAAO93O,EAAM,CACnB,GAAI,CACF,OAAAo/O,CACN,EAAQtH,EACJ,MAAO,CACL,KAAM,gBACN,KAAMsH,EAAO,KACb,SAAUp/O,EAAK,CAAC,CACtB,CACE,EACA,YAAYpwD,EAAOlhB,EAAS,CAI1B,IAAI8nC,EAAS8+Q,GAAamD,GAAa7oS,EAAM,SAAUlhB,CAAO,EAAGA,CAAO,EACxE,OAAA8nC,EAAO,QAAQ,KAAK,eAAe,EAC5BA,CACT,EACA,cAAc5mB,EAAOlhB,EAAS,CAC5B,OAAO,IAAIwrT,GAAS,OAAQ,CAACW,GAAWjrS,EAAM,SAAUlhB,CAAO,CAAC,CAAC,CACnE,CACF,CAAC,EAKD+oT,GAAe,CACb,KAAM,UACN,MAAO,CAAC,SAAS,EACjB,MAAO,CACL,QAAS,EACT,cAAe,EACnB,EACE,QAAQC,EAAM13O,EAAM,CAOlB,OANI,CACF,OAAAo/O,CACN,EAAQ1H,EACAn9G,EAAMyjH,GAAeh+O,EAAK,CAAC,EAAG,UAAU,EACxCpwD,EAAQ2qL,EAAI,KACZ4M,EAAS,GACJ9vN,EAAI,EAAGA,EAAIu4B,EAAM,OAAQv4B,IAAK,CACrC,IAAIoM,EAAOu6T,GAAepuS,EAAMv4B,CAAC,EAAG,SAAS,EAC7C8vN,GAAU1jN,EAAK,IACjB,CACA,IAAI1U,EAAO,SAASo4N,CAAM,EACtB5vN,EACJ,GAAI,MAAMxI,CAAI,EACZ,MAAM,IAAI48T,GAAW,oCAAsCxkG,CAAM,EAG5D,GAAIp4N,EAAO,GAAKA,GAAQ,QAC7B,MAAM,IAAI48T,GAAW,mCAAqCxkG,CAAM,EAC3D,OAAIp4N,GAAQ,MACjBwI,EAAO,OAAO,aAAaxI,CAAI,GAG/BA,GAAQ,MACRwI,EAAO,OAAO,cAAcxI,GAAQ,IAAM,OAASA,EAAO,MAAS,KAAM,GAEpE,CACL,KAAM,UACN,KAAMqwU,EAAO,KACb,KAAM7nU,CACZ,CACE,CACF,CAAC,EAED,IAAI4qU,GAAgB,CAACvyS,EAAOlhB,IAAY,CACtC,IAAI45M,EAAW+vG,GAAkBzoS,EAAM,KAAMlhB,EAAQ,UAAUkhB,EAAM,KAAK,EAAG,EAAK,EAKlF,OAAO8kS,GAAapsG,CAAQ,CAC9B,EACI85G,GAAkB,CAACxyS,EAAOlhB,IAAY,CACxC,IAAIotB,EAAQ6+R,GAAgB/qS,EAAM,KAAMlhB,EAAQ,UAAUkhB,EAAM,KAAK,CAAC,EAClEnsB,EAAO,IAAIy2T,GAAS,SAAUp+R,CAAK,EACvC,OAAAr4B,EAAK,aAAa,YAAamsB,EAAM,KAAK,EACnCnsB,CACT,EACAg0T,GAAe,CACb,KAAM,QACN,MAAO,CAAC,aAAa,EACrB,MAAO,CACL,QAAS,EACT,cAAe,GACf,SAAU,CAAC,QAAS,UAAU,CAClC,EACE,QAAQC,EAAM13O,EAAM,CAClB,GAAI,CACF,OAAAo/O,CACN,EAAQ1H,EACAn3P,EAAQy9P,GAAeh+O,EAAK,CAAC,EAAG,aAAa,EAAE,MAC/CxuF,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,QACN,KAAMo/O,EAAO,KACb,MAAA7+P,EACA,KAAMy3P,GAAYxmU,CAAI,CAC5B,CACE,EACA,YAAa2wU,GACb,cAAeC,EACjB,CAAC,EACD3K,GAAe,CACb,KAAM,QACN,MAAO,CAAC,SAAS,EACjB,MAAO,CACL,QAAS,EACT,cAAe,GACf,SAAU,CAAC,OAAO,CACtB,EACE,QAAQK,EAAO93O,EAAM,CACnB,GAAI,CACF,OAAAo/O,EACA,iBAAAiD,CACN,EAAQvK,EACAv3P,EAAQy9P,GAAeh+O,EAAK,CAAC,EAAG,aAAa,EAAE,MAKnDo/O,EAAO,OAAO,OAAO,IAAI,kBAAmB7+P,CAAK,EAEjD,IAAI/uE,EAAO4tU,EAAO,gBAAgB,GAAMiD,CAAgB,EACxD,MAAO,CACL,KAAM,QACN,KAAMjD,EAAO,KACb,MAAA7+P,EACA,KAAA/uE,CACN,CACE,EACA,YAAa2wU,GACb,cAAeC,EACjB,CAAC,EAID3K,GAAe,CACb,KAAM,KACN,MAAO,CAAC,MAAM,EACd,MAAO,CACL,QAAS,EACT,gBAAiB,EACjB,cAAe,EACnB,EACE,QAAQC,EAAM13O,EAAMy/O,EAAS,CAC3B,GAAI,CACF,OAAAL,CACN,EAAQ1H,EACAnhU,EAAO6oU,EAAO,OAAO,OAAM,EAAG,OAAS,IAAMA,EAAO,eAAe,EAAI,EAAI,KAC3EkD,EAAU,CAAClD,EAAO,SAAS,aAAe,CAACA,EAAO,SAAS,kBAAkB,uBAAwB,0DAA+D,EACxK,MAAO,CACL,KAAM,KACN,KAAMA,EAAO,KACb,QAAAkD,EACA,KAAM/rU,GAAQynU,GAAeznU,EAAM,MAAM,EAAE,KACjD,CACE,EAGA,YAAYq5B,EAAOlhB,EAAS,CAC1B,IAAIuqC,EAAOi8Q,GAAS,CAAC,QAAQ,EAAG,CAAA,EAAIxmT,CAAO,EAC3C,OAAIkhB,EAAM,UACRqpB,EAAK,QAAQ,KAAK,SAAS,EACvBrpB,EAAM,OACRqpB,EAAK,MAAM,UAAY42Q,GAAOH,GAAc9/R,EAAM,KAAMlhB,CAAO,CAAC,IAG7DuqC,CACT,EACA,cAAcrpB,EAAOlhB,EAAS,CAC5B,IAAIjL,EAAO,IAAIy2T,GAAS,QAAQ,EAChC,OAAItqS,EAAM,UACRnsB,EAAK,aAAa,YAAa,SAAS,EACpCmsB,EAAM,MACRnsB,EAAK,aAAa,SAAUosT,GAAOH,GAAc9/R,EAAM,KAAMlhB,CAAO,CAAC,CAAC,GAGnEjL,CACT,CACF,CAAC,EAED,IAAI8+T,GAAY,CACd,WAAY,WACZ,SAAU,iBACV,iBAAkB,iBAClB,QAAS,SACT,SAAU,SACV,SAAU,SACV,SAAU,SACV,QAAS,gBACT,cAAe,kBACjB,EACIC,GAAuBttO,GAAO,CAChC,IAAIlmG,EAAOkmG,EAAI,KACf,GAAI,wBAAwB,KAAKlmG,CAAI,EACnC,MAAM,IAAI28T,GAAW,8BAA+Bz2N,CAAG,EAEzD,OAAOlmG,CACT,EACIyzU,IAASrD,GAAU,CACrB,IAAIlqO,EAAMkqO,EAAO,OAAO,SAAQ,EAChC,OAAIlqO,EAAI,OAAS,MAEfA,EAAMkqO,EAAO,OAAO,SAAQ,EACxBlqO,EAAI,OAAS,MAEfA,EAAMkqO,EAAO,OAAO,SAAQ,IAGzBlqO,CACT,EACIwtO,GAAa,CAACtD,EAAQpwU,EAAMkmG,EAAKkzF,IAAW,CAC9C,IAAIu6I,EAAQvD,EAAO,OAAO,OAAO,IAAIlqO,EAAI,IAAI,EACzCytO,GAAS,OAGXztO,EAAI,SAAW,GACfytO,EAAQ,CACN,OAAQ,CAACztO,CAAG,EACZ,QAAS,EAET,aAAc,CAACkqO,EAAO,OAAO,aAAalqO,EAAI,IAAI,CACxD,GAEEkqO,EAAO,OAAO,OAAO,IAAIpwU,EAAM2zU,EAAOv6I,CAAM,CAC9C,EAKAqvI,GAAe,CACb,KAAM,WACN,MAAO,CAAC,WAAY,SAAU,gBAChC,EACE,MAAO,CACL,QAAS,EACT,cAAe,EACnB,EACE,QAAQC,EAAM,CACZ,GAAI,CACF,OAAA0H,EACA,SAAAC,CACN,EAAQ3H,EACJ0H,EAAO,cAAa,EACpB,IAAI15T,EAAQ05T,EAAO,MAAK,EACxB,GAAImD,GAAU78T,EAAM,IAAI,EAEtB,OAAI25T,IAAa,YAAcA,IAAa,oBAC1C35T,EAAM,KAAO68T,GAAU78T,EAAM,IAAI,GAE5Bs4T,GAAeoB,EAAO,cAAa,EAAI,UAAU,EAE1D,MAAM,IAAIzT,GAAW,mCAAoCjmT,CAAK,CAChE,CACF,CAAC,EAKD+xT,GAAe,CACb,KAAM,WACN,MAAO,CAAC,QAAS,SAAU,SAAU,QAAQ,EAC7C,MAAO,CACL,QAAS,EACT,cAAe,GACf,UAAW,EACf,EACE,QAAQK,EAAO,CACb,GAAI,CACF,OAAAsH,EACA,SAAAC,CACN,EAAQvH,EACA5iO,EAAMkqO,EAAO,OAAO,SAAQ,EAC5BpwU,EAAOkmG,EAAI,KACf,GAAI,wBAAwB,KAAKlmG,CAAI,EACnC,MAAM,IAAI28T,GAAW,8BAA+Bz2N,CAAG,EAMzD,QAJI0tO,EAAU,EACV15E,EACA25E,EAAa,CAAC,EAAE,EAEbzD,EAAO,OAAO,OAAM,EAAG,OAAS,KAErC,GADAlqO,EAAMkqO,EAAO,OAAO,SAAQ,EACxBlqO,EAAI,OAAS,IAAK,CAKpB,GAAIkqO,EAAO,OAAO,OAAM,EAAG,OAAS,IAAK,CACvCl2E,EAASk2E,EAAO,OAAO,OAAM,EAC7ByD,EAAWD,CAAO,EAAE,KAAK,GAAG,EAC5B,KACF,CAIA,GADA1tO,EAAMkqO,EAAO,OAAO,SAAQ,EACxB,CAAC,UAAU,KAAKlqO,EAAI,IAAI,EAC1B,MAAM,IAAIy2N,GAAW,4BAA+Bz2N,EAAI,KAAO,GAAI,EAErE,GAAI,SAASA,EAAI,IAAI,IAAM0tO,EAAU,EACnC,MAAM,IAAIjX,GAAW,oBAAuBz2N,EAAI,KAAO,gBAAiB,EAE1E0tO,IACAC,EAAW,KAAK,EAAE,CACpB,KAAO,IAAI3tO,EAAI,OAAS,MACtB,MAAM,IAAIy2N,GAAW,6BAA6B,EAElDkX,EAAWD,CAAO,EAAE,KAAK1tO,EAAI,IAAI,EAIrC,GAAI,CACF,OAAAlnB,CACN,EAAQoxP,EAAO,OAAO,WAAU,EAC5B,OAAIl2E,GACFl7K,EAAO,QAAQk7K,CAAM,GAEnBm2E,IAAa,UAAYA,IAAa,YACxCrxP,EAASoxP,EAAO,OAAO,aAAapxP,CAAM,EAC1CA,EAAO,QAAO,GAGhBoxP,EAAO,OAAO,OAAO,IAAIpwU,EAAM,CAC7B,OAAAg/E,EACA,QAAA40P,EACA,WAAAC,CACN,EAAOxD,IAAakD,GAAUlD,CAAQ,CAAC,EAC5B,CACL,KAAM,WACN,KAAMD,EAAO,IACnB,CACE,CACF,CAAC,EAKD3H,GAAe,CACb,KAAM,WACN,MAAO,CAAC,QAAS,eACnB,EACE,MAAO,CACL,QAAS,EACT,cAAe,GACf,UAAW,EACf,EACE,QAAQiJ,EAAO,CACb,GAAI,CACF,OAAAtB,EACA,SAAAC,CACN,EAAQqB,EACA1xU,EAAOwzU,GAAqBpD,EAAO,OAAO,SAAQ,CAAE,EACxDA,EAAO,OAAO,cAAa,EAC3B,IAAIlqO,EAAMutO,IAAOrD,CAAM,EACvB,OAAAsD,GAAWtD,EAAQpwU,EAAMkmG,EAAKmqO,IAAa,eAAe,EACnD,CACL,KAAM,WACN,KAAMD,EAAO,IACnB,CACE,CACF,CAAC,EAED3H,GAAe,CACb,KAAM,WACN,MAAO,CAAC,cAAe,kBACzB,EACE,MAAO,CACL,QAAS,EACT,cAAe,GACf,UAAW,EACf,EACE,QAAQqL,EAAO,CACb,GAAI,CACF,OAAA1D,EACA,SAAAC,CACN,EAAQyD,EACA9zU,EAAOwzU,GAAqBpD,EAAO,OAAO,SAAQ,CAAE,EACpDpjI,EAASojI,EAAO,OAAO,SAAQ,EAC/BlqO,EAAMkqO,EAAO,OAAO,SAAQ,EAChC,OAAAsD,GAAWtD,EAAQpwU,EAAMkmG,EAAKmqO,IAAa,kBAAkB,EAC7DD,EAAO,OAAO,UAAUlqO,CAAG,EAC3BkqO,EAAO,OAAO,UAAUpjI,CAAM,EACvB,CACL,KAAM,WACN,KAAMojI,EAAO,IACnB,CACE,CACF,CAAC,EA2BD,IAAI2D,GAAa,SAAoBh8G,EAAQxlK,EAAM34B,EAAM,CACvD,IAAIyxL,EAAU43G,GAAQ,KAAKlrG,CAAM,GAAKkrG,GAAQ,KAAKlrG,CAAM,EAAE,QACvDp9K,EAAUgoR,GAAoBt3G,GAAW0M,EAAQxlK,EAAM34B,CAAI,EAC/D,GAAI,CAAC+gB,EACH,MAAM,IAAI,MAAM,sBAAwBo9K,EAAS,kBAAoBxlK,EAAO,GAAG,EAEjF,OAAO5X,CACT,EAKIq5R,GAAY,SAAmB/Y,EAAOgZ,EAASv0T,EAASq7K,EAAS,CACnE,IAAI21I,EAAahxT,EAAQ,gBAAgBu0T,CAAO,EAC5ChqR,EAAOi8Q,GAASnrI,EAAQ,OAAO21I,EAAW,cAAchxT,CAAO,CAAC,EAAG,CAACu7S,CAAK,EAAGv7S,CAAO,EACnFw0T,EAAsBxD,EAAW,eAAiBhxT,EAAQ,eAC9D,OAAAuqC,EAAK,QAAUiqR,EACfjqR,EAAK,OAASiqR,EACdjqR,EAAK,YAAcymR,EAAW,eACvBzmR,CACT,EACIkqR,GAAa,SAAoBlqR,EAAMvqC,EAASuY,EAAO,CACzD,IAAIy4S,EAAahxT,EAAQ,gBAAgBuY,CAAK,EAC1Ci1C,GAAS,EAAIxtD,EAAQ,eAAiBgxT,EAAW,gBAAkBhxT,EAAQ,YAAW,EAAG,WAC7FuqC,EAAK,QAAQ,KAAK,aAAa,EAC/BA,EAAK,MAAM,IAAM42Q,GAAO3zP,CAAK,EAC7BjjB,EAAK,QAAUijB,EACfjjB,EAAK,OAASijB,CAChB,EAMIknQ,IAAiB,SAAwBnZ,EAAOhjS,EAAO2hR,EAAQl6R,EAASka,EAAMmhK,EAAS,CACzF,IAAIxyL,EAAOu8T,GAAW7J,EAAO,eAAgBrhS,EAAMla,CAAO,EACtDuqC,EAAO+pR,GAAUzrU,EAAM0vB,EAAOvY,EAASq7K,CAAO,EAEhD,OAAAo5I,GAAWlqR,EAAMvqC,EAASuY,CAAK,EAE1BgyB,CACT,EAIIoqR,IAAa,SAAoBhlU,EAAO9H,EAAMqyB,EAAMla,EAAS,CAC/D,OAAOolT,GAAWz1T,EAAO,OAAS9H,EAAO,WAAYqyB,EAAMla,CAAO,CACpE,EAKI40T,GAAiB,SAAwBrZ,EAAO1zT,EAAMqyS,EAAQl6R,EAASka,EAAMmhK,EAAS,CACxF,IAAIjuJ,EAAQunS,IAAWpZ,EAAO1zT,EAAMqyB,EAAMla,CAAO,EAC7CuqC,EAAO+pR,GAAU9N,GAAS,CAAC,cAAe,OAAS3+T,CAAI,EAAG,CAACulC,CAAK,EAAGptB,CAAO,EAAGm/S,GAAQ,KAAMn/S,EAASq7K,CAAO,EAC/G,OAAI6+G,GACFu6B,GAAWlqR,EAAMvqC,EAASm/S,GAAQ,IAAI,EAEjC50Q,CACT,EAKIsqR,GAAgB,SAAuBx8G,EAAQxlK,EAAM34B,EAAM,CAC7D,IAAI46S,EAEAjiR,IAAS,gBACXiiR,EAAY,cAEVA,EAAY,cAEhB,IAAIC,EAASvO,GAAS,CAAC,mBAAoBsO,CAAS,EAAG,CAACtO,GAAS,CAAA,EAAI,CAACpB,GAAW/sG,EAAQxlK,EAAM34B,CAAI,CAAC,CAAC,CAAC,CAAC,EAGvG,MAAO,CACL,KAAM,OACN,KAAM66S,CACV,CACA,EACIC,GAAY,SAAmBhkS,EAAIkmB,EAAQl3C,EAAS,CAEtD,IAAIq6B,EAAQuoR,GAAgB,eAAe,EAAE5xR,EAAG,WAAW,CAAC,CAAC,EAAI4xR,GAAgB,eAAe,EAAE5xR,EAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAI4xR,GAAgB,eAAe,EAAE5xR,EAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EACzKtxC,EAAO,IAAI2iU,GAAS,QAAS9B,IAAUvvR,EAAI,KAAK,MAAM,IAAOkmB,CAAM,CAAC,CAAC,EACrEoxQ,EAAU,IAAInG,GAAQ,CAACziU,CAAI,EAAG,CAChC,MAASyhU,GAAO9mR,CAAK,EACrB,OAAU8mR,GAAOjqQ,CAAM,EAEvB,MAAS,SAAWiqQ,GAAO9mR,CAAK,EAChC,QAAW,OAAS,IAAOA,EAAQ,IAAM,KAAK,MAAM,IAAO6c,CAAM,EACjE,oBAAuB,UAC3B,CAAG,EACG3M,EAAOk8Q,GAAY,CAAA,EAAI,CAAC6B,CAAO,EAAGtoT,CAAO,EAC7C,OAAAuqC,EAAK,OAAS2M,EACd3M,EAAK,MAAM,OAAS42Q,GAAOjqQ,CAAM,EACjC3M,EAAK,MAAM,MAAQ42Q,GAAO9mR,CAAK,EACxB,CACL,KAAM,OACN,KAAMkQ,CACV,CACA,EAEI0qR,GAAW,KACXC,GAAM,CACR,KAAM,OACN,KAAM,GAAKD,EACb,EACIE,IAAQ,IAAI,IAAI,CAAC,IAAK,UAAW,UAAW,QAAQ,CAAC,EACrDC,IAAc,IAAI,IAAI,CAAC,MAAO,UAAW,UAAW,QAAQ,CAAC,EAK7DC,GAAmB,SAA0B9Z,EAAO+Z,EAAap7B,EAAQl6R,EAASka,EAAMmhK,EAAS,CAGnG,IAAIvlK,EACAw3K,EACAioI,EACAzmR,EACA0mR,EAAW,GACXtH,EAAe,EACnBp4S,EAAMy/S,EAASzmR,EAASysQ,EACxBjuH,EAAS,KAET,IAAIz6I,EAAO,gBAIP0oQ,IAAU,YACZga,EAASzmR,EAAS,IACTysQ,IAAU,YACnBga,EAASzmR,EAAS,IACTysQ,IAAU,cACnBzlS,EAAMy/S,EAAS,IACNha,IAAU,cACnBzlS,EAAMy/S,EAAS,IACNha,IAAU,iBACnBzlS,EAAM,YACNy/S,EAAS,IACTzmR,EAAS,eACAysQ,IAAU,iBACnBzlS,EAAM,YACNy/S,EAAS,IACTzmR,EAAS,eACAqmR,IAAM,IAAI5Z,CAAK,GACxBga,EAAS,IACTC,EAAW,OACXtH,EAAe,KACNkH,IAAY,IAAI7Z,CAAK,GAC9Bga,EAAS,IACTC,EAAW,aACXtH,EAAe,KACN3S,IAAU,KAAOA,IAAU,YACpCzlS,EAAM,IACNy/S,EAAS,IACTzmR,EAAS,IACT+D,EAAO,gBACP2iR,EAAW,SACXtH,EAAe,KACN3S,IAAU,KAAOA,IAAU,YACpCzlS,EAAM,IACNy/S,EAAS,IACTzmR,EAAS,IACT+D,EAAO,gBACP2iR,EAAW,SACXtH,EAAe,KACN3S,IAAU,YAAcA,IAAU,KAC3Cga,EAASz/S,EAAM,IACfg5B,EAAS,IACT+D,EAAO,gBACP2iR,EAAW,SACXtH,EAAe,KACN3S,IAAU,WAAaA,IAAU,KAC1CzlS,EAAM,IACNy/S,EAASzmR,EAAS,IAClB+D,EAAO,gBACP2iR,EAAW,QACXtH,EAAe,KACN3S,IAAU,YAAcA,IAAU,KAC3Cga,EAASz/S,EAAM,IACfg5B,EAAS,IACT+D,EAAO,gBACP2iR,EAAW,SACXtH,EAAe,KACN3S,IAAU,WAAaA,IAAU,KAC1CzlS,EAAM,IACNy/S,EAASzmR,EAAS,IAClB+D,EAAO,gBACP2iR,EAAW,QACXtH,EAAe,KACN3S,IAAU,KAAOA,IAAU,YACpCzlS,EAAM,IACNy/S,EAAS,IACTzmR,EAAS,IACT+D,EAAO,gBACP2iR,EAAW,SACXtH,EAAe,KACN3S,IAAU,KAAOA,IAAU,YACpCzlS,EAAM,IACNy/S,EAAS,IACTzmR,EAAS,IACT+D,EAAO,gBACP2iR,EAAW,SACXtH,EAAe,KACN3S,IAAU,OAASA,IAAU,YACtCzlS,EAAM,IACNw3K,EAAS,IACTx+I,EAAS,IACTymR,EAAS,IACT1iR,EAAO,iBACE0oQ,IAAU,OAASA,IAAU,YACtCzlS,EAAM,IACNw3K,EAAS,IACTx+I,EAAS,IACTymR,EAAS,IACT1iR,EAAO,iBACE0oQ,IAAU,YAAcA,IAAU,KAC3CzlS,EAAM,IACNg5B,EAAS,IACTymR,EAAS,IACT1iR,EAAO,iBACE0oQ,IAAU,YAAcA,IAAU,KAC3CzlS,EAAM,IACNg5B,EAAS,IACTymR,EAAS,IACT1iR,EAAO,iBACE0oQ,IAAU,gBAAkBA,IAAU,KAC/CzlS,EAAM,IACNg5B,EAAS,IACTymR,EAAS,IACT1iR,EAAO,kBACE0oQ,IAAU,gBAAkBA,IAAU,OAC/CzlS,EAAM,IACNg5B,EAAS,IACTymR,EAAS,IACT1iR,EAAO,iBAGT,IAAI4iR,EAAapB,GAAWv+S,EAAK+8B,EAAM34B,CAAI,EACvCw7S,EAAiBD,EAAW,OAASA,EAAW,MAChDE,EAAgBtB,GAAWkB,EAAQ1iR,EAAM34B,CAAI,EAC7C07S,EAAoBD,EAAc,OAASA,EAAc,MACzDE,EAAgBxB,GAAWvlR,EAAQ+D,EAAM34B,CAAI,EAC7C47S,EAAoBD,EAAc,OAASA,EAAc,MACzDE,EAAoB,EACpBC,EAAe,EACnB,GAAI1oI,IAAW,KAAM,CACnB,IAAI2oI,EAAgB5B,GAAW/mI,EAAQz6I,EAAM34B,CAAI,EACjD67S,EAAoBE,EAAc,OAASA,EAAc,MACzDD,EAAe,CACjB,CAGA,IAAI3lF,EAAYqlF,EAAiBI,EAAoBC,EAEjDG,EAAc,KAAK,IAAI,EAAG,KAAK,MAAMZ,EAAcjlF,IAAc2lF,EAAeJ,EAAkB,CAAC,EAEnGO,EAAkB9lF,EAAY6lF,EAAcF,EAAeJ,EAK3DQ,EAAap2T,EAAQ,YAAW,EAAG,WACnCk6R,IACFk8B,GAAcp2T,EAAQ,gBAGxB,IAAItX,EAAQytU,EAAkB,EAAIC,EAG9BzuQ,EAAQ,CAAA,EACZ,GAAI6tQ,EAAS,OAAS,EAAG,CAGvB,IAAI/U,EAAY0V,EAAkBT,EAAiBI,EAC/C1V,EAAgB,KAAK,MAAM+V,EAAkB,GAAI,EACjDE,EAAU7V,IAAUgV,EAAU,KAAK,MAAM/U,EAAY,GAAI,CAAC,EAC1D/gU,EAAO,IAAI2iU,GAASmT,EAAUa,CAAO,EACrCh8R,EAAQ8mR,GAAO+M,EAAe,GAAI,EAClCh3Q,EAASiqQ,GAAOf,EAAgB,GAAI,EACpClrS,EAAM,IAAIitS,GAAQ,CAACziU,CAAI,EAAG,CAC5B,MAAS26C,EACT,OAAU6c,EACV,QAAW,OAASg3Q,EAAe,IAAM9N,CAC/C,CAAK,EACGpvC,EAAUy1C,GAAY,CAAA,EAAI,CAACvxS,CAAG,EAAGlV,CAAO,EAC5CgxQ,EAAQ,OAASovC,EAAgB,IACjCpvC,EAAQ,MAAM,MAAQ32O,EACtB22O,EAAQ,MAAM,OAAS95N,EACvByQ,EAAM,KAAK,CACT,KAAM,OACN,KAAMqpN,CACZ,CAAK,CACH,KAAO,CAKL,GAFArpN,EAAM,KAAKktQ,GAAc/lR,EAAQ+D,EAAM34B,CAAI,CAAC,EAC5CytC,EAAM,KAAKutQ,EAAG,EACV5nI,IAAW,KAAM,CAGnB,IAAIghD,EAAc6nF,EAAkBT,EAAiBI,EAAoB,EAAIb,GAC7EttQ,EAAM,KAAKqtQ,GAAUO,EAAQjnF,EAAatuO,CAAO,CAAC,CACpD,KAAO,CAGL,IAAIs2T,IAAgBH,EAAkBT,EAAiBI,EAAoBC,GAAqB,EAAI,EAAId,GACxGttQ,EAAM,KAAKqtQ,GAAUO,EAAQe,GAAct2T,CAAO,CAAC,EAEnD2nD,EAAM,KAAKutQ,EAAG,EACdvtQ,EAAM,KAAKktQ,GAAcvnI,EAAQz6I,EAAM34B,CAAI,CAAC,EAC5CytC,EAAM,KAAKutQ,EAAG,EACdvtQ,EAAM,KAAKqtQ,GAAUO,EAAQe,GAAct2T,CAAO,CAAC,CACrD,CAEA2nD,EAAM,KAAKutQ,EAAG,EACdvtQ,EAAM,KAAKktQ,GAAc/+S,EAAK+8B,EAAM34B,CAAI,CAAC,CAC3C,CAEA,IAAI82S,EAAahxT,EAAQ,gBAAgBm/S,GAAQ,IAAI,EACjD/xR,GAAQ65R,GAAU,CACpB,aAAc,SACd,aAAcv+T,EACd,SAAUi/D,CACd,CAAG,EACD,OAAO2sQ,GAAU9N,GAAS,CAAC,cAAe,MAAM,EAAG,CAACp5R,EAAK,EAAG4jS,CAAU,EAAG7R,GAAQ,KAAMn/S,EAASq7K,CAAO,CACzG,EAGIk7I,GAAQ,GACRC,GAAQ,IACRC,GAAU,SAAiBC,EAAUx/Q,EAAQkpQ,EAAeP,EAAe7/S,EAAS,CACtF,IAAItgB,EAAO4gU,IAASoW,EAAU7W,EAAeO,CAAa,EACtDuW,EAAW,IAAItU,GAASqU,EAAUh3U,CAAI,EACtCw1B,EAAM,IAAIitS,GAAQ,CAACwU,CAAQ,EAAG,CAEhC,MAAS,QACT,OAAUxV,GAAOjqQ,CAAM,EACvB,QAAW,cAAgBkpQ,EAC3B,oBAAuB,gBAC3B,CAAG,EACD,OAAOqG,GAAY,CAAC,WAAW,EAAG,CAACvxS,CAAG,EAAGlV,CAAO,CAClD,EAII42T,IAAgB,SAAuB1/Q,EAAQl3C,EAAS,CAG1D,IAAIgxT,EAAahxT,EAAQ,iBAAgB,EAErCu7S,EAAQsb,GAAiB,SAAU3/Q,EAAS85Q,EAAW,eAAgB8F,GAA6B9F,CAAU,EAC9G+F,EAAiB/F,EAAW,eAG5BnR,EAAgB,KAAK,IAAI,EAAG7/S,EAAQ,iBAAmBA,EAAQ,YAAW,EAAG,iBAAiB,EAE9FuqC,EACAysR,EAAa,EACbC,EAAY,EACZ7W,EAAgB,EAChB8W,EAMJ,OAAI3b,EAAM,OAAS,SAGjB6E,EAAgB,IAAO,IAAOP,EAAgB0W,GAC1Cr/Q,EAAS,EACX6/Q,EAAiB,EACR7/Q,EAAS,MAClB6/Q,EAAiB,IAEnBC,GAAc,EAAMnX,EAAgB2W,IAASO,EAC7CE,GAAa,EAAOpX,GAAiBkX,EACrCxsR,EAAOksR,GAAQ,WAAYO,EAAY5W,EAAeP,EAAe7/S,CAAO,EAC5EuqC,EAAK,MAAM,SAAW,UACtB2sR,EAAe,KAAQH,GACdxb,EAAM,OAAS,SAExB6E,GAAiB,IAAOmW,IAASY,GAAgB5b,EAAM,IAAI,EAC3D0b,GAAaE,GAAgB5b,EAAM,IAAI,EAAIsE,GAAiBkX,EAC5DC,GAAcG,GAAgB5b,EAAM,IAAI,EAAIsE,EAAgB2W,IAASO,EACrExsR,EAAOksR,GAAQ,WAAalb,EAAM,KAAMyb,EAAY5W,EAAeP,EAAe7/S,CAAO,EACzFuqC,EAAK,MAAM,SAAW,SACtB2sR,EAAe,EAAMH,IAIrBC,EAAa9/Q,EAAS2oQ,EAAgB2W,GACtCS,EAAY//Q,EAAS2oQ,EACrBO,EAAgB,KAAK,MAAM,IAAOlpQ,EAAS2oQ,CAAa,EAAI0W,GAC5DhsR,EAAOksR,GAAQ,WAAYO,EAAY5W,EAAeP,EAAe7/S,CAAO,EAC5EuqC,EAAK,MAAM,SAAW,UACtB2sR,EAAe,OAEjB3sR,EAAK,OAAS0sR,EACd1sR,EAAK,MAAM,OAAS42Q,GAAO6V,CAAU,EAC9B,CACL,KAAAzsR,EACA,aAAA2sR,EAKA,WAAYl3T,EAAQ,YAAW,EAAG,kBAAoB6/S,GAAiBkX,CAC3E,CACA,EAGIK,GAAuB,IAAI,IAAI,CAAC,IAAK,WAAY,IAAK,WAAY,IAAK,WAAY,IAAK,WAAY,MAAO,WAAY,MAAO,WAAY,WAAY,WAAY,IAAU,IAAU,UAAW,UAAW,IAAU,IAAU,QAAQ,CAAC,EAEzOC,IAAwB,IAAI,IAAI,CAAC,YAAa,cAAe,gBAAiB,YAAa,cAAe,gBAAiB,IAAK,MAAO,SAAU,SAAU,UAAW,UAAW,UAAW,UAAW,WAAY,WAAY,IAAU,IAAU,eAAgB,eAAgB,IAAU,GAAQ,CAAC,EAEtSC,GAAuB,IAAI,IAAI,CAAC,IAAK,IAAK,WAAY,WAAY,IAAK,cAAe,OAAQ,MAAM,CAAC,EAIrGH,GAAkB,CAAC,EAAG,IAAK,IAAK,IAAK,CAAG,EAIxCI,GAAiB,SAAwBhc,EAAO1zT,EAAMmY,EAASka,EAAMmhK,EAAS,CAQhF,GANIkgI,IAAU,KAAOA,IAAU,QAAUA,IAAU,IACjDA,EAAQ,YACCA,IAAU,KAAOA,IAAU,QAAUA,IAAU,OACxDA,EAAQ,YAGN6b,GAAqB,IAAI7b,CAAK,GAAK+b,GAAqB,IAAI/b,CAAK,EACnE,OAAOqZ,GAAerZ,EAAO1zT,EAAM,GAAOmY,EAASka,EAAMmhK,CAAO,EAC3D,GAAIg8I,IAAsB,IAAI9b,CAAK,EACxC,OAAO8Z,GAAiB9Z,EAAO4b,GAAgBtvU,CAAI,EAAG,GAAOmY,EAASka,EAAMmhK,CAAO,EAEnF,MAAM,IAAI4hI,GAAW,uBAAyB1B,EAAQ,GAAG,CAE7D,EAEIic,IAA8B,CAAC,CACjC,KAAM,QACN,MAAOrY,GAAQ,YACjB,EAAG,CACD,KAAM,QACN,MAAOA,GAAQ,MACjB,EAAG,CACD,KAAM,QACN,MAAOA,GAAQ,IACjB,EAAG,CACD,KAAM,QACN,KAAM,CACR,EAAG,CACD,KAAM,QACN,KAAM,CACR,EAAG,CACD,KAAM,QACN,KAAM,CACR,EAAG,CACD,KAAM,QACN,KAAM,CACR,CAAC,EAEGsY,IAA+B,CAAC,CAClC,KAAM,QACN,MAAOtY,GAAQ,YACjB,EAAG,CACD,KAAM,QACN,MAAOA,GAAQ,MACjB,EAAG,CACD,KAAM,QACN,MAAOA,GAAQ,IACjB,EAAG,CACD,KAAM,OACR,CAAC,EAGG2X,GAA8B,CAAC,CACjC,KAAM,QACN,MAAO3X,GAAQ,YACjB,EAAG,CACD,KAAM,QACN,MAAOA,GAAQ,MACjB,EAAG,CACD,KAAM,QACN,MAAOA,GAAQ,IACjB,EAAG,CACD,KAAM,QACN,KAAM,CACR,EAAG,CACD,KAAM,QACN,KAAM,CACR,EAAG,CACD,KAAM,QACN,KAAM,CACR,EAAG,CACD,KAAM,QACN,KAAM,CACR,EAAG,CACD,KAAM,OACR,CAAC,EAKGuY,IAAkB,SAAyB3qU,EAAM,CACnD,GAAIA,EAAK,OAAS,QAChB,MAAO,eACF,GAAIA,EAAK,OAAS,QACvB,MAAO,OAASA,EAAK,KAAO,WACvB,GAAIA,EAAK,OAAS,QACvB,MAAO,gBAEP,IAAI4qU,EAAY5qU,EAAK,KACrB,MAAM,IAAI,MAAM,+BAAiC4qU,EAAY,SAAS,CAE1E,EAKId,GAAmB,SAA0Btb,EAAOrkQ,EAAQ0gR,EAAU53T,EAAS,CAMjF,QADIsE,EAAQ,KAAK,IAAI,EAAG,EAAItE,EAAQ,MAAM,IAAI,EACrCrX,EAAI2b,EAAO3b,EAAIivU,EAAS,OAAQjvU,IAAK,CAC5C,IAAIkvU,EAAYD,EAASjvU,CAAC,EAC1B,GAAIkvU,EAAU,OAAS,QAErB,MAEF,IAAI58R,EAAUo5R,GAAW9Y,EAAOmc,IAAgBG,CAAS,EAAG,MAAM,EAC9DC,EAAc78R,EAAQ,OAASA,EAAQ,MAG3C,GAAI48R,EAAU,OAAS,QAAS,CAC9B,IAAI7G,EAAahxT,EAAQ,gBAAgB63T,EAAU,KAAK,EACxDC,GAAe9G,EAAW,cAC5B,CAEA,GAAI8G,EAAc5gR,EAChB,OAAO2gR,CAEX,CAEA,OAAOD,EAASA,EAAS,OAAS,CAAC,CACrC,EAKIG,GAAuB,SAA8Bxc,EAAOrkQ,EAAQgjP,EAAQl6R,EAASka,EAAMmhK,EAAS,CAClGkgI,IAAU,KAAOA,IAAU,QAAUA,IAAU,IACjDA,EAAQ,YACCA,IAAU,KAAOA,IAAU,QAAUA,IAAU,OACxDA,EAAQ,YAGV,IAAIqc,EACAN,GAAqB,IAAI/b,CAAK,EAChCqc,EAAWJ,IACFJ,GAAqB,IAAI7b,CAAK,EACvCqc,EAAWd,GAEXc,EAAWH,IAGb,IAAII,EAAYhB,GAAiBtb,EAAOrkQ,EAAQ0gR,EAAU53T,CAAO,EAIjE,OAAI63T,EAAU,OAAS,QACdnD,IAAenZ,EAAOsc,EAAU,MAAO39B,EAAQl6R,EAASka,EAAMmhK,CAAO,EACnEw8I,EAAU,OAAS,QACrBjD,GAAerZ,EAAOsc,EAAU,KAAM39B,EAAQl6R,EAASka,EAAMmhK,CAAO,EAElEg6I,GAAiB9Z,EAAOrkQ,EAAQgjP,EAAQl6R,EAASka,EAAMmhK,CAAO,CAE3E,EAKI28I,GAAqB,SAA4Bzc,EAAOrkQ,EAAQxuD,EAAOsX,EAASka,EAAMmhK,EAAS,CAEjG,IAAI+6I,EAAap2T,EAAQ,YAAW,EAAG,WAAaA,EAAQ,eAExDi4T,EAAkB,IAClBC,EAAkB,EAAMl4T,EAAQ,YAAW,EAAG,QAC9Cm4T,EAAkB,KAAK,IAAIjhR,EAASk/Q,EAAY1tU,EAAQ0tU,CAAU,EAClE/G,EAAc,KAAK,IAUvB8I,EAAkB,IAAMF,EAAiB,EAAIE,EAAkBD,CAAe,EAG9E,OAAOH,GAAqBxc,EAAO8T,EAAa,GAAMrvT,EAASka,EAAMmhK,CAAO,CAC9E,EAGI+8I,GAAiB,CACnB,SAAU,CACR,OAAQ,QACR,KAAM,CACV,EACE,SAAU,CACR,OAAQ,QACR,KAAM,CACV,EACE,UAAW,CACT,OAAQ,QACR,KAAM,CACV,EACE,UAAW,CACT,OAAQ,QACR,KAAM,CACV,EACE,SAAU,CACR,OAAQ,SACR,KAAM,CACV,EACE,SAAU,CACR,OAAQ,SACR,KAAM,CACV,EACE,UAAW,CACT,OAAQ,SACR,KAAM,CACV,EACE,UAAW,CACT,OAAQ,SACR,KAAM,CACV,EACE,SAAU,CACR,OAAQ,OACR,KAAM,CACV,EACE,SAAU,CACR,OAAQ,OACR,KAAM,CACV,EACE,UAAW,CACT,OAAQ,OACR,KAAM,CACV,EACE,UAAW,CACT,OAAQ,OACR,KAAM,CACV,EACE,QAAS,CACP,OAAQ,OACR,KAAM,CACV,EACE,QAAS,CACP,OAAQ,OACR,KAAM,CACV,EACE,SAAU,CACR,OAAQ,OACR,KAAM,CACV,EACE,SAAU,CACR,OAAQ,OACR,KAAM,CACV,CACA,EACIjE,IAAa,IAAI,IAAI,CAAC,IAAK,WAAY,IAAK,WAAY,IAAK,WAAY,IAAK,WAAY,MAAO,WAAY,MAAO,WAAY,WAAY,WAAY,IAAU,IAAU,UAAW,UAAW,IAAU,IAAU,IAAK,IAAK,WAAY,IAAU,WAAY,IAAU,OAAQ,OAAQ,UAAW,UAAW,UAAW,UAAW,WAAY,WAAY,IAAU,IAAU,eAAgB,eAAgB,IAAU,IAAU,IAAK,cAAe,IAAK,SAAU,MAAO,SAAU,YAAa,YAAa,cAAe,cAAe,gBAAiB,gBAAiB,GAAG,CAAC,EAE9jB,SAASkE,GAAe9c,EAAO12L,EAAS,CACtC,IAAIyzM,EAAW7I,GAAoBlU,CAAK,EACxC,GAAI+c,GAAYnE,IAAW,IAAImE,EAAS,IAAI,EAC1C,OAAOA,EACF,MAAIA,EACH,IAAIrb,GAAW,sBAAwBqb,EAAS,KAAO,YAAczzM,EAAQ,SAAW,IAAK02L,CAAK,EAElG,IAAI0B,GAAW,2BAA6B1B,EAAM,KAAO,IAAKA,CAAK,CAE7E,CACAwN,GAAe,CACb,KAAM,cACN,MAAO,CAAC,SAAU,SAAU,UAAW,UAAW,SAAU,SAAU,UAAW,UAAW,SAAU,SAAU,UAAW,UAAW,QAAS,QAAS,SAAU,QAAQ,EAC1K,MAAO,CACL,QAAS,EACT,SAAU,CAAC,WAAW,CAC1B,EACE,QAAS,CAAClkM,EAASvzC,IAAS,CAC1B,IAAIiqO,EAAQ8c,GAAe/mP,EAAK,CAAC,EAAGuzC,CAAO,EAC3C,MAAO,CACL,KAAM,cACN,KAAMA,EAAQ,OAAO,KACrB,KAAMuzM,GAAevzM,EAAQ,QAAQ,EAAE,KACvC,OAAQuzM,GAAevzM,EAAQ,QAAQ,EAAE,OACzC,MAAO02L,EAAM,IACnB,CACE,EACA,YAAa,CAACr6R,EAAOlhB,IACfkhB,EAAM,QAAU,IAGXslS,GAAS,CAACtlS,EAAM,MAAM,CAAC,EAEzBq2S,GAAer2S,EAAM,MAAOA,EAAM,KAAMlhB,EAASkhB,EAAM,KAAM,CAACA,EAAM,MAAM,CAAC,EAEpF,cAAeA,GAAS,CACtB,IAAIytN,EAAW,CAAA,EACXztN,EAAM,QAAU,KAClBytN,EAAS,KAAKk9E,GAAS3qS,EAAM,MAAOA,EAAM,IAAI,CAAC,EAEjD,IAAInsB,EAAO,IAAIy2T,GAAS,KAAM78E,CAAQ,EAClCztN,EAAM,SAAW,SAAWA,EAAM,SAAW,SAG/CnsB,EAAK,aAAa,QAAS,MAAM,EAIjCA,EAAK,aAAa,QAAS,OAAO,EAEpCA,EAAK,aAAa,WAAY,MAAM,EACpC,IAAIlN,EAAOs5T,GAAOgW,GAAgBj2S,EAAM,IAAI,CAAC,EAC7C,OAAAnsB,EAAK,aAAa,UAAWlN,CAAI,EACjCkN,EAAK,aAAa,UAAWlN,CAAI,EAC1BkN,CACT,CACF,CAAC,EACD,SAASwjU,GAAar3S,EAAO,CAC3B,GAAI,CAACA,EAAM,KACT,MAAM,IAAI,MAAM,mDAAmD,CAEvE,CACA6nS,GAAe,CACb,KAAM,kBACN,MAAO,CAAC,SAAS,EACjB,MAAO,CACL,QAAS,EACT,UAAW,EACf,EACE,QAAS,CAAClkM,EAASvzC,IAAS,CAI1B,IAAIzf,EAAQgzD,EAAQ,OAAO,OAAO,OAAO,IAAI,iBAAiB,EAC9D,GAAIhzD,GAAS,OAAOA,GAAU,SAC5B,MAAM,IAAIorP,GAAW,8CAA8C,EAErE,MAAO,CACL,KAAM,kBACN,KAAMp4L,EAAQ,OAAO,KACrB,MAAOwzM,GAAe/mP,EAAK,CAAC,EAAGuzC,CAAO,EAAE,KACxC,MAAOhzD,CACb,CACE,CACF,CAAC,EACDk3P,GAAe,CACb,KAAM,YACN,MAAO,CAAC,QAAQ,EAChB,MAAO,CACL,QAAS,EACT,UAAW,EACf,EACE,QAAS,CAAClkM,EAASvzC,IAAS,CAC1B,IAAIiqO,EAAQ8c,GAAe/mP,EAAK,CAAC,EAAGuzC,CAAO,EACvC6rM,EAAS7rM,EAAQ,OAErB,EAAE6rM,EAAO,eAET,IAAI5tU,EAAO4tU,EAAO,gBAAgB,EAAK,EACvC,EAAEA,EAAO,eAETA,EAAO,OAAO,UAAW,EAAK,EAC9B,IAAI7hR,EAAQygR,GAAeoB,EAAO,cAAa,EAAI,iBAAiB,EACpE,MAAO,CACL,KAAM,YACN,KAAMA,EAAO,KACb,KAAA5tU,EACA,KAAMy4T,EAAM,KACZ,MAAO1sQ,EAAM,MACb,WAAYA,EAAM,KACxB,CACE,EACA,YAAa,CAAC3tB,EAAOlhB,IAAY,CAC/Bu4T,GAAar3S,CAAK,EAOlB,QALIkM,EAAQu8R,GAAkBzoS,EAAM,KAAMlhB,EAAS,GAAM,CAAC,QAAS,QAAQ,CAAC,EACxEsuO,EAAc,EACdkqF,EAAa,EACbC,EAAY,GAEP9vU,EAAI,EAAGA,EAAIykC,EAAM,OAAQzkC,IAI5BykC,EAAMzkC,CAAC,EAAE,SACX8vU,EAAY,IAEZnqF,EAAc,KAAK,IAAIlhN,EAAMzkC,CAAC,EAAE,OAAQ2lP,CAAW,EACnDkqF,EAAa,KAAK,IAAIprS,EAAMzkC,CAAC,EAAE,MAAO6vU,CAAU,GAMpDlqF,GAAetuO,EAAQ,eACvBw4T,GAAcx4T,EAAQ,eACtB,IAAI04T,EAYJ,GAXIx3S,EAAM,OAAS,IAEjBw3S,EAAY/N,GAAkB3qT,EAAS,CAAC,OAAO,CAAC,EAIhD04T,EAAYV,GAAmB92S,EAAM,KAAMotN,EAAakqF,EAAYx4T,EAASkhB,EAAM,KAAM,CAAC,OAAO,CAAC,EAGpGkM,EAAM,QAAQsrS,CAAS,EAEnBD,EACF,QAASjpT,EAAK,EAAGA,EAAK4d,EAAM,OAAQ5d,IAAM,CACxC,IAAImpT,EAAcvrS,EAAM5d,CAAE,EAItBopT,EAAWD,EAAY,SACvBC,IAEFxrS,EAAM5d,CAAE,EAAIwoT,GAAmBY,EAAS,MAAOtqF,EAAakqF,EAAYI,EAAS,QAAS13S,EAAM,KAAM,CAAA,CAAE,EAE5G,CAEF,IAAI23S,EAEJ,GAAI33S,EAAM,QAAU,IAClB23S,EAAalO,GAAkB3qT,EAAS,CAAC,QAAQ,CAAC,MAC7C,CACL,IAAI84T,EAAe53S,EAAM,WAAalhB,EAAQ,UAAUkhB,EAAM,UAAU,EAAIlhB,EAC5E64T,EAAab,GAAmB92S,EAAM,MAAOotN,EAAakqF,EAAYM,EAAc53S,EAAM,KAAM,CAAC,QAAQ,CAAC,CAC5G,CAEA,OAAAkM,EAAM,KAAKyrS,CAAU,EACdrS,GAAS,CAAC,QAAQ,EAAGp5R,EAAOptB,CAAO,CAC5C,EACA,cAAe,CAACkhB,EAAOlhB,IAAY,CACjCu4T,GAAar3S,CAAK,EAClB,IAAIkM,EAAQ6+R,GAAgB/qS,EAAM,KAAMlhB,CAAO,EAC/C,GAAIkhB,EAAM,OAAS,IAAK,CACtB,IAAI63S,EAAW,IAAIvN,GAAS,KAAM,CAACK,GAAS3qS,EAAM,KAAMA,EAAM,IAAI,CAAC,CAAC,EACpE63S,EAAS,aAAa,QAAS,MAAM,EACrC3rS,EAAM,QAAQ2rS,CAAQ,CACxB,CACA,GAAI73S,EAAM,QAAU,IAAK,CACvB,IAAI83S,EAAY,IAAIxN,GAAS,KAAM,CAACK,GAAS3qS,EAAM,MAAOA,EAAM,IAAI,CAAC,CAAC,EACtE83S,EAAU,aAAa,QAAS,MAAM,EAClC93S,EAAM,YACR83S,EAAU,aAAa,YAAa93S,EAAM,UAAU,EAEtDkM,EAAM,KAAK4rS,CAAS,CACtB,CACA,OAAOlN,GAAQ1+R,CAAK,CACtB,CACF,CAAC,EACD27R,GAAe,CACb,KAAM,SACN,MAAO,CAAC,UAAU,EAClB,MAAO,CACL,QAAS,EACT,UAAW,EACf,EACE,QAAS,CAAClkM,EAASvzC,IAAS,CAC1B,IAAIiqO,EAAQ8c,GAAe/mP,EAAK,CAAC,EAAGuzC,CAAO,EAC3C,GAAI,CAACA,EAAQ,OAAO,eAClB,MAAM,IAAIo4L,GAAW,oCAAqC1B,CAAK,EAEjE,MAAO,CACL,KAAM,SACN,KAAM12L,EAAQ,OAAO,KACrB,MAAO02L,EAAM,IACnB,CACE,EACA,YAAa,CAACr6R,EAAOlhB,IAAY,CAC/B,IAAI24T,EACJ,GAAIz3S,EAAM,QAAU,IAClBy3S,EAAchO,GAAkB3qT,EAAS,EAAE,MACtC,CACL24T,EAAcpB,GAAer2S,EAAM,MAAO,EAAGlhB,EAASkhB,EAAM,KAAM,EAAE,EACpE,IAAI03S,EAAW,CACb,MAAO13S,EAAM,MACb,QAAAlhB,CACR,EAMM24T,EAAY,SAAWC,CACzB,CACA,OAAOD,CACT,EACA,cAAe,CAACz3S,EAAOlhB,IAAY,CAKjC,IAAIi5T,EAAW/3S,EAAM,QAAU,UAAYA,EAAM,QAAU,IAAM2qS,GAAS,IAAK,MAAM,EAAIA,GAAS3qS,EAAM,MAAOA,EAAM,IAAI,EACrHg4S,EAAa,IAAI1N,GAAS,KAAM,CAACyN,CAAQ,CAAC,EAC9C,OAAAC,EAAW,aAAa,QAAS,MAAM,EAGvCA,EAAW,aAAa,SAAU,QAAQ,EAC1CA,EAAW,aAAa,SAAU,QAAQ,EACnCA,CACT,CACF,CAAC,EAED,IAAIC,GAAgB,CAACj4S,EAAOlhB,IAAY,CAItC,IAAIotB,EAAQw5R,GAAamD,GAAa7oS,EAAM,KAAMlhB,CAAO,EAAGA,CAAO,EAC/DnO,EAAQqvB,EAAM,MAAM,MAAM,CAAC,EAC3BqyC,EAAQvzD,EAAQ,eAChB6sD,EACAusQ,EAAW,EAMXC,EAAe5b,GAAev8R,EAAM,IAAI,EAC5C,GAAIrvB,IAAU,OACZg7D,EAAM25P,GAAS,CAAC,WAAY,MAAM,CAAC,EACnC35P,EAAI,OAAS7sD,EAAQ,YAAW,EAAG,qBAAuBuzD,EAC1D6lQ,EAAW,IAAOp5T,EAAQ,YAAW,EAAG,gBAC/BnO,IAAU,QAAS,CAE5B,IAAIynU,EAAatY,GAAc,CAC7B,OAAQ,GACR,KAAM,IACZ,EAAOhhT,CAAO,EACNiwT,EAAYjP,GAAc,CAC5B,OAAQ,IACR,KAAM,IACZ,EAAOhhT,CAAO,EAENgxT,EAAahxT,EAAQ,iBAAgB,EACzCuzD,EAAQA,EAAQy9P,EAAW,eAC3B,IAAIuI,EAAcnsS,EAAM,OAASA,EAAM,MAAQksS,EAAarJ,EAE5D7iS,EAAM,MAAM,YAAc+zR,GAAOoY,EAAc,EAAID,CAAU,EAE7D,IAAIlZ,EAAgB,KAAK,MAAM,IAAOmZ,EAAchmQ,CAAK,EACrD7zE,EAAOwgU,IAAUE,CAAa,EAC9BkI,EAAU,IAAInG,GAAQ,CAAC,IAAIE,GAAS,QAAS3iU,CAAI,CAAC,EAAG,CACvD,MAAS,QACT,OAAUyhU,GAAOf,EAAgB,GAAI,EACrC,QAAW,cAAgBA,EAC3B,oBAAuB,gBAC7B,CAAK,EAEDvzP,EAAM45P,GAAY,CAAC,WAAW,EAAG,CAAC6B,CAAO,EAAGtoT,CAAO,EACnD6sD,EAAI,MAAM,OAASs0P,GAAOoY,CAAW,EACrCH,EAAWhsS,EAAM,MAAQksS,EAAarJ,CACxC,KAAO,CAED,SAAS,KAAKp+T,CAAK,EAChBwnU,GACHjsS,EAAM,QAAQ,KAAK,YAAY,EAExBv7B,IAAU,OACnBu7B,EAAM,QAAQ,KAAK,SAAS,EAE5BA,EAAM,QAAQ,KAAK,QAAQ,EAG7B,IAAI+hS,EAAS,EACTC,EAAY,EACZoK,EAAgB,EAEhB,MAAM,KAAK3nU,CAAK,GAClB2nU,EAAgB,KAAK,IAAIx5T,EAAQ,YAAW,EAAG,SAE/CA,EAAQ,gBAAgB,EACxBmvT,EAASnvT,EAAQ,cAAc,SAAWnO,IAAU,WAAa,EAAI2nU,GACrEpK,EAAYD,GACHt9T,IAAU,QACnB2nU,EAAgB,KAAK,IAAIx5T,EAAQ,YAAW,EAAG,qBAAsBA,EAAQ,gBAAgB,EAC7FmvT,EAAS,EAAIqK,EACbpK,EAAY,KAAK,IAAI,EAAG,IAAOhiS,EAAM,KAAK,IAE1C+hS,EAASkK,EAAe,GAAM,EAC9BjK,EAAYD,GAEdtiQ,EAAMqiQ,IAAgB9hS,EAAOv7B,EAAOs9T,EAAQC,EAAWpvT,CAAO,EAC1D,uBAAuB,KAAKnO,CAAK,GACnCg7D,EAAI,MAAM,YAAc,QACxBA,EAAI,MAAM,YAAcs0P,GAAOqY,CAAa,GACnC3nU,IAAU,QAAU2nU,IAAkB,OAC/C3sQ,EAAI,MAAM,eAAiBs0P,GAAOqY,CAAa,EAC/C3sQ,EAAI,MAAM,iBAAmBs0P,GAAOqY,CAAa,GAEnDJ,EAAWhsS,EAAM,MAAQgiS,EACrBluS,EAAM,kBACR2rC,EAAI,MAAM,gBAAkB3rC,EAAM,gBAC9BA,EAAM,cACR2rC,EAAI,MAAM,YAAc3rC,EAAM,aAGpC,CACA,IAAIwmS,EACJ,GAAIxmS,EAAM,gBACRwmS,EAAQT,GAAU,CAChB,aAAc,kBACd,SAAU,CAEV,CACE,KAAM,OACN,KAAMp6P,EACN,MAAOusQ,CACf,EAAS,CACD,KAAM,OACN,KAAMhsS,EACN,MAAO,CACf,CAAO,CACP,CAAK,MACI,CACL,IAAIiuJ,EAAU,eAAe,KAAKxpL,CAAK,EAAI,CAAC,WAAW,EAAI,CAAA,EAC3D61T,EAAQT,GAAU,CAChB,aAAc,kBACd,SAAU,CAEV,CACE,KAAM,OACN,KAAM75R,EACN,MAAO,CACf,EAAS,CACD,KAAM,OACN,KAAMy/B,EACN,MAAOusQ,EACP,eAAgB/9I,CACxB,CAAO,CACP,CAAK,CACH,CAOA,MANI,SAAS,KAAKxpL,CAAK,IAGrB61T,EAAM,OAASt6R,EAAM,OACrBs6R,EAAM,MAAQt6R,EAAM,OAElB,SAAS,KAAKv7B,CAAK,GAAK,CAACwnU,EAEpB7S,GAAS,CAAC,OAAQ,YAAY,EAAG,CAACkB,CAAK,EAAG1nT,CAAO,EAEjDwmT,GAAS,CAAC,MAAM,EAAG,CAACkB,CAAK,EAAG1nT,CAAO,CAE9C,EACIy5T,GAAkB,CAACv4S,EAAOlhB,IAAY,CACxC,IAAI05T,EAAU,EACV3kU,EAAO,IAAIy2T,GAAStqS,EAAM,MAAM,SAAS,UAAU,EAAI,UAAY,WAAY,CAACirS,GAAWjrS,EAAM,KAAMlhB,CAAO,CAAC,CAAC,EACpH,OAAQkhB,EAAM,MAAK,CACjB,IAAK,WACHnsB,EAAK,aAAa,WAAY,kBAAkB,EAChD,MACF,IAAK,YACHA,EAAK,aAAa,WAAY,oBAAoB,EAClD,MACF,IAAK,UACHA,EAAK,aAAa,WAAY,aAAa,EAC3C,MACF,IAAK,SACHA,EAAK,aAAa,WAAY,kBAAkB,EAChD,MACF,IAAK,SACHA,EAAK,aAAa,WAAY,KAAK,EACnC,MACF,IAAK,SACHA,EAAK,aAAa,WAAY,WAAW,EACzC,MACF,IAAK,cACL,IAAK,aAQH,GALA2kU,EAAU15T,EAAQ,YAAW,EAAG,QAAUA,EAAQ,YAAW,EAAG,QAChEjL,EAAK,aAAa,QAAS,IAAM,EAAI2kU,EAAU,IAAI,EACnD3kU,EAAK,aAAa,SAAU,IAAM,EAAI2kU,EAAU,IAAI,EACpD3kU,EAAK,aAAa,SAAU2kU,EAAU,IAAI,EAC1C3kU,EAAK,aAAa,UAAW2kU,EAAU,IAAI,EACvCx4S,EAAM,QAAU,cAAe,CACjC,IAAIy4S,EAAM,KAAK,IAAI35T,EAAQ,YAAW,EAAG,SAEzCA,EAAQ,gBAAgB,EACxBjL,EAAK,aAAa,QAAS,WAAaosT,GAAOwY,CAAG,EAAI,UAAYz4S,EAAM,WAAW,CACrF,CACA,MACF,IAAK,YACHnsB,EAAK,aAAa,WAAY,qCAAqC,EACnE,KACN,CACE,OAAImsB,EAAM,iBACRnsB,EAAK,aAAa,iBAAkBmsB,EAAM,eAAe,EAEpDnsB,CACT,EACAg0T,GAAe,CACb,KAAM,UACN,MAAO,CAAC,YAAY,EACpB,MAAO,CACL,QAAS,EACT,cAAe,GACf,SAAU,CAAC,QAAS,MAAM,CAC9B,EACE,QAAQC,EAAM13O,EAAMy/O,EAAS,CAC3B,GAAI,CACF,OAAAL,EACA,SAAAC,CACN,EAAQ3H,EACAn3P,EAAQy9P,GAAeh+O,EAAK,CAAC,EAAG,aAAa,EAAE,MAC/CxuF,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,UACN,KAAMo/O,EAAO,KACb,MAAOC,EACP,gBAAiB9+P,EACjB,KAAA/uE,CACN,CACE,EACA,YAAaq2U,GACb,cAAeM,EACjB,CAAC,EACD1Q,GAAe,CACb,KAAM,UACN,MAAO,CAAC,aAAa,EACrB,MAAO,CACL,QAAS,EACT,cAAe,GACf,SAAU,CAAC,QAAS,QAAS,MAAM,CACvC,EACE,QAAQK,EAAO93O,EAAMy/O,EAAS,CAC5B,GAAI,CACF,OAAAL,EACA,SAAAC,CACN,EAAQvH,EACA7wC,EAAc+2C,GAAeh+O,EAAK,CAAC,EAAG,aAAa,EAAE,MACrD00K,EAAkBspE,GAAeh+O,EAAK,CAAC,EAAG,aAAa,EAAE,MACzDxuF,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,UACN,KAAMo/O,EAAO,KACb,MAAOC,EACP,gBAAA3qE,EACA,YAAAuyB,EACA,KAAAz1R,CACN,CACE,EACA,YAAaq2U,GACb,cAAeM,EACjB,CAAC,EACD1Q,GAAe,CACb,KAAM,UACN,MAAO,CAAC,QAAQ,EAChB,MAAO,CACL,QAAS,EACT,SAAU,CAAC,MAAM,EACjB,cAAe,EACnB,EACE,QAAQiJ,EAAO1gP,EAAM,CACnB,GAAI,CACF,OAAAo/O,CACN,EAAQsB,EACJ,MAAO,CACL,KAAM,UACN,KAAMtB,EAAO,KACb,MAAO,SACP,KAAMp/O,EAAK,CAAC,CAClB,CACE,CACF,CAAC,EACDy3O,GAAe,CACb,KAAM,UACN,MAAO,CAAC,WAAY,YAAa,YAAa,SAAS,EACvD,MAAO,CACL,QAAS,CACb,EACE,QAAQqL,EAAO9iP,EAAM,CACnB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQyD,EACAtxU,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,UACN,KAAMo/O,EAAO,KACb,MAAOC,EACP,KAAA7tU,CACN,CACE,EACA,YAAaq2U,GACb,cAAeM,EACjB,CAAC,EACD1Q,GAAe,CACb,KAAM,UACN,MAAO,CAAC,QAAQ,EAChB,MAAO,CACL,QAAS,EACT,cAAe,EACnB,EACE,QAAQ6Q,EAAOtoP,EAAM,CACnB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQiJ,EACAlJ,EAAO,OAAS,QAClBA,EAAO,SAAS,gBAAgB,aAAc,wCAAwC,EAExF,IAAI5tU,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,UACN,KAAMo/O,EAAO,KACb,MAAOC,EACP,KAAA7tU,CACN,CACE,EACA,YAAaq2U,GACb,cAAeM,EACjB,CAAC,EACD1Q,GAAe,CACb,KAAM,UACN,MAAO,CAAC,QAAQ,EAChB,MAAO,CACL,QAAS,EACT,SAAU,CAAC,MAAM,EACjB,cAAe,EACnB,EACE,QAAQ8Q,EAAOvoP,EAAM,CACnB,GAAI,CACF,OAAAo/O,CACN,EAAQmJ,EACJ,MAAO,CACL,KAAM,UACN,KAAMnJ,EAAO,KACb,MAAO,SACP,KAAMp/O,EAAK,CAAC,CAClB,CACE,CACF,CAAC,EAOD,IAAIwoP,GAAgB,CAAA,EACpB,SAASC,GAAkB/Q,EAAM,CAiB/B,OAhBI,CACF,KAAAj8T,EACA,MAAA2M,EACA,MAAA+Y,EACA,QAAA6oH,EACA,YAAA2tL,EACA,cAAAC,CACJ,EAAMF,EAEA3+T,EAAO,CACT,KAAA0C,EACA,QAAS0lB,EAAM,SAAW,EAC1B,cAAe,GACf,gBAAiB,EACjB,QAAA6oH,CACJ,EACW3yI,EAAI,EAAGA,EAAI+Q,EAAM,OAAQ,EAAE/Q,EAIlCmxU,GAAcpgU,EAAM/Q,CAAC,CAAC,EAAI0B,EAExB4+T,IACFJ,GAAmB97T,CAAI,EAAIk8T,GAEzBC,IACFJ,GAAqB/7T,CAAI,EAAIm8T,EAEjC,CAOA,IAAI8Q,GAAU,CAAA,EAEd,SAASC,GAAY35U,EAAMwC,EAAM,CAC/Bk3U,GAAQ15U,CAAI,EAAIwC,CAClB,CAMA,MAAMo3U,EAAe,CAKnB,YAAYC,EAAO71T,EAAOxG,EAAK,CAC7B,KAAK,MAAQq8T,EACb,KAAK,MAAQ71T,EACb,KAAK,IAAMxG,CACb,CASA,OAAO,MAAM2P,EAAO49M,EAAQ,CAC1B,OAAKA,EAEM,CAAC59M,GAAS,CAACA,EAAM,KAAO,CAAC49M,EAAO,KAAO59M,EAAM,IAAI,QAAU49M,EAAO,IAAI,MACxE,KAEA,IAAI6uG,GAAezsT,EAAM,IAAI,MAAOA,EAAM,IAAI,MAAO49M,EAAO,IAAI,GAAG,EAJnE59M,GAASA,EAAM,GAM1B,CACF,CAeA,MAAM2sT,EAAM,CAGV,YAAYvxU,EAEZsvG,EAAK,CACH,KAAK,KAAOtvG,EACZ,KAAK,IAAMsvG,CACb,CAKA,MAAMkiO,EAENxxU,EAAM,CACJ,OAAO,IAAIuxU,GAAMvxU,EAAMqxU,GAAe,MAAM,KAAMG,CAAQ,CAAC,CAC7D,CACF,CAGA,SAASC,GAAU5J,EAAQ,CAGzB,IAAI6J,EAAY,CAAA,EAChB7J,EAAO,cAAa,EACpB,IAAI8J,EAAM9J,EAAO,MAAK,EAAG,KAOzB,IANI8J,IAAQ,YAEV9J,EAAO,QAAO,EACdA,EAAO,cAAa,EACpB8J,EAAM9J,EAAO,MAAK,EAAG,MAEhB8J,IAAQ,WAAaA,IAAQ,eAClC9J,EAAO,QAAO,EACd6J,EAAU,KAAKC,IAAQ,aAAa,EACpC9J,EAAO,cAAa,EACpB8J,EAAM9J,EAAO,MAAK,EAAG,KAEvB,OAAO6J,CACT,CACA,IAAIE,GAAgC51M,GAAW,CAC7C,IAAIwoM,EAAWxoM,EAAQ,OAAO,SAC9B,GAAI,CAACwoM,EAAS,YACZ,MAAM,IAAIpQ,GAAW,IAAMp4L,EAAQ,QAAU,qCAA0C,CAE3F,EACI61M,IAAqB,IAAI,IAAI,CAAC,SAAU,SAAS,CAAC,EAMtD,SAASC,GAAWr6U,EAAM,CACxB,GAAI,CAACA,EAAK,SAAS,IAAI,EACrB,MAAO,CAACA,EAAK,SAAS,GAAG,CAG7B,CAOA,SAASs6U,GAAWlK,EAAQ1H,EAAMzwS,EAAO,CACvC,GAAI,CACF,oBAAAsiT,EACA,OAAAC,EACA,KAAA1kP,EACA,aAAA2kP,EACA,kBAAAC,EACA,QAAAC,EACA,UAAAC,EACA,eAAAC,EACA,WAAAC,EACA,MAAAC,CACJ,EAAMrS,EAQJ,GAPA0H,EAAO,OAAO,WAAU,EACnBwK,GAGHxK,EAAO,OAAO,OAAO,IAAI,OAAQ,aAAa,EAG5C,CAACqK,EAAc,CACjB,IAAIO,EAAU5K,EAAO,OAAO,kBAAkB,gBAAgB,EAC9D,GAAI4K,GAAW,KAEbP,EAAe,UAEfA,EAAe,WAAWO,CAAO,EAC7B,CAACP,GAAgBA,EAAe,EAClC,MAAM,IAAI9d,GAAW,2BAA6Bqe,CAAO,CAG/D,CAEA5K,EAAO,OAAO,WAAU,EACxB,IAAIlqU,EAAM,CAAA,EACN1D,EAAO,CAAC0D,CAAG,EACX+0U,EAAU,CAAA,EACVC,EAAkB,CAAA,EAClBp7S,EAAO66S,GAAW,KAAO,CAAA,EAAK,OAIlC,SAASQ,GAAW,CACdR,GACFvK,EAAO,OAAO,OAAO,IAAI,WAAY,IAAK,EAAI,CAElD,CACA,SAASgL,GAAS,CACZt7S,IACEswS,EAAO,OAAO,OAAO,IAAI,UAAU,GACrCtwS,EAAK,KAAKswS,EAAO,SAAS,CAAC,IAAI0J,GAAM,UAAU,CAAC,CAAC,CAAC,EAClD1J,EAAO,OAAO,OAAO,IAAI,WAAY,OAAW,EAAI,GAEpDtwS,EAAK,KAAK,EAAQ66S,GAAYvK,EAAO,OAAO,OAAO,IAAI,UAAU,IAAM,GAAG,EAGhF,CAIA,IAHA+K,EAAQ,EAERD,EAAgB,KAAKlB,GAAU5J,CAAM,CAAC,IACzB,CAGX,IAAIiL,EAAWjL,EAAO,gBAAgB,GAAOwK,EAAY,QAAU,MAAM,EACzExK,EAAO,OAAO,SAAQ,EACtBA,EAAO,OAAO,WAAU,EACxB,IAAI1sQ,EAAO,CACT,KAAM,WACN,KAAM0sQ,EAAO,KACb,KAAMiL,CACZ,EACQpjT,IACFyrC,EAAO,CACL,KAAM,UACN,KAAM0sQ,EAAO,KACb,MAAAn4S,EACA,KAAM,CAACyrC,CAAI,CACnB,GAEIx9D,EAAI,KAAKw9D,CAAI,EACb,IAAIpmD,EAAO8yT,EAAO,MAAK,EAAG,KAC1B,GAAI9yT,IAAS,IAAK,CAChB,GAAIw9T,GAAc50U,EAAI,SAAW40U,EAAY,CAC3C,GAAIF,GAAaF,EAEf,MAAM,IAAI/d,GAAW,6BAA8ByT,EAAO,SAAS,EAGnEA,EAAO,SAAS,gBAAgB,UAAW,2DAAgE,CAE/G,CACAA,EAAO,QAAO,CAChB,SAAW9yT,IAAS,QAAS,CAC3B89T,EAAM,EAKFl1U,EAAI,SAAW,GAAKw9D,EAAK,OAAS,WAAaA,EAAK,KAAK,SAAW,GAAKA,EAAK,KAAK,CAAC,EAAE,OAAS,YAAcA,EAAK,KAAK,CAAC,EAAE,KAAK,SAAW,IAAMlhE,EAAK,OAAS,GAAK,CAACq4U,IACtKr4U,EAAK,IAAG,EAEN04U,EAAgB,OAAS14U,EAAK,OAAS,GACzC04U,EAAgB,KAAK,EAAE,EAEzB,KACF,SAAW59T,IAAS,OAAQ,CAC1B8yT,EAAO,QAAO,EACd,IAAI7oU,EAAO,OAMP6oU,EAAO,OAAO,OAAM,EAAG,OAAS,MAClC7oU,EAAO6oU,EAAO,eAAe,EAAI,GAEnC6K,EAAQ,KAAK1zU,EAAOA,EAAK,MAAQ,IAAI,EACrC6zU,EAAM,EAENF,EAAgB,KAAKlB,GAAU5J,CAAM,CAAC,EACtClqU,EAAM,CAAA,EACN1D,EAAK,KAAK0D,CAAG,EACbi1U,EAAQ,CACV,KACE,OAAM,IAAIxe,GAAW,sCAAuCyT,EAAO,SAAS,CAEhF,CAEA,OAAAA,EAAO,OAAO,SAAQ,EAEtBA,EAAO,OAAO,SAAQ,EACf,CACL,KAAM,QACN,KAAMA,EAAO,KACb,OAAAoK,EACA,aAAAC,EACA,KAAAj4U,EACA,KAAAszF,EACA,QAAAmlP,EACA,oBAAAV,EACA,gBAAAW,EACA,kBAAAR,EACA,KAAA56S,EACA,MAAAi7S,CACJ,CACA,CAGA,SAASO,GAAWC,EAAS,CAC3B,OAAIA,EAAQ,MAAM,EAAG,CAAC,IAAM,IACnB,UAEA,MAEX,CACA,IAAIC,GAAgB,SAAqB56S,EAAOlhB,EAAS,CACvD,IAAI,EACAje,EACAg6U,EAAK76S,EAAM,KAAK,OAChBs6S,EAAkBt6S,EAAM,gBACxB86S,EAAK,EACLl5U,EAAO,IAAI,MAAMi5U,CAAE,EACnBE,EAAS,CAAA,EACTzC,EAAgB,KAAK,IAEzBx5T,EAAQ,YAAW,EAAG,eAAgBA,EAAQ,gBAAgB,EAE1DgwB,EAAK,EAAIhwB,EAAQ,YAAW,EAAG,QAC/Bk8T,EAAc,EAAIlsS,EACtB,GAAI9O,EAAM,mBAAqBA,EAAM,oBAAsB,QAAS,CAMlE,IAAIi7S,EAAkBn8T,EAAQ,YAAYm/S,GAAQ,MAAM,EAAE,eAC1D+c,EAAc,OAAUC,EAAkBn8T,EAAQ,eACpD,CAEA,IAAIo8T,EAAel7S,EAAM,oBAAsB,KAAO8/R,GAAc,CAClE,OAAQ,EACR,KAAM,IACV,EAAKhhT,CAAO,EAAI,GAAKgwB,EAGfqsS,EAAM,EAAIrsS,EACVssS,EAAYp7S,EAAM,aAAek7S,EACjCG,EAAgB,GAAMD,EACtBE,EAAe,GAAMF,EACrBjN,EAAc,EAElB,SAASoN,EAAYC,EAAa,CAChC,QAAS/zU,GAAI,EAAGA,GAAI+zU,EAAY,OAAQ,EAAE/zU,GACpCA,GAAI,IACN0mU,GAAe,KAEjB4M,EAAO,KAAK,CACV,IAAK5M,EACL,SAAUqN,EAAY/zU,EAAC,CAC/B,CAAO,CAEL,CAEA,IADA8zU,EAAYjB,EAAgB,CAAC,CAAC,EACzB,EAAI,EAAG,EAAIt6S,EAAM,KAAK,OAAQ,EAAE,EAAG,CACtC,IAAIy7S,EAAQz7S,EAAM,KAAK,CAAC,EACpBg2B,EAASqlR,EACT7zU,EAAQ8zU,EACRR,EAAKW,EAAM,SACbX,EAAKW,EAAM,QAEb,IAAIC,EAAS,IAAI,MAAMD,EAAM,MAAM,EACnC,IAAK56U,EAAI,EAAGA,EAAI46U,EAAM,OAAQ,EAAE56U,EAAG,CACjC,IAAI86U,EAAM9S,GAAa4S,EAAM56U,CAAC,EAAGie,CAAO,EACpCtX,EAAQm0U,EAAI,QACdn0U,EAAQm0U,EAAI,OAEV3lR,EAAS2lR,EAAI,SACf3lR,EAAS2lR,EAAI,QAEfD,EAAO76U,CAAC,EAAI86U,CACd,CACA,IAAIC,EAAS57S,EAAM,QAAQ,CAAC,EACxB9F,EAAM,EACN0hT,IACF1hT,EAAM4lS,GAAc8b,EAAQ98T,CAAO,EAC/Bob,EAAM,IAERA,GAAOohT,EACH9zU,EAAQ0yB,IACV1yB,EAAQ0yB,GAEVA,EAAM,IAON8F,EAAM,QAAU,EAAIA,EAAM,KAAK,OAAS,IAC1Cx4B,GAAS2zU,GAEXO,EAAO,OAAS1lR,EAChB0lR,EAAO,MAAQl0U,EACf2mU,GAAen4Q,EACf0lR,EAAO,IAAMvN,EACbA,GAAe3mU,EAAQ0yB,EACvBt4B,EAAK,CAAC,EAAI85U,EAEVH,EAAYjB,EAAgB,EAAI,CAAC,CAAC,CACpC,CACA,IAAI1yU,EAASumU,EAAc,EAAIrvT,EAAQ,YAAW,EAAG,WACjD+8T,EAAkB77S,EAAM,MAAQ,CAAA,EAChCk1D,EAAO,CAAA,EACP4mP,EACAC,EACAC,EAAW,CAAA,EACf,GAAIh8S,EAAM,MAAQA,EAAM,KAAK,KAAKp9B,GAAOA,CAAG,EAG1C,IAAK,EAAI,EAAG,EAAIi4U,EAAI,EAAE,EAAG,CACvB,IAAIoB,EAAKr6U,EAAK,CAAC,EACX0qE,EAAQ2vQ,EAAG,IAAMr0U,EACjBhF,EAAMo9B,EAAM,KAAK,CAAC,EAClBk8S,EAAU,OACVt5U,IAAQ,GAEVs5U,EAAU5W,GAAS,CAAC,SAAS,EAAG,CAAA,EAAIxmT,CAAO,EAClClc,IAAQ,GAEjBs5U,EAAU5W,GAAS,GAAI,CAAA,EAAIxmT,CAAO,EAGlCo9T,EAAU5W,GAAS,CAAA,EAAImD,GAAkB7lU,EAAKkc,EAAS,EAAI,EAAGA,CAAO,EAEvEo9T,EAAQ,MAAQD,EAAG,MACnBC,EAAQ,OAASD,EAAG,OACpBD,EAAS,KAAK,CACZ,KAAM,OACN,KAAME,EACN,MAAA5vQ,CACR,CAAO,CACH,CAEF,IAAKzrE,EAAI,EAAGk7U,EAAc,EAG1Bl7U,EAAIi6U,GAAMiB,EAAcF,EAAgB,OAAQ,EAAEh7U,EAAG,EAAEk7U,EAAa,CAIlE,QAHII,GACAC,EAAWP,EAAgBE,CAAW,EACtCM,GAAiB,KACZC,GAAYF,IAAa,KAAO,OAASE,GAAU,QAAU,aAAa,CACjF,IAAIA,GAQJ,GALKD,KACHP,EAASxW,GAAS,CAAC,aAAa,EAAG,CAAA,CAAE,EACrCwW,EAAO,MAAM,MAAQ7b,GAAOnhT,EAAQ,YAAW,EAAG,aAAa,EAC/Do2E,EAAK,KAAK4mP,CAAM,GAEdM,EAAS,YAAc,KAAOA,EAAS,YAAc,IAAK,CAC5D,IAAIG,EAAWH,EAAS,YAAc,IAAM,QAAU,SAClD1rR,EAAY40Q,GAAS,CAAC,oBAAoB,EAAG,CAAA,EAAIxmT,CAAO,EAC5D4xC,EAAU,MAAM,OAASuvQ,GAAOkO,CAAW,EAC3Cz9Q,EAAU,MAAM,iBAAmBuvQ,GAAOqY,CAAa,EACvD5nR,EAAU,MAAM,iBAAmB6rR,EACnC7rR,EAAU,MAAM,OAAS,KAAOuvQ,GAAO,CAACqY,EAAgB,CAAC,EACzD,IAAIkE,GAASrO,EAAcvmU,EACvB40U,KACF9rR,EAAU,MAAM,cAAgBuvQ,GAAO,CAACuc,EAAM,GAEhDtnP,EAAK,KAAKxkC,CAAS,CACrB,KACE,OAAM,IAAIqrQ,GAAW,2BAA6BqgB,EAAS,SAAS,EAEtEL,IACAK,EAAWP,EAAgBE,CAAW,EACtCM,GAAiB,EACnB,CACA,GAAI,EAAAx7U,GAAKi6U,GAGT,KAAI2B,GAAW,OACf,GAAI57U,EAAI,GAAKm/B,EAAM,oBAAqB,CACtC,IAAI08S,GAAkBC,GACtBF,IAAYC,IAAoBC,GAAaP,IAAa,KAAO,OAASO,GAAW,SAAW,KAAOD,GAAmB1B,EACtHyB,KAAa,IACfX,EAASxW,GAAS,CAAC,aAAa,EAAG,CAAA,CAAE,EACrCwW,EAAO,MAAM,MAAQ7b,GAAOwc,EAAQ,EACpCvnP,EAAK,KAAK4mP,CAAM,EAEpB,CACA,IAAIc,GAAW,CAAA,EACf,IAAK,EAAI,EAAG,EAAI/B,EAAI,EAAE,EAAG,CACvB,IAAIv1U,GAAM1D,EAAK,CAAC,EACZgrQ,GAAOtnQ,GAAIzE,CAAC,EAChB,GAAK+rQ,GAGL,KAAIiwE,GAAUv3U,GAAI,IAAMsC,EACxBglQ,GAAK,MAAQtnQ,GAAI,MACjBsnQ,GAAK,OAAStnQ,GAAI,OAClBs3U,GAAS,KAAK,CACZ,KAAM,OACN,KAAMhwE,GACN,MAAOiwE,EACf,CAAO,EACH,CACA,IAAIC,GAAW/W,GAAU,CACvB,aAAc,kBACd,SAAU6W,EAChB,CAAK,EACGG,GAAUzX,GAAS,CAAC,gBAAkB6W,GAAaC,IAAa,KAAO,OAASD,GAAW,QAAU,IAAI,EAAG,CAACW,EAAQ,CAAC,EAE1H,GADA5nP,EAAK,KAAK6nP,EAAO,EACbl8U,EAAIi6U,EAAK,GAAK96S,EAAM,oBAAqB,CAC3C,IAAIg9S,GAAmBC,GACvBR,IAAYO,IAAqBC,GAAab,IAAa,KAAO,OAASa,GAAW,UAAY,KAAOD,GAAoBhC,EACzHyB,KAAa,IACfX,EAASxW,GAAS,CAAC,aAAa,EAAG,CAAA,CAAE,EACrCwW,EAAO,MAAM,MAAQ7b,GAAOwc,EAAQ,EACpCvnP,EAAK,KAAK4mP,CAAM,EAEpB,EACF,CACA,IAAIoB,GAAY5X,GAAS,CAAC,QAAQ,EAAGpwO,CAAI,EAEzC,GAAI6lP,EAAO,OAAS,EAAG,CAQrB,QAPIxrR,GAAOi2Q,GAAa,QAAS1mT,EAASw5T,CAAa,EACnDr9D,GAASuqD,GAAa,YAAa1mT,EAASw5T,CAAa,EACzD6E,GAAa,CAAC,CAChB,KAAM,OACN,KAAMD,GACN,MAAO,CACb,CAAK,EACMnC,EAAO,OAAS,GAAG,CACxB,IAAIqC,GAAQrC,EAAO,IAAG,EAClBsC,GAAYD,GAAM,IAAMx1U,EACxBw1U,GAAM,SACRD,GAAW,KAAK,CACd,KAAM,OACN,KAAMliE,GACN,MAAOoiE,EACjB,CAAS,EAEDF,GAAW,KAAK,CACd,KAAM,OACN,KAAM5tR,GACN,MAAO8tR,EACjB,CAAS,CAEL,CACAH,GAAYnX,GAAU,CACpB,aAAc,kBACd,SAAUoX,EAChB,CAAK,CACH,CACA,GAAInB,EAAS,SAAW,EACtB,OAAO1W,GAAS,CAAC,MAAM,EAAG,CAAC4X,EAAS,EAAGp+T,CAAO,EAE9C,IAAIw+T,GAAYvX,GAAU,CACxB,aAAc,kBACd,SAAUiW,CAChB,CAAK,EACGuB,GAASjY,GAAS,CAAC,KAAK,EAAG,CAACgY,EAAS,EAAGx+T,CAAO,EACnD,OAAOgmT,GAAa,CAACoY,GAAWK,EAAM,CAAC,CAE3C,EACIC,IAAW,CACb,EAAG,UACH,EAAG,QACH,EAAG,QACL,EACIC,GAAkB,SAAuBz9S,EAAOlhB,EAAS,CAI3D,QAHI4+T,EAAM,CAAA,EACNC,EAAO,IAAIrT,GAAS,MAAO,CAAA,EAAI,CAAC,UAAU,CAAC,EAC3C1nU,EAAM,IAAI0nU,GAAS,MAAO,CAAA,EAAI,CAAC,aAAa,CAAC,EACxC7iU,EAAI,EAAGA,EAAIu4B,EAAM,KAAK,OAAQv4B,IAAK,CAG1C,QAFIw0U,EAAKj8S,EAAM,KAAKv4B,CAAC,EACjBnC,EAAM,CAAA,EACDsU,EAAI,EAAGA,EAAIqiU,EAAG,OAAQriU,IAC7BtU,EAAI,KAAK,IAAIglU,GAAS,MAAO,CAACW,GAAWgR,EAAGriU,CAAC,EAAGkF,CAAO,CAAC,CAAC,CAAC,EAExDkhB,EAAM,MAAQA,EAAM,KAAKv4B,CAAC,IAC5BnC,EAAI,QAAQq4U,CAAI,EAChBr4U,EAAI,KAAKq4U,CAAI,EACT39S,EAAM,MACR16B,EAAI,QAAQ1C,CAAG,EAEf0C,EAAI,KAAK1C,CAAG,GAGhB86U,EAAI,KAAK,IAAIpT,GAAS,MAAOhlU,CAAG,CAAC,CACnC,CACA,IAAImN,EAAQ,IAAI63T,GAAS,SAAUoT,CAAG,EAWlCxjT,EAAM8F,EAAM,eAAiB,GAAM,GACrC,IAAOA,EAAM,aAAe,GAAKA,EAAM,OAAS,IAAO,GACzDvtB,EAAM,aAAa,aAAcwtT,GAAO/lS,CAAG,CAAC,EAG5C,IAAI0jT,EAAW,GACXC,EAAQ,GACZ,GAAI79S,EAAM,MAAQA,EAAM,KAAK,OAAS,EAAG,CAEvC,IAAIk1D,EAAOl1D,EAAM,KACb89S,EAAc,GACdC,EAAmB,GACnBC,EAAS,EACTC,EAAO/oP,EAAK,OACZA,EAAK,CAAC,EAAE,OAAS,cACnB0oP,GAAY,OACZI,EAAS,GAEP9oP,EAAKA,EAAK,OAAS,CAAC,EAAE,OAAS,cACjC0oP,GAAY,UACZK,GAAQ,GAEV,QAAS3vT,EAAK0vT,EAAQ1vT,EAAK2vT,EAAM3vT,IAAM,CACrC,IAAIsuC,EAAMs4B,EAAK5mE,CAAE,EACbsuC,EAAI,OAAS,SACfihR,GAASL,IAAS5gR,EAAI,KAAK,EACvBmhR,IACFD,GAAe,SAEjBC,EAAmB,IACVnhR,EAAI,OAAS,aAGlBmhR,IACFD,GAAelhR,EAAI,YAAc,IAAM,SAAW,UAClDmhR,EAAmB,GAGzB,CACAtrU,EAAM,aAAa,cAAeorU,EAAM,KAAI,CAAE,EAC1C,OAAO,KAAKC,CAAW,GACzBrrU,EAAM,aAAa,cAAeqrU,EAAY,KAAI,CAAE,CAExD,CAEA,GAAI99S,EAAM,oBAAsB,QAAS,CAGvC,QAFIk+S,EAAQl+S,EAAM,MAAQ,CAAA,EACtBq2O,EAAU,GACL8sD,EAAM,EAAGA,EAAM+a,EAAM,OAAQ/a,IACpC9sD,GAAW8sD,EAAM,EAAI,OAAS,OAEhC1wT,EAAM,aAAa,gBAAiB4jQ,EAAQ,KAAI,CAAE,CACpD,MAAWr2O,EAAM,oBAAsB,WAAaA,EAAM,oBAAsB,SAC9EvtB,EAAM,aAAa,gBAAiB,KAAK,EAChCutB,EAAM,oBAAsB,QACrCvtB,EAAM,aAAa,gBAAiB,UAAU,EACrCutB,EAAM,oBAAsB,KACrCvtB,EAAM,aAAa,gBAAiB,OAAO,EAE3CA,EAAM,aAAa,gBAAiB,KAAK,EAG3C,IAAI0rU,EAAW,GACXpD,EAAS/6S,EAAM,gBACnB49S,GAAY7C,EAAO,CAAC,EAAE,OAAS,EAAI,QAAU,GAC7C6C,GAAY7C,EAAOA,EAAO,OAAS,CAAC,EAAE,OAAS,EAAI,SAAW,GAC9D,QAASzX,EAAM,EAAGA,EAAMyX,EAAO,OAAS,EAAGzX,IACzC6a,GAAYpD,EAAOzX,CAAG,EAAE,SAAW,EAAI,QAErCyX,EAAOzX,CAAG,EAAE,CAAC,EAAI,UAAY,SAEjC,MAAI,OAAO,KAAK6a,CAAQ,GACtB1rU,EAAM,aAAa,WAAY0rU,EAAS,KAAI,CAAE,EAE5CP,IAAa,KACfnrU,EAAQ,IAAI63T,GAAS,WAAY,CAAC73T,CAAK,CAAC,EACxCA,EAAM,aAAa,WAAYmrU,EAAS,KAAI,CAAE,GAE5C59S,EAAM,cAAgBA,EAAM,aAAe,IAE7CvtB,EAAQ,IAAI63T,GAAS,SAAU,CAAC73T,CAAK,CAAC,EACtCA,EAAM,aAAa,cAAe,GAAG,GAEhCA,CACT,EAEI2rU,GAAiB,SAAwBz6M,EAASvzC,EAAM,CACrDuzC,EAAQ,QAAQ,SAAS,IAAI,GAChC41M,GAA8B51M,CAAO,EAEvC,IAAIzuC,EAAO,CAAA,EACPmpP,EAAiB16M,EAAQ,QAAQ,SAAS,IAAI,EAAI,UAAY,QAC9D26M,EAAU36M,EAAQ,UAAY,QAC9BhiI,EAAM+3U,GAAW/1M,EAAQ,OAAQ,CACnC,KAAAzuC,EACA,OAAQ,GACR,QAASopP,EAAU,OAAY7E,GAAW91M,EAAQ,OAAO,EACzD,eAAgB,GAChB,kBAAmB06M,EACnB,WAAYC,EAAU,EAAI,OAC1B,MAAO36M,EAAQ,OAAO,SAAS,KACnC,EAAK,SAAS,EAUR46M,EAAW,EACXC,EAAU,EACVC,EAAa,CACf,KAAM,WACN,KAAM96M,EAAQ,KACd,KAAM,CAAA,CACV,EACE,GAAIvzC,EAAK,CAAC,GAAKA,EAAK,CAAC,EAAE,OAAS,WAAY,CAE1C,QADIsuP,EAAO,GACFj3U,EAAI,EAAGA,EAAI2oF,EAAK,CAAC,EAAE,KAAK,OAAQ3oF,IAAK,CAC5C,IAAIo7T,EAAUuL,GAAeh+O,EAAK,CAAC,EAAE,KAAK3oF,CAAC,EAAG,SAAS,EACvDi3U,GAAQ7b,EAAQ,IAClB,CACA0b,EAAW,OAAOG,CAAI,EACtBF,EAAUD,EAAW,CACvB,CACA,IAAII,EAAY,CAACH,EACjB78U,EAAI,KAAK,QAAQ,SAAU2D,EAAK,CAC9B,QAASk+T,EAAM,EAAGA,EAAMl+T,EAAI,OAAQk+T,GAAO,EAAG,CAE5C,IAAIob,EAAUxQ,GAAe9oU,EAAIk+T,CAAG,EAAG,SAAS,EAC5Cqb,EAAWzQ,GAAewQ,EAAQ,KAAK,CAAC,EAAG,UAAU,EACzDC,EAAS,KAAK,QAAQJ,CAAU,CAClC,CACA,GAAKE,EAMMH,EAAUl5U,EAAI,SAEvBk5U,EAAUl5U,EAAI,YARA,CAEd,IAAIw5U,EAAWx5U,EAAI,OAAS,EAC5B,GAAIi5U,EAAWO,EACb,MAAM,IAAI/iB,GAAW,4BAA8B,YAAcwiB,EAAW,aAAeO,GAAWx5U,EAAI,CAAC,CAAC,CAEhH,CAIF,CAAC,EAID,QAASq+T,EAAM,EAAGA,EAAM6a,EAAS,EAAE7a,EAAK,CACtC,IAAIka,EAAQ,IACRkB,EAAS,EACTpb,EAAM,IAAM,EACdka,EAAQ,IACCla,EAAM,GAAKgb,IAEpBI,EAAS,GAEX7pP,EAAKyuO,CAAG,EAAI,CACV,KAAM,QACN,MAAOka,EACP,OAAQkB,EACR,QAAS,CACf,CACE,CACA,OAAAp9U,EAAI,kBAAoBg9U,EAAY,QAAU,UACvCh9U,CACT,EAKAk3U,GAAkB,CAChB,KAAM,QACN,MAAO,CAAC,QAAS,QAAQ,EACzB,MAAO,CACL,QAAS,CACb,EACE,QAAQl1M,EAASvzC,EAAM,CAKrB,IAAI4uP,EAAUzQ,GAAoBn+O,EAAK,CAAC,CAAC,EACrC6uP,EAAWD,EAAU,CAAC5uP,EAAK,CAAC,CAAC,EAAIg+O,GAAeh+O,EAAK,CAAC,EAAG,UAAU,EAAE,KACrE8E,EAAO+pP,EAAS,IAAI,SAAUC,EAAK,CACrC,IAAIrrU,EAAOw6T,GAAqB6Q,CAAG,EAC/B55Q,EAAKzxD,EAAK,KACd,GAAI,MAAM,SAASyxD,CAAE,EACnB,MAAO,CACL,KAAM,QACN,MAAOA,CACjB,EACa,GAAIA,IAAO,IAChB,MAAO,CACL,KAAM,YACN,UAAW,GACrB,EACa,GAAIA,IAAO,IAChB,MAAO,CACL,KAAM,YACN,UAAW,GACrB,EAEM,MAAM,IAAIy2P,GAAW,6BAA+Bz2P,EAAI45Q,CAAG,CAC7D,CAAC,EACGv9U,EAAM,CACR,KAAAuzF,EACA,oBAAqB,GAErB,WAAYA,EAAK,MACvB,EACI,OAAOwkP,GAAW/1M,EAAQ,OAAQhiI,EAAK+4U,GAAW/2M,EAAQ,OAAO,CAAC,CACpE,EACA,YAAai3M,GACb,cAAe6C,EACjB,CAAC,EAKD5E,GAAkB,CAChB,KAAM,QACN,MAAO,CAAC,SAAU,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAAY,WAAY,WAAY,WAAY,UAAU,EAC9I,MAAO,CACL,QAAS,CACb,EACE,QAAQl1M,EAAS,CACf,IAAIsvM,EAAa,CACf,OAAU,KACV,QAAW,CAAC,IAAK,GAAG,EACpB,QAAW,CAAC,IAAK,GAAG,EACpB,QAAW,CAAC,MAAO,KAAK,EACxB,QAAW,CAAC,IAAK,GAAG,EACpB,QAAW,CAAC,SAAU,QAAQ,CACpC,EAAMtvM,EAAQ,QAAQ,QAAQ,IAAK,EAAE,CAAC,EAE9Bw7M,EAAW,IACXphU,EAAU,CACZ,oBAAqB,GACrB,KAAM,CAAC,CACL,KAAM,QACN,MAAOohU,CACf,CAAO,CACP,EACI,GAAIx7M,EAAQ,QAAQ,OAAOA,EAAQ,QAAQ,OAAS,CAAC,IAAM,IAAK,CAG9D,IAAI6rM,EAAS7rM,EAAQ,OAErB,GADA6rM,EAAO,cAAa,EAChBA,EAAO,QAAQ,OAAS,IAAK,CAI/B,GAHAA,EAAO,QAAO,EACdA,EAAO,cAAa,EACpB2P,EAAW3P,EAAO,MAAK,EAAG,KACtB,CAAC,MAAM,SAAS2P,CAAQ,EAC1B,MAAM,IAAIpjB,GAAW,uBAAwByT,EAAO,SAAS,EAE/DA,EAAO,QAAO,EACdA,EAAO,cAAa,EACpBA,EAAO,OAAO,GAAG,EACjBA,EAAO,QAAO,EACdzxT,EAAQ,KAAO,CAAC,CACd,KAAM,QACN,MAAOohU,CACjB,CAAS,CACH,CACF,CACA,IAAIx9U,EAAM+3U,GAAW/1M,EAAQ,OAAQ5lH,EAAS28T,GAAW/2M,EAAQ,OAAO,CAAC,EAErE66M,EAAU,KAAK,IAAI,EAAG,GAAG78U,EAAI,KAAK,IAAI2D,GAAOA,EAAI,MAAM,CAAC,EAC5D,OAAA3D,EAAI,KAAO,IAAI,MAAM68U,CAAO,EAAE,KAAK,CACjC,KAAM,QACN,MAAOW,CACb,CAAK,EACMlM,EAAa,CAClB,KAAM,YACN,KAAMtvM,EAAQ,KACd,KAAM,CAAChiI,CAAG,EACV,KAAMsxU,EAAW,CAAC,EAClB,MAAOA,EAAW,CAAC,EACnB,WAAY,MAClB,EAAQtxU,CACN,EACA,YAAai5U,GACb,cAAe6C,EACjB,CAAC,EACD5E,GAAkB,CAChB,KAAM,QACN,MAAO,CAAC,aAAa,EACrB,MAAO,CACL,QAAS,CACb,EACE,QAAQl1M,EAAS,CACf,IAAI5lH,EAAU,CACZ,aAAc,EACpB,EACQpc,EAAM+3U,GAAW/1M,EAAQ,OAAQ5lH,EAAS,QAAQ,EACtD,OAAApc,EAAI,kBAAoB,QACjBA,CACT,EACA,YAAai5U,GACb,cAAe6C,EACjB,CAAC,EACD5E,GAAkB,CAChB,KAAM,QACN,MAAO,CAAC,UAAU,EAClB,MAAO,CACL,QAAS,CACb,EACE,QAAQl1M,EAASvzC,EAAM,CAErB,IAAI4uP,EAAUzQ,GAAoBn+O,EAAK,CAAC,CAAC,EACrC6uP,EAAWD,EAAU,CAAC5uP,EAAK,CAAC,CAAC,EAAIg+O,GAAeh+O,EAAK,CAAC,EAAG,UAAU,EAAE,KACrE8E,EAAO+pP,EAAS,IAAI,SAAUC,EAAK,CACrC,IAAIrrU,EAAOw6T,GAAqB6Q,CAAG,EAC/B55Q,EAAKzxD,EAAK,KAEd,GAAI,KAAK,SAASyxD,CAAE,EAClB,MAAO,CACL,KAAM,QACN,MAAOA,CACjB,EAEM,MAAM,IAAIy2P,GAAW,6BAA+Bz2P,EAAI45Q,CAAG,CAC7D,CAAC,EACD,GAAIhqP,EAAK,OAAS,EAChB,MAAM,IAAI6mO,GAAW,wCAAwC,EAE/D,IAAIh+S,EAAU,CACZ,KAAAm3E,EACA,oBAAqB,GACrB,aAAc,EACpB,EACQvzF,EAAM+3U,GAAW/1M,EAAQ,OAAQ5lH,EAAS,QAAQ,EACtD,GAAIpc,EAAI,KAAK,OAAS,GAAKA,EAAI,KAAK,CAAC,EAAE,OAAS,EAC9C,MAAM,IAAIo6T,GAAW,wCAAwC,EAE/D,OAAOp6T,CACT,EACA,YAAai5U,GACb,cAAe6C,EACjB,CAAC,EAOD5E,GAAkB,CAChB,KAAM,QACN,MAAO,CAAC,QAAS,SAAU,SAAU,SAAS,EAC9C,MAAO,CACL,QAAS,CACb,EACE,QAAQl1M,EAAS,CACf,IAAI5lH,EAAU,CACZ,aAAc,IACd,KAAM,CAAC,CACL,KAAM,QACN,MAAO,IACP,OAAQ,EAKR,QAAS,CACjB,EAAS,CACD,KAAM,QACN,MAAO,IACP,OAAQ,EACR,QAAS,CACjB,CAAO,CACP,EACQpc,EAAM+3U,GAAW/1M,EAAQ,OAAQ5lH,EAAS28T,GAAW/2M,EAAQ,OAAO,CAAC,EACzE,MAAO,CACL,KAAM,YACN,KAAMA,EAAQ,KACd,KAAM,CAAChiI,CAAG,EACV,KAAMgiI,EAAQ,QAAQ,SAAS,GAAG,EAAI,IAAM,MAC5C,MAAOA,EAAQ,QAAQ,SAAS,GAAG,EAAI,MAAQ,IAC/C,WAAY,MAClB,CACE,EACA,YAAai3M,GACb,cAAe6C,EACjB,CAAC,EAOD5E,GAAkB,CAChB,KAAM,QACN,MAAO,CAAC,QAAS,SAAU,UAAW,OAAO,EAC7C,MAAO,CACL,QAAS,CACb,EACE,QAASuF,GACT,YAAaxD,GACb,cAAe6C,EACjB,CAAC,EAID5E,GAAkB,CAChB,KAAM,QACN,MAAO,CAAC,WAAY,SAAU,SAAS,EACvC,MAAO,CACL,QAAS,CACb,EACE,QAAQl1M,EAAS,CACX61M,IAAmB,IAAI71M,EAAQ,OAAO,GACxC41M,GAA8B51M,CAAO,EAEvC,IAAIhiI,EAAM,CACR,KAAM,CAAC,CACL,KAAM,QACN,MAAO,GACf,CAAO,EACD,OAAQ,GACR,kBAAmB,SACnB,QAAS83U,GAAW91M,EAAQ,OAAO,EACnC,eAAgB,GAChB,MAAOA,EAAQ,OAAO,SAAS,KACrC,EACI,OAAO+1M,GAAW/1M,EAAQ,OAAQhiI,EAAK,SAAS,CAClD,EACA,YAAai5U,GACb,cAAe6C,EACjB,CAAC,EAID5E,GAAkB,CAChB,KAAM,QACN,MAAO,CAAC,UAAW,WAAY,WAAW,EAC1C,MAAO,CACL,QAAS,CACb,EACE,QAASuF,GACT,YAAaxD,GACb,cAAe6C,EACjB,CAAC,EACD5E,GAAkB,CAChB,KAAM,QACN,MAAO,CAAC,WAAY,WAAW,EAC/B,MAAO,CACL,QAAS,CACb,EACE,QAAQl1M,EAAS,CACf41M,GAA8B51M,CAAO,EACrC,IAAIhiI,EAAM,CACR,QAAS83U,GAAW91M,EAAQ,OAAO,EACnC,eAAgB,GAChB,UAAW,GACX,WAAY,EACZ,MAAOA,EAAQ,OAAO,SAAS,KACrC,EACI,OAAO+1M,GAAW/1M,EAAQ,OAAQhiI,EAAK,SAAS,CAClD,EACA,YAAai5U,GACb,cAAe6C,EACjB,CAAC,EACD5E,GAAkB,CAChB,KAAM,QACN,MAAO,CAAC,IAAI,EACZ,MAAO,CACL,QAAS,CACb,EACE,QAAQl1M,EAAS,CACf,OAAA41M,GAA8B51M,CAAO,EAC9BsuM,IAAQtuM,EAAQ,MAAM,CAC/B,EACA,YAAai3M,GACb,cAAe6C,EACjB,CAAC,EACD1E,GAAY,aAAc,mBAAmB,EAC7CA,GAAY,UAAW,YAAY,EAEnClR,GAAe,CACb,KAAM,OAEN,MAAO,CAAC,UAAW,aAAa,EAChC,MAAO,CACL,QAAS,EACT,cAAe,GACf,cAAe,EACnB,EACE,QAAQlkM,EAASvzC,EAAM,CACrB,MAAM,IAAI2rO,GAAWp4L,EAAQ,SAAW,sCAAsC,CAChF,CACF,CAAC,EAED,IAAIy7M,GAAexG,GAInB/Q,GAAe,CACb,KAAM,cACN,MAAO,CAAC,UAAW,OAAO,EAC1B,MAAO,CACL,QAAS,EACT,SAAU,CAAC,MAAM,CACrB,EACE,QAAQC,EAAM13O,EAAM,CAClB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQ3H,EACAuX,EAAYjvP,EAAK,CAAC,EACtB,GAAIivP,EAAU,OAAS,WACrB,MAAM,IAAItjB,GAAW,2BAA4BsjB,CAAS,EAG5D,QADI1E,EAAU,GACLlzU,EAAI,EAAGA,EAAI43U,EAAU,KAAK,OAAQ,EAAE53U,EAC3CkzU,GAAWvM,GAAeiR,EAAU,KAAK53U,CAAC,EAAG,SAAS,EAAE,KAE1D,GAAIgoU,IAAa,UAAW,CAE1B,GAAI,CAAC2P,GAAa,eAAezE,CAAO,EACtC,MAAM,IAAI5e,GAAW,wBAA0B4e,EAAS0E,CAAS,EAInE,IAAIp8R,EAAMm8R,GAAazE,CAAO,EAC1B,CACF,KAAM2E,EACN,QAAAzP,CACR,EAAUL,EAAO,eAAe,WAAamL,EAAU,IAAK13R,CAAG,EACrD0gF,EAAU,CACZ,KAAM6rM,EAAO,KACb,QAAAmL,EACA,OAAAnL,CACR,EACUxsT,EAASigC,EAAI,QAAQ0gF,EAAS27M,EAAOzP,CAAO,EAChDL,EAAO,OAAO,QAAS,EAAK,EAC5B,IAAI+P,EAAe/P,EAAO,UACtB5yT,EAAMwxT,GAAeoB,EAAO,cAAa,EAAI,aAAa,EAC9D,GAAI5yT,EAAI,OAAS+9T,EACf,MAAM,IAAI5e,GAAW,qBAAuB4e,EAAU,sBAAwB/9T,EAAI,KAAO,IAAK2iU,CAAY,EAG5G,OAAOv8T,CACT,CACA,MAAO,CACL,KAAM,cACN,KAAMwsT,EAAO,KACb,KAAMmL,EACN,UAAA0E,CACN,CACE,CACF,CAAC,EAGD,IAAIG,GAAgB,CAACx/S,EAAOlhB,IAAY,CACtC,IAAI6yC,EAAO3xB,EAAM,KACb8vS,EAAahxT,EAAQ,SAAS6yC,CAAI,EACtC,OAAOk3Q,GAAa7oS,EAAM,KAAM8vS,CAAU,CAC5C,EACI2P,GAAkB,CAACz/S,EAAOlhB,IAAY,CACxC,IAAI6yC,EAAO3xB,EAAM,KACb8vS,EAAahxT,EAAQ,SAAS6yC,CAAI,EACtC,OAAOs5Q,GAAWjrS,EAAM,KAAM8vS,CAAU,CAC1C,EACI4P,GAAc,CAChB,QAAS,WACT,SAAU,WACV,SAAU,aACV,OAAQ,cACV,EACA7X,GAAe,CACb,KAAM,OACN,MAAO,CAEP,WAAY,WAAY,WAAY,eAAgB,aAEpD,WAAY,YAAa,aAAc,YAAa,WAAY,WAEhE,QAAS,SAAU,QAAQ,EAC3B,MAAO,CACL,QAAS,EACT,kBAAmB,EACvB,EACE,QAAS,CAACC,EAAM13O,IAAS,CACvB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQ3H,EACAlmU,EAAOumU,GAAkB/3O,EAAK,CAAC,CAAC,EAChCmhE,EAAOk+K,EACX,OAAIl+K,KAAQmuL,KACVnuL,EAAOmuL,GAAYnuL,CAAI,GAElB,CACL,KAAM,OACN,KAAMi+K,EAAO,KACb,KAAMj+K,EAAK,MAAM,CAAC,EAClB,KAAA3vJ,CACN,CACE,EACA,YAAa49U,GACb,cAAeC,EACjB,CAAC,EACD5X,GAAe,CACb,KAAM,SACN,MAAO,CAAC,eAAgB,MAAM,EAC9B,MAAO,CACL,QAAS,CACb,EACE,QAAS,CAACK,EAAO93O,IAAS,CACxB,GAAI,CACF,OAAAo/O,CACN,EAAQtH,EACAtmU,EAAOwuF,EAAK,CAAC,EAGjB,MAAO,CACL,KAAM,SACN,KAAMo/O,EAAO,KACb,OAAQoB,GAAYhvU,CAAI,EACxB,KAAM,CAAC,CACL,KAAM,OACN,KAAM4tU,EAAO,KACb,KAAM,aACN,KAAA5tU,CACR,CAAO,EACD,eAAgB26T,GAAe36T,CAAI,CACzC,CACE,CACF,CAAC,EAEDimU,GAAe,CACb,KAAM,OACN,MAAO,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAO,EACvD,MAAO,CACL,QAAS,EACT,cAAe,EACnB,EACE,QAAS,CAACiJ,EAAO1gP,IAAS,CACxB,GAAI,CACF,OAAAo/O,EACA,SAAAC,EACA,iBAAAgD,CACN,EAAQ3B,EACA,CACF,KAAA93S,CACN,EAAQw2S,EACA5tU,EAAO4tU,EAAO,gBAAgB,GAAMiD,CAAgB,EACpDp7S,EAAQ,OAASo4S,EAAS,MAAM,CAAC,EACrC,MAAO,CACL,KAAM,OACN,KAAMz2S,EACN,KAAM3B,EACN,KAAM,CACJ,KAAM,WACN,KAAMm4S,EAAO,KACb,KAAA5tU,CACR,CACA,CACE,EACA,YAAa49U,GACb,cAAeC,EACjB,CAAC,EAED,IAAIE,IAAgB,CAAC3/S,EAAOlhB,IAAY,CAEtC,IAAIuY,EAAQvY,EAAQ,MAChB8gU,EAASvoT,EAAM,QAAO,EACtBwoT,EAASxoT,EAAM,QAAO,EACtBy4S,EACJA,EAAahxT,EAAQ,YAAY8gU,CAAM,EACvC,IAAIE,EAASjX,GAAa7oS,EAAM,MAAO8vS,EAAYhxT,CAAO,EAC1D,GAAIkhB,EAAM,UAAW,CAGnB,IAAI+/S,EAAS,IAAMjhU,EAAQ,YAAW,EAAG,QACrCkhU,EAAS,IAAMlhU,EAAQ,YAAW,EAAG,QACzCghU,EAAO,OAASA,EAAO,OAASC,EAASA,EAASD,EAAO,OACzDA,EAAO,MAAQA,EAAO,MAAQE,EAASA,EAASF,EAAO,KACzD,CACAhQ,EAAahxT,EAAQ,YAAY+gU,CAAM,EACvC,IAAII,EAASpX,GAAa7oS,EAAM,MAAO8vS,EAAYhxT,CAAO,EACtDuL,EACA61T,EACAC,EACAngT,EAAM,YACJA,EAAM,SACRkgT,EAAYpgB,GAAc9/R,EAAM,QAASlhB,CAAO,EAChDuL,EAAOm7S,GAAa,YAAa1mT,EAASohU,CAAS,GAEnD71T,EAAOm7S,GAAa,YAAa1mT,CAAO,EAE1CohU,EAAY71T,EAAK,OACjB81T,EAAc91T,EAAK,SAEnBA,EAAO,KACP61T,EAAY,EACZC,EAAcrhU,EAAQ,YAAW,EAAG,sBAGtC,IAAIshU,EACArR,EACAsR,EACAhpT,EAAM,OAAS4mS,GAAQ,QAAQ,MACjCmiB,EAAWthU,EAAQ,YAAW,EAAG,KAC7BohU,EAAY,EACdnR,EAAY,EAAIoR,EAEhBpR,EAAY,EAAIoR,EAElBE,EAAavhU,EAAQ,YAAW,EAAG,SAE/BohU,EAAY,GACdE,EAAWthU,EAAQ,YAAW,EAAG,KACjCiwT,EAAYoR,IAEZC,EAAWthU,EAAQ,YAAW,EAAG,KACjCiwT,EAAY,EAAIoR,GAElBE,EAAavhU,EAAQ,YAAW,EAAG,QAErC,IAAIwnL,EACJ,GAAKj8K,EAmBE,CAEL,IAAI6qT,EAAap2T,EAAQ,YAAW,EAAG,WACnCshU,EAAWN,EAAO,OAAS5K,EAAa,GAAMgL,GAAanR,IAC7DqR,GAAYrR,GAAaqR,EAAWN,EAAO,OAAS5K,EAAa,GAAMgL,KAErEhL,EAAa,GAAMgL,GAAaD,EAAO,OAASI,GAActR,IAChEsR,GAActR,GAAamG,EAAa,GAAMgL,GAAaD,EAAO,OAASI,KAE7E,IAAIC,EAAW,EAAEpL,EAAa,GAAMgL,GACpC55I,EAAOy/H,GAAU,CACf,aAAc,kBACd,SAAU,CAAC,CACT,KAAM,OACN,KAAMka,EACN,MAAOI,CACf,EAAS,CACD,KAAM,OACN,KAAMh2T,EACN,MAAOi2T,CACf,EAAS,CACD,KAAM,OACN,KAAMR,EACN,MAAO,CAACM,CAChB,CAAO,CACP,CAAK,CACH,KA7CW,CAET,IAAIG,EAAqBH,EAAWN,EAAO,OAASG,EAAO,OAASI,GAChEE,EAAqBxR,IACvBqR,GAAY,IAAOrR,EAAYwR,GAC/BF,GAAc,IAAOtR,EAAYwR,IAEnCj6I,EAAOy/H,GAAU,CACf,aAAc,kBACd,SAAU,CAAC,CACT,KAAM,OACN,KAAMka,EACN,MAAOI,CACf,EAAS,CACD,KAAM,OACN,KAAMP,EACN,MAAO,CAACM,CAChB,CAAO,CACP,CAAK,CACH,CA6BAtQ,EAAahxT,EAAQ,YAAYuY,CAAK,EACtCivK,EAAK,QAAUwpI,EAAW,eAAiBhxT,EAAQ,eACnDwnL,EAAK,OAASwpI,EAAW,eAAiBhxT,EAAQ,eAElD,IAAI0hU,EACAnpT,EAAM,OAAS4mS,GAAQ,QAAQ,KACjCuiB,EAAY1hU,EAAQ,YAAW,EAAG,OACzBuY,EAAM,OAAS4mS,GAAQ,aAAa,KAC7CuiB,EAAY1hU,EAAQ,YAAYm/S,GAAQ,MAAM,EAAE,YAAW,EAAG,OAE9DuiB,EAAY1hU,EAAQ,YAAW,EAAG,OAEpC,IAAI04T,EACAG,EACJ,OAAI33S,EAAM,WAAa,KACrBw3S,EAAY/N,GAAkB3qT,EAAS,CAAC,OAAO,CAAC,EAEhD04T,EAAYX,GAAqB72S,EAAM,UAAWwgT,EAAW,GAAM1hU,EAAQ,YAAYuY,CAAK,EAAG2I,EAAM,KAAM,CAAC,OAAO,CAAC,EAElHA,EAAM,UACR23S,EAAarS,GAAS,CAAA,CAAE,EACftlS,EAAM,YAAc,KAC7B23S,EAAalO,GAAkB3qT,EAAS,CAAC,QAAQ,CAAC,EAElD64T,EAAad,GAAqB72S,EAAM,WAAYwgT,EAAW,GAAM1hU,EAAQ,YAAYuY,CAAK,EAAG2I,EAAM,KAAM,CAAC,QAAQ,CAAC,EAElHslS,GAAS,CAAC,MAAM,EAAE,OAAOwK,EAAW,cAAchxT,CAAO,CAAC,EAAG,CAAC04T,EAAWlS,GAAS,CAAC,OAAO,EAAG,CAACh/H,CAAI,CAAC,EAAGqxI,CAAU,EAAG74T,CAAO,CACnI,EACI2hU,IAAkB,CAACzgT,EAAOlhB,IAAY,CACxC,IAAIjL,EAAO,IAAIy2T,GAAS,QAAS,CAACW,GAAWjrS,EAAM,MAAOlhB,CAAO,EAAGmsT,GAAWjrS,EAAM,MAAOlhB,CAAO,CAAC,CAAC,EACrG,GAAI,CAACkhB,EAAM,WACTnsB,EAAK,aAAa,gBAAiB,KAAK,UAC/BmsB,EAAM,QAAS,CACxB,IAAIkgT,EAAYpgB,GAAc9/R,EAAM,QAASlhB,CAAO,EACpDjL,EAAK,aAAa,gBAAiBosT,GAAOigB,CAAS,CAAC,CACtD,CACA,GAAIlgT,EAAM,WAAa,MAAQA,EAAM,YAAc,KAAM,CACvD,IAAI0gT,EAAa,CAAA,EACjB,GAAI1gT,EAAM,WAAa,KAAM,CAC3B,IAAI2gT,EAAS,IAAIrW,GAAS,KAAM,CAAC,IAAIC,GAASvqS,EAAM,UAAU,QAAQ,KAAM,EAAE,CAAC,CAAC,CAAC,EACjF2gT,EAAO,aAAa,QAAS,MAAM,EACnCD,EAAW,KAAKC,CAAM,CACxB,CAEA,GADAD,EAAW,KAAK7sU,CAAI,EAChBmsB,EAAM,YAAc,KAAM,CAC5B,IAAI4gT,EAAU,IAAItW,GAAS,KAAM,CAAC,IAAIC,GAASvqS,EAAM,WAAW,QAAQ,KAAM,EAAE,CAAC,CAAC,CAAC,EACnF4gT,EAAQ,aAAa,QAAS,MAAM,EACpCF,EAAW,KAAKE,CAAO,CACzB,CACA,OAAOhW,GAAQ8V,CAAU,CAC3B,CACA,OAAO7sU,CACT,EACIgtU,GAAgB,CAACv6I,EAAMjvK,IAAU,CACnC,GAAI,CAACA,EACH,OAAOivK,EAET,IAAIwpF,EAAU,CACZ,KAAM,UACN,KAAMxpF,EAAK,KACX,MAAAjvK,EACA,KAAM,CAACivK,CAAI,CACf,EAEE,OAAOwpF,CACT,EACA+3C,GAAe,CACb,KAAM,UACN,MAAO,CAAC,UAAW,UAAW,SAAU,UAAW,WAAY,UAAW,WAAY,eAEtF,gBAAiB,eACnB,EACE,MAAO,CACL,QAAS,EACT,kBAAmB,EACvB,EACE,QAAS,CAACC,EAAM13O,IAAS,CACvB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQ3H,EACAgZ,EAAQ1wP,EAAK,CAAC,EACd8nK,EAAQ9nK,EAAK,CAAC,EACd2wP,EACAvJ,EAAY,KACZG,EAAa,KACjB,OAAQlI,EAAQ,CACd,IAAK,UACL,IAAK,UACL,IAAK,SACL,IAAK,UACHsR,EAAa,GACb,MACF,IAAK,eACHA,EAAa,GACb,MACF,IAAK,WACL,IAAK,UACL,IAAK,WACHA,EAAa,GACbvJ,EAAY,IACZG,EAAa,IACb,MACF,IAAK,gBACHoJ,EAAa,GACbvJ,EAAY,MACZG,EAAa,MACb,MACF,IAAK,gBACHoJ,EAAa,GACbvJ,EAAY,IACZG,EAAa,IACb,MACF,QACE,MAAM,IAAI,MAAM,8BAA8B,CACtD,CACI,IAAIqJ,EAAYvR,IAAa,UACzBp4S,EAAQ,KACZ,OAAI2pT,GAAavR,EAAS,WAAW,KAAK,EACxCp4S,EAAQ,UACCo4S,EAAS,WAAW,KAAK,IAClCp4S,EAAQ,QAEHwpT,GAAc,CACnB,KAAM,UACN,KAAMrR,EAAO,KACb,MAAAsR,EACA,MAAA5oF,EACA,UAAA8oF,EACA,WAAAD,EACA,UAAAvJ,EACA,WAAAG,EACA,QAAS,IACf,EAAOtgT,CAAK,CACV,EACA,YAAasoT,IACb,cAAec,GACjB,CAAC,EAGD5Y,GAAe,CACb,KAAM,QACN,MAAO,CAAC,SAAU,WAAY,SAAU,UAAW,SAAS,EAC5D,MAAO,CACL,QAAS,EACT,MAAO,EACX,EACE,QAAQK,EAAO,CACb,GAAI,CACF,OAAAsH,EACA,SAAAC,EACA,MAAA35T,CACN,EAAQoyT,EACA+Y,EACJ,OAAQxR,EAAQ,CACd,IAAK,SACHwR,EAAc,SACd,MACF,IAAK,WACHA,EAAc,UACd,MACF,IAAK,SACHA,EAAc,eACd,MACF,IAAK,UACHA,EAAc,gBACd,MACF,IAAK,UACHA,EAAc,gBACd,MACF,QACE,MAAM,IAAI,MAAM,oCAAoC,CAC5D,CACI,MAAO,CACL,KAAM,QACN,KAAMzR,EAAO,KACb,YAAAyR,EACA,MAAAnrU,CACN,CACE,CACF,CAAC,EACD,IAAIorU,GAAY,CAAC,UAAW,OAAQ,SAAU,cAAc,EACxDC,GAAiB,SAAwBC,EAAa,CACxD,IAAI/mB,EAAQ,KACZ,OAAI+mB,EAAY,OAAS,IACvB/mB,EAAQ+mB,EACR/mB,EAAQA,IAAU,IAAM,KAAOA,GAE1BA,CACT,EACAwN,GAAe,CACb,KAAM,UACN,MAAO,CAAC,WAAW,EACnB,MAAO,CACL,QAAS,EACT,kBAAmB,GACnB,SAAU,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAM,CAC7D,EACE,QAAQiJ,EAAO1gP,EAAM,CACnB,GAAI,CACF,OAAAo/O,CACN,EAAQsB,EACAgQ,EAAQ1wP,EAAK,CAAC,EACd8nK,EAAQ9nK,EAAK,CAAC,EAEdynP,EAAW1P,GAAkB/3O,EAAK,CAAC,CAAC,EACpConP,EAAYK,EAAS,OAAS,QAAUA,EAAS,SAAW,OAASsJ,GAAetJ,EAAS,IAAI,EAAI,KACrGC,EAAY3P,GAAkB/3O,EAAK,CAAC,CAAC,EACrCunP,EAAaG,EAAU,OAAS,QAAUA,EAAU,SAAW,QAAUqJ,GAAerJ,EAAU,IAAI,EAAI,KAC1GuJ,EAAUjT,GAAeh+O,EAAK,CAAC,EAAG,MAAM,EACxC2wP,EACAO,EAAU,KACVD,EAAQ,QAIVN,EAAa,IAEbO,EAAUD,EAAQ,MAClBN,EAAaO,EAAQ,OAAS,GAGhC,IAAI36U,EAAO,KACP46U,EAAOnxP,EAAK,CAAC,EACjB,GAAImxP,EAAK,OAAS,YAChB,GAAIA,EAAK,KAAK,OAAS,EAAG,CACxB,IAAIC,EAAUpT,GAAemT,EAAK,KAAK,CAAC,EAAG,SAAS,EACpD56U,EAAOu6U,GAAU,OAAOM,EAAQ,IAAI,CAAC,CACvC,OAEAD,EAAOnT,GAAemT,EAAM,SAAS,EACrC56U,EAAOu6U,GAAU,OAAOK,EAAK,IAAI,CAAC,EAEpC,OAAOV,GAAc,CACnB,KAAM,UACN,KAAMrR,EAAO,KACb,MAAAsR,EACA,MAAA5oF,EACA,UAAW,GACX,WAAA6oF,EACA,QAAAO,EACA,UAAA9J,EACA,WAAAG,CACN,EAAOhxU,CAAI,CACT,CACF,CAAC,EAEDkhU,GAAe,CACb,KAAM,QACN,MAAO,CAAC,SAAS,EACjB,MAAO,CACL,QAAS,EACT,SAAU,CAAC,MAAM,EACjB,MAAO,EACX,EACE,QAAQqL,EAAO9iP,EAAM,CACnB,GAAI,CACF,OAAAo/O,EACA,SAAAC,EACA,MAAA35T,CACN,EAAQo9T,EACJ,MAAO,CACL,KAAM,QACN,KAAM1D,EAAO,KACb,YAAa,gBACb,KAAMpB,GAAeh+O,EAAK,CAAC,EAAG,MAAM,EAAE,MACtC,MAAAt6E,CACN,CACE,CACF,CAAC,EACD+xT,GAAe,CACb,KAAM,UACN,MAAO,CAAC,eAAe,EACvB,MAAO,CACL,QAAS,EACT,SAAU,CAAC,OAAQ,OAAQ,MAAM,CACrC,EACE,QAAS,CAAC6Q,EAAOtoP,IAAS,CACxB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQiJ,EACAoI,EAAQ1wP,EAAK,CAAC,EACdkxP,EAAUlT,GAAeh+O,EAAK,CAAC,EAAG,OAAO,EAAE,KAC/C,GAAI,CAACkxP,EACH,MAAM,IAAI,MAAM,wCAA0C,OAAOA,CAAO,CAAC,EAE3E,IAAIppF,EAAQ9nK,EAAK,CAAC,EACd2wP,EAAaO,EAAQ,OAAS,EAClC,MAAO,CACL,KAAM,UACN,KAAM9R,EAAO,KACb,MAAAsR,EACA,MAAA5oF,EACA,UAAW,GACX,WAAA6oF,EACA,QAAAO,EACA,UAAW,KACX,WAAY,IAClB,CACE,CACF,CAAC,EAID,IAAIG,GAAgB,CAACxU,EAAKnuT,IAAY,CACpC,IAAIuY,EAAQvY,EAAQ,MAEhB4vT,EACA1uS,EACAitS,EAAI,OAAS,UAIfyB,EAAczB,EAAI,IAAMpE,GAAaoE,EAAI,IAAKnuT,EAAQ,YAAYuY,EAAM,IAAG,CAAE,EAAGvY,CAAO,EAAI+pT,GAAaoE,EAAI,IAAKnuT,EAAQ,YAAYuY,EAAM,KAAK,EAAGvY,CAAO,EAC1JkhB,EAAQouS,GAAenB,EAAI,KAAM,YAAY,GAE7CjtS,EAAQouS,GAAenB,EAAK,YAAY,EAG1C,IAAIrrU,EAAOinU,GAAa7oS,EAAM,KAAMlhB,EAAQ,gBAAgBm/S,GAAQ,OAAO,CAAC,EAExEyjB,EAAY5U,GAAY9sS,EAAOlhB,CAAO,EAGtC0nT,EAmCJ,GAlCIxmS,EAAM,QACRwmS,EAAQT,GAAU,CAChB,aAAc,gBACd,SAAU,CAAC,CACT,KAAM,OACN,KAAMnkU,CACd,EAAS,CACD,KAAM,OACN,KAAM,EACd,EAAS,CACD,KAAM,OACN,KAAM8/U,CACd,CAAO,CACP,CAAK,EAEDlb,EAAM,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,QAAQ,KAAK,WAAW,IAElEA,EAAQT,GAAU,CAChB,aAAc,SACd,aAAcnkU,EAAK,MAAQ,GAAM8/U,EAAU,OAC3C,SAAU,CAAC,CACT,KAAM,OACN,KAAMA,CACd,EAAS,CACD,KAAM,OACN,KAAM,EACd,EAAS,CACD,KAAM,OACN,KAAM9/U,CACd,CAAO,CACP,CAAK,EAED4kU,EAAM,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,QAAQ,KAAK,WAAW,GAEhEkI,EAAa,CAQf,IAAIiT,EAAQrc,GAAS,CAAC,SAAUtlS,EAAM,OAAS,QAAU,QAAQ,EAAG,CAACwmS,CAAK,EAAG1nT,CAAO,EAChFkhB,EAAM,OACRwmS,EAAQT,GAAU,CAChB,aAAc,gBACd,SAAU,CAAC,CACT,KAAM,OACN,KAAM4b,CAChB,EAAW,CACD,KAAM,OACN,KAAM,EAChB,EAAW,CACD,KAAM,OACN,KAAMjT,CAChB,CAAS,CACT,CAAO,EAEDlI,EAAQT,GAAU,CAChB,aAAc,SACd,aAAc4b,EAAM,MAAQ,GAAMjT,EAAY,OAASA,EAAY,MACnE,SAAU,CAAC,CACT,KAAM,OACN,KAAMA,CAChB,EAAW,CACD,KAAM,OACN,KAAM,EAChB,EAAW,CACD,KAAM,OACN,KAAMiT,CAChB,CAAS,CACT,CAAO,CAEL,CACA,OAAOrc,GAAS,CAAC,SAAUtlS,EAAM,OAAS,QAAU,QAAQ,EAAG,CAACwmS,CAAK,EAAG1nT,CAAO,CACjF,EACI8iU,IAAkB,CAAC5hT,EAAOlhB,IAAY,CACxC,IAAIswT,EAAazC,GAAe3sS,EAAM,KAAK,EAC3C,OAAO,IAAIsqS,GAAStqS,EAAM,OAAS,QAAU,SAAU,CAACirS,GAAWjrS,EAAM,KAAMlhB,CAAO,EAAGswT,CAAU,CAAC,CACtG,EAEAvH,GAAe,CACb,KAAM,aACN,MAAO,CAAC,cAAe,eAAgB,gBAAiB,gBAAgB,EACxE,MAAO,CACL,QAAS,CACb,EACE,QAAQC,EAAM13O,EAAM,CAClB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQ3H,EACJ,MAAO,CACL,KAAM,aACN,KAAM0H,EAAO,KACb,MAAOC,EACP,OAAQA,EAAS,SAAS,QAAQ,EAClC,KAAMr/O,EAAK,CAAC,CAClB,CACE,EACA,YAAaqxP,GACb,cAAeG,GACjB,CAAC,EAED/Z,GAAe,CACb,KAAM,OACN,MAAO,CAAC,QAAQ,EAChB,MAAO,CACL,QAAS,EACT,SAAU,CAAC,MAAO,UAAU,EAC5B,cAAe,EACnB,EACE,QAAS,CAACC,EAAM13O,IAAS,CACvB,GAAI,CACF,OAAAo/O,CACN,EAAQ1H,EACAlmU,EAAOwuF,EAAK,CAAC,EACbkvC,EAAO8uM,GAAeh+O,EAAK,CAAC,EAAG,KAAK,EAAE,IAC1C,OAAKo/O,EAAO,SAAS,UAAU,CAC7B,QAAS,SACT,IAAKlwM,CACX,CAAK,EAGM,CACL,KAAM,OACN,KAAMkwM,EAAO,KACb,KAAAlwM,EACA,KAAM8oM,GAAYxmU,CAAI,CAC5B,EAPa4tU,EAAO,qBAAqB,QAAQ,CAQ/C,EACA,YAAa,CAACxvS,EAAOlhB,IAAY,CAC/B,IAAI45M,EAAW+vG,GAAkBzoS,EAAM,KAAMlhB,EAAS,EAAK,EAC3D,OAAO2mT,IAAWzlS,EAAM,KAAM,CAAA,EAAI04L,EAAU55M,CAAO,CACrD,EACA,cAAe,CAACkhB,EAAOlhB,IAAY,CACjC,IAAI0jT,EAAO6I,GAAmBrrS,EAAM,KAAMlhB,CAAO,EACjD,OAAM0jT,aAAgB8H,KACpB9H,EAAO,IAAI8H,GAAS,OAAQ,CAAC9H,CAAI,CAAC,GAEpCA,EAAK,aAAa,OAAQxiS,EAAM,IAAI,EAC7BwiS,CACT,CACF,CAAC,EACDqF,GAAe,CACb,KAAM,OACN,MAAO,CAAC,OAAO,EACf,MAAO,CACL,QAAS,EACT,SAAU,CAAC,KAAK,EAChB,cAAe,EACnB,EACE,QAAS,CAACK,EAAO93O,IAAS,CACxB,GAAI,CACF,OAAAo/O,CACN,EAAQtH,EACA5oM,EAAO8uM,GAAeh+O,EAAK,CAAC,EAAG,KAAK,EAAE,IAC1C,GAAI,CAACo/O,EAAO,SAAS,UAAU,CAC7B,QAAS,QACT,IAAKlwM,CACX,CAAK,EACC,OAAOkwM,EAAO,qBAAqB,OAAO,EAG5C,QADIrqU,EAAQ,CAAA,EACHsC,EAAI,EAAGA,EAAI63H,EAAK,OAAQ73H,IAAK,CACpC,IAAI5G,EAAIy+H,EAAK73H,CAAC,EACV5G,IAAM,MACRA,EAAI,oBAENsE,EAAM,KAAK,CACT,KAAM,UACN,KAAM,OACN,KAAMtE,CACd,CAAO,CACH,CACA,IAAIe,EAAO,CACT,KAAM,OACN,KAAM4tU,EAAO,KACb,KAAM,WACN,KAAMrqU,CACZ,EACI,MAAO,CACL,KAAM,OACN,KAAMqqU,EAAO,KACb,KAAAlwM,EACA,KAAM8oM,GAAYxmU,CAAI,CAC5B,CACE,CACF,CAAC,EAMDimU,GAAe,CACb,KAAM,OACN,MAAO,CAAC,QAAQ,EAChB,MAAO,CACL,QAAS,EACT,SAAU,CAAC,MAAM,EACjB,cAAe,GACf,UAAW,EACf,EACE,QAAQC,EAAM13O,EAAM,CAClB,GAAI,CACF,OAAAo/O,CACN,EAAQ1H,EACJ,MAAO,CACL,KAAM,OACN,KAAM0H,EAAO,KACb,KAAMpH,GAAYh4O,EAAK,CAAC,CAAC,CAC/B,CACE,EACA,YAAYpwD,EAAOlhB,EAAS,CAC1B,IAAI45M,EAAW+vG,GAAkBzoS,EAAM,KAAMlhB,EAAS,EAAK,EAC3D,OAAOgmT,GAAapsG,CAAQ,CAC9B,EACA,cAAc14L,EAAOlhB,EAAS,CAC5B,OAAO,IAAIwrT,GAAS,OAAQS,GAAgB/qS,EAAM,KAAMlhB,CAAO,CAAC,CAClE,CACF,CAAC,EAED+oT,GAAe,CACb,KAAM,OACN,MAAO,CAAC,cAAe,WAAY,cAAe,YAAY,EAC9D,MAAO,CACL,QAAS,EACT,SAAU,CAAC,MAAO,UAAU,EAC5B,cAAe,EACnB,EACE,QAAS,CAACC,EAAM13O,IAAS,CACvB,GAAI,CACF,OAAAo/O,EACA,SAAAC,EACA,MAAA35T,CACN,EAAQgyT,EACAr5T,EAAQ2/T,GAAeh+O,EAAK,CAAC,EAAG,KAAK,EAAE,OACvCxuF,EAAOwuF,EAAK,CAAC,EACbo/O,EAAO,SAAS,QAClBA,EAAO,SAAS,gBAAgB,gBAAiB,2CAA2C,EAE9F,IAAIqS,EACAxkL,EAAa,CAAA,EACjB,OAAQoyK,EAAQ,CACd,IAAK,cACHpyK,EAAW,MAAQ5uJ,EACnBozU,EAAe,CACb,QAAS,cACT,MAAOpzU,CACjB,EACQ,MACF,IAAK,WACH4uJ,EAAW,GAAK5uJ,EAChBozU,EAAe,CACb,QAAS,WACT,GAAIpzU,CACd,EACQ,MACF,IAAK,cACH4uJ,EAAW,MAAQ5uJ,EACnBozU,EAAe,CACb,QAAS,cACT,MAAOpzU,CACjB,EACQ,MACF,IAAK,aACH,CAEE,QADItF,EAAOsF,EAAM,MAAM,GAAG,EACjBhH,EAAI,EAAGA,EAAI0B,EAAK,OAAQ1B,IAAK,CACpC,IAAIyR,EAAO/P,EAAK1B,CAAC,EACbq6U,EAAc5oU,EAAK,QAAQ,GAAG,EAClC,GAAI4oU,EAAc,EAChB,MAAM,IAAI/lB,GAAW,yBAA2B7iT,EAAO,uBAA4B,EAErF,IAAI7S,EAAM6S,EAAK,MAAM,EAAG4oU,CAAW,EAC/Bv2F,EAASryO,EAAK,MAAM4oU,EAAc,CAAC,EACvCzkL,EAAW,QAAUh3J,EAAI,KAAI,CAAE,EAAIklP,CACrC,CACAs2F,EAAe,CACb,QAAS,aACT,WAAAxkL,CACZ,EACU,KACF,CACF,QACE,MAAM,IAAI,MAAM,2BAA2B,CACnD,CACI,OAAKmyK,EAAO,SAAS,UAAUqS,CAAY,EAGpC,CACL,KAAM,OACN,KAAMrS,EAAO,KACb,WAAAnyK,EACA,KAAM+qK,GAAYxmU,CAAI,CAC5B,EAPa4tU,EAAO,qBAAqBC,CAAQ,CAQ/C,EACA,YAAa,CAACzvS,EAAOlhB,IAAY,CAC/B,IAAI45M,EAAW+vG,GAAkBzoS,EAAM,KAAMlhB,EAAS,EAAK,EACvDq7K,EAAU,CAAC,WAAW,EACtBn6J,EAAM,WAAW,OACnBm6J,EAAQ,KAAK,GAAGn6J,EAAM,WAAW,MAAM,KAAI,EAAG,MAAM,KAAK,CAAC,EAE5D,IAAIqpB,EAAOi8Q,GAASnrI,EAASu+B,EAAU55M,CAAO,EAC9C,QAASy+I,KAAQv9H,EAAM,WACjBu9H,IAAS,SAAWv9H,EAAM,WAAW,eAAeu9H,CAAI,GAC1Dl0G,EAAK,aAAak0G,EAAMv9H,EAAM,WAAWu9H,CAAI,CAAC,EAGlD,OAAOl0G,CACT,EACA,cAAe,CAACrpB,EAAOlhB,IACdusT,GAAmBrrS,EAAM,KAAMlhB,CAAO,CAEjD,CAAC,EAED+oT,GAAe,CACb,KAAM,aACN,MAAO,CAAC,eAAe,EACvB,MAAO,CACL,QAAS,EACT,kBAAmB,GACnB,cAAe,EACnB,EACE,QAAS,CAACC,EAAM13O,IAAS,CACvB,GAAI,CACF,OAAAo/O,CACN,EAAQ1H,EACJ,MAAO,CACL,KAAM,aACN,KAAM0H,EAAO,KACb,KAAMpH,GAAYh4O,EAAK,CAAC,CAAC,EACzB,OAAQg4O,GAAYh4O,EAAK,CAAC,CAAC,CACjC,CACE,EACA,YAAa,CAACpwD,EAAOlhB,IAAY,CAC/B,IAAI45M,EAAW+vG,GAAkBzoS,EAAM,KAAMlhB,EAAS,EAAK,EAC3D,OAAOgmT,GAAapsG,CAAQ,CAC9B,EACA,cAAe,CAAC14L,EAAOlhB,IACdusT,GAAmBrrS,EAAM,OAAQlhB,CAAO,CAEnD,CAAC,EAED,IAAIijU,GAAW,SAAkBv5T,EAAK,CACpC,GAAI,+BAA+B,KAAKA,CAAG,EAGzC,MAAO,CACL,OAAQ,CAACA,EACT,KAAM,IACZ,EAEI,IAAIioE,EAAQ,6CAA6C,KAAKjoE,CAAG,EACjE,GAAI,CAACioE,EACH,MAAM,IAAIsrO,GAAW,kBAAoBvzS,EAAM,wBAAwB,EAEzE,IAAIrf,EAAO,CACT,OAAQ,EAAEsnF,EAAM,CAAC,EAAIA,EAAM,CAAC,GAE5B,KAAMA,EAAM,CAAC,CACnB,EACI,GAAI,CAACovO,GAAU12T,CAAI,EACjB,MAAM,IAAI4yT,GAAW,kBAAoB5yT,EAAK,KAAO,yBAAyB,EAEhF,OAAOA,CAEX,EACA0+T,GAAe,CACb,KAAM,kBACN,MAAO,CAAC,mBAAmB,EAC3B,MAAO,CACL,QAAS,EACT,gBAAiB,EACjB,SAAU,CAAC,MAAO,KAAK,EACvB,cAAe,EACnB,EACE,QAAS,CAACC,EAAM13O,EAAMy/O,IAAY,CAChC,GAAI,CACF,OAAAL,CACN,EAAQ1H,EACA3uR,EAAQ,CACV,OAAQ,EACR,KAAM,IACZ,EACQ6c,EAAS,CACX,OAAQ,GACR,KAAM,IACZ,EACQgsR,EAAc,CAChB,OAAQ,EACR,KAAM,IACZ,EACQrhB,EAAM,GACV,GAAIkP,EAAQ,CAAC,EAIX,QAHIoS,EAAe7T,GAAeyB,EAAQ,CAAC,EAAG,KAAK,EAAE,OAEjDxyK,EAAa4kL,EAAa,MAAM,GAAG,EAC9Bx6U,EAAI,EAAGA,EAAI41J,EAAW,OAAQ51J,IAAK,CAC1C,IAAIy6U,EAAS7kL,EAAW51J,CAAC,EAAE,MAAM,GAAG,EACpC,GAAIy6U,EAAO,SAAW,EAAG,CACvB,IAAI15T,EAAM05T,EAAO,CAAC,EAAE,KAAI,EACxB,OAAQA,EAAO,CAAC,EAAE,KAAI,EAAE,CACtB,IAAK,MACHvhB,EAAMn4S,EACN,MACF,IAAK,QACH2wB,EAAQ4oS,GAASv5T,CAAG,EACpB,MACF,IAAK,SACHwtC,EAAS+rR,GAASv5T,CAAG,EACrB,MACF,IAAK,cACHw5T,EAAcD,GAASv5T,CAAG,EAC1B,MACF,QACE,MAAM,IAAIuzS,GAAW,iBAAmBmmB,EAAO,CAAC,EAAI,yBAAyB,CAC3F,CACQ,CACF,CAEF,IAAIrgU,EAAMusT,GAAeh+O,EAAK,CAAC,EAAG,KAAK,EAAE,IAOzC,OANIuwO,IAAQ,KAEVA,EAAM9+S,EACN8+S,EAAMA,EAAI,QAAQ,WAAY,EAAE,EAChCA,EAAMA,EAAI,UAAU,EAAGA,EAAI,YAAY,GAAG,CAAC,GAExC6O,EAAO,SAAS,UAAU,CAC7B,QAAS,oBACT,IAAK3tT,CACX,CAAK,EAGM,CACL,KAAM,kBACN,KAAM2tT,EAAO,KACb,IAAK7O,EACL,MAAOxnR,EACP,OAAQ6c,EACR,YAAagsR,EACb,IAAKngU,CACX,EAVa2tT,EAAO,qBAAqB,mBAAmB,CAW1D,EACA,YAAa,CAACxvS,EAAOlhB,IAAY,CAC/B,IAAIk3C,EAAS8pQ,GAAc9/R,EAAM,OAAQlhB,CAAO,EAC5CtX,EAAQ,EACRw4B,EAAM,YAAY,OAAS,IAC7Bx4B,EAAQs4T,GAAc9/R,EAAM,YAAalhB,CAAO,EAAIk3C,GAEtD,IAAI7c,EAAQ,EACRnZ,EAAM,MAAM,OAAS,IACvBmZ,EAAQ2mR,GAAc9/R,EAAM,MAAOlhB,CAAO,GAE5C,IAAIuY,EAAQ,CACV,OAAQ4oS,GAAOjqQ,EAASxuD,CAAK,CACnC,EACQ2xC,EAAQ,IACV9hB,EAAM,MAAQ4oS,GAAO9mR,CAAK,GAExB3xC,EAAQ,IACV6vB,EAAM,cAAgB4oS,GAAO,CAACz4T,CAAK,GAErC,IAAIqM,EAAO,IAAI6sT,IAAI1gS,EAAM,IAAKA,EAAM,IAAK3I,CAAK,EAC9C,OAAAxjB,EAAK,OAASmiD,EACdniD,EAAK,MAAQrM,EACNqM,CACT,EACA,cAAe,CAACmsB,EAAOlhB,IAAY,CACjC,IAAIjL,EAAO,IAAIy2T,GAAS,SAAU,CAAA,CAAE,EACpCz2T,EAAK,aAAa,MAAOmsB,EAAM,GAAG,EAClC,IAAIg2B,EAAS8pQ,GAAc9/R,EAAM,OAAQlhB,CAAO,EAC5CtX,EAAQ,EAMZ,GALIw4B,EAAM,YAAY,OAAS,IAC7Bx4B,EAAQs4T,GAAc9/R,EAAM,YAAalhB,CAAO,EAAIk3C,EACpDniD,EAAK,aAAa,SAAUosT,GAAO,CAACz4T,CAAK,CAAC,GAE5CqM,EAAK,aAAa,SAAUosT,GAAOjqQ,EAASxuD,CAAK,CAAC,EAC9Cw4B,EAAM,MAAM,OAAS,EAAG,CAC1B,IAAImZ,EAAQ2mR,GAAc9/R,EAAM,MAAOlhB,CAAO,EAC9CjL,EAAK,aAAa,QAASosT,GAAO9mR,CAAK,CAAC,CAC1C,CACA,OAAAtlC,EAAK,aAAa,MAAOmsB,EAAM,GAAG,EAC3BnsB,CACT,CACF,CAAC,EAIDg0T,GAAe,CACb,KAAM,OACN,MAAO,CAAC,SAAU,UAAW,UAAW,SAAS,EACjD,MAAO,CACL,QAAS,EACT,SAAU,CAAC,MAAM,EACjB,UAAW,GACX,cAAe,EACnB,EACE,QAAQC,EAAM13O,EAAM,CAClB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQ3H,EACAnhU,EAAOynU,GAAeh+O,EAAK,CAAC,EAAG,MAAM,EACzC,GAAIo/O,EAAO,SAAS,OAAQ,CAC1B,IAAI2S,EAAe1S,EAAS,CAAC,IAAM,IAC/B2S,EAASz7U,EAAK,MAAM,OAAS,KAC7Bw7U,GACGC,GACH5S,EAAO,SAAS,gBAAgB,kBAAmB,WAAaC,EAAW,6BAA+B,OAAS9oU,EAAK,MAAM,KAAO,SAAS,EAE5I6oU,EAAO,OAAS,QAClBA,EAAO,SAAS,gBAAgB,kBAAmB,WAAaC,EAAW,0BAA0B,GAInG2S,GACF5S,EAAO,SAAS,gBAAgB,kBAAmB,WAAaC,EAAW,2BAA2B,CAG5G,CACA,MAAO,CACL,KAAM,OACN,KAAMD,EAAO,KACb,UAAW7oU,EAAK,KACtB,CACE,EACA,YAAYq5B,EAAOlhB,EAAS,CAC1B,OAAO+nT,GAAS7mS,EAAM,UAAWlhB,CAAO,CAC1C,EACA,cAAckhB,EAAOlhB,EAAS,CAC5B,IAAIujU,EAAYviB,GAAc9/R,EAAM,UAAWlhB,CAAO,EACtD,OAAO,IAAI0rT,GAAU6X,CAAS,CAChC,CACF,CAAC,EAGDxa,GAAe,CACb,KAAM,MACN,MAAO,CAAC,aAAc,aAAc,YAAY,EAChD,MAAO,CACL,QAAS,EACT,cAAe,EACnB,EACE,QAAS,CAACC,EAAM13O,IAAS,CACvB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQ3H,EACAlmU,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,MACN,KAAMo/O,EAAO,KACb,UAAWC,EAAS,MAAM,CAAC,EAC3B,KAAA7tU,CACN,CACE,EACA,YAAa,CAACo+B,EAAOlhB,IAAY,CAE/B,IAAIotB,EACAlM,EAAM,YAAc,QAEtBkM,EAAQo5R,GAAS,CAAA,EAAI,CAACuD,GAAa7oS,EAAM,KAAMlhB,CAAO,CAAC,CAAC,EAExDotB,EAAQo5R,GAAS,CAAC,OAAO,EAAG,CAACp5R,CAAK,EAAGptB,CAAO,GAE5CotB,EAAQo5R,GAAS,CAAC,OAAO,EAAG,CAACuD,GAAa7oS,EAAM,KAAMlhB,CAAO,CAAC,CAAC,EAEjE,IAAIwjU,EAAMhd,GAAS,CAAC,KAAK,EAAG,CAAA,CAAE,EAC1BzxT,EAAOyxT,GAAS,CAACtlS,EAAM,SAAS,EAAG,CAACkM,EAAOo2S,CAAG,EAAGxjU,CAAO,EAMxDirT,EAAQzE,GAAS,CAAC,OAAO,CAAC,EAC9B,OAAAyE,EAAM,MAAM,OAAS9J,GAAOpsT,EAAK,OAASA,EAAK,KAAK,EAChDA,EAAK,QACPk2T,EAAM,MAAM,cAAgB9J,GAAO,CAACpsT,EAAK,KAAK,GAEhDA,EAAK,SAAS,QAAQk2T,CAAK,EAG3Bl2T,EAAOyxT,GAAS,CAAC,SAAS,EAAG,CAACzxT,CAAI,EAAGiL,CAAO,EACrCwmT,GAAS,CAAC,OAAQ,MAAM,EAAG,CAACzxT,CAAI,EAAGiL,CAAO,CACnD,EACA,cAAe,CAACkhB,EAAOlhB,IAAY,CAEjC,IAAIjL,EAAO,IAAIy2T,GAAS,UAAW,CAACW,GAAWjrS,EAAM,KAAMlhB,CAAO,CAAC,CAAC,EACpE,GAAIkhB,EAAM,YAAc,OAAQ,CAC9B,IAAIp4B,EAASo4B,EAAM,YAAc,OAAS,KAAO,OACjDnsB,EAAK,aAAa,SAAUjM,EAAS,OAAO,CAC9C,CACA,OAAAiM,EAAK,aAAa,QAAS,KAAK,EACzBA,CACT,CACF,CAAC,EAGDg0T,GAAe,CACb,KAAM,UACN,MAAO,CAAC,MAAO,GAAG,EAClB,MAAO,CACL,QAAS,EACT,cAAe,GACf,cAAe,EACnB,EACE,QAAQC,EAAM13O,EAAM,CAClB,GAAI,CACF,SAAAq/O,EACA,OAAAD,CACN,EAAQ1H,EACAya,EAAY/S,EAAO,KACvBA,EAAO,WAAW,MAAM,EACxB,IAAIx3Q,EAAQy3Q,IAAa,MAAQ,MAAQ,IACrC7tU,EAAO4tU,EAAO,gBAAgB,GAAOx3Q,CAAK,EAC9C,OAAAw3Q,EAAO,OAAOx3Q,CAAK,EACnBw3Q,EAAO,WAAW+S,CAAS,EACpB,CACL,KAAM,UACN,KAAM/S,EAAO,KACb,MAAO,OACP,KAAA5tU,CACN,CACE,CACF,CAAC,EAEDimU,GAAe,CACb,KAAM,OAEN,MAAO,CAAC,MAAO,KAAK,EACpB,MAAO,CACL,QAAS,EACT,cAAe,GACf,cAAe,EACnB,EACE,QAAQlkM,EAASvzC,EAAM,CACrB,MAAM,IAAI2rO,GAAW,cAAgBp4L,EAAQ,QAAQ,CACvD,CACF,CAAC,EAED,IAAI6+M,GAAkB,CAACxiT,EAAOlhB,IAAY,CACxC,OAAQA,EAAQ,MAAM,KAAI,CACxB,KAAKm/S,GAAQ,QAAQ,KACnB,OAAOj+R,EAAM,QACf,KAAKi+R,GAAQ,KAAK,KAChB,OAAOj+R,EAAM,KACf,KAAKi+R,GAAQ,OAAO,KAClB,OAAOj+R,EAAM,OACf,KAAKi+R,GAAQ,aAAa,KACxB,OAAOj+R,EAAM,aACf,QACE,OAAOA,EAAM,IACnB,CACA,EACA6nS,GAAe,CACb,KAAM,aACN,MAAO,CAAC,cAAc,EACtB,MAAO,CACL,QAAS,EACT,UAAW,EACf,EACE,QAAS,CAACC,EAAM13O,IAAS,CACvB,GAAI,CACF,OAAAo/O,CACN,EAAQ1H,EACJ,MAAO,CACL,KAAM,aACN,KAAM0H,EAAO,KACb,QAASpH,GAAYh4O,EAAK,CAAC,CAAC,EAC5B,KAAMg4O,GAAYh4O,EAAK,CAAC,CAAC,EACzB,OAAQg4O,GAAYh4O,EAAK,CAAC,CAAC,EAC3B,aAAcg4O,GAAYh4O,EAAK,CAAC,CAAC,CACvC,CACE,EACA,YAAa,CAACpwD,EAAOlhB,IAAY,CAC/B,IAAIld,EAAO4gV,GAAgBxiT,EAAOlhB,CAAO,EACrC45M,EAAW+vG,GAAkB7mU,EAAMkd,EAAS,EAAK,EACrD,OAAOgmT,GAAapsG,CAAQ,CAC9B,EACA,cAAe,CAAC14L,EAAOlhB,IAAY,CACjC,IAAIld,EAAO4gV,GAAgBxiT,EAAOlhB,CAAO,EACzC,OAAOusT,GAAmBzpU,EAAMkd,CAAO,CACzC,CACF,CAAC,EAGD,IAAI2jU,GAAiB,CAAC9jV,EAAM+jV,EAAUC,EAAU7jU,EAASuY,EAAOurT,EAAOC,IAAc,CACnFlkV,EAAO2mU,GAAS,GAAI,CAAC3mU,CAAI,CAAC,EAC1B,IAAImkV,EAAuBH,GAAYpmB,GAAeomB,CAAQ,EAC1DnsU,EACA8mT,EAGJ,GAAIolB,EAAU,CACZ,IAAI91E,EAAOi8D,GAAa6Z,EAAU5jU,EAAQ,YAAYuY,EAAM,KAAK,EAAGvY,CAAO,EAC3Ew+S,EAAM,CACJ,KAAA1wD,EACA,KAAM,KAAK,IAAI9tP,EAAQ,YAAW,EAAG,cAAeA,EAAQ,YAAW,EAAG,cAAgB8tP,EAAK,KAAK,CAC1G,CACE,CACA,GAAI+1E,EAAU,CACZ,IAAIrc,EAAQuC,GAAa8Z,EAAU7jU,EAAQ,YAAYuY,EAAM,KAAK,EAAGvY,CAAO,EAC5EtI,EAAM,CACJ,KAAM8vT,EACN,KAAM,KAAK,IAAIxnT,EAAQ,YAAW,EAAG,cAAeA,EAAQ,YAAW,EAAG,cAAgBwnT,EAAM,MAAM,CAC5G,CACE,CAGA,IAAIyc,EACJ,GAAIzlB,GAAO9mT,EAAK,CACd,IAAIo3C,EAAS9uC,EAAQ,YAAW,EAAG,cAAgBtI,EAAI,KAAK,OAASA,EAAI,KAAK,MAAQA,EAAI,KAAO7X,EAAK,MAAQkkV,EAC9GE,EAAahd,GAAU,CACrB,aAAc,SACd,aAAcn4Q,EACd,SAAU,CAAC,CACT,KAAM,OACN,KAAM9uC,EAAQ,cAAc,aACpC,EAAS,CACD,KAAM,OACN,KAAMtI,EAAI,KACV,WAAYypT,GAAO,CAAC2iB,CAAK,CACjC,EAAS,CACD,KAAM,OACN,KAAMpsU,EAAI,IAClB,EAAS,CACD,KAAM,OACN,KAAM7X,CACd,EAAS,CACD,KAAM,OACN,KAAM2+T,EAAI,IAClB,EAAS,CACD,KAAM,OACN,KAAMA,EAAI,KACV,WAAY2C,GAAO2iB,CAAK,CAChC,EAAS,CACD,KAAM,OACN,KAAM9jU,EAAQ,cAAc,aACpC,CAAO,CACP,CAAK,CACH,SAAWtI,EAAK,CACd,IAAIoe,EAAMj2B,EAAK,OAASkkV,EAKxBE,EAAahd,GAAU,CACrB,aAAc,MACd,aAAcnxS,EACd,SAAU,CAAC,CACT,KAAM,OACN,KAAM9V,EAAQ,cAAc,aACpC,EAAS,CACD,KAAM,OACN,KAAMtI,EAAI,KACV,WAAYypT,GAAO,CAAC2iB,CAAK,CACjC,EAAS,CACD,KAAM,OACN,KAAMpsU,EAAI,IAClB,EAAS,CACD,KAAM,OACN,KAAM7X,CACd,CAAO,CACP,CAAK,CACH,SAAW2+T,EAAK,CACd,IAAIn3B,EAAUxnS,EAAK,MAAQkkV,EAC3BE,EAAahd,GAAU,CACrB,aAAc,SACd,aAAc5/B,EACd,SAAU,CAAC,CACT,KAAM,OACN,KAAMxnS,CACd,EAAS,CACD,KAAM,OACN,KAAM2+T,EAAI,IAClB,EAAS,CACD,KAAM,OACN,KAAMA,EAAI,KACV,WAAY2C,GAAO2iB,CAAK,CAChC,EAAS,CACD,KAAM,OACN,KAAM9jU,EAAQ,cAAc,aACpC,CAAO,CACP,CAAK,CACH,KAIE,QAAOngB,EAET,IAAI+F,EAAQ,CAACq+U,CAAU,EACvB,GAAIvsU,GAAOosU,IAAU,GAAK,CAACE,EAAsB,CAG/C,IAAIE,EAAS1d,GAAS,CAAC,QAAQ,EAAG,CAAA,EAAIxmT,CAAO,EAC7CkkU,EAAO,MAAM,YAAc/iB,GAAO2iB,CAAK,EACvCl+U,EAAM,QAAQs+U,CAAM,CACtB,CACA,OAAO1d,GAAS,CAAC,MAAO,WAAW,EAAG5gU,EAAOoa,CAAO,CACtD,EAIImkU,GAAc,IAAI,IAAI,CAAC,YAAY,CAAC,EAGpCC,GAAgB,CAACjW,EAAKnuT,IAAY,CAEpC,IAAI4jU,EACAC,EACAQ,EAAY,GACZnjT,EACAitS,EAAI,OAAS,UAIfyV,EAAWzV,EAAI,IACf0V,EAAW1V,EAAI,IACfjtS,EAAQouS,GAAenB,EAAI,KAAM,IAAI,EACrCkW,EAAY,IAEZnjT,EAAQouS,GAAenB,EAAK,IAAI,EAElC,IAAI51S,EAAQvY,EAAQ,MAChBskU,EAAQ,GACR/rT,EAAM,OAAS4mS,GAAQ,QAAQ,MAAQj+R,EAAM,QAAU,CAACijT,GAAY,IAAIjjT,EAAM,IAAI,IAEpFojT,EAAQ,IAEV,IAAIzkV,EACJ,GAAIqhC,EAAM,OAAQ,CAEhB,IAAI8hS,EAAWshB,EAAQ,gBAAkB,gBACrCC,EAAQ,GAQZ,IAPIrjT,EAAM,OAAS,WAAaA,EAAM,OAAS,cAG7CqjT,EAAQrjT,EAAM,KAAK,MAAM,CAAC,EAC1BA,EAAM,KAAOqjT,IAAU,QAAU,SAAW,WAE9C1kV,EAAOulU,GAAWlkS,EAAM,KAAM8hS,EAAU,OAAQhjT,EAAS,CAAC,MAAO,YAAaskU,EAAQ,WAAa,UAAU,CAAC,EAC1GC,EAAM,OAAS,EAAG,CAGpB,IAAI1sE,EAASh4Q,EAAK,OACd2kV,EAAOnc,GAAUkc,EAAQ,QAAUD,EAAQ,IAAM,KAAMtkU,CAAO,EAClEngB,EAAOonU,GAAU,CACf,aAAc,kBACd,SAAU,CAAC,CACT,KAAM,OACN,KAAMpnU,EACN,MAAO,CACjB,EAAW,CACD,KAAM,OACN,KAAM2kV,EACN,MAAOF,EAAQ,IAAO,CAChC,CAAS,CACT,CAAO,EACDpjT,EAAM,KAAO,KAAOqjT,EACpB1kV,EAAK,QAAQ,QAAQ,KAAK,EAE1BA,EAAK,OAASg4Q,CAChB,CACF,SAAW32O,EAAM,KAAM,CAErB,IAAIkM,EAAQu8R,GAAkBzoS,EAAM,KAAMlhB,EAAS,EAAI,EACnDotB,EAAM,SAAW,GAAKA,EAAM,CAAC,YAAa20R,IAC5CliU,EAAOutC,EAAM,CAAC,EACdvtC,EAAK,QAAQ,CAAC,EAAI,OAElBA,EAAO2mU,GAAS,CAAC,KAAK,EAAGp5R,EAAOptB,CAAO,CAE3C,KAAO,CAIL,QADIoqN,EAAS,CAAA,EACJzhO,EAAI,EAAGA,EAAIu4B,EAAM,KAAK,OAAQv4B,IACrCyhO,EAAO,KAAKk7F,GAAQpkS,EAAM,KAAKv4B,CAAC,EAAGu4B,EAAM,KAAMlhB,CAAO,CAAC,EAEzDngB,EAAO2mU,GAAS,CAAC,KAAK,EAAGp8F,EAAQpqN,CAAO,CAC1C,CAEA,IAAI+jU,EAAY,EACZD,EAAQ,EAaZ,OAZKjkV,aAAgBkiU,IAAc7gS,EAAM,OAAS,WAAaA,EAAM,OAAS,aAAe,CAACA,EAAM,oBAOlG6iT,GAAalkV,EAAK,OAASA,EAAK,OAAS,EAAImgB,EAAQ,YAAW,EAAG,WAGnE8jU,EAAQjkV,EAAK,QAAU,GAErBwkV,EACKV,GAAe9jV,EAAM+jV,EAAUC,EAAU7jU,EAASuY,EAAOurT,EAAOC,CAAS,GAE5EA,IACFlkV,EAAK,MAAM,SAAW,WACtBA,EAAK,MAAM,IAAMshU,GAAO4iB,CAAS,GAE5BlkV,EAEX,EACI4kV,GAAkB,CAACvjT,EAAOlhB,IAAY,CACxC,IAAIjL,EACJ,GAAImsB,EAAM,OAERnsB,EAAO,IAAIy2T,GAAS,KAAM,CAACK,GAAS3qS,EAAM,KAAMA,EAAM,IAAI,CAAC,CAAC,EACxDijT,GAAY,IAAIjjT,EAAM,IAAI,GAC5BnsB,EAAK,aAAa,UAAW,OAAO,UAE7BmsB,EAAM,KAEfnsB,EAAO,IAAIy2T,GAAS,KAAMS,GAAgB/qS,EAAM,KAAMlhB,CAAO,CAAC,MACzD,CAGLjL,EAAO,IAAIy2T,GAAS,KAAM,CAAC,IAAIC,GAASvqS,EAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,EAG7D,IAAIuxK,EAAW,IAAI+4H,GAAS,KAAM,CAACK,GAAS,IAAU,MAAM,CAAC,CAAC,EAC1D3qS,EAAM,eACRnsB,EAAO,IAAIy2T,GAAS,OAAQ,CAACz2T,EAAM09L,CAAQ,CAAC,EAE5C19L,EAAOw2T,GAAoB,CAACx2T,EAAM09L,CAAQ,CAAC,CAE/C,CACA,OAAO19L,CACT,EACI2vU,IAAmB,CACrB,IAAU,SACV,IAAU,WACV,IAAU,QACV,IAAU,aACV,IAAU,WACV,IAAU,WACV,IAAU,WACV,IAAU,YACV,IAAU,aACV,IAAU,cACV,IAAU,aACV,IAAU,YACZ,EACA3b,GAAe,CACb,KAAM,KACN,MAAO,CAAC,WAAY,WAAY,aAAc,aAAc,WAAY,WAAY,UAAW,SAAU,QAAS,cAAe,aAAc,YAAa,aAAc,aAAc,IAAU,IAAU,IAAU,IAAU,IAAU,IAAU,IAAU,IAAU,IAAU,IAAU,IAAU,GAAQ,EAC9S,MAAO,CACL,QAAS,CACb,EACE,QAAS,CAACC,EAAM13O,IAAS,CACvB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQ3H,EACA2b,EAAQhU,EACZ,OAAIgU,EAAM,SAAW,IACnBA,EAAQD,IAAiBC,CAAK,GAEzB,CACL,KAAM,KACN,KAAMjU,EAAO,KACb,OAAQ,GACR,eAAgB,GAChB,OAAQ,GACR,KAAMiU,CACZ,CACE,EACA,YAAaP,GACb,cAAeK,EACjB,CAAC,EAGD1b,GAAe,CACb,KAAM,KACN,MAAO,CAAC,UAAU,EAClB,MAAO,CACL,QAAS,EACT,UAAW,EACf,EACE,QAAS,CAACK,EAAO93O,IAAS,CACxB,GAAI,CACF,OAAAo/O,CACN,EAAQtH,EACAtmU,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,KACN,KAAMo/O,EAAO,KACb,OAAQ,GACR,eAAgB,GAChB,OAAQ,GACR,KAAMpH,GAAYxmU,CAAI,CAC5B,CACE,EACA,YAAashV,GACb,cAAeK,EACjB,CAAC,EAID,IAAIG,IAAsB,CACxB,IAAU,QACV,IAAU,SACV,IAAU,UACV,IAAU,SACV,IAAU,UACV,IAAU,UACZ,EAEA7b,GAAe,CACb,KAAM,KACN,MAAO,CAAC,WAAY,WAAY,WAAY,UAAW,WAAY,QAAS,OAAQ,QAAS,UAAW,SAAU,QAAS,SAAU,SAAU,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAQ,OAAQ,QAAS,QAAS,QAAS,SAAU,OAAQ,QAAS,SAAU,OAAQ,MAAM,EACrT,MAAO,CACL,QAAS,CACb,EACE,QAAQiJ,EAAO,CACb,GAAI,CACF,OAAAtB,EACA,SAAAC,CACN,EAAQqB,EACJ,MAAO,CACL,KAAM,KACN,KAAMtB,EAAO,KACb,OAAQ,GACR,eAAgB,GAChB,OAAQ,GACR,KAAMC,CACZ,CACE,EACA,YAAayT,GACb,cAAeK,EACjB,CAAC,EAED1b,GAAe,CACb,KAAM,KACN,MAAO,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAQ,OAAO,EAC7E,MAAO,CACL,QAAS,CACb,EACE,QAAQqL,EAAO,CACb,GAAI,CACF,OAAA1D,EACA,SAAAC,CACN,EAAQyD,EACJ,MAAO,CACL,KAAM,KACN,KAAM1D,EAAO,KACb,OAAQ,GACR,eAAgB,GAChB,OAAQ,GACR,KAAMC,CACZ,CACE,EACA,YAAayT,GACb,cAAeK,EACjB,CAAC,EAED1b,GAAe,CACb,KAAM,KACN,MAAO,CAAC,QAAS,SAAU,UAAW,SAAU,UAAW,WAAY,IAAU,IAAU,IAAU,IAAU,IAAU,GAAQ,EACjI,MAAO,CACL,QAAS,EACT,kBAAmB,EACvB,EACE,QAAQ6Q,EAAO,CACb,GAAI,CACF,OAAAlJ,EACA,SAAAC,CACN,EAAQiJ,EACA+K,EAAQhU,EACZ,OAAIgU,EAAM,SAAW,IACnBA,EAAQC,IAAoBD,CAAK,GAE5B,CACL,KAAM,KACN,KAAMjU,EAAO,KACb,OAAQ,GACR,eAAgB,GAChB,OAAQ,GACR,KAAMiU,CACZ,CACE,EACA,YAAaP,GACb,cAAeK,EACjB,CAAC,EAKD,IAAII,GAAgB,CAAC1W,EAAKnuT,IAAY,CAEpC,IAAI4jU,EACAC,EACAQ,EAAY,GACZnjT,EACAitS,EAAI,OAAS,UAIfyV,EAAWzV,EAAI,IACf0V,EAAW1V,EAAI,IACfjtS,EAAQouS,GAAenB,EAAI,KAAM,cAAc,EAC/CkW,EAAY,IAEZnjT,EAAQouS,GAAenB,EAAK,cAAc,EAE5C,IAAItuU,EACJ,GAAIqhC,EAAM,KAAK,OAAS,EAAG,CAezB,QAdIp+B,EAAOo+B,EAAM,KAAK,IAAIolC,GAAS,CACjC,IAAIw+Q,EAAY,SAAUx+Q,EAAQA,EAAM,KAAO,OAC/C,OAAI,OAAOw+Q,GAAc,SAChB,CACL,KAAM,UACN,KAAMx+Q,EAAM,KACZ,KAAMw+Q,CAChB,EAEex+Q,CAEX,CAAC,EAEGsjQ,EAAaD,GAAkB7mU,EAAMkd,EAAQ,SAAS,QAAQ,EAAG,EAAI,EAChErX,EAAI,EAAGA,EAAIihU,EAAW,OAAQjhU,IAAK,CAC1C,IAAI29D,EAAQsjQ,EAAWjhU,CAAC,EACpB29D,aAAiBy7P,KAGnBz7P,EAAM,KAAOA,EAAM,KAAK,QAAQ,SAAU,GAAG,EAAE,QAAQ,SAAU,GAAG,EAExE,CACAzmE,EAAO2mU,GAAS,CAAC,KAAK,EAAGoD,EAAY5pT,CAAO,CAC9C,MACEngB,EAAO2mU,GAAS,CAAC,KAAK,EAAG,CAAA,EAAIxmT,CAAO,EAEtC,OAAIqkU,EACKV,GAAe9jV,EAAM+jV,EAAUC,EAAU7jU,EAASA,EAAQ,MAAO,EAAG,CAAC,EAErEngB,CAEX,EACIqpU,IAAgB,CAAChoS,EAAOlhB,IAAY,CAKtC,QAHI4pT,EAAaqC,GAAgB/qS,EAAM,KAAMlhB,EAAQ,SAAS,QAAQ,CAAC,EAEnE+kU,EAAc,GACT,EAAI,EAAG,EAAInb,EAAW,OAAQ,IAAK,CAC1C,IAAI70T,EAAO60T,EAAW,CAAC,EACvB,GAAI,EAAA70T,aAAgB22T,IAAkB,GAAI32T,aAAgBy2T,GACxD,OAAQz2T,EAAK,KAAI,CACf,IAAK,KACL,IAAK,KACL,IAAK,SACL,IAAK,QACH,MAEF,IAAK,KACH,CACE,IAAIuxD,EAAQvxD,EAAK,SAAS,CAAC,EACvBA,EAAK,SAAS,SAAW,GAAKuxD,aAAiBmlQ,GACjDnlQ,EAAM,KAAOA,EAAM,KAAK,QAAQ,SAAU,GAAG,EAAE,QAAQ,SAAU,GAAG,EAEpEy+Q,EAAc,GAEhB,KACF,CACF,QACEA,EAAc,EACxB,MAEMA,EAAc,EAElB,CACA,GAAIA,EAAa,CAEf,IAAIn+J,EAAOgjJ,EAAW,IAAI70T,GAAQA,EAAK,OAAM,CAAE,EAAE,KAAK,EAAE,EACxD60T,EAAa,CAAC,IAAI6B,GAAS7kJ,CAAI,CAAC,CAClC,CACA,IAAIgsB,EAAa,IAAI44H,GAAS,KAAM5B,CAAU,EAC9Ch3H,EAAW,aAAa,cAAe,QAAQ,EAG/C,IAAIH,EAAW,IAAI+4H,GAAS,KAAM,CAACK,GAAS,IAAU,MAAM,CAAC,CAAC,EAC9D,OAAI3qS,EAAM,eACD,IAAIsqS,GAAS,OAAQ,CAAC54H,EAAYH,CAAQ,CAAC,EAE3C84H,GAAoB,CAAC34H,EAAYH,CAAQ,CAAC,CAErD,EAGAs2H,GAAe,CACb,KAAM,eACN,MAAO,CAAC,kBAAmB,0BAA0B,EACrD,MAAO,CACL,QAAS,CACb,EACE,QAAS,CAACC,EAAM13O,IAAS,CACvB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQ3H,EACAlmU,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,eACN,KAAMo/O,EAAO,KACb,KAAMpH,GAAYxmU,CAAI,EACtB,mBAAoB6tU,IAAa,2BACjC,OAAQ,GACR,eAAgB,EACtB,CACE,EACA,YAAakU,GACb,cAAA3b,GACF,CAAC,EACD+Q,GAAY,iBAAkB,kDAAkD,EAEhF9Q,GAAuB,CACrB,KAAM,WACN,YAAYjoS,EAAOlhB,EAAS,CAC1B,OAAIkhB,EAAM,WACD8kS,GAAa2D,GAAkBzoS,EAAM,KAAMlhB,EAAS,EAAK,CAAC,EAE5DwmT,GAAS,CAAC,MAAM,EAAGmD,GAAkBzoS,EAAM,KAAMlhB,EAAS,EAAI,EAAGA,CAAO,CACjF,EACA,cAAckhB,EAAOlhB,EAAS,CAC5B,OAAOusT,GAAmBrrS,EAAM,KAAMlhB,EAAS,EAAI,CACrD,CACF,CAAC,EAED+oT,GAAe,CACb,KAAM,WACN,MAAO,CAAC,YAAY,EACpB,MAAO,CACL,QAAS,CACb,EACE,QAAQC,EAAM13O,EAAM,CAClB,GAAI,CACF,OAAAo/O,CACN,EAAQ1H,EACAlmU,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,WACN,KAAMo/O,EAAO,KACb,KAAA5tU,CACN,CACE,EACA,YAAYo+B,EAAOlhB,EAAS,CAG1B,IAAI4wT,EAAa7G,GAAa7oS,EAAM,KAAMlhB,EAAQ,oBAAoB,EAElEywC,EAAOi2Q,GAAa,gBAAiB1mT,CAAO,EAE5CglU,EAAuBhlU,EAAQ,YAAW,EAAG,qBAC7C0nT,EAAQT,GAAU,CACpB,aAAc,gBACd,SAAU,CAAC,CACT,KAAM,OACN,KAAM2J,CACd,EAAS,CACD,KAAM,OACN,KAAM,EAAIoU,CAClB,EAAS,CACD,KAAM,OACN,KAAMv0R,CACd,EAAS,CACD,KAAM,OACN,KAAMu0R,CACd,CAAO,CACP,CAAK,EACD,OAAOxe,GAAS,CAAC,OAAQ,UAAU,EAAG,CAACkB,CAAK,EAAG1nT,CAAO,CACxD,EACA,cAAckhB,EAAOlhB,EAAS,CAC5B,IAAIyyL,EAAW,IAAI+4H,GAAS,KAAM,CAAC,IAAIC,GAAS,GAAQ,CAAC,CAAC,EAC1Dh5H,EAAS,aAAa,WAAY,MAAM,EACxC,IAAI19L,EAAO,IAAIy2T,GAAS,QAAS,CAACW,GAAWjrS,EAAM,KAAMlhB,CAAO,EAAGyyL,CAAQ,CAAC,EAC5E,OAAA19L,EAAK,aAAa,SAAU,MAAM,EAC3BA,CACT,CACF,CAAC,EAEDg0T,GAAe,CACb,KAAM,UACN,MAAO,CAAC,WAAW,EACnB,MAAO,CACL,QAAS,EACT,cAAe,EACnB,EACE,QAAS,CAACC,EAAM13O,IAAS,CACvB,GAAI,CACF,OAAAo/O,CACN,EAAQ1H,EACAlmU,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,UACN,KAAMo/O,EAAO,KACb,KAAMpH,GAAYxmU,CAAI,CAC5B,CACE,EACA,YAAa,CAACo+B,EAAOlhB,IAAY,CAC/B,IAAI45M,EAAW+vG,GAAkBzoS,EAAM,KAAMlhB,EAAQ,YAAW,EAAI,EAAK,EAGzE,OAAOgmT,GAAapsG,CAAQ,CAC9B,EACA,cAAe,CAAC14L,EAAOlhB,IAAY,CACjC,IAAIotB,EAAQ6+R,GAAgB/qS,EAAM,KAAMlhB,CAAO,EAC/C,OAAO,IAAIwrT,GAAS,WAAYp+R,CAAK,CACvC,CACF,CAAC,EACD6sS,GAAY,aAAc,wBAAwB,EAClDlR,GAAe,CACb,KAAM,WACN,MAAO,CAAC,YAAY,EACpB,MAAO,CACL,QAAS,EACT,cAAe,EACnB,EACE,QAAS,CAACK,EAAO93O,IAAS,CACxB,GAAI,CACF,OAAAo/O,CACN,EAAQtH,EACAtmU,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,WACN,KAAMo/O,EAAO,KACb,KAAA5tU,CACN,CACE,EACA,YAAa,CAACo+B,EAAOlhB,IAAY,CAC/B,IAAIotB,EAAQo5R,GAAS,CAAC,OAAO,EAAG,CAACuD,GAAa7oS,EAAM,KAAMlhB,EAAQ,YAAW,CAAE,CAAC,CAAC,EAC7EwjU,EAAMhd,GAAS,CAAC,KAAK,EAAG,CAAA,CAAE,EAC9B,OAAOA,GAAS,CAAC,OAAQ,MAAM,EAAG,CAACp5R,EAAOo2S,CAAG,EAAGxjU,CAAO,CACzD,EACA,cAAe,CAACkhB,EAAOlhB,IAAY,CACjC,IAAIotB,EAAQ6+R,GAAgB3C,GAAYpoS,EAAM,IAAI,EAAGlhB,CAAO,EACxDilU,EAAU,IAAIzZ,GAAS,WAAYp+R,CAAK,EACxCr4B,EAAO,IAAIy2T,GAAS,UAAW,CAACyZ,CAAO,CAAC,EAC5C,OAAAlwU,EAAK,aAAa,QAAS,KAAK,EACzBA,CACT,CACF,CAAC,EAGDg0T,GAAe,CACb,KAAM,WACN,MAAO,CAAC,YAAY,EACpB,MAAO,CACL,QAAS,EACT,SAAU,CAAC,OAAQ,MAAM,EACzB,cAAe,EACnB,EACE,QAAQC,EAAM13O,EAAM,CAClB,GAAI,CACF,OAAAo/O,CACN,EAAQ1H,EACAkc,EAAS5V,GAAeh+O,EAAK,CAAC,EAAG,MAAM,EAAE,MACzCxuF,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,WACN,KAAMo/O,EAAO,KACb,GAAIwU,EACJ,KAAApiV,CACN,CACE,EACA,YAAYo+B,EAAOlhB,EAAS,CAC1B,IAAIld,EAAOinU,GAAa7oS,EAAM,KAAMlhB,CAAO,EACvCu1D,EAAKyrP,GAAc9/R,EAAM,GAAIlhB,CAAO,EACxC,OAAOinT,GAAU,CACf,aAAc,QACd,aAAc,CAAC1xP,EACf,SAAU,CAAC,CACT,KAAM,OACN,KAAMzyE,CACd,CAAO,CACP,CAAK,CACH,EACA,cAAco+B,EAAOlhB,EAAS,CAC5B,IAAIjL,EAAO,IAAIy2T,GAAS,UAAW,CAACW,GAAWjrS,EAAM,KAAMlhB,CAAO,CAAC,CAAC,EAChEu1D,EAAKr0C,EAAM,GAAG,OAASA,EAAM,GAAG,KACpC,OAAAnsB,EAAK,aAAa,UAAWwgE,CAAE,EACxBxgE,CACT,CACF,CAAC,EAEDg0T,GAAe,CACb,KAAM,WACN,MAAO,CAAC,SAAS,EACjB,MAAO,CACL,QAAS,EACT,cAAe,GACf,kBAAmB,EACvB,EACE,QAAQC,EAAM,CACZ,GAAI,CACF,OAAA0H,CACN,EAAQ1H,EACJ,MAAO,CACL,KAAM,WACN,KAAM0H,EAAO,IACnB,CACE,CACF,CAAC,EAED3H,GAAe,CACb,KAAM,OACN,MAAO,CAAC,QAAQ,EAChB,MAAO,CACL,QAAS,EACT,gBAAiB,EACjB,cAAe,GACf,cAAe,GACf,SAAU,CAAC,OAAQ,OAAQ,MAAM,CACrC,EACE,QAAQC,EAAM13O,EAAMy/O,EAAS,CAC3B,GAAI,CACF,OAAAL,CACN,EAAQ1H,EACAx7P,EAAQujQ,EAAQ,CAAC,EACjB12R,EAAQi1R,GAAeh+O,EAAK,CAAC,EAAG,MAAM,EACtCp6B,EAASo4Q,GAAeh+O,EAAK,CAAC,EAAG,MAAM,EAC3C,MAAO,CACL,KAAM,OACN,KAAMo/O,EAAO,KACb,MAAOljQ,GAAS8hQ,GAAe9hQ,EAAO,MAAM,EAAE,MAC9C,MAAOnzB,EAAM,MACb,OAAQ6c,EAAO,KACrB,CACE,EACA,YAAYh2B,EAAOlhB,EAAS,CAE1B,IAAIuL,EAAOi7S,GAAS,CAAC,OAAQ,MAAM,EAAG,CAAA,EAAIxmT,CAAO,EAE7Cq6B,EAAQ2mR,GAAc9/R,EAAM,MAAOlhB,CAAO,EAC1Ck3C,EAAS8pQ,GAAc9/R,EAAM,OAAQlhB,CAAO,EAC5CwtD,EAAQtsC,EAAM,MAAQ8/R,GAAc9/R,EAAM,MAAOlhB,CAAO,EAAI,EAEhE,OAAAuL,EAAK,MAAM,iBAAmB41S,GAAO9mR,CAAK,EAC1C9uB,EAAK,MAAM,eAAiB41S,GAAOjqQ,CAAM,EACzC3rC,EAAK,MAAM,OAAS41S,GAAO3zP,CAAK,EAEhCjiD,EAAK,MAAQ8uB,EACb9uB,EAAK,OAAS2rC,EAASsW,EACvBjiD,EAAK,MAAQ,CAACiiD,EAIdjiD,EAAK,YAAc2rC,EAAS,MAAQl3C,EAAQ,eACrCuL,CACT,EACA,cAAc2V,EAAOlhB,EAAS,CAC5B,IAAIq6B,EAAQ2mR,GAAc9/R,EAAM,MAAOlhB,CAAO,EAC1Ck3C,EAAS8pQ,GAAc9/R,EAAM,OAAQlhB,CAAO,EAC5CwtD,EAAQtsC,EAAM,MAAQ8/R,GAAc9/R,EAAM,MAAOlhB,CAAO,EAAI,EAC5D6xD,EAAQ7xD,EAAQ,OAASA,EAAQ,SAAQ,GAAM,QAC/CuL,EAAO,IAAIigT,GAAS,QAAQ,EAChCjgT,EAAK,aAAa,iBAAkBsmD,CAAK,EACzCtmD,EAAK,aAAa,QAAS41S,GAAO9mR,CAAK,CAAC,EACxC9uB,EAAK,aAAa,SAAU41S,GAAOjqQ,CAAM,CAAC,EAC1C,IAAI85N,EAAU,IAAIw6C,GAAS,UAAW,CAACjgT,CAAI,CAAC,EAC5C,OAAIiiD,GAAS,EACXwjN,EAAQ,aAAa,SAAUmwC,GAAO3zP,CAAK,CAAC,GAE5CwjN,EAAQ,aAAa,SAAUmwC,GAAO3zP,CAAK,CAAC,EAC5CwjN,EAAQ,aAAa,QAASmwC,GAAO,CAAC3zP,CAAK,CAAC,GAE9CwjN,EAAQ,aAAa,UAAWmwC,GAAO3zP,CAAK,CAAC,EACtCwjN,CACT,CACF,CAAC,EAED,SAASm0D,GAAYx1U,EAAOqQ,EAAS6qT,EAAa,CAKhD,QAJIz9R,EAAQu8R,GAAkBh6T,EAAOqQ,EAAS,EAAK,EAC/C+qT,EAAa/qT,EAAQ,eAAiB6qT,EAAY,eAG7CliU,EAAI,EAAGA,EAAIykC,EAAM,OAAQzkC,IAAK,CACrC,IAAIitG,EAAMxoE,EAAMzkC,CAAC,EAAE,QAAQ,QAAQ,QAAQ,EACvCitG,EAAM,EACR,MAAM,UAAU,KAAK,MAAMxoE,EAAMzkC,CAAC,EAAE,QAASqX,EAAQ,cAAc6qT,CAAW,CAAC,EACtEz9R,EAAMzkC,CAAC,EAAE,QAAQitG,EAAM,CAAC,IAAM,aAAe51F,EAAQ,OAI9DotB,EAAMzkC,CAAC,EAAE,QAAQitG,EAAM,CAAC,EAAI,aAAei1N,EAAY,MAEzDz9R,EAAMzkC,CAAC,EAAE,QAAUoiU,EACnB39R,EAAMzkC,CAAC,EAAE,OAASoiU,CACpB,CACA,OAAO/E,GAAa54R,CAAK,CAC3B,CACA,IAAIg4S,GAAY,CAAC,SAAU,cAAe,eAAgB,iBAAkB,UAAW,eAAgB,UAAW,UAAW,UAAW,SAAU,QAAQ,EACtJnc,IAAc,CAAC/nS,EAAOlhB,IAAY,CAIpC,IAAIgxT,EAAahxT,EAAQ,WAAWkhB,EAAM,IAAI,EAC9C,OAAOikT,GAAYjkT,EAAM,KAAM8vS,EAAYhxT,CAAO,CACpD,EACA+oT,GAAe,CACb,KAAM,SACN,MAAOqc,GACP,MAAO,CACL,QAAS,EACT,cAAe,EACnB,EACE,QAAS,CAACpc,EAAM13O,IAAS,CACvB,GAAI,CACF,iBAAAqiP,EACA,SAAAhD,EACA,OAAAD,CACN,EAAQ1H,EACAlmU,EAAO4tU,EAAO,gBAAgB,GAAOiD,CAAgB,EACzD,MAAO,CACL,KAAM,SACN,KAAMjD,EAAO,KAEb,KAAM0U,GAAU,QAAQzU,CAAQ,EAAI,EACpC,KAAA7tU,CACN,CACE,EACA,YAAAmmU,IACA,cAAe,CAAC/nS,EAAOlhB,IAAY,CACjC,IAAIgxT,EAAahxT,EAAQ,WAAWkhB,EAAM,IAAI,EAC1CkM,EAAQ6+R,GAAgB/qS,EAAM,KAAM8vS,CAAU,EAC9Cj8T,EAAO,IAAIy2T,GAAS,SAAUp+R,CAAK,EAMvC,OAAAr4B,EAAK,aAAa,WAAYosT,GAAO6P,EAAW,cAAc,CAAC,EACxDj8T,CACT,CACF,CAAC,EAGDg0T,GAAe,CACb,KAAM,QACN,MAAO,CAAC,SAAS,EACjB,MAAO,CACL,QAAS,EACT,gBAAiB,EACjB,cAAe,EACnB,EACE,QAAS,CAACC,EAAM13O,EAAMy/O,IAAY,CAChC,GAAI,CACF,OAAAL,CACN,EAAQ1H,EACAqc,EAAc,GACdC,EAAa,GACbC,EAAQxU,EAAQ,CAAC,GAAKzB,GAAeyB,EAAQ,CAAC,EAAG,UAAU,EAC/D,GAAIwU,EAKF,QADI7mP,EAAS,GACJ/1F,EAAI,EAAGA,EAAI48U,EAAM,KAAK,OAAQ,EAAE58U,EAAG,CAC1C,IAAIoM,EAAOwwU,EAAM,KAAK58U,CAAC,EAEvB,GADA+1F,EAAS6wO,GAAqBx6T,CAAI,EAAE,KAChC2pF,IAAW,IACb2mP,EAAc,WACL3mP,IAAW,IACpB4mP,EAAa,OACR,CACLD,EAAc,GACdC,EAAa,GACb,KACF,CACF,MAEAD,EAAc,GACdC,EAAa,GAEf,IAAIxiV,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,QACN,KAAMo/O,EAAO,KACb,KAAA5tU,EACA,YAAAuiV,EACA,WAAAC,CACN,CACE,EACA,YAAa,CAACpkT,EAAOlhB,IAAY,CAC/B,IAAIjL,EAAOyxT,GAAS,GAAI,CAACuD,GAAa7oS,EAAM,KAAMlhB,CAAO,CAAC,CAAC,EAC3D,GAAI,CAACkhB,EAAM,aAAe,CAACA,EAAM,WAC/B,OAAOnsB,EAQT,GANImsB,EAAM,cACRnsB,EAAK,OAAS,GAEZmsB,EAAM,aACRnsB,EAAK,MAAQ,GAEXmsB,EAAM,aAAeA,EAAM,WAE7B,OAAOslS,GAAS,CAAC,OAAQ,OAAO,EAAG,CAACzxT,CAAI,EAAGiL,CAAO,EAIpD,GAAIjL,EAAK,SACP,QAASpM,EAAI,EAAGA,EAAIoM,EAAK,SAAS,OAAQpM,IACpCu4B,EAAM,cACRnsB,EAAK,SAASpM,CAAC,EAAE,OAAS,GAExBu4B,EAAM,aACRnsB,EAAK,SAASpM,CAAC,EAAE,MAAQ,GAQ/B,IAAI68U,EAAcve,GAAU,CAC1B,aAAc,gBACd,SAAU,CAAC,CACT,KAAM,OACN,KAAMlyT,CACd,CAAO,CACP,CAAK,EAED,OAAOyxT,GAAS,CAAC,MAAM,EAAG,CAACgf,CAAW,EAAGxlU,CAAO,CAClD,EACA,cAAe,CAACkhB,EAAOlhB,IAAY,CACjC,IAAIjL,EAAO,IAAIy2T,GAAS,UAAW,CAACW,GAAWjrS,EAAM,KAAMlhB,CAAO,CAAC,CAAC,EACpE,OAAIkhB,EAAM,aACRnsB,EAAK,aAAa,SAAU,KAAK,EAE/BmsB,EAAM,YACRnsB,EAAK,aAAa,QAAS,KAAK,EAE3BA,CACT,CACF,CAAC,EAEDg0T,GAAe,CACb,KAAM,OACN,MAAO,CAAC,QAAQ,EAChB,MAAO,CACL,QAAS,EACT,gBAAiB,CACrB,EACE,QAAQC,EAAM13O,EAAMy/O,EAAS,CAC3B,GAAI,CACF,OAAAL,CACN,EAAQ1H,EACA9vT,EAAQ63T,EAAQ,CAAC,EACjBjuU,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,OACN,KAAMo/O,EAAO,KACb,KAAA5tU,EACA,MAAAoW,CACN,CACE,EACA,YAAYgoB,EAAOlhB,EAAS,CAI1B,IAAIotB,EAAQ28R,GAAa7oS,EAAM,KAAMlhB,EAAQ,oBAAoB,EAC7DotB,EAAM,SAAW,IAEnBA,EAAM,OAASptB,EAAQ,YAAW,EAAG,SAIvCotB,EAAQw5R,GAAax5R,EAAOptB,CAAO,EAEnC,IAAIi7B,EAAUj7B,EAAQ,YAAW,EAC7BylU,EAAQxqS,EAAQ,qBAChBk+P,EAAMssC,EACNzlU,EAAQ,MAAM,GAAKm/S,GAAQ,KAAK,KAClChmB,EAAMn5R,EAAQ,YAAW,EAAG,SAG9B,IAAI0lU,EAAgBD,EAAQtsC,EAAM,EAC9BwsC,EAAqBv4S,EAAM,OAASA,EAAM,MAAQs4S,EAAgBD,EAElE,CACF,KAAM54Q,EACN,UAAAu0Q,EACA,aAAAlK,CACN,EAAQN,IAAc+O,EAAoB3lU,CAAO,EACzC4lU,EAAa/4Q,EAAI,OAASu0Q,EAE1BwE,EAAax4S,EAAM,OAASA,EAAM,MAAQs4S,IAC5CA,GAAiBA,EAAgBE,EAAax4S,EAAM,OAASA,EAAM,OAAS,GAG9E,IAAIgsS,EAAWvsQ,EAAI,OAASz/B,EAAM,OAASs4S,EAAgBtE,EAC3Dh0S,EAAM,MAAM,YAAc+zR,GAAO+V,CAAY,EAE7C,IAAIp0U,EAAOmkU,GAAU,CACnB,aAAc,gBACd,SAAU,CAAC,CACT,KAAM,OACN,KAAM75R,EACN,eAAgB,CAAC,WAAW,CACpC,EAAS,CACD,KAAM,OACN,KAAM,EAAEA,EAAM,OAASgsS,EAC/B,EAAS,CACD,KAAM,OACN,KAAMvsQ,CACd,EAAS,CACD,KAAM,OACN,KAAMu0Q,CACd,CAAO,CACP,CAAK,EACD,GAAKlgT,EAAM,MAEJ,CAGL,IAAI8vS,EAAahxT,EAAQ,YAAYm/S,GAAQ,YAAY,EACrD0mB,EAAQ9b,GAAa7oS,EAAM,MAAO8vS,EAAYhxT,CAAO,EAGrD8lU,EAAU,IAAOhjV,EAAK,OAASA,EAAK,OAEpCijV,EAAY9e,GAAU,CACxB,aAAc,QACd,aAAc,CAAC6e,EACf,SAAU,CAAC,CACT,KAAM,OACN,KAAMD,CAChB,CAAS,CACT,CAAO,EAGGG,EAAgBxf,GAAS,CAAC,MAAM,EAAG,CAACuf,CAAS,CAAC,EAClD,OAAOvf,GAAS,CAAC,OAAQ,MAAM,EAAG,CAACwf,EAAeljV,CAAI,EAAGkd,CAAO,CAClE,KAtBE,QAAOwmT,GAAS,CAAC,OAAQ,MAAM,EAAG,CAAC1jU,CAAI,EAAGkd,CAAO,CAuBrD,EACA,cAAckhB,EAAOlhB,EAAS,CAC5B,GAAI,CACF,KAAAld,EACA,MAAAoW,CACN,EAAQgoB,EACJ,OAAOhoB,EAAQ,IAAIsyT,GAAS,QAAS,CAACW,GAAWrpU,EAAMkd,CAAO,EAAGmsT,GAAWjzT,EAAO8G,CAAO,CAAC,CAAC,EAAI,IAAIwrT,GAAS,QAAS,CAACW,GAAWrpU,EAAMkd,CAAO,CAAC,CAAC,CACnJ,CACF,CAAC,EAED,IAAIimU,GAAW,CACb,QAAW9mB,GAAQ,QACnB,KAAQA,GAAQ,KAChB,OAAUA,GAAQ,OAClB,aAAgBA,GAAQ,YAC1B,EACA4J,GAAe,CACb,KAAM,UACN,MAAO,CAAC,iBAAkB,cAAe,gBAAiB,qBAAqB,EAC/E,MAAO,CACL,QAAS,EACT,cAAe,GACf,UAAW,EACf,EACE,QAAQC,EAAM13O,EAAM,CAClB,GAAI,CACF,iBAAAqiP,EACA,SAAAhD,EACA,OAAAD,CACN,EAAQ1H,EAEAlmU,EAAO4tU,EAAO,gBAAgB,GAAMiD,CAAgB,EAIpDp7S,EAAQo4S,EAAS,MAAM,EAAGA,EAAS,OAAS,CAAC,EACjD,MAAO,CACL,KAAM,UACN,KAAMD,EAAO,KAGb,MAAAn4S,EACA,KAAAz1B,CACN,CACE,EACA,YAAYo+B,EAAOlhB,EAAS,CAE1B,IAAIkmU,EAAWD,GAAS/kT,EAAM,KAAK,EAC/B8vS,EAAahxT,EAAQ,YAAYkmU,CAAQ,EAAE,SAAS,EAAE,EAC1D,OAAOf,GAAYjkT,EAAM,KAAM8vS,EAAYhxT,CAAO,CACpD,EACA,cAAckhB,EAAOlhB,EAAS,CAE5B,IAAIkmU,EAAWD,GAAS/kT,EAAM,KAAK,EAC/B8vS,EAAahxT,EAAQ,YAAYkmU,CAAQ,EACzC94S,EAAQ6+R,GAAgB/qS,EAAM,KAAM8vS,CAAU,EAC9Cj8T,EAAO,IAAIy2T,GAAS,SAAUp+R,CAAK,EACnC+4S,EAAkB,CACpB,QAAW,CAAC,IAAK,MAAM,EACvB,KAAQ,CAAC,IAAK,OAAO,EACrB,OAAU,CAAC,IAAK,OAAO,EACvB,aAAgB,CAAC,IAAK,OAAO,CACnC,EACQ1nL,EAAO0nL,EAAgBjlT,EAAM,KAAK,EACtC,OAAAnsB,EAAK,aAAa,cAAe0pJ,EAAK,CAAC,CAAC,EACxC1pJ,EAAK,aAAa,eAAgB0pJ,EAAK,CAAC,CAAC,EAClC1pJ,CACT,CACF,CAAC,EASD,IAAIqxU,IAAsB,SAA6BllT,EAAOlhB,EAAS,CACrE,IAAIngB,EAAOqhC,EAAM,KACjB,GAAKrhC,EAEE,GAAIA,EAAK,OAAS,KAAM,CAG7B,IAAIwmV,EAAWxmV,EAAK,SAAWmgB,EAAQ,MAAM,OAASm/S,GAAQ,QAAQ,MAAQt/T,EAAK,oBACnF,OAAOwmV,EAAWjC,GAAgB,IACpC,SAAWvkV,EAAK,OAAS,eAAgB,CACvC,IAAIymV,EAAYzmV,EAAK,qBAAuBmgB,EAAQ,MAAM,OAASm/S,GAAQ,QAAQ,MAAQt/T,EAAK,QAChG,OAAOymV,EAAYzB,GAAgB,IACrC,KAAO,IAAIhlV,EAAK,OAAS,SACvB,OAAO49T,GAAe59T,EAAK,IAAI,EAAI8vU,GAAgB,KAC9C,GAAI9vU,EAAK,OAAS,aAAc,CACrC,IAAI0mV,EAAQ,CAACrlT,EAAM,IACnB,OAAOqlT,IAAU1mV,EAAK,OAAS8iV,GAAgB,IACjD,KACE,QAAO,SAfP,QAAO,IAiBX,EAGAxZ,GAAuB,CACrB,KAAM,SACN,YAAYjoS,EAAOlhB,EAAS,CAK1B,IAAIwmU,EAAkBJ,IAAoBllT,EAAOlhB,CAAO,EACxD,GAAIwmU,EACF,OAAOA,EAAgBtlT,EAAOlhB,CAAO,EAEvC,GAAI,CACF,KAAMymU,EACN,IAAKC,EACL,IAAKC,CACX,EAAQzlT,EACArhC,EAAOkqU,GAAa0c,EAAWzmU,CAAO,EACtC4mU,EACAC,EACA5rS,EAAUj7B,EAAQ,YAAW,EAE7B8mU,EAAW,EACXC,EAAW,EACXC,EAAYP,GAAahpB,GAAegpB,CAAS,EACrD,GAAIC,EAAU,CACZ,IAAI1V,EAAahxT,EAAQ,YAAYA,EAAQ,MAAM,KAAK,EACxD4mU,EAAO7c,GAAa2c,EAAU1V,EAAYhxT,CAAO,EAC5CgnU,IACHF,EAAWjnV,EAAK,OAASmxU,EAAW,cAAc,QAAUA,EAAW,eAAiBhxT,EAAQ,eAEpG,CACA,GAAI2mU,EAAU,CACZ,IAAIM,EAAcjnU,EAAQ,YAAYA,EAAQ,MAAM,KAAK,EACzD6mU,EAAO9c,GAAa4c,EAAUM,EAAajnU,CAAO,EAC7CgnU,IACHD,EAAWlnV,EAAK,MAAQonV,EAAY,cAAc,QAAUA,EAAY,eAAiBjnU,EAAQ,eAErG,CAEA,IAAIknU,EACAlnU,EAAQ,QAAUm/S,GAAQ,QAC5B+nB,EAAcjsS,EAAQ,KACbj7B,EAAQ,MAAM,QACvBknU,EAAcjsS,EAAQ,KAEtBisS,EAAcjsS,EAAQ,KAIxB,IAAI8vR,EAAa/qT,EAAQ,eACrBmnU,EAAchmB,GAAO,GAAMlmR,EAAQ,QAAU8vR,CAAU,EACvDqc,EAAa,KACjB,GAAIP,EAAM,CAIR,IAAIQ,EAAUnmT,EAAM,MAAQA,EAAM,KAAK,OAAS,MAAQA,EAAM,KAAK,OAASA,EAAM,KAAK,OAAS,WAAaA,EAAM,KAAK,OAAS,aAC7HrhC,aAAgBkiU,IAAcslB,KAEhCD,EAAajmB,GAAO,CAACthU,EAAK,MAAM,EAEpC,CACA,IAAIwyU,EACJ,GAAIuU,GAAQC,EAAM,CAChBC,EAAW,KAAK,IAAIA,EAAUI,EAAaN,EAAK,MAAQ,IAAO3rS,EAAQ,OAAO,EAC9E8rS,EAAW,KAAK,IAAIA,EAAU9rS,EAAQ,IAAI,EAC1C,IAAImmS,EAAYnmS,EAAQ,qBAEpByc,EAAW,EAAI0pR,EACnB,GAAI0F,EAAWF,EAAK,OAASC,EAAK,OAASE,GAAYrvR,EAAU,CAC/DqvR,EAAWrvR,GAAYovR,EAAWF,EAAK,OAASC,EAAK,OACrD,IAAIS,EAAM,GAAMrsS,EAAQ,SAAW6rS,EAAWF,EAAK,OAC/CU,EAAM,IACRR,GAAYQ,EACZP,GAAYO,EAEhB,CACA,IAAIC,EAAY,CAAC,CACf,KAAM,OACN,KAAMV,EACN,MAAOE,EACP,YAAAI,EACA,WAAAC,CACR,EAAS,CACD,KAAM,OACN,KAAMR,EACN,MAAO,CAACE,EACR,YAAAK,CACR,CAAO,EACD9U,EAASpL,GAAU,CACjB,aAAc,kBACd,SAAUsgB,CAClB,CAAO,CACH,SAAWV,EAAM,CAEfE,EAAW,KAAK,IAAIA,EAAU9rS,EAAQ,KAAM4rS,EAAK,OAAS,GAAM5rS,EAAQ,OAAO,EAC/E,IAAIusS,EAAa,CAAC,CAChB,KAAM,OACN,KAAMX,EACN,WAAAO,EACA,YAAAD,CACR,CAAO,EACD9U,EAASpL,GAAU,CACjB,aAAc,QACd,aAAc8f,EACd,SAAUS,CAClB,CAAO,CACH,SAAWZ,EAETE,EAAW,KAAK,IAAIA,EAAUI,EAAaN,EAAK,MAAQ,IAAO3rS,EAAQ,OAAO,EAC9Eo3R,EAASpL,GAAU,CACjB,aAAc,QACd,aAAc,CAAC6f,EACf,SAAU,CAAC,CACT,KAAM,OACN,KAAMF,EACN,YAAAO,CACV,CAAS,CACT,CAAO,MAED,OAAM,IAAI,MAAM,qCAAqC,EAGvD,IAAIhV,EAAS7H,GAAiBzqU,EAAM,OAAO,GAAK,OAChD,OAAO2mU,GAAS,CAAC2L,CAAM,EAAG,CAACtyU,EAAM2mU,GAAS,CAAC,SAAS,EAAG,CAAC6L,CAAM,CAAC,CAAC,EAAGryT,CAAO,CAC5E,EACA,cAAckhB,EAAOlhB,EAAS,CAE5B,IAAIynU,EAAU,GACVC,EACAnB,EACArlT,EAAM,MAAQA,EAAM,KAAK,OAAS,eACpCqlT,EAAQ,CAAC,CAACrlT,EAAM,IACZqlT,IAAUrlT,EAAM,KAAK,SACvBumT,EAAU,GACVC,EAASxmT,EAAM,KAAK,SAGpBA,EAAM,OAASA,EAAM,KAAK,OAAS,MAAQA,EAAM,KAAK,OAAS,kBACjEA,EAAM,KAAK,eAAiB,IAE9B,IAAIytN,EAAW,CAACw9E,GAAWjrS,EAAM,KAAMlhB,CAAO,CAAC,EAC3CkhB,EAAM,KACRytN,EAAS,KAAKw9E,GAAWjrS,EAAM,IAAKlhB,CAAO,CAAC,EAE1CkhB,EAAM,KACRytN,EAAS,KAAKw9E,GAAWjrS,EAAM,IAAKlhB,CAAO,CAAC,EAE9C,IAAI2nU,EACJ,GAAIF,EACFE,EAAWD,EAAS,QAAU,iBACpBxmT,EAAM,IASX,GAAKA,EAAM,IASX,CACL,IAAI0mT,EAAS1mT,EAAM,KACf0mT,GAAUA,EAAO,OAAS,MAAQA,EAAO,QAAU5nU,EAAQ,QAAUm/S,GAAQ,SAEtEyoB,GAAUA,EAAO,OAAS,gBAAkBA,EAAO,qBAAuB5nU,EAAQ,QAAUm/S,GAAQ,SAAWyoB,EAAO,QAD/HD,EAAW,aAIXA,EAAW,SAEf,KAlBuB,CACrB,IAAIE,EAAQ3mT,EAAM,KACd2mT,GAASA,EAAM,OAAS,MAAQA,EAAM,SAAW7nU,EAAQ,QAAUm/S,GAAQ,SAAW0oB,EAAM,qBAErFA,GAASA,EAAM,OAAS,gBAAkBA,EAAM,qBAAuBA,EAAM,QAAU7nU,EAAQ,QAAUm/S,GAAQ,SAD1HwoB,EAAW,SAIXA,EAAW,MAEf,KAlBuB,CACrB,IAAI9nV,EAAOqhC,EAAM,KACbrhC,GAAQA,EAAK,OAAS,MAAQA,EAAK,SAAWmgB,EAAQ,QAAUm/S,GAAQ,SAAWt/T,EAAK,qBAEjFA,GAAQA,EAAK,OAAS,gBAAkBA,EAAK,qBAAuBA,EAAK,QAAUmgB,EAAQ,QAAUm/S,GAAQ,SADtHwoB,EAAW,QAIXA,EAAW,MAEf,CAmBA,OAAO,IAAInc,GAASmc,EAAUh5F,CAAQ,CACxC,CACF,CAAC,EAGDw6E,GAAuB,CACrB,KAAM,OACN,YAAYjoS,EAAOlhB,EAAS,CAC1B,OAAOslT,GAAQpkS,EAAM,KAAMA,EAAM,KAAMlhB,EAAS,CAAC,IAAMkhB,EAAM,MAAM,CAAC,CACtE,EACA,cAAcA,EAAOlhB,EAAS,CAC5B,IAAIjL,EAAO,IAAIy2T,GAAS,KAAM,CAACK,GAAS3qS,EAAM,KAAMA,EAAM,IAAI,CAAC,CAAC,EAChE,GAAIA,EAAM,SAAW,MAAO,CAC1B,IAAI4rE,EAAUi/N,GAAW7qS,EAAOlhB,CAAO,EACnC8sF,IAAY,eACd/3F,EAAK,aAAa,cAAe+3F,CAAO,CAE5C,MAAW5rE,EAAM,SAAW,QAC1BnsB,EAAK,aAAa,YAAa,MAAM,GAC5BmsB,EAAM,SAAW,QAAUA,EAAM,SAAW,UAGrDnsB,EAAK,aAAa,WAAY,OAAO,EAEvC,OAAOA,CACT,CACF,CAAC,EAID,IAAI+yU,GAAiB,CACnB,GAAM,SACN,GAAM,SACN,MAAS,QACX,EACA3e,GAAuB,CACrB,KAAM,UACN,YAAYjoS,EAAOlhB,EAAS,CAC1B,OAAOwlT,GAAQtkS,EAAOlhB,EAAS,SAAS,CAC1C,EACA,cAAckhB,EAAOlhB,EAAS,CAC5B,IAAIjL,EAAO,IAAIy2T,GAAS,KAAM,CAACK,GAAS3qS,EAAM,KAAMA,EAAM,KAAMlhB,CAAO,CAAC,CAAC,EACrE8sF,EAAUi/N,GAAW7qS,EAAOlhB,CAAO,GAAK,SAC5C,OAAI8sF,IAAYg7O,GAAe/yU,EAAK,IAAI,GACtCA,EAAK,aAAa,cAAe+3F,CAAO,EAEnC/3F,CACT,CACF,CAAC,EACDo0T,GAAuB,CACrB,KAAM,UACN,YAAYjoS,EAAOlhB,EAAS,CAC1B,OAAOwlT,GAAQtkS,EAAOlhB,EAAS,SAAS,CAC1C,EACA,cAAckhB,EAAOlhB,EAAS,CAC5B,IAAInX,EAAOgjU,GAAS3qS,EAAM,KAAMA,EAAM,KAAMlhB,CAAO,EAC/C8sF,EAAUi/N,GAAW7qS,EAAOlhB,CAAO,GAAK,SACxCjL,EACJ,OAAImsB,EAAM,OAAS,OACjBnsB,EAAO,IAAIy2T,GAAS,QAAS,CAAC3iU,CAAI,CAAC,EAC1B,QAAQ,KAAKq4B,EAAM,IAAI,EAChCnsB,EAAO,IAAIy2T,GAAS,KAAM,CAAC3iU,CAAI,CAAC,EACvBq4B,EAAM,OAAS,UACxBnsB,EAAO,IAAIy2T,GAAS,KAAM,CAAC3iU,CAAI,CAAC,EAEhCkM,EAAO,IAAIy2T,GAAS,KAAM,CAAC3iU,CAAI,CAAC,EAE9BikG,IAAYg7O,GAAe/yU,EAAK,IAAI,GACtCA,EAAK,aAAa,cAAe+3F,CAAO,EAEnC/3F,CACT,CACF,CAAC,EAGD,IAAIgzU,GAAW,CACb,YAAa,UACb,eAAgB,YAClB,EAMIC,GAAe,CACjB,IAAK,CAAA,EACL,MAAO,CAAA,EACP,IAAK,CACH,UAAW,SACf,EACE,UAAW,CAAA,EACX,iBAAkB,CAChB,UAAW,SACf,CACA,EAGA7e,GAAuB,CACrB,KAAM,UACN,YAAYjoS,EAAOlhB,EAAS,CAC1B,GAAIgoU,GAAa,eAAe9mT,EAAM,IAAI,EAAG,CAC3C,IAAImzJ,EAAY2zJ,GAAa9mT,EAAM,IAAI,EAAE,WAAa,GAItD,GAAIA,EAAM,OAAS,OAAQ,CACzB,IAAI+mT,EAAMziB,GAAQtkS,EAAOlhB,EAAS,SAAS,EAC3C,OAAAioU,EAAI,QAAQ,KAAK5zJ,CAAS,EACnB4zJ,CACT,KACE,QAAOzhB,GAAS,CAAC,SAAUnyI,CAAS,EAAG,CAACixI,GAAQpkS,EAAM,KAAMA,EAAM,KAAMlhB,CAAO,CAAC,EAAGA,CAAO,CAE9F,KAAO,IAAI+nU,GAAS,eAAe7mT,EAAM,IAAI,EAE3C,OAAOslS,GAAS,CAAC,SAAUuhB,GAAS7mT,EAAM,IAAI,CAAC,EAAG,CAAA,EAAIlhB,CAAO,EAE7D,MAAM,IAAIi9S,GAAW,0BAA6B/7R,EAAM,KAAO,GAAI,EAEvE,EACA,cAAcA,EAAOlhB,EAAS,CAC5B,IAAIjL,EACJ,GAAIizU,GAAa,eAAe9mT,EAAM,IAAI,EACxCnsB,EAAO,IAAIy2T,GAAS,QAAS,CAAC,IAAIC,GAAS,GAAQ,CAAC,CAAC,MAChD,IAAIsc,GAAS,eAAe7mT,EAAM,IAAI,EAE3C,OAAO,IAAIsqS,GAAS,QAAQ,EAE5B,MAAM,IAAIvO,GAAW,0BAA6B/7R,EAAM,KAAO,GAAI,EAErE,OAAOnsB,CACT,CACF,CAAC,EAED,IAAIktD,GAAM,IAAM,CACd,IAAIimR,EAAU,IAAI1c,GAAS,MAAO,CAAA,CAAE,EACpC,OAAA0c,EAAQ,aAAa,QAAS,KAAK,EAC5BA,CACT,EACA/e,GAAuB,CACrB,KAAM,MACN,cAAcjoS,EAAOlhB,EAAS,CAC5B,IAAIrM,EAAQ,IAAI63T,GAAS,SAAU,CAAC,IAAIA,GAAS,MAAO,CAACvpQ,GAAG,EAAI,IAAIupQ,GAAS,MAAO,CAACe,GAAmBrrS,EAAM,KAAMlhB,CAAO,CAAC,CAAC,EAAGiiD,GAAG,EAAI,IAAIupQ,GAAS,MAAO,CAACe,GAAmBrrS,EAAM,IAAKlhB,CAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACvM,OAAArM,EAAM,aAAa,QAAS,MAAM,EAC3BA,CAQT,CACF,CAAC,EAGD,IAAIw0U,GAAmB,CACrB,SAAU,OACV,WAAY,SACZ,WAAY,SACZ,WAAY,SACZ,eAAgB,QAClB,EACIC,GAAkB,CACpB,WAAY,SACZ,WAAY,QACd,EACIC,IAAiB,CACnB,WAAY,SACZ,WAAY,QACd,EACIC,GAAkB,CAACpnT,EAAOlhB,IAAY,CACxC,IAAI6yC,EAAO3xB,EAAM,KAEjB,GAAK2xB,EAEE,IAAIs1R,GAAiBt1R,CAAI,EAC9B,OAAO7yC,EAAQ,mBAAmBmoU,GAAiBt1R,CAAI,CAAC,EACnD,GAAIu1R,GAAgBv1R,CAAI,EAC7B,OAAO7yC,EAAQ,mBAAmBooU,GAAgBv1R,CAAI,CAAC,EAClD,GAAIA,IAAS,SAClB,OAAO7yC,EAAQ,YAAc,SAAWA,EAAQ,kBAAkB,QAAQ,EAAIA,EAAQ,kBAAkB,QAAQ,MANhH,QAAOA,EAQT,OAAOA,EAAQ,kBAAkBqoU,IAAex1R,CAAI,CAAC,CACvD,EACAk2Q,GAAe,CACb,KAAM,OACN,MAAO,CAEP,SAAU,WAAY,WAAY,WAAY,eAE9C,WAAY,WAEZ,WAAY,WAAY,QAAQ,EAChC,MAAO,CACL,QAAS,EACT,SAAU,CAAC,MAAM,EACjB,kBAAmB,GACnB,cAAe,EACnB,EACE,QAAQC,EAAM13O,EAAM,CAClB,GAAI,CACF,OAAAo/O,EACA,SAAAC,CACN,EAAQ3H,EACAlmU,EAAOwuF,EAAK,CAAC,EACjB,MAAO,CACL,KAAM,OACN,KAAMo/O,EAAO,KACb,KAAMpH,GAAYxmU,CAAI,EACtB,KAAM6tU,CACZ,CACE,EACA,YAAYzvS,EAAOlhB,EAAS,CAC1B,IAAIgxT,EAAasX,GAAgBpnT,EAAOlhB,CAAO,EAC3CotB,EAAQu8R,GAAkBzoS,EAAM,KAAM8vS,EAAY,EAAI,EAC1D,OAAOxK,GAAS,CAAC,OAAQ,MAAM,EAAGp5R,EAAO4jS,CAAU,CACrD,EACA,cAAc9vS,EAAOlhB,EAAS,CAC5B,IAAIgxT,EAAasX,GAAgBpnT,EAAOlhB,CAAO,EAC/C,OAAOusT,GAAmBrrS,EAAM,KAAM8vS,CAAU,CAClD,CACF,CAAC,EAEDjI,GAAe,CACb,KAAM,YACN,MAAO,CAAC,aAAa,EACrB,MAAO,CACL,QAAS,EACT,cAAe,EACnB,EACE,QAAQC,EAAM13O,EAAM,CAClB,GAAI,CACF,OAAAo/O,CACN,EAAQ1H,EACJ,MAAO,CACL,KAAM,YACN,KAAM0H,EAAO,KACb,KAAMp/O,EAAK,CAAC,CAClB,CACE,EACA,YAAYpwD,EAAOlhB,EAAS,CAG1B,IAAI4wT,EAAa7G,GAAa7oS,EAAM,KAAMlhB,CAAO,EAE7CywC,EAAOi2Q,GAAa,iBAAkB1mT,CAAO,EAE7CglU,EAAuBhlU,EAAQ,YAAW,EAAG,qBAC7C0nT,EAAQT,GAAU,CACpB,aAAc,MACd,aAAc2J,EAAW,OACzB,SAAU,CAAC,CACT,KAAM,OACN,KAAMoU,CACd,EAAS,CACD,KAAM,OACN,KAAMv0R,CACd,EAAS,CACD,KAAM,OACN,KAAM,EAAIu0R,CAClB,EAAS,CACD,KAAM,OACN,KAAMpU,CACd,CAAO,CACP,CAAK,EACD,OAAOpK,GAAS,CAAC,OAAQ,WAAW,EAAG,CAACkB,CAAK,EAAG1nT,CAAO,CACzD,EACA,cAAckhB,EAAOlhB,EAAS,CAC5B,IAAIyyL,EAAW,IAAI+4H,GAAS,KAAM,CAAC,IAAIC,GAAS,GAAQ,CAAC,CAAC,EAC1Dh5H,EAAS,aAAa,WAAY,MAAM,EACxC,IAAI19L,EAAO,IAAIy2T,GAAS,SAAU,CAACW,GAAWjrS,EAAM,KAAMlhB,CAAO,EAAGyyL,CAAQ,CAAC,EAC7E,OAAA19L,EAAK,aAAa,cAAe,MAAM,EAChCA,CACT,CACF,CAAC,EAGDg0T,GAAe,CACb,KAAM,UACN,MAAO,CAAC,WAAW,EACnB,MAAO,CACL,QAAS,EACT,SAAU,CAAC,UAAU,EAErB,cAAe,EACnB,EACE,QAAQC,EAAM13O,EAAM,CAClB,GAAI,CACF,OAAAo/O,CACN,EAAQ1H,EACJ,MAAO,CACL,KAAM,UACN,KAAM0H,EAAO,KACb,KAAMp/O,EAAK,CAAC,CAClB,CACE,EACA,YAAYpwD,EAAOlhB,EAAS,CAC1B,IAAIld,EAAOinU,GAAa7oS,EAAM,KAAMlhB,CAAO,EACvCo2T,EAAap2T,EAAQ,YAAW,EAAG,WACnCu1D,EAAK,IAAOzyE,EAAK,OAASszU,GAActzU,EAAK,MAAQszU,IACzD,OAAOnP,GAAU,CACf,aAAc,QACd,aAAc1xP,EACd,SAAU,CAAC,CACT,KAAM,OACN,KAAMzyE,CACd,CAAO,CACP,CAAK,CACH,EACA,cAAco+B,EAAOlhB,EAAS,CAK5B,IAAIuoU,EAAU,IAAI/c,GAAS,UAAW,CAACW,GAAWjrS,EAAM,KAAMlhB,CAAO,CAAC,EAAG,CAAC,SAAS,CAAC,EACpF,OAAO,IAAIwrT,GAAS,OAAQ,CAAC+c,CAAO,CAAC,CACvC,CACF,CAAC,EAEDxf,GAAe,CACb,KAAM,OACN,MAAO,CAAC,QAAQ,EAChB,MAAO,CACL,QAAS,EACT,cAAe,EACnB,EACE,QAAQlkM,EAASvzC,EAAMy/O,EAAS,CAK9B,MAAM,IAAI9T,GAAW,2DAA2D,CAClF,EACA,YAAY/7R,EAAOlhB,EAAS,CAK1B,QAJInX,EAAO2/U,GAAStnT,CAAK,EACrBp+B,EAAO,CAAA,EAEPkuU,EAAahxT,EAAQ,YAAYA,EAAQ,MAAM,MAAM,EAChDrX,EAAI,EAAGA,EAAIE,EAAK,OAAQF,IAAK,CACpC,IAAI5G,EAAI8G,EAAKF,CAAC,EACV5G,IAAM,MACRA,EAAI,oBAENe,EAAK,KAAKsiU,GAAWrjU,EAAG,qBAAsBm/B,EAAM,KAAM8vS,EAAY,CAAC,OAAQ,QAAQ,CAAC,CAAC,CAC3F,CACA,OAAOxK,GAAS,CAAC,OAAQ,MAAM,EAAE,OAAOwK,EAAW,cAAchxT,CAAO,CAAC,EAAGqmT,GAAgBvjU,CAAI,EAAGkuU,CAAU,CAC/G,EACA,cAAc9vS,EAAOlhB,EAAS,CAC5B,IAAInX,EAAO,IAAI4iU,GAAS+c,GAAStnT,CAAK,CAAC,EACnCnsB,EAAO,IAAIy2T,GAAS,QAAS,CAAC3iU,CAAI,CAAC,EACvC,OAAAkM,EAAK,aAAa,cAAe,WAAW,EACrCA,CACT,CACF,CAAC,EAOD,IAAIyzU,GAAWtnT,GAASA,EAAM,KAAK,QAAQ,KAAMA,EAAM,KAAO,IAAW,GAAM,EAG3EunT,GAAY7f,GAqCZ8f,GAAmB;AAAA,IACnBC,IAAyB,iBACzBC,IAA2B,uBAC3BC,IAAmC,IAAMF,IAAyB,IAAMD,GAAmB,IAC3FI,IAA0B;AAAA;AAAA,WAC1BC,GAAiC,QACjCC,IAAoC,IAAI,OAAOD,GAAiC,IAAI,EACpFE,IAAmB,IAAMP,GAAmB,OAChDI,IAA0B,KAE1B,uBACAC,GAAiC,KAEjC,mCACAA,GAAiC,KAEjC,sDAGA,IAAMF,MACN,IAAMD,IAA2B,KAEjC,MAAMM,EAAM,CAIV,YAAYv8Q,EAAO0gQ,EAAU,CAE3B,KAAK,MAAQ1gQ,EACb,KAAK,SAAW0gQ,EAChB,KAAK,WAAa,IAAI,OAAO4b,IAAkB,GAAG,EAClD,KAAK,SAAW,CACd,IAAK,GAEL,IAAK,EACX,CACE,CACA,WAAWE,EAAM9oV,EAAM,CACrB,KAAK,SAAS8oV,CAAI,EAAI9oV,CACxB,CAIA,KAAM,CACJ,IAAIssE,EAAQ,KAAK,MACbipC,EAAM,KAAK,WAAW,UAC1B,GAAIA,IAAQjpC,EAAM,OAChB,OAAO,IAAIytQ,GAAM,MAAO,IAAIF,GAAe,KAAMtkO,EAAKA,CAAG,CAAC,EAE5D,IAAIjkB,EAAQ,KAAK,WAAW,KAAKhlB,CAAK,EACtC,GAAIglB,IAAU,MAAQA,EAAM,QAAUikB,EACpC,MAAM,IAAIqnN,GAAW,0BAA4BtwP,EAAMipC,CAAG,EAAI,IAAK,IAAIwkO,GAAMztQ,EAAMipC,CAAG,EAAG,IAAIskO,GAAe,KAAMtkO,EAAKA,EAAM,CAAC,CAAC,CAAC,EAElI,IAAI/sG,EAAO8oF,EAAM,CAAC,GAAKA,EAAM,CAAC,IAAMA,EAAM,CAAC,EAAI,MAAQ,KACvD,GAAI,KAAK,SAAS9oF,CAAI,IAAM,GAAI,CAE9B,IAAIugV,EAAUz8Q,EAAM,QAAQ;AAAA,EAAM,KAAK,WAAW,SAAS,EAC3D,OAAIy8Q,IAAY,IACd,KAAK,WAAW,UAAYz8Q,EAAM,OAClC,KAAK,SAAS,gBAAgB,eAAgB,4GAAiH,GAE/J,KAAK,WAAW,UAAYy8Q,EAAU,EAEjC,KAAK,IAAG,CACjB,CACA,OAAO,IAAIhP,GAAMvxU,EAAM,IAAIqxU,GAAe,KAAMtkO,EAAK,KAAK,WAAW,SAAS,CAAC,CACjF,CACF,CASA,MAAMyzO,GAAU,CAOd,YAAYC,EAAUC,EAAc,CAC9BD,IAAa,SACfA,EAAW,CAAA,GAETC,IAAiB,SACnBA,EAAe,CAAA,GAEjB,KAAK,QAAUA,EACf,KAAK,SAAWD,EAChB,KAAK,WAAa,CAAA,CACpB,CAIA,YAAa,CACX,KAAK,WAAW,KAAK,EAAE,CACzB,CAIA,UAAW,CACT,GAAI,KAAK,WAAW,SAAW,EAC7B,MAAM,IAAIrsB,GAAW,gGAAqG,EAE5H,IAAIusB,EAAS,KAAK,WAAW,IAAG,EAChC,QAASC,KAASD,EACZA,EAAO,eAAeC,CAAK,IACzBD,EAAOC,CAAK,GAAK,KACnB,OAAO,KAAK,QAAQA,CAAK,EAEzB,KAAK,QAAQA,CAAK,EAAID,EAAOC,CAAK,EAI1C,CAKA,WAAY,CACV,KAAO,KAAK,WAAW,OAAS,GAC9B,KAAK,SAAQ,CAEjB,CAKA,IAAInpV,EAAM,CACR,OAAO,KAAK,QAAQ,eAAeA,CAAI,GAAK,KAAK,SAAS,eAAeA,CAAI,CAC/E,CASA,IAAIA,EAAM,CACR,OAAI,KAAK,QAAQ,eAAeA,CAAI,EAC3B,KAAK,QAAQA,CAAI,EAEjB,KAAK,SAASA,CAAI,CAE7B,CAQA,IAAIA,EAAMqP,EAAO+pL,EAAQ,CAIvB,GAHIA,IAAW,SACbA,EAAS,IAEPA,EAAQ,CAKV,QAAS,EAAI,EAAG,EAAI,KAAK,WAAW,OAAQ,IAC1C,OAAO,KAAK,WAAW,CAAC,EAAEp5L,CAAI,EAE5B,KAAK,WAAW,OAAS,IAC3B,KAAK,WAAW,KAAK,WAAW,OAAS,CAAC,EAAEA,CAAI,EAAIqP,EAExD,KAAO,CAIL,IAAImmB,EAAM,KAAK,WAAW,KAAK,WAAW,OAAS,CAAC,EAChDA,GAAO,CAACA,EAAI,eAAex1B,CAAI,IACjCw1B,EAAIx1B,CAAI,EAAI,KAAK,QAAQA,CAAI,EAEjC,CACIqP,GAAS,KACX,OAAO,KAAK,QAAQrP,CAAI,EAExB,KAAK,QAAQA,CAAI,EAAIqP,CAEzB,CACF,CAMA,IAAI+5U,IAAS1P,GAGbC,GAAY,aAAc,SAAUp1M,EAAS,CAI3C,IAAIt7H,EAAIs7H,EAAQ,SAAQ,EACxB,OAAIA,EAAQ,aAAat7H,EAAE,IAAI,IAC7BA,EAAE,SAAW,GACbA,EAAE,aAAe,IAEZ,CACL,OAAQ,CAACA,CAAC,EACV,QAAS,CACb,CACA,CAAC,EACD0wU,GAAY,gBAAiB,SAAUp1M,EAAS,CAM9C,IAAIt7H,EAAIs7H,EAAQ,SAAQ,EACxB,OAAAA,EAAQ,WAAW,EAAI,EAChB,CACL,OAAQ,CAACt7H,CAAC,EACV,QAAS,CACb,CACA,CAAC,EAGD0wU,GAAY,gBAAiB,SAAUp1M,EAAS,CAC9C,IAAIvzC,EAAOuzC,EAAQ,YAAY,CAAC,EAChC,MAAO,CACL,OAAQvzC,EAAK,CAAC,EACd,QAAS,CACb,CACA,CAAC,EAGD2oP,GAAY,iBAAkB,SAAUp1M,EAAS,CAC/C,IAAIvzC,EAAOuzC,EAAQ,YAAY,CAAC,EAChC,MAAO,CACL,OAAQvzC,EAAK,CAAC,EACd,QAAS,CACb,CACA,CAAC,EAKD2oP,GAAY,gBAAiB,SAAUp1M,EAAS,CAC9C,IAAIvzC,EAAOuzC,EAAQ,YAAY,CAAC,EAChCA,EAAQ,cAAa,EACrB,IAAI8kN,EAAY9kN,EAAQ,OAAM,EAC9B,OAAIvzC,EAAK,CAAC,EAAE,SAAW,GAAKA,EAAK,CAAC,EAAE,CAAC,EAAE,OAASq4P,EAAU,KACjD,CACL,OAAQr4P,EAAK,CAAC,EACd,QAAS,CACf,EAEW,CACL,OAAQA,EAAK,CAAC,EACd,QAAS,CACf,CAEA,CAAC,EAKD2oP,GAAY,YAAa,oCAAoC,EAE7DA,GAAY,eAAgB,SAAUp1M,EAAS,CAC7C,IAAIvzC,EAAOuzC,EAAQ,YAAY,CAAC,EAChC,OAAIA,EAAQ,OAAS,OACZ,CACL,OAAQvzC,EAAK,CAAC,EACd,QAAS,CACf,EAEW,CACL,OAAQA,EAAK,CAAC,EACd,QAAS,CACf,CAEA,CAAC,EAED,IAAIs4P,GAAgB,CAClB,EAAK,EACL,EAAK,EACL,EAAK,EACL,EAAK,EACL,EAAK,EACL,EAAK,EACL,EAAK,EACL,EAAK,EACL,EAAK,EACL,EAAK,EACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,EACP,EAUA3P,GAAY,SAAU,SAAUp1M,EAAS,CACvC,IAAI7tH,EAAQ6tH,EAAQ,SAAQ,EACxBhlI,EACA44N,EAAS,EACb,GAAIzhN,EAAM,OAAS,IACjBnX,EAAO,EACPmX,EAAQ6tH,EAAQ,SAAQ,UACf7tH,EAAM,OAAS,IACxBnX,EAAO,GACPmX,EAAQ6tH,EAAQ,SAAQ,UACf7tH,EAAM,OAAS,IAExB,GADAA,EAAQ6tH,EAAQ,SAAQ,EACpB7tH,EAAM,KAAK,CAAC,IAAM,KACpByhN,EAASzhN,EAAM,KAAK,WAAW,CAAC,MAC3B,IAAIA,EAAM,OAAS,MACxB,MAAM,IAAIimT,GAAW,0BAA0B,EAE/CxkG,EAASzhN,EAAM,KAAK,WAAW,CAAC,OAGlCnX,EAAO,GAET,GAAIA,EAAM,CAGR,GADA44N,EAASmxH,GAAc5yU,EAAM,IAAI,EAC7ByhN,GAAU,MAAQA,GAAU54N,EAC9B,MAAM,IAAIo9T,GAAW,gBAAkBp9T,EAAO,UAAYmX,EAAM,IAAI,EAGtE,QADI6yU,GACIA,EAAQD,GAAc/kN,EAAQ,SAAS,IAAI,IAAM,MAAQglN,EAAQhqV,GACvE44N,GAAU54N,EACV44N,GAAUoxH,EACVhlN,EAAQ,SAAQ,CAEpB,CACA,MAAO,WAAa4zF,EAAS,GAC/B,CAAC,EAID,IAAIqxH,GAAa,CAACjlN,EAASklN,EAAUC,EAAaC,IAAiB,CACjE,IAAIp+H,EAAMhnF,EAAQ,WAAU,EAAG,OAC/B,GAAIgnF,EAAI,SAAW,EACjB,MAAM,IAAIoxG,GAAW,oDAAoD,EAE3E,IAAI38T,EAAOurN,EAAI,CAAC,EAAE,KACdq+H,EAASrlN,EAAQ,UAAUvkI,CAAI,EACnC,GAAI4pV,GAAU,CAACH,EACb,MAAM,IAAI9sB,GAAW,gBAAkB38T,EAAO,6BAA+BA,EAAO,uBAAuB,EAE7G,GAAI,CAAC4pV,GAAU,CAACF,EACd,MAAM,IAAI/sB,GAAW,kBAAoB38T,EAAO,kBAAoBA,EAAO,uCAA4C,EAEzH,IAAI4zU,EAAU,EAEd,GADAroH,EAAMhnF,EAAQ,WAAU,EAAG,OACvBgnF,EAAI,SAAW,GAAKA,EAAI,CAAC,EAAE,OAAS,IAAK,CAG3C,QAFIs+H,EAAU,GACVnzU,EAAQ6tH,EAAQ,gBAAe,EAC5B7tH,EAAM,OAAS,KAAOA,EAAM,OAAS,OAE1CmzU,GAAWnzU,EAAM,KACjBA,EAAQ6tH,EAAQ,gBAAe,EAEjC,GAAI,CAACslN,EAAQ,MAAM,gBAAgB,EACjC,MAAM,IAAIltB,GAAW,gCAAkCktB,CAAO,EAEhEjW,EAAU,SAASiW,CAAO,EAC1Bt+H,EAAMhnF,EAAQ,WAAU,EAAG,MAC7B,CACA,OAAMqlN,GAAUD,GAEdplN,EAAQ,OAAO,IAAIvkI,EAAM,CACvB,OAAQurN,EACR,QAAAqoH,CACN,CAAK,EAEI,EACT,EACA+F,GAAY,eAAgBp1M,GAAWilN,GAAWjlN,EAAS,GAAO,GAAM,EAAK,CAAC,EAC9Eo1M,GAAY,iBAAkBp1M,GAAWilN,GAAWjlN,EAAS,GAAM,GAAO,EAAK,CAAC,EAChFo1M,GAAY,mBAAoBp1M,GAAWilN,GAAWjlN,EAAS,GAAM,GAAM,EAAI,CAAC,EAEhFo1M,GAAY,YAAap1M,GAAW,CAClC,IAAIgnF,EAAMhnF,EAAQ,YAAY,CAAC,EAAE,CAAC,EAElC,eAAQ,IAAIgnF,EAAI,QAAO,EAAG,IAAI70M,GAASA,EAAM,IAAI,EAAE,KAAK,EAAE,CAAC,EACpD,EACT,CAAC,EACDijU,GAAY,eAAgBp1M,GAAW,CACrC,IAAIgnF,EAAMhnF,EAAQ,YAAY,CAAC,EAAE,CAAC,EAElC,eAAQ,MAAMgnF,EAAI,QAAO,EAAG,IAAI70M,GAASA,EAAM,IAAI,EAAE,KAAK,EAAE,CAAC,EACtD,EACT,CAAC,EACDijU,GAAY,SAAUp1M,GAAW,CAC/B,IAAIr+B,EAAMq+B,EAAQ,SAAQ,EACtBvkI,EAAOkmG,EAAI,KAEf,eAAQ,IAAIA,EAAKq+B,EAAQ,OAAO,IAAIvkI,CAAI,EAAGmoV,GAAUnoV,CAAI,EAAGijU,GAAQ,KAAKjjU,CAAI,EAAGijU,GAAQ,KAAKjjU,CAAI,CAAC,EAC3F,EACT,CAAC,EAID25U,GAAY,WAAY,GAAG,EAC3BA,GAAY,WAAY,GAAG,EAO3BA,GAAY,IAAK,gBAAgB,EACjCA,GAAY,OAAQ,GAAG,EACvBA,GAAY,OAAQ,GAAG,EACvBA,GAAY,OAAQ,OAAO,EAC3BA,GAAY,OAAQ,OAAO,EAO3BA,GAAY,kBAAmB,2CAA2C,EAC1EA,GAAY,cAAe,wDAAwD,EACnFA,GAAY,mBAAoB,wDAAwD,EAExFA,GAAY,IAAU,cAAc,EACpCA,GAAY,IAAU,cAAc,EACpCA,GAAY,IAAU,cAAc,EACpCA,GAAY,IAAU,cAAc,EACpCA,GAAY,IAAU,cAAc,EACpCA,GAAY,IAAU,cAAc,EACpCA,GAAY,IAAU,cAAc,EACpCA,GAAY,IAAU,cAAc,EACpCA,GAAY,IAAU,eAAe,EACrCA,GAAY,IAAU,eAAe,EACrCA,GAAY,IAAU,eAAe,EAErCA,GAAY,SAAU,UAAU,EAEhCA,GAAY,SAAU,0BAA0B,EAChDA,GAAY,SAAU,0BAA0B,EAChDA,GAAY,SAAU,0BAA0B,EAEhDA,GAAY,cAAe,eAAe,EAE1CA,GAAY,aAAc,yBAAyB,EAMnDA,GAAY,QAAS,iEAAuE,EAM5FA,GAAY,QAAS,uDAAuD,EAC5EA,GAAY,OAAQ,OAAO,EAC3BA,GAAY,IAAU,OAAO,EAC7BA,GAAY,UAAW,8EAAmF,EAC1GA,GAAY,IAAU,SAAS,EAE/BA,GAAY,IAAU,sGAAqH,EAC3IA,GAAY,IAAU,kEAAuE,EAC7FA,GAAY,IAAU,gEAAqE,EAC3FA,GAAY,IAAU,uEAAiF,EACvGA,GAAY,IAAU,wEAAkF,EACxGA,GAAY,IAAU,sEAAgF,EACtGA,GAAY,IAAU,4DAAiE,EAEvFA,GAAY,IAAU,QAAQ,EAC9BA,GAAY,IAAU,8BAA8B,EACpDA,GAAY,IAAU,SAAS,EAC/BA,GAAY,IAAU,YAAY,EAClCA,GAAY,IAAU,YAAY,EAClCA,GAAY,IAAU,YAAY,EAClCA,GAAY,IAAU,YAAY,EAClCA,GAAY,IAAU,aAAa,EACnCA,GAAY,IAAU,kBAAkB,EAGxCA,GAAY,aAAc,mDAAoD,EAC9EA,GAAY,aAAc,mDAAoD,EAC9EA,GAAY,aAAc,mDAAoD,EAC9EA,GAAY,aAAc,mDAAoD,EAO9EA,GAAY,UAAW,+BAA+B,EACtDA,GAAY,IAAU,SAAS,EAM/BA,GAAY,aAAc,mBAAmB,EAC7CA,GAAY,aAAc,mBAAmB,EAC7CA,GAAY,aAAc,mBAAmB,EAC7CA,GAAY,cAAe,oBAAoB,EAC/CA,GAAY,UAAW,gBAAgB,EACvCA,GAAY,UAAW,gBAAgB,EACvCA,GAAY,aAAc,mBAAmB,EAC7CA,GAAY,eAAgB,qBAAqB,EACjDA,GAAY,WAAY,iBAAiB,EACzCA,GAAY,WAAY,iBAAiB,EACzCA,GAAY,aAAc,mBAAmB,EAE7CA,GAAY,aAAc,uCAAuC,EAGjEA,GAAY,UAAW,gGAAqG,EAE5HA,GAAY,UAAW,8BAA8B,EAIrDA,GAAY,QAAS,mCAAmC,EACxDA,GAAY,YAAa,+BAA+B,EACxDA,GAAY,cAAe,8BAA8B,EAIzDA,GAAY,UAAW,uDAAuD,EAC9EA,GAAY,WAAY,wDAAwD,EAEhF,IAAImQ,GAAc,CAChB,IAAK,UACL,QAAS,UAET,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UAEL,UAAW,UACX,WAAY,UACZ,WAAY,UACZ,aAAc,UACd,aAAc,UACd,WAAY,UACZ,WAAY,UACZ,SAAU,UACV,QAAS,UACT,cAAe,UACf,aAAc,UACd,YAAa,UACb,aAAc,UACd,QAAS,UACT,mBAAoB,UACpB,mBAAoB,UACpB,kBAAmB,UACnB,kBAAmB,UACnB,uBAAwB,UACxB,uBAAwB,UACxB,WAAY,UACZ,eAAgB,UAChB,mBAAoB,UACpB,UAAW,UAEX,YAAa,UAEb,YAAa,UACb,WAAY,UACZ,WAAY,UACZ,gBAAiB,UACjB,eAAgB,UAEhB,UAAW,UACX,QAAS,UACT,SAAU,UACV,SAAU,UACV,UAAW,UACX,WAAY,UACZ,aAAc,UAEd,UAAW,SACb,EACIC,IAAc,IAAI,IAAI,CAAC,MAAO,KAAK,CAAC,EACxCpQ,GAAY,SAAU,SAAUp1M,EAAS,CAMvC,IAAIylN,EAAU,UACV1sU,EAAOinH,EAAQ,kBAAiB,EAAG,KACvC,OAAIjnH,KAAQwsU,GACVE,EAAUF,GAAYxsU,CAAI,GACjBA,EAAK,MAAM,EAAG,CAAC,IAAM,SAErBA,KAAQ2lT,GAAQ,MACrB8mB,IAAY,IAAI9mB,GAAQ,KAAK3lT,CAAI,EAAE,KAAK,KAC1C0sU,EAAU,WAGPA,CACT,CAAC,EACD,IAAIC,GAAiB,CAEnB,IAAK,GACL,IAAK,GACL,WAAY,GACZ,MAAO,GACP,WAAY,GACZ,WAAY,GACZ,UAAW,GACX,WAAY,GACZ,WAAY,GACZ,eAAgB,GAChB,UAAW,GACX,SAAU,GACV,UAAW,GACX,SAAU,GACV,UAAW,GAEX,EAAK,GAEL,IAAK,GACL,IAAK,GACL,IAAK,EACP,EACAtQ,GAAY,UAAW,SAAUp1M,EAAS,CACxC,IAAIjnH,EAAOinH,EAAQ,OAAM,EAAG,KAC5B,OAAIjnH,KAAQ2sU,GACH,aAEA,SAEX,CAAC,EACDtQ,GAAY,UAAW,SAAUp1M,EAAS,CACxC,IAAIjnH,EAAOinH,EAAQ,OAAM,EAAG,KAG5B,OAAIjnH,KAAQ2sU,IAAkB3sU,IAAS,IAC9B,aAEA,SAEX,CAAC,EACDq8T,GAAY,UAAW,SAAUp1M,EAAS,CACxC,IAAIjnH,EAAOinH,EAAQ,OAAM,EAAG,KAC5B,OAAIjnH,KAAQ2sU,GACH,cAEA,UAEX,CAAC,EACDtQ,GAAY,UAAW,SAAS,EAChCA,GAAY,UAAW,SAAS,EAChCA,GAAY,UAAW,YAAY,EAInCA,GAAY,UAAW,YAAY,EAInCA,GAAY,UAAW,SAAS,EAChCA,GAAY,UAAW,SAAS,EAChCA,GAAY,UAAW,SAAS,EAIhCA,GAAY,YAAa,8CAA8C,EAGvEA,GAAY,MAAO,0BAA0B,EAE7CA,GAAY,cAAe,KAAK,EAIhCA,GAAY,MAAO,cAAc,EACjCA,GAAY,MAAO,0BAA0B,EAE7CA,GAAY,aAAc,KAAK,EAG/BA,GAAY,MAAO,0BAA0B,EAE7CA,GAAY,eAAgB,KAAK,EAGjCA,GAAY,MAAO,0BAA0B,EAE7CA,GAAY,iBAAkB,KAAK,EAGnCA,GAAY,gBAAiB,0BAA0B,EAGvDA,GAAY,kBAAmB,yBAAyB,EAExDA,GAAY,YAAa,aAAa,EAEtCA,GAAY,WAAY,oBAAoB,EAE5CA,GAAY,SAAU,mBAAmB,EAEzCA,GAAY,UAAW,mBAAmB,EAE1CA,GAAY,QAAS,mCAAmC,EACxDA,GAAY,cAAe,uBAAuB,EAClDA,GAAY,gBAAiBp1M,GAAW,CACtC,GAAIA,EAAQ,OAAO,IAAI,UAAU,EAC/B,MAAM,IAAIo4L,GAAW,gBAAgB,EAEvC,MAAO,4BACT,CAAC,EAUDgd,GAAY,SAAU,6IAAuJ,EAC7KA,GAAY,QAAS,+EAAoF,EACzGA,GAAY,SAAU,+BAA+B,EACrDA,GAAY,QAAS,gGAA0G,EAM/HA,GAAY,YAAa,aAAa,EAKtCA,GAAY,QAAS,iFAA2F,EAehH,IAAIuQ,GAAcrpB,GAAOyB,GAAgB,cAAc,EAAE,EAAiB,EAAE,CAAC,EAAI,GAAMA,GAAgB,cAAc,EAAE,EAAiB,EAAE,CAAC,CAAC,EAC5IqX,GAAY,UAAW,2BAA6B,2BAA6BuQ,GAAc,sBAAwB,4BAA4B,EAEnJvQ,GAAY,UAAW,2BAA6B,2BAA6BuQ,GAAc,sBAAwB,4BAA4B,EAKnJvQ,GAAY,WAAY,8BAA8B,EACtDA,GAAY,YAAa,mBAAmB,EAC5CA,GAAY,aAAc,mCAAmC,EAI7DA,GAAY,kBAAmB,GAAG,EAGlCA,GAAY,eAAgB,oCAAoC,EAEhEA,GAAY,aAAc,kGAA6G,EAEvIA,GAAY,aAAc,wFAAmG,EAE7HA,GAAY,aAAc,+FAA2G,EAErIA,GAAY,YAAa,4GAAwH,EAEjJA,GAAY,YAAa,4GAAwH,EAEjJA,GAAY,aAAc,wFAAmG,EAE7HA,GAAY,aAAc,+FAA2G,EAErIA,GAAY,YAAa,mGAA8G,EAEvIA,GAAY,YAAa,4GAAwH,EAEjJA,GAAY,gBAAiB,wGAAoH,EAEjJA,GAAY,gBAAiB,wGAAoH,EAEjJA,GAAY,aAAc,qGAAiH,EAE3IA,GAAY,aAAc,qGAAiH,EAE3IA,GAAY,IAAU,YAAY,EAClCA,GAAY,IAAU,WAAW,EACjCA,GAAY,IAAU,YAAY,EAClCA,GAAY,IAAU,YAAY,EAClCA,GAAY,IAAU,YAAY,EAIlCA,GAAY,UAAW,cAAc,EACrCA,GAAY,eAAgB,YAAY,EACxCA,GAAY,gBAAiB,YAAY,EACzCA,GAAY,qBAAsB,YAAY,EAC9CA,GAAY,gBAAiB,YAAY,EACzCA,GAAY,qBAAsB,YAAY,EAC9CA,GAAY,eAAgB,WAAW,EACvCA,GAAY,oBAAqB,WAAW,EAC5CA,GAAY,eAAgB,WAAW,EACvCA,GAAY,oBAAqB,WAAW,EAE5CA,GAAY,qBAAsB,eAAe,EAEjDA,GAAY,kBAAmB,YAAY,EAE3CA,GAAY,aAAc,sDAAsD,EAChFA,GAAY,kBAAmB,oDAAoD,EACnFA,GAAY,gBAAiB,yDAAyD,EACtFA,GAAY,qBAAsB,uDAAuD,EAEzFA,GAAY,UAAW,+CAAoD,EAC3EA,GAAY,WAAY,mCAAmC,EAC3DA,GAAY,WAAY,mCAAmC,EAG3DA,GAAY,WAAY,mCAAmC,EAC3DA,GAAY,YAAa,oCAAoC,EAC7DA,GAAY,cAAe,yCAAyC,EACpEA,GAAY,cAAe,0CAA0C,EACrEA,GAAY,cAAe,gDAAgD,EAC3EA,GAAY,eAAgB,+CAA+C,EAG3EA,GAAY,cAAe,gCAAqC,EAChEA,GAAY,cAAe,gCAAqC,EAChEA,GAAY,UAAW,4BAAiC,EACxDA,GAAY,cAAe,gCAAqC,EAChEA,GAAY,UAAW,4BAAiC,EACxDA,GAAY,cAAe,gCAAqC,EAChEA,GAAY,cAAe,gCAAgC,EAC3DA,GAAY,mBAAoB,qCAAqC,EACrEA,GAAY,eAAgB,iCAAsC,EAClEA,GAAY,eAAgB,iCAAsC,EAClEA,GAAY,iBAAkB,mCAAmC,EACjEA,GAAY,kBAAmB,oCAAoC,EACnEA,GAAY,iBAAkB,mCAAmC,EACjEA,GAAY,kBAAmB,oCAAoC,EACnEA,GAAY,UAAW,4BAAiC,EACxDA,GAAY,UAAW,4BAAiC,EAKxDA,GAAY,cAAe,kEAAiF,EAC5GA,GAAY,cAAe,oEAAmF,EAC9GA,GAAY,IAAU,aAAa,EACnCA,GAAY,IAAU,aAAa,EACnCA,GAAY,WAAY,oEAAmF,EAC3GA,GAAY,WAAY,sEAAqF,EAC7GA,GAAY,IAAU,UAAU,EAChCA,GAAY,IAAU,UAAU,EAKhCA,GAAY,WAAY,+IAA8J,EACtLA,GAAY,IAAK,UAAU,EAO3BA,GAAY,SAAU,aAAa,EACnCA,GAAY,SAAU,aAAa,EACnCA,GAAY,SAAU,aAAa,EACnCA,GAAY,SAAU,UAAU,EAChCA,GAAY,SAAU,UAAU,EAChCA,GAAY,SAAU,WAAW,EACjCA,GAAY,SAAU,WAAW,EACjCA,GAAY,SAAU,WAAW,EACjCA,GAAY,MAAO,aAAa,EAChCA,GAAY,MAAO,aAAa,EAChCA,GAAY,MAAO,aAAa,EAChCA,GAAY,SAAU,SAAS,EAC/BA,GAAY,YAAa,SAAS,EAClCA,GAAY,UAAW,aAAa,EACpCA,GAAY,SAAU,aAAa,EACnCA,GAAY,SAAU,UAAU,EAChCA,GAAY,QAAS,aAAa,EAClCA,GAAY,UAAW,YAAY,EACnCA,GAAY,UAAW,aAAa,EACpCA,GAAY,YAAa,aAAa,EACtCA,GAAY,WAAY,WAAW,EACnCA,GAAY,aAAc,eAAe,EACzCA,GAAY,UAAW,YAAY,EACnCA,GAAY,YAAa,aAAa,EACtCA,GAAY,QAAS,aAAa,EAClCA,GAAY,UAAW,UAAU,EACjCA,GAAY,SAAU,kBAAkB,EACxCA,GAAY,SAAU,kBAAkB,EACxCA,GAAY,SAAU,kBAAkB,EACxCA,GAAY,WAAY,aAAa,EACrCA,GAAY,UAAW,MAAM,EAC7BA,GAAY,UAAW,SAAS,EAChCA,GAAY,SAAU,aAAa,EACnCA,GAAY,SAAU,MAAM,EAC5BA,GAAY,UAAW,aAAa,EACpCA,GAAY,SAAU,aAAa,EACnCA,GAAY,SAAU,aAAa,EACnCA,GAAY,SAAU,aAAa,EACnCA,GAAY,UAAW,kBAAkB,EACzCA,GAAY,UAAW,kBAAkB,EACzCA,GAAY,UAAW,kBAAkB,EACzCA,GAAY,OAAQ,aAAa,EACjCA,GAAY,YAAa,aAAa,EACtCA,GAAY,OAAQ,aAAa,EACjCA,GAAY,YAAa,aAAa,EACtCA,GAAY,WAAY,MAAM,EAC9BA,GAAY,SAAU,cAAc,EACpCA,GAAY,SAAU,cAAc,EACpCA,GAAY,SAAU,cAAc,EACpCA,GAAY,SAAU,MAAM,EAC5BA,GAAY,UAAW,aAAa,EACpCA,GAAY,UAAW,aAAa,EACpCA,GAAY,QAAS,aAAa,EAClCA,GAAY,SAAU,QAAQ,EAC9BA,GAAY,SAAU,KAAK,EAC3BA,GAAY,WAAY,aAAa,EACrCA,GAAY,QAAS,UAAU,EAC/BA,GAAY,SAAU,YAAY,EAClCA,GAAY,SAAU,YAAY,EAClCA,GAAY,QAAS,aAAa,EAClCA,GAAY,aAAc,YAAY,EAEtCA,GAAY,WAAY,MAAM,EAC9BA,GAAY,SAAU,aAAa,EAInCA,GAAY,WAAY,mCAAmC,EAC3DA,GAAY,WAAY,mCAAmC,EAC3DA,GAAY,SAAU,+CAA+C,EAIrEA,GAAY,QAAS,4BAA4B,EACjDA,GAAY,QAAS,4BAA4B,EACjDA,GAAY,WAAY,mCAAmC,EAC3DA,GAAY,QAAS,0BAA0B,EAC/CA,GAAY,QAAS,0BAA0B,EAC/C,IAAIwQ,GAAe/9U,GAAOm4H,GAAW,CACnC,IAAI58H,EAAO48H,EAAQ,WAAU,EAAG,OAC5ByoE,EAASzoE,EAAQ,WAAU,EAAG,OAC9B6lN,EAAe7lN,EAAQ,WAAU,EAAG,OACpCh2E,EAAQg2E,EAAQ,WAAU,EAAG,OAC7B8lN,EAAY9lN,EAAQ,OAAO,IAAI,GAAG,EAClC+lN,EAAkB/lN,EAAQ,OAAO,IAAI,KAAK,EAC9CA,EAAQ,OAAO,WAAU,EACzB,IAAIgmN,EAAWC,GAAUjmN,GAAW,CAC9Bn4H,IAEFm4H,EAAQ,OAAO,IAAI,IAAK8lN,CAAS,EAC7BD,EAAa,QACf7lN,EAAQ,OAAO,IAAI,MAAO+lN,CAAe,GAG7C,IAAIG,EAAUD,EACd,GAAI,CAACA,GAAUJ,EAAa,OAAQ,CAElC,IAAIf,EAAY9kN,EAAQ,OAAM,EAC1B8kN,EAAU,OAAS,MACrB9kN,EAAQ,SAAQ,EAChBkmN,EAAU,GAEd,CACA,MAAO,CACL,OAAQA,EAAUL,EAAep9I,EACjC,QAAS,CACf,CACE,EACAzoE,EAAQ,OAAO,IAAI,IAAKgmN,EAAS,EAAK,CAAC,EACnCH,EAAa,QACf7lN,EAAQ,OAAO,IAAI,MAAOgmN,EAAS,EAAI,CAAC,EAE1C,IAAIh/H,EAAMhnF,EAAQ,WAAU,EAAG,OAC3BxxG,EAAWwxG,EAAQ,aAAa,CAAC,GAAGh2E,EAAO,GAAGg9J,EAAK,GAAG5jN,CAC5D,CAAG,EACD,OAAA48H,EAAQ,OAAO,SAAQ,EAChB,CACL,OAAQxxG,EAAS,QAAO,EACxB,QAAS,CACb,CACA,EACA4mT,GAAY,YAAawQ,GAAa,EAAK,CAAC,EAC5CxQ,GAAY,YAAawQ,GAAa,EAAI,CAAC,EAC3CxQ,GAAY,WAAY,wFAA6F,EACrHA,GAAY,QAAS,oFAAyF,EAC9GA,GAAY,QAAS,oCAAoC,EAIzDA,GAAY,UAAW,YAAY,EAEnCA,GAAY,SAAU,2BAA2B,EACjDA,GAAY,WAAY,2BAA2B,EACnDA,GAAY,SAAU,2BAA2B,EACjDA,GAAY,QAAS,2BAA2B,EAChDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,SAAU,uBAAuB,EAC7CA,GAAY,WAAY,2BAA2B,EACnDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,WAAY,2BAA2B,EACnDA,GAAY,WAAY,2BAA2B,EACnDA,GAAY,WAAY,2BAA2B,EACnDA,GAAY,WAAY,2BAA2B,EACnDA,GAAY,WAAY,2BAA2B,EACnDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,SAAU,2BAA2B,EACjDA,GAAY,SAAU,2BAA2B,EACjDA,GAAY,SAAU,2BAA2B,EACjDA,GAAY,SAAU,2BAA2B,EACjDA,GAAY,SAAU,2BAA2B,EACjDA,GAAY,YAAa,2BAA2B,EACpDA,GAAY,YAAa,2BAA2B,EACpDA,GAAY,YAAa,2BAA2B,EACpDA,GAAY,YAAa,2BAA2B,EACpDA,GAAY,YAAa,2BAA2B,EACpDA,GAAY,YAAa,2BAA2B,EACpDA,GAAY,YAAa,2BAA2B,EACpDA,GAAY,YAAa,2BAA2B,EACpDA,GAAY,YAAa,2BAA2B,EACpDA,GAAY,YAAa,2BAA2B,EACpDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,UAAW,2BAA2B,EAClDA,GAAY,WAAY,2BAA2B,EACnDA,GAAY,YAAa,2BAA2B,EAQpD,IAAI+Q,GAAmB,CACrB,IAAK,GAEL,EAAK,GAEL,WAAY,GAEZ,aAAc,EAChB,EACA,MAAMC,GAAc,CAClB,YAAYt+Q,EAAO0gQ,EAAUnzS,EAAM,CACjC,KAAK,SAAWmzS,EAChB,KAAK,eAAiB,EACtB,KAAK,KAAK1gQ,CAAK,EAEf,KAAK,OAAS,IAAI08Q,IAAUK,IAAQrc,EAAS,MAAM,EACnD,KAAK,KAAOnzS,EACZ,KAAK,MAAQ,EACf,CAKA,KAAKyyC,EAAO,CACV,KAAK,MAAQ,IAAIu8Q,GAAMv8Q,EAAO,KAAK,QAAQ,CAC7C,CAIA,WAAW2wH,EAAS,CAClB,KAAK,KAAOA,CACd,CAIA,YAAa,CACX,KAAK,OAAO,WAAU,CACxB,CAIA,UAAW,CACT,KAAK,OAAO,SAAQ,CACtB,CAKA,WAAY,CACV,KAAK,OAAO,UAAS,CACvB,CAKA,QAAS,CACP,OAAI,KAAK,MAAM,SAAW,GACxB,KAAK,UAAU,KAAK,MAAM,IAAG,CAAE,EAE1B,KAAK,MAAM,KAAK,MAAM,OAAS,CAAC,CACzC,CAIA,UAAW,CACT,YAAK,OAAM,EACJ,KAAK,MAAM,IAAG,CACvB,CAKA,UAAUtmL,EAAO,CACf,KAAK,MAAM,KAAKA,CAAK,CACvB,CAIA,WAAWsoE,EAAQ,CACjB,KAAK,MAAM,KAAK,GAAGA,CAAM,CAC3B,CAKA,aAAa4rQ,EAAY,CACvB,IAAI5mU,EACAxG,EACAwhE,EACJ,GAAI4rQ,EAAY,CAEd,GADA,KAAK,cAAa,EACd,KAAK,SAAS,OAAS,IACzB,OAAO,KAET5mU,EAAQ,KAAK,WACZ,CACC,OAAAg7D,EACA,IAAAxhE,CACR,EAAU,KAAK,WAAW,CAAC,GAAG,CAAC,CAC3B,MACG,CACC,OAAAwhE,EACA,MAAAh7D,EACA,IAAAxG,CACR,EAAU,KAAK,WAAU,GAGrB,YAAK,UAAU,IAAIs8T,GAAM,MAAOt8T,EAAI,GAAG,CAAC,EACxC,KAAK,WAAWwhE,CAAM,EACf,IAAI86P,GAAM,GAAIF,GAAe,MAAM51T,EAAOxG,CAAG,CAAC,CACvD,CAIA,eAAgB,CACd,OAAS,CACP,IAAI9G,EAAQ,KAAK,OAAM,EACvB,GAAIA,EAAM,OAAS,IACjB,KAAK,MAAM,IAAG,MAEd,MAEJ,CACF,CAKA,WAAWm0U,EAAQ,CAOjB,IAAI7rQ,EAAS,CAAA,EACT8rQ,EAAcD,GAAUA,EAAO,OAAS,EACvCC,GAKH,KAAK,cAAa,EAEpB,IAAI9mU,EAAQ,KAAK,OAAM,EACnBkiF,EACA99F,EAAQ,EACRipF,EAAQ,EACZ,EAAG,CAGD,GAFA6U,EAAM,KAAK,SAAQ,EACnBlnB,EAAO,KAAKknB,CAAG,EACXA,EAAI,OAAS,IACf,EAAE99F,UACO89F,EAAI,OAAS,KAEtB,GADA,EAAE99F,EACEA,IAAU,GACZ,MAAM,IAAIu0T,GAAW,UAAWz2N,CAAG,UAE5BA,EAAI,OAAS,MACtB,MAAM,IAAIy2N,GAAW,2DAAkEkuB,GAAUC,EAAcD,EAAOx5P,CAAK,EAAI,KAAO,IAAK6U,CAAG,EAEhJ,GAAI2kP,GAAUC,EACZ,IAAK1iV,IAAU,GAAKA,IAAU,GAAKyiV,EAAOx5P,CAAK,IAAM,MAAQ6U,EAAI,OAAS2kP,EAAOx5P,CAAK,GAEpF,GADA,EAAEA,EACEA,IAAUw5P,EAAO,OAAQ,CAE3B7rQ,EAAO,OAAO,CAACqS,EAAOA,CAAK,EAC3B,KACF,OAEAA,EAAQ,CAGd,OAASjpF,IAAU,GAAK0iV,GAGxB,OAAI9mU,EAAM,OAAS,KAAOg7D,EAAOA,EAAO,OAAS,CAAC,EAAE,OAAS,MAC3DA,EAAO,IAAG,EACVA,EAAO,MAAK,GAEdA,EAAO,QAAO,EACP,CACL,OAAAA,EACA,MAAAh7D,EACA,IAAKkiF,CACX,CACE,CAKA,YAAY0tO,EAASC,EAAY,CAC/B,GAAIA,EAAY,CACd,GAAIA,EAAW,SAAWD,EAAU,EAClC,MAAM,IAAIjX,GAAW,4DAA4D,EAGnF,QADIkuB,EAAShX,EAAW,CAAC,EAChB,EAAI,EAAG,EAAIgX,EAAO,OAAQ,IAAK,CACtC,IAAI3kP,EAAM,KAAK,SAAQ,EACvB,GAAI2kP,EAAO,CAAC,IAAM3kP,EAAI,KACpB,MAAM,IAAIy2N,GAAW,gDAAiDz2N,CAAG,CAE7E,CACF,CAEA,QADIlV,EAAO,CAAA,EACF9hE,EAAK,EAAGA,EAAK0kT,EAAS1kT,IAC7B8hE,EAAK,KAAK,KAAK,WAAW6iP,GAAcA,EAAW3kT,EAAK,CAAC,CAAC,EAAE,MAAM,EAEpE,OAAO8hE,CACT,CAKA,eAAe4zP,EAAQ,CAErB,GADA,KAAK,gBAAkBA,EACnB,KAAK,eAAiB,KAAK,SAAS,UACtC,MAAM,IAAIjoB,GAAW,0EAA+E,CAExG,CAoBA,WAAWouB,EAAgB,CACzB,IAAIC,EAAW,KAAK,SAAQ,EACxBhrV,EAAOgrV,EAAS,KAChBC,EAAaD,EAAS,SAAsC,KAA3B,KAAK,cAAchrV,CAAI,EAC5D,GAAIirV,GAAa,MAAQF,GAAkBE,EAAU,aAAc,CACjE,GAAIF,GAAkBE,GAAa,MAAQjrV,EAAK,CAAC,IAAM,MAAQ,CAAC,KAAK,UAAUA,CAAI,EACjF,MAAM,IAAI28T,GAAW,+BAAiC38T,CAAI,EAE5D,YAAK,UAAUgrV,CAAQ,EAChB,EACT,CACA,KAAK,eAAe,CAAC,EACrB,IAAIhsQ,EAASisQ,EAAU,OACnBj6P,EAAO,KAAK,YAAYi6P,EAAU,QAASA,EAAU,UAAU,EACnE,GAAIA,EAAU,QAAS,CAErBjsQ,EAASA,EAAO,QAChB,QAAS32E,EAAI22E,EAAO,OAAS,EAAG32E,GAAK,EAAG,EAAEA,EAAG,CAC3C,IAAI69F,EAAMlnB,EAAO32E,CAAC,EAClB,GAAI69F,EAAI,OAAS,IAAK,CACpB,GAAI79F,IAAM,EACR,MAAM,IAAIs0T,GAAW,8CAA+Cz2N,CAAG,EAGzE,GADAA,EAAMlnB,EAAO,EAAE32E,CAAC,EACZ69F,EAAI,OAAS,IAEflnB,EAAO,OAAO32E,EAAI,EAAG,CAAC,UACb,UAAU,KAAK69F,EAAI,IAAI,EAEhClnB,EAAO,OAAO32E,EAAG,EAAG,GAAG2oF,EAAK,CAACkV,EAAI,KAAO,CAAC,CAAC,MAE1C,OAAM,IAAIy2N,GAAW,8BAA+Bz2N,CAAG,CAE3D,CACF,CACF,CAEA,YAAK,WAAWlnB,CAAM,EACfA,EAAO,MAChB,CAOA,mBAAoB,CAClB,YAAK,WAAU,EACR,KAAK,OAAM,CACpB,CAIA,iBAAkB,CAChB,OACE,GAAI,KAAK,WAAU,IAAO,GAAO,CAE/B,IAAItoE,EAAQ,KAAK,MAAM,IAAG,EAG1B,OAAIA,EAAM,eACRA,EAAM,KAAO,WAERA,CACT,CAEJ,CAKA,YAAY1W,EAAM,CAChB,OAAO,KAAK,OAAO,IAAIA,CAAI,EAAI,KAAK,aAAa,CAAC,IAAI85U,GAAM95U,CAAI,CAAC,CAAC,EAAI,MACxE,CAMA,aAAag/E,EAAQ,CACnB,IAAI8qJ,EAAS,CAAA,EACTohH,EAAiB,KAAK,MAAM,OAEhC,IADA,KAAK,WAAWlsQ,CAAM,EACf,KAAK,MAAM,OAASksQ,GAEzB,GAAI,KAAK,WAAW,EAAI,IAAM,GAAO,CAEnC,IAAIx0U,EAAQ,KAAK,MAAM,IAAG,EACtBA,EAAM,eAERA,EAAM,SAAW,GACjBA,EAAM,aAAe,IAEvBozN,EAAO,KAAKpzN,CAAK,CACnB,CAIF,YAAK,eAAeozN,EAAO,MAAM,EAC1BA,CACT,CAKA,kBAAkB9pO,EAAM,CACtB,IAAIg/E,EAAS,KAAK,YAAYh/E,CAAI,EAClC,OAAIg/E,GACKA,EAAO,IAAItoE,GAASA,EAAM,IAAI,EAAE,KAAK,EAAE,CAIlD,CAKA,cAAc1W,EAAM,CAClB,IAAI4lO,EAAa,KAAK,OAAO,IAAI5lO,CAAI,EACrC,GAAI4lO,GAAc,KAEhB,OAAOA,EAIT,GAAI5lO,EAAK,SAAW,EAAG,CACrB,IAAImrV,EAAU,KAAK,MAAM,SAASnrV,CAAI,EACtC,GAAImrV,GAAW,MAAQA,IAAY,GACjC,MAEJ,CACA,IAAIF,EAAY,OAAOrlH,GAAe,WAAaA,EAAW,IAAI,EAAIA,EACtE,GAAI,OAAOqlH,GAAc,SAAU,CACjC,IAAIrX,EAAU,EACd,GAAIqX,EAAU,SAAS,GAAG,EAExB,QADIG,EAAWH,EAAU,QAAQ,MAAO,EAAE,EACnCG,EAAS,SAAS,KAAOxX,EAAU,EAAE,GAC1C,EAAEA,EAMN,QAHIyX,EAAY,IAAIzC,GAAMqC,EAAW,KAAK,QAAQ,EAC9CjsQ,EAAS,CAAA,EACTknB,EAAMmlP,EAAU,IAAG,EAChBnlP,EAAI,OAAS,OAClBlnB,EAAO,KAAKknB,CAAG,EACfA,EAAMmlP,EAAU,IAAG,EAErBrsQ,EAAO,QAAO,EACd,IAAIjsD,EAAW,CACb,OAAAisD,EACA,QAAA40P,CACR,EACM,OAAO7gT,CACT,CACA,OAAOk4T,CACT,CAOA,UAAUjrV,EAAM,CACd,OAAO,KAAK,OAAO,IAAIA,CAAI,GAAKmoV,GAAU,eAAenoV,CAAI,GAAKijU,GAAQ,KAAK,eAAejjU,CAAI,GAAKijU,GAAQ,KAAK,eAAejjU,CAAI,GAAK0qV,GAAiB,eAAe1qV,CAAI,CAClL,CAIA,aAAaA,EAAM,CACjB,IAAI2zU,EAAQ,KAAK,OAAO,IAAI3zU,CAAI,EAChC,OAAO2zU,GAAS,KAAO,OAAOA,GAAU,UAAY,OAAOA,GAAU,YAAc,CAACA,EAAM,aAAewU,GAAU,eAAenoV,CAAI,GAAK,CAACmoV,GAAUnoV,CAAI,EAAE,SAC9J,CACF,CAGA,IAAIsrV,GAAkB,2CAClBC,GAAe,OAAO,OAAO,CAC/B,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,EAAU,IACV,IAAU,IACV,EAAU,IACV,IAAU,IACV,EAAU,IACV,IAAU,IACV,EAAU,IACV,IAAU,IACV,IAAU,IACV,EAAU,IACV,EAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,EAAU,IACV,EAAU,IACV,EAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,GACZ,CAAC,EAIGC,GAAiB,CACnB,IAAK,CACH,KAAQ,MACR,KAAQ,SACZ,EACE,IAAK,CACH,KAAQ,MACR,KAAQ,SACZ,EACE,IAAK,CACH,KAAQ,MACR,KAAQ,QACZ,EACE,IAAK,CACH,KAAQ,MACR,KAAQ,SACZ,EACE,IAAK,CACH,KAAQ,MACR,KAAQ,OACZ,EACE,IAAK,CACH,KAAQ,MACR,KAAQ,SACZ,EACE,IAAK,CACH,KAAQ,MACR,KAAQ,SACZ,EACE,IAAK,CACH,KAAQ,MACR,KAAQ,OACZ,EACE,IAAK,CACH,KAAQ,MACR,KAAQ,OACZ,EACE,IAAK,CACH,KAAQ,MACR,KAAQ,YACZ,EACE,IAAK,CACH,KAAQ,KACZ,EACE,IAAK,CACH,KAAQ,KACZ,CACA,EACIC,GAAiB,CACnB,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KA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","x_google_ignoreList":[236,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,327,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389]}